changeset 9799:cfd0aa788ae1

remove reference blas and lapack sources
author John W. Eaton <jwe@octave.org>
date Tue, 10 Nov 2009 23:07:25 -0500
parents 2d6a5af744b6
children ef4c4186cb47
files ChangeLog NEWS configure.ac libcruft/ChangeLog libcruft/Makefile.am libcruft/blas/caxpy.f libcruft/blas/ccopy.f libcruft/blas/cdotc.f libcruft/blas/cdotu.f libcruft/blas/cgemm.f libcruft/blas/cgemv.f libcruft/blas/cgerc.f libcruft/blas/cgeru.f libcruft/blas/chemm.f libcruft/blas/chemv.f libcruft/blas/cher.f libcruft/blas/cher2.f libcruft/blas/cher2k.f libcruft/blas/cherk.f libcruft/blas/cscal.f libcruft/blas/csrot.f libcruft/blas/csscal.f libcruft/blas/cswap.f libcruft/blas/csyrk.f libcruft/blas/ctbsv.f libcruft/blas/ctrmm.f libcruft/blas/ctrmv.f libcruft/blas/ctrsm.f libcruft/blas/ctrsv.f libcruft/blas/dasum.f libcruft/blas/daxpy.f libcruft/blas/dcabs1.f libcruft/blas/dcopy.f libcruft/blas/ddot.f libcruft/blas/dgemm.f libcruft/blas/dgemv.f libcruft/blas/dger.f libcruft/blas/dmach.f libcruft/blas/dnrm2.f libcruft/blas/drot.f libcruft/blas/dscal.f libcruft/blas/dswap.f libcruft/blas/dsymm.f libcruft/blas/dsymv.f libcruft/blas/dsyr.f libcruft/blas/dsyr2.f libcruft/blas/dsyr2k.f libcruft/blas/dsyrk.f libcruft/blas/dtbsv.f libcruft/blas/dtrmm.f libcruft/blas/dtrmv.f libcruft/blas/dtrsm.f libcruft/blas/dtrsv.f libcruft/blas/dzasum.f libcruft/blas/dznrm2.f libcruft/blas/icamax.f libcruft/blas/idamax.f libcruft/blas/isamax.f libcruft/blas/izamax.f libcruft/blas/lsame.f libcruft/blas/module.mk libcruft/blas/sasum.f libcruft/blas/saxpy.f libcruft/blas/scabs1.f libcruft/blas/scasum.f libcruft/blas/scnrm2.f libcruft/blas/scopy.f libcruft/blas/sdot.f libcruft/blas/sgemm.f libcruft/blas/sgemv.f libcruft/blas/sger.f libcruft/blas/smach.f libcruft/blas/snrm2.f libcruft/blas/srot.f libcruft/blas/sscal.f libcruft/blas/sswap.f libcruft/blas/ssymm.f libcruft/blas/ssymv.f libcruft/blas/ssyr.f libcruft/blas/ssyr2.f libcruft/blas/ssyr2k.f libcruft/blas/ssyrk.f libcruft/blas/stbsv.f libcruft/blas/strmm.f libcruft/blas/strmv.f libcruft/blas/strsm.f libcruft/blas/strsv.f libcruft/blas/zaxpy.f libcruft/blas/zcopy.f libcruft/blas/zdotc.f libcruft/blas/zdotu.f libcruft/blas/zdrot.f libcruft/blas/zdscal.f libcruft/blas/zgemm.f libcruft/blas/zgemv.f libcruft/blas/zgerc.f libcruft/blas/zgeru.f libcruft/blas/zhemm.f libcruft/blas/zhemv.f libcruft/blas/zher.f libcruft/blas/zher2.f libcruft/blas/zher2k.f libcruft/blas/zherk.f libcruft/blas/zscal.f libcruft/blas/zswap.f libcruft/blas/zsyrk.f libcruft/blas/ztbsv.f libcruft/blas/ztrmm.f libcruft/blas/ztrmv.f libcruft/blas/ztrsm.f libcruft/blas/ztrsv.f libcruft/lapack/cbdsqr.f libcruft/lapack/cgbcon.f libcruft/lapack/cgbtf2.f libcruft/lapack/cgbtrf.f libcruft/lapack/cgbtrs.f libcruft/lapack/cgebak.f libcruft/lapack/cgebal.f libcruft/lapack/cgebd2.f libcruft/lapack/cgebrd.f libcruft/lapack/cgecon.f libcruft/lapack/cgeesx.f libcruft/lapack/cgeev.f libcruft/lapack/cgehd2.f libcruft/lapack/cgehrd.f libcruft/lapack/cgelq2.f libcruft/lapack/cgelqf.f libcruft/lapack/cgelsd.f libcruft/lapack/cgelss.f libcruft/lapack/cgelsy.f libcruft/lapack/cgeqp3.f libcruft/lapack/cgeqpf.f libcruft/lapack/cgeqr2.f libcruft/lapack/cgeqrf.f libcruft/lapack/cgesv.f libcruft/lapack/cgesvd.f libcruft/lapack/cgetf2.f libcruft/lapack/cgetrf.f libcruft/lapack/cgetri.f libcruft/lapack/cgetrs.f libcruft/lapack/cggbak.f libcruft/lapack/cggbal.f libcruft/lapack/cggev.f libcruft/lapack/cgghrd.f libcruft/lapack/cgtsv.f libcruft/lapack/cgttrf.f libcruft/lapack/cgttrs.f libcruft/lapack/cgtts2.f libcruft/lapack/cheev.f libcruft/lapack/chegs2.f libcruft/lapack/chegst.f libcruft/lapack/chegv.f libcruft/lapack/chetd2.f libcruft/lapack/chetrd.f libcruft/lapack/chgeqz.f libcruft/lapack/chseqr.f libcruft/lapack/clabrd.f libcruft/lapack/clacgv.f libcruft/lapack/clacn2.f libcruft/lapack/clacon.f libcruft/lapack/clacpy.f libcruft/lapack/cladiv.f libcruft/lapack/clahqr.f libcruft/lapack/clahr2.f libcruft/lapack/clahrd.f libcruft/lapack/claic1.f libcruft/lapack/clals0.f libcruft/lapack/clalsa.f libcruft/lapack/clalsd.f libcruft/lapack/clange.f libcruft/lapack/clanhe.f libcruft/lapack/clanhs.f libcruft/lapack/clantr.f libcruft/lapack/claqp2.f libcruft/lapack/claqps.f libcruft/lapack/claqr0.f libcruft/lapack/claqr1.f libcruft/lapack/claqr2.f libcruft/lapack/claqr3.f libcruft/lapack/claqr4.f libcruft/lapack/claqr5.f libcruft/lapack/clarf.f libcruft/lapack/clarfb.f libcruft/lapack/clarfg.f libcruft/lapack/clarft.f libcruft/lapack/clarfx.f libcruft/lapack/clartg.f libcruft/lapack/clarz.f libcruft/lapack/clarzb.f libcruft/lapack/clarzt.f libcruft/lapack/clascl.f libcruft/lapack/claset.f libcruft/lapack/clasr.f libcruft/lapack/classq.f libcruft/lapack/claswp.f libcruft/lapack/clatbs.f libcruft/lapack/clatrd.f libcruft/lapack/clatrs.f libcruft/lapack/clatrz.f libcruft/lapack/clauu2.f libcruft/lapack/clauum.f libcruft/lapack/cpbcon.f libcruft/lapack/cpbtf2.f libcruft/lapack/cpbtrf.f libcruft/lapack/cpbtrs.f libcruft/lapack/cpocon.f libcruft/lapack/cpotf2.f libcruft/lapack/cpotrf.f libcruft/lapack/cpotri.f libcruft/lapack/cpotrs.f libcruft/lapack/cptsv.f libcruft/lapack/cpttrf.f libcruft/lapack/cpttrs.f libcruft/lapack/cptts2.f libcruft/lapack/crot.f libcruft/lapack/csrscl.f libcruft/lapack/csteqr.f libcruft/lapack/ctgevc.f libcruft/lapack/ctrcon.f libcruft/lapack/ctrevc.f libcruft/lapack/ctrexc.f libcruft/lapack/ctrsen.f libcruft/lapack/ctrsyl.f libcruft/lapack/ctrti2.f libcruft/lapack/ctrtri.f libcruft/lapack/ctrtrs.f libcruft/lapack/ctzrzf.f libcruft/lapack/cung2l.f libcruft/lapack/cung2r.f libcruft/lapack/cungbr.f libcruft/lapack/cunghr.f libcruft/lapack/cungl2.f libcruft/lapack/cunglq.f libcruft/lapack/cungql.f libcruft/lapack/cungqr.f libcruft/lapack/cungtr.f libcruft/lapack/cunm2r.f libcruft/lapack/cunmbr.f libcruft/lapack/cunml2.f libcruft/lapack/cunmlq.f libcruft/lapack/cunmqr.f libcruft/lapack/cunmr3.f libcruft/lapack/cunmrz.f libcruft/lapack/dbdsqr.f libcruft/lapack/dgbcon.f libcruft/lapack/dgbtf2.f libcruft/lapack/dgbtrf.f libcruft/lapack/dgbtrs.f libcruft/lapack/dgebak.f libcruft/lapack/dgebal.f libcruft/lapack/dgebd2.f libcruft/lapack/dgebrd.f libcruft/lapack/dgecon.f libcruft/lapack/dgeesx.f libcruft/lapack/dgeev.f libcruft/lapack/dgehd2.f libcruft/lapack/dgehrd.f libcruft/lapack/dgelq2.f libcruft/lapack/dgelqf.f libcruft/lapack/dgelsd.f libcruft/lapack/dgelss.f libcruft/lapack/dgelsy.f libcruft/lapack/dgeqp3.f libcruft/lapack/dgeqpf.f libcruft/lapack/dgeqr2.f libcruft/lapack/dgeqrf.f libcruft/lapack/dgesv.f libcruft/lapack/dgesvd.f libcruft/lapack/dgetf2.f libcruft/lapack/dgetrf.f libcruft/lapack/dgetri.f libcruft/lapack/dgetrs.f libcruft/lapack/dggbak.f libcruft/lapack/dggbal.f libcruft/lapack/dggev.f libcruft/lapack/dgghrd.f libcruft/lapack/dgtsv.f libcruft/lapack/dgttrf.f libcruft/lapack/dgttrs.f libcruft/lapack/dgtts2.f libcruft/lapack/dhgeqz.f libcruft/lapack/dhseqr.f libcruft/lapack/dlabad.f libcruft/lapack/dlabrd.f libcruft/lapack/dlacn2.f libcruft/lapack/dlacon.f libcruft/lapack/dlacpy.f libcruft/lapack/dladiv.f libcruft/lapack/dlae2.f libcruft/lapack/dlaed6.f libcruft/lapack/dlaev2.f libcruft/lapack/dlaexc.f libcruft/lapack/dlag2.f libcruft/lapack/dlahqr.f libcruft/lapack/dlahr2.f libcruft/lapack/dlahrd.f libcruft/lapack/dlaic1.f libcruft/lapack/dlaln2.f libcruft/lapack/dlals0.f libcruft/lapack/dlalsa.f libcruft/lapack/dlalsd.f libcruft/lapack/dlamc1.f libcruft/lapack/dlamc2.f libcruft/lapack/dlamc3.f libcruft/lapack/dlamc4.f libcruft/lapack/dlamc5.f libcruft/lapack/dlamch.f libcruft/lapack/dlamrg.f libcruft/lapack/dlange.f libcruft/lapack/dlanhs.f libcruft/lapack/dlanst.f libcruft/lapack/dlansy.f libcruft/lapack/dlantr.f libcruft/lapack/dlanv2.f libcruft/lapack/dlapy2.f libcruft/lapack/dlapy3.f libcruft/lapack/dlaqp2.f libcruft/lapack/dlaqps.f libcruft/lapack/dlaqr0.f libcruft/lapack/dlaqr1.f libcruft/lapack/dlaqr2.f libcruft/lapack/dlaqr3.f libcruft/lapack/dlaqr4.f libcruft/lapack/dlaqr5.f libcruft/lapack/dlarf.f libcruft/lapack/dlarfb.f libcruft/lapack/dlarfg.f libcruft/lapack/dlarft.f libcruft/lapack/dlarfx.f libcruft/lapack/dlartg.f libcruft/lapack/dlarz.f libcruft/lapack/dlarzb.f libcruft/lapack/dlarzt.f libcruft/lapack/dlas2.f libcruft/lapack/dlascl.f libcruft/lapack/dlasd0.f libcruft/lapack/dlasd1.f libcruft/lapack/dlasd2.f libcruft/lapack/dlasd3.f libcruft/lapack/dlasd4.f libcruft/lapack/dlasd5.f libcruft/lapack/dlasd6.f libcruft/lapack/dlasd7.f libcruft/lapack/dlasd8.f libcruft/lapack/dlasda.f libcruft/lapack/dlasdq.f libcruft/lapack/dlasdt.f libcruft/lapack/dlaset.f libcruft/lapack/dlasq1.f libcruft/lapack/dlasq2.f libcruft/lapack/dlasq3.f libcruft/lapack/dlasq4.f libcruft/lapack/dlasq5.f libcruft/lapack/dlasq6.f libcruft/lapack/dlasr.f libcruft/lapack/dlasrt.f libcruft/lapack/dlassq.f libcruft/lapack/dlasv2.f libcruft/lapack/dlaswp.f libcruft/lapack/dlasy2.f libcruft/lapack/dlatbs.f libcruft/lapack/dlatrd.f libcruft/lapack/dlatrs.f libcruft/lapack/dlatrz.f libcruft/lapack/dlauu2.f libcruft/lapack/dlauum.f libcruft/lapack/dlazq3.f libcruft/lapack/dlazq4.f libcruft/lapack/dorg2l.f libcruft/lapack/dorg2r.f libcruft/lapack/dorgbr.f libcruft/lapack/dorghr.f libcruft/lapack/dorgl2.f libcruft/lapack/dorglq.f libcruft/lapack/dorgql.f libcruft/lapack/dorgqr.f libcruft/lapack/dorgtr.f libcruft/lapack/dorm2r.f libcruft/lapack/dormbr.f libcruft/lapack/dorml2.f libcruft/lapack/dormlq.f libcruft/lapack/dormqr.f libcruft/lapack/dormr3.f libcruft/lapack/dormrz.f libcruft/lapack/dpbcon.f libcruft/lapack/dpbtf2.f libcruft/lapack/dpbtrf.f libcruft/lapack/dpbtrs.f libcruft/lapack/dpocon.f libcruft/lapack/dpotf2.f libcruft/lapack/dpotrf.f libcruft/lapack/dpotri.f libcruft/lapack/dpotrs.f libcruft/lapack/dptsv.f libcruft/lapack/dpttrf.f libcruft/lapack/dpttrs.f libcruft/lapack/dptts2.f libcruft/lapack/drscl.f libcruft/lapack/dsteqr.f libcruft/lapack/dsterf.f libcruft/lapack/dsyev.f libcruft/lapack/dsygs2.f libcruft/lapack/dsygst.f libcruft/lapack/dsygv.f libcruft/lapack/dsytd2.f libcruft/lapack/dsytrd.f libcruft/lapack/dtgevc.f libcruft/lapack/dtrcon.f libcruft/lapack/dtrevc.f libcruft/lapack/dtrexc.f libcruft/lapack/dtrsen.f libcruft/lapack/dtrsyl.f libcruft/lapack/dtrti2.f libcruft/lapack/dtrtri.f libcruft/lapack/dtrtrs.f libcruft/lapack/dtzrzf.f libcruft/lapack/dzsum1.f libcruft/lapack/icmax1.f libcruft/lapack/ieeeck.f libcruft/lapack/ilaenv.f libcruft/lapack/iparmq.f libcruft/lapack/izmax1.f libcruft/lapack/module.mk libcruft/lapack/sbdsqr.f libcruft/lapack/scsum1.f libcruft/lapack/sgbcon.f libcruft/lapack/sgbtf2.f libcruft/lapack/sgbtrf.f libcruft/lapack/sgbtrs.f libcruft/lapack/sgebak.f libcruft/lapack/sgebal.f libcruft/lapack/sgebd2.f libcruft/lapack/sgebrd.f libcruft/lapack/sgecon.f libcruft/lapack/sgeesx.f libcruft/lapack/sgeev.f libcruft/lapack/sgehd2.f libcruft/lapack/sgehrd.f libcruft/lapack/sgelq2.f libcruft/lapack/sgelqf.f libcruft/lapack/sgelsd.f libcruft/lapack/sgelss.f libcruft/lapack/sgelsy.f libcruft/lapack/sgeqp3.f libcruft/lapack/sgeqpf.f libcruft/lapack/sgeqr2.f libcruft/lapack/sgeqrf.f libcruft/lapack/sgesv.f libcruft/lapack/sgesvd.f libcruft/lapack/sgetf2.f libcruft/lapack/sgetrf.f libcruft/lapack/sgetri.f libcruft/lapack/sgetrs.f libcruft/lapack/sggbak.f libcruft/lapack/sggbal.f libcruft/lapack/sggev.f libcruft/lapack/sgghrd.f libcruft/lapack/sgtsv.f libcruft/lapack/sgttrf.f libcruft/lapack/sgttrs.f libcruft/lapack/sgtts2.f libcruft/lapack/shgeqz.f libcruft/lapack/shseqr.f libcruft/lapack/slabad.f libcruft/lapack/slabrd.f libcruft/lapack/slacn2.f libcruft/lapack/slacon.f libcruft/lapack/slacpy.f libcruft/lapack/sladiv.f libcruft/lapack/slae2.f libcruft/lapack/slaed6.f libcruft/lapack/slaev2.f libcruft/lapack/slaexc.f libcruft/lapack/slag2.f libcruft/lapack/slahqr.f libcruft/lapack/slahr2.f libcruft/lapack/slahrd.f libcruft/lapack/slaic1.f libcruft/lapack/slaln2.f libcruft/lapack/slals0.f libcruft/lapack/slalsa.f libcruft/lapack/slalsd.f libcruft/lapack/slamc1.f libcruft/lapack/slamc2.f libcruft/lapack/slamc3.f libcruft/lapack/slamc4.f libcruft/lapack/slamc5.f libcruft/lapack/slamch.f libcruft/lapack/slamrg.f libcruft/lapack/slange.f libcruft/lapack/slanhs.f libcruft/lapack/slanst.f libcruft/lapack/slansy.f libcruft/lapack/slantr.f libcruft/lapack/slanv2.f libcruft/lapack/slapy2.f libcruft/lapack/slapy3.f libcruft/lapack/slaqp2.f libcruft/lapack/slaqps.f libcruft/lapack/slaqr0.f libcruft/lapack/slaqr1.f libcruft/lapack/slaqr2.f libcruft/lapack/slaqr3.f libcruft/lapack/slaqr4.f libcruft/lapack/slaqr5.f libcruft/lapack/slarf.f libcruft/lapack/slarfb.f libcruft/lapack/slarfg.f libcruft/lapack/slarft.f libcruft/lapack/slarfx.f libcruft/lapack/slartg.f libcruft/lapack/slarz.f libcruft/lapack/slarzb.f libcruft/lapack/slarzt.f libcruft/lapack/slas2.f libcruft/lapack/slascl.f libcruft/lapack/slasd0.f libcruft/lapack/slasd1.f libcruft/lapack/slasd2.f libcruft/lapack/slasd3.f libcruft/lapack/slasd4.f libcruft/lapack/slasd5.f libcruft/lapack/slasd6.f libcruft/lapack/slasd7.f libcruft/lapack/slasd8.f libcruft/lapack/slasda.f libcruft/lapack/slasdq.f libcruft/lapack/slasdt.f libcruft/lapack/slaset.f libcruft/lapack/slasq1.f libcruft/lapack/slasq2.f libcruft/lapack/slasq3.f libcruft/lapack/slasq4.f libcruft/lapack/slasq5.f libcruft/lapack/slasq6.f libcruft/lapack/slasr.f libcruft/lapack/slasrt.f libcruft/lapack/slassq.f libcruft/lapack/slasv2.f libcruft/lapack/slaswp.f libcruft/lapack/slasy2.f libcruft/lapack/slatbs.f libcruft/lapack/slatrd.f libcruft/lapack/slatrs.f libcruft/lapack/slatrz.f libcruft/lapack/slauu2.f libcruft/lapack/slauum.f libcruft/lapack/slazq3.f libcruft/lapack/slazq4.f libcruft/lapack/sorg2l.f libcruft/lapack/sorg2r.f libcruft/lapack/sorgbr.f libcruft/lapack/sorghr.f libcruft/lapack/sorgl2.f libcruft/lapack/sorglq.f libcruft/lapack/sorgql.f libcruft/lapack/sorgqr.f libcruft/lapack/sorgtr.f libcruft/lapack/sorm2r.f libcruft/lapack/sormbr.f libcruft/lapack/sorml2.f libcruft/lapack/sormlq.f libcruft/lapack/sormqr.f libcruft/lapack/sormr3.f libcruft/lapack/sormrz.f libcruft/lapack/spbcon.f libcruft/lapack/spbtf2.f libcruft/lapack/spbtrf.f libcruft/lapack/spbtrs.f libcruft/lapack/spocon.f libcruft/lapack/spotf2.f libcruft/lapack/spotrf.f libcruft/lapack/spotri.f libcruft/lapack/spotrs.f libcruft/lapack/sptsv.f libcruft/lapack/spttrf.f libcruft/lapack/spttrs.f libcruft/lapack/sptts2.f libcruft/lapack/srscl.f libcruft/lapack/ssteqr.f libcruft/lapack/ssterf.f libcruft/lapack/ssyev.f libcruft/lapack/ssygs2.f libcruft/lapack/ssygst.f libcruft/lapack/ssygv.f libcruft/lapack/ssytd2.f libcruft/lapack/ssytrd.f libcruft/lapack/stgevc.f libcruft/lapack/strcon.f libcruft/lapack/strevc.f libcruft/lapack/strexc.f libcruft/lapack/strsen.f libcruft/lapack/strsyl.f libcruft/lapack/strti2.f libcruft/lapack/strtri.f libcruft/lapack/strtrs.f libcruft/lapack/stzrzf.f libcruft/lapack/zbdsqr.f libcruft/lapack/zdrscl.f libcruft/lapack/zgbcon.f libcruft/lapack/zgbtf2.f libcruft/lapack/zgbtrf.f libcruft/lapack/zgbtrs.f libcruft/lapack/zgebak.f libcruft/lapack/zgebal.f libcruft/lapack/zgebd2.f libcruft/lapack/zgebrd.f libcruft/lapack/zgecon.f libcruft/lapack/zgeesx.f libcruft/lapack/zgeev.f libcruft/lapack/zgehd2.f libcruft/lapack/zgehrd.f libcruft/lapack/zgelq2.f libcruft/lapack/zgelqf.f libcruft/lapack/zgelsd.f libcruft/lapack/zgelss.f libcruft/lapack/zgelsy.f libcruft/lapack/zgeqp3.f libcruft/lapack/zgeqpf.f libcruft/lapack/zgeqr2.f libcruft/lapack/zgeqrf.f libcruft/lapack/zgesv.f libcruft/lapack/zgesvd.f libcruft/lapack/zgetf2.f libcruft/lapack/zgetrf.f libcruft/lapack/zgetri.f libcruft/lapack/zgetrs.f libcruft/lapack/zggbak.f libcruft/lapack/zggbal.f libcruft/lapack/zggev.f libcruft/lapack/zgghrd.f libcruft/lapack/zgtsv.f libcruft/lapack/zgttrf.f libcruft/lapack/zgttrs.f libcruft/lapack/zgtts2.f libcruft/lapack/zheev.f libcruft/lapack/zhegs2.f libcruft/lapack/zhegst.f libcruft/lapack/zhegv.f libcruft/lapack/zhetd2.f libcruft/lapack/zhetrd.f libcruft/lapack/zhgeqz.f libcruft/lapack/zhseqr.f libcruft/lapack/zlabrd.f libcruft/lapack/zlacgv.f libcruft/lapack/zlacn2.f libcruft/lapack/zlacon.f libcruft/lapack/zlacpy.f libcruft/lapack/zladiv.f libcruft/lapack/zlahqr.f libcruft/lapack/zlahr2.f libcruft/lapack/zlahrd.f libcruft/lapack/zlaic1.f libcruft/lapack/zlals0.f libcruft/lapack/zlalsa.f libcruft/lapack/zlalsd.f libcruft/lapack/zlange.f libcruft/lapack/zlanhe.f libcruft/lapack/zlanhs.f libcruft/lapack/zlantr.f libcruft/lapack/zlaqp2.f libcruft/lapack/zlaqps.f libcruft/lapack/zlaqr0.f libcruft/lapack/zlaqr1.f libcruft/lapack/zlaqr2.f libcruft/lapack/zlaqr3.f libcruft/lapack/zlaqr4.f libcruft/lapack/zlaqr5.f libcruft/lapack/zlarf.f libcruft/lapack/zlarfb.f libcruft/lapack/zlarfg.f libcruft/lapack/zlarft.f libcruft/lapack/zlarfx.f libcruft/lapack/zlartg.f libcruft/lapack/zlarz.f libcruft/lapack/zlarzb.f libcruft/lapack/zlarzt.f libcruft/lapack/zlascl.f libcruft/lapack/zlaset.f libcruft/lapack/zlasr.f libcruft/lapack/zlassq.f libcruft/lapack/zlaswp.f libcruft/lapack/zlatbs.f libcruft/lapack/zlatrd.f libcruft/lapack/zlatrs.f libcruft/lapack/zlatrz.f libcruft/lapack/zlauu2.f libcruft/lapack/zlauum.f libcruft/lapack/zpbcon.f libcruft/lapack/zpbtf2.f libcruft/lapack/zpbtrf.f libcruft/lapack/zpbtrs.f libcruft/lapack/zpocon.f libcruft/lapack/zpotf2.f libcruft/lapack/zpotrf.f libcruft/lapack/zpotri.f libcruft/lapack/zpotrs.f libcruft/lapack/zptsv.f libcruft/lapack/zpttrf.f libcruft/lapack/zpttrs.f libcruft/lapack/zptts2.f libcruft/lapack/zrot.f libcruft/lapack/zsteqr.f libcruft/lapack/ztgevc.f libcruft/lapack/ztrcon.f libcruft/lapack/ztrevc.f libcruft/lapack/ztrexc.f libcruft/lapack/ztrsen.f libcruft/lapack/ztrsyl.f libcruft/lapack/ztrti2.f libcruft/lapack/ztrtri.f libcruft/lapack/ztrtrs.f libcruft/lapack/ztzrzf.f libcruft/lapack/zung2l.f libcruft/lapack/zung2r.f libcruft/lapack/zungbr.f libcruft/lapack/zunghr.f libcruft/lapack/zungl2.f libcruft/lapack/zunglq.f libcruft/lapack/zungql.f libcruft/lapack/zungqr.f libcruft/lapack/zungtr.f libcruft/lapack/zunm2r.f libcruft/lapack/zunmbr.f libcruft/lapack/zunml2.f libcruft/lapack/zunmlq.f libcruft/lapack/zunmqr.f libcruft/lapack/zunmr3.f libcruft/lapack/zunmrz.f
diffstat 729 files changed, 22 insertions(+), 203500 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue Nov 10 19:48:02 2009 -0500
+++ b/ChangeLog	Tue Nov 10 23:07:25 2009 -0500
@@ -1,3 +1,12 @@
+2009-11-10  John W. Eaton  <jwe@octave.org>
+
+	* NEWS: Update.
+
+	* configure.ac: Exit with error if BLAS or LAPACK libraries are
+	not found or if the BLAS library is found to be incompatible with
+	the Fortran compiler.  Eliminate warn_blas_f77_incompatible
+	variable.
+
 2009-11-10  John W. Eaton  <jwe@octave.org>
 
 	* configure.ac: Set octincludedir to
--- a/NEWS	Tue Nov 10 19:48:02 2009 -0500
+++ b/NEWS	Tue Nov 10 23:07:25 2009 -0500
@@ -1,6 +1,10 @@
 Summary of important user-visible changes for version 3.3:
 ---------------------------------------------------------
 
+ ** BLAS and LAPACK libraries are now required to build Octave.  The
+    subset of the reference BLAS and LAPACK libraries has been removed
+    from the Octave sources.
+
  ** The `lookup' function was extended to be more useful for general-purpose
     binary searching. Using this improvement, the ismember function was
     rewritten for significantly better performance.
--- a/configure.ac	Tue Nov 10 19:48:02 2009 -0500
+++ b/configure.ac	Tue Nov 10 23:07:25 2009 -0500
@@ -904,16 +904,15 @@
 AC_SUBST(XTRA_CRUFT_SH_LDFLAGS)
 
 ### Checks for BLAS and LAPACK libraries:
-# (Build subdirectories of libcruft if they aren't found on the system.)
 ACX_BLAS_WITH_F77_FUNC([:], [:])
 ACX_LAPACK([:], [:])
 
-AM_CONDITIONAL([AMCOND_HAVE_BLAS], [test x$acx_blas_ok = xyes])
-AM_CONDITIONAL([AMCOND_HAVE_LAPACK], [test x$acx_lapack_ok = xyes])
+if test x$acx_blas_ok = xno || test x$acx_lapack_ok = xno; then
+  AC_MSG_ERROR([You are required to have BLAS and LAPACK libraries])
+fi
 
 if test "x$acx_blas_f77_func_ok" = "xno"; then
-  warn_blas_f77_incompatible="A BLAS library was detected but found incompatible with your Fortran 77 compiler.  The reference BLAS implementation will be used. To improve performance, consider using a different Fortran compiler or a switch like -ff2c to make your Fortran compiler use a calling convention compatible with the way your BLAS library was compiled, or use a different BLAS library."
-  AC_MSG_WARN($warn_blas_f77_incompatible)
+  AC_MSG_ERROR([A BLAS library was detected but found incompatible with your Fortran 77 compiler])
 fi
 
 # Check for the qrupdate library
@@ -2334,11 +2333,6 @@
   warn_msg_printed=true
 fi
 
-if test -n "$warn_blas_f77_incompatible"; then
-  AC_MSG_WARN($warn_blas_f77_incompatible)
-  warn_msg_printed=true
-fi
-
 if test -n "$warn_umfpack"; then
   AC_MSG_WARN($warn_umfpack)
   warn_msg_printed=true
--- a/libcruft/ChangeLog	Tue Nov 10 19:48:02 2009 -0500
+++ b/libcruft/ChangeLog	Tue Nov 10 23:07:25 2009 -0500
@@ -1,3 +1,8 @@
+2009-11-10  John W. Eaton  <jwe@octave.org>
+
+	* blas, lapack: Remove directories and all files.
+	* Makefile.am: Don't include blas/module.mk or lapack/module.mk.
+
 2009-11-10  John W. Eaton  <jwe@octave.org>
 
 	* Makefile.am, amos/module.mk, blas-xtra/module.mk,
--- a/libcruft/Makefile.am	Tue Nov 10 19:48:02 2009 -0500
+++ b/libcruft/Makefile.am	Tue Nov 10 23:07:25 2009 -0500
@@ -38,13 +38,11 @@
 EXTRA_DIST = ChangeLog STOP.patch mkf77def.in
 
 include amos/module.mk
-include blas/module.mk
 include blas-xtra/module.mk
 include daspk/module.mk
 include dasrt/module.mk
 include dassl/module.mk
 include fftpack/module.mk
-include lapack/module.mk
 include lapack-xtra/module.mk
 include misc/module.mk
 include odepack/module.mk
--- a/libcruft/blas/caxpy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-      SUBROUTINE CAXPY(N,CA,CX,INCX,CY,INCY)
-*     .. Scalar Arguments ..
-      COMPLEX CA
-      INTEGER INCX,INCY,N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX CX(*),CY(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*     CAXPY constant times a vector plus a vector.
-*
-*  Further Details
-*  ===============
-*
-*     jack dongarra, linpack, 3/11/78.
-*     modified 12/3/93, array(1) declarations changed to array(*)
-*
-*     .. Local Scalars ..
-      INTEGER I,IX,IY
-*     ..
-*     .. External Functions ..
-      REAL SCABS1
-      EXTERNAL SCABS1
-*     ..
-      IF (N.LE.0) RETURN
-      IF (SCABS1(CA).EQ.0.0E+0) RETURN
-      IF (INCX.EQ.1 .AND. INCY.EQ.1) GO TO 20
-*
-*        code for unequal increments or equal increments
-*          not equal to 1
-*
-      IX = 1
-      IY = 1
-      IF (INCX.LT.0) IX = (-N+1)*INCX + 1
-      IF (INCY.LT.0) IY = (-N+1)*INCY + 1
-      DO 10 I = 1,N
-          CY(IY) = CY(IY) + CA*CX(IX)
-          IX = IX + INCX
-          IY = IY + INCY
-   10 CONTINUE
-      RETURN
-*
-*        code for both increments equal to 1
-*
-   20 DO 30 I = 1,N
-          CY(I) = CY(I) + CA*CX(I)
-   30 CONTINUE
-      RETURN
-      END
--- a/libcruft/blas/ccopy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-      SUBROUTINE CCOPY(N,CX,INCX,CY,INCY)
-*     .. Scalar Arguments ..
-      INTEGER INCX,INCY,N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX CX(*),CY(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*     CCOPY copies a vector x to a vector y.
-*
-*  Further Details
-*  ===============
-*
-*     jack dongarra, linpack, 3/11/78.
-*     modified 12/3/93, array(1) declarations changed to array(*)
-*
-*     .. Local Scalars ..
-      INTEGER I,IX,IY
-*     ..
-      IF (N.LE.0) RETURN
-      IF (INCX.EQ.1 .AND. INCY.EQ.1) GO TO 20
-*
-*        code for unequal increments or equal increments
-*          not equal to 1
-*
-      IX = 1
-      IY = 1
-      IF (INCX.LT.0) IX = (-N+1)*INCX + 1
-      IF (INCY.LT.0) IY = (-N+1)*INCY + 1
-      DO 10 I = 1,N
-          CY(IY) = CX(IX)
-          IX = IX + INCX
-          IY = IY + INCY
-   10 CONTINUE
-      RETURN
-*
-*        code for both increments equal to 1
-*
-   20 DO 30 I = 1,N
-          CY(I) = CX(I)
-   30 CONTINUE
-      RETURN
-      END
--- a/libcruft/blas/cdotc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-      COMPLEX FUNCTION CDOTC(N,CX,INCX,CY,INCY)
-*     .. Scalar Arguments ..
-      INTEGER INCX,INCY,N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX CX(*),CY(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*     forms the dot product of two vectors, conjugating the first
-*     vector.
-*
-*  Further Details
-*  ===============
-*
-*     jack dongarra, linpack,  3/11/78.
-*     modified 12/3/93, array(1) declarations changed to array(*)
-*
-*     .. Local Scalars ..
-      COMPLEX CTEMP
-      INTEGER I,IX,IY
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC CONJG
-*     ..
-      CTEMP = (0.0,0.0)
-      CDOTC = (0.0,0.0)
-      IF (N.LE.0) RETURN
-      IF (INCX.EQ.1 .AND. INCY.EQ.1) GO TO 20
-*
-*        code for unequal increments or equal increments
-*          not equal to 1
-*
-      IX = 1
-      IY = 1
-      IF (INCX.LT.0) IX = (-N+1)*INCX + 1
-      IF (INCY.LT.0) IY = (-N+1)*INCY + 1
-      DO 10 I = 1,N
-          CTEMP = CTEMP + CONJG(CX(IX))*CY(IY)
-          IX = IX + INCX
-          IY = IY + INCY
-   10 CONTINUE
-      CDOTC = CTEMP
-      RETURN
-*
-*        code for both increments equal to 1
-*
-   20 DO 30 I = 1,N
-          CTEMP = CTEMP + CONJG(CX(I))*CY(I)
-   30 CONTINUE
-      CDOTC = CTEMP
-      RETURN
-      END
--- a/libcruft/blas/cdotu.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-      COMPLEX FUNCTION CDOTU(N,CX,INCX,CY,INCY)
-*     .. Scalar Arguments ..
-      INTEGER INCX,INCY,N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX CX(*),CY(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*     CDOTU forms the dot product of two vectors.
-*
-*  Further Details
-*  ===============
-*
-*     jack dongarra, linpack, 3/11/78.
-*     modified 12/3/93, array(1) declarations changed to array(*)
-*
-*     .. Local Scalars ..
-      COMPLEX CTEMP
-      INTEGER I,IX,IY
-*     ..
-      CTEMP = (0.0,0.0)
-      CDOTU = (0.0,0.0)
-      IF (N.LE.0) RETURN
-      IF (INCX.EQ.1 .AND. INCY.EQ.1) GO TO 20
-*
-*        code for unequal increments or equal increments
-*          not equal to 1
-*
-      IX = 1
-      IY = 1
-      IF (INCX.LT.0) IX = (-N+1)*INCX + 1
-      IF (INCY.LT.0) IY = (-N+1)*INCY + 1
-      DO 10 I = 1,N
-          CTEMP = CTEMP + CX(IX)*CY(IY)
-          IX = IX + INCX
-          IY = IY + INCY
-   10 CONTINUE
-      CDOTU = CTEMP
-      RETURN
-*
-*        code for both increments equal to 1
-*
-   20 DO 30 I = 1,N
-          CTEMP = CTEMP + CX(I)*CY(I)
-   30 CONTINUE
-      CDOTU = CTEMP
-      RETURN
-      END
--- a/libcruft/blas/cgemm.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,414 +0,0 @@
-      SUBROUTINE CGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC)
-*     .. Scalar Arguments ..
-      COMPLEX ALPHA,BETA
-      INTEGER K,LDA,LDB,LDC,M,N
-      CHARACTER TRANSA,TRANSB
-*     ..
-*     .. Array Arguments ..
-      COMPLEX A(LDA,*),B(LDB,*),C(LDC,*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGEMM  performs one of the matrix-matrix operations
-*
-*     C := alpha*op( A )*op( B ) + beta*C,
-*
-*  where  op( X ) is one of
-*
-*     op( X ) = X   or   op( X ) = X'   or   op( X ) = conjg( X' ),
-*
-*  alpha and beta are scalars, and A, B and C are matrices, with op( A )
-*  an m by k matrix,  op( B )  a  k by n matrix and  C an m by n matrix.
-*
-*  Arguments
-*  ==========
-*
-*  TRANSA - CHARACTER*1.
-*           On entry, TRANSA specifies the form of op( A ) to be used in
-*           the matrix multiplication as follows:
-*
-*              TRANSA = 'N' or 'n',  op( A ) = A.
-*
-*              TRANSA = 'T' or 't',  op( A ) = A'.
-*
-*              TRANSA = 'C' or 'c',  op( A ) = conjg( A' ).
-*
-*           Unchanged on exit.
-*
-*  TRANSB - CHARACTER*1.
-*           On entry, TRANSB specifies the form of op( B ) to be used in
-*           the matrix multiplication as follows:
-*
-*              TRANSB = 'N' or 'n',  op( B ) = B.
-*
-*              TRANSB = 'T' or 't',  op( B ) = B'.
-*
-*              TRANSB = 'C' or 'c',  op( B ) = conjg( B' ).
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry,  M  specifies  the number  of rows  of the  matrix
-*           op( A )  and of the  matrix  C.  M  must  be at least  zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry,  N  specifies the number  of columns of the matrix
-*           op( B ) and the number of columns of the matrix C. N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry,  K  specifies  the number of columns of the matrix
-*           op( A ) and the number of rows of the matrix op( B ). K must
-*           be at least  zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX         .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX          array of DIMENSION ( LDA, ka ), where ka is
-*           k  when  TRANSA = 'N' or 'n',  and is  m  otherwise.
-*           Before entry with  TRANSA = 'N' or 'n',  the leading  m by k
-*           part of the array  A  must contain the matrix  A,  otherwise
-*           the leading  k by m  part of the array  A  must contain  the
-*           matrix A.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. When  TRANSA = 'N' or 'n' then
-*           LDA must be at least  max( 1, m ), otherwise  LDA must be at
-*           least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  B      - COMPLEX          array of DIMENSION ( LDB, kb ), where kb is
-*           n  when  TRANSB = 'N' or 'n',  and is  k  otherwise.
-*           Before entry with  TRANSB = 'N' or 'n',  the leading  k by n
-*           part of the array  B  must contain the matrix  B,  otherwise
-*           the leading  n by k  part of the array  B  must contain  the
-*           matrix B.
-*           Unchanged on exit.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in the calling (sub) program. When  TRANSB = 'N' or 'n' then
-*           LDB must be at least  max( 1, k ), otherwise  LDB must be at
-*           least  max( 1, n ).
-*           Unchanged on exit.
-*
-*  BETA   - COMPLEX         .
-*           On entry,  BETA  specifies the scalar  beta.  When  BETA  is
-*           supplied as zero then C need not be set on input.
-*           Unchanged on exit.
-*
-*  C      - COMPLEX          array of DIMENSION ( LDC, n ).
-*           Before entry, the leading  m by n  part of the array  C must
-*           contain the matrix  C,  except when  beta  is zero, in which
-*           case C need not be set on entry.
-*           On exit, the array  C  is overwritten by the  m by n  matrix
-*           ( alpha*op( A )*op( B ) + beta*C ).
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC CONJG,MAX
-*     ..
-*     .. Local Scalars ..
-      COMPLEX TEMP
-      INTEGER I,INFO,J,L,NCOLA,NROWA,NROWB
-      LOGICAL CONJA,CONJB,NOTA,NOTB
-*     ..
-*     .. Parameters ..
-      COMPLEX ONE
-      PARAMETER (ONE= (1.0E+0,0.0E+0))
-      COMPLEX ZERO
-      PARAMETER (ZERO= (0.0E+0,0.0E+0))
-*     ..
-*
-*     Set  NOTA  and  NOTB  as  true if  A  and  B  respectively are not
-*     conjugated or transposed, set  CONJA and CONJB  as true if  A  and
-*     B  respectively are to be  transposed but  not conjugated  and set
-*     NROWA, NCOLA and  NROWB  as the number of rows and  columns  of  A
-*     and the number of rows of  B  respectively.
-*
-      NOTA = LSAME(TRANSA,'N')
-      NOTB = LSAME(TRANSB,'N')
-      CONJA = LSAME(TRANSA,'C')
-      CONJB = LSAME(TRANSB,'C')
-      IF (NOTA) THEN
-          NROWA = M
-          NCOLA = K
-      ELSE
-          NROWA = K
-          NCOLA = M
-      END IF
-      IF (NOTB) THEN
-          NROWB = K
-      ELSE
-          NROWB = N
-      END IF
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF ((.NOT.NOTA) .AND. (.NOT.CONJA) .AND.
-     +    (.NOT.LSAME(TRANSA,'T'))) THEN
-          INFO = 1
-      ELSE IF ((.NOT.NOTB) .AND. (.NOT.CONJB) .AND.
-     +         (.NOT.LSAME(TRANSB,'T'))) THEN
-          INFO = 2
-      ELSE IF (M.LT.0) THEN
-          INFO = 3
-      ELSE IF (N.LT.0) THEN
-          INFO = 4
-      ELSE IF (K.LT.0) THEN
-          INFO = 5
-      ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
-          INFO = 8
-      ELSE IF (LDB.LT.MAX(1,NROWB)) THEN
-          INFO = 10
-      ELSE IF (LDC.LT.MAX(1,M)) THEN
-          INFO = 13
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('CGEMM ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
-     +    (((ALPHA.EQ.ZERO).OR. (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF (ALPHA.EQ.ZERO) THEN
-          IF (BETA.EQ.ZERO) THEN
-              DO 20 J = 1,N
-                  DO 10 I = 1,M
-                      C(I,J) = ZERO
-   10             CONTINUE
-   20         CONTINUE
-          ELSE
-              DO 40 J = 1,N
-                  DO 30 I = 1,M
-                      C(I,J) = BETA*C(I,J)
-   30             CONTINUE
-   40         CONTINUE
-          END IF
-          RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF (NOTB) THEN
-          IF (NOTA) THEN
-*
-*           Form  C := alpha*A*B + beta*C.
-*
-              DO 90 J = 1,N
-                  IF (BETA.EQ.ZERO) THEN
-                      DO 50 I = 1,M
-                          C(I,J) = ZERO
-   50                 CONTINUE
-                  ELSE IF (BETA.NE.ONE) THEN
-                      DO 60 I = 1,M
-                          C(I,J) = BETA*C(I,J)
-   60                 CONTINUE
-                  END IF
-                  DO 80 L = 1,K
-                      IF (B(L,J).NE.ZERO) THEN
-                          TEMP = ALPHA*B(L,J)
-                          DO 70 I = 1,M
-                              C(I,J) = C(I,J) + TEMP*A(I,L)
-   70                     CONTINUE
-                      END IF
-   80             CONTINUE
-   90         CONTINUE
-          ELSE IF (CONJA) THEN
-*
-*           Form  C := alpha*conjg( A' )*B + beta*C.
-*
-              DO 120 J = 1,N
-                  DO 110 I = 1,M
-                      TEMP = ZERO
-                      DO 100 L = 1,K
-                          TEMP = TEMP + CONJG(A(L,I))*B(L,J)
-  100                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP
-                      ELSE
-                          C(I,J) = ALPHA*TEMP + BETA*C(I,J)
-                      END IF
-  110             CONTINUE
-  120         CONTINUE
-          ELSE
-*
-*           Form  C := alpha*A'*B + beta*C
-*
-              DO 150 J = 1,N
-                  DO 140 I = 1,M
-                      TEMP = ZERO
-                      DO 130 L = 1,K
-                          TEMP = TEMP + A(L,I)*B(L,J)
-  130                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP
-                      ELSE
-                          C(I,J) = ALPHA*TEMP + BETA*C(I,J)
-                      END IF
-  140             CONTINUE
-  150         CONTINUE
-          END IF
-      ELSE IF (NOTA) THEN
-          IF (CONJB) THEN
-*
-*           Form  C := alpha*A*conjg( B' ) + beta*C.
-*
-              DO 200 J = 1,N
-                  IF (BETA.EQ.ZERO) THEN
-                      DO 160 I = 1,M
-                          C(I,J) = ZERO
-  160                 CONTINUE
-                  ELSE IF (BETA.NE.ONE) THEN
-                      DO 170 I = 1,M
-                          C(I,J) = BETA*C(I,J)
-  170                 CONTINUE
-                  END IF
-                  DO 190 L = 1,K
-                      IF (B(J,L).NE.ZERO) THEN
-                          TEMP = ALPHA*CONJG(B(J,L))
-                          DO 180 I = 1,M
-                              C(I,J) = C(I,J) + TEMP*A(I,L)
-  180                     CONTINUE
-                      END IF
-  190             CONTINUE
-  200         CONTINUE
-          ELSE
-*
-*           Form  C := alpha*A*B'          + beta*C
-*
-              DO 250 J = 1,N
-                  IF (BETA.EQ.ZERO) THEN
-                      DO 210 I = 1,M
-                          C(I,J) = ZERO
-  210                 CONTINUE
-                  ELSE IF (BETA.NE.ONE) THEN
-                      DO 220 I = 1,M
-                          C(I,J) = BETA*C(I,J)
-  220                 CONTINUE
-                  END IF
-                  DO 240 L = 1,K
-                      IF (B(J,L).NE.ZERO) THEN
-                          TEMP = ALPHA*B(J,L)
-                          DO 230 I = 1,M
-                              C(I,J) = C(I,J) + TEMP*A(I,L)
-  230                     CONTINUE
-                      END IF
-  240             CONTINUE
-  250         CONTINUE
-          END IF
-      ELSE IF (CONJA) THEN
-          IF (CONJB) THEN
-*
-*           Form  C := alpha*conjg( A' )*conjg( B' ) + beta*C.
-*
-              DO 280 J = 1,N
-                  DO 270 I = 1,M
-                      TEMP = ZERO
-                      DO 260 L = 1,K
-                          TEMP = TEMP + CONJG(A(L,I))*CONJG(B(J,L))
-  260                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP
-                      ELSE
-                          C(I,J) = ALPHA*TEMP + BETA*C(I,J)
-                      END IF
-  270             CONTINUE
-  280         CONTINUE
-          ELSE
-*
-*           Form  C := alpha*conjg( A' )*B' + beta*C
-*
-              DO 310 J = 1,N
-                  DO 300 I = 1,M
-                      TEMP = ZERO
-                      DO 290 L = 1,K
-                          TEMP = TEMP + CONJG(A(L,I))*B(J,L)
-  290                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP
-                      ELSE
-                          C(I,J) = ALPHA*TEMP + BETA*C(I,J)
-                      END IF
-  300             CONTINUE
-  310         CONTINUE
-          END IF
-      ELSE
-          IF (CONJB) THEN
-*
-*           Form  C := alpha*A'*conjg( B' ) + beta*C
-*
-              DO 340 J = 1,N
-                  DO 330 I = 1,M
-                      TEMP = ZERO
-                      DO 320 L = 1,K
-                          TEMP = TEMP + A(L,I)*CONJG(B(J,L))
-  320                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP
-                      ELSE
-                          C(I,J) = ALPHA*TEMP + BETA*C(I,J)
-                      END IF
-  330             CONTINUE
-  340         CONTINUE
-          ELSE
-*
-*           Form  C := alpha*A'*B' + beta*C
-*
-              DO 370 J = 1,N
-                  DO 360 I = 1,M
-                      TEMP = ZERO
-                      DO 350 L = 1,K
-                          TEMP = TEMP + A(L,I)*B(J,L)
-  350                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP
-                      ELSE
-                          C(I,J) = ALPHA*TEMP + BETA*C(I,J)
-                      END IF
-  360             CONTINUE
-  370         CONTINUE
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of CGEMM .
-*
-      END
--- a/libcruft/blas/cgemv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,281 +0,0 @@
-      SUBROUTINE CGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
-*     .. Scalar Arguments ..
-      COMPLEX ALPHA,BETA
-      INTEGER INCX,INCY,LDA,M,N
-      CHARACTER TRANS
-*     ..
-*     .. Array Arguments ..
-      COMPLEX A(LDA,*),X(*),Y(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGEMV performs one of the matrix-vector operations
-*
-*     y := alpha*A*x + beta*y,   or   y := alpha*A'*x + beta*y,   or
-*
-*     y := alpha*conjg( A' )*x + beta*y,
-*
-*  where alpha and beta are scalars, x and y are vectors and A is an
-*  m by n matrix.
-*
-*  Arguments
-*  ==========
-*
-*  TRANS  - CHARACTER*1.
-*           On entry, TRANS specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   y := alpha*A*x + beta*y.
-*
-*              TRANS = 'T' or 't'   y := alpha*A'*x + beta*y.
-*
-*              TRANS = 'C' or 'c'   y := alpha*conjg( A' )*x + beta*y.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of the matrix A.
-*           M must be at least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX         .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX          array of DIMENSION ( LDA, n ).
-*           Before entry, the leading m by n part of the array A must
-*           contain the matrix of coefficients.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*  X      - COMPLEX          array of DIMENSION at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'
-*           and at least
-*           ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.
-*           Before entry, the incremented array X must contain the
-*           vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  BETA   - COMPLEX         .
-*           On entry, BETA specifies the scalar beta. When BETA is
-*           supplied as zero then Y need not be set on input.
-*           Unchanged on exit.
-*
-*  Y      - COMPLEX          array of DIMENSION at least
-*           ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'
-*           and at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.
-*           Before entry with BETA non-zero, the incremented array Y
-*           must contain the vector y. On exit, Y is overwritten by the
-*           updated vector y.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX ONE
-      PARAMETER (ONE= (1.0E+0,0.0E+0))
-      COMPLEX ZERO
-      PARAMETER (ZERO= (0.0E+0,0.0E+0))
-*     ..
-*     .. Local Scalars ..
-      COMPLEX TEMP
-      INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY,LENX,LENY
-      LOGICAL NOCONJ
-*     ..
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC CONJG,MAX
-*     ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
-     +    .NOT.LSAME(TRANS,'C')) THEN
-          INFO = 1
-      ELSE IF (M.LT.0) THEN
-          INFO = 2
-      ELSE IF (N.LT.0) THEN
-          INFO = 3
-      ELSE IF (LDA.LT.MAX(1,M)) THEN
-          INFO = 6
-      ELSE IF (INCX.EQ.0) THEN
-          INFO = 8
-      ELSE IF (INCY.EQ.0) THEN
-          INFO = 11
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('CGEMV ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
-     +    ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
-*
-      NOCONJ = LSAME(TRANS,'T')
-*
-*     Set  LENX  and  LENY, the lengths of the vectors x and y, and set
-*     up the start points in  X  and  Y.
-*
-      IF (LSAME(TRANS,'N')) THEN
-          LENX = N
-          LENY = M
-      ELSE
-          LENX = M
-          LENY = N
-      END IF
-      IF (INCX.GT.0) THEN
-          KX = 1
-      ELSE
-          KX = 1 - (LENX-1)*INCX
-      END IF
-      IF (INCY.GT.0) THEN
-          KY = 1
-      ELSE
-          KY = 1 - (LENY-1)*INCY
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-*     First form  y := beta*y.
-*
-      IF (BETA.NE.ONE) THEN
-          IF (INCY.EQ.1) THEN
-              IF (BETA.EQ.ZERO) THEN
-                  DO 10 I = 1,LENY
-                      Y(I) = ZERO
-   10             CONTINUE
-              ELSE
-                  DO 20 I = 1,LENY
-                      Y(I) = BETA*Y(I)
-   20             CONTINUE
-              END IF
-          ELSE
-              IY = KY
-              IF (BETA.EQ.ZERO) THEN
-                  DO 30 I = 1,LENY
-                      Y(IY) = ZERO
-                      IY = IY + INCY
-   30             CONTINUE
-              ELSE
-                  DO 40 I = 1,LENY
-                      Y(IY) = BETA*Y(IY)
-                      IY = IY + INCY
-   40             CONTINUE
-              END IF
-          END IF
-      END IF
-      IF (ALPHA.EQ.ZERO) RETURN
-      IF (LSAME(TRANS,'N')) THEN
-*
-*        Form  y := alpha*A*x + y.
-*
-          JX = KX
-          IF (INCY.EQ.1) THEN
-              DO 60 J = 1,N
-                  IF (X(JX).NE.ZERO) THEN
-                      TEMP = ALPHA*X(JX)
-                      DO 50 I = 1,M
-                          Y(I) = Y(I) + TEMP*A(I,J)
-   50                 CONTINUE
-                  END IF
-                  JX = JX + INCX
-   60         CONTINUE
-          ELSE
-              DO 80 J = 1,N
-                  IF (X(JX).NE.ZERO) THEN
-                      TEMP = ALPHA*X(JX)
-                      IY = KY
-                      DO 70 I = 1,M
-                          Y(IY) = Y(IY) + TEMP*A(I,J)
-                          IY = IY + INCY
-   70                 CONTINUE
-                  END IF
-                  JX = JX + INCX
-   80         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  y := alpha*A'*x + y  or  y := alpha*conjg( A' )*x + y.
-*
-          JY = KY
-          IF (INCX.EQ.1) THEN
-              DO 110 J = 1,N
-                  TEMP = ZERO
-                  IF (NOCONJ) THEN
-                      DO 90 I = 1,M
-                          TEMP = TEMP + A(I,J)*X(I)
-   90                 CONTINUE
-                  ELSE
-                      DO 100 I = 1,M
-                          TEMP = TEMP + CONJG(A(I,J))*X(I)
-  100                 CONTINUE
-                  END IF
-                  Y(JY) = Y(JY) + ALPHA*TEMP
-                  JY = JY + INCY
-  110         CONTINUE
-          ELSE
-              DO 140 J = 1,N
-                  TEMP = ZERO
-                  IX = KX
-                  IF (NOCONJ) THEN
-                      DO 120 I = 1,M
-                          TEMP = TEMP + A(I,J)*X(IX)
-                          IX = IX + INCX
-  120                 CONTINUE
-                  ELSE
-                      DO 130 I = 1,M
-                          TEMP = TEMP + CONJG(A(I,J))*X(IX)
-                          IX = IX + INCX
-  130                 CONTINUE
-                  END IF
-                  Y(JY) = Y(JY) + ALPHA*TEMP
-                  JY = JY + INCY
-  140         CONTINUE
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of CGEMV .
-*
-      END
--- a/libcruft/blas/cgerc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,159 +0,0 @@
-      SUBROUTINE CGERC(M,N,ALPHA,X,INCX,Y,INCY,A,LDA)
-*     .. Scalar Arguments ..
-      COMPLEX ALPHA
-      INTEGER INCX,INCY,LDA,M,N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX A(LDA,*),X(*),Y(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGERC  performs the rank 1 operation
-*
-*     A := alpha*x*conjg( y' ) + A,
-*
-*  where alpha is a scalar, x is an m element vector, y is an n element
-*  vector and A is an m by n matrix.
-*
-*  Arguments
-*  ==========
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of the matrix A.
-*           M must be at least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX         .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  X      - COMPLEX          array of dimension at least
-*           ( 1 + ( m - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the m
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  Y      - COMPLEX          array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ).
-*           Before entry, the incremented array Y must contain the n
-*           element vector y.
-*           Unchanged on exit.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX          array of DIMENSION ( LDA, n ).
-*           Before entry, the leading m by n part of the array A must
-*           contain the matrix of coefficients. On exit, A is
-*           overwritten by the updated matrix.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX ZERO
-      PARAMETER (ZERO= (0.0E+0,0.0E+0))
-*     ..
-*     .. Local Scalars ..
-      COMPLEX TEMP
-      INTEGER I,INFO,IX,J,JY,KX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC CONJG,MAX
-*     ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF (M.LT.0) THEN
-          INFO = 1
-      ELSE IF (N.LT.0) THEN
-          INFO = 2
-      ELSE IF (INCX.EQ.0) THEN
-          INFO = 5
-      ELSE IF (INCY.EQ.0) THEN
-          INFO = 7
-      ELSE IF (LDA.LT.MAX(1,M)) THEN
-          INFO = 9
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('CGERC ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((M.EQ.0) .OR. (N.EQ.0) .OR. (ALPHA.EQ.ZERO)) RETURN
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-      IF (INCY.GT.0) THEN
-          JY = 1
-      ELSE
-          JY = 1 - (N-1)*INCY
-      END IF
-      IF (INCX.EQ.1) THEN
-          DO 20 J = 1,N
-              IF (Y(JY).NE.ZERO) THEN
-                  TEMP = ALPHA*CONJG(Y(JY))
-                  DO 10 I = 1,M
-                      A(I,J) = A(I,J) + X(I)*TEMP
-   10             CONTINUE
-              END IF
-              JY = JY + INCY
-   20     CONTINUE
-      ELSE
-          IF (INCX.GT.0) THEN
-              KX = 1
-          ELSE
-              KX = 1 - (M-1)*INCX
-          END IF
-          DO 40 J = 1,N
-              IF (Y(JY).NE.ZERO) THEN
-                  TEMP = ALPHA*CONJG(Y(JY))
-                  IX = KX
-                  DO 30 I = 1,M
-                      A(I,J) = A(I,J) + X(IX)*TEMP
-                      IX = IX + INCX
-   30             CONTINUE
-              END IF
-              JY = JY + INCY
-   40     CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of CGERC .
-*
-      END
--- a/libcruft/blas/cgeru.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,159 +0,0 @@
-      SUBROUTINE CGERU(M,N,ALPHA,X,INCX,Y,INCY,A,LDA)
-*     .. Scalar Arguments ..
-      COMPLEX ALPHA
-      INTEGER INCX,INCY,LDA,M,N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX A(LDA,*),X(*),Y(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGERU  performs the rank 1 operation
-*
-*     A := alpha*x*y' + A,
-*
-*  where alpha is a scalar, x is an m element vector, y is an n element
-*  vector and A is an m by n matrix.
-*
-*  Arguments
-*  ==========
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of the matrix A.
-*           M must be at least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX         .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  X      - COMPLEX          array of dimension at least
-*           ( 1 + ( m - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the m
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  Y      - COMPLEX          array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ).
-*           Before entry, the incremented array Y must contain the n
-*           element vector y.
-*           Unchanged on exit.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX          array of DIMENSION ( LDA, n ).
-*           Before entry, the leading m by n part of the array A must
-*           contain the matrix of coefficients. On exit, A is
-*           overwritten by the updated matrix.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX ZERO
-      PARAMETER (ZERO= (0.0E+0,0.0E+0))
-*     ..
-*     .. Local Scalars ..
-      COMPLEX TEMP
-      INTEGER I,INFO,IX,J,JY,KX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX
-*     ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF (M.LT.0) THEN
-          INFO = 1
-      ELSE IF (N.LT.0) THEN
-          INFO = 2
-      ELSE IF (INCX.EQ.0) THEN
-          INFO = 5
-      ELSE IF (INCY.EQ.0) THEN
-          INFO = 7
-      ELSE IF (LDA.LT.MAX(1,M)) THEN
-          INFO = 9
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('CGERU ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((M.EQ.0) .OR. (N.EQ.0) .OR. (ALPHA.EQ.ZERO)) RETURN
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-      IF (INCY.GT.0) THEN
-          JY = 1
-      ELSE
-          JY = 1 - (N-1)*INCY
-      END IF
-      IF (INCX.EQ.1) THEN
-          DO 20 J = 1,N
-              IF (Y(JY).NE.ZERO) THEN
-                  TEMP = ALPHA*Y(JY)
-                  DO 10 I = 1,M
-                      A(I,J) = A(I,J) + X(I)*TEMP
-   10             CONTINUE
-              END IF
-              JY = JY + INCY
-   20     CONTINUE
-      ELSE
-          IF (INCX.GT.0) THEN
-              KX = 1
-          ELSE
-              KX = 1 - (M-1)*INCX
-          END IF
-          DO 40 J = 1,N
-              IF (Y(JY).NE.ZERO) THEN
-                  TEMP = ALPHA*Y(JY)
-                  IX = KX
-                  DO 30 I = 1,M
-                      A(I,J) = A(I,J) + X(IX)*TEMP
-                      IX = IX + INCX
-   30             CONTINUE
-              END IF
-              JY = JY + INCY
-   40     CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of CGERU .
-*
-      END
--- a/libcruft/blas/chemm.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,298 +0,0 @@
-      SUBROUTINE CHEMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC)
-*     .. Scalar Arguments ..
-      COMPLEX ALPHA,BETA
-      INTEGER LDA,LDB,LDC,M,N
-      CHARACTER SIDE,UPLO
-*     ..
-*     .. Array Arguments ..
-      COMPLEX A(LDA,*),B(LDB,*),C(LDC,*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CHEMM  performs one of the matrix-matrix operations
-*
-*     C := alpha*A*B + beta*C,
-*
-*  or
-*
-*     C := alpha*B*A + beta*C,
-*
-*  where alpha and beta are scalars, A is an hermitian matrix and  B and
-*  C are m by n matrices.
-*
-*  Arguments
-*  ==========
-*
-*  SIDE   - CHARACTER*1.
-*           On entry,  SIDE  specifies whether  the  hermitian matrix  A
-*           appears on the  left or right  in the  operation as follows:
-*
-*              SIDE = 'L' or 'l'   C := alpha*A*B + beta*C,
-*
-*              SIDE = 'R' or 'r'   C := alpha*B*A + beta*C,
-*
-*           Unchanged on exit.
-*
-*  UPLO   - CHARACTER*1.
-*           On  entry,   UPLO  specifies  whether  the  upper  or  lower
-*           triangular  part  of  the  hermitian  matrix   A  is  to  be
-*           referenced as follows:
-*
-*              UPLO = 'U' or 'u'   Only the upper triangular part of the
-*                                  hermitian matrix is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the lower triangular part of the
-*                                  hermitian matrix is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry,  M  specifies the number of rows of the matrix  C.
-*           M  must be at least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of the matrix C.
-*           N  must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX         .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX          array of DIMENSION ( LDA, ka ), where ka is
-*           m  when  SIDE = 'L' or 'l'  and is n  otherwise.
-*           Before entry  with  SIDE = 'L' or 'l',  the  m by m  part of
-*           the array  A  must contain the  hermitian matrix,  such that
-*           when  UPLO = 'U' or 'u', the leading m by m upper triangular
-*           part of the array  A  must contain the upper triangular part
-*           of the  hermitian matrix and the  strictly  lower triangular
-*           part of  A  is not referenced,  and when  UPLO = 'L' or 'l',
-*           the leading  m by m  lower triangular part  of the  array  A
-*           must  contain  the  lower triangular part  of the  hermitian
-*           matrix and the  strictly upper triangular part of  A  is not
-*           referenced.
-*           Before entry  with  SIDE = 'R' or 'r',  the  n by n  part of
-*           the array  A  must contain the  hermitian matrix,  such that
-*           when  UPLO = 'U' or 'u', the leading n by n upper triangular
-*           part of the array  A  must contain the upper triangular part
-*           of the  hermitian matrix and the  strictly  lower triangular
-*           part of  A  is not referenced,  and when  UPLO = 'L' or 'l',
-*           the leading  n by n  lower triangular part  of the  array  A
-*           must  contain  the  lower triangular part  of the  hermitian
-*           matrix and the  strictly upper triangular part of  A  is not
-*           referenced.
-*           Note that the imaginary parts  of the diagonal elements need
-*           not be set, they are assumed to be zero.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the  calling (sub) program. When  SIDE = 'L' or 'l'  then
-*           LDA must be at least  max( 1, m ), otherwise  LDA must be at
-*           least max( 1, n ).
-*           Unchanged on exit.
-*
-*  B      - COMPLEX          array of DIMENSION ( LDB, n ).
-*           Before entry, the leading  m by n part of the array  B  must
-*           contain the matrix B.
-*           Unchanged on exit.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in  the  calling  (sub)  program.   LDB  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*  BETA   - COMPLEX         .
-*           On entry,  BETA  specifies the scalar  beta.  When  BETA  is
-*           supplied as zero then C need not be set on input.
-*           Unchanged on exit.
-*
-*  C      - COMPLEX          array of DIMENSION ( LDC, n ).
-*           Before entry, the leading  m by n  part of the array  C must
-*           contain the matrix  C,  except when  beta  is zero, in which
-*           case C need not be set on entry.
-*           On exit, the array  C  is overwritten by the  m by n updated
-*           matrix.
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC CONJG,MAX,REAL
-*     ..
-*     .. Local Scalars ..
-      COMPLEX TEMP1,TEMP2
-      INTEGER I,INFO,J,K,NROWA
-      LOGICAL UPPER
-*     ..
-*     .. Parameters ..
-      COMPLEX ONE
-      PARAMETER (ONE= (1.0E+0,0.0E+0))
-      COMPLEX ZERO
-      PARAMETER (ZERO= (0.0E+0,0.0E+0))
-*     ..
-*
-*     Set NROWA as the number of rows of A.
-*
-      IF (LSAME(SIDE,'L')) THEN
-          NROWA = M
-      ELSE
-          NROWA = N
-      END IF
-      UPPER = LSAME(UPLO,'U')
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF ((.NOT.LSAME(SIDE,'L')) .AND. (.NOT.LSAME(SIDE,'R'))) THEN
-          INFO = 1
-      ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
-          INFO = 2
-      ELSE IF (M.LT.0) THEN
-          INFO = 3
-      ELSE IF (N.LT.0) THEN
-          INFO = 4
-      ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
-          INFO = 7
-      ELSE IF (LDB.LT.MAX(1,M)) THEN
-          INFO = 9
-      ELSE IF (LDC.LT.MAX(1,M)) THEN
-          INFO = 12
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('CHEMM ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
-     +    ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF (ALPHA.EQ.ZERO) THEN
-          IF (BETA.EQ.ZERO) THEN
-              DO 20 J = 1,N
-                  DO 10 I = 1,M
-                      C(I,J) = ZERO
-   10             CONTINUE
-   20         CONTINUE
-          ELSE
-              DO 40 J = 1,N
-                  DO 30 I = 1,M
-                      C(I,J) = BETA*C(I,J)
-   30             CONTINUE
-   40         CONTINUE
-          END IF
-          RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF (LSAME(SIDE,'L')) THEN
-*
-*        Form  C := alpha*A*B + beta*C.
-*
-          IF (UPPER) THEN
-              DO 70 J = 1,N
-                  DO 60 I = 1,M
-                      TEMP1 = ALPHA*B(I,J)
-                      TEMP2 = ZERO
-                      DO 50 K = 1,I - 1
-                          C(K,J) = C(K,J) + TEMP1*A(K,I)
-                          TEMP2 = TEMP2 + B(K,J)*CONJG(A(K,I))
-   50                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = TEMP1*REAL(A(I,I)) + ALPHA*TEMP2
-                      ELSE
-                          C(I,J) = BETA*C(I,J) + TEMP1*REAL(A(I,I)) +
-     +                             ALPHA*TEMP2
-                      END IF
-   60             CONTINUE
-   70         CONTINUE
-          ELSE
-              DO 100 J = 1,N
-                  DO 90 I = M,1,-1
-                      TEMP1 = ALPHA*B(I,J)
-                      TEMP2 = ZERO
-                      DO 80 K = I + 1,M
-                          C(K,J) = C(K,J) + TEMP1*A(K,I)
-                          TEMP2 = TEMP2 + B(K,J)*CONJG(A(K,I))
-   80                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = TEMP1*REAL(A(I,I)) + ALPHA*TEMP2
-                      ELSE
-                          C(I,J) = BETA*C(I,J) + TEMP1*REAL(A(I,I)) +
-     +                             ALPHA*TEMP2
-                      END IF
-   90             CONTINUE
-  100         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  C := alpha*B*A + beta*C.
-*
-          DO 170 J = 1,N
-              TEMP1 = ALPHA*REAL(A(J,J))
-              IF (BETA.EQ.ZERO) THEN
-                  DO 110 I = 1,M
-                      C(I,J) = TEMP1*B(I,J)
-  110             CONTINUE
-              ELSE
-                  DO 120 I = 1,M
-                      C(I,J) = BETA*C(I,J) + TEMP1*B(I,J)
-  120             CONTINUE
-              END IF
-              DO 140 K = 1,J - 1
-                  IF (UPPER) THEN
-                      TEMP1 = ALPHA*A(K,J)
-                  ELSE
-                      TEMP1 = ALPHA*CONJG(A(J,K))
-                  END IF
-                  DO 130 I = 1,M
-                      C(I,J) = C(I,J) + TEMP1*B(I,K)
-  130             CONTINUE
-  140         CONTINUE
-              DO 160 K = J + 1,N
-                  IF (UPPER) THEN
-                      TEMP1 = ALPHA*CONJG(A(J,K))
-                  ELSE
-                      TEMP1 = ALPHA*A(K,J)
-                  END IF
-                  DO 150 I = 1,M
-                      C(I,J) = C(I,J) + TEMP1*B(I,K)
-  150             CONTINUE
-  160         CONTINUE
-  170     CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of CHEMM .
-*
-      END
--- a/libcruft/blas/chemv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,266 +0,0 @@
-      SUBROUTINE CHEMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
-*     .. Scalar Arguments ..
-      COMPLEX ALPHA,BETA
-      INTEGER INCX,INCY,LDA,N
-      CHARACTER UPLO
-*     ..
-*     .. Array Arguments ..
-      COMPLEX A(LDA,*),X(*),Y(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CHEMV  performs the matrix-vector  operation
-*
-*     y := alpha*A*x + beta*y,
-*
-*  where alpha and beta are scalars, x and y are n element vectors and
-*  A is an n by n hermitian matrix.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the upper or lower
-*           triangular part of the array A is to be referenced as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the upper triangular part of A
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the lower triangular part of A
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX         .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX          array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular part of the hermitian matrix and the strictly
-*           lower triangular part of A is not referenced.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular part of the hermitian matrix and the strictly
-*           upper triangular part of A is not referenced.
-*           Note that the imaginary parts of the diagonal elements need
-*           not be set and are assumed to be zero.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*  X      - COMPLEX          array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  BETA   - COMPLEX         .
-*           On entry, BETA specifies the scalar beta. When BETA is
-*           supplied as zero then Y need not be set on input.
-*           Unchanged on exit.
-*
-*  Y      - COMPLEX          array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ).
-*           Before entry, the incremented array Y must contain the n
-*           element vector y. On exit, Y is overwritten by the updated
-*           vector y.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX ONE
-      PARAMETER (ONE= (1.0E+0,0.0E+0))
-      COMPLEX ZERO
-      PARAMETER (ZERO= (0.0E+0,0.0E+0))
-*     ..
-*     .. Local Scalars ..
-      COMPLEX TEMP1,TEMP2
-      INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY
-*     ..
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC CONJG,MAX,REAL
-*     ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN
-          INFO = 1
-      ELSE IF (N.LT.0) THEN
-          INFO = 2
-      ELSE IF (LDA.LT.MAX(1,N)) THEN
-          INFO = 5
-      ELSE IF (INCX.EQ.0) THEN
-          INFO = 7
-      ELSE IF (INCY.EQ.0) THEN
-          INFO = 10
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('CHEMV ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((N.EQ.0) .OR. ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
-*
-*     Set up the start points in  X  and  Y.
-*
-      IF (INCX.GT.0) THEN
-          KX = 1
-      ELSE
-          KX = 1 - (N-1)*INCX
-      END IF
-      IF (INCY.GT.0) THEN
-          KY = 1
-      ELSE
-          KY = 1 - (N-1)*INCY
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through the triangular part
-*     of A.
-*
-*     First form  y := beta*y.
-*
-      IF (BETA.NE.ONE) THEN
-          IF (INCY.EQ.1) THEN
-              IF (BETA.EQ.ZERO) THEN
-                  DO 10 I = 1,N
-                      Y(I) = ZERO
-   10             CONTINUE
-              ELSE
-                  DO 20 I = 1,N
-                      Y(I) = BETA*Y(I)
-   20             CONTINUE
-              END IF
-          ELSE
-              IY = KY
-              IF (BETA.EQ.ZERO) THEN
-                  DO 30 I = 1,N
-                      Y(IY) = ZERO
-                      IY = IY + INCY
-   30             CONTINUE
-              ELSE
-                  DO 40 I = 1,N
-                      Y(IY) = BETA*Y(IY)
-                      IY = IY + INCY
-   40             CONTINUE
-              END IF
-          END IF
-      END IF
-      IF (ALPHA.EQ.ZERO) RETURN
-      IF (LSAME(UPLO,'U')) THEN
-*
-*        Form  y  when A is stored in upper triangle.
-*
-          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN
-              DO 60 J = 1,N
-                  TEMP1 = ALPHA*X(J)
-                  TEMP2 = ZERO
-                  DO 50 I = 1,J - 1
-                      Y(I) = Y(I) + TEMP1*A(I,J)
-                      TEMP2 = TEMP2 + CONJG(A(I,J))*X(I)
-   50             CONTINUE
-                  Y(J) = Y(J) + TEMP1*REAL(A(J,J)) + ALPHA*TEMP2
-   60         CONTINUE
-          ELSE
-              JX = KX
-              JY = KY
-              DO 80 J = 1,N
-                  TEMP1 = ALPHA*X(JX)
-                  TEMP2 = ZERO
-                  IX = KX
-                  IY = KY
-                  DO 70 I = 1,J - 1
-                      Y(IY) = Y(IY) + TEMP1*A(I,J)
-                      TEMP2 = TEMP2 + CONJG(A(I,J))*X(IX)
-                      IX = IX + INCX
-                      IY = IY + INCY
-   70             CONTINUE
-                  Y(JY) = Y(JY) + TEMP1*REAL(A(J,J)) + ALPHA*TEMP2
-                  JX = JX + INCX
-                  JY = JY + INCY
-   80         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  y  when A is stored in lower triangle.
-*
-          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN
-              DO 100 J = 1,N
-                  TEMP1 = ALPHA*X(J)
-                  TEMP2 = ZERO
-                  Y(J) = Y(J) + TEMP1*REAL(A(J,J))
-                  DO 90 I = J + 1,N
-                      Y(I) = Y(I) + TEMP1*A(I,J)
-                      TEMP2 = TEMP2 + CONJG(A(I,J))*X(I)
-   90             CONTINUE
-                  Y(J) = Y(J) + ALPHA*TEMP2
-  100         CONTINUE
-          ELSE
-              JX = KX
-              JY = KY
-              DO 120 J = 1,N
-                  TEMP1 = ALPHA*X(JX)
-                  TEMP2 = ZERO
-                  Y(JY) = Y(JY) + TEMP1*REAL(A(J,J))
-                  IX = JX
-                  IY = JY
-                  DO 110 I = J + 1,N
-                      IX = IX + INCX
-                      IY = IY + INCY
-                      Y(IY) = Y(IY) + TEMP1*A(I,J)
-                      TEMP2 = TEMP2 + CONJG(A(I,J))*X(IX)
-  110             CONTINUE
-                  Y(JY) = Y(JY) + ALPHA*TEMP2
-                  JX = JX + INCX
-                  JY = JY + INCY
-  120         CONTINUE
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of CHEMV .
-*
-      END
--- a/libcruft/blas/cher.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,214 +0,0 @@
-      SUBROUTINE CHER(UPLO,N,ALPHA,X,INCX,A,LDA)
-*     .. Scalar Arguments ..
-      REAL ALPHA
-      INTEGER INCX,LDA,N
-      CHARACTER UPLO
-*     ..
-*     .. Array Arguments ..
-      COMPLEX A(LDA,*),X(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CHER   performs the hermitian rank 1 operation
-*
-*     A := alpha*x*conjg( x' ) + A,
-*
-*  where alpha is a real scalar, x is an n element vector and A is an
-*  n by n hermitian matrix.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the upper or lower
-*           triangular part of the array A is to be referenced as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the upper triangular part of A
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the lower triangular part of A
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - REAL            .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  X      - COMPLEX          array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX          array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular part of the hermitian matrix and the strictly
-*           lower triangular part of A is not referenced. On exit, the
-*           upper triangular part of the array A is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular part of the hermitian matrix and the strictly
-*           upper triangular part of A is not referenced. On exit, the
-*           lower triangular part of the array A is overwritten by the
-*           lower triangular part of the updated matrix.
-*           Note that the imaginary parts of the diagonal elements need
-*           not be set, they are assumed to be zero, and on exit they
-*           are set to zero.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX ZERO
-      PARAMETER (ZERO= (0.0E+0,0.0E+0))
-*     ..
-*     .. Local Scalars ..
-      COMPLEX TEMP
-      INTEGER I,INFO,IX,J,JX,KX
-*     ..
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC CONJG,MAX,REAL
-*     ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN
-          INFO = 1
-      ELSE IF (N.LT.0) THEN
-          INFO = 2
-      ELSE IF (INCX.EQ.0) THEN
-          INFO = 5
-      ELSE IF (LDA.LT.MAX(1,N)) THEN
-          INFO = 7
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('CHER  ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((N.EQ.0) .OR. (ALPHA.EQ.REAL(ZERO))) RETURN
-*
-*     Set the start point in X if the increment is not unity.
-*
-      IF (INCX.LE.0) THEN
-          KX = 1 - (N-1)*INCX
-      ELSE IF (INCX.NE.1) THEN
-          KX = 1
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through the triangular part
-*     of A.
-*
-      IF (LSAME(UPLO,'U')) THEN
-*
-*        Form  A  when A is stored in upper triangle.
-*
-          IF (INCX.EQ.1) THEN
-              DO 20 J = 1,N
-                  IF (X(J).NE.ZERO) THEN
-                      TEMP = ALPHA*CONJG(X(J))
-                      DO 10 I = 1,J - 1
-                          A(I,J) = A(I,J) + X(I)*TEMP
-   10                 CONTINUE
-                      A(J,J) = REAL(A(J,J)) + REAL(X(J)*TEMP)
-                  ELSE
-                      A(J,J) = REAL(A(J,J))
-                  END IF
-   20         CONTINUE
-          ELSE
-              JX = KX
-              DO 40 J = 1,N
-                  IF (X(JX).NE.ZERO) THEN
-                      TEMP = ALPHA*CONJG(X(JX))
-                      IX = KX
-                      DO 30 I = 1,J - 1
-                          A(I,J) = A(I,J) + X(IX)*TEMP
-                          IX = IX + INCX
-   30                 CONTINUE
-                      A(J,J) = REAL(A(J,J)) + REAL(X(JX)*TEMP)
-                  ELSE
-                      A(J,J) = REAL(A(J,J))
-                  END IF
-                  JX = JX + INCX
-   40         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  A  when A is stored in lower triangle.
-*
-          IF (INCX.EQ.1) THEN
-              DO 60 J = 1,N
-                  IF (X(J).NE.ZERO) THEN
-                      TEMP = ALPHA*CONJG(X(J))
-                      A(J,J) = REAL(A(J,J)) + REAL(TEMP*X(J))
-                      DO 50 I = J + 1,N
-                          A(I,J) = A(I,J) + X(I)*TEMP
-   50                 CONTINUE
-                  ELSE
-                      A(J,J) = REAL(A(J,J))
-                  END IF
-   60         CONTINUE
-          ELSE
-              JX = KX
-              DO 80 J = 1,N
-                  IF (X(JX).NE.ZERO) THEN
-                      TEMP = ALPHA*CONJG(X(JX))
-                      A(J,J) = REAL(A(J,J)) + REAL(TEMP*X(JX))
-                      IX = JX
-                      DO 70 I = J + 1,N
-                          IX = IX + INCX
-                          A(I,J) = A(I,J) + X(IX)*TEMP
-   70                 CONTINUE
-                  ELSE
-                      A(J,J) = REAL(A(J,J))
-                  END IF
-                  JX = JX + INCX
-   80         CONTINUE
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of CHER  .
-*
-      END
--- a/libcruft/blas/cher2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,249 +0,0 @@
-      SUBROUTINE CHER2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA)
-*     .. Scalar Arguments ..
-      COMPLEX ALPHA
-      INTEGER INCX,INCY,LDA,N
-      CHARACTER UPLO
-*     ..
-*     .. Array Arguments ..
-      COMPLEX A(LDA,*),X(*),Y(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CHER2  performs the hermitian rank 2 operation
-*
-*     A := alpha*x*conjg( y' ) + conjg( alpha )*y*conjg( x' ) + A,
-*
-*  where alpha is a scalar, x and y are n element vectors and A is an n
-*  by n hermitian matrix.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the upper or lower
-*           triangular part of the array A is to be referenced as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the upper triangular part of A
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the lower triangular part of A
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX         .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  X      - COMPLEX          array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  Y      - COMPLEX          array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ).
-*           Before entry, the incremented array Y must contain the n
-*           element vector y.
-*           Unchanged on exit.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX          array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular part of the hermitian matrix and the strictly
-*           lower triangular part of A is not referenced. On exit, the
-*           upper triangular part of the array A is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular part of the hermitian matrix and the strictly
-*           upper triangular part of A is not referenced. On exit, the
-*           lower triangular part of the array A is overwritten by the
-*           lower triangular part of the updated matrix.
-*           Note that the imaginary parts of the diagonal elements need
-*           not be set, they are assumed to be zero, and on exit they
-*           are set to zero.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX ZERO
-      PARAMETER (ZERO= (0.0E+0,0.0E+0))
-*     ..
-*     .. Local Scalars ..
-      COMPLEX TEMP1,TEMP2
-      INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY
-*     ..
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC CONJG,MAX,REAL
-*     ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN
-          INFO = 1
-      ELSE IF (N.LT.0) THEN
-          INFO = 2
-      ELSE IF (INCX.EQ.0) THEN
-          INFO = 5
-      ELSE IF (INCY.EQ.0) THEN
-          INFO = 7
-      ELSE IF (LDA.LT.MAX(1,N)) THEN
-          INFO = 9
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('CHER2 ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((N.EQ.0) .OR. (ALPHA.EQ.ZERO)) RETURN
-*
-*     Set up the start points in X and Y if the increments are not both
-*     unity.
-*
-      IF ((INCX.NE.1) .OR. (INCY.NE.1)) THEN
-          IF (INCX.GT.0) THEN
-              KX = 1
-          ELSE
-              KX = 1 - (N-1)*INCX
-          END IF
-          IF (INCY.GT.0) THEN
-              KY = 1
-          ELSE
-              KY = 1 - (N-1)*INCY
-          END IF
-          JX = KX
-          JY = KY
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through the triangular part
-*     of A.
-*
-      IF (LSAME(UPLO,'U')) THEN
-*
-*        Form  A  when A is stored in the upper triangle.
-*
-          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN
-              DO 20 J = 1,N
-                  IF ((X(J).NE.ZERO) .OR. (Y(J).NE.ZERO)) THEN
-                      TEMP1 = ALPHA*CONJG(Y(J))
-                      TEMP2 = CONJG(ALPHA*X(J))
-                      DO 10 I = 1,J - 1
-                          A(I,J) = A(I,J) + X(I)*TEMP1 + Y(I)*TEMP2
-   10                 CONTINUE
-                      A(J,J) = REAL(A(J,J)) +
-     +                         REAL(X(J)*TEMP1+Y(J)*TEMP2)
-                  ELSE
-                      A(J,J) = REAL(A(J,J))
-                  END IF
-   20         CONTINUE
-          ELSE
-              DO 40 J = 1,N
-                  IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THEN
-                      TEMP1 = ALPHA*CONJG(Y(JY))
-                      TEMP2 = CONJG(ALPHA*X(JX))
-                      IX = KX
-                      IY = KY
-                      DO 30 I = 1,J - 1
-                          A(I,J) = A(I,J) + X(IX)*TEMP1 + Y(IY)*TEMP2
-                          IX = IX + INCX
-                          IY = IY + INCY
-   30                 CONTINUE
-                      A(J,J) = REAL(A(J,J)) +
-     +                         REAL(X(JX)*TEMP1+Y(JY)*TEMP2)
-                  ELSE
-                      A(J,J) = REAL(A(J,J))
-                  END IF
-                  JX = JX + INCX
-                  JY = JY + INCY
-   40         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  A  when A is stored in the lower triangle.
-*
-          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN
-              DO 60 J = 1,N
-                  IF ((X(J).NE.ZERO) .OR. (Y(J).NE.ZERO)) THEN
-                      TEMP1 = ALPHA*CONJG(Y(J))
-                      TEMP2 = CONJG(ALPHA*X(J))
-                      A(J,J) = REAL(A(J,J)) +
-     +                         REAL(X(J)*TEMP1+Y(J)*TEMP2)
-                      DO 50 I = J + 1,N
-                          A(I,J) = A(I,J) + X(I)*TEMP1 + Y(I)*TEMP2
-   50                 CONTINUE
-                  ELSE
-                      A(J,J) = REAL(A(J,J))
-                  END IF
-   60         CONTINUE
-          ELSE
-              DO 80 J = 1,N
-                  IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THEN
-                      TEMP1 = ALPHA*CONJG(Y(JY))
-                      TEMP2 = CONJG(ALPHA*X(JX))
-                      A(J,J) = REAL(A(J,J)) +
-     +                         REAL(X(JX)*TEMP1+Y(JY)*TEMP2)
-                      IX = JX
-                      IY = JY
-                      DO 70 I = J + 1,N
-                          IX = IX + INCX
-                          IY = IY + INCY
-                          A(I,J) = A(I,J) + X(IX)*TEMP1 + Y(IY)*TEMP2
-   70                 CONTINUE
-                  ELSE
-                      A(J,J) = REAL(A(J,J))
-                  END IF
-                  JX = JX + INCX
-                  JY = JY + INCY
-   80         CONTINUE
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of CHER2 .
-*
-      END
--- a/libcruft/blas/cher2k.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,368 +0,0 @@
-      SUBROUTINE CHER2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC)
-*     .. Scalar Arguments ..
-      COMPLEX ALPHA
-      REAL BETA
-      INTEGER K,LDA,LDB,LDC,N
-      CHARACTER TRANS,UPLO
-*     ..
-*     .. Array Arguments ..
-      COMPLEX A(LDA,*),B(LDB,*),C(LDC,*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CHER2K  performs one of the hermitian rank 2k operations
-*
-*     C := alpha*A*conjg( B' ) + conjg( alpha )*B*conjg( A' ) + beta*C,
-*
-*  or
-*
-*     C := alpha*conjg( A' )*B + conjg( alpha )*conjg( B' )*A + beta*C,
-*
-*  where  alpha and beta  are scalars with  beta  real,  C is an  n by n
-*  hermitian matrix and  A and B  are  n by k matrices in the first case
-*  and  k by n  matrices in the second case.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On  entry,   UPLO  specifies  whether  the  upper  or  lower
-*           triangular  part  of the  array  C  is to be  referenced  as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the  upper triangular part of  C
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the  lower triangular part of  C
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry,  TRANS  specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'    C := alpha*A*conjg( B' )          +
-*                                         conjg( alpha )*B*conjg( A' ) +
-*                                         beta*C.
-*
-*              TRANS = 'C' or 'c'    C := alpha*conjg( A' )*B          +
-*                                         conjg( alpha )*conjg( B' )*A +
-*                                         beta*C.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry,  N specifies the order of the matrix C.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry with  TRANS = 'N' or 'n',  K  specifies  the number
-*           of  columns  of the  matrices  A and B,  and on  entry  with
-*           TRANS = 'C' or 'c',  K  specifies  the number of rows of the
-*           matrices  A and B.  K must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX         .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX          array of DIMENSION ( LDA, ka ), where ka is
-*           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
-*           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
-*           part of the array  A  must contain the matrix  A,  otherwise
-*           the leading  k by n  part of the array  A  must contain  the
-*           matrix A.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
-*           then  LDA must be at least  max( 1, n ), otherwise  LDA must
-*           be at least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  B      - COMPLEX          array of DIMENSION ( LDB, kb ), where kb is
-*           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
-*           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
-*           part of the array  B  must contain the matrix  B,  otherwise
-*           the leading  k by n  part of the array  B  must contain  the
-*           matrix B.
-*           Unchanged on exit.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
-*           then  LDB must be at least  max( 1, n ), otherwise  LDB must
-*           be at least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  BETA   - REAL            .
-*           On entry, BETA specifies the scalar beta.
-*           Unchanged on exit.
-*
-*  C      - COMPLEX          array of DIMENSION ( LDC, n ).
-*           Before entry  with  UPLO = 'U' or 'u',  the leading  n by n
-*           upper triangular part of the array C must contain the upper
-*           triangular part  of the  hermitian matrix  and the strictly
-*           lower triangular part of C is not referenced.  On exit, the
-*           upper triangular part of the array  C is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry  with  UPLO = 'L' or 'l',  the leading  n by n
-*           lower triangular part of the array C must contain the lower
-*           triangular part  of the  hermitian matrix  and the strictly
-*           upper triangular part of C is not referenced.  On exit, the
-*           lower triangular part of the array  C is overwritten by the
-*           lower triangular part of the updated matrix.
-*           Note that the imaginary parts of the diagonal elements need
-*           not be set,  they are assumed to be zero,  and on exit they
-*           are set to zero.
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*  -- Modified 8-Nov-93 to set C(J,J) to REAL( C(J,J) ) when BETA = 1.
-*     Ed Anderson, Cray Research Inc.
-*
-*
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC CONJG,MAX,REAL
-*     ..
-*     .. Local Scalars ..
-      COMPLEX TEMP1,TEMP2
-      INTEGER I,INFO,J,L,NROWA
-      LOGICAL UPPER
-*     ..
-*     .. Parameters ..
-      REAL ONE
-      PARAMETER (ONE=1.0E+0)
-      COMPLEX ZERO
-      PARAMETER (ZERO= (0.0E+0,0.0E+0))
-*     ..
-*
-*     Test the input parameters.
-*
-      IF (LSAME(TRANS,'N')) THEN
-          NROWA = N
-      ELSE
-          NROWA = K
-      END IF
-      UPPER = LSAME(UPLO,'U')
-*
-      INFO = 0
-      IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
-          INFO = 1
-      ELSE IF ((.NOT.LSAME(TRANS,'N')) .AND.
-     +         (.NOT.LSAME(TRANS,'C'))) THEN
-          INFO = 2
-      ELSE IF (N.LT.0) THEN
-          INFO = 3
-      ELSE IF (K.LT.0) THEN
-          INFO = 4
-      ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
-          INFO = 7
-      ELSE IF (LDB.LT.MAX(1,NROWA)) THEN
-          INFO = 9
-      ELSE IF (LDC.LT.MAX(1,N)) THEN
-          INFO = 12
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('CHER2K',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((N.EQ.0) .OR. (((ALPHA.EQ.ZERO).OR.
-     +    (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF (ALPHA.EQ.ZERO) THEN
-          IF (UPPER) THEN
-              IF (BETA.EQ.REAL(ZERO)) THEN
-                  DO 20 J = 1,N
-                      DO 10 I = 1,J
-                          C(I,J) = ZERO
-   10                 CONTINUE
-   20             CONTINUE
-              ELSE
-                  DO 40 J = 1,N
-                      DO 30 I = 1,J - 1
-                          C(I,J) = BETA*C(I,J)
-   30                 CONTINUE
-                      C(J,J) = BETA*REAL(C(J,J))
-   40             CONTINUE
-              END IF
-          ELSE
-              IF (BETA.EQ.REAL(ZERO)) THEN
-                  DO 60 J = 1,N
-                      DO 50 I = J,N
-                          C(I,J) = ZERO
-   50                 CONTINUE
-   60             CONTINUE
-              ELSE
-                  DO 80 J = 1,N
-                      C(J,J) = BETA*REAL(C(J,J))
-                      DO 70 I = J + 1,N
-                          C(I,J) = BETA*C(I,J)
-   70                 CONTINUE
-   80             CONTINUE
-              END IF
-          END IF
-          RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF (LSAME(TRANS,'N')) THEN
-*
-*        Form  C := alpha*A*conjg( B' ) + conjg( alpha )*B*conjg( A' ) +
-*                   C.
-*
-          IF (UPPER) THEN
-              DO 130 J = 1,N
-                  IF (BETA.EQ.REAL(ZERO)) THEN
-                      DO 90 I = 1,J
-                          C(I,J) = ZERO
-   90                 CONTINUE
-                  ELSE IF (BETA.NE.ONE) THEN
-                      DO 100 I = 1,J - 1
-                          C(I,J) = BETA*C(I,J)
-  100                 CONTINUE
-                      C(J,J) = BETA*REAL(C(J,J))
-                  ELSE
-                      C(J,J) = REAL(C(J,J))
-                  END IF
-                  DO 120 L = 1,K
-                      IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THEN
-                          TEMP1 = ALPHA*CONJG(B(J,L))
-                          TEMP2 = CONJG(ALPHA*A(J,L))
-                          DO 110 I = 1,J - 1
-                              C(I,J) = C(I,J) + A(I,L)*TEMP1 +
-     +                                 B(I,L)*TEMP2
-  110                     CONTINUE
-                          C(J,J) = REAL(C(J,J)) +
-     +                             REAL(A(J,L)*TEMP1+B(J,L)*TEMP2)
-                      END IF
-  120             CONTINUE
-  130         CONTINUE
-          ELSE
-              DO 180 J = 1,N
-                  IF (BETA.EQ.REAL(ZERO)) THEN
-                      DO 140 I = J,N
-                          C(I,J) = ZERO
-  140                 CONTINUE
-                  ELSE IF (BETA.NE.ONE) THEN
-                      DO 150 I = J + 1,N
-                          C(I,J) = BETA*C(I,J)
-  150                 CONTINUE
-                      C(J,J) = BETA*REAL(C(J,J))
-                  ELSE
-                      C(J,J) = REAL(C(J,J))
-                  END IF
-                  DO 170 L = 1,K
-                      IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THEN
-                          TEMP1 = ALPHA*CONJG(B(J,L))
-                          TEMP2 = CONJG(ALPHA*A(J,L))
-                          DO 160 I = J + 1,N
-                              C(I,J) = C(I,J) + A(I,L)*TEMP1 +
-     +                                 B(I,L)*TEMP2
-  160                     CONTINUE
-                          C(J,J) = REAL(C(J,J)) +
-     +                             REAL(A(J,L)*TEMP1+B(J,L)*TEMP2)
-                      END IF
-  170             CONTINUE
-  180         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  C := alpha*conjg( A' )*B + conjg( alpha )*conjg( B' )*A +
-*                   C.
-*
-          IF (UPPER) THEN
-              DO 210 J = 1,N
-                  DO 200 I = 1,J
-                      TEMP1 = ZERO
-                      TEMP2 = ZERO
-                      DO 190 L = 1,K
-                          TEMP1 = TEMP1 + CONJG(A(L,I))*B(L,J)
-                          TEMP2 = TEMP2 + CONJG(B(L,I))*A(L,J)
-  190                 CONTINUE
-                      IF (I.EQ.J) THEN
-                          IF (BETA.EQ.REAL(ZERO)) THEN
-                              C(J,J) = REAL(ALPHA*TEMP1+
-     +                                 CONJG(ALPHA)*TEMP2)
-                          ELSE
-                              C(J,J) = BETA*REAL(C(J,J)) +
-     +                                 REAL(ALPHA*TEMP1+
-     +                                 CONJG(ALPHA)*TEMP2)
-                          END IF
-                      ELSE
-                          IF (BETA.EQ.REAL(ZERO)) THEN
-                              C(I,J) = ALPHA*TEMP1 + CONJG(ALPHA)*TEMP2
-                          ELSE
-                              C(I,J) = BETA*C(I,J) + ALPHA*TEMP1 +
-     +                                 CONJG(ALPHA)*TEMP2
-                          END IF
-                      END IF
-  200             CONTINUE
-  210         CONTINUE
-          ELSE
-              DO 240 J = 1,N
-                  DO 230 I = J,N
-                      TEMP1 = ZERO
-                      TEMP2 = ZERO
-                      DO 220 L = 1,K
-                          TEMP1 = TEMP1 + CONJG(A(L,I))*B(L,J)
-                          TEMP2 = TEMP2 + CONJG(B(L,I))*A(L,J)
-  220                 CONTINUE
-                      IF (I.EQ.J) THEN
-                          IF (BETA.EQ.REAL(ZERO)) THEN
-                              C(J,J) = REAL(ALPHA*TEMP1+
-     +                                 CONJG(ALPHA)*TEMP2)
-                          ELSE
-                              C(J,J) = BETA*REAL(C(J,J)) +
-     +                                 REAL(ALPHA*TEMP1+
-     +                                 CONJG(ALPHA)*TEMP2)
-                          END IF
-                      ELSE
-                          IF (BETA.EQ.REAL(ZERO)) THEN
-                              C(I,J) = ALPHA*TEMP1 + CONJG(ALPHA)*TEMP2
-                          ELSE
-                              C(I,J) = BETA*C(I,J) + ALPHA*TEMP1 +
-     +                                 CONJG(ALPHA)*TEMP2
-                          END IF
-                      END IF
-  230             CONTINUE
-  240         CONTINUE
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of CHER2K.
-*
-      END
--- a/libcruft/blas/cherk.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,327 +0,0 @@
-      SUBROUTINE CHERK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC)
-*     .. Scalar Arguments ..
-      REAL ALPHA,BETA
-      INTEGER K,LDA,LDC,N
-      CHARACTER TRANS,UPLO
-*     ..
-*     .. Array Arguments ..
-      COMPLEX A(LDA,*),C(LDC,*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CHERK  performs one of the hermitian rank k operations
-*
-*     C := alpha*A*conjg( A' ) + beta*C,
-*
-*  or
-*
-*     C := alpha*conjg( A' )*A + beta*C,
-*
-*  where  alpha and beta  are  real scalars,  C is an  n by n  hermitian
-*  matrix and  A  is an  n by k  matrix in the  first case and a  k by n
-*  matrix in the second case.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On  entry,   UPLO  specifies  whether  the  upper  or  lower
-*           triangular  part  of the  array  C  is to be  referenced  as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the  upper triangular part of  C
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the  lower triangular part of  C
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry,  TRANS  specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   C := alpha*A*conjg( A' ) + beta*C.
-*
-*              TRANS = 'C' or 'c'   C := alpha*conjg( A' )*A + beta*C.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry,  N specifies the order of the matrix C.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry with  TRANS = 'N' or 'n',  K  specifies  the number
-*           of  columns   of  the   matrix   A,   and  on   entry   with
-*           TRANS = 'C' or 'c',  K  specifies  the number of rows of the
-*           matrix A.  K must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - REAL            .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX          array of DIMENSION ( LDA, ka ), where ka is
-*           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
-*           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
-*           part of the array  A  must contain the matrix  A,  otherwise
-*           the leading  k by n  part of the array  A  must contain  the
-*           matrix A.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
-*           then  LDA must be at least  max( 1, n ), otherwise  LDA must
-*           be at least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  BETA   - REAL            .
-*           On entry, BETA specifies the scalar beta.
-*           Unchanged on exit.
-*
-*  C      - COMPLEX          array of DIMENSION ( LDC, n ).
-*           Before entry  with  UPLO = 'U' or 'u',  the leading  n by n
-*           upper triangular part of the array C must contain the upper
-*           triangular part  of the  hermitian matrix  and the strictly
-*           lower triangular part of C is not referenced.  On exit, the
-*           upper triangular part of the array  C is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry  with  UPLO = 'L' or 'l',  the leading  n by n
-*           lower triangular part of the array C must contain the lower
-*           triangular part  of the  hermitian matrix  and the strictly
-*           upper triangular part of C is not referenced.  On exit, the
-*           lower triangular part of the array  C is overwritten by the
-*           lower triangular part of the updated matrix.
-*           Note that the imaginary parts of the diagonal elements need
-*           not be set,  they are assumed to be zero,  and on exit they
-*           are set to zero.
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*  -- Modified 8-Nov-93 to set C(J,J) to REAL( C(J,J) ) when BETA = 1.
-*     Ed Anderson, Cray Research Inc.
-*
-*
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC CMPLX,CONJG,MAX,REAL
-*     ..
-*     .. Local Scalars ..
-      COMPLEX TEMP
-      REAL RTEMP
-      INTEGER I,INFO,J,L,NROWA
-      LOGICAL UPPER
-*     ..
-*     .. Parameters ..
-      REAL ONE,ZERO
-      PARAMETER (ONE=1.0E+0,ZERO=0.0E+0)
-*     ..
-*
-*     Test the input parameters.
-*
-      IF (LSAME(TRANS,'N')) THEN
-          NROWA = N
-      ELSE
-          NROWA = K
-      END IF
-      UPPER = LSAME(UPLO,'U')
-*
-      INFO = 0
-      IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
-          INFO = 1
-      ELSE IF ((.NOT.LSAME(TRANS,'N')) .AND.
-     +         (.NOT.LSAME(TRANS,'C'))) THEN
-          INFO = 2
-      ELSE IF (N.LT.0) THEN
-          INFO = 3
-      ELSE IF (K.LT.0) THEN
-          INFO = 4
-      ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
-          INFO = 7
-      ELSE IF (LDC.LT.MAX(1,N)) THEN
-          INFO = 10
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('CHERK ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((N.EQ.0) .OR. (((ALPHA.EQ.ZERO).OR.
-     +    (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF (ALPHA.EQ.ZERO) THEN
-          IF (UPPER) THEN
-              IF (BETA.EQ.ZERO) THEN
-                  DO 20 J = 1,N
-                      DO 10 I = 1,J
-                          C(I,J) = ZERO
-   10                 CONTINUE
-   20             CONTINUE
-              ELSE
-                  DO 40 J = 1,N
-                      DO 30 I = 1,J - 1
-                          C(I,J) = BETA*C(I,J)
-   30                 CONTINUE
-                      C(J,J) = BETA*REAL(C(J,J))
-   40             CONTINUE
-              END IF
-          ELSE
-              IF (BETA.EQ.ZERO) THEN
-                  DO 60 J = 1,N
-                      DO 50 I = J,N
-                          C(I,J) = ZERO
-   50                 CONTINUE
-   60             CONTINUE
-              ELSE
-                  DO 80 J = 1,N
-                      C(J,J) = BETA*REAL(C(J,J))
-                      DO 70 I = J + 1,N
-                          C(I,J) = BETA*C(I,J)
-   70                 CONTINUE
-   80             CONTINUE
-              END IF
-          END IF
-          RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF (LSAME(TRANS,'N')) THEN
-*
-*        Form  C := alpha*A*conjg( A' ) + beta*C.
-*
-          IF (UPPER) THEN
-              DO 130 J = 1,N
-                  IF (BETA.EQ.ZERO) THEN
-                      DO 90 I = 1,J
-                          C(I,J) = ZERO
-   90                 CONTINUE
-                  ELSE IF (BETA.NE.ONE) THEN
-                      DO 100 I = 1,J - 1
-                          C(I,J) = BETA*C(I,J)
-  100                 CONTINUE
-                      C(J,J) = BETA*REAL(C(J,J))
-                  ELSE
-                      C(J,J) = REAL(C(J,J))
-                  END IF
-                  DO 120 L = 1,K
-                      IF (A(J,L).NE.CMPLX(ZERO)) THEN
-                          TEMP = ALPHA*CONJG(A(J,L))
-                          DO 110 I = 1,J - 1
-                              C(I,J) = C(I,J) + TEMP*A(I,L)
-  110                     CONTINUE
-                          C(J,J) = REAL(C(J,J)) + REAL(TEMP*A(I,L))
-                      END IF
-  120             CONTINUE
-  130         CONTINUE
-          ELSE
-              DO 180 J = 1,N
-                  IF (BETA.EQ.ZERO) THEN
-                      DO 140 I = J,N
-                          C(I,J) = ZERO
-  140                 CONTINUE
-                  ELSE IF (BETA.NE.ONE) THEN
-                      C(J,J) = BETA*REAL(C(J,J))
-                      DO 150 I = J + 1,N
-                          C(I,J) = BETA*C(I,J)
-  150                 CONTINUE
-                  ELSE
-                      C(J,J) = REAL(C(J,J))
-                  END IF
-                  DO 170 L = 1,K
-                      IF (A(J,L).NE.CMPLX(ZERO)) THEN
-                          TEMP = ALPHA*CONJG(A(J,L))
-                          C(J,J) = REAL(C(J,J)) + REAL(TEMP*A(J,L))
-                          DO 160 I = J + 1,N
-                              C(I,J) = C(I,J) + TEMP*A(I,L)
-  160                     CONTINUE
-                      END IF
-  170             CONTINUE
-  180         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  C := alpha*conjg( A' )*A + beta*C.
-*
-          IF (UPPER) THEN
-              DO 220 J = 1,N
-                  DO 200 I = 1,J - 1
-                      TEMP = ZERO
-                      DO 190 L = 1,K
-                          TEMP = TEMP + CONJG(A(L,I))*A(L,J)
-  190                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP
-                      ELSE
-                          C(I,J) = ALPHA*TEMP + BETA*C(I,J)
-                      END IF
-  200             CONTINUE
-                  RTEMP = ZERO
-                  DO 210 L = 1,K
-                      RTEMP = RTEMP + CONJG(A(L,J))*A(L,J)
-  210             CONTINUE
-                  IF (BETA.EQ.ZERO) THEN
-                      C(J,J) = ALPHA*RTEMP
-                  ELSE
-                      C(J,J) = ALPHA*RTEMP + BETA*REAL(C(J,J))
-                  END IF
-  220         CONTINUE
-          ELSE
-              DO 260 J = 1,N
-                  RTEMP = ZERO
-                  DO 230 L = 1,K
-                      RTEMP = RTEMP + CONJG(A(L,J))*A(L,J)
-  230             CONTINUE
-                  IF (BETA.EQ.ZERO) THEN
-                      C(J,J) = ALPHA*RTEMP
-                  ELSE
-                      C(J,J) = ALPHA*RTEMP + BETA*REAL(C(J,J))
-                  END IF
-                  DO 250 I = J + 1,N
-                      TEMP = ZERO
-                      DO 240 L = 1,K
-                          TEMP = TEMP + CONJG(A(L,I))*A(L,J)
-  240                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP
-                      ELSE
-                          C(I,J) = ALPHA*TEMP + BETA*C(I,J)
-                      END IF
-  250             CONTINUE
-  260         CONTINUE
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of CHERK .
-*
-      END
--- a/libcruft/blas/cscal.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-      SUBROUTINE CSCAL(N,CA,CX,INCX)
-*     .. Scalar Arguments ..
-      COMPLEX CA
-      INTEGER INCX,N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX CX(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*     scales a vector by a constant.
-*     jack dongarra, linpack,  3/11/78.
-*     modified 3/93 to return if incx .le. 0.
-*     modified 12/3/93, array(1) declarations changed to array(*)
-*
-*
-*     .. Local Scalars ..
-      INTEGER I,NINCX
-*     ..
-      IF (N.LE.0 .OR. INCX.LE.0) RETURN
-      IF (INCX.EQ.1) GO TO 20
-*
-*        code for increment not equal to 1
-*
-      NINCX = N*INCX
-      DO 10 I = 1,NINCX,INCX
-          CX(I) = CA*CX(I)
-   10 CONTINUE
-      RETURN
-*
-*        code for increment equal to 1
-*
-   20 DO 30 I = 1,N
-          CX(I) = CA*CX(I)
-   30 CONTINUE
-      RETURN
-      END
--- a/libcruft/blas/csrot.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,95 +0,0 @@
-      SUBROUTINE CSROT( N, CX, INCX, CY, INCY, C, S )
-*
-*     .. Scalar Arguments ..
-      INTEGER           INCX, INCY, N
-      REAL              C, S
-*     ..
-*     .. Array Arguments ..
-      COMPLEX           CX( * ), CY( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  Applies a plane rotation, where the cos and sin (c and s) are real
-*  and the vectors cx and cy are complex.
-*  jack dongarra, linpack, 3/11/78.
-*
-*  Arguments
-*  ==========
-*
-*  N        (input) INTEGER
-*           On entry, N specifies the order of the vectors cx and cy.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  CX       (input) COMPLEX array, dimension at least
-*           ( 1 + ( N - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array CX must contain the n
-*           element vector cx. On exit, CX is overwritten by the updated
-*           vector cx.
-*
-*  INCX     (input) INTEGER
-*           On entry, INCX specifies the increment for the elements of
-*           CX. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  CY       (input) COMPLEX array, dimension at least
-*           ( 1 + ( N - 1 )*abs( INCY ) ).
-*           Before entry, the incremented array CY must contain the n
-*           element vector cy. On exit, CY is overwritten by the updated
-*           vector cy.
-*
-*  INCY     (input) INTEGER
-*           On entry, INCY specifies the increment for the elements of
-*           CY. INCY must not be zero.
-*           Unchanged on exit.
-*
-*  C        (input) REAL
-*           On entry, C specifies the cosine, cos.
-*           Unchanged on exit.
-*
-*  S        (input) REAL
-*           On entry, S specifies the sine, sin.
-*           Unchanged on exit.
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER           I, IX, IY
-      COMPLEX           CTEMP
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.LE.0 )
-     $   RETURN
-      IF( INCX.EQ.1 .AND. INCY.EQ.1 )
-     $   GO TO 20
-*
-*        code for unequal increments or equal increments not equal
-*          to 1
-*
-      IX = 1
-      IY = 1
-      IF( INCX.LT.0 )
-     $   IX = ( -N+1 )*INCX + 1
-      IF( INCY.LT.0 )
-     $   IY = ( -N+1 )*INCY + 1
-      DO 10 I = 1, N
-         CTEMP = C*CX( IX ) + S*CY( IY )
-         CY( IY ) = C*CY( IY ) - S*CX( IX )
-         CX( IX ) = CTEMP
-         IX = IX + INCX
-         IY = IY + INCY
-   10 CONTINUE
-      RETURN
-*
-*        code for both increments equal to 1
-*
-   20 DO 30 I = 1, N
-         CTEMP = C*CX( I ) + S*CY( I )
-         CY( I ) = C*CY( I ) - S*CX( I )
-         CX( I ) = CTEMP
-   30 CONTINUE
-      RETURN
-      END
--- a/libcruft/blas/csscal.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-      SUBROUTINE CSSCAL(N,SA,CX,INCX)
-*     .. Scalar Arguments ..
-      REAL SA
-      INTEGER INCX,N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX CX(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*     scales a complex vector by a real constant.
-*     jack dongarra, linpack, 3/11/78.
-*     modified 3/93 to return if incx .le. 0.
-*     modified 12/3/93, array(1) declarations changed to array(*)
-*
-*
-*     .. Local Scalars ..
-      INTEGER I,NINCX
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC AIMAG,CMPLX,REAL
-*     ..
-      IF (N.LE.0 .OR. INCX.LE.0) RETURN
-      IF (INCX.EQ.1) GO TO 20
-*
-*        code for increment not equal to 1
-*
-      NINCX = N*INCX
-      DO 10 I = 1,NINCX,INCX
-          CX(I) = CMPLX(SA*REAL(CX(I)),SA*AIMAG(CX(I)))
-   10 CONTINUE
-      RETURN
-*
-*        code for increment equal to 1
-*
-   20 DO 30 I = 1,N
-          CX(I) = CMPLX(SA*REAL(CX(I)),SA*AIMAG(CX(I)))
-   30 CONTINUE
-      RETURN
-      END
--- a/libcruft/blas/cswap.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-      SUBROUTINE CSWAP(N,CX,INCX,CY,INCY)
-*     .. Scalar Arguments ..
-      INTEGER INCX,INCY,N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX CX(*),CY(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*     interchanges two vectors.
-*     jack dongarra, linpack, 3/11/78.
-*     modified 12/3/93, array(1) declarations changed to array(*)
-*
-*
-*     .. Local Scalars ..
-      COMPLEX CTEMP
-      INTEGER I,IX,IY
-*     ..
-      IF (N.LE.0) RETURN
-      IF (INCX.EQ.1 .AND. INCY.EQ.1) GO TO 20
-*
-*       code for unequal increments or equal increments not equal
-*         to 1
-*
-      IX = 1
-      IY = 1
-      IF (INCX.LT.0) IX = (-N+1)*INCX + 1
-      IF (INCY.LT.0) IY = (-N+1)*INCY + 1
-      DO 10 I = 1,N
-          CTEMP = CX(IX)
-          CX(IX) = CY(IY)
-          CY(IY) = CTEMP
-          IX = IX + INCX
-          IY = IY + INCY
-   10 CONTINUE
-      RETURN
-*
-*       code for both increments equal to 1
-   20 DO 30 I = 1,N
-          CTEMP = CX(I)
-          CX(I) = CY(I)
-          CY(I) = CTEMP
-   30 CONTINUE
-      RETURN
-      END
--- a/libcruft/blas/csyrk.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,294 +0,0 @@
-      SUBROUTINE CSYRK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC)
-*     .. Scalar Arguments ..
-      COMPLEX ALPHA,BETA
-      INTEGER K,LDA,LDC,N
-      CHARACTER TRANS,UPLO
-*     ..
-*     .. Array Arguments ..
-      COMPLEX A(LDA,*),C(LDC,*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CSYRK  performs one of the symmetric rank k operations
-*
-*     C := alpha*A*A' + beta*C,
-*
-*  or
-*
-*     C := alpha*A'*A + beta*C,
-*
-*  where  alpha and beta  are scalars,  C is an  n by n symmetric matrix
-*  and  A  is an  n by k  matrix in the first case and a  k by n  matrix
-*  in the second case.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On  entry,   UPLO  specifies  whether  the  upper  or  lower
-*           triangular  part  of the  array  C  is to be  referenced  as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the  upper triangular part of  C
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the  lower triangular part of  C
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry,  TRANS  specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   C := alpha*A*A' + beta*C.
-*
-*              TRANS = 'T' or 't'   C := alpha*A'*A + beta*C.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry,  N specifies the order of the matrix C.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry with  TRANS = 'N' or 'n',  K  specifies  the number
-*           of  columns   of  the   matrix   A,   and  on   entry   with
-*           TRANS = 'T' or 't',  K  specifies  the number of rows of the
-*           matrix A.  K must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX         .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX          array of DIMENSION ( LDA, ka ), where ka is
-*           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
-*           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
-*           part of the array  A  must contain the matrix  A,  otherwise
-*           the leading  k by n  part of the array  A  must contain  the
-*           matrix A.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
-*           then  LDA must be at least  max( 1, n ), otherwise  LDA must
-*           be at least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  BETA   - COMPLEX         .
-*           On entry, BETA specifies the scalar beta.
-*           Unchanged on exit.
-*
-*  C      - COMPLEX          array of DIMENSION ( LDC, n ).
-*           Before entry  with  UPLO = 'U' or 'u',  the leading  n by n
-*           upper triangular part of the array C must contain the upper
-*           triangular part  of the  symmetric matrix  and the strictly
-*           lower triangular part of C is not referenced.  On exit, the
-*           upper triangular part of the array  C is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry  with  UPLO = 'L' or 'l',  the leading  n by n
-*           lower triangular part of the array C must contain the lower
-*           triangular part  of the  symmetric matrix  and the strictly
-*           upper triangular part of C is not referenced.  On exit, the
-*           lower triangular part of the array  C is overwritten by the
-*           lower triangular part of the updated matrix.
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX
-*     ..
-*     .. Local Scalars ..
-      COMPLEX TEMP
-      INTEGER I,INFO,J,L,NROWA
-      LOGICAL UPPER
-*     ..
-*     .. Parameters ..
-      COMPLEX ONE
-      PARAMETER (ONE= (1.0E+0,0.0E+0))
-      COMPLEX ZERO
-      PARAMETER (ZERO= (0.0E+0,0.0E+0))
-*     ..
-*
-*     Test the input parameters.
-*
-      IF (LSAME(TRANS,'N')) THEN
-          NROWA = N
-      ELSE
-          NROWA = K
-      END IF
-      UPPER = LSAME(UPLO,'U')
-*
-      INFO = 0
-      IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
-          INFO = 1
-      ELSE IF ((.NOT.LSAME(TRANS,'N')) .AND.
-     +         (.NOT.LSAME(TRANS,'T'))) THEN
-          INFO = 2
-      ELSE IF (N.LT.0) THEN
-          INFO = 3
-      ELSE IF (K.LT.0) THEN
-          INFO = 4
-      ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
-          INFO = 7
-      ELSE IF (LDC.LT.MAX(1,N)) THEN
-          INFO = 10
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('CSYRK ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((N.EQ.0) .OR. (((ALPHA.EQ.ZERO).OR.
-     +    (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF (ALPHA.EQ.ZERO) THEN
-          IF (UPPER) THEN
-              IF (BETA.EQ.ZERO) THEN
-                  DO 20 J = 1,N
-                      DO 10 I = 1,J
-                          C(I,J) = ZERO
-   10                 CONTINUE
-   20             CONTINUE
-              ELSE
-                  DO 40 J = 1,N
-                      DO 30 I = 1,J
-                          C(I,J) = BETA*C(I,J)
-   30                 CONTINUE
-   40             CONTINUE
-              END IF
-          ELSE
-              IF (BETA.EQ.ZERO) THEN
-                  DO 60 J = 1,N
-                      DO 50 I = J,N
-                          C(I,J) = ZERO
-   50                 CONTINUE
-   60             CONTINUE
-              ELSE
-                  DO 80 J = 1,N
-                      DO 70 I = J,N
-                          C(I,J) = BETA*C(I,J)
-   70                 CONTINUE
-   80             CONTINUE
-              END IF
-          END IF
-          RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF (LSAME(TRANS,'N')) THEN
-*
-*        Form  C := alpha*A*A' + beta*C.
-*
-          IF (UPPER) THEN
-              DO 130 J = 1,N
-                  IF (BETA.EQ.ZERO) THEN
-                      DO 90 I = 1,J
-                          C(I,J) = ZERO
-   90                 CONTINUE
-                  ELSE IF (BETA.NE.ONE) THEN
-                      DO 100 I = 1,J
-                          C(I,J) = BETA*C(I,J)
-  100                 CONTINUE
-                  END IF
-                  DO 120 L = 1,K
-                      IF (A(J,L).NE.ZERO) THEN
-                          TEMP = ALPHA*A(J,L)
-                          DO 110 I = 1,J
-                              C(I,J) = C(I,J) + TEMP*A(I,L)
-  110                     CONTINUE
-                      END IF
-  120             CONTINUE
-  130         CONTINUE
-          ELSE
-              DO 180 J = 1,N
-                  IF (BETA.EQ.ZERO) THEN
-                      DO 140 I = J,N
-                          C(I,J) = ZERO
-  140                 CONTINUE
-                  ELSE IF (BETA.NE.ONE) THEN
-                      DO 150 I = J,N
-                          C(I,J) = BETA*C(I,J)
-  150                 CONTINUE
-                  END IF
-                  DO 170 L = 1,K
-                      IF (A(J,L).NE.ZERO) THEN
-                          TEMP = ALPHA*A(J,L)
-                          DO 160 I = J,N
-                              C(I,J) = C(I,J) + TEMP*A(I,L)
-  160                     CONTINUE
-                      END IF
-  170             CONTINUE
-  180         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  C := alpha*A'*A + beta*C.
-*
-          IF (UPPER) THEN
-              DO 210 J = 1,N
-                  DO 200 I = 1,J
-                      TEMP = ZERO
-                      DO 190 L = 1,K
-                          TEMP = TEMP + A(L,I)*A(L,J)
-  190                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP
-                      ELSE
-                          C(I,J) = ALPHA*TEMP + BETA*C(I,J)
-                      END IF
-  200             CONTINUE
-  210         CONTINUE
-          ELSE
-              DO 240 J = 1,N
-                  DO 230 I = J,N
-                      TEMP = ZERO
-                      DO 220 L = 1,K
-                          TEMP = TEMP + A(L,I)*A(L,J)
-  220                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP
-                      ELSE
-                          C(I,J) = ALPHA*TEMP + BETA*C(I,J)
-                      END IF
-  230             CONTINUE
-  240         CONTINUE
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of CSYRK .
-*
-      END
--- a/libcruft/blas/ctbsv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,367 +0,0 @@
-      SUBROUTINE CTBSV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX)
-*     .. Scalar Arguments ..
-      INTEGER INCX,K,LDA,N
-      CHARACTER DIAG,TRANS,UPLO
-*     ..
-*     .. Array Arguments ..
-      COMPLEX A(LDA,*),X(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CTBSV  solves one of the systems of equations
-*
-*     A*x = b,   or   A'*x = b,   or   conjg( A' )*x = b,
-*
-*  where b and x are n element vectors and A is an n by n unit, or
-*  non-unit, upper or lower triangular band matrix, with ( k + 1 )
-*  diagonals.
-*
-*  No test for singularity or near-singularity is included in this
-*  routine. Such tests must be performed before calling this routine.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry, TRANS specifies the equations to be solved as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   A*x = b.
-*
-*              TRANS = 'T' or 't'   A'*x = b.
-*
-*              TRANS = 'C' or 'c'   conjg( A' )*x = b.
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit
-*           triangular as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry with UPLO = 'U' or 'u', K specifies the number of
-*           super-diagonals of the matrix A.
-*           On entry with UPLO = 'L' or 'l', K specifies the number of
-*           sub-diagonals of the matrix A.
-*           K must satisfy  0 .le. K.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX          array of DIMENSION ( LDA, n ).
-*           Before entry with UPLO = 'U' or 'u', the leading ( k + 1 )
-*           by n part of the array A must contain the upper triangular
-*           band part of the matrix of coefficients, supplied column by
-*           column, with the leading diagonal of the matrix in row
-*           ( k + 1 ) of the array, the first super-diagonal starting at
-*           position 2 in row k, and so on. The top left k by k triangle
-*           of the array A is not referenced.
-*           The following program segment will transfer an upper
-*           triangular band matrix from conventional full matrix storage
-*           to band storage:
-*
-*                 DO 20, J = 1, N
-*                    M = K + 1 - J
-*                    DO 10, I = MAX( 1, J - K ), J
-*                       A( M + I, J ) = matrix( I, J )
-*              10    CONTINUE
-*              20 CONTINUE
-*
-*           Before entry with UPLO = 'L' or 'l', the leading ( k + 1 )
-*           by n part of the array A must contain the lower triangular
-*           band part of the matrix of coefficients, supplied column by
-*           column, with the leading diagonal of the matrix in row 1 of
-*           the array, the first sub-diagonal starting at position 1 in
-*           row 2, and so on. The bottom right k by k triangle of the
-*           array A is not referenced.
-*           The following program segment will transfer a lower
-*           triangular band matrix from conventional full matrix storage
-*           to band storage:
-*
-*                 DO 20, J = 1, N
-*                    M = 1 - J
-*                    DO 10, I = J, MIN( N, J + K )
-*                       A( M + I, J ) = matrix( I, J )
-*              10    CONTINUE
-*              20 CONTINUE
-*
-*           Note that when DIAG = 'U' or 'u' the elements of the array A
-*           corresponding to the diagonal elements of the matrix are not
-*           referenced, but are assumed to be unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           ( k + 1 ).
-*           Unchanged on exit.
-*
-*  X      - COMPLEX          array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element right-hand side vector b. On exit, X is overwritten
-*           with the solution vector x.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX ZERO
-      PARAMETER (ZERO= (0.0E+0,0.0E+0))
-*     ..
-*     .. Local Scalars ..
-      COMPLEX TEMP
-      INTEGER I,INFO,IX,J,JX,KPLUS1,KX,L
-      LOGICAL NOCONJ,NOUNIT
-*     ..
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC CONJG,MAX,MIN
-*     ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN
-          INFO = 1
-      ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
-     +         .NOT.LSAME(TRANS,'C')) THEN
-          INFO = 2
-      ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN
-          INFO = 3
-      ELSE IF (N.LT.0) THEN
-          INFO = 4
-      ELSE IF (K.LT.0) THEN
-          INFO = 5
-      ELSE IF (LDA.LT. (K+1)) THEN
-          INFO = 7
-      ELSE IF (INCX.EQ.0) THEN
-          INFO = 9
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('CTBSV ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF (N.EQ.0) RETURN
-*
-      NOCONJ = LSAME(TRANS,'T')
-      NOUNIT = LSAME(DIAG,'N')
-*
-*     Set up the start point in X if the increment is not unity. This
-*     will be  ( N - 1 )*INCX  too small for descending loops.
-*
-      IF (INCX.LE.0) THEN
-          KX = 1 - (N-1)*INCX
-      ELSE IF (INCX.NE.1) THEN
-          KX = 1
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed by sequentially with one pass through A.
-*
-      IF (LSAME(TRANS,'N')) THEN
-*
-*        Form  x := inv( A )*x.
-*
-          IF (LSAME(UPLO,'U')) THEN
-              KPLUS1 = K + 1
-              IF (INCX.EQ.1) THEN
-                  DO 20 J = N,1,-1
-                      IF (X(J).NE.ZERO) THEN
-                          L = KPLUS1 - J
-                          IF (NOUNIT) X(J) = X(J)/A(KPLUS1,J)
-                          TEMP = X(J)
-                          DO 10 I = J - 1,MAX(1,J-K),-1
-                              X(I) = X(I) - TEMP*A(L+I,J)
-   10                     CONTINUE
-                      END IF
-   20             CONTINUE
-              ELSE
-                  KX = KX + (N-1)*INCX
-                  JX = KX
-                  DO 40 J = N,1,-1
-                      KX = KX - INCX
-                      IF (X(JX).NE.ZERO) THEN
-                          IX = KX
-                          L = KPLUS1 - J
-                          IF (NOUNIT) X(JX) = X(JX)/A(KPLUS1,J)
-                          TEMP = X(JX)
-                          DO 30 I = J - 1,MAX(1,J-K),-1
-                              X(IX) = X(IX) - TEMP*A(L+I,J)
-                              IX = IX - INCX
-   30                     CONTINUE
-                      END IF
-                      JX = JX - INCX
-   40             CONTINUE
-              END IF
-          ELSE
-              IF (INCX.EQ.1) THEN
-                  DO 60 J = 1,N
-                      IF (X(J).NE.ZERO) THEN
-                          L = 1 - J
-                          IF (NOUNIT) X(J) = X(J)/A(1,J)
-                          TEMP = X(J)
-                          DO 50 I = J + 1,MIN(N,J+K)
-                              X(I) = X(I) - TEMP*A(L+I,J)
-   50                     CONTINUE
-                      END IF
-   60             CONTINUE
-              ELSE
-                  JX = KX
-                  DO 80 J = 1,N
-                      KX = KX + INCX
-                      IF (X(JX).NE.ZERO) THEN
-                          IX = KX
-                          L = 1 - J
-                          IF (NOUNIT) X(JX) = X(JX)/A(1,J)
-                          TEMP = X(JX)
-                          DO 70 I = J + 1,MIN(N,J+K)
-                              X(IX) = X(IX) - TEMP*A(L+I,J)
-                              IX = IX + INCX
-   70                     CONTINUE
-                      END IF
-                      JX = JX + INCX
-   80             CONTINUE
-              END IF
-          END IF
-      ELSE
-*
-*        Form  x := inv( A' )*x  or  x := inv( conjg( A') )*x.
-*
-          IF (LSAME(UPLO,'U')) THEN
-              KPLUS1 = K + 1
-              IF (INCX.EQ.1) THEN
-                  DO 110 J = 1,N
-                      TEMP = X(J)
-                      L = KPLUS1 - J
-                      IF (NOCONJ) THEN
-                          DO 90 I = MAX(1,J-K),J - 1
-                              TEMP = TEMP - A(L+I,J)*X(I)
-   90                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/A(KPLUS1,J)
-                      ELSE
-                          DO 100 I = MAX(1,J-K),J - 1
-                              TEMP = TEMP - CONJG(A(L+I,J))*X(I)
-  100                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/CONJG(A(KPLUS1,J))
-                      END IF
-                      X(J) = TEMP
-  110             CONTINUE
-              ELSE
-                  JX = KX
-                  DO 140 J = 1,N
-                      TEMP = X(JX)
-                      IX = KX
-                      L = KPLUS1 - J
-                      IF (NOCONJ) THEN
-                          DO 120 I = MAX(1,J-K),J - 1
-                              TEMP = TEMP - A(L+I,J)*X(IX)
-                              IX = IX + INCX
-  120                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/A(KPLUS1,J)
-                      ELSE
-                          DO 130 I = MAX(1,J-K),J - 1
-                              TEMP = TEMP - CONJG(A(L+I,J))*X(IX)
-                              IX = IX + INCX
-  130                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/CONJG(A(KPLUS1,J))
-                      END IF
-                      X(JX) = TEMP
-                      JX = JX + INCX
-                      IF (J.GT.K) KX = KX + INCX
-  140             CONTINUE
-              END IF
-          ELSE
-              IF (INCX.EQ.1) THEN
-                  DO 170 J = N,1,-1
-                      TEMP = X(J)
-                      L = 1 - J
-                      IF (NOCONJ) THEN
-                          DO 150 I = MIN(N,J+K),J + 1,-1
-                              TEMP = TEMP - A(L+I,J)*X(I)
-  150                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/A(1,J)
-                      ELSE
-                          DO 160 I = MIN(N,J+K),J + 1,-1
-                              TEMP = TEMP - CONJG(A(L+I,J))*X(I)
-  160                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/CONJG(A(1,J))
-                      END IF
-                      X(J) = TEMP
-  170             CONTINUE
-              ELSE
-                  KX = KX + (N-1)*INCX
-                  JX = KX
-                  DO 200 J = N,1,-1
-                      TEMP = X(JX)
-                      IX = KX
-                      L = 1 - J
-                      IF (NOCONJ) THEN
-                          DO 180 I = MIN(N,J+K),J + 1,-1
-                              TEMP = TEMP - A(L+I,J)*X(IX)
-                              IX = IX - INCX
-  180                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/A(1,J)
-                      ELSE
-                          DO 190 I = MIN(N,J+K),J + 1,-1
-                              TEMP = TEMP - CONJG(A(L+I,J))*X(IX)
-                              IX = IX - INCX
-  190                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/CONJG(A(1,J))
-                      END IF
-                      X(JX) = TEMP
-                      JX = JX - INCX
-                      IF ((N-J).GE.K) KX = KX - INCX
-  200             CONTINUE
-              END IF
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of CTBSV .
-*
-      END
--- a/libcruft/blas/ctrmm.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,383 +0,0 @@
-      SUBROUTINE CTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB)
-*     .. Scalar Arguments ..
-      COMPLEX ALPHA
-      INTEGER LDA,LDB,M,N
-      CHARACTER DIAG,SIDE,TRANSA,UPLO
-*     ..
-*     .. Array Arguments ..
-      COMPLEX A(LDA,*),B(LDB,*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CTRMM  performs one of the matrix-matrix operations
-*
-*     B := alpha*op( A )*B,   or   B := alpha*B*op( A )
-*
-*  where  alpha  is a scalar,  B  is an m by n matrix,  A  is a unit, or
-*  non-unit,  upper or lower triangular matrix  and  op( A )  is one  of
-*
-*     op( A ) = A   or   op( A ) = A'   or   op( A ) = conjg( A' ).
-*
-*  Arguments
-*  ==========
-*
-*  SIDE   - CHARACTER*1.
-*           On entry,  SIDE specifies whether  op( A ) multiplies B from
-*           the left or right as follows:
-*
-*              SIDE = 'L' or 'l'   B := alpha*op( A )*B.
-*
-*              SIDE = 'R' or 'r'   B := alpha*B*op( A ).
-*
-*           Unchanged on exit.
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix A is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANSA - CHARACTER*1.
-*           On entry, TRANSA specifies the form of op( A ) to be used in
-*           the matrix multiplication as follows:
-*
-*              TRANSA = 'N' or 'n'   op( A ) = A.
-*
-*              TRANSA = 'T' or 't'   op( A ) = A'.
-*
-*              TRANSA = 'C' or 'c'   op( A ) = conjg( A' ).
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit triangular
-*           as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of B. M must be at
-*           least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of B.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX         .
-*           On entry,  ALPHA specifies the scalar  alpha. When  alpha is
-*           zero then  A is not referenced and  B need not be set before
-*           entry.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX          array of DIMENSION ( LDA, k ), where k is m
-*           when  SIDE = 'L' or 'l'  and is  n  when  SIDE = 'R' or 'r'.
-*           Before entry  with  UPLO = 'U' or 'u',  the  leading  k by k
-*           upper triangular part of the array  A must contain the upper
-*           triangular matrix  and the strictly lower triangular part of
-*           A is not referenced.
-*           Before entry  with  UPLO = 'L' or 'l',  the  leading  k by k
-*           lower triangular part of the array  A must contain the lower
-*           triangular matrix  and the strictly upper triangular part of
-*           A is not referenced.
-*           Note that when  DIAG = 'U' or 'u',  the diagonal elements of
-*           A  are not referenced either,  but are assumed to be  unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program.  When  SIDE = 'L' or 'l'  then
-*           LDA  must be at least  max( 1, m ),  when  SIDE = 'R' or 'r'
-*           then LDA must be at least max( 1, n ).
-*           Unchanged on exit.
-*
-*  B      - COMPLEX          array of DIMENSION ( LDB, n ).
-*           Before entry,  the leading  m by n part of the array  B must
-*           contain the matrix  B,  and  on exit  is overwritten  by the
-*           transformed matrix.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in  the  calling  (sub)  program.   LDB  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC CONJG,MAX
-*     ..
-*     .. Local Scalars ..
-      COMPLEX TEMP
-      INTEGER I,INFO,J,K,NROWA
-      LOGICAL LSIDE,NOCONJ,NOUNIT,UPPER
-*     ..
-*     .. Parameters ..
-      COMPLEX ONE
-      PARAMETER (ONE= (1.0E+0,0.0E+0))
-      COMPLEX ZERO
-      PARAMETER (ZERO= (0.0E+0,0.0E+0))
-*     ..
-*
-*     Test the input parameters.
-*
-      LSIDE = LSAME(SIDE,'L')
-      IF (LSIDE) THEN
-          NROWA = M
-      ELSE
-          NROWA = N
-      END IF
-      NOCONJ = LSAME(TRANSA,'T')
-      NOUNIT = LSAME(DIAG,'N')
-      UPPER = LSAME(UPLO,'U')
-*
-      INFO = 0
-      IF ((.NOT.LSIDE) .AND. (.NOT.LSAME(SIDE,'R'))) THEN
-          INFO = 1
-      ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
-          INFO = 2
-      ELSE IF ((.NOT.LSAME(TRANSA,'N')) .AND.
-     +         (.NOT.LSAME(TRANSA,'T')) .AND.
-     +         (.NOT.LSAME(TRANSA,'C'))) THEN
-          INFO = 3
-      ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN
-          INFO = 4
-      ELSE IF (M.LT.0) THEN
-          INFO = 5
-      ELSE IF (N.LT.0) THEN
-          INFO = 6
-      ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
-          INFO = 9
-      ELSE IF (LDB.LT.MAX(1,M)) THEN
-          INFO = 11
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('CTRMM ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF (M.EQ.0 .OR. N.EQ.0) RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF (ALPHA.EQ.ZERO) THEN
-          DO 20 J = 1,N
-              DO 10 I = 1,M
-                  B(I,J) = ZERO
-   10         CONTINUE
-   20     CONTINUE
-          RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF (LSIDE) THEN
-          IF (LSAME(TRANSA,'N')) THEN
-*
-*           Form  B := alpha*A*B.
-*
-              IF (UPPER) THEN
-                  DO 50 J = 1,N
-                      DO 40 K = 1,M
-                          IF (B(K,J).NE.ZERO) THEN
-                              TEMP = ALPHA*B(K,J)
-                              DO 30 I = 1,K - 1
-                                  B(I,J) = B(I,J) + TEMP*A(I,K)
-   30                         CONTINUE
-                              IF (NOUNIT) TEMP = TEMP*A(K,K)
-                              B(K,J) = TEMP
-                          END IF
-   40                 CONTINUE
-   50             CONTINUE
-              ELSE
-                  DO 80 J = 1,N
-                      DO 70 K = M,1,-1
-                          IF (B(K,J).NE.ZERO) THEN
-                              TEMP = ALPHA*B(K,J)
-                              B(K,J) = TEMP
-                              IF (NOUNIT) B(K,J) = B(K,J)*A(K,K)
-                              DO 60 I = K + 1,M
-                                  B(I,J) = B(I,J) + TEMP*A(I,K)
-   60                         CONTINUE
-                          END IF
-   70                 CONTINUE
-   80             CONTINUE
-              END IF
-          ELSE
-*
-*           Form  B := alpha*A'*B   or   B := alpha*conjg( A' )*B.
-*
-              IF (UPPER) THEN
-                  DO 120 J = 1,N
-                      DO 110 I = M,1,-1
-                          TEMP = B(I,J)
-                          IF (NOCONJ) THEN
-                              IF (NOUNIT) TEMP = TEMP*A(I,I)
-                              DO 90 K = 1,I - 1
-                                  TEMP = TEMP + A(K,I)*B(K,J)
-   90                         CONTINUE
-                          ELSE
-                              IF (NOUNIT) TEMP = TEMP*CONJG(A(I,I))
-                              DO 100 K = 1,I - 1
-                                  TEMP = TEMP + CONJG(A(K,I))*B(K,J)
-  100                         CONTINUE
-                          END IF
-                          B(I,J) = ALPHA*TEMP
-  110                 CONTINUE
-  120             CONTINUE
-              ELSE
-                  DO 160 J = 1,N
-                      DO 150 I = 1,M
-                          TEMP = B(I,J)
-                          IF (NOCONJ) THEN
-                              IF (NOUNIT) TEMP = TEMP*A(I,I)
-                              DO 130 K = I + 1,M
-                                  TEMP = TEMP + A(K,I)*B(K,J)
-  130                         CONTINUE
-                          ELSE
-                              IF (NOUNIT) TEMP = TEMP*CONJG(A(I,I))
-                              DO 140 K = I + 1,M
-                                  TEMP = TEMP + CONJG(A(K,I))*B(K,J)
-  140                         CONTINUE
-                          END IF
-                          B(I,J) = ALPHA*TEMP
-  150                 CONTINUE
-  160             CONTINUE
-              END IF
-          END IF
-      ELSE
-          IF (LSAME(TRANSA,'N')) THEN
-*
-*           Form  B := alpha*B*A.
-*
-              IF (UPPER) THEN
-                  DO 200 J = N,1,-1
-                      TEMP = ALPHA
-                      IF (NOUNIT) TEMP = TEMP*A(J,J)
-                      DO 170 I = 1,M
-                          B(I,J) = TEMP*B(I,J)
-  170                 CONTINUE
-                      DO 190 K = 1,J - 1
-                          IF (A(K,J).NE.ZERO) THEN
-                              TEMP = ALPHA*A(K,J)
-                              DO 180 I = 1,M
-                                  B(I,J) = B(I,J) + TEMP*B(I,K)
-  180                         CONTINUE
-                          END IF
-  190                 CONTINUE
-  200             CONTINUE
-              ELSE
-                  DO 240 J = 1,N
-                      TEMP = ALPHA
-                      IF (NOUNIT) TEMP = TEMP*A(J,J)
-                      DO 210 I = 1,M
-                          B(I,J) = TEMP*B(I,J)
-  210                 CONTINUE
-                      DO 230 K = J + 1,N
-                          IF (A(K,J).NE.ZERO) THEN
-                              TEMP = ALPHA*A(K,J)
-                              DO 220 I = 1,M
-                                  B(I,J) = B(I,J) + TEMP*B(I,K)
-  220                         CONTINUE
-                          END IF
-  230                 CONTINUE
-  240             CONTINUE
-              END IF
-          ELSE
-*
-*           Form  B := alpha*B*A'   or   B := alpha*B*conjg( A' ).
-*
-              IF (UPPER) THEN
-                  DO 280 K = 1,N
-                      DO 260 J = 1,K - 1
-                          IF (A(J,K).NE.ZERO) THEN
-                              IF (NOCONJ) THEN
-                                  TEMP = ALPHA*A(J,K)
-                              ELSE
-                                  TEMP = ALPHA*CONJG(A(J,K))
-                              END IF
-                              DO 250 I = 1,M
-                                  B(I,J) = B(I,J) + TEMP*B(I,K)
-  250                         CONTINUE
-                          END IF
-  260                 CONTINUE
-                      TEMP = ALPHA
-                      IF (NOUNIT) THEN
-                          IF (NOCONJ) THEN
-                              TEMP = TEMP*A(K,K)
-                          ELSE
-                              TEMP = TEMP*CONJG(A(K,K))
-                          END IF
-                      END IF
-                      IF (TEMP.NE.ONE) THEN
-                          DO 270 I = 1,M
-                              B(I,K) = TEMP*B(I,K)
-  270                     CONTINUE
-                      END IF
-  280             CONTINUE
-              ELSE
-                  DO 320 K = N,1,-1
-                      DO 300 J = K + 1,N
-                          IF (A(J,K).NE.ZERO) THEN
-                              IF (NOCONJ) THEN
-                                  TEMP = ALPHA*A(J,K)
-                              ELSE
-                                  TEMP = ALPHA*CONJG(A(J,K))
-                              END IF
-                              DO 290 I = 1,M
-                                  B(I,J) = B(I,J) + TEMP*B(I,K)
-  290                         CONTINUE
-                          END IF
-  300                 CONTINUE
-                      TEMP = ALPHA
-                      IF (NOUNIT) THEN
-                          IF (NOCONJ) THEN
-                              TEMP = TEMP*A(K,K)
-                          ELSE
-                              TEMP = TEMP*CONJG(A(K,K))
-                          END IF
-                      END IF
-                      IF (TEMP.NE.ONE) THEN
-                          DO 310 I = 1,M
-                              B(I,K) = TEMP*B(I,K)
-  310                     CONTINUE
-                      END IF
-  320             CONTINUE
-              END IF
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of CTRMM .
-*
-      END
--- a/libcruft/blas/ctrmv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,309 +0,0 @@
-      SUBROUTINE CTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX)
-*     .. Scalar Arguments ..
-      INTEGER INCX,LDA,N
-      CHARACTER DIAG,TRANS,UPLO
-*     ..
-*     .. Array Arguments ..
-      COMPLEX A(LDA,*),X(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CTRMV  performs one of the matrix-vector operations
-*
-*     x := A*x,   or   x := A'*x,   or   x := conjg( A' )*x,
-*
-*  where x is an n element vector and  A is an n by n unit, or non-unit,
-*  upper or lower triangular matrix.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry, TRANS specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   x := A*x.
-*
-*              TRANS = 'T' or 't'   x := A'*x.
-*
-*              TRANS = 'C' or 'c'   x := conjg( A' )*x.
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit
-*           triangular as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX          array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular matrix and the strictly lower triangular part of
-*           A is not referenced.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular matrix and the strictly upper triangular part of
-*           A is not referenced.
-*           Note that when  DIAG = 'U' or 'u', the diagonal elements of
-*           A are not referenced either, but are assumed to be unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*  X      - COMPLEX          array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element vector x. On exit, X is overwritten with the
-*           tranformed vector x.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX ZERO
-      PARAMETER (ZERO= (0.0E+0,0.0E+0))
-*     ..
-*     .. Local Scalars ..
-      COMPLEX TEMP
-      INTEGER I,INFO,IX,J,JX,KX
-      LOGICAL NOCONJ,NOUNIT
-*     ..
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC CONJG,MAX
-*     ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN
-          INFO = 1
-      ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
-     +         .NOT.LSAME(TRANS,'C')) THEN
-          INFO = 2
-      ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN
-          INFO = 3
-      ELSE IF (N.LT.0) THEN
-          INFO = 4
-      ELSE IF (LDA.LT.MAX(1,N)) THEN
-          INFO = 6
-      ELSE IF (INCX.EQ.0) THEN
-          INFO = 8
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('CTRMV ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF (N.EQ.0) RETURN
-*
-      NOCONJ = LSAME(TRANS,'T')
-      NOUNIT = LSAME(DIAG,'N')
-*
-*     Set up the start point in X if the increment is not unity. This
-*     will be  ( N - 1 )*INCX  too small for descending loops.
-*
-      IF (INCX.LE.0) THEN
-          KX = 1 - (N-1)*INCX
-      ELSE IF (INCX.NE.1) THEN
-          KX = 1
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-      IF (LSAME(TRANS,'N')) THEN
-*
-*        Form  x := A*x.
-*
-          IF (LSAME(UPLO,'U')) THEN
-              IF (INCX.EQ.1) THEN
-                  DO 20 J = 1,N
-                      IF (X(J).NE.ZERO) THEN
-                          TEMP = X(J)
-                          DO 10 I = 1,J - 1
-                              X(I) = X(I) + TEMP*A(I,J)
-   10                     CONTINUE
-                          IF (NOUNIT) X(J) = X(J)*A(J,J)
-                      END IF
-   20             CONTINUE
-              ELSE
-                  JX = KX
-                  DO 40 J = 1,N
-                      IF (X(JX).NE.ZERO) THEN
-                          TEMP = X(JX)
-                          IX = KX
-                          DO 30 I = 1,J - 1
-                              X(IX) = X(IX) + TEMP*A(I,J)
-                              IX = IX + INCX
-   30                     CONTINUE
-                          IF (NOUNIT) X(JX) = X(JX)*A(J,J)
-                      END IF
-                      JX = JX + INCX
-   40             CONTINUE
-              END IF
-          ELSE
-              IF (INCX.EQ.1) THEN
-                  DO 60 J = N,1,-1
-                      IF (X(J).NE.ZERO) THEN
-                          TEMP = X(J)
-                          DO 50 I = N,J + 1,-1
-                              X(I) = X(I) + TEMP*A(I,J)
-   50                     CONTINUE
-                          IF (NOUNIT) X(J) = X(J)*A(J,J)
-                      END IF
-   60             CONTINUE
-              ELSE
-                  KX = KX + (N-1)*INCX
-                  JX = KX
-                  DO 80 J = N,1,-1
-                      IF (X(JX).NE.ZERO) THEN
-                          TEMP = X(JX)
-                          IX = KX
-                          DO 70 I = N,J + 1,-1
-                              X(IX) = X(IX) + TEMP*A(I,J)
-                              IX = IX - INCX
-   70                     CONTINUE
-                          IF (NOUNIT) X(JX) = X(JX)*A(J,J)
-                      END IF
-                      JX = JX - INCX
-   80             CONTINUE
-              END IF
-          END IF
-      ELSE
-*
-*        Form  x := A'*x  or  x := conjg( A' )*x.
-*
-          IF (LSAME(UPLO,'U')) THEN
-              IF (INCX.EQ.1) THEN
-                  DO 110 J = N,1,-1
-                      TEMP = X(J)
-                      IF (NOCONJ) THEN
-                          IF (NOUNIT) TEMP = TEMP*A(J,J)
-                          DO 90 I = J - 1,1,-1
-                              TEMP = TEMP + A(I,J)*X(I)
-   90                     CONTINUE
-                      ELSE
-                          IF (NOUNIT) TEMP = TEMP*CONJG(A(J,J))
-                          DO 100 I = J - 1,1,-1
-                              TEMP = TEMP + CONJG(A(I,J))*X(I)
-  100                     CONTINUE
-                      END IF
-                      X(J) = TEMP
-  110             CONTINUE
-              ELSE
-                  JX = KX + (N-1)*INCX
-                  DO 140 J = N,1,-1
-                      TEMP = X(JX)
-                      IX = JX
-                      IF (NOCONJ) THEN
-                          IF (NOUNIT) TEMP = TEMP*A(J,J)
-                          DO 120 I = J - 1,1,-1
-                              IX = IX - INCX
-                              TEMP = TEMP + A(I,J)*X(IX)
-  120                     CONTINUE
-                      ELSE
-                          IF (NOUNIT) TEMP = TEMP*CONJG(A(J,J))
-                          DO 130 I = J - 1,1,-1
-                              IX = IX - INCX
-                              TEMP = TEMP + CONJG(A(I,J))*X(IX)
-  130                     CONTINUE
-                      END IF
-                      X(JX) = TEMP
-                      JX = JX - INCX
-  140             CONTINUE
-              END IF
-          ELSE
-              IF (INCX.EQ.1) THEN
-                  DO 170 J = 1,N
-                      TEMP = X(J)
-                      IF (NOCONJ) THEN
-                          IF (NOUNIT) TEMP = TEMP*A(J,J)
-                          DO 150 I = J + 1,N
-                              TEMP = TEMP + A(I,J)*X(I)
-  150                     CONTINUE
-                      ELSE
-                          IF (NOUNIT) TEMP = TEMP*CONJG(A(J,J))
-                          DO 160 I = J + 1,N
-                              TEMP = TEMP + CONJG(A(I,J))*X(I)
-  160                     CONTINUE
-                      END IF
-                      X(J) = TEMP
-  170             CONTINUE
-              ELSE
-                  JX = KX
-                  DO 200 J = 1,N
-                      TEMP = X(JX)
-                      IX = JX
-                      IF (NOCONJ) THEN
-                          IF (NOUNIT) TEMP = TEMP*A(J,J)
-                          DO 180 I = J + 1,N
-                              IX = IX + INCX
-                              TEMP = TEMP + A(I,J)*X(IX)
-  180                     CONTINUE
-                      ELSE
-                          IF (NOUNIT) TEMP = TEMP*CONJG(A(J,J))
-                          DO 190 I = J + 1,N
-                              IX = IX + INCX
-                              TEMP = TEMP + CONJG(A(I,J))*X(IX)
-  190                     CONTINUE
-                      END IF
-                      X(JX) = TEMP
-                      JX = JX + INCX
-  200             CONTINUE
-              END IF
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of CTRMV .
-*
-      END
--- a/libcruft/blas/ctrsm.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,407 +0,0 @@
-      SUBROUTINE CTRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB)
-*     .. Scalar Arguments ..
-      COMPLEX ALPHA
-      INTEGER LDA,LDB,M,N
-      CHARACTER DIAG,SIDE,TRANSA,UPLO
-*     ..
-*     .. Array Arguments ..
-      COMPLEX A(LDA,*),B(LDB,*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CTRSM  solves one of the matrix equations
-*
-*     op( A )*X = alpha*B,   or   X*op( A ) = alpha*B,
-*
-*  where alpha is a scalar, X and B are m by n matrices, A is a unit, or
-*  non-unit,  upper or lower triangular matrix  and  op( A )  is one  of
-*
-*     op( A ) = A   or   op( A ) = A'   or   op( A ) = conjg( A' ).
-*
-*  The matrix X is overwritten on B.
-*
-*  Arguments
-*  ==========
-*
-*  SIDE   - CHARACTER*1.
-*           On entry, SIDE specifies whether op( A ) appears on the left
-*           or right of X as follows:
-*
-*              SIDE = 'L' or 'l'   op( A )*X = alpha*B.
-*
-*              SIDE = 'R' or 'r'   X*op( A ) = alpha*B.
-*
-*           Unchanged on exit.
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix A is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANSA - CHARACTER*1.
-*           On entry, TRANSA specifies the form of op( A ) to be used in
-*           the matrix multiplication as follows:
-*
-*              TRANSA = 'N' or 'n'   op( A ) = A.
-*
-*              TRANSA = 'T' or 't'   op( A ) = A'.
-*
-*              TRANSA = 'C' or 'c'   op( A ) = conjg( A' ).
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit triangular
-*           as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of B. M must be at
-*           least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of B.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX         .
-*           On entry,  ALPHA specifies the scalar  alpha. When  alpha is
-*           zero then  A is not referenced and  B need not be set before
-*           entry.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX          array of DIMENSION ( LDA, k ), where k is m
-*           when  SIDE = 'L' or 'l'  and is  n  when  SIDE = 'R' or 'r'.
-*           Before entry  with  UPLO = 'U' or 'u',  the  leading  k by k
-*           upper triangular part of the array  A must contain the upper
-*           triangular matrix  and the strictly lower triangular part of
-*           A is not referenced.
-*           Before entry  with  UPLO = 'L' or 'l',  the  leading  k by k
-*           lower triangular part of the array  A must contain the lower
-*           triangular matrix  and the strictly upper triangular part of
-*           A is not referenced.
-*           Note that when  DIAG = 'U' or 'u',  the diagonal elements of
-*           A  are not referenced either,  but are assumed to be  unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program.  When  SIDE = 'L' or 'l'  then
-*           LDA  must be at least  max( 1, m ),  when  SIDE = 'R' or 'r'
-*           then LDA must be at least max( 1, n ).
-*           Unchanged on exit.
-*
-*  B      - COMPLEX          array of DIMENSION ( LDB, n ).
-*           Before entry,  the leading  m by n part of the array  B must
-*           contain  the  right-hand  side  matrix  B,  and  on exit  is
-*           overwritten by the solution matrix  X.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in  the  calling  (sub)  program.   LDB  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC CONJG,MAX
-*     ..
-*     .. Local Scalars ..
-      COMPLEX TEMP
-      INTEGER I,INFO,J,K,NROWA
-      LOGICAL LSIDE,NOCONJ,NOUNIT,UPPER
-*     ..
-*     .. Parameters ..
-      COMPLEX ONE
-      PARAMETER (ONE= (1.0E+0,0.0E+0))
-      COMPLEX ZERO
-      PARAMETER (ZERO= (0.0E+0,0.0E+0))
-*     ..
-*
-*     Test the input parameters.
-*
-      LSIDE = LSAME(SIDE,'L')
-      IF (LSIDE) THEN
-          NROWA = M
-      ELSE
-          NROWA = N
-      END IF
-      NOCONJ = LSAME(TRANSA,'T')
-      NOUNIT = LSAME(DIAG,'N')
-      UPPER = LSAME(UPLO,'U')
-*
-      INFO = 0
-      IF ((.NOT.LSIDE) .AND. (.NOT.LSAME(SIDE,'R'))) THEN
-          INFO = 1
-      ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
-          INFO = 2
-      ELSE IF ((.NOT.LSAME(TRANSA,'N')) .AND.
-     +         (.NOT.LSAME(TRANSA,'T')) .AND.
-     +         (.NOT.LSAME(TRANSA,'C'))) THEN
-          INFO = 3
-      ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN
-          INFO = 4
-      ELSE IF (M.LT.0) THEN
-          INFO = 5
-      ELSE IF (N.LT.0) THEN
-          INFO = 6
-      ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
-          INFO = 9
-      ELSE IF (LDB.LT.MAX(1,M)) THEN
-          INFO = 11
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('CTRSM ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF (M.EQ.0 .OR. N.EQ.0) RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF (ALPHA.EQ.ZERO) THEN
-          DO 20 J = 1,N
-              DO 10 I = 1,M
-                  B(I,J) = ZERO
-   10         CONTINUE
-   20     CONTINUE
-          RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF (LSIDE) THEN
-          IF (LSAME(TRANSA,'N')) THEN
-*
-*           Form  B := alpha*inv( A )*B.
-*
-              IF (UPPER) THEN
-                  DO 60 J = 1,N
-                      IF (ALPHA.NE.ONE) THEN
-                          DO 30 I = 1,M
-                              B(I,J) = ALPHA*B(I,J)
-   30                     CONTINUE
-                      END IF
-                      DO 50 K = M,1,-1
-                          IF (B(K,J).NE.ZERO) THEN
-                              IF (NOUNIT) B(K,J) = B(K,J)/A(K,K)
-                              DO 40 I = 1,K - 1
-                                  B(I,J) = B(I,J) - B(K,J)*A(I,K)
-   40                         CONTINUE
-                          END IF
-   50                 CONTINUE
-   60             CONTINUE
-              ELSE
-                  DO 100 J = 1,N
-                      IF (ALPHA.NE.ONE) THEN
-                          DO 70 I = 1,M
-                              B(I,J) = ALPHA*B(I,J)
-   70                     CONTINUE
-                      END IF
-                      DO 90 K = 1,M
-                          IF (B(K,J).NE.ZERO) THEN
-                              IF (NOUNIT) B(K,J) = B(K,J)/A(K,K)
-                              DO 80 I = K + 1,M
-                                  B(I,J) = B(I,J) - B(K,J)*A(I,K)
-   80                         CONTINUE
-                          END IF
-   90                 CONTINUE
-  100             CONTINUE
-              END IF
-          ELSE
-*
-*           Form  B := alpha*inv( A' )*B
-*           or    B := alpha*inv( conjg( A' ) )*B.
-*
-              IF (UPPER) THEN
-                  DO 140 J = 1,N
-                      DO 130 I = 1,M
-                          TEMP = ALPHA*B(I,J)
-                          IF (NOCONJ) THEN
-                              DO 110 K = 1,I - 1
-                                  TEMP = TEMP - A(K,I)*B(K,J)
-  110                         CONTINUE
-                              IF (NOUNIT) TEMP = TEMP/A(I,I)
-                          ELSE
-                              DO 120 K = 1,I - 1
-                                  TEMP = TEMP - CONJG(A(K,I))*B(K,J)
-  120                         CONTINUE
-                              IF (NOUNIT) TEMP = TEMP/CONJG(A(I,I))
-                          END IF
-                          B(I,J) = TEMP
-  130                 CONTINUE
-  140             CONTINUE
-              ELSE
-                  DO 180 J = 1,N
-                      DO 170 I = M,1,-1
-                          TEMP = ALPHA*B(I,J)
-                          IF (NOCONJ) THEN
-                              DO 150 K = I + 1,M
-                                  TEMP = TEMP - A(K,I)*B(K,J)
-  150                         CONTINUE
-                              IF (NOUNIT) TEMP = TEMP/A(I,I)
-                          ELSE
-                              DO 160 K = I + 1,M
-                                  TEMP = TEMP - CONJG(A(K,I))*B(K,J)
-  160                         CONTINUE
-                              IF (NOUNIT) TEMP = TEMP/CONJG(A(I,I))
-                          END IF
-                          B(I,J) = TEMP
-  170                 CONTINUE
-  180             CONTINUE
-              END IF
-          END IF
-      ELSE
-          IF (LSAME(TRANSA,'N')) THEN
-*
-*           Form  B := alpha*B*inv( A ).
-*
-              IF (UPPER) THEN
-                  DO 230 J = 1,N
-                      IF (ALPHA.NE.ONE) THEN
-                          DO 190 I = 1,M
-                              B(I,J) = ALPHA*B(I,J)
-  190                     CONTINUE
-                      END IF
-                      DO 210 K = 1,J - 1
-                          IF (A(K,J).NE.ZERO) THEN
-                              DO 200 I = 1,M
-                                  B(I,J) = B(I,J) - A(K,J)*B(I,K)
-  200                         CONTINUE
-                          END IF
-  210                 CONTINUE
-                      IF (NOUNIT) THEN
-                          TEMP = ONE/A(J,J)
-                          DO 220 I = 1,M
-                              B(I,J) = TEMP*B(I,J)
-  220                     CONTINUE
-                      END IF
-  230             CONTINUE
-              ELSE
-                  DO 280 J = N,1,-1
-                      IF (ALPHA.NE.ONE) THEN
-                          DO 240 I = 1,M
-                              B(I,J) = ALPHA*B(I,J)
-  240                     CONTINUE
-                      END IF
-                      DO 260 K = J + 1,N
-                          IF (A(K,J).NE.ZERO) THEN
-                              DO 250 I = 1,M
-                                  B(I,J) = B(I,J) - A(K,J)*B(I,K)
-  250                         CONTINUE
-                          END IF
-  260                 CONTINUE
-                      IF (NOUNIT) THEN
-                          TEMP = ONE/A(J,J)
-                          DO 270 I = 1,M
-                              B(I,J) = TEMP*B(I,J)
-  270                     CONTINUE
-                      END IF
-  280             CONTINUE
-              END IF
-          ELSE
-*
-*           Form  B := alpha*B*inv( A' )
-*           or    B := alpha*B*inv( conjg( A' ) ).
-*
-              IF (UPPER) THEN
-                  DO 330 K = N,1,-1
-                      IF (NOUNIT) THEN
-                          IF (NOCONJ) THEN
-                              TEMP = ONE/A(K,K)
-                          ELSE
-                              TEMP = ONE/CONJG(A(K,K))
-                          END IF
-                          DO 290 I = 1,M
-                              B(I,K) = TEMP*B(I,K)
-  290                     CONTINUE
-                      END IF
-                      DO 310 J = 1,K - 1
-                          IF (A(J,K).NE.ZERO) THEN
-                              IF (NOCONJ) THEN
-                                  TEMP = A(J,K)
-                              ELSE
-                                  TEMP = CONJG(A(J,K))
-                              END IF
-                              DO 300 I = 1,M
-                                  B(I,J) = B(I,J) - TEMP*B(I,K)
-  300                         CONTINUE
-                          END IF
-  310                 CONTINUE
-                      IF (ALPHA.NE.ONE) THEN
-                          DO 320 I = 1,M
-                              B(I,K) = ALPHA*B(I,K)
-  320                     CONTINUE
-                      END IF
-  330             CONTINUE
-              ELSE
-                  DO 380 K = 1,N
-                      IF (NOUNIT) THEN
-                          IF (NOCONJ) THEN
-                              TEMP = ONE/A(K,K)
-                          ELSE
-                              TEMP = ONE/CONJG(A(K,K))
-                          END IF
-                          DO 340 I = 1,M
-                              B(I,K) = TEMP*B(I,K)
-  340                     CONTINUE
-                      END IF
-                      DO 360 J = K + 1,N
-                          IF (A(J,K).NE.ZERO) THEN
-                              IF (NOCONJ) THEN
-                                  TEMP = A(J,K)
-                              ELSE
-                                  TEMP = CONJG(A(J,K))
-                              END IF
-                              DO 350 I = 1,M
-                                  B(I,J) = B(I,J) - TEMP*B(I,K)
-  350                         CONTINUE
-                          END IF
-  360                 CONTINUE
-                      IF (ALPHA.NE.ONE) THEN
-                          DO 370 I = 1,M
-                              B(I,K) = ALPHA*B(I,K)
-  370                     CONTINUE
-                      END IF
-  380             CONTINUE
-              END IF
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of CTRSM .
-*
-      END
--- a/libcruft/blas/ctrsv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,312 +0,0 @@
-      SUBROUTINE CTRSV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX)
-*     .. Scalar Arguments ..
-      INTEGER INCX,LDA,N
-      CHARACTER DIAG,TRANS,UPLO
-*     ..
-*     .. Array Arguments ..
-      COMPLEX A(LDA,*),X(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CTRSV  solves one of the systems of equations
-*
-*     A*x = b,   or   A'*x = b,   or   conjg( A' )*x = b,
-*
-*  where b and x are n element vectors and A is an n by n unit, or
-*  non-unit, upper or lower triangular matrix.
-*
-*  No test for singularity or near-singularity is included in this
-*  routine. Such tests must be performed before calling this routine.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry, TRANS specifies the equations to be solved as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   A*x = b.
-*
-*              TRANS = 'T' or 't'   A'*x = b.
-*
-*              TRANS = 'C' or 'c'   conjg( A' )*x = b.
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit
-*           triangular as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX          array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular matrix and the strictly lower triangular part of
-*           A is not referenced.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular matrix and the strictly upper triangular part of
-*           A is not referenced.
-*           Note that when  DIAG = 'U' or 'u', the diagonal elements of
-*           A are not referenced either, but are assumed to be unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*  X      - COMPLEX          array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element right-hand side vector b. On exit, X is overwritten
-*           with the solution vector x.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX ZERO
-      PARAMETER (ZERO= (0.0E+0,0.0E+0))
-*     ..
-*     .. Local Scalars ..
-      COMPLEX TEMP
-      INTEGER I,INFO,IX,J,JX,KX
-      LOGICAL NOCONJ,NOUNIT
-*     ..
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC CONJG,MAX
-*     ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN
-          INFO = 1
-      ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
-     +         .NOT.LSAME(TRANS,'C')) THEN
-          INFO = 2
-      ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN
-          INFO = 3
-      ELSE IF (N.LT.0) THEN
-          INFO = 4
-      ELSE IF (LDA.LT.MAX(1,N)) THEN
-          INFO = 6
-      ELSE IF (INCX.EQ.0) THEN
-          INFO = 8
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('CTRSV ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF (N.EQ.0) RETURN
-*
-      NOCONJ = LSAME(TRANS,'T')
-      NOUNIT = LSAME(DIAG,'N')
-*
-*     Set up the start point in X if the increment is not unity. This
-*     will be  ( N - 1 )*INCX  too small for descending loops.
-*
-      IF (INCX.LE.0) THEN
-          KX = 1 - (N-1)*INCX
-      ELSE IF (INCX.NE.1) THEN
-          KX = 1
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-      IF (LSAME(TRANS,'N')) THEN
-*
-*        Form  x := inv( A )*x.
-*
-          IF (LSAME(UPLO,'U')) THEN
-              IF (INCX.EQ.1) THEN
-                  DO 20 J = N,1,-1
-                      IF (X(J).NE.ZERO) THEN
-                          IF (NOUNIT) X(J) = X(J)/A(J,J)
-                          TEMP = X(J)
-                          DO 10 I = J - 1,1,-1
-                              X(I) = X(I) - TEMP*A(I,J)
-   10                     CONTINUE
-                      END IF
-   20             CONTINUE
-              ELSE
-                  JX = KX + (N-1)*INCX
-                  DO 40 J = N,1,-1
-                      IF (X(JX).NE.ZERO) THEN
-                          IF (NOUNIT) X(JX) = X(JX)/A(J,J)
-                          TEMP = X(JX)
-                          IX = JX
-                          DO 30 I = J - 1,1,-1
-                              IX = IX - INCX
-                              X(IX) = X(IX) - TEMP*A(I,J)
-   30                     CONTINUE
-                      END IF
-                      JX = JX - INCX
-   40             CONTINUE
-              END IF
-          ELSE
-              IF (INCX.EQ.1) THEN
-                  DO 60 J = 1,N
-                      IF (X(J).NE.ZERO) THEN
-                          IF (NOUNIT) X(J) = X(J)/A(J,J)
-                          TEMP = X(J)
-                          DO 50 I = J + 1,N
-                              X(I) = X(I) - TEMP*A(I,J)
-   50                     CONTINUE
-                      END IF
-   60             CONTINUE
-              ELSE
-                  JX = KX
-                  DO 80 J = 1,N
-                      IF (X(JX).NE.ZERO) THEN
-                          IF (NOUNIT) X(JX) = X(JX)/A(J,J)
-                          TEMP = X(JX)
-                          IX = JX
-                          DO 70 I = J + 1,N
-                              IX = IX + INCX
-                              X(IX) = X(IX) - TEMP*A(I,J)
-   70                     CONTINUE
-                      END IF
-                      JX = JX + INCX
-   80             CONTINUE
-              END IF
-          END IF
-      ELSE
-*
-*        Form  x := inv( A' )*x  or  x := inv( conjg( A' ) )*x.
-*
-          IF (LSAME(UPLO,'U')) THEN
-              IF (INCX.EQ.1) THEN
-                  DO 110 J = 1,N
-                      TEMP = X(J)
-                      IF (NOCONJ) THEN
-                          DO 90 I = 1,J - 1
-                              TEMP = TEMP - A(I,J)*X(I)
-   90                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/A(J,J)
-                      ELSE
-                          DO 100 I = 1,J - 1
-                              TEMP = TEMP - CONJG(A(I,J))*X(I)
-  100                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/CONJG(A(J,J))
-                      END IF
-                      X(J) = TEMP
-  110             CONTINUE
-              ELSE
-                  JX = KX
-                  DO 140 J = 1,N
-                      IX = KX
-                      TEMP = X(JX)
-                      IF (NOCONJ) THEN
-                          DO 120 I = 1,J - 1
-                              TEMP = TEMP - A(I,J)*X(IX)
-                              IX = IX + INCX
-  120                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/A(J,J)
-                      ELSE
-                          DO 130 I = 1,J - 1
-                              TEMP = TEMP - CONJG(A(I,J))*X(IX)
-                              IX = IX + INCX
-  130                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/CONJG(A(J,J))
-                      END IF
-                      X(JX) = TEMP
-                      JX = JX + INCX
-  140             CONTINUE
-              END IF
-          ELSE
-              IF (INCX.EQ.1) THEN
-                  DO 170 J = N,1,-1
-                      TEMP = X(J)
-                      IF (NOCONJ) THEN
-                          DO 150 I = N,J + 1,-1
-                              TEMP = TEMP - A(I,J)*X(I)
-  150                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/A(J,J)
-                      ELSE
-                          DO 160 I = N,J + 1,-1
-                              TEMP = TEMP - CONJG(A(I,J))*X(I)
-  160                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/CONJG(A(J,J))
-                      END IF
-                      X(J) = TEMP
-  170             CONTINUE
-              ELSE
-                  KX = KX + (N-1)*INCX
-                  JX = KX
-                  DO 200 J = N,1,-1
-                      IX = KX
-                      TEMP = X(JX)
-                      IF (NOCONJ) THEN
-                          DO 180 I = N,J + 1,-1
-                              TEMP = TEMP - A(I,J)*X(IX)
-                              IX = IX - INCX
-  180                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/A(J,J)
-                      ELSE
-                          DO 190 I = N,J + 1,-1
-                              TEMP = TEMP - CONJG(A(I,J))*X(IX)
-                              IX = IX - INCX
-  190                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/CONJG(A(J,J))
-                      END IF
-                      X(JX) = TEMP
-                      JX = JX - INCX
-  200             CONTINUE
-              END IF
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of CTRSV .
-*
-      END
--- a/libcruft/blas/dasum.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-      double precision function dasum(n,dx,incx)
-c
-c     takes the sum of the absolute values.
-c     jack dongarra, linpack, 3/11/78.
-c     modified 3/93 to return if incx .le. 0.
-c     modified 12/3/93, array(1) declarations changed to array(*)
-c
-      double precision dx(*),dtemp
-      integer i,incx,m,mp1,n,nincx
-c
-      dasum = 0.0d0
-      dtemp = 0.0d0
-      if( n.le.0 .or. incx.le.0 )return
-      if(incx.eq.1)go to 20
-c
-c        code for increment not equal to 1
-c
-      nincx = n*incx
-      do 10 i = 1,nincx,incx
-        dtemp = dtemp + dabs(dx(i))
-   10 continue
-      dasum = dtemp
-      return
-c
-c        code for increment equal to 1
-c
-c
-c        clean-up loop
-c
-   20 m = mod(n,6)
-      if( m .eq. 0 ) go to 40
-      do 30 i = 1,m
-        dtemp = dtemp + dabs(dx(i))
-   30 continue
-      if( n .lt. 6 ) go to 60
-   40 mp1 = m + 1
-      do 50 i = mp1,n,6
-        dtemp = dtemp + dabs(dx(i)) + dabs(dx(i + 1)) + dabs(dx(i + 2))
-     *  + dabs(dx(i + 3)) + dabs(dx(i + 4)) + dabs(dx(i + 5))
-   50 continue
-   60 dasum = dtemp
-      return
-      end
--- a/libcruft/blas/daxpy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-      subroutine daxpy(n,da,dx,incx,dy,incy)
-c
-c     constant times a vector plus a vector.
-c     uses unrolled loops for increments equal to one.
-c     jack dongarra, linpack, 3/11/78.
-c     modified 12/3/93, array(1) declarations changed to array(*)
-c
-      double precision dx(*),dy(*),da
-      integer i,incx,incy,ix,iy,m,mp1,n
-c
-      if(n.le.0)return
-      if (da .eq. 0.0d0) return
-      if(incx.eq.1.and.incy.eq.1)go to 20
-c
-c        code for unequal increments or equal increments
-c          not equal to 1
-c
-      ix = 1
-      iy = 1
-      if(incx.lt.0)ix = (-n+1)*incx + 1
-      if(incy.lt.0)iy = (-n+1)*incy + 1
-      do 10 i = 1,n
-        dy(iy) = dy(iy) + da*dx(ix)
-        ix = ix + incx
-        iy = iy + incy
-   10 continue
-      return
-c
-c        code for both increments equal to 1
-c
-c
-c        clean-up loop
-c
-   20 m = mod(n,4)
-      if( m .eq. 0 ) go to 40
-      do 30 i = 1,m
-        dy(i) = dy(i) + da*dx(i)
-   30 continue
-      if( n .lt. 4 ) return
-   40 mp1 = m + 1
-      do 50 i = mp1,n,4
-        dy(i) = dy(i) + da*dx(i)
-        dy(i + 1) = dy(i + 1) + da*dx(i + 1)
-        dy(i + 2) = dy(i + 2) + da*dx(i + 2)
-        dy(i + 3) = dy(i + 3) + da*dx(i + 3)
-   50 continue
-      return
-      end
--- a/libcruft/blas/dcabs1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-      double precision function dcabs1(z)
-      double complex z,zz
-      double precision t(2)
-      equivalence (zz,t(1))
-      zz = z
-      dcabs1 = dabs(t(1)) + dabs(t(2))
-      return
-      end
--- a/libcruft/blas/dcopy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-      subroutine  dcopy(n,dx,incx,dy,incy)
-c
-c     copies a vector, x, to a vector, y.
-c     uses unrolled loops for increments equal to one.
-c     jack dongarra, linpack, 3/11/78.
-c     modified 12/3/93, array(1) declarations changed to array(*)
-c
-      double precision dx(*),dy(*)
-      integer i,incx,incy,ix,iy,m,mp1,n
-c
-      if(n.le.0)return
-      if(incx.eq.1.and.incy.eq.1)go to 20
-c
-c        code for unequal increments or equal increments
-c          not equal to 1
-c
-      ix = 1
-      iy = 1
-      if(incx.lt.0)ix = (-n+1)*incx + 1
-      if(incy.lt.0)iy = (-n+1)*incy + 1
-      do 10 i = 1,n
-        dy(iy) = dx(ix)
-        ix = ix + incx
-        iy = iy + incy
-   10 continue
-      return
-c
-c        code for both increments equal to 1
-c
-c
-c        clean-up loop
-c
-   20 m = mod(n,7)
-      if( m .eq. 0 ) go to 40
-      do 30 i = 1,m
-        dy(i) = dx(i)
-   30 continue
-      if( n .lt. 7 ) return
-   40 mp1 = m + 1
-      do 50 i = mp1,n,7
-        dy(i) = dx(i)
-        dy(i + 1) = dx(i + 1)
-        dy(i + 2) = dx(i + 2)
-        dy(i + 3) = dx(i + 3)
-        dy(i + 4) = dx(i + 4)
-        dy(i + 5) = dx(i + 5)
-        dy(i + 6) = dx(i + 6)
-   50 continue
-      return
-      end
--- a/libcruft/blas/ddot.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-      double precision function ddot(n,dx,incx,dy,incy)
-c
-c     forms the dot product of two vectors.
-c     uses unrolled loops for increments equal to one.
-c     jack dongarra, linpack, 3/11/78.
-c     modified 12/3/93, array(1) declarations changed to array(*)
-c
-      double precision dx(*),dy(*),dtemp
-      integer i,incx,incy,ix,iy,m,mp1,n
-c
-      ddot = 0.0d0
-      dtemp = 0.0d0
-      if(n.le.0)return
-      if(incx.eq.1.and.incy.eq.1)go to 20
-c
-c        code for unequal increments or equal increments
-c          not equal to 1
-c
-      ix = 1
-      iy = 1
-      if(incx.lt.0)ix = (-n+1)*incx + 1
-      if(incy.lt.0)iy = (-n+1)*incy + 1
-      do 10 i = 1,n
-        dtemp = dtemp + dx(ix)*dy(iy)
-        ix = ix + incx
-        iy = iy + incy
-   10 continue
-      ddot = dtemp
-      return
-c
-c        code for both increments equal to 1
-c
-c
-c        clean-up loop
-c
-   20 m = mod(n,5)
-      if( m .eq. 0 ) go to 40
-      do 30 i = 1,m
-        dtemp = dtemp + dx(i)*dy(i)
-   30 continue
-      if( n .lt. 5 ) go to 60
-   40 mp1 = m + 1
-      do 50 i = mp1,n,5
-        dtemp = dtemp + dx(i)*dy(i) + dx(i + 1)*dy(i + 1) +
-     *   dx(i + 2)*dy(i + 2) + dx(i + 3)*dy(i + 3) + dx(i + 4)*dy(i + 4)
-   50 continue
-   60 ddot = dtemp
-      return
-      end
--- a/libcruft/blas/dgemm.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,313 +0,0 @@
-      SUBROUTINE DGEMM ( TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB,
-     $                   BETA, C, LDC )
-*     .. Scalar Arguments ..
-      CHARACTER*1        TRANSA, TRANSB
-      INTEGER            M, N, K, LDA, LDB, LDC
-      DOUBLE PRECISION   ALPHA, BETA
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), C( LDC, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGEMM  performs one of the matrix-matrix operations
-*
-*     C := alpha*op( A )*op( B ) + beta*C,
-*
-*  where  op( X ) is one of
-*
-*     op( X ) = X   or   op( X ) = X',
-*
-*  alpha and beta are scalars, and A, B and C are matrices, with op( A )
-*  an m by k matrix,  op( B )  a  k by n matrix and  C an m by n matrix.
-*
-*  Parameters
-*  ==========
-*
-*  TRANSA - CHARACTER*1.
-*           On entry, TRANSA specifies the form of op( A ) to be used in
-*           the matrix multiplication as follows:
-*
-*              TRANSA = 'N' or 'n',  op( A ) = A.
-*
-*              TRANSA = 'T' or 't',  op( A ) = A'.
-*
-*              TRANSA = 'C' or 'c',  op( A ) = A'.
-*
-*           Unchanged on exit.
-*
-*  TRANSB - CHARACTER*1.
-*           On entry, TRANSB specifies the form of op( B ) to be used in
-*           the matrix multiplication as follows:
-*
-*              TRANSB = 'N' or 'n',  op( B ) = B.
-*
-*              TRANSB = 'T' or 't',  op( B ) = B'.
-*
-*              TRANSB = 'C' or 'c',  op( B ) = B'.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry,  M  specifies  the number  of rows  of the  matrix
-*           op( A )  and of the  matrix  C.  M  must  be at least  zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry,  N  specifies the number  of columns of the matrix
-*           op( B ) and the number of columns of the matrix C. N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry,  K  specifies  the number of columns of the matrix
-*           op( A ) and the number of rows of the matrix op( B ). K must
-*           be at least  zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - DOUBLE PRECISION.
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where ka is
-*           k  when  TRANSA = 'N' or 'n',  and is  m  otherwise.
-*           Before entry with  TRANSA = 'N' or 'n',  the leading  m by k
-*           part of the array  A  must contain the matrix  A,  otherwise
-*           the leading  k by m  part of the array  A  must contain  the
-*           matrix A.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. When  TRANSA = 'N' or 'n' then
-*           LDA must be at least  max( 1, m ), otherwise  LDA must be at
-*           least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  B      - DOUBLE PRECISION array of DIMENSION ( LDB, kb ), where kb is
-*           n  when  TRANSB = 'N' or 'n',  and is  k  otherwise.
-*           Before entry with  TRANSB = 'N' or 'n',  the leading  k by n
-*           part of the array  B  must contain the matrix  B,  otherwise
-*           the leading  n by k  part of the array  B  must contain  the
-*           matrix B.
-*           Unchanged on exit.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in the calling (sub) program. When  TRANSB = 'N' or 'n' then
-*           LDB must be at least  max( 1, k ), otherwise  LDB must be at
-*           least  max( 1, n ).
-*           Unchanged on exit.
-*
-*  BETA   - DOUBLE PRECISION.
-*           On entry,  BETA  specifies the scalar  beta.  When  BETA  is
-*           supplied as zero then C need not be set on input.
-*           Unchanged on exit.
-*
-*  C      - DOUBLE PRECISION array of DIMENSION ( LDC, n ).
-*           Before entry, the leading  m by n  part of the array  C must
-*           contain the matrix  C,  except when  beta  is zero, in which
-*           case C need not be set on entry.
-*           On exit, the array  C  is overwritten by the  m by n  matrix
-*           ( alpha*op( A )*op( B ) + beta*C ).
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     .. Local Scalars ..
-      LOGICAL            NOTA, NOTB
-      INTEGER            I, INFO, J, L, NCOLA, NROWA, NROWB
-      DOUBLE PRECISION   TEMP
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE         , ZERO
-      PARAMETER        ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Executable Statements ..
-*
-*     Set  NOTA  and  NOTB  as  true if  A  and  B  respectively are not
-*     transposed and set  NROWA, NCOLA and  NROWB  as the number of rows
-*     and  columns of  A  and the  number of  rows  of  B  respectively.
-*
-      NOTA  = LSAME( TRANSA, 'N' )
-      NOTB  = LSAME( TRANSB, 'N' )
-      IF( NOTA )THEN
-         NROWA = M
-         NCOLA = K
-      ELSE
-         NROWA = K
-         NCOLA = M
-      END IF
-      IF( NOTB )THEN
-         NROWB = K
-      ELSE
-         NROWB = N
-      END IF
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF(      ( .NOT.NOTA                 ).AND.
-     $         ( .NOT.LSAME( TRANSA, 'C' ) ).AND.
-     $         ( .NOT.LSAME( TRANSA, 'T' ) )      )THEN
-         INFO = 1
-      ELSE IF( ( .NOT.NOTB                 ).AND.
-     $         ( .NOT.LSAME( TRANSB, 'C' ) ).AND.
-     $         ( .NOT.LSAME( TRANSB, 'T' ) )      )THEN
-         INFO = 2
-      ELSE IF( M  .LT.0               )THEN
-         INFO = 3
-      ELSE IF( N  .LT.0               )THEN
-         INFO = 4
-      ELSE IF( K  .LT.0               )THEN
-         INFO = 5
-      ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN
-         INFO = 8
-      ELSE IF( LDB.LT.MAX( 1, NROWB ) )THEN
-         INFO = 10
-      ELSE IF( LDC.LT.MAX( 1, M     ) )THEN
-         INFO = 13
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'DGEMM ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR.
-     $    ( ( ( ALPHA.EQ.ZERO ).OR.( K.EQ.0 ) ).AND.( BETA.EQ.ONE ) ) )
-     $   RETURN
-*
-*     And if  alpha.eq.zero.
-*
-      IF( ALPHA.EQ.ZERO )THEN
-         IF( BETA.EQ.ZERO )THEN
-            DO 20, J = 1, N
-               DO 10, I = 1, M
-                  C( I, J ) = ZERO
-   10          CONTINUE
-   20       CONTINUE
-         ELSE
-            DO 40, J = 1, N
-               DO 30, I = 1, M
-                  C( I, J ) = BETA*C( I, J )
-   30          CONTINUE
-   40       CONTINUE
-         END IF
-         RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF( NOTB )THEN
-         IF( NOTA )THEN
-*
-*           Form  C := alpha*A*B + beta*C.
-*
-            DO 90, J = 1, N
-               IF( BETA.EQ.ZERO )THEN
-                  DO 50, I = 1, M
-                     C( I, J ) = ZERO
-   50             CONTINUE
-               ELSE IF( BETA.NE.ONE )THEN
-                  DO 60, I = 1, M
-                     C( I, J ) = BETA*C( I, J )
-   60             CONTINUE
-               END IF
-               DO 80, L = 1, K
-                  IF( B( L, J ).NE.ZERO )THEN
-                     TEMP = ALPHA*B( L, J )
-                     DO 70, I = 1, M
-                        C( I, J ) = C( I, J ) + TEMP*A( I, L )
-   70                CONTINUE
-                  END IF
-   80          CONTINUE
-   90       CONTINUE
-         ELSE
-*
-*           Form  C := alpha*A'*B + beta*C
-*
-            DO 120, J = 1, N
-               DO 110, I = 1, M
-                  TEMP = ZERO
-                  DO 100, L = 1, K
-                     TEMP = TEMP + A( L, I )*B( L, J )
-  100             CONTINUE
-                  IF( BETA.EQ.ZERO )THEN
-                     C( I, J ) = ALPHA*TEMP
-                  ELSE
-                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-                  END IF
-  110          CONTINUE
-  120       CONTINUE
-         END IF
-      ELSE
-         IF( NOTA )THEN
-*
-*           Form  C := alpha*A*B' + beta*C
-*
-            DO 170, J = 1, N
-               IF( BETA.EQ.ZERO )THEN
-                  DO 130, I = 1, M
-                     C( I, J ) = ZERO
-  130             CONTINUE
-               ELSE IF( BETA.NE.ONE )THEN
-                  DO 140, I = 1, M
-                     C( I, J ) = BETA*C( I, J )
-  140             CONTINUE
-               END IF
-               DO 160, L = 1, K
-                  IF( B( J, L ).NE.ZERO )THEN
-                     TEMP = ALPHA*B( J, L )
-                     DO 150, I = 1, M
-                        C( I, J ) = C( I, J ) + TEMP*A( I, L )
-  150                CONTINUE
-                  END IF
-  160          CONTINUE
-  170       CONTINUE
-         ELSE
-*
-*           Form  C := alpha*A'*B' + beta*C
-*
-            DO 200, J = 1, N
-               DO 190, I = 1, M
-                  TEMP = ZERO
-                  DO 180, L = 1, K
-                     TEMP = TEMP + A( L, I )*B( J, L )
-  180             CONTINUE
-                  IF( BETA.EQ.ZERO )THEN
-                     C( I, J ) = ALPHA*TEMP
-                  ELSE
-                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-                  END IF
-  190          CONTINUE
-  200       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DGEMM .
-*
-      END
--- a/libcruft/blas/dgemv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,261 +0,0 @@
-      SUBROUTINE DGEMV ( TRANS, M, N, ALPHA, A, LDA, X, INCX,
-     $                   BETA, Y, INCY )
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   ALPHA, BETA
-      INTEGER            INCX, INCY, LDA, M, N
-      CHARACTER*1        TRANS
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), X( * ), Y( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGEMV  performs one of the matrix-vector operations
-*
-*     y := alpha*A*x + beta*y,   or   y := alpha*A'*x + beta*y,
-*
-*  where alpha and beta are scalars, x and y are vectors and A is an
-*  m by n matrix.
-*
-*  Parameters
-*  ==========
-*
-*  TRANS  - CHARACTER*1.
-*           On entry, TRANS specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   y := alpha*A*x + beta*y.
-*
-*              TRANS = 'T' or 't'   y := alpha*A'*x + beta*y.
-*
-*              TRANS = 'C' or 'c'   y := alpha*A'*x + beta*y.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of the matrix A.
-*           M must be at least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - DOUBLE PRECISION.
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - DOUBLE PRECISION array of DIMENSION ( LDA, n ).
-*           Before entry, the leading m by n part of the array A must
-*           contain the matrix of coefficients.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*  X      - DOUBLE PRECISION array of DIMENSION at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'
-*           and at least
-*           ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.
-*           Before entry, the incremented array X must contain the
-*           vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  BETA   - DOUBLE PRECISION.
-*           On entry, BETA specifies the scalar beta. When BETA is
-*           supplied as zero then Y need not be set on input.
-*           Unchanged on exit.
-*
-*  Y      - DOUBLE PRECISION array of DIMENSION at least
-*           ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'
-*           and at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.
-*           Before entry with BETA non-zero, the incremented array Y
-*           must contain the vector y. On exit, Y is overwritten by the
-*           updated vector y.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE         , ZERO
-      PARAMETER        ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     .. Local Scalars ..
-      DOUBLE PRECISION   TEMP
-      INTEGER            I, INFO, IX, IY, J, JX, JY, KX, KY, LENX, LENY
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF     ( .NOT.LSAME( TRANS, 'N' ).AND.
-     $         .NOT.LSAME( TRANS, 'T' ).AND.
-     $         .NOT.LSAME( TRANS, 'C' )      )THEN
-         INFO = 1
-      ELSE IF( M.LT.0 )THEN
-         INFO = 2
-      ELSE IF( N.LT.0 )THEN
-         INFO = 3
-      ELSE IF( LDA.LT.MAX( 1, M ) )THEN
-         INFO = 6
-      ELSE IF( INCX.EQ.0 )THEN
-         INFO = 8
-      ELSE IF( INCY.EQ.0 )THEN
-         INFO = 11
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'DGEMV ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR.
-     $    ( ( ALPHA.EQ.ZERO ).AND.( BETA.EQ.ONE ) ) )
-     $   RETURN
-*
-*     Set  LENX  and  LENY, the lengths of the vectors x and y, and set
-*     up the start points in  X  and  Y.
-*
-      IF( LSAME( TRANS, 'N' ) )THEN
-         LENX = N
-         LENY = M
-      ELSE
-         LENX = M
-         LENY = N
-      END IF
-      IF( INCX.GT.0 )THEN
-         KX = 1
-      ELSE
-         KX = 1 - ( LENX - 1 )*INCX
-      END IF
-      IF( INCY.GT.0 )THEN
-         KY = 1
-      ELSE
-         KY = 1 - ( LENY - 1 )*INCY
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-*     First form  y := beta*y.
-*
-      IF( BETA.NE.ONE )THEN
-         IF( INCY.EQ.1 )THEN
-            IF( BETA.EQ.ZERO )THEN
-               DO 10, I = 1, LENY
-                  Y( I ) = ZERO
-   10          CONTINUE
-            ELSE
-               DO 20, I = 1, LENY
-                  Y( I ) = BETA*Y( I )
-   20          CONTINUE
-            END IF
-         ELSE
-            IY = KY
-            IF( BETA.EQ.ZERO )THEN
-               DO 30, I = 1, LENY
-                  Y( IY ) = ZERO
-                  IY      = IY   + INCY
-   30          CONTINUE
-            ELSE
-               DO 40, I = 1, LENY
-                  Y( IY ) = BETA*Y( IY )
-                  IY      = IY           + INCY
-   40          CONTINUE
-            END IF
-         END IF
-      END IF
-      IF( ALPHA.EQ.ZERO )
-     $   RETURN
-      IF( LSAME( TRANS, 'N' ) )THEN
-*
-*        Form  y := alpha*A*x + y.
-*
-         JX = KX
-         IF( INCY.EQ.1 )THEN
-            DO 60, J = 1, N
-               IF( X( JX ).NE.ZERO )THEN
-                  TEMP = ALPHA*X( JX )
-                  DO 50, I = 1, M
-                     Y( I ) = Y( I ) + TEMP*A( I, J )
-   50             CONTINUE
-               END IF
-               JX = JX + INCX
-   60       CONTINUE
-         ELSE
-            DO 80, J = 1, N
-               IF( X( JX ).NE.ZERO )THEN
-                  TEMP = ALPHA*X( JX )
-                  IY   = KY
-                  DO 70, I = 1, M
-                     Y( IY ) = Y( IY ) + TEMP*A( I, J )
-                     IY      = IY      + INCY
-   70             CONTINUE
-               END IF
-               JX = JX + INCX
-   80       CONTINUE
-         END IF
-      ELSE
-*
-*        Form  y := alpha*A'*x + y.
-*
-         JY = KY
-         IF( INCX.EQ.1 )THEN
-            DO 100, J = 1, N
-               TEMP = ZERO
-               DO 90, I = 1, M
-                  TEMP = TEMP + A( I, J )*X( I )
-   90          CONTINUE
-               Y( JY ) = Y( JY ) + ALPHA*TEMP
-               JY      = JY      + INCY
-  100       CONTINUE
-         ELSE
-            DO 120, J = 1, N
-               TEMP = ZERO
-               IX   = KX
-               DO 110, I = 1, M
-                  TEMP = TEMP + A( I, J )*X( IX )
-                  IX   = IX   + INCX
-  110          CONTINUE
-               Y( JY ) = Y( JY ) + ALPHA*TEMP
-               JY      = JY      + INCY
-  120       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DGEMV .
-*
-      END
--- a/libcruft/blas/dger.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,157 +0,0 @@
-      SUBROUTINE DGER  ( M, N, ALPHA, X, INCX, Y, INCY, A, LDA )
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   ALPHA
-      INTEGER            INCX, INCY, LDA, M, N
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), X( * ), Y( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGER   performs the rank 1 operation
-*
-*     A := alpha*x*y' + A,
-*
-*  where alpha is a scalar, x is an m element vector, y is an n element
-*  vector and A is an m by n matrix.
-*
-*  Parameters
-*  ==========
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of the matrix A.
-*           M must be at least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - DOUBLE PRECISION.
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  X      - DOUBLE PRECISION array of dimension at least
-*           ( 1 + ( m - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the m
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  Y      - DOUBLE PRECISION array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ).
-*           Before entry, the incremented array Y must contain the n
-*           element vector y.
-*           Unchanged on exit.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*  A      - DOUBLE PRECISION array of DIMENSION ( LDA, n ).
-*           Before entry, the leading m by n part of the array A must
-*           contain the matrix of coefficients. On exit, A is
-*           overwritten by the updated matrix.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER        ( ZERO = 0.0D+0 )
-*     .. Local Scalars ..
-      DOUBLE PRECISION   TEMP
-      INTEGER            I, INFO, IX, J, JY, KX
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF     ( M.LT.0 )THEN
-         INFO = 1
-      ELSE IF( N.LT.0 )THEN
-         INFO = 2
-      ELSE IF( INCX.EQ.0 )THEN
-         INFO = 5
-      ELSE IF( INCY.EQ.0 )THEN
-         INFO = 7
-      ELSE IF( LDA.LT.MAX( 1, M ) )THEN
-         INFO = 9
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'DGER  ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR.( ALPHA.EQ.ZERO ) )
-     $   RETURN
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-      IF( INCY.GT.0 )THEN
-         JY = 1
-      ELSE
-         JY = 1 - ( N - 1 )*INCY
-      END IF
-      IF( INCX.EQ.1 )THEN
-         DO 20, J = 1, N
-            IF( Y( JY ).NE.ZERO )THEN
-               TEMP = ALPHA*Y( JY )
-               DO 10, I = 1, M
-                  A( I, J ) = A( I, J ) + X( I )*TEMP
-   10          CONTINUE
-            END IF
-            JY = JY + INCY
-   20    CONTINUE
-      ELSE
-         IF( INCX.GT.0 )THEN
-            KX = 1
-         ELSE
-            KX = 1 - ( M - 1 )*INCX
-         END IF
-         DO 40, J = 1, N
-            IF( Y( JY ).NE.ZERO )THEN
-               TEMP = ALPHA*Y( JY )
-               IX   = KX
-               DO 30, I = 1, M
-                  A( I, J ) = A( I, J ) + X( IX )*TEMP
-                  IX        = IX        + INCX
-   30          CONTINUE
-            END IF
-            JY = JY + INCY
-   40    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of DGER  .
-*
-      END
--- a/libcruft/blas/dmach.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-      DOUBLE PRECISION FUNCTION DMACH(JOB)
-      INTEGER JOB
-C
-C     SMACH COMPUTES MACHINE PARAMETERS OF FLOATING POINT
-C     ARITHMETIC FOR USE IN TESTING ONLY.  NOT REQUIRED BY
-C     LINPACK PROPER.
-C
-C     IF TROUBLE WITH AUTOMATIC COMPUTATION OF THESE QUANTITIES,
-C     THEY CAN BE SET BY DIRECT ASSIGNMENT STATEMENTS.
-C     ASSUME THE COMPUTER HAS
-C
-C        B = BASE OF ARITHMETIC
-C        T = NUMBER OF BASE  B  DIGITS
-C        L = SMALLEST POSSIBLE EXPONENT
-C        U = LARGEST POSSIBLE EXPONENT
-C
-C     THEN
-C
-C        EPS = B**(1-T)
-C        TINY = 100.0*B**(-L+T)
-C        HUGE = 0.01*B**(U-T)
-C
-C     DMACH SAME AS SMACH EXCEPT T, L, U APPLY TO
-C     DOUBLE PRECISION.
-C
-C     CMACH SAME AS SMACH EXCEPT IF COMPLEX DIVISION
-C     IS DONE BY
-C
-C        1/(X+I*Y) = (X-I*Y)/(X**2+Y**2)
-C
-C     THEN
-C
-C        TINY = SQRT(TINY)
-C        HUGE = SQRT(HUGE)
-C
-C
-C     JOB IS 1, 2 OR 3 FOR EPSILON, TINY AND HUGE, RESPECTIVELY.
-C
-      DOUBLE PRECISION EPS,TINY,HUGE,S
-C
-      EPS = 1.0D0
-   10 EPS = EPS/2.0D0
-      S = 1.0D0 + EPS
-      IF (S .GT. 1.0D0) GO TO 10
-      EPS = 2.0D0*EPS
-C
-      S = 1.0D0
-   20 TINY = S
-      S = S/16.0D0
-      IF (S*1.0 .NE. 0.0D0) GO TO 20
-      TINY = (TINY/EPS)*100.0
-      HUGE = 1.0D0/TINY
-C
-      IF (JOB .EQ. 1) DMACH = EPS
-      IF (JOB .EQ. 2) DMACH = TINY
-      IF (JOB .EQ. 3) DMACH = HUGE
-      RETURN
-      END
--- a/libcruft/blas/dnrm2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-      DOUBLE PRECISION FUNCTION DNRM2 ( N, X, INCX )
-*     .. Scalar Arguments ..
-      INTEGER                           INCX, N
-*     .. Array Arguments ..
-      DOUBLE PRECISION                  X( * )
-*     ..
-*
-*  DNRM2 returns the euclidean norm of a vector via the function
-*  name, so that
-*
-*     DNRM2 := sqrt( x'*x )
-*
-*
-*
-*  -- This version written on 25-October-1982.
-*     Modified on 14-October-1993 to inline the call to DLASSQ.
-*     Sven Hammarling, Nag Ltd.
-*
-*
-*     .. Parameters ..
-      DOUBLE PRECISION      ONE         , ZERO
-      PARAMETER           ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     .. Local Scalars ..
-      INTEGER               IX
-      DOUBLE PRECISION      ABSXI, NORM, SCALE, SSQ
-*     .. Intrinsic Functions ..
-      INTRINSIC             ABS, SQRT
-*     ..
-*     .. Executable Statements ..
-      IF( N.LT.1 .OR. INCX.LT.1 )THEN
-         NORM  = ZERO
-      ELSE IF( N.EQ.1 )THEN
-         NORM  = ABS( X( 1 ) )
-      ELSE
-         SCALE = ZERO
-         SSQ   = ONE
-*        The following loop is equivalent to this call to the LAPACK
-*        auxiliary routine:
-*        CALL DLASSQ( N, X, INCX, SCALE, SSQ )
-*
-         DO 10, IX = 1, 1 + ( N - 1 )*INCX, INCX
-            IF( X( IX ).NE.ZERO )THEN
-               ABSXI = ABS( X( IX ) )
-               IF( SCALE.LT.ABSXI )THEN
-                  SSQ   = ONE   + SSQ*( SCALE/ABSXI )**2
-                  SCALE = ABSXI
-               ELSE
-                  SSQ   = SSQ   +     ( ABSXI/SCALE )**2
-               END IF
-            END IF
-   10    CONTINUE
-         NORM  = SCALE * SQRT( SSQ )
-      END IF
-*
-      DNRM2 = NORM
-      RETURN
-*
-*     End of DNRM2.
-*
-      END
--- a/libcruft/blas/drot.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-      subroutine  drot (n,dx,incx,dy,incy,c,s)
-c
-c     applies a plane rotation.
-c     jack dongarra, linpack, 3/11/78.
-c     modified 12/3/93, array(1) declarations changed to array(*)
-c
-      double precision dx(*),dy(*),dtemp,c,s
-      integer i,incx,incy,ix,iy,n
-c
-      if(n.le.0)return
-      if(incx.eq.1.and.incy.eq.1)go to 20
-c
-c       code for unequal increments or equal increments not equal
-c         to 1
-c
-      ix = 1
-      iy = 1
-      if(incx.lt.0)ix = (-n+1)*incx + 1
-      if(incy.lt.0)iy = (-n+1)*incy + 1
-      do 10 i = 1,n
-        dtemp = c*dx(ix) + s*dy(iy)
-        dy(iy) = c*dy(iy) - s*dx(ix)
-        dx(ix) = dtemp
-        ix = ix + incx
-        iy = iy + incy
-   10 continue
-      return
-c
-c       code for both increments equal to 1
-c
-   20 do 30 i = 1,n
-        dtemp = c*dx(i) + s*dy(i)
-        dy(i) = c*dy(i) - s*dx(i)
-        dx(i) = dtemp
-   30 continue
-      return
-      end
--- a/libcruft/blas/dscal.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-      subroutine  dscal(n,da,dx,incx)
-c
-c     scales a vector by a constant.
-c     uses unrolled loops for increment equal to one.
-c     jack dongarra, linpack, 3/11/78.
-c     modified 3/93 to return if incx .le. 0.
-c     modified 12/3/93, array(1) declarations changed to array(*)
-c
-      double precision da,dx(*)
-      integer i,incx,m,mp1,n,nincx
-c
-      if( n.le.0 .or. incx.le.0 )return
-      if(incx.eq.1)go to 20
-c
-c        code for increment not equal to 1
-c
-      nincx = n*incx
-      do 10 i = 1,nincx,incx
-        dx(i) = da*dx(i)
-   10 continue
-      return
-c
-c        code for increment equal to 1
-c
-c
-c        clean-up loop
-c
-   20 m = mod(n,5)
-      if( m .eq. 0 ) go to 40
-      do 30 i = 1,m
-        dx(i) = da*dx(i)
-   30 continue
-      if( n .lt. 5 ) return
-   40 mp1 = m + 1
-      do 50 i = mp1,n,5
-        dx(i) = da*dx(i)
-        dx(i + 1) = da*dx(i + 1)
-        dx(i + 2) = da*dx(i + 2)
-        dx(i + 3) = da*dx(i + 3)
-        dx(i + 4) = da*dx(i + 4)
-   50 continue
-      return
-      end
--- a/libcruft/blas/dswap.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-      subroutine  dswap (n,dx,incx,dy,incy)
-c
-c     interchanges two vectors.
-c     uses unrolled loops for increments equal one.
-c     jack dongarra, linpack, 3/11/78.
-c     modified 12/3/93, array(1) declarations changed to array(*)
-c
-      double precision dx(*),dy(*),dtemp
-      integer i,incx,incy,ix,iy,m,mp1,n
-c
-      if(n.le.0)return
-      if(incx.eq.1.and.incy.eq.1)go to 20
-c
-c       code for unequal increments or equal increments not equal
-c         to 1
-c
-      ix = 1
-      iy = 1
-      if(incx.lt.0)ix = (-n+1)*incx + 1
-      if(incy.lt.0)iy = (-n+1)*incy + 1
-      do 10 i = 1,n
-        dtemp = dx(ix)
-        dx(ix) = dy(iy)
-        dy(iy) = dtemp
-        ix = ix + incx
-        iy = iy + incy
-   10 continue
-      return
-c
-c       code for both increments equal to 1
-c
-c
-c       clean-up loop
-c
-   20 m = mod(n,3)
-      if( m .eq. 0 ) go to 40
-      do 30 i = 1,m
-        dtemp = dx(i)
-        dx(i) = dy(i)
-        dy(i) = dtemp
-   30 continue
-      if( n .lt. 3 ) return
-   40 mp1 = m + 1
-      do 50 i = mp1,n,3
-        dtemp = dx(i)
-        dx(i) = dy(i)
-        dy(i) = dtemp
-        dtemp = dx(i + 1)
-        dx(i + 1) = dy(i + 1)
-        dy(i + 1) = dtemp
-        dtemp = dx(i + 2)
-        dx(i + 2) = dy(i + 2)
-        dy(i + 2) = dtemp
-   50 continue
-      return
-      end
--- a/libcruft/blas/dsymm.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,294 +0,0 @@
-      SUBROUTINE DSYMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC)
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION ALPHA,BETA
-      INTEGER LDA,LDB,LDC,M,N
-      CHARACTER SIDE,UPLO
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DSYMM  performs one of the matrix-matrix operations
-*
-*     C := alpha*A*B + beta*C,
-*
-*  or
-*
-*     C := alpha*B*A + beta*C,
-*
-*  where alpha and beta are scalars,  A is a symmetric matrix and  B and
-*  C are  m by n matrices.
-*
-*  Arguments
-*  ==========
-*
-*  SIDE   - CHARACTER*1.
-*           On entry,  SIDE  specifies whether  the  symmetric matrix  A
-*           appears on the  left or right  in the  operation as follows:
-*
-*              SIDE = 'L' or 'l'   C := alpha*A*B + beta*C,
-*
-*              SIDE = 'R' or 'r'   C := alpha*B*A + beta*C,
-*
-*           Unchanged on exit.
-*
-*  UPLO   - CHARACTER*1.
-*           On  entry,   UPLO  specifies  whether  the  upper  or  lower
-*           triangular  part  of  the  symmetric  matrix   A  is  to  be
-*           referenced as follows:
-*
-*              UPLO = 'U' or 'u'   Only the upper triangular part of the
-*                                  symmetric matrix is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the lower triangular part of the
-*                                  symmetric matrix is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry,  M  specifies the number of rows of the matrix  C.
-*           M  must be at least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of the matrix C.
-*           N  must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - DOUBLE PRECISION.
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where ka is
-*           m  when  SIDE = 'L' or 'l'  and is  n otherwise.
-*           Before entry  with  SIDE = 'L' or 'l',  the  m by m  part of
-*           the array  A  must contain the  symmetric matrix,  such that
-*           when  UPLO = 'U' or 'u', the leading m by m upper triangular
-*           part of the array  A  must contain the upper triangular part
-*           of the  symmetric matrix and the  strictly  lower triangular
-*           part of  A  is not referenced,  and when  UPLO = 'L' or 'l',
-*           the leading  m by m  lower triangular part  of the  array  A
-*           must  contain  the  lower triangular part  of the  symmetric
-*           matrix and the  strictly upper triangular part of  A  is not
-*           referenced.
-*           Before entry  with  SIDE = 'R' or 'r',  the  n by n  part of
-*           the array  A  must contain the  symmetric matrix,  such that
-*           when  UPLO = 'U' or 'u', the leading n by n upper triangular
-*           part of the array  A  must contain the upper triangular part
-*           of the  symmetric matrix and the  strictly  lower triangular
-*           part of  A  is not referenced,  and when  UPLO = 'L' or 'l',
-*           the leading  n by n  lower triangular part  of the  array  A
-*           must  contain  the  lower triangular part  of the  symmetric
-*           matrix and the  strictly upper triangular part of  A  is not
-*           referenced.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program.  When  SIDE = 'L' or 'l'  then
-*           LDA must be at least  max( 1, m ), otherwise  LDA must be at
-*           least  max( 1, n ).
-*           Unchanged on exit.
-*
-*  B      - DOUBLE PRECISION array of DIMENSION ( LDB, n ).
-*           Before entry, the leading  m by n part of the array  B  must
-*           contain the matrix B.
-*           Unchanged on exit.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in  the  calling  (sub)  program.   LDB  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*  BETA   - DOUBLE PRECISION.
-*           On entry,  BETA  specifies the scalar  beta.  When  BETA  is
-*           supplied as zero then C need not be set on input.
-*           Unchanged on exit.
-*
-*  C      - DOUBLE PRECISION array of DIMENSION ( LDC, n ).
-*           Before entry, the leading  m by n  part of the array  C must
-*           contain the matrix  C,  except when  beta  is zero, in which
-*           case C need not be set on entry.
-*           On exit, the array  C  is overwritten by the  m by n updated
-*           matrix.
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION TEMP1,TEMP2
-      INTEGER I,INFO,J,K,NROWA
-      LOGICAL UPPER
-*     ..
-*     .. Parameters ..
-      DOUBLE PRECISION ONE,ZERO
-      PARAMETER (ONE=1.0D+0,ZERO=0.0D+0)
-*     ..
-*
-*     Set NROWA as the number of rows of A.
-*
-      IF (LSAME(SIDE,'L')) THEN
-          NROWA = M
-      ELSE
-          NROWA = N
-      END IF
-      UPPER = LSAME(UPLO,'U')
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF ((.NOT.LSAME(SIDE,'L')) .AND. (.NOT.LSAME(SIDE,'R'))) THEN
-          INFO = 1
-      ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
-          INFO = 2
-      ELSE IF (M.LT.0) THEN
-          INFO = 3
-      ELSE IF (N.LT.0) THEN
-          INFO = 4
-      ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
-          INFO = 7
-      ELSE IF (LDB.LT.MAX(1,M)) THEN
-          INFO = 9
-      ELSE IF (LDC.LT.MAX(1,M)) THEN
-          INFO = 12
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('DSYMM ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
-     +    ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF (ALPHA.EQ.ZERO) THEN
-          IF (BETA.EQ.ZERO) THEN
-              DO 20 J = 1,N
-                  DO 10 I = 1,M
-                      C(I,J) = ZERO
-   10             CONTINUE
-   20         CONTINUE
-          ELSE
-              DO 40 J = 1,N
-                  DO 30 I = 1,M
-                      C(I,J) = BETA*C(I,J)
-   30             CONTINUE
-   40         CONTINUE
-          END IF
-          RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF (LSAME(SIDE,'L')) THEN
-*
-*        Form  C := alpha*A*B + beta*C.
-*
-          IF (UPPER) THEN
-              DO 70 J = 1,N
-                  DO 60 I = 1,M
-                      TEMP1 = ALPHA*B(I,J)
-                      TEMP2 = ZERO
-                      DO 50 K = 1,I - 1
-                          C(K,J) = C(K,J) + TEMP1*A(K,I)
-                          TEMP2 = TEMP2 + B(K,J)*A(K,I)
-   50                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = TEMP1*A(I,I) + ALPHA*TEMP2
-                      ELSE
-                          C(I,J) = BETA*C(I,J) + TEMP1*A(I,I) +
-     +                             ALPHA*TEMP2
-                      END IF
-   60             CONTINUE
-   70         CONTINUE
-          ELSE
-              DO 100 J = 1,N
-                  DO 90 I = M,1,-1
-                      TEMP1 = ALPHA*B(I,J)
-                      TEMP2 = ZERO
-                      DO 80 K = I + 1,M
-                          C(K,J) = C(K,J) + TEMP1*A(K,I)
-                          TEMP2 = TEMP2 + B(K,J)*A(K,I)
-   80                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = TEMP1*A(I,I) + ALPHA*TEMP2
-                      ELSE
-                          C(I,J) = BETA*C(I,J) + TEMP1*A(I,I) +
-     +                             ALPHA*TEMP2
-                      END IF
-   90             CONTINUE
-  100         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  C := alpha*B*A + beta*C.
-*
-          DO 170 J = 1,N
-              TEMP1 = ALPHA*A(J,J)
-              IF (BETA.EQ.ZERO) THEN
-                  DO 110 I = 1,M
-                      C(I,J) = TEMP1*B(I,J)
-  110             CONTINUE
-              ELSE
-                  DO 120 I = 1,M
-                      C(I,J) = BETA*C(I,J) + TEMP1*B(I,J)
-  120             CONTINUE
-              END IF
-              DO 140 K = 1,J - 1
-                  IF (UPPER) THEN
-                      TEMP1 = ALPHA*A(K,J)
-                  ELSE
-                      TEMP1 = ALPHA*A(J,K)
-                  END IF
-                  DO 130 I = 1,M
-                      C(I,J) = C(I,J) + TEMP1*B(I,K)
-  130             CONTINUE
-  140         CONTINUE
-              DO 160 K = J + 1,N
-                  IF (UPPER) THEN
-                      TEMP1 = ALPHA*A(J,K)
-                  ELSE
-                      TEMP1 = ALPHA*A(K,J)
-                  END IF
-                  DO 150 I = 1,M
-                      C(I,J) = C(I,J) + TEMP1*B(I,K)
-  150             CONTINUE
-  160         CONTINUE
-  170     CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of DSYMM .
-*
-      END
--- a/libcruft/blas/dsymv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,265 +0,0 @@
-*
-************************************************************************
-*
-      SUBROUTINE DSYMV ( UPLO, N, ALPHA, A, LDA, X, INCX,
-     $                   BETA, Y, INCY )
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   ALPHA, BETA
-      INTEGER            INCX, INCY, LDA, N
-      CHARACTER*1        UPLO
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), X( * ), Y( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DSYMV  performs the matrix-vector  operation
-*
-*     y := alpha*A*x + beta*y,
-*
-*  where alpha and beta are scalars, x and y are n element vectors and
-*  A is an n by n symmetric matrix.
-*
-*  Parameters
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the upper or lower
-*           triangular part of the array A is to be referenced as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the upper triangular part of A
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the lower triangular part of A
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - DOUBLE PRECISION.
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - DOUBLE PRECISION array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular part of the symmetric matrix and the strictly
-*           lower triangular part of A is not referenced.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular part of the symmetric matrix and the strictly
-*           upper triangular part of A is not referenced.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*  X      - DOUBLE PRECISION array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  BETA   - DOUBLE PRECISION.
-*           On entry, BETA specifies the scalar beta. When BETA is
-*           supplied as zero then Y need not be set on input.
-*           Unchanged on exit.
-*
-*  Y      - DOUBLE PRECISION array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ).
-*           Before entry, the incremented array Y must contain the n
-*           element vector y. On exit, Y is overwritten by the updated
-*           vector y.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE         , ZERO
-      PARAMETER        ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     .. Local Scalars ..
-      DOUBLE PRECISION   TEMP1, TEMP2
-      INTEGER            I, INFO, IX, IY, J, JX, JY, KX, KY
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF     ( .NOT.LSAME( UPLO, 'U' ).AND.
-     $         .NOT.LSAME( UPLO, 'L' )      )THEN
-         INFO = 1
-      ELSE IF( N.LT.0 )THEN
-         INFO = 2
-      ELSE IF( LDA.LT.MAX( 1, N ) )THEN
-         INFO = 5
-      ELSE IF( INCX.EQ.0 )THEN
-         INFO = 7
-      ELSE IF( INCY.EQ.0 )THEN
-         INFO = 10
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'DSYMV ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( ( N.EQ.0 ).OR.( ( ALPHA.EQ.ZERO ).AND.( BETA.EQ.ONE ) ) )
-     $   RETURN
-*
-*     Set up the start points in  X  and  Y.
-*
-      IF( INCX.GT.0 )THEN
-         KX = 1
-      ELSE
-         KX = 1 - ( N - 1 )*INCX
-      END IF
-      IF( INCY.GT.0 )THEN
-         KY = 1
-      ELSE
-         KY = 1 - ( N - 1 )*INCY
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through the triangular part
-*     of A.
-*
-*     First form  y := beta*y.
-*
-      IF( BETA.NE.ONE )THEN
-         IF( INCY.EQ.1 )THEN
-            IF( BETA.EQ.ZERO )THEN
-               DO 10, I = 1, N
-                  Y( I ) = ZERO
-   10          CONTINUE
-            ELSE
-               DO 20, I = 1, N
-                  Y( I ) = BETA*Y( I )
-   20          CONTINUE
-            END IF
-         ELSE
-            IY = KY
-            IF( BETA.EQ.ZERO )THEN
-               DO 30, I = 1, N
-                  Y( IY ) = ZERO
-                  IY      = IY   + INCY
-   30          CONTINUE
-            ELSE
-               DO 40, I = 1, N
-                  Y( IY ) = BETA*Y( IY )
-                  IY      = IY           + INCY
-   40          CONTINUE
-            END IF
-         END IF
-      END IF
-      IF( ALPHA.EQ.ZERO )
-     $   RETURN
-      IF( LSAME( UPLO, 'U' ) )THEN
-*
-*        Form  y  when A is stored in upper triangle.
-*
-         IF( ( INCX.EQ.1 ).AND.( INCY.EQ.1 ) )THEN
-            DO 60, J = 1, N
-               TEMP1 = ALPHA*X( J )
-               TEMP2 = ZERO
-               DO 50, I = 1, J - 1
-                  Y( I ) = Y( I ) + TEMP1*A( I, J )
-                  TEMP2  = TEMP2  + A( I, J )*X( I )
-   50          CONTINUE
-               Y( J ) = Y( J ) + TEMP1*A( J, J ) + ALPHA*TEMP2
-   60       CONTINUE
-         ELSE
-            JX = KX
-            JY = KY
-            DO 80, J = 1, N
-               TEMP1 = ALPHA*X( JX )
-               TEMP2 = ZERO
-               IX    = KX
-               IY    = KY
-               DO 70, I = 1, J - 1
-                  Y( IY ) = Y( IY ) + TEMP1*A( I, J )
-                  TEMP2   = TEMP2   + A( I, J )*X( IX )
-                  IX      = IX      + INCX
-                  IY      = IY      + INCY
-   70          CONTINUE
-               Y( JY ) = Y( JY ) + TEMP1*A( J, J ) + ALPHA*TEMP2
-               JX      = JX      + INCX
-               JY      = JY      + INCY
-   80       CONTINUE
-         END IF
-      ELSE
-*
-*        Form  y  when A is stored in lower triangle.
-*
-         IF( ( INCX.EQ.1 ).AND.( INCY.EQ.1 ) )THEN
-            DO 100, J = 1, N
-               TEMP1  = ALPHA*X( J )
-               TEMP2  = ZERO
-               Y( J ) = Y( J )       + TEMP1*A( J, J )
-               DO 90, I = J + 1, N
-                  Y( I ) = Y( I ) + TEMP1*A( I, J )
-                  TEMP2  = TEMP2  + A( I, J )*X( I )
-   90          CONTINUE
-               Y( J ) = Y( J ) + ALPHA*TEMP2
-  100       CONTINUE
-         ELSE
-            JX = KX
-            JY = KY
-            DO 120, J = 1, N
-               TEMP1   = ALPHA*X( JX )
-               TEMP2   = ZERO
-               Y( JY ) = Y( JY )       + TEMP1*A( J, J )
-               IX      = JX
-               IY      = JY
-               DO 110, I = J + 1, N
-                  IX      = IX      + INCX
-                  IY      = IY      + INCY
-                  Y( IY ) = Y( IY ) + TEMP1*A( I, J )
-                  TEMP2   = TEMP2   + A( I, J )*X( IX )
-  110          CONTINUE
-               Y( JY ) = Y( JY ) + ALPHA*TEMP2
-               JX      = JX      + INCX
-               JY      = JY      + INCY
-  120       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DSYMV .
-*
-      END
--- a/libcruft/blas/dsyr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,197 +0,0 @@
-      SUBROUTINE DSYR  ( UPLO, N, ALPHA, X, INCX, A, LDA )
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   ALPHA
-      INTEGER            INCX, LDA, N
-      CHARACTER*1        UPLO
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DSYR   performs the symmetric rank 1 operation
-*
-*     A := alpha*x*x' + A,
-*
-*  where alpha is a real scalar, x is an n element vector and A is an
-*  n by n symmetric matrix.
-*
-*  Parameters
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the upper or lower
-*           triangular part of the array A is to be referenced as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the upper triangular part of A
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the lower triangular part of A
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - DOUBLE PRECISION.
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  X      - DOUBLE PRECISION array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  A      - DOUBLE PRECISION array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular part of the symmetric matrix and the strictly
-*           lower triangular part of A is not referenced. On exit, the
-*           upper triangular part of the array A is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular part of the symmetric matrix and the strictly
-*           upper triangular part of A is not referenced. On exit, the
-*           lower triangular part of the array A is overwritten by the
-*           lower triangular part of the updated matrix.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER        ( ZERO = 0.0D+0 )
-*     .. Local Scalars ..
-      DOUBLE PRECISION   TEMP
-      INTEGER            I, INFO, IX, J, JX, KX
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF     ( .NOT.LSAME( UPLO, 'U' ).AND.
-     $         .NOT.LSAME( UPLO, 'L' )      )THEN
-         INFO = 1
-      ELSE IF( N.LT.0 )THEN
-         INFO = 2
-      ELSE IF( INCX.EQ.0 )THEN
-         INFO = 5
-      ELSE IF( LDA.LT.MAX( 1, N ) )THEN
-         INFO = 7
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'DSYR  ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( ( N.EQ.0 ).OR.( ALPHA.EQ.ZERO ) )
-     $   RETURN
-*
-*     Set the start point in X if the increment is not unity.
-*
-      IF( INCX.LE.0 )THEN
-         KX = 1 - ( N - 1 )*INCX
-      ELSE IF( INCX.NE.1 )THEN
-         KX = 1
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through the triangular part
-*     of A.
-*
-      IF( LSAME( UPLO, 'U' ) )THEN
-*
-*        Form  A  when A is stored in upper triangle.
-*
-         IF( INCX.EQ.1 )THEN
-            DO 20, J = 1, N
-               IF( X( J ).NE.ZERO )THEN
-                  TEMP = ALPHA*X( J )
-                  DO 10, I = 1, J
-                     A( I, J ) = A( I, J ) + X( I )*TEMP
-   10             CONTINUE
-               END IF
-   20       CONTINUE
-         ELSE
-            JX = KX
-            DO 40, J = 1, N
-               IF( X( JX ).NE.ZERO )THEN
-                  TEMP = ALPHA*X( JX )
-                  IX   = KX
-                  DO 30, I = 1, J
-                     A( I, J ) = A( I, J ) + X( IX )*TEMP
-                     IX        = IX        + INCX
-   30             CONTINUE
-               END IF
-               JX = JX + INCX
-   40       CONTINUE
-         END IF
-      ELSE
-*
-*        Form  A  when A is stored in lower triangle.
-*
-         IF( INCX.EQ.1 )THEN
-            DO 60, J = 1, N
-               IF( X( J ).NE.ZERO )THEN
-                  TEMP = ALPHA*X( J )
-                  DO 50, I = J, N
-                     A( I, J ) = A( I, J ) + X( I )*TEMP
-   50             CONTINUE
-               END IF
-   60       CONTINUE
-         ELSE
-            JX = KX
-            DO 80, J = 1, N
-               IF( X( JX ).NE.ZERO )THEN
-                  TEMP = ALPHA*X( JX )
-                  IX   = JX
-                  DO 70, I = J, N
-                     A( I, J ) = A( I, J ) + X( IX )*TEMP
-                     IX        = IX        + INCX
-   70             CONTINUE
-               END IF
-               JX = JX + INCX
-   80       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DSYR  .
-*
-      END
--- a/libcruft/blas/dsyr2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,233 +0,0 @@
-*
-************************************************************************
-*
-      SUBROUTINE DSYR2 ( UPLO, N, ALPHA, X, INCX, Y, INCY, A, LDA )
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   ALPHA
-      INTEGER            INCX, INCY, LDA, N
-      CHARACTER*1        UPLO
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), X( * ), Y( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DSYR2  performs the symmetric rank 2 operation
-*
-*     A := alpha*x*y' + alpha*y*x' + A,
-*
-*  where alpha is a scalar, x and y are n element vectors and A is an n
-*  by n symmetric matrix.
-*
-*  Parameters
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the upper or lower
-*           triangular part of the array A is to be referenced as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the upper triangular part of A
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the lower triangular part of A
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - DOUBLE PRECISION.
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  X      - DOUBLE PRECISION array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  Y      - DOUBLE PRECISION array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ).
-*           Before entry, the incremented array Y must contain the n
-*           element vector y.
-*           Unchanged on exit.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*  A      - DOUBLE PRECISION array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular part of the symmetric matrix and the strictly
-*           lower triangular part of A is not referenced. On exit, the
-*           upper triangular part of the array A is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular part of the symmetric matrix and the strictly
-*           upper triangular part of A is not referenced. On exit, the
-*           lower triangular part of the array A is overwritten by the
-*           lower triangular part of the updated matrix.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER        ( ZERO = 0.0D+0 )
-*     .. Local Scalars ..
-      DOUBLE PRECISION   TEMP1, TEMP2
-      INTEGER            I, INFO, IX, IY, J, JX, JY, KX, KY
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF     ( .NOT.LSAME( UPLO, 'U' ).AND.
-     $         .NOT.LSAME( UPLO, 'L' )      )THEN
-         INFO = 1
-      ELSE IF( N.LT.0 )THEN
-         INFO = 2
-      ELSE IF( INCX.EQ.0 )THEN
-         INFO = 5
-      ELSE IF( INCY.EQ.0 )THEN
-         INFO = 7
-      ELSE IF( LDA.LT.MAX( 1, N ) )THEN
-         INFO = 9
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'DSYR2 ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( ( N.EQ.0 ).OR.( ALPHA.EQ.ZERO ) )
-     $   RETURN
-*
-*     Set up the start points in X and Y if the increments are not both
-*     unity.
-*
-      IF( ( INCX.NE.1 ).OR.( INCY.NE.1 ) )THEN
-         IF( INCX.GT.0 )THEN
-            KX = 1
-         ELSE
-            KX = 1 - ( N - 1 )*INCX
-         END IF
-         IF( INCY.GT.0 )THEN
-            KY = 1
-         ELSE
-            KY = 1 - ( N - 1 )*INCY
-         END IF
-         JX = KX
-         JY = KY
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through the triangular part
-*     of A.
-*
-      IF( LSAME( UPLO, 'U' ) )THEN
-*
-*        Form  A  when A is stored in the upper triangle.
-*
-         IF( ( INCX.EQ.1 ).AND.( INCY.EQ.1 ) )THEN
-            DO 20, J = 1, N
-               IF( ( X( J ).NE.ZERO ).OR.( Y( J ).NE.ZERO ) )THEN
-                  TEMP1 = ALPHA*Y( J )
-                  TEMP2 = ALPHA*X( J )
-                  DO 10, I = 1, J
-                     A( I, J ) = A( I, J ) + X( I )*TEMP1 + Y( I )*TEMP2
-   10             CONTINUE
-               END IF
-   20       CONTINUE
-         ELSE
-            DO 40, J = 1, N
-               IF( ( X( JX ).NE.ZERO ).OR.( Y( JY ).NE.ZERO ) )THEN
-                  TEMP1 = ALPHA*Y( JY )
-                  TEMP2 = ALPHA*X( JX )
-                  IX    = KX
-                  IY    = KY
-                  DO 30, I = 1, J
-                     A( I, J ) = A( I, J ) + X( IX )*TEMP1
-     $                                     + Y( IY )*TEMP2
-                     IX        = IX        + INCX
-                     IY        = IY        + INCY
-   30             CONTINUE
-               END IF
-               JX = JX + INCX
-               JY = JY + INCY
-   40       CONTINUE
-         END IF
-      ELSE
-*
-*        Form  A  when A is stored in the lower triangle.
-*
-         IF( ( INCX.EQ.1 ).AND.( INCY.EQ.1 ) )THEN
-            DO 60, J = 1, N
-               IF( ( X( J ).NE.ZERO ).OR.( Y( J ).NE.ZERO ) )THEN
-                  TEMP1 = ALPHA*Y( J )
-                  TEMP2 = ALPHA*X( J )
-                  DO 50, I = J, N
-                     A( I, J ) = A( I, J ) + X( I )*TEMP1 + Y( I )*TEMP2
-   50             CONTINUE
-               END IF
-   60       CONTINUE
-         ELSE
-            DO 80, J = 1, N
-               IF( ( X( JX ).NE.ZERO ).OR.( Y( JY ).NE.ZERO ) )THEN
-                  TEMP1 = ALPHA*Y( JY )
-                  TEMP2 = ALPHA*X( JX )
-                  IX    = JX
-                  IY    = JY
-                  DO 70, I = J, N
-                     A( I, J ) = A( I, J ) + X( IX )*TEMP1
-     $                                     + Y( IY )*TEMP2
-                     IX        = IX        + INCX
-                     IY        = IY        + INCY
-   70             CONTINUE
-               END IF
-               JX = JX + INCX
-               JY = JY + INCY
-   80       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DSYR2 .
-*
-      END
--- a/libcruft/blas/dsyr2k.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,330 +0,0 @@
-*
-************************************************************************
-*
-      SUBROUTINE DSYR2K( UPLO, TRANS, N, K, ALPHA, A, LDA, B, LDB,
-     $                   BETA, C, LDC )
-*     .. Scalar Arguments ..
-      CHARACTER*1        UPLO, TRANS
-      INTEGER            N, K, LDA, LDB, LDC
-      DOUBLE PRECISION   ALPHA, BETA
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), C( LDC, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DSYR2K  performs one of the symmetric rank 2k operations
-*
-*     C := alpha*A*B' + alpha*B*A' + beta*C,
-*
-*  or
-*
-*     C := alpha*A'*B + alpha*B'*A + beta*C,
-*
-*  where  alpha and beta  are scalars, C is an  n by n  symmetric matrix
-*  and  A and B  are  n by k  matrices  in the  first  case  and  k by n
-*  matrices in the second case.
-*
-*  Parameters
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On  entry,   UPLO  specifies  whether  the  upper  or  lower
-*           triangular  part  of the  array  C  is to be  referenced  as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the  upper triangular part of  C
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the  lower triangular part of  C
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry,  TRANS  specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   C := alpha*A*B' + alpha*B*A' +
-*                                        beta*C.
-*
-*              TRANS = 'T' or 't'   C := alpha*A'*B + alpha*B'*A +
-*                                        beta*C.
-*
-*              TRANS = 'C' or 'c'   C := alpha*A'*B + alpha*B'*A +
-*                                        beta*C.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry,  N specifies the order of the matrix C.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry with  TRANS = 'N' or 'n',  K  specifies  the number
-*           of  columns  of the  matrices  A and B,  and on  entry  with
-*           TRANS = 'T' or 't' or 'C' or 'c',  K  specifies  the  number
-*           of rows of the matrices  A and B.  K must be at least  zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - DOUBLE PRECISION.
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where ka is
-*           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
-*           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
-*           part of the array  A  must contain the matrix  A,  otherwise
-*           the leading  k by n  part of the array  A  must contain  the
-*           matrix A.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
-*           then  LDA must be at least  max( 1, n ), otherwise  LDA must
-*           be at least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  B      - DOUBLE PRECISION array of DIMENSION ( LDB, kb ), where kb is
-*           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
-*           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
-*           part of the array  B  must contain the matrix  B,  otherwise
-*           the leading  k by n  part of the array  B  must contain  the
-*           matrix B.
-*           Unchanged on exit.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
-*           then  LDB must be at least  max( 1, n ), otherwise  LDB must
-*           be at least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  BETA   - DOUBLE PRECISION.
-*           On entry, BETA specifies the scalar beta.
-*           Unchanged on exit.
-*
-*  C      - DOUBLE PRECISION array of DIMENSION ( LDC, n ).
-*           Before entry  with  UPLO = 'U' or 'u',  the leading  n by n
-*           upper triangular part of the array C must contain the upper
-*           triangular part  of the  symmetric matrix  and the strictly
-*           lower triangular part of C is not referenced.  On exit, the
-*           upper triangular part of the array  C is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry  with  UPLO = 'L' or 'l',  the leading  n by n
-*           lower triangular part of the array C must contain the lower
-*           triangular part  of the  symmetric matrix  and the strictly
-*           upper triangular part of C is not referenced.  On exit, the
-*           lower triangular part of the array  C is overwritten by the
-*           lower triangular part of the updated matrix.
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            I, INFO, J, L, NROWA
-      DOUBLE PRECISION   TEMP1, TEMP2
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE         , ZERO
-      PARAMETER        ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      IF( LSAME( TRANS, 'N' ) )THEN
-         NROWA = N
-      ELSE
-         NROWA = K
-      END IF
-      UPPER = LSAME( UPLO, 'U' )
-*
-      INFO = 0
-      IF(      ( .NOT.UPPER               ).AND.
-     $         ( .NOT.LSAME( UPLO , 'L' ) )      )THEN
-         INFO = 1
-      ELSE IF( ( .NOT.LSAME( TRANS, 'N' ) ).AND.
-     $         ( .NOT.LSAME( TRANS, 'T' ) ).AND.
-     $         ( .NOT.LSAME( TRANS, 'C' ) )      )THEN
-         INFO = 2
-      ELSE IF( N  .LT.0               )THEN
-         INFO = 3
-      ELSE IF( K  .LT.0               )THEN
-         INFO = 4
-      ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN
-         INFO = 7
-      ELSE IF( LDB.LT.MAX( 1, NROWA ) )THEN
-         INFO = 9
-      ELSE IF( LDC.LT.MAX( 1, N     ) )THEN
-         INFO = 12
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'DSYR2K', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( ( N.EQ.0 ).OR.
-     $    ( ( ( ALPHA.EQ.ZERO ).OR.( K.EQ.0 ) ).AND.( BETA.EQ.ONE ) ) )
-     $   RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF( ALPHA.EQ.ZERO )THEN
-         IF( UPPER )THEN
-            IF( BETA.EQ.ZERO )THEN
-               DO 20, J = 1, N
-                  DO 10, I = 1, J
-                     C( I, J ) = ZERO
-   10             CONTINUE
-   20          CONTINUE
-            ELSE
-               DO 40, J = 1, N
-                  DO 30, I = 1, J
-                     C( I, J ) = BETA*C( I, J )
-   30             CONTINUE
-   40          CONTINUE
-            END IF
-         ELSE
-            IF( BETA.EQ.ZERO )THEN
-               DO 60, J = 1, N
-                  DO 50, I = J, N
-                     C( I, J ) = ZERO
-   50             CONTINUE
-   60          CONTINUE
-            ELSE
-               DO 80, J = 1, N
-                  DO 70, I = J, N
-                     C( I, J ) = BETA*C( I, J )
-   70             CONTINUE
-   80          CONTINUE
-            END IF
-         END IF
-         RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF( LSAME( TRANS, 'N' ) )THEN
-*
-*        Form  C := alpha*A*B' + alpha*B*A' + C.
-*
-         IF( UPPER )THEN
-            DO 130, J = 1, N
-               IF( BETA.EQ.ZERO )THEN
-                  DO 90, I = 1, J
-                     C( I, J ) = ZERO
-   90             CONTINUE
-               ELSE IF( BETA.NE.ONE )THEN
-                  DO 100, I = 1, J
-                     C( I, J ) = BETA*C( I, J )
-  100             CONTINUE
-               END IF
-               DO 120, L = 1, K
-                  IF( ( A( J, L ).NE.ZERO ).OR.
-     $                ( B( J, L ).NE.ZERO )     )THEN
-                     TEMP1 = ALPHA*B( J, L )
-                     TEMP2 = ALPHA*A( J, L )
-                     DO 110, I = 1, J
-                        C( I, J ) = C( I, J ) +
-     $                              A( I, L )*TEMP1 + B( I, L )*TEMP2
-  110                CONTINUE
-                  END IF
-  120          CONTINUE
-  130       CONTINUE
-         ELSE
-            DO 180, J = 1, N
-               IF( BETA.EQ.ZERO )THEN
-                  DO 140, I = J, N
-                     C( I, J ) = ZERO
-  140             CONTINUE
-               ELSE IF( BETA.NE.ONE )THEN
-                  DO 150, I = J, N
-                     C( I, J ) = BETA*C( I, J )
-  150             CONTINUE
-               END IF
-               DO 170, L = 1, K
-                  IF( ( A( J, L ).NE.ZERO ).OR.
-     $                ( B( J, L ).NE.ZERO )     )THEN
-                     TEMP1 = ALPHA*B( J, L )
-                     TEMP2 = ALPHA*A( J, L )
-                     DO 160, I = J, N
-                        C( I, J ) = C( I, J ) +
-     $                              A( I, L )*TEMP1 + B( I, L )*TEMP2
-  160                CONTINUE
-                  END IF
-  170          CONTINUE
-  180       CONTINUE
-         END IF
-      ELSE
-*
-*        Form  C := alpha*A'*B + alpha*B'*A + C.
-*
-         IF( UPPER )THEN
-            DO 210, J = 1, N
-               DO 200, I = 1, J
-                  TEMP1 = ZERO
-                  TEMP2 = ZERO
-                  DO 190, L = 1, K
-                     TEMP1 = TEMP1 + A( L, I )*B( L, J )
-                     TEMP2 = TEMP2 + B( L, I )*A( L, J )
-  190             CONTINUE
-                  IF( BETA.EQ.ZERO )THEN
-                     C( I, J ) = ALPHA*TEMP1 + ALPHA*TEMP2
-                  ELSE
-                     C( I, J ) = BETA *C( I, J ) +
-     $                           ALPHA*TEMP1 + ALPHA*TEMP2
-                  END IF
-  200          CONTINUE
-  210       CONTINUE
-         ELSE
-            DO 240, J = 1, N
-               DO 230, I = J, N
-                  TEMP1 = ZERO
-                  TEMP2 = ZERO
-                  DO 220, L = 1, K
-                     TEMP1 = TEMP1 + A( L, I )*B( L, J )
-                     TEMP2 = TEMP2 + B( L, I )*A( L, J )
-  220             CONTINUE
-                  IF( BETA.EQ.ZERO )THEN
-                     C( I, J ) = ALPHA*TEMP1 + ALPHA*TEMP2
-                  ELSE
-                     C( I, J ) = BETA *C( I, J ) +
-     $                           ALPHA*TEMP1 + ALPHA*TEMP2
-                  END IF
-  230          CONTINUE
-  240       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DSYR2K.
-*
-      END
--- a/libcruft/blas/dsyrk.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,294 +0,0 @@
-      SUBROUTINE DSYRK ( UPLO, TRANS, N, K, ALPHA, A, LDA,
-     $                   BETA, C, LDC )
-*     .. Scalar Arguments ..
-      CHARACTER*1        UPLO, TRANS
-      INTEGER            N, K, LDA, LDC
-      DOUBLE PRECISION   ALPHA, BETA
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), C( LDC, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DSYRK  performs one of the symmetric rank k operations
-*
-*     C := alpha*A*A' + beta*C,
-*
-*  or
-*
-*     C := alpha*A'*A + beta*C,
-*
-*  where  alpha and beta  are scalars, C is an  n by n  symmetric matrix
-*  and  A  is an  n by k  matrix in the first case and a  k by n  matrix
-*  in the second case.
-*
-*  Parameters
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On  entry,   UPLO  specifies  whether  the  upper  or  lower
-*           triangular  part  of the  array  C  is to be  referenced  as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the  upper triangular part of  C
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the  lower triangular part of  C
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry,  TRANS  specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   C := alpha*A*A' + beta*C.
-*
-*              TRANS = 'T' or 't'   C := alpha*A'*A + beta*C.
-*
-*              TRANS = 'C' or 'c'   C := alpha*A'*A + beta*C.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry,  N specifies the order of the matrix C.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry with  TRANS = 'N' or 'n',  K  specifies  the number
-*           of  columns   of  the   matrix   A,   and  on   entry   with
-*           TRANS = 'T' or 't' or 'C' or 'c',  K  specifies  the  number
-*           of rows of the matrix  A.  K must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - DOUBLE PRECISION.
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where ka is
-*           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
-*           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
-*           part of the array  A  must contain the matrix  A,  otherwise
-*           the leading  k by n  part of the array  A  must contain  the
-*           matrix A.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
-*           then  LDA must be at least  max( 1, n ), otherwise  LDA must
-*           be at least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  BETA   - DOUBLE PRECISION.
-*           On entry, BETA specifies the scalar beta.
-*           Unchanged on exit.
-*
-*  C      - DOUBLE PRECISION array of DIMENSION ( LDC, n ).
-*           Before entry  with  UPLO = 'U' or 'u',  the leading  n by n
-*           upper triangular part of the array C must contain the upper
-*           triangular part  of the  symmetric matrix  and the strictly
-*           lower triangular part of C is not referenced.  On exit, the
-*           upper triangular part of the array  C is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry  with  UPLO = 'L' or 'l',  the leading  n by n
-*           lower triangular part of the array C must contain the lower
-*           triangular part  of the  symmetric matrix  and the strictly
-*           upper triangular part of C is not referenced.  On exit, the
-*           lower triangular part of the array  C is overwritten by the
-*           lower triangular part of the updated matrix.
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            I, INFO, J, L, NROWA
-      DOUBLE PRECISION   TEMP
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE ,         ZERO
-      PARAMETER        ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      IF( LSAME( TRANS, 'N' ) )THEN
-         NROWA = N
-      ELSE
-         NROWA = K
-      END IF
-      UPPER = LSAME( UPLO, 'U' )
-*
-      INFO = 0
-      IF(      ( .NOT.UPPER               ).AND.
-     $         ( .NOT.LSAME( UPLO , 'L' ) )      )THEN
-         INFO = 1
-      ELSE IF( ( .NOT.LSAME( TRANS, 'N' ) ).AND.
-     $         ( .NOT.LSAME( TRANS, 'T' ) ).AND.
-     $         ( .NOT.LSAME( TRANS, 'C' ) )      )THEN
-         INFO = 2
-      ELSE IF( N  .LT.0               )THEN
-         INFO = 3
-      ELSE IF( K  .LT.0               )THEN
-         INFO = 4
-      ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN
-         INFO = 7
-      ELSE IF( LDC.LT.MAX( 1, N     ) )THEN
-         INFO = 10
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'DSYRK ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( ( N.EQ.0 ).OR.
-     $    ( ( ( ALPHA.EQ.ZERO ).OR.( K.EQ.0 ) ).AND.( BETA.EQ.ONE ) ) )
-     $   RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF( ALPHA.EQ.ZERO )THEN
-         IF( UPPER )THEN
-            IF( BETA.EQ.ZERO )THEN
-               DO 20, J = 1, N
-                  DO 10, I = 1, J
-                     C( I, J ) = ZERO
-   10             CONTINUE
-   20          CONTINUE
-            ELSE
-               DO 40, J = 1, N
-                  DO 30, I = 1, J
-                     C( I, J ) = BETA*C( I, J )
-   30             CONTINUE
-   40          CONTINUE
-            END IF
-         ELSE
-            IF( BETA.EQ.ZERO )THEN
-               DO 60, J = 1, N
-                  DO 50, I = J, N
-                     C( I, J ) = ZERO
-   50             CONTINUE
-   60          CONTINUE
-            ELSE
-               DO 80, J = 1, N
-                  DO 70, I = J, N
-                     C( I, J ) = BETA*C( I, J )
-   70             CONTINUE
-   80          CONTINUE
-            END IF
-         END IF
-         RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF( LSAME( TRANS, 'N' ) )THEN
-*
-*        Form  C := alpha*A*A' + beta*C.
-*
-         IF( UPPER )THEN
-            DO 130, J = 1, N
-               IF( BETA.EQ.ZERO )THEN
-                  DO 90, I = 1, J
-                     C( I, J ) = ZERO
-   90             CONTINUE
-               ELSE IF( BETA.NE.ONE )THEN
-                  DO 100, I = 1, J
-                     C( I, J ) = BETA*C( I, J )
-  100             CONTINUE
-               END IF
-               DO 120, L = 1, K
-                  IF( A( J, L ).NE.ZERO )THEN
-                     TEMP = ALPHA*A( J, L )
-                     DO 110, I = 1, J
-                        C( I, J ) = C( I, J ) + TEMP*A( I, L )
-  110                CONTINUE
-                  END IF
-  120          CONTINUE
-  130       CONTINUE
-         ELSE
-            DO 180, J = 1, N
-               IF( BETA.EQ.ZERO )THEN
-                  DO 140, I = J, N
-                     C( I, J ) = ZERO
-  140             CONTINUE
-               ELSE IF( BETA.NE.ONE )THEN
-                  DO 150, I = J, N
-                     C( I, J ) = BETA*C( I, J )
-  150             CONTINUE
-               END IF
-               DO 170, L = 1, K
-                  IF( A( J, L ).NE.ZERO )THEN
-                     TEMP      = ALPHA*A( J, L )
-                     DO 160, I = J, N
-                        C( I, J ) = C( I, J ) + TEMP*A( I, L )
-  160                CONTINUE
-                  END IF
-  170          CONTINUE
-  180       CONTINUE
-         END IF
-      ELSE
-*
-*        Form  C := alpha*A'*A + beta*C.
-*
-         IF( UPPER )THEN
-            DO 210, J = 1, N
-               DO 200, I = 1, J
-                  TEMP = ZERO
-                  DO 190, L = 1, K
-                     TEMP = TEMP + A( L, I )*A( L, J )
-  190             CONTINUE
-                  IF( BETA.EQ.ZERO )THEN
-                     C( I, J ) = ALPHA*TEMP
-                  ELSE
-                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-                  END IF
-  200          CONTINUE
-  210       CONTINUE
-         ELSE
-            DO 240, J = 1, N
-               DO 230, I = J, N
-                  TEMP = ZERO
-                  DO 220, L = 1, K
-                     TEMP = TEMP + A( L, I )*A( L, J )
-  220             CONTINUE
-                  IF( BETA.EQ.ZERO )THEN
-                     C( I, J ) = ALPHA*TEMP
-                  ELSE
-                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-                  END IF
-  230          CONTINUE
-  240       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DSYRK .
-*
-      END
--- a/libcruft/blas/dtbsv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,346 +0,0 @@
-      SUBROUTINE DTBSV ( UPLO, TRANS, DIAG, N, K, A, LDA, X, INCX )
-*     .. Scalar Arguments ..
-      INTEGER            INCX, K, LDA, N
-      CHARACTER*1        DIAG, TRANS, UPLO
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DTBSV  solves one of the systems of equations
-*
-*     A*x = b,   or   A'*x = b,
-*
-*  where b and x are n element vectors and A is an n by n unit, or
-*  non-unit, upper or lower triangular band matrix, with ( k + 1 )
-*  diagonals.
-*
-*  No test for singularity or near-singularity is included in this
-*  routine. Such tests must be performed before calling this routine.
-*
-*  Parameters
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry, TRANS specifies the equations to be solved as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   A*x = b.
-*
-*              TRANS = 'T' or 't'   A'*x = b.
-*
-*              TRANS = 'C' or 'c'   A'*x = b.
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit
-*           triangular as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry with UPLO = 'U' or 'u', K specifies the number of
-*           super-diagonals of the matrix A.
-*           On entry with UPLO = 'L' or 'l', K specifies the number of
-*           sub-diagonals of the matrix A.
-*           K must satisfy  0 .le. K.
-*           Unchanged on exit.
-*
-*  A      - DOUBLE PRECISION array of DIMENSION ( LDA, n ).
-*           Before entry with UPLO = 'U' or 'u', the leading ( k + 1 )
-*           by n part of the array A must contain the upper triangular
-*           band part of the matrix of coefficients, supplied column by
-*           column, with the leading diagonal of the matrix in row
-*           ( k + 1 ) of the array, the first super-diagonal starting at
-*           position 2 in row k, and so on. The top left k by k triangle
-*           of the array A is not referenced.
-*           The following program segment will transfer an upper
-*           triangular band matrix from conventional full matrix storage
-*           to band storage:
-*
-*                 DO 20, J = 1, N
-*                    M = K + 1 - J
-*                    DO 10, I = MAX( 1, J - K ), J
-*                       A( M + I, J ) = matrix( I, J )
-*              10    CONTINUE
-*              20 CONTINUE
-*
-*           Before entry with UPLO = 'L' or 'l', the leading ( k + 1 )
-*           by n part of the array A must contain the lower triangular
-*           band part of the matrix of coefficients, supplied column by
-*           column, with the leading diagonal of the matrix in row 1 of
-*           the array, the first sub-diagonal starting at position 1 in
-*           row 2, and so on. The bottom right k by k triangle of the
-*           array A is not referenced.
-*           The following program segment will transfer a lower
-*           triangular band matrix from conventional full matrix storage
-*           to band storage:
-*
-*                 DO 20, J = 1, N
-*                    M = 1 - J
-*                    DO 10, I = J, MIN( N, J + K )
-*                       A( M + I, J ) = matrix( I, J )
-*              10    CONTINUE
-*              20 CONTINUE
-*
-*           Note that when DIAG = 'U' or 'u' the elements of the array A
-*           corresponding to the diagonal elements of the matrix are not
-*           referenced, but are assumed to be unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           ( k + 1 ).
-*           Unchanged on exit.
-*
-*  X      - DOUBLE PRECISION array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element right-hand side vector b. On exit, X is overwritten
-*           with the solution vector x.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER        ( ZERO = 0.0D+0 )
-*     .. Local Scalars ..
-      DOUBLE PRECISION   TEMP
-      INTEGER            I, INFO, IX, J, JX, KPLUS1, KX, L
-      LOGICAL            NOUNIT
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF     ( .NOT.LSAME( UPLO , 'U' ).AND.
-     $         .NOT.LSAME( UPLO , 'L' )      )THEN
-         INFO = 1
-      ELSE IF( .NOT.LSAME( TRANS, 'N' ).AND.
-     $         .NOT.LSAME( TRANS, 'T' ).AND.
-     $         .NOT.LSAME( TRANS, 'C' )      )THEN
-         INFO = 2
-      ELSE IF( .NOT.LSAME( DIAG , 'U' ).AND.
-     $         .NOT.LSAME( DIAG , 'N' )      )THEN
-         INFO = 3
-      ELSE IF( N.LT.0 )THEN
-         INFO = 4
-      ELSE IF( K.LT.0 )THEN
-         INFO = 5
-      ELSE IF( LDA.LT.( K + 1 ) )THEN
-         INFO = 7
-      ELSE IF( INCX.EQ.0 )THEN
-         INFO = 9
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'DTBSV ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      NOUNIT = LSAME( DIAG, 'N' )
-*
-*     Set up the start point in X if the increment is not unity. This
-*     will be  ( N - 1 )*INCX  too small for descending loops.
-*
-      IF( INCX.LE.0 )THEN
-         KX = 1 - ( N - 1 )*INCX
-      ELSE IF( INCX.NE.1 )THEN
-         KX = 1
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed by sequentially with one pass through A.
-*
-      IF( LSAME( TRANS, 'N' ) )THEN
-*
-*        Form  x := inv( A )*x.
-*
-         IF( LSAME( UPLO, 'U' ) )THEN
-            KPLUS1 = K + 1
-            IF( INCX.EQ.1 )THEN
-               DO 20, J = N, 1, -1
-                  IF( X( J ).NE.ZERO )THEN
-                     L = KPLUS1 - J
-                     IF( NOUNIT )
-     $                  X( J ) = X( J )/A( KPLUS1, J )
-                     TEMP = X( J )
-                     DO 10, I = J - 1, MAX( 1, J - K ), -1
-                        X( I ) = X( I ) - TEMP*A( L + I, J )
-   10                CONTINUE
-                  END IF
-   20          CONTINUE
-            ELSE
-               KX = KX + ( N - 1 )*INCX
-               JX = KX
-               DO 40, J = N, 1, -1
-                  KX = KX - INCX
-                  IF( X( JX ).NE.ZERO )THEN
-                     IX = KX
-                     L  = KPLUS1 - J
-                     IF( NOUNIT )
-     $                  X( JX ) = X( JX )/A( KPLUS1, J )
-                     TEMP = X( JX )
-                     DO 30, I = J - 1, MAX( 1, J - K ), -1
-                        X( IX ) = X( IX ) - TEMP*A( L + I, J )
-                        IX      = IX      - INCX
-   30                CONTINUE
-                  END IF
-                  JX = JX - INCX
-   40          CONTINUE
-            END IF
-         ELSE
-            IF( INCX.EQ.1 )THEN
-               DO 60, J = 1, N
-                  IF( X( J ).NE.ZERO )THEN
-                     L = 1 - J
-                     IF( NOUNIT )
-     $                  X( J ) = X( J )/A( 1, J )
-                     TEMP = X( J )
-                     DO 50, I = J + 1, MIN( N, J + K )
-                        X( I ) = X( I ) - TEMP*A( L + I, J )
-   50                CONTINUE
-                  END IF
-   60          CONTINUE
-            ELSE
-               JX = KX
-               DO 80, J = 1, N
-                  KX = KX + INCX
-                  IF( X( JX ).NE.ZERO )THEN
-                     IX = KX
-                     L  = 1  - J
-                     IF( NOUNIT )
-     $                  X( JX ) = X( JX )/A( 1, J )
-                     TEMP = X( JX )
-                     DO 70, I = J + 1, MIN( N, J + K )
-                        X( IX ) = X( IX ) - TEMP*A( L + I, J )
-                        IX      = IX      + INCX
-   70                CONTINUE
-                  END IF
-                  JX = JX + INCX
-   80          CONTINUE
-            END IF
-         END IF
-      ELSE
-*
-*        Form  x := inv( A')*x.
-*
-         IF( LSAME( UPLO, 'U' ) )THEN
-            KPLUS1 = K + 1
-            IF( INCX.EQ.1 )THEN
-               DO 100, J = 1, N
-                  TEMP = X( J )
-                  L    = KPLUS1 - J
-                  DO 90, I = MAX( 1, J - K ), J - 1
-                     TEMP = TEMP - A( L + I, J )*X( I )
-   90             CONTINUE
-                  IF( NOUNIT )
-     $               TEMP = TEMP/A( KPLUS1, J )
-                  X( J ) = TEMP
-  100          CONTINUE
-            ELSE
-               JX = KX
-               DO 120, J = 1, N
-                  TEMP = X( JX )
-                  IX   = KX
-                  L    = KPLUS1  - J
-                  DO 110, I = MAX( 1, J - K ), J - 1
-                     TEMP = TEMP - A( L + I, J )*X( IX )
-                     IX   = IX   + INCX
-  110             CONTINUE
-                  IF( NOUNIT )
-     $               TEMP = TEMP/A( KPLUS1, J )
-                  X( JX ) = TEMP
-                  JX      = JX   + INCX
-                  IF( J.GT.K )
-     $               KX = KX + INCX
-  120          CONTINUE
-            END IF
-         ELSE
-            IF( INCX.EQ.1 )THEN
-               DO 140, J = N, 1, -1
-                  TEMP = X( J )
-                  L    = 1      - J
-                  DO 130, I = MIN( N, J + K ), J + 1, -1
-                     TEMP = TEMP - A( L + I, J )*X( I )
-  130             CONTINUE
-                  IF( NOUNIT )
-     $               TEMP = TEMP/A( 1, J )
-                  X( J ) = TEMP
-  140          CONTINUE
-            ELSE
-               KX = KX + ( N - 1 )*INCX
-               JX = KX
-               DO 160, J = N, 1, -1
-                  TEMP = X( JX )
-                  IX   = KX
-                  L    = 1       - J
-                  DO 150, I = MIN( N, J + K ), J + 1, -1
-                     TEMP = TEMP - A( L + I, J )*X( IX )
-                     IX   = IX   - INCX
-  150             CONTINUE
-                  IF( NOUNIT )
-     $               TEMP = TEMP/A( 1, J )
-                  X( JX ) = TEMP
-                  JX      = JX   - INCX
-                  IF( ( N - J ).GE.K )
-     $               KX = KX - INCX
-  160          CONTINUE
-            END IF
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DTBSV .
-*
-      END
--- a/libcruft/blas/dtrmm.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,355 +0,0 @@
-      SUBROUTINE DTRMM ( SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA,
-     $                   B, LDB )
-*     .. Scalar Arguments ..
-      CHARACTER*1        SIDE, UPLO, TRANSA, DIAG
-      INTEGER            M, N, LDA, LDB
-      DOUBLE PRECISION   ALPHA
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DTRMM  performs one of the matrix-matrix operations
-*
-*     B := alpha*op( A )*B,   or   B := alpha*B*op( A ),
-*
-*  where  alpha  is a scalar,  B  is an m by n matrix,  A  is a unit, or
-*  non-unit,  upper or lower triangular matrix  and  op( A )  is one  of
-*
-*     op( A ) = A   or   op( A ) = A'.
-*
-*  Parameters
-*  ==========
-*
-*  SIDE   - CHARACTER*1.
-*           On entry,  SIDE specifies whether  op( A ) multiplies B from
-*           the left or right as follows:
-*
-*              SIDE = 'L' or 'l'   B := alpha*op( A )*B.
-*
-*              SIDE = 'R' or 'r'   B := alpha*B*op( A ).
-*
-*           Unchanged on exit.
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix A is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANSA - CHARACTER*1.
-*           On entry, TRANSA specifies the form of op( A ) to be used in
-*           the matrix multiplication as follows:
-*
-*              TRANSA = 'N' or 'n'   op( A ) = A.
-*
-*              TRANSA = 'T' or 't'   op( A ) = A'.
-*
-*              TRANSA = 'C' or 'c'   op( A ) = A'.
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit triangular
-*           as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of B. M must be at
-*           least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of B.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - DOUBLE PRECISION.
-*           On entry,  ALPHA specifies the scalar  alpha. When  alpha is
-*           zero then  A is not referenced and  B need not be set before
-*           entry.
-*           Unchanged on exit.
-*
-*  A      - DOUBLE PRECISION array of DIMENSION ( LDA, k ), where k is m
-*           when  SIDE = 'L' or 'l'  and is  n  when  SIDE = 'R' or 'r'.
-*           Before entry  with  UPLO = 'U' or 'u',  the  leading  k by k
-*           upper triangular part of the array  A must contain the upper
-*           triangular matrix  and the strictly lower triangular part of
-*           A is not referenced.
-*           Before entry  with  UPLO = 'L' or 'l',  the  leading  k by k
-*           lower triangular part of the array  A must contain the lower
-*           triangular matrix  and the strictly upper triangular part of
-*           A is not referenced.
-*           Note that when  DIAG = 'U' or 'u',  the diagonal elements of
-*           A  are not referenced either,  but are assumed to be  unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program.  When  SIDE = 'L' or 'l'  then
-*           LDA  must be at least  max( 1, m ),  when  SIDE = 'R' or 'r'
-*           then LDA must be at least max( 1, n ).
-*           Unchanged on exit.
-*
-*  B      - DOUBLE PRECISION array of DIMENSION ( LDB, n ).
-*           Before entry,  the leading  m by n part of the array  B must
-*           contain the matrix  B,  and  on exit  is overwritten  by the
-*           transformed matrix.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in  the  calling  (sub)  program.   LDB  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     .. Local Scalars ..
-      LOGICAL            LSIDE, NOUNIT, UPPER
-      INTEGER            I, INFO, J, K, NROWA
-      DOUBLE PRECISION   TEMP
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE         , ZERO
-      PARAMETER        ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      LSIDE  = LSAME( SIDE  , 'L' )
-      IF( LSIDE )THEN
-         NROWA = M
-      ELSE
-         NROWA = N
-      END IF
-      NOUNIT = LSAME( DIAG  , 'N' )
-      UPPER  = LSAME( UPLO  , 'U' )
-*
-      INFO   = 0
-      IF(      ( .NOT.LSIDE                ).AND.
-     $         ( .NOT.LSAME( SIDE  , 'R' ) )      )THEN
-         INFO = 1
-      ELSE IF( ( .NOT.UPPER                ).AND.
-     $         ( .NOT.LSAME( UPLO  , 'L' ) )      )THEN
-         INFO = 2
-      ELSE IF( ( .NOT.LSAME( TRANSA, 'N' ) ).AND.
-     $         ( .NOT.LSAME( TRANSA, 'T' ) ).AND.
-     $         ( .NOT.LSAME( TRANSA, 'C' ) )      )THEN
-         INFO = 3
-      ELSE IF( ( .NOT.LSAME( DIAG  , 'U' ) ).AND.
-     $         ( .NOT.LSAME( DIAG  , 'N' ) )      )THEN
-         INFO = 4
-      ELSE IF( M  .LT.0               )THEN
-         INFO = 5
-      ELSE IF( N  .LT.0               )THEN
-         INFO = 6
-      ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN
-         INFO = 9
-      ELSE IF( LDB.LT.MAX( 1, M     ) )THEN
-         INFO = 11
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'DTRMM ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF( ALPHA.EQ.ZERO )THEN
-         DO 20, J = 1, N
-            DO 10, I = 1, M
-               B( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-         RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF( LSIDE )THEN
-         IF( LSAME( TRANSA, 'N' ) )THEN
-*
-*           Form  B := alpha*A*B.
-*
-            IF( UPPER )THEN
-               DO 50, J = 1, N
-                  DO 40, K = 1, M
-                     IF( B( K, J ).NE.ZERO )THEN
-                        TEMP = ALPHA*B( K, J )
-                        DO 30, I = 1, K - 1
-                           B( I, J ) = B( I, J ) + TEMP*A( I, K )
-   30                   CONTINUE
-                        IF( NOUNIT )
-     $                     TEMP = TEMP*A( K, K )
-                        B( K, J ) = TEMP
-                     END IF
-   40             CONTINUE
-   50          CONTINUE
-            ELSE
-               DO 80, J = 1, N
-                  DO 70 K = M, 1, -1
-                     IF( B( K, J ).NE.ZERO )THEN
-                        TEMP      = ALPHA*B( K, J )
-                        B( K, J ) = TEMP
-                        IF( NOUNIT )
-     $                     B( K, J ) = B( K, J )*A( K, K )
-                        DO 60, I = K + 1, M
-                           B( I, J ) = B( I, J ) + TEMP*A( I, K )
-   60                   CONTINUE
-                     END IF
-   70             CONTINUE
-   80          CONTINUE
-            END IF
-         ELSE
-*
-*           Form  B := alpha*A'*B.
-*
-            IF( UPPER )THEN
-               DO 110, J = 1, N
-                  DO 100, I = M, 1, -1
-                     TEMP = B( I, J )
-                     IF( NOUNIT )
-     $                  TEMP = TEMP*A( I, I )
-                     DO 90, K = 1, I - 1
-                        TEMP = TEMP + A( K, I )*B( K, J )
-   90                CONTINUE
-                     B( I, J ) = ALPHA*TEMP
-  100             CONTINUE
-  110          CONTINUE
-            ELSE
-               DO 140, J = 1, N
-                  DO 130, I = 1, M
-                     TEMP = B( I, J )
-                     IF( NOUNIT )
-     $                  TEMP = TEMP*A( I, I )
-                     DO 120, K = I + 1, M
-                        TEMP = TEMP + A( K, I )*B( K, J )
-  120                CONTINUE
-                     B( I, J ) = ALPHA*TEMP
-  130             CONTINUE
-  140          CONTINUE
-            END IF
-         END IF
-      ELSE
-         IF( LSAME( TRANSA, 'N' ) )THEN
-*
-*           Form  B := alpha*B*A.
-*
-            IF( UPPER )THEN
-               DO 180, J = N, 1, -1
-                  TEMP = ALPHA
-                  IF( NOUNIT )
-     $               TEMP = TEMP*A( J, J )
-                  DO 150, I = 1, M
-                     B( I, J ) = TEMP*B( I, J )
-  150             CONTINUE
-                  DO 170, K = 1, J - 1
-                     IF( A( K, J ).NE.ZERO )THEN
-                        TEMP = ALPHA*A( K, J )
-                        DO 160, I = 1, M
-                           B( I, J ) = B( I, J ) + TEMP*B( I, K )
-  160                   CONTINUE
-                     END IF
-  170             CONTINUE
-  180          CONTINUE
-            ELSE
-               DO 220, J = 1, N
-                  TEMP = ALPHA
-                  IF( NOUNIT )
-     $               TEMP = TEMP*A( J, J )
-                  DO 190, I = 1, M
-                     B( I, J ) = TEMP*B( I, J )
-  190             CONTINUE
-                  DO 210, K = J + 1, N
-                     IF( A( K, J ).NE.ZERO )THEN
-                        TEMP = ALPHA*A( K, J )
-                        DO 200, I = 1, M
-                           B( I, J ) = B( I, J ) + TEMP*B( I, K )
-  200                   CONTINUE
-                     END IF
-  210             CONTINUE
-  220          CONTINUE
-            END IF
-         ELSE
-*
-*           Form  B := alpha*B*A'.
-*
-            IF( UPPER )THEN
-               DO 260, K = 1, N
-                  DO 240, J = 1, K - 1
-                     IF( A( J, K ).NE.ZERO )THEN
-                        TEMP = ALPHA*A( J, K )
-                        DO 230, I = 1, M
-                           B( I, J ) = B( I, J ) + TEMP*B( I, K )
-  230                   CONTINUE
-                     END IF
-  240             CONTINUE
-                  TEMP = ALPHA
-                  IF( NOUNIT )
-     $               TEMP = TEMP*A( K, K )
-                  IF( TEMP.NE.ONE )THEN
-                     DO 250, I = 1, M
-                        B( I, K ) = TEMP*B( I, K )
-  250                CONTINUE
-                  END IF
-  260          CONTINUE
-            ELSE
-               DO 300, K = N, 1, -1
-                  DO 280, J = K + 1, N
-                     IF( A( J, K ).NE.ZERO )THEN
-                        TEMP = ALPHA*A( J, K )
-                        DO 270, I = 1, M
-                           B( I, J ) = B( I, J ) + TEMP*B( I, K )
-  270                   CONTINUE
-                     END IF
-  280             CONTINUE
-                  TEMP = ALPHA
-                  IF( NOUNIT )
-     $               TEMP = TEMP*A( K, K )
-                  IF( TEMP.NE.ONE )THEN
-                     DO 290, I = 1, M
-                        B( I, K ) = TEMP*B( I, K )
-  290                CONTINUE
-                  END IF
-  300          CONTINUE
-            END IF
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DTRMM .
-*
-      END
--- a/libcruft/blas/dtrmv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,286 +0,0 @@
-      SUBROUTINE DTRMV ( UPLO, TRANS, DIAG, N, A, LDA, X, INCX )
-*     .. Scalar Arguments ..
-      INTEGER            INCX, LDA, N
-      CHARACTER*1        DIAG, TRANS, UPLO
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DTRMV  performs one of the matrix-vector operations
-*
-*     x := A*x,   or   x := A'*x,
-*
-*  where x is an n element vector and  A is an n by n unit, or non-unit,
-*  upper or lower triangular matrix.
-*
-*  Parameters
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry, TRANS specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   x := A*x.
-*
-*              TRANS = 'T' or 't'   x := A'*x.
-*
-*              TRANS = 'C' or 'c'   x := A'*x.
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit
-*           triangular as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  A      - DOUBLE PRECISION array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular matrix and the strictly lower triangular part of
-*           A is not referenced.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular matrix and the strictly upper triangular part of
-*           A is not referenced.
-*           Note that when  DIAG = 'U' or 'u', the diagonal elements of
-*           A are not referenced either, but are assumed to be unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*  X      - DOUBLE PRECISION array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element vector x. On exit, X is overwritten with the
-*           tranformed vector x.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER        ( ZERO = 0.0D+0 )
-*     .. Local Scalars ..
-      DOUBLE PRECISION   TEMP
-      INTEGER            I, INFO, IX, J, JX, KX
-      LOGICAL            NOUNIT
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF     ( .NOT.LSAME( UPLO , 'U' ).AND.
-     $         .NOT.LSAME( UPLO , 'L' )      )THEN
-         INFO = 1
-      ELSE IF( .NOT.LSAME( TRANS, 'N' ).AND.
-     $         .NOT.LSAME( TRANS, 'T' ).AND.
-     $         .NOT.LSAME( TRANS, 'C' )      )THEN
-         INFO = 2
-      ELSE IF( .NOT.LSAME( DIAG , 'U' ).AND.
-     $         .NOT.LSAME( DIAG , 'N' )      )THEN
-         INFO = 3
-      ELSE IF( N.LT.0 )THEN
-         INFO = 4
-      ELSE IF( LDA.LT.MAX( 1, N ) )THEN
-         INFO = 6
-      ELSE IF( INCX.EQ.0 )THEN
-         INFO = 8
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'DTRMV ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      NOUNIT = LSAME( DIAG, 'N' )
-*
-*     Set up the start point in X if the increment is not unity. This
-*     will be  ( N - 1 )*INCX  too small for descending loops.
-*
-      IF( INCX.LE.0 )THEN
-         KX = 1 - ( N - 1 )*INCX
-      ELSE IF( INCX.NE.1 )THEN
-         KX = 1
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-      IF( LSAME( TRANS, 'N' ) )THEN
-*
-*        Form  x := A*x.
-*
-         IF( LSAME( UPLO, 'U' ) )THEN
-            IF( INCX.EQ.1 )THEN
-               DO 20, J = 1, N
-                  IF( X( J ).NE.ZERO )THEN
-                     TEMP = X( J )
-                     DO 10, I = 1, J - 1
-                        X( I ) = X( I ) + TEMP*A( I, J )
-   10                CONTINUE
-                     IF( NOUNIT )
-     $                  X( J ) = X( J )*A( J, J )
-                  END IF
-   20          CONTINUE
-            ELSE
-               JX = KX
-               DO 40, J = 1, N
-                  IF( X( JX ).NE.ZERO )THEN
-                     TEMP = X( JX )
-                     IX   = KX
-                     DO 30, I = 1, J - 1
-                        X( IX ) = X( IX ) + TEMP*A( I, J )
-                        IX      = IX      + INCX
-   30                CONTINUE
-                     IF( NOUNIT )
-     $                  X( JX ) = X( JX )*A( J, J )
-                  END IF
-                  JX = JX + INCX
-   40          CONTINUE
-            END IF
-         ELSE
-            IF( INCX.EQ.1 )THEN
-               DO 60, J = N, 1, -1
-                  IF( X( J ).NE.ZERO )THEN
-                     TEMP = X( J )
-                     DO 50, I = N, J + 1, -1
-                        X( I ) = X( I ) + TEMP*A( I, J )
-   50                CONTINUE
-                     IF( NOUNIT )
-     $                  X( J ) = X( J )*A( J, J )
-                  END IF
-   60          CONTINUE
-            ELSE
-               KX = KX + ( N - 1 )*INCX
-               JX = KX
-               DO 80, J = N, 1, -1
-                  IF( X( JX ).NE.ZERO )THEN
-                     TEMP = X( JX )
-                     IX   = KX
-                     DO 70, I = N, J + 1, -1
-                        X( IX ) = X( IX ) + TEMP*A( I, J )
-                        IX      = IX      - INCX
-   70                CONTINUE
-                     IF( NOUNIT )
-     $                  X( JX ) = X( JX )*A( J, J )
-                  END IF
-                  JX = JX - INCX
-   80          CONTINUE
-            END IF
-         END IF
-      ELSE
-*
-*        Form  x := A'*x.
-*
-         IF( LSAME( UPLO, 'U' ) )THEN
-            IF( INCX.EQ.1 )THEN
-               DO 100, J = N, 1, -1
-                  TEMP = X( J )
-                  IF( NOUNIT )
-     $               TEMP = TEMP*A( J, J )
-                  DO 90, I = J - 1, 1, -1
-                     TEMP = TEMP + A( I, J )*X( I )
-   90             CONTINUE
-                  X( J ) = TEMP
-  100          CONTINUE
-            ELSE
-               JX = KX + ( N - 1 )*INCX
-               DO 120, J = N, 1, -1
-                  TEMP = X( JX )
-                  IX   = JX
-                  IF( NOUNIT )
-     $               TEMP = TEMP*A( J, J )
-                  DO 110, I = J - 1, 1, -1
-                     IX   = IX   - INCX
-                     TEMP = TEMP + A( I, J )*X( IX )
-  110             CONTINUE
-                  X( JX ) = TEMP
-                  JX      = JX   - INCX
-  120          CONTINUE
-            END IF
-         ELSE
-            IF( INCX.EQ.1 )THEN
-               DO 140, J = 1, N
-                  TEMP = X( J )
-                  IF( NOUNIT )
-     $               TEMP = TEMP*A( J, J )
-                  DO 130, I = J + 1, N
-                     TEMP = TEMP + A( I, J )*X( I )
-  130             CONTINUE
-                  X( J ) = TEMP
-  140          CONTINUE
-            ELSE
-               JX = KX
-               DO 160, J = 1, N
-                  TEMP = X( JX )
-                  IX   = JX
-                  IF( NOUNIT )
-     $               TEMP = TEMP*A( J, J )
-                  DO 150, I = J + 1, N
-                     IX   = IX   + INCX
-                     TEMP = TEMP + A( I, J )*X( IX )
-  150             CONTINUE
-                  X( JX ) = TEMP
-                  JX      = JX   + INCX
-  160          CONTINUE
-            END IF
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DTRMV .
-*
-      END
--- a/libcruft/blas/dtrsm.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,378 +0,0 @@
-      SUBROUTINE DTRSM ( SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA,
-     $                   B, LDB )
-*     .. Scalar Arguments ..
-      CHARACTER*1        SIDE, UPLO, TRANSA, DIAG
-      INTEGER            M, N, LDA, LDB
-      DOUBLE PRECISION   ALPHA
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DTRSM  solves one of the matrix equations
-*
-*     op( A )*X = alpha*B,   or   X*op( A ) = alpha*B,
-*
-*  where alpha is a scalar, X and B are m by n matrices, A is a unit, or
-*  non-unit,  upper or lower triangular matrix  and  op( A )  is one  of
-*
-*     op( A ) = A   or   op( A ) = A'.
-*
-*  The matrix X is overwritten on B.
-*
-*  Parameters
-*  ==========
-*
-*  SIDE   - CHARACTER*1.
-*           On entry, SIDE specifies whether op( A ) appears on the left
-*           or right of X as follows:
-*
-*              SIDE = 'L' or 'l'   op( A )*X = alpha*B.
-*
-*              SIDE = 'R' or 'r'   X*op( A ) = alpha*B.
-*
-*           Unchanged on exit.
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix A is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANSA - CHARACTER*1.
-*           On entry, TRANSA specifies the form of op( A ) to be used in
-*           the matrix multiplication as follows:
-*
-*              TRANSA = 'N' or 'n'   op( A ) = A.
-*
-*              TRANSA = 'T' or 't'   op( A ) = A'.
-*
-*              TRANSA = 'C' or 'c'   op( A ) = A'.
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit triangular
-*           as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of B. M must be at
-*           least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of B.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - DOUBLE PRECISION.
-*           On entry,  ALPHA specifies the scalar  alpha. When  alpha is
-*           zero then  A is not referenced and  B need not be set before
-*           entry.
-*           Unchanged on exit.
-*
-*  A      - DOUBLE PRECISION array of DIMENSION ( LDA, k ), where k is m
-*           when  SIDE = 'L' or 'l'  and is  n  when  SIDE = 'R' or 'r'.
-*           Before entry  with  UPLO = 'U' or 'u',  the  leading  k by k
-*           upper triangular part of the array  A must contain the upper
-*           triangular matrix  and the strictly lower triangular part of
-*           A is not referenced.
-*           Before entry  with  UPLO = 'L' or 'l',  the  leading  k by k
-*           lower triangular part of the array  A must contain the lower
-*           triangular matrix  and the strictly upper triangular part of
-*           A is not referenced.
-*           Note that when  DIAG = 'U' or 'u',  the diagonal elements of
-*           A  are not referenced either,  but are assumed to be  unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program.  When  SIDE = 'L' or 'l'  then
-*           LDA  must be at least  max( 1, m ),  when  SIDE = 'R' or 'r'
-*           then LDA must be at least max( 1, n ).
-*           Unchanged on exit.
-*
-*  B      - DOUBLE PRECISION array of DIMENSION ( LDB, n ).
-*           Before entry,  the leading  m by n part of the array  B must
-*           contain  the  right-hand  side  matrix  B,  and  on exit  is
-*           overwritten by the solution matrix  X.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in  the  calling  (sub)  program.   LDB  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     .. Local Scalars ..
-      LOGICAL            LSIDE, NOUNIT, UPPER
-      INTEGER            I, INFO, J, K, NROWA
-      DOUBLE PRECISION   TEMP
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE         , ZERO
-      PARAMETER        ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      LSIDE  = LSAME( SIDE  , 'L' )
-      IF( LSIDE )THEN
-         NROWA = M
-      ELSE
-         NROWA = N
-      END IF
-      NOUNIT = LSAME( DIAG  , 'N' )
-      UPPER  = LSAME( UPLO  , 'U' )
-*
-      INFO   = 0
-      IF(      ( .NOT.LSIDE                ).AND.
-     $         ( .NOT.LSAME( SIDE  , 'R' ) )      )THEN
-         INFO = 1
-      ELSE IF( ( .NOT.UPPER                ).AND.
-     $         ( .NOT.LSAME( UPLO  , 'L' ) )      )THEN
-         INFO = 2
-      ELSE IF( ( .NOT.LSAME( TRANSA, 'N' ) ).AND.
-     $         ( .NOT.LSAME( TRANSA, 'T' ) ).AND.
-     $         ( .NOT.LSAME( TRANSA, 'C' ) )      )THEN
-         INFO = 3
-      ELSE IF( ( .NOT.LSAME( DIAG  , 'U' ) ).AND.
-     $         ( .NOT.LSAME( DIAG  , 'N' ) )      )THEN
-         INFO = 4
-      ELSE IF( M  .LT.0               )THEN
-         INFO = 5
-      ELSE IF( N  .LT.0               )THEN
-         INFO = 6
-      ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN
-         INFO = 9
-      ELSE IF( LDB.LT.MAX( 1, M     ) )THEN
-         INFO = 11
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'DTRSM ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF( ALPHA.EQ.ZERO )THEN
-         DO 20, J = 1, N
-            DO 10, I = 1, M
-               B( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-         RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF( LSIDE )THEN
-         IF( LSAME( TRANSA, 'N' ) )THEN
-*
-*           Form  B := alpha*inv( A )*B.
-*
-            IF( UPPER )THEN
-               DO 60, J = 1, N
-                  IF( ALPHA.NE.ONE )THEN
-                     DO 30, I = 1, M
-                        B( I, J ) = ALPHA*B( I, J )
-   30                CONTINUE
-                  END IF
-                  DO 50, K = M, 1, -1
-                     IF( B( K, J ).NE.ZERO )THEN
-                        IF( NOUNIT )
-     $                     B( K, J ) = B( K, J )/A( K, K )
-                        DO 40, I = 1, K - 1
-                           B( I, J ) = B( I, J ) - B( K, J )*A( I, K )
-   40                   CONTINUE
-                     END IF
-   50             CONTINUE
-   60          CONTINUE
-            ELSE
-               DO 100, J = 1, N
-                  IF( ALPHA.NE.ONE )THEN
-                     DO 70, I = 1, M
-                        B( I, J ) = ALPHA*B( I, J )
-   70                CONTINUE
-                  END IF
-                  DO 90 K = 1, M
-                     IF( B( K, J ).NE.ZERO )THEN
-                        IF( NOUNIT )
-     $                     B( K, J ) = B( K, J )/A( K, K )
-                        DO 80, I = K + 1, M
-                           B( I, J ) = B( I, J ) - B( K, J )*A( I, K )
-   80                   CONTINUE
-                     END IF
-   90             CONTINUE
-  100          CONTINUE
-            END IF
-         ELSE
-*
-*           Form  B := alpha*inv( A' )*B.
-*
-            IF( UPPER )THEN
-               DO 130, J = 1, N
-                  DO 120, I = 1, M
-                     TEMP = ALPHA*B( I, J )
-                     DO 110, K = 1, I - 1
-                        TEMP = TEMP - A( K, I )*B( K, J )
-  110                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/A( I, I )
-                     B( I, J ) = TEMP
-  120             CONTINUE
-  130          CONTINUE
-            ELSE
-               DO 160, J = 1, N
-                  DO 150, I = M, 1, -1
-                     TEMP = ALPHA*B( I, J )
-                     DO 140, K = I + 1, M
-                        TEMP = TEMP - A( K, I )*B( K, J )
-  140                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/A( I, I )
-                     B( I, J ) = TEMP
-  150             CONTINUE
-  160          CONTINUE
-            END IF
-         END IF
-      ELSE
-         IF( LSAME( TRANSA, 'N' ) )THEN
-*
-*           Form  B := alpha*B*inv( A ).
-*
-            IF( UPPER )THEN
-               DO 210, J = 1, N
-                  IF( ALPHA.NE.ONE )THEN
-                     DO 170, I = 1, M
-                        B( I, J ) = ALPHA*B( I, J )
-  170                CONTINUE
-                  END IF
-                  DO 190, K = 1, J - 1
-                     IF( A( K, J ).NE.ZERO )THEN
-                        DO 180, I = 1, M
-                           B( I, J ) = B( I, J ) - A( K, J )*B( I, K )
-  180                   CONTINUE
-                     END IF
-  190             CONTINUE
-                  IF( NOUNIT )THEN
-                     TEMP = ONE/A( J, J )
-                     DO 200, I = 1, M
-                        B( I, J ) = TEMP*B( I, J )
-  200                CONTINUE
-                  END IF
-  210          CONTINUE
-            ELSE
-               DO 260, J = N, 1, -1
-                  IF( ALPHA.NE.ONE )THEN
-                     DO 220, I = 1, M
-                        B( I, J ) = ALPHA*B( I, J )
-  220                CONTINUE
-                  END IF
-                  DO 240, K = J + 1, N
-                     IF( A( K, J ).NE.ZERO )THEN
-                        DO 230, I = 1, M
-                           B( I, J ) = B( I, J ) - A( K, J )*B( I, K )
-  230                   CONTINUE
-                     END IF
-  240             CONTINUE
-                  IF( NOUNIT )THEN
-                     TEMP = ONE/A( J, J )
-                     DO 250, I = 1, M
-                       B( I, J ) = TEMP*B( I, J )
-  250                CONTINUE
-                  END IF
-  260          CONTINUE
-            END IF
-         ELSE
-*
-*           Form  B := alpha*B*inv( A' ).
-*
-            IF( UPPER )THEN
-               DO 310, K = N, 1, -1
-                  IF( NOUNIT )THEN
-                     TEMP = ONE/A( K, K )
-                     DO 270, I = 1, M
-                        B( I, K ) = TEMP*B( I, K )
-  270                CONTINUE
-                  END IF
-                  DO 290, J = 1, K - 1
-                     IF( A( J, K ).NE.ZERO )THEN
-                        TEMP = A( J, K )
-                        DO 280, I = 1, M
-                           B( I, J ) = B( I, J ) - TEMP*B( I, K )
-  280                   CONTINUE
-                     END IF
-  290             CONTINUE
-                  IF( ALPHA.NE.ONE )THEN
-                     DO 300, I = 1, M
-                        B( I, K ) = ALPHA*B( I, K )
-  300                CONTINUE
-                  END IF
-  310          CONTINUE
-            ELSE
-               DO 360, K = 1, N
-                  IF( NOUNIT )THEN
-                     TEMP = ONE/A( K, K )
-                     DO 320, I = 1, M
-                        B( I, K ) = TEMP*B( I, K )
-  320                CONTINUE
-                  END IF
-                  DO 340, J = K + 1, N
-                     IF( A( J, K ).NE.ZERO )THEN
-                        TEMP = A( J, K )
-                        DO 330, I = 1, M
-                           B( I, J ) = B( I, J ) - TEMP*B( I, K )
-  330                   CONTINUE
-                     END IF
-  340             CONTINUE
-                  IF( ALPHA.NE.ONE )THEN
-                     DO 350, I = 1, M
-                        B( I, K ) = ALPHA*B( I, K )
-  350                CONTINUE
-                  END IF
-  360          CONTINUE
-            END IF
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DTRSM .
-*
-      END
--- a/libcruft/blas/dtrsv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,289 +0,0 @@
-      SUBROUTINE DTRSV ( UPLO, TRANS, DIAG, N, A, LDA, X, INCX )
-*     .. Scalar Arguments ..
-      INTEGER            INCX, LDA, N
-      CHARACTER*1        DIAG, TRANS, UPLO
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DTRSV  solves one of the systems of equations
-*
-*     A*x = b,   or   A'*x = b,
-*
-*  where b and x are n element vectors and A is an n by n unit, or
-*  non-unit, upper or lower triangular matrix.
-*
-*  No test for singularity or near-singularity is included in this
-*  routine. Such tests must be performed before calling this routine.
-*
-*  Parameters
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry, TRANS specifies the equations to be solved as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   A*x = b.
-*
-*              TRANS = 'T' or 't'   A'*x = b.
-*
-*              TRANS = 'C' or 'c'   A'*x = b.
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit
-*           triangular as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  A      - DOUBLE PRECISION array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular matrix and the strictly lower triangular part of
-*           A is not referenced.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular matrix and the strictly upper triangular part of
-*           A is not referenced.
-*           Note that when  DIAG = 'U' or 'u', the diagonal elements of
-*           A are not referenced either, but are assumed to be unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*  X      - DOUBLE PRECISION array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element right-hand side vector b. On exit, X is overwritten
-*           with the solution vector x.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER        ( ZERO = 0.0D+0 )
-*     .. Local Scalars ..
-      DOUBLE PRECISION   TEMP
-      INTEGER            I, INFO, IX, J, JX, KX
-      LOGICAL            NOUNIT
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF     ( .NOT.LSAME( UPLO , 'U' ).AND.
-     $         .NOT.LSAME( UPLO , 'L' )      )THEN
-         INFO = 1
-      ELSE IF( .NOT.LSAME( TRANS, 'N' ).AND.
-     $         .NOT.LSAME( TRANS, 'T' ).AND.
-     $         .NOT.LSAME( TRANS, 'C' )      )THEN
-         INFO = 2
-      ELSE IF( .NOT.LSAME( DIAG , 'U' ).AND.
-     $         .NOT.LSAME( DIAG , 'N' )      )THEN
-         INFO = 3
-      ELSE IF( N.LT.0 )THEN
-         INFO = 4
-      ELSE IF( LDA.LT.MAX( 1, N ) )THEN
-         INFO = 6
-      ELSE IF( INCX.EQ.0 )THEN
-         INFO = 8
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'DTRSV ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      NOUNIT = LSAME( DIAG, 'N' )
-*
-*     Set up the start point in X if the increment is not unity. This
-*     will be  ( N - 1 )*INCX  too small for descending loops.
-*
-      IF( INCX.LE.0 )THEN
-         KX = 1 - ( N - 1 )*INCX
-      ELSE IF( INCX.NE.1 )THEN
-         KX = 1
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-      IF( LSAME( TRANS, 'N' ) )THEN
-*
-*        Form  x := inv( A )*x.
-*
-         IF( LSAME( UPLO, 'U' ) )THEN
-            IF( INCX.EQ.1 )THEN
-               DO 20, J = N, 1, -1
-                  IF( X( J ).NE.ZERO )THEN
-                     IF( NOUNIT )
-     $                  X( J ) = X( J )/A( J, J )
-                     TEMP = X( J )
-                     DO 10, I = J - 1, 1, -1
-                        X( I ) = X( I ) - TEMP*A( I, J )
-   10                CONTINUE
-                  END IF
-   20          CONTINUE
-            ELSE
-               JX = KX + ( N - 1 )*INCX
-               DO 40, J = N, 1, -1
-                  IF( X( JX ).NE.ZERO )THEN
-                     IF( NOUNIT )
-     $                  X( JX ) = X( JX )/A( J, J )
-                     TEMP = X( JX )
-                     IX   = JX
-                     DO 30, I = J - 1, 1, -1
-                        IX      = IX      - INCX
-                        X( IX ) = X( IX ) - TEMP*A( I, J )
-   30                CONTINUE
-                  END IF
-                  JX = JX - INCX
-   40          CONTINUE
-            END IF
-         ELSE
-            IF( INCX.EQ.1 )THEN
-               DO 60, J = 1, N
-                  IF( X( J ).NE.ZERO )THEN
-                     IF( NOUNIT )
-     $                  X( J ) = X( J )/A( J, J )
-                     TEMP = X( J )
-                     DO 50, I = J + 1, N
-                        X( I ) = X( I ) - TEMP*A( I, J )
-   50                CONTINUE
-                  END IF
-   60          CONTINUE
-            ELSE
-               JX = KX
-               DO 80, J = 1, N
-                  IF( X( JX ).NE.ZERO )THEN
-                     IF( NOUNIT )
-     $                  X( JX ) = X( JX )/A( J, J )
-                     TEMP = X( JX )
-                     IX   = JX
-                     DO 70, I = J + 1, N
-                        IX      = IX      + INCX
-                        X( IX ) = X( IX ) - TEMP*A( I, J )
-   70                CONTINUE
-                  END IF
-                  JX = JX + INCX
-   80          CONTINUE
-            END IF
-         END IF
-      ELSE
-*
-*        Form  x := inv( A' )*x.
-*
-         IF( LSAME( UPLO, 'U' ) )THEN
-            IF( INCX.EQ.1 )THEN
-               DO 100, J = 1, N
-                  TEMP = X( J )
-                  DO 90, I = 1, J - 1
-                     TEMP = TEMP - A( I, J )*X( I )
-   90             CONTINUE
-                  IF( NOUNIT )
-     $               TEMP = TEMP/A( J, J )
-                  X( J ) = TEMP
-  100          CONTINUE
-            ELSE
-               JX = KX
-               DO 120, J = 1, N
-                  TEMP = X( JX )
-                  IX   = KX
-                  DO 110, I = 1, J - 1
-                     TEMP = TEMP - A( I, J )*X( IX )
-                     IX   = IX   + INCX
-  110             CONTINUE
-                  IF( NOUNIT )
-     $               TEMP = TEMP/A( J, J )
-                  X( JX ) = TEMP
-                  JX      = JX   + INCX
-  120          CONTINUE
-            END IF
-         ELSE
-            IF( INCX.EQ.1 )THEN
-               DO 140, J = N, 1, -1
-                  TEMP = X( J )
-                  DO 130, I = N, J + 1, -1
-                     TEMP = TEMP - A( I, J )*X( I )
-  130             CONTINUE
-                  IF( NOUNIT )
-     $               TEMP = TEMP/A( J, J )
-                  X( J ) = TEMP
-  140          CONTINUE
-            ELSE
-               KX = KX + ( N - 1 )*INCX
-               JX = KX
-               DO 160, J = N, 1, -1
-                  TEMP = X( JX )
-                  IX   = KX
-                  DO 150, I = N, J + 1, -1
-                     TEMP = TEMP - A( I, J )*X( IX )
-                     IX   = IX   - INCX
-  150             CONTINUE
-                  IF( NOUNIT )
-     $               TEMP = TEMP/A( J, J )
-                  X( JX ) = TEMP
-                  JX      = JX   - INCX
-  160          CONTINUE
-            END IF
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DTRSV .
-*
-      END
--- a/libcruft/blas/dzasum.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-      double precision function dzasum(n,zx,incx)
-c
-c     takes the sum of the absolute values.
-c     jack dongarra, 3/11/78.
-c     modified 3/93 to return if incx .le. 0.
-c     modified 12/3/93, array(1) declarations changed to array(*)
-c
-      double complex zx(*)
-      double precision stemp,dcabs1
-      integer i,incx,ix,n
-c
-      dzasum = 0.0d0
-      stemp = 0.0d0
-      if( n.le.0 .or. incx.le.0 )return
-      if(incx.eq.1)go to 20
-c
-c        code for increment not equal to 1
-c
-      ix = 1
-      do 10 i = 1,n
-        stemp = stemp + dcabs1(zx(ix))
-        ix = ix + incx
-   10 continue
-      dzasum = stemp
-      return
-c
-c        code for increment equal to 1
-c
-   20 do 30 i = 1,n
-        stemp = stemp + dcabs1(zx(i))
-   30 continue
-      dzasum = stemp
-      return
-      end
--- a/libcruft/blas/dznrm2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-      DOUBLE PRECISION FUNCTION DZNRM2( N, X, INCX )
-*     .. Scalar Arguments ..
-      INTEGER                           INCX, N
-*     .. Array Arguments ..
-      COMPLEX*16                        X( * )
-*     ..
-*
-*  DZNRM2 returns the euclidean norm of a vector via the function
-*  name, so that
-*
-*     DZNRM2 := sqrt( conjg( x' )*x )
-*
-*
-*
-*  -- This version written on 25-October-1982.
-*     Modified on 14-October-1993 to inline the call to ZLASSQ.
-*     Sven Hammarling, Nag Ltd.
-*
-*
-*     .. Parameters ..
-      DOUBLE PRECISION      ONE         , ZERO
-      PARAMETER           ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     .. Local Scalars ..
-      INTEGER               IX
-      DOUBLE PRECISION      NORM, SCALE, SSQ, TEMP
-*     .. Intrinsic Functions ..
-      INTRINSIC             ABS, DIMAG, DBLE, SQRT
-*     ..
-*     .. Executable Statements ..
-      IF( N.LT.1 .OR. INCX.LT.1 )THEN
-         NORM  = ZERO
-      ELSE
-         SCALE = ZERO
-         SSQ   = ONE
-*        The following loop is equivalent to this call to the LAPACK
-*        auxiliary routine:
-*        CALL ZLASSQ( N, X, INCX, SCALE, SSQ )
-*
-         DO 10, IX = 1, 1 + ( N - 1 )*INCX, INCX
-            IF( DBLE( X( IX ) ).NE.ZERO )THEN
-               TEMP = ABS( DBLE( X( IX ) ) )
-               IF( SCALE.LT.TEMP )THEN
-                  SSQ   = ONE   + SSQ*( SCALE/TEMP )**2
-                  SCALE = TEMP
-               ELSE
-                  SSQ   = SSQ   +     ( TEMP/SCALE )**2
-               END IF
-            END IF
-            IF( DIMAG( X( IX ) ).NE.ZERO )THEN
-               TEMP = ABS( DIMAG( X( IX ) ) )
-               IF( SCALE.LT.TEMP )THEN
-                  SSQ   = ONE   + SSQ*( SCALE/TEMP )**2
-                  SCALE = TEMP
-               ELSE
-                  SSQ   = SSQ   +     ( TEMP/SCALE )**2
-               END IF
-            END IF
-   10    CONTINUE
-         NORM  = SCALE * SQRT( SSQ )
-      END IF
-*
-      DZNRM2 = NORM
-      RETURN
-*
-*     End of DZNRM2.
-*
-      END
--- a/libcruft/blas/icamax.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-      INTEGER FUNCTION ICAMAX(N,CX,INCX)
-*     .. Scalar Arguments ..
-      INTEGER INCX,N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX CX(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*     finds the index of element having max. absolute value.
-*     jack dongarra, linpack, 3/11/78.
-*     modified 3/93 to return if incx .le. 0.
-*     modified 12/3/93, array(1) declarations changed to array(*)
-*
-*
-*     .. Local Scalars ..
-      REAL SMAX
-      INTEGER I,IX
-*     ..
-*     .. External Functions ..
-      REAL SCABS1
-      EXTERNAL SCABS1
-*     ..
-      ICAMAX = 0
-      IF (N.LT.1 .OR. INCX.LE.0) RETURN
-      ICAMAX = 1
-      IF (N.EQ.1) RETURN
-      IF (INCX.EQ.1) GO TO 20
-*
-*        code for increment not equal to 1
-*
-      IX = 1
-      SMAX = SCABS1(CX(1))
-      IX = IX + INCX
-      DO 10 I = 2,N
-          IF (SCABS1(CX(IX)).LE.SMAX) GO TO 5
-          ICAMAX = I
-          SMAX = SCABS1(CX(IX))
-    5     IX = IX + INCX
-   10 CONTINUE
-      RETURN
-*
-*        code for increment equal to 1
-*
-   20 SMAX = SCABS1(CX(1))
-      DO 30 I = 2,N
-          IF (SCABS1(CX(I)).LE.SMAX) GO TO 30
-          ICAMAX = I
-          SMAX = SCABS1(CX(I))
-   30 CONTINUE
-      RETURN
-      END
--- a/libcruft/blas/idamax.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-      integer function idamax(n,dx,incx)
-c
-c     finds the index of element having max. absolute value.
-c     jack dongarra, linpack, 3/11/78.
-c     modified 3/93 to return if incx .le. 0.
-c     modified 12/3/93, array(1) declarations changed to array(*)
-c
-      double precision dx(*),dmax
-      integer i,incx,ix,n
-c
-      idamax = 0
-      if( n.lt.1 .or. incx.le.0 ) return
-      idamax = 1
-      if(n.eq.1)return
-      if(incx.eq.1)go to 20
-c
-c        code for increment not equal to 1
-c
-      ix = 1
-      dmax = dabs(dx(1))
-      ix = ix + incx
-      do 10 i = 2,n
-         if(dabs(dx(ix)).le.dmax) go to 5
-         idamax = i
-         dmax = dabs(dx(ix))
-    5    ix = ix + incx
-   10 continue
-      return
-c
-c        code for increment equal to 1
-c
-   20 dmax = dabs(dx(1))
-      do 30 i = 2,n
-         if(dabs(dx(i)).le.dmax) go to 30
-         idamax = i
-         dmax = dabs(dx(i))
-   30 continue
-      return
-      end
--- a/libcruft/blas/isamax.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-      INTEGER FUNCTION ISAMAX(N,SX,INCX)
-*     .. Scalar Arguments ..
-      INTEGER INCX,N
-*     ..
-*     .. Array Arguments ..
-      REAL SX(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*     finds the index of element having max. absolute value.
-*     jack dongarra, linpack, 3/11/78.
-*     modified 3/93 to return if incx .le. 0.
-*     modified 12/3/93, array(1) declarations changed to array(*)
-*
-*
-*     .. Local Scalars ..
-      REAL SMAX
-      INTEGER I,IX
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC ABS
-*     ..
-      ISAMAX = 0
-      IF (N.LT.1 .OR. INCX.LE.0) RETURN
-      ISAMAX = 1
-      IF (N.EQ.1) RETURN
-      IF (INCX.EQ.1) GO TO 20
-*
-*        code for increment not equal to 1
-*
-      IX = 1
-      SMAX = ABS(SX(1))
-      IX = IX + INCX
-      DO 10 I = 2,N
-          IF (ABS(SX(IX)).LE.SMAX) GO TO 5
-          ISAMAX = I
-          SMAX = ABS(SX(IX))
-    5     IX = IX + INCX
-   10 CONTINUE
-      RETURN
-*
-*        code for increment equal to 1
-*
-   20 SMAX = ABS(SX(1))
-      DO 30 I = 2,N
-          IF (ABS(SX(I)).LE.SMAX) GO TO 30
-          ISAMAX = I
-          SMAX = ABS(SX(I))
-   30 CONTINUE
-      RETURN
-      END
--- a/libcruft/blas/izamax.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-      integer function izamax(n,zx,incx)
-c
-c     finds the index of element having max. absolute value.
-c     jack dongarra, 1/15/85.
-c     modified 3/93 to return if incx .le. 0.
-c     modified 12/3/93, array(1) declarations changed to array(*)
-c
-      double complex zx(*)
-      double precision smax
-      integer i,incx,ix,n
-      double precision dcabs1
-c
-      izamax = 0
-      if( n.lt.1 .or. incx.le.0 )return
-      izamax = 1
-      if(n.eq.1)return
-      if(incx.eq.1)go to 20
-c
-c        code for increment not equal to 1
-c
-      ix = 1
-      smax = dcabs1(zx(1))
-      ix = ix + incx
-      do 10 i = 2,n
-         if(dcabs1(zx(ix)).le.smax) go to 5
-         izamax = i
-         smax = dcabs1(zx(ix))
-    5    ix = ix + incx
-   10 continue
-      return
-c
-c        code for increment equal to 1
-c
-   20 smax = dcabs1(zx(1))
-      do 30 i = 2,n
-         if(dcabs1(zx(i)).le.smax) go to 30
-         izamax = i
-         smax = dcabs1(zx(i))
-   30 continue
-      return
-      end
--- a/libcruft/blas/lsame.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-      LOGICAL          FUNCTION LSAME( CA, CB )
-*
-*  -- LAPACK auxiliary routine (version 2.0) --
-*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
-*     Courant Institute, Argonne National Lab, and Rice University
-*     January 31, 1994
-*
-*     .. Scalar Arguments ..
-      CHARACTER          CA, CB
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  LSAME returns .TRUE. if CA is the same letter as CB regardless of
-*  case.
-*
-*  Arguments
-*  =========
-*
-*  CA      (input) CHARACTER*1
-*  CB      (input) CHARACTER*1
-*          CA and CB specify the single characters to be compared.
-*
-* =====================================================================
-*
-*     .. Intrinsic Functions ..
-      INTRINSIC          ICHAR
-*     ..
-*     .. Local Scalars ..
-      INTEGER            INTA, INTB, ZCODE
-*     ..
-*     .. Executable Statements ..
-*
-*     Test if the characters are equal
-*
-      LSAME = CA.EQ.CB
-      IF( LSAME )
-     $   RETURN
-*
-*     Now test for equivalence if both characters are alphabetic.
-*
-      ZCODE = ICHAR( 'Z' )
-*
-*     Use 'Z' rather than 'A' so that ASCII can be detected on Prime
-*     machines, on which ICHAR returns a value with bit 8 set.
-*     ICHAR('A') on Prime machines returns 193 which is the same as
-*     ICHAR('A') on an EBCDIC machine.
-*
-      INTA = ICHAR( CA )
-      INTB = ICHAR( CB )
-*
-      IF( ZCODE.EQ.90 .OR. ZCODE.EQ.122 ) THEN
-*
-*        ASCII is assumed - ZCODE is the ASCII code of either lower or
-*        upper case 'Z'.
-*
-         IF( INTA.GE.97 .AND. INTA.LE.122 ) INTA = INTA - 32
-         IF( INTB.GE.97 .AND. INTB.LE.122 ) INTB = INTB - 32
-*
-      ELSE IF( ZCODE.EQ.233 .OR. ZCODE.EQ.169 ) THEN
-*
-*        EBCDIC is assumed - ZCODE is the EBCDIC code of either lower or
-*        upper case 'Z'.
-*
-         IF( INTA.GE.129 .AND. INTA.LE.137 .OR.
-     $       INTA.GE.145 .AND. INTA.LE.153 .OR.
-     $       INTA.GE.162 .AND. INTA.LE.169 ) INTA = INTA + 64
-         IF( INTB.GE.129 .AND. INTB.LE.137 .OR.
-     $       INTB.GE.145 .AND. INTB.LE.153 .OR.
-     $       INTB.GE.162 .AND. INTB.LE.169 ) INTB = INTB + 64
-*
-      ELSE IF( ZCODE.EQ.218 .OR. ZCODE.EQ.250 ) THEN
-*
-*        ASCII is assumed, on Prime machines - ZCODE is the ASCII code
-*        plus 128 of either lower or upper case 'Z'.
-*
-         IF( INTA.GE.225 .AND. INTA.LE.250 ) INTA = INTA - 32
-         IF( INTB.GE.225 .AND. INTB.LE.250 ) INTB = INTB - 32
-      END IF
-      LSAME = INTA.EQ.INTB
-*
-*     RETURN
-*
-*     End of LSAME
-*
-      END
--- a/libcruft/blas/module.mk	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-EXTRA_DIST += blas/module.mk
-
-BLAS_SRC = \
-  blas/dasum.f \
-  blas/daxpy.f \
-  blas/dcabs1.f \
-  blas/dcopy.f \
-  blas/ddot.f \
-  blas/dgemm.f \
-  blas/dgemv.f \
-  blas/dger.f \
-  blas/dmach.f \
-  blas/dnrm2.f \
-  blas/drot.f \
-  blas/dscal.f \
-  blas/dswap.f \
-  blas/dsymv.f \
-  blas/dsyr.f \
-  blas/dsymm.f \
-  blas/dsyr2.f \
-  blas/dsyr2k.f \
-  blas/dsyrk.f \
-  blas/dtbsv.f \
-  blas/dtrmm.f \
-  blas/dtrmv.f \
-  blas/dtrsm.f \
-  blas/dtrsv.f \
-  blas/dzasum.f \
-  blas/dznrm2.f \
-  blas/icamax.f \
-  blas/idamax.f \
-  blas/isamax.f \
-  blas/izamax.f \
-  blas/lsame.f \
-  blas/sdot.f \
-  blas/sgemm.f \
-  blas/sgemv.f \
-  blas/sscal.f \
-  blas/ssyrk.f \
-  blas/strsm.f \
-  blas/zaxpy.f \
-  blas/zcopy.f \
-  blas/zdotc.f \
-  blas/zdotu.f \
-  blas/zdrot.f \
-  blas/zdscal.f \
-  blas/zgemm.f \
-  blas/zgemv.f \
-  blas/zgerc.f \
-  blas/zgeru.f \
-  blas/zhemv.f \
-  blas/zhemm.f \
-  blas/zher.f \
-  blas/zher2.f \
-  blas/zher2k.f \
-  blas/zherk.f \
-  blas/zscal.f \
-  blas/zswap.f \
-  blas/zsyrk.f \
-  blas/ztbsv.f \
-  blas/ztrmm.f \
-  blas/ztrmv.f \
-  blas/ztrsm.f \
-  blas/ztrsv.f \
-  blas/sasum.f \
-  blas/saxpy.f \
-  blas/scabs1.f \
-  blas/scopy.f \
-  blas/sger.f \
-  blas/smach.f \
-  blas/snrm2.f \
-  blas/srot.f \
-  blas/sswap.f \
-  blas/ssymv.f \
-  blas/ssyr.f \
-  blas/ssymm.f \
-  blas/ssyr2.f \
-  blas/ssyr2k.f \
-  blas/stbsv.f \
-  blas/strmm.f \
-  blas/strmv.f \
-  blas/strsv.f \
-  blas/scasum.f \
-  blas/scnrm2.f \
-  blas/caxpy.f \
-  blas/ccopy.f \
-  blas/cdotc.f \
-  blas/cdotu.f \
-  blas/chemm.f \
-  blas/csrot.f \
-  blas/csscal.f \
-  blas/cgemm.f \
-  blas/cgemv.f \
-  blas/cgerc.f \
-  blas/cgeru.f \
-  blas/chemv.f \
-  blas/cher.f \
-  blas/cher2.f \
-  blas/cher2k.f \
-  blas/cherk.f \
-  blas/cscal.f \
-  blas/cswap.f \
-  blas/csyrk.f \
-  blas/ctbsv.f \
-  blas/ctrmm.f \
-  blas/ctrmv.f \
-  blas/ctrsm.f \
-  blas/ctrsv.f
-
-if AMCOND_HAVE_BLAS
-  EXTRA_DIST += $(BLAS_SRC)
-else
-  libcruft_la_SOURCES += $(BLAS_SRC)
-endif
--- a/libcruft/blas/sasum.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-      REAL FUNCTION SASUM(N,SX,INCX)
-*     .. Scalar Arguments ..
-      INTEGER INCX,N
-*     ..
-*     .. Array Arguments ..
-      REAL SX(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*     takes the sum of the absolute values.
-*     uses unrolled loops for increment equal to one.
-*     jack dongarra, linpack, 3/11/78.
-*     modified 3/93 to return if incx .le. 0.
-*     modified 12/3/93, array(1) declarations changed to array(*)
-*
-*
-
-*     .. Local Scalars ..
-      REAL STEMP
-      INTEGER I,M,MP1,NINCX
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC ABS,MOD
-*     ..
-      SASUM = 0.0e0
-      STEMP = 0.0e0
-      IF (N.LE.0 .OR. INCX.LE.0) RETURN
-      IF (INCX.EQ.1) GO TO 20
-*
-*        code for increment not equal to 1
-*
-      NINCX = N*INCX
-      DO 10 I = 1,NINCX,INCX
-          STEMP = STEMP + ABS(SX(I))
-   10 CONTINUE
-      SASUM = STEMP
-      RETURN
-*
-*        code for increment equal to 1
-*
-*
-*        clean-up loop
-*
-   20 M = MOD(N,6)
-      IF (M.EQ.0) GO TO 40
-      DO 30 I = 1,M
-          STEMP = STEMP + ABS(SX(I))
-   30 CONTINUE
-      IF (N.LT.6) GO TO 60
-   40 MP1 = M + 1
-      DO 50 I = MP1,N,6
-          STEMP = STEMP + ABS(SX(I)) + ABS(SX(I+1)) + ABS(SX(I+2)) +
-     +            ABS(SX(I+3)) + ABS(SX(I+4)) + ABS(SX(I+5))
-   50 CONTINUE
-   60 SASUM = STEMP
-      RETURN
-      END
--- a/libcruft/blas/saxpy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-      SUBROUTINE SAXPY(N,SA,SX,INCX,SY,INCY)
-*     .. Scalar Arguments ..
-      REAL SA
-      INTEGER INCX,INCY,N
-*     ..
-*     .. Array Arguments ..
-      REAL SX(*),SY(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*     SAXPY constant times a vector plus a vector.
-*     uses unrolled loop for increments equal to one.
-*     jack dongarra, linpack, 3/11/78.
-*     modified 12/3/93, array(1) declarations changed to array(*)
-*
-*
-*     .. Local Scalars ..
-      INTEGER I,IX,IY,M,MP1
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MOD
-*     ..
-      IF (N.LE.0) RETURN
-      IF (SA.EQ.0.0) RETURN
-      IF (INCX.EQ.1 .AND. INCY.EQ.1) GO TO 20
-*
-*        code for unequal increments or equal increments
-*          not equal to 1
-*
-      IX = 1
-      IY = 1
-      IF (INCX.LT.0) IX = (-N+1)*INCX + 1
-      IF (INCY.LT.0) IY = (-N+1)*INCY + 1
-      DO 10 I = 1,N
-          SY(IY) = SY(IY) + SA*SX(IX)
-          IX = IX + INCX
-          IY = IY + INCY
-   10 CONTINUE
-      RETURN
-*
-*        code for both increments equal to 1
-*
-*
-*        clean-up loop
-*
-   20 M = MOD(N,4)
-      IF (M.EQ.0) GO TO 40
-      DO 30 I = 1,M
-          SY(I) = SY(I) + SA*SX(I)
-   30 CONTINUE
-      IF (N.LT.4) RETURN
-   40 MP1 = M + 1
-      DO 50 I = MP1,N,4
-          SY(I) = SY(I) + SA*SX(I)
-          SY(I+1) = SY(I+1) + SA*SX(I+1)
-          SY(I+2) = SY(I+2) + SA*SX(I+2)
-          SY(I+3) = SY(I+3) + SA*SX(I+3)
-   50 CONTINUE
-      RETURN
-      END
--- a/libcruft/blas/scabs1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-      REAL FUNCTION SCABS1(Z)
-*     .. Scalar Arguments ..
-      COMPLEX Z
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SCABS1 computes absolute value of a complex number
-*
-*     .. Intrinsic Functions ..
-      INTRINSIC ABS,AIMAG,REAL
-*     ..
-      SCABS1 = ABS(REAL(Z)) + ABS(AIMAG(Z))
-      RETURN
-      END
--- a/libcruft/blas/scasum.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-      REAL FUNCTION SCASUM(N,CX,INCX)
-*     .. Scalar Arguments ..
-      INTEGER INCX,N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX CX(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*     takes the sum of the absolute values of a complex vector and
-*     returns a single precision result.
-*     jack dongarra, linpack, 3/11/78.
-*     modified 3/93 to return if incx .le. 0.
-*     modified 12/3/93, array(1) declarations changed to array(*)
-*
-*
-*     .. Local Scalars ..
-      REAL STEMP
-      INTEGER I,NINCX
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC ABS,AIMAG,REAL
-*     ..
-      SCASUM = 0.0e0
-      STEMP = 0.0e0
-      IF (N.LE.0 .OR. INCX.LE.0) RETURN
-      IF (INCX.EQ.1) GO TO 20
-*
-*        code for increment not equal to 1
-*
-      NINCX = N*INCX
-      DO 10 I = 1,NINCX,INCX
-          STEMP = STEMP + ABS(REAL(CX(I))) + ABS(AIMAG(CX(I)))
-   10 CONTINUE
-      SCASUM = STEMP
-      RETURN
-*
-*        code for increment equal to 1
-*
-   20 DO 30 I = 1,N
-          STEMP = STEMP + ABS(REAL(CX(I))) + ABS(AIMAG(CX(I)))
-   30 CONTINUE
-      SCASUM = STEMP
-      RETURN
-      END
--- a/libcruft/blas/scnrm2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-      REAL FUNCTION SCNRM2(N,X,INCX)
-*     .. Scalar Arguments ..
-      INTEGER INCX,N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX X(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SCNRM2 returns the euclidean norm of a vector via the function
-*  name, so that
-*
-*     SCNRM2 := sqrt( conjg( x' )*x )
-*
-*
-*
-*  -- This version written on 25-October-1982.
-*     Modified on 14-October-1993 to inline the call to CLASSQ.
-*     Sven Hammarling, Nag Ltd.
-*
-*
-*     .. Parameters ..
-      REAL ONE,ZERO
-      PARAMETER (ONE=1.0E+0,ZERO=0.0E+0)
-*     ..
-*     .. Local Scalars ..
-      REAL NORM,SCALE,SSQ,TEMP
-      INTEGER IX
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC ABS,AIMAG,REAL,SQRT
-*     ..
-      IF (N.LT.1 .OR. INCX.LT.1) THEN
-          NORM = ZERO
-      ELSE
-          SCALE = ZERO
-          SSQ = ONE
-*        The following loop is equivalent to this call to the LAPACK
-*        auxiliary routine:
-*        CALL CLASSQ( N, X, INCX, SCALE, SSQ )
-*
-          DO 10 IX = 1,1 + (N-1)*INCX,INCX
-              IF (REAL(X(IX)).NE.ZERO) THEN
-                  TEMP = ABS(REAL(X(IX)))
-                  IF (SCALE.LT.TEMP) THEN
-                      SSQ = ONE + SSQ* (SCALE/TEMP)**2
-                      SCALE = TEMP
-                  ELSE
-                      SSQ = SSQ + (TEMP/SCALE)**2
-                  END IF
-              END IF
-              IF (AIMAG(X(IX)).NE.ZERO) THEN
-                  TEMP = ABS(AIMAG(X(IX)))
-                  IF (SCALE.LT.TEMP) THEN
-                      SSQ = ONE + SSQ* (SCALE/TEMP)**2
-                      SCALE = TEMP
-                  ELSE
-                      SSQ = SSQ + (TEMP/SCALE)**2
-                  END IF
-              END IF
-   10     CONTINUE
-          NORM = SCALE*SQRT(SSQ)
-      END IF
-*
-      SCNRM2 = NORM
-      RETURN
-*
-*     End of SCNRM2.
-*
-      END
--- a/libcruft/blas/scopy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-      SUBROUTINE SCOPY(N,SX,INCX,SY,INCY)
-*     .. Scalar Arguments ..
-      INTEGER INCX,INCY,N
-*     ..
-*     .. Array Arguments ..
-      REAL SX(*),SY(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*     copies a vector, x, to a vector, y.
-*     uses unrolled loops for increments equal to 1.
-*     jack dongarra, linpack, 3/11/78.
-*     modified 12/3/93, array(1) declarations changed to array(*)
-*
-*
-*     .. Local Scalars ..
-      INTEGER I,IX,IY,M,MP1
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MOD
-*     ..
-      IF (N.LE.0) RETURN
-      IF (INCX.EQ.1 .AND. INCY.EQ.1) GO TO 20
-*
-*        code for unequal increments or equal increments
-*          not equal to 1
-*
-      IX = 1
-      IY = 1
-      IF (INCX.LT.0) IX = (-N+1)*INCX + 1
-      IF (INCY.LT.0) IY = (-N+1)*INCY + 1
-      DO 10 I = 1,N
-          SY(IY) = SX(IX)
-          IX = IX + INCX
-          IY = IY + INCY
-   10 CONTINUE
-      RETURN
-*
-*        code for both increments equal to 1
-*
-*
-*        clean-up loop
-*
-   20 M = MOD(N,7)
-      IF (M.EQ.0) GO TO 40
-      DO 30 I = 1,M
-          SY(I) = SX(I)
-   30 CONTINUE
-      IF (N.LT.7) RETURN
-   40 MP1 = M + 1
-      DO 50 I = MP1,N,7
-          SY(I) = SX(I)
-          SY(I+1) = SX(I+1)
-          SY(I+2) = SX(I+2)
-          SY(I+3) = SX(I+3)
-          SY(I+4) = SX(I+4)
-          SY(I+5) = SX(I+5)
-          SY(I+6) = SX(I+6)
-   50 CONTINUE
-      RETURN
-      END
--- a/libcruft/blas/sdot.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-      REAL FUNCTION SDOT(N,SX,INCX,SY,INCY)
-*     .. Scalar Arguments ..
-      INTEGER INCX,INCY,N
-*     ..
-*     .. Array Arguments ..
-      REAL SX(*),SY(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*     forms the dot product of two vectors.
-*     uses unrolled loops for increments equal to one.
-*     jack dongarra, linpack, 3/11/78.
-*     modified 12/3/93, array(1) declarations changed to array(*)
-*
-*
-
-*     .. Local Scalars ..
-      REAL STEMP
-      INTEGER I,IX,IY,M,MP1
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MOD
-*     ..
-      STEMP = 0.0e0
-      SDOT = 0.0e0
-      IF (N.LE.0) RETURN
-      IF (INCX.EQ.1 .AND. INCY.EQ.1) GO TO 20
-*
-*        code for unequal increments or equal increments
-*          not equal to 1
-*
-      IX = 1
-      IY = 1
-      IF (INCX.LT.0) IX = (-N+1)*INCX + 1
-      IF (INCY.LT.0) IY = (-N+1)*INCY + 1
-      DO 10 I = 1,N
-          STEMP = STEMP + SX(IX)*SY(IY)
-          IX = IX + INCX
-          IY = IY + INCY
-   10 CONTINUE
-      SDOT = STEMP
-      RETURN
-*
-*        code for both increments equal to 1
-*
-*
-*        clean-up loop
-*
-   20 M = MOD(N,5)
-      IF (M.EQ.0) GO TO 40
-      DO 30 I = 1,M
-          STEMP = STEMP + SX(I)*SY(I)
-   30 CONTINUE
-      IF (N.LT.5) GO TO 60
-   40 MP1 = M + 1
-      DO 50 I = MP1,N,5
-          STEMP = STEMP + SX(I)*SY(I) + SX(I+1)*SY(I+1) +
-     +            SX(I+2)*SY(I+2) + SX(I+3)*SY(I+3) + SX(I+4)*SY(I+4)
-   50 CONTINUE
-   60 SDOT = STEMP
-      RETURN
-      END
--- a/libcruft/blas/sgemm.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,313 +0,0 @@
-      SUBROUTINE SGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC)
-*     .. Scalar Arguments ..
-      REAL ALPHA,BETA
-      INTEGER K,LDA,LDB,LDC,M,N
-      CHARACTER TRANSA,TRANSB
-*     ..
-*     .. Array Arguments ..
-      REAL A(LDA,*),B(LDB,*),C(LDC,*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGEMM  performs one of the matrix-matrix operations
-*
-*     C := alpha*op( A )*op( B ) + beta*C,
-*
-*  where  op( X ) is one of
-*
-*     op( X ) = X   or   op( X ) = X',
-*
-*  alpha and beta are scalars, and A, B and C are matrices, with op( A )
-*  an m by k matrix,  op( B )  a  k by n matrix and  C an m by n matrix.
-*
-*  Arguments
-*  ==========
-*
-*  TRANSA - CHARACTER*1.
-*           On entry, TRANSA specifies the form of op( A ) to be used in
-*           the matrix multiplication as follows:
-*
-*              TRANSA = 'N' or 'n',  op( A ) = A.
-*
-*              TRANSA = 'T' or 't',  op( A ) = A'.
-*
-*              TRANSA = 'C' or 'c',  op( A ) = A'.
-*
-*           Unchanged on exit.
-*
-*  TRANSB - CHARACTER*1.
-*           On entry, TRANSB specifies the form of op( B ) to be used in
-*           the matrix multiplication as follows:
-*
-*              TRANSB = 'N' or 'n',  op( B ) = B.
-*
-*              TRANSB = 'T' or 't',  op( B ) = B'.
-*
-*              TRANSB = 'C' or 'c',  op( B ) = B'.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry,  M  specifies  the number  of rows  of the  matrix
-*           op( A )  and of the  matrix  C.  M  must  be at least  zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry,  N  specifies the number  of columns of the matrix
-*           op( B ) and the number of columns of the matrix C. N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry,  K  specifies  the number of columns of the matrix
-*           op( A ) and the number of rows of the matrix op( B ). K must
-*           be at least  zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - REAL            .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - REAL             array of DIMENSION ( LDA, ka ), where ka is
-*           k  when  TRANSA = 'N' or 'n',  and is  m  otherwise.
-*           Before entry with  TRANSA = 'N' or 'n',  the leading  m by k
-*           part of the array  A  must contain the matrix  A,  otherwise
-*           the leading  k by m  part of the array  A  must contain  the
-*           matrix A.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. When  TRANSA = 'N' or 'n' then
-*           LDA must be at least  max( 1, m ), otherwise  LDA must be at
-*           least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  B      - REAL             array of DIMENSION ( LDB, kb ), where kb is
-*           n  when  TRANSB = 'N' or 'n',  and is  k  otherwise.
-*           Before entry with  TRANSB = 'N' or 'n',  the leading  k by n
-*           part of the array  B  must contain the matrix  B,  otherwise
-*           the leading  n by k  part of the array  B  must contain  the
-*           matrix B.
-*           Unchanged on exit.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in the calling (sub) program. When  TRANSB = 'N' or 'n' then
-*           LDB must be at least  max( 1, k ), otherwise  LDB must be at
-*           least  max( 1, n ).
-*           Unchanged on exit.
-*
-*  BETA   - REAL            .
-*           On entry,  BETA  specifies the scalar  beta.  When  BETA  is
-*           supplied as zero then C need not be set on input.
-*           Unchanged on exit.
-*
-*  C      - REAL             array of DIMENSION ( LDC, n ).
-*           Before entry, the leading  m by n  part of the array  C must
-*           contain the matrix  C,  except when  beta  is zero, in which
-*           case C need not be set on entry.
-*           On exit, the array  C  is overwritten by the  m by n  matrix
-*           ( alpha*op( A )*op( B ) + beta*C ).
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX
-*     ..
-*     .. Local Scalars ..
-      REAL TEMP
-      INTEGER I,INFO,J,L,NCOLA,NROWA,NROWB
-      LOGICAL NOTA,NOTB
-*     ..
-*     .. Parameters ..
-      REAL ONE,ZERO
-      PARAMETER (ONE=1.0E+0,ZERO=0.0E+0)
-*     ..
-*
-*     Set  NOTA  and  NOTB  as  true if  A  and  B  respectively are not
-*     transposed and set  NROWA, NCOLA and  NROWB  as the number of rows
-*     and  columns of  A  and the  number of  rows  of  B  respectively.
-*
-      NOTA = LSAME(TRANSA,'N')
-      NOTB = LSAME(TRANSB,'N')
-      IF (NOTA) THEN
-          NROWA = M
-          NCOLA = K
-      ELSE
-          NROWA = K
-          NCOLA = M
-      END IF
-      IF (NOTB) THEN
-          NROWB = K
-      ELSE
-          NROWB = N
-      END IF
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF ((.NOT.NOTA) .AND. (.NOT.LSAME(TRANSA,'C')) .AND.
-     +    (.NOT.LSAME(TRANSA,'T'))) THEN
-          INFO = 1
-      ELSE IF ((.NOT.NOTB) .AND. (.NOT.LSAME(TRANSB,'C')) .AND.
-     +         (.NOT.LSAME(TRANSB,'T'))) THEN
-          INFO = 2
-      ELSE IF (M.LT.0) THEN
-          INFO = 3
-      ELSE IF (N.LT.0) THEN
-          INFO = 4
-      ELSE IF (K.LT.0) THEN
-          INFO = 5
-      ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
-          INFO = 8
-      ELSE IF (LDB.LT.MAX(1,NROWB)) THEN
-          INFO = 10
-      ELSE IF (LDC.LT.MAX(1,M)) THEN
-          INFO = 13
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('SGEMM ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
-     +    (((ALPHA.EQ.ZERO).OR. (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN
-*
-*     And if  alpha.eq.zero.
-*
-      IF (ALPHA.EQ.ZERO) THEN
-          IF (BETA.EQ.ZERO) THEN
-              DO 20 J = 1,N
-                  DO 10 I = 1,M
-                      C(I,J) = ZERO
-   10             CONTINUE
-   20         CONTINUE
-          ELSE
-              DO 40 J = 1,N
-                  DO 30 I = 1,M
-                      C(I,J) = BETA*C(I,J)
-   30             CONTINUE
-   40         CONTINUE
-          END IF
-          RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF (NOTB) THEN
-          IF (NOTA) THEN
-*
-*           Form  C := alpha*A*B + beta*C.
-*
-              DO 90 J = 1,N
-                  IF (BETA.EQ.ZERO) THEN
-                      DO 50 I = 1,M
-                          C(I,J) = ZERO
-   50                 CONTINUE
-                  ELSE IF (BETA.NE.ONE) THEN
-                      DO 60 I = 1,M
-                          C(I,J) = BETA*C(I,J)
-   60                 CONTINUE
-                  END IF
-                  DO 80 L = 1,K
-                      IF (B(L,J).NE.ZERO) THEN
-                          TEMP = ALPHA*B(L,J)
-                          DO 70 I = 1,M
-                              C(I,J) = C(I,J) + TEMP*A(I,L)
-   70                     CONTINUE
-                      END IF
-   80             CONTINUE
-   90         CONTINUE
-          ELSE
-*
-*           Form  C := alpha*A'*B + beta*C
-*
-              DO 120 J = 1,N
-                  DO 110 I = 1,M
-                      TEMP = ZERO
-                      DO 100 L = 1,K
-                          TEMP = TEMP + A(L,I)*B(L,J)
-  100                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP
-                      ELSE
-                          C(I,J) = ALPHA*TEMP + BETA*C(I,J)
-                      END IF
-  110             CONTINUE
-  120         CONTINUE
-          END IF
-      ELSE
-          IF (NOTA) THEN
-*
-*           Form  C := alpha*A*B' + beta*C
-*
-              DO 170 J = 1,N
-                  IF (BETA.EQ.ZERO) THEN
-                      DO 130 I = 1,M
-                          C(I,J) = ZERO
-  130                 CONTINUE
-                  ELSE IF (BETA.NE.ONE) THEN
-                      DO 140 I = 1,M
-                          C(I,J) = BETA*C(I,J)
-  140                 CONTINUE
-                  END IF
-                  DO 160 L = 1,K
-                      IF (B(J,L).NE.ZERO) THEN
-                          TEMP = ALPHA*B(J,L)
-                          DO 150 I = 1,M
-                              C(I,J) = C(I,J) + TEMP*A(I,L)
-  150                     CONTINUE
-                      END IF
-  160             CONTINUE
-  170         CONTINUE
-          ELSE
-*
-*           Form  C := alpha*A'*B' + beta*C
-*
-              DO 200 J = 1,N
-                  DO 190 I = 1,M
-                      TEMP = ZERO
-                      DO 180 L = 1,K
-                          TEMP = TEMP + A(L,I)*B(J,L)
-  180                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP
-                      ELSE
-                          C(I,J) = ALPHA*TEMP + BETA*C(I,J)
-                      END IF
-  190             CONTINUE
-  200         CONTINUE
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of SGEMM .
-*
-      END
--- a/libcruft/blas/sgemv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,261 +0,0 @@
-      SUBROUTINE SGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
-*     .. Scalar Arguments ..
-      REAL ALPHA,BETA
-      INTEGER INCX,INCY,LDA,M,N
-      CHARACTER TRANS
-*     ..
-*     .. Array Arguments ..
-      REAL A(LDA,*),X(*),Y(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGEMV  performs one of the matrix-vector operations
-*
-*     y := alpha*A*x + beta*y,   or   y := alpha*A'*x + beta*y,
-*
-*  where alpha and beta are scalars, x and y are vectors and A is an
-*  m by n matrix.
-*
-*  Arguments
-*  ==========
-*
-*  TRANS  - CHARACTER*1.
-*           On entry, TRANS specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   y := alpha*A*x + beta*y.
-*
-*              TRANS = 'T' or 't'   y := alpha*A'*x + beta*y.
-*
-*              TRANS = 'C' or 'c'   y := alpha*A'*x + beta*y.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of the matrix A.
-*           M must be at least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - REAL            .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - REAL             array of DIMENSION ( LDA, n ).
-*           Before entry, the leading m by n part of the array A must
-*           contain the matrix of coefficients.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*  X      - REAL             array of DIMENSION at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'
-*           and at least
-*           ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.
-*           Before entry, the incremented array X must contain the
-*           vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  BETA   - REAL            .
-*           On entry, BETA specifies the scalar beta. When BETA is
-*           supplied as zero then Y need not be set on input.
-*           Unchanged on exit.
-*
-*  Y      - REAL             array of DIMENSION at least
-*           ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'
-*           and at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.
-*           Before entry with BETA non-zero, the incremented array Y
-*           must contain the vector y. On exit, Y is overwritten by the
-*           updated vector y.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      REAL ONE,ZERO
-      PARAMETER (ONE=1.0E+0,ZERO=0.0E+0)
-*     ..
-*     .. Local Scalars ..
-      REAL TEMP
-      INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY,LENX,LENY
-*     ..
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX
-*     ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
-     +    .NOT.LSAME(TRANS,'C')) THEN
-          INFO = 1
-      ELSE IF (M.LT.0) THEN
-          INFO = 2
-      ELSE IF (N.LT.0) THEN
-          INFO = 3
-      ELSE IF (LDA.LT.MAX(1,M)) THEN
-          INFO = 6
-      ELSE IF (INCX.EQ.0) THEN
-          INFO = 8
-      ELSE IF (INCY.EQ.0) THEN
-          INFO = 11
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('SGEMV ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
-     +    ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
-*
-*     Set  LENX  and  LENY, the lengths of the vectors x and y, and set
-*     up the start points in  X  and  Y.
-*
-      IF (LSAME(TRANS,'N')) THEN
-          LENX = N
-          LENY = M
-      ELSE
-          LENX = M
-          LENY = N
-      END IF
-      IF (INCX.GT.0) THEN
-          KX = 1
-      ELSE
-          KX = 1 - (LENX-1)*INCX
-      END IF
-      IF (INCY.GT.0) THEN
-          KY = 1
-      ELSE
-          KY = 1 - (LENY-1)*INCY
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-*     First form  y := beta*y.
-*
-      IF (BETA.NE.ONE) THEN
-          IF (INCY.EQ.1) THEN
-              IF (BETA.EQ.ZERO) THEN
-                  DO 10 I = 1,LENY
-                      Y(I) = ZERO
-   10             CONTINUE
-              ELSE
-                  DO 20 I = 1,LENY
-                      Y(I) = BETA*Y(I)
-   20             CONTINUE
-              END IF
-          ELSE
-              IY = KY
-              IF (BETA.EQ.ZERO) THEN
-                  DO 30 I = 1,LENY
-                      Y(IY) = ZERO
-                      IY = IY + INCY
-   30             CONTINUE
-              ELSE
-                  DO 40 I = 1,LENY
-                      Y(IY) = BETA*Y(IY)
-                      IY = IY + INCY
-   40             CONTINUE
-              END IF
-          END IF
-      END IF
-      IF (ALPHA.EQ.ZERO) RETURN
-      IF (LSAME(TRANS,'N')) THEN
-*
-*        Form  y := alpha*A*x + y.
-*
-          JX = KX
-          IF (INCY.EQ.1) THEN
-              DO 60 J = 1,N
-                  IF (X(JX).NE.ZERO) THEN
-                      TEMP = ALPHA*X(JX)
-                      DO 50 I = 1,M
-                          Y(I) = Y(I) + TEMP*A(I,J)
-   50                 CONTINUE
-                  END IF
-                  JX = JX + INCX
-   60         CONTINUE
-          ELSE
-              DO 80 J = 1,N
-                  IF (X(JX).NE.ZERO) THEN
-                      TEMP = ALPHA*X(JX)
-                      IY = KY
-                      DO 70 I = 1,M
-                          Y(IY) = Y(IY) + TEMP*A(I,J)
-                          IY = IY + INCY
-   70                 CONTINUE
-                  END IF
-                  JX = JX + INCX
-   80         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  y := alpha*A'*x + y.
-*
-          JY = KY
-          IF (INCX.EQ.1) THEN
-              DO 100 J = 1,N
-                  TEMP = ZERO
-                  DO 90 I = 1,M
-                      TEMP = TEMP + A(I,J)*X(I)
-   90             CONTINUE
-                  Y(JY) = Y(JY) + ALPHA*TEMP
-                  JY = JY + INCY
-  100         CONTINUE
-          ELSE
-              DO 120 J = 1,N
-                  TEMP = ZERO
-                  IX = KX
-                  DO 110 I = 1,M
-                      TEMP = TEMP + A(I,J)*X(IX)
-                      IX = IX + INCX
-  110             CONTINUE
-                  Y(JY) = Y(JY) + ALPHA*TEMP
-                  JY = JY + INCY
-  120         CONTINUE
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of SGEMV .
-*
-      END
--- a/libcruft/blas/sger.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,159 +0,0 @@
-      SUBROUTINE SGER(M,N,ALPHA,X,INCX,Y,INCY,A,LDA)
-*     .. Scalar Arguments ..
-      REAL ALPHA
-      INTEGER INCX,INCY,LDA,M,N
-*     ..
-*     .. Array Arguments ..
-      REAL A(LDA,*),X(*),Y(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGER   performs the rank 1 operation
-*
-*     A := alpha*x*y' + A,
-*
-*  where alpha is a scalar, x is an m element vector, y is an n element
-*  vector and A is an m by n matrix.
-*
-*  Arguments
-*  ==========
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of the matrix A.
-*           M must be at least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - REAL            .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  X      - REAL             array of dimension at least
-*           ( 1 + ( m - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the m
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  Y      - REAL             array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ).
-*           Before entry, the incremented array Y must contain the n
-*           element vector y.
-*           Unchanged on exit.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*  A      - REAL             array of DIMENSION ( LDA, n ).
-*           Before entry, the leading m by n part of the array A must
-*           contain the matrix of coefficients. On exit, A is
-*           overwritten by the updated matrix.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      REAL ZERO
-      PARAMETER (ZERO=0.0E+0)
-*     ..
-*     .. Local Scalars ..
-      REAL TEMP
-      INTEGER I,INFO,IX,J,JY,KX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX
-*     ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF (M.LT.0) THEN
-          INFO = 1
-      ELSE IF (N.LT.0) THEN
-          INFO = 2
-      ELSE IF (INCX.EQ.0) THEN
-          INFO = 5
-      ELSE IF (INCY.EQ.0) THEN
-          INFO = 7
-      ELSE IF (LDA.LT.MAX(1,M)) THEN
-          INFO = 9
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('SGER  ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((M.EQ.0) .OR. (N.EQ.0) .OR. (ALPHA.EQ.ZERO)) RETURN
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-      IF (INCY.GT.0) THEN
-          JY = 1
-      ELSE
-          JY = 1 - (N-1)*INCY
-      END IF
-      IF (INCX.EQ.1) THEN
-          DO 20 J = 1,N
-              IF (Y(JY).NE.ZERO) THEN
-                  TEMP = ALPHA*Y(JY)
-                  DO 10 I = 1,M
-                      A(I,J) = A(I,J) + X(I)*TEMP
-   10             CONTINUE
-              END IF
-              JY = JY + INCY
-   20     CONTINUE
-      ELSE
-          IF (INCX.GT.0) THEN
-              KX = 1
-          ELSE
-              KX = 1 - (M-1)*INCX
-          END IF
-          DO 40 J = 1,N
-              IF (Y(JY).NE.ZERO) THEN
-                  TEMP = ALPHA*Y(JY)
-                  IX = KX
-                  DO 30 I = 1,M
-                      A(I,J) = A(I,J) + X(IX)*TEMP
-                      IX = IX + INCX
-   30             CONTINUE
-              END IF
-              JY = JY + INCY
-   40     CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of SGER  .
-*
-      END
--- a/libcruft/blas/smach.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-      real function smach(job)
-      integer job
-c
-c     smach computes machine parameters of floating point
-c     arithmetic for use in testing only.  not required by
-c     linpack proper.
-c
-c     if trouble with automatic computation of these quantities,
-c     they can be set by direct assignment statements.
-c     assume the computer has
-c
-c        b = base of arithmetic
-c        t = number of base  b  digits
-c        l = smallest possible exponent
-c        u = largest possible exponent
-c
-c     then
-c
-c        eps = b**(1-t)
-c        tiny = 100.0*b**(-l+t)
-c        huge = 0.01*b**(u-t)
-c
-c     dmach same as smach except t, l, u apply to
-c     double precision.
-c
-c     cmach same as smach except if complex division
-c     is done by
-c
-c        1/(x+i*y) = (x-i*y)/(x**2+y**2)
-c
-c     then
-c
-c        tiny = sqrt(tiny)
-c        huge = sqrt(huge)
-c
-c
-c     job is 1, 2 or 3 for epsilon, tiny and huge, respectively.
-c
-c
-      real eps,tiny,huge,s
-c
-      eps = 1.0
-   10 eps = eps/2.0
-      s = 1.0 + eps
-      if (s .gt. 1.0) go to 10
-      eps = 2.0*eps
-c
-      s = 1.0
-   20 tiny = s
-      s = s/16.0
-      if (s*100. .ne. 0.0) go to 20
-      tiny = (tiny/eps)*100.0
-      huge = 1.0/tiny
-c
-      if (job .eq. 1) smach = eps
-      if (job .eq. 2) smach = tiny
-      if (job .eq. 3) smach = huge
-      return
-      end
--- a/libcruft/blas/snrm2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-      REAL FUNCTION SNRM2(N,X,INCX)
-*     .. Scalar Arguments ..
-      INTEGER INCX,N
-*     ..
-*     .. Array Arguments ..
-      REAL X(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SNRM2 returns the euclidean norm of a vector via the function
-*  name, so that
-*
-*     SNRM2 := sqrt( x'*x ).
-*
-*  Further Details
-*  ===============
-*
-*  -- This version written on 25-October-1982.
-*     Modified on 14-October-1993 to inline the call to SLASSQ.
-*     Sven Hammarling, Nag Ltd.
-*
-*
-*     .. Parameters ..
-      REAL ONE,ZERO
-      PARAMETER (ONE=1.0E+0,ZERO=0.0E+0)
-*     ..
-*     .. Local Scalars ..
-      REAL ABSXI,NORM,SCALE,SSQ
-      INTEGER IX
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC ABS,SQRT
-*     ..
-      IF (N.LT.1 .OR. INCX.LT.1) THEN
-          NORM = ZERO
-      ELSE IF (N.EQ.1) THEN
-          NORM = ABS(X(1))
-      ELSE
-          SCALE = ZERO
-          SSQ = ONE
-*        The following loop is equivalent to this call to the LAPACK
-*        auxiliary routine:
-*        CALL SLASSQ( N, X, INCX, SCALE, SSQ )
-*
-          DO 10 IX = 1,1 + (N-1)*INCX,INCX
-              IF (X(IX).NE.ZERO) THEN
-                  ABSXI = ABS(X(IX))
-                  IF (SCALE.LT.ABSXI) THEN
-                      SSQ = ONE + SSQ* (SCALE/ABSXI)**2
-                      SCALE = ABSXI
-                  ELSE
-                      SSQ = SSQ + (ABSXI/SCALE)**2
-                  END IF
-              END IF
-   10     CONTINUE
-          NORM = SCALE*SQRT(SSQ)
-      END IF
-*
-      SNRM2 = NORM
-      RETURN
-*
-*     End of SNRM2.
-*
-      END
--- a/libcruft/blas/srot.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-      SUBROUTINE SROT(N,SX,INCX,SY,INCY,C,S)
-*     .. Scalar Arguments ..
-      REAL C,S
-      INTEGER INCX,INCY,N
-*     ..
-*     .. Array Arguments ..
-      REAL SX(*),SY(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*     applies a plane rotation.
-*
-*  Further Details
-*  ===============
-*
-*     jack dongarra, linpack, 3/11/78.
-*     modified 12/3/93, array(1) declarations changed to array(*)
-*
-*
-
-*     .. Local Scalars ..
-      REAL STEMP
-      INTEGER I,IX,IY
-*     ..
-      IF (N.LE.0) RETURN
-      IF (INCX.EQ.1 .AND. INCY.EQ.1) GO TO 20
-*
-*       code for unequal increments or equal increments not equal
-*         to 1
-*
-      IX = 1
-      IY = 1
-      IF (INCX.LT.0) IX = (-N+1)*INCX + 1
-      IF (INCY.LT.0) IY = (-N+1)*INCY + 1
-      DO 10 I = 1,N
-          STEMP = C*SX(IX) + S*SY(IY)
-          SY(IY) = C*SY(IY) - S*SX(IX)
-          SX(IX) = STEMP
-          IX = IX + INCX
-          IY = IY + INCY
-   10 CONTINUE
-      RETURN
-*
-*       code for both increments equal to 1
-*
-   20 DO 30 I = 1,N
-          STEMP = C*SX(I) + S*SY(I)
-          SY(I) = C*SY(I) - S*SX(I)
-          SX(I) = STEMP
-   30 CONTINUE
-      RETURN
-      END
--- a/libcruft/blas/sscal.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-      SUBROUTINE SSCAL(N,SA,SX,INCX)
-*     .. Scalar Arguments ..
-      REAL SA
-      INTEGER INCX,N
-*     ..
-*     .. Array Arguments ..
-      REAL SX(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*     scales a vector by a constant.
-*     uses unrolled loops for increment equal to 1.
-*     jack dongarra, linpack, 3/11/78.
-*     modified 3/93 to return if incx .le. 0.
-*     modified 12/3/93, array(1) declarations changed to array(*)
-*
-*
-*     .. Local Scalars ..
-      INTEGER I,M,MP1,NINCX
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MOD
-*     ..
-      IF (N.LE.0 .OR. INCX.LE.0) RETURN
-      IF (INCX.EQ.1) GO TO 20
-*
-*        code for increment not equal to 1
-*
-      NINCX = N*INCX
-      DO 10 I = 1,NINCX,INCX
-          SX(I) = SA*SX(I)
-   10 CONTINUE
-      RETURN
-*
-*        code for increment equal to 1
-*
-*
-*        clean-up loop
-*
-   20 M = MOD(N,5)
-      IF (M.EQ.0) GO TO 40
-      DO 30 I = 1,M
-          SX(I) = SA*SX(I)
-   30 CONTINUE
-      IF (N.LT.5) RETURN
-   40 MP1 = M + 1
-      DO 50 I = MP1,N,5
-          SX(I) = SA*SX(I)
-          SX(I+1) = SA*SX(I+1)
-          SX(I+2) = SA*SX(I+2)
-          SX(I+3) = SA*SX(I+3)
-          SX(I+4) = SA*SX(I+4)
-   50 CONTINUE
-      RETURN
-      END
--- a/libcruft/blas/sswap.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-      SUBROUTINE SSWAP(N,SX,INCX,SY,INCY)
-*     .. Scalar Arguments ..
-      INTEGER INCX,INCY,N
-*     ..
-*     .. Array Arguments ..
-      REAL SX(*),SY(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*     interchanges two vectors.
-*     uses unrolled loops for increments equal to 1.
-*     jack dongarra, linpack, 3/11/78.
-*     modified 12/3/93, array(1) declarations changed to array(*)
-*
-*
-*     .. Local Scalars ..
-      REAL STEMP
-      INTEGER I,IX,IY,M,MP1
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MOD
-*     ..
-      IF (N.LE.0) RETURN
-      IF (INCX.EQ.1 .AND. INCY.EQ.1) GO TO 20
-*
-*       code for unequal increments or equal increments not equal
-*         to 1
-*
-      IX = 1
-      IY = 1
-      IF (INCX.LT.0) IX = (-N+1)*INCX + 1
-      IF (INCY.LT.0) IY = (-N+1)*INCY + 1
-      DO 10 I = 1,N
-          STEMP = SX(IX)
-          SX(IX) = SY(IY)
-          SY(IY) = STEMP
-          IX = IX + INCX
-          IY = IY + INCY
-   10 CONTINUE
-      RETURN
-*
-*       code for both increments equal to 1
-*
-*
-*       clean-up loop
-*
-   20 M = MOD(N,3)
-      IF (M.EQ.0) GO TO 40
-      DO 30 I = 1,M
-          STEMP = SX(I)
-          SX(I) = SY(I)
-          SY(I) = STEMP
-   30 CONTINUE
-      IF (N.LT.3) RETURN
-   40 MP1 = M + 1
-      DO 50 I = MP1,N,3
-          STEMP = SX(I)
-          SX(I) = SY(I)
-          SY(I) = STEMP
-          STEMP = SX(I+1)
-          SX(I+1) = SY(I+1)
-          SY(I+1) = STEMP
-          STEMP = SX(I+2)
-          SX(I+2) = SY(I+2)
-          SY(I+2) = STEMP
-   50 CONTINUE
-      RETURN
-      END
--- a/libcruft/blas/ssymm.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,294 +0,0 @@
-      SUBROUTINE SSYMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC)
-*     .. Scalar Arguments ..
-      REAL ALPHA,BETA
-      INTEGER LDA,LDB,LDC,M,N
-      CHARACTER SIDE,UPLO
-*     ..
-*     .. Array Arguments ..
-      REAL A(LDA,*),B(LDB,*),C(LDC,*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SSYMM  performs one of the matrix-matrix operations
-*
-*     C := alpha*A*B + beta*C,
-*
-*  or
-*
-*     C := alpha*B*A + beta*C,
-*
-*  where alpha and beta are scalars,  A is a symmetric matrix and  B and
-*  C are  m by n matrices.
-*
-*  Arguments
-*  ==========
-*
-*  SIDE   - CHARACTER*1.
-*           On entry,  SIDE  specifies whether  the  symmetric matrix  A
-*           appears on the  left or right  in the  operation as follows:
-*
-*              SIDE = 'L' or 'l'   C := alpha*A*B + beta*C,
-*
-*              SIDE = 'R' or 'r'   C := alpha*B*A + beta*C,
-*
-*           Unchanged on exit.
-*
-*  UPLO   - CHARACTER*1.
-*           On  entry,   UPLO  specifies  whether  the  upper  or  lower
-*           triangular  part  of  the  symmetric  matrix   A  is  to  be
-*           referenced as follows:
-*
-*              UPLO = 'U' or 'u'   Only the upper triangular part of the
-*                                  symmetric matrix is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the lower triangular part of the
-*                                  symmetric matrix is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry,  M  specifies the number of rows of the matrix  C.
-*           M  must be at least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of the matrix C.
-*           N  must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - REAL            .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - REAL             array of DIMENSION ( LDA, ka ), where ka is
-*           m  when  SIDE = 'L' or 'l'  and is  n otherwise.
-*           Before entry  with  SIDE = 'L' or 'l',  the  m by m  part of
-*           the array  A  must contain the  symmetric matrix,  such that
-*           when  UPLO = 'U' or 'u', the leading m by m upper triangular
-*           part of the array  A  must contain the upper triangular part
-*           of the  symmetric matrix and the  strictly  lower triangular
-*           part of  A  is not referenced,  and when  UPLO = 'L' or 'l',
-*           the leading  m by m  lower triangular part  of the  array  A
-*           must  contain  the  lower triangular part  of the  symmetric
-*           matrix and the  strictly upper triangular part of  A  is not
-*           referenced.
-*           Before entry  with  SIDE = 'R' or 'r',  the  n by n  part of
-*           the array  A  must contain the  symmetric matrix,  such that
-*           when  UPLO = 'U' or 'u', the leading n by n upper triangular
-*           part of the array  A  must contain the upper triangular part
-*           of the  symmetric matrix and the  strictly  lower triangular
-*           part of  A  is not referenced,  and when  UPLO = 'L' or 'l',
-*           the leading  n by n  lower triangular part  of the  array  A
-*           must  contain  the  lower triangular part  of the  symmetric
-*           matrix and the  strictly upper triangular part of  A  is not
-*           referenced.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program.  When  SIDE = 'L' or 'l'  then
-*           LDA must be at least  max( 1, m ), otherwise  LDA must be at
-*           least  max( 1, n ).
-*           Unchanged on exit.
-*
-*  B      - REAL             array of DIMENSION ( LDB, n ).
-*           Before entry, the leading  m by n part of the array  B  must
-*           contain the matrix B.
-*           Unchanged on exit.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in  the  calling  (sub)  program.   LDB  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*  BETA   - REAL            .
-*           On entry,  BETA  specifies the scalar  beta.  When  BETA  is
-*           supplied as zero then C need not be set on input.
-*           Unchanged on exit.
-*
-*  C      - REAL             array of DIMENSION ( LDC, n ).
-*           Before entry, the leading  m by n  part of the array  C must
-*           contain the matrix  C,  except when  beta  is zero, in which
-*           case C need not be set on entry.
-*           On exit, the array  C  is overwritten by the  m by n updated
-*           matrix.
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX
-*     ..
-*     .. Local Scalars ..
-      REAL TEMP1,TEMP2
-      INTEGER I,INFO,J,K,NROWA
-      LOGICAL UPPER
-*     ..
-*     .. Parameters ..
-      REAL ONE,ZERO
-      PARAMETER (ONE=1.0E+0,ZERO=0.0E+0)
-*     ..
-*
-*     Set NROWA as the number of rows of A.
-*
-      IF (LSAME(SIDE,'L')) THEN
-          NROWA = M
-      ELSE
-          NROWA = N
-      END IF
-      UPPER = LSAME(UPLO,'U')
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF ((.NOT.LSAME(SIDE,'L')) .AND. (.NOT.LSAME(SIDE,'R'))) THEN
-          INFO = 1
-      ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
-          INFO = 2
-      ELSE IF (M.LT.0) THEN
-          INFO = 3
-      ELSE IF (N.LT.0) THEN
-          INFO = 4
-      ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
-          INFO = 7
-      ELSE IF (LDB.LT.MAX(1,M)) THEN
-          INFO = 9
-      ELSE IF (LDC.LT.MAX(1,M)) THEN
-          INFO = 12
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('SSYMM ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
-     +    ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF (ALPHA.EQ.ZERO) THEN
-          IF (BETA.EQ.ZERO) THEN
-              DO 20 J = 1,N
-                  DO 10 I = 1,M
-                      C(I,J) = ZERO
-   10             CONTINUE
-   20         CONTINUE
-          ELSE
-              DO 40 J = 1,N
-                  DO 30 I = 1,M
-                      C(I,J) = BETA*C(I,J)
-   30             CONTINUE
-   40         CONTINUE
-          END IF
-          RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF (LSAME(SIDE,'L')) THEN
-*
-*        Form  C := alpha*A*B + beta*C.
-*
-          IF (UPPER) THEN
-              DO 70 J = 1,N
-                  DO 60 I = 1,M
-                      TEMP1 = ALPHA*B(I,J)
-                      TEMP2 = ZERO
-                      DO 50 K = 1,I - 1
-                          C(K,J) = C(K,J) + TEMP1*A(K,I)
-                          TEMP2 = TEMP2 + B(K,J)*A(K,I)
-   50                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = TEMP1*A(I,I) + ALPHA*TEMP2
-                      ELSE
-                          C(I,J) = BETA*C(I,J) + TEMP1*A(I,I) +
-     +                             ALPHA*TEMP2
-                      END IF
-   60             CONTINUE
-   70         CONTINUE
-          ELSE
-              DO 100 J = 1,N
-                  DO 90 I = M,1,-1
-                      TEMP1 = ALPHA*B(I,J)
-                      TEMP2 = ZERO
-                      DO 80 K = I + 1,M
-                          C(K,J) = C(K,J) + TEMP1*A(K,I)
-                          TEMP2 = TEMP2 + B(K,J)*A(K,I)
-   80                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = TEMP1*A(I,I) + ALPHA*TEMP2
-                      ELSE
-                          C(I,J) = BETA*C(I,J) + TEMP1*A(I,I) +
-     +                             ALPHA*TEMP2
-                      END IF
-   90             CONTINUE
-  100         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  C := alpha*B*A + beta*C.
-*
-          DO 170 J = 1,N
-              TEMP1 = ALPHA*A(J,J)
-              IF (BETA.EQ.ZERO) THEN
-                  DO 110 I = 1,M
-                      C(I,J) = TEMP1*B(I,J)
-  110             CONTINUE
-              ELSE
-                  DO 120 I = 1,M
-                      C(I,J) = BETA*C(I,J) + TEMP1*B(I,J)
-  120             CONTINUE
-              END IF
-              DO 140 K = 1,J - 1
-                  IF (UPPER) THEN
-                      TEMP1 = ALPHA*A(K,J)
-                  ELSE
-                      TEMP1 = ALPHA*A(J,K)
-                  END IF
-                  DO 130 I = 1,M
-                      C(I,J) = C(I,J) + TEMP1*B(I,K)
-  130             CONTINUE
-  140         CONTINUE
-              DO 160 K = J + 1,N
-                  IF (UPPER) THEN
-                      TEMP1 = ALPHA*A(J,K)
-                  ELSE
-                      TEMP1 = ALPHA*A(K,J)
-                  END IF
-                  DO 150 I = 1,M
-                      C(I,J) = C(I,J) + TEMP1*B(I,K)
-  150             CONTINUE
-  160         CONTINUE
-  170     CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of SSYMM .
-*
-      END
--- a/libcruft/blas/ssymv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,262 +0,0 @@
-      SUBROUTINE SSYMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
-*     .. Scalar Arguments ..
-      REAL ALPHA,BETA
-      INTEGER INCX,INCY,LDA,N
-      CHARACTER UPLO
-*     ..
-*     .. Array Arguments ..
-      REAL A(LDA,*),X(*),Y(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SSYMV  performs the matrix-vector  operation
-*
-*     y := alpha*A*x + beta*y,
-*
-*  where alpha and beta are scalars, x and y are n element vectors and
-*  A is an n by n symmetric matrix.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the upper or lower
-*           triangular part of the array A is to be referenced as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the upper triangular part of A
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the lower triangular part of A
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - REAL            .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - REAL             array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular part of the symmetric matrix and the strictly
-*           lower triangular part of A is not referenced.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular part of the symmetric matrix and the strictly
-*           upper triangular part of A is not referenced.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*  X      - REAL             array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  BETA   - REAL            .
-*           On entry, BETA specifies the scalar beta. When BETA is
-*           supplied as zero then Y need not be set on input.
-*           Unchanged on exit.
-*
-*  Y      - REAL             array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ).
-*           Before entry, the incremented array Y must contain the n
-*           element vector y. On exit, Y is overwritten by the updated
-*           vector y.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      REAL ONE,ZERO
-      PARAMETER (ONE=1.0E+0,ZERO=0.0E+0)
-*     ..
-*     .. Local Scalars ..
-      REAL TEMP1,TEMP2
-      INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY
-*     ..
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX
-*     ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN
-          INFO = 1
-      ELSE IF (N.LT.0) THEN
-          INFO = 2
-      ELSE IF (LDA.LT.MAX(1,N)) THEN
-          INFO = 5
-      ELSE IF (INCX.EQ.0) THEN
-          INFO = 7
-      ELSE IF (INCY.EQ.0) THEN
-          INFO = 10
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('SSYMV ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((N.EQ.0) .OR. ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
-*
-*     Set up the start points in  X  and  Y.
-*
-      IF (INCX.GT.0) THEN
-          KX = 1
-      ELSE
-          KX = 1 - (N-1)*INCX
-      END IF
-      IF (INCY.GT.0) THEN
-          KY = 1
-      ELSE
-          KY = 1 - (N-1)*INCY
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through the triangular part
-*     of A.
-*
-*     First form  y := beta*y.
-*
-      IF (BETA.NE.ONE) THEN
-          IF (INCY.EQ.1) THEN
-              IF (BETA.EQ.ZERO) THEN
-                  DO 10 I = 1,N
-                      Y(I) = ZERO
-   10             CONTINUE
-              ELSE
-                  DO 20 I = 1,N
-                      Y(I) = BETA*Y(I)
-   20             CONTINUE
-              END IF
-          ELSE
-              IY = KY
-              IF (BETA.EQ.ZERO) THEN
-                  DO 30 I = 1,N
-                      Y(IY) = ZERO
-                      IY = IY + INCY
-   30             CONTINUE
-              ELSE
-                  DO 40 I = 1,N
-                      Y(IY) = BETA*Y(IY)
-                      IY = IY + INCY
-   40             CONTINUE
-              END IF
-          END IF
-      END IF
-      IF (ALPHA.EQ.ZERO) RETURN
-      IF (LSAME(UPLO,'U')) THEN
-*
-*        Form  y  when A is stored in upper triangle.
-*
-          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN
-              DO 60 J = 1,N
-                  TEMP1 = ALPHA*X(J)
-                  TEMP2 = ZERO
-                  DO 50 I = 1,J - 1
-                      Y(I) = Y(I) + TEMP1*A(I,J)
-                      TEMP2 = TEMP2 + A(I,J)*X(I)
-   50             CONTINUE
-                  Y(J) = Y(J) + TEMP1*A(J,J) + ALPHA*TEMP2
-   60         CONTINUE
-          ELSE
-              JX = KX
-              JY = KY
-              DO 80 J = 1,N
-                  TEMP1 = ALPHA*X(JX)
-                  TEMP2 = ZERO
-                  IX = KX
-                  IY = KY
-                  DO 70 I = 1,J - 1
-                      Y(IY) = Y(IY) + TEMP1*A(I,J)
-                      TEMP2 = TEMP2 + A(I,J)*X(IX)
-                      IX = IX + INCX
-                      IY = IY + INCY
-   70             CONTINUE
-                  Y(JY) = Y(JY) + TEMP1*A(J,J) + ALPHA*TEMP2
-                  JX = JX + INCX
-                  JY = JY + INCY
-   80         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  y  when A is stored in lower triangle.
-*
-          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN
-              DO 100 J = 1,N
-                  TEMP1 = ALPHA*X(J)
-                  TEMP2 = ZERO
-                  Y(J) = Y(J) + TEMP1*A(J,J)
-                  DO 90 I = J + 1,N
-                      Y(I) = Y(I) + TEMP1*A(I,J)
-                      TEMP2 = TEMP2 + A(I,J)*X(I)
-   90             CONTINUE
-                  Y(J) = Y(J) + ALPHA*TEMP2
-  100         CONTINUE
-          ELSE
-              JX = KX
-              JY = KY
-              DO 120 J = 1,N
-                  TEMP1 = ALPHA*X(JX)
-                  TEMP2 = ZERO
-                  Y(JY) = Y(JY) + TEMP1*A(J,J)
-                  IX = JX
-                  IY = JY
-                  DO 110 I = J + 1,N
-                      IX = IX + INCX
-                      IY = IY + INCY
-                      Y(IY) = Y(IY) + TEMP1*A(I,J)
-                      TEMP2 = TEMP2 + A(I,J)*X(IX)
-  110             CONTINUE
-                  Y(JY) = Y(JY) + ALPHA*TEMP2
-                  JX = JX + INCX
-                  JY = JY + INCY
-  120         CONTINUE
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of SSYMV .
-*
-      END
--- a/libcruft/blas/ssyr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,199 +0,0 @@
-      SUBROUTINE SSYR(UPLO,N,ALPHA,X,INCX,A,LDA)
-*     .. Scalar Arguments ..
-      REAL ALPHA
-      INTEGER INCX,LDA,N
-      CHARACTER UPLO
-*     ..
-*     .. Array Arguments ..
-      REAL A(LDA,*),X(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SSYR   performs the symmetric rank 1 operation
-*
-*     A := alpha*x*x' + A,
-*
-*  where alpha is a real scalar, x is an n element vector and A is an
-*  n by n symmetric matrix.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the upper or lower
-*           triangular part of the array A is to be referenced as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the upper triangular part of A
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the lower triangular part of A
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - REAL            .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  X      - REAL             array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  A      - REAL             array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular part of the symmetric matrix and the strictly
-*           lower triangular part of A is not referenced. On exit, the
-*           upper triangular part of the array A is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular part of the symmetric matrix and the strictly
-*           upper triangular part of A is not referenced. On exit, the
-*           lower triangular part of the array A is overwritten by the
-*           lower triangular part of the updated matrix.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      REAL ZERO
-      PARAMETER (ZERO=0.0E+0)
-*     ..
-*     .. Local Scalars ..
-      REAL TEMP
-      INTEGER I,INFO,IX,J,JX,KX
-*     ..
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX
-*     ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN
-          INFO = 1
-      ELSE IF (N.LT.0) THEN
-          INFO = 2
-      ELSE IF (INCX.EQ.0) THEN
-          INFO = 5
-      ELSE IF (LDA.LT.MAX(1,N)) THEN
-          INFO = 7
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('SSYR  ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((N.EQ.0) .OR. (ALPHA.EQ.ZERO)) RETURN
-*
-*     Set the start point in X if the increment is not unity.
-*
-      IF (INCX.LE.0) THEN
-          KX = 1 - (N-1)*INCX
-      ELSE IF (INCX.NE.1) THEN
-          KX = 1
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through the triangular part
-*     of A.
-*
-      IF (LSAME(UPLO,'U')) THEN
-*
-*        Form  A  when A is stored in upper triangle.
-*
-          IF (INCX.EQ.1) THEN
-              DO 20 J = 1,N
-                  IF (X(J).NE.ZERO) THEN
-                      TEMP = ALPHA*X(J)
-                      DO 10 I = 1,J
-                          A(I,J) = A(I,J) + X(I)*TEMP
-   10                 CONTINUE
-                  END IF
-   20         CONTINUE
-          ELSE
-              JX = KX
-              DO 40 J = 1,N
-                  IF (X(JX).NE.ZERO) THEN
-                      TEMP = ALPHA*X(JX)
-                      IX = KX
-                      DO 30 I = 1,J
-                          A(I,J) = A(I,J) + X(IX)*TEMP
-                          IX = IX + INCX
-   30                 CONTINUE
-                  END IF
-                  JX = JX + INCX
-   40         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  A  when A is stored in lower triangle.
-*
-          IF (INCX.EQ.1) THEN
-              DO 60 J = 1,N
-                  IF (X(J).NE.ZERO) THEN
-                      TEMP = ALPHA*X(J)
-                      DO 50 I = J,N
-                          A(I,J) = A(I,J) + X(I)*TEMP
-   50                 CONTINUE
-                  END IF
-   60         CONTINUE
-          ELSE
-              JX = KX
-              DO 80 J = 1,N
-                  IF (X(JX).NE.ZERO) THEN
-                      TEMP = ALPHA*X(JX)
-                      IX = JX
-                      DO 70 I = J,N
-                          A(I,J) = A(I,J) + X(IX)*TEMP
-                          IX = IX + INCX
-   70                 CONTINUE
-                  END IF
-                  JX = JX + INCX
-   80         CONTINUE
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of SSYR  .
-*
-      END
--- a/libcruft/blas/ssyr2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,230 +0,0 @@
-      SUBROUTINE SSYR2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA)
-*     .. Scalar Arguments ..
-      REAL ALPHA
-      INTEGER INCX,INCY,LDA,N
-      CHARACTER UPLO
-*     ..
-*     .. Array Arguments ..
-      REAL A(LDA,*),X(*),Y(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SSYR2  performs the symmetric rank 2 operation
-*
-*     A := alpha*x*y' + alpha*y*x' + A,
-*
-*  where alpha is a scalar, x and y are n element vectors and A is an n
-*  by n symmetric matrix.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the upper or lower
-*           triangular part of the array A is to be referenced as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the upper triangular part of A
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the lower triangular part of A
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - REAL            .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  X      - REAL             array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  Y      - REAL             array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ).
-*           Before entry, the incremented array Y must contain the n
-*           element vector y.
-*           Unchanged on exit.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*  A      - REAL             array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular part of the symmetric matrix and the strictly
-*           lower triangular part of A is not referenced. On exit, the
-*           upper triangular part of the array A is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular part of the symmetric matrix and the strictly
-*           upper triangular part of A is not referenced. On exit, the
-*           lower triangular part of the array A is overwritten by the
-*           lower triangular part of the updated matrix.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      REAL ZERO
-      PARAMETER (ZERO=0.0E+0)
-*     ..
-*     .. Local Scalars ..
-      REAL TEMP1,TEMP2
-      INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY
-*     ..
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX
-*     ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN
-          INFO = 1
-      ELSE IF (N.LT.0) THEN
-          INFO = 2
-      ELSE IF (INCX.EQ.0) THEN
-          INFO = 5
-      ELSE IF (INCY.EQ.0) THEN
-          INFO = 7
-      ELSE IF (LDA.LT.MAX(1,N)) THEN
-          INFO = 9
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('SSYR2 ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((N.EQ.0) .OR. (ALPHA.EQ.ZERO)) RETURN
-*
-*     Set up the start points in X and Y if the increments are not both
-*     unity.
-*
-      IF ((INCX.NE.1) .OR. (INCY.NE.1)) THEN
-          IF (INCX.GT.0) THEN
-              KX = 1
-          ELSE
-              KX = 1 - (N-1)*INCX
-          END IF
-          IF (INCY.GT.0) THEN
-              KY = 1
-          ELSE
-              KY = 1 - (N-1)*INCY
-          END IF
-          JX = KX
-          JY = KY
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through the triangular part
-*     of A.
-*
-      IF (LSAME(UPLO,'U')) THEN
-*
-*        Form  A  when A is stored in the upper triangle.
-*
-          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN
-              DO 20 J = 1,N
-                  IF ((X(J).NE.ZERO) .OR. (Y(J).NE.ZERO)) THEN
-                      TEMP1 = ALPHA*Y(J)
-                      TEMP2 = ALPHA*X(J)
-                      DO 10 I = 1,J
-                          A(I,J) = A(I,J) + X(I)*TEMP1 + Y(I)*TEMP2
-   10                 CONTINUE
-                  END IF
-   20         CONTINUE
-          ELSE
-              DO 40 J = 1,N
-                  IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THEN
-                      TEMP1 = ALPHA*Y(JY)
-                      TEMP2 = ALPHA*X(JX)
-                      IX = KX
-                      IY = KY
-                      DO 30 I = 1,J
-                          A(I,J) = A(I,J) + X(IX)*TEMP1 + Y(IY)*TEMP2
-                          IX = IX + INCX
-                          IY = IY + INCY
-   30                 CONTINUE
-                  END IF
-                  JX = JX + INCX
-                  JY = JY + INCY
-   40         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  A  when A is stored in the lower triangle.
-*
-          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN
-              DO 60 J = 1,N
-                  IF ((X(J).NE.ZERO) .OR. (Y(J).NE.ZERO)) THEN
-                      TEMP1 = ALPHA*Y(J)
-                      TEMP2 = ALPHA*X(J)
-                      DO 50 I = J,N
-                          A(I,J) = A(I,J) + X(I)*TEMP1 + Y(I)*TEMP2
-   50                 CONTINUE
-                  END IF
-   60         CONTINUE
-          ELSE
-              DO 80 J = 1,N
-                  IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THEN
-                      TEMP1 = ALPHA*Y(JY)
-                      TEMP2 = ALPHA*X(JX)
-                      IX = JX
-                      IY = JY
-                      DO 70 I = J,N
-                          A(I,J) = A(I,J) + X(IX)*TEMP1 + Y(IY)*TEMP2
-                          IX = IX + INCX
-                          IY = IY + INCY
-   70                 CONTINUE
-                  END IF
-                  JX = JX + INCX
-                  JY = JY + INCY
-   80         CONTINUE
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of SSYR2 .
-*
-      END
--- a/libcruft/blas/ssyr2k.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,326 +0,0 @@
-      SUBROUTINE SSYR2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC)
-*     .. Scalar Arguments ..
-      REAL ALPHA,BETA
-      INTEGER K,LDA,LDB,LDC,N
-      CHARACTER TRANS,UPLO
-*     ..
-*     .. Array Arguments ..
-      REAL A(LDA,*),B(LDB,*),C(LDC,*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SSYR2K  performs one of the symmetric rank 2k operations
-*
-*     C := alpha*A*B' + alpha*B*A' + beta*C,
-*
-*  or
-*
-*     C := alpha*A'*B + alpha*B'*A + beta*C,
-*
-*  where  alpha and beta  are scalars, C is an  n by n  symmetric matrix
-*  and  A and B  are  n by k  matrices  in the  first  case  and  k by n
-*  matrices in the second case.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On  entry,   UPLO  specifies  whether  the  upper  or  lower
-*           triangular  part  of the  array  C  is to be  referenced  as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the  upper triangular part of  C
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the  lower triangular part of  C
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry,  TRANS  specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   C := alpha*A*B' + alpha*B*A' +
-*                                        beta*C.
-*
-*              TRANS = 'T' or 't'   C := alpha*A'*B + alpha*B'*A +
-*                                        beta*C.
-*
-*              TRANS = 'C' or 'c'   C := alpha*A'*B + alpha*B'*A +
-*                                        beta*C.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry,  N specifies the order of the matrix C.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry with  TRANS = 'N' or 'n',  K  specifies  the number
-*           of  columns  of the  matrices  A and B,  and on  entry  with
-*           TRANS = 'T' or 't' or 'C' or 'c',  K  specifies  the  number
-*           of rows of the matrices  A and B.  K must be at least  zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - REAL            .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - REAL             array of DIMENSION ( LDA, ka ), where ka is
-*           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
-*           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
-*           part of the array  A  must contain the matrix  A,  otherwise
-*           the leading  k by n  part of the array  A  must contain  the
-*           matrix A.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
-*           then  LDA must be at least  max( 1, n ), otherwise  LDA must
-*           be at least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  B      - REAL             array of DIMENSION ( LDB, kb ), where kb is
-*           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
-*           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
-*           part of the array  B  must contain the matrix  B,  otherwise
-*           the leading  k by n  part of the array  B  must contain  the
-*           matrix B.
-*           Unchanged on exit.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
-*           then  LDB must be at least  max( 1, n ), otherwise  LDB must
-*           be at least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  BETA   - REAL            .
-*           On entry, BETA specifies the scalar beta.
-*           Unchanged on exit.
-*
-*  C      - REAL             array of DIMENSION ( LDC, n ).
-*           Before entry  with  UPLO = 'U' or 'u',  the leading  n by n
-*           upper triangular part of the array C must contain the upper
-*           triangular part  of the  symmetric matrix  and the strictly
-*           lower triangular part of C is not referenced.  On exit, the
-*           upper triangular part of the array  C is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry  with  UPLO = 'L' or 'l',  the leading  n by n
-*           lower triangular part of the array C must contain the lower
-*           triangular part  of the  symmetric matrix  and the strictly
-*           upper triangular part of C is not referenced.  On exit, the
-*           lower triangular part of the array  C is overwritten by the
-*           lower triangular part of the updated matrix.
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX
-*     ..
-*     .. Local Scalars ..
-      REAL TEMP1,TEMP2
-      INTEGER I,INFO,J,L,NROWA
-      LOGICAL UPPER
-*     ..
-*     .. Parameters ..
-      REAL ONE,ZERO
-      PARAMETER (ONE=1.0E+0,ZERO=0.0E+0)
-*     ..
-*
-*     Test the input parameters.
-*
-      IF (LSAME(TRANS,'N')) THEN
-          NROWA = N
-      ELSE
-          NROWA = K
-      END IF
-      UPPER = LSAME(UPLO,'U')
-*
-      INFO = 0
-      IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
-          INFO = 1
-      ELSE IF ((.NOT.LSAME(TRANS,'N')) .AND.
-     +         (.NOT.LSAME(TRANS,'T')) .AND.
-     +         (.NOT.LSAME(TRANS,'C'))) THEN
-          INFO = 2
-      ELSE IF (N.LT.0) THEN
-          INFO = 3
-      ELSE IF (K.LT.0) THEN
-          INFO = 4
-      ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
-          INFO = 7
-      ELSE IF (LDB.LT.MAX(1,NROWA)) THEN
-          INFO = 9
-      ELSE IF (LDC.LT.MAX(1,N)) THEN
-          INFO = 12
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('SSYR2K',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((N.EQ.0) .OR. (((ALPHA.EQ.ZERO).OR.
-     +    (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF (ALPHA.EQ.ZERO) THEN
-          IF (UPPER) THEN
-              IF (BETA.EQ.ZERO) THEN
-                  DO 20 J = 1,N
-                      DO 10 I = 1,J
-                          C(I,J) = ZERO
-   10                 CONTINUE
-   20             CONTINUE
-              ELSE
-                  DO 40 J = 1,N
-                      DO 30 I = 1,J
-                          C(I,J) = BETA*C(I,J)
-   30                 CONTINUE
-   40             CONTINUE
-              END IF
-          ELSE
-              IF (BETA.EQ.ZERO) THEN
-                  DO 60 J = 1,N
-                      DO 50 I = J,N
-                          C(I,J) = ZERO
-   50                 CONTINUE
-   60             CONTINUE
-              ELSE
-                  DO 80 J = 1,N
-                      DO 70 I = J,N
-                          C(I,J) = BETA*C(I,J)
-   70                 CONTINUE
-   80             CONTINUE
-              END IF
-          END IF
-          RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF (LSAME(TRANS,'N')) THEN
-*
-*        Form  C := alpha*A*B' + alpha*B*A' + C.
-*
-          IF (UPPER) THEN
-              DO 130 J = 1,N
-                  IF (BETA.EQ.ZERO) THEN
-                      DO 90 I = 1,J
-                          C(I,J) = ZERO
-   90                 CONTINUE
-                  ELSE IF (BETA.NE.ONE) THEN
-                      DO 100 I = 1,J
-                          C(I,J) = BETA*C(I,J)
-  100                 CONTINUE
-                  END IF
-                  DO 120 L = 1,K
-                      IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THEN
-                          TEMP1 = ALPHA*B(J,L)
-                          TEMP2 = ALPHA*A(J,L)
-                          DO 110 I = 1,J
-                              C(I,J) = C(I,J) + A(I,L)*TEMP1 +
-     +                                 B(I,L)*TEMP2
-  110                     CONTINUE
-                      END IF
-  120             CONTINUE
-  130         CONTINUE
-          ELSE
-              DO 180 J = 1,N
-                  IF (BETA.EQ.ZERO) THEN
-                      DO 140 I = J,N
-                          C(I,J) = ZERO
-  140                 CONTINUE
-                  ELSE IF (BETA.NE.ONE) THEN
-                      DO 150 I = J,N
-                          C(I,J) = BETA*C(I,J)
-  150                 CONTINUE
-                  END IF
-                  DO 170 L = 1,K
-                      IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THEN
-                          TEMP1 = ALPHA*B(J,L)
-                          TEMP2 = ALPHA*A(J,L)
-                          DO 160 I = J,N
-                              C(I,J) = C(I,J) + A(I,L)*TEMP1 +
-     +                                 B(I,L)*TEMP2
-  160                     CONTINUE
-                      END IF
-  170             CONTINUE
-  180         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  C := alpha*A'*B + alpha*B'*A + C.
-*
-          IF (UPPER) THEN
-              DO 210 J = 1,N
-                  DO 200 I = 1,J
-                      TEMP1 = ZERO
-                      TEMP2 = ZERO
-                      DO 190 L = 1,K
-                          TEMP1 = TEMP1 + A(L,I)*B(L,J)
-                          TEMP2 = TEMP2 + B(L,I)*A(L,J)
-  190                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP1 + ALPHA*TEMP2
-                      ELSE
-                          C(I,J) = BETA*C(I,J) + ALPHA*TEMP1 +
-     +                             ALPHA*TEMP2
-                      END IF
-  200             CONTINUE
-  210         CONTINUE
-          ELSE
-              DO 240 J = 1,N
-                  DO 230 I = J,N
-                      TEMP1 = ZERO
-                      TEMP2 = ZERO
-                      DO 220 L = 1,K
-                          TEMP1 = TEMP1 + A(L,I)*B(L,J)
-                          TEMP2 = TEMP2 + B(L,I)*A(L,J)
-  220                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP1 + ALPHA*TEMP2
-                      ELSE
-                          C(I,J) = BETA*C(I,J) + ALPHA*TEMP1 +
-     +                             ALPHA*TEMP2
-                      END IF
-  230             CONTINUE
-  240         CONTINUE
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of SSYR2K.
-*
-      END
--- a/libcruft/blas/ssyrk.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,295 +0,0 @@
-      SUBROUTINE SSYRK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC)
-*     .. Scalar Arguments ..
-      REAL ALPHA,BETA
-      INTEGER K,LDA,LDC,N
-      CHARACTER TRANS,UPLO
-*     ..
-*     .. Array Arguments ..
-      REAL A(LDA,*),C(LDC,*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SSYRK  performs one of the symmetric rank k operations
-*
-*     C := alpha*A*A' + beta*C,
-*
-*  or
-*
-*     C := alpha*A'*A + beta*C,
-*
-*  where  alpha and beta  are scalars, C is an  n by n  symmetric matrix
-*  and  A  is an  n by k  matrix in the first case and a  k by n  matrix
-*  in the second case.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On  entry,   UPLO  specifies  whether  the  upper  or  lower
-*           triangular  part  of the  array  C  is to be  referenced  as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the  upper triangular part of  C
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the  lower triangular part of  C
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry,  TRANS  specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   C := alpha*A*A' + beta*C.
-*
-*              TRANS = 'T' or 't'   C := alpha*A'*A + beta*C.
-*
-*              TRANS = 'C' or 'c'   C := alpha*A'*A + beta*C.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry,  N specifies the order of the matrix C.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry with  TRANS = 'N' or 'n',  K  specifies  the number
-*           of  columns   of  the   matrix   A,   and  on   entry   with
-*           TRANS = 'T' or 't' or 'C' or 'c',  K  specifies  the  number
-*           of rows of the matrix  A.  K must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - REAL            .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - REAL             array of DIMENSION ( LDA, ka ), where ka is
-*           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
-*           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
-*           part of the array  A  must contain the matrix  A,  otherwise
-*           the leading  k by n  part of the array  A  must contain  the
-*           matrix A.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
-*           then  LDA must be at least  max( 1, n ), otherwise  LDA must
-*           be at least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  BETA   - REAL            .
-*           On entry, BETA specifies the scalar beta.
-*           Unchanged on exit.
-*
-*  C      - REAL             array of DIMENSION ( LDC, n ).
-*           Before entry  with  UPLO = 'U' or 'u',  the leading  n by n
-*           upper triangular part of the array C must contain the upper
-*           triangular part  of the  symmetric matrix  and the strictly
-*           lower triangular part of C is not referenced.  On exit, the
-*           upper triangular part of the array  C is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry  with  UPLO = 'L' or 'l',  the leading  n by n
-*           lower triangular part of the array C must contain the lower
-*           triangular part  of the  symmetric matrix  and the strictly
-*           upper triangular part of C is not referenced.  On exit, the
-*           lower triangular part of the array  C is overwritten by the
-*           lower triangular part of the updated matrix.
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX
-*     ..
-*     .. Local Scalars ..
-      REAL TEMP
-      INTEGER I,INFO,J,L,NROWA
-      LOGICAL UPPER
-*     ..
-*     .. Parameters ..
-      REAL ONE,ZERO
-      PARAMETER (ONE=1.0E+0,ZERO=0.0E+0)
-*     ..
-*
-*     Test the input parameters.
-*
-      IF (LSAME(TRANS,'N')) THEN
-          NROWA = N
-      ELSE
-          NROWA = K
-      END IF
-      UPPER = LSAME(UPLO,'U')
-*
-      INFO = 0
-      IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
-          INFO = 1
-      ELSE IF ((.NOT.LSAME(TRANS,'N')) .AND.
-     +         (.NOT.LSAME(TRANS,'T')) .AND.
-     +         (.NOT.LSAME(TRANS,'C'))) THEN
-          INFO = 2
-      ELSE IF (N.LT.0) THEN
-          INFO = 3
-      ELSE IF (K.LT.0) THEN
-          INFO = 4
-      ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
-          INFO = 7
-      ELSE IF (LDC.LT.MAX(1,N)) THEN
-          INFO = 10
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('SSYRK ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((N.EQ.0) .OR. (((ALPHA.EQ.ZERO).OR.
-     +    (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF (ALPHA.EQ.ZERO) THEN
-          IF (UPPER) THEN
-              IF (BETA.EQ.ZERO) THEN
-                  DO 20 J = 1,N
-                      DO 10 I = 1,J
-                          C(I,J) = ZERO
-   10                 CONTINUE
-   20             CONTINUE
-              ELSE
-                  DO 40 J = 1,N
-                      DO 30 I = 1,J
-                          C(I,J) = BETA*C(I,J)
-   30                 CONTINUE
-   40             CONTINUE
-              END IF
-          ELSE
-              IF (BETA.EQ.ZERO) THEN
-                  DO 60 J = 1,N
-                      DO 50 I = J,N
-                          C(I,J) = ZERO
-   50                 CONTINUE
-   60             CONTINUE
-              ELSE
-                  DO 80 J = 1,N
-                      DO 70 I = J,N
-                          C(I,J) = BETA*C(I,J)
-   70                 CONTINUE
-   80             CONTINUE
-              END IF
-          END IF
-          RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF (LSAME(TRANS,'N')) THEN
-*
-*        Form  C := alpha*A*A' + beta*C.
-*
-          IF (UPPER) THEN
-              DO 130 J = 1,N
-                  IF (BETA.EQ.ZERO) THEN
-                      DO 90 I = 1,J
-                          C(I,J) = ZERO
-   90                 CONTINUE
-                  ELSE IF (BETA.NE.ONE) THEN
-                      DO 100 I = 1,J
-                          C(I,J) = BETA*C(I,J)
-  100                 CONTINUE
-                  END IF
-                  DO 120 L = 1,K
-                      IF (A(J,L).NE.ZERO) THEN
-                          TEMP = ALPHA*A(J,L)
-                          DO 110 I = 1,J
-                              C(I,J) = C(I,J) + TEMP*A(I,L)
-  110                     CONTINUE
-                      END IF
-  120             CONTINUE
-  130         CONTINUE
-          ELSE
-              DO 180 J = 1,N
-                  IF (BETA.EQ.ZERO) THEN
-                      DO 140 I = J,N
-                          C(I,J) = ZERO
-  140                 CONTINUE
-                  ELSE IF (BETA.NE.ONE) THEN
-                      DO 150 I = J,N
-                          C(I,J) = BETA*C(I,J)
-  150                 CONTINUE
-                  END IF
-                  DO 170 L = 1,K
-                      IF (A(J,L).NE.ZERO) THEN
-                          TEMP = ALPHA*A(J,L)
-                          DO 160 I = J,N
-                              C(I,J) = C(I,J) + TEMP*A(I,L)
-  160                     CONTINUE
-                      END IF
-  170             CONTINUE
-  180         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  C := alpha*A'*A + beta*C.
-*
-          IF (UPPER) THEN
-              DO 210 J = 1,N
-                  DO 200 I = 1,J
-                      TEMP = ZERO
-                      DO 190 L = 1,K
-                          TEMP = TEMP + A(L,I)*A(L,J)
-  190                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP
-                      ELSE
-                          C(I,J) = ALPHA*TEMP + BETA*C(I,J)
-                      END IF
-  200             CONTINUE
-  210         CONTINUE
-          ELSE
-              DO 240 J = 1,N
-                  DO 230 I = J,N
-                      TEMP = ZERO
-                      DO 220 L = 1,K
-                          TEMP = TEMP + A(L,I)*A(L,J)
-  220                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP
-                      ELSE
-                          C(I,J) = ALPHA*TEMP + BETA*C(I,J)
-                      END IF
-  230             CONTINUE
-  240         CONTINUE
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of SSYRK .
-*
-      END
--- a/libcruft/blas/stbsv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,336 +0,0 @@
-      SUBROUTINE STBSV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX)
-*     .. Scalar Arguments ..
-      INTEGER INCX,K,LDA,N
-      CHARACTER DIAG,TRANS,UPLO
-*     ..
-*     .. Array Arguments ..
-      REAL A(LDA,*),X(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  STBSV  solves one of the systems of equations
-*
-*     A*x = b,   or   A'*x = b,
-*
-*  where b and x are n element vectors and A is an n by n unit, or
-*  non-unit, upper or lower triangular band matrix, with ( k + 1 )
-*  diagonals.
-*
-*  No test for singularity or near-singularity is included in this
-*  routine. Such tests must be performed before calling this routine.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry, TRANS specifies the equations to be solved as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   A*x = b.
-*
-*              TRANS = 'T' or 't'   A'*x = b.
-*
-*              TRANS = 'C' or 'c'   A'*x = b.
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit
-*           triangular as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry with UPLO = 'U' or 'u', K specifies the number of
-*           super-diagonals of the matrix A.
-*           On entry with UPLO = 'L' or 'l', K specifies the number of
-*           sub-diagonals of the matrix A.
-*           K must satisfy  0 .le. K.
-*           Unchanged on exit.
-*
-*  A      - REAL             array of DIMENSION ( LDA, n ).
-*           Before entry with UPLO = 'U' or 'u', the leading ( k + 1 )
-*           by n part of the array A must contain the upper triangular
-*           band part of the matrix of coefficients, supplied column by
-*           column, with the leading diagonal of the matrix in row
-*           ( k + 1 ) of the array, the first super-diagonal starting at
-*           position 2 in row k, and so on. The top left k by k triangle
-*           of the array A is not referenced.
-*           The following program segment will transfer an upper
-*           triangular band matrix from conventional full matrix storage
-*           to band storage:
-*
-*                 DO 20, J = 1, N
-*                    M = K + 1 - J
-*                    DO 10, I = MAX( 1, J - K ), J
-*                       A( M + I, J ) = matrix( I, J )
-*              10    CONTINUE
-*              20 CONTINUE
-*
-*           Before entry with UPLO = 'L' or 'l', the leading ( k + 1 )
-*           by n part of the array A must contain the lower triangular
-*           band part of the matrix of coefficients, supplied column by
-*           column, with the leading diagonal of the matrix in row 1 of
-*           the array, the first sub-diagonal starting at position 1 in
-*           row 2, and so on. The bottom right k by k triangle of the
-*           array A is not referenced.
-*           The following program segment will transfer a lower
-*           triangular band matrix from conventional full matrix storage
-*           to band storage:
-*
-*                 DO 20, J = 1, N
-*                    M = 1 - J
-*                    DO 10, I = J, MIN( N, J + K )
-*                       A( M + I, J ) = matrix( I, J )
-*              10    CONTINUE
-*              20 CONTINUE
-*
-*           Note that when DIAG = 'U' or 'u' the elements of the array A
-*           corresponding to the diagonal elements of the matrix are not
-*           referenced, but are assumed to be unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           ( k + 1 ).
-*           Unchanged on exit.
-*
-*  X      - REAL             array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element right-hand side vector b. On exit, X is overwritten
-*           with the solution vector x.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      REAL ZERO
-      PARAMETER (ZERO=0.0E+0)
-*     ..
-*     .. Local Scalars ..
-      REAL TEMP
-      INTEGER I,INFO,IX,J,JX,KPLUS1,KX,L
-      LOGICAL NOUNIT
-*     ..
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX,MIN
-*     ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN
-          INFO = 1
-      ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
-     +         .NOT.LSAME(TRANS,'C')) THEN
-          INFO = 2
-      ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN
-          INFO = 3
-      ELSE IF (N.LT.0) THEN
-          INFO = 4
-      ELSE IF (K.LT.0) THEN
-          INFO = 5
-      ELSE IF (LDA.LT. (K+1)) THEN
-          INFO = 7
-      ELSE IF (INCX.EQ.0) THEN
-          INFO = 9
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('STBSV ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF (N.EQ.0) RETURN
-*
-      NOUNIT = LSAME(DIAG,'N')
-*
-*     Set up the start point in X if the increment is not unity. This
-*     will be  ( N - 1 )*INCX  too small for descending loops.
-*
-      IF (INCX.LE.0) THEN
-          KX = 1 - (N-1)*INCX
-      ELSE IF (INCX.NE.1) THEN
-          KX = 1
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed by sequentially with one pass through A.
-*
-      IF (LSAME(TRANS,'N')) THEN
-*
-*        Form  x := inv( A )*x.
-*
-          IF (LSAME(UPLO,'U')) THEN
-              KPLUS1 = K + 1
-              IF (INCX.EQ.1) THEN
-                  DO 20 J = N,1,-1
-                      IF (X(J).NE.ZERO) THEN
-                          L = KPLUS1 - J
-                          IF (NOUNIT) X(J) = X(J)/A(KPLUS1,J)
-                          TEMP = X(J)
-                          DO 10 I = J - 1,MAX(1,J-K),-1
-                              X(I) = X(I) - TEMP*A(L+I,J)
-   10                     CONTINUE
-                      END IF
-   20             CONTINUE
-              ELSE
-                  KX = KX + (N-1)*INCX
-                  JX = KX
-                  DO 40 J = N,1,-1
-                      KX = KX - INCX
-                      IF (X(JX).NE.ZERO) THEN
-                          IX = KX
-                          L = KPLUS1 - J
-                          IF (NOUNIT) X(JX) = X(JX)/A(KPLUS1,J)
-                          TEMP = X(JX)
-                          DO 30 I = J - 1,MAX(1,J-K),-1
-                              X(IX) = X(IX) - TEMP*A(L+I,J)
-                              IX = IX - INCX
-   30                     CONTINUE
-                      END IF
-                      JX = JX - INCX
-   40             CONTINUE
-              END IF
-          ELSE
-              IF (INCX.EQ.1) THEN
-                  DO 60 J = 1,N
-                      IF (X(J).NE.ZERO) THEN
-                          L = 1 - J
-                          IF (NOUNIT) X(J) = X(J)/A(1,J)
-                          TEMP = X(J)
-                          DO 50 I = J + 1,MIN(N,J+K)
-                              X(I) = X(I) - TEMP*A(L+I,J)
-   50                     CONTINUE
-                      END IF
-   60             CONTINUE
-              ELSE
-                  JX = KX
-                  DO 80 J = 1,N
-                      KX = KX + INCX
-                      IF (X(JX).NE.ZERO) THEN
-                          IX = KX
-                          L = 1 - J
-                          IF (NOUNIT) X(JX) = X(JX)/A(1,J)
-                          TEMP = X(JX)
-                          DO 70 I = J + 1,MIN(N,J+K)
-                              X(IX) = X(IX) - TEMP*A(L+I,J)
-                              IX = IX + INCX
-   70                     CONTINUE
-                      END IF
-                      JX = JX + INCX
-   80             CONTINUE
-              END IF
-          END IF
-      ELSE
-*
-*        Form  x := inv( A')*x.
-*
-          IF (LSAME(UPLO,'U')) THEN
-              KPLUS1 = K + 1
-              IF (INCX.EQ.1) THEN
-                  DO 100 J = 1,N
-                      TEMP = X(J)
-                      L = KPLUS1 - J
-                      DO 90 I = MAX(1,J-K),J - 1
-                          TEMP = TEMP - A(L+I,J)*X(I)
-   90                 CONTINUE
-                      IF (NOUNIT) TEMP = TEMP/A(KPLUS1,J)
-                      X(J) = TEMP
-  100             CONTINUE
-              ELSE
-                  JX = KX
-                  DO 120 J = 1,N
-                      TEMP = X(JX)
-                      IX = KX
-                      L = KPLUS1 - J
-                      DO 110 I = MAX(1,J-K),J - 1
-                          TEMP = TEMP - A(L+I,J)*X(IX)
-                          IX = IX + INCX
-  110                 CONTINUE
-                      IF (NOUNIT) TEMP = TEMP/A(KPLUS1,J)
-                      X(JX) = TEMP
-                      JX = JX + INCX
-                      IF (J.GT.K) KX = KX + INCX
-  120             CONTINUE
-              END IF
-          ELSE
-              IF (INCX.EQ.1) THEN
-                  DO 140 J = N,1,-1
-                      TEMP = X(J)
-                      L = 1 - J
-                      DO 130 I = MIN(N,J+K),J + 1,-1
-                          TEMP = TEMP - A(L+I,J)*X(I)
-  130                 CONTINUE
-                      IF (NOUNIT) TEMP = TEMP/A(1,J)
-                      X(J) = TEMP
-  140             CONTINUE
-              ELSE
-                  KX = KX + (N-1)*INCX
-                  JX = KX
-                  DO 160 J = N,1,-1
-                      TEMP = X(JX)
-                      IX = KX
-                      L = 1 - J
-                      DO 150 I = MIN(N,J+K),J + 1,-1
-                          TEMP = TEMP - A(L+I,J)*X(IX)
-                          IX = IX - INCX
-  150                 CONTINUE
-                      IF (NOUNIT) TEMP = TEMP/A(1,J)
-                      X(JX) = TEMP
-                      JX = JX - INCX
-                      IF ((N-J).GE.K) KX = KX - INCX
-  160             CONTINUE
-              END IF
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of STBSV .
-*
-      END
--- a/libcruft/blas/strmm.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,346 +0,0 @@
-      SUBROUTINE STRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB)
-*     .. Scalar Arguments ..
-      REAL ALPHA
-      INTEGER LDA,LDB,M,N
-      CHARACTER DIAG,SIDE,TRANSA,UPLO
-*     ..
-*     .. Array Arguments ..
-      REAL A(LDA,*),B(LDB,*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  STRMM  performs one of the matrix-matrix operations
-*
-*     B := alpha*op( A )*B,   or   B := alpha*B*op( A ),
-*
-*  where  alpha  is a scalar,  B  is an m by n matrix,  A  is a unit, or
-*  non-unit,  upper or lower triangular matrix  and  op( A )  is one  of
-*
-*     op( A ) = A   or   op( A ) = A'.
-*
-*  Arguments
-*  ==========
-*
-*  SIDE   - CHARACTER*1.
-*           On entry,  SIDE specifies whether  op( A ) multiplies B from
-*           the left or right as follows:
-*
-*              SIDE = 'L' or 'l'   B := alpha*op( A )*B.
-*
-*              SIDE = 'R' or 'r'   B := alpha*B*op( A ).
-*
-*           Unchanged on exit.
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix A is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANSA - CHARACTER*1.
-*           On entry, TRANSA specifies the form of op( A ) to be used in
-*           the matrix multiplication as follows:
-*
-*              TRANSA = 'N' or 'n'   op( A ) = A.
-*
-*              TRANSA = 'T' or 't'   op( A ) = A'.
-*
-*              TRANSA = 'C' or 'c'   op( A ) = A'.
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit triangular
-*           as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of B. M must be at
-*           least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of B.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - REAL            .
-*           On entry,  ALPHA specifies the scalar  alpha. When  alpha is
-*           zero then  A is not referenced and  B need not be set before
-*           entry.
-*           Unchanged on exit.
-*
-*  A      - REAL             array of DIMENSION ( LDA, k ), where k is m
-*           when  SIDE = 'L' or 'l'  and is  n  when  SIDE = 'R' or 'r'.
-*           Before entry  with  UPLO = 'U' or 'u',  the  leading  k by k
-*           upper triangular part of the array  A must contain the upper
-*           triangular matrix  and the strictly lower triangular part of
-*           A is not referenced.
-*           Before entry  with  UPLO = 'L' or 'l',  the  leading  k by k
-*           lower triangular part of the array  A must contain the lower
-*           triangular matrix  and the strictly upper triangular part of
-*           A is not referenced.
-*           Note that when  DIAG = 'U' or 'u',  the diagonal elements of
-*           A  are not referenced either,  but are assumed to be  unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program.  When  SIDE = 'L' or 'l'  then
-*           LDA  must be at least  max( 1, m ),  when  SIDE = 'R' or 'r'
-*           then LDA must be at least max( 1, n ).
-*           Unchanged on exit.
-*
-*  B      - REAL             array of DIMENSION ( LDB, n ).
-*           Before entry,  the leading  m by n part of the array  B must
-*           contain the matrix  B,  and  on exit  is overwritten  by the
-*           transformed matrix.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in  the  calling  (sub)  program.   LDB  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX
-*     ..
-*     .. Local Scalars ..
-      REAL TEMP
-      INTEGER I,INFO,J,K,NROWA
-      LOGICAL LSIDE,NOUNIT,UPPER
-*     ..
-*     .. Parameters ..
-      REAL ONE,ZERO
-      PARAMETER (ONE=1.0E+0,ZERO=0.0E+0)
-*     ..
-*
-*     Test the input parameters.
-*
-      LSIDE = LSAME(SIDE,'L')
-      IF (LSIDE) THEN
-          NROWA = M
-      ELSE
-          NROWA = N
-      END IF
-      NOUNIT = LSAME(DIAG,'N')
-      UPPER = LSAME(UPLO,'U')
-*
-      INFO = 0
-      IF ((.NOT.LSIDE) .AND. (.NOT.LSAME(SIDE,'R'))) THEN
-          INFO = 1
-      ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
-          INFO = 2
-      ELSE IF ((.NOT.LSAME(TRANSA,'N')) .AND.
-     +         (.NOT.LSAME(TRANSA,'T')) .AND.
-     +         (.NOT.LSAME(TRANSA,'C'))) THEN
-          INFO = 3
-      ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN
-          INFO = 4
-      ELSE IF (M.LT.0) THEN
-          INFO = 5
-      ELSE IF (N.LT.0) THEN
-          INFO = 6
-      ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
-          INFO = 9
-      ELSE IF (LDB.LT.MAX(1,M)) THEN
-          INFO = 11
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('STRMM ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF (M.EQ.0 .OR. N.EQ.0) RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF (ALPHA.EQ.ZERO) THEN
-          DO 20 J = 1,N
-              DO 10 I = 1,M
-                  B(I,J) = ZERO
-   10         CONTINUE
-   20     CONTINUE
-          RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF (LSIDE) THEN
-          IF (LSAME(TRANSA,'N')) THEN
-*
-*           Form  B := alpha*A*B.
-*
-              IF (UPPER) THEN
-                  DO 50 J = 1,N
-                      DO 40 K = 1,M
-                          IF (B(K,J).NE.ZERO) THEN
-                              TEMP = ALPHA*B(K,J)
-                              DO 30 I = 1,K - 1
-                                  B(I,J) = B(I,J) + TEMP*A(I,K)
-   30                         CONTINUE
-                              IF (NOUNIT) TEMP = TEMP*A(K,K)
-                              B(K,J) = TEMP
-                          END IF
-   40                 CONTINUE
-   50             CONTINUE
-              ELSE
-                  DO 80 J = 1,N
-                      DO 70 K = M,1,-1
-                          IF (B(K,J).NE.ZERO) THEN
-                              TEMP = ALPHA*B(K,J)
-                              B(K,J) = TEMP
-                              IF (NOUNIT) B(K,J) = B(K,J)*A(K,K)
-                              DO 60 I = K + 1,M
-                                  B(I,J) = B(I,J) + TEMP*A(I,K)
-   60                         CONTINUE
-                          END IF
-   70                 CONTINUE
-   80             CONTINUE
-              END IF
-          ELSE
-*
-*           Form  B := alpha*A'*B.
-*
-              IF (UPPER) THEN
-                  DO 110 J = 1,N
-                      DO 100 I = M,1,-1
-                          TEMP = B(I,J)
-                          IF (NOUNIT) TEMP = TEMP*A(I,I)
-                          DO 90 K = 1,I - 1
-                              TEMP = TEMP + A(K,I)*B(K,J)
-   90                     CONTINUE
-                          B(I,J) = ALPHA*TEMP
-  100                 CONTINUE
-  110             CONTINUE
-              ELSE
-                  DO 140 J = 1,N
-                      DO 130 I = 1,M
-                          TEMP = B(I,J)
-                          IF (NOUNIT) TEMP = TEMP*A(I,I)
-                          DO 120 K = I + 1,M
-                              TEMP = TEMP + A(K,I)*B(K,J)
-  120                     CONTINUE
-                          B(I,J) = ALPHA*TEMP
-  130                 CONTINUE
-  140             CONTINUE
-              END IF
-          END IF
-      ELSE
-          IF (LSAME(TRANSA,'N')) THEN
-*
-*           Form  B := alpha*B*A.
-*
-              IF (UPPER) THEN
-                  DO 180 J = N,1,-1
-                      TEMP = ALPHA
-                      IF (NOUNIT) TEMP = TEMP*A(J,J)
-                      DO 150 I = 1,M
-                          B(I,J) = TEMP*B(I,J)
-  150                 CONTINUE
-                      DO 170 K = 1,J - 1
-                          IF (A(K,J).NE.ZERO) THEN
-                              TEMP = ALPHA*A(K,J)
-                              DO 160 I = 1,M
-                                  B(I,J) = B(I,J) + TEMP*B(I,K)
-  160                         CONTINUE
-                          END IF
-  170                 CONTINUE
-  180             CONTINUE
-              ELSE
-                  DO 220 J = 1,N
-                      TEMP = ALPHA
-                      IF (NOUNIT) TEMP = TEMP*A(J,J)
-                      DO 190 I = 1,M
-                          B(I,J) = TEMP*B(I,J)
-  190                 CONTINUE
-                      DO 210 K = J + 1,N
-                          IF (A(K,J).NE.ZERO) THEN
-                              TEMP = ALPHA*A(K,J)
-                              DO 200 I = 1,M
-                                  B(I,J) = B(I,J) + TEMP*B(I,K)
-  200                         CONTINUE
-                          END IF
-  210                 CONTINUE
-  220             CONTINUE
-              END IF
-          ELSE
-*
-*           Form  B := alpha*B*A'.
-*
-              IF (UPPER) THEN
-                  DO 260 K = 1,N
-                      DO 240 J = 1,K - 1
-                          IF (A(J,K).NE.ZERO) THEN
-                              TEMP = ALPHA*A(J,K)
-                              DO 230 I = 1,M
-                                  B(I,J) = B(I,J) + TEMP*B(I,K)
-  230                         CONTINUE
-                          END IF
-  240                 CONTINUE
-                      TEMP = ALPHA
-                      IF (NOUNIT) TEMP = TEMP*A(K,K)
-                      IF (TEMP.NE.ONE) THEN
-                          DO 250 I = 1,M
-                              B(I,K) = TEMP*B(I,K)
-  250                     CONTINUE
-                      END IF
-  260             CONTINUE
-              ELSE
-                  DO 300 K = N,1,-1
-                      DO 280 J = K + 1,N
-                          IF (A(J,K).NE.ZERO) THEN
-                              TEMP = ALPHA*A(J,K)
-                              DO 270 I = 1,M
-                                  B(I,J) = B(I,J) + TEMP*B(I,K)
-  270                         CONTINUE
-                          END IF
-  280                 CONTINUE
-                      TEMP = ALPHA
-                      IF (NOUNIT) TEMP = TEMP*A(K,K)
-                      IF (TEMP.NE.ONE) THEN
-                          DO 290 I = 1,M
-                              B(I,K) = TEMP*B(I,K)
-  290                     CONTINUE
-                      END IF
-  300             CONTINUE
-              END IF
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of STRMM .
-*
-      END
--- a/libcruft/blas/strmv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,278 +0,0 @@
-      SUBROUTINE STRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX)
-*     .. Scalar Arguments ..
-      INTEGER INCX,LDA,N
-      CHARACTER DIAG,TRANS,UPLO
-*     ..
-*     .. Array Arguments ..
-      REAL A(LDA,*),X(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  STRMV  performs one of the matrix-vector operations
-*
-*     x := A*x,   or   x := A'*x,
-*
-*  where x is an n element vector and  A is an n by n unit, or non-unit,
-*  upper or lower triangular matrix.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry, TRANS specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   x := A*x.
-*
-*              TRANS = 'T' or 't'   x := A'*x.
-*
-*              TRANS = 'C' or 'c'   x := A'*x.
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit
-*           triangular as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  A      - REAL             array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular matrix and the strictly lower triangular part of
-*           A is not referenced.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular matrix and the strictly upper triangular part of
-*           A is not referenced.
-*           Note that when  DIAG = 'U' or 'u', the diagonal elements of
-*           A are not referenced either, but are assumed to be unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*  X      - REAL             array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element vector x. On exit, X is overwritten with the
-*           tranformed vector x.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      REAL ZERO
-      PARAMETER (ZERO=0.0E+0)
-*     ..
-*     .. Local Scalars ..
-      REAL TEMP
-      INTEGER I,INFO,IX,J,JX,KX
-      LOGICAL NOUNIT
-*     ..
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX
-*     ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN
-          INFO = 1
-      ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
-     +         .NOT.LSAME(TRANS,'C')) THEN
-          INFO = 2
-      ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN
-          INFO = 3
-      ELSE IF (N.LT.0) THEN
-          INFO = 4
-      ELSE IF (LDA.LT.MAX(1,N)) THEN
-          INFO = 6
-      ELSE IF (INCX.EQ.0) THEN
-          INFO = 8
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('STRMV ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF (N.EQ.0) RETURN
-*
-      NOUNIT = LSAME(DIAG,'N')
-*
-*     Set up the start point in X if the increment is not unity. This
-*     will be  ( N - 1 )*INCX  too small for descending loops.
-*
-      IF (INCX.LE.0) THEN
-          KX = 1 - (N-1)*INCX
-      ELSE IF (INCX.NE.1) THEN
-          KX = 1
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-      IF (LSAME(TRANS,'N')) THEN
-*
-*        Form  x := A*x.
-*
-          IF (LSAME(UPLO,'U')) THEN
-              IF (INCX.EQ.1) THEN
-                  DO 20 J = 1,N
-                      IF (X(J).NE.ZERO) THEN
-                          TEMP = X(J)
-                          DO 10 I = 1,J - 1
-                              X(I) = X(I) + TEMP*A(I,J)
-   10                     CONTINUE
-                          IF (NOUNIT) X(J) = X(J)*A(J,J)
-                      END IF
-   20             CONTINUE
-              ELSE
-                  JX = KX
-                  DO 40 J = 1,N
-                      IF (X(JX).NE.ZERO) THEN
-                          TEMP = X(JX)
-                          IX = KX
-                          DO 30 I = 1,J - 1
-                              X(IX) = X(IX) + TEMP*A(I,J)
-                              IX = IX + INCX
-   30                     CONTINUE
-                          IF (NOUNIT) X(JX) = X(JX)*A(J,J)
-                      END IF
-                      JX = JX + INCX
-   40             CONTINUE
-              END IF
-          ELSE
-              IF (INCX.EQ.1) THEN
-                  DO 60 J = N,1,-1
-                      IF (X(J).NE.ZERO) THEN
-                          TEMP = X(J)
-                          DO 50 I = N,J + 1,-1
-                              X(I) = X(I) + TEMP*A(I,J)
-   50                     CONTINUE
-                          IF (NOUNIT) X(J) = X(J)*A(J,J)
-                      END IF
-   60             CONTINUE
-              ELSE
-                  KX = KX + (N-1)*INCX
-                  JX = KX
-                  DO 80 J = N,1,-1
-                      IF (X(JX).NE.ZERO) THEN
-                          TEMP = X(JX)
-                          IX = KX
-                          DO 70 I = N,J + 1,-1
-                              X(IX) = X(IX) + TEMP*A(I,J)
-                              IX = IX - INCX
-   70                     CONTINUE
-                          IF (NOUNIT) X(JX) = X(JX)*A(J,J)
-                      END IF
-                      JX = JX - INCX
-   80             CONTINUE
-              END IF
-          END IF
-      ELSE
-*
-*        Form  x := A'*x.
-*
-          IF (LSAME(UPLO,'U')) THEN
-              IF (INCX.EQ.1) THEN
-                  DO 100 J = N,1,-1
-                      TEMP = X(J)
-                      IF (NOUNIT) TEMP = TEMP*A(J,J)
-                      DO 90 I = J - 1,1,-1
-                          TEMP = TEMP + A(I,J)*X(I)
-   90                 CONTINUE
-                      X(J) = TEMP
-  100             CONTINUE
-              ELSE
-                  JX = KX + (N-1)*INCX
-                  DO 120 J = N,1,-1
-                      TEMP = X(JX)
-                      IX = JX
-                      IF (NOUNIT) TEMP = TEMP*A(J,J)
-                      DO 110 I = J - 1,1,-1
-                          IX = IX - INCX
-                          TEMP = TEMP + A(I,J)*X(IX)
-  110                 CONTINUE
-                      X(JX) = TEMP
-                      JX = JX - INCX
-  120             CONTINUE
-              END IF
-          ELSE
-              IF (INCX.EQ.1) THEN
-                  DO 140 J = 1,N
-                      TEMP = X(J)
-                      IF (NOUNIT) TEMP = TEMP*A(J,J)
-                      DO 130 I = J + 1,N
-                          TEMP = TEMP + A(I,J)*X(I)
-  130                 CONTINUE
-                      X(J) = TEMP
-  140             CONTINUE
-              ELSE
-                  JX = KX
-                  DO 160 J = 1,N
-                      TEMP = X(JX)
-                      IX = JX
-                      IF (NOUNIT) TEMP = TEMP*A(J,J)
-                      DO 150 I = J + 1,N
-                          IX = IX + INCX
-                          TEMP = TEMP + A(I,J)*X(IX)
-  150                 CONTINUE
-                      X(JX) = TEMP
-                      JX = JX + INCX
-  160             CONTINUE
-              END IF
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of STRMV .
-*
-      END
--- a/libcruft/blas/strsm.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,373 +0,0 @@
-      SUBROUTINE STRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB)
-*     .. Scalar Arguments ..
-      REAL ALPHA
-      INTEGER LDA,LDB,M,N
-      CHARACTER DIAG,SIDE,TRANSA,UPLO
-*     ..
-*     .. Array Arguments ..
-      REAL A(LDA,*),B(LDB,*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  STRSM  solves one of the matrix equations
-*
-*     op( A )*X = alpha*B,   or   X*op( A ) = alpha*B,
-*
-*  where alpha is a scalar, X and B are m by n matrices, A is a unit, or
-*  non-unit,  upper or lower triangular matrix  and  op( A )  is one  of
-*
-*     op( A ) = A   or   op( A ) = A'.
-*
-*  The matrix X is overwritten on B.
-*
-*  Arguments
-*  ==========
-*
-*  SIDE   - CHARACTER*1.
-*           On entry, SIDE specifies whether op( A ) appears on the left
-*           or right of X as follows:
-*
-*              SIDE = 'L' or 'l'   op( A )*X = alpha*B.
-*
-*              SIDE = 'R' or 'r'   X*op( A ) = alpha*B.
-*
-*           Unchanged on exit.
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix A is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANSA - CHARACTER*1.
-*           On entry, TRANSA specifies the form of op( A ) to be used in
-*           the matrix multiplication as follows:
-*
-*              TRANSA = 'N' or 'n'   op( A ) = A.
-*
-*              TRANSA = 'T' or 't'   op( A ) = A'.
-*
-*              TRANSA = 'C' or 'c'   op( A ) = A'.
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit triangular
-*           as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of B. M must be at
-*           least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of B.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - REAL            .
-*           On entry,  ALPHA specifies the scalar  alpha. When  alpha is
-*           zero then  A is not referenced and  B need not be set before
-*           entry.
-*           Unchanged on exit.
-*
-*  A      - REAL             array of DIMENSION ( LDA, k ), where k is m
-*           when  SIDE = 'L' or 'l'  and is  n  when  SIDE = 'R' or 'r'.
-*           Before entry  with  UPLO = 'U' or 'u',  the  leading  k by k
-*           upper triangular part of the array  A must contain the upper
-*           triangular matrix  and the strictly lower triangular part of
-*           A is not referenced.
-*           Before entry  with  UPLO = 'L' or 'l',  the  leading  k by k
-*           lower triangular part of the array  A must contain the lower
-*           triangular matrix  and the strictly upper triangular part of
-*           A is not referenced.
-*           Note that when  DIAG = 'U' or 'u',  the diagonal elements of
-*           A  are not referenced either,  but are assumed to be  unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program.  When  SIDE = 'L' or 'l'  then
-*           LDA  must be at least  max( 1, m ),  when  SIDE = 'R' or 'r'
-*           then LDA must be at least max( 1, n ).
-*           Unchanged on exit.
-*
-*  B      - REAL             array of DIMENSION ( LDB, n ).
-*           Before entry,  the leading  m by n part of the array  B must
-*           contain  the  right-hand  side  matrix  B,  and  on exit  is
-*           overwritten by the solution matrix  X.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in  the  calling  (sub)  program.   LDB  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX
-*     ..
-*     .. Local Scalars ..
-      REAL TEMP
-      INTEGER I,INFO,J,K,NROWA
-      LOGICAL LSIDE,NOUNIT,UPPER
-*     ..
-*     .. Parameters ..
-      REAL ONE,ZERO
-      PARAMETER (ONE=1.0E+0,ZERO=0.0E+0)
-*     ..
-*
-*     Test the input parameters.
-*
-      LSIDE = LSAME(SIDE,'L')
-      IF (LSIDE) THEN
-          NROWA = M
-      ELSE
-          NROWA = N
-      END IF
-      NOUNIT = LSAME(DIAG,'N')
-      UPPER = LSAME(UPLO,'U')
-*
-      INFO = 0
-      IF ((.NOT.LSIDE) .AND. (.NOT.LSAME(SIDE,'R'))) THEN
-          INFO = 1
-      ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
-          INFO = 2
-      ELSE IF ((.NOT.LSAME(TRANSA,'N')) .AND.
-     +         (.NOT.LSAME(TRANSA,'T')) .AND.
-     +         (.NOT.LSAME(TRANSA,'C'))) THEN
-          INFO = 3
-      ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN
-          INFO = 4
-      ELSE IF (M.LT.0) THEN
-          INFO = 5
-      ELSE IF (N.LT.0) THEN
-          INFO = 6
-      ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
-          INFO = 9
-      ELSE IF (LDB.LT.MAX(1,M)) THEN
-          INFO = 11
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('STRSM ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF (M.EQ.0 .OR. N.EQ.0) RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF (ALPHA.EQ.ZERO) THEN
-          DO 20 J = 1,N
-              DO 10 I = 1,M
-                  B(I,J) = ZERO
-   10         CONTINUE
-   20     CONTINUE
-          RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF (LSIDE) THEN
-          IF (LSAME(TRANSA,'N')) THEN
-*
-*           Form  B := alpha*inv( A )*B.
-*
-              IF (UPPER) THEN
-                  DO 60 J = 1,N
-                      IF (ALPHA.NE.ONE) THEN
-                          DO 30 I = 1,M
-                              B(I,J) = ALPHA*B(I,J)
-   30                     CONTINUE
-                      END IF
-                      DO 50 K = M,1,-1
-                          IF (B(K,J).NE.ZERO) THEN
-                              IF (NOUNIT) B(K,J) = B(K,J)/A(K,K)
-                              DO 40 I = 1,K - 1
-                                  B(I,J) = B(I,J) - B(K,J)*A(I,K)
-   40                         CONTINUE
-                          END IF
-   50                 CONTINUE
-   60             CONTINUE
-              ELSE
-                  DO 100 J = 1,N
-                      IF (ALPHA.NE.ONE) THEN
-                          DO 70 I = 1,M
-                              B(I,J) = ALPHA*B(I,J)
-   70                     CONTINUE
-                      END IF
-                      DO 90 K = 1,M
-                          IF (B(K,J).NE.ZERO) THEN
-                              IF (NOUNIT) B(K,J) = B(K,J)/A(K,K)
-                              DO 80 I = K + 1,M
-                                  B(I,J) = B(I,J) - B(K,J)*A(I,K)
-   80                         CONTINUE
-                          END IF
-   90                 CONTINUE
-  100             CONTINUE
-              END IF
-          ELSE
-*
-*           Form  B := alpha*inv( A' )*B.
-*
-              IF (UPPER) THEN
-                  DO 130 J = 1,N
-                      DO 120 I = 1,M
-                          TEMP = ALPHA*B(I,J)
-                          DO 110 K = 1,I - 1
-                              TEMP = TEMP - A(K,I)*B(K,J)
-  110                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/A(I,I)
-                          B(I,J) = TEMP
-  120                 CONTINUE
-  130             CONTINUE
-              ELSE
-                  DO 160 J = 1,N
-                      DO 150 I = M,1,-1
-                          TEMP = ALPHA*B(I,J)
-                          DO 140 K = I + 1,M
-                              TEMP = TEMP - A(K,I)*B(K,J)
-  140                     CONTINUE
-                          IF (NOUNIT) TEMP = TEMP/A(I,I)
-                          B(I,J) = TEMP
-  150                 CONTINUE
-  160             CONTINUE
-              END IF
-          END IF
-      ELSE
-          IF (LSAME(TRANSA,'N')) THEN
-*
-*           Form  B := alpha*B*inv( A ).
-*
-              IF (UPPER) THEN
-                  DO 210 J = 1,N
-                      IF (ALPHA.NE.ONE) THEN
-                          DO 170 I = 1,M
-                              B(I,J) = ALPHA*B(I,J)
-  170                     CONTINUE
-                      END IF
-                      DO 190 K = 1,J - 1
-                          IF (A(K,J).NE.ZERO) THEN
-                              DO 180 I = 1,M
-                                  B(I,J) = B(I,J) - A(K,J)*B(I,K)
-  180                         CONTINUE
-                          END IF
-  190                 CONTINUE
-                      IF (NOUNIT) THEN
-                          TEMP = ONE/A(J,J)
-                          DO 200 I = 1,M
-                              B(I,J) = TEMP*B(I,J)
-  200                     CONTINUE
-                      END IF
-  210             CONTINUE
-              ELSE
-                  DO 260 J = N,1,-1
-                      IF (ALPHA.NE.ONE) THEN
-                          DO 220 I = 1,M
-                              B(I,J) = ALPHA*B(I,J)
-  220                     CONTINUE
-                      END IF
-                      DO 240 K = J + 1,N
-                          IF (A(K,J).NE.ZERO) THEN
-                              DO 230 I = 1,M
-                                  B(I,J) = B(I,J) - A(K,J)*B(I,K)
-  230                         CONTINUE
-                          END IF
-  240                 CONTINUE
-                      IF (NOUNIT) THEN
-                          TEMP = ONE/A(J,J)
-                          DO 250 I = 1,M
-                              B(I,J) = TEMP*B(I,J)
-  250                     CONTINUE
-                      END IF
-  260             CONTINUE
-              END IF
-          ELSE
-*
-*           Form  B := alpha*B*inv( A' ).
-*
-              IF (UPPER) THEN
-                  DO 310 K = N,1,-1
-                      IF (NOUNIT) THEN
-                          TEMP = ONE/A(K,K)
-                          DO 270 I = 1,M
-                              B(I,K) = TEMP*B(I,K)
-  270                     CONTINUE
-                      END IF
-                      DO 290 J = 1,K - 1
-                          IF (A(J,K).NE.ZERO) THEN
-                              TEMP = A(J,K)
-                              DO 280 I = 1,M
-                                  B(I,J) = B(I,J) - TEMP*B(I,K)
-  280                         CONTINUE
-                          END IF
-  290                 CONTINUE
-                      IF (ALPHA.NE.ONE) THEN
-                          DO 300 I = 1,M
-                              B(I,K) = ALPHA*B(I,K)
-  300                     CONTINUE
-                      END IF
-  310             CONTINUE
-              ELSE
-                  DO 360 K = 1,N
-                      IF (NOUNIT) THEN
-                          TEMP = ONE/A(K,K)
-                          DO 320 I = 1,M
-                              B(I,K) = TEMP*B(I,K)
-  320                     CONTINUE
-                      END IF
-                      DO 340 J = K + 1,N
-                          IF (A(J,K).NE.ZERO) THEN
-                              TEMP = A(J,K)
-                              DO 330 I = 1,M
-                                  B(I,J) = B(I,J) - TEMP*B(I,K)
-  330                         CONTINUE
-                          END IF
-  340                 CONTINUE
-                      IF (ALPHA.NE.ONE) THEN
-                          DO 350 I = 1,M
-                              B(I,K) = ALPHA*B(I,K)
-  350                     CONTINUE
-                      END IF
-  360             CONTINUE
-              END IF
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of STRSM .
-*
-      END
--- a/libcruft/blas/strsv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,281 +0,0 @@
-      SUBROUTINE STRSV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX)
-*     .. Scalar Arguments ..
-      INTEGER INCX,LDA,N
-      CHARACTER DIAG,TRANS,UPLO
-*     ..
-*     .. Array Arguments ..
-      REAL A(LDA,*),X(*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  STRSV  solves one of the systems of equations
-*
-*     A*x = b,   or   A'*x = b,
-*
-*  where b and x are n element vectors and A is an n by n unit, or
-*  non-unit, upper or lower triangular matrix.
-*
-*  No test for singularity or near-singularity is included in this
-*  routine. Such tests must be performed before calling this routine.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry, TRANS specifies the equations to be solved as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   A*x = b.
-*
-*              TRANS = 'T' or 't'   A'*x = b.
-*
-*              TRANS = 'C' or 'c'   A'*x = b.
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit
-*           triangular as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  A      - REAL             array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular matrix and the strictly lower triangular part of
-*           A is not referenced.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular matrix and the strictly upper triangular part of
-*           A is not referenced.
-*           Note that when  DIAG = 'U' or 'u', the diagonal elements of
-*           A are not referenced either, but are assumed to be unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*  X      - REAL             array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element right-hand side vector b. On exit, X is overwritten
-*           with the solution vector x.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      REAL ZERO
-      PARAMETER (ZERO=0.0E+0)
-*     ..
-*     .. Local Scalars ..
-      REAL TEMP
-      INTEGER I,INFO,IX,J,JX,KX
-      LOGICAL NOUNIT
-*     ..
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX
-*     ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN
-          INFO = 1
-      ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
-     +         .NOT.LSAME(TRANS,'C')) THEN
-          INFO = 2
-      ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN
-          INFO = 3
-      ELSE IF (N.LT.0) THEN
-          INFO = 4
-      ELSE IF (LDA.LT.MAX(1,N)) THEN
-          INFO = 6
-      ELSE IF (INCX.EQ.0) THEN
-          INFO = 8
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('STRSV ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF (N.EQ.0) RETURN
-*
-      NOUNIT = LSAME(DIAG,'N')
-*
-*     Set up the start point in X if the increment is not unity. This
-*     will be  ( N - 1 )*INCX  too small for descending loops.
-*
-      IF (INCX.LE.0) THEN
-          KX = 1 - (N-1)*INCX
-      ELSE IF (INCX.NE.1) THEN
-          KX = 1
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-      IF (LSAME(TRANS,'N')) THEN
-*
-*        Form  x := inv( A )*x.
-*
-          IF (LSAME(UPLO,'U')) THEN
-              IF (INCX.EQ.1) THEN
-                  DO 20 J = N,1,-1
-                      IF (X(J).NE.ZERO) THEN
-                          IF (NOUNIT) X(J) = X(J)/A(J,J)
-                          TEMP = X(J)
-                          DO 10 I = J - 1,1,-1
-                              X(I) = X(I) - TEMP*A(I,J)
-   10                     CONTINUE
-                      END IF
-   20             CONTINUE
-              ELSE
-                  JX = KX + (N-1)*INCX
-                  DO 40 J = N,1,-1
-                      IF (X(JX).NE.ZERO) THEN
-                          IF (NOUNIT) X(JX) = X(JX)/A(J,J)
-                          TEMP = X(JX)
-                          IX = JX
-                          DO 30 I = J - 1,1,-1
-                              IX = IX - INCX
-                              X(IX) = X(IX) - TEMP*A(I,J)
-   30                     CONTINUE
-                      END IF
-                      JX = JX - INCX
-   40             CONTINUE
-              END IF
-          ELSE
-              IF (INCX.EQ.1) THEN
-                  DO 60 J = 1,N
-                      IF (X(J).NE.ZERO) THEN
-                          IF (NOUNIT) X(J) = X(J)/A(J,J)
-                          TEMP = X(J)
-                          DO 50 I = J + 1,N
-                              X(I) = X(I) - TEMP*A(I,J)
-   50                     CONTINUE
-                      END IF
-   60             CONTINUE
-              ELSE
-                  JX = KX
-                  DO 80 J = 1,N
-                      IF (X(JX).NE.ZERO) THEN
-                          IF (NOUNIT) X(JX) = X(JX)/A(J,J)
-                          TEMP = X(JX)
-                          IX = JX
-                          DO 70 I = J + 1,N
-                              IX = IX + INCX
-                              X(IX) = X(IX) - TEMP*A(I,J)
-   70                     CONTINUE
-                      END IF
-                      JX = JX + INCX
-   80             CONTINUE
-              END IF
-          END IF
-      ELSE
-*
-*        Form  x := inv( A' )*x.
-*
-          IF (LSAME(UPLO,'U')) THEN
-              IF (INCX.EQ.1) THEN
-                  DO 100 J = 1,N
-                      TEMP = X(J)
-                      DO 90 I = 1,J - 1
-                          TEMP = TEMP - A(I,J)*X(I)
-   90                 CONTINUE
-                      IF (NOUNIT) TEMP = TEMP/A(J,J)
-                      X(J) = TEMP
-  100             CONTINUE
-              ELSE
-                  JX = KX
-                  DO 120 J = 1,N
-                      TEMP = X(JX)
-                      IX = KX
-                      DO 110 I = 1,J - 1
-                          TEMP = TEMP - A(I,J)*X(IX)
-                          IX = IX + INCX
-  110                 CONTINUE
-                      IF (NOUNIT) TEMP = TEMP/A(J,J)
-                      X(JX) = TEMP
-                      JX = JX + INCX
-  120             CONTINUE
-              END IF
-          ELSE
-              IF (INCX.EQ.1) THEN
-                  DO 140 J = N,1,-1
-                      TEMP = X(J)
-                      DO 130 I = N,J + 1,-1
-                          TEMP = TEMP - A(I,J)*X(I)
-  130                 CONTINUE
-                      IF (NOUNIT) TEMP = TEMP/A(J,J)
-                      X(J) = TEMP
-  140             CONTINUE
-              ELSE
-                  KX = KX + (N-1)*INCX
-                  JX = KX
-                  DO 160 J = N,1,-1
-                      TEMP = X(JX)
-                      IX = KX
-                      DO 150 I = N,J + 1,-1
-                          TEMP = TEMP - A(I,J)*X(IX)
-                          IX = IX - INCX
-  150                 CONTINUE
-                      IF (NOUNIT) TEMP = TEMP/A(J,J)
-                      X(JX) = TEMP
-                      JX = JX - INCX
-  160             CONTINUE
-              END IF
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of STRSV .
-*
-      END
--- a/libcruft/blas/zaxpy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-      subroutine zaxpy(n,za,zx,incx,zy,incy)
-c
-c     constant times a vector plus a vector.
-c     jack dongarra, 3/11/78.
-c     modified 12/3/93, array(1) declarations changed to array(*)
-c
-      double complex zx(*),zy(*),za
-      integer i,incx,incy,ix,iy,n
-      double precision dcabs1
-      if(n.le.0)return
-      if (dcabs1(za) .eq. 0.0d0) return
-      if (incx.eq.1.and.incy.eq.1)go to 20
-c
-c        code for unequal increments or equal increments
-c          not equal to 1
-c
-      ix = 1
-      iy = 1
-      if(incx.lt.0)ix = (-n+1)*incx + 1
-      if(incy.lt.0)iy = (-n+1)*incy + 1
-      do 10 i = 1,n
-        zy(iy) = zy(iy) + za*zx(ix)
-        ix = ix + incx
-        iy = iy + incy
-   10 continue
-      return
-c
-c        code for both increments equal to 1
-c
-   20 do 30 i = 1,n
-        zy(i) = zy(i) + za*zx(i)
-   30 continue
-      return
-      end
--- a/libcruft/blas/zcopy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-      subroutine  zcopy(n,zx,incx,zy,incy)
-c
-c     copies a vector, x, to a vector, y.
-c     jack dongarra, linpack, 4/11/78.
-c     modified 12/3/93, array(1) declarations changed to array(*)
-c
-      double complex zx(*),zy(*)
-      integer i,incx,incy,ix,iy,n
-c
-      if(n.le.0)return
-      if(incx.eq.1.and.incy.eq.1)go to 20
-c
-c        code for unequal increments or equal increments
-c          not equal to 1
-c
-      ix = 1
-      iy = 1
-      if(incx.lt.0)ix = (-n+1)*incx + 1
-      if(incy.lt.0)iy = (-n+1)*incy + 1
-      do 10 i = 1,n
-        zy(iy) = zx(ix)
-        ix = ix + incx
-        iy = iy + incy
-   10 continue
-      return
-c
-c        code for both increments equal to 1
-c
-   20 do 30 i = 1,n
-        zy(i) = zx(i)
-   30 continue
-      return
-      end
--- a/libcruft/blas/zdotc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-      double complex function zdotc(n,zx,incx,zy,incy)
-c
-c     forms the dot product of a vector.
-c     jack dongarra, 3/11/78.
-c     modified 12/3/93, array(1) declarations changed to array(*)
-c
-      double complex zx(*),zy(*),ztemp
-      integer i,incx,incy,ix,iy,n
-      ztemp = (0.0d0,0.0d0)
-      zdotc = (0.0d0,0.0d0)
-      if(n.le.0)return
-      if(incx.eq.1.and.incy.eq.1)go to 20
-c
-c        code for unequal increments or equal increments
-c          not equal to 1
-c
-      ix = 1
-      iy = 1
-      if(incx.lt.0)ix = (-n+1)*incx + 1
-      if(incy.lt.0)iy = (-n+1)*incy + 1
-      do 10 i = 1,n
-        ztemp = ztemp + dconjg(zx(ix))*zy(iy)
-        ix = ix + incx
-        iy = iy + incy
-   10 continue
-      zdotc = ztemp
-      return
-c
-c        code for both increments equal to 1
-c
-   20 do 30 i = 1,n
-        ztemp = ztemp + dconjg(zx(i))*zy(i)
-   30 continue
-      zdotc = ztemp
-      return
-      end
--- a/libcruft/blas/zdotu.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-      double complex function zdotu(n,zx,incx,zy,incy)
-c
-c     forms the dot product of two vectors.
-c     jack dongarra, 3/11/78.
-c     modified 12/3/93, array(1) declarations changed to array(*)
-c
-      double complex zx(*),zy(*),ztemp
-      integer i,incx,incy,ix,iy,n
-      ztemp = (0.0d0,0.0d0)
-      zdotu = (0.0d0,0.0d0)
-      if(n.le.0)return
-      if(incx.eq.1.and.incy.eq.1)go to 20
-c
-c        code for unequal increments or equal increments
-c          not equal to 1
-c
-      ix = 1
-      iy = 1
-      if(incx.lt.0)ix = (-n+1)*incx + 1
-      if(incy.lt.0)iy = (-n+1)*incy + 1
-      do 10 i = 1,n
-        ztemp = ztemp + zx(ix)*zy(iy)
-        ix = ix + incx
-        iy = iy + incy
-   10 continue
-      zdotu = ztemp
-      return
-c
-c        code for both increments equal to 1
-c
-   20 do 30 i = 1,n
-        ztemp = ztemp + zx(i)*zy(i)
-   30 continue
-      zdotu = ztemp
-      return
-      end
--- a/libcruft/blas/zdrot.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-      subroutine  zdrot (n,zx,incx,zy,incy,c,s)
-c
-c     applies a plane rotation, where the cos and sin (c and s) are
-c     double precision and the vectors zx and zy are double complex.
-c     jack dongarra, linpack, 3/11/78.
-c
-      double complex zx(*),zy(*),ztemp
-      double precision c,s
-      integer i,incx,incy,ix,iy,n
-c
-      if(n.le.0)return
-      if(incx.eq.1.and.incy.eq.1)go to 20
-c
-c       code for unequal increments or equal increments not equal
-c         to 1
-c
-      ix = 1
-      iy = 1
-      if(incx.lt.0)ix = (-n+1)*incx + 1
-      if(incy.lt.0)iy = (-n+1)*incy + 1
-      do 10 i = 1,n
-        ztemp = c*zx(ix) + s*zy(iy)
-        zy(iy) = c*zy(iy) - s*zx(ix)
-        zx(ix) = ztemp
-        ix = ix + incx
-        iy = iy + incy
-   10 continue
-      return
-c
-c       code for both increments equal to 1
-c
-   20 do 30 i = 1,n
-        ztemp = c*zx(i) + s*zy(i)
-        zy(i) = c*zy(i) - s*zx(i)
-        zx(i) = ztemp
-   30 continue
-      return
-      end
--- a/libcruft/blas/zdscal.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-      subroutine  zdscal(n,da,zx,incx)
-c
-c     scales a vector by a constant.
-c     jack dongarra, 3/11/78.
-c     modified 3/93 to return if incx .le. 0.
-c     modified 12/3/93, array(1) declarations changed to array(*)
-c
-      double complex zx(*)
-      double precision da
-      integer i,incx,ix,n
-c
-      if( n.le.0 .or. incx.le.0 )return
-      if(incx.eq.1)go to 20
-c
-c        code for increment not equal to 1
-c
-      ix = 1
-      do 10 i = 1,n
-        zx(ix) = dcmplx(da,0.0d0)*zx(ix)
-        ix = ix + incx
-   10 continue
-      return
-c
-c        code for increment equal to 1
-c
-   20 do 30 i = 1,n
-        zx(i) = dcmplx(da,0.0d0)*zx(i)
-   30 continue
-      return
-      end
--- a/libcruft/blas/zgemm.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,415 +0,0 @@
-      SUBROUTINE ZGEMM ( TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB,
-     $                   BETA, C, LDC )
-*     .. Scalar Arguments ..
-      CHARACTER*1        TRANSA, TRANSB
-      INTEGER            M, N, K, LDA, LDB, LDC
-      COMPLEX*16         ALPHA, BETA
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), B( LDB, * ), C( LDC, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGEMM  performs one of the matrix-matrix operations
-*
-*     C := alpha*op( A )*op( B ) + beta*C,
-*
-*  where  op( X ) is one of
-*
-*     op( X ) = X   or   op( X ) = X'   or   op( X ) = conjg( X' ),
-*
-*  alpha and beta are scalars, and A, B and C are matrices, with op( A )
-*  an m by k matrix,  op( B )  a  k by n matrix and  C an m by n matrix.
-*
-*  Parameters
-*  ==========
-*
-*  TRANSA - CHARACTER*1.
-*           On entry, TRANSA specifies the form of op( A ) to be used in
-*           the matrix multiplication as follows:
-*
-*              TRANSA = 'N' or 'n',  op( A ) = A.
-*
-*              TRANSA = 'T' or 't',  op( A ) = A'.
-*
-*              TRANSA = 'C' or 'c',  op( A ) = conjg( A' ).
-*
-*           Unchanged on exit.
-*
-*  TRANSB - CHARACTER*1.
-*           On entry, TRANSB specifies the form of op( B ) to be used in
-*           the matrix multiplication as follows:
-*
-*              TRANSB = 'N' or 'n',  op( B ) = B.
-*
-*              TRANSB = 'T' or 't',  op( B ) = B'.
-*
-*              TRANSB = 'C' or 'c',  op( B ) = conjg( B' ).
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry,  M  specifies  the number  of rows  of the  matrix
-*           op( A )  and of the  matrix  C.  M  must  be at least  zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry,  N  specifies the number  of columns of the matrix
-*           op( B ) and the number of columns of the matrix C. N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry,  K  specifies  the number of columns of the matrix
-*           op( A ) and the number of rows of the matrix op( B ). K must
-*           be at least  zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX*16      .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX*16       array of DIMENSION ( LDA, ka ), where ka is
-*           k  when  TRANSA = 'N' or 'n',  and is  m  otherwise.
-*           Before entry with  TRANSA = 'N' or 'n',  the leading  m by k
-*           part of the array  A  must contain the matrix  A,  otherwise
-*           the leading  k by m  part of the array  A  must contain  the
-*           matrix A.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. When  TRANSA = 'N' or 'n' then
-*           LDA must be at least  max( 1, m ), otherwise  LDA must be at
-*           least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  B      - COMPLEX*16       array of DIMENSION ( LDB, kb ), where kb is
-*           n  when  TRANSB = 'N' or 'n',  and is  k  otherwise.
-*           Before entry with  TRANSB = 'N' or 'n',  the leading  k by n
-*           part of the array  B  must contain the matrix  B,  otherwise
-*           the leading  n by k  part of the array  B  must contain  the
-*           matrix B.
-*           Unchanged on exit.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in the calling (sub) program. When  TRANSB = 'N' or 'n' then
-*           LDB must be at least  max( 1, k ), otherwise  LDB must be at
-*           least  max( 1, n ).
-*           Unchanged on exit.
-*
-*  BETA   - COMPLEX*16      .
-*           On entry,  BETA  specifies the scalar  beta.  When  BETA  is
-*           supplied as zero then C need not be set on input.
-*           Unchanged on exit.
-*
-*  C      - COMPLEX*16       array of DIMENSION ( LDC, n ).
-*           Before entry, the leading  m by n  part of the array  C must
-*           contain the matrix  C,  except when  beta  is zero, in which
-*           case C need not be set on entry.
-*           On exit, the array  C  is overwritten by the  m by n  matrix
-*           ( alpha*op( A )*op( B ) + beta*C ).
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX
-*     .. Local Scalars ..
-      LOGICAL            CONJA, CONJB, NOTA, NOTB
-      INTEGER            I, INFO, J, L, NCOLA, NROWA, NROWB
-      COMPLEX*16         TEMP
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER        ( ONE  = ( 1.0D+0, 0.0D+0 ) )
-      COMPLEX*16         ZERO
-      PARAMETER        ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Set  NOTA  and  NOTB  as  true if  A  and  B  respectively are not
-*     conjugated or transposed, set  CONJA and CONJB  as true if  A  and
-*     B  respectively are to be  transposed but  not conjugated  and set
-*     NROWA, NCOLA and  NROWB  as the number of rows and  columns  of  A
-*     and the number of rows of  B  respectively.
-*
-      NOTA  = LSAME( TRANSA, 'N' )
-      NOTB  = LSAME( TRANSB, 'N' )
-      CONJA = LSAME( TRANSA, 'C' )
-      CONJB = LSAME( TRANSB, 'C' )
-      IF( NOTA )THEN
-         NROWA = M
-         NCOLA = K
-      ELSE
-         NROWA = K
-         NCOLA = M
-      END IF
-      IF( NOTB )THEN
-         NROWB = K
-      ELSE
-         NROWB = N
-      END IF
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF(      ( .NOT.NOTA                 ).AND.
-     $         ( .NOT.CONJA                ).AND.
-     $         ( .NOT.LSAME( TRANSA, 'T' ) )      )THEN
-         INFO = 1
-      ELSE IF( ( .NOT.NOTB                 ).AND.
-     $         ( .NOT.CONJB                ).AND.
-     $         ( .NOT.LSAME( TRANSB, 'T' ) )      )THEN
-         INFO = 2
-      ELSE IF( M  .LT.0               )THEN
-         INFO = 3
-      ELSE IF( N  .LT.0               )THEN
-         INFO = 4
-      ELSE IF( K  .LT.0               )THEN
-         INFO = 5
-      ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN
-         INFO = 8
-      ELSE IF( LDB.LT.MAX( 1, NROWB ) )THEN
-         INFO = 10
-      ELSE IF( LDC.LT.MAX( 1, M     ) )THEN
-         INFO = 13
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'ZGEMM ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR.
-     $    ( ( ( ALPHA.EQ.ZERO ).OR.( K.EQ.0 ) ).AND.( BETA.EQ.ONE ) ) )
-     $   RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF( ALPHA.EQ.ZERO )THEN
-         IF( BETA.EQ.ZERO )THEN
-            DO 20, J = 1, N
-               DO 10, I = 1, M
-                  C( I, J ) = ZERO
-   10          CONTINUE
-   20       CONTINUE
-         ELSE
-            DO 40, J = 1, N
-               DO 30, I = 1, M
-                  C( I, J ) = BETA*C( I, J )
-   30          CONTINUE
-   40       CONTINUE
-         END IF
-         RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF( NOTB )THEN
-         IF( NOTA )THEN
-*
-*           Form  C := alpha*A*B + beta*C.
-*
-            DO 90, J = 1, N
-               IF( BETA.EQ.ZERO )THEN
-                  DO 50, I = 1, M
-                     C( I, J ) = ZERO
-   50             CONTINUE
-               ELSE IF( BETA.NE.ONE )THEN
-                  DO 60, I = 1, M
-                     C( I, J ) = BETA*C( I, J )
-   60             CONTINUE
-               END IF
-               DO 80, L = 1, K
-                  IF( B( L, J ).NE.ZERO )THEN
-                     TEMP = ALPHA*B( L, J )
-                     DO 70, I = 1, M
-                        C( I, J ) = C( I, J ) + TEMP*A( I, L )
-   70                CONTINUE
-                  END IF
-   80          CONTINUE
-   90       CONTINUE
-         ELSE IF( CONJA )THEN
-*
-*           Form  C := alpha*conjg( A' )*B + beta*C.
-*
-            DO 120, J = 1, N
-               DO 110, I = 1, M
-                  TEMP = ZERO
-                  DO 100, L = 1, K
-                     TEMP = TEMP + DCONJG( A( L, I ) )*B( L, J )
-  100             CONTINUE
-                  IF( BETA.EQ.ZERO )THEN
-                     C( I, J ) = ALPHA*TEMP
-                  ELSE
-                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-                  END IF
-  110          CONTINUE
-  120       CONTINUE
-         ELSE
-*
-*           Form  C := alpha*A'*B + beta*C
-*
-            DO 150, J = 1, N
-               DO 140, I = 1, M
-                  TEMP = ZERO
-                  DO 130, L = 1, K
-                     TEMP = TEMP + A( L, I )*B( L, J )
-  130             CONTINUE
-                  IF( BETA.EQ.ZERO )THEN
-                     C( I, J ) = ALPHA*TEMP
-                  ELSE
-                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-                  END IF
-  140          CONTINUE
-  150       CONTINUE
-         END IF
-      ELSE IF( NOTA )THEN
-         IF( CONJB )THEN
-*
-*           Form  C := alpha*A*conjg( B' ) + beta*C.
-*
-            DO 200, J = 1, N
-               IF( BETA.EQ.ZERO )THEN
-                  DO 160, I = 1, M
-                     C( I, J ) = ZERO
-  160             CONTINUE
-               ELSE IF( BETA.NE.ONE )THEN
-                  DO 170, I = 1, M
-                     C( I, J ) = BETA*C( I, J )
-  170             CONTINUE
-               END IF
-               DO 190, L = 1, K
-                  IF( B( J, L ).NE.ZERO )THEN
-                     TEMP = ALPHA*DCONJG( B( J, L ) )
-                     DO 180, I = 1, M
-                        C( I, J ) = C( I, J ) + TEMP*A( I, L )
-  180                CONTINUE
-                  END IF
-  190          CONTINUE
-  200       CONTINUE
-         ELSE
-*
-*           Form  C := alpha*A*B'          + beta*C
-*
-            DO 250, J = 1, N
-               IF( BETA.EQ.ZERO )THEN
-                  DO 210, I = 1, M
-                     C( I, J ) = ZERO
-  210             CONTINUE
-               ELSE IF( BETA.NE.ONE )THEN
-                  DO 220, I = 1, M
-                     C( I, J ) = BETA*C( I, J )
-  220             CONTINUE
-               END IF
-               DO 240, L = 1, K
-                  IF( B( J, L ).NE.ZERO )THEN
-                     TEMP = ALPHA*B( J, L )
-                     DO 230, I = 1, M
-                        C( I, J ) = C( I, J ) + TEMP*A( I, L )
-  230                CONTINUE
-                  END IF
-  240          CONTINUE
-  250       CONTINUE
-         END IF
-      ELSE IF( CONJA )THEN
-         IF( CONJB )THEN
-*
-*           Form  C := alpha*conjg( A' )*conjg( B' ) + beta*C.
-*
-            DO 280, J = 1, N
-               DO 270, I = 1, M
-                  TEMP = ZERO
-                  DO 260, L = 1, K
-                     TEMP = TEMP +
-     $                      DCONJG( A( L, I ) )*DCONJG( B( J, L ) )
-  260             CONTINUE
-                  IF( BETA.EQ.ZERO )THEN
-                     C( I, J ) = ALPHA*TEMP
-                  ELSE
-                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-                  END IF
-  270          CONTINUE
-  280       CONTINUE
-         ELSE
-*
-*           Form  C := alpha*conjg( A' )*B' + beta*C
-*
-            DO 310, J = 1, N
-               DO 300, I = 1, M
-                  TEMP = ZERO
-                  DO 290, L = 1, K
-                     TEMP = TEMP + DCONJG( A( L, I ) )*B( J, L )
-  290             CONTINUE
-                  IF( BETA.EQ.ZERO )THEN
-                     C( I, J ) = ALPHA*TEMP
-                  ELSE
-                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-                  END IF
-  300          CONTINUE
-  310       CONTINUE
-         END IF
-      ELSE
-         IF( CONJB )THEN
-*
-*           Form  C := alpha*A'*conjg( B' ) + beta*C
-*
-            DO 340, J = 1, N
-               DO 330, I = 1, M
-                  TEMP = ZERO
-                  DO 320, L = 1, K
-                     TEMP = TEMP + A( L, I )*DCONJG( B( J, L ) )
-  320             CONTINUE
-                  IF( BETA.EQ.ZERO )THEN
-                     C( I, J ) = ALPHA*TEMP
-                  ELSE
-                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-                  END IF
-  330          CONTINUE
-  340       CONTINUE
-         ELSE
-*
-*           Form  C := alpha*A'*B' + beta*C
-*
-            DO 370, J = 1, N
-               DO 360, I = 1, M
-                  TEMP = ZERO
-                  DO 350, L = 1, K
-                     TEMP = TEMP + A( L, I )*B( J, L )
-  350             CONTINUE
-                  IF( BETA.EQ.ZERO )THEN
-                     C( I, J ) = ALPHA*TEMP
-                  ELSE
-                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-                  END IF
-  360          CONTINUE
-  370       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZGEMM .
-*
-      END
--- a/libcruft/blas/zgemv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,281 +0,0 @@
-      SUBROUTINE ZGEMV ( TRANS, M, N, ALPHA, A, LDA, X, INCX,
-     $                   BETA, Y, INCY )
-*     .. Scalar Arguments ..
-      COMPLEX*16         ALPHA, BETA
-      INTEGER            INCX, INCY, LDA, M, N
-      CHARACTER*1        TRANS
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), X( * ), Y( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGEMV  performs one of the matrix-vector operations
-*
-*     y := alpha*A*x + beta*y,   or   y := alpha*A'*x + beta*y,   or
-*
-*     y := alpha*conjg( A' )*x + beta*y,
-*
-*  where alpha and beta are scalars, x and y are vectors and A is an
-*  m by n matrix.
-*
-*  Parameters
-*  ==========
-*
-*  TRANS  - CHARACTER*1.
-*           On entry, TRANS specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   y := alpha*A*x + beta*y.
-*
-*              TRANS = 'T' or 't'   y := alpha*A'*x + beta*y.
-*
-*              TRANS = 'C' or 'c'   y := alpha*conjg( A' )*x + beta*y.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of the matrix A.
-*           M must be at least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX*16      .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX*16       array of DIMENSION ( LDA, n ).
-*           Before entry, the leading m by n part of the array A must
-*           contain the matrix of coefficients.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*  X      - COMPLEX*16       array of DIMENSION at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'
-*           and at least
-*           ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.
-*           Before entry, the incremented array X must contain the
-*           vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  BETA   - COMPLEX*16      .
-*           On entry, BETA specifies the scalar beta. When BETA is
-*           supplied as zero then Y need not be set on input.
-*           Unchanged on exit.
-*
-*  Y      - COMPLEX*16       array of DIMENSION at least
-*           ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'
-*           and at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.
-*           Before entry with BETA non-zero, the incremented array Y
-*           must contain the vector y. On exit, Y is overwritten by the
-*           updated vector y.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER        ( ONE  = ( 1.0D+0, 0.0D+0 ) )
-      COMPLEX*16         ZERO
-      PARAMETER        ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     .. Local Scalars ..
-      COMPLEX*16         TEMP
-      INTEGER            I, INFO, IX, IY, J, JX, JY, KX, KY, LENX, LENY
-      LOGICAL            NOCONJ
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF     ( .NOT.LSAME( TRANS, 'N' ).AND.
-     $         .NOT.LSAME( TRANS, 'T' ).AND.
-     $         .NOT.LSAME( TRANS, 'C' )      )THEN
-         INFO = 1
-      ELSE IF( M.LT.0 )THEN
-         INFO = 2
-      ELSE IF( N.LT.0 )THEN
-         INFO = 3
-      ELSE IF( LDA.LT.MAX( 1, M ) )THEN
-         INFO = 6
-      ELSE IF( INCX.EQ.0 )THEN
-         INFO = 8
-      ELSE IF( INCY.EQ.0 )THEN
-         INFO = 11
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'ZGEMV ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR.
-     $    ( ( ALPHA.EQ.ZERO ).AND.( BETA.EQ.ONE ) ) )
-     $   RETURN
-*
-      NOCONJ = LSAME( TRANS, 'T' )
-*
-*     Set  LENX  and  LENY, the lengths of the vectors x and y, and set
-*     up the start points in  X  and  Y.
-*
-      IF( LSAME( TRANS, 'N' ) )THEN
-         LENX = N
-         LENY = M
-      ELSE
-         LENX = M
-         LENY = N
-      END IF
-      IF( INCX.GT.0 )THEN
-         KX = 1
-      ELSE
-         KX = 1 - ( LENX - 1 )*INCX
-      END IF
-      IF( INCY.GT.0 )THEN
-         KY = 1
-      ELSE
-         KY = 1 - ( LENY - 1 )*INCY
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-*     First form  y := beta*y.
-*
-      IF( BETA.NE.ONE )THEN
-         IF( INCY.EQ.1 )THEN
-            IF( BETA.EQ.ZERO )THEN
-               DO 10, I = 1, LENY
-                  Y( I ) = ZERO
-   10          CONTINUE
-            ELSE
-               DO 20, I = 1, LENY
-                  Y( I ) = BETA*Y( I )
-   20          CONTINUE
-            END IF
-         ELSE
-            IY = KY
-            IF( BETA.EQ.ZERO )THEN
-               DO 30, I = 1, LENY
-                  Y( IY ) = ZERO
-                  IY      = IY   + INCY
-   30          CONTINUE
-            ELSE
-               DO 40, I = 1, LENY
-                  Y( IY ) = BETA*Y( IY )
-                  IY      = IY           + INCY
-   40          CONTINUE
-            END IF
-         END IF
-      END IF
-      IF( ALPHA.EQ.ZERO )
-     $   RETURN
-      IF( LSAME( TRANS, 'N' ) )THEN
-*
-*        Form  y := alpha*A*x + y.
-*
-         JX = KX
-         IF( INCY.EQ.1 )THEN
-            DO 60, J = 1, N
-               IF( X( JX ).NE.ZERO )THEN
-                  TEMP = ALPHA*X( JX )
-                  DO 50, I = 1, M
-                     Y( I ) = Y( I ) + TEMP*A( I, J )
-   50             CONTINUE
-               END IF
-               JX = JX + INCX
-   60       CONTINUE
-         ELSE
-            DO 80, J = 1, N
-               IF( X( JX ).NE.ZERO )THEN
-                  TEMP = ALPHA*X( JX )
-                  IY   = KY
-                  DO 70, I = 1, M
-                     Y( IY ) = Y( IY ) + TEMP*A( I, J )
-                     IY      = IY      + INCY
-   70             CONTINUE
-               END IF
-               JX = JX + INCX
-   80       CONTINUE
-         END IF
-      ELSE
-*
-*        Form  y := alpha*A'*x + y  or  y := alpha*conjg( A' )*x + y.
-*
-         JY = KY
-         IF( INCX.EQ.1 )THEN
-            DO 110, J = 1, N
-               TEMP = ZERO
-               IF( NOCONJ )THEN
-                  DO 90, I = 1, M
-                     TEMP = TEMP + A( I, J )*X( I )
-   90             CONTINUE
-               ELSE
-                  DO 100, I = 1, M
-                     TEMP = TEMP + DCONJG( A( I, J ) )*X( I )
-  100             CONTINUE
-               END IF
-               Y( JY ) = Y( JY ) + ALPHA*TEMP
-               JY      = JY      + INCY
-  110       CONTINUE
-         ELSE
-            DO 140, J = 1, N
-               TEMP = ZERO
-               IX   = KX
-               IF( NOCONJ )THEN
-                  DO 120, I = 1, M
-                     TEMP = TEMP + A( I, J )*X( IX )
-                     IX   = IX   + INCX
-  120             CONTINUE
-               ELSE
-                  DO 130, I = 1, M
-                     TEMP = TEMP + DCONJG( A( I, J ) )*X( IX )
-                     IX   = IX   + INCX
-  130             CONTINUE
-               END IF
-               Y( JY ) = Y( JY ) + ALPHA*TEMP
-               JY      = JY      + INCY
-  140       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZGEMV .
-*
-      END
--- a/libcruft/blas/zgerc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,157 +0,0 @@
-      SUBROUTINE ZGERC ( M, N, ALPHA, X, INCX, Y, INCY, A, LDA )
-*     .. Scalar Arguments ..
-      COMPLEX*16         ALPHA
-      INTEGER            INCX, INCY, LDA, M, N
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), X( * ), Y( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGERC  performs the rank 1 operation
-*
-*     A := alpha*x*conjg( y' ) + A,
-*
-*  where alpha is a scalar, x is an m element vector, y is an n element
-*  vector and A is an m by n matrix.
-*
-*  Parameters
-*  ==========
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of the matrix A.
-*           M must be at least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX*16      .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  X      - COMPLEX*16       array of dimension at least
-*           ( 1 + ( m - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the m
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  Y      - COMPLEX*16       array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ).
-*           Before entry, the incremented array Y must contain the n
-*           element vector y.
-*           Unchanged on exit.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX*16       array of DIMENSION ( LDA, n ).
-*           Before entry, the leading m by n part of the array A must
-*           contain the matrix of coefficients. On exit, A is
-*           overwritten by the updated matrix.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO
-      PARAMETER        ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     .. Local Scalars ..
-      COMPLEX*16         TEMP
-      INTEGER            I, INFO, IX, J, JY, KX
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF     ( M.LT.0 )THEN
-         INFO = 1
-      ELSE IF( N.LT.0 )THEN
-         INFO = 2
-      ELSE IF( INCX.EQ.0 )THEN
-         INFO = 5
-      ELSE IF( INCY.EQ.0 )THEN
-         INFO = 7
-      ELSE IF( LDA.LT.MAX( 1, M ) )THEN
-         INFO = 9
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'ZGERC ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR.( ALPHA.EQ.ZERO ) )
-     $   RETURN
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-      IF( INCY.GT.0 )THEN
-         JY = 1
-      ELSE
-         JY = 1 - ( N - 1 )*INCY
-      END IF
-      IF( INCX.EQ.1 )THEN
-         DO 20, J = 1, N
-            IF( Y( JY ).NE.ZERO )THEN
-               TEMP = ALPHA*DCONJG( Y( JY ) )
-               DO 10, I = 1, M
-                  A( I, J ) = A( I, J ) + X( I )*TEMP
-   10          CONTINUE
-            END IF
-            JY = JY + INCY
-   20    CONTINUE
-      ELSE
-         IF( INCX.GT.0 )THEN
-            KX = 1
-         ELSE
-            KX = 1 - ( M - 1 )*INCX
-         END IF
-         DO 40, J = 1, N
-            IF( Y( JY ).NE.ZERO )THEN
-               TEMP = ALPHA*DCONJG( Y( JY ) )
-               IX   = KX
-               DO 30, I = 1, M
-                  A( I, J ) = A( I, J ) + X( IX )*TEMP
-                  IX        = IX        + INCX
-   30          CONTINUE
-            END IF
-            JY = JY + INCY
-   40    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of ZGERC .
-*
-      END
--- a/libcruft/blas/zgeru.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,157 +0,0 @@
-      SUBROUTINE ZGERU ( M, N, ALPHA, X, INCX, Y, INCY, A, LDA )
-*     .. Scalar Arguments ..
-      COMPLEX*16         ALPHA
-      INTEGER            INCX, INCY, LDA, M, N
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), X( * ), Y( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGERU  performs the rank 1 operation
-*
-*     A := alpha*x*y' + A,
-*
-*  where alpha is a scalar, x is an m element vector, y is an n element
-*  vector and A is an m by n matrix.
-*
-*  Parameters
-*  ==========
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of the matrix A.
-*           M must be at least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX*16      .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  X      - COMPLEX*16       array of dimension at least
-*           ( 1 + ( m - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the m
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  Y      - COMPLEX*16       array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ).
-*           Before entry, the incremented array Y must contain the n
-*           element vector y.
-*           Unchanged on exit.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX*16       array of DIMENSION ( LDA, n ).
-*           Before entry, the leading m by n part of the array A must
-*           contain the matrix of coefficients. On exit, A is
-*           overwritten by the updated matrix.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO
-      PARAMETER        ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     .. Local Scalars ..
-      COMPLEX*16         TEMP
-      INTEGER            I, INFO, IX, J, JY, KX
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF     ( M.LT.0 )THEN
-         INFO = 1
-      ELSE IF( N.LT.0 )THEN
-         INFO = 2
-      ELSE IF( INCX.EQ.0 )THEN
-         INFO = 5
-      ELSE IF( INCY.EQ.0 )THEN
-         INFO = 7
-      ELSE IF( LDA.LT.MAX( 1, M ) )THEN
-         INFO = 9
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'ZGERU ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR.( ALPHA.EQ.ZERO ) )
-     $   RETURN
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-      IF( INCY.GT.0 )THEN
-         JY = 1
-      ELSE
-         JY = 1 - ( N - 1 )*INCY
-      END IF
-      IF( INCX.EQ.1 )THEN
-         DO 20, J = 1, N
-            IF( Y( JY ).NE.ZERO )THEN
-               TEMP = ALPHA*Y( JY )
-               DO 10, I = 1, M
-                  A( I, J ) = A( I, J ) + X( I )*TEMP
-   10          CONTINUE
-            END IF
-            JY = JY + INCY
-   20    CONTINUE
-      ELSE
-         IF( INCX.GT.0 )THEN
-            KX = 1
-         ELSE
-            KX = 1 - ( M - 1 )*INCX
-         END IF
-         DO 40, J = 1, N
-            IF( Y( JY ).NE.ZERO )THEN
-               TEMP = ALPHA*Y( JY )
-               IX   = KX
-               DO 30, I = 1, M
-                  A( I, J ) = A( I, J ) + X( IX )*TEMP
-                  IX        = IX        + INCX
-   30          CONTINUE
-            END IF
-            JY = JY + INCY
-   40    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of ZGERU .
-*
-      END
--- a/libcruft/blas/zhemm.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,298 +0,0 @@
-      SUBROUTINE ZHEMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC)
-*     .. Scalar Arguments ..
-      DOUBLE COMPLEX ALPHA,BETA
-      INTEGER LDA,LDB,LDC,M,N
-      CHARACTER SIDE,UPLO
-*     ..
-*     .. Array Arguments ..
-      DOUBLE COMPLEX A(LDA,*),B(LDB,*),C(LDC,*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZHEMM  performs one of the matrix-matrix operations
-*
-*     C := alpha*A*B + beta*C,
-*
-*  or
-*
-*     C := alpha*B*A + beta*C,
-*
-*  where alpha and beta are scalars, A is an hermitian matrix and  B and
-*  C are m by n matrices.
-*
-*  Arguments
-*  ==========
-*
-*  SIDE   - CHARACTER*1.
-*           On entry,  SIDE  specifies whether  the  hermitian matrix  A
-*           appears on the  left or right  in the  operation as follows:
-*
-*              SIDE = 'L' or 'l'   C := alpha*A*B + beta*C,
-*
-*              SIDE = 'R' or 'r'   C := alpha*B*A + beta*C,
-*
-*           Unchanged on exit.
-*
-*  UPLO   - CHARACTER*1.
-*           On  entry,   UPLO  specifies  whether  the  upper  or  lower
-*           triangular  part  of  the  hermitian  matrix   A  is  to  be
-*           referenced as follows:
-*
-*              UPLO = 'U' or 'u'   Only the upper triangular part of the
-*                                  hermitian matrix is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the lower triangular part of the
-*                                  hermitian matrix is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry,  M  specifies the number of rows of the matrix  C.
-*           M  must be at least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of the matrix C.
-*           N  must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX*16      .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX*16       array of DIMENSION ( LDA, ka ), where ka is
-*           m  when  SIDE = 'L' or 'l'  and is n  otherwise.
-*           Before entry  with  SIDE = 'L' or 'l',  the  m by m  part of
-*           the array  A  must contain the  hermitian matrix,  such that
-*           when  UPLO = 'U' or 'u', the leading m by m upper triangular
-*           part of the array  A  must contain the upper triangular part
-*           of the  hermitian matrix and the  strictly  lower triangular
-*           part of  A  is not referenced,  and when  UPLO = 'L' or 'l',
-*           the leading  m by m  lower triangular part  of the  array  A
-*           must  contain  the  lower triangular part  of the  hermitian
-*           matrix and the  strictly upper triangular part of  A  is not
-*           referenced.
-*           Before entry  with  SIDE = 'R' or 'r',  the  n by n  part of
-*           the array  A  must contain the  hermitian matrix,  such that
-*           when  UPLO = 'U' or 'u', the leading n by n upper triangular
-*           part of the array  A  must contain the upper triangular part
-*           of the  hermitian matrix and the  strictly  lower triangular
-*           part of  A  is not referenced,  and when  UPLO = 'L' or 'l',
-*           the leading  n by n  lower triangular part  of the  array  A
-*           must  contain  the  lower triangular part  of the  hermitian
-*           matrix and the  strictly upper triangular part of  A  is not
-*           referenced.
-*           Note that the imaginary parts  of the diagonal elements need
-*           not be set, they are assumed to be zero.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the  calling (sub) program. When  SIDE = 'L' or 'l'  then
-*           LDA must be at least  max( 1, m ), otherwise  LDA must be at
-*           least max( 1, n ).
-*           Unchanged on exit.
-*
-*  B      - COMPLEX*16       array of DIMENSION ( LDB, n ).
-*           Before entry, the leading  m by n part of the array  B  must
-*           contain the matrix B.
-*           Unchanged on exit.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in  the  calling  (sub)  program.   LDB  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*  BETA   - COMPLEX*16      .
-*           On entry,  BETA  specifies the scalar  beta.  When  BETA  is
-*           supplied as zero then C need not be set on input.
-*           Unchanged on exit.
-*
-*  C      - COMPLEX*16       array of DIMENSION ( LDC, n ).
-*           Before entry, the leading  m by n  part of the array  C must
-*           contain the matrix  C,  except when  beta  is zero, in which
-*           case C need not be set on entry.
-*           On exit, the array  C  is overwritten by the  m by n updated
-*           matrix.
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC DBLE,DCONJG,MAX
-*     ..
-*     .. Local Scalars ..
-      DOUBLE COMPLEX TEMP1,TEMP2
-      INTEGER I,INFO,J,K,NROWA
-      LOGICAL UPPER
-*     ..
-*     .. Parameters ..
-      DOUBLE COMPLEX ONE
-      PARAMETER (ONE= (1.0D+0,0.0D+0))
-      DOUBLE COMPLEX ZERO
-      PARAMETER (ZERO= (0.0D+0,0.0D+0))
-*     ..
-*
-*     Set NROWA as the number of rows of A.
-*
-      IF (LSAME(SIDE,'L')) THEN
-          NROWA = M
-      ELSE
-          NROWA = N
-      END IF
-      UPPER = LSAME(UPLO,'U')
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF ((.NOT.LSAME(SIDE,'L')) .AND. (.NOT.LSAME(SIDE,'R'))) THEN
-          INFO = 1
-      ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
-          INFO = 2
-      ELSE IF (M.LT.0) THEN
-          INFO = 3
-      ELSE IF (N.LT.0) THEN
-          INFO = 4
-      ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
-          INFO = 7
-      ELSE IF (LDB.LT.MAX(1,M)) THEN
-          INFO = 9
-      ELSE IF (LDC.LT.MAX(1,M)) THEN
-          INFO = 12
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('ZHEMM ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
-     +    ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF (ALPHA.EQ.ZERO) THEN
-          IF (BETA.EQ.ZERO) THEN
-              DO 20 J = 1,N
-                  DO 10 I = 1,M
-                      C(I,J) = ZERO
-   10             CONTINUE
-   20         CONTINUE
-          ELSE
-              DO 40 J = 1,N
-                  DO 30 I = 1,M
-                      C(I,J) = BETA*C(I,J)
-   30             CONTINUE
-   40         CONTINUE
-          END IF
-          RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF (LSAME(SIDE,'L')) THEN
-*
-*        Form  C := alpha*A*B + beta*C.
-*
-          IF (UPPER) THEN
-              DO 70 J = 1,N
-                  DO 60 I = 1,M
-                      TEMP1 = ALPHA*B(I,J)
-                      TEMP2 = ZERO
-                      DO 50 K = 1,I - 1
-                          C(K,J) = C(K,J) + TEMP1*A(K,I)
-                          TEMP2 = TEMP2 + B(K,J)*DCONJG(A(K,I))
-   50                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = TEMP1*DBLE(A(I,I)) + ALPHA*TEMP2
-                      ELSE
-                          C(I,J) = BETA*C(I,J) + TEMP1*DBLE(A(I,I)) +
-     +                             ALPHA*TEMP2
-                      END IF
-   60             CONTINUE
-   70         CONTINUE
-          ELSE
-              DO 100 J = 1,N
-                  DO 90 I = M,1,-1
-                      TEMP1 = ALPHA*B(I,J)
-                      TEMP2 = ZERO
-                      DO 80 K = I + 1,M
-                          C(K,J) = C(K,J) + TEMP1*A(K,I)
-                          TEMP2 = TEMP2 + B(K,J)*DCONJG(A(K,I))
-   80                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = TEMP1*DBLE(A(I,I)) + ALPHA*TEMP2
-                      ELSE
-                          C(I,J) = BETA*C(I,J) + TEMP1*DBLE(A(I,I)) +
-     +                             ALPHA*TEMP2
-                      END IF
-   90             CONTINUE
-  100         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  C := alpha*B*A + beta*C.
-*
-          DO 170 J = 1,N
-              TEMP1 = ALPHA*DBLE(A(J,J))
-              IF (BETA.EQ.ZERO) THEN
-                  DO 110 I = 1,M
-                      C(I,J) = TEMP1*B(I,J)
-  110             CONTINUE
-              ELSE
-                  DO 120 I = 1,M
-                      C(I,J) = BETA*C(I,J) + TEMP1*B(I,J)
-  120             CONTINUE
-              END IF
-              DO 140 K = 1,J - 1
-                  IF (UPPER) THEN
-                      TEMP1 = ALPHA*A(K,J)
-                  ELSE
-                      TEMP1 = ALPHA*DCONJG(A(J,K))
-                  END IF
-                  DO 130 I = 1,M
-                      C(I,J) = C(I,J) + TEMP1*B(I,K)
-  130             CONTINUE
-  140         CONTINUE
-              DO 160 K = J + 1,N
-                  IF (UPPER) THEN
-                      TEMP1 = ALPHA*DCONJG(A(J,K))
-                  ELSE
-                      TEMP1 = ALPHA*A(K,J)
-                  END IF
-                  DO 150 I = 1,M
-                      C(I,J) = C(I,J) + TEMP1*B(I,K)
-  150             CONTINUE
-  160         CONTINUE
-  170     CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of ZHEMM .
-*
-      END
--- a/libcruft/blas/zhemv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,269 +0,0 @@
-*
-************************************************************************
-*
-      SUBROUTINE ZHEMV ( UPLO, N, ALPHA, A, LDA, X, INCX,
-     $                   BETA, Y, INCY )
-*     .. Scalar Arguments ..
-      COMPLEX*16         ALPHA, BETA
-      INTEGER            INCX, INCY, LDA, N
-      CHARACTER*1        UPLO
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), X( * ), Y( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZHEMV  performs the matrix-vector  operation
-*
-*     y := alpha*A*x + beta*y,
-*
-*  where alpha and beta are scalars, x and y are n element vectors and
-*  A is an n by n hermitian matrix.
-*
-*  Parameters
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the upper or lower
-*           triangular part of the array A is to be referenced as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the upper triangular part of A
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the lower triangular part of A
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX*16      .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX*16       array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular part of the hermitian matrix and the strictly
-*           lower triangular part of A is not referenced.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular part of the hermitian matrix and the strictly
-*           upper triangular part of A is not referenced.
-*           Note that the imaginary parts of the diagonal elements need
-*           not be set and are assumed to be zero.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*  X      - COMPLEX*16       array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  BETA   - COMPLEX*16      .
-*           On entry, BETA specifies the scalar beta. When BETA is
-*           supplied as zero then Y need not be set on input.
-*           Unchanged on exit.
-*
-*  Y      - COMPLEX*16       array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ).
-*           Before entry, the incremented array Y must contain the n
-*           element vector y. On exit, Y is overwritten by the updated
-*           vector y.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER        ( ONE  = ( 1.0D+0, 0.0D+0 ) )
-      COMPLEX*16         ZERO
-      PARAMETER        ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     .. Local Scalars ..
-      COMPLEX*16         TEMP1, TEMP2
-      INTEGER            I, INFO, IX, IY, J, JX, JY, KX, KY
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX, DBLE
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF     ( .NOT.LSAME( UPLO, 'U' ).AND.
-     $         .NOT.LSAME( UPLO, 'L' )      )THEN
-         INFO = 1
-      ELSE IF( N.LT.0 )THEN
-         INFO = 2
-      ELSE IF( LDA.LT.MAX( 1, N ) )THEN
-         INFO = 5
-      ELSE IF( INCX.EQ.0 )THEN
-         INFO = 7
-      ELSE IF( INCY.EQ.0 )THEN
-         INFO = 10
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'ZHEMV ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( ( N.EQ.0 ).OR.( ( ALPHA.EQ.ZERO ).AND.( BETA.EQ.ONE ) ) )
-     $   RETURN
-*
-*     Set up the start points in  X  and  Y.
-*
-      IF( INCX.GT.0 )THEN
-         KX = 1
-      ELSE
-         KX = 1 - ( N - 1 )*INCX
-      END IF
-      IF( INCY.GT.0 )THEN
-         KY = 1
-      ELSE
-         KY = 1 - ( N - 1 )*INCY
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through the triangular part
-*     of A.
-*
-*     First form  y := beta*y.
-*
-      IF( BETA.NE.ONE )THEN
-         IF( INCY.EQ.1 )THEN
-            IF( BETA.EQ.ZERO )THEN
-               DO 10, I = 1, N
-                  Y( I ) = ZERO
-   10          CONTINUE
-            ELSE
-               DO 20, I = 1, N
-                  Y( I ) = BETA*Y( I )
-   20          CONTINUE
-            END IF
-         ELSE
-            IY = KY
-            IF( BETA.EQ.ZERO )THEN
-               DO 30, I = 1, N
-                  Y( IY ) = ZERO
-                  IY      = IY   + INCY
-   30          CONTINUE
-            ELSE
-               DO 40, I = 1, N
-                  Y( IY ) = BETA*Y( IY )
-                  IY      = IY           + INCY
-   40          CONTINUE
-            END IF
-         END IF
-      END IF
-      IF( ALPHA.EQ.ZERO )
-     $   RETURN
-      IF( LSAME( UPLO, 'U' ) )THEN
-*
-*        Form  y  when A is stored in upper triangle.
-*
-         IF( ( INCX.EQ.1 ).AND.( INCY.EQ.1 ) )THEN
-            DO 60, J = 1, N
-               TEMP1 = ALPHA*X( J )
-               TEMP2 = ZERO
-               DO 50, I = 1, J - 1
-                  Y( I ) = Y( I ) + TEMP1*A( I, J )
-                  TEMP2  = TEMP2  + DCONJG( A( I, J ) )*X( I )
-   50          CONTINUE
-               Y( J ) = Y( J ) + TEMP1*DBLE( A( J, J ) ) + ALPHA*TEMP2
-   60       CONTINUE
-         ELSE
-            JX = KX
-            JY = KY
-            DO 80, J = 1, N
-               TEMP1 = ALPHA*X( JX )
-               TEMP2 = ZERO
-               IX    = KX
-               IY    = KY
-               DO 70, I = 1, J - 1
-                  Y( IY ) = Y( IY ) + TEMP1*A( I, J )
-                  TEMP2   = TEMP2   + DCONJG( A( I, J ) )*X( IX )
-                  IX      = IX      + INCX
-                  IY      = IY      + INCY
-   70          CONTINUE
-               Y( JY ) = Y( JY ) + TEMP1*DBLE( A( J, J ) ) + ALPHA*TEMP2
-               JX      = JX      + INCX
-               JY      = JY      + INCY
-   80       CONTINUE
-         END IF
-      ELSE
-*
-*        Form  y  when A is stored in lower triangle.
-*
-         IF( ( INCX.EQ.1 ).AND.( INCY.EQ.1 ) )THEN
-            DO 100, J = 1, N
-               TEMP1  = ALPHA*X( J )
-               TEMP2  = ZERO
-               Y( J ) = Y( J ) + TEMP1*DBLE( A( J, J ) )
-               DO 90, I = J + 1, N
-                  Y( I ) = Y( I ) + TEMP1*A( I, J )
-                  TEMP2  = TEMP2  + DCONJG( A( I, J ) )*X( I )
-   90          CONTINUE
-               Y( J ) = Y( J ) + ALPHA*TEMP2
-  100       CONTINUE
-         ELSE
-            JX = KX
-            JY = KY
-            DO 120, J = 1, N
-               TEMP1   = ALPHA*X( JX )
-               TEMP2   = ZERO
-               Y( JY ) = Y( JY ) + TEMP1*DBLE( A( J, J ) )
-               IX      = JX
-               IY      = JY
-               DO 110, I = J + 1, N
-                  IX      = IX      + INCX
-                  IY      = IY      + INCY
-                  Y( IY ) = Y( IY ) + TEMP1*A( I, J )
-                  TEMP2   = TEMP2   + DCONJG( A( I, J ) )*X( IX )
-  110          CONTINUE
-               Y( JY ) = Y( JY ) + ALPHA*TEMP2
-               JX      = JX      + INCX
-               JY      = JY      + INCY
-  120       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZHEMV .
-*
-      END
--- a/libcruft/blas/zher.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,212 +0,0 @@
-      SUBROUTINE ZHER  ( UPLO, N, ALPHA, X, INCX, A, LDA )
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   ALPHA
-      INTEGER            INCX, LDA, N
-      CHARACTER*1        UPLO
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZHER   performs the hermitian rank 1 operation
-*
-*     A := alpha*x*conjg( x' ) + A,
-*
-*  where alpha is a real scalar, x is an n element vector and A is an
-*  n by n hermitian matrix.
-*
-*  Parameters
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the upper or lower
-*           triangular part of the array A is to be referenced as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the upper triangular part of A
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the lower triangular part of A
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - DOUBLE PRECISION.
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  X      - COMPLEX*16       array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX*16       array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular part of the hermitian matrix and the strictly
-*           lower triangular part of A is not referenced. On exit, the
-*           upper triangular part of the array A is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular part of the hermitian matrix and the strictly
-*           upper triangular part of A is not referenced. On exit, the
-*           lower triangular part of the array A is overwritten by the
-*           lower triangular part of the updated matrix.
-*           Note that the imaginary parts of the diagonal elements need
-*           not be set, they are assumed to be zero, and on exit they
-*           are set to zero.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO
-      PARAMETER        ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     .. Local Scalars ..
-      COMPLEX*16         TEMP
-      INTEGER            I, INFO, IX, J, JX, KX
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX, DBLE
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF     ( .NOT.LSAME( UPLO, 'U' ).AND.
-     $         .NOT.LSAME( UPLO, 'L' )      )THEN
-         INFO = 1
-      ELSE IF( N.LT.0 )THEN
-         INFO = 2
-      ELSE IF( INCX.EQ.0 )THEN
-         INFO = 5
-      ELSE IF( LDA.LT.MAX( 1, N ) )THEN
-         INFO = 7
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'ZHER  ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( ( N.EQ.0 ).OR.( ALPHA.EQ.DBLE( ZERO ) ) )
-     $   RETURN
-*
-*     Set the start point in X if the increment is not unity.
-*
-      IF( INCX.LE.0 )THEN
-         KX = 1 - ( N - 1 )*INCX
-      ELSE IF( INCX.NE.1 )THEN
-         KX = 1
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through the triangular part
-*     of A.
-*
-      IF( LSAME( UPLO, 'U' ) )THEN
-*
-*        Form  A  when A is stored in upper triangle.
-*
-         IF( INCX.EQ.1 )THEN
-            DO 20, J = 1, N
-               IF( X( J ).NE.ZERO )THEN
-                  TEMP = ALPHA*DCONJG( X( J ) )
-                  DO 10, I = 1, J - 1
-                     A( I, J ) = A( I, J ) + X( I )*TEMP
-   10             CONTINUE
-                  A( J, J ) = DBLE( A( J, J ) ) + DBLE( X( J )*TEMP )
-               ELSE
-                  A( J, J ) = DBLE( A( J, J ) )
-               END IF
-   20       CONTINUE
-         ELSE
-            JX = KX
-            DO 40, J = 1, N
-               IF( X( JX ).NE.ZERO )THEN
-                  TEMP = ALPHA*DCONJG( X( JX ) )
-                  IX   = KX
-                  DO 30, I = 1, J - 1
-                     A( I, J ) = A( I, J ) + X( IX )*TEMP
-                     IX        = IX        + INCX
-   30             CONTINUE
-                  A( J, J ) = DBLE( A( J, J ) ) + DBLE( X( JX )*TEMP )
-               ELSE
-                  A( J, J ) = DBLE( A( J, J ) )
-               END IF
-               JX = JX + INCX
-   40       CONTINUE
-         END IF
-      ELSE
-*
-*        Form  A  when A is stored in lower triangle.
-*
-         IF( INCX.EQ.1 )THEN
-            DO 60, J = 1, N
-               IF( X( J ).NE.ZERO )THEN
-                  TEMP      = ALPHA*DCONJG( X( J ) )
-                  A( J, J ) = DBLE( A( J, J ) ) + DBLE( TEMP*X( J ) )
-                  DO 50, I = J + 1, N
-                     A( I, J ) = A( I, J ) + X( I )*TEMP
-   50             CONTINUE
-               ELSE
-                  A( J, J ) = DBLE( A( J, J ) )
-               END IF
-   60       CONTINUE
-         ELSE
-            JX = KX
-            DO 80, J = 1, N
-               IF( X( JX ).NE.ZERO )THEN
-                  TEMP      = ALPHA*DCONJG( X( JX ) )
-                  A( J, J ) = DBLE( A( J, J ) ) + DBLE( TEMP*X( JX ) )
-                  IX        = JX
-                  DO 70, I = J + 1, N
-                     IX        = IX        + INCX
-                     A( I, J ) = A( I, J ) + X( IX )*TEMP
-   70             CONTINUE
-               ELSE
-                  A( J, J ) = DBLE( A( J, J ) )
-               END IF
-               JX = JX + INCX
-   80       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZHER  .
-*
-      END
--- a/libcruft/blas/zher2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,252 +0,0 @@
-*
-************************************************************************
-*
-      SUBROUTINE ZHER2 ( UPLO, N, ALPHA, X, INCX, Y, INCY, A, LDA )
-*     .. Scalar Arguments ..
-      COMPLEX*16         ALPHA
-      INTEGER            INCX, INCY, LDA, N
-      CHARACTER*1        UPLO
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), X( * ), Y( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZHER2  performs the hermitian rank 2 operation
-*
-*     A := alpha*x*conjg( y' ) + conjg( alpha )*y*conjg( x' ) + A,
-*
-*  where alpha is a scalar, x and y are n element vectors and A is an n
-*  by n hermitian matrix.
-*
-*  Parameters
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the upper or lower
-*           triangular part of the array A is to be referenced as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the upper triangular part of A
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the lower triangular part of A
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX*16      .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  X      - COMPLEX*16       array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element vector x.
-*           Unchanged on exit.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*  Y      - COMPLEX*16       array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCY ) ).
-*           Before entry, the incremented array Y must contain the n
-*           element vector y.
-*           Unchanged on exit.
-*
-*  INCY   - INTEGER.
-*           On entry, INCY specifies the increment for the elements of
-*           Y. INCY must not be zero.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX*16       array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular part of the hermitian matrix and the strictly
-*           lower triangular part of A is not referenced. On exit, the
-*           upper triangular part of the array A is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular part of the hermitian matrix and the strictly
-*           upper triangular part of A is not referenced. On exit, the
-*           lower triangular part of the array A is overwritten by the
-*           lower triangular part of the updated matrix.
-*           Note that the imaginary parts of the diagonal elements need
-*           not be set, they are assumed to be zero, and on exit they
-*           are set to zero.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO
-      PARAMETER        ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     .. Local Scalars ..
-      COMPLEX*16         TEMP1, TEMP2
-      INTEGER            I, INFO, IX, IY, J, JX, JY, KX, KY
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX, DBLE
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF     ( .NOT.LSAME( UPLO, 'U' ).AND.
-     $         .NOT.LSAME( UPLO, 'L' )      )THEN
-         INFO = 1
-      ELSE IF( N.LT.0 )THEN
-         INFO = 2
-      ELSE IF( INCX.EQ.0 )THEN
-         INFO = 5
-      ELSE IF( INCY.EQ.0 )THEN
-         INFO = 7
-      ELSE IF( LDA.LT.MAX( 1, N ) )THEN
-         INFO = 9
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'ZHER2 ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( ( N.EQ.0 ).OR.( ALPHA.EQ.ZERO ) )
-     $   RETURN
-*
-*     Set up the start points in X and Y if the increments are not both
-*     unity.
-*
-      IF( ( INCX.NE.1 ).OR.( INCY.NE.1 ) )THEN
-         IF( INCX.GT.0 )THEN
-            KX = 1
-         ELSE
-            KX = 1 - ( N - 1 )*INCX
-         END IF
-         IF( INCY.GT.0 )THEN
-            KY = 1
-         ELSE
-            KY = 1 - ( N - 1 )*INCY
-         END IF
-         JX = KX
-         JY = KY
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through the triangular part
-*     of A.
-*
-      IF( LSAME( UPLO, 'U' ) )THEN
-*
-*        Form  A  when A is stored in the upper triangle.
-*
-         IF( ( INCX.EQ.1 ).AND.( INCY.EQ.1 ) )THEN
-            DO 20, J = 1, N
-               IF( ( X( J ).NE.ZERO ).OR.( Y( J ).NE.ZERO ) )THEN
-                  TEMP1 = ALPHA*DCONJG( Y( J ) )
-                  TEMP2 = DCONJG( ALPHA*X( J ) )
-                  DO 10, I = 1, J - 1
-                     A( I, J ) = A( I, J ) + X( I )*TEMP1 + Y( I )*TEMP2
-   10             CONTINUE
-                  A( J, J ) = DBLE( A( J, J ) ) +
-     $                        DBLE( X( J )*TEMP1 + Y( J )*TEMP2 )
-               ELSE
-                  A( J, J ) = DBLE( A( J, J ) )
-               END IF
-   20       CONTINUE
-         ELSE
-            DO 40, J = 1, N
-               IF( ( X( JX ).NE.ZERO ).OR.( Y( JY ).NE.ZERO ) )THEN
-                  TEMP1 = ALPHA*DCONJG( Y( JY ) )
-                  TEMP2 = DCONJG( ALPHA*X( JX ) )
-                  IX    = KX
-                  IY    = KY
-                  DO 30, I = 1, J - 1
-                     A( I, J ) = A( I, J ) + X( IX )*TEMP1
-     $                                     + Y( IY )*TEMP2
-                     IX        = IX        + INCX
-                     IY        = IY        + INCY
-   30             CONTINUE
-                  A( J, J ) = DBLE( A( J, J ) ) +
-     $                        DBLE( X( JX )*TEMP1 + Y( JY )*TEMP2 )
-               ELSE
-                  A( J, J ) = DBLE( A( J, J ) )
-               END IF
-               JX = JX + INCX
-               JY = JY + INCY
-   40       CONTINUE
-         END IF
-      ELSE
-*
-*        Form  A  when A is stored in the lower triangle.
-*
-         IF( ( INCX.EQ.1 ).AND.( INCY.EQ.1 ) )THEN
-            DO 60, J = 1, N
-               IF( ( X( J ).NE.ZERO ).OR.( Y( J ).NE.ZERO ) )THEN
-                  TEMP1     = ALPHA*DCONJG( Y( J ) )
-                  TEMP2     = DCONJG( ALPHA*X( J ) )
-                  A( J, J ) = DBLE( A( J, J ) ) +
-     $                        DBLE( X( J )*TEMP1 + Y( J )*TEMP2 )
-                  DO 50, I = J + 1, N
-                     A( I, J ) = A( I, J ) + X( I )*TEMP1 + Y( I )*TEMP2
-   50             CONTINUE
-               ELSE
-                  A( J, J ) = DBLE( A( J, J ) )
-               END IF
-   60       CONTINUE
-         ELSE
-            DO 80, J = 1, N
-               IF( ( X( JX ).NE.ZERO ).OR.( Y( JY ).NE.ZERO ) )THEN
-                  TEMP1     = ALPHA*DCONJG( Y( JY ) )
-                  TEMP2     = DCONJG( ALPHA*X( JX ) )
-                  A( J, J ) = DBLE( A( J, J ) ) +
-     $                        DBLE( X( JX )*TEMP1 + Y( JY )*TEMP2 )
-                  IX        = JX
-                  IY        = JY
-                  DO 70, I = J + 1, N
-                     IX        = IX        + INCX
-                     IY        = IY        + INCY
-                     A( I, J ) = A( I, J ) + X( IX )*TEMP1
-     $                                     + Y( IY )*TEMP2
-   70             CONTINUE
-               ELSE
-                  A( J, J ) = DBLE( A( J, J ) )
-               END IF
-               JX = JX + INCX
-               JY = JY + INCY
-   80       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZHER2 .
-*
-      END
--- a/libcruft/blas/zher2k.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,372 +0,0 @@
-      SUBROUTINE ZHER2K( UPLO, TRANS, N, K, ALPHA, A, LDA, B, LDB, BETA,
-     $                   C, LDC )
-*     .. Scalar Arguments ..
-      CHARACTER          TRANS, UPLO
-      INTEGER            K, LDA, LDB, LDC, N
-      DOUBLE PRECISION   BETA
-      COMPLEX*16         ALPHA
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), B( LDB, * ), C( LDC, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZHER2K  performs one of the hermitian rank 2k operations
-*
-*     C := alpha*A*conjg( B' ) + conjg( alpha )*B*conjg( A' ) + beta*C,
-*
-*  or
-*
-*     C := alpha*conjg( A' )*B + conjg( alpha )*conjg( B' )*A + beta*C,
-*
-*  where  alpha and beta  are scalars with  beta  real,  C is an  n by n
-*  hermitian matrix and  A and B  are  n by k matrices in the first case
-*  and  k by n  matrices in the second case.
-*
-*  Parameters
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On  entry,   UPLO  specifies  whether  the  upper  or  lower
-*           triangular  part  of the  array  C  is to be  referenced  as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the  upper triangular part of  C
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the  lower triangular part of  C
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry,  TRANS  specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'    C := alpha*A*conjg( B' )          +
-*                                         conjg( alpha )*B*conjg( A' ) +
-*                                         beta*C.
-*
-*              TRANS = 'C' or 'c'    C := alpha*conjg( A' )*B          +
-*                                         conjg( alpha )*conjg( B' )*A +
-*                                         beta*C.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry,  N specifies the order of the matrix C.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry with  TRANS = 'N' or 'n',  K  specifies  the number
-*           of  columns  of the  matrices  A and B,  and on  entry  with
-*           TRANS = 'C' or 'c',  K  specifies  the number of rows of the
-*           matrices  A and B.  K must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX*16         .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX*16       array of DIMENSION ( LDA, ka ), where ka is
-*           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
-*           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
-*           part of the array  A  must contain the matrix  A,  otherwise
-*           the leading  k by n  part of the array  A  must contain  the
-*           matrix A.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
-*           then  LDA must be at least  max( 1, n ), otherwise  LDA must
-*           be at least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  B      - COMPLEX*16       array of DIMENSION ( LDB, kb ), where kb is
-*           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
-*           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
-*           part of the array  B  must contain the matrix  B,  otherwise
-*           the leading  k by n  part of the array  B  must contain  the
-*           matrix B.
-*           Unchanged on exit.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
-*           then  LDB must be at least  max( 1, n ), otherwise  LDB must
-*           be at least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  BETA   - DOUBLE PRECISION            .
-*           On entry, BETA specifies the scalar beta.
-*           Unchanged on exit.
-*
-*  C      - COMPLEX*16          array of DIMENSION ( LDC, n ).
-*           Before entry  with  UPLO = 'U' or 'u',  the leading  n by n
-*           upper triangular part of the array C must contain the upper
-*           triangular part  of the  hermitian matrix  and the strictly
-*           lower triangular part of C is not referenced.  On exit, the
-*           upper triangular part of the array  C is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry  with  UPLO = 'L' or 'l',  the leading  n by n
-*           lower triangular part of the array C must contain the lower
-*           triangular part  of the  hermitian matrix  and the strictly
-*           upper triangular part of C is not referenced.  On exit, the
-*           lower triangular part of the array  C is overwritten by the
-*           lower triangular part of the updated matrix.
-*           Note that the imaginary parts of the diagonal elements need
-*           not be set,  they are assumed to be zero,  and on exit they
-*           are set to zero.
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*  -- Modified 8-Nov-93 to set C(J,J) to DBLE( C(J,J) ) when BETA = 1.
-*     Ed Anderson, Cray Research Inc.
-*
-*
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, DCONJG, MAX
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            I, INFO, J, L, NROWA
-      COMPLEX*16         TEMP1, TEMP2
-*     ..
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-      COMPLEX*16         ZERO
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      IF( LSAME( TRANS, 'N' ) ) THEN
-         NROWA = N
-      ELSE
-         NROWA = K
-      END IF
-      UPPER = LSAME( UPLO, 'U' )
-*
-      INFO = 0
-      IF( ( .NOT.UPPER ) .AND. ( .NOT.LSAME( UPLO, 'L' ) ) ) THEN
-         INFO = 1
-      ELSE IF( ( .NOT.LSAME( TRANS, 'N' ) ) .AND.
-     $         ( .NOT.LSAME( TRANS, 'C' ) ) ) THEN
-         INFO = 2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = 3
-      ELSE IF( K.LT.0 ) THEN
-         INFO = 4
-      ELSE IF( LDA.LT.MAX( 1, NROWA ) ) THEN
-         INFO = 7
-      ELSE IF( LDB.LT.MAX( 1, NROWA ) ) THEN
-         INFO = 9
-      ELSE IF( LDC.LT.MAX( 1, N ) ) THEN
-         INFO = 12
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZHER2K', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( ( N.EQ.0 ) .OR. ( ( ( ALPHA.EQ.ZERO ) .OR. ( K.EQ.0 ) ) .AND.
-     $    ( BETA.EQ.ONE ) ) )RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF( ALPHA.EQ.ZERO ) THEN
-         IF( UPPER ) THEN
-            IF( BETA.EQ.DBLE( ZERO ) ) THEN
-               DO 20 J = 1, N
-                  DO 10 I = 1, J
-                     C( I, J ) = ZERO
-   10             CONTINUE
-   20          CONTINUE
-            ELSE
-               DO 40 J = 1, N
-                  DO 30 I = 1, J - 1
-                     C( I, J ) = BETA*C( I, J )
-   30             CONTINUE
-                  C( J, J ) = BETA*DBLE( C( J, J ) )
-   40          CONTINUE
-            END IF
-         ELSE
-            IF( BETA.EQ.DBLE( ZERO ) ) THEN
-               DO 60 J = 1, N
-                  DO 50 I = J, N
-                     C( I, J ) = ZERO
-   50             CONTINUE
-   60          CONTINUE
-            ELSE
-               DO 80 J = 1, N
-                  C( J, J ) = BETA*DBLE( C( J, J ) )
-                  DO 70 I = J + 1, N
-                     C( I, J ) = BETA*C( I, J )
-   70             CONTINUE
-   80          CONTINUE
-            END IF
-         END IF
-         RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF( LSAME( TRANS, 'N' ) ) THEN
-*
-*        Form  C := alpha*A*conjg( B' ) + conjg( alpha )*B*conjg( A' ) +
-*                   C.
-*
-         IF( UPPER ) THEN
-            DO 130 J = 1, N
-               IF( BETA.EQ.DBLE( ZERO ) ) THEN
-                  DO 90 I = 1, J
-                     C( I, J ) = ZERO
-   90             CONTINUE
-               ELSE IF( BETA.NE.ONE ) THEN
-                  DO 100 I = 1, J - 1
-                     C( I, J ) = BETA*C( I, J )
-  100             CONTINUE
-                  C( J, J ) = BETA*DBLE( C( J, J ) )
-               ELSE
-                  C( J, J ) = DBLE( C( J, J ) )
-               END IF
-               DO 120 L = 1, K
-                  IF( ( A( J, L ).NE.ZERO ) .OR. ( B( J, L ).NE.ZERO ) )
-     $                 THEN
-                     TEMP1 = ALPHA*DCONJG( B( J, L ) )
-                     TEMP2 = DCONJG( ALPHA*A( J, L ) )
-                     DO 110 I = 1, J - 1
-                        C( I, J ) = C( I, J ) + A( I, L )*TEMP1 +
-     $                              B( I, L )*TEMP2
-  110                CONTINUE
-                     C( J, J ) = DBLE( C( J, J ) ) +
-     $                           DBLE( A( J, L )*TEMP1+B( J, L )*TEMP2 )
-                  END IF
-  120          CONTINUE
-  130       CONTINUE
-         ELSE
-            DO 180 J = 1, N
-               IF( BETA.EQ.DBLE( ZERO ) ) THEN
-                  DO 140 I = J, N
-                     C( I, J ) = ZERO
-  140             CONTINUE
-               ELSE IF( BETA.NE.ONE ) THEN
-                  DO 150 I = J + 1, N
-                     C( I, J ) = BETA*C( I, J )
-  150             CONTINUE
-                  C( J, J ) = BETA*DBLE( C( J, J ) )
-               ELSE
-                  C( J, J ) = DBLE( C( J, J ) )
-               END IF
-               DO 170 L = 1, K
-                  IF( ( A( J, L ).NE.ZERO ) .OR. ( B( J, L ).NE.ZERO ) )
-     $                 THEN
-                     TEMP1 = ALPHA*DCONJG( B( J, L ) )
-                     TEMP2 = DCONJG( ALPHA*A( J, L ) )
-                     DO 160 I = J + 1, N
-                        C( I, J ) = C( I, J ) + A( I, L )*TEMP1 +
-     $                              B( I, L )*TEMP2
-  160                CONTINUE
-                     C( J, J ) = DBLE( C( J, J ) ) +
-     $                           DBLE( A( J, L )*TEMP1+B( J, L )*TEMP2 )
-                  END IF
-  170          CONTINUE
-  180       CONTINUE
-         END IF
-      ELSE
-*
-*        Form  C := alpha*conjg( A' )*B + conjg( alpha )*conjg( B' )*A +
-*                   C.
-*
-         IF( UPPER ) THEN
-            DO 210 J = 1, N
-               DO 200 I = 1, J
-                  TEMP1 = ZERO
-                  TEMP2 = ZERO
-                  DO 190 L = 1, K
-                     TEMP1 = TEMP1 + DCONJG( A( L, I ) )*B( L, J )
-                     TEMP2 = TEMP2 + DCONJG( B( L, I ) )*A( L, J )
-  190             CONTINUE
-                  IF( I.EQ.J ) THEN
-                     IF( BETA.EQ.DBLE( ZERO ) ) THEN
-                        C( J, J ) = DBLE( ALPHA*TEMP1+DCONJG( ALPHA )*
-     $                              TEMP2 )
-                     ELSE
-                        C( J, J ) = BETA*DBLE( C( J, J ) ) +
-     $                              DBLE( ALPHA*TEMP1+DCONJG( ALPHA )*
-     $                              TEMP2 )
-                     END IF
-                  ELSE
-                     IF( BETA.EQ.DBLE( ZERO ) ) THEN
-                        C( I, J ) = ALPHA*TEMP1 + DCONJG( ALPHA )*TEMP2
-                     ELSE
-                        C( I, J ) = BETA*C( I, J ) + ALPHA*TEMP1 +
-     $                              DCONJG( ALPHA )*TEMP2
-                     END IF
-                  END IF
-  200          CONTINUE
-  210       CONTINUE
-         ELSE
-            DO 240 J = 1, N
-               DO 230 I = J, N
-                  TEMP1 = ZERO
-                  TEMP2 = ZERO
-                  DO 220 L = 1, K
-                     TEMP1 = TEMP1 + DCONJG( A( L, I ) )*B( L, J )
-                     TEMP2 = TEMP2 + DCONJG( B( L, I ) )*A( L, J )
-  220             CONTINUE
-                  IF( I.EQ.J ) THEN
-                     IF( BETA.EQ.DBLE( ZERO ) ) THEN
-                        C( J, J ) = DBLE( ALPHA*TEMP1+DCONJG( ALPHA )*
-     $                              TEMP2 )
-                     ELSE
-                        C( J, J ) = BETA*DBLE( C( J, J ) ) +
-     $                              DBLE( ALPHA*TEMP1+DCONJG( ALPHA )*
-     $                              TEMP2 )
-                     END IF
-                  ELSE
-                     IF( BETA.EQ.DBLE( ZERO ) ) THEN
-                        C( I, J ) = ALPHA*TEMP1 + DCONJG( ALPHA )*TEMP2
-                     ELSE
-                        C( I, J ) = BETA*C( I, J ) + ALPHA*TEMP1 +
-     $                              DCONJG( ALPHA )*TEMP2
-                     END IF
-                  END IF
-  230          CONTINUE
-  240       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZHER2K.
-*
-      END
--- a/libcruft/blas/zherk.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,330 +0,0 @@
-      SUBROUTINE ZHERK( UPLO, TRANS, N, K, ALPHA, A, LDA, BETA, C, LDC )
-*     .. Scalar Arguments ..
-      CHARACTER          TRANS, UPLO
-      INTEGER            K, LDA, LDC, N
-      DOUBLE PRECISION   ALPHA, BETA
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), C( LDC, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZHERK  performs one of the hermitian rank k operations
-*
-*     C := alpha*A*conjg( A' ) + beta*C,
-*
-*  or
-*
-*     C := alpha*conjg( A' )*A + beta*C,
-*
-*  where  alpha and beta  are  real scalars,  C is an  n by n  hermitian
-*  matrix and  A  is an  n by k  matrix in the  first case and a  k by n
-*  matrix in the second case.
-*
-*  Parameters
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On  entry,   UPLO  specifies  whether  the  upper  or  lower
-*           triangular  part  of the  array  C  is to be  referenced  as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the  upper triangular part of  C
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the  lower triangular part of  C
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry,  TRANS  specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   C := alpha*A*conjg( A' ) + beta*C.
-*
-*              TRANS = 'C' or 'c'   C := alpha*conjg( A' )*A + beta*C.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry,  N specifies the order of the matrix C.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry with  TRANS = 'N' or 'n',  K  specifies  the number
-*           of  columns   of  the   matrix   A,   and  on   entry   with
-*           TRANS = 'C' or 'c',  K  specifies  the number of rows of the
-*           matrix A.  K must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - DOUBLE PRECISION            .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX*16       array of DIMENSION ( LDA, ka ), where ka is
-*           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
-*           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
-*           part of the array  A  must contain the matrix  A,  otherwise
-*           the leading  k by n  part of the array  A  must contain  the
-*           matrix A.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
-*           then  LDA must be at least  max( 1, n ), otherwise  LDA must
-*           be at least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  BETA   - DOUBLE PRECISION.
-*           On entry, BETA specifies the scalar beta.
-*           Unchanged on exit.
-*
-*  C      - COMPLEX*16          array of DIMENSION ( LDC, n ).
-*           Before entry  with  UPLO = 'U' or 'u',  the leading  n by n
-*           upper triangular part of the array C must contain the upper
-*           triangular part  of the  hermitian matrix  and the strictly
-*           lower triangular part of C is not referenced.  On exit, the
-*           upper triangular part of the array  C is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry  with  UPLO = 'L' or 'l',  the leading  n by n
-*           lower triangular part of the array C must contain the lower
-*           triangular part  of the  hermitian matrix  and the strictly
-*           upper triangular part of C is not referenced.  On exit, the
-*           lower triangular part of the array  C is overwritten by the
-*           lower triangular part of the updated matrix.
-*           Note that the imaginary parts of the diagonal elements need
-*           not be set,  they are assumed to be zero,  and on exit they
-*           are set to zero.
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*  -- Modified 8-Nov-93 to set C(J,J) to DBLE( C(J,J) ) when BETA = 1.
-*     Ed Anderson, Cray Research Inc.
-*
-*
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, DCMPLX, DCONJG, MAX
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            I, INFO, J, L, NROWA
-      DOUBLE PRECISION   RTEMP
-      COMPLEX*16         TEMP
-*     ..
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      IF( LSAME( TRANS, 'N' ) ) THEN
-         NROWA = N
-      ELSE
-         NROWA = K
-      END IF
-      UPPER = LSAME( UPLO, 'U' )
-*
-      INFO = 0
-      IF( ( .NOT.UPPER ) .AND. ( .NOT.LSAME( UPLO, 'L' ) ) ) THEN
-         INFO = 1
-      ELSE IF( ( .NOT.LSAME( TRANS, 'N' ) ) .AND.
-     $         ( .NOT.LSAME( TRANS, 'C' ) ) ) THEN
-         INFO = 2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = 3
-      ELSE IF( K.LT.0 ) THEN
-         INFO = 4
-      ELSE IF( LDA.LT.MAX( 1, NROWA ) ) THEN
-         INFO = 7
-      ELSE IF( LDC.LT.MAX( 1, N ) ) THEN
-         INFO = 10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZHERK ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( ( N.EQ.0 ) .OR. ( ( ( ALPHA.EQ.ZERO ) .OR. ( K.EQ.0 ) ) .AND.
-     $    ( BETA.EQ.ONE ) ) )RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF( ALPHA.EQ.ZERO ) THEN
-         IF( UPPER ) THEN
-            IF( BETA.EQ.ZERO ) THEN
-               DO 20 J = 1, N
-                  DO 10 I = 1, J
-                     C( I, J ) = ZERO
-   10             CONTINUE
-   20          CONTINUE
-            ELSE
-               DO 40 J = 1, N
-                  DO 30 I = 1, J - 1
-                     C( I, J ) = BETA*C( I, J )
-   30             CONTINUE
-                  C( J, J ) = BETA*DBLE( C( J, J ) )
-   40          CONTINUE
-            END IF
-         ELSE
-            IF( BETA.EQ.ZERO ) THEN
-               DO 60 J = 1, N
-                  DO 50 I = J, N
-                     C( I, J ) = ZERO
-   50             CONTINUE
-   60          CONTINUE
-            ELSE
-               DO 80 J = 1, N
-                  C( J, J ) = BETA*DBLE( C( J, J ) )
-                  DO 70 I = J + 1, N
-                     C( I, J ) = BETA*C( I, J )
-   70             CONTINUE
-   80          CONTINUE
-            END IF
-         END IF
-         RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF( LSAME( TRANS, 'N' ) ) THEN
-*
-*        Form  C := alpha*A*conjg( A' ) + beta*C.
-*
-         IF( UPPER ) THEN
-            DO 130 J = 1, N
-               IF( BETA.EQ.ZERO ) THEN
-                  DO 90 I = 1, J
-                     C( I, J ) = ZERO
-   90             CONTINUE
-               ELSE IF( BETA.NE.ONE ) THEN
-                  DO 100 I = 1, J - 1
-                     C( I, J ) = BETA*C( I, J )
-  100             CONTINUE
-                  C( J, J ) = BETA*DBLE( C( J, J ) )
-               ELSE
-                  C( J, J ) = DBLE( C( J, J ) )
-               END IF
-               DO 120 L = 1, K
-                  IF( A( J, L ).NE.DCMPLX( ZERO ) ) THEN
-                     TEMP = ALPHA*DCONJG( A( J, L ) )
-                     DO 110 I = 1, J - 1
-                        C( I, J ) = C( I, J ) + TEMP*A( I, L )
-  110                CONTINUE
-                     C( J, J ) = DBLE( C( J, J ) ) +
-     $                           DBLE( TEMP*A( I, L ) )
-                  END IF
-  120          CONTINUE
-  130       CONTINUE
-         ELSE
-            DO 180 J = 1, N
-               IF( BETA.EQ.ZERO ) THEN
-                  DO 140 I = J, N
-                     C( I, J ) = ZERO
-  140             CONTINUE
-               ELSE IF( BETA.NE.ONE ) THEN
-                  C( J, J ) = BETA*DBLE( C( J, J ) )
-                  DO 150 I = J + 1, N
-                     C( I, J ) = BETA*C( I, J )
-  150             CONTINUE
-               ELSE
-                  C( J, J ) = DBLE( C( J, J ) )
-               END IF
-               DO 170 L = 1, K
-                  IF( A( J, L ).NE.DCMPLX( ZERO ) ) THEN
-                     TEMP = ALPHA*DCONJG( A( J, L ) )
-                     C( J, J ) = DBLE( C( J, J ) ) +
-     $                           DBLE( TEMP*A( J, L ) )
-                     DO 160 I = J + 1, N
-                        C( I, J ) = C( I, J ) + TEMP*A( I, L )
-  160                CONTINUE
-                  END IF
-  170          CONTINUE
-  180       CONTINUE
-         END IF
-      ELSE
-*
-*        Form  C := alpha*conjg( A' )*A + beta*C.
-*
-         IF( UPPER ) THEN
-            DO 220 J = 1, N
-               DO 200 I = 1, J - 1
-                  TEMP = ZERO
-                  DO 190 L = 1, K
-                     TEMP = TEMP + DCONJG( A( L, I ) )*A( L, J )
-  190             CONTINUE
-                  IF( BETA.EQ.ZERO ) THEN
-                     C( I, J ) = ALPHA*TEMP
-                  ELSE
-                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-                  END IF
-  200          CONTINUE
-               RTEMP = ZERO
-               DO 210 L = 1, K
-                  RTEMP = RTEMP + DCONJG( A( L, J ) )*A( L, J )
-  210          CONTINUE
-               IF( BETA.EQ.ZERO ) THEN
-                  C( J, J ) = ALPHA*RTEMP
-               ELSE
-                  C( J, J ) = ALPHA*RTEMP + BETA*DBLE( C( J, J ) )
-               END IF
-  220       CONTINUE
-         ELSE
-            DO 260 J = 1, N
-               RTEMP = ZERO
-               DO 230 L = 1, K
-                  RTEMP = RTEMP + DCONJG( A( L, J ) )*A( L, J )
-  230          CONTINUE
-               IF( BETA.EQ.ZERO ) THEN
-                  C( J, J ) = ALPHA*RTEMP
-               ELSE
-                  C( J, J ) = ALPHA*RTEMP + BETA*DBLE( C( J, J ) )
-               END IF
-               DO 250 I = J + 1, N
-                  TEMP = ZERO
-                  DO 240 L = 1, K
-                     TEMP = TEMP + DCONJG( A( L, I ) )*A( L, J )
-  240             CONTINUE
-                  IF( BETA.EQ.ZERO ) THEN
-                     C( I, J ) = ALPHA*TEMP
-                  ELSE
-                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-                  END IF
-  250          CONTINUE
-  260       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZHERK .
-*
-      END
--- a/libcruft/blas/zscal.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-      subroutine  zscal(n,za,zx,incx)
-c
-c     scales a vector by a constant.
-c     jack dongarra, 3/11/78.
-c     modified 3/93 to return if incx .le. 0.
-c     modified 12/3/93, array(1) declarations changed to array(*)
-c
-      double complex za,zx(*)
-      integer i,incx,ix,n
-c
-      if( n.le.0 .or. incx.le.0 )return
-      if(incx.eq.1)go to 20
-c
-c        code for increment not equal to 1
-c
-      ix = 1
-      do 10 i = 1,n
-        zx(ix) = za*zx(ix)
-        ix = ix + incx
-   10 continue
-      return
-c
-c        code for increment equal to 1
-c
-   20 do 30 i = 1,n
-        zx(i) = za*zx(i)
-   30 continue
-      return
-      end
--- a/libcruft/blas/zswap.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-      subroutine  zswap (n,zx,incx,zy,incy)
-c
-c     interchanges two vectors.
-c     jack dongarra, 3/11/78.
-c     modified 12/3/93, array(1) declarations changed to array(*)
-c
-      double complex zx(*),zy(*),ztemp
-      integer i,incx,incy,ix,iy,n
-c
-      if(n.le.0)return
-      if(incx.eq.1.and.incy.eq.1)go to 20
-c
-c       code for unequal increments or equal increments not equal
-c         to 1
-c
-      ix = 1
-      iy = 1
-      if(incx.lt.0)ix = (-n+1)*incx + 1
-      if(incy.lt.0)iy = (-n+1)*incy + 1
-      do 10 i = 1,n
-        ztemp = zx(ix)
-        zx(ix) = zy(iy)
-        zy(iy) = ztemp
-        ix = ix + incx
-        iy = iy + incy
-   10 continue
-      return
-c
-c       code for both increments equal to 1
-   20 do 30 i = 1,n
-        ztemp = zx(i)
-        zx(i) = zy(i)
-        zy(i) = ztemp
-   30 continue
-      return
-      end
--- a/libcruft/blas/zsyrk.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,294 +0,0 @@
-      SUBROUTINE ZSYRK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC)
-*     .. Scalar Arguments ..
-      DOUBLE COMPLEX ALPHA,BETA
-      INTEGER K,LDA,LDC,N
-      CHARACTER TRANS,UPLO
-*     ..
-*     .. Array Arguments ..
-      DOUBLE COMPLEX A(LDA,*),C(LDC,*)
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZSYRK  performs one of the symmetric rank k operations
-*
-*     C := alpha*A*A' + beta*C,
-*
-*  or
-*
-*     C := alpha*A'*A + beta*C,
-*
-*  where  alpha and beta  are scalars,  C is an  n by n symmetric matrix
-*  and  A  is an  n by k  matrix in the first case and a  k by n  matrix
-*  in the second case.
-*
-*  Arguments
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On  entry,   UPLO  specifies  whether  the  upper  or  lower
-*           triangular  part  of the  array  C  is to be  referenced  as
-*           follows:
-*
-*              UPLO = 'U' or 'u'   Only the  upper triangular part of  C
-*                                  is to be referenced.
-*
-*              UPLO = 'L' or 'l'   Only the  lower triangular part of  C
-*                                  is to be referenced.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry,  TRANS  specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   C := alpha*A*A' + beta*C.
-*
-*              TRANS = 'T' or 't'   C := alpha*A'*A + beta*C.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry,  N specifies the order of the matrix C.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry with  TRANS = 'N' or 'n',  K  specifies  the number
-*           of  columns   of  the   matrix   A,   and  on   entry   with
-*           TRANS = 'T' or 't',  K  specifies  the number of rows of the
-*           matrix A.  K must be at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX*16      .
-*           On entry, ALPHA specifies the scalar alpha.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX*16       array of DIMENSION ( LDA, ka ), where ka is
-*           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
-*           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
-*           part of the array  A  must contain the matrix  A,  otherwise
-*           the leading  k by n  part of the array  A  must contain  the
-*           matrix A.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
-*           then  LDA must be at least  max( 1, n ), otherwise  LDA must
-*           be at least  max( 1, k ).
-*           Unchanged on exit.
-*
-*  BETA   - COMPLEX*16      .
-*           On entry, BETA specifies the scalar beta.
-*           Unchanged on exit.
-*
-*  C      - COMPLEX*16       array of DIMENSION ( LDC, n ).
-*           Before entry  with  UPLO = 'U' or 'u',  the leading  n by n
-*           upper triangular part of the array C must contain the upper
-*           triangular part  of the  symmetric matrix  and the strictly
-*           lower triangular part of C is not referenced.  On exit, the
-*           upper triangular part of the array  C is overwritten by the
-*           upper triangular part of the updated matrix.
-*           Before entry  with  UPLO = 'L' or 'l',  the leading  n by n
-*           lower triangular part of the array C must contain the lower
-*           triangular part  of the  symmetric matrix  and the strictly
-*           upper triangular part of C is not referenced.  On exit, the
-*           lower triangular part of the array  C is overwritten by the
-*           lower triangular part of the updated matrix.
-*
-*  LDC    - INTEGER.
-*           On entry, LDC specifies the first dimension of C as declared
-*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL LSAME
-      EXTERNAL LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC MAX
-*     ..
-*     .. Local Scalars ..
-      DOUBLE COMPLEX TEMP
-      INTEGER I,INFO,J,L,NROWA
-      LOGICAL UPPER
-*     ..
-*     .. Parameters ..
-      DOUBLE COMPLEX ONE
-      PARAMETER (ONE= (1.0D+0,0.0D+0))
-      DOUBLE COMPLEX ZERO
-      PARAMETER (ZERO= (0.0D+0,0.0D+0))
-*     ..
-*
-*     Test the input parameters.
-*
-      IF (LSAME(TRANS,'N')) THEN
-          NROWA = N
-      ELSE
-          NROWA = K
-      END IF
-      UPPER = LSAME(UPLO,'U')
-*
-      INFO = 0
-      IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
-          INFO = 1
-      ELSE IF ((.NOT.LSAME(TRANS,'N')) .AND.
-     +         (.NOT.LSAME(TRANS,'T'))) THEN
-          INFO = 2
-      ELSE IF (N.LT.0) THEN
-          INFO = 3
-      ELSE IF (K.LT.0) THEN
-          INFO = 4
-      ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
-          INFO = 7
-      ELSE IF (LDC.LT.MAX(1,N)) THEN
-          INFO = 10
-      END IF
-      IF (INFO.NE.0) THEN
-          CALL XERBLA('ZSYRK ',INFO)
-          RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF ((N.EQ.0) .OR. (((ALPHA.EQ.ZERO).OR.
-     +    (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF (ALPHA.EQ.ZERO) THEN
-          IF (UPPER) THEN
-              IF (BETA.EQ.ZERO) THEN
-                  DO 20 J = 1,N
-                      DO 10 I = 1,J
-                          C(I,J) = ZERO
-   10                 CONTINUE
-   20             CONTINUE
-              ELSE
-                  DO 40 J = 1,N
-                      DO 30 I = 1,J
-                          C(I,J) = BETA*C(I,J)
-   30                 CONTINUE
-   40             CONTINUE
-              END IF
-          ELSE
-              IF (BETA.EQ.ZERO) THEN
-                  DO 60 J = 1,N
-                      DO 50 I = J,N
-                          C(I,J) = ZERO
-   50                 CONTINUE
-   60             CONTINUE
-              ELSE
-                  DO 80 J = 1,N
-                      DO 70 I = J,N
-                          C(I,J) = BETA*C(I,J)
-   70                 CONTINUE
-   80             CONTINUE
-              END IF
-          END IF
-          RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF (LSAME(TRANS,'N')) THEN
-*
-*        Form  C := alpha*A*A' + beta*C.
-*
-          IF (UPPER) THEN
-              DO 130 J = 1,N
-                  IF (BETA.EQ.ZERO) THEN
-                      DO 90 I = 1,J
-                          C(I,J) = ZERO
-   90                 CONTINUE
-                  ELSE IF (BETA.NE.ONE) THEN
-                      DO 100 I = 1,J
-                          C(I,J) = BETA*C(I,J)
-  100                 CONTINUE
-                  END IF
-                  DO 120 L = 1,K
-                      IF (A(J,L).NE.ZERO) THEN
-                          TEMP = ALPHA*A(J,L)
-                          DO 110 I = 1,J
-                              C(I,J) = C(I,J) + TEMP*A(I,L)
-  110                     CONTINUE
-                      END IF
-  120             CONTINUE
-  130         CONTINUE
-          ELSE
-              DO 180 J = 1,N
-                  IF (BETA.EQ.ZERO) THEN
-                      DO 140 I = J,N
-                          C(I,J) = ZERO
-  140                 CONTINUE
-                  ELSE IF (BETA.NE.ONE) THEN
-                      DO 150 I = J,N
-                          C(I,J) = BETA*C(I,J)
-  150                 CONTINUE
-                  END IF
-                  DO 170 L = 1,K
-                      IF (A(J,L).NE.ZERO) THEN
-                          TEMP = ALPHA*A(J,L)
-                          DO 160 I = J,N
-                              C(I,J) = C(I,J) + TEMP*A(I,L)
-  160                     CONTINUE
-                      END IF
-  170             CONTINUE
-  180         CONTINUE
-          END IF
-      ELSE
-*
-*        Form  C := alpha*A'*A + beta*C.
-*
-          IF (UPPER) THEN
-              DO 210 J = 1,N
-                  DO 200 I = 1,J
-                      TEMP = ZERO
-                      DO 190 L = 1,K
-                          TEMP = TEMP + A(L,I)*A(L,J)
-  190                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP
-                      ELSE
-                          C(I,J) = ALPHA*TEMP + BETA*C(I,J)
-                      END IF
-  200             CONTINUE
-  210         CONTINUE
-          ELSE
-              DO 240 J = 1,N
-                  DO 230 I = J,N
-                      TEMP = ZERO
-                      DO 220 L = 1,K
-                          TEMP = TEMP + A(L,I)*A(L,J)
-  220                 CONTINUE
-                      IF (BETA.EQ.ZERO) THEN
-                          C(I,J) = ALPHA*TEMP
-                      ELSE
-                          C(I,J) = ALPHA*TEMP + BETA*C(I,J)
-                      END IF
-  230             CONTINUE
-  240         CONTINUE
-          END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZSYRK .
-*
-      END
--- a/libcruft/blas/ztbsv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,381 +0,0 @@
-      SUBROUTINE ZTBSV ( UPLO, TRANS, DIAG, N, K, A, LDA, X, INCX )
-*     .. Scalar Arguments ..
-      INTEGER            INCX, K, LDA, N
-      CHARACTER*1        DIAG, TRANS, UPLO
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZTBSV  solves one of the systems of equations
-*
-*     A*x = b,   or   A'*x = b,   or   conjg( A' )*x = b,
-*
-*  where b and x are n element vectors and A is an n by n unit, or
-*  non-unit, upper or lower triangular band matrix, with ( k + 1 )
-*  diagonals.
-*
-*  No test for singularity or near-singularity is included in this
-*  routine. Such tests must be performed before calling this routine.
-*
-*  Parameters
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry, TRANS specifies the equations to be solved as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   A*x = b.
-*
-*              TRANS = 'T' or 't'   A'*x = b.
-*
-*              TRANS = 'C' or 'c'   conjg( A' )*x = b.
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit
-*           triangular as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  K      - INTEGER.
-*           On entry with UPLO = 'U' or 'u', K specifies the number of
-*           super-diagonals of the matrix A.
-*           On entry with UPLO = 'L' or 'l', K specifies the number of
-*           sub-diagonals of the matrix A.
-*           K must satisfy  0 .le. K.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX*16       array of DIMENSION ( LDA, n ).
-*           Before entry with UPLO = 'U' or 'u', the leading ( k + 1 )
-*           by n part of the array A must contain the upper triangular
-*           band part of the matrix of coefficients, supplied column by
-*           column, with the leading diagonal of the matrix in row
-*           ( k + 1 ) of the array, the first super-diagonal starting at
-*           position 2 in row k, and so on. The top left k by k triangle
-*           of the array A is not referenced.
-*           The following program segment will transfer an upper
-*           triangular band matrix from conventional full matrix storage
-*           to band storage:
-*
-*                 DO 20, J = 1, N
-*                    M = K + 1 - J
-*                    DO 10, I = MAX( 1, J - K ), J
-*                       A( M + I, J ) = matrix( I, J )
-*              10    CONTINUE
-*              20 CONTINUE
-*
-*           Before entry with UPLO = 'L' or 'l', the leading ( k + 1 )
-*           by n part of the array A must contain the lower triangular
-*           band part of the matrix of coefficients, supplied column by
-*           column, with the leading diagonal of the matrix in row 1 of
-*           the array, the first sub-diagonal starting at position 1 in
-*           row 2, and so on. The bottom right k by k triangle of the
-*           array A is not referenced.
-*           The following program segment will transfer a lower
-*           triangular band matrix from conventional full matrix storage
-*           to band storage:
-*
-*                 DO 20, J = 1, N
-*                    M = 1 - J
-*                    DO 10, I = J, MIN( N, J + K )
-*                       A( M + I, J ) = matrix( I, J )
-*              10    CONTINUE
-*              20 CONTINUE
-*
-*           Note that when DIAG = 'U' or 'u' the elements of the array A
-*           corresponding to the diagonal elements of the matrix are not
-*           referenced, but are assumed to be unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           ( k + 1 ).
-*           Unchanged on exit.
-*
-*  X      - COMPLEX*16       array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element right-hand side vector b. On exit, X is overwritten
-*           with the solution vector x.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO
-      PARAMETER        ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     .. Local Scalars ..
-      COMPLEX*16         TEMP
-      INTEGER            I, INFO, IX, J, JX, KPLUS1, KX, L
-      LOGICAL            NOCONJ, NOUNIT
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF     ( .NOT.LSAME( UPLO , 'U' ).AND.
-     $         .NOT.LSAME( UPLO , 'L' )      )THEN
-         INFO = 1
-      ELSE IF( .NOT.LSAME( TRANS, 'N' ).AND.
-     $         .NOT.LSAME( TRANS, 'T' ).AND.
-     $         .NOT.LSAME( TRANS, 'C' )      )THEN
-         INFO = 2
-      ELSE IF( .NOT.LSAME( DIAG , 'U' ).AND.
-     $         .NOT.LSAME( DIAG , 'N' )      )THEN
-         INFO = 3
-      ELSE IF( N.LT.0 )THEN
-         INFO = 4
-      ELSE IF( K.LT.0 )THEN
-         INFO = 5
-      ELSE IF( LDA.LT.( K + 1 ) )THEN
-         INFO = 7
-      ELSE IF( INCX.EQ.0 )THEN
-         INFO = 9
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'ZTBSV ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      NOCONJ = LSAME( TRANS, 'T' )
-      NOUNIT = LSAME( DIAG , 'N' )
-*
-*     Set up the start point in X if the increment is not unity. This
-*     will be  ( N - 1 )*INCX  too small for descending loops.
-*
-      IF( INCX.LE.0 )THEN
-         KX = 1 - ( N - 1 )*INCX
-      ELSE IF( INCX.NE.1 )THEN
-         KX = 1
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed by sequentially with one pass through A.
-*
-      IF( LSAME( TRANS, 'N' ) )THEN
-*
-*        Form  x := inv( A )*x.
-*
-         IF( LSAME( UPLO, 'U' ) )THEN
-            KPLUS1 = K + 1
-            IF( INCX.EQ.1 )THEN
-               DO 20, J = N, 1, -1
-                  IF( X( J ).NE.ZERO )THEN
-                     L = KPLUS1 - J
-                     IF( NOUNIT )
-     $                  X( J ) = X( J )/A( KPLUS1, J )
-                     TEMP = X( J )
-                     DO 10, I = J - 1, MAX( 1, J - K ), -1
-                        X( I ) = X( I ) - TEMP*A( L + I, J )
-   10                CONTINUE
-                  END IF
-   20          CONTINUE
-            ELSE
-               KX = KX + ( N - 1 )*INCX
-               JX = KX
-               DO 40, J = N, 1, -1
-                  KX = KX - INCX
-                  IF( X( JX ).NE.ZERO )THEN
-                     IX = KX
-                     L  = KPLUS1 - J
-                     IF( NOUNIT )
-     $                  X( JX ) = X( JX )/A( KPLUS1, J )
-                     TEMP = X( JX )
-                     DO 30, I = J - 1, MAX( 1, J - K ), -1
-                        X( IX ) = X( IX ) - TEMP*A( L + I, J )
-                        IX      = IX      - INCX
-   30                CONTINUE
-                  END IF
-                  JX = JX - INCX
-   40          CONTINUE
-            END IF
-         ELSE
-            IF( INCX.EQ.1 )THEN
-               DO 60, J = 1, N
-                  IF( X( J ).NE.ZERO )THEN
-                     L = 1 - J
-                     IF( NOUNIT )
-     $                  X( J ) = X( J )/A( 1, J )
-                     TEMP = X( J )
-                     DO 50, I = J + 1, MIN( N, J + K )
-                        X( I ) = X( I ) - TEMP*A( L + I, J )
-   50                CONTINUE
-                  END IF
-   60          CONTINUE
-            ELSE
-               JX = KX
-               DO 80, J = 1, N
-                  KX = KX + INCX
-                  IF( X( JX ).NE.ZERO )THEN
-                     IX = KX
-                     L  = 1  - J
-                     IF( NOUNIT )
-     $                  X( JX ) = X( JX )/A( 1, J )
-                     TEMP = X( JX )
-                     DO 70, I = J + 1, MIN( N, J + K )
-                        X( IX ) = X( IX ) - TEMP*A( L + I, J )
-                        IX      = IX      + INCX
-   70                CONTINUE
-                  END IF
-                  JX = JX + INCX
-   80          CONTINUE
-            END IF
-         END IF
-      ELSE
-*
-*        Form  x := inv( A' )*x  or  x := inv( conjg( A') )*x.
-*
-         IF( LSAME( UPLO, 'U' ) )THEN
-            KPLUS1 = K + 1
-            IF( INCX.EQ.1 )THEN
-               DO 110, J = 1, N
-                  TEMP = X( J )
-                  L    = KPLUS1 - J
-                  IF( NOCONJ )THEN
-                     DO 90, I = MAX( 1, J - K ), J - 1
-                        TEMP = TEMP - A( L + I, J )*X( I )
-   90                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/A( KPLUS1, J )
-                  ELSE
-                     DO 100, I = MAX( 1, J - K ), J - 1
-                        TEMP = TEMP - DCONJG( A( L + I, J ) )*X( I )
-  100                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/DCONJG( A( KPLUS1, J ) )
-                  END IF
-                  X( J ) = TEMP
-  110          CONTINUE
-            ELSE
-               JX = KX
-               DO 140, J = 1, N
-                  TEMP = X( JX )
-                  IX   = KX
-                  L    = KPLUS1  - J
-                  IF( NOCONJ )THEN
-                     DO 120, I = MAX( 1, J - K ), J - 1
-                        TEMP = TEMP - A( L + I, J )*X( IX )
-                        IX   = IX   + INCX
-  120                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/A( KPLUS1, J )
-                  ELSE
-                     DO 130, I = MAX( 1, J - K ), J - 1
-                        TEMP = TEMP - DCONJG( A( L + I, J ) )*X( IX )
-                        IX   = IX   + INCX
-  130                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/DCONJG( A( KPLUS1, J ) )
-                  END IF
-                  X( JX ) = TEMP
-                  JX      = JX   + INCX
-                  IF( J.GT.K )
-     $               KX = KX + INCX
-  140          CONTINUE
-            END IF
-         ELSE
-            IF( INCX.EQ.1 )THEN
-               DO 170, J = N, 1, -1
-                  TEMP = X( J )
-                  L    = 1      - J
-                  IF( NOCONJ )THEN
-                     DO 150, I = MIN( N, J + K ), J + 1, -1
-                        TEMP = TEMP - A( L + I, J )*X( I )
-  150                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/A( 1, J )
-                  ELSE
-                     DO 160, I = MIN( N, J + K ), J + 1, -1
-                        TEMP = TEMP - DCONJG( A( L + I, J ) )*X( I )
-  160                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/DCONJG( A( 1, J ) )
-                  END IF
-                  X( J ) = TEMP
-  170          CONTINUE
-            ELSE
-               KX = KX + ( N - 1 )*INCX
-               JX = KX
-               DO 200, J = N, 1, -1
-                  TEMP = X( JX )
-                  IX   = KX
-                  L    = 1       - J
-                  IF( NOCONJ )THEN
-                     DO 180, I = MIN( N, J + K ), J + 1, -1
-                        TEMP = TEMP - A( L + I, J )*X( IX )
-                        IX   = IX   - INCX
-  180                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/A( 1, J )
-                  ELSE
-                     DO 190, I = MIN( N, J + K ), J + 1, -1
-                        TEMP = TEMP - DCONJG( A( L + I, J ) )*X( IX )
-                        IX   = IX   - INCX
-  190                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/DCONJG( A( 1, J ) )
-                  END IF
-                  X( JX ) = TEMP
-                  JX      = JX   - INCX
-                  IF( ( N - J ).GE.K )
-     $               KX = KX - INCX
-  200          CONTINUE
-            END IF
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZTBSV .
-*
-      END
--- a/libcruft/blas/ztrmm.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,392 +0,0 @@
-      SUBROUTINE ZTRMM ( SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA,
-     $                   B, LDB )
-*     .. Scalar Arguments ..
-      CHARACTER*1        SIDE, UPLO, TRANSA, DIAG
-      INTEGER            M, N, LDA, LDB
-      COMPLEX*16         ALPHA
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZTRMM  performs one of the matrix-matrix operations
-*
-*     B := alpha*op( A )*B,   or   B := alpha*B*op( A )
-*
-*  where  alpha  is a scalar,  B  is an m by n matrix,  A  is a unit, or
-*  non-unit,  upper or lower triangular matrix  and  op( A )  is one  of
-*
-*     op( A ) = A   or   op( A ) = A'   or   op( A ) = conjg( A' ).
-*
-*  Parameters
-*  ==========
-*
-*  SIDE   - CHARACTER*1.
-*           On entry,  SIDE specifies whether  op( A ) multiplies B from
-*           the left or right as follows:
-*
-*              SIDE = 'L' or 'l'   B := alpha*op( A )*B.
-*
-*              SIDE = 'R' or 'r'   B := alpha*B*op( A ).
-*
-*           Unchanged on exit.
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix A is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANSA - CHARACTER*1.
-*           On entry, TRANSA specifies the form of op( A ) to be used in
-*           the matrix multiplication as follows:
-*
-*              TRANSA = 'N' or 'n'   op( A ) = A.
-*
-*              TRANSA = 'T' or 't'   op( A ) = A'.
-*
-*              TRANSA = 'C' or 'c'   op( A ) = conjg( A' ).
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit triangular
-*           as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of B. M must be at
-*           least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of B.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX*16      .
-*           On entry,  ALPHA specifies the scalar  alpha. When  alpha is
-*           zero then  A is not referenced and  B need not be set before
-*           entry.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX*16       array of DIMENSION ( LDA, k ), where k is m
-*           when  SIDE = 'L' or 'l'  and is  n  when  SIDE = 'R' or 'r'.
-*           Before entry  with  UPLO = 'U' or 'u',  the  leading  k by k
-*           upper triangular part of the array  A must contain the upper
-*           triangular matrix  and the strictly lower triangular part of
-*           A is not referenced.
-*           Before entry  with  UPLO = 'L' or 'l',  the  leading  k by k
-*           lower triangular part of the array  A must contain the lower
-*           triangular matrix  and the strictly upper triangular part of
-*           A is not referenced.
-*           Note that when  DIAG = 'U' or 'u',  the diagonal elements of
-*           A  are not referenced either,  but are assumed to be  unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program.  When  SIDE = 'L' or 'l'  then
-*           LDA  must be at least  max( 1, m ),  when  SIDE = 'R' or 'r'
-*           then LDA must be at least max( 1, n ).
-*           Unchanged on exit.
-*
-*  B      - COMPLEX*16       array of DIMENSION ( LDB, n ).
-*           Before entry,  the leading  m by n part of the array  B must
-*           contain the matrix  B,  and  on exit  is overwritten  by the
-*           transformed matrix.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in  the  calling  (sub)  program.   LDB  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX
-*     .. Local Scalars ..
-      LOGICAL            LSIDE, NOCONJ, NOUNIT, UPPER
-      INTEGER            I, INFO, J, K, NROWA
-      COMPLEX*16         TEMP
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER        ( ONE  = ( 1.0D+0, 0.0D+0 ) )
-      COMPLEX*16         ZERO
-      PARAMETER        ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      LSIDE  = LSAME( SIDE  , 'L' )
-      IF( LSIDE )THEN
-         NROWA = M
-      ELSE
-         NROWA = N
-      END IF
-      NOCONJ = LSAME( TRANSA, 'T' )
-      NOUNIT = LSAME( DIAG  , 'N' )
-      UPPER  = LSAME( UPLO  , 'U' )
-*
-      INFO   = 0
-      IF(      ( .NOT.LSIDE                ).AND.
-     $         ( .NOT.LSAME( SIDE  , 'R' ) )      )THEN
-         INFO = 1
-      ELSE IF( ( .NOT.UPPER                ).AND.
-     $         ( .NOT.LSAME( UPLO  , 'L' ) )      )THEN
-         INFO = 2
-      ELSE IF( ( .NOT.LSAME( TRANSA, 'N' ) ).AND.
-     $         ( .NOT.LSAME( TRANSA, 'T' ) ).AND.
-     $         ( .NOT.LSAME( TRANSA, 'C' ) )      )THEN
-         INFO = 3
-      ELSE IF( ( .NOT.LSAME( DIAG  , 'U' ) ).AND.
-     $         ( .NOT.LSAME( DIAG  , 'N' ) )      )THEN
-         INFO = 4
-      ELSE IF( M  .LT.0               )THEN
-         INFO = 5
-      ELSE IF( N  .LT.0               )THEN
-         INFO = 6
-      ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN
-         INFO = 9
-      ELSE IF( LDB.LT.MAX( 1, M     ) )THEN
-         INFO = 11
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'ZTRMM ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF( ALPHA.EQ.ZERO )THEN
-         DO 20, J = 1, N
-            DO 10, I = 1, M
-               B( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-         RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF( LSIDE )THEN
-         IF( LSAME( TRANSA, 'N' ) )THEN
-*
-*           Form  B := alpha*A*B.
-*
-            IF( UPPER )THEN
-               DO 50, J = 1, N
-                  DO 40, K = 1, M
-                     IF( B( K, J ).NE.ZERO )THEN
-                        TEMP = ALPHA*B( K, J )
-                        DO 30, I = 1, K - 1
-                           B( I, J ) = B( I, J ) + TEMP*A( I, K )
-   30                   CONTINUE
-                        IF( NOUNIT )
-     $                     TEMP = TEMP*A( K, K )
-                        B( K, J ) = TEMP
-                     END IF
-   40             CONTINUE
-   50          CONTINUE
-            ELSE
-               DO 80, J = 1, N
-                  DO 70 K = M, 1, -1
-                     IF( B( K, J ).NE.ZERO )THEN
-                        TEMP      = ALPHA*B( K, J )
-                        B( K, J ) = TEMP
-                        IF( NOUNIT )
-     $                     B( K, J ) = B( K, J )*A( K, K )
-                        DO 60, I = K + 1, M
-                           B( I, J ) = B( I, J ) + TEMP*A( I, K )
-   60                   CONTINUE
-                     END IF
-   70             CONTINUE
-   80          CONTINUE
-            END IF
-         ELSE
-*
-*           Form  B := alpha*A'*B   or   B := alpha*conjg( A' )*B.
-*
-            IF( UPPER )THEN
-               DO 120, J = 1, N
-                  DO 110, I = M, 1, -1
-                     TEMP = B( I, J )
-                     IF( NOCONJ )THEN
-                        IF( NOUNIT )
-     $                     TEMP = TEMP*A( I, I )
-                        DO 90, K = 1, I - 1
-                           TEMP = TEMP + A( K, I )*B( K, J )
-   90                   CONTINUE
-                     ELSE
-                        IF( NOUNIT )
-     $                     TEMP = TEMP*DCONJG( A( I, I ) )
-                        DO 100, K = 1, I - 1
-                           TEMP = TEMP + DCONJG( A( K, I ) )*B( K, J )
-  100                   CONTINUE
-                     END IF
-                     B( I, J ) = ALPHA*TEMP
-  110             CONTINUE
-  120          CONTINUE
-            ELSE
-               DO 160, J = 1, N
-                  DO 150, I = 1, M
-                     TEMP = B( I, J )
-                     IF( NOCONJ )THEN
-                        IF( NOUNIT )
-     $                     TEMP = TEMP*A( I, I )
-                        DO 130, K = I + 1, M
-                           TEMP = TEMP + A( K, I )*B( K, J )
-  130                   CONTINUE
-                     ELSE
-                        IF( NOUNIT )
-     $                     TEMP = TEMP*DCONJG( A( I, I ) )
-                        DO 140, K = I + 1, M
-                           TEMP = TEMP + DCONJG( A( K, I ) )*B( K, J )
-  140                   CONTINUE
-                     END IF
-                     B( I, J ) = ALPHA*TEMP
-  150             CONTINUE
-  160          CONTINUE
-            END IF
-         END IF
-      ELSE
-         IF( LSAME( TRANSA, 'N' ) )THEN
-*
-*           Form  B := alpha*B*A.
-*
-            IF( UPPER )THEN
-               DO 200, J = N, 1, -1
-                  TEMP = ALPHA
-                  IF( NOUNIT )
-     $               TEMP = TEMP*A( J, J )
-                  DO 170, I = 1, M
-                     B( I, J ) = TEMP*B( I, J )
-  170             CONTINUE
-                  DO 190, K = 1, J - 1
-                     IF( A( K, J ).NE.ZERO )THEN
-                        TEMP = ALPHA*A( K, J )
-                        DO 180, I = 1, M
-                           B( I, J ) = B( I, J ) + TEMP*B( I, K )
-  180                   CONTINUE
-                     END IF
-  190             CONTINUE
-  200          CONTINUE
-            ELSE
-               DO 240, J = 1, N
-                  TEMP = ALPHA
-                  IF( NOUNIT )
-     $               TEMP = TEMP*A( J, J )
-                  DO 210, I = 1, M
-                     B( I, J ) = TEMP*B( I, J )
-  210             CONTINUE
-                  DO 230, K = J + 1, N
-                     IF( A( K, J ).NE.ZERO )THEN
-                        TEMP = ALPHA*A( K, J )
-                        DO 220, I = 1, M
-                           B( I, J ) = B( I, J ) + TEMP*B( I, K )
-  220                   CONTINUE
-                     END IF
-  230             CONTINUE
-  240          CONTINUE
-            END IF
-         ELSE
-*
-*           Form  B := alpha*B*A'   or   B := alpha*B*conjg( A' ).
-*
-            IF( UPPER )THEN
-               DO 280, K = 1, N
-                  DO 260, J = 1, K - 1
-                     IF( A( J, K ).NE.ZERO )THEN
-                        IF( NOCONJ )THEN
-                           TEMP = ALPHA*A( J, K )
-                        ELSE
-                           TEMP = ALPHA*DCONJG( A( J, K ) )
-                        END IF
-                        DO 250, I = 1, M
-                           B( I, J ) = B( I, J ) + TEMP*B( I, K )
-  250                   CONTINUE
-                     END IF
-  260             CONTINUE
-                  TEMP = ALPHA
-                  IF( NOUNIT )THEN
-                     IF( NOCONJ )THEN
-                        TEMP = TEMP*A( K, K )
-                     ELSE
-                        TEMP = TEMP*DCONJG( A( K, K ) )
-                     END IF
-                  END IF
-                  IF( TEMP.NE.ONE )THEN
-                     DO 270, I = 1, M
-                        B( I, K ) = TEMP*B( I, K )
-  270                CONTINUE
-                  END IF
-  280          CONTINUE
-            ELSE
-               DO 320, K = N, 1, -1
-                  DO 300, J = K + 1, N
-                     IF( A( J, K ).NE.ZERO )THEN
-                        IF( NOCONJ )THEN
-                           TEMP = ALPHA*A( J, K )
-                        ELSE
-                           TEMP = ALPHA*DCONJG( A( J, K ) )
-                        END IF
-                        DO 290, I = 1, M
-                           B( I, J ) = B( I, J ) + TEMP*B( I, K )
-  290                   CONTINUE
-                     END IF
-  300             CONTINUE
-                  TEMP = ALPHA
-                  IF( NOUNIT )THEN
-                     IF( NOCONJ )THEN
-                        TEMP = TEMP*A( K, K )
-                     ELSE
-                        TEMP = TEMP*DCONJG( A( K, K ) )
-                     END IF
-                  END IF
-                  IF( TEMP.NE.ONE )THEN
-                     DO 310, I = 1, M
-                        B( I, K ) = TEMP*B( I, K )
-  310                CONTINUE
-                  END IF
-  320          CONTINUE
-            END IF
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZTRMM .
-*
-      END
--- a/libcruft/blas/ztrmv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,321 +0,0 @@
-      SUBROUTINE ZTRMV ( UPLO, TRANS, DIAG, N, A, LDA, X, INCX )
-*     .. Scalar Arguments ..
-      INTEGER            INCX, LDA, N
-      CHARACTER*1        DIAG, TRANS, UPLO
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZTRMV  performs one of the matrix-vector operations
-*
-*     x := A*x,   or   x := A'*x,   or   x := conjg( A' )*x,
-*
-*  where x is an n element vector and  A is an n by n unit, or non-unit,
-*  upper or lower triangular matrix.
-*
-*  Parameters
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry, TRANS specifies the operation to be performed as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   x := A*x.
-*
-*              TRANS = 'T' or 't'   x := A'*x.
-*
-*              TRANS = 'C' or 'c'   x := conjg( A' )*x.
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit
-*           triangular as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX*16       array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular matrix and the strictly lower triangular part of
-*           A is not referenced.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular matrix and the strictly upper triangular part of
-*           A is not referenced.
-*           Note that when  DIAG = 'U' or 'u', the diagonal elements of
-*           A are not referenced either, but are assumed to be unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*  X      - COMPLEX*16       array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element vector x. On exit, X is overwritten with the
-*           tranformed vector x.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO
-      PARAMETER        ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     .. Local Scalars ..
-      COMPLEX*16         TEMP
-      INTEGER            I, INFO, IX, J, JX, KX
-      LOGICAL            NOCONJ, NOUNIT
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF     ( .NOT.LSAME( UPLO , 'U' ).AND.
-     $         .NOT.LSAME( UPLO , 'L' )      )THEN
-         INFO = 1
-      ELSE IF( .NOT.LSAME( TRANS, 'N' ).AND.
-     $         .NOT.LSAME( TRANS, 'T' ).AND.
-     $         .NOT.LSAME( TRANS, 'C' )      )THEN
-         INFO = 2
-      ELSE IF( .NOT.LSAME( DIAG , 'U' ).AND.
-     $         .NOT.LSAME( DIAG , 'N' )      )THEN
-         INFO = 3
-      ELSE IF( N.LT.0 )THEN
-         INFO = 4
-      ELSE IF( LDA.LT.MAX( 1, N ) )THEN
-         INFO = 6
-      ELSE IF( INCX.EQ.0 )THEN
-         INFO = 8
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'ZTRMV ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      NOCONJ = LSAME( TRANS, 'T' )
-      NOUNIT = LSAME( DIAG , 'N' )
-*
-*     Set up the start point in X if the increment is not unity. This
-*     will be  ( N - 1 )*INCX  too small for descending loops.
-*
-      IF( INCX.LE.0 )THEN
-         KX = 1 - ( N - 1 )*INCX
-      ELSE IF( INCX.NE.1 )THEN
-         KX = 1
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-      IF( LSAME( TRANS, 'N' ) )THEN
-*
-*        Form  x := A*x.
-*
-         IF( LSAME( UPLO, 'U' ) )THEN
-            IF( INCX.EQ.1 )THEN
-               DO 20, J = 1, N
-                  IF( X( J ).NE.ZERO )THEN
-                     TEMP = X( J )
-                     DO 10, I = 1, J - 1
-                        X( I ) = X( I ) + TEMP*A( I, J )
-   10                CONTINUE
-                     IF( NOUNIT )
-     $                  X( J ) = X( J )*A( J, J )
-                  END IF
-   20          CONTINUE
-            ELSE
-               JX = KX
-               DO 40, J = 1, N
-                  IF( X( JX ).NE.ZERO )THEN
-                     TEMP = X( JX )
-                     IX   = KX
-                     DO 30, I = 1, J - 1
-                        X( IX ) = X( IX ) + TEMP*A( I, J )
-                        IX      = IX      + INCX
-   30                CONTINUE
-                     IF( NOUNIT )
-     $                  X( JX ) = X( JX )*A( J, J )
-                  END IF
-                  JX = JX + INCX
-   40          CONTINUE
-            END IF
-         ELSE
-            IF( INCX.EQ.1 )THEN
-               DO 60, J = N, 1, -1
-                  IF( X( J ).NE.ZERO )THEN
-                     TEMP = X( J )
-                     DO 50, I = N, J + 1, -1
-                        X( I ) = X( I ) + TEMP*A( I, J )
-   50                CONTINUE
-                     IF( NOUNIT )
-     $                  X( J ) = X( J )*A( J, J )
-                  END IF
-   60          CONTINUE
-            ELSE
-               KX = KX + ( N - 1 )*INCX
-               JX = KX
-               DO 80, J = N, 1, -1
-                  IF( X( JX ).NE.ZERO )THEN
-                     TEMP = X( JX )
-                     IX   = KX
-                     DO 70, I = N, J + 1, -1
-                        X( IX ) = X( IX ) + TEMP*A( I, J )
-                        IX      = IX      - INCX
-   70                CONTINUE
-                     IF( NOUNIT )
-     $                  X( JX ) = X( JX )*A( J, J )
-                  END IF
-                  JX = JX - INCX
-   80          CONTINUE
-            END IF
-         END IF
-      ELSE
-*
-*        Form  x := A'*x  or  x := conjg( A' )*x.
-*
-         IF( LSAME( UPLO, 'U' ) )THEN
-            IF( INCX.EQ.1 )THEN
-               DO 110, J = N, 1, -1
-                  TEMP = X( J )
-                  IF( NOCONJ )THEN
-                     IF( NOUNIT )
-     $                  TEMP = TEMP*A( J, J )
-                     DO 90, I = J - 1, 1, -1
-                        TEMP = TEMP + A( I, J )*X( I )
-   90                CONTINUE
-                  ELSE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP*DCONJG( A( J, J ) )
-                     DO 100, I = J - 1, 1, -1
-                        TEMP = TEMP + DCONJG( A( I, J ) )*X( I )
-  100                CONTINUE
-                  END IF
-                  X( J ) = TEMP
-  110          CONTINUE
-            ELSE
-               JX = KX + ( N - 1 )*INCX
-               DO 140, J = N, 1, -1
-                  TEMP = X( JX )
-                  IX   = JX
-                  IF( NOCONJ )THEN
-                     IF( NOUNIT )
-     $                  TEMP = TEMP*A( J, J )
-                     DO 120, I = J - 1, 1, -1
-                        IX   = IX   - INCX
-                        TEMP = TEMP + A( I, J )*X( IX )
-  120                CONTINUE
-                  ELSE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP*DCONJG( A( J, J ) )
-                     DO 130, I = J - 1, 1, -1
-                        IX   = IX   - INCX
-                        TEMP = TEMP + DCONJG( A( I, J ) )*X( IX )
-  130                CONTINUE
-                  END IF
-                  X( JX ) = TEMP
-                  JX      = JX   - INCX
-  140          CONTINUE
-            END IF
-         ELSE
-            IF( INCX.EQ.1 )THEN
-               DO 170, J = 1, N
-                  TEMP = X( J )
-                  IF( NOCONJ )THEN
-                     IF( NOUNIT )
-     $                  TEMP = TEMP*A( J, J )
-                     DO 150, I = J + 1, N
-                        TEMP = TEMP + A( I, J )*X( I )
-  150                CONTINUE
-                  ELSE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP*DCONJG( A( J, J ) )
-                     DO 160, I = J + 1, N
-                        TEMP = TEMP + DCONJG( A( I, J ) )*X( I )
-  160                CONTINUE
-                  END IF
-                  X( J ) = TEMP
-  170          CONTINUE
-            ELSE
-               JX = KX
-               DO 200, J = 1, N
-                  TEMP = X( JX )
-                  IX   = JX
-                  IF( NOCONJ )THEN
-                     IF( NOUNIT )
-     $                  TEMP = TEMP*A( J, J )
-                     DO 180, I = J + 1, N
-                        IX   = IX   + INCX
-                        TEMP = TEMP + A( I, J )*X( IX )
-  180                CONTINUE
-                  ELSE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP*DCONJG( A( J, J ) )
-                     DO 190, I = J + 1, N
-                        IX   = IX   + INCX
-                        TEMP = TEMP + DCONJG( A( I, J ) )*X( IX )
-  190                CONTINUE
-                  END IF
-                  X( JX ) = TEMP
-                  JX      = JX   + INCX
-  200          CONTINUE
-            END IF
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZTRMV .
-*
-      END
--- a/libcruft/blas/ztrsm.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,414 +0,0 @@
-      SUBROUTINE ZTRSM ( SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA,
-     $                   B, LDB )
-*     .. Scalar Arguments ..
-      CHARACTER*1        SIDE, UPLO, TRANSA, DIAG
-      INTEGER            M, N, LDA, LDB
-      COMPLEX*16         ALPHA
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZTRSM  solves one of the matrix equations
-*
-*     op( A )*X = alpha*B,   or   X*op( A ) = alpha*B,
-*
-*  where alpha is a scalar, X and B are m by n matrices, A is a unit, or
-*  non-unit,  upper or lower triangular matrix  and  op( A )  is one  of
-*
-*     op( A ) = A   or   op( A ) = A'   or   op( A ) = conjg( A' ).
-*
-*  The matrix X is overwritten on B.
-*
-*  Parameters
-*  ==========
-*
-*  SIDE   - CHARACTER*1.
-*           On entry, SIDE specifies whether op( A ) appears on the left
-*           or right of X as follows:
-*
-*              SIDE = 'L' or 'l'   op( A )*X = alpha*B.
-*
-*              SIDE = 'R' or 'r'   X*op( A ) = alpha*B.
-*
-*           Unchanged on exit.
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix A is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANSA - CHARACTER*1.
-*           On entry, TRANSA specifies the form of op( A ) to be used in
-*           the matrix multiplication as follows:
-*
-*              TRANSA = 'N' or 'n'   op( A ) = A.
-*
-*              TRANSA = 'T' or 't'   op( A ) = A'.
-*
-*              TRANSA = 'C' or 'c'   op( A ) = conjg( A' ).
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit triangular
-*           as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  M      - INTEGER.
-*           On entry, M specifies the number of rows of B. M must be at
-*           least zero.
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the number of columns of B.  N must be
-*           at least zero.
-*           Unchanged on exit.
-*
-*  ALPHA  - COMPLEX*16      .
-*           On entry,  ALPHA specifies the scalar  alpha. When  alpha is
-*           zero then  A is not referenced and  B need not be set before
-*           entry.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX*16       array of DIMENSION ( LDA, k ), where k is m
-*           when  SIDE = 'L' or 'l'  and is  n  when  SIDE = 'R' or 'r'.
-*           Before entry  with  UPLO = 'U' or 'u',  the  leading  k by k
-*           upper triangular part of the array  A must contain the upper
-*           triangular matrix  and the strictly lower triangular part of
-*           A is not referenced.
-*           Before entry  with  UPLO = 'L' or 'l',  the  leading  k by k
-*           lower triangular part of the array  A must contain the lower
-*           triangular matrix  and the strictly upper triangular part of
-*           A is not referenced.
-*           Note that when  DIAG = 'U' or 'u',  the diagonal elements of
-*           A  are not referenced either,  but are assumed to be  unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program.  When  SIDE = 'L' or 'l'  then
-*           LDA  must be at least  max( 1, m ),  when  SIDE = 'R' or 'r'
-*           then LDA must be at least max( 1, n ).
-*           Unchanged on exit.
-*
-*  B      - COMPLEX*16       array of DIMENSION ( LDB, n ).
-*           Before entry,  the leading  m by n part of the array  B must
-*           contain  the  right-hand  side  matrix  B,  and  on exit  is
-*           overwritten by the solution matrix  X.
-*
-*  LDB    - INTEGER.
-*           On entry, LDB specifies the first dimension of B as declared
-*           in  the  calling  (sub)  program.   LDB  must  be  at  least
-*           max( 1, m ).
-*           Unchanged on exit.
-*
-*
-*  Level 3 Blas routine.
-*
-*  -- Written on 8-February-1989.
-*     Jack Dongarra, Argonne National Laboratory.
-*     Iain Duff, AERE Harwell.
-*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-*     Sven Hammarling, Numerical Algorithms Group Ltd.
-*
-*
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX
-*     .. Local Scalars ..
-      LOGICAL            LSIDE, NOCONJ, NOUNIT, UPPER
-      INTEGER            I, INFO, J, K, NROWA
-      COMPLEX*16         TEMP
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER        ( ONE  = ( 1.0D+0, 0.0D+0 ) )
-      COMPLEX*16         ZERO
-      PARAMETER        ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      LSIDE  = LSAME( SIDE  , 'L' )
-      IF( LSIDE )THEN
-         NROWA = M
-      ELSE
-         NROWA = N
-      END IF
-      NOCONJ = LSAME( TRANSA, 'T' )
-      NOUNIT = LSAME( DIAG  , 'N' )
-      UPPER  = LSAME( UPLO  , 'U' )
-*
-      INFO   = 0
-      IF(      ( .NOT.LSIDE                ).AND.
-     $         ( .NOT.LSAME( SIDE  , 'R' ) )      )THEN
-         INFO = 1
-      ELSE IF( ( .NOT.UPPER                ).AND.
-     $         ( .NOT.LSAME( UPLO  , 'L' ) )      )THEN
-         INFO = 2
-      ELSE IF( ( .NOT.LSAME( TRANSA, 'N' ) ).AND.
-     $         ( .NOT.LSAME( TRANSA, 'T' ) ).AND.
-     $         ( .NOT.LSAME( TRANSA, 'C' ) )      )THEN
-         INFO = 3
-      ELSE IF( ( .NOT.LSAME( DIAG  , 'U' ) ).AND.
-     $         ( .NOT.LSAME( DIAG  , 'N' ) )      )THEN
-         INFO = 4
-      ELSE IF( M  .LT.0               )THEN
-         INFO = 5
-      ELSE IF( N  .LT.0               )THEN
-         INFO = 6
-      ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN
-         INFO = 9
-      ELSE IF( LDB.LT.MAX( 1, M     ) )THEN
-         INFO = 11
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'ZTRSM ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     And when  alpha.eq.zero.
-*
-      IF( ALPHA.EQ.ZERO )THEN
-         DO 20, J = 1, N
-            DO 10, I = 1, M
-               B( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-         RETURN
-      END IF
-*
-*     Start the operations.
-*
-      IF( LSIDE )THEN
-         IF( LSAME( TRANSA, 'N' ) )THEN
-*
-*           Form  B := alpha*inv( A )*B.
-*
-            IF( UPPER )THEN
-               DO 60, J = 1, N
-                  IF( ALPHA.NE.ONE )THEN
-                     DO 30, I = 1, M
-                        B( I, J ) = ALPHA*B( I, J )
-   30                CONTINUE
-                  END IF
-                  DO 50, K = M, 1, -1
-                     IF( B( K, J ).NE.ZERO )THEN
-                        IF( NOUNIT )
-     $                     B( K, J ) = B( K, J )/A( K, K )
-                        DO 40, I = 1, K - 1
-                           B( I, J ) = B( I, J ) - B( K, J )*A( I, K )
-   40                   CONTINUE
-                     END IF
-   50             CONTINUE
-   60          CONTINUE
-            ELSE
-               DO 100, J = 1, N
-                  IF( ALPHA.NE.ONE )THEN
-                     DO 70, I = 1, M
-                        B( I, J ) = ALPHA*B( I, J )
-   70                CONTINUE
-                  END IF
-                  DO 90 K = 1, M
-                     IF( B( K, J ).NE.ZERO )THEN
-                        IF( NOUNIT )
-     $                     B( K, J ) = B( K, J )/A( K, K )
-                        DO 80, I = K + 1, M
-                           B( I, J ) = B( I, J ) - B( K, J )*A( I, K )
-   80                   CONTINUE
-                     END IF
-   90             CONTINUE
-  100          CONTINUE
-            END IF
-         ELSE
-*
-*           Form  B := alpha*inv( A' )*B
-*           or    B := alpha*inv( conjg( A' ) )*B.
-*
-            IF( UPPER )THEN
-               DO 140, J = 1, N
-                  DO 130, I = 1, M
-                     TEMP = ALPHA*B( I, J )
-                     IF( NOCONJ )THEN
-                        DO 110, K = 1, I - 1
-                           TEMP = TEMP - A( K, I )*B( K, J )
-  110                   CONTINUE
-                        IF( NOUNIT )
-     $                     TEMP = TEMP/A( I, I )
-                     ELSE
-                        DO 120, K = 1, I - 1
-                           TEMP = TEMP - DCONJG( A( K, I ) )*B( K, J )
-  120                   CONTINUE
-                        IF( NOUNIT )
-     $                     TEMP = TEMP/DCONJG( A( I, I ) )
-                     END IF
-                     B( I, J ) = TEMP
-  130             CONTINUE
-  140          CONTINUE
-            ELSE
-               DO 180, J = 1, N
-                  DO 170, I = M, 1, -1
-                     TEMP = ALPHA*B( I, J )
-                     IF( NOCONJ )THEN
-                        DO 150, K = I + 1, M
-                           TEMP = TEMP - A( K, I )*B( K, J )
-  150                   CONTINUE
-                        IF( NOUNIT )
-     $                     TEMP = TEMP/A( I, I )
-                     ELSE
-                        DO 160, K = I + 1, M
-                           TEMP = TEMP - DCONJG( A( K, I ) )*B( K, J )
-  160                   CONTINUE
-                        IF( NOUNIT )
-     $                     TEMP = TEMP/DCONJG( A( I, I ) )
-                     END IF
-                     B( I, J ) = TEMP
-  170             CONTINUE
-  180          CONTINUE
-            END IF
-         END IF
-      ELSE
-         IF( LSAME( TRANSA, 'N' ) )THEN
-*
-*           Form  B := alpha*B*inv( A ).
-*
-            IF( UPPER )THEN
-               DO 230, J = 1, N
-                  IF( ALPHA.NE.ONE )THEN
-                     DO 190, I = 1, M
-                        B( I, J ) = ALPHA*B( I, J )
-  190                CONTINUE
-                  END IF
-                  DO 210, K = 1, J - 1
-                     IF( A( K, J ).NE.ZERO )THEN
-                        DO 200, I = 1, M
-                           B( I, J ) = B( I, J ) - A( K, J )*B( I, K )
-  200                   CONTINUE
-                     END IF
-  210             CONTINUE
-                  IF( NOUNIT )THEN
-                     TEMP = ONE/A( J, J )
-                     DO 220, I = 1, M
-                        B( I, J ) = TEMP*B( I, J )
-  220                CONTINUE
-                  END IF
-  230          CONTINUE
-            ELSE
-               DO 280, J = N, 1, -1
-                  IF( ALPHA.NE.ONE )THEN
-                     DO 240, I = 1, M
-                        B( I, J ) = ALPHA*B( I, J )
-  240                CONTINUE
-                  END IF
-                  DO 260, K = J + 1, N
-                     IF( A( K, J ).NE.ZERO )THEN
-                        DO 250, I = 1, M
-                           B( I, J ) = B( I, J ) - A( K, J )*B( I, K )
-  250                   CONTINUE
-                     END IF
-  260             CONTINUE
-                  IF( NOUNIT )THEN
-                     TEMP = ONE/A( J, J )
-                     DO 270, I = 1, M
-                       B( I, J ) = TEMP*B( I, J )
-  270                CONTINUE
-                  END IF
-  280          CONTINUE
-            END IF
-         ELSE
-*
-*           Form  B := alpha*B*inv( A' )
-*           or    B := alpha*B*inv( conjg( A' ) ).
-*
-            IF( UPPER )THEN
-               DO 330, K = N, 1, -1
-                  IF( NOUNIT )THEN
-                     IF( NOCONJ )THEN
-                        TEMP = ONE/A( K, K )
-                     ELSE
-                        TEMP = ONE/DCONJG( A( K, K ) )
-                     END IF
-                     DO 290, I = 1, M
-                        B( I, K ) = TEMP*B( I, K )
-  290                CONTINUE
-                  END IF
-                  DO 310, J = 1, K - 1
-                     IF( A( J, K ).NE.ZERO )THEN
-                        IF( NOCONJ )THEN
-                           TEMP = A( J, K )
-                        ELSE
-                           TEMP = DCONJG( A( J, K ) )
-                        END IF
-                        DO 300, I = 1, M
-                           B( I, J ) = B( I, J ) - TEMP*B( I, K )
-  300                   CONTINUE
-                     END IF
-  310             CONTINUE
-                  IF( ALPHA.NE.ONE )THEN
-                     DO 320, I = 1, M
-                        B( I, K ) = ALPHA*B( I, K )
-  320                CONTINUE
-                  END IF
-  330          CONTINUE
-            ELSE
-               DO 380, K = 1, N
-                  IF( NOUNIT )THEN
-                     IF( NOCONJ )THEN
-                        TEMP = ONE/A( K, K )
-                     ELSE
-                        TEMP = ONE/DCONJG( A( K, K ) )
-                     END IF
-                     DO 340, I = 1, M
-                        B( I, K ) = TEMP*B( I, K )
-  340                CONTINUE
-                  END IF
-                  DO 360, J = K + 1, N
-                     IF( A( J, K ).NE.ZERO )THEN
-                        IF( NOCONJ )THEN
-                           TEMP = A( J, K )
-                        ELSE
-                           TEMP = DCONJG( A( J, K ) )
-                        END IF
-                        DO 350, I = 1, M
-                           B( I, J ) = B( I, J ) - TEMP*B( I, K )
-  350                   CONTINUE
-                     END IF
-  360             CONTINUE
-                  IF( ALPHA.NE.ONE )THEN
-                     DO 370, I = 1, M
-                        B( I, K ) = ALPHA*B( I, K )
-  370                CONTINUE
-                  END IF
-  380          CONTINUE
-            END IF
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZTRSM .
-*
-      END
--- a/libcruft/blas/ztrsv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,324 +0,0 @@
-      SUBROUTINE ZTRSV ( UPLO, TRANS, DIAG, N, A, LDA, X, INCX )
-*     .. Scalar Arguments ..
-      INTEGER            INCX, LDA, N
-      CHARACTER*1        DIAG, TRANS, UPLO
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZTRSV  solves one of the systems of equations
-*
-*     A*x = b,   or   A'*x = b,   or   conjg( A' )*x = b,
-*
-*  where b and x are n element vectors and A is an n by n unit, or
-*  non-unit, upper or lower triangular matrix.
-*
-*  No test for singularity or near-singularity is included in this
-*  routine. Such tests must be performed before calling this routine.
-*
-*  Parameters
-*  ==========
-*
-*  UPLO   - CHARACTER*1.
-*           On entry, UPLO specifies whether the matrix is an upper or
-*           lower triangular matrix as follows:
-*
-*              UPLO = 'U' or 'u'   A is an upper triangular matrix.
-*
-*              UPLO = 'L' or 'l'   A is a lower triangular matrix.
-*
-*           Unchanged on exit.
-*
-*  TRANS  - CHARACTER*1.
-*           On entry, TRANS specifies the equations to be solved as
-*           follows:
-*
-*              TRANS = 'N' or 'n'   A*x = b.
-*
-*              TRANS = 'T' or 't'   A'*x = b.
-*
-*              TRANS = 'C' or 'c'   conjg( A' )*x = b.
-*
-*           Unchanged on exit.
-*
-*  DIAG   - CHARACTER*1.
-*           On entry, DIAG specifies whether or not A is unit
-*           triangular as follows:
-*
-*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
-*
-*              DIAG = 'N' or 'n'   A is not assumed to be unit
-*                                  triangular.
-*
-*           Unchanged on exit.
-*
-*  N      - INTEGER.
-*           On entry, N specifies the order of the matrix A.
-*           N must be at least zero.
-*           Unchanged on exit.
-*
-*  A      - COMPLEX*16       array of DIMENSION ( LDA, n ).
-*           Before entry with  UPLO = 'U' or 'u', the leading n by n
-*           upper triangular part of the array A must contain the upper
-*           triangular matrix and the strictly lower triangular part of
-*           A is not referenced.
-*           Before entry with UPLO = 'L' or 'l', the leading n by n
-*           lower triangular part of the array A must contain the lower
-*           triangular matrix and the strictly upper triangular part of
-*           A is not referenced.
-*           Note that when  DIAG = 'U' or 'u', the diagonal elements of
-*           A are not referenced either, but are assumed to be unity.
-*           Unchanged on exit.
-*
-*  LDA    - INTEGER.
-*           On entry, LDA specifies the first dimension of A as declared
-*           in the calling (sub) program. LDA must be at least
-*           max( 1, n ).
-*           Unchanged on exit.
-*
-*  X      - COMPLEX*16       array of dimension at least
-*           ( 1 + ( n - 1 )*abs( INCX ) ).
-*           Before entry, the incremented array X must contain the n
-*           element right-hand side vector b. On exit, X is overwritten
-*           with the solution vector x.
-*
-*  INCX   - INTEGER.
-*           On entry, INCX specifies the increment for the elements of
-*           X. INCX must not be zero.
-*           Unchanged on exit.
-*
-*
-*  Level 2 Blas routine.
-*
-*  -- Written on 22-October-1986.
-*     Jack Dongarra, Argonne National Lab.
-*     Jeremy Du Croz, Nag Central Office.
-*     Sven Hammarling, Nag Central Office.
-*     Richard Hanson, Sandia National Labs.
-*
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO
-      PARAMETER        ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     .. Local Scalars ..
-      COMPLEX*16         TEMP
-      INTEGER            I, INFO, IX, J, JX, KX
-      LOGICAL            NOCONJ, NOUNIT
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF     ( .NOT.LSAME( UPLO , 'U' ).AND.
-     $         .NOT.LSAME( UPLO , 'L' )      )THEN
-         INFO = 1
-      ELSE IF( .NOT.LSAME( TRANS, 'N' ).AND.
-     $         .NOT.LSAME( TRANS, 'T' ).AND.
-     $         .NOT.LSAME( TRANS, 'C' )      )THEN
-         INFO = 2
-      ELSE IF( .NOT.LSAME( DIAG , 'U' ).AND.
-     $         .NOT.LSAME( DIAG , 'N' )      )THEN
-         INFO = 3
-      ELSE IF( N.LT.0 )THEN
-         INFO = 4
-      ELSE IF( LDA.LT.MAX( 1, N ) )THEN
-         INFO = 6
-      ELSE IF( INCX.EQ.0 )THEN
-         INFO = 8
-      END IF
-      IF( INFO.NE.0 )THEN
-         CALL XERBLA( 'ZTRSV ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      NOCONJ = LSAME( TRANS, 'T' )
-      NOUNIT = LSAME( DIAG , 'N' )
-*
-*     Set up the start point in X if the increment is not unity. This
-*     will be  ( N - 1 )*INCX  too small for descending loops.
-*
-      IF( INCX.LE.0 )THEN
-         KX = 1 - ( N - 1 )*INCX
-      ELSE IF( INCX.NE.1 )THEN
-         KX = 1
-      END IF
-*
-*     Start the operations. In this version the elements of A are
-*     accessed sequentially with one pass through A.
-*
-      IF( LSAME( TRANS, 'N' ) )THEN
-*
-*        Form  x := inv( A )*x.
-*
-         IF( LSAME( UPLO, 'U' ) )THEN
-            IF( INCX.EQ.1 )THEN
-               DO 20, J = N, 1, -1
-                  IF( X( J ).NE.ZERO )THEN
-                     IF( NOUNIT )
-     $                  X( J ) = X( J )/A( J, J )
-                     TEMP = X( J )
-                     DO 10, I = J - 1, 1, -1
-                        X( I ) = X( I ) - TEMP*A( I, J )
-   10                CONTINUE
-                  END IF
-   20          CONTINUE
-            ELSE
-               JX = KX + ( N - 1 )*INCX
-               DO 40, J = N, 1, -1
-                  IF( X( JX ).NE.ZERO )THEN
-                     IF( NOUNIT )
-     $                  X( JX ) = X( JX )/A( J, J )
-                     TEMP = X( JX )
-                     IX   = JX
-                     DO 30, I = J - 1, 1, -1
-                        IX      = IX      - INCX
-                        X( IX ) = X( IX ) - TEMP*A( I, J )
-   30                CONTINUE
-                  END IF
-                  JX = JX - INCX
-   40          CONTINUE
-            END IF
-         ELSE
-            IF( INCX.EQ.1 )THEN
-               DO 60, J = 1, N
-                  IF( X( J ).NE.ZERO )THEN
-                     IF( NOUNIT )
-     $                  X( J ) = X( J )/A( J, J )
-                     TEMP = X( J )
-                     DO 50, I = J + 1, N
-                        X( I ) = X( I ) - TEMP*A( I, J )
-   50                CONTINUE
-                  END IF
-   60          CONTINUE
-            ELSE
-               JX = KX
-               DO 80, J = 1, N
-                  IF( X( JX ).NE.ZERO )THEN
-                     IF( NOUNIT )
-     $                  X( JX ) = X( JX )/A( J, J )
-                     TEMP = X( JX )
-                     IX   = JX
-                     DO 70, I = J + 1, N
-                        IX      = IX      + INCX
-                        X( IX ) = X( IX ) - TEMP*A( I, J )
-   70                CONTINUE
-                  END IF
-                  JX = JX + INCX
-   80          CONTINUE
-            END IF
-         END IF
-      ELSE
-*
-*        Form  x := inv( A' )*x  or  x := inv( conjg( A' ) )*x.
-*
-         IF( LSAME( UPLO, 'U' ) )THEN
-            IF( INCX.EQ.1 )THEN
-               DO 110, J = 1, N
-                  TEMP = X( J )
-                  IF( NOCONJ )THEN
-                     DO 90, I = 1, J - 1
-                        TEMP = TEMP - A( I, J )*X( I )
-   90                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/A( J, J )
-                  ELSE
-                     DO 100, I = 1, J - 1
-                        TEMP = TEMP - DCONJG( A( I, J ) )*X( I )
-  100                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/DCONJG( A( J, J ) )
-                  END IF
-                  X( J ) = TEMP
-  110          CONTINUE
-            ELSE
-               JX = KX
-               DO 140, J = 1, N
-                  IX   = KX
-                  TEMP = X( JX )
-                  IF( NOCONJ )THEN
-                     DO 120, I = 1, J - 1
-                        TEMP = TEMP - A( I, J )*X( IX )
-                        IX   = IX   + INCX
-  120                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/A( J, J )
-                  ELSE
-                     DO 130, I = 1, J - 1
-                        TEMP = TEMP - DCONJG( A( I, J ) )*X( IX )
-                        IX   = IX   + INCX
-  130                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/DCONJG( A( J, J ) )
-                  END IF
-                  X( JX ) = TEMP
-                  JX      = JX   + INCX
-  140          CONTINUE
-            END IF
-         ELSE
-            IF( INCX.EQ.1 )THEN
-               DO 170, J = N, 1, -1
-                  TEMP = X( J )
-                  IF( NOCONJ )THEN
-                     DO 150, I = N, J + 1, -1
-                        TEMP = TEMP - A( I, J )*X( I )
-  150                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/A( J, J )
-                  ELSE
-                     DO 160, I = N, J + 1, -1
-                        TEMP = TEMP - DCONJG( A( I, J ) )*X( I )
-  160                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/DCONJG( A( J, J ) )
-                  END IF
-                  X( J ) = TEMP
-  170          CONTINUE
-            ELSE
-               KX = KX + ( N - 1 )*INCX
-               JX = KX
-               DO 200, J = N, 1, -1
-                  IX   = KX
-                  TEMP = X( JX )
-                  IF( NOCONJ )THEN
-                     DO 180, I = N, J + 1, -1
-                        TEMP = TEMP - A( I, J )*X( IX )
-                        IX   = IX   - INCX
-  180                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/A( J, J )
-                  ELSE
-                     DO 190, I = N, J + 1, -1
-                        TEMP = TEMP - DCONJG( A( I, J ) )*X( IX )
-                        IX   = IX   - INCX
-  190                CONTINUE
-                     IF( NOUNIT )
-     $                  TEMP = TEMP/DCONJG( A( J, J ) )
-                  END IF
-                  X( JX ) = TEMP
-                  JX      = JX   - INCX
-  200          CONTINUE
-            END IF
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZTRSV .
-*
-      END
--- a/libcruft/lapack/cbdsqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,742 +0,0 @@
-      SUBROUTINE CBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
-     $                   LDU, C, LDC, RWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * ), E( * ), RWORK( * )
-      COMPLEX            C( LDC, * ), U( LDU, * ), VT( LDVT, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CBDSQR computes the singular values and, optionally, the right and/or
-*  left singular vectors from the singular value decomposition (SVD) of
-*  a real N-by-N (upper or lower) bidiagonal matrix B using the implicit
-*  zero-shift QR algorithm.  The SVD of B has the form
-*  
-*     B = Q * S * P**H
-*  
-*  where S is the diagonal matrix of singular values, Q is an orthogonal
-*  matrix of left singular vectors, and P is an orthogonal matrix of
-*  right singular vectors.  If left singular vectors are requested, this
-*  subroutine actually returns U*Q instead of Q, and, if right singular
-*  vectors are requested, this subroutine returns P**H*VT instead of
-*  P**H, for given complex input matrices U and VT.  When U and VT are
-*  the unitary matrices that reduce a general matrix A to bidiagonal
-*  form: A = U*B*VT, as computed by CGEBRD, then
-*  
-*     A = (U*Q) * S * (P**H*VT)
-*  
-*  is the SVD of A.  Optionally, the subroutine may also compute Q**H*C
-*  for a given complex input matrix C.
-*
-*  See "Computing  Small Singular Values of Bidiagonal Matrices With
-*  Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan,
-*  LAPACK Working Note #3 (or SIAM J. Sci. Statist. Comput. vol. 11,
-*  no. 5, pp. 873-912, Sept 1990) and
-*  "Accurate singular values and differential qd algorithms," by
-*  B. Parlett and V. Fernando, Technical Report CPAM-554, Mathematics
-*  Department, University of California at Berkeley, July 1992
-*  for a detailed description of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  B is upper bidiagonal;
-*          = 'L':  B is lower bidiagonal.
-*
-*  N       (input) INTEGER
-*          The order of the matrix B.  N >= 0.
-*
-*  NCVT    (input) INTEGER
-*          The number of columns of the matrix VT. NCVT >= 0.
-*
-*  NRU     (input) INTEGER
-*          The number of rows of the matrix U. NRU >= 0.
-*
-*  NCC     (input) INTEGER
-*          The number of columns of the matrix C. NCC >= 0.
-*
-*  D       (input/output) REAL array, dimension (N)
-*          On entry, the n diagonal elements of the bidiagonal matrix B.
-*          On exit, if INFO=0, the singular values of B in decreasing
-*          order.
-*
-*  E       (input/output) REAL array, dimension (N-1)
-*          On entry, the N-1 offdiagonal elements of the bidiagonal
-*          matrix B.
-*          On exit, if INFO = 0, E is destroyed; if INFO > 0, D and E
-*          will contain the diagonal and superdiagonal elements of a
-*          bidiagonal matrix orthogonally equivalent to the one given
-*          as input.
-*
-*  VT      (input/output) COMPLEX array, dimension (LDVT, NCVT)
-*          On entry, an N-by-NCVT matrix VT.
-*          On exit, VT is overwritten by P**H * VT.
-*          Not referenced if NCVT = 0.
-*
-*  LDVT    (input) INTEGER
-*          The leading dimension of the array VT.
-*          LDVT >= max(1,N) if NCVT > 0; LDVT >= 1 if NCVT = 0.
-*
-*  U       (input/output) COMPLEX array, dimension (LDU, N)
-*          On entry, an NRU-by-N matrix U.
-*          On exit, U is overwritten by U * Q.
-*          Not referenced if NRU = 0.
-*
-*  LDU     (input) INTEGER
-*          The leading dimension of the array U.  LDU >= max(1,NRU).
-*
-*  C       (input/output) COMPLEX array, dimension (LDC, NCC)
-*          On entry, an N-by-NCC matrix C.
-*          On exit, C is overwritten by Q**H * C.
-*          Not referenced if NCC = 0.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C.
-*          LDC >= max(1,N) if NCC > 0; LDC >=1 if NCC = 0.
-*
-*  RWORK   (workspace) REAL array, dimension (2*N) 
-*          if NCVT = NRU = NCC = 0, (max(1, 4*N-4)) otherwise
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  If INFO = -i, the i-th argument had an illegal value
-*          > 0:  the algorithm did not converge; D and E contain the
-*                elements of a bidiagonal matrix which is orthogonally
-*                similar to the input matrix B;  if INFO = i, i
-*                elements of E have not converged to zero.
-*
-*  Internal Parameters
-*  ===================
-*
-*  TOLMUL  REAL, default = max(10,min(100,EPS**(-1/8)))
-*          TOLMUL controls the convergence criterion of the QR loop.
-*          If it is positive, TOLMUL*EPS is the desired relative
-*             precision in the computed singular values.
-*          If it is negative, abs(TOLMUL*EPS*sigma_max) is the
-*             desired absolute accuracy in the computed singular
-*             values (corresponds to relative accuracy
-*             abs(TOLMUL*EPS) in the largest singular value.
-*          abs(TOLMUL) should be between 1 and 1/EPS, and preferably
-*             between 10 (for fast convergence) and .1/EPS
-*             (for there to be some accuracy in the results).
-*          Default is to lose at either one eighth or 2 of the
-*             available decimal digits in each computed singular value
-*             (whichever is smaller).
-*
-*  MAXITR  INTEGER, default = 6
-*          MAXITR controls the maximum number of passes of the
-*          algorithm through its inner loop. The algorithms stops
-*          (and so fails to converge) if the number of passes
-*          through the inner loop exceeds MAXITR*N**2.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E0 )
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E0 )
-      REAL               NEGONE
-      PARAMETER          ( NEGONE = -1.0E0 )
-      REAL               HNDRTH
-      PARAMETER          ( HNDRTH = 0.01E0 )
-      REAL               TEN
-      PARAMETER          ( TEN = 10.0E0 )
-      REAL               HNDRD
-      PARAMETER          ( HNDRD = 100.0E0 )
-      REAL               MEIGTH
-      PARAMETER          ( MEIGTH = -0.125E0 )
-      INTEGER            MAXITR
-      PARAMETER          ( MAXITR = 6 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LOWER, ROTATE
-      INTEGER            I, IDIR, ISUB, ITER, J, LL, LLL, M, MAXIT, NM1,
-     $                   NM12, NM13, OLDLL, OLDM
-      REAL               ABSE, ABSS, COSL, COSR, CS, EPS, F, G, H, MU,
-     $                   OLDCS, OLDSN, R, SHIFT, SIGMN, SIGMX, SINL,
-     $                   SINR, SLL, SMAX, SMIN, SMINL, SMINOA,
-     $                   SN, THRESH, TOL, TOLMUL, UNFL
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               SLAMCH
-      EXTERNAL           LSAME, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLASR, CSROT, CSSCAL, CSWAP, SLARTG, SLAS2,
-     $                   SLASQ1, SLASV2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, REAL, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      LOWER = LSAME( UPLO, 'L' )
-      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LOWER ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NCVT.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( NRU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( NCC.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( ( NCVT.EQ.0 .AND. LDVT.LT.1 ) .OR.
-     $         ( NCVT.GT.0 .AND. LDVT.LT.MAX( 1, N ) ) ) THEN
-         INFO = -9
-      ELSE IF( LDU.LT.MAX( 1, NRU ) ) THEN
-         INFO = -11
-      ELSE IF( ( NCC.EQ.0 .AND. LDC.LT.1 ) .OR.
-     $         ( NCC.GT.0 .AND. LDC.LT.MAX( 1, N ) ) ) THEN
-         INFO = -13
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CBDSQR', -INFO )
-         RETURN
-      END IF
-      IF( N.EQ.0 )
-     $   RETURN
-      IF( N.EQ.1 )
-     $   GO TO 160
-*
-*     ROTATE is true if any singular vectors desired, false otherwise
-*
-      ROTATE = ( NCVT.GT.0 ) .OR. ( NRU.GT.0 ) .OR. ( NCC.GT.0 )
-*
-*     If no singular vectors desired, use qd algorithm
-*
-      IF( .NOT.ROTATE ) THEN
-         CALL SLASQ1( N, D, E, RWORK, INFO )
-         RETURN
-      END IF
-*
-      NM1 = N - 1
-      NM12 = NM1 + NM1
-      NM13 = NM12 + NM1
-      IDIR = 0
-*
-*     Get machine constants
-*
-      EPS = SLAMCH( 'Epsilon' )
-      UNFL = SLAMCH( 'Safe minimum' )
-*
-*     If matrix lower bidiagonal, rotate to be upper bidiagonal
-*     by applying Givens rotations on the left
-*
-      IF( LOWER ) THEN
-         DO 10 I = 1, N - 1
-            CALL SLARTG( D( I ), E( I ), CS, SN, R )
-            D( I ) = R
-            E( I ) = SN*D( I+1 )
-            D( I+1 ) = CS*D( I+1 )
-            RWORK( I ) = CS
-            RWORK( NM1+I ) = SN
-   10    CONTINUE
-*
-*        Update singular vectors if desired
-*
-         IF( NRU.GT.0 )
-     $      CALL CLASR( 'R', 'V', 'F', NRU, N, RWORK( 1 ), RWORK( N ),
-     $                  U, LDU )
-         IF( NCC.GT.0 )
-     $      CALL CLASR( 'L', 'V', 'F', N, NCC, RWORK( 1 ), RWORK( N ),
-     $                  C, LDC )
-      END IF
-*
-*     Compute singular values to relative accuracy TOL
-*     (By setting TOL to be negative, algorithm will compute
-*     singular values to absolute accuracy ABS(TOL)*norm(input matrix))
-*
-      TOLMUL = MAX( TEN, MIN( HNDRD, EPS**MEIGTH ) )
-      TOL = TOLMUL*EPS
-*
-*     Compute approximate maximum, minimum singular values
-*
-      SMAX = ZERO
-      DO 20 I = 1, N
-         SMAX = MAX( SMAX, ABS( D( I ) ) )
-   20 CONTINUE
-      DO 30 I = 1, N - 1
-         SMAX = MAX( SMAX, ABS( E( I ) ) )
-   30 CONTINUE
-      SMINL = ZERO
-      IF( TOL.GE.ZERO ) THEN
-*
-*        Relative accuracy desired
-*
-         SMINOA = ABS( D( 1 ) )
-         IF( SMINOA.EQ.ZERO )
-     $      GO TO 50
-         MU = SMINOA
-         DO 40 I = 2, N
-            MU = ABS( D( I ) )*( MU / ( MU+ABS( E( I-1 ) ) ) )
-            SMINOA = MIN( SMINOA, MU )
-            IF( SMINOA.EQ.ZERO )
-     $         GO TO 50
-   40    CONTINUE
-   50    CONTINUE
-         SMINOA = SMINOA / SQRT( REAL( N ) )
-         THRESH = MAX( TOL*SMINOA, MAXITR*N*N*UNFL )
-      ELSE
-*
-*        Absolute accuracy desired
-*
-         THRESH = MAX( ABS( TOL )*SMAX, MAXITR*N*N*UNFL )
-      END IF
-*
-*     Prepare for main iteration loop for the singular values
-*     (MAXIT is the maximum number of passes through the inner
-*     loop permitted before nonconvergence signalled.)
-*
-      MAXIT = MAXITR*N*N
-      ITER = 0
-      OLDLL = -1
-      OLDM = -1
-*
-*     M points to last element of unconverged part of matrix
-*
-      M = N
-*
-*     Begin main iteration loop
-*
-   60 CONTINUE
-*
-*     Check for convergence or exceeding iteration count
-*
-      IF( M.LE.1 )
-     $   GO TO 160
-      IF( ITER.GT.MAXIT )
-     $   GO TO 200
-*
-*     Find diagonal block of matrix to work on
-*
-      IF( TOL.LT.ZERO .AND. ABS( D( M ) ).LE.THRESH )
-     $   D( M ) = ZERO
-      SMAX = ABS( D( M ) )
-      SMIN = SMAX
-      DO 70 LLL = 1, M - 1
-         LL = M - LLL
-         ABSS = ABS( D( LL ) )
-         ABSE = ABS( E( LL ) )
-         IF( TOL.LT.ZERO .AND. ABSS.LE.THRESH )
-     $      D( LL ) = ZERO
-         IF( ABSE.LE.THRESH )
-     $      GO TO 80
-         SMIN = MIN( SMIN, ABSS )
-         SMAX = MAX( SMAX, ABSS, ABSE )
-   70 CONTINUE
-      LL = 0
-      GO TO 90
-   80 CONTINUE
-      E( LL ) = ZERO
-*
-*     Matrix splits since E(LL) = 0
-*
-      IF( LL.EQ.M-1 ) THEN
-*
-*        Convergence of bottom singular value, return to top of loop
-*
-         M = M - 1
-         GO TO 60
-      END IF
-   90 CONTINUE
-      LL = LL + 1
-*
-*     E(LL) through E(M-1) are nonzero, E(LL-1) is zero
-*
-      IF( LL.EQ.M-1 ) THEN
-*
-*        2 by 2 block, handle separately
-*
-         CALL SLASV2( D( M-1 ), E( M-1 ), D( M ), SIGMN, SIGMX, SINR,
-     $                COSR, SINL, COSL )
-         D( M-1 ) = SIGMX
-         E( M-1 ) = ZERO
-         D( M ) = SIGMN
-*
-*        Compute singular vectors, if desired
-*
-         IF( NCVT.GT.0 )
-     $      CALL CSROT( NCVT, VT( M-1, 1 ), LDVT, VT( M, 1 ), LDVT,
-     $                  COSR, SINR )
-         IF( NRU.GT.0 )
-     $      CALL CSROT( NRU, U( 1, M-1 ), 1, U( 1, M ), 1, COSL, SINL )
-         IF( NCC.GT.0 )
-     $      CALL CSROT( NCC, C( M-1, 1 ), LDC, C( M, 1 ), LDC, COSL,
-     $                  SINL )
-         M = M - 2
-         GO TO 60
-      END IF
-*
-*     If working on new submatrix, choose shift direction
-*     (from larger end diagonal element towards smaller)
-*
-      IF( LL.GT.OLDM .OR. M.LT.OLDLL ) THEN
-         IF( ABS( D( LL ) ).GE.ABS( D( M ) ) ) THEN
-*
-*           Chase bulge from top (big end) to bottom (small end)
-*
-            IDIR = 1
-         ELSE
-*
-*           Chase bulge from bottom (big end) to top (small end)
-*
-            IDIR = 2
-         END IF
-      END IF
-*
-*     Apply convergence tests
-*
-      IF( IDIR.EQ.1 ) THEN
-*
-*        Run convergence test in forward direction
-*        First apply standard test to bottom of matrix
-*
-         IF( ABS( E( M-1 ) ).LE.ABS( TOL )*ABS( D( M ) ) .OR.
-     $       ( TOL.LT.ZERO .AND. ABS( E( M-1 ) ).LE.THRESH ) ) THEN
-            E( M-1 ) = ZERO
-            GO TO 60
-         END IF
-*
-         IF( TOL.GE.ZERO ) THEN
-*
-*           If relative accuracy desired,
-*           apply convergence criterion forward
-*
-            MU = ABS( D( LL ) )
-            SMINL = MU
-            DO 100 LLL = LL, M - 1
-               IF( ABS( E( LLL ) ).LE.TOL*MU ) THEN
-                  E( LLL ) = ZERO
-                  GO TO 60
-               END IF
-               MU = ABS( D( LLL+1 ) )*( MU / ( MU+ABS( E( LLL ) ) ) )
-               SMINL = MIN( SMINL, MU )
-  100       CONTINUE
-         END IF
-*
-      ELSE
-*
-*        Run convergence test in backward direction
-*        First apply standard test to top of matrix
-*
-         IF( ABS( E( LL ) ).LE.ABS( TOL )*ABS( D( LL ) ) .OR.
-     $       ( TOL.LT.ZERO .AND. ABS( E( LL ) ).LE.THRESH ) ) THEN
-            E( LL ) = ZERO
-            GO TO 60
-         END IF
-*
-         IF( TOL.GE.ZERO ) THEN
-*
-*           If relative accuracy desired,
-*           apply convergence criterion backward
-*
-            MU = ABS( D( M ) )
-            SMINL = MU
-            DO 110 LLL = M - 1, LL, -1
-               IF( ABS( E( LLL ) ).LE.TOL*MU ) THEN
-                  E( LLL ) = ZERO
-                  GO TO 60
-               END IF
-               MU = ABS( D( LLL ) )*( MU / ( MU+ABS( E( LLL ) ) ) )
-               SMINL = MIN( SMINL, MU )
-  110       CONTINUE
-         END IF
-      END IF
-      OLDLL = LL
-      OLDM = M
-*
-*     Compute shift.  First, test if shifting would ruin relative
-*     accuracy, and if so set the shift to zero.
-*
-      IF( TOL.GE.ZERO .AND. N*TOL*( SMINL / SMAX ).LE.
-     $    MAX( EPS, HNDRTH*TOL ) ) THEN
-*
-*        Use a zero shift to avoid loss of relative accuracy
-*
-         SHIFT = ZERO
-      ELSE
-*
-*        Compute the shift from 2-by-2 block at end of matrix
-*
-         IF( IDIR.EQ.1 ) THEN
-            SLL = ABS( D( LL ) )
-            CALL SLAS2( D( M-1 ), E( M-1 ), D( M ), SHIFT, R )
-         ELSE
-            SLL = ABS( D( M ) )
-            CALL SLAS2( D( LL ), E( LL ), D( LL+1 ), SHIFT, R )
-         END IF
-*
-*        Test if shift negligible, and if so set to zero
-*
-         IF( SLL.GT.ZERO ) THEN
-            IF( ( SHIFT / SLL )**2.LT.EPS )
-     $         SHIFT = ZERO
-         END IF
-      END IF
-*
-*     Increment iteration count
-*
-      ITER = ITER + M - LL
-*
-*     If SHIFT = 0, do simplified QR iteration
-*
-      IF( SHIFT.EQ.ZERO ) THEN
-         IF( IDIR.EQ.1 ) THEN
-*
-*           Chase bulge from top to bottom
-*           Save cosines and sines for later singular vector updates
-*
-            CS = ONE
-            OLDCS = ONE
-            DO 120 I = LL, M - 1
-               CALL SLARTG( D( I )*CS, E( I ), CS, SN, R )
-               IF( I.GT.LL )
-     $            E( I-1 ) = OLDSN*R
-               CALL SLARTG( OLDCS*R, D( I+1 )*SN, OLDCS, OLDSN, D( I ) )
-               RWORK( I-LL+1 ) = CS
-               RWORK( I-LL+1+NM1 ) = SN
-               RWORK( I-LL+1+NM12 ) = OLDCS
-               RWORK( I-LL+1+NM13 ) = OLDSN
-  120       CONTINUE
-            H = D( M )*CS
-            D( M ) = H*OLDCS
-            E( M-1 ) = H*OLDSN
-*
-*           Update singular vectors
-*
-            IF( NCVT.GT.0 )
-     $         CALL CLASR( 'L', 'V', 'F', M-LL+1, NCVT, RWORK( 1 ),
-     $                     RWORK( N ), VT( LL, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL CLASR( 'R', 'V', 'F', NRU, M-LL+1, RWORK( NM12+1 ),
-     $                     RWORK( NM13+1 ), U( 1, LL ), LDU )
-            IF( NCC.GT.0 )
-     $         CALL CLASR( 'L', 'V', 'F', M-LL+1, NCC, RWORK( NM12+1 ),
-     $                     RWORK( NM13+1 ), C( LL, 1 ), LDC )
-*
-*           Test convergence
-*
-            IF( ABS( E( M-1 ) ).LE.THRESH )
-     $         E( M-1 ) = ZERO
-*
-         ELSE
-*
-*           Chase bulge from bottom to top
-*           Save cosines and sines for later singular vector updates
-*
-            CS = ONE
-            OLDCS = ONE
-            DO 130 I = M, LL + 1, -1
-               CALL SLARTG( D( I )*CS, E( I-1 ), CS, SN, R )
-               IF( I.LT.M )
-     $            E( I ) = OLDSN*R
-               CALL SLARTG( OLDCS*R, D( I-1 )*SN, OLDCS, OLDSN, D( I ) )
-               RWORK( I-LL ) = CS
-               RWORK( I-LL+NM1 ) = -SN
-               RWORK( I-LL+NM12 ) = OLDCS
-               RWORK( I-LL+NM13 ) = -OLDSN
-  130       CONTINUE
-            H = D( LL )*CS
-            D( LL ) = H*OLDCS
-            E( LL ) = H*OLDSN
-*
-*           Update singular vectors
-*
-            IF( NCVT.GT.0 )
-     $         CALL CLASR( 'L', 'V', 'B', M-LL+1, NCVT, RWORK( NM12+1 ),
-     $                     RWORK( NM13+1 ), VT( LL, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL CLASR( 'R', 'V', 'B', NRU, M-LL+1, RWORK( 1 ),
-     $                     RWORK( N ), U( 1, LL ), LDU )
-            IF( NCC.GT.0 )
-     $         CALL CLASR( 'L', 'V', 'B', M-LL+1, NCC, RWORK( 1 ),
-     $                     RWORK( N ), C( LL, 1 ), LDC )
-*
-*           Test convergence
-*
-            IF( ABS( E( LL ) ).LE.THRESH )
-     $         E( LL ) = ZERO
-         END IF
-      ELSE
-*
-*        Use nonzero shift
-*
-         IF( IDIR.EQ.1 ) THEN
-*
-*           Chase bulge from top to bottom
-*           Save cosines and sines for later singular vector updates
-*
-            F = ( ABS( D( LL ) )-SHIFT )*
-     $          ( SIGN( ONE, D( LL ) )+SHIFT / D( LL ) )
-            G = E( LL )
-            DO 140 I = LL, M - 1
-               CALL SLARTG( F, G, COSR, SINR, R )
-               IF( I.GT.LL )
-     $            E( I-1 ) = R
-               F = COSR*D( I ) + SINR*E( I )
-               E( I ) = COSR*E( I ) - SINR*D( I )
-               G = SINR*D( I+1 )
-               D( I+1 ) = COSR*D( I+1 )
-               CALL SLARTG( F, G, COSL, SINL, R )
-               D( I ) = R
-               F = COSL*E( I ) + SINL*D( I+1 )
-               D( I+1 ) = COSL*D( I+1 ) - SINL*E( I )
-               IF( I.LT.M-1 ) THEN
-                  G = SINL*E( I+1 )
-                  E( I+1 ) = COSL*E( I+1 )
-               END IF
-               RWORK( I-LL+1 ) = COSR
-               RWORK( I-LL+1+NM1 ) = SINR
-               RWORK( I-LL+1+NM12 ) = COSL
-               RWORK( I-LL+1+NM13 ) = SINL
-  140       CONTINUE
-            E( M-1 ) = F
-*
-*           Update singular vectors
-*
-            IF( NCVT.GT.0 )
-     $         CALL CLASR( 'L', 'V', 'F', M-LL+1, NCVT, RWORK( 1 ),
-     $                     RWORK( N ), VT( LL, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL CLASR( 'R', 'V', 'F', NRU, M-LL+1, RWORK( NM12+1 ),
-     $                     RWORK( NM13+1 ), U( 1, LL ), LDU )
-            IF( NCC.GT.0 )
-     $         CALL CLASR( 'L', 'V', 'F', M-LL+1, NCC, RWORK( NM12+1 ),
-     $                     RWORK( NM13+1 ), C( LL, 1 ), LDC )
-*
-*           Test convergence
-*
-            IF( ABS( E( M-1 ) ).LE.THRESH )
-     $         E( M-1 ) = ZERO
-*
-         ELSE
-*
-*           Chase bulge from bottom to top
-*           Save cosines and sines for later singular vector updates
-*
-            F = ( ABS( D( M ) )-SHIFT )*( SIGN( ONE, D( M ) )+SHIFT /
-     $          D( M ) )
-            G = E( M-1 )
-            DO 150 I = M, LL + 1, -1
-               CALL SLARTG( F, G, COSR, SINR, R )
-               IF( I.LT.M )
-     $            E( I ) = R
-               F = COSR*D( I ) + SINR*E( I-1 )
-               E( I-1 ) = COSR*E( I-1 ) - SINR*D( I )
-               G = SINR*D( I-1 )
-               D( I-1 ) = COSR*D( I-1 )
-               CALL SLARTG( F, G, COSL, SINL, R )
-               D( I ) = R
-               F = COSL*E( I-1 ) + SINL*D( I-1 )
-               D( I-1 ) = COSL*D( I-1 ) - SINL*E( I-1 )
-               IF( I.GT.LL+1 ) THEN
-                  G = SINL*E( I-2 )
-                  E( I-2 ) = COSL*E( I-2 )
-               END IF
-               RWORK( I-LL ) = COSR
-               RWORK( I-LL+NM1 ) = -SINR
-               RWORK( I-LL+NM12 ) = COSL
-               RWORK( I-LL+NM13 ) = -SINL
-  150       CONTINUE
-            E( LL ) = F
-*
-*           Test convergence
-*
-            IF( ABS( E( LL ) ).LE.THRESH )
-     $         E( LL ) = ZERO
-*
-*           Update singular vectors if desired
-*
-            IF( NCVT.GT.0 )
-     $         CALL CLASR( 'L', 'V', 'B', M-LL+1, NCVT, RWORK( NM12+1 ),
-     $                     RWORK( NM13+1 ), VT( LL, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL CLASR( 'R', 'V', 'B', NRU, M-LL+1, RWORK( 1 ),
-     $                     RWORK( N ), U( 1, LL ), LDU )
-            IF( NCC.GT.0 )
-     $         CALL CLASR( 'L', 'V', 'B', M-LL+1, NCC, RWORK( 1 ),
-     $                     RWORK( N ), C( LL, 1 ), LDC )
-         END IF
-      END IF
-*
-*     QR iteration finished, go back and check convergence
-*
-      GO TO 60
-*
-*     All singular values converged, so make them positive
-*
-  160 CONTINUE
-      DO 170 I = 1, N
-         IF( D( I ).LT.ZERO ) THEN
-            D( I ) = -D( I )
-*
-*           Change sign of singular vectors, if desired
-*
-            IF( NCVT.GT.0 )
-     $         CALL CSSCAL( NCVT, NEGONE, VT( I, 1 ), LDVT )
-         END IF
-  170 CONTINUE
-*
-*     Sort the singular values into decreasing order (insertion sort on
-*     singular values, but only one transposition per singular vector)
-*
-      DO 190 I = 1, N - 1
-*
-*        Scan for smallest D(I)
-*
-         ISUB = 1
-         SMIN = D( 1 )
-         DO 180 J = 2, N + 1 - I
-            IF( D( J ).LE.SMIN ) THEN
-               ISUB = J
-               SMIN = D( J )
-            END IF
-  180    CONTINUE
-         IF( ISUB.NE.N+1-I ) THEN
-*
-*           Swap singular values and vectors
-*
-            D( ISUB ) = D( N+1-I )
-            D( N+1-I ) = SMIN
-            IF( NCVT.GT.0 )
-     $         CALL CSWAP( NCVT, VT( ISUB, 1 ), LDVT, VT( N+1-I, 1 ),
-     $                     LDVT )
-            IF( NRU.GT.0 )
-     $         CALL CSWAP( NRU, U( 1, ISUB ), 1, U( 1, N+1-I ), 1 )
-            IF( NCC.GT.0 )
-     $         CALL CSWAP( NCC, C( ISUB, 1 ), LDC, C( N+1-I, 1 ), LDC )
-         END IF
-  190 CONTINUE
-      GO TO 220
-*
-*     Maximum number of iterations exceeded, failure to converge
-*
-  200 CONTINUE
-      INFO = 0
-      DO 210 I = 1, N - 1
-         IF( E( I ).NE.ZERO )
-     $      INFO = INFO + 1
-  210 CONTINUE
-  220 CONTINUE
-      RETURN
-*
-*     End of CBDSQR
-*
-      END
--- a/libcruft/lapack/cgbcon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,234 +0,0 @@
-      SUBROUTINE CGBCON( NORM, N, KL, KU, AB, LDAB, IPIV, ANORM, RCOND,
-     $                   WORK, RWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call CLACN2 in place of CLACON, 10 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            INFO, KL, KU, LDAB, N
-      REAL               ANORM, RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      REAL               RWORK( * )
-      COMPLEX            AB( LDAB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGBCON estimates the reciprocal of the condition number of a complex
-*  general band matrix A, in either the 1-norm or the infinity-norm,
-*  using the LU factorization computed by CGBTRF.
-*
-*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
-*  condition number is computed as
-*     RCOND = 1 / ( norm(A) * norm(inv(A)) ).
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies whether the 1-norm condition number or the
-*          infinity-norm condition number is required:
-*          = '1' or 'O':  1-norm;
-*          = 'I':         Infinity-norm.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KL      (input) INTEGER
-*          The number of subdiagonals within the band of A.  KL >= 0.
-*
-*  KU      (input) INTEGER
-*          The number of superdiagonals within the band of A.  KU >= 0.
-*
-*  AB      (input) COMPLEX array, dimension (LDAB,N)
-*          Details of the LU factorization of the band matrix A, as
-*          computed by CGBTRF.  U is stored as an upper triangular band
-*          matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and
-*          the multipliers used during the factorization are stored in
-*          rows KL+KU+2 to 2*KL+KU+1.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= N, row i of the matrix was
-*          interchanged with row IPIV(i).
-*
-*  ANORM   (input) REAL
-*          If NORM = '1' or 'O', the 1-norm of the original matrix A.
-*          If NORM = 'I', the infinity-norm of the original matrix A.
-*
-*  RCOND   (output) REAL
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(norm(A) * norm(inv(A))).
-*
-*  WORK    (workspace) COMPLEX array, dimension (2*N)
-*
-*  RWORK   (workspace) REAL array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LNOTI, ONENRM
-      CHARACTER          NORMIN
-      INTEGER            IX, J, JP, KASE, KASE1, KD, LM
-      REAL               AINVNM, SCALE, SMLNUM
-      COMPLEX            T, ZDUM
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ICAMAX
-      REAL               SLAMCH
-      COMPLEX            CDOTC
-      EXTERNAL           LSAME, ICAMAX, SLAMCH, CDOTC
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CAXPY, CLACN2, CLATBS, CSRSCL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, MIN, REAL
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( REAL( ZDUM ) ) + ABS( AIMAG( ZDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' )
-      IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KL.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( KU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDAB.LT.2*KL+KU+1 ) THEN
-         INFO = -6
-      ELSE IF( ANORM.LT.ZERO ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGBCON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      RCOND = ZERO
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      ELSE IF( ANORM.EQ.ZERO ) THEN
-         RETURN
-      END IF
-*
-      SMLNUM = SLAMCH( 'Safe minimum' )
-*
-*     Estimate the norm of inv(A).
-*
-      AINVNM = ZERO
-      NORMIN = 'N'
-      IF( ONENRM ) THEN
-         KASE1 = 1
-      ELSE
-         KASE1 = 2
-      END IF
-      KD = KL + KU + 1
-      LNOTI = KL.GT.0
-      KASE = 0
-   10 CONTINUE
-      CALL CLACN2( N, WORK( N+1 ), WORK, AINVNM, KASE, ISAVE )
-      IF( KASE.NE.0 ) THEN
-         IF( KASE.EQ.KASE1 ) THEN
-*
-*           Multiply by inv(L).
-*
-            IF( LNOTI ) THEN
-               DO 20 J = 1, N - 1
-                  LM = MIN( KL, N-J )
-                  JP = IPIV( J )
-                  T = WORK( JP )
-                  IF( JP.NE.J ) THEN
-                     WORK( JP ) = WORK( J )
-                     WORK( J ) = T
-                  END IF
-                  CALL CAXPY( LM, -T, AB( KD+1, J ), 1, WORK( J+1 ), 1 )
-   20          CONTINUE
-            END IF
-*
-*           Multiply by inv(U).
-*
-            CALL CLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   KL+KU, AB, LDAB, WORK, SCALE, RWORK, INFO )
-         ELSE
-*
-*           Multiply by inv(U').
-*
-            CALL CLATBS( 'Upper', 'Conjugate transpose', 'Non-unit',
-     $                   NORMIN, N, KL+KU, AB, LDAB, WORK, SCALE, RWORK,
-     $                   INFO )
-*
-*           Multiply by inv(L').
-*
-            IF( LNOTI ) THEN
-               DO 30 J = N - 1, 1, -1
-                  LM = MIN( KL, N-J )
-                  WORK( J ) = WORK( J ) - CDOTC( LM, AB( KD+1, J ), 1,
-     $                        WORK( J+1 ), 1 )
-                  JP = IPIV( J )
-                  IF( JP.NE.J ) THEN
-                     T = WORK( JP )
-                     WORK( JP ) = WORK( J )
-                     WORK( J ) = T
-                  END IF
-   30          CONTINUE
-            END IF
-         END IF
-*
-*        Divide X by 1/SCALE if doing so will not cause overflow.
-*
-         NORMIN = 'Y'
-         IF( SCALE.NE.ONE ) THEN
-            IX = ICAMAX( N, WORK, 1 )
-            IF( SCALE.LT.CABS1( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
-     $         GO TO 40
-            CALL CSRSCL( N, SCALE, WORK, 1 )
-         END IF
-         GO TO 10
-      END IF
-*
-*     Compute the estimate of the reciprocal condition number.
-*
-      IF( AINVNM.NE.ZERO )
-     $   RCOND = ( ONE / AINVNM ) / ANORM
-*
-   40 CONTINUE
-      RETURN
-*
-*     End of CGBCON
-*
-      END
--- a/libcruft/lapack/cgbtf2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,202 +0,0 @@
-      SUBROUTINE CGBTF2( M, N, KL, KU, AB, LDAB, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, KL, KU, LDAB, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX            AB( LDAB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGBTF2 computes an LU factorization of a complex m-by-n band matrix
-*  A using partial pivoting with row interchanges.
-*
-*  This is the unblocked version of the algorithm, calling Level 2 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  KL      (input) INTEGER
-*          The number of subdiagonals within the band of A.  KL >= 0.
-*
-*  KU      (input) INTEGER
-*          The number of superdiagonals within the band of A.  KU >= 0.
-*
-*  AB      (input/output) COMPLEX array, dimension (LDAB,N)
-*          On entry, the matrix A in band storage, in rows KL+1 to
-*          2*KL+KU+1; rows 1 to KL of the array need not be set.
-*          The j-th column of A is stored in the j-th column of the
-*          array AB as follows:
-*          AB(kl+ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl)
-*
-*          On exit, details of the factorization: U is stored as an
-*          upper triangular band matrix with KL+KU superdiagonals in
-*          rows 1 to KL+KU+1, and the multipliers used during the
-*          factorization are stored in rows KL+KU+2 to 2*KL+KU+1.
-*          See below for further details.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
-*
-*  IPIV    (output) INTEGER array, dimension (min(M,N))
-*          The pivot indices; for 1 <= i <= min(M,N), row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = +i, U(i,i) is exactly zero. The factorization
-*               has been completed, but the factor U is exactly
-*               singular, and division by zero will occur if it is used
-*               to solve a system of equations.
-*
-*  Further Details
-*  ===============
-*
-*  The band storage scheme is illustrated by the following example, when
-*  M = N = 6, KL = 2, KU = 1:
-*
-*  On entry:                       On exit:
-*
-*      *    *    *    +    +    +       *    *    *   u14  u25  u36
-*      *    *    +    +    +    +       *    *   u13  u24  u35  u46
-*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
-*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
-*     a21  a32  a43  a54  a65   *      m21  m32  m43  m54  m65   *
-*     a31  a42  a53  a64   *    *      m31  m42  m53  m64   *    *
-*
-*  Array elements marked * are not used by the routine; elements marked
-*  + need not be set on entry, but are required by the routine to store
-*  elements of U, because of fill-in resulting from the row
-*  interchanges.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ),
-     $                   ZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J, JP, JU, KM, KV
-*     ..
-*     .. External Functions ..
-      INTEGER            ICAMAX
-      EXTERNAL           ICAMAX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGERU, CSCAL, CSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     KV is the number of superdiagonals in the factor U, allowing for
-*     fill-in.
-*
-      KV = KU + KL
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KL.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( KU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDAB.LT.KL+KV+1 ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGBTF2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Gaussian elimination with partial pivoting
-*
-*     Set fill-in elements in columns KU+2 to KV to zero.
-*
-      DO 20 J = KU + 2, MIN( KV, N )
-         DO 10 I = KV - J + 2, KL
-            AB( I, J ) = ZERO
-   10    CONTINUE
-   20 CONTINUE
-*
-*     JU is the index of the last column affected by the current stage
-*     of the factorization.
-*
-      JU = 1
-*
-      DO 40 J = 1, MIN( M, N )
-*
-*        Set fill-in elements in column J+KV to zero.
-*
-         IF( J+KV.LE.N ) THEN
-            DO 30 I = 1, KL
-               AB( I, J+KV ) = ZERO
-   30       CONTINUE
-         END IF
-*
-*        Find pivot and test for singularity. KM is the number of
-*        subdiagonal elements in the current column.
-*
-         KM = MIN( KL, M-J )
-         JP = ICAMAX( KM+1, AB( KV+1, J ), 1 )
-         IPIV( J ) = JP + J - 1
-         IF( AB( KV+JP, J ).NE.ZERO ) THEN
-            JU = MAX( JU, MIN( J+KU+JP-1, N ) )
-*
-*           Apply interchange to columns J to JU.
-*
-            IF( JP.NE.1 )
-     $         CALL CSWAP( JU-J+1, AB( KV+JP, J ), LDAB-1,
-     $                     AB( KV+1, J ), LDAB-1 )
-            IF( KM.GT.0 ) THEN
-*
-*              Compute multipliers.
-*
-               CALL CSCAL( KM, ONE / AB( KV+1, J ), AB( KV+2, J ), 1 )
-*
-*              Update trailing submatrix within the band.
-*
-               IF( JU.GT.J )
-     $            CALL CGERU( KM, JU-J, -ONE, AB( KV+2, J ), 1,
-     $                        AB( KV, J+1 ), LDAB-1, AB( KV+1, J+1 ),
-     $                        LDAB-1 )
-            END IF
-         ELSE
-*
-*           If pivot is zero, set INFO to the index of the pivot
-*           unless a zero pivot has already been found.
-*
-            IF( INFO.EQ.0 )
-     $         INFO = J
-         END IF
-   40 CONTINUE
-      RETURN
-*
-*     End of CGBTF2
-*
-      END
--- a/libcruft/lapack/cgbtrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,442 +0,0 @@
-      SUBROUTINE CGBTRF( M, N, KL, KU, AB, LDAB, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, KL, KU, LDAB, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX            AB( LDAB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGBTRF computes an LU factorization of a complex m-by-n band matrix A
-*  using partial pivoting with row interchanges.
-*
-*  This is the blocked version of the algorithm, calling Level 3 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  KL      (input) INTEGER
-*          The number of subdiagonals within the band of A.  KL >= 0.
-*
-*  KU      (input) INTEGER
-*          The number of superdiagonals within the band of A.  KU >= 0.
-*
-*  AB      (input/output) COMPLEX array, dimension (LDAB,N)
-*          On entry, the matrix A in band storage, in rows KL+1 to
-*          2*KL+KU+1; rows 1 to KL of the array need not be set.
-*          The j-th column of A is stored in the j-th column of the
-*          array AB as follows:
-*          AB(kl+ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl)
-*
-*          On exit, details of the factorization: U is stored as an
-*          upper triangular band matrix with KL+KU superdiagonals in
-*          rows 1 to KL+KU+1, and the multipliers used during the
-*          factorization are stored in rows KL+KU+2 to 2*KL+KU+1.
-*          See below for further details.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
-*
-*  IPIV    (output) INTEGER array, dimension (min(M,N))
-*          The pivot indices; for 1 <= i <= min(M,N), row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = +i, U(i,i) is exactly zero. The factorization
-*               has been completed, but the factor U is exactly
-*               singular, and division by zero will occur if it is used
-*               to solve a system of equations.
-*
-*  Further Details
-*  ===============
-*
-*  The band storage scheme is illustrated by the following example, when
-*  M = N = 6, KL = 2, KU = 1:
-*
-*  On entry:                       On exit:
-*
-*      *    *    *    +    +    +       *    *    *   u14  u25  u36
-*      *    *    +    +    +    +       *    *   u13  u24  u35  u46
-*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
-*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
-*     a21  a32  a43  a54  a65   *      m21  m32  m43  m54  m65   *
-*     a31  a42  a53  a64   *    *      m31  m42  m53  m64   *    *
-*
-*  Array elements marked * are not used by the routine; elements marked
-*  + need not be set on entry, but are required by the routine to store
-*  elements of U because of fill-in resulting from the row interchanges.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ),
-     $                   ZERO = ( 0.0E+0, 0.0E+0 ) )
-      INTEGER            NBMAX, LDWORK
-      PARAMETER          ( NBMAX = 64, LDWORK = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I2, I3, II, IP, J, J2, J3, JB, JJ, JM, JP,
-     $                   JU, K2, KM, KV, NB, NW
-      COMPLEX            TEMP
-*     ..
-*     .. Local Arrays ..
-      COMPLEX            WORK13( LDWORK, NBMAX ),
-     $                   WORK31( LDWORK, NBMAX )
-*     ..
-*     .. External Functions ..
-      INTEGER            ICAMAX, ILAENV
-      EXTERNAL           ICAMAX, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CCOPY, CGBTF2, CGEMM, CGERU, CLASWP, CSCAL,
-     $                   CSWAP, CTRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     KV is the number of superdiagonals in the factor U, allowing for
-*     fill-in
-*
-      KV = KU + KL
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KL.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( KU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDAB.LT.KL+KV+1 ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGBTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment
-*
-      NB = ILAENV( 1, 'CGBTRF', ' ', M, N, KL, KU )
-*
-*     The block size must not exceed the limit set by the size of the
-*     local arrays WORK13 and WORK31.
-*
-      NB = MIN( NB, NBMAX )
-*
-      IF( NB.LE.1 .OR. NB.GT.KL ) THEN
-*
-*        Use unblocked code
-*
-         CALL CGBTF2( M, N, KL, KU, AB, LDAB, IPIV, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-*        Zero the superdiagonal elements of the work array WORK13
-*
-         DO 20 J = 1, NB
-            DO 10 I = 1, J - 1
-               WORK13( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-*
-*        Zero the subdiagonal elements of the work array WORK31
-*
-         DO 40 J = 1, NB
-            DO 30 I = J + 1, NB
-               WORK31( I, J ) = ZERO
-   30       CONTINUE
-   40    CONTINUE
-*
-*        Gaussian elimination with partial pivoting
-*
-*        Set fill-in elements in columns KU+2 to KV to zero
-*
-         DO 60 J = KU + 2, MIN( KV, N )
-            DO 50 I = KV - J + 2, KL
-               AB( I, J ) = ZERO
-   50       CONTINUE
-   60    CONTINUE
-*
-*        JU is the index of the last column affected by the current
-*        stage of the factorization
-*
-         JU = 1
-*
-         DO 180 J = 1, MIN( M, N ), NB
-            JB = MIN( NB, MIN( M, N )-J+1 )
-*
-*           The active part of the matrix is partitioned
-*
-*              A11   A12   A13
-*              A21   A22   A23
-*              A31   A32   A33
-*
-*           Here A11, A21 and A31 denote the current block of JB columns
-*           which is about to be factorized. The number of rows in the
-*           partitioning are JB, I2, I3 respectively, and the numbers
-*           of columns are JB, J2, J3. The superdiagonal elements of A13
-*           and the subdiagonal elements of A31 lie outside the band.
-*
-            I2 = MIN( KL-JB, M-J-JB+1 )
-            I3 = MIN( JB, M-J-KL+1 )
-*
-*           J2 and J3 are computed after JU has been updated.
-*
-*           Factorize the current block of JB columns
-*
-            DO 80 JJ = J, J + JB - 1
-*
-*              Set fill-in elements in column JJ+KV to zero
-*
-               IF( JJ+KV.LE.N ) THEN
-                  DO 70 I = 1, KL
-                     AB( I, JJ+KV ) = ZERO
-   70             CONTINUE
-               END IF
-*
-*              Find pivot and test for singularity. KM is the number of
-*              subdiagonal elements in the current column.
-*
-               KM = MIN( KL, M-JJ )
-               JP = ICAMAX( KM+1, AB( KV+1, JJ ), 1 )
-               IPIV( JJ ) = JP + JJ - J
-               IF( AB( KV+JP, JJ ).NE.ZERO ) THEN
-                  JU = MAX( JU, MIN( JJ+KU+JP-1, N ) )
-                  IF( JP.NE.1 ) THEN
-*
-*                    Apply interchange to columns J to J+JB-1
-*
-                     IF( JP+JJ-1.LT.J+KL ) THEN
-*
-                        CALL CSWAP( JB, AB( KV+1+JJ-J, J ), LDAB-1,
-     $                              AB( KV+JP+JJ-J, J ), LDAB-1 )
-                     ELSE
-*
-*                       The interchange affects columns J to JJ-1 of A31
-*                       which are stored in the work array WORK31
-*
-                        CALL CSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1,
-     $                              WORK31( JP+JJ-J-KL, 1 ), LDWORK )
-                        CALL CSWAP( J+JB-JJ, AB( KV+1, JJ ), LDAB-1,
-     $                              AB( KV+JP, JJ ), LDAB-1 )
-                     END IF
-                  END IF
-*
-*                 Compute multipliers
-*
-                  CALL CSCAL( KM, ONE / AB( KV+1, JJ ), AB( KV+2, JJ ),
-     $                        1 )
-*
-*                 Update trailing submatrix within the band and within
-*                 the current block. JM is the index of the last column
-*                 which needs to be updated.
-*
-                  JM = MIN( JU, J+JB-1 )
-                  IF( JM.GT.JJ )
-     $               CALL CGERU( KM, JM-JJ, -ONE, AB( KV+2, JJ ), 1,
-     $                           AB( KV, JJ+1 ), LDAB-1,
-     $                           AB( KV+1, JJ+1 ), LDAB-1 )
-               ELSE
-*
-*                 If pivot is zero, set INFO to the index of the pivot
-*                 unless a zero pivot has already been found.
-*
-                  IF( INFO.EQ.0 )
-     $               INFO = JJ
-               END IF
-*
-*              Copy current column of A31 into the work array WORK31
-*
-               NW = MIN( JJ-J+1, I3 )
-               IF( NW.GT.0 )
-     $            CALL CCOPY( NW, AB( KV+KL+1-JJ+J, JJ ), 1,
-     $                        WORK31( 1, JJ-J+1 ), 1 )
-   80       CONTINUE
-            IF( J+JB.LE.N ) THEN
-*
-*              Apply the row interchanges to the other blocks.
-*
-               J2 = MIN( JU-J+1, KV ) - JB
-               J3 = MAX( 0, JU-J-KV+1 )
-*
-*              Use CLASWP to apply the row interchanges to A12, A22, and
-*              A32.
-*
-               CALL CLASWP( J2, AB( KV+1-JB, J+JB ), LDAB-1, 1, JB,
-     $                      IPIV( J ), 1 )
-*
-*              Adjust the pivot indices.
-*
-               DO 90 I = J, J + JB - 1
-                  IPIV( I ) = IPIV( I ) + J - 1
-   90          CONTINUE
-*
-*              Apply the row interchanges to A13, A23, and A33
-*              columnwise.
-*
-               K2 = J - 1 + JB + J2
-               DO 110 I = 1, J3
-                  JJ = K2 + I
-                  DO 100 II = J + I - 1, J + JB - 1
-                     IP = IPIV( II )
-                     IF( IP.NE.II ) THEN
-                        TEMP = AB( KV+1+II-JJ, JJ )
-                        AB( KV+1+II-JJ, JJ ) = AB( KV+1+IP-JJ, JJ )
-                        AB( KV+1+IP-JJ, JJ ) = TEMP
-                     END IF
-  100             CONTINUE
-  110          CONTINUE
-*
-*              Update the relevant part of the trailing submatrix
-*
-               IF( J2.GT.0 ) THEN
-*
-*                 Update A12
-*
-                  CALL CTRSM( 'Left', 'Lower', 'No transpose', 'Unit',
-     $                        JB, J2, ONE, AB( KV+1, J ), LDAB-1,
-     $                        AB( KV+1-JB, J+JB ), LDAB-1 )
-*
-                  IF( I2.GT.0 ) THEN
-*
-*                    Update A22
-*
-                     CALL CGEMM( 'No transpose', 'No transpose', I2, J2,
-     $                           JB, -ONE, AB( KV+1+JB, J ), LDAB-1,
-     $                           AB( KV+1-JB, J+JB ), LDAB-1, ONE,
-     $                           AB( KV+1, J+JB ), LDAB-1 )
-                  END IF
-*
-                  IF( I3.GT.0 ) THEN
-*
-*                    Update A32
-*
-                     CALL CGEMM( 'No transpose', 'No transpose', I3, J2,
-     $                           JB, -ONE, WORK31, LDWORK,
-     $                           AB( KV+1-JB, J+JB ), LDAB-1, ONE,
-     $                           AB( KV+KL+1-JB, J+JB ), LDAB-1 )
-                  END IF
-               END IF
-*
-               IF( J3.GT.0 ) THEN
-*
-*                 Copy the lower triangle of A13 into the work array
-*                 WORK13
-*
-                  DO 130 JJ = 1, J3
-                     DO 120 II = JJ, JB
-                        WORK13( II, JJ ) = AB( II-JJ+1, JJ+J+KV-1 )
-  120                CONTINUE
-  130             CONTINUE
-*
-*                 Update A13 in the work array
-*
-                  CALL CTRSM( 'Left', 'Lower', 'No transpose', 'Unit',
-     $                        JB, J3, ONE, AB( KV+1, J ), LDAB-1,
-     $                        WORK13, LDWORK )
-*
-                  IF( I2.GT.0 ) THEN
-*
-*                    Update A23
-*
-                     CALL CGEMM( 'No transpose', 'No transpose', I2, J3,
-     $                           JB, -ONE, AB( KV+1+JB, J ), LDAB-1,
-     $                           WORK13, LDWORK, ONE, AB( 1+JB, J+KV ),
-     $                           LDAB-1 )
-                  END IF
-*
-                  IF( I3.GT.0 ) THEN
-*
-*                    Update A33
-*
-                     CALL CGEMM( 'No transpose', 'No transpose', I3, J3,
-     $                           JB, -ONE, WORK31, LDWORK, WORK13,
-     $                           LDWORK, ONE, AB( 1+KL, J+KV ), LDAB-1 )
-                  END IF
-*
-*                 Copy the lower triangle of A13 back into place
-*
-                  DO 150 JJ = 1, J3
-                     DO 140 II = JJ, JB
-                        AB( II-JJ+1, JJ+J+KV-1 ) = WORK13( II, JJ )
-  140                CONTINUE
-  150             CONTINUE
-               END IF
-            ELSE
-*
-*              Adjust the pivot indices.
-*
-               DO 160 I = J, J + JB - 1
-                  IPIV( I ) = IPIV( I ) + J - 1
-  160          CONTINUE
-            END IF
-*
-*           Partially undo the interchanges in the current block to
-*           restore the upper triangular form of A31 and copy the upper
-*           triangle of A31 back into place
-*
-            DO 170 JJ = J + JB - 1, J, -1
-               JP = IPIV( JJ ) - JJ + 1
-               IF( JP.NE.1 ) THEN
-*
-*                 Apply interchange to columns J to JJ-1
-*
-                  IF( JP+JJ-1.LT.J+KL ) THEN
-*
-*                    The interchange does not affect A31
-*
-                     CALL CSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1,
-     $                           AB( KV+JP+JJ-J, J ), LDAB-1 )
-                  ELSE
-*
-*                    The interchange does affect A31
-*
-                     CALL CSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1,
-     $                           WORK31( JP+JJ-J-KL, 1 ), LDWORK )
-                  END IF
-               END IF
-*
-*              Copy the current column of A31 back into place
-*
-               NW = MIN( I3, JJ-J+1 )
-               IF( NW.GT.0 )
-     $            CALL CCOPY( NW, WORK31( 1, JJ-J+1 ), 1,
-     $                        AB( KV+KL+1-JJ+J, JJ ), 1 )
-  170       CONTINUE
-  180    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of CGBTRF
-*
-      END
--- a/libcruft/lapack/cgbtrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,214 +0,0 @@
-      SUBROUTINE CGBTRS( TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TRANS
-      INTEGER            INFO, KL, KU, LDAB, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX            AB( LDAB, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGBTRS solves a system of linear equations
-*     A * X = B,  A**T * X = B,  or  A**H * X = B
-*  with a general band matrix A using the LU factorization computed
-*  by CGBTRF.
-*
-*  Arguments
-*  =========
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the form of the system of equations.
-*          = 'N':  A * X = B     (No transpose)
-*          = 'T':  A**T * X = B  (Transpose)
-*          = 'C':  A**H * X = B  (Conjugate transpose)
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KL      (input) INTEGER
-*          The number of subdiagonals within the band of A.  KL >= 0.
-*
-*  KU      (input) INTEGER
-*          The number of superdiagonals within the band of A.  KU >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  AB      (input) COMPLEX array, dimension (LDAB,N)
-*          Details of the LU factorization of the band matrix A, as
-*          computed by CGBTRF.  U is stored as an upper triangular band
-*          matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and
-*          the multipliers used during the factorization are stored in
-*          rows KL+KU+2 to 2*KL+KU+1.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= N, row i of the matrix was
-*          interchanged with row IPIV(i).
-*
-*  B       (input/output) COMPLEX array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LNOTI, NOTRAN
-      INTEGER            I, J, KD, L, LM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEMV, CGERU, CLACGV, CSWAP, CTBSV, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      NOTRAN = LSAME( TRANS, 'N' )
-      IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
-     $    LSAME( TRANS, 'C' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KL.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( KU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDAB.LT.( 2*KL+KU+1 ) ) THEN
-         INFO = -7
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGBTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      KD = KU + KL + 1
-      LNOTI = KL.GT.0
-*
-      IF( NOTRAN ) THEN
-*
-*        Solve  A*X = B.
-*
-*        Solve L*X = B, overwriting B with X.
-*
-*        L is represented as a product of permutations and unit lower
-*        triangular matrices L = P(1) * L(1) * ... * P(n-1) * L(n-1),
-*        where each transformation L(i) is a rank-one modification of
-*        the identity matrix.
-*
-         IF( LNOTI ) THEN
-            DO 10 J = 1, N - 1
-               LM = MIN( KL, N-J )
-               L = IPIV( J )
-               IF( L.NE.J )
-     $            CALL CSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
-               CALL CGERU( LM, NRHS, -ONE, AB( KD+1, J ), 1, B( J, 1 ),
-     $                     LDB, B( J+1, 1 ), LDB )
-   10       CONTINUE
-         END IF
-*
-         DO 20 I = 1, NRHS
-*
-*           Solve U*X = B, overwriting B with X.
-*
-            CALL CTBSV( 'Upper', 'No transpose', 'Non-unit', N, KL+KU,
-     $                  AB, LDAB, B( 1, I ), 1 )
-   20    CONTINUE
-*
-      ELSE IF( LSAME( TRANS, 'T' ) ) THEN
-*
-*        Solve A**T * X = B.
-*
-         DO 30 I = 1, NRHS
-*
-*           Solve U**T * X = B, overwriting B with X.
-*
-            CALL CTBSV( 'Upper', 'Transpose', 'Non-unit', N, KL+KU, AB,
-     $                  LDAB, B( 1, I ), 1 )
-   30    CONTINUE
-*
-*        Solve L**T * X = B, overwriting B with X.
-*
-         IF( LNOTI ) THEN
-            DO 40 J = N - 1, 1, -1
-               LM = MIN( KL, N-J )
-               CALL CGEMV( 'Transpose', LM, NRHS, -ONE, B( J+1, 1 ),
-     $                     LDB, AB( KD+1, J ), 1, ONE, B( J, 1 ), LDB )
-               L = IPIV( J )
-               IF( L.NE.J )
-     $            CALL CSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
-   40       CONTINUE
-         END IF
-*
-      ELSE
-*
-*        Solve A**H * X = B.
-*
-         DO 50 I = 1, NRHS
-*
-*           Solve U**H * X = B, overwriting B with X.
-*
-            CALL CTBSV( 'Upper', 'Conjugate transpose', 'Non-unit', N,
-     $                  KL+KU, AB, LDAB, B( 1, I ), 1 )
-   50    CONTINUE
-*
-*        Solve L**H * X = B, overwriting B with X.
-*
-         IF( LNOTI ) THEN
-            DO 60 J = N - 1, 1, -1
-               LM = MIN( KL, N-J )
-               CALL CLACGV( NRHS, B( J, 1 ), LDB )
-               CALL CGEMV( 'Conjugate transpose', LM, NRHS, -ONE,
-     $                     B( J+1, 1 ), LDB, AB( KD+1, J ), 1, ONE,
-     $                     B( J, 1 ), LDB )
-               CALL CLACGV( NRHS, B( J, 1 ), LDB )
-               L = IPIV( J )
-               IF( L.NE.J )
-     $            CALL CSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
-   60       CONTINUE
-         END IF
-      END IF
-      RETURN
-*
-*     End of CGBTRS
-*
-      END
--- a/libcruft/lapack/cgebak.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,189 +0,0 @@
-      SUBROUTINE CGEBAK( JOB, SIDE, N, ILO, IHI, SCALE, M, V, LDV,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOB, SIDE
-      INTEGER            IHI, ILO, INFO, LDV, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               SCALE( * )
-      COMPLEX            V( LDV, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGEBAK forms the right or left eigenvectors of a complex general
-*  matrix by backward transformation on the computed eigenvectors of the
-*  balanced matrix output by CGEBAL.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies the type of backward transformation required:
-*          = 'N', do nothing, return immediately;
-*          = 'P', do backward transformation for permutation only;
-*          = 'S', do backward transformation for scaling only;
-*          = 'B', do backward transformations for both permutation and
-*                 scaling.
-*          JOB must be the same as the argument JOB supplied to CGEBAL.
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'R':  V contains right eigenvectors;
-*          = 'L':  V contains left eigenvectors.
-*
-*  N       (input) INTEGER
-*          The number of rows of the matrix V.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          The integers ILO and IHI determined by CGEBAL.
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  SCALE   (input) REAL array, dimension (N)
-*          Details of the permutation and scaling factors, as returned
-*          by CGEBAL.
-*
-*  M       (input) INTEGER
-*          The number of columns of the matrix V.  M >= 0.
-*
-*  V       (input/output) COMPLEX array, dimension (LDV,M)
-*          On entry, the matrix of right or left eigenvectors to be
-*          transformed, as returned by CHSEIN or CTREVC.
-*          On exit, V is overwritten by the transformed eigenvectors.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V. LDV >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFTV, RIGHTV
-      INTEGER            I, II, K
-      REAL               S
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CSSCAL, CSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and Test the input parameters
-*
-      RIGHTV = LSAME( SIDE, 'R' )
-      LEFTV = LSAME( SIDE, 'L' )
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
-     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -5
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -7
-      ELSE IF( LDV.LT.MAX( 1, N ) ) THEN
-         INFO = -9
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGEBAK', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-      IF( M.EQ.0 )
-     $   RETURN
-      IF( LSAME( JOB, 'N' ) )
-     $   RETURN
-*
-      IF( ILO.EQ.IHI )
-     $   GO TO 30
-*
-*     Backward balance
-*
-      IF( LSAME( JOB, 'S' ) .OR. LSAME( JOB, 'B' ) ) THEN
-*
-         IF( RIGHTV ) THEN
-            DO 10 I = ILO, IHI
-               S = SCALE( I )
-               CALL CSSCAL( M, S, V( I, 1 ), LDV )
-   10       CONTINUE
-         END IF
-*
-         IF( LEFTV ) THEN
-            DO 20 I = ILO, IHI
-               S = ONE / SCALE( I )
-               CALL CSSCAL( M, S, V( I, 1 ), LDV )
-   20       CONTINUE
-         END IF
-*
-      END IF
-*
-*     Backward permutation
-*
-*     For  I = ILO-1 step -1 until 1,
-*              IHI+1 step 1 until N do --
-*
-   30 CONTINUE
-      IF( LSAME( JOB, 'P' ) .OR. LSAME( JOB, 'B' ) ) THEN
-         IF( RIGHTV ) THEN
-            DO 40 II = 1, N
-               I = II
-               IF( I.GE.ILO .AND. I.LE.IHI )
-     $            GO TO 40
-               IF( I.LT.ILO )
-     $            I = ILO - II
-               K = SCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 40
-               CALL CSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   40       CONTINUE
-         END IF
-*
-         IF( LEFTV ) THEN
-            DO 50 II = 1, N
-               I = II
-               IF( I.GE.ILO .AND. I.LE.IHI )
-     $            GO TO 50
-               IF( I.LT.ILO )
-     $            I = ILO - II
-               K = SCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 50
-               CALL CSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   50       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of CGEBAK
-*
-      END
--- a/libcruft/lapack/cgebal.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,330 +0,0 @@
-      SUBROUTINE CGEBAL( JOB, N, A, LDA, ILO, IHI, SCALE, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOB
-      INTEGER            IHI, ILO, INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      REAL               SCALE( * )
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGEBAL balances a general complex matrix A.  This involves, first,
-*  permuting A by a similarity transformation to isolate eigenvalues
-*  in the first 1 to ILO-1 and last IHI+1 to N elements on the
-*  diagonal; and second, applying a diagonal similarity transformation
-*  to rows and columns ILO to IHI to make the rows and columns as
-*  close in norm as possible.  Both steps are optional.
-*
-*  Balancing may reduce the 1-norm of the matrix, and improve the
-*  accuracy of the computed eigenvalues and/or eigenvectors.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies the operations to be performed on A:
-*          = 'N':  none:  simply set ILO = 1, IHI = N, SCALE(I) = 1.0
-*                  for i = 1,...,N;
-*          = 'P':  permute only;
-*          = 'S':  scale only;
-*          = 'B':  both permute and scale.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the input matrix A.
-*          On exit,  A is overwritten by the balanced matrix.
-*          If JOB = 'N', A is not referenced.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  ILO     (output) INTEGER
-*  IHI     (output) INTEGER
-*          ILO and IHI are set to integers such that on exit
-*          A(i,j) = 0 if i > j and j = 1,...,ILO-1 or I = IHI+1,...,N.
-*          If JOB = 'N' or 'S', ILO = 1 and IHI = N.
-*
-*  SCALE   (output) REAL array, dimension (N)
-*          Details of the permutations and scaling factors applied to
-*          A.  If P(j) is the index of the row and column interchanged
-*          with row and column j and D(j) is the scaling factor
-*          applied to row and column j, then
-*          SCALE(j) = P(j)    for j = 1,...,ILO-1
-*                   = D(j)    for j = ILO,...,IHI
-*                   = P(j)    for j = IHI+1,...,N.
-*          The order in which the interchanges are made is N to IHI+1,
-*          then 1 to ILO-1.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The permutations consist of row and column interchanges which put
-*  the matrix in the form
-*
-*             ( T1   X   Y  )
-*     P A P = (  0   B   Z  )
-*             (  0   0   T2 )
-*
-*  where T1 and T2 are upper triangular matrices whose eigenvalues lie
-*  along the diagonal.  The column indices ILO and IHI mark the starting
-*  and ending columns of the submatrix B. Balancing consists of applying
-*  a diagonal similarity transformation inv(D) * B * D to make the
-*  1-norms of each row of B and its corresponding column nearly equal.
-*  The output matrix is
-*
-*     ( T1     X*D          Y    )
-*     (  0  inv(D)*B*D  inv(D)*Z ).
-*     (  0      0           T2   )
-*
-*  Information about the permutations P and the diagonal matrix D is
-*  returned in the vector SCALE.
-*
-*  This subroutine is based on the EISPACK routine CBAL.
-*
-*  Modified by Tzu-Yi Chen, Computer Science Division, University of
-*    California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-      REAL               SCLFAC
-      PARAMETER          ( SCLFAC = 2.0E+0 )
-      REAL               FACTOR
-      PARAMETER          ( FACTOR = 0.95E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOCONV
-      INTEGER            I, ICA, IEXC, IRA, J, K, L, M
-      REAL               C, CA, F, G, R, RA, S, SFMAX1, SFMAX2, SFMIN1,
-     $                   SFMIN2
-      COMPLEX            CDUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ICAMAX
-      REAL               SLAMCH
-      EXTERNAL           LSAME, ICAMAX, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CSSCAL, CSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, MAX, MIN, REAL
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( REAL( CDUM ) ) + ABS( AIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
-     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGEBAL', -INFO )
-         RETURN
-      END IF
-*
-      K = 1
-      L = N
-*
-      IF( N.EQ.0 )
-     $   GO TO 210
-*
-      IF( LSAME( JOB, 'N' ) ) THEN
-         DO 10 I = 1, N
-            SCALE( I ) = ONE
-   10    CONTINUE
-         GO TO 210
-      END IF
-*
-      IF( LSAME( JOB, 'S' ) )
-     $   GO TO 120
-*
-*     Permutation to isolate eigenvalues if possible
-*
-      GO TO 50
-*
-*     Row and column exchange.
-*
-   20 CONTINUE
-      SCALE( M ) = J
-      IF( J.EQ.M )
-     $   GO TO 30
-*
-      CALL CSWAP( L, A( 1, J ), 1, A( 1, M ), 1 )
-      CALL CSWAP( N-K+1, A( J, K ), LDA, A( M, K ), LDA )
-*
-   30 CONTINUE
-      GO TO ( 40, 80 )IEXC
-*
-*     Search for rows isolating an eigenvalue and push them down.
-*
-   40 CONTINUE
-      IF( L.EQ.1 )
-     $   GO TO 210
-      L = L - 1
-*
-   50 CONTINUE
-      DO 70 J = L, 1, -1
-*
-         DO 60 I = 1, L
-            IF( I.EQ.J )
-     $         GO TO 60
-            IF( REAL( A( J, I ) ).NE.ZERO .OR. AIMAG( A( J, I ) ).NE.
-     $          ZERO )GO TO 70
-   60    CONTINUE
-*
-         M = L
-         IEXC = 1
-         GO TO 20
-   70 CONTINUE
-*
-      GO TO 90
-*
-*     Search for columns isolating an eigenvalue and push them left.
-*
-   80 CONTINUE
-      K = K + 1
-*
-   90 CONTINUE
-      DO 110 J = K, L
-*
-         DO 100 I = K, L
-            IF( I.EQ.J )
-     $         GO TO 100
-            IF( REAL( A( I, J ) ).NE.ZERO .OR. AIMAG( A( I, J ) ).NE.
-     $          ZERO )GO TO 110
-  100    CONTINUE
-*
-         M = K
-         IEXC = 2
-         GO TO 20
-  110 CONTINUE
-*
-  120 CONTINUE
-      DO 130 I = K, L
-         SCALE( I ) = ONE
-  130 CONTINUE
-*
-      IF( LSAME( JOB, 'P' ) )
-     $   GO TO 210
-*
-*     Balance the submatrix in rows K to L.
-*
-*     Iterative loop for norm reduction
-*
-      SFMIN1 = SLAMCH( 'S' ) / SLAMCH( 'P' )
-      SFMAX1 = ONE / SFMIN1
-      SFMIN2 = SFMIN1*SCLFAC
-      SFMAX2 = ONE / SFMIN2
-  140 CONTINUE
-      NOCONV = .FALSE.
-*
-      DO 200 I = K, L
-         C = ZERO
-         R = ZERO
-*
-         DO 150 J = K, L
-            IF( J.EQ.I )
-     $         GO TO 150
-            C = C + CABS1( A( J, I ) )
-            R = R + CABS1( A( I, J ) )
-  150    CONTINUE
-         ICA = ICAMAX( L, A( 1, I ), 1 )
-         CA = ABS( A( ICA, I ) )
-         IRA = ICAMAX( N-K+1, A( I, K ), LDA )
-         RA = ABS( A( I, IRA+K-1 ) )
-*
-*        Guard against zero C or R due to underflow.
-*
-         IF( C.EQ.ZERO .OR. R.EQ.ZERO )
-     $      GO TO 200
-         G = R / SCLFAC
-         F = ONE
-         S = C + R
-  160    CONTINUE
-         IF( C.GE.G .OR. MAX( F, C, CA ).GE.SFMAX2 .OR.
-     $       MIN( R, G, RA ).LE.SFMIN2 )GO TO 170
-         F = F*SCLFAC
-         C = C*SCLFAC
-         CA = CA*SCLFAC
-         R = R / SCLFAC
-         G = G / SCLFAC
-         RA = RA / SCLFAC
-         GO TO 160
-*
-  170    CONTINUE
-         G = C / SCLFAC
-  180    CONTINUE
-         IF( G.LT.R .OR. MAX( R, RA ).GE.SFMAX2 .OR.
-     $       MIN( F, C, G, CA ).LE.SFMIN2 )GO TO 190
-         F = F / SCLFAC
-         C = C / SCLFAC
-         G = G / SCLFAC
-         CA = CA / SCLFAC
-         R = R*SCLFAC
-         RA = RA*SCLFAC
-         GO TO 180
-*
-*        Now balance.
-*
-  190    CONTINUE
-         IF( ( C+R ).GE.FACTOR*S )
-     $      GO TO 200
-         IF( F.LT.ONE .AND. SCALE( I ).LT.ONE ) THEN
-            IF( F*SCALE( I ).LE.SFMIN1 )
-     $         GO TO 200
-         END IF
-         IF( F.GT.ONE .AND. SCALE( I ).GT.ONE ) THEN
-            IF( SCALE( I ).GE.SFMAX1 / F )
-     $         GO TO 200
-         END IF
-         G = ONE / F
-         SCALE( I ) = SCALE( I )*F
-         NOCONV = .TRUE.
-*
-         CALL CSSCAL( N-K+1, G, A( I, K ), LDA )
-         CALL CSSCAL( L, F, A( 1, I ), 1 )
-*
-  200 CONTINUE
-*
-      IF( NOCONV )
-     $   GO TO 140
-*
-  210 CONTINUE
-      ILO = K
-      IHI = L
-*
-      RETURN
-*
-*     End of CGEBAL
-*
-      END
--- a/libcruft/lapack/cgebd2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,250 +0,0 @@
-      SUBROUTINE CGEBD2( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * ), E( * )
-      COMPLEX            A( LDA, * ), TAUP( * ), TAUQ( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGEBD2 reduces a complex general m by n matrix A to upper or lower
-*  real bidiagonal form B by a unitary transformation: Q' * A * P = B.
-*
-*  If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows in the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns in the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the m by n general matrix to be reduced.
-*          On exit,
-*          if m >= n, the diagonal and the first superdiagonal are
-*            overwritten with the upper bidiagonal matrix B; the
-*            elements below the diagonal, with the array TAUQ, represent
-*            the unitary matrix Q as a product of elementary
-*            reflectors, and the elements above the first superdiagonal,
-*            with the array TAUP, represent the unitary matrix P as
-*            a product of elementary reflectors;
-*          if m < n, the diagonal and the first subdiagonal are
-*            overwritten with the lower bidiagonal matrix B; the
-*            elements below the first subdiagonal, with the array TAUQ,
-*            represent the unitary matrix Q as a product of
-*            elementary reflectors, and the elements above the diagonal,
-*            with the array TAUP, represent the unitary matrix P as
-*            a product of elementary reflectors.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  D       (output) REAL array, dimension (min(M,N))
-*          The diagonal elements of the bidiagonal matrix B:
-*          D(i) = A(i,i).
-*
-*  E       (output) REAL array, dimension (min(M,N)-1)
-*          The off-diagonal elements of the bidiagonal matrix B:
-*          if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1;
-*          if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1.
-*
-*  TAUQ    (output) COMPLEX array dimension (min(M,N))
-*          The scalar factors of the elementary reflectors which
-*          represent the unitary matrix Q. See Further Details.
-*
-*  TAUP    (output) COMPLEX array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors which
-*          represent the unitary matrix P. See Further Details.
-*
-*  WORK    (workspace) COMPLEX array, dimension (max(M,N))
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit 
-*          < 0: if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrices Q and P are represented as products of elementary
-*  reflectors:
-*
-*  If m >= n,
-*
-*     Q = H(1) H(2) . . . H(n)  and  P = G(1) G(2) . . . G(n-1)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are complex scalars, and v and u are complex
-*  vectors; v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in
-*  A(i+1:m,i); u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in
-*  A(i,i+2:n); tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  If m < n,
-*
-*     Q = H(1) H(2) . . . H(m-1)  and  P = G(1) G(2) . . . G(m)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are complex scalars, v and u are complex vectors;
-*  v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in A(i+2:m,i);
-*  u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in A(i,i+1:n);
-*  tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  The contents of A on exit are illustrated by the following examples:
-*
-*  m = 6 and n = 5 (m > n):          m = 5 and n = 6 (m < n):
-*
-*    (  d   e   u1  u1  u1 )           (  d   u1  u1  u1  u1  u1 )
-*    (  v1  d   e   u2  u2 )           (  e   d   u2  u2  u2  u2 )
-*    (  v1  v2  d   e   u3 )           (  v1  e   d   u3  u3  u3 )
-*    (  v1  v2  v3  d   e  )           (  v1  v2  e   d   u4  u4 )
-*    (  v1  v2  v3  v4  d  )           (  v1  v2  v3  e   d   u5 )
-*    (  v1  v2  v3  v4  v5 )
-*
-*  where d and e denote diagonal and off-diagonal elements of B, vi
-*  denotes an element of the vector defining H(i), and ui an element of
-*  the vector defining G(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ),
-     $                   ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      COMPLEX            ALPHA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLACGV, CLARF, CLARFG, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CONJG, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.LT.0 ) THEN
-         CALL XERBLA( 'CGEBD2', -INFO )
-         RETURN
-      END IF
-*
-      IF( M.GE.N ) THEN
-*
-*        Reduce to upper bidiagonal form
-*
-         DO 10 I = 1, N
-*
-*           Generate elementary reflector H(i) to annihilate A(i+1:m,i)
-*
-            ALPHA = A( I, I )
-            CALL CLARFG( M-I+1, ALPHA, A( MIN( I+1, M ), I ), 1,
-     $                   TAUQ( I ) )
-            D( I ) = ALPHA
-            A( I, I ) = ONE
-*
-*           Apply H(i)' to A(i:m,i+1:n) from the left
-*
-            IF( I.LT.N )
-     $         CALL CLARF( 'Left', M-I+1, N-I, A( I, I ), 1,
-     $                     CONJG( TAUQ( I ) ), A( I, I+1 ), LDA, WORK )
-            A( I, I ) = D( I )
-*
-            IF( I.LT.N ) THEN
-*
-*              Generate elementary reflector G(i) to annihilate
-*              A(i,i+2:n)
-*
-               CALL CLACGV( N-I, A( I, I+1 ), LDA )
-               ALPHA = A( I, I+1 )
-               CALL CLARFG( N-I, ALPHA, A( I, MIN( I+2, N ) ),
-     $                      LDA, TAUP( I ) )
-               E( I ) = ALPHA
-               A( I, I+1 ) = ONE
-*
-*              Apply G(i) to A(i+1:m,i+1:n) from the right
-*
-               CALL CLARF( 'Right', M-I, N-I, A( I, I+1 ), LDA,
-     $                     TAUP( I ), A( I+1, I+1 ), LDA, WORK )
-               CALL CLACGV( N-I, A( I, I+1 ), LDA )
-               A( I, I+1 ) = E( I )
-            ELSE
-               TAUP( I ) = ZERO
-            END IF
-   10    CONTINUE
-      ELSE
-*
-*        Reduce to lower bidiagonal form
-*
-         DO 20 I = 1, M
-*
-*           Generate elementary reflector G(i) to annihilate A(i,i+1:n)
-*
-            CALL CLACGV( N-I+1, A( I, I ), LDA )
-            ALPHA = A( I, I )
-            CALL CLARFG( N-I+1, ALPHA, A( I, MIN( I+1, N ) ), LDA,
-     $                   TAUP( I ) )
-            D( I ) = ALPHA
-            A( I, I ) = ONE
-*
-*           Apply G(i) to A(i+1:m,i:n) from the right
-*
-            IF( I.LT.M )
-     $         CALL CLARF( 'Right', M-I, N-I+1, A( I, I ), LDA,
-     $                     TAUP( I ), A( I+1, I ), LDA, WORK )
-            CALL CLACGV( N-I+1, A( I, I ), LDA )
-            A( I, I ) = D( I )
-*
-            IF( I.LT.M ) THEN
-*
-*              Generate elementary reflector H(i) to annihilate
-*              A(i+2:m,i)
-*
-               ALPHA = A( I+1, I )
-               CALL CLARFG( M-I, ALPHA, A( MIN( I+2, M ), I ), 1,
-     $                      TAUQ( I ) )
-               E( I ) = ALPHA
-               A( I+1, I ) = ONE
-*
-*              Apply H(i)' to A(i+1:m,i+1:n) from the left
-*
-               CALL CLARF( 'Left', M-I, N-I, A( I+1, I ), 1,
-     $                     CONJG( TAUQ( I ) ), A( I+1, I+1 ), LDA,
-     $                     WORK )
-               A( I+1, I ) = E( I )
-            ELSE
-               TAUQ( I ) = ZERO
-            END IF
-   20    CONTINUE
-      END IF
-      RETURN
-*
-*     End of CGEBD2
-*
-      END
--- a/libcruft/lapack/cgebrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,269 +0,0 @@
-      SUBROUTINE CGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * ), E( * )
-      COMPLEX            A( LDA, * ), TAUP( * ), TAUQ( * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGEBRD reduces a general complex M-by-N matrix A to upper or lower
-*  bidiagonal form B by a unitary transformation: Q**H * A * P = B.
-*
-*  If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows in the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns in the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the M-by-N general matrix to be reduced.
-*          On exit,
-*          if m >= n, the diagonal and the first superdiagonal are
-*            overwritten with the upper bidiagonal matrix B; the
-*            elements below the diagonal, with the array TAUQ, represent
-*            the unitary matrix Q as a product of elementary
-*            reflectors, and the elements above the first superdiagonal,
-*            with the array TAUP, represent the unitary matrix P as
-*            a product of elementary reflectors;
-*          if m < n, the diagonal and the first subdiagonal are
-*            overwritten with the lower bidiagonal matrix B; the
-*            elements below the first subdiagonal, with the array TAUQ,
-*            represent the unitary matrix Q as a product of
-*            elementary reflectors, and the elements above the diagonal,
-*            with the array TAUP, represent the unitary matrix P as
-*            a product of elementary reflectors.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  D       (output) REAL array, dimension (min(M,N))
-*          The diagonal elements of the bidiagonal matrix B:
-*          D(i) = A(i,i).
-*
-*  E       (output) REAL array, dimension (min(M,N)-1)
-*          The off-diagonal elements of the bidiagonal matrix B:
-*          if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1;
-*          if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1.
-*
-*  TAUQ    (output) COMPLEX array dimension (min(M,N))
-*          The scalar factors of the elementary reflectors which
-*          represent the unitary matrix Q. See Further Details.
-*
-*  TAUP    (output) COMPLEX array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors which
-*          represent the unitary matrix P. See Further Details.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The length of the array WORK.  LWORK >= max(1,M,N).
-*          For optimum performance LWORK >= (M+N)*NB, where NB
-*          is the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrices Q and P are represented as products of elementary
-*  reflectors:
-*
-*  If m >= n,
-*
-*     Q = H(1) H(2) . . . H(n)  and  P = G(1) G(2) . . . G(n-1)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are complex scalars, and v and u are complex
-*  vectors; v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in
-*  A(i+1:m,i); u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in
-*  A(i,i+2:n); tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  If m < n,
-*
-*     Q = H(1) H(2) . . . H(m-1)  and  P = G(1) G(2) . . . G(m)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are complex scalars, and v and u are complex
-*  vectors; v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in
-*  A(i+2:m,i); u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in
-*  A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  The contents of A on exit are illustrated by the following examples:
-*
-*  m = 6 and n = 5 (m > n):          m = 5 and n = 6 (m < n):
-*
-*    (  d   e   u1  u1  u1 )           (  d   u1  u1  u1  u1  u1 )
-*    (  v1  d   e   u2  u2 )           (  e   d   u2  u2  u2  u2 )
-*    (  v1  v2  d   e   u3 )           (  v1  e   d   u3  u3  u3 )
-*    (  v1  v2  v3  d   e  )           (  v1  v2  e   d   u4  u4 )
-*    (  v1  v2  v3  v4  d  )           (  v1  v2  v3  e   d   u5 )
-*    (  v1  v2  v3  v4  v5 )
-*
-*  where d and e denote diagonal and off-diagonal elements of B, vi
-*  denotes an element of the vector defining H(i), and ui an element of
-*  the vector defining G(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IINFO, J, LDWRKX, LDWRKY, LWKOPT, MINMN, NB,
-     $                   NBMIN, NX
-      REAL               WS
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEBD2, CGEMM, CLABRD, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN, REAL
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      NB = MAX( 1, ILAENV( 1, 'CGEBRD', ' ', M, N, -1, -1 ) )
-      LWKOPT = ( M+N )*NB
-      WORK( 1 ) = REAL( LWKOPT )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.MAX( 1, M, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.LT.0 ) THEN
-         CALL XERBLA( 'CGEBRD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      MINMN = MIN( M, N )
-      IF( MINMN.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      WS = MAX( M, N )
-      LDWRKX = M
-      LDWRKY = N
-*
-      IF( NB.GT.1 .AND. NB.LT.MINMN ) THEN
-*
-*        Set the crossover point NX.
-*
-         NX = MAX( NB, ILAENV( 3, 'CGEBRD', ' ', M, N, -1, -1 ) )
-*
-*        Determine when to switch from blocked to unblocked code.
-*
-         IF( NX.LT.MINMN ) THEN
-            WS = ( M+N )*NB
-            IF( LWORK.LT.WS ) THEN
-*
-*              Not enough work space for the optimal NB, consider using
-*              a smaller block size.
-*
-               NBMIN = ILAENV( 2, 'CGEBRD', ' ', M, N, -1, -1 )
-               IF( LWORK.GE.( M+N )*NBMIN ) THEN
-                  NB = LWORK / ( M+N )
-               ELSE
-                  NB = 1
-                  NX = MINMN
-               END IF
-            END IF
-         END IF
-      ELSE
-         NX = MINMN
-      END IF
-*
-      DO 30 I = 1, MINMN - NX, NB
-*
-*        Reduce rows and columns i:i+ib-1 to bidiagonal form and return
-*        the matrices X and Y which are needed to update the unreduced
-*        part of the matrix
-*
-         CALL CLABRD( M-I+1, N-I+1, NB, A( I, I ), LDA, D( I ), E( I ),
-     $                TAUQ( I ), TAUP( I ), WORK, LDWRKX,
-     $                WORK( LDWRKX*NB+1 ), LDWRKY )
-*
-*        Update the trailing submatrix A(i+ib:m,i+ib:n), using
-*        an update of the form  A := A - V*Y' - X*U'
-*
-         CALL CGEMM( 'No transpose', 'Conjugate transpose', M-I-NB+1,
-     $               N-I-NB+1, NB, -ONE, A( I+NB, I ), LDA,
-     $               WORK( LDWRKX*NB+NB+1 ), LDWRKY, ONE,
-     $               A( I+NB, I+NB ), LDA )
-         CALL CGEMM( 'No transpose', 'No transpose', M-I-NB+1, N-I-NB+1,
-     $               NB, -ONE, WORK( NB+1 ), LDWRKX, A( I, I+NB ), LDA,
-     $               ONE, A( I+NB, I+NB ), LDA )
-*
-*        Copy diagonal and off-diagonal elements of B back into A
-*
-         IF( M.GE.N ) THEN
-            DO 10 J = I, I + NB - 1
-               A( J, J ) = D( J )
-               A( J, J+1 ) = E( J )
-   10       CONTINUE
-         ELSE
-            DO 20 J = I, I + NB - 1
-               A( J, J ) = D( J )
-               A( J+1, J ) = E( J )
-   20       CONTINUE
-         END IF
-   30 CONTINUE
-*
-*     Use unblocked code to reduce the remainder of the matrix
-*
-      CALL CGEBD2( M-I+1, N-I+1, A( I, I ), LDA, D( I ), E( I ),
-     $             TAUQ( I ), TAUP( I ), WORK, IINFO )
-      WORK( 1 ) = WS
-      RETURN
-*
-*     End of CGEBRD
-*
-      END
--- a/libcruft/lapack/cgecon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,193 +0,0 @@
-      SUBROUTINE CGECON( NORM, N, A, LDA, ANORM, RCOND, WORK, RWORK,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call CLACN2 in place of CLACON, 10 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            INFO, LDA, N
-      REAL               ANORM, RCOND
-*     ..
-*     .. Array Arguments ..
-      REAL               RWORK( * )
-      COMPLEX            A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGECON estimates the reciprocal of the condition number of a general
-*  complex matrix A, in either the 1-norm or the infinity-norm, using
-*  the LU factorization computed by CGETRF.
-*
-*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
-*  condition number is computed as
-*     RCOND = 1 / ( norm(A) * norm(inv(A)) ).
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies whether the 1-norm condition number or the
-*          infinity-norm condition number is required:
-*          = '1' or 'O':  1-norm;
-*          = 'I':         Infinity-norm.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input) COMPLEX array, dimension (LDA,N)
-*          The factors L and U from the factorization A = P*L*U
-*          as computed by CGETRF.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  ANORM   (input) REAL
-*          If NORM = '1' or 'O', the 1-norm of the original matrix A.
-*          If NORM = 'I', the infinity-norm of the original matrix A.
-*
-*  RCOND   (output) REAL
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(norm(A) * norm(inv(A))).
-*
-*  WORK    (workspace) COMPLEX array, dimension (2*N)
-*
-*  RWORK   (workspace) REAL array, dimension (2*N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ONENRM
-      CHARACTER          NORMIN
-      INTEGER            IX, KASE, KASE1
-      REAL               AINVNM, SCALE, SL, SMLNUM, SU
-      COMPLEX            ZDUM
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ICAMAX
-      REAL               SLAMCH
-      EXTERNAL           LSAME, ICAMAX, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLACN2, CLATRS, CSRSCL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, MAX, REAL
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( REAL( ZDUM ) ) + ABS( AIMAG( ZDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' )
-      IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( ANORM.LT.ZERO ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGECON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      RCOND = ZERO
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      ELSE IF( ANORM.EQ.ZERO ) THEN
-         RETURN
-      END IF
-*
-      SMLNUM = SLAMCH( 'Safe minimum' )
-*
-*     Estimate the norm of inv(A).
-*
-      AINVNM = ZERO
-      NORMIN = 'N'
-      IF( ONENRM ) THEN
-         KASE1 = 1
-      ELSE
-         KASE1 = 2
-      END IF
-      KASE = 0
-   10 CONTINUE
-      CALL CLACN2( N, WORK( N+1 ), WORK, AINVNM, KASE, ISAVE )
-      IF( KASE.NE.0 ) THEN
-         IF( KASE.EQ.KASE1 ) THEN
-*
-*           Multiply by inv(L).
-*
-            CALL CLATRS( 'Lower', 'No transpose', 'Unit', NORMIN, N, A,
-     $                   LDA, WORK, SL, RWORK, INFO )
-*
-*           Multiply by inv(U).
-*
-            CALL CLATRS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   A, LDA, WORK, SU, RWORK( N+1 ), INFO )
-         ELSE
-*
-*           Multiply by inv(U').
-*
-            CALL CLATRS( 'Upper', 'Conjugate transpose', 'Non-unit',
-     $                   NORMIN, N, A, LDA, WORK, SU, RWORK( N+1 ),
-     $                   INFO )
-*
-*           Multiply by inv(L').
-*
-            CALL CLATRS( 'Lower', 'Conjugate transpose', 'Unit', NORMIN,
-     $                   N, A, LDA, WORK, SL, RWORK, INFO )
-         END IF
-*
-*        Divide X by 1/(SL*SU) if doing so will not cause overflow.
-*
-         SCALE = SL*SU
-         NORMIN = 'Y'
-         IF( SCALE.NE.ONE ) THEN
-            IX = ICAMAX( N, WORK, 1 )
-            IF( SCALE.LT.CABS1( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
-     $         GO TO 20
-            CALL CSRSCL( N, SCALE, WORK, 1 )
-         END IF
-         GO TO 10
-      END IF
-*
-*     Compute the estimate of the reciprocal condition number.
-*
-      IF( AINVNM.NE.ZERO )
-     $   RCOND = ( ONE / AINVNM ) / ANORM
-*
-   20 CONTINUE
-      RETURN
-*
-*     End of CGECON
-*
-      END
--- a/libcruft/lapack/cgeesx.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,384 +0,0 @@
-      SUBROUTINE CGEESX( JOBVS, SORT, SELECT, SENSE, N, A, LDA, SDIM, W,
-     $                   VS, LDVS, RCONDE, RCONDV, WORK, LWORK, RWORK,
-     $                   BWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBVS, SENSE, SORT
-      INTEGER            INFO, LDA, LDVS, LWORK, N, SDIM
-      REAL               RCONDE, RCONDV
-*     ..
-*     .. Array Arguments ..
-      LOGICAL            BWORK( * )
-      REAL               RWORK( * )
-      COMPLEX            A( LDA, * ), VS( LDVS, * ), W( * ), WORK( * )
-*     ..
-*     .. Function Arguments ..
-      LOGICAL            SELECT
-      EXTERNAL           SELECT
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGEESX computes for an N-by-N complex nonsymmetric matrix A, the
-*  eigenvalues, the Schur form T, and, optionally, the matrix of Schur
-*  vectors Z.  This gives the Schur factorization A = Z*T*(Z**H).
-*
-*  Optionally, it also orders the eigenvalues on the diagonal of the
-*  Schur form so that selected eigenvalues are at the top left;
-*  computes a reciprocal condition number for the average of the
-*  selected eigenvalues (RCONDE); and computes a reciprocal condition
-*  number for the right invariant subspace corresponding to the
-*  selected eigenvalues (RCONDV).  The leading columns of Z form an
-*  orthonormal basis for this invariant subspace.
-*
-*  For further explanation of the reciprocal condition numbers RCONDE
-*  and RCONDV, see Section 4.10 of the LAPACK Users' Guide (where
-*  these quantities are called s and sep respectively).
-*
-*  A complex matrix is in Schur form if it is upper triangular.
-*
-*  Arguments
-*  =========
-*
-*  JOBVS   (input) CHARACTER*1
-*          = 'N': Schur vectors are not computed;
-*          = 'V': Schur vectors are computed.
-*
-*  SORT    (input) CHARACTER*1
-*          Specifies whether or not to order the eigenvalues on the
-*          diagonal of the Schur form.
-*          = 'N': Eigenvalues are not ordered;
-*          = 'S': Eigenvalues are ordered (see SELECT).
-*
-*  SELECT  (external procedure) LOGICAL FUNCTION of one COMPLEX argument
-*          SELECT must be declared EXTERNAL in the calling subroutine.
-*          If SORT = 'S', SELECT is used to select eigenvalues to order
-*          to the top left of the Schur form.
-*          If SORT = 'N', SELECT is not referenced.
-*          An eigenvalue W(j) is selected if SELECT(W(j)) is true.
-*
-*  SENSE   (input) CHARACTER*1
-*          Determines which reciprocal condition numbers are computed.
-*          = 'N': None are computed;
-*          = 'E': Computed for average of selected eigenvalues only;
-*          = 'V': Computed for selected right invariant subspace only;
-*          = 'B': Computed for both.
-*          If SENSE = 'E', 'V' or 'B', SORT must equal 'S'.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A. N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA, N)
-*          On entry, the N-by-N matrix A.
-*          On exit, A is overwritten by its Schur form T.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  SDIM    (output) INTEGER
-*          If SORT = 'N', SDIM = 0.
-*          If SORT = 'S', SDIM = number of eigenvalues for which
-*                         SELECT is true.
-*
-*  W       (output) COMPLEX array, dimension (N)
-*          W contains the computed eigenvalues, in the same order
-*          that they appear on the diagonal of the output Schur form T.
-*
-*  VS      (output) COMPLEX array, dimension (LDVS,N)
-*          If JOBVS = 'V', VS contains the unitary matrix Z of Schur
-*          vectors.
-*          If JOBVS = 'N', VS is not referenced.
-*
-*  LDVS    (input) INTEGER
-*          The leading dimension of the array VS.  LDVS >= 1, and if
-*          JOBVS = 'V', LDVS >= N.
-*
-*  RCONDE  (output) REAL
-*          If SENSE = 'E' or 'B', RCONDE contains the reciprocal
-*          condition number for the average of the selected eigenvalues.
-*          Not referenced if SENSE = 'N' or 'V'.
-*
-*  RCONDV  (output) REAL
-*          If SENSE = 'V' or 'B', RCONDV contains the reciprocal
-*          condition number for the selected right invariant subspace.
-*          Not referenced if SENSE = 'N' or 'E'.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,2*N).
-*          Also, if SENSE = 'E' or 'V' or 'B', LWORK >= 2*SDIM*(N-SDIM),
-*          where SDIM is the number of selected eigenvalues computed by
-*          this routine.  Note that 2*SDIM*(N-SDIM) <= N*N/2. Note also
-*          that an error is only returned if LWORK < max(1,2*N), but if
-*          SENSE = 'E' or 'V' or 'B' this may not be large enough.
-*          For good performance, LWORK must generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates upper bound on the optimal size of the
-*          array WORK, returns this value as the first entry of the WORK
-*          array, and no error message related to LWORK is issued by
-*          XERBLA.
-*
-*  RWORK   (workspace) REAL array, dimension (N)
-*
-*  BWORK   (workspace) LOGICAL array, dimension (N)
-*          Not referenced if SORT = 'N'.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value.
-*          > 0: if INFO = i, and i is
-*             <= N: the QR algorithm failed to compute all the
-*                   eigenvalues; elements 1:ILO-1 and i+1:N of W
-*                   contain those eigenvalues which have converged; if
-*                   JOBVS = 'V', VS contains the transformation which
-*                   reduces A to its partially converged Schur form.
-*             = N+1: the eigenvalues could not be reordered because some
-*                   eigenvalues were too close to separate (the problem
-*                   is very ill-conditioned);
-*             = N+2: after reordering, roundoff changed values of some
-*                   complex eigenvalues so that leading eigenvalues in
-*                   the Schur form no longer satisfy SELECT=.TRUE.  This
-*                   could also be caused by underflow due to scaling.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            SCALEA, WANTSB, WANTSE, WANTSN, WANTST,
-     $                   WANTSV, WANTVS
-      INTEGER            HSWORK, I, IBAL, ICOND, IERR, IEVAL, IHI, ILO,
-     $                   ITAU, IWRK, LWRK, MAXWRK, MINWRK
-      REAL               ANRM, BIGNUM, CSCALE, EPS, SMLNUM
-*     ..
-*     .. Local Arrays ..
-      REAL               DUM( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CCOPY, CGEBAK, CGEBAL, CGEHRD, CHSEQR, CLACPY,
-     $                   CLASCL, CTRSEN, CUNGHR, SLABAD, SLASCL, XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      REAL               CLANGE, SLAMCH
-      EXTERNAL           LSAME, ILAENV, CLANGE, SLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      WANTVS = LSAME( JOBVS, 'V' )
-      WANTST = LSAME( SORT, 'S' )
-      WANTSN = LSAME( SENSE, 'N' )
-      WANTSE = LSAME( SENSE, 'E' )
-      WANTSV = LSAME( SENSE, 'V' )
-      WANTSB = LSAME( SENSE, 'B' )
-      IF( ( .NOT.WANTVS ) .AND. ( .NOT.LSAME( JOBVS, 'N' ) ) ) THEN
-         INFO = -1
-      ELSE IF( ( .NOT.WANTST ) .AND. ( .NOT.LSAME( SORT, 'N' ) ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.( WANTSN .OR. WANTSE .OR. WANTSV .OR. WANTSB ) .OR.
-     $         ( .NOT.WANTST .AND. .NOT.WANTSN ) ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDVS.LT.1 .OR. ( WANTVS .AND. LDVS.LT.N ) ) THEN
-         INFO = -11
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of real workspace needed at that point in the
-*       code, as well as the preferred amount for good performance.
-*       CWorkspace refers to complex workspace, and RWorkspace to real
-*       workspace. NB refers to the optimal block size for the
-*       immediately following subroutine, as returned by ILAENV.
-*       HSWORK refers to the workspace preferred by CHSEQR, as
-*       calculated below. HSWORK is computed assuming ILO=1 and IHI=N,
-*       the worst case.
-*       If SENSE = 'E', 'V' or 'B', then the amount of workspace needed
-*       depends on SDIM, which is computed by the routine CTRSEN later
-*       in the code.)
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( N.EQ.0 ) THEN
-            MINWRK = 1
-            LWRK = 1
-         ELSE
-            MAXWRK = N + N*ILAENV( 1, 'CGEHRD', ' ', N, 1, N, 0 )
-            MINWRK = 2*N
-*
-            CALL CHSEQR( 'S', JOBVS, N, 1, N, A, LDA, W, VS, LDVS,
-     $             WORK, -1, IEVAL )
-            HSWORK = WORK( 1 )
-*
-            IF( .NOT.WANTVS ) THEN
-               MAXWRK = MAX( MAXWRK, HSWORK )
-            ELSE
-               MAXWRK = MAX( MAXWRK, N + ( N - 1 )*ILAENV( 1, 'CUNGHR',
-     $                       ' ', N, 1, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, HSWORK )
-            END IF
-            LWRK = MAXWRK
-            IF( .NOT.WANTSN )
-     $         LWRK = MAX( LWRK, ( N*N )/2 )
-         END IF
-         WORK( 1 ) = LWRK
-*
-         IF( LWORK.LT.MINWRK ) THEN
-            INFO = -15
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGEESX', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         SDIM = 0
-         RETURN
-      END IF
-*
-*     Get machine constants
-*
-      EPS = SLAMCH( 'P' )
-      SMLNUM = SLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SQRT( SMLNUM ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = CLANGE( 'M', N, N, A, LDA, DUM )
-      SCALEA = .FALSE.
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-         SCALEA = .TRUE.
-         CSCALE = SMLNUM
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-         SCALEA = .TRUE.
-         CSCALE = BIGNUM
-      END IF
-      IF( SCALEA )
-     $   CALL CLASCL( 'G', 0, 0, ANRM, CSCALE, N, N, A, LDA, IERR )
-*
-*
-*     Permute the matrix to make it more nearly triangular
-*     (CWorkspace: none)
-*     (RWorkspace: need N)
-*
-      IBAL = 1
-      CALL CGEBAL( 'P', N, A, LDA, ILO, IHI, RWORK( IBAL ), IERR )
-*
-*     Reduce to upper Hessenberg form
-*     (CWorkspace: need 2*N, prefer N+N*NB)
-*     (RWorkspace: none)
-*
-      ITAU = 1
-      IWRK = N + ITAU
-      CALL CGEHRD( N, ILO, IHI, A, LDA, WORK( ITAU ), WORK( IWRK ),
-     $             LWORK-IWRK+1, IERR )
-*
-      IF( WANTVS ) THEN
-*
-*        Copy Householder vectors to VS
-*
-         CALL CLACPY( 'L', N, N, A, LDA, VS, LDVS )
-*
-*        Generate unitary matrix in VS
-*        (CWorkspace: need 2*N-1, prefer N+(N-1)*NB)
-*        (RWorkspace: none)
-*
-         CALL CUNGHR( N, ILO, IHI, VS, LDVS, WORK( ITAU ), WORK( IWRK ),
-     $                LWORK-IWRK+1, IERR )
-      END IF
-*
-      SDIM = 0
-*
-*     Perform QR iteration, accumulating Schur vectors in VS if desired
-*     (CWorkspace: need 1, prefer HSWORK (see comments) )
-*     (RWorkspace: none)
-*
-      IWRK = ITAU
-      CALL CHSEQR( 'S', JOBVS, N, ILO, IHI, A, LDA, W, VS, LDVS,
-     $             WORK( IWRK ), LWORK-IWRK+1, IEVAL )
-      IF( IEVAL.GT.0 )
-     $   INFO = IEVAL
-*
-*     Sort eigenvalues if desired
-*
-      IF( WANTST .AND. INFO.EQ.0 ) THEN
-         IF( SCALEA )
-     $      CALL CLASCL( 'G', 0, 0, CSCALE, ANRM, N, 1, W, N, IERR )
-         DO 10 I = 1, N
-            BWORK( I ) = SELECT( W( I ) )
-   10    CONTINUE
-*
-*        Reorder eigenvalues, transform Schur vectors, and compute
-*        reciprocal condition numbers
-*        (CWorkspace: if SENSE is not 'N', need 2*SDIM*(N-SDIM)
-*                     otherwise, need none )
-*        (RWorkspace: none)
-*
-         CALL CTRSEN( SENSE, JOBVS, BWORK, N, A, LDA, VS, LDVS, W, SDIM,
-     $                RCONDE, RCONDV, WORK( IWRK ), LWORK-IWRK+1,
-     $                ICOND )
-         IF( .NOT.WANTSN )
-     $      MAXWRK = MAX( MAXWRK, 2*SDIM*( N-SDIM ) )
-         IF( ICOND.EQ.-14 ) THEN
-*
-*           Not enough complex workspace
-*
-            INFO = -15
-         END IF
-      END IF
-*
-      IF( WANTVS ) THEN
-*
-*        Undo balancing
-*        (CWorkspace: none)
-*        (RWorkspace: need N)
-*
-         CALL CGEBAK( 'P', 'R', N, ILO, IHI, RWORK( IBAL ), N, VS, LDVS,
-     $                IERR )
-      END IF
-*
-      IF( SCALEA ) THEN
-*
-*        Undo scaling for the Schur form of A
-*
-         CALL CLASCL( 'U', 0, 0, CSCALE, ANRM, N, N, A, LDA, IERR )
-         CALL CCOPY( N, A, LDA+1, W, 1 )
-         IF( ( WANTSV .OR. WANTSB ) .AND. INFO.EQ.0 ) THEN
-            DUM( 1 ) = RCONDV
-            CALL SLASCL( 'G', 0, 0, CSCALE, ANRM, 1, 1, DUM, 1, IERR )
-            RCONDV = DUM( 1 )
-         END IF
-      END IF
-*
-      WORK( 1 ) = MAXWRK
-      RETURN
-*
-*     End of CGEESX
-*
-      END
--- a/libcruft/lapack/cgeev.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,397 +0,0 @@
-      SUBROUTINE CGEEV( JOBVL, JOBVR, N, A, LDA, W, VL, LDVL, VR, LDVR,
-     $                  WORK, LWORK, RWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBVL, JOBVR
-      INTEGER            INFO, LDA, LDVL, LDVR, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      REAL               RWORK( * )
-      COMPLEX            A( LDA, * ), VL( LDVL, * ), VR( LDVR, * ),
-     $                   W( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGEEV computes for an N-by-N complex nonsymmetric matrix A, the
-*  eigenvalues and, optionally, the left and/or right eigenvectors.
-*
-*  The right eigenvector v(j) of A satisfies
-*                   A * v(j) = lambda(j) * v(j)
-*  where lambda(j) is its eigenvalue.
-*  The left eigenvector u(j) of A satisfies
-*                u(j)**H * A = lambda(j) * u(j)**H
-*  where u(j)**H denotes the conjugate transpose of u(j).
-*
-*  The computed eigenvectors are normalized to have Euclidean norm
-*  equal to 1 and largest component real.
-*
-*  Arguments
-*  =========
-*
-*  JOBVL   (input) CHARACTER*1
-*          = 'N': left eigenvectors of A are not computed;
-*          = 'V': left eigenvectors of are computed.
-*
-*  JOBVR   (input) CHARACTER*1
-*          = 'N': right eigenvectors of A are not computed;
-*          = 'V': right eigenvectors of A are computed.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A. N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the N-by-N matrix A.
-*          On exit, A has been overwritten.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  W       (output) COMPLEX array, dimension (N)
-*          W contains the computed eigenvalues.
-*
-*  VL      (output) COMPLEX array, dimension (LDVL,N)
-*          If JOBVL = 'V', the left eigenvectors u(j) are stored one
-*          after another in the columns of VL, in the same order
-*          as their eigenvalues.
-*          If JOBVL = 'N', VL is not referenced.
-*          u(j) = VL(:,j), the j-th column of VL.
-*
-*  LDVL    (input) INTEGER
-*          The leading dimension of the array VL.  LDVL >= 1; if
-*          JOBVL = 'V', LDVL >= N.
-*
-*  VR      (output) COMPLEX array, dimension (LDVR,N)
-*          If JOBVR = 'V', the right eigenvectors v(j) are stored one
-*          after another in the columns of VR, in the same order
-*          as their eigenvalues.
-*          If JOBVR = 'N', VR is not referenced.
-*          v(j) = VR(:,j), the j-th column of VR.
-*
-*  LDVR    (input) INTEGER
-*          The leading dimension of the array VR.  LDVR >= 1; if
-*          JOBVR = 'V', LDVR >= N.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,2*N).
-*          For good performance, LWORK must generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace) REAL array, dimension (2*N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if INFO = i, the QR algorithm failed to compute all the
-*                eigenvalues, and no eigenvectors have been computed;
-*                elements and i+1:N of W contain eigenvalues which have
-*                converged.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, SCALEA, WANTVL, WANTVR
-      CHARACTER          SIDE
-      INTEGER            HSWORK, I, IBAL, IERR, IHI, ILO, IRWORK, ITAU,
-     $                   IWRK, K, MAXWRK, MINWRK, NOUT
-      REAL               ANRM, BIGNUM, CSCALE, EPS, SCL, SMLNUM
-      COMPLEX            TMP
-*     ..
-*     .. Local Arrays ..
-      LOGICAL            SELECT( 1 )
-      REAL               DUM( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEBAK, CGEBAL, CGEHRD, CHSEQR, CLACPY, CLASCL,
-     $                   CSCAL, CSSCAL, CTREVC, CUNGHR, SLABAD, XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV, ISAMAX
-      REAL               CLANGE, SCNRM2, SLAMCH
-      EXTERNAL           LSAME, ILAENV, ISAMAX, CLANGE, SCNRM2, SLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          AIMAG, CMPLX, CONJG, MAX, REAL, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      WANTVL = LSAME( JOBVL, 'V' )
-      WANTVR = LSAME( JOBVR, 'V' )
-      IF( ( .NOT.WANTVL ) .AND. ( .NOT.LSAME( JOBVL, 'N' ) ) ) THEN
-         INFO = -1
-      ELSE IF( ( .NOT.WANTVR ) .AND. ( .NOT.LSAME( JOBVR, 'N' ) ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDVL.LT.1 .OR. ( WANTVL .AND. LDVL.LT.N ) ) THEN
-         INFO = -8
-      ELSE IF( LDVR.LT.1 .OR. ( WANTVR .AND. LDVR.LT.N ) ) THEN
-         INFO = -10
-      END IF
-
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of workspace needed at that point in the code,
-*       as well as the preferred amount for good performance.
-*       CWorkspace refers to complex workspace, and RWorkspace to real
-*       workspace. NB refers to the optimal block size for the
-*       immediately following subroutine, as returned by ILAENV.
-*       HSWORK refers to the workspace preferred by CHSEQR, as
-*       calculated below. HSWORK is computed assuming ILO=1 and IHI=N,
-*       the worst case.)
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( N.EQ.0 ) THEN
-            MINWRK = 1
-            MAXWRK = 1
-         ELSE
-            MAXWRK = N + N*ILAENV( 1, 'CGEHRD', ' ', N, 1, N, 0 )
-            MINWRK = 2*N
-            IF( WANTVL ) THEN
-               MAXWRK = MAX( MAXWRK, N + ( N - 1 )*ILAENV( 1, 'CUNGHR',
-     $                       ' ', N, 1, N, -1 ) )
-               CALL CHSEQR( 'S', 'V', N, 1, N, A, LDA, W, VL, LDVL,
-     $                WORK, -1, INFO )
-            ELSE IF( WANTVR ) THEN
-               MAXWRK = MAX( MAXWRK, N + ( N - 1 )*ILAENV( 1, 'CUNGHR',
-     $                       ' ', N, 1, N, -1 ) )
-               CALL CHSEQR( 'S', 'V', N, 1, N, A, LDA, W, VR, LDVR,
-     $                WORK, -1, INFO )
-            ELSE
-               CALL CHSEQR( 'E', 'N', N, 1, N, A, LDA, W, VR, LDVR,
-     $                WORK, -1, INFO )
-            END IF
-            HSWORK = WORK( 1 )
-            MAXWRK = MAX( MAXWRK, HSWORK, MINWRK )
-         END IF
-         WORK( 1 ) = MAXWRK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
-            INFO = -12
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGEEV ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Get machine constants
-*
-      EPS = SLAMCH( 'P' )
-      SMLNUM = SLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SQRT( SMLNUM ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = CLANGE( 'M', N, N, A, LDA, DUM )
-      SCALEA = .FALSE.
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-         SCALEA = .TRUE.
-         CSCALE = SMLNUM
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-         SCALEA = .TRUE.
-         CSCALE = BIGNUM
-      END IF
-      IF( SCALEA )
-     $   CALL CLASCL( 'G', 0, 0, ANRM, CSCALE, N, N, A, LDA, IERR )
-*
-*     Balance the matrix
-*     (CWorkspace: none)
-*     (RWorkspace: need N)
-*
-      IBAL = 1
-      CALL CGEBAL( 'B', N, A, LDA, ILO, IHI, RWORK( IBAL ), IERR )
-*
-*     Reduce to upper Hessenberg form
-*     (CWorkspace: need 2*N, prefer N+N*NB)
-*     (RWorkspace: none)
-*
-      ITAU = 1
-      IWRK = ITAU + N
-      CALL CGEHRD( N, ILO, IHI, A, LDA, WORK( ITAU ), WORK( IWRK ),
-     $             LWORK-IWRK+1, IERR )
-*
-      IF( WANTVL ) THEN
-*
-*        Want left eigenvectors
-*        Copy Householder vectors to VL
-*
-         SIDE = 'L'
-         CALL CLACPY( 'L', N, N, A, LDA, VL, LDVL )
-*
-*        Generate unitary matrix in VL
-*        (CWorkspace: need 2*N-1, prefer N+(N-1)*NB)
-*        (RWorkspace: none)
-*
-         CALL CUNGHR( N, ILO, IHI, VL, LDVL, WORK( ITAU ), WORK( IWRK ),
-     $                LWORK-IWRK+1, IERR )
-*
-*        Perform QR iteration, accumulating Schur vectors in VL
-*        (CWorkspace: need 1, prefer HSWORK (see comments) )
-*        (RWorkspace: none)
-*
-         IWRK = ITAU
-         CALL CHSEQR( 'S', 'V', N, ILO, IHI, A, LDA, W, VL, LDVL,
-     $                WORK( IWRK ), LWORK-IWRK+1, INFO )
-*
-         IF( WANTVR ) THEN
-*
-*           Want left and right eigenvectors
-*           Copy Schur vectors to VR
-*
-            SIDE = 'B'
-            CALL CLACPY( 'F', N, N, VL, LDVL, VR, LDVR )
-         END IF
-*
-      ELSE IF( WANTVR ) THEN
-*
-*        Want right eigenvectors
-*        Copy Householder vectors to VR
-*
-         SIDE = 'R'
-         CALL CLACPY( 'L', N, N, A, LDA, VR, LDVR )
-*
-*        Generate unitary matrix in VR
-*        (CWorkspace: need 2*N-1, prefer N+(N-1)*NB)
-*        (RWorkspace: none)
-*
-         CALL CUNGHR( N, ILO, IHI, VR, LDVR, WORK( ITAU ), WORK( IWRK ),
-     $                LWORK-IWRK+1, IERR )
-*
-*        Perform QR iteration, accumulating Schur vectors in VR
-*        (CWorkspace: need 1, prefer HSWORK (see comments) )
-*        (RWorkspace: none)
-*
-         IWRK = ITAU
-         CALL CHSEQR( 'S', 'V', N, ILO, IHI, A, LDA, W, VR, LDVR,
-     $                WORK( IWRK ), LWORK-IWRK+1, INFO )
-*
-      ELSE
-*
-*        Compute eigenvalues only
-*        (CWorkspace: need 1, prefer HSWORK (see comments) )
-*        (RWorkspace: none)
-*
-         IWRK = ITAU
-         CALL CHSEQR( 'E', 'N', N, ILO, IHI, A, LDA, W, VR, LDVR,
-     $                WORK( IWRK ), LWORK-IWRK+1, INFO )
-      END IF
-*
-*     If INFO > 0 from CHSEQR, then quit
-*
-      IF( INFO.GT.0 )
-     $   GO TO 50
-*
-      IF( WANTVL .OR. WANTVR ) THEN
-*
-*        Compute left and/or right eigenvectors
-*        (CWorkspace: need 2*N)
-*        (RWorkspace: need 2*N)
-*
-         IRWORK = IBAL + N
-         CALL CTREVC( SIDE, 'B', SELECT, N, A, LDA, VL, LDVL, VR, LDVR,
-     $                N, NOUT, WORK( IWRK ), RWORK( IRWORK ), IERR )
-      END IF
-*
-      IF( WANTVL ) THEN
-*
-*        Undo balancing of left eigenvectors
-*        (CWorkspace: none)
-*        (RWorkspace: need N)
-*
-         CALL CGEBAK( 'B', 'L', N, ILO, IHI, RWORK( IBAL ), N, VL, LDVL,
-     $                IERR )
-*
-*        Normalize left eigenvectors and make largest component real
-*
-         DO 20 I = 1, N
-            SCL = ONE / SCNRM2( N, VL( 1, I ), 1 )
-            CALL CSSCAL( N, SCL, VL( 1, I ), 1 )
-            DO 10 K = 1, N
-               RWORK( IRWORK+K-1 ) = REAL( VL( K, I ) )**2 +
-     $                               AIMAG( VL( K, I ) )**2
-   10       CONTINUE
-            K = ISAMAX( N, RWORK( IRWORK ), 1 )
-            TMP = CONJG( VL( K, I ) ) / SQRT( RWORK( IRWORK+K-1 ) )
-            CALL CSCAL( N, TMP, VL( 1, I ), 1 )
-            VL( K, I ) = CMPLX( REAL( VL( K, I ) ), ZERO )
-   20    CONTINUE
-      END IF
-*
-      IF( WANTVR ) THEN
-*
-*        Undo balancing of right eigenvectors
-*        (CWorkspace: none)
-*        (RWorkspace: need N)
-*
-         CALL CGEBAK( 'B', 'R', N, ILO, IHI, RWORK( IBAL ), N, VR, LDVR,
-     $                IERR )
-*
-*        Normalize right eigenvectors and make largest component real
-*
-         DO 40 I = 1, N
-            SCL = ONE / SCNRM2( N, VR( 1, I ), 1 )
-            CALL CSSCAL( N, SCL, VR( 1, I ), 1 )
-            DO 30 K = 1, N
-               RWORK( IRWORK+K-1 ) = REAL( VR( K, I ) )**2 +
-     $                               AIMAG( VR( K, I ) )**2
-   30       CONTINUE
-            K = ISAMAX( N, RWORK( IRWORK ), 1 )
-            TMP = CONJG( VR( K, I ) ) / SQRT( RWORK( IRWORK+K-1 ) )
-            CALL CSCAL( N, TMP, VR( 1, I ), 1 )
-            VR( K, I ) = CMPLX( REAL( VR( K, I ) ), ZERO )
-   40    CONTINUE
-      END IF
-*
-*     Undo scaling if necessary
-*
-   50 CONTINUE
-      IF( SCALEA ) THEN
-         CALL CLASCL( 'G', 0, 0, CSCALE, ANRM, N-INFO, 1, W( INFO+1 ),
-     $                MAX( N-INFO, 1 ), IERR )
-         IF( INFO.GT.0 ) THEN
-            CALL CLASCL( 'G', 0, 0, CSCALE, ANRM, ILO-1, 1, W, N, IERR )
-         END IF
-      END IF
-*
-      WORK( 1 ) = MAXWRK
-      RETURN
-*
-*     End of CGEEV
-*
-      END
--- a/libcruft/lapack/cgehd2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-      SUBROUTINE CGEHD2( N, ILO, IHI, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, ILO, INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGEHD2 reduces a complex general matrix A to upper Hessenberg form H
-*  by a unitary similarity transformation:  Q' * A * Q = H .
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          It is assumed that A is already upper triangular in rows
-*          and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally
-*          set by a previous call to CGEBAL; otherwise they should be
-*          set to 1 and N respectively. See Further Details.
-*          1 <= ILO <= IHI <= max(1,N).
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the n by n general matrix to be reduced.
-*          On exit, the upper triangle and the first subdiagonal of A
-*          are overwritten with the upper Hessenberg matrix H, and the
-*          elements below the first subdiagonal, with the array TAU,
-*          represent the unitary matrix Q as a product of elementary
-*          reflectors. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  TAU     (output) COMPLEX array, dimension (N-1)
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace) COMPLEX array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of (ihi-ilo) elementary
-*  reflectors
-*
-*     Q = H(ilo) H(ilo+1) . . . H(ihi-1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i) = 0, v(i+1) = 1 and v(ihi+1:n) = 0; v(i+2:ihi) is stored on
-*  exit in A(i+2:ihi,i), and tau in TAU(i).
-*
-*  The contents of A are illustrated by the following example, with
-*  n = 7, ilo = 2 and ihi = 6:
-*
-*  on entry,                        on exit,
-*
-*  ( a   a   a   a   a   a   a )    (  a   a   h   h   h   h   a )
-*  (     a   a   a   a   a   a )    (      a   h   h   h   h   a )
-*  (     a   a   a   a   a   a )    (      h   h   h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  h   h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  v3  h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  v3  v4  h   h   h )
-*  (                         a )    (                          a )
-*
-*  where a denotes an element of the original matrix A, h denotes a
-*  modified element of the upper Hessenberg matrix H, and vi denotes an
-*  element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      COMPLEX            ALPHA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLARF, CLARFG, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CONJG, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -2
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGEHD2', -INFO )
-         RETURN
-      END IF
-*
-      DO 10 I = ILO, IHI - 1
-*
-*        Compute elementary reflector H(i) to annihilate A(i+2:ihi,i)
-*
-         ALPHA = A( I+1, I )
-         CALL CLARFG( IHI-I, ALPHA, A( MIN( I+2, N ), I ), 1, TAU( I ) )
-         A( I+1, I ) = ONE
-*
-*        Apply H(i) to A(1:ihi,i+1:ihi) from the right
-*
-         CALL CLARF( 'Right', IHI, IHI-I, A( I+1, I ), 1, TAU( I ),
-     $               A( 1, I+1 ), LDA, WORK )
-*
-*        Apply H(i)' to A(i+1:ihi,i+1:n) from the left
-*
-         CALL CLARF( 'Left', IHI-I, N-I, A( I+1, I ), 1,
-     $               CONJG( TAU( I ) ), A( I+1, I+1 ), LDA, WORK )
-*
-         A( I+1, I ) = ALPHA
-   10 CONTINUE
-*
-      RETURN
-*
-*     End of CGEHD2
-*
-      END
--- a/libcruft/lapack/cgehrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,273 +0,0 @@
-      SUBROUTINE CGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, ILO, INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGEHRD reduces a complex general matrix A to upper Hessenberg form H by
-*  an unitary similarity transformation:  Q' * A * Q = H .
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          It is assumed that A is already upper triangular in rows
-*          and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally
-*          set by a previous call to CGEBAL; otherwise they should be
-*          set to 1 and N respectively. See Further Details.
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the N-by-N general matrix to be reduced.
-*          On exit, the upper triangle and the first subdiagonal of A
-*          are overwritten with the upper Hessenberg matrix H, and the
-*          elements below the first subdiagonal, with the array TAU,
-*          represent the unitary matrix Q as a product of elementary
-*          reflectors. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  TAU     (output) COMPLEX array, dimension (N-1)
-*          The scalar factors of the elementary reflectors (see Further
-*          Details). Elements 1:ILO-1 and IHI:N-1 of TAU are set to
-*          zero.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (LWORK)
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The length of the array WORK.  LWORK >= max(1,N).
-*          For optimum performance LWORK >= N*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of (ihi-ilo) elementary
-*  reflectors
-*
-*     Q = H(ilo) H(ilo+1) . . . H(ihi-1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i) = 0, v(i+1) = 1 and v(ihi+1:n) = 0; v(i+2:ihi) is stored on
-*  exit in A(i+2:ihi,i), and tau in TAU(i).
-*
-*  The contents of A are illustrated by the following example, with
-*  n = 7, ilo = 2 and ihi = 6:
-*
-*  on entry,                        on exit,
-*
-*  ( a   a   a   a   a   a   a )    (  a   a   h   h   h   h   a )
-*  (     a   a   a   a   a   a )    (      a   h   h   h   h   a )
-*  (     a   a   a   a   a   a )    (      h   h   h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  h   h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  v3  h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  v3  v4  h   h   h )
-*  (                         a )    (                          a )
-*
-*  where a denotes an element of the original matrix A, h denotes a
-*  modified element of the upper Hessenberg matrix H, and vi denotes an
-*  element of the vector defining H(i).
-*
-*  This file is a slight modification of LAPACK-3.0's CGEHRD
-*  subroutine incorporating improvements proposed by Quintana-Orti and
-*  Van de Geijn (2005). 
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            NBMAX, LDT
-      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1 )
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ), 
-     $                     ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, J, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NH, NX
-      COMPLEX            EI
-*     ..
-*     .. Local Arrays ..
-      COMPLEX            T( LDT, NBMAX )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CAXPY, CGEHD2, CGEMM, CLAHR2, CLARFB, CTRMM,
-     $                   XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      NB = MIN( NBMAX, ILAENV( 1, 'CGEHRD', ' ', N, ILO, IHI, -1 ) )
-      LWKOPT = N*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -2
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGEHRD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Set elements 1:ILO-1 and IHI:N-1 of TAU to zero
-*
-      DO 10 I = 1, ILO - 1
-         TAU( I ) = ZERO
-   10 CONTINUE
-      DO 20 I = MAX( 1, IHI ), N - 1
-         TAU( I ) = ZERO
-   20 CONTINUE
-*
-*     Quick return if possible
-*
-      NH = IHI - ILO + 1
-      IF( NH.LE.1 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-*     Determine the block size
-*
-      NB = MIN( NBMAX, ILAENV( 1, 'CGEHRD', ' ', N, ILO, IHI, -1 ) )
-      NBMIN = 2
-      IWS = 1
-      IF( NB.GT.1 .AND. NB.LT.NH ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code
-*        (last block is always handled by unblocked code)
-*
-         NX = MAX( NB, ILAENV( 3, 'CGEHRD', ' ', N, ILO, IHI, -1 ) )
-         IF( NX.LT.NH ) THEN
-*
-*           Determine if workspace is large enough for blocked code
-*
-            IWS = N*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  determine the
-*              minimum value of NB, and reduce NB or force use of
-*              unblocked code
-*
-               NBMIN = MAX( 2, ILAENV( 2, 'CGEHRD', ' ', N, ILO, IHI,
-     $                 -1 ) )
-               IF( LWORK.GE.N*NBMIN ) THEN
-                  NB = LWORK / N
-               ELSE
-                  NB = 1
-               END IF
-            END IF
-         END IF
-      END IF
-      LDWORK = N
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.NH ) THEN
-*
-*        Use unblocked code below
-*
-         I = ILO
-*
-      ELSE
-*
-*        Use blocked code
-*
-         DO 40 I = ILO, IHI - 1 - NX, NB
-            IB = MIN( NB, IHI-I )
-*
-*           Reduce columns i:i+ib-1 to Hessenberg form, returning the
-*           matrices V and T of the block reflector H = I - V*T*V'
-*           which performs the reduction, and also the matrix Y = A*V*T
-*
-            CALL CLAHR2( IHI, I, IB, A( 1, I ), LDA, TAU( I ), T, LDT,
-     $                   WORK, LDWORK )
-*
-*           Apply the block reflector H to A(1:ihi,i+ib:ihi) from the
-*           right, computing  A := A - Y * V'. V(i+ib,ib-1) must be set
-*           to 1
-*
-            EI = A( I+IB, I+IB-1 )
-            A( I+IB, I+IB-1 ) = ONE
-            CALL CGEMM( 'No transpose', 'Conjugate transpose', 
-     $                  IHI, IHI-I-IB+1,
-     $                  IB, -ONE, WORK, LDWORK, A( I+IB, I ), LDA, ONE,
-     $                  A( 1, I+IB ), LDA )
-            A( I+IB, I+IB-1 ) = EI
-*
-*           Apply the block reflector H to A(1:i,i+1:i+ib-1) from the
-*           right
-*
-            CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose',
-     $                  'Unit', I, IB-1,
-     $                  ONE, A( I+1, I ), LDA, WORK, LDWORK )
-            DO 30 J = 0, IB-2
-               CALL CAXPY( I, -ONE, WORK( LDWORK*J+1 ), 1,
-     $                     A( 1, I+J+1 ), 1 )
-   30       CONTINUE
-*
-*           Apply the block reflector H to A(i+1:ihi,i+ib:n) from the
-*           left
-*
-            CALL CLARFB( 'Left', 'Conjugate transpose', 'Forward',
-     $                   'Columnwise',
-     $                   IHI-I, N-I-IB+1, IB, A( I+1, I ), LDA, T, LDT,
-     $                   A( I+1, I+IB ), LDA, WORK, LDWORK )
-   40    CONTINUE
-      END IF
-*
-*     Use unblocked code to reduce the rest of the matrix
-*
-      CALL CGEHD2( N, I, IHI, A, LDA, TAU, WORK, IINFO )
-      WORK( 1 ) = IWS
-*
-      RETURN
-*
-*     End of CGEHRD
-*
-      END
--- a/libcruft/lapack/cgelq2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,123 +0,0 @@
-      SUBROUTINE CGELQ2( M, N, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGELQ2 computes an LQ factorization of a complex m by n matrix A:
-*  A = L * Q.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the m by n matrix A.
-*          On exit, the elements on and below the diagonal of the array
-*          contain the m by min(m,n) lower trapezoidal matrix L (L is
-*          lower triangular if m <= n); the elements above the diagonal,
-*          with the array TAU, represent the unitary matrix Q as a
-*          product of elementary reflectors (see Further Details).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) COMPLEX array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace) COMPLEX array, dimension (M)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(k)' . . . H(2)' H(1)', where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i-1) = 0 and v(i) = 1; conjg(v(i+1:n)) is stored on exit in
-*  A(i,i+1:n), and tau in TAU(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, K
-      COMPLEX            ALPHA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLACGV, CLARF, CLARFG, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGELQ2', -INFO )
-         RETURN
-      END IF
-*
-      K = MIN( M, N )
-*
-      DO 10 I = 1, K
-*
-*        Generate elementary reflector H(i) to annihilate A(i,i+1:n)
-*
-         CALL CLACGV( N-I+1, A( I, I ), LDA )
-         ALPHA = A( I, I )
-         CALL CLARFG( N-I+1, ALPHA, A( I, MIN( I+1, N ) ), LDA,
-     $                TAU( I ) )
-         IF( I.LT.M ) THEN
-*
-*           Apply H(i) to A(i+1:m,i:n) from the right
-*
-            A( I, I ) = ONE
-            CALL CLARF( 'Right', M-I, N-I+1, A( I, I ), LDA, TAU( I ),
-     $                  A( I+1, I ), LDA, WORK )
-         END IF
-         A( I, I ) = ALPHA
-         CALL CLACGV( N-I+1, A( I, I ), LDA )
-   10 CONTINUE
-      RETURN
-*
-*     End of CGELQ2
-*
-      END
--- a/libcruft/lapack/cgelqf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,195 +0,0 @@
-      SUBROUTINE CGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGELQF computes an LQ factorization of a complex M-by-N matrix A:
-*  A = L * Q.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the elements on and below the diagonal of the array
-*          contain the m-by-min(m,n) lower trapezoidal matrix L (L is
-*          lower triangular if m <= n); the elements above the diagonal,
-*          with the array TAU, represent the unitary matrix Q as a
-*          product of elementary reflectors (see Further Details).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) COMPLEX array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,M).
-*          For optimum performance LWORK >= M*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(k)' . . . H(2)' H(1)', where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i-1) = 0 and v(i) = 1; conjg(v(i+1:n)) is stored on exit in
-*  A(i,i+1:n), and tau in TAU(i).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, K, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGELQ2, CLARFB, CLARFT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NB = ILAENV( 1, 'CGELQF', ' ', M, N, -1, -1 )
-      LWKOPT = M*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGELQF', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      K = MIN( M, N )
-      IF( K.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = M
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'CGELQF', ' ', M, N, -1, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = M
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'CGELQF', ' ', M, N, -1,
-     $                 -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code initially
-*
-         DO 10 I = 1, K - NX, NB
-            IB = MIN( K-I+1, NB )
-*
-*           Compute the LQ factorization of the current block
-*           A(i:i+ib-1,i:n)
-*
-            CALL CGELQ2( IB, N-I+1, A( I, I ), LDA, TAU( I ), WORK,
-     $                   IINFO )
-            IF( I+IB.LE.M ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i) H(i+1) . . . H(i+ib-1)
-*
-               CALL CLARFT( 'Forward', 'Rowwise', N-I+1, IB, A( I, I ),
-     $                      LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H to A(i+ib:m,i:n) from the right
-*
-               CALL CLARFB( 'Right', 'No transpose', 'Forward',
-     $                      'Rowwise', M-I-IB+1, N-I+1, IB, A( I, I ),
-     $                      LDA, WORK, LDWORK, A( I+IB, I ), LDA,
-     $                      WORK( IB+1 ), LDWORK )
-            END IF
-   10    CONTINUE
-      ELSE
-         I = 1
-      END IF
-*
-*     Use unblocked code to factor the last or only block.
-*
-      IF( I.LE.K )
-     $   CALL CGELQ2( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK,
-     $                IINFO )
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of CGELQF
-*
-      END
--- a/libcruft/lapack/cgelsd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,567 +0,0 @@
-      SUBROUTINE CGELSD( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK,
-     $                   WORK, LWORK, RWORK, IWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LDB, LWORK, M, N, NRHS, RANK
-      REAL               RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      REAL               RWORK( * ), S( * )
-      COMPLEX            A( LDA, * ), B( LDB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGELSD computes the minimum-norm solution to a real linear least
-*  squares problem:
-*      minimize 2-norm(| b - A*x |)
-*  using the singular value decomposition (SVD) of A. A is an M-by-N
-*  matrix which may be rank-deficient.
-*
-*  Several right hand side vectors b and solution vectors x can be
-*  handled in a single call; they are stored as the columns of the
-*  M-by-NRHS right hand side matrix B and the N-by-NRHS solution
-*  matrix X.
-*
-*  The problem is solved in three steps:
-*  (1) Reduce the coefficient matrix A to bidiagonal form with
-*      Householder tranformations, reducing the original problem
-*      into a "bidiagonal least squares problem" (BLS)
-*  (2) Solve the BLS using a divide and conquer approach.
-*  (3) Apply back all the Householder tranformations to solve
-*      the original least squares problem.
-*
-*  The effective rank of A is determined by treating as zero those
-*  singular values which are less than RCOND times the largest singular
-*  value.
-*
-*  The divide and conquer algorithm makes very mild assumptions about
-*  floating point arithmetic. It will work on machines with a guard
-*  digit in add/subtract, or on those binary machines without guard
-*  digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or
-*  Cray-2. It could conceivably fail on hexadecimal or decimal machines
-*  without guard digits, but we know of none.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrices B and X. NRHS >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, A has been destroyed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  B       (input/output) COMPLEX array, dimension (LDB,NRHS)
-*          On entry, the M-by-NRHS right hand side matrix B.
-*          On exit, B is overwritten by the N-by-NRHS solution matrix X.
-*          If m >= n and RANK = n, the residual sum-of-squares for
-*          the solution in the i-th column is given by the sum of
-*          squares of the modulus of elements n+1:m in that column.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,M,N).
-*
-*  S       (output) REAL array, dimension (min(M,N))
-*          The singular values of A in decreasing order.
-*          The condition number of A in the 2-norm = S(1)/S(min(m,n)).
-*
-*  RCOND   (input) REAL
-*          RCOND is used to determine the effective rank of A.
-*          Singular values S(i) <= RCOND*S(1) are treated as zero.
-*          If RCOND < 0, machine precision is used instead.
-*
-*  RANK    (output) INTEGER
-*          The effective rank of A, i.e., the number of singular values
-*          which are greater than RCOND*S(1).
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK must be at least 1.
-*          The exact minimum amount of workspace needed depends on M,
-*          N and NRHS. As long as LWORK is at least
-*              2 * N + N * NRHS
-*          if M is greater than or equal to N or
-*              2 * M + M * NRHS
-*          if M is less than N, the code will execute correctly.
-*          For good performance, LWORK should generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the array WORK and the
-*          minimum sizes of the arrays RWORK and IWORK, and returns
-*          these values as the first entries of the WORK, RWORK and
-*          IWORK arrays, and no error message related to LWORK is issued
-*          by XERBLA.
-*
-*  RWORK   (workspace) REAL array, dimension (MAX(1,LRWORK))
-*          LRWORK >=
-*             10*N + 2*N*SMLSIZ + 8*N*NLVL + 3*SMLSIZ*NRHS +
-*             (SMLSIZ+1)**2
-*          if M is greater than or equal to N or
-*             10*M + 2*M*SMLSIZ + 8*M*NLVL + 3*SMLSIZ*NRHS +
-*             (SMLSIZ+1)**2
-*          if M is less than N, the code will execute correctly.
-*          SMLSIZ is returned by ILAENV and is equal to the maximum
-*          size of the subproblems at the bottom of the computation
-*          tree (usually about 25), and
-*             NLVL = MAX( 0, INT( LOG_2( MIN( M,N )/(SMLSIZ+1) ) ) + 1 )
-*          On exit, if INFO = 0, RWORK(1) returns the minimum LRWORK.
-*
-*  IWORK   (workspace) INTEGER array, dimension (MAX(1,LIWORK))
-*          LIWORK >= max(1, 3*MINMN*NLVL + 11*MINMN),
-*          where MINMN = MIN( M,N ).
-*          On exit, if INFO = 0, IWORK(1) returns the minimum LIWORK.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  the algorithm for computing the SVD failed to converge;
-*                if INFO = i, i off-diagonal elements of an intermediate
-*                bidiagonal form did not converge to zero.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Ren-Cang Li, Computer Science Division, University of
-*       California at Berkeley, USA
-*     Osni Marques, LBNL/NERSC, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0, TWO = 2.0E+0 )
-      COMPLEX            CZERO
-      PARAMETER          ( CZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            IASCL, IBSCL, IE, IL, ITAU, ITAUP, ITAUQ,
-     $                   LDWORK, LIWORK, LRWORK, MAXMN, MAXWRK, MINMN,
-     $                   MINWRK, MM, MNTHR, NLVL, NRWORK, NWORK, SMLSIZ
-      REAL               ANRM, BIGNUM, BNRM, EPS, SFMIN, SMLNUM
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEBRD, CGELQF, CGEQRF, CLACPY,
-     $                   CLALSD, CLASCL, CLASET, CUNMBR,
-     $                   CUNMLQ, CUNMQR, SLABAD, SLASCL,
-     $                   SLASET, XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      REAL               CLANGE, SLAMCH
-      EXTERNAL           CLANGE, SLAMCH, ILAENV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          INT, LOG, MAX, MIN, REAL
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments.
-*
-      INFO = 0
-      MINMN = MIN( M, N )
-      MAXMN = MAX( M, N )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, MAXMN ) ) THEN
-         INFO = -7
-      END IF
-*
-*     Compute workspace.
-*     (Note: Comments in the code beginning "Workspace:" describe the
-*     minimal amount of workspace needed at that point in the code,
-*     as well as the preferred amount for good performance.
-*     NB refers to the optimal block size for the immediately
-*     following subroutine, as returned by ILAENV.)
-*
-      IF( INFO.EQ.0 ) THEN
-         MINWRK = 1
-         MAXWRK = 1
-         LIWORK = 1
-         LRWORK = 1
-         IF( MINMN.GT.0 ) THEN
-            SMLSIZ = ILAENV( 9, 'CGELSD', ' ', 0, 0, 0, 0 )
-            MNTHR = ILAENV( 6, 'CGELSD', ' ', M, N, NRHS, -1 )
-            NLVL = MAX( INT( LOG( REAL( MINMN ) / REAL( SMLSIZ + 1 ) ) /
-     $                  LOG( TWO ) ) + 1, 0 )
-            LIWORK = 3*MINMN*NLVL + 11*MINMN
-            MM = M
-            IF( M.GE.N .AND. M.GE.MNTHR ) THEN
-*
-*              Path 1a - overdetermined, with many more rows than
-*                        columns.
-*
-               MM = N
-               MAXWRK = MAX( MAXWRK, N*ILAENV( 1, 'CGEQRF', ' ', M, N,
-     $                       -1, -1 ) )
-               MAXWRK = MAX( MAXWRK, NRHS*ILAENV( 1, 'CUNMQR', 'LC', M,
-     $                       NRHS, N, -1 ) )
-            END IF
-            IF( M.GE.N ) THEN
-*
-*              Path 1 - overdetermined or exactly determined.
-*
-               LRWORK = 10*N + 2*N*SMLSIZ + 8*N*NLVL + 3*SMLSIZ*NRHS +
-     $                  ( SMLSIZ + 1 )**2
-               MAXWRK = MAX( MAXWRK, 2*N + ( MM + N )*ILAENV( 1,
-     $                       'CGEBRD', ' ', MM, N, -1, -1 ) )
-               MAXWRK = MAX( MAXWRK, 2*N + NRHS*ILAENV( 1, 'CUNMBR',
-     $                       'QLC', MM, NRHS, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, 2*N + ( N - 1 )*ILAENV( 1,
-     $                       'CUNMBR', 'PLN', N, NRHS, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, 2*N + N*NRHS )
-               MINWRK = MAX( 2*N + MM, 2*N + N*NRHS )
-            END IF
-            IF( N.GT.M ) THEN
-               LRWORK = 10*M + 2*M*SMLSIZ + 8*M*NLVL + 3*SMLSIZ*NRHS +
-     $                  ( SMLSIZ + 1 )**2
-               IF( N.GE.MNTHR ) THEN
-*
-*                 Path 2a - underdetermined, with many more columns
-*                           than rows.
-*
-                  MAXWRK = M + M*ILAENV( 1, 'CGELQF', ' ', M, N, -1,
-     $                     -1 )
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M + 2*M*ILAENV( 1,
-     $                          'CGEBRD', ' ', M, M, -1, -1 ) )
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M + NRHS*ILAENV( 1,
-     $                          'CUNMBR', 'QLC', M, NRHS, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M + ( M - 1 )*ILAENV( 1,
-     $                          'CUNMLQ', 'LC', N, NRHS, M, -1 ) )
-                  IF( NRHS.GT.1 ) THEN
-                     MAXWRK = MAX( MAXWRK, M*M + M + M*NRHS )
-                  ELSE
-                     MAXWRK = MAX( MAXWRK, M*M + 2*M )
-                  END IF
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M + M*NRHS )
-               ELSE
-*
-*                 Path 2 - underdetermined.
-*
-                  MAXWRK = 2*M + ( N + M )*ILAENV( 1, 'CGEBRD', ' ', M,
-     $                     N, -1, -1 )
-                  MAXWRK = MAX( MAXWRK, 2*M + NRHS*ILAENV( 1, 'CUNMBR',
-     $                          'QLC', M, NRHS, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, 2*M + M*ILAENV( 1, 'CUNMBR',
-     $                          'PLN', N, NRHS, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, 2*M + M*NRHS )
-               END IF
-               MINWRK = MAX( 2*M + N, 2*M + M*NRHS )
-            END IF
-         END IF
-         MINWRK = MIN( MINWRK, MAXWRK )
-         WORK( 1 ) = MAXWRK
-         IWORK( 1 ) = LIWORK
-         RWORK( 1 ) = LRWORK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
-            INFO = -12
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGELSD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         RANK = 0
-         RETURN
-      END IF
-*
-*     Get machine parameters.
-*
-      EPS = SLAMCH( 'P' )
-      SFMIN = SLAMCH( 'S' )
-      SMLNUM = SFMIN / EPS
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-*
-*     Scale A if max entry outside range [SMLNUM,BIGNUM].
-*
-      ANRM = CLANGE( 'M', M, N, A, LDA, RWORK )
-      IASCL = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL CLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO )
-         IASCL = 1
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM.
-*
-         CALL CLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO )
-         IASCL = 2
-      ELSE IF( ANRM.EQ.ZERO ) THEN
-*
-*        Matrix all zero. Return zero solution.
-*
-         CALL CLASET( 'F', MAX( M, N ), NRHS, CZERO, CZERO, B, LDB )
-         CALL SLASET( 'F', MINMN, 1, ZERO, ZERO, S, 1 )
-         RANK = 0
-         GO TO 10
-      END IF
-*
-*     Scale B if max entry outside range [SMLNUM,BIGNUM].
-*
-      BNRM = CLANGE( 'M', M, NRHS, B, LDB, RWORK )
-      IBSCL = 0
-      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM.
-*
-         CALL CLASCL( 'G', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 1
-      ELSE IF( BNRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM.
-*
-         CALL CLASCL( 'G', 0, 0, BNRM, BIGNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 2
-      END IF
-*
-*     If M < N make sure B(M+1:N,:) = 0
-*
-      IF( M.LT.N )
-     $   CALL CLASET( 'F', N-M, NRHS, CZERO, CZERO, B( M+1, 1 ), LDB )
-*
-*     Overdetermined case.
-*
-      IF( M.GE.N ) THEN
-*
-*        Path 1 - overdetermined or exactly determined.
-*
-         MM = M
-         IF( M.GE.MNTHR ) THEN
-*
-*           Path 1a - overdetermined, with many more rows than columns
-*
-            MM = N
-            ITAU = 1
-            NWORK = ITAU + N
-*
-*           Compute A=Q*R.
-*           (RWorkspace: need N)
-*           (CWorkspace: need N, prefer N*NB)
-*
-            CALL CGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
-     $                   LWORK-NWORK+1, INFO )
-*
-*           Multiply B by transpose(Q).
-*           (RWorkspace: need N)
-*           (CWorkspace: need NRHS, prefer NRHS*NB)
-*
-            CALL CUNMQR( 'L', 'C', M, NRHS, N, A, LDA, WORK( ITAU ), B,
-     $                   LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-*           Zero out below R.
-*
-            IF( N.GT.1 ) THEN
-               CALL CLASET( 'L', N-1, N-1, CZERO, CZERO, A( 2, 1 ),
-     $                      LDA )
-            END IF
-         END IF
-*
-         ITAUQ = 1
-         ITAUP = ITAUQ + N
-         NWORK = ITAUP + N
-         IE = 1
-         NRWORK = IE + N
-*
-*        Bidiagonalize R in A.
-*        (RWorkspace: need N)
-*        (CWorkspace: need 2*N+MM, prefer 2*N+(MM+N)*NB)
-*
-         CALL CGEBRD( MM, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
-     $                WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
-     $                INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors of R.
-*        (CWorkspace: need 2*N+NRHS, prefer 2*N+NRHS*NB)
-*
-         CALL CUNMBR( 'Q', 'L', 'C', MM, NRHS, N, A, LDA, WORK( ITAUQ ),
-     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-*        Solve the bidiagonal least squares problem.
-*
-         CALL CLALSD( 'U', SMLSIZ, N, NRHS, S, RWORK( IE ), B, LDB,
-     $                RCOND, RANK, WORK( NWORK ), RWORK( NRWORK ),
-     $                IWORK, INFO )
-         IF( INFO.NE.0 ) THEN
-            GO TO 10
-         END IF
-*
-*        Multiply B by right bidiagonalizing vectors of R.
-*
-         CALL CUNMBR( 'P', 'L', 'N', N, NRHS, N, A, LDA, WORK( ITAUP ),
-     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-      ELSE IF( N.GE.MNTHR .AND. LWORK.GE.4*M+M*M+
-     $         MAX( M, 2*M-4, NRHS, N-3*M ) ) THEN
-*
-*        Path 2a - underdetermined, with many more columns than rows
-*        and sufficient workspace for an efficient algorithm.
-*
-         LDWORK = M
-         IF( LWORK.GE.MAX( 4*M+M*LDA+MAX( M, 2*M-4, NRHS, N-3*M ),
-     $       M*LDA+M+M*NRHS ) )LDWORK = LDA
-         ITAU = 1
-         NWORK = M + 1
-*
-*        Compute A=L*Q.
-*        (CWorkspace: need 2*M, prefer M+M*NB)
-*
-         CALL CGELQF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
-     $                LWORK-NWORK+1, INFO )
-         IL = NWORK
-*
-*        Copy L to WORK(IL), zeroing out above its diagonal.
-*
-         CALL CLACPY( 'L', M, M, A, LDA, WORK( IL ), LDWORK )
-         CALL CLASET( 'U', M-1, M-1, CZERO, CZERO, WORK( IL+LDWORK ),
-     $                LDWORK )
-         ITAUQ = IL + LDWORK*M
-         ITAUP = ITAUQ + M
-         NWORK = ITAUP + M
-         IE = 1
-         NRWORK = IE + M
-*
-*        Bidiagonalize L in WORK(IL).
-*        (RWorkspace: need M)
-*        (CWorkspace: need M*M+4*M, prefer M*M+4*M+2*M*NB)
-*
-         CALL CGEBRD( M, M, WORK( IL ), LDWORK, S, RWORK( IE ),
-     $                WORK( ITAUQ ), WORK( ITAUP ), WORK( NWORK ),
-     $                LWORK-NWORK+1, INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors of L.
-*        (CWorkspace: need M*M+4*M+NRHS, prefer M*M+4*M+NRHS*NB)
-*
-         CALL CUNMBR( 'Q', 'L', 'C', M, NRHS, M, WORK( IL ), LDWORK,
-     $                WORK( ITAUQ ), B, LDB, WORK( NWORK ),
-     $                LWORK-NWORK+1, INFO )
-*
-*        Solve the bidiagonal least squares problem.
-*
-         CALL CLALSD( 'U', SMLSIZ, M, NRHS, S, RWORK( IE ), B, LDB,
-     $                RCOND, RANK, WORK( NWORK ), RWORK( NRWORK ),
-     $                IWORK, INFO )
-         IF( INFO.NE.0 ) THEN
-            GO TO 10
-         END IF
-*
-*        Multiply B by right bidiagonalizing vectors of L.
-*
-         CALL CUNMBR( 'P', 'L', 'N', M, NRHS, M, WORK( IL ), LDWORK,
-     $                WORK( ITAUP ), B, LDB, WORK( NWORK ),
-     $                LWORK-NWORK+1, INFO )
-*
-*        Zero out below first M rows of B.
-*
-         CALL CLASET( 'F', N-M, NRHS, CZERO, CZERO, B( M+1, 1 ), LDB )
-         NWORK = ITAU + M
-*
-*        Multiply transpose(Q) by B.
-*        (CWorkspace: need NRHS, prefer NRHS*NB)
-*
-         CALL CUNMLQ( 'L', 'C', N, NRHS, M, A, LDA, WORK( ITAU ), B,
-     $                LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-      ELSE
-*
-*        Path 2 - remaining underdetermined cases.
-*
-         ITAUQ = 1
-         ITAUP = ITAUQ + M
-         NWORK = ITAUP + M
-         IE = 1
-         NRWORK = IE + M
-*
-*        Bidiagonalize A.
-*        (RWorkspace: need M)
-*        (CWorkspace: need 2*M+N, prefer 2*M+(M+N)*NB)
-*
-         CALL CGEBRD( M, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
-     $                WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
-     $                INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors.
-*        (CWorkspace: need 2*M+NRHS, prefer 2*M+NRHS*NB)
-*
-         CALL CUNMBR( 'Q', 'L', 'C', M, NRHS, N, A, LDA, WORK( ITAUQ ),
-     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-*        Solve the bidiagonal least squares problem.
-*
-         CALL CLALSD( 'L', SMLSIZ, M, NRHS, S, RWORK( IE ), B, LDB,
-     $                RCOND, RANK, WORK( NWORK ), RWORK( NRWORK ),
-     $                IWORK, INFO )
-         IF( INFO.NE.0 ) THEN
-            GO TO 10
-         END IF
-*
-*        Multiply B by right bidiagonalizing vectors of A.
-*
-         CALL CUNMBR( 'P', 'L', 'N', N, NRHS, M, A, LDA, WORK( ITAUP ),
-     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-      END IF
-*
-*     Undo scaling.
-*
-      IF( IASCL.EQ.1 ) THEN
-         CALL CLASCL( 'G', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO )
-         CALL SLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
-     $                INFO )
-      ELSE IF( IASCL.EQ.2 ) THEN
-         CALL CLASCL( 'G', 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB, INFO )
-         CALL SLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
-     $                INFO )
-      END IF
-      IF( IBSCL.EQ.1 ) THEN
-         CALL CLASCL( 'G', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO )
-      ELSE IF( IBSCL.EQ.2 ) THEN
-         CALL CLASCL( 'G', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO )
-      END IF
-*
-   10 CONTINUE
-      WORK( 1 ) = MAXWRK
-      IWORK( 1 ) = LIWORK
-      RWORK( 1 ) = LRWORK
-      RETURN
-*
-*     End of CGELSD
-*
-      END
--- a/libcruft/lapack/cgelss.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,634 +0,0 @@
-      SUBROUTINE CGELSS( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK,
-     $                   WORK, LWORK, RWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LDB, LWORK, M, N, NRHS, RANK
-      REAL               RCOND
-*     ..
-*     .. Array Arguments ..
-      REAL               RWORK( * ), S( * )
-      COMPLEX            A( LDA, * ), B( LDB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGELSS computes the minimum norm solution to a complex linear
-*  least squares problem:
-*
-*  Minimize 2-norm(| b - A*x |).
-*
-*  using the singular value decomposition (SVD) of A. A is an M-by-N
-*  matrix which may be rank-deficient.
-*
-*  Several right hand side vectors b and solution vectors x can be
-*  handled in a single call; they are stored as the columns of the
-*  M-by-NRHS right hand side matrix B and the N-by-NRHS solution matrix
-*  X.
-*
-*  The effective rank of A is determined by treating as zero those
-*  singular values which are less than RCOND times the largest singular
-*  value.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrices B and X. NRHS >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the first min(m,n) rows of A are overwritten with
-*          its right singular vectors, stored rowwise.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  B       (input/output) COMPLEX array, dimension (LDB,NRHS)
-*          On entry, the M-by-NRHS right hand side matrix B.
-*          On exit, B is overwritten by the N-by-NRHS solution matrix X.
-*          If m >= n and RANK = n, the residual sum-of-squares for
-*          the solution in the i-th column is given by the sum of
-*          squares of the modulus of elements n+1:m in that column.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,M,N).
-*
-*  S       (output) REAL array, dimension (min(M,N))
-*          The singular values of A in decreasing order.
-*          The condition number of A in the 2-norm = S(1)/S(min(m,n)).
-*
-*  RCOND   (input) REAL
-*          RCOND is used to determine the effective rank of A.
-*          Singular values S(i) <= RCOND*S(1) are treated as zero.
-*          If RCOND < 0, machine precision is used instead.
-*
-*  RANK    (output) INTEGER
-*          The effective rank of A, i.e., the number of singular values
-*          which are greater than RCOND*S(1).
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= 1, and also:
-*          LWORK >=  2*min(M,N) + max(M,N,NRHS)
-*          For good performance, LWORK should generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace) REAL array, dimension (5*min(M,N))
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  the algorithm for computing the SVD failed to converge;
-*                if INFO = i, i off-diagonal elements of an intermediate
-*                bidiagonal form did not converge to zero.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-      COMPLEX            CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0E+0, 0.0E+0 ),
-     $                   CONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            BL, CHUNK, I, IASCL, IBSCL, IE, IL, IRWORK,
-     $                   ITAU, ITAUP, ITAUQ, IWORK, LDWORK, MAXMN,
-     $                   MAXWRK, MINMN, MINWRK, MM, MNTHR
-      REAL               ANRM, BIGNUM, BNRM, EPS, SFMIN, SMLNUM, THR
-*     ..
-*     .. Local Arrays ..
-      COMPLEX            VDUM( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CBDSQR, CCOPY, CGEBRD, CGELQF, CGEMM, CGEMV,
-     $                   CGEQRF, CLACPY, CLASCL, CLASET, CSRSCL, CUNGBR,
-     $                   CUNMBR, CUNMLQ, CUNMQR, SLABAD, SLASCL, SLASET,
-     $                   XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      REAL               CLANGE, SLAMCH
-      EXTERNAL           ILAENV, CLANGE, SLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      MINMN = MIN( M, N )
-      MAXMN = MAX( M, N )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, MAXMN ) ) THEN
-         INFO = -7
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of workspace needed at that point in the code,
-*       as well as the preferred amount for good performance.
-*       CWorkspace refers to complex workspace, and RWorkspace refers
-*       to real workspace. NB refers to the optimal block size for the
-*       immediately following subroutine, as returned by ILAENV.)
-*
-      IF( INFO.EQ.0 ) THEN
-         MINWRK = 1
-         MAXWRK = 1
-         IF( MINMN.GT.0 ) THEN
-            MM = M
-            MNTHR = ILAENV( 6, 'CGELSS', ' ', M, N, NRHS, -1 )
-            IF( M.GE.N .AND. M.GE.MNTHR ) THEN
-*
-*              Path 1a - overdetermined, with many more rows than
-*                        columns
-*
-               MM = N
-               MAXWRK = MAX( MAXWRK, N + N*ILAENV( 1, 'CGEQRF', ' ', M,
-     $                       N, -1, -1 ) )
-               MAXWRK = MAX( MAXWRK, N + NRHS*ILAENV( 1, 'CUNMQR', 'LC',
-     $                       M, NRHS, N, -1 ) )
-            END IF
-            IF( M.GE.N ) THEN
-*
-*              Path 1 - overdetermined or exactly determined
-*
-               MAXWRK = MAX( MAXWRK, 2*N + ( MM + N )*ILAENV( 1,
-     $                       'CGEBRD', ' ', MM, N, -1, -1 ) )
-               MAXWRK = MAX( MAXWRK, 2*N + NRHS*ILAENV( 1, 'CUNMBR',
-     $                       'QLC', MM, NRHS, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, 2*N + ( N - 1 )*ILAENV( 1,
-     $                       'CUNGBR', 'P', N, N, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, N*NRHS )
-               MINWRK = 2*N + MAX( NRHS, M )
-            END IF
-            IF( N.GT.M ) THEN
-               MINWRK = 2*M + MAX( NRHS, N )
-               IF( N.GE.MNTHR ) THEN
-*
-*                 Path 2a - underdetermined, with many more columns
-*                 than rows
-*
-                  MAXWRK = M + M*ILAENV( 1, 'CGELQF', ' ', M, N, -1,
-     $                     -1 )
-                  MAXWRK = MAX( MAXWRK, 3*M + M*M + 2*M*ILAENV( 1,
-     $                          'CGEBRD', ' ', M, M, -1, -1 ) )
-                  MAXWRK = MAX( MAXWRK, 3*M + M*M + NRHS*ILAENV( 1,
-     $                          'CUNMBR', 'QLC', M, NRHS, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, 3*M + M*M + ( M - 1 )*ILAENV( 1,
-     $                          'CUNGBR', 'P', M, M, M, -1 ) )
-                  IF( NRHS.GT.1 ) THEN
-                     MAXWRK = MAX( MAXWRK, M*M + M + M*NRHS )
-                  ELSE
-                     MAXWRK = MAX( MAXWRK, M*M + 2*M )
-                  END IF
-                  MAXWRK = MAX( MAXWRK, M + NRHS*ILAENV( 1, 'CUNMLQ',
-     $                          'LC', N, NRHS, M, -1 ) )
-               ELSE
-*
-*                 Path 2 - underdetermined
-*
-                  MAXWRK = 2*M + ( N + M )*ILAENV( 1, 'CGEBRD', ' ', M,
-     $                     N, -1, -1 )
-                  MAXWRK = MAX( MAXWRK, 2*M + NRHS*ILAENV( 1, 'CUNMBR',
-     $                          'QLC', M, NRHS, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, 2*M + M*ILAENV( 1, 'CUNGBR',
-     $                          'P', M, N, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, N*NRHS )
-               END IF
-            END IF
-            MAXWRK = MAX( MINWRK, MAXWRK )
-         END IF
-         WORK( 1 ) = MAXWRK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY )
-     $      INFO = -12
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGELSS', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         RANK = 0
-         RETURN
-      END IF
-*
-*     Get machine parameters
-*
-      EPS = SLAMCH( 'P' )
-      SFMIN = SLAMCH( 'S' )
-      SMLNUM = SFMIN / EPS
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = CLANGE( 'M', M, N, A, LDA, RWORK )
-      IASCL = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL CLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO )
-         IASCL = 1
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM
-*
-         CALL CLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO )
-         IASCL = 2
-      ELSE IF( ANRM.EQ.ZERO ) THEN
-*
-*        Matrix all zero. Return zero solution.
-*
-         CALL CLASET( 'F', MAX( M, N ), NRHS, CZERO, CZERO, B, LDB )
-         CALL SLASET( 'F', MINMN, 1, ZERO, ZERO, S, MINMN )
-         RANK = 0
-         GO TO 70
-      END IF
-*
-*     Scale B if max element outside range [SMLNUM,BIGNUM]
-*
-      BNRM = CLANGE( 'M', M, NRHS, B, LDB, RWORK )
-      IBSCL = 0
-      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL CLASCL( 'G', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 1
-      ELSE IF( BNRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM
-*
-         CALL CLASCL( 'G', 0, 0, BNRM, BIGNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 2
-      END IF
-*
-*     Overdetermined case
-*
-      IF( M.GE.N ) THEN
-*
-*        Path 1 - overdetermined or exactly determined
-*
-         MM = M
-         IF( M.GE.MNTHR ) THEN
-*
-*           Path 1a - overdetermined, with many more rows than columns
-*
-            MM = N
-            ITAU = 1
-            IWORK = ITAU + N
-*
-*           Compute A=Q*R
-*           (CWorkspace: need 2*N, prefer N+N*NB)
-*           (RWorkspace: none)
-*
-            CALL CGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
-     $                   LWORK-IWORK+1, INFO )
-*
-*           Multiply B by transpose(Q)
-*           (CWorkspace: need N+NRHS, prefer N+NRHS*NB)
-*           (RWorkspace: none)
-*
-            CALL CUNMQR( 'L', 'C', M, NRHS, N, A, LDA, WORK( ITAU ), B,
-     $                   LDB, WORK( IWORK ), LWORK-IWORK+1, INFO )
-*
-*           Zero out below R
-*
-            IF( N.GT.1 )
-     $         CALL CLASET( 'L', N-1, N-1, CZERO, CZERO, A( 2, 1 ),
-     $                      LDA )
-         END IF
-*
-         IE = 1
-         ITAUQ = 1
-         ITAUP = ITAUQ + N
-         IWORK = ITAUP + N
-*
-*        Bidiagonalize R in A
-*        (CWorkspace: need 2*N+MM, prefer 2*N+(MM+N)*NB)
-*        (RWorkspace: need N)
-*
-         CALL CGEBRD( MM, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
-     $                WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors of R
-*        (CWorkspace: need 2*N+NRHS, prefer 2*N+NRHS*NB)
-*        (RWorkspace: none)
-*
-         CALL CUNMBR( 'Q', 'L', 'C', MM, NRHS, N, A, LDA, WORK( ITAUQ ),
-     $                B, LDB, WORK( IWORK ), LWORK-IWORK+1, INFO )
-*
-*        Generate right bidiagonalizing vectors of R in A
-*        (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*        (RWorkspace: none)
-*
-         CALL CUNGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                WORK( IWORK ), LWORK-IWORK+1, INFO )
-         IRWORK = IE + N
-*
-*        Perform bidiagonal QR iteration
-*          multiply B by transpose of left singular vectors
-*          compute right singular vectors in A
-*        (CWorkspace: none)
-*        (RWorkspace: need BDSPAC)
-*
-         CALL CBDSQR( 'U', N, N, 0, NRHS, S, RWORK( IE ), A, LDA, VDUM,
-     $                1, B, LDB, RWORK( IRWORK ), INFO )
-         IF( INFO.NE.0 )
-     $      GO TO 70
-*
-*        Multiply B by reciprocals of singular values
-*
-         THR = MAX( RCOND*S( 1 ), SFMIN )
-         IF( RCOND.LT.ZERO )
-     $      THR = MAX( EPS*S( 1 ), SFMIN )
-         RANK = 0
-         DO 10 I = 1, N
-            IF( S( I ).GT.THR ) THEN
-               CALL CSRSCL( NRHS, S( I ), B( I, 1 ), LDB )
-               RANK = RANK + 1
-            ELSE
-               CALL CLASET( 'F', 1, NRHS, CZERO, CZERO, B( I, 1 ), LDB )
-            END IF
-   10    CONTINUE
-*
-*        Multiply B by right singular vectors
-*        (CWorkspace: need N, prefer N*NRHS)
-*        (RWorkspace: none)
-*
-         IF( LWORK.GE.LDB*NRHS .AND. NRHS.GT.1 ) THEN
-            CALL CGEMM( 'C', 'N', N, NRHS, N, CONE, A, LDA, B, LDB,
-     $                  CZERO, WORK, LDB )
-            CALL CLACPY( 'G', N, NRHS, WORK, LDB, B, LDB )
-         ELSE IF( NRHS.GT.1 ) THEN
-            CHUNK = LWORK / N
-            DO 20 I = 1, NRHS, CHUNK
-               BL = MIN( NRHS-I+1, CHUNK )
-               CALL CGEMM( 'C', 'N', N, BL, N, CONE, A, LDA, B( 1, I ),
-     $                     LDB, CZERO, WORK, N )
-               CALL CLACPY( 'G', N, BL, WORK, N, B( 1, I ), LDB )
-   20       CONTINUE
-         ELSE
-            CALL CGEMV( 'C', N, N, CONE, A, LDA, B, 1, CZERO, WORK, 1 )
-            CALL CCOPY( N, WORK, 1, B, 1 )
-         END IF
-*
-      ELSE IF( N.GE.MNTHR .AND. LWORK.GE.3*M+M*M+MAX( M, NRHS, N-2*M ) )
-     $          THEN
-*
-*        Underdetermined case, M much less than N
-*
-*        Path 2a - underdetermined, with many more columns than rows
-*        and sufficient workspace for an efficient algorithm
-*
-         LDWORK = M
-         IF( LWORK.GE.3*M+M*LDA+MAX( M, NRHS, N-2*M ) )
-     $      LDWORK = LDA
-         ITAU = 1
-         IWORK = M + 1
-*
-*        Compute A=L*Q
-*        (CWorkspace: need 2*M, prefer M+M*NB)
-*        (RWorkspace: none)
-*
-         CALL CGELQF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
-     $                LWORK-IWORK+1, INFO )
-         IL = IWORK
-*
-*        Copy L to WORK(IL), zeroing out above it
-*
-         CALL CLACPY( 'L', M, M, A, LDA, WORK( IL ), LDWORK )
-         CALL CLASET( 'U', M-1, M-1, CZERO, CZERO, WORK( IL+LDWORK ),
-     $                LDWORK )
-         IE = 1
-         ITAUQ = IL + LDWORK*M
-         ITAUP = ITAUQ + M
-         IWORK = ITAUP + M
-*
-*        Bidiagonalize L in WORK(IL)
-*        (CWorkspace: need M*M+4*M, prefer M*M+3*M+2*M*NB)
-*        (RWorkspace: need M)
-*
-         CALL CGEBRD( M, M, WORK( IL ), LDWORK, S, RWORK( IE ),
-     $                WORK( ITAUQ ), WORK( ITAUP ), WORK( IWORK ),
-     $                LWORK-IWORK+1, INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors of L
-*        (CWorkspace: need M*M+3*M+NRHS, prefer M*M+3*M+NRHS*NB)
-*        (RWorkspace: none)
-*
-         CALL CUNMBR( 'Q', 'L', 'C', M, NRHS, M, WORK( IL ), LDWORK,
-     $                WORK( ITAUQ ), B, LDB, WORK( IWORK ),
-     $                LWORK-IWORK+1, INFO )
-*
-*        Generate right bidiagonalizing vectors of R in WORK(IL)
-*        (CWorkspace: need M*M+4*M-1, prefer M*M+3*M+(M-1)*NB)
-*        (RWorkspace: none)
-*
-         CALL CUNGBR( 'P', M, M, M, WORK( IL ), LDWORK, WORK( ITAUP ),
-     $                WORK( IWORK ), LWORK-IWORK+1, INFO )
-         IRWORK = IE + M
-*
-*        Perform bidiagonal QR iteration, computing right singular
-*        vectors of L in WORK(IL) and multiplying B by transpose of
-*        left singular vectors
-*        (CWorkspace: need M*M)
-*        (RWorkspace: need BDSPAC)
-*
-         CALL CBDSQR( 'U', M, M, 0, NRHS, S, RWORK( IE ), WORK( IL ),
-     $                LDWORK, A, LDA, B, LDB, RWORK( IRWORK ), INFO )
-         IF( INFO.NE.0 )
-     $      GO TO 70
-*
-*        Multiply B by reciprocals of singular values
-*
-         THR = MAX( RCOND*S( 1 ), SFMIN )
-         IF( RCOND.LT.ZERO )
-     $      THR = MAX( EPS*S( 1 ), SFMIN )
-         RANK = 0
-         DO 30 I = 1, M
-            IF( S( I ).GT.THR ) THEN
-               CALL CSRSCL( NRHS, S( I ), B( I, 1 ), LDB )
-               RANK = RANK + 1
-            ELSE
-               CALL CLASET( 'F', 1, NRHS, CZERO, CZERO, B( I, 1 ), LDB )
-            END IF
-   30    CONTINUE
-         IWORK = IL + M*LDWORK
-*
-*        Multiply B by right singular vectors of L in WORK(IL)
-*        (CWorkspace: need M*M+2*M, prefer M*M+M+M*NRHS)
-*        (RWorkspace: none)
-*
-         IF( LWORK.GE.LDB*NRHS+IWORK-1 .AND. NRHS.GT.1 ) THEN
-            CALL CGEMM( 'C', 'N', M, NRHS, M, CONE, WORK( IL ), LDWORK,
-     $                  B, LDB, CZERO, WORK( IWORK ), LDB )
-            CALL CLACPY( 'G', M, NRHS, WORK( IWORK ), LDB, B, LDB )
-         ELSE IF( NRHS.GT.1 ) THEN
-            CHUNK = ( LWORK-IWORK+1 ) / M
-            DO 40 I = 1, NRHS, CHUNK
-               BL = MIN( NRHS-I+1, CHUNK )
-               CALL CGEMM( 'C', 'N', M, BL, M, CONE, WORK( IL ), LDWORK,
-     $                     B( 1, I ), LDB, CZERO, WORK( IWORK ), M )
-               CALL CLACPY( 'G', M, BL, WORK( IWORK ), M, B( 1, I ),
-     $                      LDB )
-   40       CONTINUE
-         ELSE
-            CALL CGEMV( 'C', M, M, CONE, WORK( IL ), LDWORK, B( 1, 1 ),
-     $                  1, CZERO, WORK( IWORK ), 1 )
-            CALL CCOPY( M, WORK( IWORK ), 1, B( 1, 1 ), 1 )
-         END IF
-*
-*        Zero out below first M rows of B
-*
-         CALL CLASET( 'F', N-M, NRHS, CZERO, CZERO, B( M+1, 1 ), LDB )
-         IWORK = ITAU + M
-*
-*        Multiply transpose(Q) by B
-*        (CWorkspace: need M+NRHS, prefer M+NHRS*NB)
-*        (RWorkspace: none)
-*
-         CALL CUNMLQ( 'L', 'C', N, NRHS, M, A, LDA, WORK( ITAU ), B,
-     $                LDB, WORK( IWORK ), LWORK-IWORK+1, INFO )
-*
-      ELSE
-*
-*        Path 2 - remaining underdetermined cases
-*
-         IE = 1
-         ITAUQ = 1
-         ITAUP = ITAUQ + M
-         IWORK = ITAUP + M
-*
-*        Bidiagonalize A
-*        (CWorkspace: need 3*M, prefer 2*M+(M+N)*NB)
-*        (RWorkspace: need N)
-*
-         CALL CGEBRD( M, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
-     $                WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors
-*        (CWorkspace: need 2*M+NRHS, prefer 2*M+NRHS*NB)
-*        (RWorkspace: none)
-*
-         CALL CUNMBR( 'Q', 'L', 'C', M, NRHS, N, A, LDA, WORK( ITAUQ ),
-     $                B, LDB, WORK( IWORK ), LWORK-IWORK+1, INFO )
-*
-*        Generate right bidiagonalizing vectors in A
-*        (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*        (RWorkspace: none)
-*
-         CALL CUNGBR( 'P', M, N, M, A, LDA, WORK( ITAUP ),
-     $                WORK( IWORK ), LWORK-IWORK+1, INFO )
-         IRWORK = IE + M
-*
-*        Perform bidiagonal QR iteration,
-*           computing right singular vectors of A in A and
-*           multiplying B by transpose of left singular vectors
-*        (CWorkspace: none)
-*        (RWorkspace: need BDSPAC)
-*
-         CALL CBDSQR( 'L', M, N, 0, NRHS, S, RWORK( IE ), A, LDA, VDUM,
-     $                1, B, LDB, RWORK( IRWORK ), INFO )
-         IF( INFO.NE.0 )
-     $      GO TO 70
-*
-*        Multiply B by reciprocals of singular values
-*
-         THR = MAX( RCOND*S( 1 ), SFMIN )
-         IF( RCOND.LT.ZERO )
-     $      THR = MAX( EPS*S( 1 ), SFMIN )
-         RANK = 0
-         DO 50 I = 1, M
-            IF( S( I ).GT.THR ) THEN
-               CALL CSRSCL( NRHS, S( I ), B( I, 1 ), LDB )
-               RANK = RANK + 1
-            ELSE
-               CALL CLASET( 'F', 1, NRHS, CZERO, CZERO, B( I, 1 ), LDB )
-            END IF
-   50    CONTINUE
-*
-*        Multiply B by right singular vectors of A
-*        (CWorkspace: need N, prefer N*NRHS)
-*        (RWorkspace: none)
-*
-         IF( LWORK.GE.LDB*NRHS .AND. NRHS.GT.1 ) THEN
-            CALL CGEMM( 'C', 'N', N, NRHS, M, CONE, A, LDA, B, LDB,
-     $                  CZERO, WORK, LDB )
-            CALL CLACPY( 'G', N, NRHS, WORK, LDB, B, LDB )
-         ELSE IF( NRHS.GT.1 ) THEN
-            CHUNK = LWORK / N
-            DO 60 I = 1, NRHS, CHUNK
-               BL = MIN( NRHS-I+1, CHUNK )
-               CALL CGEMM( 'C', 'N', N, BL, M, CONE, A, LDA, B( 1, I ),
-     $                     LDB, CZERO, WORK, N )
-               CALL CLACPY( 'F', N, BL, WORK, N, B( 1, I ), LDB )
-   60       CONTINUE
-         ELSE
-            CALL CGEMV( 'C', M, N, CONE, A, LDA, B, 1, CZERO, WORK, 1 )
-            CALL CCOPY( N, WORK, 1, B, 1 )
-         END IF
-      END IF
-*
-*     Undo scaling
-*
-      IF( IASCL.EQ.1 ) THEN
-         CALL CLASCL( 'G', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO )
-         CALL SLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
-     $                INFO )
-      ELSE IF( IASCL.EQ.2 ) THEN
-         CALL CLASCL( 'G', 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB, INFO )
-         CALL SLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
-     $                INFO )
-      END IF
-      IF( IBSCL.EQ.1 ) THEN
-         CALL CLASCL( 'G', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO )
-      ELSE IF( IBSCL.EQ.2 ) THEN
-         CALL CLASCL( 'G', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO )
-      END IF
-   70 CONTINUE
-      WORK( 1 ) = MAXWRK
-      RETURN
-*
-*     End of CGELSS
-*
-      END
--- a/libcruft/lapack/cgelsy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,385 +0,0 @@
-      SUBROUTINE CGELSY( M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND, RANK,
-     $                   WORK, LWORK, RWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LDB, LWORK, M, N, NRHS, RANK
-      REAL               RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      REAL               RWORK( * )
-      COMPLEX            A( LDA, * ), B( LDB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGELSY computes the minimum-norm solution to a complex linear least
-*  squares problem:
-*      minimize || A * X - B ||
-*  using a complete orthogonal factorization of A.  A is an M-by-N
-*  matrix which may be rank-deficient.
-*
-*  Several right hand side vectors b and solution vectors x can be
-*  handled in a single call; they are stored as the columns of the
-*  M-by-NRHS right hand side matrix B and the N-by-NRHS solution
-*  matrix X.
-*
-*  The routine first computes a QR factorization with column pivoting:
-*      A * P = Q * [ R11 R12 ]
-*                  [  0  R22 ]
-*  with R11 defined as the largest leading submatrix whose estimated
-*  condition number is less than 1/RCOND.  The order of R11, RANK,
-*  is the effective rank of A.
-*
-*  Then, R22 is considered to be negligible, and R12 is annihilated
-*  by unitary transformations from the right, arriving at the
-*  complete orthogonal factorization:
-*     A * P = Q * [ T11 0 ] * Z
-*                 [  0  0 ]
-*  The minimum-norm solution is then
-*     X = P * Z' [ inv(T11)*Q1'*B ]
-*                [        0       ]
-*  where Q1 consists of the first RANK columns of Q.
-*
-*  This routine is basically identical to the original xGELSX except
-*  three differences:
-*    o The permutation of matrix B (the right hand side) is faster and
-*      more simple.
-*    o The call to the subroutine xGEQPF has been substituted by the
-*      the call to the subroutine xGEQP3. This subroutine is a Blas-3
-*      version of the QR factorization with column pivoting.
-*    o Matrix B (the right hand side) is updated with Blas-3.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of
-*          columns of matrices B and X. NRHS >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, A has been overwritten by details of its
-*          complete orthogonal factorization.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  B       (input/output) COMPLEX array, dimension (LDB,NRHS)
-*          On entry, the M-by-NRHS right hand side matrix B.
-*          On exit, the N-by-NRHS solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B. LDB >= max(1,M,N).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          On entry, if JPVT(i) .ne. 0, the i-th column of A is permuted
-*          to the front of AP, otherwise column i is a free column.
-*          On exit, if JPVT(i) = k, then the i-th column of A*P
-*          was the k-th column of A.
-*
-*  RCOND   (input) REAL
-*          RCOND is used to determine the effective rank of A, which
-*          is defined as the order of the largest leading triangular
-*          submatrix R11 in the QR factorization with pivoting of A,
-*          whose estimated condition number < 1/RCOND.
-*
-*  RANK    (output) INTEGER
-*          The effective rank of A, i.e., the order of the submatrix
-*          R11.  This is the same as the order of the submatrix T11
-*          in the complete orthogonal factorization of A.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          The unblocked strategy requires that:
-*            LWORK >= MN + MAX( 2*MN, N+1, MN+NRHS )
-*          where MN = min(M,N).
-*          The block algorithm requires that:
-*            LWORK >= MN + MAX( 2*MN, NB*(N+1), MN+MN*NB, MN+NB*NRHS )
-*          where NB is an upper bound on the blocksize returned
-*          by ILAENV for the routines CGEQP3, CTZRZF, CTZRQF, CUNMQR,
-*          and CUNMRZ.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace) REAL array, dimension (2*N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*    E. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*    G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            IMAX, IMIN
-      PARAMETER          ( IMAX = 1, IMIN = 2 )
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-      COMPLEX            CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0E+0, 0.0E+0 ),
-     $                   CONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IASCL, IBSCL, ISMAX, ISMIN, J, LWKOPT, MN,
-     $                   NB, NB1, NB2, NB3, NB4
-      REAL               ANRM, BIGNUM, BNRM, SMAX, SMAXPR, SMIN, SMINPR,
-     $                   SMLNUM, WSIZE
-      COMPLEX            C1, C2, S1, S2
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CCOPY, CGEQP3, CLAIC1, CLASCL, CLASET, CTRSM,
-     $                   CTZRZF, CUNMQR, CUNMRZ, SLABAD, XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      REAL               CLANGE, SLAMCH
-      EXTERNAL           CLANGE, ILAENV, SLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, REAL, CMPLX
-*     ..
-*     .. Executable Statements ..
-*
-      MN = MIN( M, N )
-      ISMIN = MN + 1
-      ISMAX = 2*MN + 1
-*
-*     Test the input arguments.
-*
-      INFO = 0
-      NB1 = ILAENV( 1, 'CGEQRF', ' ', M, N, -1, -1 )
-      NB2 = ILAENV( 1, 'CGERQF', ' ', M, N, -1, -1 )
-      NB3 = ILAENV( 1, 'CUNMQR', ' ', M, N, NRHS, -1 )
-      NB4 = ILAENV( 1, 'CUNMRQ', ' ', M, N, NRHS, -1 )
-      NB = MAX( NB1, NB2, NB3, NB4 )
-      LWKOPT = MAX( 1, MN+2*N+NB*(N+1), 2*MN+NB*NRHS )
-      WORK( 1 ) = CMPLX( LWKOPT )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, M, N ) ) THEN
-         INFO = -7
-      ELSE IF( LWORK.LT.( MN+MAX( 2*MN, N+1, MN+NRHS ) ) .AND.
-     $   .NOT.LQUERY ) THEN
-         INFO = -12
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGELSY', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( MIN( M, N, NRHS ).EQ.0 ) THEN
-         RANK = 0
-         RETURN
-      END IF
-*
-*     Get machine parameters
-*
-      SMLNUM = SLAMCH( 'S' ) / SLAMCH( 'P' )
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-*
-*     Scale A, B if max entries outside range [SMLNUM,BIGNUM]
-*
-      ANRM = CLANGE( 'M', M, N, A, LDA, RWORK )
-      IASCL = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL CLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO )
-         IASCL = 1
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM
-*
-         CALL CLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO )
-         IASCL = 2
-      ELSE IF( ANRM.EQ.ZERO ) THEN
-*
-*        Matrix all zero. Return zero solution.
-*
-         CALL CLASET( 'F', MAX( M, N ), NRHS, CZERO, CZERO, B, LDB )
-         RANK = 0
-         GO TO 70
-      END IF
-*
-      BNRM = CLANGE( 'M', M, NRHS, B, LDB, RWORK )
-      IBSCL = 0
-      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL CLASCL( 'G', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 1
-      ELSE IF( BNRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM
-*
-         CALL CLASCL( 'G', 0, 0, BNRM, BIGNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 2
-      END IF
-*
-*     Compute QR factorization with column pivoting of A:
-*        A * P = Q * R
-*
-      CALL CGEQP3( M, N, A, LDA, JPVT, WORK( 1 ), WORK( MN+1 ),
-     $             LWORK-MN, RWORK, INFO )
-      WSIZE = MN + REAL( WORK( MN+1 ) )
-*
-*     complex workspace: MN+NB*(N+1). real workspace 2*N.
-*     Details of Householder rotations stored in WORK(1:MN).
-*
-*     Determine RANK using incremental condition estimation
-*
-      WORK( ISMIN ) = CONE
-      WORK( ISMAX ) = CONE
-      SMAX = ABS( A( 1, 1 ) )
-      SMIN = SMAX
-      IF( ABS( A( 1, 1 ) ).EQ.ZERO ) THEN
-         RANK = 0
-         CALL CLASET( 'F', MAX( M, N ), NRHS, CZERO, CZERO, B, LDB )
-         GO TO 70
-      ELSE
-         RANK = 1
-      END IF
-*
-   10 CONTINUE
-      IF( RANK.LT.MN ) THEN
-         I = RANK + 1
-         CALL CLAIC1( IMIN, RANK, WORK( ISMIN ), SMIN, A( 1, I ),
-     $                A( I, I ), SMINPR, S1, C1 )
-         CALL CLAIC1( IMAX, RANK, WORK( ISMAX ), SMAX, A( 1, I ),
-     $                A( I, I ), SMAXPR, S2, C2 )
-*
-         IF( SMAXPR*RCOND.LE.SMINPR ) THEN
-            DO 20 I = 1, RANK
-               WORK( ISMIN+I-1 ) = S1*WORK( ISMIN+I-1 )
-               WORK( ISMAX+I-1 ) = S2*WORK( ISMAX+I-1 )
-   20       CONTINUE
-            WORK( ISMIN+RANK ) = C1
-            WORK( ISMAX+RANK ) = C2
-            SMIN = SMINPR
-            SMAX = SMAXPR
-            RANK = RANK + 1
-            GO TO 10
-         END IF
-      END IF
-*
-*     complex workspace: 3*MN.
-*
-*     Logically partition R = [ R11 R12 ]
-*                             [  0  R22 ]
-*     where R11 = R(1:RANK,1:RANK)
-*
-*     [R11,R12] = [ T11, 0 ] * Y
-*
-      IF( RANK.LT.N )
-     $   CALL CTZRZF( RANK, N, A, LDA, WORK( MN+1 ), WORK( 2*MN+1 ),
-     $                LWORK-2*MN, INFO )
-*
-*     complex workspace: 2*MN.
-*     Details of Householder rotations stored in WORK(MN+1:2*MN)
-*
-*     B(1:M,1:NRHS) := Q' * B(1:M,1:NRHS)
-*
-      CALL CUNMQR( 'Left', 'Conjugate transpose', M, NRHS, MN, A, LDA,
-     $             WORK( 1 ), B, LDB, WORK( 2*MN+1 ), LWORK-2*MN, INFO )
-      WSIZE = MAX( WSIZE, 2*MN+REAL( WORK( 2*MN+1 ) ) )
-*
-*     complex workspace: 2*MN+NB*NRHS.
-*
-*     B(1:RANK,1:NRHS) := inv(T11) * B(1:RANK,1:NRHS)
-*
-      CALL CTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', RANK,
-     $            NRHS, CONE, A, LDA, B, LDB )
-*
-      DO 40 J = 1, NRHS
-         DO 30 I = RANK + 1, N
-            B( I, J ) = CZERO
-   30    CONTINUE
-   40 CONTINUE
-*
-*     B(1:N,1:NRHS) := Y' * B(1:N,1:NRHS)
-*
-      IF( RANK.LT.N ) THEN
-         CALL CUNMRZ( 'Left', 'Conjugate transpose', N, NRHS, RANK,
-     $                N-RANK, A, LDA, WORK( MN+1 ), B, LDB,
-     $                WORK( 2*MN+1 ), LWORK-2*MN, INFO )
-      END IF
-*
-*     complex workspace: 2*MN+NRHS.
-*
-*     B(1:N,1:NRHS) := P * B(1:N,1:NRHS)
-*
-      DO 60 J = 1, NRHS
-         DO 50 I = 1, N
-            WORK( JPVT( I ) ) = B( I, J )
-   50    CONTINUE
-         CALL CCOPY( N, WORK( 1 ), 1, B( 1, J ), 1 )
-   60 CONTINUE
-*
-*     complex workspace: N.
-*
-*     Undo scaling
-*
-      IF( IASCL.EQ.1 ) THEN
-         CALL CLASCL( 'G', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO )
-         CALL CLASCL( 'U', 0, 0, SMLNUM, ANRM, RANK, RANK, A, LDA,
-     $                INFO )
-      ELSE IF( IASCL.EQ.2 ) THEN
-         CALL CLASCL( 'G', 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB, INFO )
-         CALL CLASCL( 'U', 0, 0, BIGNUM, ANRM, RANK, RANK, A, LDA,
-     $                INFO )
-      END IF
-      IF( IBSCL.EQ.1 ) THEN
-         CALL CLASCL( 'G', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO )
-      ELSE IF( IBSCL.EQ.2 ) THEN
-         CALL CLASCL( 'G', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO )
-      END IF
-*
-   70 CONTINUE
-      WORK( 1 ) = CMPLX( LWKOPT )
-*
-      RETURN
-*
-*     End of CGELSY
-*
-      END
--- a/libcruft/lapack/cgeqp3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,293 +0,0 @@
-      SUBROUTINE CGEQP3( M, N, A, LDA, JPVT, TAU, WORK, LWORK, RWORK,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      REAL               RWORK( * )
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGEQP3 computes a QR factorization with column pivoting of a
-*  matrix A:  A*P = Q*R  using Level 3 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the upper triangle of the array contains the
-*          min(M,N)-by-N upper trapezoidal matrix R; the elements below
-*          the diagonal, together with the array TAU, represent the
-*          unitary matrix Q as a product of min(M,N) elementary
-*          reflectors.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          On entry, if JPVT(J).ne.0, the J-th column of A is permuted
-*          to the front of A*P (a leading column); if JPVT(J)=0,
-*          the J-th column of A is a free column.
-*          On exit, if JPVT(J)=K, then the J-th column of A*P was the
-*          the K-th column of A.
-*
-*  TAU     (output) COMPLEX array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO=0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= N+1.
-*          For optimal performance LWORK >= ( N+1 )*NB, where NB
-*          is the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace) REAL array, dimension (2*N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit.
-*          < 0: if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(k), where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real/complex scalar, and v is a real/complex vector
-*  with v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in
-*  A(i+1:m,i), and tau in TAU(i).
-*
-*  Based on contributions by
-*    G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*    X. Sun, Computer Science Dept., Duke University, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            INB, INBMIN, IXOVER
-      PARAMETER          ( INB = 1, INBMIN = 2, IXOVER = 3 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            FJB, IWS, J, JB, LWKOPT, MINMN, MINWS, NA, NB,
-     $                   NBMIN, NFXD, NX, SM, SMINMN, SN, TOPBMN
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEQRF, CLAQP2, CLAQPS, CSWAP, CUNMQR, XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      REAL               SCNRM2
-      EXTERNAL           ILAENV, SCNRM2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          INT, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test input arguments
-*     ====================
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         MINMN = MIN( M, N )
-         IF( MINMN.EQ.0 ) THEN
-            IWS = 1
-            LWKOPT = 1
-         ELSE
-            IWS = N + 1
-            NB = ILAENV( INB, 'CGEQRF', ' ', M, N, -1, -1 )
-            LWKOPT = ( N + 1 )*NB
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( ( LWORK.LT.IWS ) .AND. .NOT.LQUERY ) THEN
-            INFO = -8
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGEQP3', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( MINMN.EQ.0 ) THEN
-         RETURN
-      END IF
-*
-*     Move initial columns up front.
-*
-      NFXD = 1
-      DO 10 J = 1, N
-         IF( JPVT( J ).NE.0 ) THEN
-            IF( J.NE.NFXD ) THEN
-               CALL CSWAP( M, A( 1, J ), 1, A( 1, NFXD ), 1 )
-               JPVT( J ) = JPVT( NFXD )
-               JPVT( NFXD ) = J
-            ELSE
-               JPVT( J ) = J
-            END IF
-            NFXD = NFXD + 1
-         ELSE
-            JPVT( J ) = J
-         END IF
-   10 CONTINUE
-      NFXD = NFXD - 1
-*
-*     Factorize fixed columns
-*     =======================
-*
-*     Compute the QR factorization of fixed columns and update
-*     remaining columns.
-*
-      IF( NFXD.GT.0 ) THEN
-         NA = MIN( M, NFXD )
-*CC      CALL CGEQR2( M, NA, A, LDA, TAU, WORK, INFO )
-         CALL CGEQRF( M, NA, A, LDA, TAU, WORK, LWORK, INFO )
-         IWS = MAX( IWS, INT( WORK( 1 ) ) )
-         IF( NA.LT.N ) THEN
-*CC         CALL CUNM2R( 'Left', 'Conjugate Transpose', M, N-NA,
-*CC  $                   NA, A, LDA, TAU, A( 1, NA+1 ), LDA, WORK,
-*CC  $                   INFO )
-            CALL CUNMQR( 'Left', 'Conjugate Transpose', M, N-NA, NA, A,
-     $                   LDA, TAU, A( 1, NA+1 ), LDA, WORK, LWORK,
-     $                   INFO )
-            IWS = MAX( IWS, INT( WORK( 1 ) ) )
-         END IF
-      END IF
-*
-*     Factorize free columns
-*     ======================
-*
-      IF( NFXD.LT.MINMN ) THEN
-*
-         SM = M - NFXD
-         SN = N - NFXD
-         SMINMN = MINMN - NFXD
-*
-*        Determine the block size.
-*
-         NB = ILAENV( INB, 'CGEQRF', ' ', SM, SN, -1, -1 )
-         NBMIN = 2
-         NX = 0
-*
-         IF( ( NB.GT.1 ) .AND. ( NB.LT.SMINMN ) ) THEN
-*
-*           Determine when to cross over from blocked to unblocked code.
-*
-            NX = MAX( 0, ILAENV( IXOVER, 'CGEQRF', ' ', SM, SN, -1,
-     $           -1 ) )
-*
-*
-            IF( NX.LT.SMINMN ) THEN
-*
-*              Determine if workspace is large enough for blocked code.
-*
-               MINWS = ( SN+1 )*NB
-               IWS = MAX( IWS, MINWS )
-               IF( LWORK.LT.MINWS ) THEN
-*
-*                 Not enough workspace to use optimal NB: Reduce NB and
-*                 determine the minimum value of NB.
-*
-                  NB = LWORK / ( SN+1 )
-                  NBMIN = MAX( 2, ILAENV( INBMIN, 'CGEQRF', ' ', SM, SN,
-     $                    -1, -1 ) )
-*
-*
-               END IF
-            END IF
-         END IF
-*
-*        Initialize partial column norms. The first N elements of work
-*        store the exact column norms.
-*
-         DO 20 J = NFXD + 1, N
-            RWORK( J ) = SCNRM2( SM, A( NFXD+1, J ), 1 )
-            RWORK( N+J ) = RWORK( J )
-   20    CONTINUE
-*
-         IF( ( NB.GE.NBMIN ) .AND. ( NB.LT.SMINMN ) .AND.
-     $       ( NX.LT.SMINMN ) ) THEN
-*
-*           Use blocked code initially.
-*
-            J = NFXD + 1
-*
-*           Compute factorization: while loop.
-*
-*
-            TOPBMN = MINMN - NX
-   30       CONTINUE
-            IF( J.LE.TOPBMN ) THEN
-               JB = MIN( NB, TOPBMN-J+1 )
-*
-*              Factorize JB columns among columns J:N.
-*
-               CALL CLAQPS( M, N-J+1, J-1, JB, FJB, A( 1, J ), LDA,
-     $                      JPVT( J ), TAU( J ), RWORK( J ),
-     $                      RWORK( N+J ), WORK( 1 ), WORK( JB+1 ),
-     $                      N-J+1 )
-*
-               J = J + FJB
-               GO TO 30
-            END IF
-         ELSE
-            J = NFXD + 1
-         END IF
-*
-*        Use unblocked code to factor the last or only block.
-*
-*
-         IF( J.LE.MINMN )
-     $      CALL CLAQP2( M, N-J+1, J-1, A( 1, J ), LDA, JPVT( J ),
-     $                   TAU( J ), RWORK( J ), RWORK( N+J ), WORK( 1 ) )
-*
-      END IF
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of CGEQP3
-*
-      END
--- a/libcruft/lapack/cgeqpf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,234 +0,0 @@
-      SUBROUTINE CGEQPF( M, N, A, LDA, JPVT, TAU, WORK, RWORK, INFO )
-*
-*  -- LAPACK deprecated driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      REAL               RWORK( * )
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  This routine is deprecated and has been replaced by routine CGEQP3.
-*
-*  CGEQPF computes a QR factorization with column pivoting of a
-*  complex M-by-N matrix A: A*P = Q*R.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the upper triangle of the array contains the
-*          min(M,N)-by-N upper triangular matrix R; the elements
-*          below the diagonal, together with the array TAU,
-*          represent the unitary matrix Q as a product of
-*          min(m,n) elementary reflectors.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          On entry, if JPVT(i) .ne. 0, the i-th column of A is permuted
-*          to the front of A*P (a leading column); if JPVT(i) = 0,
-*          the i-th column of A is a free column.
-*          On exit, if JPVT(i) = k, then the i-th column of A*P
-*          was the k-th column of A.
-*
-*  TAU     (output) COMPLEX array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors.
-*
-*  WORK    (workspace) COMPLEX array, dimension (N)
-*
-*  RWORK   (workspace) REAL array, dimension (2*N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(n)
-*
-*  Each H(i) has the form
-*
-*     H = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i).
-*
-*  The matrix P is represented in jpvt as follows: If
-*     jpvt(j) = i
-*  then the jth column of P is the ith canonical unit vector.
-*
-*  Partial column norm updating strategy modified by
-*    Z. Drmac and Z. Bujanovic, Dept. of Mathematics,
-*    University of Zagreb, Croatia.
-*    June 2006.
-*  For more details see LAPACK Working Note 176.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ITEMP, J, MA, MN, PVT
-      REAL               TEMP, TEMP2, TOL3Z
-      COMPLEX            AII
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEQR2, CLARF, CLARFG, CSWAP, CUNM2R, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, CMPLX, CONJG, MAX, MIN, SQRT
-*     ..
-*     .. External Functions ..
-      INTEGER            ISAMAX
-      REAL               SCNRM2, SLAMCH
-      EXTERNAL           ISAMAX, SCNRM2, SLAMCH
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGEQPF', -INFO )
-         RETURN
-      END IF
-*
-      MN = MIN( M, N )
-      TOL3Z = SQRT(SLAMCH('Epsilon'))
-*
-*     Move initial columns up front
-*
-      ITEMP = 1
-      DO 10 I = 1, N
-         IF( JPVT( I ).NE.0 ) THEN
-            IF( I.NE.ITEMP ) THEN
-               CALL CSWAP( M, A( 1, I ), 1, A( 1, ITEMP ), 1 )
-               JPVT( I ) = JPVT( ITEMP )
-               JPVT( ITEMP ) = I
-            ELSE
-               JPVT( I ) = I
-            END IF
-            ITEMP = ITEMP + 1
-         ELSE
-            JPVT( I ) = I
-         END IF
-   10 CONTINUE
-      ITEMP = ITEMP - 1
-*
-*     Compute the QR factorization and update remaining columns
-*
-      IF( ITEMP.GT.0 ) THEN
-         MA = MIN( ITEMP, M )
-         CALL CGEQR2( M, MA, A, LDA, TAU, WORK, INFO )
-         IF( MA.LT.N ) THEN
-            CALL CUNM2R( 'Left', 'Conjugate transpose', M, N-MA, MA, A,
-     $                   LDA, TAU, A( 1, MA+1 ), LDA, WORK, INFO )
-         END IF
-      END IF
-*
-      IF( ITEMP.LT.MN ) THEN
-*
-*        Initialize partial column norms. The first n elements of
-*        work store the exact column norms.
-*
-         DO 20 I = ITEMP + 1, N
-            RWORK( I ) = SCNRM2( M-ITEMP, A( ITEMP+1, I ), 1 )
-            RWORK( N+I ) = RWORK( I )
-   20    CONTINUE
-*
-*        Compute factorization
-*
-         DO 40 I = ITEMP + 1, MN
-*
-*           Determine ith pivot column and swap if necessary
-*
-            PVT = ( I-1 ) + ISAMAX( N-I+1, RWORK( I ), 1 )
-*
-            IF( PVT.NE.I ) THEN
-               CALL CSWAP( M, A( 1, PVT ), 1, A( 1, I ), 1 )
-               ITEMP = JPVT( PVT )
-               JPVT( PVT ) = JPVT( I )
-               JPVT( I ) = ITEMP
-               RWORK( PVT ) = RWORK( I )
-               RWORK( N+PVT ) = RWORK( N+I )
-            END IF
-*
-*           Generate elementary reflector H(i)
-*
-            AII = A( I, I )
-            CALL CLARFG( M-I+1, AII, A( MIN( I+1, M ), I ), 1,
-     $                   TAU( I ) )
-            A( I, I ) = AII
-*
-            IF( I.LT.N ) THEN
-*
-*              Apply H(i) to A(i:m,i+1:n) from the left
-*
-               AII = A( I, I )
-               A( I, I ) = CMPLX( ONE )
-               CALL CLARF( 'Left', M-I+1, N-I, A( I, I ), 1,
-     $                     CONJG( TAU( I ) ), A( I, I+1 ), LDA, WORK )
-               A( I, I ) = AII
-            END IF
-*
-*           Update partial column norms
-*
-            DO 30 J = I + 1, N
-               IF( RWORK( J ).NE.ZERO ) THEN
-*
-*                 NOTE: The following 4 lines follow from the analysis in
-*                 Lapack Working Note 176.
-*                 
-                  TEMP = ABS( A( I, J ) ) / RWORK( J )
-                  TEMP = MAX( ZERO, ( ONE+TEMP )*( ONE-TEMP ) )
-                  TEMP2 = TEMP*( RWORK( J ) / RWORK( N+J ) )**2
-                  IF( TEMP2 .LE. TOL3Z ) THEN 
-                     IF( M-I.GT.0 ) THEN
-                        RWORK( J ) = SCNRM2( M-I, A( I+1, J ), 1 )
-                        RWORK( N+J ) = RWORK( J )
-                     ELSE
-                        RWORK( J ) = ZERO
-                        RWORK( N+J ) = ZERO
-                     END IF
-                  ELSE
-                     RWORK( J ) = RWORK( J )*SQRT( TEMP )
-                  END IF
-               END IF
-   30       CONTINUE
-*
-   40    CONTINUE
-      END IF
-      RETURN
-*
-*     End of CGEQPF
-*
-      END
--- a/libcruft/lapack/cgeqr2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,121 +0,0 @@
-      SUBROUTINE CGEQR2( M, N, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGEQR2 computes a QR factorization of a complex m by n matrix A:
-*  A = Q * R.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the m by n matrix A.
-*          On exit, the elements on and above the diagonal of the array
-*          contain the min(m,n) by n upper trapezoidal matrix R (R is
-*          upper triangular if m >= n); the elements below the diagonal,
-*          with the array TAU, represent the unitary matrix Q as a
-*          product of elementary reflectors (see Further Details).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) COMPLEX array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace) COMPLEX array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(k), where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i),
-*  and tau in TAU(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, K
-      COMPLEX            ALPHA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLARF, CLARFG, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CONJG, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGEQR2', -INFO )
-         RETURN
-      END IF
-*
-      K = MIN( M, N )
-*
-      DO 10 I = 1, K
-*
-*        Generate elementary reflector H(i) to annihilate A(i+1:m,i)
-*
-         CALL CLARFG( M-I+1, A( I, I ), A( MIN( I+1, M ), I ), 1,
-     $                TAU( I ) )
-         IF( I.LT.N ) THEN
-*
-*           Apply H(i)' to A(i:m,i+1:n) from the left
-*
-            ALPHA = A( I, I )
-            A( I, I ) = ONE
-            CALL CLARF( 'Left', M-I+1, N-I, A( I, I ), 1,
-     $                  CONJG( TAU( I ) ), A( I, I+1 ), LDA, WORK )
-            A( I, I ) = ALPHA
-         END IF
-   10 CONTINUE
-      RETURN
-*
-*     End of CGEQR2
-*
-      END
--- a/libcruft/lapack/cgeqrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,196 +0,0 @@
-      SUBROUTINE CGEQRF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGEQRF computes a QR factorization of a complex M-by-N matrix A:
-*  A = Q * R.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the elements on and above the diagonal of the array
-*          contain the min(M,N)-by-N upper trapezoidal matrix R (R is
-*          upper triangular if m >= n); the elements below the diagonal,
-*          with the array TAU, represent the unitary matrix Q as a
-*          product of min(m,n) elementary reflectors (see Further
-*          Details).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) COMPLEX array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,N).
-*          For optimum performance LWORK >= N*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(k), where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i),
-*  and tau in TAU(i).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, K, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEQR2, CLARFB, CLARFT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NB = ILAENV( 1, 'CGEQRF', ' ', M, N, -1, -1 )
-      LWKOPT = N*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGEQRF', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      K = MIN( M, N )
-      IF( K.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = N
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'CGEQRF', ' ', M, N, -1, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = N
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'CGEQRF', ' ', M, N, -1,
-     $                 -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code initially
-*
-         DO 10 I = 1, K - NX, NB
-            IB = MIN( K-I+1, NB )
-*
-*           Compute the QR factorization of the current block
-*           A(i:m,i:i+ib-1)
-*
-            CALL CGEQR2( M-I+1, IB, A( I, I ), LDA, TAU( I ), WORK,
-     $                   IINFO )
-            IF( I+IB.LE.N ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i) H(i+1) . . . H(i+ib-1)
-*
-               CALL CLARFT( 'Forward', 'Columnwise', M-I+1, IB,
-     $                      A( I, I ), LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H' to A(i:m,i+ib:n) from the left
-*
-               CALL CLARFB( 'Left', 'Conjugate transpose', 'Forward',
-     $                      'Columnwise', M-I+1, N-I-IB+1, IB,
-     $                      A( I, I ), LDA, WORK, LDWORK, A( I, I+IB ),
-     $                      LDA, WORK( IB+1 ), LDWORK )
-            END IF
-   10    CONTINUE
-      ELSE
-         I = 1
-      END IF
-*
-*     Use unblocked code to factor the last or only block.
-*
-      IF( I.LE.K )
-     $   CALL CGEQR2( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK,
-     $                IINFO )
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of CGEQRF
-*
-      END
--- a/libcruft/lapack/cgesv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-      SUBROUTINE CGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX            A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGESV computes the solution to a complex system of linear equations
-*     A * X = B,
-*  where A is an N-by-N matrix and X and B are N-by-NRHS matrices.
-*
-*  The LU decomposition with partial pivoting and row interchanges is
-*  used to factor A as
-*     A = P * L * U,
-*  where P is a permutation matrix, L is unit lower triangular, and U is
-*  upper triangular.  The factored form of A is then used to solve the
-*  system of equations A * X = B.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of linear equations, i.e., the order of the
-*          matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the N-by-N coefficient matrix A.
-*          On exit, the factors L and U from the factorization
-*          A = P*L*U; the unit diagonal elements of L are not stored.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  IPIV    (output) INTEGER array, dimension (N)
-*          The pivot indices that define the permutation matrix P;
-*          row i of the matrix was interchanged with row IPIV(i).
-*
-*  B       (input/output) COMPLEX array, dimension (LDB,NRHS)
-*          On entry, the N-by-NRHS matrix of right hand side matrix B.
-*          On exit, if INFO = 0, the N-by-NRHS solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, U(i,i) is exactly zero.  The factorization
-*                has been completed, but the factor U is exactly
-*                singular, so the solution could not be computed.
-*
-*  =====================================================================
-*
-*     .. External Subroutines ..
-      EXTERNAL           CGETRF, CGETRS, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGESV ', -INFO )
-         RETURN
-      END IF
-*
-*     Compute the LU factorization of A.
-*
-      CALL CGETRF( N, N, A, LDA, IPIV, INFO )
-      IF( INFO.EQ.0 ) THEN
-*
-*        Solve the system A*X = B, overwriting B with X.
-*
-         CALL CGETRS( 'No transpose', N, NRHS, A, LDA, IPIV, B, LDB,
-     $                INFO )
-      END IF
-      RETURN
-*
-*     End of CGESV
-*
-      END
--- a/libcruft/lapack/cgesvd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3602 +0,0 @@
-      SUBROUTINE CGESVD( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT,
-     $                   WORK, LWORK, RWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBU, JOBVT
-      INTEGER            INFO, LDA, LDU, LDVT, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               RWORK( * ), S( * )
-      COMPLEX            A( LDA, * ), U( LDU, * ), VT( LDVT, * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGESVD computes the singular value decomposition (SVD) of a complex
-*  M-by-N matrix A, optionally computing the left and/or right singular
-*  vectors. The SVD is written
-*
-*       A = U * SIGMA * conjugate-transpose(V)
-*
-*  where SIGMA is an M-by-N matrix which is zero except for its
-*  min(m,n) diagonal elements, U is an M-by-M unitary matrix, and
-*  V is an N-by-N unitary matrix.  The diagonal elements of SIGMA
-*  are the singular values of A; they are real and non-negative, and
-*  are returned in descending order.  The first min(m,n) columns of
-*  U and V are the left and right singular vectors of A.
-*
-*  Note that the routine returns V**H, not V.
-*
-*  Arguments
-*  =========
-*
-*  JOBU    (input) CHARACTER*1
-*          Specifies options for computing all or part of the matrix U:
-*          = 'A':  all M columns of U are returned in array U:
-*          = 'S':  the first min(m,n) columns of U (the left singular
-*                  vectors) are returned in the array U;
-*          = 'O':  the first min(m,n) columns of U (the left singular
-*                  vectors) are overwritten on the array A;
-*          = 'N':  no columns of U (no left singular vectors) are
-*                  computed.
-*
-*  JOBVT   (input) CHARACTER*1
-*          Specifies options for computing all or part of the matrix
-*          V**H:
-*          = 'A':  all N rows of V**H are returned in the array VT;
-*          = 'S':  the first min(m,n) rows of V**H (the right singular
-*                  vectors) are returned in the array VT;
-*          = 'O':  the first min(m,n) rows of V**H (the right singular
-*                  vectors) are overwritten on the array A;
-*          = 'N':  no rows of V**H (no right singular vectors) are
-*                  computed.
-*
-*          JOBVT and JOBU cannot both be 'O'.
-*
-*  M       (input) INTEGER
-*          The number of rows of the input matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the input matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit,
-*          if JOBU = 'O',  A is overwritten with the first min(m,n)
-*                          columns of U (the left singular vectors,
-*                          stored columnwise);
-*          if JOBVT = 'O', A is overwritten with the first min(m,n)
-*                          rows of V**H (the right singular vectors,
-*                          stored rowwise);
-*          if JOBU .ne. 'O' and JOBVT .ne. 'O', the contents of A
-*                          are destroyed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  S       (output) REAL array, dimension (min(M,N))
-*          The singular values of A, sorted so that S(i) >= S(i+1).
-*
-*  U       (output) COMPLEX array, dimension (LDU,UCOL)
-*          (LDU,M) if JOBU = 'A' or (LDU,min(M,N)) if JOBU = 'S'.
-*          If JOBU = 'A', U contains the M-by-M unitary matrix U;
-*          if JOBU = 'S', U contains the first min(m,n) columns of U
-*          (the left singular vectors, stored columnwise);
-*          if JOBU = 'N' or 'O', U is not referenced.
-*
-*  LDU     (input) INTEGER
-*          The leading dimension of the array U.  LDU >= 1; if
-*          JOBU = 'S' or 'A', LDU >= M.
-*
-*  VT      (output) COMPLEX array, dimension (LDVT,N)
-*          If JOBVT = 'A', VT contains the N-by-N unitary matrix
-*          V**H;
-*          if JOBVT = 'S', VT contains the first min(m,n) rows of
-*          V**H (the right singular vectors, stored rowwise);
-*          if JOBVT = 'N' or 'O', VT is not referenced.
-*
-*  LDVT    (input) INTEGER
-*          The leading dimension of the array VT.  LDVT >= 1; if
-*          JOBVT = 'A', LDVT >= N; if JOBVT = 'S', LDVT >= min(M,N).
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          LWORK >=  MAX(1,2*MIN(M,N)+MAX(M,N)).
-*          For good performance, LWORK should generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace) REAL array, dimension (5*min(M,N))
-*          On exit, if INFO > 0, RWORK(1:MIN(M,N)-1) contains the
-*          unconverged superdiagonal elements of an upper bidiagonal
-*          matrix B whose diagonal is in S (not necessarily sorted).
-*          B satisfies A = U * B * VT, so it has the same singular
-*          values as A, and singular vectors related by U and VT.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if CBDSQR did not converge, INFO specifies how many
-*                superdiagonals of an intermediate bidiagonal form B
-*                did not converge to zero. See the description of RWORK
-*                above for details.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0E0, 0.0E0 ),
-     $                   CONE = ( 1.0E0, 0.0E0 ) )
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, WNTUA, WNTUAS, WNTUN, WNTUO, WNTUS,
-     $                   WNTVA, WNTVAS, WNTVN, WNTVO, WNTVS
-      INTEGER            BLK, CHUNK, I, IE, IERR, IR, IRWORK, ISCL,
-     $                   ITAU, ITAUP, ITAUQ, IU, IWORK, LDWRKR, LDWRKU,
-     $                   MAXWRK, MINMN, MINWRK, MNTHR, NCU, NCVT, NRU,
-     $                   NRVT, WRKBL
-      REAL               ANRM, BIGNUM, EPS, SMLNUM
-*     ..
-*     .. Local Arrays ..
-      REAL               DUM( 1 )
-      COMPLEX            CDUM( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CBDSQR, CGEBRD, CGELQF, CGEMM, CGEQRF, CLACPY,
-     $                   CLASCL, CLASET, CUNGBR, CUNGLQ, CUNGQR, CUNMBR,
-     $                   SLASCL, XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      REAL               CLANGE, SLAMCH
-      EXTERNAL           LSAME, ILAENV, CLANGE, SLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      MINMN = MIN( M, N )
-      WNTUA = LSAME( JOBU, 'A' )
-      WNTUS = LSAME( JOBU, 'S' )
-      WNTUAS = WNTUA .OR. WNTUS
-      WNTUO = LSAME( JOBU, 'O' )
-      WNTUN = LSAME( JOBU, 'N' )
-      WNTVA = LSAME( JOBVT, 'A' )
-      WNTVS = LSAME( JOBVT, 'S' )
-      WNTVAS = WNTVA .OR. WNTVS
-      WNTVO = LSAME( JOBVT, 'O' )
-      WNTVN = LSAME( JOBVT, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-      IF( .NOT.( WNTUA .OR. WNTUS .OR. WNTUO .OR. WNTUN ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.( WNTVA .OR. WNTVS .OR. WNTVO .OR. WNTVN ) .OR.
-     $         ( WNTVO .AND. WNTUO ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -6
-      ELSE IF( LDU.LT.1 .OR. ( WNTUAS .AND. LDU.LT.M ) ) THEN
-         INFO = -9
-      ELSE IF( LDVT.LT.1 .OR. ( WNTVA .AND. LDVT.LT.N ) .OR.
-     $         ( WNTVS .AND. LDVT.LT.MINMN ) ) THEN
-         INFO = -11
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of workspace needed at that point in the code,
-*       as well as the preferred amount for good performance.
-*       CWorkspace refers to complex workspace, and RWorkspace to
-*       real workspace. NB refers to the optimal block size for the
-*       immediately following subroutine, as returned by ILAENV.)
-*
-      IF( INFO.EQ.0 ) THEN
-         MINWRK = 1
-         MAXWRK = 1
-         IF( M.GE.N .AND. MINMN.GT.0 ) THEN
-*
-*           Space needed for CBDSQR is BDSPAC = 5*N
-*
-            MNTHR = ILAENV( 6, 'CGESVD', JOBU // JOBVT, M, N, 0, 0 )
-            IF( M.GE.MNTHR ) THEN
-               IF( WNTUN ) THEN
-*
-*                 Path 1 (M much larger than N, JOBU='N')
-*
-                  MAXWRK = N + N*ILAENV( 1, 'CGEQRF', ' ', M, N, -1,
-     $                     -1 )
-                  MAXWRK = MAX( MAXWRK, 2*N+2*N*
-     $                     ILAENV( 1, 'CGEBRD', ' ', N, N, -1, -1 ) )
-                  IF( WNTVO .OR. WNTVAS )
-     $               MAXWRK = MAX( MAXWRK, 2*N+( N-1 )*
-     $                        ILAENV( 1, 'CUNGBR', 'P', N, N, N, -1 ) )
-                  MINWRK = 3*N
-               ELSE IF( WNTUO .AND. WNTVN ) THEN
-*
-*                 Path 2 (M much larger than N, JOBU='O', JOBVT='N')
-*
-                  WRKBL = N + N*ILAENV( 1, 'CGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'CUNGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+2*N*
-     $                    ILAENV( 1, 'CGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+N*
-     $                    ILAENV( 1, 'CUNGBR', 'Q', N, N, N, -1 ) )
-                  MAXWRK = MAX( N*N+WRKBL, N*N+M*N )
-                  MINWRK = 2*N + M
-               ELSE IF( WNTUO .AND. WNTVAS ) THEN
-*
-*                 Path 3 (M much larger than N, JOBU='O', JOBVT='S' or
-*                 'A')
-*
-                  WRKBL = N + N*ILAENV( 1, 'CGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'CUNGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+2*N*
-     $                    ILAENV( 1, 'CGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+N*
-     $                    ILAENV( 1, 'CUNGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+( N-1 )*
-     $                    ILAENV( 1, 'CUNGBR', 'P', N, N, N, -1 ) )
-                  MAXWRK = MAX( N*N+WRKBL, N*N+M*N )
-                  MINWRK = 2*N + M
-               ELSE IF( WNTUS .AND. WNTVN ) THEN
-*
-*                 Path 4 (M much larger than N, JOBU='S', JOBVT='N')
-*
-                  WRKBL = N + N*ILAENV( 1, 'CGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'CUNGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+2*N*
-     $                    ILAENV( 1, 'CGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+N*
-     $                    ILAENV( 1, 'CUNGBR', 'Q', N, N, N, -1 ) )
-                  MAXWRK = N*N + WRKBL
-                  MINWRK = 2*N + M
-               ELSE IF( WNTUS .AND. WNTVO ) THEN
-*
-*                 Path 5 (M much larger than N, JOBU='S', JOBVT='O')
-*
-                  WRKBL = N + N*ILAENV( 1, 'CGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'CUNGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+2*N*
-     $                    ILAENV( 1, 'CGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+N*
-     $                    ILAENV( 1, 'CUNGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+( N-1 )*
-     $                    ILAENV( 1, 'CUNGBR', 'P', N, N, N, -1 ) )
-                  MAXWRK = 2*N*N + WRKBL
-                  MINWRK = 2*N + M
-               ELSE IF( WNTUS .AND. WNTVAS ) THEN
-*
-*                 Path 6 (M much larger than N, JOBU='S', JOBVT='S' or
-*                 'A')
-*
-                  WRKBL = N + N*ILAENV( 1, 'CGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'CUNGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+2*N*
-     $                    ILAENV( 1, 'CGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+N*
-     $                    ILAENV( 1, 'CUNGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+( N-1 )*
-     $                    ILAENV( 1, 'CUNGBR', 'P', N, N, N, -1 ) )
-                  MAXWRK = N*N + WRKBL
-                  MINWRK = 2*N + M
-               ELSE IF( WNTUA .AND. WNTVN ) THEN
-*
-*                 Path 7 (M much larger than N, JOBU='A', JOBVT='N')
-*
-                  WRKBL = N + N*ILAENV( 1, 'CGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+M*ILAENV( 1, 'CUNGQR', ' ', M,
-     $                    M, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+2*N*
-     $                    ILAENV( 1, 'CGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+N*
-     $                    ILAENV( 1, 'CUNGBR', 'Q', N, N, N, -1 ) )
-                  MAXWRK = N*N + WRKBL
-                  MINWRK = 2*N + M
-               ELSE IF( WNTUA .AND. WNTVO ) THEN
-*
-*                 Path 8 (M much larger than N, JOBU='A', JOBVT='O')
-*
-                  WRKBL = N + N*ILAENV( 1, 'CGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+M*ILAENV( 1, 'CUNGQR', ' ', M,
-     $                    M, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+2*N*
-     $                    ILAENV( 1, 'CGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+N*
-     $                    ILAENV( 1, 'CUNGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+( N-1 )*
-     $                    ILAENV( 1, 'CUNGBR', 'P', N, N, N, -1 ) )
-                  MAXWRK = 2*N*N + WRKBL
-                  MINWRK = 2*N + M
-               ELSE IF( WNTUA .AND. WNTVAS ) THEN
-*
-*                 Path 9 (M much larger than N, JOBU='A', JOBVT='S' or
-*                 'A')
-*
-                  WRKBL = N + N*ILAENV( 1, 'CGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+M*ILAENV( 1, 'CUNGQR', ' ', M,
-     $                    M, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+2*N*
-     $                    ILAENV( 1, 'CGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+N*
-     $                    ILAENV( 1, 'CUNGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+( N-1 )*
-     $                    ILAENV( 1, 'CUNGBR', 'P', N, N, N, -1 ) )
-                  MAXWRK = N*N + WRKBL
-                  MINWRK = 2*N + M
-               END IF
-            ELSE
-*
-*              Path 10 (M at least N, but not much larger)
-*
-               MAXWRK = 2*N + ( M+N )*ILAENV( 1, 'CGEBRD', ' ', M, N,
-     $                  -1, -1 )
-               IF( WNTUS .OR. WNTUO )
-     $            MAXWRK = MAX( MAXWRK, 2*N+N*
-     $                     ILAENV( 1, 'CUNGBR', 'Q', M, N, N, -1 ) )
-               IF( WNTUA )
-     $            MAXWRK = MAX( MAXWRK, 2*N+M*
-     $                     ILAENV( 1, 'CUNGBR', 'Q', M, M, N, -1 ) )
-               IF( .NOT.WNTVN )
-     $            MAXWRK = MAX( MAXWRK, 2*N+( N-1 )*
-     $                     ILAENV( 1, 'CUNGBR', 'P', N, N, N, -1 ) )
-               MINWRK = 2*N + M
-            END IF
-         ELSE IF( MINMN.GT.0 ) THEN
-*
-*           Space needed for CBDSQR is BDSPAC = 5*M
-*
-            MNTHR = ILAENV( 6, 'CGESVD', JOBU // JOBVT, M, N, 0, 0 )
-            IF( N.GE.MNTHR ) THEN
-               IF( WNTVN ) THEN
-*
-*                 Path 1t(N much larger than M, JOBVT='N')
-*
-                  MAXWRK = M + M*ILAENV( 1, 'CGELQF', ' ', M, N, -1,
-     $                     -1 )
-                  MAXWRK = MAX( MAXWRK, 2*M+2*M*
-     $                     ILAENV( 1, 'CGEBRD', ' ', M, M, -1, -1 ) )
-                  IF( WNTUO .OR. WNTUAS )
-     $               MAXWRK = MAX( MAXWRK, 2*M+M*
-     $                        ILAENV( 1, 'CUNGBR', 'Q', M, M, M, -1 ) )
-                  MINWRK = 3*M
-               ELSE IF( WNTVO .AND. WNTUN ) THEN
-*
-*                 Path 2t(N much larger than M, JOBU='N', JOBVT='O')
-*
-                  WRKBL = M + M*ILAENV( 1, 'CGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'CUNGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+2*M*
-     $                    ILAENV( 1, 'CGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+( M-1 )*
-     $                    ILAENV( 1, 'CUNGBR', 'P', M, M, M, -1 ) )
-                  MAXWRK = MAX( M*M+WRKBL, M*M+M*N )
-                  MINWRK = 2*M + N
-               ELSE IF( WNTVO .AND. WNTUAS ) THEN
-*
-*                 Path 3t(N much larger than M, JOBU='S' or 'A',
-*                 JOBVT='O')
-*
-                  WRKBL = M + M*ILAENV( 1, 'CGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'CUNGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+2*M*
-     $                    ILAENV( 1, 'CGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+( M-1 )*
-     $                    ILAENV( 1, 'CUNGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+M*
-     $                    ILAENV( 1, 'CUNGBR', 'Q', M, M, M, -1 ) )
-                  MAXWRK = MAX( M*M+WRKBL, M*M+M*N )
-                  MINWRK = 2*M + N
-               ELSE IF( WNTVS .AND. WNTUN ) THEN
-*
-*                 Path 4t(N much larger than M, JOBU='N', JOBVT='S')
-*
-                  WRKBL = M + M*ILAENV( 1, 'CGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'CUNGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+2*M*
-     $                    ILAENV( 1, 'CGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+( M-1 )*
-     $                    ILAENV( 1, 'CUNGBR', 'P', M, M, M, -1 ) )
-                  MAXWRK = M*M + WRKBL
-                  MINWRK = 2*M + N
-               ELSE IF( WNTVS .AND. WNTUO ) THEN
-*
-*                 Path 5t(N much larger than M, JOBU='O', JOBVT='S')
-*
-                  WRKBL = M + M*ILAENV( 1, 'CGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'CUNGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+2*M*
-     $                    ILAENV( 1, 'CGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+( M-1 )*
-     $                    ILAENV( 1, 'CUNGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+M*
-     $                    ILAENV( 1, 'CUNGBR', 'Q', M, M, M, -1 ) )
-                  MAXWRK = 2*M*M + WRKBL
-                  MINWRK = 2*M + N
-               ELSE IF( WNTVS .AND. WNTUAS ) THEN
-*
-*                 Path 6t(N much larger than M, JOBU='S' or 'A',
-*                 JOBVT='S')
-*
-                  WRKBL = M + M*ILAENV( 1, 'CGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'CUNGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+2*M*
-     $                    ILAENV( 1, 'CGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+( M-1 )*
-     $                    ILAENV( 1, 'CUNGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+M*
-     $                    ILAENV( 1, 'CUNGBR', 'Q', M, M, M, -1 ) )
-                  MAXWRK = M*M + WRKBL
-                  MINWRK = 2*M + N
-               ELSE IF( WNTVA .AND. WNTUN ) THEN
-*
-*                 Path 7t(N much larger than M, JOBU='N', JOBVT='A')
-*
-                  WRKBL = M + M*ILAENV( 1, 'CGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+N*ILAENV( 1, 'CUNGLQ', ' ', N,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+2*M*
-     $                    ILAENV( 1, 'CGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+( M-1 )*
-     $                    ILAENV( 1, 'CUNGBR', 'P', M, M, M, -1 ) )
-                  MAXWRK = M*M + WRKBL
-                  MINWRK = 2*M + N
-               ELSE IF( WNTVA .AND. WNTUO ) THEN
-*
-*                 Path 8t(N much larger than M, JOBU='O', JOBVT='A')
-*
-                  WRKBL = M + M*ILAENV( 1, 'CGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+N*ILAENV( 1, 'CUNGLQ', ' ', N,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+2*M*
-     $                    ILAENV( 1, 'CGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+( M-1 )*
-     $                    ILAENV( 1, 'CUNGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+M*
-     $                    ILAENV( 1, 'CUNGBR', 'Q', M, M, M, -1 ) )
-                  MAXWRK = 2*M*M + WRKBL
-                  MINWRK = 2*M + N
-               ELSE IF( WNTVA .AND. WNTUAS ) THEN
-*
-*                 Path 9t(N much larger than M, JOBU='S' or 'A',
-*                 JOBVT='A')
-*
-                  WRKBL = M + M*ILAENV( 1, 'CGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+N*ILAENV( 1, 'CUNGLQ', ' ', N,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+2*M*
-     $                    ILAENV( 1, 'CGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+( M-1 )*
-     $                    ILAENV( 1, 'CUNGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+M*
-     $                    ILAENV( 1, 'CUNGBR', 'Q', M, M, M, -1 ) )
-                  MAXWRK = M*M + WRKBL
-                  MINWRK = 2*M + N
-               END IF
-            ELSE
-*
-*              Path 10t(N greater than M, but not much larger)
-*
-               MAXWRK = 2*M + ( M+N )*ILAENV( 1, 'CGEBRD', ' ', M, N,
-     $                  -1, -1 )
-               IF( WNTVS .OR. WNTVO )
-     $            MAXWRK = MAX( MAXWRK, 2*M+M*
-     $                     ILAENV( 1, 'CUNGBR', 'P', M, N, M, -1 ) )
-               IF( WNTVA )
-     $            MAXWRK = MAX( MAXWRK, 2*M+N*
-     $                     ILAENV( 1, 'CUNGBR', 'P', N, N, M, -1 ) )
-               IF( .NOT.WNTUN )
-     $            MAXWRK = MAX( MAXWRK, 2*M+( M-1 )*
-     $                     ILAENV( 1, 'CUNGBR', 'Q', M, M, M, -1 ) )
-               MINWRK = 2*M + N
-            END IF
-         END IF
-         MAXWRK = MAX( MINWRK, MAXWRK )
-         WORK( 1 ) = MAXWRK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
-            INFO = -13
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGESVD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         RETURN
-      END IF
-*
-*     Get machine constants
-*
-      EPS = SLAMCH( 'P' )
-      SMLNUM = SQRT( SLAMCH( 'S' ) ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = CLANGE( 'M', M, N, A, LDA, DUM )
-      ISCL = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-         ISCL = 1
-         CALL CLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, IERR )
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-         ISCL = 1
-         CALL CLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, IERR )
-      END IF
-*
-      IF( M.GE.N ) THEN
-*
-*        A has at least as many rows as columns. If A has sufficiently
-*        more rows than columns, first reduce using the QR
-*        decomposition (if sufficient workspace available)
-*
-         IF( M.GE.MNTHR ) THEN
-*
-            IF( WNTUN ) THEN
-*
-*              Path 1 (M much larger than N, JOBU='N')
-*              No left singular vectors to be computed
-*
-               ITAU = 1
-               IWORK = ITAU + N
-*
-*              Compute A=Q*R
-*              (CWorkspace: need 2*N, prefer N+N*NB)
-*              (RWorkspace: need 0)
-*
-               CALL CGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
-     $                      LWORK-IWORK+1, IERR )
-*
-*              Zero out below R
-*
-               CALL CLASET( 'L', N-1, N-1, CZERO, CZERO, A( 2, 1 ),
-     $                      LDA )
-               IE = 1
-               ITAUQ = 1
-               ITAUP = ITAUQ + N
-               IWORK = ITAUP + N
-*
-*              Bidiagonalize R in A
-*              (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
-*              (RWorkspace: need N)
-*
-               CALL CGEBRD( N, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
-     $                      WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                      IERR )
-               NCVT = 0
-               IF( WNTVO .OR. WNTVAS ) THEN
-*
-*                 If right singular vectors desired, generate P'.
-*                 (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  NCVT = N
-               END IF
-               IRWORK = IE + N
-*
-*              Perform bidiagonal QR iteration, computing right
-*              singular vectors of A in A if desired
-*              (CWorkspace: 0)
-*              (RWorkspace: need BDSPAC)
-*
-               CALL CBDSQR( 'U', N, NCVT, 0, 0, S, RWORK( IE ), A, LDA,
-     $                      CDUM, 1, CDUM, 1, RWORK( IRWORK ), INFO )
-*
-*              If right singular vectors desired in VT, copy them there
-*
-               IF( WNTVAS )
-     $            CALL CLACPY( 'F', N, N, A, LDA, VT, LDVT )
-*
-            ELSE IF( WNTUO .AND. WNTVN ) THEN
-*
-*              Path 2 (M much larger than N, JOBU='O', JOBVT='N')
-*              N left singular vectors to be overwritten on A and
-*              no right singular vectors to be computed
-*
-               IF( LWORK.GE.N*N+3*N ) THEN
-*
-*                 Sufficient workspace for a fast algorithm
-*
-                  IR = 1
-                  IF( LWORK.GE.MAX( WRKBL, LDA*N )+LDA*N ) THEN
-*
-*                    WORK(IU) is LDA by N, WORK(IR) is LDA by N
-*
-                     LDWRKU = LDA
-                     LDWRKR = LDA
-                  ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N )+N*N ) THEN
-*
-*                    WORK(IU) is LDA by N, WORK(IR) is N by N
-*
-                     LDWRKU = LDA
-                     LDWRKR = N
-                  ELSE
-*
-*                    WORK(IU) is LDWRKU by N, WORK(IR) is N by N
-*
-                     LDWRKU = ( LWORK-N*N ) / N
-                     LDWRKR = N
-                  END IF
-                  ITAU = IR + LDWRKR*N
-                  IWORK = ITAU + N
-*
-*                 Compute A=Q*R
-*                 (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy R to WORK(IR) and zero out below it
-*
-                  CALL CLACPY( 'U', N, N, A, LDA, WORK( IR ), LDWRKR )
-                  CALL CLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                         WORK( IR+1 ), LDWRKR )
-*
-*                 Generate Q in A
-*                 (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = 1
-                  ITAUQ = ITAU
-                  ITAUP = ITAUQ + N
-                  IWORK = ITAUP + N
-*
-*                 Bidiagonalize R in WORK(IR)
-*                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
-*                 (RWorkspace: need N)
-*
-                  CALL CGEBRD( N, N, WORK( IR ), LDWRKR, S, RWORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Generate left vectors bidiagonalizing R
-*                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
-*                 (RWorkspace: need 0)
-*
-                  CALL CUNGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
-     $                         WORK( ITAUQ ), WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-                  IRWORK = IE + N
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of R in WORK(IR)
-*                 (CWorkspace: need N*N)
-*                 (RWorkspace: need BDSPAC)
-*
-                  CALL CBDSQR( 'U', N, 0, N, 0, S, RWORK( IE ), CDUM, 1,
-     $                         WORK( IR ), LDWRKR, CDUM, 1,
-     $                         RWORK( IRWORK ), INFO )
-                  IU = ITAUQ
-*
-*                 Multiply Q in A by left singular vectors of R in
-*                 WORK(IR), storing result in WORK(IU) and copying to A
-*                 (CWorkspace: need N*N+N, prefer N*N+M*N)
-*                 (RWorkspace: 0)
-*
-                  DO 10 I = 1, M, LDWRKU
-                     CHUNK = MIN( M-I+1, LDWRKU )
-                     CALL CGEMM( 'N', 'N', CHUNK, N, N, CONE, A( I, 1 ),
-     $                           LDA, WORK( IR ), LDWRKR, CZERO,
-     $                           WORK( IU ), LDWRKU )
-                     CALL CLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU,
-     $                            A( I, 1 ), LDA )
-   10             CONTINUE
-*
-               ELSE
-*
-*                 Insufficient workspace for a fast algorithm
-*
-                  IE = 1
-                  ITAUQ = 1
-                  ITAUP = ITAUQ + N
-                  IWORK = ITAUP + N
-*
-*                 Bidiagonalize A
-*                 (CWorkspace: need 2*N+M, prefer 2*N+(M+N)*NB)
-*                 (RWorkspace: N)
-*
-                  CALL CGEBRD( M, N, A, LDA, S, RWORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Generate left vectors bidiagonalizing A
-*                 (CWorkspace: need 3*N, prefer 2*N+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNGBR( 'Q', M, N, N, A, LDA, WORK( ITAUQ ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IRWORK = IE + N
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of A in A
-*                 (CWorkspace: need 0)
-*                 (RWorkspace: need BDSPAC)
-*
-                  CALL CBDSQR( 'U', N, 0, M, 0, S, RWORK( IE ), CDUM, 1,
-     $                         A, LDA, CDUM, 1, RWORK( IRWORK ), INFO )
-*
-               END IF
-*
-            ELSE IF( WNTUO .AND. WNTVAS ) THEN
-*
-*              Path 3 (M much larger than N, JOBU='O', JOBVT='S' or 'A')
-*              N left singular vectors to be overwritten on A and
-*              N right singular vectors to be computed in VT
-*
-               IF( LWORK.GE.N*N+3*N ) THEN
-*
-*                 Sufficient workspace for a fast algorithm
-*
-                  IR = 1
-                  IF( LWORK.GE.MAX( WRKBL, LDA*N )+LDA*N ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is LDA by N
-*
-                     LDWRKU = LDA
-                     LDWRKR = LDA
-                  ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N )+N*N ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is N by N
-*
-                     LDWRKU = LDA
-                     LDWRKR = N
-                  ELSE
-*
-*                    WORK(IU) is LDWRKU by N and WORK(IR) is N by N
-*
-                     LDWRKU = ( LWORK-N*N ) / N
-                     LDWRKR = N
-                  END IF
-                  ITAU = IR + LDWRKR*N
-                  IWORK = ITAU + N
-*
-*                 Compute A=Q*R
-*                 (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy R to VT, zeroing out below it
-*
-                  CALL CLACPY( 'U', N, N, A, LDA, VT, LDVT )
-                  IF( N.GT.1 )
-     $               CALL CLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            VT( 2, 1 ), LDVT )
-*
-*                 Generate Q in A
-*                 (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = 1
-                  ITAUQ = ITAU
-                  ITAUP = ITAUQ + N
-                  IWORK = ITAUP + N
-*
-*                 Bidiagonalize R in VT, copying result to WORK(IR)
-*                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
-*                 (RWorkspace: need N)
-*
-                  CALL CGEBRD( N, N, VT, LDVT, S, RWORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  CALL CLACPY( 'L', N, N, VT, LDVT, WORK( IR ), LDWRKR )
-*
-*                 Generate left vectors bidiagonalizing R in WORK(IR)
-*                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
-     $                         WORK( ITAUQ ), WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-*
-*                 Generate right vectors bidiagonalizing R in VT
-*                 (CWorkspace: need N*N+3*N-1, prefer N*N+2*N+(N-1)*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IRWORK = IE + N
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of R in WORK(IR) and computing right
-*                 singular vectors of R in VT
-*                 (CWorkspace: need N*N)
-*                 (RWorkspace: need BDSPAC)
-*
-                  CALL CBDSQR( 'U', N, N, N, 0, S, RWORK( IE ), VT,
-     $                         LDVT, WORK( IR ), LDWRKR, CDUM, 1,
-     $                         RWORK( IRWORK ), INFO )
-                  IU = ITAUQ
-*
-*                 Multiply Q in A by left singular vectors of R in
-*                 WORK(IR), storing result in WORK(IU) and copying to A
-*                 (CWorkspace: need N*N+N, prefer N*N+M*N)
-*                 (RWorkspace: 0)
-*
-                  DO 20 I = 1, M, LDWRKU
-                     CHUNK = MIN( M-I+1, LDWRKU )
-                     CALL CGEMM( 'N', 'N', CHUNK, N, N, CONE, A( I, 1 ),
-     $                           LDA, WORK( IR ), LDWRKR, CZERO,
-     $                           WORK( IU ), LDWRKU )
-                     CALL CLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU,
-     $                            A( I, 1 ), LDA )
-   20             CONTINUE
-*
-               ELSE
-*
-*                 Insufficient workspace for a fast algorithm
-*
-                  ITAU = 1
-                  IWORK = ITAU + N
-*
-*                 Compute A=Q*R
-*                 (CWorkspace: need 2*N, prefer N+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy R to VT, zeroing out below it
-*
-                  CALL CLACPY( 'U', N, N, A, LDA, VT, LDVT )
-                  IF( N.GT.1 )
-     $               CALL CLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            VT( 2, 1 ), LDVT )
-*
-*                 Generate Q in A
-*                 (CWorkspace: need 2*N, prefer N+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = 1
-                  ITAUQ = ITAU
-                  ITAUP = ITAUQ + N
-                  IWORK = ITAUP + N
-*
-*                 Bidiagonalize R in VT
-*                 (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
-*                 (RWorkspace: N)
-*
-                  CALL CGEBRD( N, N, VT, LDVT, S, RWORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Multiply Q in A by left vectors bidiagonalizing R
-*                 (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNMBR( 'Q', 'R', 'N', M, N, N, VT, LDVT,
-     $                         WORK( ITAUQ ), A, LDA, WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-*
-*                 Generate right vectors bidiagonalizing R in VT
-*                 (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IRWORK = IE + N
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of A in A and computing right
-*                 singular vectors of A in VT
-*                 (CWorkspace: 0)
-*                 (RWorkspace: need BDSPAC)
-*
-                  CALL CBDSQR( 'U', N, N, M, 0, S, RWORK( IE ), VT,
-     $                         LDVT, A, LDA, CDUM, 1, RWORK( IRWORK ),
-     $                         INFO )
-*
-               END IF
-*
-            ELSE IF( WNTUS ) THEN
-*
-               IF( WNTVN ) THEN
-*
-*                 Path 4 (M much larger than N, JOBU='S', JOBVT='N')
-*                 N left singular vectors to be computed in U and
-*                 no right singular vectors to be computed
-*
-                  IF( LWORK.GE.N*N+3*N ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IR = 1
-                     IF( LWORK.GE.WRKBL+LDA*N ) THEN
-*
-*                       WORK(IR) is LDA by N
-*
-                        LDWRKR = LDA
-                     ELSE
-*
-*                       WORK(IR) is N by N
-*
-                        LDWRKR = N
-                     END IF
-                     ITAU = IR + LDWRKR*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R
-*                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IR), zeroing out below it
-*
-                     CALL CLACPY( 'U', N, N, A, LDA, WORK( IR ),
-     $                            LDWRKR )
-                     CALL CLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            WORK( IR+1 ), LDWRKR )
-*
-*                    Generate Q in A
-*                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IR)
-*                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL CGEBRD( N, N, WORK( IR ), LDWRKR, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left vectors bidiagonalizing R in WORK(IR)
-*                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IR)
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', N, 0, N, 0, S, RWORK( IE ), CDUM,
-     $                            1, WORK( IR ), LDWRKR, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-*                    Multiply Q in A by left singular vectors of R in
-*                    WORK(IR), storing result in U
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEMM( 'N', 'N', M, N, N, CONE, A, LDA,
-     $                           WORK( IR ), LDWRKR, CZERO, U, LDU )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGQR( M, N, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Zero out below R in A
-*
-                     CALL CLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            A( 2, 1 ), LDA )
-*
-*                    Bidiagonalize R in A
-*                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL CGEBRD( N, N, A, LDA, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left vectors bidiagonalizing R
-*                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNMBR( 'Q', 'R', 'N', M, N, N, A, LDA,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', N, 0, M, 0, S, RWORK( IE ), CDUM,
-     $                            1, U, LDU, CDUM, 1, RWORK( IRWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTVO ) THEN
-*
-*                 Path 5 (M much larger than N, JOBU='S', JOBVT='O')
-*                 N left singular vectors to be computed in U and
-*                 N right singular vectors to be overwritten on A
-*
-                  IF( LWORK.GE.2*N*N+3*N ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+2*LDA*N ) THEN
-*
-*                       WORK(IU) is LDA by N and WORK(IR) is LDA by N
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*N
-                        LDWRKR = LDA
-                     ELSE IF( LWORK.GE.WRKBL+( LDA+N )*N ) THEN
-*
-*                       WORK(IU) is LDA by N and WORK(IR) is N by N
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*N
-                        LDWRKR = N
-                     ELSE
-*
-*                       WORK(IU) is N by N and WORK(IR) is N by N
-*
-                        LDWRKU = N
-                        IR = IU + LDWRKU*N
-                        LDWRKR = N
-                     END IF
-                     ITAU = IR + LDWRKR*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R
-*                    (CWorkspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IU), zeroing out below it
-*
-                     CALL CLACPY( 'U', N, N, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL CLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            WORK( IU+1 ), LDWRKU )
-*
-*                    Generate Q in A
-*                    (CWorkspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IU), copying result to
-*                    WORK(IR)
-*                    (CWorkspace: need   2*N*N+3*N,
-*                                 prefer 2*N*N+2*N+2*N*NB)
-*                    (RWorkspace: need   N)
-*
-                     CALL CGEBRD( N, N, WORK( IU ), LDWRKU, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'U', N, N, WORK( IU ), LDWRKU,
-     $                            WORK( IR ), LDWRKR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IU)
-*                    (CWorkspace: need 2*N*N+3*N, prefer 2*N*N+2*N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IR)
-*                    (CWorkspace: need   2*N*N+3*N-1,
-*                                 prefer 2*N*N+2*N+(N-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'P', N, N, N, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IU) and computing
-*                    right singular vectors of R in WORK(IR)
-*                    (CWorkspace: need 2*N*N)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', N, N, N, 0, S, RWORK( IE ),
-     $                            WORK( IR ), LDWRKR, WORK( IU ),
-     $                            LDWRKU, CDUM, 1, RWORK( IRWORK ),
-     $                            INFO )
-*
-*                    Multiply Q in A by left singular vectors of R in
-*                    WORK(IU), storing result in U
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEMM( 'N', 'N', M, N, N, CONE, A, LDA,
-     $                           WORK( IU ), LDWRKU, CZERO, U, LDU )
-*
-*                    Copy right singular vectors of R to A
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: 0)
-*
-                     CALL CLACPY( 'F', N, N, WORK( IR ), LDWRKR, A,
-     $                            LDA )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGQR( M, N, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Zero out below R in A
-*
-                     CALL CLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            A( 2, 1 ), LDA )
-*
-*                    Bidiagonalize R in A
-*                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL CGEBRD( N, N, A, LDA, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left vectors bidiagonalizing R
-*                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNMBR( 'Q', 'R', 'N', M, N, N, A, LDA,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right vectors bidiagonalizing R in A
-*                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in A
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', N, N, M, 0, S, RWORK( IE ), A,
-     $                            LDA, U, LDU, CDUM, 1, RWORK( IRWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTVAS ) THEN
-*
-*                 Path 6 (M much larger than N, JOBU='S', JOBVT='S'
-*                         or 'A')
-*                 N left singular vectors to be computed in U and
-*                 N right singular vectors to be computed in VT
-*
-                  IF( LWORK.GE.N*N+3*N ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+LDA*N ) THEN
-*
-*                       WORK(IU) is LDA by N
-*
-                        LDWRKU = LDA
-                     ELSE
-*
-*                       WORK(IU) is N by N
-*
-                        LDWRKU = N
-                     END IF
-                     ITAU = IU + LDWRKU*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R
-*                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IU), zeroing out below it
-*
-                     CALL CLACPY( 'U', N, N, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL CLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            WORK( IU+1 ), LDWRKU )
-*
-*                    Generate Q in A
-*                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IU), copying result to VT
-*                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL CGEBRD( N, N, WORK( IU ), LDWRKU, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'U', N, N, WORK( IU ), LDWRKU, VT,
-     $                            LDVT )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IU)
-*                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in VT
-*                    (CWorkspace: need   N*N+3*N-1,
-*                                 prefer N*N+2*N+(N-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IU) and computing
-*                    right singular vectors of R in VT
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', N, N, N, 0, S, RWORK( IE ), VT,
-     $                            LDVT, WORK( IU ), LDWRKU, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-*                    Multiply Q in A by left singular vectors of R in
-*                    WORK(IU), storing result in U
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEMM( 'N', 'N', M, N, N, CONE, A, LDA,
-     $                           WORK( IU ), LDWRKU, CZERO, U, LDU )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGQR( M, N, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to VT, zeroing out below it
-*
-                     CALL CLACPY( 'U', N, N, A, LDA, VT, LDVT )
-                     IF( N.GT.1 )
-     $                  CALL CLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                               VT( 2, 1 ), LDVT )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in VT
-*                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL CGEBRD( N, N, VT, LDVT, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left bidiagonalizing vectors
-*                    in VT
-*                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNMBR( 'Q', 'R', 'N', M, N, N, VT, LDVT,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in VT
-*                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in VT
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', N, N, M, 0, S, RWORK( IE ), VT,
-     $                            LDVT, U, LDU, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-                  END IF
-*
-               END IF
-*
-            ELSE IF( WNTUA ) THEN
-*
-               IF( WNTVN ) THEN
-*
-*                 Path 7 (M much larger than N, JOBU='A', JOBVT='N')
-*                 M left singular vectors to be computed in U and
-*                 no right singular vectors to be computed
-*
-                  IF( LWORK.GE.N*N+MAX( N+M, 3*N ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IR = 1
-                     IF( LWORK.GE.WRKBL+LDA*N ) THEN
-*
-*                       WORK(IR) is LDA by N
-*
-                        LDWRKR = LDA
-                     ELSE
-*
-*                       WORK(IR) is N by N
-*
-                        LDWRKR = N
-                     END IF
-                     ITAU = IR + LDWRKR*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Copy R to WORK(IR), zeroing out below it
-*
-                     CALL CLACPY( 'U', N, N, A, LDA, WORK( IR ),
-     $                            LDWRKR )
-                     CALL CLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            WORK( IR+1 ), LDWRKR )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need N*N+N+M, prefer N*N+N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IR)
-*                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL CGEBRD( N, N, WORK( IR ), LDWRKR, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IR)
-*                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IR)
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', N, 0, N, 0, S, RWORK( IE ), CDUM,
-     $                            1, WORK( IR ), LDWRKR, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-*                    Multiply Q in U by left singular vectors of R in
-*                    WORK(IR), storing result in A
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEMM( 'N', 'N', M, N, N, CONE, U, LDU,
-     $                           WORK( IR ), LDWRKR, CZERO, A, LDA )
-*
-*                    Copy left singular vectors of A from A to U
-*
-                     CALL CLACPY( 'F', M, N, A, LDA, U, LDU )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need N+M, prefer N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Zero out below R in A
-*
-                     CALL CLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            A( 2, 1 ), LDA )
-*
-*                    Bidiagonalize R in A
-*                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL CGEBRD( N, N, A, LDA, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left bidiagonalizing vectors
-*                    in A
-*                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNMBR( 'Q', 'R', 'N', M, N, N, A, LDA,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', N, 0, M, 0, S, RWORK( IE ), CDUM,
-     $                            1, U, LDU, CDUM, 1, RWORK( IRWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTVO ) THEN
-*
-*                 Path 8 (M much larger than N, JOBU='A', JOBVT='O')
-*                 M left singular vectors to be computed in U and
-*                 N right singular vectors to be overwritten on A
-*
-                  IF( LWORK.GE.2*N*N+MAX( N+M, 3*N ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+2*LDA*N ) THEN
-*
-*                       WORK(IU) is LDA by N and WORK(IR) is LDA by N
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*N
-                        LDWRKR = LDA
-                     ELSE IF( LWORK.GE.WRKBL+( LDA+N )*N ) THEN
-*
-*                       WORK(IU) is LDA by N and WORK(IR) is N by N
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*N
-                        LDWRKR = N
-                     ELSE
-*
-*                       WORK(IU) is N by N and WORK(IR) is N by N
-*
-                        LDWRKU = N
-                        IR = IU + LDWRKU*N
-                        LDWRKR = N
-                     END IF
-                     ITAU = IR + LDWRKR*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need 2*N*N+N+M, prefer 2*N*N+N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IU), zeroing out below it
-*
-                     CALL CLACPY( 'U', N, N, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL CLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            WORK( IU+1 ), LDWRKU )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IU), copying result to
-*                    WORK(IR)
-*                    (CWorkspace: need   2*N*N+3*N,
-*                                 prefer 2*N*N+2*N+2*N*NB)
-*                    (RWorkspace: need   N)
-*
-                     CALL CGEBRD( N, N, WORK( IU ), LDWRKU, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'U', N, N, WORK( IU ), LDWRKU,
-     $                            WORK( IR ), LDWRKR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IU)
-*                    (CWorkspace: need 2*N*N+3*N, prefer 2*N*N+2*N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IR)
-*                    (CWorkspace: need   2*N*N+3*N-1,
-*                                 prefer 2*N*N+2*N+(N-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'P', N, N, N, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IU) and computing
-*                    right singular vectors of R in WORK(IR)
-*                    (CWorkspace: need 2*N*N)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', N, N, N, 0, S, RWORK( IE ),
-     $                            WORK( IR ), LDWRKR, WORK( IU ),
-     $                            LDWRKU, CDUM, 1, RWORK( IRWORK ),
-     $                            INFO )
-*
-*                    Multiply Q in U by left singular vectors of R in
-*                    WORK(IU), storing result in A
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEMM( 'N', 'N', M, N, N, CONE, U, LDU,
-     $                           WORK( IU ), LDWRKU, CZERO, A, LDA )
-*
-*                    Copy left singular vectors of A from A to U
-*
-                     CALL CLACPY( 'F', M, N, A, LDA, U, LDU )
-*
-*                    Copy right singular vectors of R from WORK(IR) to A
-*
-                     CALL CLACPY( 'F', N, N, WORK( IR ), LDWRKR, A,
-     $                            LDA )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need N+M, prefer N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Zero out below R in A
-*
-                     CALL CLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            A( 2, 1 ), LDA )
-*
-*                    Bidiagonalize R in A
-*                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL CGEBRD( N, N, A, LDA, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left bidiagonalizing vectors
-*                    in A
-*                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNMBR( 'Q', 'R', 'N', M, N, N, A, LDA,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in A
-*                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in A
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', N, N, M, 0, S, RWORK( IE ), A,
-     $                            LDA, U, LDU, CDUM, 1, RWORK( IRWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTVAS ) THEN
-*
-*                 Path 9 (M much larger than N, JOBU='A', JOBVT='S'
-*                         or 'A')
-*                 M left singular vectors to be computed in U and
-*                 N right singular vectors to be computed in VT
-*
-                  IF( LWORK.GE.N*N+MAX( N+M, 3*N ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+LDA*N ) THEN
-*
-*                       WORK(IU) is LDA by N
-*
-                        LDWRKU = LDA
-                     ELSE
-*
-*                       WORK(IU) is N by N
-*
-                        LDWRKU = N
-                     END IF
-                     ITAU = IU + LDWRKU*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need N*N+N+M, prefer N*N+N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IU), zeroing out below it
-*
-                     CALL CLACPY( 'U', N, N, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL CLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            WORK( IU+1 ), LDWRKU )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IU), copying result to VT
-*                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL CGEBRD( N, N, WORK( IU ), LDWRKU, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'U', N, N, WORK( IU ), LDWRKU, VT,
-     $                            LDVT )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IU)
-*                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in VT
-*                    (CWorkspace: need   N*N+3*N-1,
-*                                 prefer N*N+2*N+(N-1)*NB)
-*                    (RWorkspace: need   0)
-*
-                     CALL CUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IU) and computing
-*                    right singular vectors of R in VT
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', N, N, N, 0, S, RWORK( IE ), VT,
-     $                            LDVT, WORK( IU ), LDWRKU, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-*                    Multiply Q in U by left singular vectors of R in
-*                    WORK(IU), storing result in A
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEMM( 'N', 'N', M, N, N, CONE, U, LDU,
-     $                           WORK( IU ), LDWRKU, CZERO, A, LDA )
-*
-*                    Copy left singular vectors of A from A to U
-*
-                     CALL CLACPY( 'F', M, N, A, LDA, U, LDU )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need N+M, prefer N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R from A to VT, zeroing out below it
-*
-                     CALL CLACPY( 'U', N, N, A, LDA, VT, LDVT )
-                     IF( N.GT.1 )
-     $                  CALL CLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                               VT( 2, 1 ), LDVT )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in VT
-*                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL CGEBRD( N, N, VT, LDVT, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left bidiagonalizing vectors
-*                    in VT
-*                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNMBR( 'Q', 'R', 'N', M, N, N, VT, LDVT,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in VT
-*                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in VT
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', N, N, M, 0, S, RWORK( IE ), VT,
-     $                            LDVT, U, LDU, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-                  END IF
-*
-               END IF
-*
-            END IF
-*
-         ELSE
-*
-*           M .LT. MNTHR
-*
-*           Path 10 (M at least N, but not much larger)
-*           Reduce to bidiagonal form without QR decomposition
-*
-            IE = 1
-            ITAUQ = 1
-            ITAUP = ITAUQ + N
-            IWORK = ITAUP + N
-*
-*           Bidiagonalize A
-*           (CWorkspace: need 2*N+M, prefer 2*N+(M+N)*NB)
-*           (RWorkspace: need N)
-*
-            CALL CGEBRD( M, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
-     $                   WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                   IERR )
-            IF( WNTUAS ) THEN
-*
-*              If left singular vectors desired in U, copy result to U
-*              and generate left bidiagonalizing vectors in U
-*              (CWorkspace: need 2*N+NCU, prefer 2*N+NCU*NB)
-*              (RWorkspace: 0)
-*
-               CALL CLACPY( 'L', M, N, A, LDA, U, LDU )
-               IF( WNTUS )
-     $            NCU = N
-               IF( WNTUA )
-     $            NCU = M
-               CALL CUNGBR( 'Q', M, NCU, N, U, LDU, WORK( ITAUQ ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTVAS ) THEN
-*
-*              If right singular vectors desired in VT, copy result to
-*              VT and generate right bidiagonalizing vectors in VT
-*              (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*              (RWorkspace: 0)
-*
-               CALL CLACPY( 'U', N, N, A, LDA, VT, LDVT )
-               CALL CUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTUO ) THEN
-*
-*              If left singular vectors desired in A, generate left
-*              bidiagonalizing vectors in A
-*              (CWorkspace: need 3*N, prefer 2*N+N*NB)
-*              (RWorkspace: 0)
-*
-               CALL CUNGBR( 'Q', M, N, N, A, LDA, WORK( ITAUQ ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTVO ) THEN
-*
-*              If right singular vectors desired in A, generate right
-*              bidiagonalizing vectors in A
-*              (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*              (RWorkspace: 0)
-*
-               CALL CUNGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IRWORK = IE + N
-            IF( WNTUAS .OR. WNTUO )
-     $         NRU = M
-            IF( WNTUN )
-     $         NRU = 0
-            IF( WNTVAS .OR. WNTVO )
-     $         NCVT = N
-            IF( WNTVN )
-     $         NCVT = 0
-            IF( ( .NOT.WNTUO ) .AND. ( .NOT.WNTVO ) ) THEN
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in U and computing right singular
-*              vectors in VT
-*              (CWorkspace: 0)
-*              (RWorkspace: need BDSPAC)
-*
-               CALL CBDSQR( 'U', N, NCVT, NRU, 0, S, RWORK( IE ), VT,
-     $                      LDVT, U, LDU, CDUM, 1, RWORK( IRWORK ),
-     $                      INFO )
-            ELSE IF( ( .NOT.WNTUO ) .AND. WNTVO ) THEN
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in U and computing right singular
-*              vectors in A
-*              (CWorkspace: 0)
-*              (RWorkspace: need BDSPAC)
-*
-               CALL CBDSQR( 'U', N, NCVT, NRU, 0, S, RWORK( IE ), A,
-     $                      LDA, U, LDU, CDUM, 1, RWORK( IRWORK ),
-     $                      INFO )
-            ELSE
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in A and computing right singular
-*              vectors in VT
-*              (CWorkspace: 0)
-*              (RWorkspace: need BDSPAC)
-*
-               CALL CBDSQR( 'U', N, NCVT, NRU, 0, S, RWORK( IE ), VT,
-     $                      LDVT, A, LDA, CDUM, 1, RWORK( IRWORK ),
-     $                      INFO )
-            END IF
-*
-         END IF
-*
-      ELSE
-*
-*        A has more columns than rows. If A has sufficiently more
-*        columns than rows, first reduce using the LQ decomposition (if
-*        sufficient workspace available)
-*
-         IF( N.GE.MNTHR ) THEN
-*
-            IF( WNTVN ) THEN
-*
-*              Path 1t(N much larger than M, JOBVT='N')
-*              No right singular vectors to be computed
-*
-               ITAU = 1
-               IWORK = ITAU + M
-*
-*              Compute A=L*Q
-*              (CWorkspace: need 2*M, prefer M+M*NB)
-*              (RWorkspace: 0)
-*
-               CALL CGELQF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
-     $                      LWORK-IWORK+1, IERR )
-*
-*              Zero out above L
-*
-               CALL CLASET( 'U', M-1, M-1, CZERO, CZERO, A( 1, 2 ),
-     $                      LDA )
-               IE = 1
-               ITAUQ = 1
-               ITAUP = ITAUQ + M
-               IWORK = ITAUP + M
-*
-*              Bidiagonalize L in A
-*              (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
-*              (RWorkspace: need M)
-*
-               CALL CGEBRD( M, M, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
-     $                      WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                      IERR )
-               IF( WNTUO .OR. WNTUAS ) THEN
-*
-*                 If left singular vectors desired, generate Q
-*                 (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-               END IF
-               IRWORK = IE + M
-               NRU = 0
-               IF( WNTUO .OR. WNTUAS )
-     $            NRU = M
-*
-*              Perform bidiagonal QR iteration, computing left singular
-*              vectors of A in A if desired
-*              (CWorkspace: 0)
-*              (RWorkspace: need BDSPAC)
-*
-               CALL CBDSQR( 'U', M, 0, NRU, 0, S, RWORK( IE ), CDUM, 1,
-     $                      A, LDA, CDUM, 1, RWORK( IRWORK ), INFO )
-*
-*              If left singular vectors desired in U, copy them there
-*
-               IF( WNTUAS )
-     $            CALL CLACPY( 'F', M, M, A, LDA, U, LDU )
-*
-            ELSE IF( WNTVO .AND. WNTUN ) THEN
-*
-*              Path 2t(N much larger than M, JOBU='N', JOBVT='O')
-*              M right singular vectors to be overwritten on A and
-*              no left singular vectors to be computed
-*
-               IF( LWORK.GE.M*M+3*M ) THEN
-*
-*                 Sufficient workspace for a fast algorithm
-*
-                  IR = 1
-                  IF( LWORK.GE.MAX( WRKBL, LDA*N )+LDA*M ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is LDA by M
-*
-                     LDWRKU = LDA
-                     CHUNK = N
-                     LDWRKR = LDA
-                  ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N )+M*M ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is M by M
-*
-                     LDWRKU = LDA
-                     CHUNK = N
-                     LDWRKR = M
-                  ELSE
-*
-*                    WORK(IU) is M by CHUNK and WORK(IR) is M by M
-*
-                     LDWRKU = M
-                     CHUNK = ( LWORK-M*M ) / M
-                     LDWRKR = M
-                  END IF
-                  ITAU = IR + LDWRKR*M
-                  IWORK = ITAU + M
-*
-*                 Compute A=L*Q
-*                 (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy L to WORK(IR) and zero out above it
-*
-                  CALL CLACPY( 'L', M, M, A, LDA, WORK( IR ), LDWRKR )
-                  CALL CLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                         WORK( IR+LDWRKR ), LDWRKR )
-*
-*                 Generate Q in A
-*                 (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = 1
-                  ITAUQ = ITAU
-                  ITAUP = ITAUQ + M
-                  IWORK = ITAUP + M
-*
-*                 Bidiagonalize L in WORK(IR)
-*                 (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
-*                 (RWorkspace: need M)
-*
-                  CALL CGEBRD( M, M, WORK( IR ), LDWRKR, S, RWORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Generate right vectors bidiagonalizing L
-*                 (CWorkspace: need M*M+3*M-1, prefer M*M+2*M+(M-1)*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
-     $                         WORK( ITAUP ), WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-                  IRWORK = IE + M
-*
-*                 Perform bidiagonal QR iteration, computing right
-*                 singular vectors of L in WORK(IR)
-*                 (CWorkspace: need M*M)
-*                 (RWorkspace: need BDSPAC)
-*
-                  CALL CBDSQR( 'U', M, M, 0, 0, S, RWORK( IE ),
-     $                         WORK( IR ), LDWRKR, CDUM, 1, CDUM, 1,
-     $                         RWORK( IRWORK ), INFO )
-                  IU = ITAUQ
-*
-*                 Multiply right singular vectors of L in WORK(IR) by Q
-*                 in A, storing result in WORK(IU) and copying to A
-*                 (CWorkspace: need M*M+M, prefer M*M+M*N)
-*                 (RWorkspace: 0)
-*
-                  DO 30 I = 1, N, CHUNK
-                     BLK = MIN( N-I+1, CHUNK )
-                     CALL CGEMM( 'N', 'N', M, BLK, M, CONE, WORK( IR ),
-     $                           LDWRKR, A( 1, I ), LDA, CZERO,
-     $                           WORK( IU ), LDWRKU )
-                     CALL CLACPY( 'F', M, BLK, WORK( IU ), LDWRKU,
-     $                            A( 1, I ), LDA )
-   30             CONTINUE
-*
-               ELSE
-*
-*                 Insufficient workspace for a fast algorithm
-*
-                  IE = 1
-                  ITAUQ = 1
-                  ITAUP = ITAUQ + M
-                  IWORK = ITAUP + M
-*
-*                 Bidiagonalize A
-*                 (CWorkspace: need 2*M+N, prefer 2*M+(M+N)*NB)
-*                 (RWorkspace: need M)
-*
-                  CALL CGEBRD( M, N, A, LDA, S, RWORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Generate right vectors bidiagonalizing A
-*                 (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNGBR( 'P', M, N, M, A, LDA, WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IRWORK = IE + M
-*
-*                 Perform bidiagonal QR iteration, computing right
-*                 singular vectors of A in A
-*                 (CWorkspace: 0)
-*                 (RWorkspace: need BDSPAC)
-*
-                  CALL CBDSQR( 'L', M, N, 0, 0, S, RWORK( IE ), A, LDA,
-     $                         CDUM, 1, CDUM, 1, RWORK( IRWORK ), INFO )
-*
-               END IF
-*
-            ELSE IF( WNTVO .AND. WNTUAS ) THEN
-*
-*              Path 3t(N much larger than M, JOBU='S' or 'A', JOBVT='O')
-*              M right singular vectors to be overwritten on A and
-*              M left singular vectors to be computed in U
-*
-               IF( LWORK.GE.M*M+3*M ) THEN
-*
-*                 Sufficient workspace for a fast algorithm
-*
-                  IR = 1
-                  IF( LWORK.GE.MAX( WRKBL, LDA*N )+LDA*M ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is LDA by M
-*
-                     LDWRKU = LDA
-                     CHUNK = N
-                     LDWRKR = LDA
-                  ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N )+M*M ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is M by M
-*
-                     LDWRKU = LDA
-                     CHUNK = N
-                     LDWRKR = M
-                  ELSE
-*
-*                    WORK(IU) is M by CHUNK and WORK(IR) is M by M
-*
-                     LDWRKU = M
-                     CHUNK = ( LWORK-M*M ) / M
-                     LDWRKR = M
-                  END IF
-                  ITAU = IR + LDWRKR*M
-                  IWORK = ITAU + M
-*
-*                 Compute A=L*Q
-*                 (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy L to U, zeroing about above it
-*
-                  CALL CLACPY( 'L', M, M, A, LDA, U, LDU )
-                  CALL CLASET( 'U', M-1, M-1, CZERO, CZERO, U( 1, 2 ),
-     $                         LDU )
-*
-*                 Generate Q in A
-*                 (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = 1
-                  ITAUQ = ITAU
-                  ITAUP = ITAUQ + M
-                  IWORK = ITAUP + M
-*
-*                 Bidiagonalize L in U, copying result to WORK(IR)
-*                 (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
-*                 (RWorkspace: need M)
-*
-                  CALL CGEBRD( M, M, U, LDU, S, RWORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  CALL CLACPY( 'U', M, M, U, LDU, WORK( IR ), LDWRKR )
-*
-*                 Generate right vectors bidiagonalizing L in WORK(IR)
-*                 (CWorkspace: need M*M+3*M-1, prefer M*M+2*M+(M-1)*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
-     $                         WORK( ITAUP ), WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-*
-*                 Generate left vectors bidiagonalizing L in U
-*                 (CWorkspace: need M*M+3*M, prefer M*M+2*M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IRWORK = IE + M
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of L in U, and computing right
-*                 singular vectors of L in WORK(IR)
-*                 (CWorkspace: need M*M)
-*                 (RWorkspace: need BDSPAC)
-*
-                  CALL CBDSQR( 'U', M, M, M, 0, S, RWORK( IE ),
-     $                         WORK( IR ), LDWRKR, U, LDU, CDUM, 1,
-     $                         RWORK( IRWORK ), INFO )
-                  IU = ITAUQ
-*
-*                 Multiply right singular vectors of L in WORK(IR) by Q
-*                 in A, storing result in WORK(IU) and copying to A
-*                 (CWorkspace: need M*M+M, prefer M*M+M*N))
-*                 (RWorkspace: 0)
-*
-                  DO 40 I = 1, N, CHUNK
-                     BLK = MIN( N-I+1, CHUNK )
-                     CALL CGEMM( 'N', 'N', M, BLK, M, CONE, WORK( IR ),
-     $                           LDWRKR, A( 1, I ), LDA, CZERO,
-     $                           WORK( IU ), LDWRKU )
-                     CALL CLACPY( 'F', M, BLK, WORK( IU ), LDWRKU,
-     $                            A( 1, I ), LDA )
-   40             CONTINUE
-*
-               ELSE
-*
-*                 Insufficient workspace for a fast algorithm
-*
-                  ITAU = 1
-                  IWORK = ITAU + M
-*
-*                 Compute A=L*Q
-*                 (CWorkspace: need 2*M, prefer M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy L to U, zeroing out above it
-*
-                  CALL CLACPY( 'L', M, M, A, LDA, U, LDU )
-                  CALL CLASET( 'U', M-1, M-1, CZERO, CZERO, U( 1, 2 ),
-     $                         LDU )
-*
-*                 Generate Q in A
-*                 (CWorkspace: need 2*M, prefer M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = 1
-                  ITAUQ = ITAU
-                  ITAUP = ITAUQ + M
-                  IWORK = ITAUP + M
-*
-*                 Bidiagonalize L in U
-*                 (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
-*                 (RWorkspace: need M)
-*
-                  CALL CGEBRD( M, M, U, LDU, S, RWORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Multiply right vectors bidiagonalizing L by Q in A
-*                 (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNMBR( 'P', 'L', 'C', M, N, M, U, LDU,
-     $                         WORK( ITAUP ), A, LDA, WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-*
-*                 Generate left vectors bidiagonalizing L in U
-*                 (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL CUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IRWORK = IE + M
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of A in U and computing right
-*                 singular vectors of A in A
-*                 (CWorkspace: 0)
-*                 (RWorkspace: need BDSPAC)
-*
-                  CALL CBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), A, LDA,
-     $                         U, LDU, CDUM, 1, RWORK( IRWORK ), INFO )
-*
-               END IF
-*
-            ELSE IF( WNTVS ) THEN
-*
-               IF( WNTUN ) THEN
-*
-*                 Path 4t(N much larger than M, JOBU='N', JOBVT='S')
-*                 M right singular vectors to be computed in VT and
-*                 no left singular vectors to be computed
-*
-                  IF( LWORK.GE.M*M+3*M ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IR = 1
-                     IF( LWORK.GE.WRKBL+LDA*M ) THEN
-*
-*                       WORK(IR) is LDA by M
-*
-                        LDWRKR = LDA
-                     ELSE
-*
-*                       WORK(IR) is M by M
-*
-                        LDWRKR = M
-                     END IF
-                     ITAU = IR + LDWRKR*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q
-*                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IR), zeroing out above it
-*
-                     CALL CLACPY( 'L', M, M, A, LDA, WORK( IR ),
-     $                            LDWRKR )
-                     CALL CLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            WORK( IR+LDWRKR ), LDWRKR )
-*
-*                    Generate Q in A
-*                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IR)
-*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL CGEBRD( M, M, WORK( IR ), LDWRKR, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right vectors bidiagonalizing L in
-*                    WORK(IR)
-*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+(M-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing right
-*                    singular vectors of L in WORK(IR)
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', M, M, 0, 0, S, RWORK( IE ),
-     $                            WORK( IR ), LDWRKR, CDUM, 1, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IR) by
-*                    Q in A, storing result in VT
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEMM( 'N', 'N', M, N, M, CONE, WORK( IR ),
-     $                           LDWRKR, A, LDA, CZERO, VT, LDVT )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy result to VT
-*
-                     CALL CLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Zero out above L in A
-*
-                     CALL CLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            A( 1, 2 ), LDA )
-*
-*                    Bidiagonalize L in A
-*                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL CGEBRD( M, M, A, LDA, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right vectors bidiagonalizing L by Q in VT
-*                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNMBR( 'P', 'L', 'C', M, N, M, A, LDA,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing right
-*                    singular vectors of A in VT
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', M, N, 0, 0, S, RWORK( IE ), VT,
-     $                            LDVT, CDUM, 1, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTUO ) THEN
-*
-*                 Path 5t(N much larger than M, JOBU='O', JOBVT='S')
-*                 M right singular vectors to be computed in VT and
-*                 M left singular vectors to be overwritten on A
-*
-                  IF( LWORK.GE.2*M*M+3*M ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+2*LDA*M ) THEN
-*
-*                       WORK(IU) is LDA by M and WORK(IR) is LDA by M
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*M
-                        LDWRKR = LDA
-                     ELSE IF( LWORK.GE.WRKBL+( LDA+M )*M ) THEN
-*
-*                       WORK(IU) is LDA by M and WORK(IR) is M by M
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*M
-                        LDWRKR = M
-                     ELSE
-*
-*                       WORK(IU) is M by M and WORK(IR) is M by M
-*
-                        LDWRKU = M
-                        IR = IU + LDWRKU*M
-                        LDWRKR = M
-                     END IF
-                     ITAU = IR + LDWRKR*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q
-*                    (CWorkspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IU), zeroing out below it
-*
-                     CALL CLACPY( 'L', M, M, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL CLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            WORK( IU+LDWRKU ), LDWRKU )
-*
-*                    Generate Q in A
-*                    (CWorkspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IU), copying result to
-*                    WORK(IR)
-*                    (CWorkspace: need   2*M*M+3*M,
-*                                 prefer 2*M*M+2*M+2*M*NB)
-*                    (RWorkspace: need   M)
-*
-                     CALL CGEBRD( M, M, WORK( IU ), LDWRKU, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'L', M, M, WORK( IU ), LDWRKU,
-     $                            WORK( IR ), LDWRKR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IU)
-*                    (CWorkspace: need   2*M*M+3*M-1,
-*                                 prefer 2*M*M+2*M+(M-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IR)
-*                    (CWorkspace: need 2*M*M+3*M, prefer 2*M*M+2*M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'Q', M, M, M, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of L in WORK(IR) and computing
-*                    right singular vectors of L in WORK(IU)
-*                    (CWorkspace: need 2*M*M)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', M, M, M, 0, S, RWORK( IE ),
-     $                            WORK( IU ), LDWRKU, WORK( IR ),
-     $                            LDWRKR, CDUM, 1, RWORK( IRWORK ),
-     $                            INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IU) by
-*                    Q in A, storing result in VT
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEMM( 'N', 'N', M, N, M, CONE, WORK( IU ),
-     $                           LDWRKU, A, LDA, CZERO, VT, LDVT )
-*
-*                    Copy left singular vectors of L to A
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: 0)
-*
-                     CALL CLACPY( 'F', M, M, WORK( IR ), LDWRKR, A,
-     $                            LDA )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Zero out above L in A
-*
-                     CALL CLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            A( 1, 2 ), LDA )
-*
-*                    Bidiagonalize L in A
-*                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL CGEBRD( M, M, A, LDA, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right vectors bidiagonalizing L by Q in VT
-*                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNMBR( 'P', 'L', 'C', M, N, M, A, LDA,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors of L in A
-*                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in A and computing right
-*                    singular vectors of A in VT
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), VT,
-     $                            LDVT, A, LDA, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTUAS ) THEN
-*
-*                 Path 6t(N much larger than M, JOBU='S' or 'A',
-*                         JOBVT='S')
-*                 M right singular vectors to be computed in VT and
-*                 M left singular vectors to be computed in U
-*
-                  IF( LWORK.GE.M*M+3*M ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+LDA*M ) THEN
-*
-*                       WORK(IU) is LDA by N
-*
-                        LDWRKU = LDA
-                     ELSE
-*
-*                       WORK(IU) is LDA by M
-*
-                        LDWRKU = M
-                     END IF
-                     ITAU = IU + LDWRKU*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q
-*                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IU), zeroing out above it
-*
-                     CALL CLACPY( 'L', M, M, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL CLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            WORK( IU+LDWRKU ), LDWRKU )
-*
-*                    Generate Q in A
-*                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IU), copying result to U
-*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL CGEBRD( M, M, WORK( IU ), LDWRKU, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'L', M, M, WORK( IU ), LDWRKU, U,
-     $                            LDU )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IU)
-*                    (CWorkspace: need   M*M+3*M-1,
-*                                 prefer M*M+2*M+(M-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in U
-*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of L in U and computing right
-*                    singular vectors of L in WORK(IU)
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', M, M, M, 0, S, RWORK( IE ),
-     $                            WORK( IU ), LDWRKU, U, LDU, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IU) by
-*                    Q in A, storing result in VT
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEMM( 'N', 'N', M, N, M, CONE, WORK( IU ),
-     $                           LDWRKU, A, LDA, CZERO, VT, LDVT )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to U, zeroing out above it
-*
-                     CALL CLACPY( 'L', M, M, A, LDA, U, LDU )
-                     CALL CLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            U( 1, 2 ), LDU )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in U
-*                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL CGEBRD( M, M, U, LDU, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right bidiagonalizing vectors in U by Q
-*                    in VT
-*                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNMBR( 'P', 'L', 'C', M, N, M, U, LDU,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in U
-*                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in VT
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), VT,
-     $                            LDVT, U, LDU, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-                  END IF
-*
-               END IF
-*
-            ELSE IF( WNTVA ) THEN
-*
-               IF( WNTUN ) THEN
-*
-*                 Path 7t(N much larger than M, JOBU='N', JOBVT='A')
-*                 N right singular vectors to be computed in VT and
-*                 no left singular vectors to be computed
-*
-                  IF( LWORK.GE.M*M+MAX( N+M, 3*M ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IR = 1
-                     IF( LWORK.GE.WRKBL+LDA*M ) THEN
-*
-*                       WORK(IR) is LDA by M
-*
-                        LDWRKR = LDA
-                     ELSE
-*
-*                       WORK(IR) is M by M
-*
-                        LDWRKR = M
-                     END IF
-                     ITAU = IR + LDWRKR*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Copy L to WORK(IR), zeroing out above it
-*
-                     CALL CLACPY( 'L', M, M, A, LDA, WORK( IR ),
-     $                            LDWRKR )
-                     CALL CLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            WORK( IR+LDWRKR ), LDWRKR )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need M*M+M+N, prefer M*M+M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IR)
-*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL CGEBRD( M, M, WORK( IR ), LDWRKR, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IR)
-*                    (CWorkspace: need   M*M+3*M-1,
-*                                 prefer M*M+2*M+(M-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing right
-*                    singular vectors of L in WORK(IR)
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', M, M, 0, 0, S, RWORK( IE ),
-     $                            WORK( IR ), LDWRKR, CDUM, 1, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IR) by
-*                    Q in VT, storing result in A
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEMM( 'N', 'N', M, N, M, CONE, WORK( IR ),
-     $                           LDWRKR, VT, LDVT, CZERO, A, LDA )
-*
-*                    Copy right singular vectors of A from A to VT
-*
-                     CALL CLACPY( 'F', M, N, A, LDA, VT, LDVT )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need M+N, prefer M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Zero out above L in A
-*
-                     CALL CLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            A( 1, 2 ), LDA )
-*
-*                    Bidiagonalize L in A
-*                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL CGEBRD( M, M, A, LDA, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right bidiagonalizing vectors in A by Q
-*                    in VT
-*                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNMBR( 'P', 'L', 'C', M, N, M, A, LDA,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing right
-*                    singular vectors of A in VT
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', M, N, 0, 0, S, RWORK( IE ), VT,
-     $                            LDVT, CDUM, 1, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTUO ) THEN
-*
-*                 Path 8t(N much larger than M, JOBU='O', JOBVT='A')
-*                 N right singular vectors to be computed in VT and
-*                 M left singular vectors to be overwritten on A
-*
-                  IF( LWORK.GE.2*M*M+MAX( N+M, 3*M ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+2*LDA*M ) THEN
-*
-*                       WORK(IU) is LDA by M and WORK(IR) is LDA by M
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*M
-                        LDWRKR = LDA
-                     ELSE IF( LWORK.GE.WRKBL+( LDA+M )*M ) THEN
-*
-*                       WORK(IU) is LDA by M and WORK(IR) is M by M
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*M
-                        LDWRKR = M
-                     ELSE
-*
-*                       WORK(IU) is M by M and WORK(IR) is M by M
-*
-                        LDWRKU = M
-                        IR = IU + LDWRKU*M
-                        LDWRKR = M
-                     END IF
-                     ITAU = IR + LDWRKR*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (CWorkspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need 2*M*M+M+N, prefer 2*M*M+M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IU), zeroing out above it
-*
-                     CALL CLACPY( 'L', M, M, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL CLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            WORK( IU+LDWRKU ), LDWRKU )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IU), copying result to
-*                    WORK(IR)
-*                    (CWorkspace: need   2*M*M+3*M,
-*                                 prefer 2*M*M+2*M+2*M*NB)
-*                    (RWorkspace: need   M)
-*
-                     CALL CGEBRD( M, M, WORK( IU ), LDWRKU, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'L', M, M, WORK( IU ), LDWRKU,
-     $                            WORK( IR ), LDWRKR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IU)
-*                    (CWorkspace: need   2*M*M+3*M-1,
-*                                 prefer 2*M*M+2*M+(M-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IR)
-*                    (CWorkspace: need 2*M*M+3*M, prefer 2*M*M+2*M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'Q', M, M, M, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of L in WORK(IR) and computing
-*                    right singular vectors of L in WORK(IU)
-*                    (CWorkspace: need 2*M*M)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', M, M, M, 0, S, RWORK( IE ),
-     $                            WORK( IU ), LDWRKU, WORK( IR ),
-     $                            LDWRKR, CDUM, 1, RWORK( IRWORK ),
-     $                            INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IU) by
-*                    Q in VT, storing result in A
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEMM( 'N', 'N', M, N, M, CONE, WORK( IU ),
-     $                           LDWRKU, VT, LDVT, CZERO, A, LDA )
-*
-*                    Copy right singular vectors of A from A to VT
-*
-                     CALL CLACPY( 'F', M, N, A, LDA, VT, LDVT )
-*
-*                    Copy left singular vectors of A from WORK(IR) to A
-*
-                     CALL CLACPY( 'F', M, M, WORK( IR ), LDWRKR, A,
-     $                            LDA )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need M+N, prefer M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Zero out above L in A
-*
-                     CALL CLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            A( 1, 2 ), LDA )
-*
-*                    Bidiagonalize L in A
-*                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL CGEBRD( M, M, A, LDA, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right bidiagonalizing vectors in A by Q
-*                    in VT
-*                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNMBR( 'P', 'L', 'C', M, N, M, A, LDA,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in A
-*                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in A and computing right
-*                    singular vectors of A in VT
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), VT,
-     $                            LDVT, A, LDA, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTUAS ) THEN
-*
-*                 Path 9t(N much larger than M, JOBU='S' or 'A',
-*                         JOBVT='A')
-*                 N right singular vectors to be computed in VT and
-*                 M left singular vectors to be computed in U
-*
-                  IF( LWORK.GE.M*M+MAX( N+M, 3*M ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+LDA*M ) THEN
-*
-*                       WORK(IU) is LDA by M
-*
-                        LDWRKU = LDA
-                     ELSE
-*
-*                       WORK(IU) is M by M
-*
-                        LDWRKU = M
-                     END IF
-                     ITAU = IU + LDWRKU*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need M*M+M+N, prefer M*M+M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IU), zeroing out above it
-*
-                     CALL CLACPY( 'L', M, M, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL CLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            WORK( IU+LDWRKU ), LDWRKU )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IU), copying result to U
-*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL CGEBRD( M, M, WORK( IU ), LDWRKU, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'L', M, M, WORK( IU ), LDWRKU, U,
-     $                            LDU )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IU)
-*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+(M-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in U
-*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of L in U and computing right
-*                    singular vectors of L in WORK(IU)
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', M, M, M, 0, S, RWORK( IE ),
-     $                            WORK( IU ), LDWRKU, U, LDU, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IU) by
-*                    Q in VT, storing result in A
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: 0)
-*
-                     CALL CGEMM( 'N', 'N', M, N, M, CONE, WORK( IU ),
-     $                           LDWRKU, VT, LDVT, CZERO, A, LDA )
-*
-*                    Copy right singular vectors of A from A to VT
-*
-                     CALL CLACPY( 'F', M, N, A, LDA, VT, LDVT )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL CLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need M+N, prefer M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to U, zeroing out above it
-*
-                     CALL CLACPY( 'L', M, M, A, LDA, U, LDU )
-                     CALL CLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            U( 1, 2 ), LDU )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in U
-*                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL CGEBRD( M, M, U, LDU, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right bidiagonalizing vectors in U by Q
-*                    in VT
-*                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNMBR( 'P', 'L', 'C', M, N, M, U, LDU,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in U
-*                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL CUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in VT
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL CBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), VT,
-     $                            LDVT, U, LDU, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-                  END IF
-*
-               END IF
-*
-            END IF
-*
-         ELSE
-*
-*           N .LT. MNTHR
-*
-*           Path 10t(N greater than M, but not much larger)
-*           Reduce to bidiagonal form without LQ decomposition
-*
-            IE = 1
-            ITAUQ = 1
-            ITAUP = ITAUQ + M
-            IWORK = ITAUP + M
-*
-*           Bidiagonalize A
-*           (CWorkspace: need 2*M+N, prefer 2*M+(M+N)*NB)
-*           (RWorkspace: M)
-*
-            CALL CGEBRD( M, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
-     $                   WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                   IERR )
-            IF( WNTUAS ) THEN
-*
-*              If left singular vectors desired in U, copy result to U
-*              and generate left bidiagonalizing vectors in U
-*              (CWorkspace: need 3*M-1, prefer 2*M+(M-1)*NB)
-*              (RWorkspace: 0)
-*
-               CALL CLACPY( 'L', M, M, A, LDA, U, LDU )
-               CALL CUNGBR( 'Q', M, M, N, U, LDU, WORK( ITAUQ ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTVAS ) THEN
-*
-*              If right singular vectors desired in VT, copy result to
-*              VT and generate right bidiagonalizing vectors in VT
-*              (CWorkspace: need 2*M+NRVT, prefer 2*M+NRVT*NB)
-*              (RWorkspace: 0)
-*
-               CALL CLACPY( 'U', M, N, A, LDA, VT, LDVT )
-               IF( WNTVA )
-     $            NRVT = N
-               IF( WNTVS )
-     $            NRVT = M
-               CALL CUNGBR( 'P', NRVT, N, M, VT, LDVT, WORK( ITAUP ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTUO ) THEN
-*
-*              If left singular vectors desired in A, generate left
-*              bidiagonalizing vectors in A
-*              (CWorkspace: need 3*M-1, prefer 2*M+(M-1)*NB)
-*              (RWorkspace: 0)
-*
-               CALL CUNGBR( 'Q', M, M, N, A, LDA, WORK( ITAUQ ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTVO ) THEN
-*
-*              If right singular vectors desired in A, generate right
-*              bidiagonalizing vectors in A
-*              (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*              (RWorkspace: 0)
-*
-               CALL CUNGBR( 'P', M, N, M, A, LDA, WORK( ITAUP ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IRWORK = IE + M
-            IF( WNTUAS .OR. WNTUO )
-     $         NRU = M
-            IF( WNTUN )
-     $         NRU = 0
-            IF( WNTVAS .OR. WNTVO )
-     $         NCVT = N
-            IF( WNTVN )
-     $         NCVT = 0
-            IF( ( .NOT.WNTUO ) .AND. ( .NOT.WNTVO ) ) THEN
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in U and computing right singular
-*              vectors in VT
-*              (CWorkspace: 0)
-*              (RWorkspace: need BDSPAC)
-*
-               CALL CBDSQR( 'L', M, NCVT, NRU, 0, S, RWORK( IE ), VT,
-     $                      LDVT, U, LDU, CDUM, 1, RWORK( IRWORK ),
-     $                      INFO )
-            ELSE IF( ( .NOT.WNTUO ) .AND. WNTVO ) THEN
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in U and computing right singular
-*              vectors in A
-*              (CWorkspace: 0)
-*              (RWorkspace: need BDSPAC)
-*
-               CALL CBDSQR( 'L', M, NCVT, NRU, 0, S, RWORK( IE ), A,
-     $                      LDA, U, LDU, CDUM, 1, RWORK( IRWORK ),
-     $                      INFO )
-            ELSE
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in A and computing right singular
-*              vectors in VT
-*              (CWorkspace: 0)
-*              (RWorkspace: need BDSPAC)
-*
-               CALL CBDSQR( 'L', M, NCVT, NRU, 0, S, RWORK( IE ), VT,
-     $                      LDVT, A, LDA, CDUM, 1, RWORK( IRWORK ),
-     $                      INFO )
-            END IF
-*
-         END IF
-*
-      END IF
-*
-*     Undo scaling if necessary
-*
-      IF( ISCL.EQ.1 ) THEN
-         IF( ANRM.GT.BIGNUM )
-     $      CALL SLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
-     $                   IERR )
-         IF( INFO.NE.0 .AND. ANRM.GT.BIGNUM )
-     $      CALL SLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN-1, 1,
-     $                   RWORK( IE ), MINMN, IERR )
-         IF( ANRM.LT.SMLNUM )
-     $      CALL SLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
-     $                   IERR )
-         IF( INFO.NE.0 .AND. ANRM.LT.SMLNUM )
-     $      CALL SLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN-1, 1,
-     $                   RWORK( IE ), MINMN, IERR )
-      END IF
-*
-*     Return optimal workspace in WORK(1)
-*
-      WORK( 1 ) = MAXWRK
-*
-      RETURN
-*
-*     End of CGESVD
-*
-      END
--- a/libcruft/lapack/cgetf2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-      SUBROUTINE CGETF2( M, N, A, LDA, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGETF2 computes an LU factorization of a general m-by-n matrix A
-*  using partial pivoting with row interchanges.
-*
-*  The factorization has the form
-*     A = P * L * U
-*  where P is a permutation matrix, L is lower triangular with unit
-*  diagonal elements (lower trapezoidal if m > n), and U is upper
-*  triangular (upper trapezoidal if m < n).
-*
-*  This is the right-looking Level 2 BLAS version of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the m by n matrix to be factored.
-*          On exit, the factors L and U from the factorization
-*          A = P*L*U; the unit diagonal elements of L are not stored.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  IPIV    (output) INTEGER array, dimension (min(M,N))
-*          The pivot indices; for 1 <= i <= min(M,N), row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*          > 0: if INFO = k, U(k,k) is exactly zero. The factorization
-*               has been completed, but the factor U is exactly
-*               singular, and division by zero will occur if it is used
-*               to solve a system of equations.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ),
-     $                   ZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      REAL               SFMIN
-      INTEGER            I, J, JP
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      INTEGER            ICAMAX
-      EXTERNAL           SLAMCH, ICAMAX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGERU, CSCAL, CSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGETF2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Compute machine safe minimum
-*
-      SFMIN = SLAMCH('S') 
-*
-      DO 10 J = 1, MIN( M, N )
-*
-*        Find pivot and test for singularity.
-*
-         JP = J - 1 + ICAMAX( M-J+1, A( J, J ), 1 )
-         IPIV( J ) = JP
-         IF( A( JP, J ).NE.ZERO ) THEN
-*
-*           Apply the interchange to columns 1:N.
-*
-            IF( JP.NE.J )
-     $         CALL CSWAP( N, A( J, 1 ), LDA, A( JP, 1 ), LDA )
-*
-*           Compute elements J+1:M of J-th column.
-*
-            IF( J.LT.M ) THEN
-               IF( ABS(A( J, J )) .GE. SFMIN ) THEN
-                  CALL CSCAL( M-J, ONE / A( J, J ), A( J+1, J ), 1 )
-               ELSE
-                  DO 20 I = 1, M-J
-                     A( J+I, J ) = A( J+I, J ) / A( J, J )
-   20             CONTINUE
-               END IF
-            END IF
-*
-         ELSE IF( INFO.EQ.0 ) THEN
-*
-            INFO = J
-         END IF
-*
-         IF( J.LT.MIN( M, N ) ) THEN
-*
-*           Update trailing submatrix.
-*
-            CALL CGERU( M-J, N-J, -ONE, A( J+1, J ), 1, A( J, J+1 ),
-     $                  LDA, A( J+1, J+1 ), LDA )
-         END IF
-   10 CONTINUE
-      RETURN
-*
-*     End of CGETF2
-*
-      END
--- a/libcruft/lapack/cgetrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,159 +0,0 @@
-      SUBROUTINE CGETRF( M, N, A, LDA, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGETRF computes an LU factorization of a general M-by-N matrix A
-*  using partial pivoting with row interchanges.
-*
-*  The factorization has the form
-*     A = P * L * U
-*  where P is a permutation matrix, L is lower triangular with unit
-*  diagonal elements (lower trapezoidal if m > n), and U is upper
-*  triangular (upper trapezoidal if m < n).
-*
-*  This is the right-looking Level 3 BLAS version of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the M-by-N matrix to be factored.
-*          On exit, the factors L and U from the factorization
-*          A = P*L*U; the unit diagonal elements of L are not stored.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  IPIV    (output) INTEGER array, dimension (min(M,N))
-*          The pivot indices; for 1 <= i <= min(M,N), row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, U(i,i) is exactly zero. The factorization
-*                has been completed, but the factor U is exactly
-*                singular, and division by zero will occur if it is used
-*                to solve a system of equations.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, IINFO, J, JB, NB
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEMM, CGETF2, CLASWP, CTRSM, XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGETRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'CGETRF', ' ', M, N, -1, -1 )
-      IF( NB.LE.1 .OR. NB.GE.MIN( M, N ) ) THEN
-*
-*        Use unblocked code.
-*
-         CALL CGETF2( M, N, A, LDA, IPIV, INFO )
-      ELSE
-*
-*        Use blocked code.
-*
-         DO 20 J = 1, MIN( M, N ), NB
-            JB = MIN( MIN( M, N )-J+1, NB )
-*
-*           Factor diagonal and subdiagonal blocks and test for exact
-*           singularity.
-*
-            CALL CGETF2( M-J+1, JB, A( J, J ), LDA, IPIV( J ), IINFO )
-*
-*           Adjust INFO and the pivot indices.
-*
-            IF( INFO.EQ.0 .AND. IINFO.GT.0 )
-     $         INFO = IINFO + J - 1
-            DO 10 I = J, MIN( M, J+JB-1 )
-               IPIV( I ) = J - 1 + IPIV( I )
-   10       CONTINUE
-*
-*           Apply interchanges to columns 1:J-1.
-*
-            CALL CLASWP( J-1, A, LDA, J, J+JB-1, IPIV, 1 )
-*
-            IF( J+JB.LE.N ) THEN
-*
-*              Apply interchanges to columns J+JB:N.
-*
-               CALL CLASWP( N-J-JB+1, A( 1, J+JB ), LDA, J, J+JB-1,
-     $                      IPIV, 1 )
-*
-*              Compute block row of U.
-*
-               CALL CTRSM( 'Left', 'Lower', 'No transpose', 'Unit', JB,
-     $                     N-J-JB+1, ONE, A( J, J ), LDA, A( J, J+JB ),
-     $                     LDA )
-               IF( J+JB.LE.M ) THEN
-*
-*                 Update trailing submatrix.
-*
-                  CALL CGEMM( 'No transpose', 'No transpose', M-J-JB+1,
-     $                        N-J-JB+1, JB, -ONE, A( J+JB, J ), LDA,
-     $                        A( J, J+JB ), LDA, ONE, A( J+JB, J+JB ),
-     $                        LDA )
-               END IF
-            END IF
-   20    CONTINUE
-      END IF
-      RETURN
-*
-*     End of CGETRF
-*
-      END
--- a/libcruft/lapack/cgetri.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,193 +0,0 @@
-      SUBROUTINE CGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX            A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGETRI computes the inverse of a matrix using the LU factorization
-*  computed by CGETRF.
-*
-*  This method inverts U and then computes inv(A) by solving the system
-*  inv(A)*L = inv(U) for inv(A).
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the factors L and U from the factorization
-*          A = P*L*U as computed by CGETRF.
-*          On exit, if INFO = 0, the inverse of the original matrix A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices from CGETRF; for 1<=i<=N, row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO=0, then WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,N).
-*          For optimal performance LWORK >= N*NB, where NB is
-*          the optimal blocksize returned by ILAENV.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, U(i,i) is exactly zero; the matrix is
-*                singular and its inverse could not be computed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ),
-     $                   ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IWS, J, JB, JJ, JP, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEMM, CGEMV, CSWAP, CTRSM, CTRTRI, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      NB = ILAENV( 1, 'CGETRI', ' ', N, -1, -1, -1 )
-      LWKOPT = N*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -3
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGETRI', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Form inv(U).  If INFO > 0 from CTRTRI, then U is singular,
-*     and the inverse is not computed.
-*
-      CALL CTRTRI( 'Upper', 'Non-unit', N, A, LDA, INFO )
-      IF( INFO.GT.0 )
-     $   RETURN
-*
-      NBMIN = 2
-      LDWORK = N
-      IF( NB.GT.1 .AND. NB.LT.N ) THEN
-         IWS = MAX( LDWORK*NB, 1 )
-         IF( LWORK.LT.IWS ) THEN
-            NB = LWORK / LDWORK
-            NBMIN = MAX( 2, ILAENV( 2, 'CGETRI', ' ', N, -1, -1, -1 ) )
-         END IF
-      ELSE
-         IWS = N
-      END IF
-*
-*     Solve the equation inv(A)*L = inv(U) for inv(A).
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code.
-*
-         DO 20 J = N, 1, -1
-*
-*           Copy current column of L to WORK and replace with zeros.
-*
-            DO 10 I = J + 1, N
-               WORK( I ) = A( I, J )
-               A( I, J ) = ZERO
-   10       CONTINUE
-*
-*           Compute current column of inv(A).
-*
-            IF( J.LT.N )
-     $         CALL CGEMV( 'No transpose', N, N-J, -ONE, A( 1, J+1 ),
-     $                     LDA, WORK( J+1 ), 1, ONE, A( 1, J ), 1 )
-   20    CONTINUE
-      ELSE
-*
-*        Use blocked code.
-*
-         NN = ( ( N-1 ) / NB )*NB + 1
-         DO 50 J = NN, 1, -NB
-            JB = MIN( NB, N-J+1 )
-*
-*           Copy current block column of L to WORK and replace with
-*           zeros.
-*
-            DO 40 JJ = J, J + JB - 1
-               DO 30 I = JJ + 1, N
-                  WORK( I+( JJ-J )*LDWORK ) = A( I, JJ )
-                  A( I, JJ ) = ZERO
-   30          CONTINUE
-   40       CONTINUE
-*
-*           Compute current block column of inv(A).
-*
-            IF( J+JB.LE.N )
-     $         CALL CGEMM( 'No transpose', 'No transpose', N, JB,
-     $                     N-J-JB+1, -ONE, A( 1, J+JB ), LDA,
-     $                     WORK( J+JB ), LDWORK, ONE, A( 1, J ), LDA )
-            CALL CTRSM( 'Right', 'Lower', 'No transpose', 'Unit', N, JB,
-     $                  ONE, WORK( J ), LDWORK, A( 1, J ), LDA )
-   50    CONTINUE
-      END IF
-*
-*     Apply column interchanges.
-*
-      DO 60 J = N - 1, 1, -1
-         JP = IPIV( J )
-         IF( JP.NE.J )
-     $      CALL CSWAP( N, A( 1, J ), 1, A( 1, JP ), 1 )
-   60 CONTINUE
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of CGETRI
-*
-      END
--- a/libcruft/lapack/cgetrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-      SUBROUTINE CGETRS( TRANS, N, NRHS, A, LDA, IPIV, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TRANS
-      INTEGER            INFO, LDA, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX            A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGETRS solves a system of linear equations
-*     A * X = B,  A**T * X = B,  or  A**H * X = B
-*  with a general N-by-N matrix A using the LU factorization computed
-*  by CGETRF.
-*
-*  Arguments
-*  =========
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the form of the system of equations:
-*          = 'N':  A * X = B     (No transpose)
-*          = 'T':  A**T * X = B  (Transpose)
-*          = 'C':  A**H * X = B  (Conjugate transpose)
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  A       (input) COMPLEX array, dimension (LDA,N)
-*          The factors L and U from the factorization A = P*L*U
-*          as computed by CGETRF.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices from CGETRF; for 1<=i<=N, row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  B       (input/output) COMPLEX array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOTRAN
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLASWP, CTRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      NOTRAN = LSAME( TRANS, 'N' )
-      IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
-     $    LSAME( TRANS, 'C' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGETRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      IF( NOTRAN ) THEN
-*
-*        Solve A * X = B.
-*
-*        Apply row interchanges to the right hand sides.
-*
-         CALL CLASWP( NRHS, B, LDB, 1, N, IPIV, 1 )
-*
-*        Solve L*X = B, overwriting B with X.
-*
-         CALL CTRSM( 'Left', 'Lower', 'No transpose', 'Unit', N, NRHS,
-     $               ONE, A, LDA, B, LDB )
-*
-*        Solve U*X = B, overwriting B with X.
-*
-         CALL CTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N,
-     $               NRHS, ONE, A, LDA, B, LDB )
-      ELSE
-*
-*        Solve A**T * X = B  or A**H * X = B.
-*
-*        Solve U'*X = B, overwriting B with X.
-*
-         CALL CTRSM( 'Left', 'Upper', TRANS, 'Non-unit', N, NRHS, ONE,
-     $               A, LDA, B, LDB )
-*
-*        Solve L'*X = B, overwriting B with X.
-*
-         CALL CTRSM( 'Left', 'Lower', TRANS, 'Unit', N, NRHS, ONE, A,
-     $               LDA, B, LDB )
-*
-*        Apply row interchanges to the solution vectors.
-*
-         CALL CLASWP( NRHS, B, LDB, 1, N, IPIV, -1 )
-      END IF
-*
-      RETURN
-*
-*     End of CGETRS
-*
-      END
--- a/libcruft/lapack/cggbak.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,220 +0,0 @@
-      SUBROUTINE CGGBAK( JOB, SIDE, N, ILO, IHI, LSCALE, RSCALE, M, V,
-     $                   LDV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOB, SIDE
-      INTEGER            IHI, ILO, INFO, LDV, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               LSCALE( * ), RSCALE( * )
-      COMPLEX            V( LDV, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGGBAK forms the right or left eigenvectors of a complex generalized
-*  eigenvalue problem A*x = lambda*B*x, by backward transformation on
-*  the computed eigenvectors of the balanced pair of matrices output by
-*  CGGBAL.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies the type of backward transformation required:
-*          = 'N':  do nothing, return immediately;
-*          = 'P':  do backward transformation for permutation only;
-*          = 'S':  do backward transformation for scaling only;
-*          = 'B':  do backward transformations for both permutation and
-*                  scaling.
-*          JOB must be the same as the argument JOB supplied to CGGBAL.
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'R':  V contains right eigenvectors;
-*          = 'L':  V contains left eigenvectors.
-*
-*  N       (input) INTEGER
-*          The number of rows of the matrix V.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          The integers ILO and IHI determined by CGGBAL.
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  LSCALE  (input) REAL array, dimension (N)
-*          Details of the permutations and/or scaling factors applied
-*          to the left side of A and B, as returned by CGGBAL.
-*
-*  RSCALE  (input) REAL array, dimension (N)
-*          Details of the permutations and/or scaling factors applied
-*          to the right side of A and B, as returned by CGGBAL.
-*
-*  M       (input) INTEGER
-*          The number of columns of the matrix V.  M >= 0.
-*
-*  V       (input/output) COMPLEX array, dimension (LDV,M)
-*          On entry, the matrix of right or left eigenvectors to be
-*          transformed, as returned by CTGEVC.
-*          On exit, V is overwritten by the transformed eigenvectors.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the matrix V. LDV >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  See R.C. Ward, Balancing the generalized eigenvalue problem,
-*                 SIAM J. Sci. Stat. Comp. 2 (1981), 141-152.
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            LEFTV, RIGHTV
-      INTEGER            I, K
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CSSCAL, CSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      RIGHTV = LSAME( SIDE, 'R' )
-      LEFTV = LSAME( SIDE, 'L' )
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
-     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ILO.LT.1 ) THEN
-         INFO = -4
-      ELSE IF( N.EQ.0 .AND. IHI.EQ.0 .AND. ILO.NE.1 ) THEN
-         INFO = -4
-      ELSE IF( N.GT.0 .AND. ( IHI.LT.ILO .OR. IHI.GT.MAX( 1, N ) ) )
-     $   THEN
-         INFO = -5
-      ELSE IF( N.EQ.0 .AND. ILO.EQ.1 .AND. IHI.NE.0 ) THEN
-         INFO = -5
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -8
-      ELSE IF( LDV.LT.MAX( 1, N ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGGBAK', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-      IF( M.EQ.0 )
-     $   RETURN
-      IF( LSAME( JOB, 'N' ) )
-     $   RETURN
-*
-      IF( ILO.EQ.IHI )
-     $   GO TO 30
-*
-*     Backward balance
-*
-      IF( LSAME( JOB, 'S' ) .OR. LSAME( JOB, 'B' ) ) THEN
-*
-*        Backward transformation on right eigenvectors
-*
-         IF( RIGHTV ) THEN
-            DO 10 I = ILO, IHI
-               CALL CSSCAL( M, RSCALE( I ), V( I, 1 ), LDV )
-   10       CONTINUE
-         END IF
-*
-*        Backward transformation on left eigenvectors
-*
-         IF( LEFTV ) THEN
-            DO 20 I = ILO, IHI
-               CALL CSSCAL( M, LSCALE( I ), V( I, 1 ), LDV )
-   20       CONTINUE
-         END IF
-      END IF
-*
-*     Backward permutation
-*
-   30 CONTINUE
-      IF( LSAME( JOB, 'P' ) .OR. LSAME( JOB, 'B' ) ) THEN
-*
-*        Backward permutation on right eigenvectors
-*
-         IF( RIGHTV ) THEN
-            IF( ILO.EQ.1 )
-     $         GO TO 50
-            DO 40 I = ILO - 1, 1, -1
-               K = RSCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 40
-               CALL CSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   40       CONTINUE
-*
-   50       CONTINUE
-            IF( IHI.EQ.N )
-     $         GO TO 70
-            DO 60 I = IHI + 1, N
-               K = RSCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 60
-               CALL CSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   60       CONTINUE
-         END IF
-*
-*        Backward permutation on left eigenvectors
-*
-   70    CONTINUE
-         IF( LEFTV ) THEN
-            IF( ILO.EQ.1 )
-     $         GO TO 90
-            DO 80 I = ILO - 1, 1, -1
-               K = LSCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 80
-               CALL CSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   80       CONTINUE
-*
-   90       CONTINUE
-            IF( IHI.EQ.N )
-     $         GO TO 110
-            DO 100 I = IHI + 1, N
-               K = LSCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 100
-               CALL CSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-  100       CONTINUE
-         END IF
-      END IF
-*
-  110 CONTINUE
-*
-      RETURN
-*
-*     End of CGGBAK
-*
-      END
--- a/libcruft/lapack/cggbal.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,482 +0,0 @@
-      SUBROUTINE CGGBAL( JOB, N, A, LDA, B, LDB, ILO, IHI, LSCALE,
-     $                   RSCALE, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOB
-      INTEGER            IHI, ILO, INFO, LDA, LDB, N
-*     ..
-*     .. Array Arguments ..
-      REAL               LSCALE( * ), RSCALE( * ), WORK( * )
-      COMPLEX            A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGGBAL balances a pair of general complex matrices (A,B).  This
-*  involves, first, permuting A and B by similarity transformations to
-*  isolate eigenvalues in the first 1 to ILO$-$1 and last IHI+1 to N
-*  elements on the diagonal; and second, applying a diagonal similarity
-*  transformation to rows and columns ILO to IHI to make the rows
-*  and columns as close in norm as possible. Both steps are optional.
-*
-*  Balancing may reduce the 1-norm of the matrices, and improve the
-*  accuracy of the computed eigenvalues and/or eigenvectors in the
-*  generalized eigenvalue problem A*x = lambda*B*x.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies the operations to be performed on A and B:
-*          = 'N':  none:  simply set ILO = 1, IHI = N, LSCALE(I) = 1.0
-*                  and RSCALE(I) = 1.0 for i=1,...,N;
-*          = 'P':  permute only;
-*          = 'S':  scale only;
-*          = 'B':  both permute and scale.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the input matrix A.
-*          On exit, A is overwritten by the balanced matrix.
-*          If JOB = 'N', A is not referenced.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,N).
-*
-*  B       (input/output) COMPLEX array, dimension (LDB,N)
-*          On entry, the input matrix B.
-*          On exit, B is overwritten by the balanced matrix.
-*          If JOB = 'N', B is not referenced.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B. LDB >= max(1,N).
-*
-*  ILO     (output) INTEGER
-*  IHI     (output) INTEGER
-*          ILO and IHI are set to integers such that on exit
-*          A(i,j) = 0 and B(i,j) = 0 if i > j and
-*          j = 1,...,ILO-1 or i = IHI+1,...,N.
-*          If JOB = 'N' or 'S', ILO = 1 and IHI = N.
-*
-*  LSCALE  (output) REAL array, dimension (N)
-*          Details of the permutations and scaling factors applied
-*          to the left side of A and B.  If P(j) is the index of the
-*          row interchanged with row j, and D(j) is the scaling factor
-*          applied to row j, then
-*            LSCALE(j) = P(j)    for J = 1,...,ILO-1
-*                      = D(j)    for J = ILO,...,IHI
-*                      = P(j)    for J = IHI+1,...,N.
-*          The order in which the interchanges are made is N to IHI+1,
-*          then 1 to ILO-1.
-*
-*  RSCALE  (output) REAL array, dimension (N)
-*          Details of the permutations and scaling factors applied
-*          to the right side of A and B.  If P(j) is the index of the
-*          column interchanged with column j, and D(j) is the scaling
-*          factor applied to column j, then
-*            RSCALE(j) = P(j)    for J = 1,...,ILO-1
-*                      = D(j)    for J = ILO,...,IHI
-*                      = P(j)    for J = IHI+1,...,N.
-*          The order in which the interchanges are made is N to IHI+1,
-*          then 1 to ILO-1.
-*
-*  WORK    (workspace) REAL array, dimension (lwork)
-*          lwork must be at least max(1,6*N) when JOB = 'S' or 'B', and
-*          at least 1 when JOB = 'N' or 'P'.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  See R.C. WARD, Balancing the generalized eigenvalue problem,
-*                 SIAM J. Sci. Stat. Comp. 2 (1981), 141-152.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, HALF, ONE
-      PARAMETER          ( ZERO = 0.0E+0, HALF = 0.5E+0, ONE = 1.0E+0 )
-      REAL               THREE, SCLFAC
-      PARAMETER          ( THREE = 3.0E+0, SCLFAC = 1.0E+1 )
-      COMPLEX            CZERO
-      PARAMETER          ( CZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ICAB, IFLOW, IP1, IR, IRAB, IT, J, JC, JP1,
-     $                   K, KOUNT, L, LCAB, LM1, LRAB, LSFMAX, LSFMIN,
-     $                   M, NR, NRP2
-      REAL               ALPHA, BASL, BETA, CAB, CMAX, COEF, COEF2,
-     $                   COEF5, COR, EW, EWC, GAMMA, PGAMMA, RAB, SFMAX,
-     $                   SFMIN, SUM, T, TA, TB, TC
-      COMPLEX            CDUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ICAMAX
-      REAL               SDOT, SLAMCH
-      EXTERNAL           LSAME, ICAMAX, SDOT, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CSSCAL, CSWAP, SAXPY, SSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, INT, LOG10, MAX, MIN, REAL, SIGN
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( REAL( CDUM ) ) + ABS( AIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
-     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGGBAL', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         ILO = 1
-         IHI = N
-         RETURN
-      END IF
-*
-      IF( N.EQ.1 ) THEN
-         ILO = 1
-         IHI = N
-         LSCALE( 1 ) = ONE
-         RSCALE( 1 ) = ONE
-         RETURN
-      END IF
-*
-      IF( LSAME( JOB, 'N' ) ) THEN
-         ILO = 1
-         IHI = N
-         DO 10 I = 1, N
-            LSCALE( I ) = ONE
-            RSCALE( I ) = ONE
-   10    CONTINUE
-         RETURN
-      END IF
-*
-      K = 1
-      L = N
-      IF( LSAME( JOB, 'S' ) )
-     $   GO TO 190
-*
-      GO TO 30
-*
-*     Permute the matrices A and B to isolate the eigenvalues.
-*
-*     Find row with one nonzero in columns 1 through L
-*
-   20 CONTINUE
-      L = LM1
-      IF( L.NE.1 )
-     $   GO TO 30
-*
-      RSCALE( 1 ) = ONE
-      LSCALE( 1 ) = ONE
-      GO TO 190
-*
-   30 CONTINUE
-      LM1 = L - 1
-      DO 80 I = L, 1, -1
-         DO 40 J = 1, LM1
-            JP1 = J + 1
-            IF( A( I, J ).NE.CZERO .OR. B( I, J ).NE.CZERO )
-     $         GO TO 50
-   40    CONTINUE
-         J = L
-         GO TO 70
-*
-   50    CONTINUE
-         DO 60 J = JP1, L
-            IF( A( I, J ).NE.CZERO .OR. B( I, J ).NE.CZERO )
-     $         GO TO 80
-   60    CONTINUE
-         J = JP1 - 1
-*
-   70    CONTINUE
-         M = L
-         IFLOW = 1
-         GO TO 160
-   80 CONTINUE
-      GO TO 100
-*
-*     Find column with one nonzero in rows K through N
-*
-   90 CONTINUE
-      K = K + 1
-*
-  100 CONTINUE
-      DO 150 J = K, L
-         DO 110 I = K, LM1
-            IP1 = I + 1
-            IF( A( I, J ).NE.CZERO .OR. B( I, J ).NE.CZERO )
-     $         GO TO 120
-  110    CONTINUE
-         I = L
-         GO TO 140
-  120    CONTINUE
-         DO 130 I = IP1, L
-            IF( A( I, J ).NE.CZERO .OR. B( I, J ).NE.CZERO )
-     $         GO TO 150
-  130    CONTINUE
-         I = IP1 - 1
-  140    CONTINUE
-         M = K
-         IFLOW = 2
-         GO TO 160
-  150 CONTINUE
-      GO TO 190
-*
-*     Permute rows M and I
-*
-  160 CONTINUE
-      LSCALE( M ) = I
-      IF( I.EQ.M )
-     $   GO TO 170
-      CALL CSWAP( N-K+1, A( I, K ), LDA, A( M, K ), LDA )
-      CALL CSWAP( N-K+1, B( I, K ), LDB, B( M, K ), LDB )
-*
-*     Permute columns M and J
-*
-  170 CONTINUE
-      RSCALE( M ) = J
-      IF( J.EQ.M )
-     $   GO TO 180
-      CALL CSWAP( L, A( 1, J ), 1, A( 1, M ), 1 )
-      CALL CSWAP( L, B( 1, J ), 1, B( 1, M ), 1 )
-*
-  180 CONTINUE
-      GO TO ( 20, 90 )IFLOW
-*
-  190 CONTINUE
-      ILO = K
-      IHI = L
-*
-      IF( LSAME( JOB, 'P' ) ) THEN
-         DO 195 I = ILO, IHI
-            LSCALE( I ) = ONE
-            RSCALE( I ) = ONE
-  195    CONTINUE
-         RETURN
-      END IF
-*
-      IF( ILO.EQ.IHI )
-     $   RETURN
-*
-*     Balance the submatrix in rows ILO to IHI.
-*
-      NR = IHI - ILO + 1
-      DO 200 I = ILO, IHI
-         RSCALE( I ) = ZERO
-         LSCALE( I ) = ZERO
-*
-         WORK( I ) = ZERO
-         WORK( I+N ) = ZERO
-         WORK( I+2*N ) = ZERO
-         WORK( I+3*N ) = ZERO
-         WORK( I+4*N ) = ZERO
-         WORK( I+5*N ) = ZERO
-  200 CONTINUE
-*
-*     Compute right side vector in resulting linear equations
-*
-      BASL = LOG10( SCLFAC )
-      DO 240 I = ILO, IHI
-         DO 230 J = ILO, IHI
-            IF( A( I, J ).EQ.CZERO ) THEN
-               TA = ZERO
-               GO TO 210
-            END IF
-            TA = LOG10( CABS1( A( I, J ) ) ) / BASL
-*
-  210       CONTINUE
-            IF( B( I, J ).EQ.CZERO ) THEN
-               TB = ZERO
-               GO TO 220
-            END IF
-            TB = LOG10( CABS1( B( I, J ) ) ) / BASL
-*
-  220       CONTINUE
-            WORK( I+4*N ) = WORK( I+4*N ) - TA - TB
-            WORK( J+5*N ) = WORK( J+5*N ) - TA - TB
-  230    CONTINUE
-  240 CONTINUE
-*
-      COEF = ONE / REAL( 2*NR )
-      COEF2 = COEF*COEF
-      COEF5 = HALF*COEF2
-      NRP2 = NR + 2
-      BETA = ZERO
-      IT = 1
-*
-*     Start generalized conjugate gradient iteration
-*
-  250 CONTINUE
-*
-      GAMMA = SDOT( NR, WORK( ILO+4*N ), 1, WORK( ILO+4*N ), 1 ) +
-     $        SDOT( NR, WORK( ILO+5*N ), 1, WORK( ILO+5*N ), 1 )
-*
-      EW = ZERO
-      EWC = ZERO
-      DO 260 I = ILO, IHI
-         EW = EW + WORK( I+4*N )
-         EWC = EWC + WORK( I+5*N )
-  260 CONTINUE
-*
-      GAMMA = COEF*GAMMA - COEF2*( EW**2+EWC**2 ) - COEF5*( EW-EWC )**2
-      IF( GAMMA.EQ.ZERO )
-     $   GO TO 350
-      IF( IT.NE.1 )
-     $   BETA = GAMMA / PGAMMA
-      T = COEF5*( EWC-THREE*EW )
-      TC = COEF5*( EW-THREE*EWC )
-*
-      CALL SSCAL( NR, BETA, WORK( ILO ), 1 )
-      CALL SSCAL( NR, BETA, WORK( ILO+N ), 1 )
-*
-      CALL SAXPY( NR, COEF, WORK( ILO+4*N ), 1, WORK( ILO+N ), 1 )
-      CALL SAXPY( NR, COEF, WORK( ILO+5*N ), 1, WORK( ILO ), 1 )
-*
-      DO 270 I = ILO, IHI
-         WORK( I ) = WORK( I ) + TC
-         WORK( I+N ) = WORK( I+N ) + T
-  270 CONTINUE
-*
-*     Apply matrix to vector
-*
-      DO 300 I = ILO, IHI
-         KOUNT = 0
-         SUM = ZERO
-         DO 290 J = ILO, IHI
-            IF( A( I, J ).EQ.CZERO )
-     $         GO TO 280
-            KOUNT = KOUNT + 1
-            SUM = SUM + WORK( J )
-  280       CONTINUE
-            IF( B( I, J ).EQ.CZERO )
-     $         GO TO 290
-            KOUNT = KOUNT + 1
-            SUM = SUM + WORK( J )
-  290    CONTINUE
-         WORK( I+2*N ) = REAL( KOUNT )*WORK( I+N ) + SUM
-  300 CONTINUE
-*
-      DO 330 J = ILO, IHI
-         KOUNT = 0
-         SUM = ZERO
-         DO 320 I = ILO, IHI
-            IF( A( I, J ).EQ.CZERO )
-     $         GO TO 310
-            KOUNT = KOUNT + 1
-            SUM = SUM + WORK( I+N )
-  310       CONTINUE
-            IF( B( I, J ).EQ.CZERO )
-     $         GO TO 320
-            KOUNT = KOUNT + 1
-            SUM = SUM + WORK( I+N )
-  320    CONTINUE
-         WORK( J+3*N ) = REAL( KOUNT )*WORK( J ) + SUM
-  330 CONTINUE
-*
-      SUM = SDOT( NR, WORK( ILO+N ), 1, WORK( ILO+2*N ), 1 ) +
-     $      SDOT( NR, WORK( ILO ), 1, WORK( ILO+3*N ), 1 )
-      ALPHA = GAMMA / SUM
-*
-*     Determine correction to current iteration
-*
-      CMAX = ZERO
-      DO 340 I = ILO, IHI
-         COR = ALPHA*WORK( I+N )
-         IF( ABS( COR ).GT.CMAX )
-     $      CMAX = ABS( COR )
-         LSCALE( I ) = LSCALE( I ) + COR
-         COR = ALPHA*WORK( I )
-         IF( ABS( COR ).GT.CMAX )
-     $      CMAX = ABS( COR )
-         RSCALE( I ) = RSCALE( I ) + COR
-  340 CONTINUE
-      IF( CMAX.LT.HALF )
-     $   GO TO 350
-*
-      CALL SAXPY( NR, -ALPHA, WORK( ILO+2*N ), 1, WORK( ILO+4*N ), 1 )
-      CALL SAXPY( NR, -ALPHA, WORK( ILO+3*N ), 1, WORK( ILO+5*N ), 1 )
-*
-      PGAMMA = GAMMA
-      IT = IT + 1
-      IF( IT.LE.NRP2 )
-     $   GO TO 250
-*
-*     End generalized conjugate gradient iteration
-*
-  350 CONTINUE
-      SFMIN = SLAMCH( 'S' )
-      SFMAX = ONE / SFMIN
-      LSFMIN = INT( LOG10( SFMIN ) / BASL+ONE )
-      LSFMAX = INT( LOG10( SFMAX ) / BASL )
-      DO 360 I = ILO, IHI
-         IRAB = ICAMAX( N-ILO+1, A( I, ILO ), LDA )
-         RAB = ABS( A( I, IRAB+ILO-1 ) )
-         IRAB = ICAMAX( N-ILO+1, B( I, ILO ), LDB )
-         RAB = MAX( RAB, ABS( B( I, IRAB+ILO-1 ) ) )
-         LRAB = INT( LOG10( RAB+SFMIN ) / BASL+ONE )
-         IR = LSCALE( I ) + SIGN( HALF, LSCALE( I ) )
-         IR = MIN( MAX( IR, LSFMIN ), LSFMAX, LSFMAX-LRAB )
-         LSCALE( I ) = SCLFAC**IR
-         ICAB = ICAMAX( IHI, A( 1, I ), 1 )
-         CAB = ABS( A( ICAB, I ) )
-         ICAB = ICAMAX( IHI, B( 1, I ), 1 )
-         CAB = MAX( CAB, ABS( B( ICAB, I ) ) )
-         LCAB = INT( LOG10( CAB+SFMIN ) / BASL+ONE )
-         JC = RSCALE( I ) + SIGN( HALF, RSCALE( I ) )
-         JC = MIN( MAX( JC, LSFMIN ), LSFMAX, LSFMAX-LCAB )
-         RSCALE( I ) = SCLFAC**JC
-  360 CONTINUE
-*
-*     Row scaling of matrices A and B
-*
-      DO 370 I = ILO, IHI
-         CALL CSSCAL( N-ILO+1, LSCALE( I ), A( I, ILO ), LDA )
-         CALL CSSCAL( N-ILO+1, LSCALE( I ), B( I, ILO ), LDB )
-  370 CONTINUE
-*
-*     Column scaling of matrices A and B
-*
-      DO 380 J = ILO, IHI
-         CALL CSSCAL( IHI, RSCALE( J ), A( 1, J ), 1 )
-         CALL CSSCAL( IHI, RSCALE( J ), B( 1, J ), 1 )
-  380 CONTINUE
-*
-      RETURN
-*
-*     End of CGGBAL
-*
-      END
--- a/libcruft/lapack/cggev.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,454 +0,0 @@
-      SUBROUTINE CGGEV( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
-     $                  VL, LDVL, VR, LDVR, WORK, LWORK, RWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBVL, JOBVR
-      INTEGER            INFO, LDA, LDB, LDVL, LDVR, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      REAL               RWORK( * )
-      COMPLEX            A( LDA, * ), ALPHA( * ), B( LDB, * ),
-     $                   BETA( * ), VL( LDVL, * ), VR( LDVR, * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGGEV computes for a pair of N-by-N complex nonsymmetric matrices
-*  (A,B), the generalized eigenvalues, and optionally, the left and/or
-*  right generalized eigenvectors.
-*
-*  A generalized eigenvalue for a pair of matrices (A,B) is a scalar
-*  lambda or a ratio alpha/beta = lambda, such that A - lambda*B is
-*  singular. It is usually represented as the pair (alpha,beta), as
-*  there is a reasonable interpretation for beta=0, and even for both
-*  being zero.
-*
-*  The right generalized eigenvector v(j) corresponding to the
-*  generalized eigenvalue lambda(j) of (A,B) satisfies
-*
-*               A * v(j) = lambda(j) * B * v(j).
-*
-*  The left generalized eigenvector u(j) corresponding to the
-*  generalized eigenvalues lambda(j) of (A,B) satisfies
-*
-*               u(j)**H * A = lambda(j) * u(j)**H * B
-*
-*  where u(j)**H is the conjugate-transpose of u(j).
-*
-*  Arguments
-*  =========
-*
-*  JOBVL   (input) CHARACTER*1
-*          = 'N':  do not compute the left generalized eigenvectors;
-*          = 'V':  compute the left generalized eigenvectors.
-*
-*  JOBVR   (input) CHARACTER*1
-*          = 'N':  do not compute the right generalized eigenvectors;
-*          = 'V':  compute the right generalized eigenvectors.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A, B, VL, and VR.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA, N)
-*          On entry, the matrix A in the pair (A,B).
-*          On exit, A has been overwritten.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of A.  LDA >= max(1,N).
-*
-*  B       (input/output) COMPLEX array, dimension (LDB, N)
-*          On entry, the matrix B in the pair (A,B).
-*          On exit, B has been overwritten.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of B.  LDB >= max(1,N).
-*
-*  ALPHA   (output) COMPLEX array, dimension (N)
-*  BETA    (output) COMPLEX array, dimension (N)
-*          On exit, ALPHA(j)/BETA(j), j=1,...,N, will be the
-*          generalized eigenvalues.
-*
-*          Note: the quotients ALPHA(j)/BETA(j) may easily over- or
-*          underflow, and BETA(j) may even be zero.  Thus, the user
-*          should avoid naively computing the ratio alpha/beta.
-*          However, ALPHA will be always less than and usually
-*          comparable with norm(A) in magnitude, and BETA always less
-*          than and usually comparable with norm(B).
-*
-*  VL      (output) COMPLEX array, dimension (LDVL,N)
-*          If JOBVL = 'V', the left generalized eigenvectors u(j) are
-*          stored one after another in the columns of VL, in the same
-*          order as their eigenvalues.
-*          Each eigenvector is scaled so the largest component has
-*          abs(real part) + abs(imag. part) = 1.
-*          Not referenced if JOBVL = 'N'.
-*
-*  LDVL    (input) INTEGER
-*          The leading dimension of the matrix VL. LDVL >= 1, and
-*          if JOBVL = 'V', LDVL >= N.
-*
-*  VR      (output) COMPLEX array, dimension (LDVR,N)
-*          If JOBVR = 'V', the right generalized eigenvectors v(j) are
-*          stored one after another in the columns of VR, in the same
-*          order as their eigenvalues.
-*          Each eigenvector is scaled so the largest component has
-*          abs(real part) + abs(imag. part) = 1.
-*          Not referenced if JOBVR = 'N'.
-*
-*  LDVR    (input) INTEGER
-*          The leading dimension of the matrix VR. LDVR >= 1, and
-*          if JOBVR = 'V', LDVR >= N.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,2*N).
-*          For good performance, LWORK must generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace/output) REAL array, dimension (8*N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          =1,...,N:
-*                The QZ iteration failed.  No eigenvectors have been
-*                calculated, but ALPHA(j) and BETA(j) should be
-*                correct for j=INFO+1,...,N.
-*          > N:  =N+1: other then QZ iteration failed in SHGEQZ,
-*                =N+2: error return from STGEVC.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
-      COMPLEX            CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0E0, 0.0E0 ),
-     $                   CONE = ( 1.0E0, 0.0E0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY
-      CHARACTER          CHTEMP
-      INTEGER            ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT, ILO,
-     $                   IN, IRIGHT, IROWS, IRWRK, ITAU, IWRK, JC, JR,
-     $                   LWKMIN, LWKOPT
-      REAL               ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
-     $                   SMLNUM, TEMP
-      COMPLEX            X
-*     ..
-*     .. Local Arrays ..
-      LOGICAL            LDUMMA( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEQRF, CGGBAK, CGGBAL, CGGHRD, CHGEQZ, CLACPY,
-     $                   CLASCL, CLASET, CTGEVC, CUNGQR, CUNMQR, SLABAD,
-     $                   XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      REAL               CLANGE, SLAMCH
-      EXTERNAL           LSAME, ILAENV, CLANGE, SLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, MAX, REAL, SQRT
-*     ..
-*     .. Statement Functions ..
-      REAL               ABS1
-*     ..
-*     .. Statement Function definitions ..
-      ABS1( X ) = ABS( REAL( X ) ) + ABS( AIMAG( X ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode the input arguments
-*
-      IF( LSAME( JOBVL, 'N' ) ) THEN
-         IJOBVL = 1
-         ILVL = .FALSE.
-      ELSE IF( LSAME( JOBVL, 'V' ) ) THEN
-         IJOBVL = 2
-         ILVL = .TRUE.
-      ELSE
-         IJOBVL = -1
-         ILVL = .FALSE.
-      END IF
-*
-      IF( LSAME( JOBVR, 'N' ) ) THEN
-         IJOBVR = 1
-         ILVR = .FALSE.
-      ELSE IF( LSAME( JOBVR, 'V' ) ) THEN
-         IJOBVR = 2
-         ILVR = .TRUE.
-      ELSE
-         IJOBVR = -1
-         ILVR = .FALSE.
-      END IF
-      ILV = ILVL .OR. ILVR
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( IJOBVL.LE.0 ) THEN
-         INFO = -1
-      ELSE IF( IJOBVR.LE.0 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDVL.LT.1 .OR. ( ILVL .AND. LDVL.LT.N ) ) THEN
-         INFO = -11
-      ELSE IF( LDVR.LT.1 .OR. ( ILVR .AND. LDVR.LT.N ) ) THEN
-         INFO = -13
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of workspace needed at that point in the code,
-*       as well as the preferred amount for good performance.
-*       NB refers to the optimal block size for the immediately
-*       following subroutine, as returned by ILAENV. The workspace is
-*       computed assuming ILO = 1 and IHI = N, the worst case.)
-*
-      IF( INFO.EQ.0 ) THEN
-         LWKMIN = MAX( 1, 2*N )
-         LWKOPT = MAX( 1, N + N*ILAENV( 1, 'CGEQRF', ' ', N, 1, N, 0 ) )
-         LWKOPT = MAX( LWKOPT, N +
-     $                 N*ILAENV( 1, 'CUNMQR', ' ', N, 1, N, 0 ) ) 
-         IF( ILVL ) THEN
-            LWKOPT = MAX( LWKOPT, N +
-     $                 N*ILAENV( 1, 'CUNGQR', ' ', N, 1, N, -1 ) )
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY )
-     $      INFO = -15
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGGEV ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Get machine constants
-*
-      EPS = SLAMCH( 'E' )*SLAMCH( 'B' )
-      SMLNUM = SLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SQRT( SMLNUM ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = CLANGE( 'M', N, N, A, LDA, RWORK )
-      ILASCL = .FALSE.
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-         ANRMTO = SMLNUM
-         ILASCL = .TRUE.
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-         ANRMTO = BIGNUM
-         ILASCL = .TRUE.
-      END IF
-      IF( ILASCL )
-     $   CALL CLASCL( 'G', 0, 0, ANRM, ANRMTO, N, N, A, LDA, IERR )
-*
-*     Scale B if max element outside range [SMLNUM,BIGNUM]
-*
-      BNRM = CLANGE( 'M', N, N, B, LDB, RWORK )
-      ILBSCL = .FALSE.
-      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
-         BNRMTO = SMLNUM
-         ILBSCL = .TRUE.
-      ELSE IF( BNRM.GT.BIGNUM ) THEN
-         BNRMTO = BIGNUM
-         ILBSCL = .TRUE.
-      END IF
-      IF( ILBSCL )
-     $   CALL CLASCL( 'G', 0, 0, BNRM, BNRMTO, N, N, B, LDB, IERR )
-*
-*     Permute the matrices A, B to isolate eigenvalues if possible
-*     (Real Workspace: need 6*N)
-*
-      ILEFT = 1
-      IRIGHT = N + 1
-      IRWRK = IRIGHT + N
-      CALL CGGBAL( 'P', N, A, LDA, B, LDB, ILO, IHI, RWORK( ILEFT ),
-     $             RWORK( IRIGHT ), RWORK( IRWRK ), IERR )
-*
-*     Reduce B to triangular form (QR decomposition of B)
-*     (Complex Workspace: need N, prefer N*NB)
-*
-      IROWS = IHI + 1 - ILO
-      IF( ILV ) THEN
-         ICOLS = N + 1 - ILO
-      ELSE
-         ICOLS = IROWS
-      END IF
-      ITAU = 1
-      IWRK = ITAU + IROWS
-      CALL CGEQRF( IROWS, ICOLS, B( ILO, ILO ), LDB, WORK( ITAU ),
-     $             WORK( IWRK ), LWORK+1-IWRK, IERR )
-*
-*     Apply the orthogonal transformation to matrix A
-*     (Complex Workspace: need N, prefer N*NB)
-*
-      CALL CUNMQR( 'L', 'C', IROWS, ICOLS, IROWS, B( ILO, ILO ), LDB,
-     $             WORK( ITAU ), A( ILO, ILO ), LDA, WORK( IWRK ),
-     $             LWORK+1-IWRK, IERR )
-*
-*     Initialize VL
-*     (Complex Workspace: need N, prefer N*NB)
-*
-      IF( ILVL ) THEN
-         CALL CLASET( 'Full', N, N, CZERO, CONE, VL, LDVL )
-         IF( IROWS.GT.1 ) THEN
-            CALL CLACPY( 'L', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
-     $                   VL( ILO+1, ILO ), LDVL )
-         END IF
-         CALL CUNGQR( IROWS, IROWS, IROWS, VL( ILO, ILO ), LDVL,
-     $                WORK( ITAU ), WORK( IWRK ), LWORK+1-IWRK, IERR )
-      END IF
-*
-*     Initialize VR
-*
-      IF( ILVR )
-     $   CALL CLASET( 'Full', N, N, CZERO, CONE, VR, LDVR )
-*
-*     Reduce to generalized Hessenberg form
-*
-      IF( ILV ) THEN
-*
-*        Eigenvectors requested -- work on whole matrix.
-*
-         CALL CGGHRD( JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB, VL,
-     $                LDVL, VR, LDVR, IERR )
-      ELSE
-         CALL CGGHRD( 'N', 'N', IROWS, 1, IROWS, A( ILO, ILO ), LDA,
-     $                B( ILO, ILO ), LDB, VL, LDVL, VR, LDVR, IERR )
-      END IF
-*
-*     Perform QZ algorithm (Compute eigenvalues, and optionally, the
-*     Schur form and Schur vectors)
-*     (Complex Workspace: need N)
-*     (Real Workspace: need N)
-*
-      IWRK = ITAU
-      IF( ILV ) THEN
-         CHTEMP = 'S'
-      ELSE
-         CHTEMP = 'E'
-      END IF
-      CALL CHGEQZ( CHTEMP, JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB,
-     $             ALPHA, BETA, VL, LDVL, VR, LDVR, WORK( IWRK ),
-     $             LWORK+1-IWRK, RWORK( IRWRK ), IERR )
-      IF( IERR.NE.0 ) THEN
-         IF( IERR.GT.0 .AND. IERR.LE.N ) THEN
-            INFO = IERR
-         ELSE IF( IERR.GT.N .AND. IERR.LE.2*N ) THEN
-            INFO = IERR - N
-         ELSE
-            INFO = N + 1
-         END IF
-         GO TO 70
-      END IF
-*
-*     Compute Eigenvectors
-*     (Real Workspace: need 2*N)
-*     (Complex Workspace: need 2*N)
-*
-      IF( ILV ) THEN
-         IF( ILVL ) THEN
-            IF( ILVR ) THEN
-               CHTEMP = 'B'
-            ELSE
-               CHTEMP = 'L'
-            END IF
-         ELSE
-            CHTEMP = 'R'
-         END IF
-*
-         CALL CTGEVC( CHTEMP, 'B', LDUMMA, N, A, LDA, B, LDB, VL, LDVL,
-     $                VR, LDVR, N, IN, WORK( IWRK ), RWORK( IRWRK ),
-     $                IERR )
-         IF( IERR.NE.0 ) THEN
-            INFO = N + 2
-            GO TO 70
-         END IF
-*
-*        Undo balancing on VL and VR and normalization
-*        (Workspace: none needed)
-*
-         IF( ILVL ) THEN
-            CALL CGGBAK( 'P', 'L', N, ILO, IHI, RWORK( ILEFT ),
-     $                   RWORK( IRIGHT ), N, VL, LDVL, IERR )
-            DO 30 JC = 1, N
-               TEMP = ZERO
-               DO 10 JR = 1, N
-                  TEMP = MAX( TEMP, ABS1( VL( JR, JC ) ) )
-   10          CONTINUE
-               IF( TEMP.LT.SMLNUM )
-     $            GO TO 30
-               TEMP = ONE / TEMP
-               DO 20 JR = 1, N
-                  VL( JR, JC ) = VL( JR, JC )*TEMP
-   20          CONTINUE
-   30       CONTINUE
-         END IF
-         IF( ILVR ) THEN
-            CALL CGGBAK( 'P', 'R', N, ILO, IHI, RWORK( ILEFT ),
-     $                   RWORK( IRIGHT ), N, VR, LDVR, IERR )
-            DO 60 JC = 1, N
-               TEMP = ZERO
-               DO 40 JR = 1, N
-                  TEMP = MAX( TEMP, ABS1( VR( JR, JC ) ) )
-   40          CONTINUE
-               IF( TEMP.LT.SMLNUM )
-     $            GO TO 60
-               TEMP = ONE / TEMP
-               DO 50 JR = 1, N
-                  VR( JR, JC ) = VR( JR, JC )*TEMP
-   50          CONTINUE
-   60       CONTINUE
-         END IF
-      END IF
-*
-*     Undo scaling if necessary
-*
-      IF( ILASCL )
-     $   CALL CLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHA, N, IERR )
-*
-      IF( ILBSCL )
-     $   CALL CLASCL( 'G', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
-*
-   70 CONTINUE
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of CGGEV
-*
-      END
--- a/libcruft/lapack/cgghrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,264 +0,0 @@
-      SUBROUTINE CGGHRD( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
-     $                   LDQ, Z, LDZ, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPQ, COMPZ
-      INTEGER            IHI, ILO, INFO, LDA, LDB, LDQ, LDZ, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
-     $                   Z( LDZ, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGGHRD reduces a pair of complex matrices (A,B) to generalized upper
-*  Hessenberg form using unitary transformations, where A is a
-*  general matrix and B is upper triangular.  The form of the generalized
-*  eigenvalue problem is
-*     A*x = lambda*B*x,
-*  and B is typically made upper triangular by computing its QR
-*  factorization and moving the unitary matrix Q to the left side
-*  of the equation.
-*
-*  This subroutine simultaneously reduces A to a Hessenberg matrix H:
-*     Q**H*A*Z = H
-*  and transforms B to another upper triangular matrix T:
-*     Q**H*B*Z = T
-*  in order to reduce the problem to its standard form
-*     H*y = lambda*T*y
-*  where y = Z**H*x.
-*
-*  The unitary matrices Q and Z are determined as products of Givens
-*  rotations.  They may either be formed explicitly, or they may be
-*  postmultiplied into input matrices Q1 and Z1, so that
-*       Q1 * A * Z1**H = (Q1*Q) * H * (Z1*Z)**H
-*       Q1 * B * Z1**H = (Q1*Q) * T * (Z1*Z)**H
-*  If Q1 is the unitary matrix from the QR factorization of B in the
-*  original equation A*x = lambda*B*x, then CGGHRD reduces the original
-*  problem to generalized Hessenberg form.
-*
-*  Arguments
-*  =========
-*
-*  COMPQ   (input) CHARACTER*1
-*          = 'N': do not compute Q;
-*          = 'I': Q is initialized to the unit matrix, and the
-*                 unitary matrix Q is returned;
-*          = 'V': Q must contain a unitary matrix Q1 on entry,
-*                 and the product Q1*Q is returned.
-*
-*  COMPZ   (input) CHARACTER*1
-*          = 'N': do not compute Q;
-*          = 'I': Q is initialized to the unit matrix, and the
-*                 unitary matrix Q is returned;
-*          = 'V': Q must contain a unitary matrix Q1 on entry,
-*                 and the product Q1*Q is returned.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          ILO and IHI mark the rows and columns of A which are to be
-*          reduced.  It is assumed that A is already upper triangular
-*          in rows and columns 1:ILO-1 and IHI+1:N.  ILO and IHI are
-*          normally set by a previous call to CGGBAL; otherwise they
-*          should be set to 1 and N respectively.
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA, N)
-*          On entry, the N-by-N general matrix to be reduced.
-*          On exit, the upper triangle and the first subdiagonal of A
-*          are overwritten with the upper Hessenberg matrix H, and the
-*          rest is set to zero.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input/output) COMPLEX array, dimension (LDB, N)
-*          On entry, the N-by-N upper triangular matrix B.
-*          On exit, the upper triangular matrix T = Q**H B Z.  The
-*          elements below the diagonal are set to zero.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  Q       (input/output) COMPLEX array, dimension (LDQ, N)
-*          On entry, if COMPQ = 'V', the unitary matrix Q1, typically
-*          from the QR factorization of B.
-*          On exit, if COMPQ='I', the unitary matrix Q, and if
-*          COMPQ = 'V', the product Q1*Q.
-*          Not referenced if COMPQ='N'.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.
-*          LDQ >= N if COMPQ='V' or 'I'; LDQ >= 1 otherwise.
-*
-*  Z       (input/output) COMPLEX array, dimension (LDZ, N)
-*          On entry, if COMPZ = 'V', the unitary matrix Z1.
-*          On exit, if COMPZ='I', the unitary matrix Z, and if
-*          COMPZ = 'V', the product Z1*Z.
-*          Not referenced if COMPZ='N'.
-*
-*  LDZ     (input) INTEGER
-*          The leading dimension of the array Z.
-*          LDZ >= N if COMPZ='V' or 'I'; LDZ >= 1 otherwise.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  This routine reduces A to Hessenberg and B to triangular form by
-*  an unblocked reduction, as described in _Matrix_Computations_,
-*  by Golub and van Loan (Johns Hopkins Press).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            CONE, CZERO
-      PARAMETER          ( CONE = ( 1.0E+0, 0.0E+0 ),
-     $                   CZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ILQ, ILZ
-      INTEGER            ICOMPQ, ICOMPZ, JCOL, JROW
-      REAL               C
-      COMPLEX            CTEMP, S
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLARTG, CLASET, CROT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CONJG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode COMPQ
-*
-      IF( LSAME( COMPQ, 'N' ) ) THEN
-         ILQ = .FALSE.
-         ICOMPQ = 1
-      ELSE IF( LSAME( COMPQ, 'V' ) ) THEN
-         ILQ = .TRUE.
-         ICOMPQ = 2
-      ELSE IF( LSAME( COMPQ, 'I' ) ) THEN
-         ILQ = .TRUE.
-         ICOMPQ = 3
-      ELSE
-         ICOMPQ = 0
-      END IF
-*
-*     Decode COMPZ
-*
-      IF( LSAME( COMPZ, 'N' ) ) THEN
-         ILZ = .FALSE.
-         ICOMPZ = 1
-      ELSE IF( LSAME( COMPZ, 'V' ) ) THEN
-         ILZ = .TRUE.
-         ICOMPZ = 2
-      ELSE IF( LSAME( COMPZ, 'I' ) ) THEN
-         ILZ = .TRUE.
-         ICOMPZ = 3
-      ELSE
-         ICOMPZ = 0
-      END IF
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( ICOMPQ.LE.0 ) THEN
-         INFO = -1
-      ELSE IF( ICOMPZ.LE.0 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ILO.LT.1 ) THEN
-         INFO = -4
-      ELSE IF( IHI.GT.N .OR. IHI.LT.ILO-1 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -9
-      ELSE IF( ( ILQ .AND. LDQ.LT.N ) .OR. LDQ.LT.1 ) THEN
-         INFO = -11
-      ELSE IF( ( ILZ .AND. LDZ.LT.N ) .OR. LDZ.LT.1 ) THEN
-         INFO = -13
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGGHRD', -INFO )
-         RETURN
-      END IF
-*
-*     Initialize Q and Z if desired.
-*
-      IF( ICOMPQ.EQ.3 )
-     $   CALL CLASET( 'Full', N, N, CZERO, CONE, Q, LDQ )
-      IF( ICOMPZ.EQ.3 )
-     $   CALL CLASET( 'Full', N, N, CZERO, CONE, Z, LDZ )
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 )
-     $   RETURN
-*
-*     Zero out lower triangle of B
-*
-      DO 20 JCOL = 1, N - 1
-         DO 10 JROW = JCOL + 1, N
-            B( JROW, JCOL ) = CZERO
-   10    CONTINUE
-   20 CONTINUE
-*
-*     Reduce A and B
-*
-      DO 40 JCOL = ILO, IHI - 2
-*
-         DO 30 JROW = IHI, JCOL + 2, -1
-*
-*           Step 1: rotate rows JROW-1, JROW to kill A(JROW,JCOL)
-*
-            CTEMP = A( JROW-1, JCOL )
-            CALL CLARTG( CTEMP, A( JROW, JCOL ), C, S,
-     $                   A( JROW-1, JCOL ) )
-            A( JROW, JCOL ) = CZERO
-            CALL CROT( N-JCOL, A( JROW-1, JCOL+1 ), LDA,
-     $                 A( JROW, JCOL+1 ), LDA, C, S )
-            CALL CROT( N+2-JROW, B( JROW-1, JROW-1 ), LDB,
-     $                 B( JROW, JROW-1 ), LDB, C, S )
-            IF( ILQ )
-     $         CALL CROT( N, Q( 1, JROW-1 ), 1, Q( 1, JROW ), 1, C,
-     $                    CONJG( S ) )
-*
-*           Step 2: rotate columns JROW, JROW-1 to kill B(JROW,JROW-1)
-*
-            CTEMP = B( JROW, JROW )
-            CALL CLARTG( CTEMP, B( JROW, JROW-1 ), C, S,
-     $                   B( JROW, JROW ) )
-            B( JROW, JROW-1 ) = CZERO
-            CALL CROT( IHI, A( 1, JROW ), 1, A( 1, JROW-1 ), 1, C, S )
-            CALL CROT( JROW-1, B( 1, JROW ), 1, B( 1, JROW-1 ), 1, C,
-     $                 S )
-            IF( ILZ )
-     $         CALL CROT( N, Z( 1, JROW ), 1, Z( 1, JROW-1 ), 1, C, S )
-   30    CONTINUE
-   40 CONTINUE
-*
-      RETURN
-*
-*     End of CGGHRD
-*
-      END
--- a/libcruft/lapack/cgtsv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,173 +0,0 @@
-      SUBROUTINE CGTSV( N, NRHS, DL, D, DU, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            B( LDB, * ), D( * ), DL( * ), DU( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGTSV  solves the equation
-*
-*     A*X = B,
-*
-*  where A is an N-by-N tridiagonal matrix, by Gaussian elimination with
-*  partial pivoting.
-*
-*  Note that the equation  A'*X = B  may be solved by interchanging the
-*  order of the arguments DU and DL.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  DL      (input/output) COMPLEX array, dimension (N-1)
-*          On entry, DL must contain the (n-1) subdiagonal elements of
-*          A.
-*          On exit, DL is overwritten by the (n-2) elements of the
-*          second superdiagonal of the upper triangular matrix U from
-*          the LU factorization of A, in DL(1), ..., DL(n-2).
-*
-*  D       (input/output) COMPLEX array, dimension (N)
-*          On entry, D must contain the diagonal elements of A.
-*          On exit, D is overwritten by the n diagonal elements of U.
-*
-*  DU      (input/output) COMPLEX array, dimension (N-1)
-*          On entry, DU must contain the (n-1) superdiagonal elements
-*          of A.
-*          On exit, DU is overwritten by the (n-1) elements of the first
-*          superdiagonal of U.
-*
-*  B       (input/output) COMPLEX array, dimension (LDB,NRHS)
-*          On entry, the N-by-NRHS right hand side matrix B.
-*          On exit, if INFO = 0, the N-by-NRHS solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, U(i,i) is exactly zero, and the solution
-*                has not been computed.  The factorization has not been
-*                completed unless i = N.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            J, K
-      COMPLEX            MULT, TEMP, ZDUM
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, MAX, REAL
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( REAL( ZDUM ) ) + ABS( AIMAG( ZDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGTSV ', -INFO )
-         RETURN
-      END IF
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      DO 30 K = 1, N - 1
-         IF( DL( K ).EQ.ZERO ) THEN
-*
-*           Subdiagonal is zero, no elimination is required.
-*
-            IF( D( K ).EQ.ZERO ) THEN
-*
-*              Diagonal is zero: set INFO = K and return; a unique
-*              solution can not be found.
-*
-               INFO = K
-               RETURN
-            END IF
-         ELSE IF( CABS1( D( K ) ).GE.CABS1( DL( K ) ) ) THEN
-*
-*           No row interchange required
-*
-            MULT = DL( K ) / D( K )
-            D( K+1 ) = D( K+1 ) - MULT*DU( K )
-            DO 10 J = 1, NRHS
-               B( K+1, J ) = B( K+1, J ) - MULT*B( K, J )
-   10       CONTINUE
-            IF( K.LT.( N-1 ) )
-     $         DL( K ) = ZERO
-         ELSE
-*
-*           Interchange rows K and K+1
-*
-            MULT = D( K ) / DL( K )
-            D( K ) = DL( K )
-            TEMP = D( K+1 )
-            D( K+1 ) = DU( K ) - MULT*TEMP
-            IF( K.LT.( N-1 ) ) THEN
-               DL( K ) = DU( K+1 )
-               DU( K+1 ) = -MULT*DL( K )
-            END IF
-            DU( K ) = TEMP
-            DO 20 J = 1, NRHS
-               TEMP = B( K, J )
-               B( K, J ) = B( K+1, J )
-               B( K+1, J ) = TEMP - MULT*B( K+1, J )
-   20       CONTINUE
-         END IF
-   30 CONTINUE
-      IF( D( N ).EQ.ZERO ) THEN
-         INFO = N
-         RETURN
-      END IF
-*
-*     Back solve with the matrix U from the factorization.
-*
-      DO 50 J = 1, NRHS
-         B( N, J ) = B( N, J ) / D( N )
-         IF( N.GT.1 )
-     $      B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / D( N-1 )
-         DO 40 K = N - 2, 1, -1
-            B( K, J ) = ( B( K, J )-DU( K )*B( K+1, J )-DL( K )*
-     $                  B( K+2, J ) ) / D( K )
-   40    CONTINUE
-   50 CONTINUE
-*
-      RETURN
-*
-*     End of CGTSV
-*
-      END
--- a/libcruft/lapack/cgttrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,174 +0,0 @@
-      SUBROUTINE CGTTRF( N, DL, D, DU, DU2, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX            D( * ), DL( * ), DU( * ), DU2( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGTTRF computes an LU factorization of a complex tridiagonal matrix A
-*  using elimination with partial pivoting and row interchanges.
-*
-*  The factorization has the form
-*     A = L * U
-*  where L is a product of permutation and unit lower bidiagonal
-*  matrices and U is upper triangular with nonzeros in only the main
-*  diagonal and first two superdiagonals.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  DL      (input/output) COMPLEX array, dimension (N-1)
-*          On entry, DL must contain the (n-1) sub-diagonal elements of
-*          A.
-*
-*          On exit, DL is overwritten by the (n-1) multipliers that
-*          define the matrix L from the LU factorization of A.
-*
-*  D       (input/output) COMPLEX array, dimension (N)
-*          On entry, D must contain the diagonal elements of A.
-*
-*          On exit, D is overwritten by the n diagonal elements of the
-*          upper triangular matrix U from the LU factorization of A.
-*
-*  DU      (input/output) COMPLEX array, dimension (N-1)
-*          On entry, DU must contain the (n-1) super-diagonal elements
-*          of A.
-*
-*          On exit, DU is overwritten by the (n-1) elements of the first
-*          super-diagonal of U.
-*
-*  DU2     (output) COMPLEX array, dimension (N-2)
-*          On exit, DU2 is overwritten by the (n-2) elements of the
-*          second super-diagonal of U.
-*
-*  IPIV    (output) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= n, row i of the matrix was
-*          interchanged with row IPIV(i).  IPIV(i) will always be either
-*          i or i+1; IPIV(i) = i indicates a row interchange was not
-*          required.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -k, the k-th argument had an illegal value
-*          > 0:  if INFO = k, U(k,k) is exactly zero. The factorization
-*                has been completed, but the factor U is exactly
-*                singular, and division by zero will occur if it is used
-*                to solve a system of equations.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      COMPLEX            FACT, TEMP, ZDUM
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, REAL
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( REAL( ZDUM ) ) + ABS( AIMAG( ZDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-         CALL XERBLA( 'CGTTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Initialize IPIV(i) = i and DU2(i) = 0
-*
-      DO 10 I = 1, N
-         IPIV( I ) = I
-   10 CONTINUE
-      DO 20 I = 1, N - 2
-         DU2( I ) = ZERO
-   20 CONTINUE
-*
-      DO 30 I = 1, N - 2
-         IF( CABS1( D( I ) ).GE.CABS1( DL( I ) ) ) THEN
-*
-*           No row interchange required, eliminate DL(I)
-*
-            IF( CABS1( D( I ) ).NE.ZERO ) THEN
-               FACT = DL( I ) / D( I )
-               DL( I ) = FACT
-               D( I+1 ) = D( I+1 ) - FACT*DU( I )
-            END IF
-         ELSE
-*
-*           Interchange rows I and I+1, eliminate DL(I)
-*
-            FACT = D( I ) / DL( I )
-            D( I ) = DL( I )
-            DL( I ) = FACT
-            TEMP = DU( I )
-            DU( I ) = D( I+1 )
-            D( I+1 ) = TEMP - FACT*D( I+1 )
-            DU2( I ) = DU( I+1 )
-            DU( I+1 ) = -FACT*DU( I+1 )
-            IPIV( I ) = I + 1
-         END IF
-   30 CONTINUE
-      IF( N.GT.1 ) THEN
-         I = N - 1
-         IF( CABS1( D( I ) ).GE.CABS1( DL( I ) ) ) THEN
-            IF( CABS1( D( I ) ).NE.ZERO ) THEN
-               FACT = DL( I ) / D( I )
-               DL( I ) = FACT
-               D( I+1 ) = D( I+1 ) - FACT*DU( I )
-            END IF
-         ELSE
-            FACT = D( I ) / DL( I )
-            D( I ) = DL( I )
-            DL( I ) = FACT
-            TEMP = DU( I )
-            DU( I ) = D( I+1 )
-            D( I+1 ) = TEMP - FACT*D( I+1 )
-            IPIV( I ) = I + 1
-         END IF
-      END IF
-*
-*     Check for a zero on the diagonal of U.
-*
-      DO 40 I = 1, N
-         IF( CABS1( D( I ) ).EQ.ZERO ) THEN
-            INFO = I
-            GO TO 50
-         END IF
-   40 CONTINUE
-   50 CONTINUE
-*
-      RETURN
-*
-*     End of CGTTRF
-*
-      END
--- a/libcruft/lapack/cgttrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-      SUBROUTINE CGTTRS( TRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TRANS
-      INTEGER            INFO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX            B( LDB, * ), D( * ), DL( * ), DU( * ), DU2( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGTTRS solves one of the systems of equations
-*     A * X = B,  A**T * X = B,  or  A**H * X = B,
-*  with a tridiagonal matrix A using the LU factorization computed
-*  by CGTTRF.
-*
-*  Arguments
-*  =========
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the form of the system of equations.
-*          = 'N':  A * X = B     (No transpose)
-*          = 'T':  A**T * X = B  (Transpose)
-*          = 'C':  A**H * X = B  (Conjugate transpose)
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  DL      (input) COMPLEX array, dimension (N-1)
-*          The (n-1) multipliers that define the matrix L from the
-*          LU factorization of A.
-*
-*  D       (input) COMPLEX array, dimension (N)
-*          The n diagonal elements of the upper triangular matrix U from
-*          the LU factorization of A.
-*
-*  DU      (input) COMPLEX array, dimension (N-1)
-*          The (n-1) elements of the first super-diagonal of U.
-*
-*  DU2     (input) COMPLEX array, dimension (N-2)
-*          The (n-2) elements of the second super-diagonal of U.
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= n, row i of the matrix was
-*          interchanged with row IPIV(i).  IPIV(i) will always be either
-*          i or i+1; IPIV(i) = i indicates a row interchange was not
-*          required.
-*
-*  B       (input/output) COMPLEX array, dimension (LDB,NRHS)
-*          On entry, the matrix of right hand side vectors B.
-*          On exit, B is overwritten by the solution vectors X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            NOTRAN
-      INTEGER            ITRANS, J, JB, NB
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGTTS2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      NOTRAN = ( TRANS.EQ.'N' .OR. TRANS.EQ.'n' )
-      IF( .NOT.NOTRAN .AND. .NOT.( TRANS.EQ.'T' .OR. TRANS.EQ.
-     $    't' ) .AND. .NOT.( TRANS.EQ.'C' .OR. TRANS.EQ.'c' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDB.LT.MAX( N, 1 ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CGTTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-*     Decode TRANS
-*
-      IF( NOTRAN ) THEN
-         ITRANS = 0
-      ELSE IF( TRANS.EQ.'T' .OR. TRANS.EQ.'t' ) THEN
-         ITRANS = 1
-      ELSE
-         ITRANS = 2
-      END IF
-*
-*     Determine the number of right-hand sides to solve at a time.
-*
-      IF( NRHS.EQ.1 ) THEN
-         NB = 1
-      ELSE
-         NB = MAX( 1, ILAENV( 1, 'CGTTRS', TRANS, N, NRHS, -1, -1 ) )
-      END IF
-*
-      IF( NB.GE.NRHS ) THEN
-         CALL CGTTS2( ITRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB )
-      ELSE
-         DO 10 J = 1, NRHS, NB
-            JB = MIN( NRHS-J+1, NB )
-            CALL CGTTS2( ITRANS, N, JB, DL, D, DU, DU2, IPIV, B( 1, J ),
-     $                   LDB )
-   10    CONTINUE
-      END IF
-*
-*     End of CGTTRS
-*
-      END
--- a/libcruft/lapack/cgtts2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,271 +0,0 @@
-      SUBROUTINE CGTTS2( ITRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            ITRANS, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX            B( LDB, * ), D( * ), DL( * ), DU( * ), DU2( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CGTTS2 solves one of the systems of equations
-*     A * X = B,  A**T * X = B,  or  A**H * X = B,
-*  with a tridiagonal matrix A using the LU factorization computed
-*  by CGTTRF.
-*
-*  Arguments
-*  =========
-*
-*  ITRANS  (input) INTEGER
-*          Specifies the form of the system of equations.
-*          = 0:  A * X = B     (No transpose)
-*          = 1:  A**T * X = B  (Transpose)
-*          = 2:  A**H * X = B  (Conjugate transpose)
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  DL      (input) COMPLEX array, dimension (N-1)
-*          The (n-1) multipliers that define the matrix L from the
-*          LU factorization of A.
-*
-*  D       (input) COMPLEX array, dimension (N)
-*          The n diagonal elements of the upper triangular matrix U from
-*          the LU factorization of A.
-*
-*  DU      (input) COMPLEX array, dimension (N-1)
-*          The (n-1) elements of the first super-diagonal of U.
-*
-*  DU2     (input) COMPLEX array, dimension (N-2)
-*          The (n-2) elements of the second super-diagonal of U.
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= n, row i of the matrix was
-*          interchanged with row IPIV(i).  IPIV(i) will always be either
-*          i or i+1; IPIV(i) = i indicates a row interchange was not
-*          required.
-*
-*  B       (input/output) COMPLEX array, dimension (LDB,NRHS)
-*          On entry, the matrix of right hand side vectors B.
-*          On exit, B is overwritten by the solution vectors X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, J
-      COMPLEX            TEMP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CONJG
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      IF( ITRANS.EQ.0 ) THEN
-*
-*        Solve A*X = B using the LU factorization of A,
-*        overwriting each right hand side vector with its solution.
-*
-         IF( NRHS.LE.1 ) THEN
-            J = 1
-   10       CONTINUE
-*
-*           Solve L*x = b.
-*
-            DO 20 I = 1, N - 1
-               IF( IPIV( I ).EQ.I ) THEN
-                  B( I+1, J ) = B( I+1, J ) - DL( I )*B( I, J )
-               ELSE
-                  TEMP = B( I, J )
-                  B( I, J ) = B( I+1, J )
-                  B( I+1, J ) = TEMP - DL( I )*B( I, J )
-               END IF
-   20       CONTINUE
-*
-*           Solve U*x = b.
-*
-            B( N, J ) = B( N, J ) / D( N )
-            IF( N.GT.1 )
-     $         B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) /
-     $                       D( N-1 )
-            DO 30 I = N - 2, 1, -1
-               B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DU2( I )*
-     $                     B( I+2, J ) ) / D( I )
-   30       CONTINUE
-            IF( J.LT.NRHS ) THEN
-               J = J + 1
-               GO TO 10
-            END IF
-         ELSE
-            DO 60 J = 1, NRHS
-*
-*           Solve L*x = b.
-*
-               DO 40 I = 1, N - 1
-                  IF( IPIV( I ).EQ.I ) THEN
-                     B( I+1, J ) = B( I+1, J ) - DL( I )*B( I, J )
-                  ELSE
-                     TEMP = B( I, J )
-                     B( I, J ) = B( I+1, J )
-                     B( I+1, J ) = TEMP - DL( I )*B( I, J )
-                  END IF
-   40          CONTINUE
-*
-*           Solve U*x = b.
-*
-               B( N, J ) = B( N, J ) / D( N )
-               IF( N.GT.1 )
-     $            B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) /
-     $                          D( N-1 )
-               DO 50 I = N - 2, 1, -1
-                  B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DU2( I )*
-     $                        B( I+2, J ) ) / D( I )
-   50          CONTINUE
-   60       CONTINUE
-         END IF
-      ELSE IF( ITRANS.EQ.1 ) THEN
-*
-*        Solve A**T * X = B.
-*
-         IF( NRHS.LE.1 ) THEN
-            J = 1
-   70       CONTINUE
-*
-*           Solve U**T * x = b.
-*
-            B( 1, J ) = B( 1, J ) / D( 1 )
-            IF( N.GT.1 )
-     $         B( 2, J ) = ( B( 2, J )-DU( 1 )*B( 1, J ) ) / D( 2 )
-            DO 80 I = 3, N
-               B( I, J ) = ( B( I, J )-DU( I-1 )*B( I-1, J )-DU2( I-2 )*
-     $                     B( I-2, J ) ) / D( I )
-   80       CONTINUE
-*
-*           Solve L**T * x = b.
-*
-            DO 90 I = N - 1, 1, -1
-               IF( IPIV( I ).EQ.I ) THEN
-                  B( I, J ) = B( I, J ) - DL( I )*B( I+1, J )
-               ELSE
-                  TEMP = B( I+1, J )
-                  B( I+1, J ) = B( I, J ) - DL( I )*TEMP
-                  B( I, J ) = TEMP
-               END IF
-   90       CONTINUE
-            IF( J.LT.NRHS ) THEN
-               J = J + 1
-               GO TO 70
-            END IF
-         ELSE
-            DO 120 J = 1, NRHS
-*
-*           Solve U**T * x = b.
-*
-               B( 1, J ) = B( 1, J ) / D( 1 )
-               IF( N.GT.1 )
-     $            B( 2, J ) = ( B( 2, J )-DU( 1 )*B( 1, J ) ) / D( 2 )
-               DO 100 I = 3, N
-                  B( I, J ) = ( B( I, J )-DU( I-1 )*B( I-1, J )-
-     $                        DU2( I-2 )*B( I-2, J ) ) / D( I )
-  100          CONTINUE
-*
-*           Solve L**T * x = b.
-*
-               DO 110 I = N - 1, 1, -1
-                  IF( IPIV( I ).EQ.I ) THEN
-                     B( I, J ) = B( I, J ) - DL( I )*B( I+1, J )
-                  ELSE
-                     TEMP = B( I+1, J )
-                     B( I+1, J ) = B( I, J ) - DL( I )*TEMP
-                     B( I, J ) = TEMP
-                  END IF
-  110          CONTINUE
-  120       CONTINUE
-         END IF
-      ELSE
-*
-*        Solve A**H * X = B.
-*
-         IF( NRHS.LE.1 ) THEN
-            J = 1
-  130       CONTINUE
-*
-*           Solve U**H * x = b.
-*
-            B( 1, J ) = B( 1, J ) / CONJG( D( 1 ) )
-            IF( N.GT.1 )
-     $         B( 2, J ) = ( B( 2, J )-CONJG( DU( 1 ) )*B( 1, J ) ) /
-     $                     CONJG( D( 2 ) )
-            DO 140 I = 3, N
-               B( I, J ) = ( B( I, J )-CONJG( DU( I-1 ) )*B( I-1, J )-
-     $                     CONJG( DU2( I-2 ) )*B( I-2, J ) ) /
-     $                     CONJG( D( I ) )
-  140       CONTINUE
-*
-*           Solve L**H * x = b.
-*
-            DO 150 I = N - 1, 1, -1
-               IF( IPIV( I ).EQ.I ) THEN
-                  B( I, J ) = B( I, J ) - CONJG( DL( I ) )*B( I+1, J )
-               ELSE
-                  TEMP = B( I+1, J )
-                  B( I+1, J ) = B( I, J ) - CONJG( DL( I ) )*TEMP
-                  B( I, J ) = TEMP
-               END IF
-  150       CONTINUE
-            IF( J.LT.NRHS ) THEN
-               J = J + 1
-               GO TO 130
-            END IF
-         ELSE
-            DO 180 J = 1, NRHS
-*
-*           Solve U**H * x = b.
-*
-               B( 1, J ) = B( 1, J ) / CONJG( D( 1 ) )
-               IF( N.GT.1 )
-     $            B( 2, J ) = ( B( 2, J )-CONJG( DU( 1 ) )*B( 1, J ) ) /
-     $                        CONJG( D( 2 ) )
-               DO 160 I = 3, N
-                  B( I, J ) = ( B( I, J )-CONJG( DU( I-1 ) )*
-     $                        B( I-1, J )-CONJG( DU2( I-2 ) )*
-     $                        B( I-2, J ) ) / CONJG( D( I ) )
-  160          CONTINUE
-*
-*           Solve L**H * x = b.
-*
-               DO 170 I = N - 1, 1, -1
-                  IF( IPIV( I ).EQ.I ) THEN
-                     B( I, J ) = B( I, J ) - CONJG( DL( I ) )*
-     $                           B( I+1, J )
-                  ELSE
-                     TEMP = B( I+1, J )
-                     B( I+1, J ) = B( I, J ) - CONJG( DL( I ) )*TEMP
-                     B( I, J ) = TEMP
-                  END IF
-  170          CONTINUE
-  180       CONTINUE
-         END IF
-      END IF
-*
-*     End of CGTTS2
-*
-      END
--- a/libcruft/lapack/cheev.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,218 +0,0 @@
-      SUBROUTINE CHEEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK,
-     $                  INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBZ, UPLO
-      INTEGER            INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      REAL               RWORK( * ), W( * )
-      COMPLEX            A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CHEEV computes all eigenvalues and, optionally, eigenvectors of a
-*  complex Hermitian matrix A.
-*
-*  Arguments
-*  =========
-*
-*  JOBZ    (input) CHARACTER*1
-*          = 'N':  Compute eigenvalues only;
-*          = 'V':  Compute eigenvalues and eigenvectors.
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA, N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the
-*          leading N-by-N upper triangular part of A contains the
-*          upper triangular part of the matrix A.  If UPLO = 'L',
-*          the leading N-by-N lower triangular part of A contains
-*          the lower triangular part of the matrix A.
-*          On exit, if JOBZ = 'V', then if INFO = 0, A contains the
-*          orthonormal eigenvectors of the matrix A.
-*          If JOBZ = 'N', then on exit the lower triangle (if UPLO='L')
-*          or the upper triangle (if UPLO='U') of A, including the
-*          diagonal, is destroyed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  W       (output) REAL array, dimension (N)
-*          If INFO = 0, the eigenvalues in ascending order.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The length of the array WORK.  LWORK >= max(1,2*N-1).
-*          For optimal efficiency, LWORK >= (NB+1)*N,
-*          where NB is the blocksize for CHETRD returned by ILAENV.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace) REAL array, dimension (max(1, 3*N-2))
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the algorithm failed to converge; i
-*                off-diagonal elements of an intermediate tridiagonal
-*                form did not converge to zero.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
-      COMPLEX            CONE
-      PARAMETER          ( CONE = ( 1.0E0, 0.0E0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LOWER, LQUERY, WANTZ
-      INTEGER            IINFO, IMAX, INDE, INDTAU, INDWRK, ISCALE,
-     $                   LLWORK, LWKOPT, NB
-      REAL               ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
-     $                   SMLNUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      REAL               CLANHE, SLAMCH
-      EXTERNAL           ILAENV, LSAME, CLANHE, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CHETRD, CLASCL, CSTEQR, CUNGTR, SSCAL, SSTERF,
-     $                   XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      WANTZ = LSAME( JOBZ, 'V' )
-      LOWER = LSAME( UPLO, 'L' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-      INFO = 0
-      IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.( LOWER .OR. LSAME( UPLO, 'U' ) ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         NB = ILAENV( 1, 'CHETRD', UPLO, N, -1, -1, -1 )
-         LWKOPT = MAX( 1, ( NB+1 )*N )
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, 2*N-1 ) .AND. .NOT.LQUERY )
-     $      INFO = -8
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CHEEV ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         RETURN
-      END IF
-*
-      IF( N.EQ.1 ) THEN
-         W( 1 ) = A( 1, 1 )
-         WORK( 1 ) = 1
-         IF( WANTZ )
-     $      A( 1, 1 ) = CONE
-         RETURN
-      END IF
-*
-*     Get machine constants.
-*
-      SAFMIN = SLAMCH( 'Safe minimum' )
-      EPS = SLAMCH( 'Precision' )
-      SMLNUM = SAFMIN / EPS
-      BIGNUM = ONE / SMLNUM
-      RMIN = SQRT( SMLNUM )
-      RMAX = SQRT( BIGNUM )
-*
-*     Scale matrix to allowable range, if necessary.
-*
-      ANRM = CLANHE( 'M', UPLO, N, A, LDA, RWORK )
-      ISCALE = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.RMIN ) THEN
-         ISCALE = 1
-         SIGMA = RMIN / ANRM
-      ELSE IF( ANRM.GT.RMAX ) THEN
-         ISCALE = 1
-         SIGMA = RMAX / ANRM
-      END IF
-      IF( ISCALE.EQ.1 )
-     $   CALL CLASCL( UPLO, 0, 0, ONE, SIGMA, N, N, A, LDA, INFO )
-*
-*     Call CHETRD to reduce Hermitian matrix to tridiagonal form.
-*
-      INDE = 1
-      INDTAU = 1
-      INDWRK = INDTAU + N
-      LLWORK = LWORK - INDWRK + 1
-      CALL CHETRD( UPLO, N, A, LDA, W, RWORK( INDE ), WORK( INDTAU ),
-     $             WORK( INDWRK ), LLWORK, IINFO )
-*
-*     For eigenvalues only, call SSTERF.  For eigenvectors, first call
-*     CUNGTR to generate the unitary matrix, then call CSTEQR.
-*
-      IF( .NOT.WANTZ ) THEN
-         CALL SSTERF( N, W, RWORK( INDE ), INFO )
-      ELSE
-         CALL CUNGTR( UPLO, N, A, LDA, WORK( INDTAU ), WORK( INDWRK ),
-     $                LLWORK, IINFO )
-         INDWRK = INDE + N
-         CALL CSTEQR( JOBZ, N, W, RWORK( INDE ), A, LDA,
-     $                RWORK( INDWRK ), INFO )
-      END IF
-*
-*     If matrix was scaled, then rescale eigenvalues appropriately.
-*
-      IF( ISCALE.EQ.1 ) THEN
-         IF( INFO.EQ.0 ) THEN
-            IMAX = N
-         ELSE
-            IMAX = INFO - 1
-         END IF
-         CALL SSCAL( IMAX, ONE / SIGMA, W, 1 )
-      END IF
-*
-*     Set WORK(1) to optimal complex workspace size.
-*
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of CHEEV
-*
-      END
--- a/libcruft/lapack/chegs2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,224 +0,0 @@
-      SUBROUTINE CHEGS2( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, ITYPE, LDA, LDB, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CHEGS2 reduces a complex Hermitian-definite generalized
-*  eigenproblem to standard form.
-*
-*  If ITYPE = 1, the problem is A*x = lambda*B*x,
-*  and A is overwritten by inv(U')*A*inv(U) or inv(L)*A*inv(L')
-*
-*  If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or
-*  B*A*x = lambda*x, and A is overwritten by U*A*U` or L'*A*L.
-*
-*  B must have been previously factorized as U'*U or L*L' by CPOTRF.
-*
-*  Arguments
-*  =========
-*
-*  ITYPE   (input) INTEGER
-*          = 1: compute inv(U')*A*inv(U) or inv(L)*A*inv(L');
-*          = 2 or 3: compute U*A*U' or L'*A*L.
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          Hermitian matrix A is stored, and how B has been factorized.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the leading
-*          n by n upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n by n lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*
-*          On exit, if INFO = 0, the transformed matrix, stored in the
-*          same format as A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input) COMPLEX array, dimension (LDB,N)
-*          The triangular factor from the Cholesky factorization of B,
-*          as returned by CPOTRF.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, HALF
-      PARAMETER          ( ONE = 1.0E+0, HALF = 0.5E+0 )
-      COMPLEX            CONE
-      PARAMETER          ( CONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            K
-      REAL               AKK, BKK
-      COMPLEX            CT
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CAXPY, CHER2, CLACGV, CSSCAL, CTRMV, CTRSV,
-     $                   XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN
-         INFO = -1
-      ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CHEGS2', -INFO )
-         RETURN
-      END IF
-*
-      IF( ITYPE.EQ.1 ) THEN
-         IF( UPPER ) THEN
-*
-*           Compute inv(U')*A*inv(U)
-*
-            DO 10 K = 1, N
-*
-*              Update the upper triangle of A(k:n,k:n)
-*
-               AKK = A( K, K )
-               BKK = B( K, K )
-               AKK = AKK / BKK**2
-               A( K, K ) = AKK
-               IF( K.LT.N ) THEN
-                  CALL CSSCAL( N-K, ONE / BKK, A( K, K+1 ), LDA )
-                  CT = -HALF*AKK
-                  CALL CLACGV( N-K, A( K, K+1 ), LDA )
-                  CALL CLACGV( N-K, B( K, K+1 ), LDB )
-                  CALL CAXPY( N-K, CT, B( K, K+1 ), LDB, A( K, K+1 ),
-     $                        LDA )
-                  CALL CHER2( UPLO, N-K, -CONE, A( K, K+1 ), LDA,
-     $                        B( K, K+1 ), LDB, A( K+1, K+1 ), LDA )
-                  CALL CAXPY( N-K, CT, B( K, K+1 ), LDB, A( K, K+1 ),
-     $                        LDA )
-                  CALL CLACGV( N-K, B( K, K+1 ), LDB )
-                  CALL CTRSV( UPLO, 'Conjugate transpose', 'Non-unit',
-     $                        N-K, B( K+1, K+1 ), LDB, A( K, K+1 ),
-     $                        LDA )
-                  CALL CLACGV( N-K, A( K, K+1 ), LDA )
-               END IF
-   10       CONTINUE
-         ELSE
-*
-*           Compute inv(L)*A*inv(L')
-*
-            DO 20 K = 1, N
-*
-*              Update the lower triangle of A(k:n,k:n)
-*
-               AKK = A( K, K )
-               BKK = B( K, K )
-               AKK = AKK / BKK**2
-               A( K, K ) = AKK
-               IF( K.LT.N ) THEN
-                  CALL CSSCAL( N-K, ONE / BKK, A( K+1, K ), 1 )
-                  CT = -HALF*AKK
-                  CALL CAXPY( N-K, CT, B( K+1, K ), 1, A( K+1, K ), 1 )
-                  CALL CHER2( UPLO, N-K, -CONE, A( K+1, K ), 1,
-     $                        B( K+1, K ), 1, A( K+1, K+1 ), LDA )
-                  CALL CAXPY( N-K, CT, B( K+1, K ), 1, A( K+1, K ), 1 )
-                  CALL CTRSV( UPLO, 'No transpose', 'Non-unit', N-K,
-     $                        B( K+1, K+1 ), LDB, A( K+1, K ), 1 )
-               END IF
-   20       CONTINUE
-         END IF
-      ELSE
-         IF( UPPER ) THEN
-*
-*           Compute U*A*U'
-*
-            DO 30 K = 1, N
-*
-*              Update the upper triangle of A(1:k,1:k)
-*
-               AKK = A( K, K )
-               BKK = B( K, K )
-               CALL CTRMV( UPLO, 'No transpose', 'Non-unit', K-1, B,
-     $                     LDB, A( 1, K ), 1 )
-               CT = HALF*AKK
-               CALL CAXPY( K-1, CT, B( 1, K ), 1, A( 1, K ), 1 )
-               CALL CHER2( UPLO, K-1, CONE, A( 1, K ), 1, B( 1, K ), 1,
-     $                     A, LDA )
-               CALL CAXPY( K-1, CT, B( 1, K ), 1, A( 1, K ), 1 )
-               CALL CSSCAL( K-1, BKK, A( 1, K ), 1 )
-               A( K, K ) = AKK*BKK**2
-   30       CONTINUE
-         ELSE
-*
-*           Compute L'*A*L
-*
-            DO 40 K = 1, N
-*
-*              Update the lower triangle of A(1:k,1:k)
-*
-               AKK = A( K, K )
-               BKK = B( K, K )
-               CALL CLACGV( K-1, A( K, 1 ), LDA )
-               CALL CTRMV( UPLO, 'Conjugate transpose', 'Non-unit', K-1,
-     $                     B, LDB, A( K, 1 ), LDA )
-               CT = HALF*AKK
-               CALL CLACGV( K-1, B( K, 1 ), LDB )
-               CALL CAXPY( K-1, CT, B( K, 1 ), LDB, A( K, 1 ), LDA )
-               CALL CHER2( UPLO, K-1, CONE, A( K, 1 ), LDA, B( K, 1 ),
-     $                     LDB, A, LDA )
-               CALL CAXPY( K-1, CT, B( K, 1 ), LDB, A( K, 1 ), LDA )
-               CALL CLACGV( K-1, B( K, 1 ), LDB )
-               CALL CSSCAL( K-1, BKK, A( K, 1 ), LDA )
-               CALL CLACGV( K-1, A( K, 1 ), LDA )
-               A( K, K ) = AKK*BKK**2
-   40       CONTINUE
-         END IF
-      END IF
-      RETURN
-*
-*     End of CHEGS2
-*
-      END
--- a/libcruft/lapack/chegst.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,259 +0,0 @@
-      SUBROUTINE CHEGST( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, ITYPE, LDA, LDB, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CHEGST reduces a complex Hermitian-definite generalized
-*  eigenproblem to standard form.
-*
-*  If ITYPE = 1, the problem is A*x = lambda*B*x,
-*  and A is overwritten by inv(U**H)*A*inv(U) or inv(L)*A*inv(L**H)
-*
-*  If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or
-*  B*A*x = lambda*x, and A is overwritten by U*A*U**H or L**H*A*L.
-*
-*  B must have been previously factorized as U**H*U or L*L**H by CPOTRF.
-*
-*  Arguments
-*  =========
-*
-*  ITYPE   (input) INTEGER
-*          = 1: compute inv(U**H)*A*inv(U) or inv(L)*A*inv(L**H);
-*          = 2 or 3: compute U*A*U**H or L**H*A*L.
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored and B is factored as
-*                  U**H*U;
-*          = 'L':  Lower triangle of A is stored and B is factored as
-*                  L*L**H.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the leading
-*          N-by-N upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading N-by-N lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*
-*          On exit, if INFO = 0, the transformed matrix, stored in the
-*          same format as A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input) COMPLEX array, dimension (LDB,N)
-*          The triangular factor from the Cholesky factorization of B,
-*          as returned by CPOTRF.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-      COMPLEX            CONE, HALF
-      PARAMETER          ( CONE = ( 1.0E+0, 0.0E+0 ),
-     $                   HALF = ( 0.5E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            K, KB, NB
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CHEGS2, CHEMM, CHER2K, CTRMM, CTRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN
-         INFO = -1
-      ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CHEGST', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'CHEGST', UPLO, N, -1, -1, -1 )
-*
-      IF( NB.LE.1 .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code
-*
-         CALL CHEGS2( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( ITYPE.EQ.1 ) THEN
-            IF( UPPER ) THEN
-*
-*              Compute inv(U')*A*inv(U)
-*
-               DO 10 K = 1, N, NB
-                  KB = MIN( N-K+1, NB )
-*
-*                 Update the upper triangle of A(k:n,k:n)
-*
-                  CALL CHEGS2( ITYPE, UPLO, KB, A( K, K ), LDA,
-     $                         B( K, K ), LDB, INFO )
-                  IF( K+KB.LE.N ) THEN
-                     CALL CTRSM( 'Left', UPLO, 'Conjugate transpose',
-     $                           'Non-unit', KB, N-K-KB+1, CONE,
-     $                           B( K, K ), LDB, A( K, K+KB ), LDA )
-                     CALL CHEMM( 'Left', UPLO, KB, N-K-KB+1, -HALF,
-     $                           A( K, K ), LDA, B( K, K+KB ), LDB,
-     $                           CONE, A( K, K+KB ), LDA )
-                     CALL CHER2K( UPLO, 'Conjugate transpose', N-K-KB+1,
-     $                            KB, -CONE, A( K, K+KB ), LDA,
-     $                            B( K, K+KB ), LDB, ONE,
-     $                            A( K+KB, K+KB ), LDA )
-                     CALL CHEMM( 'Left', UPLO, KB, N-K-KB+1, -HALF,
-     $                           A( K, K ), LDA, B( K, K+KB ), LDB,
-     $                           CONE, A( K, K+KB ), LDA )
-                     CALL CTRSM( 'Right', UPLO, 'No transpose',
-     $                           'Non-unit', KB, N-K-KB+1, CONE,
-     $                           B( K+KB, K+KB ), LDB, A( K, K+KB ),
-     $                           LDA )
-                  END IF
-   10          CONTINUE
-            ELSE
-*
-*              Compute inv(L)*A*inv(L')
-*
-               DO 20 K = 1, N, NB
-                  KB = MIN( N-K+1, NB )
-*
-*                 Update the lower triangle of A(k:n,k:n)
-*
-                  CALL CHEGS2( ITYPE, UPLO, KB, A( K, K ), LDA,
-     $                         B( K, K ), LDB, INFO )
-                  IF( K+KB.LE.N ) THEN
-                     CALL CTRSM( 'Right', UPLO, 'Conjugate transpose',
-     $                           'Non-unit', N-K-KB+1, KB, CONE,
-     $                           B( K, K ), LDB, A( K+KB, K ), LDA )
-                     CALL CHEMM( 'Right', UPLO, N-K-KB+1, KB, -HALF,
-     $                           A( K, K ), LDA, B( K+KB, K ), LDB,
-     $                           CONE, A( K+KB, K ), LDA )
-                     CALL CHER2K( UPLO, 'No transpose', N-K-KB+1, KB,
-     $                            -CONE, A( K+KB, K ), LDA,
-     $                            B( K+KB, K ), LDB, ONE,
-     $                            A( K+KB, K+KB ), LDA )
-                     CALL CHEMM( 'Right', UPLO, N-K-KB+1, KB, -HALF,
-     $                           A( K, K ), LDA, B( K+KB, K ), LDB,
-     $                           CONE, A( K+KB, K ), LDA )
-                     CALL CTRSM( 'Left', UPLO, 'No transpose',
-     $                           'Non-unit', N-K-KB+1, KB, CONE,
-     $                           B( K+KB, K+KB ), LDB, A( K+KB, K ),
-     $                           LDA )
-                  END IF
-   20          CONTINUE
-            END IF
-         ELSE
-            IF( UPPER ) THEN
-*
-*              Compute U*A*U'
-*
-               DO 30 K = 1, N, NB
-                  KB = MIN( N-K+1, NB )
-*
-*                 Update the upper triangle of A(1:k+kb-1,1:k+kb-1)
-*
-                  CALL CTRMM( 'Left', UPLO, 'No transpose', 'Non-unit',
-     $                        K-1, KB, CONE, B, LDB, A( 1, K ), LDA )
-                  CALL CHEMM( 'Right', UPLO, K-1, KB, HALF, A( K, K ),
-     $                        LDA, B( 1, K ), LDB, CONE, A( 1, K ),
-     $                        LDA )
-                  CALL CHER2K( UPLO, 'No transpose', K-1, KB, CONE,
-     $                         A( 1, K ), LDA, B( 1, K ), LDB, ONE, A,
-     $                         LDA )
-                  CALL CHEMM( 'Right', UPLO, K-1, KB, HALF, A( K, K ),
-     $                        LDA, B( 1, K ), LDB, CONE, A( 1, K ),
-     $                        LDA )
-                  CALL CTRMM( 'Right', UPLO, 'Conjugate transpose',
-     $                        'Non-unit', K-1, KB, CONE, B( K, K ), LDB,
-     $                        A( 1, K ), LDA )
-                  CALL CHEGS2( ITYPE, UPLO, KB, A( K, K ), LDA,
-     $                         B( K, K ), LDB, INFO )
-   30          CONTINUE
-            ELSE
-*
-*              Compute L'*A*L
-*
-               DO 40 K = 1, N, NB
-                  KB = MIN( N-K+1, NB )
-*
-*                 Update the lower triangle of A(1:k+kb-1,1:k+kb-1)
-*
-                  CALL CTRMM( 'Right', UPLO, 'No transpose', 'Non-unit',
-     $                        KB, K-1, CONE, B, LDB, A( K, 1 ), LDA )
-                  CALL CHEMM( 'Left', UPLO, KB, K-1, HALF, A( K, K ),
-     $                        LDA, B( K, 1 ), LDB, CONE, A( K, 1 ),
-     $                        LDA )
-                  CALL CHER2K( UPLO, 'Conjugate transpose', K-1, KB,
-     $                         CONE, A( K, 1 ), LDA, B( K, 1 ), LDB,
-     $                         ONE, A, LDA )
-                  CALL CHEMM( 'Left', UPLO, KB, K-1, HALF, A( K, K ),
-     $                        LDA, B( K, 1 ), LDB, CONE, A( K, 1 ),
-     $                        LDA )
-                  CALL CTRMM( 'Left', UPLO, 'Conjugate transpose',
-     $                        'Non-unit', KB, K-1, CONE, B( K, K ), LDB,
-     $                        A( K, 1 ), LDA )
-                  CALL CHEGS2( ITYPE, UPLO, KB, A( K, K ), LDA,
-     $                         B( K, K ), LDB, INFO )
-   40          CONTINUE
-            END IF
-         END IF
-      END IF
-      RETURN
-*
-*     End of CHEGST
-*
-      END
--- a/libcruft/lapack/chegv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,232 +0,0 @@
-      SUBROUTINE CHEGV( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK,
-     $                  LWORK, RWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBZ, UPLO
-      INTEGER            INFO, ITYPE, LDA, LDB, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      REAL               RWORK( * ), W( * )
-      COMPLEX            A( LDA, * ), B( LDB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CHEGV computes all the eigenvalues, and optionally, the eigenvectors
-*  of a complex generalized Hermitian-definite eigenproblem, of the form
-*  A*x=(lambda)*B*x,  A*Bx=(lambda)*x,  or B*A*x=(lambda)*x.
-*  Here A and B are assumed to be Hermitian and B is also
-*  positive definite.
-*
-*  Arguments
-*  =========
-*
-*  ITYPE   (input) INTEGER
-*          Specifies the problem type to be solved:
-*          = 1:  A*x = (lambda)*B*x
-*          = 2:  A*B*x = (lambda)*x
-*          = 3:  B*A*x = (lambda)*x
-*
-*  JOBZ    (input) CHARACTER*1
-*          = 'N':  Compute eigenvalues only;
-*          = 'V':  Compute eigenvalues and eigenvectors.
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangles of A and B are stored;
-*          = 'L':  Lower triangles of A and B are stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA, N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the
-*          leading N-by-N upper triangular part of A contains the
-*          upper triangular part of the matrix A.  If UPLO = 'L',
-*          the leading N-by-N lower triangular part of A contains
-*          the lower triangular part of the matrix A.
-*
-*          On exit, if JOBZ = 'V', then if INFO = 0, A contains the
-*          matrix Z of eigenvectors.  The eigenvectors are normalized
-*          as follows:
-*          if ITYPE = 1 or 2, Z**H*B*Z = I;
-*          if ITYPE = 3, Z**H*inv(B)*Z = I.
-*          If JOBZ = 'N', then on exit the upper triangle (if UPLO='U')
-*          or the lower triangle (if UPLO='L') of A, including the
-*          diagonal, is destroyed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input/output) COMPLEX array, dimension (LDB, N)
-*          On entry, the Hermitian positive definite matrix B.
-*          If UPLO = 'U', the leading N-by-N upper triangular part of B
-*          contains the upper triangular part of the matrix B.
-*          If UPLO = 'L', the leading N-by-N lower triangular part of B
-*          contains the lower triangular part of the matrix B.
-*
-*          On exit, if INFO <= N, the part of B containing the matrix is
-*          overwritten by the triangular factor U or L from the Cholesky
-*          factorization B = U**H*U or B = L*L**H.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  W       (output) REAL array, dimension (N)
-*          If INFO = 0, the eigenvalues in ascending order.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The length of the array WORK.  LWORK >= max(1,2*N-1).
-*          For optimal efficiency, LWORK >= (NB+1)*N,
-*          where NB is the blocksize for CHETRD returned by ILAENV.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace) REAL array, dimension (max(1, 3*N-2))
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  CPOTRF or CHEEV returned an error code:
-*             <= N:  if INFO = i, CHEEV failed to converge;
-*                    i off-diagonal elements of an intermediate
-*                    tridiagonal form did not converge to zero;
-*             > N:   if INFO = N + i, for 1 <= i <= N, then the leading
-*                    minor of order i of B is not positive definite.
-*                    The factorization of B could not be completed and
-*                    no eigenvalues or eigenvectors were computed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, UPPER, WANTZ
-      CHARACTER          TRANS
-      INTEGER            LWKOPT, NB, NEIG
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV, LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CHEEV, CHEGST, CPOTRF, CTRMM, CTRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      WANTZ = LSAME( JOBZ, 'V' )
-      UPPER = LSAME( UPLO, 'U' )
-      LQUERY = ( LWORK.EQ. -1 )
-*
-      INFO = 0
-      IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN
-         INFO = -1
-      ELSE IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.( UPPER .OR. LSAME( UPLO, 'L' ) ) ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -8
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         NB = ILAENV( 1, 'CHETRD', UPLO, N, -1, -1, -1 )
-         LWKOPT = MAX( 1, ( NB + 1 )*N )
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, 2*N-1 ) .AND. .NOT.LQUERY ) THEN
-            INFO = -11
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CHEGV ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Form a Cholesky factorization of B.
-*
-      CALL CPOTRF( UPLO, N, B, LDB, INFO )
-      IF( INFO.NE.0 ) THEN
-         INFO = N + INFO
-         RETURN
-      END IF
-*
-*     Transform problem to standard eigenvalue problem and solve.
-*
-      CALL CHEGST( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
-      CALL CHEEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, INFO )
-*
-      IF( WANTZ ) THEN
-*
-*        Backtransform eigenvectors to the original problem.
-*
-         NEIG = N
-         IF( INFO.GT.0 )
-     $      NEIG = INFO - 1
-         IF( ITYPE.EQ.1 .OR. ITYPE.EQ.2 ) THEN
-*
-*           For A*x=(lambda)*B*x and A*B*x=(lambda)*x;
-*           backtransform eigenvectors: x = inv(L)'*y or inv(U)*y
-*
-            IF( UPPER ) THEN
-               TRANS = 'N'
-            ELSE
-               TRANS = 'C'
-            END IF
-*
-            CALL CTRSM( 'Left', UPLO, TRANS, 'Non-unit', N, NEIG, ONE,
-     $                  B, LDB, A, LDA )
-*
-         ELSE IF( ITYPE.EQ.3 ) THEN
-*
-*           For B*A*x=(lambda)*x;
-*           backtransform eigenvectors: x = L*y or U'*y
-*
-            IF( UPPER ) THEN
-               TRANS = 'C'
-            ELSE
-               TRANS = 'N'
-            END IF
-*
-            CALL CTRMM( 'Left', UPLO, TRANS, 'Non-unit', N, NEIG, ONE,
-     $                  B, LDB, A, LDA )
-         END IF
-      END IF
-*
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of CHEGV
-*
-      END
--- a/libcruft/lapack/chetd2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,258 +0,0 @@
-      SUBROUTINE CHETD2( UPLO, N, A, LDA, D, E, TAU, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * ), E( * )
-      COMPLEX            A( LDA, * ), TAU( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CHETD2 reduces a complex Hermitian matrix A to real symmetric
-*  tridiagonal form T by a unitary similarity transformation:
-*  Q' * A * Q = T.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          Hermitian matrix A is stored:
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the leading
-*          n-by-n upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n-by-n lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*          On exit, if UPLO = 'U', the diagonal and first superdiagonal
-*          of A are overwritten by the corresponding elements of the
-*          tridiagonal matrix T, and the elements above the first
-*          superdiagonal, with the array TAU, represent the unitary
-*          matrix Q as a product of elementary reflectors; if UPLO
-*          = 'L', the diagonal and first subdiagonal of A are over-
-*          written by the corresponding elements of the tridiagonal
-*          matrix T, and the elements below the first subdiagonal, with
-*          the array TAU, represent the unitary matrix Q as a product
-*          of elementary reflectors. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  D       (output) REAL array, dimension (N)
-*          The diagonal elements of the tridiagonal matrix T:
-*          D(i) = A(i,i).
-*
-*  E       (output) REAL array, dimension (N-1)
-*          The off-diagonal elements of the tridiagonal matrix T:
-*          E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'.
-*
-*  TAU     (output) COMPLEX array, dimension (N-1)
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  If UPLO = 'U', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(n-1) . . . H(2) H(1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in
-*  A(1:i-1,i+1), and tau in TAU(i).
-*
-*  If UPLO = 'L', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(1) H(2) . . . H(n-1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i),
-*  and tau in TAU(i).
-*
-*  The contents of A on exit are illustrated by the following examples
-*  with n = 5:
-*
-*  if UPLO = 'U':                       if UPLO = 'L':
-*
-*    (  d   e   v2  v3  v4 )              (  d                  )
-*    (      d   e   v3  v4 )              (  e   d              )
-*    (          d   e   v4 )              (  v1  e   d          )
-*    (              d   e  )              (  v1  v2  e   d      )
-*    (                  d  )              (  v1  v2  v3  e   d  )
-*
-*  where d and e denote diagonal and off-diagonal elements of T, and vi
-*  denotes an element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE, ZERO, HALF
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ),
-     $                   ZERO = ( 0.0E+0, 0.0E+0 ),
-     $                   HALF = ( 0.5E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            I
-      COMPLEX            ALPHA, TAUI
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CAXPY, CHEMV, CHER2, CLARFG, XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      COMPLEX            CDOTC
-      EXTERNAL           LSAME, CDOTC
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN, REAL
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CHETD2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Reduce the upper triangle of A
-*
-         A( N, N ) = REAL( A( N, N ) )
-         DO 10 I = N - 1, 1, -1
-*
-*           Generate elementary reflector H(i) = I - tau * v * v'
-*           to annihilate A(1:i-1,i+1)
-*
-            ALPHA = A( I, I+1 )
-            CALL CLARFG( I, ALPHA, A( 1, I+1 ), 1, TAUI )
-            E( I ) = ALPHA
-*
-            IF( TAUI.NE.ZERO ) THEN
-*
-*              Apply H(i) from both sides to A(1:i,1:i)
-*
-               A( I, I+1 ) = ONE
-*
-*              Compute  x := tau * A * v  storing x in TAU(1:i)
-*
-               CALL CHEMV( UPLO, I, TAUI, A, LDA, A( 1, I+1 ), 1, ZERO,
-     $                     TAU, 1 )
-*
-*              Compute  w := x - 1/2 * tau * (x'*v) * v
-*
-               ALPHA = -HALF*TAUI*CDOTC( I, TAU, 1, A( 1, I+1 ), 1 )
-               CALL CAXPY( I, ALPHA, A( 1, I+1 ), 1, TAU, 1 )
-*
-*              Apply the transformation as a rank-2 update:
-*                 A := A - v * w' - w * v'
-*
-               CALL CHER2( UPLO, I, -ONE, A( 1, I+1 ), 1, TAU, 1, A,
-     $                     LDA )
-*
-            ELSE
-               A( I, I ) = REAL( A( I, I ) )
-            END IF
-            A( I, I+1 ) = E( I )
-            D( I+1 ) = A( I+1, I+1 )
-            TAU( I ) = TAUI
-   10    CONTINUE
-         D( 1 ) = A( 1, 1 )
-      ELSE
-*
-*        Reduce the lower triangle of A
-*
-         A( 1, 1 ) = REAL( A( 1, 1 ) )
-         DO 20 I = 1, N - 1
-*
-*           Generate elementary reflector H(i) = I - tau * v * v'
-*           to annihilate A(i+2:n,i)
-*
-            ALPHA = A( I+1, I )
-            CALL CLARFG( N-I, ALPHA, A( MIN( I+2, N ), I ), 1, TAUI )
-            E( I ) = ALPHA
-*
-            IF( TAUI.NE.ZERO ) THEN
-*
-*              Apply H(i) from both sides to A(i+1:n,i+1:n)
-*
-               A( I+1, I ) = ONE
-*
-*              Compute  x := tau * A * v  storing y in TAU(i:n-1)
-*
-               CALL CHEMV( UPLO, N-I, TAUI, A( I+1, I+1 ), LDA,
-     $                     A( I+1, I ), 1, ZERO, TAU( I ), 1 )
-*
-*              Compute  w := x - 1/2 * tau * (x'*v) * v
-*
-               ALPHA = -HALF*TAUI*CDOTC( N-I, TAU( I ), 1, A( I+1, I ),
-     $                 1 )
-               CALL CAXPY( N-I, ALPHA, A( I+1, I ), 1, TAU( I ), 1 )
-*
-*              Apply the transformation as a rank-2 update:
-*                 A := A - v * w' - w * v'
-*
-               CALL CHER2( UPLO, N-I, -ONE, A( I+1, I ), 1, TAU( I ), 1,
-     $                     A( I+1, I+1 ), LDA )
-*
-            ELSE
-               A( I+1, I+1 ) = REAL( A( I+1, I+1 ) )
-            END IF
-            A( I+1, I ) = E( I )
-            D( I ) = A( I, I )
-            TAU( I ) = TAUI
-   20    CONTINUE
-         D( N ) = A( N, N )
-      END IF
-*
-      RETURN
-*
-*     End of CHETD2
-*
-      END
--- a/libcruft/lapack/chetrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,296 +0,0 @@
-      SUBROUTINE CHETRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * ), E( * )
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CHETRD reduces a complex Hermitian matrix A to real symmetric
-*  tridiagonal form T by a unitary similarity transformation:
-*  Q**H * A * Q = T.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the leading
-*          N-by-N upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading N-by-N lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*          On exit, if UPLO = 'U', the diagonal and first superdiagonal
-*          of A are overwritten by the corresponding elements of the
-*          tridiagonal matrix T, and the elements above the first
-*          superdiagonal, with the array TAU, represent the unitary
-*          matrix Q as a product of elementary reflectors; if UPLO
-*          = 'L', the diagonal and first subdiagonal of A are over-
-*          written by the corresponding elements of the tridiagonal
-*          matrix T, and the elements below the first subdiagonal, with
-*          the array TAU, represent the unitary matrix Q as a product
-*          of elementary reflectors. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  D       (output) REAL array, dimension (N)
-*          The diagonal elements of the tridiagonal matrix T:
-*          D(i) = A(i,i).
-*
-*  E       (output) REAL array, dimension (N-1)
-*          The off-diagonal elements of the tridiagonal matrix T:
-*          E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'.
-*
-*  TAU     (output) COMPLEX array, dimension (N-1)
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= 1.
-*          For optimum performance LWORK >= N*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  If UPLO = 'U', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(n-1) . . . H(2) H(1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in
-*  A(1:i-1,i+1), and tau in TAU(i).
-*
-*  If UPLO = 'L', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(1) H(2) . . . H(n-1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i),
-*  and tau in TAU(i).
-*
-*  The contents of A on exit are illustrated by the following examples
-*  with n = 5:
-*
-*  if UPLO = 'U':                       if UPLO = 'L':
-*
-*    (  d   e   v2  v3  v4 )              (  d                  )
-*    (      d   e   v3  v4 )              (  e   d              )
-*    (          d   e   v4 )              (  v1  e   d          )
-*    (              d   e  )              (  v1  v2  e   d      )
-*    (                  d  )              (  v1  v2  v3  e   d  )
-*
-*  where d and e denote diagonal and off-diagonal elements of T, and vi
-*  denotes an element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-      COMPLEX            CONE
-      PARAMETER          ( CONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, UPPER
-      INTEGER            I, IINFO, IWS, J, KK, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CHER2K, CHETD2, CLATRD, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.1 .AND. .NOT.LQUERY ) THEN
-         INFO = -9
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-*
-*        Determine the block size.
-*
-         NB = ILAENV( 1, 'CHETRD', UPLO, N, -1, -1, -1 )
-         LWKOPT = N*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CHETRD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NX = N
-      IWS = 1
-      IF( NB.GT.1 .AND. NB.LT.N ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code
-*        (last block is always handled by unblocked code).
-*
-         NX = MAX( NB, ILAENV( 3, 'CHETRD', UPLO, N, -1, -1, -1 ) )
-         IF( NX.LT.N ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = N
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  determine the
-*              minimum value of NB, and reduce NB or force use of
-*              unblocked code by setting NX = N.
-*
-               NB = MAX( LWORK / LDWORK, 1 )
-               NBMIN = ILAENV( 2, 'CHETRD', UPLO, N, -1, -1, -1 )
-               IF( NB.LT.NBMIN )
-     $            NX = N
-            END IF
-         ELSE
-            NX = N
-         END IF
-      ELSE
-         NB = 1
-      END IF
-*
-      IF( UPPER ) THEN
-*
-*        Reduce the upper triangle of A.
-*        Columns 1:kk are handled by the unblocked method.
-*
-         KK = N - ( ( N-NX+NB-1 ) / NB )*NB
-         DO 20 I = N - NB + 1, KK + 1, -NB
-*
-*           Reduce columns i:i+nb-1 to tridiagonal form and form the
-*           matrix W which is needed to update the unreduced part of
-*           the matrix
-*
-            CALL CLATRD( UPLO, I+NB-1, NB, A, LDA, E, TAU, WORK,
-     $                   LDWORK )
-*
-*           Update the unreduced submatrix A(1:i-1,1:i-1), using an
-*           update of the form:  A := A - V*W' - W*V'
-*
-            CALL CHER2K( UPLO, 'No transpose', I-1, NB, -CONE,
-     $                   A( 1, I ), LDA, WORK, LDWORK, ONE, A, LDA )
-*
-*           Copy superdiagonal elements back into A, and diagonal
-*           elements into D
-*
-            DO 10 J = I, I + NB - 1
-               A( J-1, J ) = E( J-1 )
-               D( J ) = A( J, J )
-   10       CONTINUE
-   20    CONTINUE
-*
-*        Use unblocked code to reduce the last or only block
-*
-         CALL CHETD2( UPLO, KK, A, LDA, D, E, TAU, IINFO )
-      ELSE
-*
-*        Reduce the lower triangle of A
-*
-         DO 40 I = 1, N - NX, NB
-*
-*           Reduce columns i:i+nb-1 to tridiagonal form and form the
-*           matrix W which is needed to update the unreduced part of
-*           the matrix
-*
-            CALL CLATRD( UPLO, N-I+1, NB, A( I, I ), LDA, E( I ),
-     $                   TAU( I ), WORK, LDWORK )
-*
-*           Update the unreduced submatrix A(i+nb:n,i+nb:n), using
-*           an update of the form:  A := A - V*W' - W*V'
-*
-            CALL CHER2K( UPLO, 'No transpose', N-I-NB+1, NB, -CONE,
-     $                   A( I+NB, I ), LDA, WORK( NB+1 ), LDWORK, ONE,
-     $                   A( I+NB, I+NB ), LDA )
-*
-*           Copy subdiagonal elements back into A, and diagonal
-*           elements into D
-*
-            DO 30 J = I, I + NB - 1
-               A( J+1, J ) = E( J )
-               D( J ) = A( J, J )
-   30       CONTINUE
-   40    CONTINUE
-*
-*        Use unblocked code to reduce the last or only block
-*
-         CALL CHETD2( UPLO, N-I+1, A( I, I ), LDA, D( I ), E( I ),
-     $                TAU( I ), IINFO )
-      END IF
-*
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of CHETRD
-*
-      END
--- a/libcruft/lapack/chgeqz.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,758 +0,0 @@
-      SUBROUTINE CHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT,
-     $                   ALPHA, BETA, Q, LDQ, Z, LDZ, WORK, LWORK,
-     $                   RWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPQ, COMPZ, JOB
-      INTEGER            IHI, ILO, INFO, LDH, LDQ, LDT, LDZ, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      REAL               RWORK( * )
-      COMPLEX            ALPHA( * ), BETA( * ), H( LDH, * ),
-     $                   Q( LDQ, * ), T( LDT, * ), WORK( * ),
-     $                   Z( LDZ, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CHGEQZ computes the eigenvalues of a complex matrix pair (H,T),
-*  where H is an upper Hessenberg matrix and T is upper triangular,
-*  using the single-shift QZ method.
-*  Matrix pairs of this type are produced by the reduction to
-*  generalized upper Hessenberg form of a complex matrix pair (A,B):
-*  
-*     A = Q1*H*Z1**H,  B = Q1*T*Z1**H,
-*  
-*  as computed by CGGHRD.
-*  
-*  If JOB='S', then the Hessenberg-triangular pair (H,T) is
-*  also reduced to generalized Schur form,
-*  
-*     H = Q*S*Z**H,  T = Q*P*Z**H,
-*  
-*  where Q and Z are unitary matrices and S and P are upper triangular.
-*  
-*  Optionally, the unitary matrix Q from the generalized Schur
-*  factorization may be postmultiplied into an input matrix Q1, and the
-*  unitary matrix Z may be postmultiplied into an input matrix Z1.
-*  If Q1 and Z1 are the unitary matrices from CGGHRD that reduced
-*  the matrix pair (A,B) to generalized Hessenberg form, then the output
-*  matrices Q1*Q and Z1*Z are the unitary factors from the generalized
-*  Schur factorization of (A,B):
-*  
-*     A = (Q1*Q)*S*(Z1*Z)**H,  B = (Q1*Q)*P*(Z1*Z)**H.
-*  
-*  To avoid overflow, eigenvalues of the matrix pair (H,T)
-*  (equivalently, of (A,B)) are computed as a pair of complex values
-*  (alpha,beta).  If beta is nonzero, lambda = alpha / beta is an
-*  eigenvalue of the generalized nonsymmetric eigenvalue problem (GNEP)
-*     A*x = lambda*B*x
-*  and if alpha is nonzero, mu = beta / alpha is an eigenvalue of the
-*  alternate form of the GNEP
-*     mu*A*y = B*y.
-*  The values of alpha and beta for the i-th eigenvalue can be read
-*  directly from the generalized Schur form:  alpha = S(i,i),
-*  beta = P(i,i).
-*
-*  Ref: C.B. Moler & G.W. Stewart, "An Algorithm for Generalized Matrix
-*       Eigenvalue Problems", SIAM J. Numer. Anal., 10(1973),
-*       pp. 241--256.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          = 'E': Compute eigenvalues only;
-*          = 'S': Computer eigenvalues and the Schur form.
-*
-*  COMPQ   (input) CHARACTER*1
-*          = 'N': Left Schur vectors (Q) are not computed;
-*          = 'I': Q is initialized to the unit matrix and the matrix Q
-*                 of left Schur vectors of (H,T) is returned;
-*          = 'V': Q must contain a unitary matrix Q1 on entry and
-*                 the product Q1*Q is returned.
-*
-*  COMPZ   (input) CHARACTER*1
-*          = 'N': Right Schur vectors (Z) are not computed;
-*          = 'I': Q is initialized to the unit matrix and the matrix Z
-*                 of right Schur vectors of (H,T) is returned;
-*          = 'V': Z must contain a unitary matrix Z1 on entry and
-*                 the product Z1*Z is returned.
-*
-*  N       (input) INTEGER
-*          The order of the matrices H, T, Q, and Z.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          ILO and IHI mark the rows and columns of H which are in
-*          Hessenberg form.  It is assumed that A is already upper
-*          triangular in rows and columns 1:ILO-1 and IHI+1:N.
-*          If N > 0, 1 <= ILO <= IHI <= N; if N = 0, ILO=1 and IHI=0.
-*
-*  H       (input/output) COMPLEX array, dimension (LDH, N)
-*          On entry, the N-by-N upper Hessenberg matrix H.
-*          On exit, if JOB = 'S', H contains the upper triangular
-*          matrix S from the generalized Schur factorization.
-*          If JOB = 'E', the diagonal of H matches that of S, but
-*          the rest of H is unspecified.
-*
-*  LDH     (input) INTEGER
-*          The leading dimension of the array H.  LDH >= max( 1, N ).
-*
-*  T       (input/output) COMPLEX array, dimension (LDT, N)
-*          On entry, the N-by-N upper triangular matrix T.
-*          On exit, if JOB = 'S', T contains the upper triangular
-*          matrix P from the generalized Schur factorization.
-*          If JOB = 'E', the diagonal of T matches that of P, but
-*          the rest of T is unspecified.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T.  LDT >= max( 1, N ).
-*
-*  ALPHA   (output) COMPLEX array, dimension (N)
-*          The complex scalars alpha that define the eigenvalues of
-*          GNEP.  ALPHA(i) = S(i,i) in the generalized Schur
-*          factorization.
-*
-*  BETA    (output) COMPLEX array, dimension (N)
-*          The real non-negative scalars beta that define the
-*          eigenvalues of GNEP.  BETA(i) = P(i,i) in the generalized
-*          Schur factorization.
-*
-*          Together, the quantities alpha = ALPHA(j) and beta = BETA(j)
-*          represent the j-th eigenvalue of the matrix pair (A,B), in
-*          one of the forms lambda = alpha/beta or mu = beta/alpha.
-*          Since either lambda or mu may overflow, they should not,
-*          in general, be computed.
-*
-*  Q       (input/output) COMPLEX array, dimension (LDQ, N)
-*          On entry, if COMPZ = 'V', the unitary matrix Q1 used in the
-*          reduction of (A,B) to generalized Hessenberg form.
-*          On exit, if COMPZ = 'I', the unitary matrix of left Schur
-*          vectors of (H,T), and if COMPZ = 'V', the unitary matrix of
-*          left Schur vectors of (A,B).
-*          Not referenced if COMPZ = 'N'.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.  LDQ >= 1.
-*          If COMPQ='V' or 'I', then LDQ >= N.
-*
-*  Z       (input/output) COMPLEX array, dimension (LDZ, N)
-*          On entry, if COMPZ = 'V', the unitary matrix Z1 used in the
-*          reduction of (A,B) to generalized Hessenberg form.
-*          On exit, if COMPZ = 'I', the unitary matrix of right Schur
-*          vectors of (H,T), and if COMPZ = 'V', the unitary matrix of
-*          right Schur vectors of (A,B).
-*          Not referenced if COMPZ = 'N'.
-*
-*  LDZ     (input) INTEGER
-*          The leading dimension of the array Z.  LDZ >= 1.
-*          If COMPZ='V' or 'I', then LDZ >= N.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO >= 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,N).
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace) REAL array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          = 1,...,N: the QZ iteration did not converge.  (H,T) is not
-*                     in Schur form, but ALPHA(i) and BETA(i),
-*                     i=INFO+1,...,N should be correct.
-*          = N+1,...,2*N: the shift calculation failed.  (H,T) is not
-*                     in Schur form, but ALPHA(i) and BETA(i),
-*                     i=INFO-N+1,...,N should be correct.
-*
-*  Further Details
-*  ===============
-*
-*  We assume that complex ABS works as long as its value is less than
-*  overflow.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0E+0, 0.0E+0 ),
-     $                   CONE = ( 1.0E+0, 0.0E+0 ) )
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-      REAL               HALF
-      PARAMETER          ( HALF = 0.5E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ILAZR2, ILAZRO, ILQ, ILSCHR, ILZ, LQUERY
-      INTEGER            ICOMPQ, ICOMPZ, IFIRST, IFRSTM, IITER, ILAST,
-     $                   ILASTM, IN, ISCHUR, ISTART, J, JC, JCH, JITER,
-     $                   JR, MAXIT
-      REAL               ABSB, ANORM, ASCALE, ATOL, BNORM, BSCALE, BTOL,
-     $                   C, SAFMIN, TEMP, TEMP2, TEMPR, ULP
-      COMPLEX            ABI22, AD11, AD12, AD21, AD22, CTEMP, CTEMP2,
-     $                   CTEMP3, ESHIFT, RTDISC, S, SHIFT, SIGNBC, T1,
-     $                   U12, X
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               CLANHS, SLAMCH
-      EXTERNAL           LSAME, CLANHS, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLARTG, CLASET, CROT, CSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, CMPLX, CONJG, MAX, MIN, REAL, SQRT
-*     ..
-*     .. Statement Functions ..
-      REAL               ABS1
-*     ..
-*     .. Statement Function definitions ..
-      ABS1( X ) = ABS( REAL( X ) ) + ABS( AIMAG( X ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode JOB, COMPQ, COMPZ
-*
-      IF( LSAME( JOB, 'E' ) ) THEN
-         ILSCHR = .FALSE.
-         ISCHUR = 1
-      ELSE IF( LSAME( JOB, 'S' ) ) THEN
-         ILSCHR = .TRUE.
-         ISCHUR = 2
-      ELSE
-         ISCHUR = 0
-      END IF
-*
-      IF( LSAME( COMPQ, 'N' ) ) THEN
-         ILQ = .FALSE.
-         ICOMPQ = 1
-      ELSE IF( LSAME( COMPQ, 'V' ) ) THEN
-         ILQ = .TRUE.
-         ICOMPQ = 2
-      ELSE IF( LSAME( COMPQ, 'I' ) ) THEN
-         ILQ = .TRUE.
-         ICOMPQ = 3
-      ELSE
-         ICOMPQ = 0
-      END IF
-*
-      IF( LSAME( COMPZ, 'N' ) ) THEN
-         ILZ = .FALSE.
-         ICOMPZ = 1
-      ELSE IF( LSAME( COMPZ, 'V' ) ) THEN
-         ILZ = .TRUE.
-         ICOMPZ = 2
-      ELSE IF( LSAME( COMPZ, 'I' ) ) THEN
-         ILZ = .TRUE.
-         ICOMPZ = 3
-      ELSE
-         ICOMPZ = 0
-      END IF
-*
-*     Check Argument Values
-*
-      INFO = 0
-      WORK( 1 ) = MAX( 1, N )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( ISCHUR.EQ.0 ) THEN
-         INFO = -1
-      ELSE IF( ICOMPQ.EQ.0 ) THEN
-         INFO = -2
-      ELSE IF( ICOMPZ.EQ.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( ILO.LT.1 ) THEN
-         INFO = -5
-      ELSE IF( IHI.GT.N .OR. IHI.LT.ILO-1 ) THEN
-         INFO = -6
-      ELSE IF( LDH.LT.N ) THEN
-         INFO = -8
-      ELSE IF( LDT.LT.N ) THEN
-         INFO = -10
-      ELSE IF( LDQ.LT.1 .OR. ( ILQ .AND. LDQ.LT.N ) ) THEN
-         INFO = -14
-      ELSE IF( LDZ.LT.1 .OR. ( ILZ .AND. LDZ.LT.N ) ) THEN
-         INFO = -16
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -18
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CHGEQZ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-c     WORK( 1 ) = CMPLX( 1 )
-      IF( N.LE.0 ) THEN
-         WORK( 1 ) = CMPLX( 1 )
-         RETURN
-      END IF
-*
-*     Initialize Q and Z
-*
-      IF( ICOMPQ.EQ.3 )
-     $   CALL CLASET( 'Full', N, N, CZERO, CONE, Q, LDQ )
-      IF( ICOMPZ.EQ.3 )
-     $   CALL CLASET( 'Full', N, N, CZERO, CONE, Z, LDZ )
-*
-*     Machine Constants
-*
-      IN = IHI + 1 - ILO
-      SAFMIN = SLAMCH( 'S' )
-      ULP = SLAMCH( 'E' )*SLAMCH( 'B' )
-      ANORM = CLANHS( 'F', IN, H( ILO, ILO ), LDH, RWORK )
-      BNORM = CLANHS( 'F', IN, T( ILO, ILO ), LDT, RWORK )
-      ATOL = MAX( SAFMIN, ULP*ANORM )
-      BTOL = MAX( SAFMIN, ULP*BNORM )
-      ASCALE = ONE / MAX( SAFMIN, ANORM )
-      BSCALE = ONE / MAX( SAFMIN, BNORM )
-*
-*
-*     Set Eigenvalues IHI+1:N
-*
-      DO 10 J = IHI + 1, N
-         ABSB = ABS( T( J, J ) )
-         IF( ABSB.GT.SAFMIN ) THEN
-            SIGNBC = CONJG( T( J, J ) / ABSB )
-            T( J, J ) = ABSB
-            IF( ILSCHR ) THEN
-               CALL CSCAL( J-1, SIGNBC, T( 1, J ), 1 )
-               CALL CSCAL( J, SIGNBC, H( 1, J ), 1 )
-            ELSE
-               H( J, J ) = H( J, J )*SIGNBC
-            END IF
-            IF( ILZ )
-     $         CALL CSCAL( N, SIGNBC, Z( 1, J ), 1 )
-         ELSE
-            T( J, J ) = CZERO
-         END IF
-         ALPHA( J ) = H( J, J )
-         BETA( J ) = T( J, J )
-   10 CONTINUE
-*
-*     If IHI < ILO, skip QZ steps
-*
-      IF( IHI.LT.ILO )
-     $   GO TO 190
-*
-*     MAIN QZ ITERATION LOOP
-*
-*     Initialize dynamic indices
-*
-*     Eigenvalues ILAST+1:N have been found.
-*        Column operations modify rows IFRSTM:whatever
-*        Row operations modify columns whatever:ILASTM
-*
-*     If only eigenvalues are being computed, then
-*        IFRSTM is the row of the last splitting row above row ILAST;
-*        this is always at least ILO.
-*     IITER counts iterations since the last eigenvalue was found,
-*        to tell when to use an extraordinary shift.
-*     MAXIT is the maximum number of QZ sweeps allowed.
-*
-      ILAST = IHI
-      IF( ILSCHR ) THEN
-         IFRSTM = 1
-         ILASTM = N
-      ELSE
-         IFRSTM = ILO
-         ILASTM = IHI
-      END IF
-      IITER = 0
-      ESHIFT = CZERO
-      MAXIT = 30*( IHI-ILO+1 )
-*
-      DO 170 JITER = 1, MAXIT
-*
-*        Check for too many iterations.
-*
-         IF( JITER.GT.MAXIT )
-     $      GO TO 180
-*
-*        Split the matrix if possible.
-*
-*        Two tests:
-*           1: H(j,j-1)=0  or  j=ILO
-*           2: T(j,j)=0
-*
-*        Special case: j=ILAST
-*
-         IF( ILAST.EQ.ILO ) THEN
-            GO TO 60
-         ELSE
-            IF( ABS1( H( ILAST, ILAST-1 ) ).LE.ATOL ) THEN
-               H( ILAST, ILAST-1 ) = CZERO
-               GO TO 60
-            END IF
-         END IF
-*
-         IF( ABS( T( ILAST, ILAST ) ).LE.BTOL ) THEN
-            T( ILAST, ILAST ) = CZERO
-            GO TO 50
-         END IF
-*
-*        General case: j<ILAST
-*
-         DO 40 J = ILAST - 1, ILO, -1
-*
-*           Test 1: for H(j,j-1)=0 or j=ILO
-*
-            IF( J.EQ.ILO ) THEN
-               ILAZRO = .TRUE.
-            ELSE
-               IF( ABS1( H( J, J-1 ) ).LE.ATOL ) THEN
-                  H( J, J-1 ) = CZERO
-                  ILAZRO = .TRUE.
-               ELSE
-                  ILAZRO = .FALSE.
-               END IF
-            END IF
-*
-*           Test 2: for T(j,j)=0
-*
-            IF( ABS( T( J, J ) ).LT.BTOL ) THEN
-               T( J, J ) = CZERO
-*
-*              Test 1a: Check for 2 consecutive small subdiagonals in A
-*
-               ILAZR2 = .FALSE.
-               IF( .NOT.ILAZRO ) THEN
-                  IF( ABS1( H( J, J-1 ) )*( ASCALE*ABS1( H( J+1,
-     $                J ) ) ).LE.ABS1( H( J, J ) )*( ASCALE*ATOL ) )
-     $                ILAZR2 = .TRUE.
-               END IF
-*
-*              If both tests pass (1 & 2), i.e., the leading diagonal
-*              element of B in the block is zero, split a 1x1 block off
-*              at the top. (I.e., at the J-th row/column) The leading
-*              diagonal element of the remainder can also be zero, so
-*              this may have to be done repeatedly.
-*
-               IF( ILAZRO .OR. ILAZR2 ) THEN
-                  DO 20 JCH = J, ILAST - 1
-                     CTEMP = H( JCH, JCH )
-                     CALL CLARTG( CTEMP, H( JCH+1, JCH ), C, S,
-     $                            H( JCH, JCH ) )
-                     H( JCH+1, JCH ) = CZERO
-                     CALL CROT( ILASTM-JCH, H( JCH, JCH+1 ), LDH,
-     $                          H( JCH+1, JCH+1 ), LDH, C, S )
-                     CALL CROT( ILASTM-JCH, T( JCH, JCH+1 ), LDT,
-     $                          T( JCH+1, JCH+1 ), LDT, C, S )
-                     IF( ILQ )
-     $                  CALL CROT( N, Q( 1, JCH ), 1, Q( 1, JCH+1 ), 1,
-     $                             C, CONJG( S ) )
-                     IF( ILAZR2 )
-     $                  H( JCH, JCH-1 ) = H( JCH, JCH-1 )*C
-                     ILAZR2 = .FALSE.
-                     IF( ABS1( T( JCH+1, JCH+1 ) ).GE.BTOL ) THEN
-                        IF( JCH+1.GE.ILAST ) THEN
-                           GO TO 60
-                        ELSE
-                           IFIRST = JCH + 1
-                           GO TO 70
-                        END IF
-                     END IF
-                     T( JCH+1, JCH+1 ) = CZERO
-   20             CONTINUE
-                  GO TO 50
-               ELSE
-*
-*                 Only test 2 passed -- chase the zero to T(ILAST,ILAST)
-*                 Then process as in the case T(ILAST,ILAST)=0
-*
-                  DO 30 JCH = J, ILAST - 1
-                     CTEMP = T( JCH, JCH+1 )
-                     CALL CLARTG( CTEMP, T( JCH+1, JCH+1 ), C, S,
-     $                            T( JCH, JCH+1 ) )
-                     T( JCH+1, JCH+1 ) = CZERO
-                     IF( JCH.LT.ILASTM-1 )
-     $                  CALL CROT( ILASTM-JCH-1, T( JCH, JCH+2 ), LDT,
-     $                             T( JCH+1, JCH+2 ), LDT, C, S )
-                     CALL CROT( ILASTM-JCH+2, H( JCH, JCH-1 ), LDH,
-     $                          H( JCH+1, JCH-1 ), LDH, C, S )
-                     IF( ILQ )
-     $                  CALL CROT( N, Q( 1, JCH ), 1, Q( 1, JCH+1 ), 1,
-     $                             C, CONJG( S ) )
-                     CTEMP = H( JCH+1, JCH )
-                     CALL CLARTG( CTEMP, H( JCH+1, JCH-1 ), C, S,
-     $                            H( JCH+1, JCH ) )
-                     H( JCH+1, JCH-1 ) = CZERO
-                     CALL CROT( JCH+1-IFRSTM, H( IFRSTM, JCH ), 1,
-     $                          H( IFRSTM, JCH-1 ), 1, C, S )
-                     CALL CROT( JCH-IFRSTM, T( IFRSTM, JCH ), 1,
-     $                          T( IFRSTM, JCH-1 ), 1, C, S )
-                     IF( ILZ )
-     $                  CALL CROT( N, Z( 1, JCH ), 1, Z( 1, JCH-1 ), 1,
-     $                             C, S )
-   30             CONTINUE
-                  GO TO 50
-               END IF
-            ELSE IF( ILAZRO ) THEN
-*
-*              Only test 1 passed -- work on J:ILAST
-*
-               IFIRST = J
-               GO TO 70
-            END IF
-*
-*           Neither test passed -- try next J
-*
-   40    CONTINUE
-*
-*        (Drop-through is "impossible")
-*
-         INFO = 2*N + 1
-         GO TO 210
-*
-*        T(ILAST,ILAST)=0 -- clear H(ILAST,ILAST-1) to split off a
-*        1x1 block.
-*
-   50    CONTINUE
-         CTEMP = H( ILAST, ILAST )
-         CALL CLARTG( CTEMP, H( ILAST, ILAST-1 ), C, S,
-     $                H( ILAST, ILAST ) )
-         H( ILAST, ILAST-1 ) = CZERO
-         CALL CROT( ILAST-IFRSTM, H( IFRSTM, ILAST ), 1,
-     $              H( IFRSTM, ILAST-1 ), 1, C, S )
-         CALL CROT( ILAST-IFRSTM, T( IFRSTM, ILAST ), 1,
-     $              T( IFRSTM, ILAST-1 ), 1, C, S )
-         IF( ILZ )
-     $      CALL CROT( N, Z( 1, ILAST ), 1, Z( 1, ILAST-1 ), 1, C, S )
-*
-*        H(ILAST,ILAST-1)=0 -- Standardize B, set ALPHA and BETA
-*
-   60    CONTINUE
-         ABSB = ABS( T( ILAST, ILAST ) )
-         IF( ABSB.GT.SAFMIN ) THEN
-            SIGNBC = CONJG( T( ILAST, ILAST ) / ABSB )
-            T( ILAST, ILAST ) = ABSB
-            IF( ILSCHR ) THEN
-               CALL CSCAL( ILAST-IFRSTM, SIGNBC, T( IFRSTM, ILAST ), 1 )
-               CALL CSCAL( ILAST+1-IFRSTM, SIGNBC, H( IFRSTM, ILAST ),
-     $                     1 )
-            ELSE
-               H( ILAST, ILAST ) = H( ILAST, ILAST )*SIGNBC
-            END IF
-            IF( ILZ )
-     $         CALL CSCAL( N, SIGNBC, Z( 1, ILAST ), 1 )
-         ELSE
-            T( ILAST, ILAST ) = CZERO
-         END IF
-         ALPHA( ILAST ) = H( ILAST, ILAST )
-         BETA( ILAST ) = T( ILAST, ILAST )
-*
-*        Go to next block -- exit if finished.
-*
-         ILAST = ILAST - 1
-         IF( ILAST.LT.ILO )
-     $      GO TO 190
-*
-*        Reset counters
-*
-         IITER = 0
-         ESHIFT = CZERO
-         IF( .NOT.ILSCHR ) THEN
-            ILASTM = ILAST
-            IF( IFRSTM.GT.ILAST )
-     $         IFRSTM = ILO
-         END IF
-         GO TO 160
-*
-*        QZ step
-*
-*        This iteration only involves rows/columns IFIRST:ILAST.  We
-*        assume IFIRST < ILAST, and that the diagonal of B is non-zero.
-*
-   70    CONTINUE
-         IITER = IITER + 1
-         IF( .NOT.ILSCHR ) THEN
-            IFRSTM = IFIRST
-         END IF
-*
-*        Compute the Shift.
-*
-*        At this point, IFIRST < ILAST, and the diagonal elements of
-*        T(IFIRST:ILAST,IFIRST,ILAST) are larger than BTOL (in
-*        magnitude)
-*
-         IF( ( IITER / 10 )*10.NE.IITER ) THEN
-*
-*           The Wilkinson shift (AEP p.512), i.e., the eigenvalue of
-*           the bottom-right 2x2 block of A inv(B) which is nearest to
-*           the bottom-right element.
-*
-*           We factor B as U*D, where U has unit diagonals, and
-*           compute (A*inv(D))*inv(U).
-*
-            U12 = ( BSCALE*T( ILAST-1, ILAST ) ) /
-     $            ( BSCALE*T( ILAST, ILAST ) )
-            AD11 = ( ASCALE*H( ILAST-1, ILAST-1 ) ) /
-     $             ( BSCALE*T( ILAST-1, ILAST-1 ) )
-            AD21 = ( ASCALE*H( ILAST, ILAST-1 ) ) /
-     $             ( BSCALE*T( ILAST-1, ILAST-1 ) )
-            AD12 = ( ASCALE*H( ILAST-1, ILAST ) ) /
-     $             ( BSCALE*T( ILAST, ILAST ) )
-            AD22 = ( ASCALE*H( ILAST, ILAST ) ) /
-     $             ( BSCALE*T( ILAST, ILAST ) )
-            ABI22 = AD22 - U12*AD21
-*
-            T1 = HALF*( AD11+ABI22 )
-            RTDISC = SQRT( T1**2+AD12*AD21-AD11*AD22 )
-            TEMP = REAL( T1-ABI22 )*REAL( RTDISC ) +
-     $             AIMAG( T1-ABI22 )*AIMAG( RTDISC )
-            IF( TEMP.LE.ZERO ) THEN
-               SHIFT = T1 + RTDISC
-            ELSE
-               SHIFT = T1 - RTDISC
-            END IF
-         ELSE
-*
-*           Exceptional shift.  Chosen for no particularly good reason.
-*
-            ESHIFT = ESHIFT + CONJG( ( ASCALE*H( ILAST-1, ILAST ) ) /
-     $               ( BSCALE*T( ILAST-1, ILAST-1 ) ) )
-            SHIFT = ESHIFT
-         END IF
-*
-*        Now check for two consecutive small subdiagonals.
-*
-         DO 80 J = ILAST - 1, IFIRST + 1, -1
-            ISTART = J
-            CTEMP = ASCALE*H( J, J ) - SHIFT*( BSCALE*T( J, J ) )
-            TEMP = ABS1( CTEMP )
-            TEMP2 = ASCALE*ABS1( H( J+1, J ) )
-            TEMPR = MAX( TEMP, TEMP2 )
-            IF( TEMPR.LT.ONE .AND. TEMPR.NE.ZERO ) THEN
-               TEMP = TEMP / TEMPR
-               TEMP2 = TEMP2 / TEMPR
-            END IF
-            IF( ABS1( H( J, J-1 ) )*TEMP2.LE.TEMP*ATOL )
-     $         GO TO 90
-   80    CONTINUE
-*
-         ISTART = IFIRST
-         CTEMP = ASCALE*H( IFIRST, IFIRST ) -
-     $           SHIFT*( BSCALE*T( IFIRST, IFIRST ) )
-   90    CONTINUE
-*
-*        Do an implicit-shift QZ sweep.
-*
-*        Initial Q
-*
-         CTEMP2 = ASCALE*H( ISTART+1, ISTART )
-         CALL CLARTG( CTEMP, CTEMP2, C, S, CTEMP3 )
-*
-*        Sweep
-*
-         DO 150 J = ISTART, ILAST - 1
-            IF( J.GT.ISTART ) THEN
-               CTEMP = H( J, J-1 )
-               CALL CLARTG( CTEMP, H( J+1, J-1 ), C, S, H( J, J-1 ) )
-               H( J+1, J-1 ) = CZERO
-            END IF
-*
-            DO 100 JC = J, ILASTM
-               CTEMP = C*H( J, JC ) + S*H( J+1, JC )
-               H( J+1, JC ) = -CONJG( S )*H( J, JC ) + C*H( J+1, JC )
-               H( J, JC ) = CTEMP
-               CTEMP2 = C*T( J, JC ) + S*T( J+1, JC )
-               T( J+1, JC ) = -CONJG( S )*T( J, JC ) + C*T( J+1, JC )
-               T( J, JC ) = CTEMP2
-  100       CONTINUE
-            IF( ILQ ) THEN
-               DO 110 JR = 1, N
-                  CTEMP = C*Q( JR, J ) + CONJG( S )*Q( JR, J+1 )
-                  Q( JR, J+1 ) = -S*Q( JR, J ) + C*Q( JR, J+1 )
-                  Q( JR, J ) = CTEMP
-  110          CONTINUE
-            END IF
-*
-            CTEMP = T( J+1, J+1 )
-            CALL CLARTG( CTEMP, T( J+1, J ), C, S, T( J+1, J+1 ) )
-            T( J+1, J ) = CZERO
-*
-            DO 120 JR = IFRSTM, MIN( J+2, ILAST )
-               CTEMP = C*H( JR, J+1 ) + S*H( JR, J )
-               H( JR, J ) = -CONJG( S )*H( JR, J+1 ) + C*H( JR, J )
-               H( JR, J+1 ) = CTEMP
-  120       CONTINUE
-            DO 130 JR = IFRSTM, J
-               CTEMP = C*T( JR, J+1 ) + S*T( JR, J )
-               T( JR, J ) = -CONJG( S )*T( JR, J+1 ) + C*T( JR, J )
-               T( JR, J+1 ) = CTEMP
-  130       CONTINUE
-            IF( ILZ ) THEN
-               DO 140 JR = 1, N
-                  CTEMP = C*Z( JR, J+1 ) + S*Z( JR, J )
-                  Z( JR, J ) = -CONJG( S )*Z( JR, J+1 ) + C*Z( JR, J )
-                  Z( JR, J+1 ) = CTEMP
-  140          CONTINUE
-            END IF
-  150    CONTINUE
-*
-  160    CONTINUE
-*
-  170 CONTINUE
-*
-*     Drop-through = non-convergence
-*
-  180 CONTINUE
-      INFO = ILAST
-      GO TO 210
-*
-*     Successful completion of all QZ steps
-*
-  190 CONTINUE
-*
-*     Set Eigenvalues 1:ILO-1
-*
-      DO 200 J = 1, ILO - 1
-         ABSB = ABS( T( J, J ) )
-         IF( ABSB.GT.SAFMIN ) THEN
-            SIGNBC = CONJG( T( J, J ) / ABSB )
-            T( J, J ) = ABSB
-            IF( ILSCHR ) THEN
-               CALL CSCAL( J-1, SIGNBC, T( 1, J ), 1 )
-               CALL CSCAL( J, SIGNBC, H( 1, J ), 1 )
-            ELSE
-               H( J, J ) = H( J, J )*SIGNBC
-            END IF
-            IF( ILZ )
-     $         CALL CSCAL( N, SIGNBC, Z( 1, J ), 1 )
-         ELSE
-            T( J, J ) = CZERO
-         END IF
-         ALPHA( J ) = H( J, J )
-         BETA( J ) = T( J, J )
-  200 CONTINUE
-*
-*     Normal Termination
-*
-      INFO = 0
-*
-*     Exit (other than argument error) -- return optimal workspace size
-*
-  210 CONTINUE
-      WORK( 1 ) = CMPLX( N )
-      RETURN
-*
-*     End of CHGEQZ
-*
-      END
--- a/libcruft/lapack/chseqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,395 +0,0 @@
-      SUBROUTINE CHSEQR( JOB, COMPZ, N, ILO, IHI, H, LDH, W, Z, LDZ,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, ILO, INFO, LDH, LDZ, LWORK, N
-      CHARACTER          COMPZ, JOB
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            H( LDH, * ), W( * ), WORK( * ), Z( LDZ, * )
-*     ..
-*     Purpose
-*     =======
-*
-*     CHSEQR computes the eigenvalues of a Hessenberg matrix H
-*     and, optionally, the matrices T and Z from the Schur decomposition
-*     H = Z T Z**H, where T is an upper triangular matrix (the
-*     Schur form), and Z is the unitary matrix of Schur vectors.
-*
-*     Optionally Z may be postmultiplied into an input unitary
-*     matrix Q so that this routine can give the Schur factorization
-*     of a matrix A which has been reduced to the Hessenberg form H
-*     by the unitary matrix Q:  A = Q*H*Q**H = (QZ)*H*(QZ)**H.
-*
-*     Arguments
-*     =========
-*
-*     JOB   (input) CHARACTER*1
-*           = 'E':  compute eigenvalues only;
-*           = 'S':  compute eigenvalues and the Schur form T.
-*
-*     COMPZ (input) CHARACTER*1
-*           = 'N':  no Schur vectors are computed;
-*           = 'I':  Z is initialized to the unit matrix and the matrix Z
-*                   of Schur vectors of H is returned;
-*           = 'V':  Z must contain an unitary matrix Q on entry, and
-*                   the product Q*Z is returned.
-*
-*     N     (input) INTEGER
-*           The order of the matrix H.  N .GE. 0.
-*
-*     ILO   (input) INTEGER
-*     IHI   (input) INTEGER
-*           It is assumed that H is already upper triangular in rows
-*           and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally
-*           set by a previous call to CGEBAL, and then passed to CGEHRD
-*           when the matrix output by CGEBAL is reduced to Hessenberg
-*           form. Otherwise ILO and IHI should be set to 1 and N
-*           respectively.  If N.GT.0, then 1.LE.ILO.LE.IHI.LE.N.
-*           If N = 0, then ILO = 1 and IHI = 0.
-*
-*     H     (input/output) COMPLEX array, dimension (LDH,N)
-*           On entry, the upper Hessenberg matrix H.
-*           On exit, if INFO = 0 and JOB = 'S', H contains the upper
-*           triangular matrix T from the Schur decomposition (the
-*           Schur form). If INFO = 0 and JOB = 'E', the contents of
-*           H are unspecified on exit.  (The output value of H when
-*           INFO.GT.0 is given under the description of INFO below.)
-*
-*           Unlike earlier versions of CHSEQR, this subroutine may
-*           explicitly H(i,j) = 0 for i.GT.j and j = 1, 2, ... ILO-1
-*           or j = IHI+1, IHI+2, ... N.
-*
-*     LDH   (input) INTEGER
-*           The leading dimension of the array H. LDH .GE. max(1,N).
-*
-*     W        (output) COMPLEX array, dimension (N)
-*           The computed eigenvalues. If JOB = 'S', the eigenvalues are
-*           stored in the same order as on the diagonal of the Schur
-*           form returned in H, with W(i) = H(i,i).
-*
-*     Z     (input/output) COMPLEX array, dimension (LDZ,N)
-*           If COMPZ = 'N', Z is not referenced.
-*           If COMPZ = 'I', on entry Z need not be set and on exit,
-*           if INFO = 0, Z contains the unitary matrix Z of the Schur
-*           vectors of H.  If COMPZ = 'V', on entry Z must contain an
-*           N-by-N matrix Q, which is assumed to be equal to the unit
-*           matrix except for the submatrix Z(ILO:IHI,ILO:IHI). On exit,
-*           if INFO = 0, Z contains Q*Z.
-*           Normally Q is the unitary matrix generated by CUNGHR
-*           after the call to CGEHRD which formed the Hessenberg matrix
-*           H. (The output value of Z when INFO.GT.0 is given under
-*           the description of INFO below.)
-*
-*     LDZ   (input) INTEGER
-*           The leading dimension of the array Z.  if COMPZ = 'I' or
-*           COMPZ = 'V', then LDZ.GE.MAX(1,N).  Otherwize, LDZ.GE.1.
-*
-*     WORK  (workspace/output) COMPLEX array, dimension (LWORK)
-*           On exit, if INFO = 0, WORK(1) returns an estimate of
-*           the optimal value for LWORK.
-*
-*     LWORK (input) INTEGER
-*           The dimension of the array WORK.  LWORK .GE. max(1,N)
-*           is sufficient, but LWORK typically as large as 6*N may
-*           be required for optimal performance.  A workspace query
-*           to determine the optimal workspace size is recommended.
-*
-*           If LWORK = -1, then CHSEQR does a workspace query.
-*           In this case, CHSEQR checks the input parameters and
-*           estimates the optimal workspace size for the given
-*           values of N, ILO and IHI.  The estimate is returned
-*           in WORK(1).  No error message related to LWORK is
-*           issued by XERBLA.  Neither H nor Z are accessed.
-*
-*
-*     INFO  (output) INTEGER
-*             =  0:  successful exit
-*           .LT. 0:  if INFO = -i, the i-th argument had an illegal
-*                    value
-*           .GT. 0:  if INFO = i, CHSEQR failed to compute all of
-*                the eigenvalues.  Elements 1:ilo-1 and i+1:n of WR
-*                and WI contain those eigenvalues which have been
-*                successfully computed.  (Failures are rare.)
-*
-*                If INFO .GT. 0 and JOB = 'E', then on exit, the
-*                remaining unconverged eigenvalues are the eigen-
-*                values of the upper Hessenberg matrix rows and
-*                columns ILO through INFO of the final, output
-*                value of H.
-*
-*                If INFO .GT. 0 and JOB   = 'S', then on exit
-*
-*           (*)  (initial value of H)*U  = U*(final value of H)
-*
-*                where U is a unitary matrix.  The final
-*                value of  H is upper Hessenberg and triangular in
-*                rows and columns INFO+1 through IHI.
-*
-*                If INFO .GT. 0 and COMPZ = 'V', then on exit
-*
-*                  (final value of Z)  =  (initial value of Z)*U
-*
-*                where U is the unitary matrix in (*) (regard-
-*                less of the value of JOB.)
-*
-*                If INFO .GT. 0 and COMPZ = 'I', then on exit
-*                      (final value of Z)  = U
-*                where U is the unitary matrix in (*) (regard-
-*                less of the value of JOB.)
-*
-*                If INFO .GT. 0 and COMPZ = 'N', then Z is not
-*                accessed.
-*
-*     ================================================================
-*             Default values supplied by
-*             ILAENV(ISPEC,'CHSEQR',JOB(:1)//COMPZ(:1),N,ILO,IHI,LWORK).
-*             It is suggested that these defaults be adjusted in order
-*             to attain best performance in each particular
-*             computational environment.
-*
-*            ISPEC=1:  The CLAHQR vs CLAQR0 crossover point.
-*                      Default: 75. (Must be at least 11.)
-*
-*            ISPEC=2:  Recommended deflation window size.
-*                      This depends on ILO, IHI and NS.  NS is the
-*                      number of simultaneous shifts returned
-*                      by ILAENV(ISPEC=4).  (See ISPEC=4 below.)
-*                      The default for (IHI-ILO+1).LE.500 is NS.
-*                      The default for (IHI-ILO+1).GT.500 is 3*NS/2.
-*
-*            ISPEC=3:  Nibble crossover point. (See ILAENV for
-*                      details.)  Default: 14% of deflation window
-*                      size.
-*
-*            ISPEC=4:  Number of simultaneous shifts, NS, in
-*                      a multi-shift QR iteration.
-*
-*                      If IHI-ILO+1 is ...
-*
-*                      greater than      ...but less    ... the
-*                      or equal to ...      than        default is
-*
-*                           1               30          NS -   2(+)
-*                          30               60          NS -   4(+)
-*                          60              150          NS =  10(+)
-*                         150              590          NS =  **
-*                         590             3000          NS =  64
-*                        3000             6000          NS = 128
-*                        6000             infinity      NS = 256
-*
-*                  (+)  By default some or all matrices of this order 
-*                       are passed to the implicit double shift routine
-*                       CLAHQR and NS is ignored.  See ISPEC=1 above 
-*                       and comments in IPARM for details.
-*
-*                       The asterisks (**) indicate an ad-hoc
-*                       function of N increasing from 10 to 64.
-*
-*            ISPEC=5:  Select structured matrix multiply.
-*                      (See ILAENV for details.) Default: 3.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ================================================================
-*     References:
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
-*       Performance, SIAM Journal of Matrix Analysis, volume 23, pages
-*       929--947, 2002.
-*
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part II: Aggressive Early Deflation, SIAM Journal
-*       of Matrix Analysis, volume 23, pages 948--973, 2002.
-*
-*     ================================================================
-*     .. Parameters ..
-*
-*     ==== Matrices of order NTINY or smaller must be processed by
-*     .    CLAHQR because of insufficient subdiagonal scratch space.
-*     .    (This is a hard limit.) ====
-*
-*     ==== NL allocates some local workspace to help small matrices
-*     .    through a rare CLAHQR failure.  NL .GT. NTINY = 11 is
-*     .    required and NL .LE. NMIN = ILAENV(ISPEC=1,...) is recom-
-*     .    mended.  (The default value of NMIN is 75.)  Using NL = 49
-*     .    allows up to six simultaneous shifts and a 16-by-16
-*     .    deflation window.  ====
-*
-      INTEGER            NTINY
-      PARAMETER          ( NTINY = 11 )
-      INTEGER            NL
-      PARAMETER          ( NL = 49 )
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0e0, 0.0e0 ),
-     $                   ONE = ( 1.0e0, 0.0e0 ) )
-      REAL               RZERO
-      PARAMETER          ( RZERO = 0.0e0 )
-*     ..
-*     .. Local Arrays ..
-      COMPLEX            HL( NL, NL ), WORKL( NL )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            KBOT, NMIN
-      LOGICAL            INITZ, LQUERY, WANTT, WANTZ
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      LOGICAL            LSAME
-      EXTERNAL           ILAENV, LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CCOPY, CLACPY, CLAHQR, CLAQR0, CLASET, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CMPLX, MAX, MIN, REAL
-*     ..
-*     .. Executable Statements ..
-*
-*     ==== Decode and check the input parameters. ====
-*
-      WANTT = LSAME( JOB, 'S' )
-      INITZ = LSAME( COMPZ, 'I' )
-      WANTZ = INITZ .OR. LSAME( COMPZ, 'V' )
-      WORK( 1 ) = CMPLX( REAL( MAX( 1, N ) ), RZERO )
-      LQUERY = LWORK.EQ.-1
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'E' ) .AND. .NOT.WANTT ) THEN
-         INFO = -1
-      ELSE IF( .NOT.LSAME( COMPZ, 'N' ) .AND. .NOT.WANTZ ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -5
-      ELSE IF( LDH.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDZ.LT.1 .OR. ( WANTZ .AND. LDZ.LT.MAX( 1, N ) ) ) THEN
-         INFO = -10
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -12
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-*
-*        ==== Quick return in case of invalid argument. ====
-*
-         CALL XERBLA( 'CHSEQR', -INFO )
-         RETURN
-*
-      ELSE IF( N.EQ.0 ) THEN
-*
-*        ==== Quick return in case N = 0; nothing to do. ====
-*
-         RETURN
-*
-      ELSE IF( LQUERY ) THEN
-*
-*        ==== Quick return in case of a workspace query ====
-*
-         CALL CLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILO, IHI, Z,
-     $                LDZ, WORK, LWORK, INFO )
-*        ==== Ensure reported workspace size is backward-compatible with
-*        .    previous LAPACK versions. ====
-         WORK( 1 ) = CMPLX( MAX( REAL( WORK( 1 ) ), REAL( MAX( 1,
-     $               N ) ) ), RZERO )
-         RETURN
-*
-      ELSE
-*
-*        ==== copy eigenvalues isolated by CGEBAL ====
-*
-         IF( ILO.GT.1 )
-     $      CALL CCOPY( ILO-1, H, LDH+1, W, 1 )
-         IF( IHI.LT.N )
-     $      CALL CCOPY( N-IHI, H( IHI+1, IHI+1 ), LDH+1, W( IHI+1 ), 1 )
-*
-*        ==== Initialize Z, if requested ====
-*
-         IF( INITZ )
-     $      CALL CLASET( 'A', N, N, ZERO, ONE, Z, LDZ )
-*
-*        ==== Quick return if possible ====
-*
-         IF( ILO.EQ.IHI ) THEN
-            W( ILO ) = H( ILO, ILO )
-            RETURN
-         END IF
-*
-*        ==== CLAHQR/CLAQR0 crossover point ====
-*
-         NMIN = ILAENV( 1, 'CHSEQR', JOB( : 1 ) // COMPZ( : 1 ), N, ILO,
-     $          IHI, LWORK )
-         NMIN = MAX( NTINY, NMIN )
-*
-*        ==== CLAQR0 for big matrices; CLAHQR for small ones ====
-*
-         IF( N.GT.NMIN ) THEN
-            CALL CLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILO, IHI,
-     $                   Z, LDZ, WORK, LWORK, INFO )
-         ELSE
-*
-*           ==== Small matrix ====
-*
-            CALL CLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILO, IHI,
-     $                   Z, LDZ, INFO )
-*
-            IF( INFO.GT.0 ) THEN
-*
-*              ==== A rare CLAHQR failure!  CLAQR0 sometimes succeeds
-*              .    when CLAHQR fails. ====
-*
-               KBOT = INFO
-*
-               IF( N.GE.NL ) THEN
-*
-*                 ==== Larger matrices have enough subdiagonal scratch
-*                 .    space to call CLAQR0 directly. ====
-*
-                  CALL CLAQR0( WANTT, WANTZ, N, ILO, KBOT, H, LDH, W,
-     $                         ILO, IHI, Z, LDZ, WORK, LWORK, INFO )
-*
-               ELSE
-*
-*                 ==== Tiny matrices don't have enough subdiagonal
-*                 .    scratch space to benefit from CLAQR0.  Hence,
-*                 .    tiny matrices must be copied into a larger
-*                 .    array before calling CLAQR0. ====
-*
-                  CALL CLACPY( 'A', N, N, H, LDH, HL, NL )
-                  HL( N+1, N ) = ZERO
-                  CALL CLASET( 'A', NL, NL-N, ZERO, ZERO, HL( 1, N+1 ),
-     $                         NL )
-                  CALL CLAQR0( WANTT, WANTZ, NL, ILO, KBOT, HL, NL, W,
-     $                         ILO, IHI, Z, LDZ, WORKL, NL, INFO )
-                  IF( WANTT .OR. INFO.NE.0 )
-     $               CALL CLACPY( 'A', N, N, HL, NL, H, LDH )
-               END IF
-            END IF
-         END IF
-*
-*        ==== Clear out the trash, if necessary. ====
-*
-         IF( ( WANTT .OR. INFO.NE.0 ) .AND. N.GT.2 )
-     $      CALL CLASET( 'L', N-2, N-2, ZERO, ZERO, H( 3, 1 ), LDH )
-*
-*        ==== Ensure reported workspace size is backward-compatible with
-*        .    previous LAPACK versions. ====
-*
-         WORK( 1 ) = CMPLX( MAX( REAL( MAX( 1, N ) ),
-     $               REAL( WORK( 1 ) ) ), RZERO )
-      END IF
-*
-*     ==== End of CHSEQR ====
-*
-      END
--- a/libcruft/lapack/clabrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,328 +0,0 @@
-      SUBROUTINE CLABRD( M, N, NB, A, LDA, D, E, TAUQ, TAUP, X, LDX, Y,
-     $                   LDY )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            LDA, LDX, LDY, M, N, NB
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * ), E( * )
-      COMPLEX            A( LDA, * ), TAUP( * ), TAUQ( * ), X( LDX, * ),
-     $                   Y( LDY, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLABRD reduces the first NB rows and columns of a complex general
-*  m by n matrix A to upper or lower real bidiagonal form by a unitary
-*  transformation Q' * A * P, and returns the matrices X and Y which
-*  are needed to apply the transformation to the unreduced part of A.
-*
-*  If m >= n, A is reduced to upper bidiagonal form; if m < n, to lower
-*  bidiagonal form.
-*
-*  This is an auxiliary routine called by CGEBRD
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows in the matrix A.
-*
-*  N       (input) INTEGER
-*          The number of columns in the matrix A.
-*
-*  NB      (input) INTEGER
-*          The number of leading rows and columns of A to be reduced.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the m by n general matrix to be reduced.
-*          On exit, the first NB rows and columns of the matrix are
-*          overwritten; the rest of the array is unchanged.
-*          If m >= n, elements on and below the diagonal in the first NB
-*            columns, with the array TAUQ, represent the unitary
-*            matrix Q as a product of elementary reflectors; and
-*            elements above the diagonal in the first NB rows, with the
-*            array TAUP, represent the unitary matrix P as a product
-*            of elementary reflectors.
-*          If m < n, elements below the diagonal in the first NB
-*            columns, with the array TAUQ, represent the unitary
-*            matrix Q as a product of elementary reflectors, and
-*            elements on and above the diagonal in the first NB rows,
-*            with the array TAUP, represent the unitary matrix P as
-*            a product of elementary reflectors.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  D       (output) REAL array, dimension (NB)
-*          The diagonal elements of the first NB rows and columns of
-*          the reduced matrix.  D(i) = A(i,i).
-*
-*  E       (output) REAL array, dimension (NB)
-*          The off-diagonal elements of the first NB rows and columns of
-*          the reduced matrix.
-*
-*  TAUQ    (output) COMPLEX array dimension (NB)
-*          The scalar factors of the elementary reflectors which
-*          represent the unitary matrix Q. See Further Details.
-*
-*  TAUP    (output) COMPLEX array, dimension (NB)
-*          The scalar factors of the elementary reflectors which
-*          represent the unitary matrix P. See Further Details.
-*
-*  X       (output) COMPLEX array, dimension (LDX,NB)
-*          The m-by-nb matrix X required to update the unreduced part
-*          of A.
-*
-*  LDX     (input) INTEGER
-*          The leading dimension of the array X. LDX >= max(1,M).
-*
-*  Y       (output) COMPLEX array, dimension (LDY,NB)
-*          The n-by-nb matrix Y required to update the unreduced part
-*          of A.
-*
-*  LDY     (input) INTEGER
-*          The leading dimension of the array Y. LDY >= max(1,N).
-*
-*  Further Details
-*  ===============
-*
-*  The matrices Q and P are represented as products of elementary
-*  reflectors:
-*
-*     Q = H(1) H(2) . . . H(nb)  and  P = G(1) G(2) . . . G(nb)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are complex scalars, and v and u are complex
-*  vectors.
-*
-*  If m >= n, v(1:i-1) = 0, v(i) = 1, and v(i:m) is stored on exit in
-*  A(i:m,i); u(1:i) = 0, u(i+1) = 1, and u(i+1:n) is stored on exit in
-*  A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  If m < n, v(1:i) = 0, v(i+1) = 1, and v(i+1:m) is stored on exit in
-*  A(i+2:m,i); u(1:i-1) = 0, u(i) = 1, and u(i:n) is stored on exit in
-*  A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  The elements of the vectors v and u together form the m-by-nb matrix
-*  V and the nb-by-n matrix U' which are needed, with X and Y, to apply
-*  the transformation to the unreduced part of the matrix, using a block
-*  update of the form:  A := A - V*Y' - X*U'.
-*
-*  The contents of A on exit are illustrated by the following examples
-*  with nb = 2:
-*
-*  m = 6 and n = 5 (m > n):          m = 5 and n = 6 (m < n):
-*
-*    (  1   1   u1  u1  u1 )           (  1   u1  u1  u1  u1  u1 )
-*    (  v1  1   1   u2  u2 )           (  1   1   u2  u2  u2  u2 )
-*    (  v1  v2  a   a   a  )           (  v1  1   a   a   a   a  )
-*    (  v1  v2  a   a   a  )           (  v1  v2  a   a   a   a  )
-*    (  v1  v2  a   a   a  )           (  v1  v2  a   a   a   a  )
-*    (  v1  v2  a   a   a  )
-*
-*  where a denotes an element of the original matrix which is unchanged,
-*  vi denotes an element of the vector defining H(i), and ui an element
-*  of the vector defining G(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ),
-     $                   ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      COMPLEX            ALPHA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEMV, CLACGV, CLARFG, CSCAL
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 .OR. N.LE.0 )
-     $   RETURN
-*
-      IF( M.GE.N ) THEN
-*
-*        Reduce to upper bidiagonal form
-*
-         DO 10 I = 1, NB
-*
-*           Update A(i:m,i)
-*
-            CALL CLACGV( I-1, Y( I, 1 ), LDY )
-            CALL CGEMV( 'No transpose', M-I+1, I-1, -ONE, A( I, 1 ),
-     $                  LDA, Y( I, 1 ), LDY, ONE, A( I, I ), 1 )
-            CALL CLACGV( I-1, Y( I, 1 ), LDY )
-            CALL CGEMV( 'No transpose', M-I+1, I-1, -ONE, X( I, 1 ),
-     $                  LDX, A( 1, I ), 1, ONE, A( I, I ), 1 )
-*
-*           Generate reflection Q(i) to annihilate A(i+1:m,i)
-*
-            ALPHA = A( I, I )
-            CALL CLARFG( M-I+1, ALPHA, A( MIN( I+1, M ), I ), 1,
-     $                   TAUQ( I ) )
-            D( I ) = ALPHA
-            IF( I.LT.N ) THEN
-               A( I, I ) = ONE
-*
-*              Compute Y(i+1:n,i)
-*
-               CALL CGEMV( 'Conjugate transpose', M-I+1, N-I, ONE,
-     $                     A( I, I+1 ), LDA, A( I, I ), 1, ZERO,
-     $                     Y( I+1, I ), 1 )
-               CALL CGEMV( 'Conjugate transpose', M-I+1, I-1, ONE,
-     $                     A( I, 1 ), LDA, A( I, I ), 1, ZERO,
-     $                     Y( 1, I ), 1 )
-               CALL CGEMV( 'No transpose', N-I, I-1, -ONE, Y( I+1, 1 ),
-     $                     LDY, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
-               CALL CGEMV( 'Conjugate transpose', M-I+1, I-1, ONE,
-     $                     X( I, 1 ), LDX, A( I, I ), 1, ZERO,
-     $                     Y( 1, I ), 1 )
-               CALL CGEMV( 'Conjugate transpose', I-1, N-I, -ONE,
-     $                     A( 1, I+1 ), LDA, Y( 1, I ), 1, ONE,
-     $                     Y( I+1, I ), 1 )
-               CALL CSCAL( N-I, TAUQ( I ), Y( I+1, I ), 1 )
-*
-*              Update A(i,i+1:n)
-*
-               CALL CLACGV( N-I, A( I, I+1 ), LDA )
-               CALL CLACGV( I, A( I, 1 ), LDA )
-               CALL CGEMV( 'No transpose', N-I, I, -ONE, Y( I+1, 1 ),
-     $                     LDY, A( I, 1 ), LDA, ONE, A( I, I+1 ), LDA )
-               CALL CLACGV( I, A( I, 1 ), LDA )
-               CALL CLACGV( I-1, X( I, 1 ), LDX )
-               CALL CGEMV( 'Conjugate transpose', I-1, N-I, -ONE,
-     $                     A( 1, I+1 ), LDA, X( I, 1 ), LDX, ONE,
-     $                     A( I, I+1 ), LDA )
-               CALL CLACGV( I-1, X( I, 1 ), LDX )
-*
-*              Generate reflection P(i) to annihilate A(i,i+2:n)
-*
-               ALPHA = A( I, I+1 )
-               CALL CLARFG( N-I, ALPHA, A( I, MIN( I+2, N ) ),
-     $                      LDA, TAUP( I ) )
-               E( I ) = ALPHA
-               A( I, I+1 ) = ONE
-*
-*              Compute X(i+1:m,i)
-*
-               CALL CGEMV( 'No transpose', M-I, N-I, ONE, A( I+1, I+1 ),
-     $                     LDA, A( I, I+1 ), LDA, ZERO, X( I+1, I ), 1 )
-               CALL CGEMV( 'Conjugate transpose', N-I, I, ONE,
-     $                     Y( I+1, 1 ), LDY, A( I, I+1 ), LDA, ZERO,
-     $                     X( 1, I ), 1 )
-               CALL CGEMV( 'No transpose', M-I, I, -ONE, A( I+1, 1 ),
-     $                     LDA, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
-               CALL CGEMV( 'No transpose', I-1, N-I, ONE, A( 1, I+1 ),
-     $                     LDA, A( I, I+1 ), LDA, ZERO, X( 1, I ), 1 )
-               CALL CGEMV( 'No transpose', M-I, I-1, -ONE, X( I+1, 1 ),
-     $                     LDX, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
-               CALL CSCAL( M-I, TAUP( I ), X( I+1, I ), 1 )
-               CALL CLACGV( N-I, A( I, I+1 ), LDA )
-            END IF
-   10    CONTINUE
-      ELSE
-*
-*        Reduce to lower bidiagonal form
-*
-         DO 20 I = 1, NB
-*
-*           Update A(i,i:n)
-*
-            CALL CLACGV( N-I+1, A( I, I ), LDA )
-            CALL CLACGV( I-1, A( I, 1 ), LDA )
-            CALL CGEMV( 'No transpose', N-I+1, I-1, -ONE, Y( I, 1 ),
-     $                  LDY, A( I, 1 ), LDA, ONE, A( I, I ), LDA )
-            CALL CLACGV( I-1, A( I, 1 ), LDA )
-            CALL CLACGV( I-1, X( I, 1 ), LDX )
-            CALL CGEMV( 'Conjugate transpose', I-1, N-I+1, -ONE,
-     $                  A( 1, I ), LDA, X( I, 1 ), LDX, ONE, A( I, I ),
-     $                  LDA )
-            CALL CLACGV( I-1, X( I, 1 ), LDX )
-*
-*           Generate reflection P(i) to annihilate A(i,i+1:n)
-*
-            ALPHA = A( I, I )
-            CALL CLARFG( N-I+1, ALPHA, A( I, MIN( I+1, N ) ), LDA,
-     $                   TAUP( I ) )
-            D( I ) = ALPHA
-            IF( I.LT.M ) THEN
-               A( I, I ) = ONE
-*
-*              Compute X(i+1:m,i)
-*
-               CALL CGEMV( 'No transpose', M-I, N-I+1, ONE, A( I+1, I ),
-     $                     LDA, A( I, I ), LDA, ZERO, X( I+1, I ), 1 )
-               CALL CGEMV( 'Conjugate transpose', N-I+1, I-1, ONE,
-     $                     Y( I, 1 ), LDY, A( I, I ), LDA, ZERO,
-     $                     X( 1, I ), 1 )
-               CALL CGEMV( 'No transpose', M-I, I-1, -ONE, A( I+1, 1 ),
-     $                     LDA, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
-               CALL CGEMV( 'No transpose', I-1, N-I+1, ONE, A( 1, I ),
-     $                     LDA, A( I, I ), LDA, ZERO, X( 1, I ), 1 )
-               CALL CGEMV( 'No transpose', M-I, I-1, -ONE, X( I+1, 1 ),
-     $                     LDX, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
-               CALL CSCAL( M-I, TAUP( I ), X( I+1, I ), 1 )
-               CALL CLACGV( N-I+1, A( I, I ), LDA )
-*
-*              Update A(i+1:m,i)
-*
-               CALL CLACGV( I-1, Y( I, 1 ), LDY )
-               CALL CGEMV( 'No transpose', M-I, I-1, -ONE, A( I+1, 1 ),
-     $                     LDA, Y( I, 1 ), LDY, ONE, A( I+1, I ), 1 )
-               CALL CLACGV( I-1, Y( I, 1 ), LDY )
-               CALL CGEMV( 'No transpose', M-I, I, -ONE, X( I+1, 1 ),
-     $                     LDX, A( 1, I ), 1, ONE, A( I+1, I ), 1 )
-*
-*              Generate reflection Q(i) to annihilate A(i+2:m,i)
-*
-               ALPHA = A( I+1, I )
-               CALL CLARFG( M-I, ALPHA, A( MIN( I+2, M ), I ), 1,
-     $                      TAUQ( I ) )
-               E( I ) = ALPHA
-               A( I+1, I ) = ONE
-*
-*              Compute Y(i+1:n,i)
-*
-               CALL CGEMV( 'Conjugate transpose', M-I, N-I, ONE,
-     $                     A( I+1, I+1 ), LDA, A( I+1, I ), 1, ZERO,
-     $                     Y( I+1, I ), 1 )
-               CALL CGEMV( 'Conjugate transpose', M-I, I-1, ONE,
-     $                     A( I+1, 1 ), LDA, A( I+1, I ), 1, ZERO,
-     $                     Y( 1, I ), 1 )
-               CALL CGEMV( 'No transpose', N-I, I-1, -ONE, Y( I+1, 1 ),
-     $                     LDY, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
-               CALL CGEMV( 'Conjugate transpose', M-I, I, ONE,
-     $                     X( I+1, 1 ), LDX, A( I+1, I ), 1, ZERO,
-     $                     Y( 1, I ), 1 )
-               CALL CGEMV( 'Conjugate transpose', I, N-I, -ONE,
-     $                     A( 1, I+1 ), LDA, Y( 1, I ), 1, ONE,
-     $                     Y( I+1, I ), 1 )
-               CALL CSCAL( N-I, TAUQ( I ), Y( I+1, I ), 1 )
-            ELSE
-               CALL CLACGV( N-I+1, A( I, I ), LDA )
-            END IF
-   20    CONTINUE
-      END IF
-      RETURN
-*
-*     End of CLABRD
-*
-      END
--- a/libcruft/lapack/clacgv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-      SUBROUTINE CLACGV( N, X, INCX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLACGV conjugates a complex vector of length N.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The length of the vector X.  N >= 0.
-*
-*  X       (input/output) COMPLEX array, dimension
-*                         (1+(N-1)*abs(INCX))
-*          On entry, the vector of length N to be conjugated.
-*          On exit, X is overwritten with conjg(X).
-*
-*  INCX    (input) INTEGER
-*          The spacing between successive elements of X.
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, IOFF
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CONJG
-*     ..
-*     .. Executable Statements ..
-*
-      IF( INCX.EQ.1 ) THEN
-         DO 10 I = 1, N
-            X( I ) = CONJG( X( I ) )
-   10    CONTINUE
-      ELSE
-         IOFF = 1
-         IF( INCX.LT.0 )
-     $      IOFF = 1 - ( N-1 )*INCX
-         DO 20 I = 1, N
-            X( IOFF ) = CONJG( X( IOFF ) )
-            IOFF = IOFF + INCX
-   20    CONTINUE
-      END IF
-      RETURN
-*
-*     End of CLACGV
-*
-      END
--- a/libcruft/lapack/clacn2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,221 +0,0 @@
-      SUBROUTINE CLACN2( N, V, X, EST, KASE, ISAVE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            KASE, N
-      REAL               EST
-*     ..
-*     .. Array Arguments ..
-      INTEGER            ISAVE( 3 )
-      COMPLEX            V( * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLACN2 estimates the 1-norm of a square, complex matrix A.
-*  Reverse communication is used for evaluating matrix-vector products.
-*
-*  Arguments
-*  =========
-*
-*  N      (input) INTEGER
-*         The order of the matrix.  N >= 1.
-*
-*  V      (workspace) COMPLEX array, dimension (N)
-*         On the final return, V = A*W,  where  EST = norm(V)/norm(W)
-*         (W is not returned).
-*
-*  X      (input/output) COMPLEX array, dimension (N)
-*         On an intermediate return, X should be overwritten by
-*               A * X,   if KASE=1,
-*               A' * X,  if KASE=2,
-*         where A' is the conjugate transpose of A, and CLACN2 must be
-*         re-called with all the other parameters unchanged.
-*
-*  EST    (input/output) REAL
-*         On entry with KASE = 1 or 2 and ISAVE(1) = 3, EST should be
-*         unchanged from the previous call to CLACN2.
-*         On exit, EST is an estimate (a lower bound) for norm(A). 
-*
-*  KASE   (input/output) INTEGER
-*         On the initial call to CLACN2, KASE should be 0.
-*         On an intermediate return, KASE will be 1 or 2, indicating
-*         whether X should be overwritten by A * X  or A' * X.
-*         On the final return from CLACN2, KASE will again be 0.
-*
-*  ISAVE  (input/output) INTEGER array, dimension (3)
-*         ISAVE is used to save variables between calls to SLACN2
-*
-*  Further Details
-*  ======= =======
-*
-*  Contributed by Nick Higham, University of Manchester.
-*  Originally named CONEST, dated March 16, 1988.
-*
-*  Reference: N.J. Higham, "FORTRAN codes for estimating the one-norm of
-*  a real or complex matrix, with applications to condition estimation",
-*  ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988.
-*
-*  Last modified:  April, 1999
-*
-*  This is a thread safe version of CLACON, which uses the array ISAVE
-*  in place of a SAVE statement, as follows:
-*
-*     CLACON     CLACN2
-*      JUMP     ISAVE(1)
-*      J        ISAVE(2)
-*      ITER     ISAVE(3)
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER              ITMAX
-      PARAMETER          ( ITMAX = 5 )
-      REAL                 ONE,         TWO
-      PARAMETER          ( ONE = 1.0E0, TWO = 2.0E0 )
-      COMPLEX              CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0E0, 0.0E0 ),
-     $                            CONE = ( 1.0E0, 0.0E0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, JLAST
-      REAL               ABSXI, ALTSGN, ESTOLD, SAFMIN, TEMP
-*     ..
-*     .. External Functions ..
-      INTEGER            ICMAX1
-      REAL               SCSUM1, SLAMCH
-      EXTERNAL           ICMAX1, SCSUM1, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CCOPY
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, CMPLX, REAL
-*     ..
-*     .. Executable Statements ..
-*
-      SAFMIN = SLAMCH( 'Safe minimum' )
-      IF( KASE.EQ.0 ) THEN
-         DO 10 I = 1, N
-            X( I ) = CMPLX( ONE / REAL( N ) )
-   10    CONTINUE
-         KASE = 1
-         ISAVE( 1 ) = 1
-         RETURN
-      END IF
-*
-      GO TO ( 20, 40, 70, 90, 120 )ISAVE( 1 )
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 1)
-*     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY A*X.
-*
-   20 CONTINUE
-      IF( N.EQ.1 ) THEN
-         V( 1 ) = X( 1 )
-         EST = ABS( V( 1 ) )
-*        ... QUIT
-         GO TO 130
-      END IF
-      EST = SCSUM1( N, X, 1 )
-*
-      DO 30 I = 1, N
-         ABSXI = ABS( X( I ) )
-         IF( ABSXI.GT.SAFMIN ) THEN
-            X( I ) = CMPLX( REAL( X( I ) ) / ABSXI,
-     $               AIMAG( X( I ) ) / ABSXI )
-         ELSE
-            X( I ) = CONE
-         END IF
-   30 CONTINUE
-      KASE = 2
-      ISAVE( 1 ) = 2
-      RETURN
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 2)
-*     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY CTRANS(A)*X.
-*
-   40 CONTINUE
-      ISAVE( 2 ) = ICMAX1( N, X, 1 )
-      ISAVE( 3 ) = 2
-*
-*     MAIN LOOP - ITERATIONS 2,3,...,ITMAX.
-*
-   50 CONTINUE
-      DO 60 I = 1, N
-         X( I ) = CZERO
-   60 CONTINUE
-      X( ISAVE( 2 ) ) = CONE
-      KASE = 1
-      ISAVE( 1 ) = 3
-      RETURN
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 3)
-*     X HAS BEEN OVERWRITTEN BY A*X.
-*
-   70 CONTINUE
-      CALL CCOPY( N, X, 1, V, 1 )
-      ESTOLD = EST
-      EST = SCSUM1( N, V, 1 )
-*
-*     TEST FOR CYCLING.
-      IF( EST.LE.ESTOLD )
-     $   GO TO 100
-*
-      DO 80 I = 1, N
-         ABSXI = ABS( X( I ) )
-         IF( ABSXI.GT.SAFMIN ) THEN
-            X( I ) = CMPLX( REAL( X( I ) ) / ABSXI,
-     $               AIMAG( X( I ) ) / ABSXI )
-         ELSE
-            X( I ) = CONE
-         END IF
-   80 CONTINUE
-      KASE = 2
-      ISAVE( 1 ) = 4
-      RETURN
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 4)
-*     X HAS BEEN OVERWRITTEN BY CTRANS(A)*X.
-*
-   90 CONTINUE
-      JLAST = ISAVE( 2 )
-      ISAVE( 2 ) = ICMAX1( N, X, 1 )
-      IF( ( ABS( X( JLAST ) ).NE.ABS( X( ISAVE( 2 ) ) ) ) .AND.
-     $    ( ISAVE( 3 ).LT.ITMAX ) ) THEN
-         ISAVE( 3 ) = ISAVE( 3 ) + 1
-         GO TO 50
-      END IF
-*
-*     ITERATION COMPLETE.  FINAL STAGE.
-*
-  100 CONTINUE
-      ALTSGN = ONE
-      DO 110 I = 1, N
-         X( I ) = CMPLX( ALTSGN*( ONE + REAL( I-1 ) / REAL( N-1 ) ) )
-         ALTSGN = -ALTSGN
-  110 CONTINUE
-      KASE = 1
-      ISAVE( 1 ) = 5
-      RETURN
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 5)
-*     X HAS BEEN OVERWRITTEN BY A*X.
-*
-  120 CONTINUE
-      TEMP = TWO*( SCSUM1( N, X, 1 ) / REAL( 3*N ) )
-      IF( TEMP.GT.EST ) THEN
-         CALL CCOPY( N, X, 1, V, 1 )
-         EST = TEMP
-      END IF
-*
-  130 CONTINUE
-      KASE = 0
-      RETURN
-*
-*     End of CLACN2
-*
-      END
--- a/libcruft/lapack/clacon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,212 +0,0 @@
-      SUBROUTINE CLACON( N, V, X, EST, KASE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            KASE, N
-      REAL               EST
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            V( N ), X( N )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLACON estimates the 1-norm of a square, complex matrix A.
-*  Reverse communication is used for evaluating matrix-vector products.
-*
-*  Arguments
-*  =========
-*
-*  N      (input) INTEGER
-*         The order of the matrix.  N >= 1.
-*
-*  V      (workspace) COMPLEX array, dimension (N)
-*         On the final return, V = A*W,  where  EST = norm(V)/norm(W)
-*         (W is not returned).
-*
-*  X      (input/output) COMPLEX array, dimension (N)
-*         On an intermediate return, X should be overwritten by
-*               A * X,   if KASE=1,
-*               A' * X,  if KASE=2,
-*         where A' is the conjugate transpose of A, and CLACON must be
-*         re-called with all the other parameters unchanged.
-*
-*  EST    (input/output) REAL
-*         On entry with KASE = 1 or 2 and JUMP = 3, EST should be
-*         unchanged from the previous call to CLACON.
-*         On exit, EST is an estimate (a lower bound) for norm(A). 
-*
-*  KASE   (input/output) INTEGER
-*         On the initial call to CLACON, KASE should be 0.
-*         On an intermediate return, KASE will be 1 or 2, indicating
-*         whether X should be overwritten by A * X  or A' * X.
-*         On the final return from CLACON, KASE will again be 0.
-*
-*  Further Details
-*  ======= =======
-*
-*  Contributed by Nick Higham, University of Manchester.
-*  Originally named CONEST, dated March 16, 1988.
-*
-*  Reference: N.J. Higham, "FORTRAN codes for estimating the one-norm of
-*  a real or complex matrix, with applications to condition estimation",
-*  ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988.
-*
-*  Last modified:  April, 1999
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            ITMAX
-      PARAMETER          ( ITMAX = 5 )
-      REAL               ONE, TWO
-      PARAMETER          ( ONE = 1.0E0, TWO = 2.0E0 )
-      COMPLEX            CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0E0, 0.0E0 ),
-     $                   CONE = ( 1.0E0, 0.0E0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ITER, J, JLAST, JUMP
-      REAL               ABSXI, ALTSGN, ESTOLD, SAFMIN, TEMP
-*     ..
-*     .. External Functions ..
-      INTEGER            ICMAX1
-      REAL               SCSUM1, SLAMCH
-      EXTERNAL           ICMAX1, SCSUM1, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CCOPY
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, CMPLX, REAL
-*     ..
-*     .. Save statement ..
-      SAVE
-*     ..
-*     .. Executable Statements ..
-*
-      SAFMIN = SLAMCH( 'Safe minimum' )
-      IF( KASE.EQ.0 ) THEN
-         DO 10 I = 1, N
-            X( I ) = CMPLX( ONE / REAL( N ) )
-   10    CONTINUE
-         KASE = 1
-         JUMP = 1
-         RETURN
-      END IF
-*
-      GO TO ( 20, 40, 70, 90, 120 )JUMP
-*
-*     ................ ENTRY   (JUMP = 1)
-*     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY A*X.
-*
-   20 CONTINUE
-      IF( N.EQ.1 ) THEN
-         V( 1 ) = X( 1 )
-         EST = ABS( V( 1 ) )
-*        ... QUIT
-         GO TO 130
-      END IF
-      EST = SCSUM1( N, X, 1 )
-*
-      DO 30 I = 1, N
-         ABSXI = ABS( X( I ) )
-         IF( ABSXI.GT.SAFMIN ) THEN
-            X( I ) = CMPLX( REAL( X( I ) ) / ABSXI,
-     $               AIMAG( X( I ) ) / ABSXI )
-         ELSE
-            X( I ) = CONE
-         END IF
-   30 CONTINUE
-      KASE = 2
-      JUMP = 2
-      RETURN
-*
-*     ................ ENTRY   (JUMP = 2)
-*     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY CTRANS(A)*X.
-*
-   40 CONTINUE
-      J = ICMAX1( N, X, 1 )
-      ITER = 2
-*
-*     MAIN LOOP - ITERATIONS 2,3,...,ITMAX.
-*
-   50 CONTINUE
-      DO 60 I = 1, N
-         X( I ) = CZERO
-   60 CONTINUE
-      X( J ) = CONE
-      KASE = 1
-      JUMP = 3
-      RETURN
-*
-*     ................ ENTRY   (JUMP = 3)
-*     X HAS BEEN OVERWRITTEN BY A*X.
-*
-   70 CONTINUE
-      CALL CCOPY( N, X, 1, V, 1 )
-      ESTOLD = EST
-      EST = SCSUM1( N, V, 1 )
-*
-*     TEST FOR CYCLING.
-      IF( EST.LE.ESTOLD )
-     $   GO TO 100
-*
-      DO 80 I = 1, N
-         ABSXI = ABS( X( I ) )
-         IF( ABSXI.GT.SAFMIN ) THEN
-            X( I ) = CMPLX( REAL( X( I ) ) / ABSXI,
-     $               AIMAG( X( I ) ) / ABSXI )
-         ELSE
-            X( I ) = CONE
-         END IF
-   80 CONTINUE
-      KASE = 2
-      JUMP = 4
-      RETURN
-*
-*     ................ ENTRY   (JUMP = 4)
-*     X HAS BEEN OVERWRITTEN BY CTRANS(A)*X.
-*
-   90 CONTINUE
-      JLAST = J
-      J = ICMAX1( N, X, 1 )
-      IF( ( ABS( X( JLAST ) ).NE.ABS( X( J ) ) ) .AND.
-     $    ( ITER.LT.ITMAX ) ) THEN
-         ITER = ITER + 1
-         GO TO 50
-      END IF
-*
-*     ITERATION COMPLETE.  FINAL STAGE.
-*
-  100 CONTINUE
-      ALTSGN = ONE
-      DO 110 I = 1, N
-         X( I ) = CMPLX( ALTSGN*( ONE+REAL( I-1 ) / REAL( N-1 ) ) )
-         ALTSGN = -ALTSGN
-  110 CONTINUE
-      KASE = 1
-      JUMP = 5
-      RETURN
-*
-*     ................ ENTRY   (JUMP = 5)
-*     X HAS BEEN OVERWRITTEN BY A*X.
-*
-  120 CONTINUE
-      TEMP = TWO*( SCSUM1( N, X, 1 ) / REAL( 3*N ) )
-      IF( TEMP.GT.EST ) THEN
-         CALL CCOPY( N, X, 1, V, 1 )
-         EST = TEMP
-      END IF
-*
-  130 CONTINUE
-      KASE = 0
-      RETURN
-*
-*     End of CLACON
-*
-      END
--- a/libcruft/lapack/clacpy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-      SUBROUTINE CLACPY( UPLO, M, N, A, LDA, B, LDB )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            LDA, LDB, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLACPY copies all or part of a two-dimensional matrix A to another
-*  matrix B.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies the part of the matrix A to be copied to B.
-*          = 'U':      Upper triangular part
-*          = 'L':      Lower triangular part
-*          Otherwise:  All of the matrix A
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input) COMPLEX array, dimension (LDA,N)
-*          The m by n matrix A.  If UPLO = 'U', only the upper trapezium
-*          is accessed; if UPLO = 'L', only the lower trapezium is
-*          accessed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  B       (output) COMPLEX array, dimension (LDB,N)
-*          On exit, B = A in the locations specified by UPLO.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,M).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-      IF( LSAME( UPLO, 'U' ) ) THEN
-         DO 20 J = 1, N
-            DO 10 I = 1, MIN( J, M )
-               B( I, J ) = A( I, J )
-   10       CONTINUE
-   20    CONTINUE
-*
-      ELSE IF( LSAME( UPLO, 'L' ) ) THEN
-         DO 40 J = 1, N
-            DO 30 I = J, M
-               B( I, J ) = A( I, J )
-   30       CONTINUE
-   40    CONTINUE
-*
-      ELSE
-         DO 60 J = 1, N
-            DO 50 I = 1, M
-               B( I, J ) = A( I, J )
-   50       CONTINUE
-   60    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of CLACPY
-*
-      END
--- a/libcruft/lapack/cladiv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-      COMPLEX FUNCTION CLADIV( X, Y )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      COMPLEX            X, Y
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLADIV := X / Y, where X and Y are complex.  The computation of X / Y
-*  will not overflow on an intermediary step unless the results
-*  overflows.
-*
-*  Arguments
-*  =========
-*
-*  X       (input) COMPLEX
-*  Y       (input) COMPLEX
-*          The complex scalars X and Y.
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      REAL               ZI, ZR
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLADIV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          AIMAG, CMPLX, REAL
-*     ..
-*     .. Executable Statements ..
-*
-      CALL SLADIV( REAL( X ), AIMAG( X ), REAL( Y ), AIMAG( Y ), ZR,
-     $             ZI )
-      CLADIV = CMPLX( ZR, ZI )
-*
-      RETURN
-*
-*     End of CLADIV
-*
-      END
--- a/libcruft/lapack/clahqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,469 +0,0 @@
-      SUBROUTINE CLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ,
-     $                   IHIZ, Z, LDZ, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, N
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            H( LDH, * ), W( * ), Z( LDZ, * )
-*     ..
-*
-*     Purpose
-*     =======
-*
-*     CLAHQR is an auxiliary routine called by CHSEQR to update the
-*     eigenvalues and Schur decomposition already computed by CHSEQR, by
-*     dealing with the Hessenberg submatrix in rows and columns ILO to
-*     IHI.
-*
-*     Arguments
-*     =========
-*
-*     WANTT   (input) LOGICAL
-*          = .TRUE. : the full Schur form T is required;
-*          = .FALSE.: only eigenvalues are required.
-*
-*     WANTZ   (input) LOGICAL
-*          = .TRUE. : the matrix of Schur vectors Z is required;
-*          = .FALSE.: Schur vectors are not required.
-*
-*     N       (input) INTEGER
-*          The order of the matrix H.  N >= 0.
-*
-*     ILO     (input) INTEGER
-*     IHI     (input) INTEGER
-*          It is assumed that H is already upper triangular in rows and
-*          columns IHI+1:N, and that H(ILO,ILO-1) = 0 (unless ILO = 1).
-*          CLAHQR works primarily with the Hessenberg submatrix in rows
-*          and columns ILO to IHI, but applies transformations to all of
-*          H if WANTT is .TRUE..
-*          1 <= ILO <= max(1,IHI); IHI <= N.
-*
-*     H       (input/output) COMPLEX array, dimension (LDH,N)
-*          On entry, the upper Hessenberg matrix H.
-*          On exit, if INFO is zero and if WANTT is .TRUE., then H
-*          is upper triangular in rows and columns ILO:IHI.  If INFO
-*          is zero and if WANTT is .FALSE., then the contents of H
-*          are unspecified on exit.  The output state of H in case
-*          INF is positive is below under the description of INFO.
-*
-*     LDH     (input) INTEGER
-*          The leading dimension of the array H. LDH >= max(1,N).
-*
-*     W       (output) COMPLEX array, dimension (N)
-*          The computed eigenvalues ILO to IHI are stored in the
-*          corresponding elements of W. If WANTT is .TRUE., the
-*          eigenvalues are stored in the same order as on the diagonal
-*          of the Schur form returned in H, with W(i) = H(i,i).
-*
-*     ILOZ    (input) INTEGER
-*     IHIZ    (input) INTEGER
-*          Specify the rows of Z to which transformations must be
-*          applied if WANTZ is .TRUE..
-*          1 <= ILOZ <= ILO; IHI <= IHIZ <= N.
-*
-*     Z       (input/output) COMPLEX array, dimension (LDZ,N)
-*          If WANTZ is .TRUE., on entry Z must contain the current
-*          matrix Z of transformations accumulated by CHSEQR, and on
-*          exit Z has been updated; transformations are applied only to
-*          the submatrix Z(ILOZ:IHIZ,ILO:IHI).
-*          If WANTZ is .FALSE., Z is not referenced.
-*
-*     LDZ     (input) INTEGER
-*          The leading dimension of the array Z. LDZ >= max(1,N).
-*
-*     INFO    (output) INTEGER
-*           =   0: successful exit
-*          .GT. 0: if INFO = i, CLAHQR failed to compute all the
-*                  eigenvalues ILO to IHI in a total of 30 iterations
-*                  per eigenvalue; elements i+1:ihi of W contain
-*                  those eigenvalues which have been successfully
-*                  computed.
-*
-*                  If INFO .GT. 0 and WANTT is .FALSE., then on exit,
-*                  the remaining unconverged eigenvalues are the
-*                  eigenvalues of the upper Hessenberg matrix
-*                  rows and columns ILO thorugh INFO of the final,
-*                  output value of H.
-*
-*                  If INFO .GT. 0 and WANTT is .TRUE., then on exit
-*          (*)       (initial value of H)*U  = U*(final value of H)
-*                  where U is an orthognal matrix.    The final
-*                  value of H is upper Hessenberg and triangular in
-*                  rows and columns INFO+1 through IHI.
-*
-*                  If INFO .GT. 0 and WANTZ is .TRUE., then on exit
-*                      (final value of Z)  = (initial value of Z)*U
-*                  where U is the orthogonal matrix in (*)
-*                  (regardless of the value of WANTT.)
-*
-*     Further Details
-*     ===============
-*
-*     02-96 Based on modifications by
-*     David Day, Sandia National Laboratory, USA
-*
-*     12-04 Further modifications by
-*     Ralph Byers, University of Kansas, USA
-*
-*       This is a modified version of CLAHQR from LAPACK version 3.0.
-*       It is (1) more robust against overflow and underflow and
-*       (2) adopts the more conservative Ahues & Tisseur stopping
-*       criterion (LAWN 122, 1997).
-*
-*     =========================================================
-*
-*     .. Parameters ..
-      INTEGER            ITMAX
-      PARAMETER          ( ITMAX = 30 )
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0e0, 0.0e0 ),
-     $                   ONE = ( 1.0e0, 0.0e0 ) )
-      REAL               RZERO, RONE, HALF
-      PARAMETER          ( RZERO = 0.0e0, RONE = 1.0e0, HALF = 0.5e0 )
-      REAL               DAT1
-      PARAMETER          ( DAT1 = 3.0e0 / 4.0e0 )
-*     ..
-*     .. Local Scalars ..
-      COMPLEX            CDUM, H11, H11S, H22, SC, SUM, T, T1, TEMP, U,
-     $                   V2, X, Y
-      REAL               AA, AB, BA, BB, H10, H21, RTEMP, S, SAFMAX,
-     $                   SAFMIN, SMLNUM, SX, T2, TST, ULP
-      INTEGER            I, I1, I2, ITS, J, JHI, JLO, K, L, M, NH, NZ
-*     ..
-*     .. Local Arrays ..
-      COMPLEX            V( 2 )
-*     ..
-*     .. External Functions ..
-      COMPLEX            CLADIV
-      REAL               SLAMCH
-      EXTERNAL           CLADIV, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CCOPY, CLARFG, CSCAL, SLABAD
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, CONJG, MAX, MIN, REAL, SQRT
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( REAL( CDUM ) ) + ABS( AIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-      IF( ILO.EQ.IHI ) THEN
-         W( ILO ) = H( ILO, ILO )
-         RETURN
-      END IF
-*
-*     ==== clear out the trash ====
-      DO 10 J = ILO, IHI - 3
-         H( J+2, J ) = ZERO
-         H( J+3, J ) = ZERO
-   10 CONTINUE
-      IF( ILO.LE.IHI-2 )
-     $   H( IHI, IHI-2 ) = ZERO
-*     ==== ensure that subdiagonal entries are real ====
-      DO 20 I = ILO + 1, IHI
-         IF( AIMAG( H( I, I-1 ) ).NE.RZERO ) THEN
-*           ==== The following redundant normalization
-*           .    avoids problems with both gradual and
-*           .    sudden underflow in ABS(H(I,I-1)) ====
-            SC = H( I, I-1 ) / CABS1( H( I, I-1 ) )
-            SC = CONJG( SC ) / ABS( SC )
-            H( I, I-1 ) = ABS( H( I, I-1 ) )
-            IF( WANTT ) THEN
-               JLO = 1
-               JHI = N
-            ELSE
-               JLO = ILO
-               JHI = IHI
-            END IF
-            CALL CSCAL( JHI-I+1, SC, H( I, I ), LDH )
-            CALL CSCAL( MIN( JHI, I+1 )-JLO+1, CONJG( SC ), H( JLO, I ),
-     $                  1 )
-            IF( WANTZ )
-     $         CALL CSCAL( IHIZ-ILOZ+1, CONJG( SC ), Z( ILOZ, I ), 1 )
-         END IF
-   20 CONTINUE
-*
-      NH = IHI - ILO + 1
-      NZ = IHIZ - ILOZ + 1
-*
-*     Set machine-dependent constants for the stopping criterion.
-*
-      SAFMIN = SLAMCH( 'SAFE MINIMUM' )
-      SAFMAX = RONE / SAFMIN
-      CALL SLABAD( SAFMIN, SAFMAX )
-      ULP = SLAMCH( 'PRECISION' )
-      SMLNUM = SAFMIN*( REAL( NH ) / ULP )
-*
-*     I1 and I2 are the indices of the first row and last column of H
-*     to which transformations must be applied. If eigenvalues only are
-*     being computed, I1 and I2 are set inside the main loop.
-*
-      IF( WANTT ) THEN
-         I1 = 1
-         I2 = N
-      END IF
-*
-*     The main loop begins here. I is the loop index and decreases from
-*     IHI to ILO in steps of 1. Each iteration of the loop works
-*     with the active submatrix in rows and columns L to I.
-*     Eigenvalues I+1 to IHI have already converged. Either L = ILO, or
-*     H(L,L-1) is negligible so that the matrix splits.
-*
-      I = IHI
-   30 CONTINUE
-      IF( I.LT.ILO )
-     $   GO TO 150
-*
-*     Perform QR iterations on rows and columns ILO to I until a
-*     submatrix of order 1 splits off at the bottom because a
-*     subdiagonal element has become negligible.
-*
-      L = ILO
-      DO 130 ITS = 0, ITMAX
-*
-*        Look for a single small subdiagonal element.
-*
-         DO 40 K = I, L + 1, -1
-            IF( CABS1( H( K, K-1 ) ).LE.SMLNUM )
-     $         GO TO 50
-            TST = CABS1( H( K-1, K-1 ) ) + CABS1( H( K, K ) )
-            IF( TST.EQ.ZERO ) THEN
-               IF( K-2.GE.ILO )
-     $            TST = TST + ABS( REAL( H( K-1, K-2 ) ) )
-               IF( K+1.LE.IHI )
-     $            TST = TST + ABS( REAL( H( K+1, K ) ) )
-            END IF
-*           ==== The following is a conservative small subdiagonal
-*           .    deflation criterion due to Ahues & Tisseur (LAWN 122,
-*           .    1997). It has better mathematical foundation and
-*           .    improves accuracy in some examples.  ====
-            IF( ABS( REAL( H( K, K-1 ) ) ).LE.ULP*TST ) THEN
-               AB = MAX( CABS1( H( K, K-1 ) ), CABS1( H( K-1, K ) ) )
-               BA = MIN( CABS1( H( K, K-1 ) ), CABS1( H( K-1, K ) ) )
-               AA = MAX( CABS1( H( K, K ) ),
-     $              CABS1( H( K-1, K-1 )-H( K, K ) ) )
-               BB = MIN( CABS1( H( K, K ) ),
-     $              CABS1( H( K-1, K-1 )-H( K, K ) ) )
-               S = AA + AB
-               IF( BA*( AB / S ).LE.MAX( SMLNUM,
-     $             ULP*( BB*( AA / S ) ) ) )GO TO 50
-            END IF
-   40    CONTINUE
-   50    CONTINUE
-         L = K
-         IF( L.GT.ILO ) THEN
-*
-*           H(L,L-1) is negligible
-*
-            H( L, L-1 ) = ZERO
-         END IF
-*
-*        Exit from loop if a submatrix of order 1 has split off.
-*
-         IF( L.GE.I )
-     $      GO TO 140
-*
-*        Now the active submatrix is in rows and columns L to I. If
-*        eigenvalues only are being computed, only the active submatrix
-*        need be transformed.
-*
-         IF( .NOT.WANTT ) THEN
-            I1 = L
-            I2 = I
-         END IF
-*
-         IF( ITS.EQ.10 .OR. ITS.EQ.20 ) THEN
-*
-*           Exceptional shift.
-*
-            S = DAT1*ABS( REAL( H( I, I-1 ) ) )
-            T = S + H( I, I )
-         ELSE
-*
-*           Wilkinson's shift.
-*
-            T = H( I, I )
-            U = SQRT( H( I-1, I ) )*SQRT( H( I, I-1 ) )
-            S = CABS1( U )
-            IF( S.NE.RZERO ) THEN
-               X = HALF*( H( I-1, I-1 )-T )
-               SX = CABS1( X )
-               S = MAX( S, CABS1( X ) )
-               Y = S*SQRT( ( X / S )**2+( U / S )**2 )
-               IF( SX.GT.RZERO ) THEN
-                  IF( REAL( X / SX )*REAL( Y )+AIMAG( X / SX )*
-     $                AIMAG( Y ).LT.RZERO )Y = -Y
-               END IF
-               T = T - U*CLADIV( U, ( X+Y ) )
-            END IF
-         END IF
-*
-*        Look for two consecutive small subdiagonal elements.
-*
-         DO 60 M = I - 1, L + 1, -1
-*
-*           Determine the effect of starting the single-shift QR
-*           iteration at row M, and see if this would make H(M,M-1)
-*           negligible.
-*
-            H11 = H( M, M )
-            H22 = H( M+1, M+1 )
-            H11S = H11 - T
-            H21 = H( M+1, M )
-            S = CABS1( H11S ) + ABS( H21 )
-            H11S = H11S / S
-            H21 = H21 / S
-            V( 1 ) = H11S
-            V( 2 ) = H21
-            H10 = H( M, M-1 )
-            IF( ABS( H10 )*ABS( H21 ).LE.ULP*
-     $          ( CABS1( H11S )*( CABS1( H11 )+CABS1( H22 ) ) ) )
-     $          GO TO 70
-   60    CONTINUE
-         H11 = H( L, L )
-         H22 = H( L+1, L+1 )
-         H11S = H11 - T
-         H21 = H( L+1, L )
-         S = CABS1( H11S ) + ABS( H21 )
-         H11S = H11S / S
-         H21 = H21 / S
-         V( 1 ) = H11S
-         V( 2 ) = H21
-   70    CONTINUE
-*
-*        Single-shift QR step
-*
-         DO 120 K = M, I - 1
-*
-*           The first iteration of this loop determines a reflection G
-*           from the vector V and applies it from left and right to H,
-*           thus creating a nonzero bulge below the subdiagonal.
-*
-*           Each subsequent iteration determines a reflection G to
-*           restore the Hessenberg form in the (K-1)th column, and thus
-*           chases the bulge one step toward the bottom of the active
-*           submatrix.
-*
-*           V(2) is always real before the call to CLARFG, and hence
-*           after the call T2 ( = T1*V(2) ) is also real.
-*
-            IF( K.GT.M )
-     $         CALL CCOPY( 2, H( K, K-1 ), 1, V, 1 )
-            CALL CLARFG( 2, V( 1 ), V( 2 ), 1, T1 )
-            IF( K.GT.M ) THEN
-               H( K, K-1 ) = V( 1 )
-               H( K+1, K-1 ) = ZERO
-            END IF
-            V2 = V( 2 )
-            T2 = REAL( T1*V2 )
-*
-*           Apply G from the left to transform the rows of the matrix
-*           in columns K to I2.
-*
-            DO 80 J = K, I2
-               SUM = CONJG( T1 )*H( K, J ) + T2*H( K+1, J )
-               H( K, J ) = H( K, J ) - SUM
-               H( K+1, J ) = H( K+1, J ) - SUM*V2
-   80       CONTINUE
-*
-*           Apply G from the right to transform the columns of the
-*           matrix in rows I1 to min(K+2,I).
-*
-            DO 90 J = I1, MIN( K+2, I )
-               SUM = T1*H( J, K ) + T2*H( J, K+1 )
-               H( J, K ) = H( J, K ) - SUM
-               H( J, K+1 ) = H( J, K+1 ) - SUM*CONJG( V2 )
-   90       CONTINUE
-*
-            IF( WANTZ ) THEN
-*
-*              Accumulate transformations in the matrix Z
-*
-               DO 100 J = ILOZ, IHIZ
-                  SUM = T1*Z( J, K ) + T2*Z( J, K+1 )
-                  Z( J, K ) = Z( J, K ) - SUM
-                  Z( J, K+1 ) = Z( J, K+1 ) - SUM*CONJG( V2 )
-  100          CONTINUE
-            END IF
-*
-            IF( K.EQ.M .AND. M.GT.L ) THEN
-*
-*              If the QR step was started at row M > L because two
-*              consecutive small subdiagonals were found, then extra
-*              scaling must be performed to ensure that H(M,M-1) remains
-*              real.
-*
-               TEMP = ONE - T1
-               TEMP = TEMP / ABS( TEMP )
-               H( M+1, M ) = H( M+1, M )*CONJG( TEMP )
-               IF( M+2.LE.I )
-     $            H( M+2, M+1 ) = H( M+2, M+1 )*TEMP
-               DO 110 J = M, I
-                  IF( J.NE.M+1 ) THEN
-                     IF( I2.GT.J )
-     $                  CALL CSCAL( I2-J, TEMP, H( J, J+1 ), LDH )
-                     CALL CSCAL( J-I1, CONJG( TEMP ), H( I1, J ), 1 )
-                     IF( WANTZ ) THEN
-                        CALL CSCAL( NZ, CONJG( TEMP ), Z( ILOZ, J ), 1 )
-                     END IF
-                  END IF
-  110          CONTINUE
-            END IF
-  120    CONTINUE
-*
-*        Ensure that H(I,I-1) is real.
-*
-         TEMP = H( I, I-1 )
-         IF( AIMAG( TEMP ).NE.RZERO ) THEN
-            RTEMP = ABS( TEMP )
-            H( I, I-1 ) = RTEMP
-            TEMP = TEMP / RTEMP
-            IF( I2.GT.I )
-     $         CALL CSCAL( I2-I, CONJG( TEMP ), H( I, I+1 ), LDH )
-            CALL CSCAL( I-I1, TEMP, H( I1, I ), 1 )
-            IF( WANTZ ) THEN
-               CALL CSCAL( NZ, TEMP, Z( ILOZ, I ), 1 )
-            END IF
-         END IF
-*
-  130 CONTINUE
-*
-*     Failure to converge in remaining number of iterations
-*
-      INFO = I
-      RETURN
-*
-  140 CONTINUE
-*
-*     H(I,I-1) is negligible: one eigenvalue has converged.
-*
-      W( I ) = H( I, I )
-*
-*     return to start of the main loop with new value of I.
-*
-      I = L - 1
-      GO TO 30
-*
-  150 CONTINUE
-      RETURN
-*
-*     End of CLAHQR
-*
-      END
--- a/libcruft/lapack/clahr2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,240 +0,0 @@
-      SUBROUTINE CLAHR2( N, K, NB, A, LDA, TAU, T, LDT, Y, LDY )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            K, LDA, LDT, LDY, N, NB
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), T( LDT, NB ), TAU( NB ),
-     $                   Y( LDY, NB )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLAHR2 reduces the first NB columns of A complex general n-BY-(n-k+1)
-*  matrix A so that elements below the k-th subdiagonal are zero. The
-*  reduction is performed by an unitary similarity transformation
-*  Q' * A * Q. The routine returns the matrices V and T which determine
-*  Q as a block reflector I - V*T*V', and also the matrix Y = A * V * T.
-*
-*  This is an auxiliary routine called by CGEHRD.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  K       (input) INTEGER
-*          The offset for the reduction. Elements below the k-th
-*          subdiagonal in the first NB columns are reduced to zero.
-*          K < N.
-*
-*  NB      (input) INTEGER
-*          The number of columns to be reduced.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N-K+1)
-*          On entry, the n-by-(n-k+1) general matrix A.
-*          On exit, the elements on and above the k-th subdiagonal in
-*          the first NB columns are overwritten with the corresponding
-*          elements of the reduced matrix; the elements below the k-th
-*          subdiagonal, with the array TAU, represent the matrix Q as a
-*          product of elementary reflectors. The other columns of A are
-*          unchanged. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  TAU     (output) COMPLEX array, dimension (NB)
-*          The scalar factors of the elementary reflectors. See Further
-*          Details.
-*
-*  T       (output) COMPLEX array, dimension (LDT,NB)
-*          The upper triangular matrix T.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T.  LDT >= NB.
-*
-*  Y       (output) COMPLEX array, dimension (LDY,NB)
-*          The n-by-nb matrix Y.
-*
-*  LDY     (input) INTEGER
-*          The leading dimension of the array Y. LDY >= N.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of nb elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(nb).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i+k-1) = 0, v(i+k) = 1; v(i+k+1:n) is stored on exit in
-*  A(i+k+1:n,i), and tau in TAU(i).
-*
-*  The elements of the vectors v together form the (n-k+1)-by-nb matrix
-*  V which is needed, with T and Y, to apply the transformation to the
-*  unreduced part of the matrix, using an update of the form:
-*  A := (I - V*T*V') * (A - Y*V').
-*
-*  The contents of A on exit are illustrated by the following example
-*  with n = 7, k = 3 and nb = 2:
-*
-*     ( a   a   a   a   a )
-*     ( a   a   a   a   a )
-*     ( a   a   a   a   a )
-*     ( h   h   a   a   a )
-*     ( v1  h   a   a   a )
-*     ( v1  v2  a   a   a )
-*     ( v1  v2  a   a   a )
-*
-*  where a denotes an element of the original matrix A, h denotes a
-*  modified element of the upper Hessenberg matrix H, and vi denotes an
-*  element of the vector defining H(i).
-*
-*  This file is a slight modification of LAPACK-3.0's CLAHRD
-*  incorporating improvements proposed by Quintana-Orti and Van de
-*  Gejin. Note that the entries of A(1:K,2:NB) differ from those
-*  returned by the original LAPACK routine. This function is
-*  not backward compatible with LAPACK3.0.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ), 
-     $                     ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      COMPLEX            EI
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CAXPY, CCOPY, CGEMM, CGEMV, CLACPY,
-     $                   CLARFG, CSCAL, CTRMM, CTRMV, CLACGV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 )
-     $   RETURN
-*
-      DO 10 I = 1, NB
-         IF( I.GT.1 ) THEN
-*
-*           Update A(K+1:N,I)
-*
-*           Update I-th column of A - Y * V'
-*
-            CALL CLACGV( I-1, A( K+I-1, 1 ), LDA ) 
-            CALL CGEMV( 'NO TRANSPOSE', N-K, I-1, -ONE, Y(K+1,1), LDY,
-     $                  A( K+I-1, 1 ), LDA, ONE, A( K+1, I ), 1 )
-            CALL CLACGV( I-1, A( K+I-1, 1 ), LDA ) 
-*
-*           Apply I - V * T' * V' to this column (call it b) from the
-*           left, using the last column of T as workspace
-*
-*           Let  V = ( V1 )   and   b = ( b1 )   (first I-1 rows)
-*                    ( V2 )             ( b2 )
-*
-*           where V1 is unit lower triangular
-*
-*           w := V1' * b1
-*
-            CALL CCOPY( I-1, A( K+1, I ), 1, T( 1, NB ), 1 )
-            CALL CTRMV( 'Lower', 'Conjugate transpose', 'UNIT', 
-     $                  I-1, A( K+1, 1 ),
-     $                  LDA, T( 1, NB ), 1 )
-*
-*           w := w + V2'*b2
-*
-            CALL CGEMV( 'Conjugate transpose', N-K-I+1, I-1, 
-     $                  ONE, A( K+I, 1 ),
-     $                  LDA, A( K+I, I ), 1, ONE, T( 1, NB ), 1 )
-*
-*           w := T'*w
-*
-            CALL CTRMV( 'Upper', 'Conjugate transpose', 'NON-UNIT', 
-     $                  I-1, T, LDT,
-     $                  T( 1, NB ), 1 )
-*
-*           b2 := b2 - V2*w
-*
-            CALL CGEMV( 'NO TRANSPOSE', N-K-I+1, I-1, -ONE, 
-     $                  A( K+I, 1 ),
-     $                  LDA, T( 1, NB ), 1, ONE, A( K+I, I ), 1 )
-*
-*           b1 := b1 - V1*w
-*
-            CALL CTRMV( 'Lower', 'NO TRANSPOSE', 
-     $                  'UNIT', I-1,
-     $                  A( K+1, 1 ), LDA, T( 1, NB ), 1 )
-            CALL CAXPY( I-1, -ONE, T( 1, NB ), 1, A( K+1, I ), 1 )
-*
-            A( K+I-1, I-1 ) = EI
-         END IF
-*
-*        Generate the elementary reflector H(I) to annihilate
-*        A(K+I+1:N,I)
-*
-         CALL CLARFG( N-K-I+1, A( K+I, I ), A( MIN( K+I+1, N ), I ), 1,
-     $                TAU( I ) )
-         EI = A( K+I, I )
-         A( K+I, I ) = ONE
-*
-*        Compute  Y(K+1:N,I)
-*
-         CALL CGEMV( 'NO TRANSPOSE', N-K, N-K-I+1, 
-     $               ONE, A( K+1, I+1 ),
-     $               LDA, A( K+I, I ), 1, ZERO, Y( K+1, I ), 1 )
-         CALL CGEMV( 'Conjugate transpose', N-K-I+1, I-1, 
-     $               ONE, A( K+I, 1 ), LDA,
-     $               A( K+I, I ), 1, ZERO, T( 1, I ), 1 )
-         CALL CGEMV( 'NO TRANSPOSE', N-K, I-1, -ONE, 
-     $               Y( K+1, 1 ), LDY,
-     $               T( 1, I ), 1, ONE, Y( K+1, I ), 1 )
-         CALL CSCAL( N-K, TAU( I ), Y( K+1, I ), 1 )
-*
-*        Compute T(1:I,I)
-*
-         CALL CSCAL( I-1, -TAU( I ), T( 1, I ), 1 )
-         CALL CTRMV( 'Upper', 'No Transpose', 'NON-UNIT', 
-     $               I-1, T, LDT,
-     $               T( 1, I ), 1 )
-         T( I, I ) = TAU( I )
-*
-   10 CONTINUE
-      A( K+NB, NB ) = EI
-*
-*     Compute Y(1:K,1:NB)
-*
-      CALL CLACPY( 'ALL', K, NB, A( 1, 2 ), LDA, Y, LDY )
-      CALL CTRMM( 'RIGHT', 'Lower', 'NO TRANSPOSE', 
-     $            'UNIT', K, NB,
-     $            ONE, A( K+1, 1 ), LDA, Y, LDY )
-      IF( N.GT.K+NB )
-     $   CALL CGEMM( 'NO TRANSPOSE', 'NO TRANSPOSE', K, 
-     $               NB, N-K-NB, ONE,
-     $               A( 1, 2+NB ), LDA, A( K+1+NB, 1 ), LDA, ONE, Y,
-     $               LDY )
-      CALL CTRMM( 'RIGHT', 'Upper', 'NO TRANSPOSE', 
-     $            'NON-UNIT', K, NB,
-     $            ONE, T, LDT, Y, LDY )
-*
-      RETURN
-*
-*     End of CLAHR2
-*
-      END
--- a/libcruft/lapack/clahrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,213 +0,0 @@
-      SUBROUTINE CLAHRD( N, K, NB, A, LDA, TAU, T, LDT, Y, LDY )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            K, LDA, LDT, LDY, N, NB
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), T( LDT, NB ), TAU( NB ),
-     $                   Y( LDY, NB )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLAHRD reduces the first NB columns of a complex general n-by-(n-k+1)
-*  matrix A so that elements below the k-th subdiagonal are zero. The
-*  reduction is performed by a unitary similarity transformation
-*  Q' * A * Q. The routine returns the matrices V and T which determine
-*  Q as a block reflector I - V*T*V', and also the matrix Y = A * V * T.
-*
-*  This is an OBSOLETE auxiliary routine. 
-*  This routine will be 'deprecated' in a  future release.
-*  Please use the new routine CLAHR2 instead.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  K       (input) INTEGER
-*          The offset for the reduction. Elements below the k-th
-*          subdiagonal in the first NB columns are reduced to zero.
-*
-*  NB      (input) INTEGER
-*          The number of columns to be reduced.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N-K+1)
-*          On entry, the n-by-(n-k+1) general matrix A.
-*          On exit, the elements on and above the k-th subdiagonal in
-*          the first NB columns are overwritten with the corresponding
-*          elements of the reduced matrix; the elements below the k-th
-*          subdiagonal, with the array TAU, represent the matrix Q as a
-*          product of elementary reflectors. The other columns of A are
-*          unchanged. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  TAU     (output) COMPLEX array, dimension (NB)
-*          The scalar factors of the elementary reflectors. See Further
-*          Details.
-*
-*  T       (output) COMPLEX array, dimension (LDT,NB)
-*          The upper triangular matrix T.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T.  LDT >= NB.
-*
-*  Y       (output) COMPLEX array, dimension (LDY,NB)
-*          The n-by-nb matrix Y.
-*
-*  LDY     (input) INTEGER
-*          The leading dimension of the array Y. LDY >= max(1,N).
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of nb elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(nb).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i+k-1) = 0, v(i+k) = 1; v(i+k+1:n) is stored on exit in
-*  A(i+k+1:n,i), and tau in TAU(i).
-*
-*  The elements of the vectors v together form the (n-k+1)-by-nb matrix
-*  V which is needed, with T and Y, to apply the transformation to the
-*  unreduced part of the matrix, using an update of the form:
-*  A := (I - V*T*V') * (A - Y*V').
-*
-*  The contents of A on exit are illustrated by the following example
-*  with n = 7, k = 3 and nb = 2:
-*
-*     ( a   h   a   a   a )
-*     ( a   h   a   a   a )
-*     ( a   h   a   a   a )
-*     ( h   h   a   a   a )
-*     ( v1  h   a   a   a )
-*     ( v1  v2  a   a   a )
-*     ( v1  v2  a   a   a )
-*
-*  where a denotes an element of the original matrix A, h denotes a
-*  modified element of the upper Hessenberg matrix H, and vi denotes an
-*  element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ),
-     $                   ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      COMPLEX            EI
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CAXPY, CCOPY, CGEMV, CLACGV, CLARFG, CSCAL,
-     $                   CTRMV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 )
-     $   RETURN
-*
-      DO 10 I = 1, NB
-         IF( I.GT.1 ) THEN
-*
-*           Update A(1:n,i)
-*
-*           Compute i-th column of A - Y * V'
-*
-            CALL CLACGV( I-1, A( K+I-1, 1 ), LDA )
-            CALL CGEMV( 'No transpose', N, I-1, -ONE, Y, LDY,
-     $                  A( K+I-1, 1 ), LDA, ONE, A( 1, I ), 1 )
-            CALL CLACGV( I-1, A( K+I-1, 1 ), LDA )
-*
-*           Apply I - V * T' * V' to this column (call it b) from the
-*           left, using the last column of T as workspace
-*
-*           Let  V = ( V1 )   and   b = ( b1 )   (first I-1 rows)
-*                    ( V2 )             ( b2 )
-*
-*           where V1 is unit lower triangular
-*
-*           w := V1' * b1
-*
-            CALL CCOPY( I-1, A( K+1, I ), 1, T( 1, NB ), 1 )
-            CALL CTRMV( 'Lower', 'Conjugate transpose', 'Unit', I-1,
-     $                  A( K+1, 1 ), LDA, T( 1, NB ), 1 )
-*
-*           w := w + V2'*b2
-*
-            CALL CGEMV( 'Conjugate transpose', N-K-I+1, I-1, ONE,
-     $                  A( K+I, 1 ), LDA, A( K+I, I ), 1, ONE,
-     $                  T( 1, NB ), 1 )
-*
-*           w := T'*w
-*
-            CALL CTRMV( 'Upper', 'Conjugate transpose', 'Non-unit', I-1,
-     $                  T, LDT, T( 1, NB ), 1 )
-*
-*           b2 := b2 - V2*w
-*
-            CALL CGEMV( 'No transpose', N-K-I+1, I-1, -ONE, A( K+I, 1 ),
-     $                  LDA, T( 1, NB ), 1, ONE, A( K+I, I ), 1 )
-*
-*           b1 := b1 - V1*w
-*
-            CALL CTRMV( 'Lower', 'No transpose', 'Unit', I-1,
-     $                  A( K+1, 1 ), LDA, T( 1, NB ), 1 )
-            CALL CAXPY( I-1, -ONE, T( 1, NB ), 1, A( K+1, I ), 1 )
-*
-            A( K+I-1, I-1 ) = EI
-         END IF
-*
-*        Generate the elementary reflector H(i) to annihilate
-*        A(k+i+1:n,i)
-*
-         EI = A( K+I, I )
-         CALL CLARFG( N-K-I+1, EI, A( MIN( K+I+1, N ), I ), 1,
-     $                TAU( I ) )
-         A( K+I, I ) = ONE
-*
-*        Compute  Y(1:n,i)
-*
-         CALL CGEMV( 'No transpose', N, N-K-I+1, ONE, A( 1, I+1 ), LDA,
-     $               A( K+I, I ), 1, ZERO, Y( 1, I ), 1 )
-         CALL CGEMV( 'Conjugate transpose', N-K-I+1, I-1, ONE,
-     $               A( K+I, 1 ), LDA, A( K+I, I ), 1, ZERO, T( 1, I ),
-     $               1 )
-         CALL CGEMV( 'No transpose', N, I-1, -ONE, Y, LDY, T( 1, I ), 1,
-     $               ONE, Y( 1, I ), 1 )
-         CALL CSCAL( N, TAU( I ), Y( 1, I ), 1 )
-*
-*        Compute T(1:i,i)
-*
-         CALL CSCAL( I-1, -TAU( I ), T( 1, I ), 1 )
-         CALL CTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, LDT,
-     $               T( 1, I ), 1 )
-         T( I, I ) = TAU( I )
-*
-   10 CONTINUE
-      A( K+NB, NB ) = EI
-*
-      RETURN
-*
-*     End of CLAHRD
-*
-      END
--- a/libcruft/lapack/claic1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,295 +0,0 @@
-      SUBROUTINE CLAIC1( JOB, J, X, SEST, W, GAMMA, SESTPR, S, C )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            J, JOB
-      REAL               SEST, SESTPR
-      COMPLEX            C, GAMMA, S
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            W( J ), X( J )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLAIC1 applies one step of incremental condition estimation in
-*  its simplest version:
-*
-*  Let x, twonorm(x) = 1, be an approximate singular vector of an j-by-j
-*  lower triangular matrix L, such that
-*           twonorm(L*x) = sest
-*  Then CLAIC1 computes sestpr, s, c such that
-*  the vector
-*                  [ s*x ]
-*           xhat = [  c  ]
-*  is an approximate singular vector of
-*                  [ L     0  ]
-*           Lhat = [ w' gamma ]
-*  in the sense that
-*           twonorm(Lhat*xhat) = sestpr.
-*
-*  Depending on JOB, an estimate for the largest or smallest singular
-*  value is computed.
-*
-*  Note that [s c]' and sestpr**2 is an eigenpair of the system
-*
-*      diag(sest*sest, 0) + [alpha  gamma] * [ conjg(alpha) ]
-*                                            [ conjg(gamma) ]
-*
-*  where  alpha =  conjg(x)'*w.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) INTEGER
-*          = 1: an estimate for the largest singular value is computed.
-*          = 2: an estimate for the smallest singular value is computed.
-*
-*  J       (input) INTEGER
-*          Length of X and W
-*
-*  X       (input) COMPLEX array, dimension (J)
-*          The j-vector x.
-*
-*  SEST    (input) REAL
-*          Estimated singular value of j by j matrix L
-*
-*  W       (input) COMPLEX array, dimension (J)
-*          The j-vector w.
-*
-*  GAMMA   (input) COMPLEX
-*          The diagonal element gamma.
-*
-*  SESTPR  (output) REAL
-*          Estimated singular value of (j+1) by (j+1) matrix Lhat.
-*
-*  S       (output) COMPLEX
-*          Sine needed in forming xhat.
-*
-*  C       (output) COMPLEX
-*          Cosine needed in forming xhat.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0 )
-      REAL               HALF, FOUR
-      PARAMETER          ( HALF = 0.5E0, FOUR = 4.0E0 )
-*     ..
-*     .. Local Scalars ..
-      REAL               ABSALP, ABSEST, ABSGAM, B, EPS, NORMA, S1, S2,
-     $                   SCL, T, TEST, TMP, ZETA1, ZETA2
-      COMPLEX            ALPHA, COSINE, SINE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, CONJG, MAX, SQRT
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      COMPLEX            CDOTC
-      EXTERNAL           SLAMCH, CDOTC
-*     ..
-*     .. Executable Statements ..
-*
-      EPS = SLAMCH( 'Epsilon' )
-      ALPHA = CDOTC( J, X, 1, W, 1 )
-*
-      ABSALP = ABS( ALPHA )
-      ABSGAM = ABS( GAMMA )
-      ABSEST = ABS( SEST )
-*
-      IF( JOB.EQ.1 ) THEN
-*
-*        Estimating largest singular value
-*
-*        special cases
-*
-         IF( SEST.EQ.ZERO ) THEN
-            S1 = MAX( ABSGAM, ABSALP )
-            IF( S1.EQ.ZERO ) THEN
-               S = ZERO
-               C = ONE
-               SESTPR = ZERO
-            ELSE
-               S = ALPHA / S1
-               C = GAMMA / S1
-               TMP = SQRT( S*CONJG( S )+C*CONJG( C ) )
-               S = S / TMP
-               C = C / TMP
-               SESTPR = S1*TMP
-            END IF
-            RETURN
-         ELSE IF( ABSGAM.LE.EPS*ABSEST ) THEN
-            S = ONE
-            C = ZERO
-            TMP = MAX( ABSEST, ABSALP )
-            S1 = ABSEST / TMP
-            S2 = ABSALP / TMP
-            SESTPR = TMP*SQRT( S1*S1+S2*S2 )
-            RETURN
-         ELSE IF( ABSALP.LE.EPS*ABSEST ) THEN
-            S1 = ABSGAM
-            S2 = ABSEST
-            IF( S1.LE.S2 ) THEN
-               S = ONE
-               C = ZERO
-               SESTPR = S2
-            ELSE
-               S = ZERO
-               C = ONE
-               SESTPR = S1
-            END IF
-            RETURN
-         ELSE IF( ABSEST.LE.EPS*ABSALP .OR. ABSEST.LE.EPS*ABSGAM ) THEN
-            S1 = ABSGAM
-            S2 = ABSALP
-            IF( S1.LE.S2 ) THEN
-               TMP = S1 / S2
-               SCL = SQRT( ONE+TMP*TMP )
-               SESTPR = S2*SCL
-               S = ( ALPHA / S2 ) / SCL
-               C = ( GAMMA / S2 ) / SCL
-            ELSE
-               TMP = S2 / S1
-               SCL = SQRT( ONE+TMP*TMP )
-               SESTPR = S1*SCL
-               S = ( ALPHA / S1 ) / SCL
-               C = ( GAMMA / S1 ) / SCL
-            END IF
-            RETURN
-         ELSE
-*
-*           normal case
-*
-            ZETA1 = ABSALP / ABSEST
-            ZETA2 = ABSGAM / ABSEST
-*
-            B = ( ONE-ZETA1*ZETA1-ZETA2*ZETA2 )*HALF
-            C = ZETA1*ZETA1
-            IF( B.GT.ZERO ) THEN
-               T = C / ( B+SQRT( B*B+C ) )
-            ELSE
-               T = SQRT( B*B+C ) - B
-            END IF
-*
-            SINE = -( ALPHA / ABSEST ) / T
-            COSINE = -( GAMMA / ABSEST ) / ( ONE+T )
-            TMP = SQRT( SINE*CONJG( SINE )+COSINE*CONJG( COSINE ) )
-            S = SINE / TMP
-            C = COSINE / TMP
-            SESTPR = SQRT( T+ONE )*ABSEST
-            RETURN
-         END IF
-*
-      ELSE IF( JOB.EQ.2 ) THEN
-*
-*        Estimating smallest singular value
-*
-*        special cases
-*
-         IF( SEST.EQ.ZERO ) THEN
-            SESTPR = ZERO
-            IF( MAX( ABSGAM, ABSALP ).EQ.ZERO ) THEN
-               SINE = ONE
-               COSINE = ZERO
-            ELSE
-               SINE = -CONJG( GAMMA )
-               COSINE = CONJG( ALPHA )
-            END IF
-            S1 = MAX( ABS( SINE ), ABS( COSINE ) )
-            S = SINE / S1
-            C = COSINE / S1
-            TMP = SQRT( S*CONJG( S )+C*CONJG( C ) )
-            S = S / TMP
-            C = C / TMP
-            RETURN
-         ELSE IF( ABSGAM.LE.EPS*ABSEST ) THEN
-            S = ZERO
-            C = ONE
-            SESTPR = ABSGAM
-            RETURN
-         ELSE IF( ABSALP.LE.EPS*ABSEST ) THEN
-            S1 = ABSGAM
-            S2 = ABSEST
-            IF( S1.LE.S2 ) THEN
-               S = ZERO
-               C = ONE
-               SESTPR = S1
-            ELSE
-               S = ONE
-               C = ZERO
-               SESTPR = S2
-            END IF
-            RETURN
-         ELSE IF( ABSEST.LE.EPS*ABSALP .OR. ABSEST.LE.EPS*ABSGAM ) THEN
-            S1 = ABSGAM
-            S2 = ABSALP
-            IF( S1.LE.S2 ) THEN
-               TMP = S1 / S2
-               SCL = SQRT( ONE+TMP*TMP )
-               SESTPR = ABSEST*( TMP / SCL )
-               S = -( CONJG( GAMMA ) / S2 ) / SCL
-               C = ( CONJG( ALPHA ) / S2 ) / SCL
-            ELSE
-               TMP = S2 / S1
-               SCL = SQRT( ONE+TMP*TMP )
-               SESTPR = ABSEST / SCL
-               S = -( CONJG( GAMMA ) / S1 ) / SCL
-               C = ( CONJG( ALPHA ) / S1 ) / SCL
-            END IF
-            RETURN
-         ELSE
-*
-*           normal case
-*
-            ZETA1 = ABSALP / ABSEST
-            ZETA2 = ABSGAM / ABSEST
-*
-            NORMA = MAX( ONE+ZETA1*ZETA1+ZETA1*ZETA2,
-     $              ZETA1*ZETA2+ZETA2*ZETA2 )
-*
-*           See if root is closer to zero or to ONE
-*
-            TEST = ONE + TWO*( ZETA1-ZETA2 )*( ZETA1+ZETA2 )
-            IF( TEST.GE.ZERO ) THEN
-*
-*              root is close to zero, compute directly
-*
-               B = ( ZETA1*ZETA1+ZETA2*ZETA2+ONE )*HALF
-               C = ZETA2*ZETA2
-               T = C / ( B+SQRT( ABS( B*B-C ) ) )
-               SINE = ( ALPHA / ABSEST ) / ( ONE-T )
-               COSINE = -( GAMMA / ABSEST ) / T
-               SESTPR = SQRT( T+FOUR*EPS*EPS*NORMA )*ABSEST
-            ELSE
-*
-*              root is closer to ONE, shift by that amount
-*
-               B = ( ZETA2*ZETA2+ZETA1*ZETA1-ONE )*HALF
-               C = ZETA1*ZETA1
-               IF( B.GE.ZERO ) THEN
-                  T = -C / ( B+SQRT( B*B+C ) )
-               ELSE
-                  T = B - SQRT( B*B+C )
-               END IF
-               SINE = -( ALPHA / ABSEST ) / T
-               COSINE = -( GAMMA / ABSEST ) / ( ONE+T )
-               SESTPR = SQRT( ONE+T+FOUR*EPS*EPS*NORMA )*ABSEST
-            END IF
-            TMP = SQRT( SINE*CONJG( SINE )+COSINE*CONJG( COSINE ) )
-            S = SINE / TMP
-            C = COSINE / TMP
-            RETURN
-*
-         END IF
-      END IF
-      RETURN
-*
-*     End of CLAIC1
-*
-      END
--- a/libcruft/lapack/clals0.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,433 +0,0 @@
-      SUBROUTINE CLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B, LDB, BX, LDBX,
-     $                   PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM,
-     $                   POLES, DIFL, DIFR, Z, K, C, S, RWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            GIVPTR, ICOMPQ, INFO, K, LDB, LDBX, LDGCOL,
-     $                   LDGNUM, NL, NR, NRHS, SQRE
-      REAL               C, S
-*     ..
-*     .. Array Arguments ..
-      INTEGER            GIVCOL( LDGCOL, * ), PERM( * )
-      REAL               DIFL( * ), DIFR( LDGNUM, * ),
-     $                   GIVNUM( LDGNUM, * ), POLES( LDGNUM, * ),
-     $                   RWORK( * ), Z( * )
-      COMPLEX            B( LDB, * ), BX( LDBX, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLALS0 applies back the multiplying factors of either the left or the
-*  right singular vector matrix of a diagonal matrix appended by a row
-*  to the right hand side matrix B in solving the least squares problem
-*  using the divide-and-conquer SVD approach.
-*
-*  For the left singular vector matrix, three types of orthogonal
-*  matrices are involved:
-*
-*  (1L) Givens rotations: the number of such rotations is GIVPTR; the
-*       pairs of columns/rows they were applied to are stored in GIVCOL;
-*       and the C- and S-values of these rotations are stored in GIVNUM.
-*
-*  (2L) Permutation. The (NL+1)-st row of B is to be moved to the first
-*       row, and for J=2:N, PERM(J)-th row of B is to be moved to the
-*       J-th row.
-*
-*  (3L) The left singular vector matrix of the remaining matrix.
-*
-*  For the right singular vector matrix, four types of orthogonal
-*  matrices are involved:
-*
-*  (1R) The right singular vector matrix of the remaining matrix.
-*
-*  (2R) If SQRE = 1, one extra Givens rotation to generate the right
-*       null space.
-*
-*  (3R) The inverse transformation of (2L).
-*
-*  (4R) The inverse transformation of (1L).
-*
-*  Arguments
-*  =========
-*
-*  ICOMPQ (input) INTEGER
-*         Specifies whether singular vectors are to be computed in
-*         factored form:
-*         = 0: Left singular vector matrix.
-*         = 1: Right singular vector matrix.
-*
-*  NL     (input) INTEGER
-*         The row dimension of the upper block. NL >= 1.
-*
-*  NR     (input) INTEGER
-*         The row dimension of the lower block. NR >= 1.
-*
-*  SQRE   (input) INTEGER
-*         = 0: the lower block is an NR-by-NR square matrix.
-*         = 1: the lower block is an NR-by-(NR+1) rectangular matrix.
-*
-*         The bidiagonal matrix has row dimension N = NL + NR + 1,
-*         and column dimension M = N + SQRE.
-*
-*  NRHS   (input) INTEGER
-*         The number of columns of B and BX. NRHS must be at least 1.
-*
-*  B      (input/output) COMPLEX array, dimension ( LDB, NRHS )
-*         On input, B contains the right hand sides of the least
-*         squares problem in rows 1 through M. On output, B contains
-*         the solution X in rows 1 through N.
-*
-*  LDB    (input) INTEGER
-*         The leading dimension of B. LDB must be at least
-*         max(1,MAX( M, N ) ).
-*
-*  BX     (workspace) COMPLEX array, dimension ( LDBX, NRHS )
-*
-*  LDBX   (input) INTEGER
-*         The leading dimension of BX.
-*
-*  PERM   (input) INTEGER array, dimension ( N )
-*         The permutations (from deflation and sorting) applied
-*         to the two blocks.
-*
-*  GIVPTR (input) INTEGER
-*         The number of Givens rotations which took place in this
-*         subproblem.
-*
-*  GIVCOL (input) INTEGER array, dimension ( LDGCOL, 2 )
-*         Each pair of numbers indicates a pair of rows/columns
-*         involved in a Givens rotation.
-*
-*  LDGCOL (input) INTEGER
-*         The leading dimension of GIVCOL, must be at least N.
-*
-*  GIVNUM (input) REAL array, dimension ( LDGNUM, 2 )
-*         Each number indicates the C or S value used in the
-*         corresponding Givens rotation.
-*
-*  LDGNUM (input) INTEGER
-*         The leading dimension of arrays DIFR, POLES and
-*         GIVNUM, must be at least K.
-*
-*  POLES  (input) REAL array, dimension ( LDGNUM, 2 )
-*         On entry, POLES(1:K, 1) contains the new singular
-*         values obtained from solving the secular equation, and
-*         POLES(1:K, 2) is an array containing the poles in the secular
-*         equation.
-*
-*  DIFL   (input) REAL array, dimension ( K ).
-*         On entry, DIFL(I) is the distance between I-th updated
-*         (undeflated) singular value and the I-th (undeflated) old
-*         singular value.
-*
-*  DIFR   (input) REAL array, dimension ( LDGNUM, 2 ).
-*         On entry, DIFR(I, 1) contains the distances between I-th
-*         updated (undeflated) singular value and the I+1-th
-*         (undeflated) old singular value. And DIFR(I, 2) is the
-*         normalizing factor for the I-th right singular vector.
-*
-*  Z      (input) REAL array, dimension ( K )
-*         Contain the components of the deflation-adjusted updating row
-*         vector.
-*
-*  K      (input) INTEGER
-*         Contains the dimension of the non-deflated matrix,
-*         This is the order of the related secular equation. 1 <= K <=N.
-*
-*  C      (input) REAL
-*         C contains garbage if SQRE =0 and the C-value of a Givens
-*         rotation related to the right null space if SQRE = 1.
-*
-*  S      (input) REAL
-*         S contains garbage if SQRE =0 and the S-value of a Givens
-*         rotation related to the right null space if SQRE = 1.
-*
-*  RWORK  (workspace) REAL array, dimension
-*         ( K*(1+NRHS) + 2*NRHS )
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Ren-Cang Li, Computer Science Division, University of
-*       California at Berkeley, USA
-*     Osni Marques, LBNL/NERSC, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO, NEGONE
-      PARAMETER          ( ONE = 1.0E0, ZERO = 0.0E0, NEGONE = -1.0E0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J, JCOL, JROW, M, N, NLP1
-      REAL               DIFLJ, DIFRJ, DJ, DSIGJ, DSIGJP, TEMP
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CCOPY, CLACPY, CLASCL, CSROT, CSSCAL, SGEMV,
-     $                   XERBLA
-*     ..
-*     .. External Functions ..
-      REAL               SLAMC3, SNRM2
-      EXTERNAL           SLAMC3, SNRM2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          AIMAG, CMPLX, MAX, REAL
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN
-         INFO = -1
-      ELSE IF( NL.LT.1 ) THEN
-         INFO = -2
-      ELSE IF( NR.LT.1 ) THEN
-         INFO = -3
-      ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN
-         INFO = -4
-      END IF
-*
-      N = NL + NR + 1
-*
-      IF( NRHS.LT.1 ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.N ) THEN
-         INFO = -7
-      ELSE IF( LDBX.LT.N ) THEN
-         INFO = -9
-      ELSE IF( GIVPTR.LT.0 ) THEN
-         INFO = -11
-      ELSE IF( LDGCOL.LT.N ) THEN
-         INFO = -13
-      ELSE IF( LDGNUM.LT.N ) THEN
-         INFO = -15
-      ELSE IF( K.LT.1 ) THEN
-         INFO = -20
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CLALS0', -INFO )
-         RETURN
-      END IF
-*
-      M = N + SQRE
-      NLP1 = NL + 1
-*
-      IF( ICOMPQ.EQ.0 ) THEN
-*
-*        Apply back orthogonal transformations from the left.
-*
-*        Step (1L): apply back the Givens rotations performed.
-*
-         DO 10 I = 1, GIVPTR
-            CALL CSROT( NRHS, B( GIVCOL( I, 2 ), 1 ), LDB,
-     $                  B( GIVCOL( I, 1 ), 1 ), LDB, GIVNUM( I, 2 ),
-     $                  GIVNUM( I, 1 ) )
-   10    CONTINUE
-*
-*        Step (2L): permute rows of B.
-*
-         CALL CCOPY( NRHS, B( NLP1, 1 ), LDB, BX( 1, 1 ), LDBX )
-         DO 20 I = 2, N
-            CALL CCOPY( NRHS, B( PERM( I ), 1 ), LDB, BX( I, 1 ), LDBX )
-   20    CONTINUE
-*
-*        Step (3L): apply the inverse of the left singular vector
-*        matrix to BX.
-*
-         IF( K.EQ.1 ) THEN
-            CALL CCOPY( NRHS, BX, LDBX, B, LDB )
-            IF( Z( 1 ).LT.ZERO ) THEN
-               CALL CSSCAL( NRHS, NEGONE, B, LDB )
-            END IF
-         ELSE
-            DO 100 J = 1, K
-               DIFLJ = DIFL( J )
-               DJ = POLES( J, 1 )
-               DSIGJ = -POLES( J, 2 )
-               IF( J.LT.K ) THEN
-                  DIFRJ = -DIFR( J, 1 )
-                  DSIGJP = -POLES( J+1, 2 )
-               END IF
-               IF( ( Z( J ).EQ.ZERO ) .OR. ( POLES( J, 2 ).EQ.ZERO ) )
-     $              THEN
-                  RWORK( J ) = ZERO
-               ELSE
-                  RWORK( J ) = -POLES( J, 2 )*Z( J ) / DIFLJ /
-     $                         ( POLES( J, 2 )+DJ )
-               END IF
-               DO 30 I = 1, J - 1
-                  IF( ( Z( I ).EQ.ZERO ) .OR.
-     $                ( POLES( I, 2 ).EQ.ZERO ) ) THEN
-                     RWORK( I ) = ZERO
-                  ELSE
-                     RWORK( I ) = POLES( I, 2 )*Z( I ) /
-     $                            ( SLAMC3( POLES( I, 2 ), DSIGJ )-
-     $                            DIFLJ ) / ( POLES( I, 2 )+DJ )
-                  END IF
-   30          CONTINUE
-               DO 40 I = J + 1, K
-                  IF( ( Z( I ).EQ.ZERO ) .OR.
-     $                ( POLES( I, 2 ).EQ.ZERO ) ) THEN
-                     RWORK( I ) = ZERO
-                  ELSE
-                     RWORK( I ) = POLES( I, 2 )*Z( I ) /
-     $                            ( SLAMC3( POLES( I, 2 ), DSIGJP )+
-     $                            DIFRJ ) / ( POLES( I, 2 )+DJ )
-                  END IF
-   40          CONTINUE
-               RWORK( 1 ) = NEGONE
-               TEMP = SNRM2( K, RWORK, 1 )
-*
-*              Since B and BX are complex, the following call to SGEMV
-*              is performed in two steps (real and imaginary parts).
-*
-*              CALL SGEMV( 'T', K, NRHS, ONE, BX, LDBX, WORK, 1, ZERO,
-*    $                     B( J, 1 ), LDB )
-*
-               I = K + NRHS*2
-               DO 60 JCOL = 1, NRHS
-                  DO 50 JROW = 1, K
-                     I = I + 1
-                     RWORK( I ) = REAL( BX( JROW, JCOL ) )
-   50             CONTINUE
-   60          CONTINUE
-               CALL SGEMV( 'T', K, NRHS, ONE, RWORK( 1+K+NRHS*2 ), K,
-     $                     RWORK( 1 ), 1, ZERO, RWORK( 1+K ), 1 )
-               I = K + NRHS*2
-               DO 80 JCOL = 1, NRHS
-                  DO 70 JROW = 1, K
-                     I = I + 1
-                     RWORK( I ) = AIMAG( BX( JROW, JCOL ) )
-   70             CONTINUE
-   80          CONTINUE
-               CALL SGEMV( 'T', K, NRHS, ONE, RWORK( 1+K+NRHS*2 ), K,
-     $                     RWORK( 1 ), 1, ZERO, RWORK( 1+K+NRHS ), 1 )
-               DO 90 JCOL = 1, NRHS
-                  B( J, JCOL ) = CMPLX( RWORK( JCOL+K ),
-     $                           RWORK( JCOL+K+NRHS ) )
-   90          CONTINUE
-               CALL CLASCL( 'G', 0, 0, TEMP, ONE, 1, NRHS, B( J, 1 ),
-     $                      LDB, INFO )
-  100       CONTINUE
-         END IF
-*
-*        Move the deflated rows of BX to B also.
-*
-         IF( K.LT.MAX( M, N ) )
-     $      CALL CLACPY( 'A', N-K, NRHS, BX( K+1, 1 ), LDBX,
-     $                   B( K+1, 1 ), LDB )
-      ELSE
-*
-*        Apply back the right orthogonal transformations.
-*
-*        Step (1R): apply back the new right singular vector matrix
-*        to B.
-*
-         IF( K.EQ.1 ) THEN
-            CALL CCOPY( NRHS, B, LDB, BX, LDBX )
-         ELSE
-            DO 180 J = 1, K
-               DSIGJ = POLES( J, 2 )
-               IF( Z( J ).EQ.ZERO ) THEN
-                  RWORK( J ) = ZERO
-               ELSE
-                  RWORK( J ) = -Z( J ) / DIFL( J ) /
-     $                         ( DSIGJ+POLES( J, 1 ) ) / DIFR( J, 2 )
-               END IF
-               DO 110 I = 1, J - 1
-                  IF( Z( J ).EQ.ZERO ) THEN
-                     RWORK( I ) = ZERO
-                  ELSE
-                     RWORK( I ) = Z( J ) / ( SLAMC3( DSIGJ, -POLES( I+1,
-     $                            2 ) )-DIFR( I, 1 ) ) /
-     $                            ( DSIGJ+POLES( I, 1 ) ) / DIFR( I, 2 )
-                  END IF
-  110          CONTINUE
-               DO 120 I = J + 1, K
-                  IF( Z( J ).EQ.ZERO ) THEN
-                     RWORK( I ) = ZERO
-                  ELSE
-                     RWORK( I ) = Z( J ) / ( SLAMC3( DSIGJ, -POLES( I,
-     $                            2 ) )-DIFL( I ) ) /
-     $                            ( DSIGJ+POLES( I, 1 ) ) / DIFR( I, 2 )
-                  END IF
-  120          CONTINUE
-*
-*              Since B and BX are complex, the following call to SGEMV
-*              is performed in two steps (real and imaginary parts).
-*
-*              CALL SGEMV( 'T', K, NRHS, ONE, B, LDB, WORK, 1, ZERO,
-*    $                     BX( J, 1 ), LDBX )
-*
-               I = K + NRHS*2
-               DO 140 JCOL = 1, NRHS
-                  DO 130 JROW = 1, K
-                     I = I + 1
-                     RWORK( I ) = REAL( B( JROW, JCOL ) )
-  130             CONTINUE
-  140          CONTINUE
-               CALL SGEMV( 'T', K, NRHS, ONE, RWORK( 1+K+NRHS*2 ), K,
-     $                     RWORK( 1 ), 1, ZERO, RWORK( 1+K ), 1 )
-               I = K + NRHS*2
-               DO 160 JCOL = 1, NRHS
-                  DO 150 JROW = 1, K
-                     I = I + 1
-                     RWORK( I ) = AIMAG( B( JROW, JCOL ) )
-  150             CONTINUE
-  160          CONTINUE
-               CALL SGEMV( 'T', K, NRHS, ONE, RWORK( 1+K+NRHS*2 ), K,
-     $                     RWORK( 1 ), 1, ZERO, RWORK( 1+K+NRHS ), 1 )
-               DO 170 JCOL = 1, NRHS
-                  BX( J, JCOL ) = CMPLX( RWORK( JCOL+K ),
-     $                            RWORK( JCOL+K+NRHS ) )
-  170          CONTINUE
-  180       CONTINUE
-         END IF
-*
-*        Step (2R): if SQRE = 1, apply back the rotation that is
-*        related to the right null space of the subproblem.
-*
-         IF( SQRE.EQ.1 ) THEN
-            CALL CCOPY( NRHS, B( M, 1 ), LDB, BX( M, 1 ), LDBX )
-            CALL CSROT( NRHS, BX( 1, 1 ), LDBX, BX( M, 1 ), LDBX, C, S )
-         END IF
-         IF( K.LT.MAX( M, N ) )
-     $      CALL CLACPY( 'A', N-K, NRHS, B( K+1, 1 ), LDB,
-     $                   BX( K+1, 1 ), LDBX )
-*
-*        Step (3R): permute rows of B.
-*
-         CALL CCOPY( NRHS, BX( 1, 1 ), LDBX, B( NLP1, 1 ), LDB )
-         IF( SQRE.EQ.1 ) THEN
-            CALL CCOPY( NRHS, BX( M, 1 ), LDBX, B( M, 1 ), LDB )
-         END IF
-         DO 190 I = 2, N
-            CALL CCOPY( NRHS, BX( I, 1 ), LDBX, B( PERM( I ), 1 ), LDB )
-  190    CONTINUE
-*
-*        Step (4R): apply back the Givens rotations performed.
-*
-         DO 200 I = GIVPTR, 1, -1
-            CALL CSROT( NRHS, B( GIVCOL( I, 2 ), 1 ), LDB,
-     $                  B( GIVCOL( I, 1 ), 1 ), LDB, GIVNUM( I, 2 ),
-     $                  -GIVNUM( I, 1 ) )
-  200    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of CLALS0
-*
-      END
--- a/libcruft/lapack/clalsa.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,503 +0,0 @@
-      SUBROUTINE CLALSA( ICOMPQ, SMLSIZ, N, NRHS, B, LDB, BX, LDBX, U,
-     $                   LDU, VT, K, DIFL, DIFR, Z, POLES, GIVPTR,
-     $                   GIVCOL, LDGCOL, PERM, GIVNUM, C, S, RWORK,
-     $                   IWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            ICOMPQ, INFO, LDB, LDBX, LDGCOL, LDU, N, NRHS,
-     $                   SMLSIZ
-*     ..
-*     .. Array Arguments ..
-      INTEGER            GIVCOL( LDGCOL, * ), GIVPTR( * ), IWORK( * ),
-     $                   K( * ), PERM( LDGCOL, * )
-      REAL               C( * ), DIFL( LDU, * ), DIFR( LDU, * ),
-     $                   GIVNUM( LDU, * ), POLES( LDU, * ), RWORK( * ),
-     $                   S( * ), U( LDU, * ), VT( LDU, * ), Z( LDU, * )
-      COMPLEX            B( LDB, * ), BX( LDBX, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLALSA is an itermediate step in solving the least squares problem
-*  by computing the SVD of the coefficient matrix in compact form (The
-*  singular vectors are computed as products of simple orthorgonal
-*  matrices.).
-*
-*  If ICOMPQ = 0, CLALSA applies the inverse of the left singular vector
-*  matrix of an upper bidiagonal matrix to the right hand side; and if
-*  ICOMPQ = 1, CLALSA applies the right singular vector matrix to the
-*  right hand side. The singular vector matrices were generated in
-*  compact form by CLALSA.
-*
-*  Arguments
-*  =========
-*
-*  ICOMPQ (input) INTEGER
-*         Specifies whether the left or the right singular vector
-*         matrix is involved.
-*         = 0: Left singular vector matrix
-*         = 1: Right singular vector matrix
-*
-*  SMLSIZ (input) INTEGER
-*         The maximum size of the subproblems at the bottom of the
-*         computation tree.
-*
-*  N      (input) INTEGER
-*         The row and column dimensions of the upper bidiagonal matrix.
-*
-*  NRHS   (input) INTEGER
-*         The number of columns of B and BX. NRHS must be at least 1.
-*
-*  B      (input/output) COMPLEX array, dimension ( LDB, NRHS )
-*         On input, B contains the right hand sides of the least
-*         squares problem in rows 1 through M.
-*         On output, B contains the solution X in rows 1 through N.
-*
-*  LDB    (input) INTEGER
-*         The leading dimension of B in the calling subprogram.
-*         LDB must be at least max(1,MAX( M, N ) ).
-*
-*  BX     (output) COMPLEX array, dimension ( LDBX, NRHS )
-*         On exit, the result of applying the left or right singular
-*         vector matrix to B.
-*
-*  LDBX   (input) INTEGER
-*         The leading dimension of BX.
-*
-*  U      (input) REAL array, dimension ( LDU, SMLSIZ ).
-*         On entry, U contains the left singular vector matrices of all
-*         subproblems at the bottom level.
-*
-*  LDU    (input) INTEGER, LDU = > N.
-*         The leading dimension of arrays U, VT, DIFL, DIFR,
-*         POLES, GIVNUM, and Z.
-*
-*  VT     (input) REAL array, dimension ( LDU, SMLSIZ+1 ).
-*         On entry, VT' contains the right singular vector matrices of
-*         all subproblems at the bottom level.
-*
-*  K      (input) INTEGER array, dimension ( N ).
-*
-*  DIFL   (input) REAL array, dimension ( LDU, NLVL ).
-*         where NLVL = INT(log_2 (N/(SMLSIZ+1))) + 1.
-*
-*  DIFR   (input) REAL array, dimension ( LDU, 2 * NLVL ).
-*         On entry, DIFL(*, I) and DIFR(*, 2 * I -1) record
-*         distances between singular values on the I-th level and
-*         singular values on the (I -1)-th level, and DIFR(*, 2 * I)
-*         record the normalizing factors of the right singular vectors
-*         matrices of subproblems on I-th level.
-*
-*  Z      (input) REAL array, dimension ( LDU, NLVL ).
-*         On entry, Z(1, I) contains the components of the deflation-
-*         adjusted updating row vector for subproblems on the I-th
-*         level.
-*
-*  POLES  (input) REAL array, dimension ( LDU, 2 * NLVL ).
-*         On entry, POLES(*, 2 * I -1: 2 * I) contains the new and old
-*         singular values involved in the secular equations on the I-th
-*         level.
-*
-*  GIVPTR (input) INTEGER array, dimension ( N ).
-*         On entry, GIVPTR( I ) records the number of Givens
-*         rotations performed on the I-th problem on the computation
-*         tree.
-*
-*  GIVCOL (input) INTEGER array, dimension ( LDGCOL, 2 * NLVL ).
-*         On entry, for each I, GIVCOL(*, 2 * I - 1: 2 * I) records the
-*         locations of Givens rotations performed on the I-th level on
-*         the computation tree.
-*
-*  LDGCOL (input) INTEGER, LDGCOL = > N.
-*         The leading dimension of arrays GIVCOL and PERM.
-*
-*  PERM   (input) INTEGER array, dimension ( LDGCOL, NLVL ).
-*         On entry, PERM(*, I) records permutations done on the I-th
-*         level of the computation tree.
-*
-*  GIVNUM (input) REAL array, dimension ( LDU, 2 * NLVL ).
-*         On entry, GIVNUM(*, 2 *I -1 : 2 * I) records the C- and S-
-*         values of Givens rotations performed on the I-th level on the
-*         computation tree.
-*
-*  C      (input) REAL array, dimension ( N ).
-*         On entry, if the I-th subproblem is not square,
-*         C( I ) contains the C-value of a Givens rotation related to
-*         the right null space of the I-th subproblem.
-*
-*  S      (input) REAL array, dimension ( N ).
-*         On entry, if the I-th subproblem is not square,
-*         S( I ) contains the S-value of a Givens rotation related to
-*         the right null space of the I-th subproblem.
-*
-*  RWORK  (workspace) REAL array, dimension at least
-*         max ( N, (SMLSZ+1)*NRHS*3 ).
-*
-*  IWORK  (workspace) INTEGER array.
-*         The dimension must be at least 3 * N
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Ren-Cang Li, Computer Science Division, University of
-*       California at Berkeley, USA
-*     Osni Marques, LBNL/NERSC, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I1, IC, IM1, INODE, J, JCOL, JIMAG, JREAL,
-     $                   JROW, LF, LL, LVL, LVL2, ND, NDB1, NDIML,
-     $                   NDIMR, NL, NLF, NLP1, NLVL, NR, NRF, NRP1, SQRE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CCOPY, CLALS0, SGEMM, SLASDT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          AIMAG, CMPLX, REAL
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN
-         INFO = -1
-      ELSE IF( SMLSIZ.LT.3 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.SMLSIZ ) THEN
-         INFO = -3
-      ELSE IF( NRHS.LT.1 ) THEN
-         INFO = -4
-      ELSE IF( LDB.LT.N ) THEN
-         INFO = -6
-      ELSE IF( LDBX.LT.N ) THEN
-         INFO = -8
-      ELSE IF( LDU.LT.N ) THEN
-         INFO = -10
-      ELSE IF( LDGCOL.LT.N ) THEN
-         INFO = -19
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CLALSA', -INFO )
-         RETURN
-      END IF
-*
-*     Book-keeping and  setting up the computation tree.
-*
-      INODE = 1
-      NDIML = INODE + N
-      NDIMR = NDIML + N
-*
-      CALL SLASDT( N, NLVL, ND, IWORK( INODE ), IWORK( NDIML ),
-     $             IWORK( NDIMR ), SMLSIZ )
-*
-*     The following code applies back the left singular vector factors.
-*     For applying back the right singular vector factors, go to 170.
-*
-      IF( ICOMPQ.EQ.1 ) THEN
-         GO TO 170
-      END IF
-*
-*     The nodes on the bottom level of the tree were solved
-*     by SLASDQ. The corresponding left and right singular vector
-*     matrices are in explicit form. First apply back the left
-*     singular vector matrices.
-*
-      NDB1 = ( ND+1 ) / 2
-      DO 130 I = NDB1, ND
-*
-*        IC : center row of each node
-*        NL : number of rows of left  subproblem
-*        NR : number of rows of right subproblem
-*        NLF: starting row of the left   subproblem
-*        NRF: starting row of the right  subproblem
-*
-         I1 = I - 1
-         IC = IWORK( INODE+I1 )
-         NL = IWORK( NDIML+I1 )
-         NR = IWORK( NDIMR+I1 )
-         NLF = IC - NL
-         NRF = IC + 1
-*
-*        Since B and BX are complex, the following call to SGEMM
-*        is performed in two steps (real and imaginary parts).
-*
-*        CALL SGEMM( 'T', 'N', NL, NRHS, NL, ONE, U( NLF, 1 ), LDU,
-*     $               B( NLF, 1 ), LDB, ZERO, BX( NLF, 1 ), LDBX )
-*
-         J = NL*NRHS*2
-         DO 20 JCOL = 1, NRHS
-            DO 10 JROW = NLF, NLF + NL - 1
-               J = J + 1
-               RWORK( J ) = REAL( B( JROW, JCOL ) )
-   10       CONTINUE
-   20    CONTINUE
-         CALL SGEMM( 'T', 'N', NL, NRHS, NL, ONE, U( NLF, 1 ), LDU,
-     $               RWORK( 1+NL*NRHS*2 ), NL, ZERO, RWORK( 1 ), NL )
-         J = NL*NRHS*2
-         DO 40 JCOL = 1, NRHS
-            DO 30 JROW = NLF, NLF + NL - 1
-               J = J + 1
-               RWORK( J ) = AIMAG( B( JROW, JCOL ) )
-   30       CONTINUE
-   40    CONTINUE
-         CALL SGEMM( 'T', 'N', NL, NRHS, NL, ONE, U( NLF, 1 ), LDU,
-     $               RWORK( 1+NL*NRHS*2 ), NL, ZERO, RWORK( 1+NL*NRHS ),
-     $               NL )
-         JREAL = 0
-         JIMAG = NL*NRHS
-         DO 60 JCOL = 1, NRHS
-            DO 50 JROW = NLF, NLF + NL - 1
-               JREAL = JREAL + 1
-               JIMAG = JIMAG + 1
-               BX( JROW, JCOL ) = CMPLX( RWORK( JREAL ),
-     $                            RWORK( JIMAG ) )
-   50       CONTINUE
-   60    CONTINUE
-*
-*        Since B and BX are complex, the following call to SGEMM
-*        is performed in two steps (real and imaginary parts).
-*
-*        CALL SGEMM( 'T', 'N', NR, NRHS, NR, ONE, U( NRF, 1 ), LDU,
-*    $               B( NRF, 1 ), LDB, ZERO, BX( NRF, 1 ), LDBX )
-*
-         J = NR*NRHS*2
-         DO 80 JCOL = 1, NRHS
-            DO 70 JROW = NRF, NRF + NR - 1
-               J = J + 1
-               RWORK( J ) = REAL( B( JROW, JCOL ) )
-   70       CONTINUE
-   80    CONTINUE
-         CALL SGEMM( 'T', 'N', NR, NRHS, NR, ONE, U( NRF, 1 ), LDU,
-     $               RWORK( 1+NR*NRHS*2 ), NR, ZERO, RWORK( 1 ), NR )
-         J = NR*NRHS*2
-         DO 100 JCOL = 1, NRHS
-            DO 90 JROW = NRF, NRF + NR - 1
-               J = J + 1
-               RWORK( J ) = AIMAG( B( JROW, JCOL ) )
-   90       CONTINUE
-  100    CONTINUE
-         CALL SGEMM( 'T', 'N', NR, NRHS, NR, ONE, U( NRF, 1 ), LDU,
-     $               RWORK( 1+NR*NRHS*2 ), NR, ZERO, RWORK( 1+NR*NRHS ),
-     $               NR )
-         JREAL = 0
-         JIMAG = NR*NRHS
-         DO 120 JCOL = 1, NRHS
-            DO 110 JROW = NRF, NRF + NR - 1
-               JREAL = JREAL + 1
-               JIMAG = JIMAG + 1
-               BX( JROW, JCOL ) = CMPLX( RWORK( JREAL ),
-     $                            RWORK( JIMAG ) )
-  110       CONTINUE
-  120    CONTINUE
-*
-  130 CONTINUE
-*
-*     Next copy the rows of B that correspond to unchanged rows
-*     in the bidiagonal matrix to BX.
-*
-      DO 140 I = 1, ND
-         IC = IWORK( INODE+I-1 )
-         CALL CCOPY( NRHS, B( IC, 1 ), LDB, BX( IC, 1 ), LDBX )
-  140 CONTINUE
-*
-*     Finally go through the left singular vector matrices of all
-*     the other subproblems bottom-up on the tree.
-*
-      J = 2**NLVL
-      SQRE = 0
-*
-      DO 160 LVL = NLVL, 1, -1
-         LVL2 = 2*LVL - 1
-*
-*        find the first node LF and last node LL on
-*        the current level LVL
-*
-         IF( LVL.EQ.1 ) THEN
-            LF = 1
-            LL = 1
-         ELSE
-            LF = 2**( LVL-1 )
-            LL = 2*LF - 1
-         END IF
-         DO 150 I = LF, LL
-            IM1 = I - 1
-            IC = IWORK( INODE+IM1 )
-            NL = IWORK( NDIML+IM1 )
-            NR = IWORK( NDIMR+IM1 )
-            NLF = IC - NL
-            NRF = IC + 1
-            J = J - 1
-            CALL CLALS0( ICOMPQ, NL, NR, SQRE, NRHS, BX( NLF, 1 ), LDBX,
-     $                   B( NLF, 1 ), LDB, PERM( NLF, LVL ),
-     $                   GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL,
-     $                   GIVNUM( NLF, LVL2 ), LDU, POLES( NLF, LVL2 ),
-     $                   DIFL( NLF, LVL ), DIFR( NLF, LVL2 ),
-     $                   Z( NLF, LVL ), K( J ), C( J ), S( J ), RWORK,
-     $                   INFO )
-  150    CONTINUE
-  160 CONTINUE
-      GO TO 330
-*
-*     ICOMPQ = 1: applying back the right singular vector factors.
-*
-  170 CONTINUE
-*
-*     First now go through the right singular vector matrices of all
-*     the tree nodes top-down.
-*
-      J = 0
-      DO 190 LVL = 1, NLVL
-         LVL2 = 2*LVL - 1
-*
-*        Find the first node LF and last node LL on
-*        the current level LVL.
-*
-         IF( LVL.EQ.1 ) THEN
-            LF = 1
-            LL = 1
-         ELSE
-            LF = 2**( LVL-1 )
-            LL = 2*LF - 1
-         END IF
-         DO 180 I = LL, LF, -1
-            IM1 = I - 1
-            IC = IWORK( INODE+IM1 )
-            NL = IWORK( NDIML+IM1 )
-            NR = IWORK( NDIMR+IM1 )
-            NLF = IC - NL
-            NRF = IC + 1
-            IF( I.EQ.LL ) THEN
-               SQRE = 0
-            ELSE
-               SQRE = 1
-            END IF
-            J = J + 1
-            CALL CLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B( NLF, 1 ), LDB,
-     $                   BX( NLF, 1 ), LDBX, PERM( NLF, LVL ),
-     $                   GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL,
-     $                   GIVNUM( NLF, LVL2 ), LDU, POLES( NLF, LVL2 ),
-     $                   DIFL( NLF, LVL ), DIFR( NLF, LVL2 ),
-     $                   Z( NLF, LVL ), K( J ), C( J ), S( J ), RWORK,
-     $                   INFO )
-  180    CONTINUE
-  190 CONTINUE
-*
-*     The nodes on the bottom level of the tree were solved
-*     by SLASDQ. The corresponding right singular vector
-*     matrices are in explicit form. Apply them back.
-*
-      NDB1 = ( ND+1 ) / 2
-      DO 320 I = NDB1, ND
-         I1 = I - 1
-         IC = IWORK( INODE+I1 )
-         NL = IWORK( NDIML+I1 )
-         NR = IWORK( NDIMR+I1 )
-         NLP1 = NL + 1
-         IF( I.EQ.ND ) THEN
-            NRP1 = NR
-         ELSE
-            NRP1 = NR + 1
-         END IF
-         NLF = IC - NL
-         NRF = IC + 1
-*
-*        Since B and BX are complex, the following call to SGEMM is
-*        performed in two steps (real and imaginary parts).
-*
-*        CALL SGEMM( 'T', 'N', NLP1, NRHS, NLP1, ONE, VT( NLF, 1 ), LDU,
-*    $               B( NLF, 1 ), LDB, ZERO, BX( NLF, 1 ), LDBX )
-*
-         J = NLP1*NRHS*2
-         DO 210 JCOL = 1, NRHS
-            DO 200 JROW = NLF, NLF + NLP1 - 1
-               J = J + 1
-               RWORK( J ) = REAL( B( JROW, JCOL ) )
-  200       CONTINUE
-  210    CONTINUE
-         CALL SGEMM( 'T', 'N', NLP1, NRHS, NLP1, ONE, VT( NLF, 1 ), LDU,
-     $               RWORK( 1+NLP1*NRHS*2 ), NLP1, ZERO, RWORK( 1 ),
-     $               NLP1 )
-         J = NLP1*NRHS*2
-         DO 230 JCOL = 1, NRHS
-            DO 220 JROW = NLF, NLF + NLP1 - 1
-               J = J + 1
-               RWORK( J ) = AIMAG( B( JROW, JCOL ) )
-  220       CONTINUE
-  230    CONTINUE
-         CALL SGEMM( 'T', 'N', NLP1, NRHS, NLP1, ONE, VT( NLF, 1 ), LDU,
-     $               RWORK( 1+NLP1*NRHS*2 ), NLP1, ZERO,
-     $               RWORK( 1+NLP1*NRHS ), NLP1 )
-         JREAL = 0
-         JIMAG = NLP1*NRHS
-         DO 250 JCOL = 1, NRHS
-            DO 240 JROW = NLF, NLF + NLP1 - 1
-               JREAL = JREAL + 1
-               JIMAG = JIMAG + 1
-               BX( JROW, JCOL ) = CMPLX( RWORK( JREAL ),
-     $                            RWORK( JIMAG ) )
-  240       CONTINUE
-  250    CONTINUE
-*
-*        Since B and BX are complex, the following call to SGEMM is
-*        performed in two steps (real and imaginary parts).
-*
-*        CALL SGEMM( 'T', 'N', NRP1, NRHS, NRP1, ONE, VT( NRF, 1 ), LDU,
-*    $               B( NRF, 1 ), LDB, ZERO, BX( NRF, 1 ), LDBX )
-*
-         J = NRP1*NRHS*2
-         DO 270 JCOL = 1, NRHS
-            DO 260 JROW = NRF, NRF + NRP1 - 1
-               J = J + 1
-               RWORK( J ) = REAL( B( JROW, JCOL ) )
-  260       CONTINUE
-  270    CONTINUE
-         CALL SGEMM( 'T', 'N', NRP1, NRHS, NRP1, ONE, VT( NRF, 1 ), LDU,
-     $               RWORK( 1+NRP1*NRHS*2 ), NRP1, ZERO, RWORK( 1 ),
-     $               NRP1 )
-         J = NRP1*NRHS*2
-         DO 290 JCOL = 1, NRHS
-            DO 280 JROW = NRF, NRF + NRP1 - 1
-               J = J + 1
-               RWORK( J ) = AIMAG( B( JROW, JCOL ) )
-  280       CONTINUE
-  290    CONTINUE
-         CALL SGEMM( 'T', 'N', NRP1, NRHS, NRP1, ONE, VT( NRF, 1 ), LDU,
-     $               RWORK( 1+NRP1*NRHS*2 ), NRP1, ZERO,
-     $               RWORK( 1+NRP1*NRHS ), NRP1 )
-         JREAL = 0
-         JIMAG = NRP1*NRHS
-         DO 310 JCOL = 1, NRHS
-            DO 300 JROW = NRF, NRF + NRP1 - 1
-               JREAL = JREAL + 1
-               JIMAG = JIMAG + 1
-               BX( JROW, JCOL ) = CMPLX( RWORK( JREAL ),
-     $                            RWORK( JIMAG ) )
-  300       CONTINUE
-  310    CONTINUE
-*
-  320 CONTINUE
-*
-  330 CONTINUE
-*
-      RETURN
-*
-*     End of CLALSA
-*
-      END
--- a/libcruft/lapack/clalsd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,596 +0,0 @@
-      SUBROUTINE CLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND,
-     $                   RANK, WORK, RWORK, IWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDB, N, NRHS, RANK, SMLSIZ
-      REAL               RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      REAL               D( * ), E( * ), RWORK( * )
-      COMPLEX            B( LDB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLALSD uses the singular value decomposition of A to solve the least
-*  squares problem of finding X to minimize the Euclidean norm of each
-*  column of A*X-B, where A is N-by-N upper bidiagonal, and X and B
-*  are N-by-NRHS. The solution X overwrites B.
-*
-*  The singular values of A smaller than RCOND times the largest
-*  singular value are treated as zero in solving the least squares
-*  problem; in this case a minimum norm solution is returned.
-*  The actual singular values are returned in D in ascending order.
-*
-*  This code makes very mild assumptions about floating point
-*  arithmetic. It will work on machines with a guard digit in
-*  add/subtract, or on those binary machines without guard digits
-*  which subtract like the Cray XMP, Cray YMP, Cray C 90, or Cray 2.
-*  It could conceivably fail on hexadecimal or decimal machines
-*  without guard digits, but we know of none.
-*
-*  Arguments
-*  =========
-*
-*  UPLO   (input) CHARACTER*1
-*         = 'U': D and E define an upper bidiagonal matrix.
-*         = 'L': D and E define a  lower bidiagonal matrix.
-*
-*  SMLSIZ (input) INTEGER
-*         The maximum size of the subproblems at the bottom of the
-*         computation tree.
-*
-*  N      (input) INTEGER
-*         The dimension of the  bidiagonal matrix.  N >= 0.
-*
-*  NRHS   (input) INTEGER
-*         The number of columns of B. NRHS must be at least 1.
-*
-*  D      (input/output) REAL array, dimension (N)
-*         On entry D contains the main diagonal of the bidiagonal
-*         matrix. On exit, if INFO = 0, D contains its singular values.
-*
-*  E      (input/output) REAL array, dimension (N-1)
-*         Contains the super-diagonal entries of the bidiagonal matrix.
-*         On exit, E has been destroyed.
-*
-*  B      (input/output) COMPLEX array, dimension (LDB,NRHS)
-*         On input, B contains the right hand sides of the least
-*         squares problem. On output, B contains the solution X.
-*
-*  LDB    (input) INTEGER
-*         The leading dimension of B in the calling subprogram.
-*         LDB must be at least max(1,N).
-*
-*  RCOND  (input) REAL
-*         The singular values of A less than or equal to RCOND times
-*         the largest singular value are treated as zero in solving
-*         the least squares problem. If RCOND is negative,
-*         machine precision is used instead.
-*         For example, if diag(S)*X=B were the least squares problem,
-*         where diag(S) is a diagonal matrix of singular values, the
-*         solution would be X(i) = B(i) / S(i) if S(i) is greater than
-*         RCOND*max(S), and X(i) = 0 if S(i) is less than or equal to
-*         RCOND*max(S).
-*
-*  RANK   (output) INTEGER
-*         The number of singular values of A greater than RCOND times
-*         the largest singular value.
-*
-*  WORK   (workspace) COMPLEX array, dimension (N * NRHS).
-*
-*  RWORK  (workspace) REAL array, dimension at least
-*         (9*N + 2*N*SMLSIZ + 8*N*NLVL + 3*SMLSIZ*NRHS + (SMLSIZ+1)**2),
-*         where
-*         NLVL = MAX( 0, INT( LOG_2( MIN( M,N )/(SMLSIZ+1) ) ) + 1 )
-*
-*  IWORK  (workspace) INTEGER array, dimension (3*N*NLVL + 11*N).
-*
-*  INFO   (output) INTEGER
-*         = 0:  successful exit.
-*         < 0:  if INFO = -i, the i-th argument had an illegal value.
-*         > 0:  The algorithm failed to compute an singular value while
-*               working on the submatrix lying in rows and columns
-*               INFO/(N+1) through MOD(INFO,N+1).
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Ren-Cang Li, Computer Science Division, University of
-*       California at Berkeley, USA
-*     Osni Marques, LBNL/NERSC, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0 )
-      COMPLEX            CZERO
-      PARAMETER          ( CZERO = ( 0.0E0, 0.0E0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            BX, BXST, C, DIFL, DIFR, GIVCOL, GIVNUM,
-     $                   GIVPTR, I, ICMPQ1, ICMPQ2, IRWB, IRWIB, IRWRB,
-     $                   IRWU, IRWVT, IRWWRK, IWK, J, JCOL, JIMAG,
-     $                   JREAL, JROW, K, NLVL, NM1, NRWORK, NSIZE, NSUB,
-     $                   PERM, POLES, S, SIZEI, SMLSZP, SQRE, ST, ST1,
-     $                   U, VT, Z
-      REAL               CS, EPS, ORGNRM, R, RCND, SN, TOL
-*     ..
-*     .. External Functions ..
-      INTEGER            ISAMAX
-      REAL               SLAMCH, SLANST
-      EXTERNAL           ISAMAX, SLAMCH, SLANST
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CCOPY, CLACPY, CLALSA, CLASCL, CLASET, CSROT,
-     $                   SGEMM, SLARTG, SLASCL, SLASDA, SLASDQ, SLASET,
-     $                   SLASRT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, CMPLX, INT, LOG, REAL, SIGN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( NRHS.LT.1 ) THEN
-         INFO = -4
-      ELSE IF( ( LDB.LT.1 ) .OR. ( LDB.LT.N ) ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CLALSD', -INFO )
-         RETURN
-      END IF
-*
-      EPS = SLAMCH( 'Epsilon' )
-*
-*     Set up the tolerance.
-*
-      IF( ( RCOND.LE.ZERO ) .OR. ( RCOND.GE.ONE ) ) THEN
-         RCND = EPS
-      ELSE
-         RCND = RCOND
-      END IF
-*
-      RANK = 0
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 ) THEN
-         RETURN
-      ELSE IF( N.EQ.1 ) THEN
-         IF( D( 1 ).EQ.ZERO ) THEN
-            CALL CLASET( 'A', 1, NRHS, CZERO, CZERO, B, LDB )
-         ELSE
-            RANK = 1
-            CALL CLASCL( 'G', 0, 0, D( 1 ), ONE, 1, NRHS, B, LDB, INFO )
-            D( 1 ) = ABS( D( 1 ) )
-         END IF
-         RETURN
-      END IF
-*
-*     Rotate the matrix if it is lower bidiagonal.
-*
-      IF( UPLO.EQ.'L' ) THEN
-         DO 10 I = 1, N - 1
-            CALL SLARTG( D( I ), E( I ), CS, SN, R )
-            D( I ) = R
-            E( I ) = SN*D( I+1 )
-            D( I+1 ) = CS*D( I+1 )
-            IF( NRHS.EQ.1 ) THEN
-               CALL CSROT( 1, B( I, 1 ), 1, B( I+1, 1 ), 1, CS, SN )
-            ELSE
-               RWORK( I*2-1 ) = CS
-               RWORK( I*2 ) = SN
-            END IF
-   10    CONTINUE
-         IF( NRHS.GT.1 ) THEN
-            DO 30 I = 1, NRHS
-               DO 20 J = 1, N - 1
-                  CS = RWORK( J*2-1 )
-                  SN = RWORK( J*2 )
-                  CALL CSROT( 1, B( J, I ), 1, B( J+1, I ), 1, CS, SN )
-   20          CONTINUE
-   30       CONTINUE
-         END IF
-      END IF
-*
-*     Scale.
-*
-      NM1 = N - 1
-      ORGNRM = SLANST( 'M', N, D, E )
-      IF( ORGNRM.EQ.ZERO ) THEN
-         CALL CLASET( 'A', N, NRHS, CZERO, CZERO, B, LDB )
-         RETURN
-      END IF
-*
-      CALL SLASCL( 'G', 0, 0, ORGNRM, ONE, N, 1, D, N, INFO )
-      CALL SLASCL( 'G', 0, 0, ORGNRM, ONE, NM1, 1, E, NM1, INFO )
-*
-*     If N is smaller than the minimum divide size SMLSIZ, then solve
-*     the problem with another solver.
-*
-      IF( N.LE.SMLSIZ ) THEN
-         IRWU = 1
-         IRWVT = IRWU + N*N
-         IRWWRK = IRWVT + N*N
-         IRWRB = IRWWRK
-         IRWIB = IRWRB + N*NRHS
-         IRWB = IRWIB + N*NRHS
-         CALL SLASET( 'A', N, N, ZERO, ONE, RWORK( IRWU ), N )
-         CALL SLASET( 'A', N, N, ZERO, ONE, RWORK( IRWVT ), N )
-         CALL SLASDQ( 'U', 0, N, N, N, 0, D, E, RWORK( IRWVT ), N,
-     $                RWORK( IRWU ), N, RWORK( IRWWRK ), 1,
-     $                RWORK( IRWWRK ), INFO )
-         IF( INFO.NE.0 ) THEN
-            RETURN
-         END IF
-*
-*        In the real version, B is passed to SLASDQ and multiplied
-*        internally by Q'. Here B is complex and that product is
-*        computed below in two steps (real and imaginary parts).
-*
-         J = IRWB - 1
-         DO 50 JCOL = 1, NRHS
-            DO 40 JROW = 1, N
-               J = J + 1
-               RWORK( J ) = REAL( B( JROW, JCOL ) )
-   40       CONTINUE
-   50    CONTINUE
-         CALL SGEMM( 'T', 'N', N, NRHS, N, ONE, RWORK( IRWU ), N,
-     $               RWORK( IRWB ), N, ZERO, RWORK( IRWRB ), N )
-         J = IRWB - 1
-         DO 70 JCOL = 1, NRHS
-            DO 60 JROW = 1, N
-               J = J + 1
-               RWORK( J ) = AIMAG( B( JROW, JCOL ) )
-   60       CONTINUE
-   70    CONTINUE
-         CALL SGEMM( 'T', 'N', N, NRHS, N, ONE, RWORK( IRWU ), N,
-     $               RWORK( IRWB ), N, ZERO, RWORK( IRWIB ), N )
-         JREAL = IRWRB - 1
-         JIMAG = IRWIB - 1
-         DO 90 JCOL = 1, NRHS
-            DO 80 JROW = 1, N
-               JREAL = JREAL + 1
-               JIMAG = JIMAG + 1
-               B( JROW, JCOL ) = CMPLX( RWORK( JREAL ), RWORK( JIMAG ) )
-   80       CONTINUE
-   90    CONTINUE
-*
-         TOL = RCND*ABS( D( ISAMAX( N, D, 1 ) ) )
-         DO 100 I = 1, N
-            IF( D( I ).LE.TOL ) THEN
-               CALL CLASET( 'A', 1, NRHS, CZERO, CZERO, B( I, 1 ), LDB )
-            ELSE
-               CALL CLASCL( 'G', 0, 0, D( I ), ONE, 1, NRHS, B( I, 1 ),
-     $                      LDB, INFO )
-               RANK = RANK + 1
-            END IF
-  100    CONTINUE
-*
-*        Since B is complex, the following call to SGEMM is performed
-*        in two steps (real and imaginary parts). That is for V * B
-*        (in the real version of the code V' is stored in WORK).
-*
-*        CALL SGEMM( 'T', 'N', N, NRHS, N, ONE, WORK, N, B, LDB, ZERO,
-*    $               WORK( NWORK ), N )
-*
-         J = IRWB - 1
-         DO 120 JCOL = 1, NRHS
-            DO 110 JROW = 1, N
-               J = J + 1
-               RWORK( J ) = REAL( B( JROW, JCOL ) )
-  110       CONTINUE
-  120    CONTINUE
-         CALL SGEMM( 'T', 'N', N, NRHS, N, ONE, RWORK( IRWVT ), N,
-     $               RWORK( IRWB ), N, ZERO, RWORK( IRWRB ), N )
-         J = IRWB - 1
-         DO 140 JCOL = 1, NRHS
-            DO 130 JROW = 1, N
-               J = J + 1
-               RWORK( J ) = AIMAG( B( JROW, JCOL ) )
-  130       CONTINUE
-  140    CONTINUE
-         CALL SGEMM( 'T', 'N', N, NRHS, N, ONE, RWORK( IRWVT ), N,
-     $               RWORK( IRWB ), N, ZERO, RWORK( IRWIB ), N )
-         JREAL = IRWRB - 1
-         JIMAG = IRWIB - 1
-         DO 160 JCOL = 1, NRHS
-            DO 150 JROW = 1, N
-               JREAL = JREAL + 1
-               JIMAG = JIMAG + 1
-               B( JROW, JCOL ) = CMPLX( RWORK( JREAL ), RWORK( JIMAG ) )
-  150       CONTINUE
-  160    CONTINUE
-*
-*        Unscale.
-*
-         CALL SLASCL( 'G', 0, 0, ONE, ORGNRM, N, 1, D, N, INFO )
-         CALL SLASRT( 'D', N, D, INFO )
-         CALL CLASCL( 'G', 0, 0, ORGNRM, ONE, N, NRHS, B, LDB, INFO )
-*
-         RETURN
-      END IF
-*
-*     Book-keeping and setting up some constants.
-*
-      NLVL = INT( LOG( REAL( N ) / REAL( SMLSIZ+1 ) ) / LOG( TWO ) ) + 1
-*
-      SMLSZP = SMLSIZ + 1
-*
-      U = 1
-      VT = 1 + SMLSIZ*N
-      DIFL = VT + SMLSZP*N
-      DIFR = DIFL + NLVL*N
-      Z = DIFR + NLVL*N*2
-      C = Z + NLVL*N
-      S = C + N
-      POLES = S + N
-      GIVNUM = POLES + 2*NLVL*N
-      NRWORK = GIVNUM + 2*NLVL*N
-      BX = 1
-*
-      IRWRB = NRWORK
-      IRWIB = IRWRB + SMLSIZ*NRHS
-      IRWB = IRWIB + SMLSIZ*NRHS
-*
-      SIZEI = 1 + N
-      K = SIZEI + N
-      GIVPTR = K + N
-      PERM = GIVPTR + N
-      GIVCOL = PERM + NLVL*N
-      IWK = GIVCOL + NLVL*N*2
-*
-      ST = 1
-      SQRE = 0
-      ICMPQ1 = 1
-      ICMPQ2 = 0
-      NSUB = 0
-*
-      DO 170 I = 1, N
-         IF( ABS( D( I ) ).LT.EPS ) THEN
-            D( I ) = SIGN( EPS, D( I ) )
-         END IF
-  170 CONTINUE
-*
-      DO 240 I = 1, NM1
-         IF( ( ABS( E( I ) ).LT.EPS ) .OR. ( I.EQ.NM1 ) ) THEN
-            NSUB = NSUB + 1
-            IWORK( NSUB ) = ST
-*
-*           Subproblem found. First determine its size and then
-*           apply divide and conquer on it.
-*
-            IF( I.LT.NM1 ) THEN
-*
-*              A subproblem with E(I) small for I < NM1.
-*
-               NSIZE = I - ST + 1
-               IWORK( SIZEI+NSUB-1 ) = NSIZE
-            ELSE IF( ABS( E( I ) ).GE.EPS ) THEN
-*
-*              A subproblem with E(NM1) not too small but I = NM1.
-*
-               NSIZE = N - ST + 1
-               IWORK( SIZEI+NSUB-1 ) = NSIZE
-            ELSE
-*
-*              A subproblem with E(NM1) small. This implies an
-*              1-by-1 subproblem at D(N), which is not solved
-*              explicitly.
-*
-               NSIZE = I - ST + 1
-               IWORK( SIZEI+NSUB-1 ) = NSIZE
-               NSUB = NSUB + 1
-               IWORK( NSUB ) = N
-               IWORK( SIZEI+NSUB-1 ) = 1
-               CALL CCOPY( NRHS, B( N, 1 ), LDB, WORK( BX+NM1 ), N )
-            END IF
-            ST1 = ST - 1
-            IF( NSIZE.EQ.1 ) THEN
-*
-*              This is a 1-by-1 subproblem and is not solved
-*              explicitly.
-*
-               CALL CCOPY( NRHS, B( ST, 1 ), LDB, WORK( BX+ST1 ), N )
-            ELSE IF( NSIZE.LE.SMLSIZ ) THEN
-*
-*              This is a small subproblem and is solved by SLASDQ.
-*
-               CALL SLASET( 'A', NSIZE, NSIZE, ZERO, ONE,
-     $                      RWORK( VT+ST1 ), N )
-               CALL SLASET( 'A', NSIZE, NSIZE, ZERO, ONE,
-     $                      RWORK( U+ST1 ), N )
-               CALL SLASDQ( 'U', 0, NSIZE, NSIZE, NSIZE, 0, D( ST ),
-     $                      E( ST ), RWORK( VT+ST1 ), N, RWORK( U+ST1 ),
-     $                      N, RWORK( NRWORK ), 1, RWORK( NRWORK ),
-     $                      INFO )
-               IF( INFO.NE.0 ) THEN
-                  RETURN
-               END IF
-*
-*              In the real version, B is passed to SLASDQ and multiplied
-*              internally by Q'. Here B is complex and that product is
-*              computed below in two steps (real and imaginary parts).
-*
-               J = IRWB - 1
-               DO 190 JCOL = 1, NRHS
-                  DO 180 JROW = ST, ST + NSIZE - 1
-                     J = J + 1
-                     RWORK( J ) = REAL( B( JROW, JCOL ) )
-  180             CONTINUE
-  190          CONTINUE
-               CALL SGEMM( 'T', 'N', NSIZE, NRHS, NSIZE, ONE,
-     $                     RWORK( U+ST1 ), N, RWORK( IRWB ), NSIZE,
-     $                     ZERO, RWORK( IRWRB ), NSIZE )
-               J = IRWB - 1
-               DO 210 JCOL = 1, NRHS
-                  DO 200 JROW = ST, ST + NSIZE - 1
-                     J = J + 1
-                     RWORK( J ) = AIMAG( B( JROW, JCOL ) )
-  200             CONTINUE
-  210          CONTINUE
-               CALL SGEMM( 'T', 'N', NSIZE, NRHS, NSIZE, ONE,
-     $                     RWORK( U+ST1 ), N, RWORK( IRWB ), NSIZE,
-     $                     ZERO, RWORK( IRWIB ), NSIZE )
-               JREAL = IRWRB - 1
-               JIMAG = IRWIB - 1
-               DO 230 JCOL = 1, NRHS
-                  DO 220 JROW = ST, ST + NSIZE - 1
-                     JREAL = JREAL + 1
-                     JIMAG = JIMAG + 1
-                     B( JROW, JCOL ) = CMPLX( RWORK( JREAL ),
-     $                                 RWORK( JIMAG ) )
-  220             CONTINUE
-  230          CONTINUE
-*
-               CALL CLACPY( 'A', NSIZE, NRHS, B( ST, 1 ), LDB,
-     $                      WORK( BX+ST1 ), N )
-            ELSE
-*
-*              A large problem. Solve it using divide and conquer.
-*
-               CALL SLASDA( ICMPQ1, SMLSIZ, NSIZE, SQRE, D( ST ),
-     $                      E( ST ), RWORK( U+ST1 ), N, RWORK( VT+ST1 ),
-     $                      IWORK( K+ST1 ), RWORK( DIFL+ST1 ),
-     $                      RWORK( DIFR+ST1 ), RWORK( Z+ST1 ),
-     $                      RWORK( POLES+ST1 ), IWORK( GIVPTR+ST1 ),
-     $                      IWORK( GIVCOL+ST1 ), N, IWORK( PERM+ST1 ),
-     $                      RWORK( GIVNUM+ST1 ), RWORK( C+ST1 ),
-     $                      RWORK( S+ST1 ), RWORK( NRWORK ),
-     $                      IWORK( IWK ), INFO )
-               IF( INFO.NE.0 ) THEN
-                  RETURN
-               END IF
-               BXST = BX + ST1
-               CALL CLALSA( ICMPQ2, SMLSIZ, NSIZE, NRHS, B( ST, 1 ),
-     $                      LDB, WORK( BXST ), N, RWORK( U+ST1 ), N,
-     $                      RWORK( VT+ST1 ), IWORK( K+ST1 ),
-     $                      RWORK( DIFL+ST1 ), RWORK( DIFR+ST1 ),
-     $                      RWORK( Z+ST1 ), RWORK( POLES+ST1 ),
-     $                      IWORK( GIVPTR+ST1 ), IWORK( GIVCOL+ST1 ), N,
-     $                      IWORK( PERM+ST1 ), RWORK( GIVNUM+ST1 ),
-     $                      RWORK( C+ST1 ), RWORK( S+ST1 ),
-     $                      RWORK( NRWORK ), IWORK( IWK ), INFO )
-               IF( INFO.NE.0 ) THEN
-                  RETURN
-               END IF
-            END IF
-            ST = I + 1
-         END IF
-  240 CONTINUE
-*
-*     Apply the singular values and treat the tiny ones as zero.
-*
-      TOL = RCND*ABS( D( ISAMAX( N, D, 1 ) ) )
-*
-      DO 250 I = 1, N
-*
-*        Some of the elements in D can be negative because 1-by-1
-*        subproblems were not solved explicitly.
-*
-         IF( ABS( D( I ) ).LE.TOL ) THEN
-            CALL CLASET( 'A', 1, NRHS, CZERO, CZERO, WORK( BX+I-1 ), N )
-         ELSE
-            RANK = RANK + 1
-            CALL CLASCL( 'G', 0, 0, D( I ), ONE, 1, NRHS,
-     $                   WORK( BX+I-1 ), N, INFO )
-         END IF
-         D( I ) = ABS( D( I ) )
-  250 CONTINUE
-*
-*     Now apply back the right singular vectors.
-*
-      ICMPQ2 = 1
-      DO 320 I = 1, NSUB
-         ST = IWORK( I )
-         ST1 = ST - 1
-         NSIZE = IWORK( SIZEI+I-1 )
-         BXST = BX + ST1
-         IF( NSIZE.EQ.1 ) THEN
-            CALL CCOPY( NRHS, WORK( BXST ), N, B( ST, 1 ), LDB )
-         ELSE IF( NSIZE.LE.SMLSIZ ) THEN
-*
-*           Since B and BX are complex, the following call to SGEMM
-*           is performed in two steps (real and imaginary parts).
-*
-*           CALL SGEMM( 'T', 'N', NSIZE, NRHS, NSIZE, ONE,
-*    $                  RWORK( VT+ST1 ), N, RWORK( BXST ), N, ZERO,
-*    $                  B( ST, 1 ), LDB )
-*
-            J = BXST - N - 1
-            JREAL = IRWB - 1
-            DO 270 JCOL = 1, NRHS
-               J = J + N
-               DO 260 JROW = 1, NSIZE
-                  JREAL = JREAL + 1
-                  RWORK( JREAL ) = REAL( WORK( J+JROW ) )
-  260          CONTINUE
-  270       CONTINUE
-            CALL SGEMM( 'T', 'N', NSIZE, NRHS, NSIZE, ONE,
-     $                  RWORK( VT+ST1 ), N, RWORK( IRWB ), NSIZE, ZERO,
-     $                  RWORK( IRWRB ), NSIZE )
-            J = BXST - N - 1
-            JIMAG = IRWB - 1
-            DO 290 JCOL = 1, NRHS
-               J = J + N
-               DO 280 JROW = 1, NSIZE
-                  JIMAG = JIMAG + 1
-                  RWORK( JIMAG ) = AIMAG( WORK( J+JROW ) )
-  280          CONTINUE
-  290       CONTINUE
-            CALL SGEMM( 'T', 'N', NSIZE, NRHS, NSIZE, ONE,
-     $                  RWORK( VT+ST1 ), N, RWORK( IRWB ), NSIZE, ZERO,
-     $                  RWORK( IRWIB ), NSIZE )
-            JREAL = IRWRB - 1
-            JIMAG = IRWIB - 1
-            DO 310 JCOL = 1, NRHS
-               DO 300 JROW = ST, ST + NSIZE - 1
-                  JREAL = JREAL + 1
-                  JIMAG = JIMAG + 1
-                  B( JROW, JCOL ) = CMPLX( RWORK( JREAL ),
-     $                              RWORK( JIMAG ) )
-  300          CONTINUE
-  310       CONTINUE
-         ELSE
-            CALL CLALSA( ICMPQ2, SMLSIZ, NSIZE, NRHS, WORK( BXST ), N,
-     $                   B( ST, 1 ), LDB, RWORK( U+ST1 ), N,
-     $                   RWORK( VT+ST1 ), IWORK( K+ST1 ),
-     $                   RWORK( DIFL+ST1 ), RWORK( DIFR+ST1 ),
-     $                   RWORK( Z+ST1 ), RWORK( POLES+ST1 ),
-     $                   IWORK( GIVPTR+ST1 ), IWORK( GIVCOL+ST1 ), N,
-     $                   IWORK( PERM+ST1 ), RWORK( GIVNUM+ST1 ),
-     $                   RWORK( C+ST1 ), RWORK( S+ST1 ),
-     $                   RWORK( NRWORK ), IWORK( IWK ), INFO )
-            IF( INFO.NE.0 ) THEN
-               RETURN
-            END IF
-         END IF
-  320 CONTINUE
-*
-*     Unscale and sort the singular values.
-*
-      CALL SLASCL( 'G', 0, 0, ONE, ORGNRM, N, 1, D, N, INFO )
-      CALL SLASRT( 'D', N, D, INFO )
-      CALL CLASCL( 'G', 0, 0, ORGNRM, ONE, N, NRHS, B, LDB, INFO )
-*
-      RETURN
-*
-*     End of CLALSD
-*
-      END
--- a/libcruft/lapack/clange.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-      REAL             FUNCTION CLANGE( NORM, M, N, A, LDA, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               WORK( * )
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLANGE  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  complex matrix A.
-*
-*  Description
-*  ===========
-*
-*  CLANGE returns the value
-*
-*     CLANGE = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in CLANGE as described
-*          above.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.  When M = 0,
-*          CLANGE is set to zero.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.  When N = 0,
-*          CLANGE is set to zero.
-*
-*  A       (input) COMPLEX array, dimension (LDA,N)
-*          The m by n matrix A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(M,1).
-*
-*  WORK    (workspace) REAL array, dimension (MAX(1,LWORK)),
-*          where LWORK >= M when NORM = 'I'; otherwise, WORK is not
-*          referenced.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      REAL               SCALE, SUM, VALUE
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLASSQ
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( MIN( M, N ).EQ.0 ) THEN
-         VALUE = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         VALUE = ZERO
-         DO 20 J = 1, N
-            DO 10 I = 1, M
-               VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   10       CONTINUE
-   20    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN
-*
-*        Find norm1(A).
-*
-         VALUE = ZERO
-         DO 40 J = 1, N
-            SUM = ZERO
-            DO 30 I = 1, M
-               SUM = SUM + ABS( A( I, J ) )
-   30       CONTINUE
-            VALUE = MAX( VALUE, SUM )
-   40    CONTINUE
-      ELSE IF( LSAME( NORM, 'I' ) ) THEN
-*
-*        Find normI(A).
-*
-         DO 50 I = 1, M
-            WORK( I ) = ZERO
-   50    CONTINUE
-         DO 70 J = 1, N
-            DO 60 I = 1, M
-               WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-   60       CONTINUE
-   70    CONTINUE
-         VALUE = ZERO
-         DO 80 I = 1, M
-            VALUE = MAX( VALUE, WORK( I ) )
-   80    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         SCALE = ZERO
-         SUM = ONE
-         DO 90 J = 1, N
-            CALL CLASSQ( M, A( 1, J ), 1, SCALE, SUM )
-   90    CONTINUE
-         VALUE = SCALE*SQRT( SUM )
-      END IF
-*
-      CLANGE = VALUE
-      RETURN
-*
-*     End of CLANGE
-*
-      END
--- a/libcruft/lapack/clanhe.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,187 +0,0 @@
-      REAL             FUNCTION CLANHE( NORM, UPLO, N, A, LDA, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM, UPLO
-      INTEGER            LDA, N
-*     ..
-*     .. Array Arguments ..
-      REAL               WORK( * )
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLANHE  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  complex hermitian matrix A.
-*
-*  Description
-*  ===========
-*
-*  CLANHE returns the value
-*
-*     CLANHE = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in CLANHE as described
-*          above.
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          hermitian matrix A is to be referenced.
-*          = 'U':  Upper triangular part of A is referenced
-*          = 'L':  Lower triangular part of A is referenced
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.  When N = 0, CLANHE is
-*          set to zero.
-*
-*  A       (input) COMPLEX array, dimension (LDA,N)
-*          The hermitian matrix A.  If UPLO = 'U', the leading n by n
-*          upper triangular part of A contains the upper triangular part
-*          of the matrix A, and the strictly lower triangular part of A
-*          is not referenced.  If UPLO = 'L', the leading n by n lower
-*          triangular part of A contains the lower triangular part of
-*          the matrix A, and the strictly upper triangular part of A is
-*          not referenced. Note that the imaginary parts of the diagonal
-*          elements need not be set and are assumed to be zero.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(N,1).
-*
-*  WORK    (workspace) REAL array, dimension (MAX(1,LWORK)),
-*          where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise,
-*          WORK is not referenced.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      REAL               ABSA, SCALE, SUM, VALUE
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLASSQ
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, REAL, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.EQ.0 ) THEN
-         VALUE = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         VALUE = ZERO
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            DO 20 J = 1, N
-               DO 10 I = 1, J - 1
-                  VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   10          CONTINUE
-               VALUE = MAX( VALUE, ABS( REAL( A( J, J ) ) ) )
-   20       CONTINUE
-         ELSE
-            DO 40 J = 1, N
-               VALUE = MAX( VALUE, ABS( REAL( A( J, J ) ) ) )
-               DO 30 I = J + 1, N
-                  VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   30          CONTINUE
-   40       CONTINUE
-         END IF
-      ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR.
-     $         ( NORM.EQ.'1' ) ) THEN
-*
-*        Find normI(A) ( = norm1(A), since A is hermitian).
-*
-         VALUE = ZERO
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            DO 60 J = 1, N
-               SUM = ZERO
-               DO 50 I = 1, J - 1
-                  ABSA = ABS( A( I, J ) )
-                  SUM = SUM + ABSA
-                  WORK( I ) = WORK( I ) + ABSA
-   50          CONTINUE
-               WORK( J ) = SUM + ABS( REAL( A( J, J ) ) )
-   60       CONTINUE
-            DO 70 I = 1, N
-               VALUE = MAX( VALUE, WORK( I ) )
-   70       CONTINUE
-         ELSE
-            DO 80 I = 1, N
-               WORK( I ) = ZERO
-   80       CONTINUE
-            DO 100 J = 1, N
-               SUM = WORK( J ) + ABS( REAL( A( J, J ) ) )
-               DO 90 I = J + 1, N
-                  ABSA = ABS( A( I, J ) )
-                  SUM = SUM + ABSA
-                  WORK( I ) = WORK( I ) + ABSA
-   90          CONTINUE
-               VALUE = MAX( VALUE, SUM )
-  100       CONTINUE
-         END IF
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         SCALE = ZERO
-         SUM = ONE
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            DO 110 J = 2, N
-               CALL CLASSQ( J-1, A( 1, J ), 1, SCALE, SUM )
-  110       CONTINUE
-         ELSE
-            DO 120 J = 1, N - 1
-               CALL CLASSQ( N-J, A( J+1, J ), 1, SCALE, SUM )
-  120       CONTINUE
-         END IF
-         SUM = 2*SUM
-         DO 130 I = 1, N
-            IF( REAL( A( I, I ) ).NE.ZERO ) THEN
-               ABSA = ABS( REAL( A( I, I ) ) )
-               IF( SCALE.LT.ABSA ) THEN
-                  SUM = ONE + SUM*( SCALE / ABSA )**2
-                  SCALE = ABSA
-               ELSE
-                  SUM = SUM + ( ABSA / SCALE )**2
-               END IF
-            END IF
-  130    CONTINUE
-         VALUE = SCALE*SQRT( SUM )
-      END IF
-*
-      CLANHE = VALUE
-      RETURN
-*
-*     End of CLANHE
-*
-      END
--- a/libcruft/lapack/clanhs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-      REAL             FUNCTION CLANHS( NORM, N, A, LDA, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            LDA, N
-*     ..
-*     .. Array Arguments ..
-      REAL               WORK( * )
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLANHS  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  Hessenberg matrix A.
-*
-*  Description
-*  ===========
-*
-*  CLANHS returns the value
-*
-*     CLANHS = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in CLANHS as described
-*          above.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.  When N = 0, CLANHS is
-*          set to zero.
-*
-*  A       (input) COMPLEX array, dimension (LDA,N)
-*          The n by n upper Hessenberg matrix A; the part of A below the
-*          first sub-diagonal is not referenced.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(N,1).
-*
-*  WORK    (workspace) REAL array, dimension (MAX(1,LWORK)),
-*          where LWORK >= N when NORM = 'I'; otherwise, WORK is not
-*          referenced.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      REAL               SCALE, SUM, VALUE
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLASSQ
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.EQ.0 ) THEN
-         VALUE = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         VALUE = ZERO
-         DO 20 J = 1, N
-            DO 10 I = 1, MIN( N, J+1 )
-               VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   10       CONTINUE
-   20    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN
-*
-*        Find norm1(A).
-*
-         VALUE = ZERO
-         DO 40 J = 1, N
-            SUM = ZERO
-            DO 30 I = 1, MIN( N, J+1 )
-               SUM = SUM + ABS( A( I, J ) )
-   30       CONTINUE
-            VALUE = MAX( VALUE, SUM )
-   40    CONTINUE
-      ELSE IF( LSAME( NORM, 'I' ) ) THEN
-*
-*        Find normI(A).
-*
-         DO 50 I = 1, N
-            WORK( I ) = ZERO
-   50    CONTINUE
-         DO 70 J = 1, N
-            DO 60 I = 1, MIN( N, J+1 )
-               WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-   60       CONTINUE
-   70    CONTINUE
-         VALUE = ZERO
-         DO 80 I = 1, N
-            VALUE = MAX( VALUE, WORK( I ) )
-   80    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         SCALE = ZERO
-         SUM = ONE
-         DO 90 J = 1, N
-            CALL CLASSQ( MIN( N, J+1 ), A( 1, J ), 1, SCALE, SUM )
-   90    CONTINUE
-         VALUE = SCALE*SQRT( SUM )
-      END IF
-*
-      CLANHS = VALUE
-      RETURN
-*
-*     End of CLANHS
-*
-      END
--- a/libcruft/lapack/clantr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,277 +0,0 @@
-      REAL             FUNCTION CLANTR( NORM, UPLO, DIAG, M, N, A, LDA,
-     $                 WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, NORM, UPLO
-      INTEGER            LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               WORK( * )
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLANTR  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  trapezoidal or triangular matrix A.
-*
-*  Description
-*  ===========
-*
-*  CLANTR returns the value
-*
-*     CLANTR = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in CLANTR as described
-*          above.
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the matrix A is upper or lower trapezoidal.
-*          = 'U':  Upper trapezoidal
-*          = 'L':  Lower trapezoidal
-*          Note that A is triangular instead of trapezoidal if M = N.
-*
-*  DIAG    (input) CHARACTER*1
-*          Specifies whether or not the matrix A has unit diagonal.
-*          = 'N':  Non-unit diagonal
-*          = 'U':  Unit diagonal
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0, and if
-*          UPLO = 'U', M <= N.  When M = 0, CLANTR is set to zero.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0, and if
-*          UPLO = 'L', N <= M.  When N = 0, CLANTR is set to zero.
-*
-*  A       (input) COMPLEX array, dimension (LDA,N)
-*          The trapezoidal matrix A (A is triangular if M = N).
-*          If UPLO = 'U', the leading m by n upper trapezoidal part of
-*          the array A contains the upper trapezoidal matrix, and the
-*          strictly lower triangular part of A is not referenced.
-*          If UPLO = 'L', the leading m by n lower trapezoidal part of
-*          the array A contains the lower trapezoidal matrix, and the
-*          strictly upper triangular part of A is not referenced.  Note
-*          that when DIAG = 'U', the diagonal elements of A are not
-*          referenced and are assumed to be one.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(M,1).
-*
-*  WORK    (workspace) REAL array, dimension (MAX(1,LWORK)),
-*          where LWORK >= M when NORM = 'I'; otherwise, WORK is not
-*          referenced.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UDIAG
-      INTEGER            I, J
-      REAL               SCALE, SUM, VALUE
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLASSQ
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( MIN( M, N ).EQ.0 ) THEN
-         VALUE = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         IF( LSAME( DIAG, 'U' ) ) THEN
-            VALUE = ONE
-            IF( LSAME( UPLO, 'U' ) ) THEN
-               DO 20 J = 1, N
-                  DO 10 I = 1, MIN( M, J-1 )
-                     VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   10             CONTINUE
-   20          CONTINUE
-            ELSE
-               DO 40 J = 1, N
-                  DO 30 I = J + 1, M
-                     VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   30             CONTINUE
-   40          CONTINUE
-            END IF
-         ELSE
-            VALUE = ZERO
-            IF( LSAME( UPLO, 'U' ) ) THEN
-               DO 60 J = 1, N
-                  DO 50 I = 1, MIN( M, J )
-                     VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   50             CONTINUE
-   60          CONTINUE
-            ELSE
-               DO 80 J = 1, N
-                  DO 70 I = J, M
-                     VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   70             CONTINUE
-   80          CONTINUE
-            END IF
-         END IF
-      ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN
-*
-*        Find norm1(A).
-*
-         VALUE = ZERO
-         UDIAG = LSAME( DIAG, 'U' )
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            DO 110 J = 1, N
-               IF( ( UDIAG ) .AND. ( J.LE.M ) ) THEN
-                  SUM = ONE
-                  DO 90 I = 1, J - 1
-                     SUM = SUM + ABS( A( I, J ) )
-   90             CONTINUE
-               ELSE
-                  SUM = ZERO
-                  DO 100 I = 1, MIN( M, J )
-                     SUM = SUM + ABS( A( I, J ) )
-  100             CONTINUE
-               END IF
-               VALUE = MAX( VALUE, SUM )
-  110       CONTINUE
-         ELSE
-            DO 140 J = 1, N
-               IF( UDIAG ) THEN
-                  SUM = ONE
-                  DO 120 I = J + 1, M
-                     SUM = SUM + ABS( A( I, J ) )
-  120             CONTINUE
-               ELSE
-                  SUM = ZERO
-                  DO 130 I = J, M
-                     SUM = SUM + ABS( A( I, J ) )
-  130             CONTINUE
-               END IF
-               VALUE = MAX( VALUE, SUM )
-  140       CONTINUE
-         END IF
-      ELSE IF( LSAME( NORM, 'I' ) ) THEN
-*
-*        Find normI(A).
-*
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            IF( LSAME( DIAG, 'U' ) ) THEN
-               DO 150 I = 1, M
-                  WORK( I ) = ONE
-  150          CONTINUE
-               DO 170 J = 1, N
-                  DO 160 I = 1, MIN( M, J-1 )
-                     WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-  160             CONTINUE
-  170          CONTINUE
-            ELSE
-               DO 180 I = 1, M
-                  WORK( I ) = ZERO
-  180          CONTINUE
-               DO 200 J = 1, N
-                  DO 190 I = 1, MIN( M, J )
-                     WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-  190             CONTINUE
-  200          CONTINUE
-            END IF
-         ELSE
-            IF( LSAME( DIAG, 'U' ) ) THEN
-               DO 210 I = 1, N
-                  WORK( I ) = ONE
-  210          CONTINUE
-               DO 220 I = N + 1, M
-                  WORK( I ) = ZERO
-  220          CONTINUE
-               DO 240 J = 1, N
-                  DO 230 I = J + 1, M
-                     WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-  230             CONTINUE
-  240          CONTINUE
-            ELSE
-               DO 250 I = 1, M
-                  WORK( I ) = ZERO
-  250          CONTINUE
-               DO 270 J = 1, N
-                  DO 260 I = J, M
-                     WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-  260             CONTINUE
-  270          CONTINUE
-            END IF
-         END IF
-         VALUE = ZERO
-         DO 280 I = 1, M
-            VALUE = MAX( VALUE, WORK( I ) )
-  280    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            IF( LSAME( DIAG, 'U' ) ) THEN
-               SCALE = ONE
-               SUM = MIN( M, N )
-               DO 290 J = 2, N
-                  CALL CLASSQ( MIN( M, J-1 ), A( 1, J ), 1, SCALE, SUM )
-  290          CONTINUE
-            ELSE
-               SCALE = ZERO
-               SUM = ONE
-               DO 300 J = 1, N
-                  CALL CLASSQ( MIN( M, J ), A( 1, J ), 1, SCALE, SUM )
-  300          CONTINUE
-            END IF
-         ELSE
-            IF( LSAME( DIAG, 'U' ) ) THEN
-               SCALE = ONE
-               SUM = MIN( M, N )
-               DO 310 J = 1, N
-                  CALL CLASSQ( M-J, A( MIN( M, J+1 ), J ), 1, SCALE,
-     $                         SUM )
-  310          CONTINUE
-            ELSE
-               SCALE = ZERO
-               SUM = ONE
-               DO 320 J = 1, N
-                  CALL CLASSQ( M-J+1, A( J, J ), 1, SCALE, SUM )
-  320          CONTINUE
-            END IF
-         END IF
-         VALUE = SCALE*SQRT( SUM )
-      END IF
-*
-      CLANTR = VALUE
-      RETURN
-*
-*     End of CLANTR
-*
-      END
--- a/libcruft/lapack/claqp2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,179 +0,0 @@
-      SUBROUTINE CLAQP2( M, N, OFFSET, A, LDA, JPVT, TAU, VN1, VN2,
-     $                   WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            LDA, M, N, OFFSET
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      REAL               VN1( * ), VN2( * )
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLAQP2 computes a QR factorization with column pivoting of
-*  the block A(OFFSET+1:M,1:N).
-*  The block A(1:OFFSET,1:N) is accordingly pivoted, but not factorized.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0.
-*
-*  OFFSET  (input) INTEGER
-*          The number of rows of the matrix A that must be pivoted
-*          but no factorized. OFFSET >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the upper triangle of block A(OFFSET+1:M,1:N) is 
-*          the triangular factor obtained; the elements in block
-*          A(OFFSET+1:M,1:N) below the diagonal, together with the
-*          array TAU, represent the orthogonal matrix Q as a product of
-*          elementary reflectors. Block A(1:OFFSET,1:N) has been
-*          accordingly pivoted, but no factorized.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          On entry, if JPVT(i) .ne. 0, the i-th column of A is permuted
-*          to the front of A*P (a leading column); if JPVT(i) = 0,
-*          the i-th column of A is a free column.
-*          On exit, if JPVT(i) = k, then the i-th column of A*P
-*          was the k-th column of A.
-*
-*  TAU     (output) COMPLEX array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors.
-*
-*  VN1     (input/output) REAL array, dimension (N)
-*          The vector with the partial column norms.
-*
-*  VN2     (input/output) REAL array, dimension (N)
-*          The vector with the exact column norms.
-*
-*  WORK    (workspace) COMPLEX array, dimension (N)
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*    X. Sun, Computer Science Dept., Duke University, USA
-*
-*  Partial column norm updating strategy modified by
-*    Z. Drmac and Z. Bujanovic, Dept. of Mathematics,
-*    University of Zagreb, Croatia.
-*    June 2006.
-*  For more details see LAPACK Working Note 176.
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      COMPLEX            CONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0,
-     $                   CONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ITEMP, J, MN, OFFPI, PVT
-      REAL               TEMP, TEMP2, TOL3Z
-      COMPLEX            AII
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLARF, CLARFG, CSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, CONJG, MAX, MIN, SQRT
-*     ..
-*     .. External Functions ..
-      INTEGER            ISAMAX
-      REAL               SCNRM2, SLAMCH
-      EXTERNAL           ISAMAX, SCNRM2, SLAMCH
-*     ..
-*     .. Executable Statements ..
-*
-      MN = MIN( M-OFFSET, N )
-      TOL3Z = SQRT(SLAMCH('Epsilon'))
-*
-*     Compute factorization.
-*
-      DO 20 I = 1, MN
-*
-         OFFPI = OFFSET + I
-*
-*        Determine ith pivot column and swap if necessary.
-*
-         PVT = ( I-1 ) + ISAMAX( N-I+1, VN1( I ), 1 )
-*
-         IF( PVT.NE.I ) THEN
-            CALL CSWAP( M, A( 1, PVT ), 1, A( 1, I ), 1 )
-            ITEMP = JPVT( PVT )
-            JPVT( PVT ) = JPVT( I )
-            JPVT( I ) = ITEMP
-            VN1( PVT ) = VN1( I )
-            VN2( PVT ) = VN2( I )
-         END IF
-*
-*        Generate elementary reflector H(i).
-*
-         IF( OFFPI.LT.M ) THEN
-            CALL CLARFG( M-OFFPI+1, A( OFFPI, I ), A( OFFPI+1, I ), 1,
-     $                   TAU( I ) )
-         ELSE
-            CALL CLARFG( 1, A( M, I ), A( M, I ), 1, TAU( I ) )
-         END IF
-*
-         IF( I.LT.N ) THEN
-*
-*           Apply H(i)' to A(offset+i:m,i+1:n) from the left.
-*
-            AII = A( OFFPI, I )
-            A( OFFPI, I ) = CONE
-            CALL CLARF( 'Left', M-OFFPI+1, N-I, A( OFFPI, I ), 1,
-     $                  CONJG( TAU( I ) ), A( OFFPI, I+1 ), LDA,
-     $                  WORK( 1 ) )
-            A( OFFPI, I ) = AII
-         END IF
-*
-*        Update partial column norms.
-*
-         DO 10 J = I + 1, N
-            IF( VN1( J ).NE.ZERO ) THEN
-*
-*              NOTE: The following 4 lines follow from the analysis in
-*              Lapack Working Note 176.
-*
-               TEMP = ONE - ( ABS( A( OFFPI, J ) ) / VN1( J ) )**2
-               TEMP = MAX( TEMP, ZERO )
-               TEMP2 = TEMP*( VN1( J ) / VN2( J ) )**2
-               IF( TEMP2 .LE. TOL3Z ) THEN
-                  IF( OFFPI.LT.M ) THEN
-                     VN1( J ) = SCNRM2( M-OFFPI, A( OFFPI+1, J ), 1 )
-                     VN2( J ) = VN1( J )
-                  ELSE
-                     VN1( J ) = ZERO
-                     VN2( J ) = ZERO
-                  END IF
-               ELSE
-                  VN1( J ) = VN1( J )*SQRT( TEMP )
-               END IF
-            END IF
-   10    CONTINUE
-*
-   20 CONTINUE
-*
-      RETURN
-*
-*     End of CLAQP2
-*
-      END
--- a/libcruft/lapack/claqps.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,271 +0,0 @@
-      SUBROUTINE CLAQPS( M, N, OFFSET, NB, KB, A, LDA, JPVT, TAU, VN1,
-     $                   VN2, AUXV, F, LDF )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            KB, LDA, LDF, M, N, NB, OFFSET
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      REAL               VN1( * ), VN2( * )
-      COMPLEX            A( LDA, * ), AUXV( * ), F( LDF, * ), TAU( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLAQPS computes a step of QR factorization with column pivoting
-*  of a complex M-by-N matrix A by using Blas-3.  It tries to factorize
-*  NB columns from A starting from the row OFFSET+1, and updates all
-*  of the matrix with Blas-3 xGEMM.
-*
-*  In some cases, due to catastrophic cancellations, it cannot
-*  factorize NB columns.  Hence, the actual number of factorized
-*  columns is returned in KB.
-*
-*  Block A(1:OFFSET,1:N) is accordingly pivoted, but not factorized.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0
-*
-*  OFFSET  (input) INTEGER
-*          The number of rows of A that have been factorized in
-*          previous steps.
-*
-*  NB      (input) INTEGER
-*          The number of columns to factorize.
-*
-*  KB      (output) INTEGER
-*          The number of columns actually factorized.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, block A(OFFSET+1:M,1:KB) is the triangular
-*          factor obtained and block A(1:OFFSET,1:N) has been
-*          accordingly pivoted, but no factorized.
-*          The rest of the matrix, block A(OFFSET+1:M,KB+1:N) has
-*          been updated.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          JPVT(I) = K <==> Column K of the full matrix A has been
-*          permuted into position I in AP.
-*
-*  TAU     (output) COMPLEX array, dimension (KB)
-*          The scalar factors of the elementary reflectors.
-*
-*  VN1     (input/output) REAL array, dimension (N)
-*          The vector with the partial column norms.
-*
-*  VN2     (input/output) REAL array, dimension (N)
-*          The vector with the exact column norms.
-*
-*  AUXV    (input/output) COMPLEX array, dimension (NB)
-*          Auxiliar vector.
-*
-*  F       (input/output) COMPLEX array, dimension (LDF,NB)
-*          Matrix F' = L*Y'*A.
-*
-*  LDF     (input) INTEGER
-*          The leading dimension of the array F. LDF >= max(1,N).
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*    X. Sun, Computer Science Dept., Duke University, USA
-*
-*  Partial column norm updating strategy modified by
-*    Z. Drmac and Z. Bujanovic, Dept. of Mathematics,
-*    University of Zagreb, Croatia.
-*    June 2006.
-*  For more details see LAPACK Working Note 176.
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      COMPLEX            CZERO, CONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0,
-     $                   CZERO = ( 0.0E+0, 0.0E+0 ),
-     $                   CONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            ITEMP, J, K, LASTRK, LSTICC, PVT, RK
-      REAL               TEMP, TEMP2, TOL3Z
-      COMPLEX            AKK
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEMM, CGEMV, CLARFG, CSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, CONJG, MAX, MIN, NINT, REAL, SQRT
-*     ..
-*     .. External Functions ..
-      INTEGER            ISAMAX
-      REAL               SCNRM2, SLAMCH
-      EXTERNAL           ISAMAX, SCNRM2, SLAMCH
-*     ..
-*     .. Executable Statements ..
-*
-      LASTRK = MIN( M, N+OFFSET )
-      LSTICC = 0
-      K = 0
-      TOL3Z = SQRT(SLAMCH('Epsilon'))
-*
-*     Beginning of while loop.
-*
-   10 CONTINUE
-      IF( ( K.LT.NB ) .AND. ( LSTICC.EQ.0 ) ) THEN
-         K = K + 1
-         RK = OFFSET + K
-*
-*        Determine ith pivot column and swap if necessary
-*
-         PVT = ( K-1 ) + ISAMAX( N-K+1, VN1( K ), 1 )
-         IF( PVT.NE.K ) THEN
-            CALL CSWAP( M, A( 1, PVT ), 1, A( 1, K ), 1 )
-            CALL CSWAP( K-1, F( PVT, 1 ), LDF, F( K, 1 ), LDF )
-            ITEMP = JPVT( PVT )
-            JPVT( PVT ) = JPVT( K )
-            JPVT( K ) = ITEMP
-            VN1( PVT ) = VN1( K )
-            VN2( PVT ) = VN2( K )
-         END IF
-*
-*        Apply previous Householder reflectors to column K:
-*        A(RK:M,K) := A(RK:M,K) - A(RK:M,1:K-1)*F(K,1:K-1)'.
-*
-         IF( K.GT.1 ) THEN
-            DO 20 J = 1, K - 1
-               F( K, J ) = CONJG( F( K, J ) )
-   20       CONTINUE
-            CALL CGEMV( 'No transpose', M-RK+1, K-1, -CONE, A( RK, 1 ),
-     $                  LDA, F( K, 1 ), LDF, CONE, A( RK, K ), 1 )
-            DO 30 J = 1, K - 1
-               F( K, J ) = CONJG( F( K, J ) )
-   30       CONTINUE
-         END IF
-*
-*        Generate elementary reflector H(k).
-*
-         IF( RK.LT.M ) THEN
-            CALL CLARFG( M-RK+1, A( RK, K ), A( RK+1, K ), 1, TAU( K ) )
-         ELSE
-            CALL CLARFG( 1, A( RK, K ), A( RK, K ), 1, TAU( K ) )
-         END IF
-*
-         AKK = A( RK, K )
-         A( RK, K ) = CONE
-*
-*        Compute Kth column of F:
-*
-*        Compute  F(K+1:N,K) := tau(K)*A(RK:M,K+1:N)'*A(RK:M,K).
-*
-         IF( K.LT.N ) THEN
-            CALL CGEMV( 'Conjugate transpose', M-RK+1, N-K, TAU( K ),
-     $                  A( RK, K+1 ), LDA, A( RK, K ), 1, CZERO,
-     $                  F( K+1, K ), 1 )
-         END IF
-*
-*        Padding F(1:K,K) with zeros.
-*
-         DO 40 J = 1, K
-            F( J, K ) = CZERO
-   40    CONTINUE
-*
-*        Incremental updating of F:
-*        F(1:N,K) := F(1:N,K) - tau(K)*F(1:N,1:K-1)*A(RK:M,1:K-1)'
-*                    *A(RK:M,K).
-*
-         IF( K.GT.1 ) THEN
-            CALL CGEMV( 'Conjugate transpose', M-RK+1, K-1, -TAU( K ),
-     $                  A( RK, 1 ), LDA, A( RK, K ), 1, CZERO,
-     $                  AUXV( 1 ), 1 )
-*
-            CALL CGEMV( 'No transpose', N, K-1, CONE, F( 1, 1 ), LDF,
-     $                  AUXV( 1 ), 1, CONE, F( 1, K ), 1 )
-         END IF
-*
-*        Update the current row of A:
-*        A(RK,K+1:N) := A(RK,K+1:N) - A(RK,1:K)*F(K+1:N,1:K)'.
-*
-         IF( K.LT.N ) THEN
-            CALL CGEMM( 'No transpose', 'Conjugate transpose', 1, N-K,
-     $                  K, -CONE, A( RK, 1 ), LDA, F( K+1, 1 ), LDF,
-     $                  CONE, A( RK, K+1 ), LDA )
-         END IF
-*
-*        Update partial column norms.
-*
-         IF( RK.LT.LASTRK ) THEN
-            DO 50 J = K + 1, N
-               IF( VN1( J ).NE.ZERO ) THEN
-*
-*                 NOTE: The following 4 lines follow from the analysis in
-*                 Lapack Working Note 176.
-*
-                  TEMP = ABS( A( RK, J ) ) / VN1( J )
-                  TEMP = MAX( ZERO, ( ONE+TEMP )*( ONE-TEMP ) )
-                  TEMP2 = TEMP*( VN1( J ) / VN2( J ) )**2
-                  IF( TEMP2 .LE. TOL3Z ) THEN
-                     VN2( J ) = REAL( LSTICC )
-                     LSTICC = J
-                  ELSE
-                     VN1( J ) = VN1( J )*SQRT( TEMP )
-                  END IF
-               END IF
-   50       CONTINUE
-         END IF
-*
-         A( RK, K ) = AKK
-*
-*        End of while loop.
-*
-         GO TO 10
-      END IF
-      KB = K
-      RK = OFFSET + KB
-*
-*     Apply the block reflector to the rest of the matrix:
-*     A(OFFSET+KB+1:M,KB+1:N) := A(OFFSET+KB+1:M,KB+1:N) -
-*                         A(OFFSET+KB+1:M,1:KB)*F(KB+1:N,1:KB)'.
-*
-      IF( KB.LT.MIN( N, M-OFFSET ) ) THEN
-         CALL CGEMM( 'No transpose', 'Conjugate transpose', M-RK, N-KB,
-     $               KB, -CONE, A( RK+1, 1 ), LDA, F( KB+1, 1 ), LDF,
-     $               CONE, A( RK+1, KB+1 ), LDA )
-      END IF
-*
-*     Recomputation of difficult columns.
-*
-   60 CONTINUE
-      IF( LSTICC.GT.0 ) THEN
-         ITEMP = NINT( VN2( LSTICC ) )
-         VN1( LSTICC ) = SCNRM2( M-RK, A( RK+1, LSTICC ), 1 )
-*
-*        NOTE: The computation of VN1( LSTICC ) relies on the fact that 
-*        SNRM2 does not fail on vectors with norm below the value of
-*        SQRT(DLAMCH('S')) 
-*
-         VN2( LSTICC ) = VN1( LSTICC )
-         LSTICC = ITEMP
-         GO TO 60
-      END IF
-*
-      RETURN
-*
-*     End of CLAQPS
-*
-      END
--- a/libcruft/lapack/claqr0.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,601 +0,0 @@
-      SUBROUTINE CLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ,
-     $                   IHIZ, Z, LDZ, WORK, LWORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, LWORK, N
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            H( LDH, * ), W( * ), WORK( * ), Z( LDZ, * )
-*     ..
-*
-*     Purpose
-*     =======
-*
-*     CLAQR0 computes the eigenvalues of a Hessenberg matrix H
-*     and, optionally, the matrices T and Z from the Schur decomposition
-*     H = Z T Z**H, where T is an upper triangular matrix (the
-*     Schur form), and Z is the unitary matrix of Schur vectors.
-*
-*     Optionally Z may be postmultiplied into an input unitary
-*     matrix Q so that this routine can give the Schur factorization
-*     of a matrix A which has been reduced to the Hessenberg form H
-*     by the unitary matrix Q:  A = Q*H*Q**H = (QZ)*H*(QZ)**H.
-*
-*     Arguments
-*     =========
-*
-*     WANTT   (input) LOGICAL
-*          = .TRUE. : the full Schur form T is required;
-*          = .FALSE.: only eigenvalues are required.
-*
-*     WANTZ   (input) LOGICAL
-*          = .TRUE. : the matrix of Schur vectors Z is required;
-*          = .FALSE.: Schur vectors are not required.
-*
-*     N     (input) INTEGER
-*           The order of the matrix H.  N .GE. 0.
-*
-*     ILO   (input) INTEGER
-*     IHI   (input) INTEGER
-*           It is assumed that H is already upper triangular in rows
-*           and columns 1:ILO-1 and IHI+1:N and, if ILO.GT.1,
-*           H(ILO,ILO-1) is zero. ILO and IHI are normally set by a
-*           previous call to CGEBAL, and then passed to CGEHRD when the
-*           matrix output by CGEBAL is reduced to Hessenberg form.
-*           Otherwise, ILO and IHI should be set to 1 and N,
-*           respectively.  If N.GT.0, then 1.LE.ILO.LE.IHI.LE.N.
-*           If N = 0, then ILO = 1 and IHI = 0.
-*
-*     H     (input/output) COMPLEX array, dimension (LDH,N)
-*           On entry, the upper Hessenberg matrix H.
-*           On exit, if INFO = 0 and WANTT is .TRUE., then H
-*           contains the upper triangular matrix T from the Schur
-*           decomposition (the Schur form). If INFO = 0 and WANT is
-*           .FALSE., then the contents of H are unspecified on exit.
-*           (The output value of H when INFO.GT.0 is given under the
-*           description of INFO below.)
-*
-*           This subroutine may explicitly set H(i,j) = 0 for i.GT.j and
-*           j = 1, 2, ... ILO-1 or j = IHI+1, IHI+2, ... N.
-*
-*     LDH   (input) INTEGER
-*           The leading dimension of the array H. LDH .GE. max(1,N).
-*
-*     W        (output) COMPLEX array, dimension (N)
-*           The computed eigenvalues of H(ILO:IHI,ILO:IHI) are stored
-*           in W(ILO:IHI). If WANTT is .TRUE., then the eigenvalues are
-*           stored in the same order as on the diagonal of the Schur
-*           form returned in H, with W(i) = H(i,i).
-*
-*     Z     (input/output) COMPLEX array, dimension (LDZ,IHI)
-*           If WANTZ is .FALSE., then Z is not referenced.
-*           If WANTZ is .TRUE., then Z(ILO:IHI,ILOZ:IHIZ) is
-*           replaced by Z(ILO:IHI,ILOZ:IHIZ)*U where U is the
-*           orthogonal Schur factor of H(ILO:IHI,ILO:IHI).
-*           (The output value of Z when INFO.GT.0 is given under
-*           the description of INFO below.)
-*
-*     LDZ   (input) INTEGER
-*           The leading dimension of the array Z.  if WANTZ is .TRUE.
-*           then LDZ.GE.MAX(1,IHIZ).  Otherwize, LDZ.GE.1.
-*
-*     WORK  (workspace/output) COMPLEX array, dimension LWORK
-*           On exit, if LWORK = -1, WORK(1) returns an estimate of
-*           the optimal value for LWORK.
-*
-*     LWORK (input) INTEGER
-*           The dimension of the array WORK.  LWORK .GE. max(1,N)
-*           is sufficient, but LWORK typically as large as 6*N may
-*           be required for optimal performance.  A workspace query
-*           to determine the optimal workspace size is recommended.
-*
-*           If LWORK = -1, then CLAQR0 does a workspace query.
-*           In this case, CLAQR0 checks the input parameters and
-*           estimates the optimal workspace size for the given
-*           values of N, ILO and IHI.  The estimate is returned
-*           in WORK(1).  No error message related to LWORK is
-*           issued by XERBLA.  Neither H nor Z are accessed.
-*
-*
-*     INFO  (output) INTEGER
-*             =  0:  successful exit
-*           .GT. 0:  if INFO = i, CLAQR0 failed to compute all of
-*                the eigenvalues.  Elements 1:ilo-1 and i+1:n of WR
-*                and WI contain those eigenvalues which have been
-*                successfully computed.  (Failures are rare.)
-*
-*                If INFO .GT. 0 and WANT is .FALSE., then on exit,
-*                the remaining unconverged eigenvalues are the eigen-
-*                values of the upper Hessenberg matrix rows and
-*                columns ILO through INFO of the final, output
-*                value of H.
-*
-*                If INFO .GT. 0 and WANTT is .TRUE., then on exit
-*
-*           (*)  (initial value of H)*U  = U*(final value of H)
-*
-*                where U is a unitary matrix.  The final
-*                value of  H is upper Hessenberg and triangular in
-*                rows and columns INFO+1 through IHI.
-*
-*                If INFO .GT. 0 and WANTZ is .TRUE., then on exit
-*
-*                  (final value of Z(ILO:IHI,ILOZ:IHIZ)
-*                   =  (initial value of Z(ILO:IHI,ILOZ:IHIZ)*U
-*
-*                where U is the unitary matrix in (*) (regard-
-*                less of the value of WANTT.)
-*
-*                If INFO .GT. 0 and WANTZ is .FALSE., then Z is not
-*                accessed.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ================================================================
-*     References:
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
-*       Performance, SIAM Journal of Matrix Analysis, volume 23, pages
-*       929--947, 2002.
-*
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part II: Aggressive Early Deflation, SIAM Journal
-*       of Matrix Analysis, volume 23, pages 948--973, 2002.
-*
-*     ================================================================
-*     .. Parameters ..
-*
-*     ==== Matrices of order NTINY or smaller must be processed by
-*     .    CLAHQR because of insufficient subdiagonal scratch space.
-*     .    (This is a hard limit.) ====
-*
-*     ==== Exceptional deflation windows:  try to cure rare
-*     .    slow convergence by increasing the size of the
-*     .    deflation window after KEXNW iterations. =====
-*
-*     ==== Exceptional shifts: try to cure rare slow convergence
-*     .    with ad-hoc exceptional shifts every KEXSH iterations.
-*     .    The constants WILK1 and WILK2 are used to form the
-*     .    exceptional shifts. ====
-*
-      INTEGER            NTINY
-      PARAMETER          ( NTINY = 11 )
-      INTEGER            KEXNW, KEXSH
-      PARAMETER          ( KEXNW = 5, KEXSH = 6 )
-      REAL               WILK1
-      PARAMETER          ( WILK1 = 0.75e0 )
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0e0, 0.0e0 ),
-     $                   ONE = ( 1.0e0, 0.0e0 ) )
-      REAL               TWO
-      PARAMETER          ( TWO = 2.0e0 )
-*     ..
-*     .. Local Scalars ..
-      COMPLEX            AA, BB, CC, CDUM, DD, DET, RTDISC, SWAP, TR2
-      REAL               S
-      INTEGER            I, INF, IT, ITMAX, K, KACC22, KBOT, KDU, KS,
-     $                   KT, KTOP, KU, KV, KWH, KWTOP, KWV, LD, LS,
-     $                   LWKOPT, NDFL, NH, NHO, NIBBLE, NMIN, NS, NSMAX,
-     $                   NSR, NVE, NW, NWMAX, NWR
-      LOGICAL            NWINC, SORTED
-      CHARACTER          JBCMPZ*2
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Local Arrays ..
-      COMPLEX            ZDUM( 1, 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLACPY, CLAHQR, CLAQR3, CLAQR4, CLAQR5
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, CMPLX, INT, MAX, MIN, MOD, REAL,
-     $                   SQRT
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( REAL( CDUM ) ) + ABS( AIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-      INFO = 0
-*
-*     ==== Quick return for N = 0: nothing to do. ====
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = ONE
-         RETURN
-      END IF
-*
-*     ==== Set up job flags for ILAENV. ====
-*
-      IF( WANTT ) THEN
-         JBCMPZ( 1: 1 ) = 'S'
-      ELSE
-         JBCMPZ( 1: 1 ) = 'E'
-      END IF
-      IF( WANTZ ) THEN
-         JBCMPZ( 2: 2 ) = 'V'
-      ELSE
-         JBCMPZ( 2: 2 ) = 'N'
-      END IF
-*
-*     ==== Tiny matrices must use CLAHQR. ====
-*
-      IF( N.LE.NTINY ) THEN
-*
-*        ==== Estimate optimal workspace. ====
-*
-         LWKOPT = 1
-         IF( LWORK.NE.-1 )
-     $      CALL CLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ,
-     $                   IHIZ, Z, LDZ, INFO )
-      ELSE
-*
-*        ==== Use small bulge multi-shift QR with aggressive early
-*        .    deflation on larger-than-tiny matrices. ====
-*
-*        ==== Hope for the best. ====
-*
-         INFO = 0
-*
-*        ==== NWR = recommended deflation window size.  At this
-*        .    point,  N .GT. NTINY = 11, so there is enough
-*        .    subdiagonal workspace for NWR.GE.2 as required.
-*        .    (In fact, there is enough subdiagonal space for
-*        .    NWR.GE.3.) ====
-*
-         NWR = ILAENV( 13, 'CLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         NWR = MAX( 2, NWR )
-         NWR = MIN( IHI-ILO+1, ( N-1 ) / 3, NWR )
-         NW = NWR
-*
-*        ==== NSR = recommended number of simultaneous shifts.
-*        .    At this point N .GT. NTINY = 11, so there is at
-*        .    enough subdiagonal workspace for NSR to be even
-*        .    and greater than or equal to two as required. ====
-*
-         NSR = ILAENV( 15, 'CLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         NSR = MIN( NSR, ( N+6 ) / 9, IHI-ILO )
-         NSR = MAX( 2, NSR-MOD( NSR, 2 ) )
-*
-*        ==== Estimate optimal workspace ====
-*
-*        ==== Workspace query call to CLAQR3 ====
-*
-         CALL CLAQR3( WANTT, WANTZ, N, ILO, IHI, NWR+1, H, LDH, ILOZ,
-     $                IHIZ, Z, LDZ, LS, LD, W, H, LDH, N, H, LDH, N, H,
-     $                LDH, WORK, -1 )
-*
-*        ==== Optimal workspace = MAX(CLAQR5, CLAQR3) ====
-*
-         LWKOPT = MAX( 3*NSR / 2, INT( WORK( 1 ) ) )
-*
-*        ==== Quick return in case of workspace query. ====
-*
-         IF( LWORK.EQ.-1 ) THEN
-            WORK( 1 ) = CMPLX( LWKOPT, 0 )
-            RETURN
-         END IF
-*
-*        ==== CLAHQR/CLAQR0 crossover point ====
-*
-         NMIN = ILAENV( 12, 'CLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         NMIN = MAX( NTINY, NMIN )
-*
-*        ==== Nibble crossover point ====
-*
-         NIBBLE = ILAENV( 14, 'CLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         NIBBLE = MAX( 0, NIBBLE )
-*
-*        ==== Accumulate reflections during ttswp?  Use block
-*        .    2-by-2 structure during matrix-matrix multiply? ====
-*
-         KACC22 = ILAENV( 16, 'CLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         KACC22 = MAX( 0, KACC22 )
-         KACC22 = MIN( 2, KACC22 )
-*
-*        ==== NWMAX = the largest possible deflation window for
-*        .    which there is sufficient workspace. ====
-*
-         NWMAX = MIN( ( N-1 ) / 3, LWORK / 2 )
-*
-*        ==== NSMAX = the Largest number of simultaneous shifts
-*        .    for which there is sufficient workspace. ====
-*
-         NSMAX = MIN( ( N+6 ) / 9, 2*LWORK / 3 )
-         NSMAX = NSMAX - MOD( NSMAX, 2 )
-*
-*        ==== NDFL: an iteration count restarted at deflation. ====
-*
-         NDFL = 1
-*
-*        ==== ITMAX = iteration limit ====
-*
-         ITMAX = MAX( 30, 2*KEXSH )*MAX( 10, ( IHI-ILO+1 ) )
-*
-*        ==== Last row and column in the active block ====
-*
-         KBOT = IHI
-*
-*        ==== Main Loop ====
-*
-         DO 70 IT = 1, ITMAX
-*
-*           ==== Done when KBOT falls below ILO ====
-*
-            IF( KBOT.LT.ILO )
-     $         GO TO 80
-*
-*           ==== Locate active block ====
-*
-            DO 10 K = KBOT, ILO + 1, -1
-               IF( H( K, K-1 ).EQ.ZERO )
-     $            GO TO 20
-   10       CONTINUE
-            K = ILO
-   20       CONTINUE
-            KTOP = K
-*
-*           ==== Select deflation window size ====
-*
-            NH = KBOT - KTOP + 1
-            IF( NDFL.LT.KEXNW .OR. NH.LT.NW ) THEN
-*
-*              ==== Typical deflation window.  If possible and
-*              .    advisable, nibble the entire active block.
-*              .    If not, use size NWR or NWR+1 depending upon
-*              .    which has the smaller corresponding subdiagonal
-*              .    entry (a heuristic). ====
-*
-               NWINC = .TRUE.
-               IF( NH.LE.MIN( NMIN, NWMAX ) ) THEN
-                  NW = NH
-               ELSE
-                  NW = MIN( NWR, NH, NWMAX )
-                  IF( NW.LT.NWMAX ) THEN
-                     IF( NW.GE.NH-1 ) THEN
-                        NW = NH
-                     ELSE
-                        KWTOP = KBOT - NW + 1
-                        IF( CABS1( H( KWTOP, KWTOP-1 ) ).GT.
-     $                      CABS1( H( KWTOP-1, KWTOP-2 ) ) )NW = NW + 1
-                     END IF
-                  END IF
-               END IF
-            ELSE
-*
-*              ==== Exceptional deflation window.  If there have
-*              .    been no deflations in KEXNW or more iterations,
-*              .    then vary the deflation window size.   At first,
-*              .    because, larger windows are, in general, more
-*              .    powerful than smaller ones, rapidly increase the
-*              .    window up to the maximum reasonable and possible.
-*              .    Then maybe try a slightly smaller window.  ====
-*
-               IF( NWINC .AND. NW.LT.MIN( NWMAX, NH ) ) THEN
-                  NW = MIN( NWMAX, NH, 2*NW )
-               ELSE
-                  NWINC = .FALSE.
-                  IF( NW.EQ.NH .AND. NH.GT.2 )
-     $               NW = NH - 1
-               END IF
-            END IF
-*
-*           ==== Aggressive early deflation:
-*           .    split workspace under the subdiagonal into
-*           .      - an nw-by-nw work array V in the lower
-*           .        left-hand-corner,
-*           .      - an NW-by-at-least-NW-but-more-is-better
-*           .        (NW-by-NHO) horizontal work array along
-*           .        the bottom edge,
-*           .      - an at-least-NW-but-more-is-better (NHV-by-NW)
-*           .        vertical work array along the left-hand-edge.
-*           .        ====
-*
-            KV = N - NW + 1
-            KT = NW + 1
-            NHO = ( N-NW-1 ) - KT + 1
-            KWV = NW + 2
-            NVE = ( N-NW ) - KWV + 1
-*
-*           ==== Aggressive early deflation ====
-*
-            CALL CLAQR3( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
-     $                   IHIZ, Z, LDZ, LS, LD, W, H( KV, 1 ), LDH, NHO,
-     $                   H( KV, KT ), LDH, NVE, H( KWV, 1 ), LDH, WORK,
-     $                   LWORK )
-*
-*           ==== Adjust KBOT accounting for new deflations. ====
-*
-            KBOT = KBOT - LD
-*
-*           ==== KS points to the shifts. ====
-*
-            KS = KBOT - LS + 1
-*
-*           ==== Skip an expensive QR sweep if there is a (partly
-*           .    heuristic) reason to expect that many eigenvalues
-*           .    will deflate without it.  Here, the QR sweep is
-*           .    skipped if many eigenvalues have just been deflated
-*           .    or if the remaining active block is small.
-*
-            IF( ( LD.EQ.0 ) .OR. ( ( 100*LD.LE.NW*NIBBLE ) .AND. ( KBOT-
-     $          KTOP+1.GT.MIN( NMIN, NWMAX ) ) ) ) THEN
-*
-*              ==== NS = nominal number of simultaneous shifts.
-*              .    This may be lowered (slightly) if CLAQR3
-*              .    did not provide that many shifts. ====
-*
-               NS = MIN( NSMAX, NSR, MAX( 2, KBOT-KTOP ) )
-               NS = NS - MOD( NS, 2 )
-*
-*              ==== If there have been no deflations
-*              .    in a multiple of KEXSH iterations,
-*              .    then try exceptional shifts.
-*              .    Otherwise use shifts provided by
-*              .    CLAQR3 above or from the eigenvalues
-*              .    of a trailing principal submatrix. ====
-*
-               IF( MOD( NDFL, KEXSH ).EQ.0 ) THEN
-                  KS = KBOT - NS + 1
-                  DO 30 I = KBOT, KS + 1, -2
-                     W( I ) = H( I, I ) + WILK1*CABS1( H( I, I-1 ) )
-                     W( I-1 ) = W( I )
-   30             CONTINUE
-               ELSE
-*
-*                 ==== Got NS/2 or fewer shifts? Use CLAQR4 or
-*                 .    CLAHQR on a trailing principal submatrix to
-*                 .    get more. (Since NS.LE.NSMAX.LE.(N+6)/9,
-*                 .    there is enough space below the subdiagonal
-*                 .    to fit an NS-by-NS scratch array.) ====
-*
-                  IF( KBOT-KS+1.LE.NS / 2 ) THEN
-                     KS = KBOT - NS + 1
-                     KT = N - NS + 1
-                     CALL CLACPY( 'A', NS, NS, H( KS, KS ), LDH,
-     $                            H( KT, 1 ), LDH )
-                     IF( NS.GT.NMIN ) THEN
-                        CALL CLAQR4( .false., .false., NS, 1, NS,
-     $                               H( KT, 1 ), LDH, W( KS ), 1, 1,
-     $                               ZDUM, 1, WORK, LWORK, INF )
-                     ELSE
-                        CALL CLAHQR( .false., .false., NS, 1, NS,
-     $                               H( KT, 1 ), LDH, W( KS ), 1, 1,
-     $                               ZDUM, 1, INF )
-                     END IF
-                     KS = KS + INF
-*
-*                    ==== In case of a rare QR failure use
-*                    .    eigenvalues of the trailing 2-by-2
-*                    .    principal submatrix.  Scale to avoid
-*                    .    overflows, underflows and subnormals.
-*                    .    (The scale factor S can not be zero,
-*                    .    because H(KBOT,KBOT-1) is nonzero.) ====
-*
-                     IF( KS.GE.KBOT ) THEN
-                        S = CABS1( H( KBOT-1, KBOT-1 ) ) +
-     $                      CABS1( H( KBOT, KBOT-1 ) ) +
-     $                      CABS1( H( KBOT-1, KBOT ) ) +
-     $                      CABS1( H( KBOT, KBOT ) )
-                        AA = H( KBOT-1, KBOT-1 ) / S
-                        CC = H( KBOT, KBOT-1 ) / S
-                        BB = H( KBOT-1, KBOT ) / S
-                        DD = H( KBOT, KBOT ) / S
-                        TR2 = ( AA+DD ) / TWO
-                        DET = ( AA-TR2 )*( DD-TR2 ) - BB*CC
-                        RTDISC = SQRT( -DET )
-                        W( KBOT-1 ) = ( TR2+RTDISC )*S
-                        W( KBOT ) = ( TR2-RTDISC )*S
-*
-                        KS = KBOT - 1
-                     END IF
-                  END IF
-*
-                  IF( KBOT-KS+1.GT.NS ) THEN
-*
-*                    ==== Sort the shifts (Helps a little) ====
-*
-                     SORTED = .false.
-                     DO 50 K = KBOT, KS + 1, -1
-                        IF( SORTED )
-     $                     GO TO 60
-                        SORTED = .true.
-                        DO 40 I = KS, K - 1
-                           IF( CABS1( W( I ) ).LT.CABS1( W( I+1 ) ) )
-     $                          THEN
-                              SORTED = .false.
-                              SWAP = W( I )
-                              W( I ) = W( I+1 )
-                              W( I+1 ) = SWAP
-                           END IF
-   40                   CONTINUE
-   50                CONTINUE
-   60                CONTINUE
-                  END IF
-               END IF
-*
-*              ==== If there are only two shifts, then use
-*              .    only one.  ====
-*
-               IF( KBOT-KS+1.EQ.2 ) THEN
-                  IF( CABS1( W( KBOT )-H( KBOT, KBOT ) ).LT.
-     $                CABS1( W( KBOT-1 )-H( KBOT, KBOT ) ) ) THEN
-                     W( KBOT-1 ) = W( KBOT )
-                  ELSE
-                     W( KBOT ) = W( KBOT-1 )
-                  END IF
-               END IF
-*
-*              ==== Use up to NS of the the smallest magnatiude
-*              .    shifts.  If there aren't NS shifts available,
-*              .    then use them all, possibly dropping one to
-*              .    make the number of shifts even. ====
-*
-               NS = MIN( NS, KBOT-KS+1 )
-               NS = NS - MOD( NS, 2 )
-               KS = KBOT - NS + 1
-*
-*              ==== Small-bulge multi-shift QR sweep:
-*              .    split workspace under the subdiagonal into
-*              .    - a KDU-by-KDU work array U in the lower
-*              .      left-hand-corner,
-*              .    - a KDU-by-at-least-KDU-but-more-is-better
-*              .      (KDU-by-NHo) horizontal work array WH along
-*              .      the bottom edge,
-*              .    - and an at-least-KDU-but-more-is-better-by-KDU
-*              .      (NVE-by-KDU) vertical work WV arrow along
-*              .      the left-hand-edge. ====
-*
-               KDU = 3*NS - 3
-               KU = N - KDU + 1
-               KWH = KDU + 1
-               NHO = ( N-KDU+1-4 ) - ( KDU+1 ) + 1
-               KWV = KDU + 4
-               NVE = N - KDU - KWV + 1
-*
-*              ==== Small-bulge multi-shift QR sweep ====
-*
-               CALL CLAQR5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NS,
-     $                      W( KS ), H, LDH, ILOZ, IHIZ, Z, LDZ, WORK,
-     $                      3, H( KU, 1 ), LDH, NVE, H( KWV, 1 ), LDH,
-     $                      NHO, H( KU, KWH ), LDH )
-            END IF
-*
-*           ==== Note progress (or the lack of it). ====
-*
-            IF( LD.GT.0 ) THEN
-               NDFL = 1
-            ELSE
-               NDFL = NDFL + 1
-            END IF
-*
-*           ==== End of main loop ====
-   70    CONTINUE
-*
-*        ==== Iteration limit exceeded.  Set INFO to show where
-*        .    the problem occurred and exit. ====
-*
-         INFO = KBOT
-   80    CONTINUE
-      END IF
-*
-*     ==== Return the optimal value of LWORK. ====
-*
-      WORK( 1 ) = CMPLX( LWKOPT, 0 )
-*
-*     ==== End of CLAQR0 ====
-*
-      END
--- a/libcruft/lapack/claqr1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-      SUBROUTINE CLAQR1( N, H, LDH, S1, S2, V )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      COMPLEX            S1, S2
-      INTEGER            LDH, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            H( LDH, * ), V( * )
-*     ..
-*
-*       Given a 2-by-2 or 3-by-3 matrix H, CLAQR1 sets v to a
-*       scalar multiple of the first column of the product
-*
-*       (*)  K = (H - s1*I)*(H - s2*I)
-*
-*       scaling to avoid overflows and most underflows.
-*
-*       This is useful for starting double implicit shift bulges
-*       in the QR algorithm.
-*
-*
-*       N      (input) integer
-*              Order of the matrix H. N must be either 2 or 3.
-*
-*       H      (input) COMPLEX array of dimension (LDH,N)
-*              The 2-by-2 or 3-by-3 matrix H in (*).
-*
-*       LDH    (input) integer
-*              The leading dimension of H as declared in
-*              the calling procedure.  LDH.GE.N
-*
-*       S1     (input) COMPLEX
-*       S2     S1 and S2 are the shifts defining K in (*) above.
-*
-*       V      (output) COMPLEX array of dimension N
-*              A scalar multiple of the first column of the
-*              matrix K in (*).
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO
-      PARAMETER          ( ZERO = ( 0.0e0, 0.0e0 ) )
-      REAL               RZERO
-      PARAMETER          ( RZERO = 0.0e0 )
-*     ..
-*     .. Local Scalars ..
-      COMPLEX            CDUM
-      REAL               H21S, H31S, S
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, REAL
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( REAL( CDUM ) ) + ABS( AIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-      IF( N.EQ.2 ) THEN
-         S = CABS1( H( 1, 1 )-S2 ) + CABS1( H( 2, 1 ) )
-         IF( S.EQ.RZERO ) THEN
-            V( 1 ) = ZERO
-            V( 2 ) = ZERO
-         ELSE
-            H21S = H( 2, 1 ) / S
-            V( 1 ) = H21S*H( 1, 2 ) + ( H( 1, 1 )-S1 )*
-     $               ( ( H( 1, 1 )-S2 ) / S )
-            V( 2 ) = H21S*( H( 1, 1 )+H( 2, 2 )-S1-S2 )
-         END IF
-      ELSE
-         S = CABS1( H( 1, 1 )-S2 ) + CABS1( H( 2, 1 ) ) +
-     $       CABS1( H( 3, 1 ) )
-         IF( S.EQ.ZERO ) THEN
-            V( 1 ) = ZERO
-            V( 2 ) = ZERO
-            V( 3 ) = ZERO
-         ELSE
-            H21S = H( 2, 1 ) / S
-            H31S = H( 3, 1 ) / S
-            V( 1 ) = ( H( 1, 1 )-S1 )*( ( H( 1, 1 )-S2 ) / S ) +
-     $               H( 1, 2 )*H21S + H( 1, 3 )*H31S
-            V( 2 ) = H21S*( H( 1, 1 )+H( 2, 2 )-S1-S2 ) + H( 2, 3 )*H31S
-            V( 3 ) = H31S*( H( 1, 1 )+H( 3, 3 )-S1-S2 ) + H21S*H( 3, 2 )
-         END IF
-      END IF
-      END
--- a/libcruft/lapack/claqr2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,438 +0,0 @@
-      SUBROUTINE CLAQR2( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
-     $                   IHIZ, Z, LDZ, NS, ND, SH, V, LDV, NH, T, LDT,
-     $                   NV, WV, LDWV, WORK, LWORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHIZ, ILOZ, KBOT, KTOP, LDH, LDT, LDV, LDWV,
-     $                   LDZ, LWORK, N, ND, NH, NS, NV, NW
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            H( LDH, * ), SH( * ), T( LDT, * ), V( LDV, * ),
-     $                   WORK( * ), WV( LDWV, * ), Z( LDZ, * )
-*     ..
-*
-*     This subroutine is identical to CLAQR3 except that it avoids
-*     recursion by calling CLAHQR instead of CLAQR4.
-*
-*
-*     ******************************************************************
-*     Aggressive early deflation:
-*
-*     This subroutine accepts as input an upper Hessenberg matrix
-*     H and performs an unitary similarity transformation
-*     designed to detect and deflate fully converged eigenvalues from
-*     a trailing principal submatrix.  On output H has been over-
-*     written by a new Hessenberg matrix that is a perturbation of
-*     an unitary similarity transformation of H.  It is to be
-*     hoped that the final version of H has many zero subdiagonal
-*     entries.
-*
-*     ******************************************************************
-*     WANTT   (input) LOGICAL
-*          If .TRUE., then the Hessenberg matrix H is fully updated
-*          so that the triangular Schur factor may be
-*          computed (in cooperation with the calling subroutine).
-*          If .FALSE., then only enough of H is updated to preserve
-*          the eigenvalues.
-*
-*     WANTZ   (input) LOGICAL
-*          If .TRUE., then the unitary matrix Z is updated so
-*          so that the unitary Schur factor may be computed
-*          (in cooperation with the calling subroutine).
-*          If .FALSE., then Z is not referenced.
-*
-*     N       (input) INTEGER
-*          The order of the matrix H and (if WANTZ is .TRUE.) the
-*          order of the unitary matrix Z.
-*
-*     KTOP    (input) INTEGER
-*          It is assumed that either KTOP = 1 or H(KTOP,KTOP-1)=0.
-*          KBOT and KTOP together determine an isolated block
-*          along the diagonal of the Hessenberg matrix.
-*
-*     KBOT    (input) INTEGER
-*          It is assumed without a check that either
-*          KBOT = N or H(KBOT+1,KBOT)=0.  KBOT and KTOP together
-*          determine an isolated block along the diagonal of the
-*          Hessenberg matrix.
-*
-*     NW      (input) INTEGER
-*          Deflation window size.  1 .LE. NW .LE. (KBOT-KTOP+1).
-*
-*     H       (input/output) COMPLEX array, dimension (LDH,N)
-*          On input the initial N-by-N section of H stores the
-*          Hessenberg matrix undergoing aggressive early deflation.
-*          On output H has been transformed by a unitary
-*          similarity transformation, perturbed, and the returned
-*          to Hessenberg form that (it is to be hoped) has some
-*          zero subdiagonal entries.
-*
-*     LDH     (input) integer
-*          Leading dimension of H just as declared in the calling
-*          subroutine.  N .LE. LDH
-*
-*     ILOZ    (input) INTEGER
-*     IHIZ    (input) INTEGER
-*          Specify the rows of Z to which transformations must be
-*          applied if WANTZ is .TRUE.. 1 .LE. ILOZ .LE. IHIZ .LE. N.
-*
-*     Z       (input/output) COMPLEX array, dimension (LDZ,IHI)
-*          IF WANTZ is .TRUE., then on output, the unitary
-*          similarity transformation mentioned above has been
-*          accumulated into Z(ILOZ:IHIZ,ILO:IHI) from the right.
-*          If WANTZ is .FALSE., then Z is unreferenced.
-*
-*     LDZ     (input) integer
-*          The leading dimension of Z just as declared in the
-*          calling subroutine.  1 .LE. LDZ.
-*
-*     NS      (output) integer
-*          The number of unconverged (ie approximate) eigenvalues
-*          returned in SR and SI that may be used as shifts by the
-*          calling subroutine.
-*
-*     ND      (output) integer
-*          The number of converged eigenvalues uncovered by this
-*          subroutine.
-*
-*     SH      (output) COMPLEX array, dimension KBOT
-*          On output, approximate eigenvalues that may
-*          be used for shifts are stored in SH(KBOT-ND-NS+1)
-*          through SR(KBOT-ND).  Converged eigenvalues are
-*          stored in SH(KBOT-ND+1) through SH(KBOT).
-*
-*     V       (workspace) COMPLEX array, dimension (LDV,NW)
-*          An NW-by-NW work array.
-*
-*     LDV     (input) integer scalar
-*          The leading dimension of V just as declared in the
-*          calling subroutine.  NW .LE. LDV
-*
-*     NH      (input) integer scalar
-*          The number of columns of T.  NH.GE.NW.
-*
-*     T       (workspace) COMPLEX array, dimension (LDT,NW)
-*
-*     LDT     (input) integer
-*          The leading dimension of T just as declared in the
-*          calling subroutine.  NW .LE. LDT
-*
-*     NV      (input) integer
-*          The number of rows of work array WV available for
-*          workspace.  NV.GE.NW.
-*
-*     WV      (workspace) COMPLEX array, dimension (LDWV,NW)
-*
-*     LDWV    (input) integer
-*          The leading dimension of W just as declared in the
-*          calling subroutine.  NW .LE. LDV
-*
-*     WORK    (workspace) COMPLEX array, dimension LWORK.
-*          On exit, WORK(1) is set to an estimate of the optimal value
-*          of LWORK for the given values of N, NW, KTOP and KBOT.
-*
-*     LWORK   (input) integer
-*          The dimension of the work array WORK.  LWORK = 2*NW
-*          suffices, but greater efficiency may result from larger
-*          values of LWORK.
-*
-*          If LWORK = -1, then a workspace query is assumed; CLAQR2
-*          only estimates the optimal workspace size for the given
-*          values of N, NW, KTOP and KBOT.  The estimate is returned
-*          in WORK(1).  No error message related to LWORK is issued
-*          by XERBLA.  Neither H nor Z are accessed.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ==================================================================
-*     .. Parameters ..
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0e0, 0.0e0 ),
-     $                   ONE = ( 1.0e0, 0.0e0 ) )
-      REAL               RZERO, RONE
-      PARAMETER          ( RZERO = 0.0e0, RONE = 1.0e0 )
-*     ..
-*     .. Local Scalars ..
-      COMPLEX            BETA, CDUM, S, TAU
-      REAL               FOO, SAFMAX, SAFMIN, SMLNUM, ULP
-      INTEGER            I, IFST, ILST, INFO, INFQR, J, JW, KCOL, KLN,
-     $                   KNT, KROW, KWTOP, LTOP, LWK1, LWK2, LWKOPT
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      EXTERNAL           SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CCOPY, CGEHRD, CGEMM, CLACPY, CLAHQR, CLARF,
-     $                   CLARFG, CLASET, CTREXC, CUNGHR, SLABAD
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, CMPLX, CONJG, INT, MAX, MIN, REAL
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( REAL( CDUM ) ) + ABS( AIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     ==== Estimate optimal workspace. ====
-*
-      JW = MIN( NW, KBOT-KTOP+1 )
-      IF( JW.LE.2 ) THEN
-         LWKOPT = 1
-      ELSE
-*
-*        ==== Workspace query call to CGEHRD ====
-*
-         CALL CGEHRD( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
-         LWK1 = INT( WORK( 1 ) )
-*
-*        ==== Workspace query call to CUNGHR ====
-*
-         CALL CUNGHR( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
-         LWK2 = INT( WORK( 1 ) )
-*
-*        ==== Optimal workspace ====
-*
-         LWKOPT = JW + MAX( LWK1, LWK2 )
-      END IF
-*
-*     ==== Quick return in case of workspace query. ====
-*
-      IF( LWORK.EQ.-1 ) THEN
-         WORK( 1 ) = CMPLX( LWKOPT, 0 )
-         RETURN
-      END IF
-*
-*     ==== Nothing to do ...
-*     ... for an empty active block ... ====
-      NS = 0
-      ND = 0
-      IF( KTOP.GT.KBOT )
-     $   RETURN
-*     ... nor for an empty deflation window. ====
-      IF( NW.LT.1 )
-     $   RETURN
-*
-*     ==== Machine constants ====
-*
-      SAFMIN = SLAMCH( 'SAFE MINIMUM' )
-      SAFMAX = RONE / SAFMIN
-      CALL SLABAD( SAFMIN, SAFMAX )
-      ULP = SLAMCH( 'PRECISION' )
-      SMLNUM = SAFMIN*( REAL( N ) / ULP )
-*
-*     ==== Setup deflation window ====
-*
-      JW = MIN( NW, KBOT-KTOP+1 )
-      KWTOP = KBOT - JW + 1
-      IF( KWTOP.EQ.KTOP ) THEN
-         S = ZERO
-      ELSE
-         S = H( KWTOP, KWTOP-1 )
-      END IF
-*
-      IF( KBOT.EQ.KWTOP ) THEN
-*
-*        ==== 1-by-1 deflation window: not much to do ====
-*
-         SH( KWTOP ) = H( KWTOP, KWTOP )
-         NS = 1
-         ND = 0
-         IF( CABS1( S ).LE.MAX( SMLNUM, ULP*CABS1( H( KWTOP,
-     $       KWTOP ) ) ) ) THEN
-
-            NS = 0
-            ND = 1
-            IF( KWTOP.GT.KTOP )
-     $         H( KWTOP, KWTOP-1 ) = ZERO
-         END IF
-         RETURN
-      END IF
-*
-*     ==== Convert to spike-triangular form.  (In case of a
-*     .    rare QR failure, this routine continues to do
-*     .    aggressive early deflation using that part of
-*     .    the deflation window that converged using INFQR
-*     .    here and there to keep track.) ====
-*
-      CALL CLACPY( 'U', JW, JW, H( KWTOP, KWTOP ), LDH, T, LDT )
-      CALL CCOPY( JW-1, H( KWTOP+1, KWTOP ), LDH+1, T( 2, 1 ), LDT+1 )
-*
-      CALL CLASET( 'A', JW, JW, ZERO, ONE, V, LDV )
-      CALL CLAHQR( .true., .true., JW, 1, JW, T, LDT, SH( KWTOP ), 1,
-     $             JW, V, LDV, INFQR )
-*
-*     ==== Deflation detection loop ====
-*
-      NS = JW
-      ILST = INFQR + 1
-      DO 10 KNT = INFQR + 1, JW
-*
-*        ==== Small spike tip deflation test ====
-*
-         FOO = CABS1( T( NS, NS ) )
-         IF( FOO.EQ.RZERO )
-     $      FOO = CABS1( S )
-         IF( CABS1( S )*CABS1( V( 1, NS ) ).LE.MAX( SMLNUM, ULP*FOO ) )
-     $        THEN
-*
-*           ==== One more converged eigenvalue ====
-*
-            NS = NS - 1
-         ELSE
-*
-*           ==== One undflatable eigenvalue.  Move it up out of the
-*           .    way.   (CTREXC can not fail in this case.) ====
-*
-            IFST = NS
-            CALL CTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, INFO )
-            ILST = ILST + 1
-         END IF
-   10 CONTINUE
-*
-*        ==== Return to Hessenberg form ====
-*
-      IF( NS.EQ.0 )
-     $   S = ZERO
-*
-      IF( NS.LT.JW ) THEN
-*
-*        ==== sorting the diagonal of T improves accuracy for
-*        .    graded matrices.  ====
-*
-         DO 30 I = INFQR + 1, NS
-            IFST = I
-            DO 20 J = I + 1, NS
-               IF( CABS1( T( J, J ) ).GT.CABS1( T( IFST, IFST ) ) )
-     $            IFST = J
-   20       CONTINUE
-            ILST = I
-            IF( IFST.NE.ILST )
-     $         CALL CTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, INFO )
-   30    CONTINUE
-      END IF
-*
-*     ==== Restore shift/eigenvalue array from T ====
-*
-      DO 40 I = INFQR + 1, JW
-         SH( KWTOP+I-1 ) = T( I, I )
-   40 CONTINUE
-*
-*
-      IF( NS.LT.JW .OR. S.EQ.ZERO ) THEN
-         IF( NS.GT.1 .AND. S.NE.ZERO ) THEN
-*
-*           ==== Reflect spike back into lower triangle ====
-*
-            CALL CCOPY( NS, V, LDV, WORK, 1 )
-            DO 50 I = 1, NS
-               WORK( I ) = CONJG( WORK( I ) )
-   50       CONTINUE
-            BETA = WORK( 1 )
-            CALL CLARFG( NS, BETA, WORK( 2 ), 1, TAU )
-            WORK( 1 ) = ONE
-*
-            CALL CLASET( 'L', JW-2, JW-2, ZERO, ZERO, T( 3, 1 ), LDT )
-*
-            CALL CLARF( 'L', NS, JW, WORK, 1, CONJG( TAU ), T, LDT,
-     $                  WORK( JW+1 ) )
-            CALL CLARF( 'R', NS, NS, WORK, 1, TAU, T, LDT,
-     $                  WORK( JW+1 ) )
-            CALL CLARF( 'R', JW, NS, WORK, 1, TAU, V, LDV,
-     $                  WORK( JW+1 ) )
-*
-            CALL CGEHRD( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
-     $                   LWORK-JW, INFO )
-         END IF
-*
-*        ==== Copy updated reduced window into place ====
-*
-         IF( KWTOP.GT.1 )
-     $      H( KWTOP, KWTOP-1 ) = S*CONJG( V( 1, 1 ) )
-         CALL CLACPY( 'U', JW, JW, T, LDT, H( KWTOP, KWTOP ), LDH )
-         CALL CCOPY( JW-1, T( 2, 1 ), LDT+1, H( KWTOP+1, KWTOP ),
-     $               LDH+1 )
-*
-*        ==== Accumulate orthogonal matrix in order update
-*        .    H and Z, if requested.  (A modified version
-*        .    of  CUNGHR that accumulates block Householder
-*        .    transformations into V directly might be
-*        .    marginally more efficient than the following.) ====
-*
-         IF( NS.GT.1 .AND. S.NE.ZERO ) THEN
-            CALL CUNGHR( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
-     $                   LWORK-JW, INFO )
-            CALL CGEMM( 'N', 'N', JW, NS, NS, ONE, V, LDV, T, LDT, ZERO,
-     $                  WV, LDWV )
-            CALL CLACPY( 'A', JW, NS, WV, LDWV, V, LDV )
-         END IF
-*
-*        ==== Update vertical slab in H ====
-*
-         IF( WANTT ) THEN
-            LTOP = 1
-         ELSE
-            LTOP = KTOP
-         END IF
-         DO 60 KROW = LTOP, KWTOP - 1, NV
-            KLN = MIN( NV, KWTOP-KROW )
-            CALL CGEMM( 'N', 'N', KLN, JW, JW, ONE, H( KROW, KWTOP ),
-     $                  LDH, V, LDV, ZERO, WV, LDWV )
-            CALL CLACPY( 'A', KLN, JW, WV, LDWV, H( KROW, KWTOP ), LDH )
-   60    CONTINUE
-*
-*        ==== Update horizontal slab in H ====
-*
-         IF( WANTT ) THEN
-            DO 70 KCOL = KBOT + 1, N, NH
-               KLN = MIN( NH, N-KCOL+1 )
-               CALL CGEMM( 'C', 'N', JW, KLN, JW, ONE, V, LDV,
-     $                     H( KWTOP, KCOL ), LDH, ZERO, T, LDT )
-               CALL CLACPY( 'A', JW, KLN, T, LDT, H( KWTOP, KCOL ),
-     $                      LDH )
-   70       CONTINUE
-         END IF
-*
-*        ==== Update vertical slab in Z ====
-*
-         IF( WANTZ ) THEN
-            DO 80 KROW = ILOZ, IHIZ, NV
-               KLN = MIN( NV, IHIZ-KROW+1 )
-               CALL CGEMM( 'N', 'N', KLN, JW, JW, ONE, Z( KROW, KWTOP ),
-     $                     LDZ, V, LDV, ZERO, WV, LDWV )
-               CALL CLACPY( 'A', KLN, JW, WV, LDWV, Z( KROW, KWTOP ),
-     $                      LDZ )
-   80       CONTINUE
-         END IF
-      END IF
-*
-*     ==== Return the number of deflations ... ====
-*
-      ND = JW - NS
-*
-*     ==== ... and the number of shifts. (Subtracting
-*     .    INFQR from the spike length takes care
-*     .    of the case of a rare QR failure while
-*     .    calculating eigenvalues of the deflation
-*     .    window.)  ====
-*
-      NS = NS - INFQR
-*
-*      ==== Return optimal workspace. ====
-*
-      WORK( 1 ) = CMPLX( LWKOPT, 0 )
-*
-*     ==== End of CLAQR2 ====
-*
-      END
--- a/libcruft/lapack/claqr3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,448 +0,0 @@
-      SUBROUTINE CLAQR3( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
-     $                   IHIZ, Z, LDZ, NS, ND, SH, V, LDV, NH, T, LDT,
-     $                   NV, WV, LDWV, WORK, LWORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHIZ, ILOZ, KBOT, KTOP, LDH, LDT, LDV, LDWV,
-     $                   LDZ, LWORK, N, ND, NH, NS, NV, NW
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            H( LDH, * ), SH( * ), T( LDT, * ), V( LDV, * ),
-     $                   WORK( * ), WV( LDWV, * ), Z( LDZ, * )
-*     ..
-*
-*     ******************************************************************
-*     Aggressive early deflation:
-*
-*     This subroutine accepts as input an upper Hessenberg matrix
-*     H and performs an unitary similarity transformation
-*     designed to detect and deflate fully converged eigenvalues from
-*     a trailing principal submatrix.  On output H has been over-
-*     written by a new Hessenberg matrix that is a perturbation of
-*     an unitary similarity transformation of H.  It is to be
-*     hoped that the final version of H has many zero subdiagonal
-*     entries.
-*
-*     ******************************************************************
-*     WANTT   (input) LOGICAL
-*          If .TRUE., then the Hessenberg matrix H is fully updated
-*          so that the triangular Schur factor may be
-*          computed (in cooperation with the calling subroutine).
-*          If .FALSE., then only enough of H is updated to preserve
-*          the eigenvalues.
-*
-*     WANTZ   (input) LOGICAL
-*          If .TRUE., then the unitary matrix Z is updated so
-*          so that the unitary Schur factor may be computed
-*          (in cooperation with the calling subroutine).
-*          If .FALSE., then Z is not referenced.
-*
-*     N       (input) INTEGER
-*          The order of the matrix H and (if WANTZ is .TRUE.) the
-*          order of the unitary matrix Z.
-*
-*     KTOP    (input) INTEGER
-*          It is assumed that either KTOP = 1 or H(KTOP,KTOP-1)=0.
-*          KBOT and KTOP together determine an isolated block
-*          along the diagonal of the Hessenberg matrix.
-*
-*     KBOT    (input) INTEGER
-*          It is assumed without a check that either
-*          KBOT = N or H(KBOT+1,KBOT)=0.  KBOT and KTOP together
-*          determine an isolated block along the diagonal of the
-*          Hessenberg matrix.
-*
-*     NW      (input) INTEGER
-*          Deflation window size.  1 .LE. NW .LE. (KBOT-KTOP+1).
-*
-*     H       (input/output) COMPLEX array, dimension (LDH,N)
-*          On input the initial N-by-N section of H stores the
-*          Hessenberg matrix undergoing aggressive early deflation.
-*          On output H has been transformed by a unitary
-*          similarity transformation, perturbed, and the returned
-*          to Hessenberg form that (it is to be hoped) has some
-*          zero subdiagonal entries.
-*
-*     LDH     (input) integer
-*          Leading dimension of H just as declared in the calling
-*          subroutine.  N .LE. LDH
-*
-*     ILOZ    (input) INTEGER
-*     IHIZ    (input) INTEGER
-*          Specify the rows of Z to which transformations must be
-*          applied if WANTZ is .TRUE.. 1 .LE. ILOZ .LE. IHIZ .LE. N.
-*
-*     Z       (input/output) COMPLEX array, dimension (LDZ,IHI)
-*          IF WANTZ is .TRUE., then on output, the unitary
-*          similarity transformation mentioned above has been
-*          accumulated into Z(ILOZ:IHIZ,ILO:IHI) from the right.
-*          If WANTZ is .FALSE., then Z is unreferenced.
-*
-*     LDZ     (input) integer
-*          The leading dimension of Z just as declared in the
-*          calling subroutine.  1 .LE. LDZ.
-*
-*     NS      (output) integer
-*          The number of unconverged (ie approximate) eigenvalues
-*          returned in SR and SI that may be used as shifts by the
-*          calling subroutine.
-*
-*     ND      (output) integer
-*          The number of converged eigenvalues uncovered by this
-*          subroutine.
-*
-*     SH      (output) COMPLEX array, dimension KBOT
-*          On output, approximate eigenvalues that may
-*          be used for shifts are stored in SH(KBOT-ND-NS+1)
-*          through SR(KBOT-ND).  Converged eigenvalues are
-*          stored in SH(KBOT-ND+1) through SH(KBOT).
-*
-*     V       (workspace) COMPLEX array, dimension (LDV,NW)
-*          An NW-by-NW work array.
-*
-*     LDV     (input) integer scalar
-*          The leading dimension of V just as declared in the
-*          calling subroutine.  NW .LE. LDV
-*
-*     NH      (input) integer scalar
-*          The number of columns of T.  NH.GE.NW.
-*
-*     T       (workspace) COMPLEX array, dimension (LDT,NW)
-*
-*     LDT     (input) integer
-*          The leading dimension of T just as declared in the
-*          calling subroutine.  NW .LE. LDT
-*
-*     NV      (input) integer
-*          The number of rows of work array WV available for
-*          workspace.  NV.GE.NW.
-*
-*     WV      (workspace) COMPLEX array, dimension (LDWV,NW)
-*
-*     LDWV    (input) integer
-*          The leading dimension of W just as declared in the
-*          calling subroutine.  NW .LE. LDV
-*
-*     WORK    (workspace) COMPLEX array, dimension LWORK.
-*          On exit, WORK(1) is set to an estimate of the optimal value
-*          of LWORK for the given values of N, NW, KTOP and KBOT.
-*
-*     LWORK   (input) integer
-*          The dimension of the work array WORK.  LWORK = 2*NW
-*          suffices, but greater efficiency may result from larger
-*          values of LWORK.
-*
-*          If LWORK = -1, then a workspace query is assumed; CLAQR3
-*          only estimates the optimal workspace size for the given
-*          values of N, NW, KTOP and KBOT.  The estimate is returned
-*          in WORK(1).  No error message related to LWORK is issued
-*          by XERBLA.  Neither H nor Z are accessed.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ==================================================================
-*     .. Parameters ..
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0e0, 0.0e0 ),
-     $                   ONE = ( 1.0e0, 0.0e0 ) )
-      REAL               RZERO, RONE
-      PARAMETER          ( RZERO = 0.0e0, RONE = 1.0e0 )
-*     ..
-*     .. Local Scalars ..
-      COMPLEX            BETA, CDUM, S, TAU
-      REAL               FOO, SAFMAX, SAFMIN, SMLNUM, ULP
-      INTEGER            I, IFST, ILST, INFO, INFQR, J, JW, KCOL, KLN,
-     $                   KNT, KROW, KWTOP, LTOP, LWK1, LWK2, LWK3,
-     $                   LWKOPT, NMIN
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      INTEGER            ILAENV
-      EXTERNAL           SLAMCH, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CCOPY, CGEHRD, CGEMM, CLACPY, CLAHQR, CLAQR4,
-     $                   CLARF, CLARFG, CLASET, CTREXC, CUNGHR, SLABAD
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, CMPLX, CONJG, INT, MAX, MIN, REAL
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( REAL( CDUM ) ) + ABS( AIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     ==== Estimate optimal workspace. ====
-*
-      JW = MIN( NW, KBOT-KTOP+1 )
-      IF( JW.LE.2 ) THEN
-         LWKOPT = 1
-      ELSE
-*
-*        ==== Workspace query call to CGEHRD ====
-*
-         CALL CGEHRD( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
-         LWK1 = INT( WORK( 1 ) )
-*
-*        ==== Workspace query call to CUNGHR ====
-*
-         CALL CUNGHR( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
-         LWK2 = INT( WORK( 1 ) )
-*
-*        ==== Workspace query call to CLAQR4 ====
-*
-         CALL CLAQR4( .true., .true., JW, 1, JW, T, LDT, SH, 1, JW, V,
-     $                LDV, WORK, -1, INFQR )
-         LWK3 = INT( WORK( 1 ) )
-*
-*        ==== Optimal workspace ====
-*
-         LWKOPT = MAX( JW+MAX( LWK1, LWK2 ), LWK3 )
-      END IF
-*
-*     ==== Quick return in case of workspace query. ====
-*
-      IF( LWORK.EQ.-1 ) THEN
-         WORK( 1 ) = CMPLX( LWKOPT, 0 )
-         RETURN
-      END IF
-*
-*     ==== Nothing to do ...
-*     ... for an empty active block ... ====
-      NS = 0
-      ND = 0
-      IF( KTOP.GT.KBOT )
-     $   RETURN
-*     ... nor for an empty deflation window. ====
-      IF( NW.LT.1 )
-     $   RETURN
-*
-*     ==== Machine constants ====
-*
-      SAFMIN = SLAMCH( 'SAFE MINIMUM' )
-      SAFMAX = RONE / SAFMIN
-      CALL SLABAD( SAFMIN, SAFMAX )
-      ULP = SLAMCH( 'PRECISION' )
-      SMLNUM = SAFMIN*( REAL( N ) / ULP )
-*
-*     ==== Setup deflation window ====
-*
-      JW = MIN( NW, KBOT-KTOP+1 )
-      KWTOP = KBOT - JW + 1
-      IF( KWTOP.EQ.KTOP ) THEN
-         S = ZERO
-      ELSE
-         S = H( KWTOP, KWTOP-1 )
-      END IF
-*
-      IF( KBOT.EQ.KWTOP ) THEN
-*
-*        ==== 1-by-1 deflation window: not much to do ====
-*
-         SH( KWTOP ) = H( KWTOP, KWTOP )
-         NS = 1
-         ND = 0
-         IF( CABS1( S ).LE.MAX( SMLNUM, ULP*CABS1( H( KWTOP,
-     $       KWTOP ) ) ) ) THEN
-
-            NS = 0
-            ND = 1
-            IF( KWTOP.GT.KTOP )
-     $         H( KWTOP, KWTOP-1 ) = ZERO
-         END IF
-         RETURN
-      END IF
-*
-*     ==== Convert to spike-triangular form.  (In case of a
-*     .    rare QR failure, this routine continues to do
-*     .    aggressive early deflation using that part of
-*     .    the deflation window that converged using INFQR
-*     .    here and there to keep track.) ====
-*
-      CALL CLACPY( 'U', JW, JW, H( KWTOP, KWTOP ), LDH, T, LDT )
-      CALL CCOPY( JW-1, H( KWTOP+1, KWTOP ), LDH+1, T( 2, 1 ), LDT+1 )
-*
-      CALL CLASET( 'A', JW, JW, ZERO, ONE, V, LDV )
-      NMIN = ILAENV( 12, 'CLAQR3', 'SV', JW, 1, JW, LWORK )
-      IF( JW.GT.NMIN ) THEN
-         CALL CLAQR4( .true., .true., JW, 1, JW, T, LDT, SH( KWTOP ), 1,
-     $                JW, V, LDV, WORK, LWORK, INFQR )
-      ELSE
-         CALL CLAHQR( .true., .true., JW, 1, JW, T, LDT, SH( KWTOP ), 1,
-     $                JW, V, LDV, INFQR )
-      END IF
-*
-*     ==== Deflation detection loop ====
-*
-      NS = JW
-      ILST = INFQR + 1
-      DO 10 KNT = INFQR + 1, JW
-*
-*        ==== Small spike tip deflation test ====
-*
-         FOO = CABS1( T( NS, NS ) )
-         IF( FOO.EQ.RZERO )
-     $      FOO = CABS1( S )
-         IF( CABS1( S )*CABS1( V( 1, NS ) ).LE.MAX( SMLNUM, ULP*FOO ) )
-     $        THEN
-*
-*           ==== One more converged eigenvalue ====
-*
-            NS = NS - 1
-         ELSE
-*
-*           ==== One undflatable eigenvalue.  Move it up out of the
-*           .    way.   (CTREXC can not fail in this case.) ====
-*
-            IFST = NS
-            CALL CTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, INFO )
-            ILST = ILST + 1
-         END IF
-   10 CONTINUE
-*
-*        ==== Return to Hessenberg form ====
-*
-      IF( NS.EQ.0 )
-     $   S = ZERO
-*
-      IF( NS.LT.JW ) THEN
-*
-*        ==== sorting the diagonal of T improves accuracy for
-*        .    graded matrices.  ====
-*
-         DO 30 I = INFQR + 1, NS
-            IFST = I
-            DO 20 J = I + 1, NS
-               IF( CABS1( T( J, J ) ).GT.CABS1( T( IFST, IFST ) ) )
-     $            IFST = J
-   20       CONTINUE
-            ILST = I
-            IF( IFST.NE.ILST )
-     $         CALL CTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, INFO )
-   30    CONTINUE
-      END IF
-*
-*     ==== Restore shift/eigenvalue array from T ====
-*
-      DO 40 I = INFQR + 1, JW
-         SH( KWTOP+I-1 ) = T( I, I )
-   40 CONTINUE
-*
-*
-      IF( NS.LT.JW .OR. S.EQ.ZERO ) THEN
-         IF( NS.GT.1 .AND. S.NE.ZERO ) THEN
-*
-*           ==== Reflect spike back into lower triangle ====
-*
-            CALL CCOPY( NS, V, LDV, WORK, 1 )
-            DO 50 I = 1, NS
-               WORK( I ) = CONJG( WORK( I ) )
-   50       CONTINUE
-            BETA = WORK( 1 )
-            CALL CLARFG( NS, BETA, WORK( 2 ), 1, TAU )
-            WORK( 1 ) = ONE
-*
-            CALL CLASET( 'L', JW-2, JW-2, ZERO, ZERO, T( 3, 1 ), LDT )
-*
-            CALL CLARF( 'L', NS, JW, WORK, 1, CONJG( TAU ), T, LDT,
-     $                  WORK( JW+1 ) )
-            CALL CLARF( 'R', NS, NS, WORK, 1, TAU, T, LDT,
-     $                  WORK( JW+1 ) )
-            CALL CLARF( 'R', JW, NS, WORK, 1, TAU, V, LDV,
-     $                  WORK( JW+1 ) )
-*
-            CALL CGEHRD( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
-     $                   LWORK-JW, INFO )
-         END IF
-*
-*        ==== Copy updated reduced window into place ====
-*
-         IF( KWTOP.GT.1 )
-     $      H( KWTOP, KWTOP-1 ) = S*CONJG( V( 1, 1 ) )
-         CALL CLACPY( 'U', JW, JW, T, LDT, H( KWTOP, KWTOP ), LDH )
-         CALL CCOPY( JW-1, T( 2, 1 ), LDT+1, H( KWTOP+1, KWTOP ),
-     $               LDH+1 )
-*
-*        ==== Accumulate orthogonal matrix in order update
-*        .    H and Z, if requested.  (A modified version
-*        .    of  CUNGHR that accumulates block Householder
-*        .    transformations into V directly might be
-*        .    marginally more efficient than the following.) ====
-*
-         IF( NS.GT.1 .AND. S.NE.ZERO ) THEN
-            CALL CUNGHR( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
-     $                   LWORK-JW, INFO )
-            CALL CGEMM( 'N', 'N', JW, NS, NS, ONE, V, LDV, T, LDT, ZERO,
-     $                  WV, LDWV )
-            CALL CLACPY( 'A', JW, NS, WV, LDWV, V, LDV )
-         END IF
-*
-*        ==== Update vertical slab in H ====
-*
-         IF( WANTT ) THEN
-            LTOP = 1
-         ELSE
-            LTOP = KTOP
-         END IF
-         DO 60 KROW = LTOP, KWTOP - 1, NV
-            KLN = MIN( NV, KWTOP-KROW )
-            CALL CGEMM( 'N', 'N', KLN, JW, JW, ONE, H( KROW, KWTOP ),
-     $                  LDH, V, LDV, ZERO, WV, LDWV )
-            CALL CLACPY( 'A', KLN, JW, WV, LDWV, H( KROW, KWTOP ), LDH )
-   60    CONTINUE
-*
-*        ==== Update horizontal slab in H ====
-*
-         IF( WANTT ) THEN
-            DO 70 KCOL = KBOT + 1, N, NH
-               KLN = MIN( NH, N-KCOL+1 )
-               CALL CGEMM( 'C', 'N', JW, KLN, JW, ONE, V, LDV,
-     $                     H( KWTOP, KCOL ), LDH, ZERO, T, LDT )
-               CALL CLACPY( 'A', JW, KLN, T, LDT, H( KWTOP, KCOL ),
-     $                      LDH )
-   70       CONTINUE
-         END IF
-*
-*        ==== Update vertical slab in Z ====
-*
-         IF( WANTZ ) THEN
-            DO 80 KROW = ILOZ, IHIZ, NV
-               KLN = MIN( NV, IHIZ-KROW+1 )
-               CALL CGEMM( 'N', 'N', KLN, JW, JW, ONE, Z( KROW, KWTOP ),
-     $                     LDZ, V, LDV, ZERO, WV, LDWV )
-               CALL CLACPY( 'A', KLN, JW, WV, LDWV, Z( KROW, KWTOP ),
-     $                      LDZ )
-   80       CONTINUE
-         END IF
-      END IF
-*
-*     ==== Return the number of deflations ... ====
-*
-      ND = JW - NS
-*
-*     ==== ... and the number of shifts. (Subtracting
-*     .    INFQR from the spike length takes care
-*     .    of the case of a rare QR failure while
-*     .    calculating eigenvalues of the deflation
-*     .    window.)  ====
-*
-      NS = NS - INFQR
-*
-*      ==== Return optimal workspace. ====
-*
-      WORK( 1 ) = CMPLX( LWKOPT, 0 )
-*
-*     ==== End of CLAQR3 ====
-*
-      END
--- a/libcruft/lapack/claqr4.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,602 +0,0 @@
-      SUBROUTINE CLAQR4( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ,
-     $                   IHIZ, Z, LDZ, WORK, LWORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, LWORK, N
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            H( LDH, * ), W( * ), WORK( * ), Z( LDZ, * )
-*     ..
-*
-*     This subroutine implements one level of recursion for CLAQR0.
-*     It is a complete implementation of the small bulge multi-shift
-*     QR algorithm.  It may be called by CLAQR0 and, for large enough
-*     deflation window size, it may be called by CLAQR3.  This
-*     subroutine is identical to CLAQR0 except that it calls CLAQR2
-*     instead of CLAQR3.
-*
-*     Purpose
-*     =======
-*
-*     CLAQR4 computes the eigenvalues of a Hessenberg matrix H
-*     and, optionally, the matrices T and Z from the Schur decomposition
-*     H = Z T Z**H, where T is an upper triangular matrix (the
-*     Schur form), and Z is the unitary matrix of Schur vectors.
-*
-*     Optionally Z may be postmultiplied into an input unitary
-*     matrix Q so that this routine can give the Schur factorization
-*     of a matrix A which has been reduced to the Hessenberg form H
-*     by the unitary matrix Q:  A = Q*H*Q**H = (QZ)*H*(QZ)**H.
-*
-*     Arguments
-*     =========
-*
-*     WANTT   (input) LOGICAL
-*          = .TRUE. : the full Schur form T is required;
-*          = .FALSE.: only eigenvalues are required.
-*
-*     WANTZ   (input) LOGICAL
-*          = .TRUE. : the matrix of Schur vectors Z is required;
-*          = .FALSE.: Schur vectors are not required.
-*
-*     N     (input) INTEGER
-*           The order of the matrix H.  N .GE. 0.
-*
-*     ILO   (input) INTEGER
-*     IHI   (input) INTEGER
-*           It is assumed that H is already upper triangular in rows
-*           and columns 1:ILO-1 and IHI+1:N and, if ILO.GT.1,
-*           H(ILO,ILO-1) is zero. ILO and IHI are normally set by a
-*           previous call to CGEBAL, and then passed to CGEHRD when the
-*           matrix output by CGEBAL is reduced to Hessenberg form.
-*           Otherwise, ILO and IHI should be set to 1 and N,
-*           respectively.  If N.GT.0, then 1.LE.ILO.LE.IHI.LE.N.
-*           If N = 0, then ILO = 1 and IHI = 0.
-*
-*     H     (input/output) COMPLEX array, dimension (LDH,N)
-*           On entry, the upper Hessenberg matrix H.
-*           On exit, if INFO = 0 and WANTT is .TRUE., then H
-*           contains the upper triangular matrix T from the Schur
-*           decomposition (the Schur form). If INFO = 0 and WANT is
-*           .FALSE., then the contents of H are unspecified on exit.
-*           (The output value of H when INFO.GT.0 is given under the
-*           description of INFO below.)
-*
-*           This subroutine may explicitly set H(i,j) = 0 for i.GT.j and
-*           j = 1, 2, ... ILO-1 or j = IHI+1, IHI+2, ... N.
-*
-*     LDH   (input) INTEGER
-*           The leading dimension of the array H. LDH .GE. max(1,N).
-*
-*     W        (output) COMPLEX array, dimension (N)
-*           The computed eigenvalues of H(ILO:IHI,ILO:IHI) are stored
-*           in W(ILO:IHI). If WANTT is .TRUE., then the eigenvalues are
-*           stored in the same order as on the diagonal of the Schur
-*           form returned in H, with W(i) = H(i,i).
-*
-*     Z     (input/output) COMPLEX array, dimension (LDZ,IHI)
-*           If WANTZ is .FALSE., then Z is not referenced.
-*           If WANTZ is .TRUE., then Z(ILO:IHI,ILOZ:IHIZ) is
-*           replaced by Z(ILO:IHI,ILOZ:IHIZ)*U where U is the
-*           orthogonal Schur factor of H(ILO:IHI,ILO:IHI).
-*           (The output value of Z when INFO.GT.0 is given under
-*           the description of INFO below.)
-*
-*     LDZ   (input) INTEGER
-*           The leading dimension of the array Z.  if WANTZ is .TRUE.
-*           then LDZ.GE.MAX(1,IHIZ).  Otherwize, LDZ.GE.1.
-*
-*     WORK  (workspace/output) COMPLEX array, dimension LWORK
-*           On exit, if LWORK = -1, WORK(1) returns an estimate of
-*           the optimal value for LWORK.
-*
-*     LWORK (input) INTEGER
-*           The dimension of the array WORK.  LWORK .GE. max(1,N)
-*           is sufficient, but LWORK typically as large as 6*N may
-*           be required for optimal performance.  A workspace query
-*           to determine the optimal workspace size is recommended.
-*
-*           If LWORK = -1, then CLAQR4 does a workspace query.
-*           In this case, CLAQR4 checks the input parameters and
-*           estimates the optimal workspace size for the given
-*           values of N, ILO and IHI.  The estimate is returned
-*           in WORK(1).  No error message related to LWORK is
-*           issued by XERBLA.  Neither H nor Z are accessed.
-*
-*
-*     INFO  (output) INTEGER
-*             =  0:  successful exit
-*           .GT. 0:  if INFO = i, CLAQR4 failed to compute all of
-*                the eigenvalues.  Elements 1:ilo-1 and i+1:n of WR
-*                and WI contain those eigenvalues which have been
-*                successfully computed.  (Failures are rare.)
-*
-*                If INFO .GT. 0 and WANT is .FALSE., then on exit,
-*                the remaining unconverged eigenvalues are the eigen-
-*                values of the upper Hessenberg matrix rows and
-*                columns ILO through INFO of the final, output
-*                value of H.
-*
-*                If INFO .GT. 0 and WANTT is .TRUE., then on exit
-*
-*           (*)  (initial value of H)*U  = U*(final value of H)
-*
-*                where U is a unitary matrix.  The final
-*                value of  H is upper Hessenberg and triangular in
-*                rows and columns INFO+1 through IHI.
-*
-*                If INFO .GT. 0 and WANTZ is .TRUE., then on exit
-*
-*                  (final value of Z(ILO:IHI,ILOZ:IHIZ)
-*                   =  (initial value of Z(ILO:IHI,ILOZ:IHIZ)*U
-*
-*                where U is the unitary matrix in (*) (regard-
-*                less of the value of WANTT.)
-*
-*                If INFO .GT. 0 and WANTZ is .FALSE., then Z is not
-*                accessed.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ================================================================
-*     References:
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
-*       Performance, SIAM Journal of Matrix Analysis, volume 23, pages
-*       929--947, 2002.
-*
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part II: Aggressive Early Deflation, SIAM Journal
-*       of Matrix Analysis, volume 23, pages 948--973, 2002.
-*
-*     ================================================================
-*     .. Parameters ..
-*
-*     ==== Matrices of order NTINY or smaller must be processed by
-*     .    CLAHQR because of insufficient subdiagonal scratch space.
-*     .    (This is a hard limit.) ====
-*
-*     ==== Exceptional deflation windows:  try to cure rare
-*     .    slow convergence by increasing the size of the
-*     .    deflation window after KEXNW iterations. =====
-*
-*     ==== Exceptional shifts: try to cure rare slow convergence
-*     .    with ad-hoc exceptional shifts every KEXSH iterations.
-*     .    The constants WILK1 and WILK2 are used to form the
-*     .    exceptional shifts. ====
-*
-      INTEGER            NTINY
-      PARAMETER          ( NTINY = 11 )
-      INTEGER            KEXNW, KEXSH
-      PARAMETER          ( KEXNW = 5, KEXSH = 6 )
-      REAL               WILK1
-      PARAMETER          ( WILK1 = 0.75e0 )
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0e0, 0.0e0 ),
-     $                   ONE = ( 1.0e0, 0.0e0 ) )
-      REAL               TWO
-      PARAMETER          ( TWO = 2.0e0 )
-*     ..
-*     .. Local Scalars ..
-      COMPLEX            AA, BB, CC, CDUM, DD, DET, RTDISC, SWAP, TR2
-      REAL               S
-      INTEGER            I, INF, IT, ITMAX, K, KACC22, KBOT, KDU, KS,
-     $                   KT, KTOP, KU, KV, KWH, KWTOP, KWV, LD, LS,
-     $                   LWKOPT, NDFL, NH, NHO, NIBBLE, NMIN, NS, NSMAX,
-     $                   NSR, NVE, NW, NWMAX, NWR
-      LOGICAL            NWINC, SORTED
-      CHARACTER          JBCMPZ*2
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Local Arrays ..
-      COMPLEX            ZDUM( 1, 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLACPY, CLAHQR, CLAQR2, CLAQR5
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, CMPLX, INT, MAX, MIN, MOD, REAL,
-     $                   SQRT
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( REAL( CDUM ) ) + ABS( AIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-      INFO = 0
-*
-*     ==== Quick return for N = 0: nothing to do. ====
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = ONE
-         RETURN
-      END IF
-*
-*     ==== Set up job flags for ILAENV. ====
-*
-      IF( WANTT ) THEN
-         JBCMPZ( 1: 1 ) = 'S'
-      ELSE
-         JBCMPZ( 1: 1 ) = 'E'
-      END IF
-      IF( WANTZ ) THEN
-         JBCMPZ( 2: 2 ) = 'V'
-      ELSE
-         JBCMPZ( 2: 2 ) = 'N'
-      END IF
-*
-*     ==== Tiny matrices must use CLAHQR. ====
-*
-      IF( N.LE.NTINY ) THEN
-*
-*        ==== Estimate optimal workspace. ====
-*
-         LWKOPT = 1
-         IF( LWORK.NE.-1 )
-     $      CALL CLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ,
-     $                   IHIZ, Z, LDZ, INFO )
-      ELSE
-*
-*        ==== Use small bulge multi-shift QR with aggressive early
-*        .    deflation on larger-than-tiny matrices. ====
-*
-*        ==== Hope for the best. ====
-*
-         INFO = 0
-*
-*        ==== NWR = recommended deflation window size.  At this
-*        .    point,  N .GT. NTINY = 11, so there is enough
-*        .    subdiagonal workspace for NWR.GE.2 as required.
-*        .    (In fact, there is enough subdiagonal space for
-*        .    NWR.GE.3.) ====
-*
-         NWR = ILAENV( 13, 'CLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         NWR = MAX( 2, NWR )
-         NWR = MIN( IHI-ILO+1, ( N-1 ) / 3, NWR )
-         NW = NWR
-*
-*        ==== NSR = recommended number of simultaneous shifts.
-*        .    At this point N .GT. NTINY = 11, so there is at
-*        .    enough subdiagonal workspace for NSR to be even
-*        .    and greater than or equal to two as required. ====
-*
-         NSR = ILAENV( 15, 'CLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         NSR = MIN( NSR, ( N+6 ) / 9, IHI-ILO )
-         NSR = MAX( 2, NSR-MOD( NSR, 2 ) )
-*
-*        ==== Estimate optimal workspace ====
-*
-*        ==== Workspace query call to CLAQR2 ====
-*
-         CALL CLAQR2( WANTT, WANTZ, N, ILO, IHI, NWR+1, H, LDH, ILOZ,
-     $                IHIZ, Z, LDZ, LS, LD, W, H, LDH, N, H, LDH, N, H,
-     $                LDH, WORK, -1 )
-*
-*        ==== Optimal workspace = MAX(CLAQR5, CLAQR2) ====
-*
-         LWKOPT = MAX( 3*NSR / 2, INT( WORK( 1 ) ) )
-*
-*        ==== Quick return in case of workspace query. ====
-*
-         IF( LWORK.EQ.-1 ) THEN
-            WORK( 1 ) = CMPLX( LWKOPT, 0 )
-            RETURN
-         END IF
-*
-*        ==== CLAHQR/CLAQR0 crossover point ====
-*
-         NMIN = ILAENV( 12, 'CLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         NMIN = MAX( NTINY, NMIN )
-*
-*        ==== Nibble crossover point ====
-*
-         NIBBLE = ILAENV( 14, 'CLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         NIBBLE = MAX( 0, NIBBLE )
-*
-*        ==== Accumulate reflections during ttswp?  Use block
-*        .    2-by-2 structure during matrix-matrix multiply? ====
-*
-         KACC22 = ILAENV( 16, 'CLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         KACC22 = MAX( 0, KACC22 )
-         KACC22 = MIN( 2, KACC22 )
-*
-*        ==== NWMAX = the largest possible deflation window for
-*        .    which there is sufficient workspace. ====
-*
-         NWMAX = MIN( ( N-1 ) / 3, LWORK / 2 )
-*
-*        ==== NSMAX = the Largest number of simultaneous shifts
-*        .    for which there is sufficient workspace. ====
-*
-         NSMAX = MIN( ( N+6 ) / 9, 2*LWORK / 3 )
-         NSMAX = NSMAX - MOD( NSMAX, 2 )
-*
-*        ==== NDFL: an iteration count restarted at deflation. ====
-*
-         NDFL = 1
-*
-*        ==== ITMAX = iteration limit ====
-*
-         ITMAX = MAX( 30, 2*KEXSH )*MAX( 10, ( IHI-ILO+1 ) )
-*
-*        ==== Last row and column in the active block ====
-*
-         KBOT = IHI
-*
-*        ==== Main Loop ====
-*
-         DO 70 IT = 1, ITMAX
-*
-*           ==== Done when KBOT falls below ILO ====
-*
-            IF( KBOT.LT.ILO )
-     $         GO TO 80
-*
-*           ==== Locate active block ====
-*
-            DO 10 K = KBOT, ILO + 1, -1
-               IF( H( K, K-1 ).EQ.ZERO )
-     $            GO TO 20
-   10       CONTINUE
-            K = ILO
-   20       CONTINUE
-            KTOP = K
-*
-*           ==== Select deflation window size ====
-*
-            NH = KBOT - KTOP + 1
-            IF( NDFL.LT.KEXNW .OR. NH.LT.NW ) THEN
-*
-*              ==== Typical deflation window.  If possible and
-*              .    advisable, nibble the entire active block.
-*              .    If not, use size NWR or NWR+1 depending upon
-*              .    which has the smaller corresponding subdiagonal
-*              .    entry (a heuristic). ====
-*
-               NWINC = .TRUE.
-               IF( NH.LE.MIN( NMIN, NWMAX ) ) THEN
-                  NW = NH
-               ELSE
-                  NW = MIN( NWR, NH, NWMAX )
-                  IF( NW.LT.NWMAX ) THEN
-                     IF( NW.GE.NH-1 ) THEN
-                        NW = NH
-                     ELSE
-                        KWTOP = KBOT - NW + 1
-                        IF( CABS1( H( KWTOP, KWTOP-1 ) ).GT.
-     $                      CABS1( H( KWTOP-1, KWTOP-2 ) ) )NW = NW + 1
-                     END IF
-                  END IF
-               END IF
-            ELSE
-*
-*              ==== Exceptional deflation window.  If there have
-*              .    been no deflations in KEXNW or more iterations,
-*              .    then vary the deflation window size.   At first,
-*              .    because, larger windows are, in general, more
-*              .    powerful than smaller ones, rapidly increase the
-*              .    window up to the maximum reasonable and possible.
-*              .    Then maybe try a slightly smaller window.  ====
-*
-               IF( NWINC .AND. NW.LT.MIN( NWMAX, NH ) ) THEN
-                  NW = MIN( NWMAX, NH, 2*NW )
-               ELSE
-                  NWINC = .FALSE.
-                  IF( NW.EQ.NH .AND. NH.GT.2 )
-     $               NW = NH - 1
-               END IF
-            END IF
-*
-*           ==== Aggressive early deflation:
-*           .    split workspace under the subdiagonal into
-*           .      - an nw-by-nw work array V in the lower
-*           .        left-hand-corner,
-*           .      - an NW-by-at-least-NW-but-more-is-better
-*           .        (NW-by-NHO) horizontal work array along
-*           .        the bottom edge,
-*           .      - an at-least-NW-but-more-is-better (NHV-by-NW)
-*           .        vertical work array along the left-hand-edge.
-*           .        ====
-*
-            KV = N - NW + 1
-            KT = NW + 1
-            NHO = ( N-NW-1 ) - KT + 1
-            KWV = NW + 2
-            NVE = ( N-NW ) - KWV + 1
-*
-*           ==== Aggressive early deflation ====
-*
-            CALL CLAQR2( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
-     $                   IHIZ, Z, LDZ, LS, LD, W, H( KV, 1 ), LDH, NHO,
-     $                   H( KV, KT ), LDH, NVE, H( KWV, 1 ), LDH, WORK,
-     $                   LWORK )
-*
-*           ==== Adjust KBOT accounting for new deflations. ====
-*
-            KBOT = KBOT - LD
-*
-*           ==== KS points to the shifts. ====
-*
-            KS = KBOT - LS + 1
-*
-*           ==== Skip an expensive QR sweep if there is a (partly
-*           .    heuristic) reason to expect that many eigenvalues
-*           .    will deflate without it.  Here, the QR sweep is
-*           .    skipped if many eigenvalues have just been deflated
-*           .    or if the remaining active block is small.
-*
-            IF( ( LD.EQ.0 ) .OR. ( ( 100*LD.LE.NW*NIBBLE ) .AND. ( KBOT-
-     $          KTOP+1.GT.MIN( NMIN, NWMAX ) ) ) ) THEN
-*
-*              ==== NS = nominal number of simultaneous shifts.
-*              .    This may be lowered (slightly) if CLAQR2
-*              .    did not provide that many shifts. ====
-*
-               NS = MIN( NSMAX, NSR, MAX( 2, KBOT-KTOP ) )
-               NS = NS - MOD( NS, 2 )
-*
-*              ==== If there have been no deflations
-*              .    in a multiple of KEXSH iterations,
-*              .    then try exceptional shifts.
-*              .    Otherwise use shifts provided by
-*              .    CLAQR2 above or from the eigenvalues
-*              .    of a trailing principal submatrix. ====
-*
-               IF( MOD( NDFL, KEXSH ).EQ.0 ) THEN
-                  KS = KBOT - NS + 1
-                  DO 30 I = KBOT, KS + 1, -2
-                     W( I ) = H( I, I ) + WILK1*CABS1( H( I, I-1 ) )
-                     W( I-1 ) = W( I )
-   30             CONTINUE
-               ELSE
-*
-*                 ==== Got NS/2 or fewer shifts? Use CLAHQR
-*                 .    on a trailing principal submatrix to
-*                 .    get more. (Since NS.LE.NSMAX.LE.(N+6)/9,
-*                 .    there is enough space below the subdiagonal
-*                 .    to fit an NS-by-NS scratch array.) ====
-*
-                  IF( KBOT-KS+1.LE.NS / 2 ) THEN
-                     KS = KBOT - NS + 1
-                     KT = N - NS + 1
-                     CALL CLACPY( 'A', NS, NS, H( KS, KS ), LDH,
-     $                            H( KT, 1 ), LDH )
-                     CALL CLAHQR( .false., .false., NS, 1, NS,
-     $                            H( KT, 1 ), LDH, W( KS ), 1, 1, ZDUM,
-     $                            1, INF )
-                     KS = KS + INF
-*
-*                    ==== In case of a rare QR failure use
-*                    .    eigenvalues of the trailing 2-by-2
-*                    .    principal submatrix.  Scale to avoid
-*                    .    overflows, underflows and subnormals.
-*                    .    (The scale factor S can not be zero,
-*                    .    because H(KBOT,KBOT-1) is nonzero.) ====
-*
-                     IF( KS.GE.KBOT ) THEN
-                        S = CABS1( H( KBOT-1, KBOT-1 ) ) +
-     $                      CABS1( H( KBOT, KBOT-1 ) ) +
-     $                      CABS1( H( KBOT-1, KBOT ) ) +
-     $                      CABS1( H( KBOT, KBOT ) )
-                        AA = H( KBOT-1, KBOT-1 ) / S
-                        CC = H( KBOT, KBOT-1 ) / S
-                        BB = H( KBOT-1, KBOT ) / S
-                        DD = H( KBOT, KBOT ) / S
-                        TR2 = ( AA+DD ) / TWO
-                        DET = ( AA-TR2 )*( DD-TR2 ) - BB*CC
-                        RTDISC = SQRT( -DET )
-                        W( KBOT-1 ) = ( TR2+RTDISC )*S
-                        W( KBOT ) = ( TR2-RTDISC )*S
-*
-                        KS = KBOT - 1
-                     END IF
-                  END IF
-*
-                  IF( KBOT-KS+1.GT.NS ) THEN
-*
-*                    ==== Sort the shifts (Helps a little) ====
-*
-                     SORTED = .false.
-                     DO 50 K = KBOT, KS + 1, -1
-                        IF( SORTED )
-     $                     GO TO 60
-                        SORTED = .true.
-                        DO 40 I = KS, K - 1
-                           IF( CABS1( W( I ) ).LT.CABS1( W( I+1 ) ) )
-     $                          THEN
-                              SORTED = .false.
-                              SWAP = W( I )
-                              W( I ) = W( I+1 )
-                              W( I+1 ) = SWAP
-                           END IF
-   40                   CONTINUE
-   50                CONTINUE
-   60                CONTINUE
-                  END IF
-               END IF
-*
-*              ==== If there are only two shifts, then use
-*              .    only one.  ====
-*
-               IF( KBOT-KS+1.EQ.2 ) THEN
-                  IF( CABS1( W( KBOT )-H( KBOT, KBOT ) ).LT.
-     $                CABS1( W( KBOT-1 )-H( KBOT, KBOT ) ) ) THEN
-                     W( KBOT-1 ) = W( KBOT )
-                  ELSE
-                     W( KBOT ) = W( KBOT-1 )
-                  END IF
-               END IF
-*
-*              ==== Use up to NS of the the smallest magnatiude
-*              .    shifts.  If there aren't NS shifts available,
-*              .    then use them all, possibly dropping one to
-*              .    make the number of shifts even. ====
-*
-               NS = MIN( NS, KBOT-KS+1 )
-               NS = NS - MOD( NS, 2 )
-               KS = KBOT - NS + 1
-*
-*              ==== Small-bulge multi-shift QR sweep:
-*              .    split workspace under the subdiagonal into
-*              .    - a KDU-by-KDU work array U in the lower
-*              .      left-hand-corner,
-*              .    - a KDU-by-at-least-KDU-but-more-is-better
-*              .      (KDU-by-NHo) horizontal work array WH along
-*              .      the bottom edge,
-*              .    - and an at-least-KDU-but-more-is-better-by-KDU
-*              .      (NVE-by-KDU) vertical work WV arrow along
-*              .      the left-hand-edge. ====
-*
-               KDU = 3*NS - 3
-               KU = N - KDU + 1
-               KWH = KDU + 1
-               NHO = ( N-KDU+1-4 ) - ( KDU+1 ) + 1
-               KWV = KDU + 4
-               NVE = N - KDU - KWV + 1
-*
-*              ==== Small-bulge multi-shift QR sweep ====
-*
-               CALL CLAQR5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NS,
-     $                      W( KS ), H, LDH, ILOZ, IHIZ, Z, LDZ, WORK,
-     $                      3, H( KU, 1 ), LDH, NVE, H( KWV, 1 ), LDH,
-     $                      NHO, H( KU, KWH ), LDH )
-            END IF
-*
-*           ==== Note progress (or the lack of it). ====
-*
-            IF( LD.GT.0 ) THEN
-               NDFL = 1
-            ELSE
-               NDFL = NDFL + 1
-            END IF
-*
-*           ==== End of main loop ====
-   70    CONTINUE
-*
-*        ==== Iteration limit exceeded.  Set INFO to show where
-*        .    the problem occurred and exit. ====
-*
-         INFO = KBOT
-   80    CONTINUE
-      END IF
-*
-*     ==== Return the optimal value of LWORK. ====
-*
-      WORK( 1 ) = CMPLX( LWKOPT, 0 )
-*
-*     ==== End of CLAQR4 ====
-*
-      END
--- a/libcruft/lapack/claqr5.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,809 +0,0 @@
-      SUBROUTINE CLAQR5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NSHFTS, S,
-     $                   H, LDH, ILOZ, IHIZ, Z, LDZ, V, LDV, U, LDU, NV,
-     $                   WV, LDWV, NH, WH, LDWH )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHIZ, ILOZ, KACC22, KBOT, KTOP, LDH, LDU, LDV,
-     $                   LDWH, LDWV, LDZ, N, NH, NSHFTS, NV
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            H( LDH, * ), S( * ), U( LDU, * ), V( LDV, * ),
-     $                   WH( LDWH, * ), WV( LDWV, * ), Z( LDZ, * )
-*     ..
-*
-*     This auxiliary subroutine called by CLAQR0 performs a
-*     single small-bulge multi-shift QR sweep.
-*
-*      WANTT  (input) logical scalar
-*             WANTT = .true. if the triangular Schur factor
-*             is being computed.  WANTT is set to .false. otherwise.
-*
-*      WANTZ  (input) logical scalar
-*             WANTZ = .true. if the unitary Schur factor is being
-*             computed.  WANTZ is set to .false. otherwise.
-*
-*      KACC22 (input) integer with value 0, 1, or 2.
-*             Specifies the computation mode of far-from-diagonal
-*             orthogonal updates.
-*        = 0: CLAQR5 does not accumulate reflections and does not
-*             use matrix-matrix multiply to update far-from-diagonal
-*             matrix entries.
-*        = 1: CLAQR5 accumulates reflections and uses matrix-matrix
-*             multiply to update the far-from-diagonal matrix entries.
-*        = 2: CLAQR5 accumulates reflections, uses matrix-matrix
-*             multiply to update the far-from-diagonal matrix entries,
-*             and takes advantage of 2-by-2 block structure during
-*             matrix multiplies.
-*
-*      N      (input) integer scalar
-*             N is the order of the Hessenberg matrix H upon which this
-*             subroutine operates.
-*
-*      KTOP   (input) integer scalar
-*      KBOT   (input) integer scalar
-*             These are the first and last rows and columns of an
-*             isolated diagonal block upon which the QR sweep is to be
-*             applied. It is assumed without a check that
-*                       either KTOP = 1  or   H(KTOP,KTOP-1) = 0
-*             and
-*                       either KBOT = N  or   H(KBOT+1,KBOT) = 0.
-*
-*      NSHFTS (input) integer scalar
-*             NSHFTS gives the number of simultaneous shifts.  NSHFTS
-*             must be positive and even.
-*
-*      S      (input) COMPLEX array of size (NSHFTS)
-*             S contains the shifts of origin that define the multi-
-*             shift QR sweep.
-*
-*      H      (input/output) COMPLEX array of size (LDH,N)
-*             On input H contains a Hessenberg matrix.  On output a
-*             multi-shift QR sweep with shifts SR(J)+i*SI(J) is applied
-*             to the isolated diagonal block in rows and columns KTOP
-*             through KBOT.
-*
-*      LDH    (input) integer scalar
-*             LDH is the leading dimension of H just as declared in the
-*             calling procedure.  LDH.GE.MAX(1,N).
-*
-*      ILOZ   (input) INTEGER
-*      IHIZ   (input) INTEGER
-*             Specify the rows of Z to which transformations must be
-*             applied if WANTZ is .TRUE.. 1 .LE. ILOZ .LE. IHIZ .LE. N
-*
-*      Z      (input/output) COMPLEX array of size (LDZ,IHI)
-*             If WANTZ = .TRUE., then the QR Sweep unitary
-*             similarity transformation is accumulated into
-*             Z(ILOZ:IHIZ,ILO:IHI) from the right.
-*             If WANTZ = .FALSE., then Z is unreferenced.
-*
-*      LDZ    (input) integer scalar
-*             LDA is the leading dimension of Z just as declared in
-*             the calling procedure. LDZ.GE.N.
-*
-*      V      (workspace) COMPLEX array of size (LDV,NSHFTS/2)
-*
-*      LDV    (input) integer scalar
-*             LDV is the leading dimension of V as declared in the
-*             calling procedure.  LDV.GE.3.
-*
-*      U      (workspace) COMPLEX array of size
-*             (LDU,3*NSHFTS-3)
-*
-*      LDU    (input) integer scalar
-*             LDU is the leading dimension of U just as declared in the
-*             in the calling subroutine.  LDU.GE.3*NSHFTS-3.
-*
-*      NH     (input) integer scalar
-*             NH is the number of columns in array WH available for
-*             workspace. NH.GE.1.
-*
-*      WH     (workspace) COMPLEX array of size (LDWH,NH)
-*
-*      LDWH   (input) integer scalar
-*             Leading dimension of WH just as declared in the
-*             calling procedure.  LDWH.GE.3*NSHFTS-3.
-*
-*      NV     (input) integer scalar
-*             NV is the number of rows in WV agailable for workspace.
-*             NV.GE.1.
-*
-*      WV     (workspace) COMPLEX array of size
-*             (LDWV,3*NSHFTS-3)
-*
-*      LDWV   (input) integer scalar
-*             LDWV is the leading dimension of WV as declared in the
-*             in the calling subroutine.  LDWV.GE.NV.
-*
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ============================================================
-*     Reference:
-*
-*     K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*     Algorithm Part I: Maintaining Well Focused Shifts, and
-*     Level 3 Performance, SIAM Journal of Matrix Analysis,
-*     volume 23, pages 929--947, 2002.
-*
-*     ============================================================
-*     .. Parameters ..
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0e0, 0.0e0 ),
-     $                   ONE = ( 1.0e0, 0.0e0 ) )
-      REAL               RZERO, RONE
-      PARAMETER          ( RZERO = 0.0e0, RONE = 1.0e0 )
-*     ..
-*     .. Local Scalars ..
-      COMPLEX            ALPHA, BETA, CDUM, REFSUM
-      REAL               H11, H12, H21, H22, SAFMAX, SAFMIN, SCL,
-     $                   SMLNUM, TST1, TST2, ULP
-      INTEGER            I2, I4, INCOL, J, J2, J4, JBOT, JCOL, JLEN,
-     $                   JROW, JTOP, K, K1, KDU, KMS, KNZ, KRCOL, KZS,
-     $                   M, M22, MBOT, MEND, MSTART, MTOP, NBMPS, NDCOL,
-     $                   NS, NU
-      LOGICAL            ACCUM, BLK22, BMP22
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      EXTERNAL           SLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-*
-      INTRINSIC          ABS, AIMAG, CONJG, MAX, MIN, MOD, REAL
-*     ..
-*     .. Local Arrays ..
-      COMPLEX            VT( 3 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEMM, CLACPY, CLAQR1, CLARFG, CLASET, CTRMM,
-     $                   SLABAD
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( REAL( CDUM ) ) + ABS( AIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     ==== If there are no shifts, then there is nothing to do. ====
-*
-      IF( NSHFTS.LT.2 )
-     $   RETURN
-*
-*     ==== If the active block is empty or 1-by-1, then there
-*     .    is nothing to do. ====
-*
-      IF( KTOP.GE.KBOT )
-     $   RETURN
-*
-*     ==== NSHFTS is supposed to be even, but if is odd,
-*     .    then simply reduce it by one.  ====
-*
-      NS = NSHFTS - MOD( NSHFTS, 2 )
-*
-*     ==== Machine constants for deflation ====
-*
-      SAFMIN = SLAMCH( 'SAFE MINIMUM' )
-      SAFMAX = RONE / SAFMIN
-      CALL SLABAD( SAFMIN, SAFMAX )
-      ULP = SLAMCH( 'PRECISION' )
-      SMLNUM = SAFMIN*( REAL( N ) / ULP )
-*
-*     ==== Use accumulated reflections to update far-from-diagonal
-*     .    entries ? ====
-*
-      ACCUM = ( KACC22.EQ.1 ) .OR. ( KACC22.EQ.2 )
-*
-*     ==== If so, exploit the 2-by-2 block structure? ====
-*
-      BLK22 = ( NS.GT.2 ) .AND. ( KACC22.EQ.2 )
-*
-*     ==== clear trash ====
-*
-      IF( KTOP+2.LE.KBOT )
-     $   H( KTOP+2, KTOP ) = ZERO
-*
-*     ==== NBMPS = number of 2-shift bulges in the chain ====
-*
-      NBMPS = NS / 2
-*
-*     ==== KDU = width of slab ====
-*
-      KDU = 6*NBMPS - 3
-*
-*     ==== Create and chase chains of NBMPS bulges ====
-*
-      DO 210 INCOL = 3*( 1-NBMPS ) + KTOP - 1, KBOT - 2, 3*NBMPS - 2
-         NDCOL = INCOL + KDU
-         IF( ACCUM )
-     $      CALL CLASET( 'ALL', KDU, KDU, ZERO, ONE, U, LDU )
-*
-*        ==== Near-the-diagonal bulge chase.  The following loop
-*        .    performs the near-the-diagonal part of a small bulge
-*        .    multi-shift QR sweep.  Each 6*NBMPS-2 column diagonal
-*        .    chunk extends from column INCOL to column NDCOL
-*        .    (including both column INCOL and column NDCOL). The
-*        .    following loop chases a 3*NBMPS column long chain of
-*        .    NBMPS bulges 3*NBMPS-2 columns to the right.  (INCOL
-*        .    may be less than KTOP and and NDCOL may be greater than
-*        .    KBOT indicating phantom columns from which to chase
-*        .    bulges before they are actually introduced or to which
-*        .    to chase bulges beyond column KBOT.)  ====
-*
-         DO 140 KRCOL = INCOL, MIN( INCOL+3*NBMPS-3, KBOT-2 )
-*
-*           ==== Bulges number MTOP to MBOT are active double implicit
-*           .    shift bulges.  There may or may not also be small
-*           .    2-by-2 bulge, if there is room.  The inactive bulges
-*           .    (if any) must wait until the active bulges have moved
-*           .    down the diagonal to make room.  The phantom matrix
-*           .    paradigm described above helps keep track.  ====
-*
-            MTOP = MAX( 1, ( ( KTOP-1 )-KRCOL+2 ) / 3+1 )
-            MBOT = MIN( NBMPS, ( KBOT-KRCOL ) / 3 )
-            M22 = MBOT + 1
-            BMP22 = ( MBOT.LT.NBMPS ) .AND. ( KRCOL+3*( M22-1 ) ).EQ.
-     $              ( KBOT-2 )
-*
-*           ==== Generate reflections to chase the chain right
-*           .    one column.  (The minimum value of K is KTOP-1.) ====
-*
-            DO 10 M = MTOP, MBOT
-               K = KRCOL + 3*( M-1 )
-               IF( K.EQ.KTOP-1 ) THEN
-                  CALL CLAQR1( 3, H( KTOP, KTOP ), LDH, S( 2*M-1 ),
-     $                         S( 2*M ), V( 1, M ) )
-                  ALPHA = V( 1, M )
-                  CALL CLARFG( 3, ALPHA, V( 2, M ), 1, V( 1, M ) )
-               ELSE
-                  BETA = H( K+1, K )
-                  V( 2, M ) = H( K+2, K )
-                  V( 3, M ) = H( K+3, K )
-                  CALL CLARFG( 3, BETA, V( 2, M ), 1, V( 1, M ) )
-*
-*                 ==== A Bulge may collapse because of vigilant
-*                 .    deflation or destructive underflow.  (The
-*                 .    initial bulge is always collapsed.) Use
-*                 .    the two-small-subdiagonals trick to try
-*                 .    to get it started again. If V(2,M).NE.0 and
-*                 .    V(3,M) = H(K+3,K+1) = H(K+3,K+2) = 0, then
-*                 .    this bulge is collapsing into a zero
-*                 .    subdiagonal.  It will be restarted next
-*                 .    trip through the loop.)
-*
-                  IF( V( 1, M ).NE.ZERO .AND.
-     $                ( V( 3, M ).NE.ZERO .OR. ( H( K+3,
-     $                K+1 ).EQ.ZERO .AND. H( K+3, K+2 ).EQ.ZERO ) ) )
-     $                 THEN
-*
-*                    ==== Typical case: not collapsed (yet). ====
-*
-                     H( K+1, K ) = BETA
-                     H( K+2, K ) = ZERO
-                     H( K+3, K ) = ZERO
-                  ELSE
-*
-*                    ==== Atypical case: collapsed.  Attempt to
-*                    .    reintroduce ignoring H(K+1,K).  If the
-*                    .    fill resulting from the new reflector
-*                    .    is too large, then abandon it.
-*                    .    Otherwise, use the new one. ====
-*
-                     CALL CLAQR1( 3, H( K+1, K+1 ), LDH, S( 2*M-1 ),
-     $                            S( 2*M ), VT )
-                     SCL = CABS1( VT( 1 ) ) + CABS1( VT( 2 ) ) +
-     $                     CABS1( VT( 3 ) )
-                     IF( SCL.NE.RZERO ) THEN
-                        VT( 1 ) = VT( 1 ) / SCL
-                        VT( 2 ) = VT( 2 ) / SCL
-                        VT( 3 ) = VT( 3 ) / SCL
-                     END IF
-*
-*                    ==== The following is the traditional and
-*                    .    conservative two-small-subdiagonals
-*                    .    test.  ====
-*                    .
-                     IF( CABS1( H( K+1, K ) )*
-     $                   ( CABS1( VT( 2 ) )+CABS1( VT( 3 ) ) ).GT.ULP*
-     $                   CABS1( VT( 1 ) )*( CABS1( H( K,
-     $                   K ) )+CABS1( H( K+1, K+1 ) )+CABS1( H( K+2,
-     $                   K+2 ) ) ) ) THEN
-*
-*                       ==== Starting a new bulge here would
-*                       .    create non-negligible fill.   If
-*                       .    the old reflector is diagonal (only
-*                       .    possible with underflows), then
-*                       .    change it to I.  Otherwise, use
-*                       .    it with trepidation. ====
-*
-                        IF( V( 2, M ).EQ.ZERO .AND. V( 3, M ).EQ.ZERO )
-     $                       THEN
-                           V( 1, M ) = ZERO
-                        ELSE
-                           H( K+1, K ) = BETA
-                           H( K+2, K ) = ZERO
-                           H( K+3, K ) = ZERO
-                        END IF
-                     ELSE
-*
-*                       ==== Stating a new bulge here would
-*                       .    create only negligible fill.
-*                       .    Replace the old reflector with
-*                       .    the new one. ====
-*
-                        ALPHA = VT( 1 )
-                        CALL CLARFG( 3, ALPHA, VT( 2 ), 1, VT( 1 ) )
-                        REFSUM = H( K+1, K ) +
-     $                           H( K+2, K )*CONJG( VT( 2 ) ) +
-     $                           H( K+3, K )*CONJG( VT( 3 ) )
-                        H( K+1, K ) = H( K+1, K ) -
-     $                                CONJG( VT( 1 ) )*REFSUM
-                        H( K+2, K ) = ZERO
-                        H( K+3, K ) = ZERO
-                        V( 1, M ) = VT( 1 )
-                        V( 2, M ) = VT( 2 )
-                        V( 3, M ) = VT( 3 )
-                     END IF
-                  END IF
-               END IF
-   10       CONTINUE
-*
-*           ==== Generate a 2-by-2 reflection, if needed. ====
-*
-            K = KRCOL + 3*( M22-1 )
-            IF( BMP22 ) THEN
-               IF( K.EQ.KTOP-1 ) THEN
-                  CALL CLAQR1( 2, H( K+1, K+1 ), LDH, S( 2*M22-1 ),
-     $                         S( 2*M22 ), V( 1, M22 ) )
-                  BETA = V( 1, M22 )
-                  CALL CLARFG( 2, BETA, V( 2, M22 ), 1, V( 1, M22 ) )
-               ELSE
-                  BETA = H( K+1, K )
-                  V( 2, M22 ) = H( K+2, K )
-                  CALL CLARFG( 2, BETA, V( 2, M22 ), 1, V( 1, M22 ) )
-                  H( K+1, K ) = BETA
-                  H( K+2, K ) = ZERO
-               END IF
-            ELSE
-*
-*              ==== Initialize V(1,M22) here to avoid possible undefined
-*              .    variable problems later. ====
-*
-               V( 1, M22 ) = ZERO
-            END IF
-*
-*           ==== Multiply H by reflections from the left ====
-*
-            IF( ACCUM ) THEN
-               JBOT = MIN( NDCOL, KBOT )
-            ELSE IF( WANTT ) THEN
-               JBOT = N
-            ELSE
-               JBOT = KBOT
-            END IF
-            DO 30 J = MAX( KTOP, KRCOL ), JBOT
-               MEND = MIN( MBOT, ( J-KRCOL+2 ) / 3 )
-               DO 20 M = MTOP, MEND
-                  K = KRCOL + 3*( M-1 )
-                  REFSUM = CONJG( V( 1, M ) )*
-     $                     ( H( K+1, J )+CONJG( V( 2, M ) )*H( K+2, J )+
-     $                     CONJG( V( 3, M ) )*H( K+3, J ) )
-                  H( K+1, J ) = H( K+1, J ) - REFSUM
-                  H( K+2, J ) = H( K+2, J ) - REFSUM*V( 2, M )
-                  H( K+3, J ) = H( K+3, J ) - REFSUM*V( 3, M )
-   20          CONTINUE
-   30       CONTINUE
-            IF( BMP22 ) THEN
-               K = KRCOL + 3*( M22-1 )
-               DO 40 J = MAX( K+1, KTOP ), JBOT
-                  REFSUM = CONJG( V( 1, M22 ) )*
-     $                     ( H( K+1, J )+CONJG( V( 2, M22 ) )*
-     $                     H( K+2, J ) )
-                  H( K+1, J ) = H( K+1, J ) - REFSUM
-                  H( K+2, J ) = H( K+2, J ) - REFSUM*V( 2, M22 )
-   40          CONTINUE
-            END IF
-*
-*           ==== Multiply H by reflections from the right.
-*           .    Delay filling in the last row until the
-*           .    vigilant deflation check is complete. ====
-*
-            IF( ACCUM ) THEN
-               JTOP = MAX( KTOP, INCOL )
-            ELSE IF( WANTT ) THEN
-               JTOP = 1
-            ELSE
-               JTOP = KTOP
-            END IF
-            DO 80 M = MTOP, MBOT
-               IF( V( 1, M ).NE.ZERO ) THEN
-                  K = KRCOL + 3*( M-1 )
-                  DO 50 J = JTOP, MIN( KBOT, K+3 )
-                     REFSUM = V( 1, M )*( H( J, K+1 )+V( 2, M )*
-     $                        H( J, K+2 )+V( 3, M )*H( J, K+3 ) )
-                     H( J, K+1 ) = H( J, K+1 ) - REFSUM
-                     H( J, K+2 ) = H( J, K+2 ) -
-     $                             REFSUM*CONJG( V( 2, M ) )
-                     H( J, K+3 ) = H( J, K+3 ) -
-     $                             REFSUM*CONJG( V( 3, M ) )
-   50             CONTINUE
-*
-                  IF( ACCUM ) THEN
-*
-*                    ==== Accumulate U. (If necessary, update Z later
-*                    .    with with an efficient matrix-matrix
-*                    .    multiply.) ====
-*
-                     KMS = K - INCOL
-                     DO 60 J = MAX( 1, KTOP-INCOL ), KDU
-                        REFSUM = V( 1, M )*( U( J, KMS+1 )+V( 2, M )*
-     $                           U( J, KMS+2 )+V( 3, M )*U( J, KMS+3 ) )
-                        U( J, KMS+1 ) = U( J, KMS+1 ) - REFSUM
-                        U( J, KMS+2 ) = U( J, KMS+2 ) -
-     $                                  REFSUM*CONJG( V( 2, M ) )
-                        U( J, KMS+3 ) = U( J, KMS+3 ) -
-     $                                  REFSUM*CONJG( V( 3, M ) )
-   60                CONTINUE
-                  ELSE IF( WANTZ ) THEN
-*
-*                    ==== U is not accumulated, so update Z
-*                    .    now by multiplying by reflections
-*                    .    from the right. ====
-*
-                     DO 70 J = ILOZ, IHIZ
-                        REFSUM = V( 1, M )*( Z( J, K+1 )+V( 2, M )*
-     $                           Z( J, K+2 )+V( 3, M )*Z( J, K+3 ) )
-                        Z( J, K+1 ) = Z( J, K+1 ) - REFSUM
-                        Z( J, K+2 ) = Z( J, K+2 ) -
-     $                                REFSUM*CONJG( V( 2, M ) )
-                        Z( J, K+3 ) = Z( J, K+3 ) -
-     $                                REFSUM*CONJG( V( 3, M ) )
-   70                CONTINUE
-                  END IF
-               END IF
-   80       CONTINUE
-*
-*           ==== Special case: 2-by-2 reflection (if needed) ====
-*
-            K = KRCOL + 3*( M22-1 )
-            IF( BMP22 .AND. ( V( 1, M22 ).NE.ZERO ) ) THEN
-               DO 90 J = JTOP, MIN( KBOT, K+3 )
-                  REFSUM = V( 1, M22 )*( H( J, K+1 )+V( 2, M22 )*
-     $                     H( J, K+2 ) )
-                  H( J, K+1 ) = H( J, K+1 ) - REFSUM
-                  H( J, K+2 ) = H( J, K+2 ) -
-     $                          REFSUM*CONJG( V( 2, M22 ) )
-   90          CONTINUE
-*
-               IF( ACCUM ) THEN
-                  KMS = K - INCOL
-                  DO 100 J = MAX( 1, KTOP-INCOL ), KDU
-                     REFSUM = V( 1, M22 )*( U( J, KMS+1 )+V( 2, M22 )*
-     $                        U( J, KMS+2 ) )
-                     U( J, KMS+1 ) = U( J, KMS+1 ) - REFSUM
-                     U( J, KMS+2 ) = U( J, KMS+2 ) -
-     $                               REFSUM*CONJG( V( 2, M22 ) )
-  100             CONTINUE
-               ELSE IF( WANTZ ) THEN
-                  DO 110 J = ILOZ, IHIZ
-                     REFSUM = V( 1, M22 )*( Z( J, K+1 )+V( 2, M22 )*
-     $                        Z( J, K+2 ) )
-                     Z( J, K+1 ) = Z( J, K+1 ) - REFSUM
-                     Z( J, K+2 ) = Z( J, K+2 ) -
-     $                             REFSUM*CONJG( V( 2, M22 ) )
-  110             CONTINUE
-               END IF
-            END IF
-*
-*           ==== Vigilant deflation check ====
-*
-            MSTART = MTOP
-            IF( KRCOL+3*( MSTART-1 ).LT.KTOP )
-     $         MSTART = MSTART + 1
-            MEND = MBOT
-            IF( BMP22 )
-     $         MEND = MEND + 1
-            IF( KRCOL.EQ.KBOT-2 )
-     $         MEND = MEND + 1
-            DO 120 M = MSTART, MEND
-               K = MIN( KBOT-1, KRCOL+3*( M-1 ) )
-*
-*              ==== The following convergence test requires that
-*              .    the tradition small-compared-to-nearby-diagonals
-*              .    criterion and the Ahues & Tisseur (LAWN 122, 1997)
-*              .    criteria both be satisfied.  The latter improves
-*              .    accuracy in some examples. Falling back on an
-*              .    alternate convergence criterion when TST1 or TST2
-*              .    is zero (as done here) is traditional but probably
-*              .    unnecessary. ====
-*
-               IF( H( K+1, K ).NE.ZERO ) THEN
-                  TST1 = CABS1( H( K, K ) ) + CABS1( H( K+1, K+1 ) )
-                  IF( TST1.EQ.RZERO ) THEN
-                     IF( K.GE.KTOP+1 )
-     $                  TST1 = TST1 + CABS1( H( K, K-1 ) )
-                     IF( K.GE.KTOP+2 )
-     $                  TST1 = TST1 + CABS1( H( K, K-2 ) )
-                     IF( K.GE.KTOP+3 )
-     $                  TST1 = TST1 + CABS1( H( K, K-3 ) )
-                     IF( K.LE.KBOT-2 )
-     $                  TST1 = TST1 + CABS1( H( K+2, K+1 ) )
-                     IF( K.LE.KBOT-3 )
-     $                  TST1 = TST1 + CABS1( H( K+3, K+1 ) )
-                     IF( K.LE.KBOT-4 )
-     $                  TST1 = TST1 + CABS1( H( K+4, K+1 ) )
-                  END IF
-                  IF( CABS1( H( K+1, K ) ).LE.MAX( SMLNUM, ULP*TST1 ) )
-     $                 THEN
-                     H12 = MAX( CABS1( H( K+1, K ) ),
-     $                     CABS1( H( K, K+1 ) ) )
-                     H21 = MIN( CABS1( H( K+1, K ) ),
-     $                     CABS1( H( K, K+1 ) ) )
-                     H11 = MAX( CABS1( H( K+1, K+1 ) ),
-     $                     CABS1( H( K, K )-H( K+1, K+1 ) ) )
-                     H22 = MIN( CABS1( H( K+1, K+1 ) ),
-     $                     CABS1( H( K, K )-H( K+1, K+1 ) ) )
-                     SCL = H11 + H12
-                     TST2 = H22*( H11 / SCL )
-*
-                     IF( TST2.EQ.RZERO .OR. H21*( H12 / SCL ).LE.
-     $                   MAX( SMLNUM, ULP*TST2 ) )H( K+1, K ) = ZERO
-                  END IF
-               END IF
-  120       CONTINUE
-*
-*           ==== Fill in the last row of each bulge. ====
-*
-            MEND = MIN( NBMPS, ( KBOT-KRCOL-1 ) / 3 )
-            DO 130 M = MTOP, MEND
-               K = KRCOL + 3*( M-1 )
-               REFSUM = V( 1, M )*V( 3, M )*H( K+4, K+3 )
-               H( K+4, K+1 ) = -REFSUM
-               H( K+4, K+2 ) = -REFSUM*CONJG( V( 2, M ) )
-               H( K+4, K+3 ) = H( K+4, K+3 ) - REFSUM*CONJG( V( 3, M ) )
-  130       CONTINUE
-*
-*           ==== End of near-the-diagonal bulge chase. ====
-*
-  140    CONTINUE
-*
-*        ==== Use U (if accumulated) to update far-from-diagonal
-*        .    entries in H.  If required, use U to update Z as
-*        .    well. ====
-*
-         IF( ACCUM ) THEN
-            IF( WANTT ) THEN
-               JTOP = 1
-               JBOT = N
-            ELSE
-               JTOP = KTOP
-               JBOT = KBOT
-            END IF
-            IF( ( .NOT.BLK22 ) .OR. ( INCOL.LT.KTOP ) .OR.
-     $          ( NDCOL.GT.KBOT ) .OR. ( NS.LE.2 ) ) THEN
-*
-*              ==== Updates not exploiting the 2-by-2 block
-*              .    structure of U.  K1 and NU keep track of
-*              .    the location and size of U in the special
-*              .    cases of introducing bulges and chasing
-*              .    bulges off the bottom.  In these special
-*              .    cases and in case the number of shifts
-*              .    is NS = 2, there is no 2-by-2 block
-*              .    structure to exploit.  ====
-*
-               K1 = MAX( 1, KTOP-INCOL )
-               NU = ( KDU-MAX( 0, NDCOL-KBOT ) ) - K1 + 1
-*
-*              ==== Horizontal Multiply ====
-*
-               DO 150 JCOL = MIN( NDCOL, KBOT ) + 1, JBOT, NH
-                  JLEN = MIN( NH, JBOT-JCOL+1 )
-                  CALL CGEMM( 'C', 'N', NU, JLEN, NU, ONE, U( K1, K1 ),
-     $                        LDU, H( INCOL+K1, JCOL ), LDH, ZERO, WH,
-     $                        LDWH )
-                  CALL CLACPY( 'ALL', NU, JLEN, WH, LDWH,
-     $                         H( INCOL+K1, JCOL ), LDH )
-  150          CONTINUE
-*
-*              ==== Vertical multiply ====
-*
-               DO 160 JROW = JTOP, MAX( KTOP, INCOL ) - 1, NV
-                  JLEN = MIN( NV, MAX( KTOP, INCOL )-JROW )
-                  CALL CGEMM( 'N', 'N', JLEN, NU, NU, ONE,
-     $                        H( JROW, INCOL+K1 ), LDH, U( K1, K1 ),
-     $                        LDU, ZERO, WV, LDWV )
-                  CALL CLACPY( 'ALL', JLEN, NU, WV, LDWV,
-     $                         H( JROW, INCOL+K1 ), LDH )
-  160          CONTINUE
-*
-*              ==== Z multiply (also vertical) ====
-*
-               IF( WANTZ ) THEN
-                  DO 170 JROW = ILOZ, IHIZ, NV
-                     JLEN = MIN( NV, IHIZ-JROW+1 )
-                     CALL CGEMM( 'N', 'N', JLEN, NU, NU, ONE,
-     $                           Z( JROW, INCOL+K1 ), LDZ, U( K1, K1 ),
-     $                           LDU, ZERO, WV, LDWV )
-                     CALL CLACPY( 'ALL', JLEN, NU, WV, LDWV,
-     $                            Z( JROW, INCOL+K1 ), LDZ )
-  170             CONTINUE
-               END IF
-            ELSE
-*
-*              ==== Updates exploiting U's 2-by-2 block structure.
-*              .    (I2, I4, J2, J4 are the last rows and columns
-*              .    of the blocks.) ====
-*
-               I2 = ( KDU+1 ) / 2
-               I4 = KDU
-               J2 = I4 - I2
-               J4 = KDU
-*
-*              ==== KZS and KNZ deal with the band of zeros
-*              .    along the diagonal of one of the triangular
-*              .    blocks. ====
-*
-               KZS = ( J4-J2 ) - ( NS+1 )
-               KNZ = NS + 1
-*
-*              ==== Horizontal multiply ====
-*
-               DO 180 JCOL = MIN( NDCOL, KBOT ) + 1, JBOT, NH
-                  JLEN = MIN( NH, JBOT-JCOL+1 )
-*
-*                 ==== Copy bottom of H to top+KZS of scratch ====
-*                  (The first KZS rows get multiplied by zero.) ====
-*
-                  CALL CLACPY( 'ALL', KNZ, JLEN, H( INCOL+1+J2, JCOL ),
-     $                         LDH, WH( KZS+1, 1 ), LDWH )
-*
-*                 ==== Multiply by U21' ====
-*
-                  CALL CLASET( 'ALL', KZS, JLEN, ZERO, ZERO, WH, LDWH )
-                  CALL CTRMM( 'L', 'U', 'C', 'N', KNZ, JLEN, ONE,
-     $                        U( J2+1, 1+KZS ), LDU, WH( KZS+1, 1 ),
-     $                        LDWH )
-*
-*                 ==== Multiply top of H by U11' ====
-*
-                  CALL CGEMM( 'C', 'N', I2, JLEN, J2, ONE, U, LDU,
-     $                        H( INCOL+1, JCOL ), LDH, ONE, WH, LDWH )
-*
-*                 ==== Copy top of H bottom of WH ====
-*
-                  CALL CLACPY( 'ALL', J2, JLEN, H( INCOL+1, JCOL ), LDH,
-     $                         WH( I2+1, 1 ), LDWH )
-*
-*                 ==== Multiply by U21' ====
-*
-                  CALL CTRMM( 'L', 'L', 'C', 'N', J2, JLEN, ONE,
-     $                        U( 1, I2+1 ), LDU, WH( I2+1, 1 ), LDWH )
-*
-*                 ==== Multiply by U22 ====
-*
-                  CALL CGEMM( 'C', 'N', I4-I2, JLEN, J4-J2, ONE,
-     $                        U( J2+1, I2+1 ), LDU,
-     $                        H( INCOL+1+J2, JCOL ), LDH, ONE,
-     $                        WH( I2+1, 1 ), LDWH )
-*
-*                 ==== Copy it back ====
-*
-                  CALL CLACPY( 'ALL', KDU, JLEN, WH, LDWH,
-     $                         H( INCOL+1, JCOL ), LDH )
-  180          CONTINUE
-*
-*              ==== Vertical multiply ====
-*
-               DO 190 JROW = JTOP, MAX( INCOL, KTOP ) - 1, NV
-                  JLEN = MIN( NV, MAX( INCOL, KTOP )-JROW )
-*
-*                 ==== Copy right of H to scratch (the first KZS
-*                 .    columns get multiplied by zero) ====
-*
-                  CALL CLACPY( 'ALL', JLEN, KNZ, H( JROW, INCOL+1+J2 ),
-     $                         LDH, WV( 1, 1+KZS ), LDWV )
-*
-*                 ==== Multiply by U21 ====
-*
-                  CALL CLASET( 'ALL', JLEN, KZS, ZERO, ZERO, WV, LDWV )
-                  CALL CTRMM( 'R', 'U', 'N', 'N', JLEN, KNZ, ONE,
-     $                        U( J2+1, 1+KZS ), LDU, WV( 1, 1+KZS ),
-     $                        LDWV )
-*
-*                 ==== Multiply by U11 ====
-*
-                  CALL CGEMM( 'N', 'N', JLEN, I2, J2, ONE,
-     $                        H( JROW, INCOL+1 ), LDH, U, LDU, ONE, WV,
-     $                        LDWV )
-*
-*                 ==== Copy left of H to right of scratch ====
-*
-                  CALL CLACPY( 'ALL', JLEN, J2, H( JROW, INCOL+1 ), LDH,
-     $                         WV( 1, 1+I2 ), LDWV )
-*
-*                 ==== Multiply by U21 ====
-*
-                  CALL CTRMM( 'R', 'L', 'N', 'N', JLEN, I4-I2, ONE,
-     $                        U( 1, I2+1 ), LDU, WV( 1, 1+I2 ), LDWV )
-*
-*                 ==== Multiply by U22 ====
-*
-                  CALL CGEMM( 'N', 'N', JLEN, I4-I2, J4-J2, ONE,
-     $                        H( JROW, INCOL+1+J2 ), LDH,
-     $                        U( J2+1, I2+1 ), LDU, ONE, WV( 1, 1+I2 ),
-     $                        LDWV )
-*
-*                 ==== Copy it back ====
-*
-                  CALL CLACPY( 'ALL', JLEN, KDU, WV, LDWV,
-     $                         H( JROW, INCOL+1 ), LDH )
-  190          CONTINUE
-*
-*              ==== Multiply Z (also vertical) ====
-*
-               IF( WANTZ ) THEN
-                  DO 200 JROW = ILOZ, IHIZ, NV
-                     JLEN = MIN( NV, IHIZ-JROW+1 )
-*
-*                    ==== Copy right of Z to left of scratch (first
-*                    .     KZS columns get multiplied by zero) ====
-*
-                     CALL CLACPY( 'ALL', JLEN, KNZ,
-     $                            Z( JROW, INCOL+1+J2 ), LDZ,
-     $                            WV( 1, 1+KZS ), LDWV )
-*
-*                    ==== Multiply by U12 ====
-*
-                     CALL CLASET( 'ALL', JLEN, KZS, ZERO, ZERO, WV,
-     $                            LDWV )
-                     CALL CTRMM( 'R', 'U', 'N', 'N', JLEN, KNZ, ONE,
-     $                           U( J2+1, 1+KZS ), LDU, WV( 1, 1+KZS ),
-     $                           LDWV )
-*
-*                    ==== Multiply by U11 ====
-*
-                     CALL CGEMM( 'N', 'N', JLEN, I2, J2, ONE,
-     $                           Z( JROW, INCOL+1 ), LDZ, U, LDU, ONE,
-     $                           WV, LDWV )
-*
-*                    ==== Copy left of Z to right of scratch ====
-*
-                     CALL CLACPY( 'ALL', JLEN, J2, Z( JROW, INCOL+1 ),
-     $                            LDZ, WV( 1, 1+I2 ), LDWV )
-*
-*                    ==== Multiply by U21 ====
-*
-                     CALL CTRMM( 'R', 'L', 'N', 'N', JLEN, I4-I2, ONE,
-     $                           U( 1, I2+1 ), LDU, WV( 1, 1+I2 ),
-     $                           LDWV )
-*
-*                    ==== Multiply by U22 ====
-*
-                     CALL CGEMM( 'N', 'N', JLEN, I4-I2, J4-J2, ONE,
-     $                           Z( JROW, INCOL+1+J2 ), LDZ,
-     $                           U( J2+1, I2+1 ), LDU, ONE,
-     $                           WV( 1, 1+I2 ), LDWV )
-*
-*                    ==== Copy the result back to Z ====
-*
-                     CALL CLACPY( 'ALL', JLEN, KDU, WV, LDWV,
-     $                            Z( JROW, INCOL+1 ), LDZ )
-  200             CONTINUE
-               END IF
-            END IF
-         END IF
-  210 CONTINUE
-*
-*     ==== End of CLAQR5 ====
-*
-      END
--- a/libcruft/lapack/clarf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,120 +0,0 @@
-      SUBROUTINE CLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE
-      INTEGER            INCV, LDC, M, N
-      COMPLEX            TAU
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            C( LDC, * ), V( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLARF applies a complex elementary reflector H to a complex M-by-N
-*  matrix C, from either the left or the right. H is represented in the
-*  form
-*
-*        H = I - tau * v * v'
-*
-*  where tau is a complex scalar and v is a complex vector.
-*
-*  If tau = 0, then H is taken to be the unit matrix.
-*
-*  To apply H' (the conjugate transpose of H), supply conjg(tau) instead
-*  tau.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': form  H * C
-*          = 'R': form  C * H
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  V       (input) COMPLEX array, dimension
-*                     (1 + (M-1)*abs(INCV)) if SIDE = 'L'
-*                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R'
-*          The vector v in the representation of H. V is not used if
-*          TAU = 0.
-*
-*  INCV    (input) INTEGER
-*          The increment between elements of v. INCV <> 0.
-*
-*  TAU     (input) COMPLEX
-*          The value tau in the representation of H.
-*
-*  C       (input/output) COMPLEX array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by the matrix H * C if SIDE = 'L',
-*          or C * H if SIDE = 'R'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) COMPLEX array, dimension
-*                         (N) if SIDE = 'L'
-*                      or (M) if SIDE = 'R'
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ),
-     $                   ZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEMV, CGERC
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  H * C
-*
-         IF( TAU.NE.ZERO ) THEN
-*
-*           w := C' * v
-*
-            CALL CGEMV( 'Conjugate transpose', M, N, ONE, C, LDC, V,
-     $                  INCV, ZERO, WORK, 1 )
-*
-*           C := C - v * w'
-*
-            CALL CGERC( M, N, -TAU, V, INCV, WORK, 1, C, LDC )
-         END IF
-      ELSE
-*
-*        Form  C * H
-*
-         IF( TAU.NE.ZERO ) THEN
-*
-*           w := C * v
-*
-            CALL CGEMV( 'No transpose', M, N, ONE, C, LDC, V, INCV,
-     $                  ZERO, WORK, 1 )
-*
-*           C := C - w * v'
-*
-            CALL CGERC( M, N, -TAU, WORK, 1, V, INCV, C, LDC )
-         END IF
-      END IF
-      RETURN
-*
-*     End of CLARF
-*
-      END
--- a/libcruft/lapack/clarfb.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,608 +0,0 @@
-      SUBROUTINE CLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,
-     $                   T, LDT, C, LDC, WORK, LDWORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, SIDE, STOREV, TRANS
-      INTEGER            K, LDC, LDT, LDV, LDWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            C( LDC, * ), T( LDT, * ), V( LDV, * ),
-     $                   WORK( LDWORK, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLARFB applies a complex block reflector H or its transpose H' to a
-*  complex M-by-N matrix C, from either the left or the right.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply H or H' from the Left
-*          = 'R': apply H or H' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply H (No transpose)
-*          = 'C': apply H' (Conjugate transpose)
-*
-*  DIRECT  (input) CHARACTER*1
-*          Indicates how H is formed from a product of elementary
-*          reflectors
-*          = 'F': H = H(1) H(2) . . . H(k) (Forward)
-*          = 'B': H = H(k) . . . H(2) H(1) (Backward)
-*
-*  STOREV  (input) CHARACTER*1
-*          Indicates how the vectors which define the elementary
-*          reflectors are stored:
-*          = 'C': Columnwise
-*          = 'R': Rowwise
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  K       (input) INTEGER
-*          The order of the matrix T (= the number of elementary
-*          reflectors whose product defines the block reflector).
-*
-*  V       (input) COMPLEX array, dimension
-*                                (LDV,K) if STOREV = 'C'
-*                                (LDV,M) if STOREV = 'R' and SIDE = 'L'
-*                                (LDV,N) if STOREV = 'R' and SIDE = 'R'
-*          The matrix V. See further details.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V.
-*          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M);
-*          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N);
-*          if STOREV = 'R', LDV >= K.
-*
-*  T       (input) COMPLEX array, dimension (LDT,K)
-*          The triangular K-by-K matrix T in the representation of the
-*          block reflector.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= K.
-*
-*  C       (input/output) COMPLEX array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by H*C or H'*C or C*H or C*H'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) COMPLEX array, dimension (LDWORK,K)
-*
-*  LDWORK  (input) INTEGER
-*          The leading dimension of the array WORK.
-*          If SIDE = 'L', LDWORK >= max(1,N);
-*          if SIDE = 'R', LDWORK >= max(1,M).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      CHARACTER          TRANST
-      INTEGER            I, J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CCOPY, CGEMM, CLACGV, CTRMM
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CONJG
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 .OR. N.LE.0 )
-     $   RETURN
-*
-      IF( LSAME( TRANS, 'N' ) ) THEN
-         TRANST = 'C'
-      ELSE
-         TRANST = 'N'
-      END IF
-*
-      IF( LSAME( STOREV, 'C' ) ) THEN
-*
-         IF( LSAME( DIRECT, 'F' ) ) THEN
-*
-*           Let  V =  ( V1 )    (first K rows)
-*                     ( V2 )
-*           where  V1  is unit lower triangular.
-*
-            IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*              Form  H * C  or  H' * C  where  C = ( C1 )
-*                                                  ( C2 )
-*
-*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK)
-*
-*              W := C1'
-*
-               DO 10 J = 1, K
-                  CALL CCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 )
-                  CALL CLACGV( N, WORK( 1, J ), 1 )
-   10          CONTINUE
-*
-*              W := W * V1
-*
-               CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', N,
-     $                     K, ONE, V, LDV, WORK, LDWORK )
-               IF( M.GT.K ) THEN
-*
-*                 W := W + C2'*V2
-*
-                  CALL CGEMM( 'Conjugate transpose', 'No transpose', N,
-     $                        K, M-K, ONE, C( K+1, 1 ), LDC,
-     $                        V( K+1, 1 ), LDV, ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T'  or  W * T
-*
-               CALL CTRMM( 'Right', 'Upper', TRANST, 'Non-unit', N, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - V * W'
-*
-               IF( M.GT.K ) THEN
-*
-*                 C2 := C2 - V2 * W'
-*
-                  CALL CGEMM( 'No transpose', 'Conjugate transpose',
-     $                        M-K, N, K, -ONE, V( K+1, 1 ), LDV, WORK,
-     $                        LDWORK, ONE, C( K+1, 1 ), LDC )
-               END IF
-*
-*              W := W * V1'
-*
-               CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose',
-     $                     'Unit', N, K, ONE, V, LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W'
-*
-               DO 30 J = 1, K
-                  DO 20 I = 1, N
-                     C( J, I ) = C( J, I ) - CONJG( WORK( I, J ) )
-   20             CONTINUE
-   30          CONTINUE
-*
-            ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*              Form  C * H  or  C * H'  where  C = ( C1  C2 )
-*
-*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)
-*
-*              W := C1
-*
-               DO 40 J = 1, K
-                  CALL CCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 )
-   40          CONTINUE
-*
-*              W := W * V1
-*
-               CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', M,
-     $                     K, ONE, V, LDV, WORK, LDWORK )
-               IF( N.GT.K ) THEN
-*
-*                 W := W + C2 * V2
-*
-                  CALL CGEMM( 'No transpose', 'No transpose', M, K, N-K,
-     $                        ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV,
-     $                        ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T  or  W * T'
-*
-               CALL CTRMM( 'Right', 'Upper', TRANS, 'Non-unit', M, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - W * V'
-*
-               IF( N.GT.K ) THEN
-*
-*                 C2 := C2 - W * V2'
-*
-                  CALL CGEMM( 'No transpose', 'Conjugate transpose', M,
-     $                        N-K, K, -ONE, WORK, LDWORK, V( K+1, 1 ),
-     $                        LDV, ONE, C( 1, K+1 ), LDC )
-               END IF
-*
-*              W := W * V1'
-*
-               CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose',
-     $                     'Unit', M, K, ONE, V, LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W
-*
-               DO 60 J = 1, K
-                  DO 50 I = 1, M
-                     C( I, J ) = C( I, J ) - WORK( I, J )
-   50             CONTINUE
-   60          CONTINUE
-            END IF
-*
-         ELSE
-*
-*           Let  V =  ( V1 )
-*                     ( V2 )    (last K rows)
-*           where  V2  is unit upper triangular.
-*
-            IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*              Form  H * C  or  H' * C  where  C = ( C1 )
-*                                                  ( C2 )
-*
-*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK)
-*
-*              W := C2'
-*
-               DO 70 J = 1, K
-                  CALL CCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ), 1 )
-                  CALL CLACGV( N, WORK( 1, J ), 1 )
-   70          CONTINUE
-*
-*              W := W * V2
-*
-               CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', N,
-     $                     K, ONE, V( M-K+1, 1 ), LDV, WORK, LDWORK )
-               IF( M.GT.K ) THEN
-*
-*                 W := W + C1'*V1
-*
-                  CALL CGEMM( 'Conjugate transpose', 'No transpose', N,
-     $                        K, M-K, ONE, C, LDC, V, LDV, ONE, WORK,
-     $                        LDWORK )
-               END IF
-*
-*              W := W * T'  or  W * T
-*
-               CALL CTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - V * W'
-*
-               IF( M.GT.K ) THEN
-*
-*                 C1 := C1 - V1 * W'
-*
-                  CALL CGEMM( 'No transpose', 'Conjugate transpose',
-     $                        M-K, N, K, -ONE, V, LDV, WORK, LDWORK,
-     $                        ONE, C, LDC )
-               END IF
-*
-*              W := W * V2'
-*
-               CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose',
-     $                     'Unit', N, K, ONE, V( M-K+1, 1 ), LDV, WORK,
-     $                     LDWORK )
-*
-*              C2 := C2 - W'
-*
-               DO 90 J = 1, K
-                  DO 80 I = 1, N
-                     C( M-K+J, I ) = C( M-K+J, I ) -
-     $                               CONJG( WORK( I, J ) )
-   80             CONTINUE
-   90          CONTINUE
-*
-            ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*              Form  C * H  or  C * H'  where  C = ( C1  C2 )
-*
-*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)
-*
-*              W := C2
-*
-               DO 100 J = 1, K
-                  CALL CCOPY( M, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )
-  100          CONTINUE
-*
-*              W := W * V2
-*
-               CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', M,
-     $                     K, ONE, V( N-K+1, 1 ), LDV, WORK, LDWORK )
-               IF( N.GT.K ) THEN
-*
-*                 W := W + C1 * V1
-*
-                  CALL CGEMM( 'No transpose', 'No transpose', M, K, N-K,
-     $                        ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T  or  W * T'
-*
-               CALL CTRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - W * V'
-*
-               IF( N.GT.K ) THEN
-*
-*                 C1 := C1 - W * V1'
-*
-                  CALL CGEMM( 'No transpose', 'Conjugate transpose', M,
-     $                        N-K, K, -ONE, WORK, LDWORK, V, LDV, ONE,
-     $                        C, LDC )
-               END IF
-*
-*              W := W * V2'
-*
-               CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose',
-     $                     'Unit', M, K, ONE, V( N-K+1, 1 ), LDV, WORK,
-     $                     LDWORK )
-*
-*              C2 := C2 - W
-*
-               DO 120 J = 1, K
-                  DO 110 I = 1, M
-                     C( I, N-K+J ) = C( I, N-K+J ) - WORK( I, J )
-  110             CONTINUE
-  120          CONTINUE
-            END IF
-         END IF
-*
-      ELSE IF( LSAME( STOREV, 'R' ) ) THEN
-*
-         IF( LSAME( DIRECT, 'F' ) ) THEN
-*
-*           Let  V =  ( V1  V2 )    (V1: first K columns)
-*           where  V1  is unit upper triangular.
-*
-            IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*              Form  H * C  or  H' * C  where  C = ( C1 )
-*                                                  ( C2 )
-*
-*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK)
-*
-*              W := C1'
-*
-               DO 130 J = 1, K
-                  CALL CCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 )
-                  CALL CLACGV( N, WORK( 1, J ), 1 )
-  130          CONTINUE
-*
-*              W := W * V1'
-*
-               CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose',
-     $                     'Unit', N, K, ONE, V, LDV, WORK, LDWORK )
-               IF( M.GT.K ) THEN
-*
-*                 W := W + C2'*V2'
-*
-                  CALL CGEMM( 'Conjugate transpose',
-     $                        'Conjugate transpose', N, K, M-K, ONE,
-     $                        C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, ONE,
-     $                        WORK, LDWORK )
-               END IF
-*
-*              W := W * T'  or  W * T
-*
-               CALL CTRMM( 'Right', 'Upper', TRANST, 'Non-unit', N, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - V' * W'
-*
-               IF( M.GT.K ) THEN
-*
-*                 C2 := C2 - V2' * W'
-*
-                  CALL CGEMM( 'Conjugate transpose',
-     $                        'Conjugate transpose', M-K, N, K, -ONE,
-     $                        V( 1, K+1 ), LDV, WORK, LDWORK, ONE,
-     $                        C( K+1, 1 ), LDC )
-               END IF
-*
-*              W := W * V1
-*
-               CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', N,
-     $                     K, ONE, V, LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W'
-*
-               DO 150 J = 1, K
-                  DO 140 I = 1, N
-                     C( J, I ) = C( J, I ) - CONJG( WORK( I, J ) )
-  140             CONTINUE
-  150          CONTINUE
-*
-            ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*              Form  C * H  or  C * H'  where  C = ( C1  C2 )
-*
-*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK)
-*
-*              W := C1
-*
-               DO 160 J = 1, K
-                  CALL CCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 )
-  160          CONTINUE
-*
-*              W := W * V1'
-*
-               CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose',
-     $                     'Unit', M, K, ONE, V, LDV, WORK, LDWORK )
-               IF( N.GT.K ) THEN
-*
-*                 W := W + C2 * V2'
-*
-                  CALL CGEMM( 'No transpose', 'Conjugate transpose', M,
-     $                        K, N-K, ONE, C( 1, K+1 ), LDC,
-     $                        V( 1, K+1 ), LDV, ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T  or  W * T'
-*
-               CALL CTRMM( 'Right', 'Upper', TRANS, 'Non-unit', M, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - W * V
-*
-               IF( N.GT.K ) THEN
-*
-*                 C2 := C2 - W * V2
-*
-                  CALL CGEMM( 'No transpose', 'No transpose', M, N-K, K,
-     $                        -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, ONE,
-     $                        C( 1, K+1 ), LDC )
-               END IF
-*
-*              W := W * V1
-*
-               CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', M,
-     $                     K, ONE, V, LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W
-*
-               DO 180 J = 1, K
-                  DO 170 I = 1, M
-                     C( I, J ) = C( I, J ) - WORK( I, J )
-  170             CONTINUE
-  180          CONTINUE
-*
-            END IF
-*
-         ELSE
-*
-*           Let  V =  ( V1  V2 )    (V2: last K columns)
-*           where  V2  is unit lower triangular.
-*
-            IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*              Form  H * C  or  H' * C  where  C = ( C1 )
-*                                                  ( C2 )
-*
-*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK)
-*
-*              W := C2'
-*
-               DO 190 J = 1, K
-                  CALL CCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ), 1 )
-                  CALL CLACGV( N, WORK( 1, J ), 1 )
-  190          CONTINUE
-*
-*              W := W * V2'
-*
-               CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose',
-     $                     'Unit', N, K, ONE, V( 1, M-K+1 ), LDV, WORK,
-     $                     LDWORK )
-               IF( M.GT.K ) THEN
-*
-*                 W := W + C1'*V1'
-*
-                  CALL CGEMM( 'Conjugate transpose',
-     $                        'Conjugate transpose', N, K, M-K, ONE, C,
-     $                        LDC, V, LDV, ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T'  or  W * T
-*
-               CALL CTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - V' * W'
-*
-               IF( M.GT.K ) THEN
-*
-*                 C1 := C1 - V1' * W'
-*
-                  CALL CGEMM( 'Conjugate transpose',
-     $                        'Conjugate transpose', M-K, N, K, -ONE, V,
-     $                        LDV, WORK, LDWORK, ONE, C, LDC )
-               END IF
-*
-*              W := W * V2
-*
-               CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', N,
-     $                     K, ONE, V( 1, M-K+1 ), LDV, WORK, LDWORK )
-*
-*              C2 := C2 - W'
-*
-               DO 210 J = 1, K
-                  DO 200 I = 1, N
-                     C( M-K+J, I ) = C( M-K+J, I ) -
-     $                               CONJG( WORK( I, J ) )
-  200             CONTINUE
-  210          CONTINUE
-*
-            ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*              Form  C * H  or  C * H'  where  C = ( C1  C2 )
-*
-*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK)
-*
-*              W := C2
-*
-               DO 220 J = 1, K
-                  CALL CCOPY( M, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )
-  220          CONTINUE
-*
-*              W := W * V2'
-*
-               CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose',
-     $                     'Unit', M, K, ONE, V( 1, N-K+1 ), LDV, WORK,
-     $                     LDWORK )
-               IF( N.GT.K ) THEN
-*
-*                 W := W + C1 * V1'
-*
-                  CALL CGEMM( 'No transpose', 'Conjugate transpose', M,
-     $                        K, N-K, ONE, C, LDC, V, LDV, ONE, WORK,
-     $                        LDWORK )
-               END IF
-*
-*              W := W * T  or  W * T'
-*
-               CALL CTRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - W * V
-*
-               IF( N.GT.K ) THEN
-*
-*                 C1 := C1 - W * V1
-*
-                  CALL CGEMM( 'No transpose', 'No transpose', M, N-K, K,
-     $                        -ONE, WORK, LDWORK, V, LDV, ONE, C, LDC )
-               END IF
-*
-*              W := W * V2
-*
-               CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', M,
-     $                     K, ONE, V( 1, N-K+1 ), LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W
-*
-               DO 240 J = 1, K
-                  DO 230 I = 1, M
-                     C( I, N-K+J ) = C( I, N-K+J ) - WORK( I, J )
-  230             CONTINUE
-  240          CONTINUE
-*
-            END IF
-*
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of CLARFB
-*
-      END
--- a/libcruft/lapack/clarfg.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-      SUBROUTINE CLARFG( N, ALPHA, X, INCX, TAU )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-      COMPLEX            ALPHA, TAU
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLARFG generates a complex elementary reflector H of order n, such
-*  that
-*
-*        H' * ( alpha ) = ( beta ),   H' * H = I.
-*             (   x   )   (   0  )
-*
-*  where alpha and beta are scalars, with beta real, and x is an
-*  (n-1)-element complex vector. H is represented in the form
-*
-*        H = I - tau * ( 1 ) * ( 1 v' ) ,
-*                      ( v )
-*
-*  where tau is a complex scalar and v is a complex (n-1)-element
-*  vector. Note that H is not hermitian.
-*
-*  If the elements of x are all zero and alpha is real, then tau = 0
-*  and H is taken to be the unit matrix.
-*
-*  Otherwise  1 <= real(tau) <= 2  and  abs(tau-1) <= 1 .
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the elementary reflector.
-*
-*  ALPHA   (input/output) COMPLEX
-*          On entry, the value alpha.
-*          On exit, it is overwritten with the value beta.
-*
-*  X       (input/output) COMPLEX array, dimension
-*                         (1+(N-2)*abs(INCX))
-*          On entry, the vector x.
-*          On exit, it is overwritten with the vector v.
-*
-*  INCX    (input) INTEGER
-*          The increment between elements of X. INCX > 0.
-*
-*  TAU     (output) COMPLEX
-*          The value tau.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            J, KNT
-      REAL               ALPHI, ALPHR, BETA, RSAFMN, SAFMIN, XNORM
-*     ..
-*     .. External Functions ..
-      REAL               SCNRM2, SLAMCH, SLAPY3
-      COMPLEX            CLADIV
-      EXTERNAL           SCNRM2, SLAMCH, SLAPY3, CLADIV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, CMPLX, REAL, SIGN
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CSCAL, CSSCAL
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.LE.0 ) THEN
-         TAU = ZERO
-         RETURN
-      END IF
-*
-      XNORM = SCNRM2( N-1, X, INCX )
-      ALPHR = REAL( ALPHA )
-      ALPHI = AIMAG( ALPHA )
-*
-      IF( XNORM.EQ.ZERO .AND. ALPHI.EQ.ZERO ) THEN
-*
-*        H  =  I
-*
-         TAU = ZERO
-      ELSE
-*
-*        general case
-*
-         BETA = -SIGN( SLAPY3( ALPHR, ALPHI, XNORM ), ALPHR )
-         SAFMIN = SLAMCH( 'S' ) / SLAMCH( 'E' )
-         RSAFMN = ONE / SAFMIN
-*
-         IF( ABS( BETA ).LT.SAFMIN ) THEN
-*
-*           XNORM, BETA may be inaccurate; scale X and recompute them
-*
-            KNT = 0
-   10       CONTINUE
-            KNT = KNT + 1
-            CALL CSSCAL( N-1, RSAFMN, X, INCX )
-            BETA = BETA*RSAFMN
-            ALPHI = ALPHI*RSAFMN
-            ALPHR = ALPHR*RSAFMN
-            IF( ABS( BETA ).LT.SAFMIN )
-     $         GO TO 10
-*
-*           New BETA is at most 1, at least SAFMIN
-*
-            XNORM = SCNRM2( N-1, X, INCX )
-            ALPHA = CMPLX( ALPHR, ALPHI )
-            BETA = -SIGN( SLAPY3( ALPHR, ALPHI, XNORM ), ALPHR )
-            TAU = CMPLX( ( BETA-ALPHR ) / BETA, -ALPHI / BETA )
-            ALPHA = CLADIV( CMPLX( ONE ), ALPHA-BETA )
-            CALL CSCAL( N-1, ALPHA, X, INCX )
-*
-*           If ALPHA is subnormal, it may lose relative accuracy
-*
-            ALPHA = BETA
-            DO 20 J = 1, KNT
-               ALPHA = ALPHA*SAFMIN
-   20       CONTINUE
-         ELSE
-            TAU = CMPLX( ( BETA-ALPHR ) / BETA, -ALPHI / BETA )
-            ALPHA = CLADIV( CMPLX( ONE ), ALPHA-BETA )
-            CALL CSCAL( N-1, ALPHA, X, INCX )
-            ALPHA = BETA
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of CLARFG
-*
-      END
--- a/libcruft/lapack/clarft.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,224 +0,0 @@
-      SUBROUTINE CLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, STOREV
-      INTEGER            K, LDT, LDV, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            T( LDT, * ), TAU( * ), V( LDV, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLARFT forms the triangular factor T of a complex block reflector H
-*  of order n, which is defined as a product of k elementary reflectors.
-*
-*  If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular;
-*
-*  If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular.
-*
-*  If STOREV = 'C', the vector which defines the elementary reflector
-*  H(i) is stored in the i-th column of the array V, and
-*
-*     H  =  I - V * T * V'
-*
-*  If STOREV = 'R', the vector which defines the elementary reflector
-*  H(i) is stored in the i-th row of the array V, and
-*
-*     H  =  I - V' * T * V
-*
-*  Arguments
-*  =========
-*
-*  DIRECT  (input) CHARACTER*1
-*          Specifies the order in which the elementary reflectors are
-*          multiplied to form the block reflector:
-*          = 'F': H = H(1) H(2) . . . H(k) (Forward)
-*          = 'B': H = H(k) . . . H(2) H(1) (Backward)
-*
-*  STOREV  (input) CHARACTER*1
-*          Specifies how the vectors which define the elementary
-*          reflectors are stored (see also Further Details):
-*          = 'C': columnwise
-*          = 'R': rowwise
-*
-*  N       (input) INTEGER
-*          The order of the block reflector H. N >= 0.
-*
-*  K       (input) INTEGER
-*          The order of the triangular factor T (= the number of
-*          elementary reflectors). K >= 1.
-*
-*  V       (input/output) COMPLEX array, dimension
-*                               (LDV,K) if STOREV = 'C'
-*                               (LDV,N) if STOREV = 'R'
-*          The matrix V. See further details.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V.
-*          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K.
-*
-*  TAU     (input) COMPLEX array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i).
-*
-*  T       (output) COMPLEX array, dimension (LDT,K)
-*          The k by k triangular factor T of the block reflector.
-*          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is
-*          lower triangular. The rest of the array is not used.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= K.
-*
-*  Further Details
-*  ===============
-*
-*  The shape of the matrix V and the storage of the vectors which define
-*  the H(i) is best illustrated by the following example with n = 5 and
-*  k = 3. The elements equal to 1 are not stored; the corresponding
-*  array elements are modified but restored on exit. The rest of the
-*  array is not used.
-*
-*  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':
-*
-*               V = (  1       )                 V = (  1 v1 v1 v1 v1 )
-*                   ( v1  1    )                     (     1 v2 v2 v2 )
-*                   ( v1 v2  1 )                     (        1 v3 v3 )
-*                   ( v1 v2 v3 )
-*                   ( v1 v2 v3 )
-*
-*  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R':
-*
-*               V = ( v1 v2 v3 )                 V = ( v1 v1  1       )
-*                   ( v1 v2 v3 )                     ( v2 v2 v2  1    )
-*                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 )
-*                   (     1 v3 )
-*                   (        1 )
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ),
-     $                   ZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      COMPLEX            VII
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEMV, CLACGV, CTRMV
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( LSAME( DIRECT, 'F' ) ) THEN
-         DO 20 I = 1, K
-            IF( TAU( I ).EQ.ZERO ) THEN
-*
-*              H(i)  =  I
-*
-               DO 10 J = 1, I
-                  T( J, I ) = ZERO
-   10          CONTINUE
-            ELSE
-*
-*              general case
-*
-               VII = V( I, I )
-               V( I, I ) = ONE
-               IF( LSAME( STOREV, 'C' ) ) THEN
-*
-*                 T(1:i-1,i) := - tau(i) * V(i:n,1:i-1)' * V(i:n,i)
-*
-                  CALL CGEMV( 'Conjugate transpose', N-I+1, I-1,
-     $                        -TAU( I ), V( I, 1 ), LDV, V( I, I ), 1,
-     $                        ZERO, T( 1, I ), 1 )
-               ELSE
-*
-*                 T(1:i-1,i) := - tau(i) * V(1:i-1,i:n) * V(i,i:n)'
-*
-                  IF( I.LT.N )
-     $               CALL CLACGV( N-I, V( I, I+1 ), LDV )
-                  CALL CGEMV( 'No transpose', I-1, N-I+1, -TAU( I ),
-     $                        V( 1, I ), LDV, V( I, I ), LDV, ZERO,
-     $                        T( 1, I ), 1 )
-                  IF( I.LT.N )
-     $               CALL CLACGV( N-I, V( I, I+1 ), LDV )
-               END IF
-               V( I, I ) = VII
-*
-*              T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i)
-*
-               CALL CTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T,
-     $                     LDT, T( 1, I ), 1 )
-               T( I, I ) = TAU( I )
-            END IF
-   20    CONTINUE
-      ELSE
-         DO 40 I = K, 1, -1
-            IF( TAU( I ).EQ.ZERO ) THEN
-*
-*              H(i)  =  I
-*
-               DO 30 J = I, K
-                  T( J, I ) = ZERO
-   30          CONTINUE
-            ELSE
-*
-*              general case
-*
-               IF( I.LT.K ) THEN
-                  IF( LSAME( STOREV, 'C' ) ) THEN
-                     VII = V( N-K+I, I )
-                     V( N-K+I, I ) = ONE
-*
-*                    T(i+1:k,i) :=
-*                            - tau(i) * V(1:n-k+i,i+1:k)' * V(1:n-k+i,i)
-*
-                     CALL CGEMV( 'Conjugate transpose', N-K+I, K-I,
-     $                           -TAU( I ), V( 1, I+1 ), LDV, V( 1, I ),
-     $                           1, ZERO, T( I+1, I ), 1 )
-                     V( N-K+I, I ) = VII
-                  ELSE
-                     VII = V( I, N-K+I )
-                     V( I, N-K+I ) = ONE
-*
-*                    T(i+1:k,i) :=
-*                            - tau(i) * V(i+1:k,1:n-k+i) * V(i,1:n-k+i)'
-*
-                     CALL CLACGV( N-K+I-1, V( I, 1 ), LDV )
-                     CALL CGEMV( 'No transpose', K-I, N-K+I, -TAU( I ),
-     $                           V( I+1, 1 ), LDV, V( I, 1 ), LDV, ZERO,
-     $                           T( I+1, I ), 1 )
-                     CALL CLACGV( N-K+I-1, V( I, 1 ), LDV )
-                     V( I, N-K+I ) = VII
-                  END IF
-*
-*                 T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i)
-*
-                  CALL CTRMV( 'Lower', 'No transpose', 'Non-unit', K-I,
-     $                        T( I+1, I+1 ), LDT, T( I+1, I ), 1 )
-               END IF
-               T( I, I ) = TAU( I )
-            END IF
-   40    CONTINUE
-      END IF
-      RETURN
-*
-*     End of CLARFT
-*
-      END
--- a/libcruft/lapack/clarfx.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,640 +0,0 @@
-      SUBROUTINE CLARFX( SIDE, M, N, V, TAU, C, LDC, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE
-      INTEGER            LDC, M, N
-      COMPLEX            TAU
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            C( LDC, * ), V( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLARFX applies a complex elementary reflector H to a complex m by n
-*  matrix C, from either the left or the right. H is represented in the
-*  form
-*
-*        H = I - tau * v * v'
-*
-*  where tau is a complex scalar and v is a complex vector.
-*
-*  If tau = 0, then H is taken to be the unit matrix
-*
-*  This version uses inline code if H has order < 11.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': form  H * C
-*          = 'R': form  C * H
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  V       (input) COMPLEX array, dimension (M) if SIDE = 'L'
-*                                        or (N) if SIDE = 'R'
-*          The vector v in the representation of H.
-*
-*  TAU     (input) COMPLEX
-*          The value tau in the representation of H.
-*
-*  C       (input/output) COMPLEX array, dimension (LDC,N)
-*          On entry, the m by n matrix C.
-*          On exit, C is overwritten by the matrix H * C if SIDE = 'L',
-*          or C * H if SIDE = 'R'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDA >= max(1,M).
-*
-*  WORK    (workspace) COMPLEX array, dimension (N) if SIDE = 'L'
-*                                            or (M) if SIDE = 'R'
-*          WORK is not referenced if H has order < 11.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ),
-     $                   ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            J
-      COMPLEX            SUM, T1, T10, T2, T3, T4, T5, T6, T7, T8, T9,
-     $                   V1, V10, V2, V3, V4, V5, V6, V7, V8, V9
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEMV, CGERC
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CONJG
-*     ..
-*     .. Executable Statements ..
-*
-      IF( TAU.EQ.ZERO )
-     $   RETURN
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  H * C, where H has order m.
-*
-         GO TO ( 10, 30, 50, 70, 90, 110, 130, 150,
-     $           170, 190 )M
-*
-*        Code for general M
-*
-*        w := C'*v
-*
-         CALL CGEMV( 'Conjugate transpose', M, N, ONE, C, LDC, V, 1,
-     $               ZERO, WORK, 1 )
-*
-*        C := C - tau * v * w'
-*
-         CALL CGERC( M, N, -TAU, V, 1, WORK, 1, C, LDC )
-         GO TO 410
-   10    CONTINUE
-*
-*        Special code for 1 x 1 Householder
-*
-         T1 = ONE - TAU*V( 1 )*CONJG( V( 1 ) )
-         DO 20 J = 1, N
-            C( 1, J ) = T1*C( 1, J )
-   20    CONTINUE
-         GO TO 410
-   30    CONTINUE
-*
-*        Special code for 2 x 2 Householder
-*
-         V1 = CONJG( V( 1 ) )
-         T1 = TAU*CONJG( V1 )
-         V2 = CONJG( V( 2 ) )
-         T2 = TAU*CONJG( V2 )
-         DO 40 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-   40    CONTINUE
-         GO TO 410
-   50    CONTINUE
-*
-*        Special code for 3 x 3 Householder
-*
-         V1 = CONJG( V( 1 ) )
-         T1 = TAU*CONJG( V1 )
-         V2 = CONJG( V( 2 ) )
-         T2 = TAU*CONJG( V2 )
-         V3 = CONJG( V( 3 ) )
-         T3 = TAU*CONJG( V3 )
-         DO 60 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-   60    CONTINUE
-         GO TO 410
-   70    CONTINUE
-*
-*        Special code for 4 x 4 Householder
-*
-         V1 = CONJG( V( 1 ) )
-         T1 = TAU*CONJG( V1 )
-         V2 = CONJG( V( 2 ) )
-         T2 = TAU*CONJG( V2 )
-         V3 = CONJG( V( 3 ) )
-         T3 = TAU*CONJG( V3 )
-         V4 = CONJG( V( 4 ) )
-         T4 = TAU*CONJG( V4 )
-         DO 80 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-   80    CONTINUE
-         GO TO 410
-   90    CONTINUE
-*
-*        Special code for 5 x 5 Householder
-*
-         V1 = CONJG( V( 1 ) )
-         T1 = TAU*CONJG( V1 )
-         V2 = CONJG( V( 2 ) )
-         T2 = TAU*CONJG( V2 )
-         V3 = CONJG( V( 3 ) )
-         T3 = TAU*CONJG( V3 )
-         V4 = CONJG( V( 4 ) )
-         T4 = TAU*CONJG( V4 )
-         V5 = CONJG( V( 5 ) )
-         T5 = TAU*CONJG( V5 )
-         DO 100 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-  100    CONTINUE
-         GO TO 410
-  110    CONTINUE
-*
-*        Special code for 6 x 6 Householder
-*
-         V1 = CONJG( V( 1 ) )
-         T1 = TAU*CONJG( V1 )
-         V2 = CONJG( V( 2 ) )
-         T2 = TAU*CONJG( V2 )
-         V3 = CONJG( V( 3 ) )
-         T3 = TAU*CONJG( V3 )
-         V4 = CONJG( V( 4 ) )
-         T4 = TAU*CONJG( V4 )
-         V5 = CONJG( V( 5 ) )
-         T5 = TAU*CONJG( V5 )
-         V6 = CONJG( V( 6 ) )
-         T6 = TAU*CONJG( V6 )
-         DO 120 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-  120    CONTINUE
-         GO TO 410
-  130    CONTINUE
-*
-*        Special code for 7 x 7 Householder
-*
-         V1 = CONJG( V( 1 ) )
-         T1 = TAU*CONJG( V1 )
-         V2 = CONJG( V( 2 ) )
-         T2 = TAU*CONJG( V2 )
-         V3 = CONJG( V( 3 ) )
-         T3 = TAU*CONJG( V3 )
-         V4 = CONJG( V( 4 ) )
-         T4 = TAU*CONJG( V4 )
-         V5 = CONJG( V( 5 ) )
-         T5 = TAU*CONJG( V5 )
-         V6 = CONJG( V( 6 ) )
-         T6 = TAU*CONJG( V6 )
-         V7 = CONJG( V( 7 ) )
-         T7 = TAU*CONJG( V7 )
-         DO 140 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J ) +
-     $            V7*C( 7, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-            C( 7, J ) = C( 7, J ) - SUM*T7
-  140    CONTINUE
-         GO TO 410
-  150    CONTINUE
-*
-*        Special code for 8 x 8 Householder
-*
-         V1 = CONJG( V( 1 ) )
-         T1 = TAU*CONJG( V1 )
-         V2 = CONJG( V( 2 ) )
-         T2 = TAU*CONJG( V2 )
-         V3 = CONJG( V( 3 ) )
-         T3 = TAU*CONJG( V3 )
-         V4 = CONJG( V( 4 ) )
-         T4 = TAU*CONJG( V4 )
-         V5 = CONJG( V( 5 ) )
-         T5 = TAU*CONJG( V5 )
-         V6 = CONJG( V( 6 ) )
-         T6 = TAU*CONJG( V6 )
-         V7 = CONJG( V( 7 ) )
-         T7 = TAU*CONJG( V7 )
-         V8 = CONJG( V( 8 ) )
-         T8 = TAU*CONJG( V8 )
-         DO 160 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J ) +
-     $            V7*C( 7, J ) + V8*C( 8, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-            C( 7, J ) = C( 7, J ) - SUM*T7
-            C( 8, J ) = C( 8, J ) - SUM*T8
-  160    CONTINUE
-         GO TO 410
-  170    CONTINUE
-*
-*        Special code for 9 x 9 Householder
-*
-         V1 = CONJG( V( 1 ) )
-         T1 = TAU*CONJG( V1 )
-         V2 = CONJG( V( 2 ) )
-         T2 = TAU*CONJG( V2 )
-         V3 = CONJG( V( 3 ) )
-         T3 = TAU*CONJG( V3 )
-         V4 = CONJG( V( 4 ) )
-         T4 = TAU*CONJG( V4 )
-         V5 = CONJG( V( 5 ) )
-         T5 = TAU*CONJG( V5 )
-         V6 = CONJG( V( 6 ) )
-         T6 = TAU*CONJG( V6 )
-         V7 = CONJG( V( 7 ) )
-         T7 = TAU*CONJG( V7 )
-         V8 = CONJG( V( 8 ) )
-         T8 = TAU*CONJG( V8 )
-         V9 = CONJG( V( 9 ) )
-         T9 = TAU*CONJG( V9 )
-         DO 180 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J ) +
-     $            V7*C( 7, J ) + V8*C( 8, J ) + V9*C( 9, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-            C( 7, J ) = C( 7, J ) - SUM*T7
-            C( 8, J ) = C( 8, J ) - SUM*T8
-            C( 9, J ) = C( 9, J ) - SUM*T9
-  180    CONTINUE
-         GO TO 410
-  190    CONTINUE
-*
-*        Special code for 10 x 10 Householder
-*
-         V1 = CONJG( V( 1 ) )
-         T1 = TAU*CONJG( V1 )
-         V2 = CONJG( V( 2 ) )
-         T2 = TAU*CONJG( V2 )
-         V3 = CONJG( V( 3 ) )
-         T3 = TAU*CONJG( V3 )
-         V4 = CONJG( V( 4 ) )
-         T4 = TAU*CONJG( V4 )
-         V5 = CONJG( V( 5 ) )
-         T5 = TAU*CONJG( V5 )
-         V6 = CONJG( V( 6 ) )
-         T6 = TAU*CONJG( V6 )
-         V7 = CONJG( V( 7 ) )
-         T7 = TAU*CONJG( V7 )
-         V8 = CONJG( V( 8 ) )
-         T8 = TAU*CONJG( V8 )
-         V9 = CONJG( V( 9 ) )
-         T9 = TAU*CONJG( V9 )
-         V10 = CONJG( V( 10 ) )
-         T10 = TAU*CONJG( V10 )
-         DO 200 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J ) +
-     $            V7*C( 7, J ) + V8*C( 8, J ) + V9*C( 9, J ) +
-     $            V10*C( 10, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-            C( 7, J ) = C( 7, J ) - SUM*T7
-            C( 8, J ) = C( 8, J ) - SUM*T8
-            C( 9, J ) = C( 9, J ) - SUM*T9
-            C( 10, J ) = C( 10, J ) - SUM*T10
-  200    CONTINUE
-         GO TO 410
-      ELSE
-*
-*        Form  C * H, where H has order n.
-*
-         GO TO ( 210, 230, 250, 270, 290, 310, 330, 350,
-     $           370, 390 )N
-*
-*        Code for general N
-*
-*        w := C * v
-*
-         CALL CGEMV( 'No transpose', M, N, ONE, C, LDC, V, 1, ZERO,
-     $               WORK, 1 )
-*
-*        C := C - tau * w * v'
-*
-         CALL CGERC( M, N, -TAU, WORK, 1, V, 1, C, LDC )
-         GO TO 410
-  210    CONTINUE
-*
-*        Special code for 1 x 1 Householder
-*
-         T1 = ONE - TAU*V( 1 )*CONJG( V( 1 ) )
-         DO 220 J = 1, M
-            C( J, 1 ) = T1*C( J, 1 )
-  220    CONTINUE
-         GO TO 410
-  230    CONTINUE
-*
-*        Special code for 2 x 2 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*CONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*CONJG( V2 )
-         DO 240 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-  240    CONTINUE
-         GO TO 410
-  250    CONTINUE
-*
-*        Special code for 3 x 3 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*CONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*CONJG( V2 )
-         V3 = V( 3 )
-         T3 = TAU*CONJG( V3 )
-         DO 260 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-  260    CONTINUE
-         GO TO 410
-  270    CONTINUE
-*
-*        Special code for 4 x 4 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*CONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*CONJG( V2 )
-         V3 = V( 3 )
-         T3 = TAU*CONJG( V3 )
-         V4 = V( 4 )
-         T4 = TAU*CONJG( V4 )
-         DO 280 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-  280    CONTINUE
-         GO TO 410
-  290    CONTINUE
-*
-*        Special code for 5 x 5 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*CONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*CONJG( V2 )
-         V3 = V( 3 )
-         T3 = TAU*CONJG( V3 )
-         V4 = V( 4 )
-         T4 = TAU*CONJG( V4 )
-         V5 = V( 5 )
-         T5 = TAU*CONJG( V5 )
-         DO 300 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-  300    CONTINUE
-         GO TO 410
-  310    CONTINUE
-*
-*        Special code for 6 x 6 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*CONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*CONJG( V2 )
-         V3 = V( 3 )
-         T3 = TAU*CONJG( V3 )
-         V4 = V( 4 )
-         T4 = TAU*CONJG( V4 )
-         V5 = V( 5 )
-         T5 = TAU*CONJG( V5 )
-         V6 = V( 6 )
-         T6 = TAU*CONJG( V6 )
-         DO 320 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-  320    CONTINUE
-         GO TO 410
-  330    CONTINUE
-*
-*        Special code for 7 x 7 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*CONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*CONJG( V2 )
-         V3 = V( 3 )
-         T3 = TAU*CONJG( V3 )
-         V4 = V( 4 )
-         T4 = TAU*CONJG( V4 )
-         V5 = V( 5 )
-         T5 = TAU*CONJG( V5 )
-         V6 = V( 6 )
-         T6 = TAU*CONJG( V6 )
-         V7 = V( 7 )
-         T7 = TAU*CONJG( V7 )
-         DO 340 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 ) +
-     $            V7*C( J, 7 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-            C( J, 7 ) = C( J, 7 ) - SUM*T7
-  340    CONTINUE
-         GO TO 410
-  350    CONTINUE
-*
-*        Special code for 8 x 8 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*CONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*CONJG( V2 )
-         V3 = V( 3 )
-         T3 = TAU*CONJG( V3 )
-         V4 = V( 4 )
-         T4 = TAU*CONJG( V4 )
-         V5 = V( 5 )
-         T5 = TAU*CONJG( V5 )
-         V6 = V( 6 )
-         T6 = TAU*CONJG( V6 )
-         V7 = V( 7 )
-         T7 = TAU*CONJG( V7 )
-         V8 = V( 8 )
-         T8 = TAU*CONJG( V8 )
-         DO 360 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 ) +
-     $            V7*C( J, 7 ) + V8*C( J, 8 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-            C( J, 7 ) = C( J, 7 ) - SUM*T7
-            C( J, 8 ) = C( J, 8 ) - SUM*T8
-  360    CONTINUE
-         GO TO 410
-  370    CONTINUE
-*
-*        Special code for 9 x 9 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*CONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*CONJG( V2 )
-         V3 = V( 3 )
-         T3 = TAU*CONJG( V3 )
-         V4 = V( 4 )
-         T4 = TAU*CONJG( V4 )
-         V5 = V( 5 )
-         T5 = TAU*CONJG( V5 )
-         V6 = V( 6 )
-         T6 = TAU*CONJG( V6 )
-         V7 = V( 7 )
-         T7 = TAU*CONJG( V7 )
-         V8 = V( 8 )
-         T8 = TAU*CONJG( V8 )
-         V9 = V( 9 )
-         T9 = TAU*CONJG( V9 )
-         DO 380 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 ) +
-     $            V7*C( J, 7 ) + V8*C( J, 8 ) + V9*C( J, 9 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-            C( J, 7 ) = C( J, 7 ) - SUM*T7
-            C( J, 8 ) = C( J, 8 ) - SUM*T8
-            C( J, 9 ) = C( J, 9 ) - SUM*T9
-  380    CONTINUE
-         GO TO 410
-  390    CONTINUE
-*
-*        Special code for 10 x 10 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*CONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*CONJG( V2 )
-         V3 = V( 3 )
-         T3 = TAU*CONJG( V3 )
-         V4 = V( 4 )
-         T4 = TAU*CONJG( V4 )
-         V5 = V( 5 )
-         T5 = TAU*CONJG( V5 )
-         V6 = V( 6 )
-         T6 = TAU*CONJG( V6 )
-         V7 = V( 7 )
-         T7 = TAU*CONJG( V7 )
-         V8 = V( 8 )
-         T8 = TAU*CONJG( V8 )
-         V9 = V( 9 )
-         T9 = TAU*CONJG( V9 )
-         V10 = V( 10 )
-         T10 = TAU*CONJG( V10 )
-         DO 400 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 ) +
-     $            V7*C( J, 7 ) + V8*C( J, 8 ) + V9*C( J, 9 ) +
-     $            V10*C( J, 10 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-            C( J, 7 ) = C( J, 7 ) - SUM*T7
-            C( J, 8 ) = C( J, 8 ) - SUM*T8
-            C( J, 9 ) = C( J, 9 ) - SUM*T9
-            C( J, 10 ) = C( J, 10 ) - SUM*T10
-  400    CONTINUE
-         GO TO 410
-      END IF
-  410 RETURN
-*
-*     End of CLARFX
-*
-      END
--- a/libcruft/lapack/clartg.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,195 +0,0 @@
-      SUBROUTINE CLARTG( F, G, CS, SN, R )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      REAL               CS
-      COMPLEX            F, G, R, SN
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLARTG generates a plane rotation so that
-*
-*     [  CS  SN  ]     [ F ]     [ R ]
-*     [  __      ]  .  [   ]  =  [   ]   where CS**2 + |SN|**2 = 1.
-*     [ -SN  CS  ]     [ G ]     [ 0 ]
-*
-*  This is a faster version of the BLAS1 routine CROTG, except for
-*  the following differences:
-*     F and G are unchanged on return.
-*     If G=0, then CS=1 and SN=0.
-*     If F=0, then CS=0 and SN is chosen so that R is real.
-*
-*  Arguments
-*  =========
-*
-*  F       (input) COMPLEX
-*          The first component of vector to be rotated.
-*
-*  G       (input) COMPLEX
-*          The second component of vector to be rotated.
-*
-*  CS      (output) REAL
-*          The cosine of the rotation.
-*
-*  SN      (output) COMPLEX
-*          The sine of the rotation.
-*
-*  R       (output) COMPLEX
-*          The nonzero component of the rotated vector.
-*
-*  Further Details
-*  ======= =======
-*
-*  3-5-96 - Modified with a new algorithm by W. Kahan and J. Demmel
-*
-*  This version has a few statements commented out for thread safety
-*  (machine parameters are computed on each entry). 10 feb 03, SJH.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               TWO, ONE, ZERO
-      PARAMETER          ( TWO = 2.0E+0, ONE = 1.0E+0, ZERO = 0.0E+0 )
-      COMPLEX            CZERO
-      PARAMETER          ( CZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-*     LOGICAL            FIRST
-      INTEGER            COUNT, I
-      REAL               D, DI, DR, EPS, F2, F2S, G2, G2S, SAFMIN,
-     $                   SAFMN2, SAFMX2, SCALE
-      COMPLEX            FF, FS, GS
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH, SLAPY2
-      EXTERNAL           SLAMCH, SLAPY2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, CMPLX, CONJG, INT, LOG, MAX, REAL,
-     $                   SQRT
-*     ..
-*     .. Statement Functions ..
-      REAL               ABS1, ABSSQ
-*     ..
-*     .. Save statement ..
-*     SAVE               FIRST, SAFMX2, SAFMIN, SAFMN2
-*     ..
-*     .. Data statements ..
-*     DATA               FIRST / .TRUE. /
-*     ..
-*     .. Statement Function definitions ..
-      ABS1( FF ) = MAX( ABS( REAL( FF ) ), ABS( AIMAG( FF ) ) )
-      ABSSQ( FF ) = REAL( FF )**2 + AIMAG( FF )**2
-*     ..
-*     .. Executable Statements ..
-*
-*     IF( FIRST ) THEN
-         SAFMIN = SLAMCH( 'S' )
-         EPS = SLAMCH( 'E' )
-         SAFMN2 = SLAMCH( 'B' )**INT( LOG( SAFMIN / EPS ) /
-     $            LOG( SLAMCH( 'B' ) ) / TWO )
-         SAFMX2 = ONE / SAFMN2
-*        FIRST = .FALSE.
-*     END IF
-      SCALE = MAX( ABS1( F ), ABS1( G ) )
-      FS = F
-      GS = G
-      COUNT = 0
-      IF( SCALE.GE.SAFMX2 ) THEN
-   10    CONTINUE
-         COUNT = COUNT + 1
-         FS = FS*SAFMN2
-         GS = GS*SAFMN2
-         SCALE = SCALE*SAFMN2
-         IF( SCALE.GE.SAFMX2 )
-     $      GO TO 10
-      ELSE IF( SCALE.LE.SAFMN2 ) THEN
-         IF( G.EQ.CZERO ) THEN
-            CS = ONE
-            SN = CZERO
-            R = F
-            RETURN
-         END IF
-   20    CONTINUE
-         COUNT = COUNT - 1
-         FS = FS*SAFMX2
-         GS = GS*SAFMX2
-         SCALE = SCALE*SAFMX2
-         IF( SCALE.LE.SAFMN2 )
-     $      GO TO 20
-      END IF
-      F2 = ABSSQ( FS )
-      G2 = ABSSQ( GS )
-      IF( F2.LE.MAX( G2, ONE )*SAFMIN ) THEN
-*
-*        This is a rare case: F is very small.
-*
-         IF( F.EQ.CZERO ) THEN
-            CS = ZERO
-            R = SLAPY2( REAL( G ), AIMAG( G ) )
-*           Do complex/real division explicitly with two real divisions
-            D = SLAPY2( REAL( GS ), AIMAG( GS ) )
-            SN = CMPLX( REAL( GS ) / D, -AIMAG( GS ) / D )
-            RETURN
-         END IF
-         F2S = SLAPY2( REAL( FS ), AIMAG( FS ) )
-*        G2 and G2S are accurate
-*        G2 is at least SAFMIN, and G2S is at least SAFMN2
-         G2S = SQRT( G2 )
-*        Error in CS from underflow in F2S is at most
-*        UNFL / SAFMN2 .lt. sqrt(UNFL*EPS) .lt. EPS
-*        If MAX(G2,ONE)=G2, then F2 .lt. G2*SAFMIN,
-*        and so CS .lt. sqrt(SAFMIN)
-*        If MAX(G2,ONE)=ONE, then F2 .lt. SAFMIN
-*        and so CS .lt. sqrt(SAFMIN)/SAFMN2 = sqrt(EPS)
-*        Therefore, CS = F2S/G2S / sqrt( 1 + (F2S/G2S)**2 ) = F2S/G2S
-         CS = F2S / G2S
-*        Make sure abs(FF) = 1
-*        Do complex/real division explicitly with 2 real divisions
-         IF( ABS1( F ).GT.ONE ) THEN
-            D = SLAPY2( REAL( F ), AIMAG( F ) )
-            FF = CMPLX( REAL( F ) / D, AIMAG( F ) / D )
-         ELSE
-            DR = SAFMX2*REAL( F )
-            DI = SAFMX2*AIMAG( F )
-            D = SLAPY2( DR, DI )
-            FF = CMPLX( DR / D, DI / D )
-         END IF
-         SN = FF*CMPLX( REAL( GS ) / G2S, -AIMAG( GS ) / G2S )
-         R = CS*F + SN*G
-      ELSE
-*
-*        This is the most common case.
-*        Neither F2 nor F2/G2 are less than SAFMIN
-*        F2S cannot overflow, and it is accurate
-*
-         F2S = SQRT( ONE+G2 / F2 )
-*        Do the F2S(real)*FS(complex) multiply with two real multiplies
-         R = CMPLX( F2S*REAL( FS ), F2S*AIMAG( FS ) )
-         CS = ONE / F2S
-         D = F2 + G2
-*        Do complex/real division explicitly with two real divisions
-         SN = CMPLX( REAL( R ) / D, AIMAG( R ) / D )
-         SN = SN*CONJG( GS )
-         IF( COUNT.NE.0 ) THEN
-            IF( COUNT.GT.0 ) THEN
-               DO 30 I = 1, COUNT
-                  R = R*SAFMX2
-   30          CONTINUE
-            ELSE
-               DO 40 I = 1, -COUNT
-                  R = R*SAFMN2
-   40          CONTINUE
-            END IF
-         END IF
-      END IF
-      RETURN
-*
-*     End of CLARTG
-*
-      END
--- a/libcruft/lapack/clarz.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,157 +0,0 @@
-      SUBROUTINE CLARZ( SIDE, M, N, L, V, INCV, TAU, C, LDC, WORK )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE
-      INTEGER            INCV, L, LDC, M, N
-      COMPLEX            TAU
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            C( LDC, * ), V( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLARZ applies a complex elementary reflector H to a complex
-*  M-by-N matrix C, from either the left or the right. H is represented
-*  in the form
-*
-*        H = I - tau * v * v'
-*
-*  where tau is a complex scalar and v is a complex vector.
-*
-*  If tau = 0, then H is taken to be the unit matrix.
-*
-*  To apply H' (the conjugate transpose of H), supply conjg(tau) instead
-*  tau.
-*
-*  H is a product of k elementary reflectors as returned by CTZRZF.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': form  H * C
-*          = 'R': form  C * H
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  L       (input) INTEGER
-*          The number of entries of the vector V containing
-*          the meaningful part of the Householder vectors.
-*          If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
-*
-*  V       (input) COMPLEX array, dimension (1+(L-1)*abs(INCV))
-*          The vector v in the representation of H as returned by
-*          CTZRZF. V is not used if TAU = 0.
-*
-*  INCV    (input) INTEGER
-*          The increment between elements of v. INCV <> 0.
-*
-*  TAU     (input) COMPLEX
-*          The value tau in the representation of H.
-*
-*  C       (input/output) COMPLEX array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by the matrix H * C if SIDE = 'L',
-*          or C * H if SIDE = 'R'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) COMPLEX array, dimension
-*                         (N) if SIDE = 'L'
-*                      or (M) if SIDE = 'R'
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ),
-     $                   ZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CAXPY, CCOPY, CGEMV, CGERC, CGERU, CLACGV
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  H * C
-*
-         IF( TAU.NE.ZERO ) THEN
-*
-*           w( 1:n ) = conjg( C( 1, 1:n ) )
-*
-            CALL CCOPY( N, C, LDC, WORK, 1 )
-            CALL CLACGV( N, WORK, 1 )
-*
-*           w( 1:n ) = conjg( w( 1:n ) + C( m-l+1:m, 1:n )' * v( 1:l ) )
-*
-            CALL CGEMV( 'Conjugate transpose', L, N, ONE, C( M-L+1, 1 ),
-     $                  LDC, V, INCV, ONE, WORK, 1 )
-            CALL CLACGV( N, WORK, 1 )
-*
-*           C( 1, 1:n ) = C( 1, 1:n ) - tau * w( 1:n )
-*
-            CALL CAXPY( N, -TAU, WORK, 1, C, LDC )
-*
-*           C( m-l+1:m, 1:n ) = C( m-l+1:m, 1:n ) - ...
-*                               tau * v( 1:l ) * conjg( w( 1:n )' )
-*
-            CALL CGERU( L, N, -TAU, V, INCV, WORK, 1, C( M-L+1, 1 ),
-     $                  LDC )
-         END IF
-*
-      ELSE
-*
-*        Form  C * H
-*
-         IF( TAU.NE.ZERO ) THEN
-*
-*           w( 1:m ) = C( 1:m, 1 )
-*
-            CALL CCOPY( M, C, 1, WORK, 1 )
-*
-*           w( 1:m ) = w( 1:m ) + C( 1:m, n-l+1:n, 1:n ) * v( 1:l )
-*
-            CALL CGEMV( 'No transpose', M, L, ONE, C( 1, N-L+1 ), LDC,
-     $                  V, INCV, ONE, WORK, 1 )
-*
-*           C( 1:m, 1 ) = C( 1:m, 1 ) - tau * w( 1:m )
-*
-            CALL CAXPY( M, -TAU, WORK, 1, C, 1 )
-*
-*           C( 1:m, n-l+1:n ) = C( 1:m, n-l+1:n ) - ...
-*                               tau * w( 1:m ) * v( 1:l )'
-*
-            CALL CGERC( M, L, -TAU, WORK, 1, V, INCV, C( 1, N-L+1 ),
-     $                  LDC )
-*
-         END IF
-*
-      END IF
-*
-      RETURN
-*
-*     End of CLARZ
-*
-      END
--- a/libcruft/lapack/clarzb.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,234 +0,0 @@
-      SUBROUTINE CLARZB( SIDE, TRANS, DIRECT, STOREV, M, N, K, L, V,
-     $                   LDV, T, LDT, C, LDC, WORK, LDWORK )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, SIDE, STOREV, TRANS
-      INTEGER            K, L, LDC, LDT, LDV, LDWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            C( LDC, * ), T( LDT, * ), V( LDV, * ),
-     $                   WORK( LDWORK, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLARZB applies a complex block reflector H or its transpose H**H
-*  to a complex distributed M-by-N  C from the left or the right.
-*
-*  Currently, only STOREV = 'R' and DIRECT = 'B' are supported.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply H or H' from the Left
-*          = 'R': apply H or H' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply H (No transpose)
-*          = 'C': apply H' (Conjugate transpose)
-*
-*  DIRECT  (input) CHARACTER*1
-*          Indicates how H is formed from a product of elementary
-*          reflectors
-*          = 'F': H = H(1) H(2) . . . H(k) (Forward, not supported yet)
-*          = 'B': H = H(k) . . . H(2) H(1) (Backward)
-*
-*  STOREV  (input) CHARACTER*1
-*          Indicates how the vectors which define the elementary
-*          reflectors are stored:
-*          = 'C': Columnwise                        (not supported yet)
-*          = 'R': Rowwise
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  K       (input) INTEGER
-*          The order of the matrix T (= the number of elementary
-*          reflectors whose product defines the block reflector).
-*
-*  L       (input) INTEGER
-*          The number of columns of the matrix V containing the
-*          meaningful part of the Householder reflectors.
-*          If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
-*
-*  V       (input) COMPLEX array, dimension (LDV,NV).
-*          If STOREV = 'C', NV = K; if STOREV = 'R', NV = L.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V.
-*          If STOREV = 'C', LDV >= L; if STOREV = 'R', LDV >= K.
-*
-*  T       (input) COMPLEX array, dimension (LDT,K)
-*          The triangular K-by-K matrix T in the representation of the
-*          block reflector.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= K.
-*
-*  C       (input/output) COMPLEX array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by H*C or H'*C or C*H or C*H'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) COMPLEX array, dimension (LDWORK,K)
-*
-*  LDWORK  (input) INTEGER
-*          The leading dimension of the array WORK.
-*          If SIDE = 'L', LDWORK >= max(1,N);
-*          if SIDE = 'R', LDWORK >= max(1,M).
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      CHARACTER          TRANST
-      INTEGER            I, INFO, J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CCOPY, CGEMM, CLACGV, CTRMM, XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 .OR. N.LE.0 )
-     $   RETURN
-*
-*     Check for currently supported options
-*
-      INFO = 0
-      IF( .NOT.LSAME( DIRECT, 'B' ) ) THEN
-         INFO = -3
-      ELSE IF( .NOT.LSAME( STOREV, 'R' ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CLARZB', -INFO )
-         RETURN
-      END IF
-*
-      IF( LSAME( TRANS, 'N' ) ) THEN
-         TRANST = 'C'
-      ELSE
-         TRANST = 'N'
-      END IF
-*
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  H * C  or  H' * C
-*
-*        W( 1:n, 1:k ) = conjg( C( 1:k, 1:n )' )
-*
-         DO 10 J = 1, K
-            CALL CCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 )
-   10    CONTINUE
-*
-*        W( 1:n, 1:k ) = W( 1:n, 1:k ) + ...
-*                        conjg( C( m-l+1:m, 1:n )' ) * V( 1:k, 1:l )'
-*
-         IF( L.GT.0 )
-     $      CALL CGEMM( 'Transpose', 'Conjugate transpose', N, K, L,
-     $                  ONE, C( M-L+1, 1 ), LDC, V, LDV, ONE, WORK,
-     $                  LDWORK )
-*
-*        W( 1:n, 1:k ) = W( 1:n, 1:k ) * T'  or  W( 1:m, 1:k ) * T
-*
-         CALL CTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K, ONE, T,
-     $               LDT, WORK, LDWORK )
-*
-*        C( 1:k, 1:n ) = C( 1:k, 1:n ) - conjg( W( 1:n, 1:k )' )
-*
-         DO 30 J = 1, N
-            DO 20 I = 1, K
-               C( I, J ) = C( I, J ) - WORK( J, I )
-   20       CONTINUE
-   30    CONTINUE
-*
-*        C( m-l+1:m, 1:n ) = C( m-l+1:m, 1:n ) - ...
-*                    conjg( V( 1:k, 1:l )' ) * conjg( W( 1:n, 1:k )' )
-*
-         IF( L.GT.0 )
-     $      CALL CGEMM( 'Transpose', 'Transpose', L, N, K, -ONE, V, LDV,
-     $                  WORK, LDWORK, ONE, C( M-L+1, 1 ), LDC )
-*
-      ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*        Form  C * H  or  C * H'
-*
-*        W( 1:m, 1:k ) = C( 1:m, 1:k )
-*
-         DO 40 J = 1, K
-            CALL CCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 )
-   40    CONTINUE
-*
-*        W( 1:m, 1:k ) = W( 1:m, 1:k ) + ...
-*                        C( 1:m, n-l+1:n ) * conjg( V( 1:k, 1:l )' )
-*
-         IF( L.GT.0 )
-     $      CALL CGEMM( 'No transpose', 'Transpose', M, K, L, ONE,
-     $                  C( 1, N-L+1 ), LDC, V, LDV, ONE, WORK, LDWORK )
-*
-*        W( 1:m, 1:k ) = W( 1:m, 1:k ) * conjg( T )  or
-*                        W( 1:m, 1:k ) * conjg( T' )
-*
-         DO 50 J = 1, K
-            CALL CLACGV( K-J+1, T( J, J ), 1 )
-   50    CONTINUE
-         CALL CTRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K, ONE, T,
-     $               LDT, WORK, LDWORK )
-         DO 60 J = 1, K
-            CALL CLACGV( K-J+1, T( J, J ), 1 )
-   60    CONTINUE
-*
-*        C( 1:m, 1:k ) = C( 1:m, 1:k ) - W( 1:m, 1:k )
-*
-         DO 80 J = 1, K
-            DO 70 I = 1, M
-               C( I, J ) = C( I, J ) - WORK( I, J )
-   70       CONTINUE
-   80    CONTINUE
-*
-*        C( 1:m, n-l+1:n ) = C( 1:m, n-l+1:n ) - ...
-*                            W( 1:m, 1:k ) * conjg( V( 1:k, 1:l ) )
-*
-         DO 90 J = 1, L
-            CALL CLACGV( K, V( 1, J ), 1 )
-   90    CONTINUE
-         IF( L.GT.0 )
-     $      CALL CGEMM( 'No transpose', 'No transpose', M, L, K, -ONE,
-     $                  WORK, LDWORK, V, LDV, ONE, C( 1, N-L+1 ), LDC )
-         DO 100 J = 1, L
-            CALL CLACGV( K, V( 1, J ), 1 )
-  100    CONTINUE
-*
-      END IF
-*
-      RETURN
-*
-*     End of CLARZB
-*
-      END
--- a/libcruft/lapack/clarzt.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,186 +0,0 @@
-      SUBROUTINE CLARZT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, STOREV
-      INTEGER            K, LDT, LDV, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            T( LDT, * ), TAU( * ), V( LDV, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLARZT forms the triangular factor T of a complex block reflector
-*  H of order > n, which is defined as a product of k elementary
-*  reflectors.
-*
-*  If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular;
-*
-*  If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular.
-*
-*  If STOREV = 'C', the vector which defines the elementary reflector
-*  H(i) is stored in the i-th column of the array V, and
-*
-*     H  =  I - V * T * V'
-*
-*  If STOREV = 'R', the vector which defines the elementary reflector
-*  H(i) is stored in the i-th row of the array V, and
-*
-*     H  =  I - V' * T * V
-*
-*  Currently, only STOREV = 'R' and DIRECT = 'B' are supported.
-*
-*  Arguments
-*  =========
-*
-*  DIRECT  (input) CHARACTER*1
-*          Specifies the order in which the elementary reflectors are
-*          multiplied to form the block reflector:
-*          = 'F': H = H(1) H(2) . . . H(k) (Forward, not supported yet)
-*          = 'B': H = H(k) . . . H(2) H(1) (Backward)
-*
-*  STOREV  (input) CHARACTER*1
-*          Specifies how the vectors which define the elementary
-*          reflectors are stored (see also Further Details):
-*          = 'C': columnwise                        (not supported yet)
-*          = 'R': rowwise
-*
-*  N       (input) INTEGER
-*          The order of the block reflector H. N >= 0.
-*
-*  K       (input) INTEGER
-*          The order of the triangular factor T (= the number of
-*          elementary reflectors). K >= 1.
-*
-*  V       (input/output) COMPLEX array, dimension
-*                               (LDV,K) if STOREV = 'C'
-*                               (LDV,N) if STOREV = 'R'
-*          The matrix V. See further details.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V.
-*          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K.
-*
-*  TAU     (input) COMPLEX array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i).
-*
-*  T       (output) COMPLEX array, dimension (LDT,K)
-*          The k by k triangular factor T of the block reflector.
-*          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is
-*          lower triangular. The rest of the array is not used.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= K.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  The shape of the matrix V and the storage of the vectors which define
-*  the H(i) is best illustrated by the following example with n = 5 and
-*  k = 3. The elements equal to 1 are not stored; the corresponding
-*  array elements are modified but restored on exit. The rest of the
-*  array is not used.
-*
-*  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':
-*
-*                                              ______V_____
-*         ( v1 v2 v3 )                        /            \
-*         ( v1 v2 v3 )                      ( v1 v1 v1 v1 v1 . . . . 1 )
-*     V = ( v1 v2 v3 )                      ( v2 v2 v2 v2 v2 . . . 1   )
-*         ( v1 v2 v3 )                      ( v3 v3 v3 v3 v3 . . 1     )
-*         ( v1 v2 v3 )
-*            .  .  .
-*            .  .  .
-*            1  .  .
-*               1  .
-*                  1
-*
-*  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R':
-*
-*                                                        ______V_____
-*            1                                          /            \
-*            .  1                           ( 1 . . . . v1 v1 v1 v1 v1 )
-*            .  .  1                        ( . 1 . . . v2 v2 v2 v2 v2 )
-*            .  .  .                        ( . . 1 . . v3 v3 v3 v3 v3 )
-*            .  .  .
-*         ( v1 v2 v3 )
-*         ( v1 v2 v3 )
-*     V = ( v1 v2 v3 )
-*         ( v1 v2 v3 )
-*         ( v1 v2 v3 )
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, INFO, J
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEMV, CLACGV, CTRMV, XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-*     Check for currently supported options
-*
-      INFO = 0
-      IF( .NOT.LSAME( DIRECT, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.LSAME( STOREV, 'R' ) ) THEN
-         INFO = -2
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CLARZT', -INFO )
-         RETURN
-      END IF
-*
-      DO 20 I = K, 1, -1
-         IF( TAU( I ).EQ.ZERO ) THEN
-*
-*           H(i)  =  I
-*
-            DO 10 J = I, K
-               T( J, I ) = ZERO
-   10       CONTINUE
-         ELSE
-*
-*           general case
-*
-            IF( I.LT.K ) THEN
-*
-*              T(i+1:k,i) = - tau(i) * V(i+1:k,1:n) * V(i,1:n)'
-*
-               CALL CLACGV( N, V( I, 1 ), LDV )
-               CALL CGEMV( 'No transpose', K-I, N, -TAU( I ),
-     $                     V( I+1, 1 ), LDV, V( I, 1 ), LDV, ZERO,
-     $                     T( I+1, I ), 1 )
-               CALL CLACGV( N, V( I, 1 ), LDV )
-*
-*              T(i+1:k,i) = T(i+1:k,i+1:k) * T(i+1:k,i)
-*
-               CALL CTRMV( 'Lower', 'No transpose', 'Non-unit', K-I,
-     $                     T( I+1, I+1 ), LDT, T( I+1, I ), 1 )
-            END IF
-            T( I, I ) = TAU( I )
-         END IF
-   20 CONTINUE
-      RETURN
-*
-*     End of CLARZT
-*
-      END
--- a/libcruft/lapack/clascl.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,267 +0,0 @@
-      SUBROUTINE CLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TYPE
-      INTEGER            INFO, KL, KU, LDA, M, N
-      REAL               CFROM, CTO
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLASCL multiplies the M by N complex matrix A by the real scalar
-*  CTO/CFROM.  This is done without over/underflow as long as the final
-*  result CTO*A(I,J)/CFROM does not over/underflow. TYPE specifies that
-*  A may be full, upper triangular, lower triangular, upper Hessenberg,
-*  or banded.
-*
-*  Arguments
-*  =========
-*
-*  TYPE    (input) CHARACTER*1
-*          TYPE indices the storage type of the input matrix.
-*          = 'G':  A is a full matrix.
-*          = 'L':  A is a lower triangular matrix.
-*          = 'U':  A is an upper triangular matrix.
-*          = 'H':  A is an upper Hessenberg matrix.
-*          = 'B':  A is a symmetric band matrix with lower bandwidth KL
-*                  and upper bandwidth KU and with the only the lower
-*                  half stored.
-*          = 'Q':  A is a symmetric band matrix with lower bandwidth KL
-*                  and upper bandwidth KU and with the only the upper
-*                  half stored.
-*          = 'Z':  A is a band matrix with lower bandwidth KL and upper
-*                  bandwidth KU.
-*
-*  KL      (input) INTEGER
-*          The lower bandwidth of A.  Referenced only if TYPE = 'B',
-*          'Q' or 'Z'.
-*
-*  KU      (input) INTEGER
-*          The upper bandwidth of A.  Referenced only if TYPE = 'B',
-*          'Q' or 'Z'.
-*
-*  CFROM   (input) REAL
-*  CTO     (input) REAL
-*          The matrix A is multiplied by CTO/CFROM. A(I,J) is computed
-*          without over/underflow if the final result CTO*A(I,J)/CFROM
-*          can be represented without over/underflow.  CFROM must be
-*          nonzero.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          The matrix to be multiplied by CTO/CFROM.  See TYPE for the
-*          storage type.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  INFO    (output) INTEGER
-*          0  - successful exit
-*          <0 - if INFO = -i, the i-th argument had an illegal value.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            DONE
-      INTEGER            I, ITYPE, J, K1, K2, K3, K4
-      REAL               BIGNUM, CFROM1, CFROMC, CTO1, CTOC, MUL, SMLNUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               SLAMCH
-      EXTERNAL           LSAME, SLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-*
-      IF( LSAME( TYPE, 'G' ) ) THEN
-         ITYPE = 0
-      ELSE IF( LSAME( TYPE, 'L' ) ) THEN
-         ITYPE = 1
-      ELSE IF( LSAME( TYPE, 'U' ) ) THEN
-         ITYPE = 2
-      ELSE IF( LSAME( TYPE, 'H' ) ) THEN
-         ITYPE = 3
-      ELSE IF( LSAME( TYPE, 'B' ) ) THEN
-         ITYPE = 4
-      ELSE IF( LSAME( TYPE, 'Q' ) ) THEN
-         ITYPE = 5
-      ELSE IF( LSAME( TYPE, 'Z' ) ) THEN
-         ITYPE = 6
-      ELSE
-         ITYPE = -1
-      END IF
-*
-      IF( ITYPE.EQ.-1 ) THEN
-         INFO = -1
-      ELSE IF( CFROM.EQ.ZERO ) THEN
-         INFO = -4
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -6
-      ELSE IF( N.LT.0 .OR. ( ITYPE.EQ.4 .AND. N.NE.M ) .OR.
-     $         ( ITYPE.EQ.5 .AND. N.NE.M ) ) THEN
-         INFO = -7
-      ELSE IF( ITYPE.LE.3 .AND. LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -9
-      ELSE IF( ITYPE.GE.4 ) THEN
-         IF( KL.LT.0 .OR. KL.GT.MAX( M-1, 0 ) ) THEN
-            INFO = -2
-         ELSE IF( KU.LT.0 .OR. KU.GT.MAX( N-1, 0 ) .OR.
-     $            ( ( ITYPE.EQ.4 .OR. ITYPE.EQ.5 ) .AND. KL.NE.KU ) )
-     $             THEN
-            INFO = -3
-         ELSE IF( ( ITYPE.EQ.4 .AND. LDA.LT.KL+1 ) .OR.
-     $            ( ITYPE.EQ.5 .AND. LDA.LT.KU+1 ) .OR.
-     $            ( ITYPE.EQ.6 .AND. LDA.LT.2*KL+KU+1 ) ) THEN
-            INFO = -9
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CLASCL', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. M.EQ.0 )
-     $   RETURN
-*
-*     Get machine parameters
-*
-      SMLNUM = SLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-*
-      CFROMC = CFROM
-      CTOC = CTO
-*
-   10 CONTINUE
-      CFROM1 = CFROMC*SMLNUM
-      CTO1 = CTOC / BIGNUM
-      IF( ABS( CFROM1 ).GT.ABS( CTOC ) .AND. CTOC.NE.ZERO ) THEN
-         MUL = SMLNUM
-         DONE = .FALSE.
-         CFROMC = CFROM1
-      ELSE IF( ABS( CTO1 ).GT.ABS( CFROMC ) ) THEN
-         MUL = BIGNUM
-         DONE = .FALSE.
-         CTOC = CTO1
-      ELSE
-         MUL = CTOC / CFROMC
-         DONE = .TRUE.
-      END IF
-*
-      IF( ITYPE.EQ.0 ) THEN
-*
-*        Full matrix
-*
-         DO 30 J = 1, N
-            DO 20 I = 1, M
-               A( I, J ) = A( I, J )*MUL
-   20       CONTINUE
-   30    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.1 ) THEN
-*
-*        Lower triangular matrix
-*
-         DO 50 J = 1, N
-            DO 40 I = J, M
-               A( I, J ) = A( I, J )*MUL
-   40       CONTINUE
-   50    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.2 ) THEN
-*
-*        Upper triangular matrix
-*
-         DO 70 J = 1, N
-            DO 60 I = 1, MIN( J, M )
-               A( I, J ) = A( I, J )*MUL
-   60       CONTINUE
-   70    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.3 ) THEN
-*
-*        Upper Hessenberg matrix
-*
-         DO 90 J = 1, N
-            DO 80 I = 1, MIN( J+1, M )
-               A( I, J ) = A( I, J )*MUL
-   80       CONTINUE
-   90    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.4 ) THEN
-*
-*        Lower half of a symmetric band matrix
-*
-         K3 = KL + 1
-         K4 = N + 1
-         DO 110 J = 1, N
-            DO 100 I = 1, MIN( K3, K4-J )
-               A( I, J ) = A( I, J )*MUL
-  100       CONTINUE
-  110    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.5 ) THEN
-*
-*        Upper half of a symmetric band matrix
-*
-         K1 = KU + 2
-         K3 = KU + 1
-         DO 130 J = 1, N
-            DO 120 I = MAX( K1-J, 1 ), K3
-               A( I, J ) = A( I, J )*MUL
-  120       CONTINUE
-  130    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.6 ) THEN
-*
-*        Band matrix
-*
-         K1 = KL + KU + 2
-         K2 = KL + 1
-         K3 = 2*KL + KU + 1
-         K4 = KL + KU + 1 + M
-         DO 150 J = 1, N
-            DO 140 I = MAX( K1-J, K2 ), MIN( K3, K4-J )
-               A( I, J ) = A( I, J )*MUL
-  140       CONTINUE
-  150    CONTINUE
-*
-      END IF
-*
-      IF( .NOT.DONE )
-     $   GO TO 10
-*
-      RETURN
-*
-*     End of CLASCL
-*
-      END
--- a/libcruft/lapack/claset.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-      SUBROUTINE CLASET( UPLO, M, N, ALPHA, BETA, A, LDA )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            LDA, M, N
-      COMPLEX            ALPHA, BETA
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLASET initializes a 2-D array A to BETA on the diagonal and
-*  ALPHA on the offdiagonals.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies the part of the matrix A to be set.
-*          = 'U':      Upper triangular part is set. The lower triangle
-*                      is unchanged.
-*          = 'L':      Lower triangular part is set. The upper triangle
-*                      is unchanged.
-*          Otherwise:  All of the matrix A is set.
-*
-*  M       (input) INTEGER
-*          On entry, M specifies the number of rows of A.
-*
-*  N       (input) INTEGER
-*          On entry, N specifies the number of columns of A.
-*
-*  ALPHA   (input) COMPLEX
-*          All the offdiagonal array elements are set to ALPHA.
-*
-*  BETA    (input) COMPLEX
-*          All the diagonal array elements are set to BETA.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the m by n matrix A.
-*          On exit, A(i,j) = ALPHA, 1 <= i <= m, 1 <= j <= n, i.ne.j;
-*                   A(i,i) = BETA , 1 <= i <= min(m,n)
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-      IF( LSAME( UPLO, 'U' ) ) THEN
-*
-*        Set the diagonal to BETA and the strictly upper triangular
-*        part of the array to ALPHA.
-*
-         DO 20 J = 2, N
-            DO 10 I = 1, MIN( J-1, M )
-               A( I, J ) = ALPHA
-   10       CONTINUE
-   20    CONTINUE
-         DO 30 I = 1, MIN( N, M )
-            A( I, I ) = BETA
-   30    CONTINUE
-*
-      ELSE IF( LSAME( UPLO, 'L' ) ) THEN
-*
-*        Set the diagonal to BETA and the strictly lower triangular
-*        part of the array to ALPHA.
-*
-         DO 50 J = 1, MIN( M, N )
-            DO 40 I = J + 1, M
-               A( I, J ) = ALPHA
-   40       CONTINUE
-   50    CONTINUE
-         DO 60 I = 1, MIN( N, M )
-            A( I, I ) = BETA
-   60    CONTINUE
-*
-      ELSE
-*
-*        Set the array to BETA on the diagonal and ALPHA on the
-*        offdiagonal.
-*
-         DO 80 J = 1, N
-            DO 70 I = 1, M
-               A( I, J ) = ALPHA
-   70       CONTINUE
-   80    CONTINUE
-         DO 90 I = 1, MIN( M, N )
-            A( I, I ) = BETA
-   90    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of CLASET
-*
-      END
--- a/libcruft/lapack/clasr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,363 +0,0 @@
-      SUBROUTINE CLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, PIVOT, SIDE
-      INTEGER            LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               C( * ), S( * )
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLASR applies a sequence of real plane rotations to a complex matrix
-*  A, from either the left or the right.
-*
-*  When SIDE = 'L', the transformation takes the form
-*
-*     A := P*A
-*
-*  and when SIDE = 'R', the transformation takes the form
-*
-*     A := A*P**T
-*
-*  where P is an orthogonal matrix consisting of a sequence of z plane
-*  rotations, with z = M when SIDE = 'L' and z = N when SIDE = 'R',
-*  and P**T is the transpose of P.
-*  
-*  When DIRECT = 'F' (Forward sequence), then
-*  
-*     P = P(z-1) * ... * P(2) * P(1)
-*  
-*  and when DIRECT = 'B' (Backward sequence), then
-*  
-*     P = P(1) * P(2) * ... * P(z-1)
-*  
-*  where P(k) is a plane rotation matrix defined by the 2-by-2 rotation
-*  
-*     R(k) = (  c(k)  s(k) )
-*          = ( -s(k)  c(k) ).
-*  
-*  When PIVOT = 'V' (Variable pivot), the rotation is performed
-*  for the plane (k,k+1), i.e., P(k) has the form
-*  
-*     P(k) = (  1                                            )
-*            (       ...                                     )
-*            (              1                                )
-*            (                   c(k)  s(k)                  )
-*            (                  -s(k)  c(k)                  )
-*            (                                1              )
-*            (                                     ...       )
-*            (                                            1  )
-*  
-*  where R(k) appears as a rank-2 modification to the identity matrix in
-*  rows and columns k and k+1.
-*  
-*  When PIVOT = 'T' (Top pivot), the rotation is performed for the
-*  plane (1,k+1), so P(k) has the form
-*  
-*     P(k) = (  c(k)                    s(k)                 )
-*            (         1                                     )
-*            (              ...                              )
-*            (                     1                         )
-*            ( -s(k)                    c(k)                 )
-*            (                                 1             )
-*            (                                      ...      )
-*            (                                             1 )
-*  
-*  where R(k) appears in rows and columns 1 and k+1.
-*  
-*  Similarly, when PIVOT = 'B' (Bottom pivot), the rotation is
-*  performed for the plane (k,z), giving P(k) the form
-*  
-*     P(k) = ( 1                                             )
-*            (      ...                                      )
-*            (             1                                 )
-*            (                  c(k)                    s(k) )
-*            (                         1                     )
-*            (                              ...              )
-*            (                                     1         )
-*            (                 -s(k)                    c(k) )
-*  
-*  where R(k) appears in rows and columns k and z.  The rotations are
-*  performed without ever forming P(k) explicitly.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          Specifies whether the plane rotation matrix P is applied to
-*          A on the left or the right.
-*          = 'L':  Left, compute A := P*A
-*          = 'R':  Right, compute A:= A*P**T
-*
-*  PIVOT   (input) CHARACTER*1
-*          Specifies the plane for which P(k) is a plane rotation
-*          matrix.
-*          = 'V':  Variable pivot, the plane (k,k+1)
-*          = 'T':  Top pivot, the plane (1,k+1)
-*          = 'B':  Bottom pivot, the plane (k,z)
-*
-*  DIRECT  (input) CHARACTER*1
-*          Specifies whether P is a forward or backward sequence of
-*          plane rotations.
-*          = 'F':  Forward, P = P(z-1)*...*P(2)*P(1)
-*          = 'B':  Backward, P = P(1)*P(2)*...*P(z-1)
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  If m <= 1, an immediate
-*          return is effected.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  If n <= 1, an
-*          immediate return is effected.
-*
-*  C       (input) REAL array, dimension
-*                  (M-1) if SIDE = 'L'
-*                  (N-1) if SIDE = 'R'
-*          The cosines c(k) of the plane rotations.
-*
-*  S       (input) REAL array, dimension
-*                  (M-1) if SIDE = 'L'
-*                  (N-1) if SIDE = 'R'
-*          The sines s(k) of the plane rotations.  The 2-by-2 plane
-*          rotation part of the matrix P(k), R(k), has the form
-*          R(k) = (  c(k)  s(k) )
-*                 ( -s(k)  c(k) ).
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          The M-by-N matrix A.  On exit, A is overwritten by P*A if
-*          SIDE = 'R' or by A*P**T if SIDE = 'L'.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, INFO, J
-      REAL               CTEMP, STEMP
-      COMPLEX            TEMP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( .NOT.( LSAME( SIDE, 'L' ) .OR. LSAME( SIDE, 'R' ) ) ) THEN
-         INFO = 1
-      ELSE IF( .NOT.( LSAME( PIVOT, 'V' ) .OR. LSAME( PIVOT,
-     $         'T' ) .OR. LSAME( PIVOT, 'B' ) ) ) THEN
-         INFO = 2
-      ELSE IF( .NOT.( LSAME( DIRECT, 'F' ) .OR. LSAME( DIRECT, 'B' ) ) )
-     $          THEN
-         INFO = 3
-      ELSE IF( M.LT.0 ) THEN
-         INFO = 4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = 5
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = 9
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CLASR ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( ( M.EQ.0 ) .OR. ( N.EQ.0 ) )
-     $   RETURN
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  P * A
-*
-         IF( LSAME( PIVOT, 'V' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 20 J = 1, M - 1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 10 I = 1, N
-                        TEMP = A( J+1, I )
-                        A( J+1, I ) = CTEMP*TEMP - STEMP*A( J, I )
-                        A( J, I ) = STEMP*TEMP + CTEMP*A( J, I )
-   10                CONTINUE
-                  END IF
-   20          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 40 J = M - 1, 1, -1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 30 I = 1, N
-                        TEMP = A( J+1, I )
-                        A( J+1, I ) = CTEMP*TEMP - STEMP*A( J, I )
-                        A( J, I ) = STEMP*TEMP + CTEMP*A( J, I )
-   30                CONTINUE
-                  END IF
-   40          CONTINUE
-            END IF
-         ELSE IF( LSAME( PIVOT, 'T' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 60 J = 2, M
-                  CTEMP = C( J-1 )
-                  STEMP = S( J-1 )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 50 I = 1, N
-                        TEMP = A( J, I )
-                        A( J, I ) = CTEMP*TEMP - STEMP*A( 1, I )
-                        A( 1, I ) = STEMP*TEMP + CTEMP*A( 1, I )
-   50                CONTINUE
-                  END IF
-   60          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 80 J = M, 2, -1
-                  CTEMP = C( J-1 )
-                  STEMP = S( J-1 )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 70 I = 1, N
-                        TEMP = A( J, I )
-                        A( J, I ) = CTEMP*TEMP - STEMP*A( 1, I )
-                        A( 1, I ) = STEMP*TEMP + CTEMP*A( 1, I )
-   70                CONTINUE
-                  END IF
-   80          CONTINUE
-            END IF
-         ELSE IF( LSAME( PIVOT, 'B' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 100 J = 1, M - 1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 90 I = 1, N
-                        TEMP = A( J, I )
-                        A( J, I ) = STEMP*A( M, I ) + CTEMP*TEMP
-                        A( M, I ) = CTEMP*A( M, I ) - STEMP*TEMP
-   90                CONTINUE
-                  END IF
-  100          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 120 J = M - 1, 1, -1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 110 I = 1, N
-                        TEMP = A( J, I )
-                        A( J, I ) = STEMP*A( M, I ) + CTEMP*TEMP
-                        A( M, I ) = CTEMP*A( M, I ) - STEMP*TEMP
-  110                CONTINUE
-                  END IF
-  120          CONTINUE
-            END IF
-         END IF
-      ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*        Form A * P'
-*
-         IF( LSAME( PIVOT, 'V' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 140 J = 1, N - 1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 130 I = 1, M
-                        TEMP = A( I, J+1 )
-                        A( I, J+1 ) = CTEMP*TEMP - STEMP*A( I, J )
-                        A( I, J ) = STEMP*TEMP + CTEMP*A( I, J )
-  130                CONTINUE
-                  END IF
-  140          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 160 J = N - 1, 1, -1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 150 I = 1, M
-                        TEMP = A( I, J+1 )
-                        A( I, J+1 ) = CTEMP*TEMP - STEMP*A( I, J )
-                        A( I, J ) = STEMP*TEMP + CTEMP*A( I, J )
-  150                CONTINUE
-                  END IF
-  160          CONTINUE
-            END IF
-         ELSE IF( LSAME( PIVOT, 'T' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 180 J = 2, N
-                  CTEMP = C( J-1 )
-                  STEMP = S( J-1 )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 170 I = 1, M
-                        TEMP = A( I, J )
-                        A( I, J ) = CTEMP*TEMP - STEMP*A( I, 1 )
-                        A( I, 1 ) = STEMP*TEMP + CTEMP*A( I, 1 )
-  170                CONTINUE
-                  END IF
-  180          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 200 J = N, 2, -1
-                  CTEMP = C( J-1 )
-                  STEMP = S( J-1 )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 190 I = 1, M
-                        TEMP = A( I, J )
-                        A( I, J ) = CTEMP*TEMP - STEMP*A( I, 1 )
-                        A( I, 1 ) = STEMP*TEMP + CTEMP*A( I, 1 )
-  190                CONTINUE
-                  END IF
-  200          CONTINUE
-            END IF
-         ELSE IF( LSAME( PIVOT, 'B' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 220 J = 1, N - 1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 210 I = 1, M
-                        TEMP = A( I, J )
-                        A( I, J ) = STEMP*A( I, N ) + CTEMP*TEMP
-                        A( I, N ) = CTEMP*A( I, N ) - STEMP*TEMP
-  210                CONTINUE
-                  END IF
-  220          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 240 J = N - 1, 1, -1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 230 I = 1, M
-                        TEMP = A( I, J )
-                        A( I, J ) = STEMP*A( I, N ) + CTEMP*TEMP
-                        A( I, N ) = CTEMP*A( I, N ) - STEMP*TEMP
-  230                CONTINUE
-                  END IF
-  240          CONTINUE
-            END IF
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of CLASR
-*
-      END
--- a/libcruft/lapack/classq.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,101 +0,0 @@
-      SUBROUTINE CLASSQ( N, X, INCX, SCALE, SUMSQ )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-      REAL               SCALE, SUMSQ
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLASSQ returns the values scl and ssq such that
-*
-*     ( scl**2 )*ssq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq,
-*
-*  where x( i ) = abs( X( 1 + ( i - 1 )*INCX ) ). The value of sumsq is
-*  assumed to be at least unity and the value of ssq will then satisfy
-*
-*     1.0 .le. ssq .le. ( sumsq + 2*n ).
-*
-*  scale is assumed to be non-negative and scl returns the value
-*
-*     scl = max( scale, abs( real( x( i ) ) ), abs( aimag( x( i ) ) ) ),
-*            i
-*
-*  scale and sumsq must be supplied in SCALE and SUMSQ respectively.
-*  SCALE and SUMSQ are overwritten by scl and ssq respectively.
-*
-*  The routine makes only one pass through the vector X.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of elements to be used from the vector X.
-*
-*  X       (input) COMPLEX array, dimension (N)
-*          The vector x as described above.
-*             x( i )  = X( 1 + ( i - 1 )*INCX ), 1 <= i <= n.
-*
-*  INCX    (input) INTEGER
-*          The increment between successive values of the vector X.
-*          INCX > 0.
-*
-*  SCALE   (input/output) REAL
-*          On entry, the value  scale  in the equation above.
-*          On exit, SCALE is overwritten with the value  scl .
-*
-*  SUMSQ   (input/output) REAL
-*          On entry, the value  sumsq  in the equation above.
-*          On exit, SUMSQ is overwritten with the value  ssq .
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            IX
-      REAL               TEMP1
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, REAL
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.GT.0 ) THEN
-         DO 10 IX = 1, 1 + ( N-1 )*INCX, INCX
-            IF( REAL( X( IX ) ).NE.ZERO ) THEN
-               TEMP1 = ABS( REAL( X( IX ) ) )
-               IF( SCALE.LT.TEMP1 ) THEN
-                  SUMSQ = 1 + SUMSQ*( SCALE / TEMP1 )**2
-                  SCALE = TEMP1
-               ELSE
-                  SUMSQ = SUMSQ + ( TEMP1 / SCALE )**2
-               END IF
-            END IF
-            IF( AIMAG( X( IX ) ).NE.ZERO ) THEN
-               TEMP1 = ABS( AIMAG( X( IX ) ) )
-               IF( SCALE.LT.TEMP1 ) THEN
-                  SUMSQ = 1 + SUMSQ*( SCALE / TEMP1 )**2
-                  SCALE = TEMP1
-               ELSE
-                  SUMSQ = SUMSQ + ( TEMP1 / SCALE )**2
-               END IF
-            END IF
-   10    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of CLASSQ
-*
-      END
--- a/libcruft/lapack/claswp.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,119 +0,0 @@
-      SUBROUTINE CLASWP( N, A, LDA, K1, K2, IPIV, INCX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, K1, K2, LDA, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLASWP performs a series of row interchanges on the matrix A.
-*  One row interchange is initiated for each of rows K1 through K2 of A.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the matrix of column dimension N to which the row
-*          interchanges will be applied.
-*          On exit, the permuted matrix.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.
-*
-*  K1      (input) INTEGER
-*          The first element of IPIV for which a row interchange will
-*          be done.
-*
-*  K2      (input) INTEGER
-*          The last element of IPIV for which a row interchange will
-*          be done.
-*
-*  IPIV    (input) INTEGER array, dimension (K2*abs(INCX))
-*          The vector of pivot indices.  Only the elements in positions
-*          K1 through K2 of IPIV are accessed.
-*          IPIV(K) = L implies rows K and L are to be interchanged.
-*
-*  INCX    (input) INTEGER
-*          The increment between successive values of IPIV.  If IPIV
-*          is negative, the pivots are applied in reverse order.
-*
-*  Further Details
-*  ===============
-*
-*  Modified by
-*   R. C. Whaley, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, I1, I2, INC, IP, IX, IX0, J, K, N32
-      COMPLEX            TEMP
-*     ..
-*     .. Executable Statements ..
-*
-*     Interchange row I with row IPIV(I) for each of rows K1 through K2.
-*
-      IF( INCX.GT.0 ) THEN
-         IX0 = K1
-         I1 = K1
-         I2 = K2
-         INC = 1
-      ELSE IF( INCX.LT.0 ) THEN
-         IX0 = 1 + ( 1-K2 )*INCX
-         I1 = K2
-         I2 = K1
-         INC = -1
-      ELSE
-         RETURN
-      END IF
-*
-      N32 = ( N / 32 )*32
-      IF( N32.NE.0 ) THEN
-         DO 30 J = 1, N32, 32
-            IX = IX0
-            DO 20 I = I1, I2, INC
-               IP = IPIV( IX )
-               IF( IP.NE.I ) THEN
-                  DO 10 K = J, J + 31
-                     TEMP = A( I, K )
-                     A( I, K ) = A( IP, K )
-                     A( IP, K ) = TEMP
-   10             CONTINUE
-               END IF
-               IX = IX + INCX
-   20       CONTINUE
-   30    CONTINUE
-      END IF
-      IF( N32.NE.N ) THEN
-         N32 = N32 + 1
-         IX = IX0
-         DO 50 I = I1, I2, INC
-            IP = IPIV( IX )
-            IF( IP.NE.I ) THEN
-               DO 40 K = N32, N
-                  TEMP = A( I, K )
-                  A( I, K ) = A( IP, K )
-                  A( IP, K ) = TEMP
-   40          CONTINUE
-            END IF
-            IX = IX + INCX
-   50    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of CLASWP
-*
-      END
--- a/libcruft/lapack/clatbs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,908 +0,0 @@
-      SUBROUTINE CLATBS( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X,
-     $                   SCALE, CNORM, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, NORMIN, TRANS, UPLO
-      INTEGER            INFO, KD, LDAB, N
-      REAL               SCALE
-*     ..
-*     .. Array Arguments ..
-      REAL               CNORM( * )
-      COMPLEX            AB( LDAB, * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLATBS solves one of the triangular systems
-*
-*     A * x = s*b,  A**T * x = s*b,  or  A**H * x = s*b,
-*
-*  with scaling to prevent overflow, where A is an upper or lower
-*  triangular band matrix.  Here A' denotes the transpose of A, x and b
-*  are n-element vectors, and s is a scaling factor, usually less than
-*  or equal to 1, chosen so that the components of x will be less than
-*  the overflow threshold.  If the unscaled problem will not cause
-*  overflow, the Level 2 BLAS routine CTBSV is called.  If the matrix A
-*  is singular (A(j,j) = 0 for some j), then s is set to 0 and a
-*  non-trivial solution to A*x = 0 is returned.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the matrix A is upper or lower triangular.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the operation applied to A.
-*          = 'N':  Solve A * x = s*b     (No transpose)
-*          = 'T':  Solve A**T * x = s*b  (Transpose)
-*          = 'C':  Solve A**H * x = s*b  (Conjugate transpose)
-*
-*  DIAG    (input) CHARACTER*1
-*          Specifies whether or not the matrix A is unit triangular.
-*          = 'N':  Non-unit triangular
-*          = 'U':  Unit triangular
-*
-*  NORMIN  (input) CHARACTER*1
-*          Specifies whether CNORM has been set or not.
-*          = 'Y':  CNORM contains the column norms on entry
-*          = 'N':  CNORM is not set on entry.  On exit, the norms will
-*                  be computed and stored in CNORM.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of subdiagonals or superdiagonals in the
-*          triangular matrix A.  KD >= 0.
-*
-*  AB      (input) COMPLEX array, dimension (LDAB,N)
-*          The upper or lower triangular band matrix A, stored in the
-*          first KD+1 rows of the array. The j-th column of A is stored
-*          in the j-th column of the array AB as follows:
-*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  X       (input/output) COMPLEX array, dimension (N)
-*          On entry, the right hand side b of the triangular system.
-*          On exit, X is overwritten by the solution vector x.
-*
-*  SCALE   (output) REAL
-*          The scaling factor s for the triangular system
-*             A * x = s*b,  A**T * x = s*b,  or  A**H * x = s*b.
-*          If SCALE = 0, the matrix A is singular or badly scaled, and
-*          the vector x is an exact or approximate solution to A*x = 0.
-*
-*  CNORM   (input or output) REAL array, dimension (N)
-*
-*          If NORMIN = 'Y', CNORM is an input argument and CNORM(j)
-*          contains the norm of the off-diagonal part of the j-th column
-*          of A.  If TRANS = 'N', CNORM(j) must be greater than or equal
-*          to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j)
-*          must be greater than or equal to the 1-norm.
-*
-*          If NORMIN = 'N', CNORM is an output argument and CNORM(j)
-*          returns the 1-norm of the offdiagonal part of the j-th column
-*          of A.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -k, the k-th argument had an illegal value
-*
-*  Further Details
-*  ======= =======
-*
-*  A rough bound on x is computed; if that is less than overflow, CTBSV
-*  is called, otherwise, specific code is used which checks for possible
-*  overflow or divide-by-zero at every operation.
-*
-*  A columnwise scheme is used for solving A*x = b.  The basic algorithm
-*  if A is lower triangular is
-*
-*       x[1:n] := b[1:n]
-*       for j = 1, ..., n
-*            x(j) := x(j) / A(j,j)
-*            x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j]
-*       end
-*
-*  Define bounds on the components of x after j iterations of the loop:
-*     M(j) = bound on x[1:j]
-*     G(j) = bound on x[j+1:n]
-*  Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}.
-*
-*  Then for iteration j+1 we have
-*     M(j+1) <= G(j) / | A(j+1,j+1) |
-*     G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] |
-*            <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | )
-*
-*  where CNORM(j+1) is greater than or equal to the infinity-norm of
-*  column j+1 of A, not counting the diagonal.  Hence
-*
-*     G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | )
-*                  1<=i<=j
-*  and
-*
-*     |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| )
-*                                   1<=i< j
-*
-*  Since |x(j)| <= M(j), we use the Level 2 BLAS routine CTBSV if the
-*  reciprocal of the largest M(j), j=1,..,n, is larger than
-*  max(underflow, 1/overflow).
-*
-*  The bound on x(j) is also used to determine when a step in the
-*  columnwise method can be performed without fear of overflow.  If
-*  the computed bound is greater than a large constant, x is scaled to
-*  prevent overflow, but if the bound overflows, x is set to 0, x(j) to
-*  1, and scale to 0, and a non-trivial solution to A*x = 0 is found.
-*
-*  Similarly, a row-wise scheme is used to solve A**T *x = b  or
-*  A**H *x = b.  The basic algorithm for A upper triangular is
-*
-*       for j = 1, ..., n
-*            x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j)
-*       end
-*
-*  We simultaneously compute two bounds
-*       G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j
-*       M(j) = bound on x(i), 1<=i<=j
-*
-*  The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we
-*  add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1.
-*  Then the bound on x(j) is
-*
-*       M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) |
-*
-*            <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| )
-*                      1<=i<=j
-*
-*  and we can safely call CTBSV if 1/M(n) and 1/G(n) are both greater
-*  than max(underflow, 1/overflow).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, HALF, ONE, TWO
-      PARAMETER          ( ZERO = 0.0E+0, HALF = 0.5E+0, ONE = 1.0E+0,
-     $                   TWO = 2.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOTRAN, NOUNIT, UPPER
-      INTEGER            I, IMAX, J, JFIRST, JINC, JLAST, JLEN, MAIND
-      REAL               BIGNUM, GROW, REC, SMLNUM, TJJ, TMAX, TSCAL,
-     $                   XBND, XJ, XMAX
-      COMPLEX            CSUMJ, TJJS, USCAL, ZDUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ICAMAX, ISAMAX
-      REAL               SCASUM, SLAMCH
-      COMPLEX            CDOTC, CDOTU, CLADIV
-      EXTERNAL           LSAME, ICAMAX, ISAMAX, SCASUM, SLAMCH, CDOTC,
-     $                   CDOTU, CLADIV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CAXPY, CSSCAL, CTBSV, SLABAD, SSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, CMPLX, CONJG, MAX, MIN, REAL
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1, CABS2
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( REAL( ZDUM ) ) + ABS( AIMAG( ZDUM ) )
-      CABS2( ZDUM ) = ABS( REAL( ZDUM ) / 2. ) +
-     $                ABS( AIMAG( ZDUM ) / 2. )
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      NOUNIT = LSAME( DIAG, 'N' )
-*
-*     Test the input parameters.
-*
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
-     $         LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -3
-      ELSE IF( .NOT.LSAME( NORMIN, 'Y' ) .AND. .NOT.
-     $         LSAME( NORMIN, 'N' ) ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -6
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CLATBS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine machine dependent parameters to control overflow.
-*
-      SMLNUM = SLAMCH( 'Safe minimum' )
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SMLNUM / SLAMCH( 'Precision' )
-      BIGNUM = ONE / SMLNUM
-      SCALE = ONE
-*
-      IF( LSAME( NORMIN, 'N' ) ) THEN
-*
-*        Compute the 1-norm of each column, not including the diagonal.
-*
-         IF( UPPER ) THEN
-*
-*           A is upper triangular.
-*
-            DO 10 J = 1, N
-               JLEN = MIN( KD, J-1 )
-               CNORM( J ) = SCASUM( JLEN, AB( KD+1-JLEN, J ), 1 )
-   10       CONTINUE
-         ELSE
-*
-*           A is lower triangular.
-*
-            DO 20 J = 1, N
-               JLEN = MIN( KD, N-J )
-               IF( JLEN.GT.0 ) THEN
-                  CNORM( J ) = SCASUM( JLEN, AB( 2, J ), 1 )
-               ELSE
-                  CNORM( J ) = ZERO
-               END IF
-   20       CONTINUE
-         END IF
-      END IF
-*
-*     Scale the column norms by TSCAL if the maximum element in CNORM is
-*     greater than BIGNUM/2.
-*
-      IMAX = ISAMAX( N, CNORM, 1 )
-      TMAX = CNORM( IMAX )
-      IF( TMAX.LE.BIGNUM*HALF ) THEN
-         TSCAL = ONE
-      ELSE
-         TSCAL = HALF / ( SMLNUM*TMAX )
-         CALL SSCAL( N, TSCAL, CNORM, 1 )
-      END IF
-*
-*     Compute a bound on the computed solution vector to see if the
-*     Level 2 BLAS routine CTBSV can be used.
-*
-      XMAX = ZERO
-      DO 30 J = 1, N
-         XMAX = MAX( XMAX, CABS2( X( J ) ) )
-   30 CONTINUE
-      XBND = XMAX
-      IF( NOTRAN ) THEN
-*
-*        Compute the growth in A * x = b.
-*
-         IF( UPPER ) THEN
-            JFIRST = N
-            JLAST = 1
-            JINC = -1
-            MAIND = KD + 1
-         ELSE
-            JFIRST = 1
-            JLAST = N
-            JINC = 1
-            MAIND = 1
-         END IF
-*
-         IF( TSCAL.NE.ONE ) THEN
-            GROW = ZERO
-            GO TO 60
-         END IF
-*
-         IF( NOUNIT ) THEN
-*
-*           A is non-unit triangular.
-*
-*           Compute GROW = 1/G(j) and XBND = 1/M(j).
-*           Initially, G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = HALF / MAX( XBND, SMLNUM )
-            XBND = GROW
-            DO 40 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 60
-*
-               TJJS = AB( MAIND, J )
-               TJJ = CABS1( TJJS )
-*
-               IF( TJJ.GE.SMLNUM ) THEN
-*
-*                 M(j) = G(j-1) / abs(A(j,j))
-*
-                  XBND = MIN( XBND, MIN( ONE, TJJ )*GROW )
-               ELSE
-*
-*                 M(j) could overflow, set XBND to 0.
-*
-                  XBND = ZERO
-               END IF
-*
-               IF( TJJ+CNORM( J ).GE.SMLNUM ) THEN
-*
-*                 G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) )
-*
-                  GROW = GROW*( TJJ / ( TJJ+CNORM( J ) ) )
-               ELSE
-*
-*                 G(j) could overflow, set GROW to 0.
-*
-                  GROW = ZERO
-               END IF
-   40       CONTINUE
-            GROW = XBND
-         ELSE
-*
-*           A is unit triangular.
-*
-*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = MIN( ONE, HALF / MAX( XBND, SMLNUM ) )
-            DO 50 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 60
-*
-*              G(j) = G(j-1)*( 1 + CNORM(j) )
-*
-               GROW = GROW*( ONE / ( ONE+CNORM( J ) ) )
-   50       CONTINUE
-         END IF
-   60    CONTINUE
-*
-      ELSE
-*
-*        Compute the growth in A**T * x = b  or  A**H * x = b.
-*
-         IF( UPPER ) THEN
-            JFIRST = 1
-            JLAST = N
-            JINC = 1
-            MAIND = KD + 1
-         ELSE
-            JFIRST = N
-            JLAST = 1
-            JINC = -1
-            MAIND = 1
-         END IF
-*
-         IF( TSCAL.NE.ONE ) THEN
-            GROW = ZERO
-            GO TO 90
-         END IF
-*
-         IF( NOUNIT ) THEN
-*
-*           A is non-unit triangular.
-*
-*           Compute GROW = 1/G(j) and XBND = 1/M(j).
-*           Initially, M(0) = max{x(i), i=1,...,n}.
-*
-            GROW = HALF / MAX( XBND, SMLNUM )
-            XBND = GROW
-            DO 70 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 90
-*
-*              G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) )
-*
-               XJ = ONE + CNORM( J )
-               GROW = MIN( GROW, XBND / XJ )
-*
-               TJJS = AB( MAIND, J )
-               TJJ = CABS1( TJJS )
-*
-               IF( TJJ.GE.SMLNUM ) THEN
-*
-*                 M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j))
-*
-                  IF( XJ.GT.TJJ )
-     $               XBND = XBND*( TJJ / XJ )
-               ELSE
-*
-*                 M(j) could overflow, set XBND to 0.
-*
-                  XBND = ZERO
-               END IF
-   70       CONTINUE
-            GROW = MIN( GROW, XBND )
-         ELSE
-*
-*           A is unit triangular.
-*
-*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = MIN( ONE, HALF / MAX( XBND, SMLNUM ) )
-            DO 80 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 90
-*
-*              G(j) = ( 1 + CNORM(j) )*G(j-1)
-*
-               XJ = ONE + CNORM( J )
-               GROW = GROW / XJ
-   80       CONTINUE
-         END IF
-   90    CONTINUE
-      END IF
-*
-      IF( ( GROW*TSCAL ).GT.SMLNUM ) THEN
-*
-*        Use the Level 2 BLAS solve if the reciprocal of the bound on
-*        elements of X is not too small.
-*
-         CALL CTBSV( UPLO, TRANS, DIAG, N, KD, AB, LDAB, X, 1 )
-      ELSE
-*
-*        Use a Level 1 BLAS solve, scaling intermediate results.
-*
-         IF( XMAX.GT.BIGNUM*HALF ) THEN
-*
-*           Scale X so that its components are less than or equal to
-*           BIGNUM in absolute value.
-*
-            SCALE = ( BIGNUM*HALF ) / XMAX
-            CALL CSSCAL( N, SCALE, X, 1 )
-            XMAX = BIGNUM
-         ELSE
-            XMAX = XMAX*TWO
-         END IF
-*
-         IF( NOTRAN ) THEN
-*
-*           Solve A * x = b
-*
-            DO 110 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) / A(j,j), scaling x if necessary.
-*
-               XJ = CABS1( X( J ) )
-               IF( NOUNIT ) THEN
-                  TJJS = AB( MAIND, J )*TSCAL
-               ELSE
-                  TJJS = TSCAL
-                  IF( TSCAL.EQ.ONE )
-     $               GO TO 105
-               END IF
-                  TJJ = CABS1( TJJS )
-                  IF( TJJ.GT.SMLNUM ) THEN
-*
-*                    abs(A(j,j)) > SMLNUM:
-*
-                     IF( TJJ.LT.ONE ) THEN
-                        IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by 1/b(j).
-*
-                           REC = ONE / XJ
-                           CALL CSSCAL( N, REC, X, 1 )
-                           SCALE = SCALE*REC
-                           XMAX = XMAX*REC
-                        END IF
-                     END IF
-                     X( J ) = CLADIV( X( J ), TJJS )
-                     XJ = CABS1( X( J ) )
-                  ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                    0 < abs(A(j,j)) <= SMLNUM:
-*
-                     IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                       Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM
-*                       to avoid overflow when dividing by A(j,j).
-*
-                        REC = ( TJJ*BIGNUM ) / XJ
-                        IF( CNORM( J ).GT.ONE ) THEN
-*
-*                          Scale by 1/CNORM(j) to avoid overflow when
-*                          multiplying x(j) times column j.
-*
-                           REC = REC / CNORM( J )
-                        END IF
-                        CALL CSSCAL( N, REC, X, 1 )
-                        SCALE = SCALE*REC
-                        XMAX = XMAX*REC
-                     END IF
-                     X( J ) = CLADIV( X( J ), TJJS )
-                     XJ = CABS1( X( J ) )
-                  ELSE
-*
-*                    A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                    scale = 0, and compute a solution to A*x = 0.
-*
-                     DO 100 I = 1, N
-                        X( I ) = ZERO
-  100                CONTINUE
-                     X( J ) = ONE
-                     XJ = ONE
-                     SCALE = ZERO
-                     XMAX = ZERO
-                  END IF
-  105          CONTINUE
-*
-*              Scale x if necessary to avoid overflow when adding a
-*              multiple of column j of A.
-*
-               IF( XJ.GT.ONE ) THEN
-                  REC = ONE / XJ
-                  IF( CNORM( J ).GT.( BIGNUM-XMAX )*REC ) THEN
-*
-*                    Scale x by 1/(2*abs(x(j))).
-*
-                     REC = REC*HALF
-                     CALL CSSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                  END IF
-               ELSE IF( XJ*CNORM( J ).GT.( BIGNUM-XMAX ) ) THEN
-*
-*                 Scale x by 1/2.
-*
-                  CALL CSSCAL( N, HALF, X, 1 )
-                  SCALE = SCALE*HALF
-               END IF
-*
-               IF( UPPER ) THEN
-                  IF( J.GT.1 ) THEN
-*
-*                    Compute the update
-*                       x(max(1,j-kd):j-1) := x(max(1,j-kd):j-1) -
-*                                             x(j)* A(max(1,j-kd):j-1,j)
-*
-                     JLEN = MIN( KD, J-1 )
-                     CALL CAXPY( JLEN, -X( J )*TSCAL,
-     $                           AB( KD+1-JLEN, J ), 1, X( J-JLEN ), 1 )
-                     I = ICAMAX( J-1, X, 1 )
-                     XMAX = CABS1( X( I ) )
-                  END IF
-               ELSE IF( J.LT.N ) THEN
-*
-*                 Compute the update
-*                    x(j+1:min(j+kd,n)) := x(j+1:min(j+kd,n)) -
-*                                          x(j) * A(j+1:min(j+kd,n),j)
-*
-                  JLEN = MIN( KD, N-J )
-                  IF( JLEN.GT.0 )
-     $               CALL CAXPY( JLEN, -X( J )*TSCAL, AB( 2, J ), 1,
-     $                           X( J+1 ), 1 )
-                  I = J + ICAMAX( N-J, X( J+1 ), 1 )
-                  XMAX = CABS1( X( I ) )
-               END IF
-  110       CONTINUE
-*
-         ELSE IF( LSAME( TRANS, 'T' ) ) THEN
-*
-*           Solve A**T * x = b
-*
-            DO 150 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) - sum A(k,j)*x(k).
-*                                    k<>j
-*
-               XJ = CABS1( X( J ) )
-               USCAL = TSCAL
-               REC = ONE / MAX( XMAX, ONE )
-               IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN
-*
-*                 If x(j) could overflow, scale x by 1/(2*XMAX).
-*
-                  REC = REC*HALF
-                  IF( NOUNIT ) THEN
-                     TJJS = AB( MAIND, J )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                  END IF
-                     TJJ = CABS1( TJJS )
-                     IF( TJJ.GT.ONE ) THEN
-*
-*                       Divide by A(j,j) when scaling x if A(j,j) > 1.
-*
-                        REC = MIN( ONE, REC*TJJ )
-                        USCAL = CLADIV( USCAL, TJJS )
-                     END IF
-                  IF( REC.LT.ONE ) THEN
-                     CALL CSSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                     XMAX = XMAX*REC
-                  END IF
-               END IF
-*
-               CSUMJ = ZERO
-               IF( USCAL.EQ.CMPLX( ONE ) ) THEN
-*
-*                 If the scaling needed for A in the dot product is 1,
-*                 call CDOTU to perform the dot product.
-*
-                  IF( UPPER ) THEN
-                     JLEN = MIN( KD, J-1 )
-                     CSUMJ = CDOTU( JLEN, AB( KD+1-JLEN, J ), 1,
-     $                       X( J-JLEN ), 1 )
-                  ELSE
-                     JLEN = MIN( KD, N-J )
-                     IF( JLEN.GT.1 )
-     $                  CSUMJ = CDOTU( JLEN, AB( 2, J ), 1, X( J+1 ),
-     $                          1 )
-                  END IF
-               ELSE
-*
-*                 Otherwise, use in-line code for the dot product.
-*
-                  IF( UPPER ) THEN
-                     JLEN = MIN( KD, J-1 )
-                     DO 120 I = 1, JLEN
-                        CSUMJ = CSUMJ + ( AB( KD+I-JLEN, J )*USCAL )*
-     $                          X( J-JLEN-1+I )
-  120                CONTINUE
-                  ELSE
-                     JLEN = MIN( KD, N-J )
-                     DO 130 I = 1, JLEN
-                        CSUMJ = CSUMJ + ( AB( I+1, J )*USCAL )*X( J+I )
-  130                CONTINUE
-                  END IF
-               END IF
-*
-               IF( USCAL.EQ.CMPLX( TSCAL ) ) THEN
-*
-*                 Compute x(j) := ( x(j) - CSUMJ ) / A(j,j) if 1/A(j,j)
-*                 was not used to scale the dotproduct.
-*
-                  X( J ) = X( J ) - CSUMJ
-                  XJ = CABS1( X( J ) )
-                  IF( NOUNIT ) THEN
-*
-*                    Compute x(j) = x(j) / A(j,j), scaling if necessary.
-*
-                     TJJS = AB( MAIND, J )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                     IF( TSCAL.EQ.ONE )
-     $                  GO TO 145
-                  END IF
-                     TJJ = CABS1( TJJS )
-                     IF( TJJ.GT.SMLNUM ) THEN
-*
-*                       abs(A(j,j)) > SMLNUM:
-*
-                        IF( TJJ.LT.ONE ) THEN
-                           IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                             Scale X by 1/abs(x(j)).
-*
-                              REC = ONE / XJ
-                              CALL CSSCAL( N, REC, X, 1 )
-                              SCALE = SCALE*REC
-                              XMAX = XMAX*REC
-                           END IF
-                        END IF
-                        X( J ) = CLADIV( X( J ), TJJS )
-                     ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                       0 < abs(A(j,j)) <= SMLNUM:
-*
-                        IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM.
-*
-                           REC = ( TJJ*BIGNUM ) / XJ
-                           CALL CSSCAL( N, REC, X, 1 )
-                           SCALE = SCALE*REC
-                           XMAX = XMAX*REC
-                        END IF
-                        X( J ) = CLADIV( X( J ), TJJS )
-                     ELSE
-*
-*                       A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                       scale = 0 and compute a solution to A**T *x = 0.
-*
-                        DO 140 I = 1, N
-                           X( I ) = ZERO
-  140                   CONTINUE
-                        X( J ) = ONE
-                        SCALE = ZERO
-                        XMAX = ZERO
-                     END IF
-  145             CONTINUE
-               ELSE
-*
-*                 Compute x(j) := x(j) / A(j,j) - CSUMJ if the dot
-*                 product has already been divided by 1/A(j,j).
-*
-                  X( J ) = CLADIV( X( J ), TJJS ) - CSUMJ
-               END IF
-               XMAX = MAX( XMAX, CABS1( X( J ) ) )
-  150       CONTINUE
-*
-         ELSE
-*
-*           Solve A**H * x = b
-*
-            DO 190 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) - sum A(k,j)*x(k).
-*                                    k<>j
-*
-               XJ = CABS1( X( J ) )
-               USCAL = TSCAL
-               REC = ONE / MAX( XMAX, ONE )
-               IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN
-*
-*                 If x(j) could overflow, scale x by 1/(2*XMAX).
-*
-                  REC = REC*HALF
-                  IF( NOUNIT ) THEN
-                     TJJS = CONJG( AB( MAIND, J ) )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                  END IF
-                     TJJ = CABS1( TJJS )
-                     IF( TJJ.GT.ONE ) THEN
-*
-*                       Divide by A(j,j) when scaling x if A(j,j) > 1.
-*
-                        REC = MIN( ONE, REC*TJJ )
-                        USCAL = CLADIV( USCAL, TJJS )
-                     END IF
-                  IF( REC.LT.ONE ) THEN
-                     CALL CSSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                     XMAX = XMAX*REC
-                  END IF
-               END IF
-*
-               CSUMJ = ZERO
-               IF( USCAL.EQ.CMPLX( ONE ) ) THEN
-*
-*                 If the scaling needed for A in the dot product is 1,
-*                 call CDOTC to perform the dot product.
-*
-                  IF( UPPER ) THEN
-                     JLEN = MIN( KD, J-1 )
-                     CSUMJ = CDOTC( JLEN, AB( KD+1-JLEN, J ), 1,
-     $                       X( J-JLEN ), 1 )
-                  ELSE
-                     JLEN = MIN( KD, N-J )
-                     IF( JLEN.GT.1 )
-     $                  CSUMJ = CDOTC( JLEN, AB( 2, J ), 1, X( J+1 ),
-     $                          1 )
-                  END IF
-               ELSE
-*
-*                 Otherwise, use in-line code for the dot product.
-*
-                  IF( UPPER ) THEN
-                     JLEN = MIN( KD, J-1 )
-                     DO 160 I = 1, JLEN
-                        CSUMJ = CSUMJ + ( CONJG( AB( KD+I-JLEN, J ) )*
-     $                          USCAL )*X( J-JLEN-1+I )
-  160                CONTINUE
-                  ELSE
-                     JLEN = MIN( KD, N-J )
-                     DO 170 I = 1, JLEN
-                        CSUMJ = CSUMJ + ( CONJG( AB( I+1, J ) )*USCAL )*
-     $                          X( J+I )
-  170                CONTINUE
-                  END IF
-               END IF
-*
-               IF( USCAL.EQ.CMPLX( TSCAL ) ) THEN
-*
-*                 Compute x(j) := ( x(j) - CSUMJ ) / A(j,j) if 1/A(j,j)
-*                 was not used to scale the dotproduct.
-*
-                  X( J ) = X( J ) - CSUMJ
-                  XJ = CABS1( X( J ) )
-                  IF( NOUNIT ) THEN
-*
-*                    Compute x(j) = x(j) / A(j,j), scaling if necessary.
-*
-                     TJJS = CONJG( AB( MAIND, J ) )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                     IF( TSCAL.EQ.ONE )
-     $                  GO TO 185
-                  END IF
-                     TJJ = CABS1( TJJS )
-                     IF( TJJ.GT.SMLNUM ) THEN
-*
-*                       abs(A(j,j)) > SMLNUM:
-*
-                        IF( TJJ.LT.ONE ) THEN
-                           IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                             Scale X by 1/abs(x(j)).
-*
-                              REC = ONE / XJ
-                              CALL CSSCAL( N, REC, X, 1 )
-                              SCALE = SCALE*REC
-                              XMAX = XMAX*REC
-                           END IF
-                        END IF
-                        X( J ) = CLADIV( X( J ), TJJS )
-                     ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                       0 < abs(A(j,j)) <= SMLNUM:
-*
-                        IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM.
-*
-                           REC = ( TJJ*BIGNUM ) / XJ
-                           CALL CSSCAL( N, REC, X, 1 )
-                           SCALE = SCALE*REC
-                           XMAX = XMAX*REC
-                        END IF
-                        X( J ) = CLADIV( X( J ), TJJS )
-                     ELSE
-*
-*                       A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                       scale = 0 and compute a solution to A**H *x = 0.
-*
-                        DO 180 I = 1, N
-                           X( I ) = ZERO
-  180                   CONTINUE
-                        X( J ) = ONE
-                        SCALE = ZERO
-                        XMAX = ZERO
-                     END IF
-  185             CONTINUE
-               ELSE
-*
-*                 Compute x(j) := x(j) / A(j,j) - CSUMJ if the dot
-*                 product has already been divided by 1/A(j,j).
-*
-                  X( J ) = CLADIV( X( J ), TJJS ) - CSUMJ
-               END IF
-               XMAX = MAX( XMAX, CABS1( X( J ) ) )
-  190       CONTINUE
-         END IF
-         SCALE = SCALE / TSCAL
-      END IF
-*
-*     Scale the column norms by 1/TSCAL for return.
-*
-      IF( TSCAL.NE.ONE ) THEN
-         CALL SSCAL( N, ONE / TSCAL, CNORM, 1 )
-      END IF
-*
-      RETURN
-*
-*     End of CLATBS
-*
-      END
--- a/libcruft/lapack/clatrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,279 +0,0 @@
-      SUBROUTINE CLATRD( UPLO, N, NB, A, LDA, E, TAU, W, LDW )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            LDA, LDW, N, NB
-*     ..
-*     .. Array Arguments ..
-      REAL               E( * )
-      COMPLEX            A( LDA, * ), TAU( * ), W( LDW, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLATRD reduces NB rows and columns of a complex Hermitian matrix A to
-*  Hermitian tridiagonal form by a unitary similarity
-*  transformation Q' * A * Q, and returns the matrices V and W which are
-*  needed to apply the transformation to the unreduced part of A.
-*
-*  If UPLO = 'U', CLATRD reduces the last NB rows and columns of a
-*  matrix, of which the upper triangle is supplied;
-*  if UPLO = 'L', CLATRD reduces the first NB rows and columns of a
-*  matrix, of which the lower triangle is supplied.
-*
-*  This is an auxiliary routine called by CHETRD.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          Hermitian matrix A is stored:
-*          = 'U': Upper triangular
-*          = 'L': Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  NB      (input) INTEGER
-*          The number of rows and columns to be reduced.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the leading
-*          n-by-n upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n-by-n lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*          On exit:
-*          if UPLO = 'U', the last NB columns have been reduced to
-*            tridiagonal form, with the diagonal elements overwriting
-*            the diagonal elements of A; the elements above the diagonal
-*            with the array TAU, represent the unitary matrix Q as a
-*            product of elementary reflectors;
-*          if UPLO = 'L', the first NB columns have been reduced to
-*            tridiagonal form, with the diagonal elements overwriting
-*            the diagonal elements of A; the elements below the diagonal
-*            with the array TAU, represent the  unitary matrix Q as a
-*            product of elementary reflectors.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  E       (output) REAL array, dimension (N-1)
-*          If UPLO = 'U', E(n-nb:n-1) contains the superdiagonal
-*          elements of the last NB columns of the reduced matrix;
-*          if UPLO = 'L', E(1:nb) contains the subdiagonal elements of
-*          the first NB columns of the reduced matrix.
-*
-*  TAU     (output) COMPLEX array, dimension (N-1)
-*          The scalar factors of the elementary reflectors, stored in
-*          TAU(n-nb:n-1) if UPLO = 'U', and in TAU(1:nb) if UPLO = 'L'.
-*          See Further Details.
-*
-*  W       (output) COMPLEX array, dimension (LDW,NB)
-*          The n-by-nb matrix W required to update the unreduced part
-*          of A.
-*
-*  LDW     (input) INTEGER
-*          The leading dimension of the array W. LDW >= max(1,N).
-*
-*  Further Details
-*  ===============
-*
-*  If UPLO = 'U', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(n) H(n-1) . . . H(n-nb+1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i),
-*  and tau in TAU(i-1).
-*
-*  If UPLO = 'L', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(1) H(2) . . . H(nb).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i),
-*  and tau in TAU(i).
-*
-*  The elements of the vectors v together form the n-by-nb matrix V
-*  which is needed, with W, to apply the transformation to the unreduced
-*  part of the matrix, using a Hermitian rank-2k update of the form:
-*  A := A - V*W' - W*V'.
-*
-*  The contents of A on exit are illustrated by the following examples
-*  with n = 5 and nb = 2:
-*
-*  if UPLO = 'U':                       if UPLO = 'L':
-*
-*    (  a   a   a   v4  v5 )              (  d                  )
-*    (      a   a   v4  v5 )              (  1   d              )
-*    (          a   1   v5 )              (  v1  1   a          )
-*    (              d   1  )              (  v1  v2  a   a      )
-*    (                  d  )              (  v1  v2  a   a   a  )
-*
-*  where d denotes a diagonal element of the reduced matrix, a denotes
-*  an element of the original matrix that is unchanged, and vi denotes
-*  an element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO, ONE, HALF
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ),
-     $                   ONE = ( 1.0E+0, 0.0E+0 ),
-     $                   HALF = ( 0.5E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, IW
-      COMPLEX            ALPHA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CAXPY, CGEMV, CHEMV, CLACGV, CLARFG, CSCAL
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      COMPLEX            CDOTC
-      EXTERNAL           LSAME, CDOTC
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN, REAL
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-      IF( LSAME( UPLO, 'U' ) ) THEN
-*
-*        Reduce last NB columns of upper triangle
-*
-         DO 10 I = N, N - NB + 1, -1
-            IW = I - N + NB
-            IF( I.LT.N ) THEN
-*
-*              Update A(1:i,i)
-*
-               A( I, I ) = REAL( A( I, I ) )
-               CALL CLACGV( N-I, W( I, IW+1 ), LDW )
-               CALL CGEMV( 'No transpose', I, N-I, -ONE, A( 1, I+1 ),
-     $                     LDA, W( I, IW+1 ), LDW, ONE, A( 1, I ), 1 )
-               CALL CLACGV( N-I, W( I, IW+1 ), LDW )
-               CALL CLACGV( N-I, A( I, I+1 ), LDA )
-               CALL CGEMV( 'No transpose', I, N-I, -ONE, W( 1, IW+1 ),
-     $                     LDW, A( I, I+1 ), LDA, ONE, A( 1, I ), 1 )
-               CALL CLACGV( N-I, A( I, I+1 ), LDA )
-               A( I, I ) = REAL( A( I, I ) )
-            END IF
-            IF( I.GT.1 ) THEN
-*
-*              Generate elementary reflector H(i) to annihilate
-*              A(1:i-2,i)
-*
-               ALPHA = A( I-1, I )
-               CALL CLARFG( I-1, ALPHA, A( 1, I ), 1, TAU( I-1 ) )
-               E( I-1 ) = ALPHA
-               A( I-1, I ) = ONE
-*
-*              Compute W(1:i-1,i)
-*
-               CALL CHEMV( 'Upper', I-1, ONE, A, LDA, A( 1, I ), 1,
-     $                     ZERO, W( 1, IW ), 1 )
-               IF( I.LT.N ) THEN
-                  CALL CGEMV( 'Conjugate transpose', I-1, N-I, ONE,
-     $                        W( 1, IW+1 ), LDW, A( 1, I ), 1, ZERO,
-     $                        W( I+1, IW ), 1 )
-                  CALL CGEMV( 'No transpose', I-1, N-I, -ONE,
-     $                        A( 1, I+1 ), LDA, W( I+1, IW ), 1, ONE,
-     $                        W( 1, IW ), 1 )
-                  CALL CGEMV( 'Conjugate transpose', I-1, N-I, ONE,
-     $                        A( 1, I+1 ), LDA, A( 1, I ), 1, ZERO,
-     $                        W( I+1, IW ), 1 )
-                  CALL CGEMV( 'No transpose', I-1, N-I, -ONE,
-     $                        W( 1, IW+1 ), LDW, W( I+1, IW ), 1, ONE,
-     $                        W( 1, IW ), 1 )
-               END IF
-               CALL CSCAL( I-1, TAU( I-1 ), W( 1, IW ), 1 )
-               ALPHA = -HALF*TAU( I-1 )*CDOTC( I-1, W( 1, IW ), 1,
-     $                 A( 1, I ), 1 )
-               CALL CAXPY( I-1, ALPHA, A( 1, I ), 1, W( 1, IW ), 1 )
-            END IF
-*
-   10    CONTINUE
-      ELSE
-*
-*        Reduce first NB columns of lower triangle
-*
-         DO 20 I = 1, NB
-*
-*           Update A(i:n,i)
-*
-            A( I, I ) = REAL( A( I, I ) )
-            CALL CLACGV( I-1, W( I, 1 ), LDW )
-            CALL CGEMV( 'No transpose', N-I+1, I-1, -ONE, A( I, 1 ),
-     $                  LDA, W( I, 1 ), LDW, ONE, A( I, I ), 1 )
-            CALL CLACGV( I-1, W( I, 1 ), LDW )
-            CALL CLACGV( I-1, A( I, 1 ), LDA )
-            CALL CGEMV( 'No transpose', N-I+1, I-1, -ONE, W( I, 1 ),
-     $                  LDW, A( I, 1 ), LDA, ONE, A( I, I ), 1 )
-            CALL CLACGV( I-1, A( I, 1 ), LDA )
-            A( I, I ) = REAL( A( I, I ) )
-            IF( I.LT.N ) THEN
-*
-*              Generate elementary reflector H(i) to annihilate
-*              A(i+2:n,i)
-*
-               ALPHA = A( I+1, I )
-               CALL CLARFG( N-I, ALPHA, A( MIN( I+2, N ), I ), 1,
-     $                      TAU( I ) )
-               E( I ) = ALPHA
-               A( I+1, I ) = ONE
-*
-*              Compute W(i+1:n,i)
-*
-               CALL CHEMV( 'Lower', N-I, ONE, A( I+1, I+1 ), LDA,
-     $                     A( I+1, I ), 1, ZERO, W( I+1, I ), 1 )
-               CALL CGEMV( 'Conjugate transpose', N-I, I-1, ONE,
-     $                     W( I+1, 1 ), LDW, A( I+1, I ), 1, ZERO,
-     $                     W( 1, I ), 1 )
-               CALL CGEMV( 'No transpose', N-I, I-1, -ONE, A( I+1, 1 ),
-     $                     LDA, W( 1, I ), 1, ONE, W( I+1, I ), 1 )
-               CALL CGEMV( 'Conjugate transpose', N-I, I-1, ONE,
-     $                     A( I+1, 1 ), LDA, A( I+1, I ), 1, ZERO,
-     $                     W( 1, I ), 1 )
-               CALL CGEMV( 'No transpose', N-I, I-1, -ONE, W( I+1, 1 ),
-     $                     LDW, W( 1, I ), 1, ONE, W( I+1, I ), 1 )
-               CALL CSCAL( N-I, TAU( I ), W( I+1, I ), 1 )
-               ALPHA = -HALF*TAU( I )*CDOTC( N-I, W( I+1, I ), 1,
-     $                 A( I+1, I ), 1 )
-               CALL CAXPY( N-I, ALPHA, A( I+1, I ), 1, W( I+1, I ), 1 )
-            END IF
-*
-   20    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of CLATRD
-*
-      END
--- a/libcruft/lapack/clatrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,879 +0,0 @@
-      SUBROUTINE CLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
-     $                   CNORM, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, NORMIN, TRANS, UPLO
-      INTEGER            INFO, LDA, N
-      REAL               SCALE
-*     ..
-*     .. Array Arguments ..
-      REAL               CNORM( * )
-      COMPLEX            A( LDA, * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLATRS solves one of the triangular systems
-*
-*     A * x = s*b,  A**T * x = s*b,  or  A**H * x = s*b,
-*
-*  with scaling to prevent overflow.  Here A is an upper or lower
-*  triangular matrix, A**T denotes the transpose of A, A**H denotes the
-*  conjugate transpose of A, x and b are n-element vectors, and s is a
-*  scaling factor, usually less than or equal to 1, chosen so that the
-*  components of x will be less than the overflow threshold.  If the
-*  unscaled problem will not cause overflow, the Level 2 BLAS routine
-*  CTRSV is called. If the matrix A is singular (A(j,j) = 0 for some j),
-*  then s is set to 0 and a non-trivial solution to A*x = 0 is returned.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the matrix A is upper or lower triangular.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the operation applied to A.
-*          = 'N':  Solve A * x = s*b     (No transpose)
-*          = 'T':  Solve A**T * x = s*b  (Transpose)
-*          = 'C':  Solve A**H * x = s*b  (Conjugate transpose)
-*
-*  DIAG    (input) CHARACTER*1
-*          Specifies whether or not the matrix A is unit triangular.
-*          = 'N':  Non-unit triangular
-*          = 'U':  Unit triangular
-*
-*  NORMIN  (input) CHARACTER*1
-*          Specifies whether CNORM has been set or not.
-*          = 'Y':  CNORM contains the column norms on entry
-*          = 'N':  CNORM is not set on entry.  On exit, the norms will
-*                  be computed and stored in CNORM.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input) COMPLEX array, dimension (LDA,N)
-*          The triangular matrix A.  If UPLO = 'U', the leading n by n
-*          upper triangular part of the array A contains the upper
-*          triangular matrix, and the strictly lower triangular part of
-*          A is not referenced.  If UPLO = 'L', the leading n by n lower
-*          triangular part of the array A contains the lower triangular
-*          matrix, and the strictly upper triangular part of A is not
-*          referenced.  If DIAG = 'U', the diagonal elements of A are
-*          also not referenced and are assumed to be 1.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max (1,N).
-*
-*  X       (input/output) COMPLEX array, dimension (N)
-*          On entry, the right hand side b of the triangular system.
-*          On exit, X is overwritten by the solution vector x.
-*
-*  SCALE   (output) REAL
-*          The scaling factor s for the triangular system
-*             A * x = s*b,  A**T * x = s*b,  or  A**H * x = s*b.
-*          If SCALE = 0, the matrix A is singular or badly scaled, and
-*          the vector x is an exact or approximate solution to A*x = 0.
-*
-*  CNORM   (input or output) REAL array, dimension (N)
-*
-*          If NORMIN = 'Y', CNORM is an input argument and CNORM(j)
-*          contains the norm of the off-diagonal part of the j-th column
-*          of A.  If TRANS = 'N', CNORM(j) must be greater than or equal
-*          to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j)
-*          must be greater than or equal to the 1-norm.
-*
-*          If NORMIN = 'N', CNORM is an output argument and CNORM(j)
-*          returns the 1-norm of the offdiagonal part of the j-th column
-*          of A.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -k, the k-th argument had an illegal value
-*
-*  Further Details
-*  ======= =======
-*
-*  A rough bound on x is computed; if that is less than overflow, CTRSV
-*  is called, otherwise, specific code is used which checks for possible
-*  overflow or divide-by-zero at every operation.
-*
-*  A columnwise scheme is used for solving A*x = b.  The basic algorithm
-*  if A is lower triangular is
-*
-*       x[1:n] := b[1:n]
-*       for j = 1, ..., n
-*            x(j) := x(j) / A(j,j)
-*            x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j]
-*       end
-*
-*  Define bounds on the components of x after j iterations of the loop:
-*     M(j) = bound on x[1:j]
-*     G(j) = bound on x[j+1:n]
-*  Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}.
-*
-*  Then for iteration j+1 we have
-*     M(j+1) <= G(j) / | A(j+1,j+1) |
-*     G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] |
-*            <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | )
-*
-*  where CNORM(j+1) is greater than or equal to the infinity-norm of
-*  column j+1 of A, not counting the diagonal.  Hence
-*
-*     G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | )
-*                  1<=i<=j
-*  and
-*
-*     |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| )
-*                                   1<=i< j
-*
-*  Since |x(j)| <= M(j), we use the Level 2 BLAS routine CTRSV if the
-*  reciprocal of the largest M(j), j=1,..,n, is larger than
-*  max(underflow, 1/overflow).
-*
-*  The bound on x(j) is also used to determine when a step in the
-*  columnwise method can be performed without fear of overflow.  If
-*  the computed bound is greater than a large constant, x is scaled to
-*  prevent overflow, but if the bound overflows, x is set to 0, x(j) to
-*  1, and scale to 0, and a non-trivial solution to A*x = 0 is found.
-*
-*  Similarly, a row-wise scheme is used to solve A**T *x = b  or
-*  A**H *x = b.  The basic algorithm for A upper triangular is
-*
-*       for j = 1, ..., n
-*            x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j)
-*       end
-*
-*  We simultaneously compute two bounds
-*       G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j
-*       M(j) = bound on x(i), 1<=i<=j
-*
-*  The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we
-*  add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1.
-*  Then the bound on x(j) is
-*
-*       M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) |
-*
-*            <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| )
-*                      1<=i<=j
-*
-*  and we can safely call CTRSV if 1/M(n) and 1/G(n) are both greater
-*  than max(underflow, 1/overflow).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, HALF, ONE, TWO
-      PARAMETER          ( ZERO = 0.0E+0, HALF = 0.5E+0, ONE = 1.0E+0,
-     $                   TWO = 2.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOTRAN, NOUNIT, UPPER
-      INTEGER            I, IMAX, J, JFIRST, JINC, JLAST
-      REAL               BIGNUM, GROW, REC, SMLNUM, TJJ, TMAX, TSCAL,
-     $                   XBND, XJ, XMAX
-      COMPLEX            CSUMJ, TJJS, USCAL, ZDUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ICAMAX, ISAMAX
-      REAL               SCASUM, SLAMCH
-      COMPLEX            CDOTC, CDOTU, CLADIV
-      EXTERNAL           LSAME, ICAMAX, ISAMAX, SCASUM, SLAMCH, CDOTC,
-     $                   CDOTU, CLADIV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CAXPY, CSSCAL, CTRSV, SLABAD, SSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, CMPLX, CONJG, MAX, MIN, REAL
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1, CABS2
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( REAL( ZDUM ) ) + ABS( AIMAG( ZDUM ) )
-      CABS2( ZDUM ) = ABS( REAL( ZDUM ) / 2. ) +
-     $                ABS( AIMAG( ZDUM ) / 2. )
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      NOUNIT = LSAME( DIAG, 'N' )
-*
-*     Test the input parameters.
-*
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
-     $         LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -3
-      ELSE IF( .NOT.LSAME( NORMIN, 'Y' ) .AND. .NOT.
-     $         LSAME( NORMIN, 'N' ) ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CLATRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine machine dependent parameters to control overflow.
-*
-      SMLNUM = SLAMCH( 'Safe minimum' )
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SMLNUM / SLAMCH( 'Precision' )
-      BIGNUM = ONE / SMLNUM
-      SCALE = ONE
-*
-      IF( LSAME( NORMIN, 'N' ) ) THEN
-*
-*        Compute the 1-norm of each column, not including the diagonal.
-*
-         IF( UPPER ) THEN
-*
-*           A is upper triangular.
-*
-            DO 10 J = 1, N
-               CNORM( J ) = SCASUM( J-1, A( 1, J ), 1 )
-   10       CONTINUE
-         ELSE
-*
-*           A is lower triangular.
-*
-            DO 20 J = 1, N - 1
-               CNORM( J ) = SCASUM( N-J, A( J+1, J ), 1 )
-   20       CONTINUE
-            CNORM( N ) = ZERO
-         END IF
-      END IF
-*
-*     Scale the column norms by TSCAL if the maximum element in CNORM is
-*     greater than BIGNUM/2.
-*
-      IMAX = ISAMAX( N, CNORM, 1 )
-      TMAX = CNORM( IMAX )
-      IF( TMAX.LE.BIGNUM*HALF ) THEN
-         TSCAL = ONE
-      ELSE
-         TSCAL = HALF / ( SMLNUM*TMAX )
-         CALL SSCAL( N, TSCAL, CNORM, 1 )
-      END IF
-*
-*     Compute a bound on the computed solution vector to see if the
-*     Level 2 BLAS routine CTRSV can be used.
-*
-      XMAX = ZERO
-      DO 30 J = 1, N
-         XMAX = MAX( XMAX, CABS2( X( J ) ) )
-   30 CONTINUE
-      XBND = XMAX
-*
-      IF( NOTRAN ) THEN
-*
-*        Compute the growth in A * x = b.
-*
-         IF( UPPER ) THEN
-            JFIRST = N
-            JLAST = 1
-            JINC = -1
-         ELSE
-            JFIRST = 1
-            JLAST = N
-            JINC = 1
-         END IF
-*
-         IF( TSCAL.NE.ONE ) THEN
-            GROW = ZERO
-            GO TO 60
-         END IF
-*
-         IF( NOUNIT ) THEN
-*
-*           A is non-unit triangular.
-*
-*           Compute GROW = 1/G(j) and XBND = 1/M(j).
-*           Initially, G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = HALF / MAX( XBND, SMLNUM )
-            XBND = GROW
-            DO 40 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 60
-*
-               TJJS = A( J, J )
-               TJJ = CABS1( TJJS )
-*
-               IF( TJJ.GE.SMLNUM ) THEN
-*
-*                 M(j) = G(j-1) / abs(A(j,j))
-*
-                  XBND = MIN( XBND, MIN( ONE, TJJ )*GROW )
-               ELSE
-*
-*                 M(j) could overflow, set XBND to 0.
-*
-                  XBND = ZERO
-               END IF
-*
-               IF( TJJ+CNORM( J ).GE.SMLNUM ) THEN
-*
-*                 G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) )
-*
-                  GROW = GROW*( TJJ / ( TJJ+CNORM( J ) ) )
-               ELSE
-*
-*                 G(j) could overflow, set GROW to 0.
-*
-                  GROW = ZERO
-               END IF
-   40       CONTINUE
-            GROW = XBND
-         ELSE
-*
-*           A is unit triangular.
-*
-*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = MIN( ONE, HALF / MAX( XBND, SMLNUM ) )
-            DO 50 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 60
-*
-*              G(j) = G(j-1)*( 1 + CNORM(j) )
-*
-               GROW = GROW*( ONE / ( ONE+CNORM( J ) ) )
-   50       CONTINUE
-         END IF
-   60    CONTINUE
-*
-      ELSE
-*
-*        Compute the growth in A**T * x = b  or  A**H * x = b.
-*
-         IF( UPPER ) THEN
-            JFIRST = 1
-            JLAST = N
-            JINC = 1
-         ELSE
-            JFIRST = N
-            JLAST = 1
-            JINC = -1
-         END IF
-*
-         IF( TSCAL.NE.ONE ) THEN
-            GROW = ZERO
-            GO TO 90
-         END IF
-*
-         IF( NOUNIT ) THEN
-*
-*           A is non-unit triangular.
-*
-*           Compute GROW = 1/G(j) and XBND = 1/M(j).
-*           Initially, M(0) = max{x(i), i=1,...,n}.
-*
-            GROW = HALF / MAX( XBND, SMLNUM )
-            XBND = GROW
-            DO 70 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 90
-*
-*              G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) )
-*
-               XJ = ONE + CNORM( J )
-               GROW = MIN( GROW, XBND / XJ )
-*
-               TJJS = A( J, J )
-               TJJ = CABS1( TJJS )
-*
-               IF( TJJ.GE.SMLNUM ) THEN
-*
-*                 M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j))
-*
-                  IF( XJ.GT.TJJ )
-     $               XBND = XBND*( TJJ / XJ )
-               ELSE
-*
-*                 M(j) could overflow, set XBND to 0.
-*
-                  XBND = ZERO
-               END IF
-   70       CONTINUE
-            GROW = MIN( GROW, XBND )
-         ELSE
-*
-*           A is unit triangular.
-*
-*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = MIN( ONE, HALF / MAX( XBND, SMLNUM ) )
-            DO 80 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 90
-*
-*              G(j) = ( 1 + CNORM(j) )*G(j-1)
-*
-               XJ = ONE + CNORM( J )
-               GROW = GROW / XJ
-   80       CONTINUE
-         END IF
-   90    CONTINUE
-      END IF
-*
-      IF( ( GROW*TSCAL ).GT.SMLNUM ) THEN
-*
-*        Use the Level 2 BLAS solve if the reciprocal of the bound on
-*        elements of X is not too small.
-*
-         CALL CTRSV( UPLO, TRANS, DIAG, N, A, LDA, X, 1 )
-      ELSE
-*
-*        Use a Level 1 BLAS solve, scaling intermediate results.
-*
-         IF( XMAX.GT.BIGNUM*HALF ) THEN
-*
-*           Scale X so that its components are less than or equal to
-*           BIGNUM in absolute value.
-*
-            SCALE = ( BIGNUM*HALF ) / XMAX
-            CALL CSSCAL( N, SCALE, X, 1 )
-            XMAX = BIGNUM
-         ELSE
-            XMAX = XMAX*TWO
-         END IF
-*
-         IF( NOTRAN ) THEN
-*
-*           Solve A * x = b
-*
-            DO 110 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) / A(j,j), scaling x if necessary.
-*
-               XJ = CABS1( X( J ) )
-               IF( NOUNIT ) THEN
-                  TJJS = A( J, J )*TSCAL
-               ELSE
-                  TJJS = TSCAL
-                  IF( TSCAL.EQ.ONE )
-     $               GO TO 105
-               END IF
-                  TJJ = CABS1( TJJS )
-                  IF( TJJ.GT.SMLNUM ) THEN
-*
-*                    abs(A(j,j)) > SMLNUM:
-*
-                     IF( TJJ.LT.ONE ) THEN
-                        IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by 1/b(j).
-*
-                           REC = ONE / XJ
-                           CALL CSSCAL( N, REC, X, 1 )
-                           SCALE = SCALE*REC
-                           XMAX = XMAX*REC
-                        END IF
-                     END IF
-                     X( J ) = CLADIV( X( J ), TJJS )
-                     XJ = CABS1( X( J ) )
-                  ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                    0 < abs(A(j,j)) <= SMLNUM:
-*
-                     IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                       Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM
-*                       to avoid overflow when dividing by A(j,j).
-*
-                        REC = ( TJJ*BIGNUM ) / XJ
-                        IF( CNORM( J ).GT.ONE ) THEN
-*
-*                          Scale by 1/CNORM(j) to avoid overflow when
-*                          multiplying x(j) times column j.
-*
-                           REC = REC / CNORM( J )
-                        END IF
-                        CALL CSSCAL( N, REC, X, 1 )
-                        SCALE = SCALE*REC
-                        XMAX = XMAX*REC
-                     END IF
-                     X( J ) = CLADIV( X( J ), TJJS )
-                     XJ = CABS1( X( J ) )
-                  ELSE
-*
-*                    A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                    scale = 0, and compute a solution to A*x = 0.
-*
-                     DO 100 I = 1, N
-                        X( I ) = ZERO
-  100                CONTINUE
-                     X( J ) = ONE
-                     XJ = ONE
-                     SCALE = ZERO
-                     XMAX = ZERO
-                  END IF
-  105          CONTINUE
-*
-*              Scale x if necessary to avoid overflow when adding a
-*              multiple of column j of A.
-*
-               IF( XJ.GT.ONE ) THEN
-                  REC = ONE / XJ
-                  IF( CNORM( J ).GT.( BIGNUM-XMAX )*REC ) THEN
-*
-*                    Scale x by 1/(2*abs(x(j))).
-*
-                     REC = REC*HALF
-                     CALL CSSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                  END IF
-               ELSE IF( XJ*CNORM( J ).GT.( BIGNUM-XMAX ) ) THEN
-*
-*                 Scale x by 1/2.
-*
-                  CALL CSSCAL( N, HALF, X, 1 )
-                  SCALE = SCALE*HALF
-               END IF
-*
-               IF( UPPER ) THEN
-                  IF( J.GT.1 ) THEN
-*
-*                    Compute the update
-*                       x(1:j-1) := x(1:j-1) - x(j) * A(1:j-1,j)
-*
-                     CALL CAXPY( J-1, -X( J )*TSCAL, A( 1, J ), 1, X,
-     $                           1 )
-                     I = ICAMAX( J-1, X, 1 )
-                     XMAX = CABS1( X( I ) )
-                  END IF
-               ELSE
-                  IF( J.LT.N ) THEN
-*
-*                    Compute the update
-*                       x(j+1:n) := x(j+1:n) - x(j) * A(j+1:n,j)
-*
-                     CALL CAXPY( N-J, -X( J )*TSCAL, A( J+1, J ), 1,
-     $                           X( J+1 ), 1 )
-                     I = J + ICAMAX( N-J, X( J+1 ), 1 )
-                     XMAX = CABS1( X( I ) )
-                  END IF
-               END IF
-  110       CONTINUE
-*
-         ELSE IF( LSAME( TRANS, 'T' ) ) THEN
-*
-*           Solve A**T * x = b
-*
-            DO 150 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) - sum A(k,j)*x(k).
-*                                    k<>j
-*
-               XJ = CABS1( X( J ) )
-               USCAL = TSCAL
-               REC = ONE / MAX( XMAX, ONE )
-               IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN
-*
-*                 If x(j) could overflow, scale x by 1/(2*XMAX).
-*
-                  REC = REC*HALF
-                  IF( NOUNIT ) THEN
-                     TJJS = A( J, J )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                  END IF
-                     TJJ = CABS1( TJJS )
-                     IF( TJJ.GT.ONE ) THEN
-*
-*                       Divide by A(j,j) when scaling x if A(j,j) > 1.
-*
-                        REC = MIN( ONE, REC*TJJ )
-                        USCAL = CLADIV( USCAL, TJJS )
-                     END IF
-                  IF( REC.LT.ONE ) THEN
-                     CALL CSSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                     XMAX = XMAX*REC
-                  END IF
-               END IF
-*
-               CSUMJ = ZERO
-               IF( USCAL.EQ.CMPLX( ONE ) ) THEN
-*
-*                 If the scaling needed for A in the dot product is 1,
-*                 call CDOTU to perform the dot product.
-*
-                  IF( UPPER ) THEN
-                     CSUMJ = CDOTU( J-1, A( 1, J ), 1, X, 1 )
-                  ELSE IF( J.LT.N ) THEN
-                     CSUMJ = CDOTU( N-J, A( J+1, J ), 1, X( J+1 ), 1 )
-                  END IF
-               ELSE
-*
-*                 Otherwise, use in-line code for the dot product.
-*
-                  IF( UPPER ) THEN
-                     DO 120 I = 1, J - 1
-                        CSUMJ = CSUMJ + ( A( I, J )*USCAL )*X( I )
-  120                CONTINUE
-                  ELSE IF( J.LT.N ) THEN
-                     DO 130 I = J + 1, N
-                        CSUMJ = CSUMJ + ( A( I, J )*USCAL )*X( I )
-  130                CONTINUE
-                  END IF
-               END IF
-*
-               IF( USCAL.EQ.CMPLX( TSCAL ) ) THEN
-*
-*                 Compute x(j) := ( x(j) - CSUMJ ) / A(j,j) if 1/A(j,j)
-*                 was not used to scale the dotproduct.
-*
-                  X( J ) = X( J ) - CSUMJ
-                  XJ = CABS1( X( J ) )
-                  IF( NOUNIT ) THEN
-                     TJJS = A( J, J )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                     IF( TSCAL.EQ.ONE )
-     $                  GO TO 145
-                  END IF
-*
-*                    Compute x(j) = x(j) / A(j,j), scaling if necessary.
-*
-                     TJJ = CABS1( TJJS )
-                     IF( TJJ.GT.SMLNUM ) THEN
-*
-*                       abs(A(j,j)) > SMLNUM:
-*
-                        IF( TJJ.LT.ONE ) THEN
-                           IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                             Scale X by 1/abs(x(j)).
-*
-                              REC = ONE / XJ
-                              CALL CSSCAL( N, REC, X, 1 )
-                              SCALE = SCALE*REC
-                              XMAX = XMAX*REC
-                           END IF
-                        END IF
-                        X( J ) = CLADIV( X( J ), TJJS )
-                     ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                       0 < abs(A(j,j)) <= SMLNUM:
-*
-                        IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM.
-*
-                           REC = ( TJJ*BIGNUM ) / XJ
-                           CALL CSSCAL( N, REC, X, 1 )
-                           SCALE = SCALE*REC
-                           XMAX = XMAX*REC
-                        END IF
-                        X( J ) = CLADIV( X( J ), TJJS )
-                     ELSE
-*
-*                       A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                       scale = 0 and compute a solution to A**T *x = 0.
-*
-                        DO 140 I = 1, N
-                           X( I ) = ZERO
-  140                   CONTINUE
-                        X( J ) = ONE
-                        SCALE = ZERO
-                        XMAX = ZERO
-                     END IF
-  145             CONTINUE
-               ELSE
-*
-*                 Compute x(j) := x(j) / A(j,j) - CSUMJ if the dot
-*                 product has already been divided by 1/A(j,j).
-*
-                  X( J ) = CLADIV( X( J ), TJJS ) - CSUMJ
-               END IF
-               XMAX = MAX( XMAX, CABS1( X( J ) ) )
-  150       CONTINUE
-*
-         ELSE
-*
-*           Solve A**H * x = b
-*
-            DO 190 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) - sum A(k,j)*x(k).
-*                                    k<>j
-*
-               XJ = CABS1( X( J ) )
-               USCAL = TSCAL
-               REC = ONE / MAX( XMAX, ONE )
-               IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN
-*
-*                 If x(j) could overflow, scale x by 1/(2*XMAX).
-*
-                  REC = REC*HALF
-                  IF( NOUNIT ) THEN
-                     TJJS = CONJG( A( J, J ) )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                  END IF
-                     TJJ = CABS1( TJJS )
-                     IF( TJJ.GT.ONE ) THEN
-*
-*                       Divide by A(j,j) when scaling x if A(j,j) > 1.
-*
-                        REC = MIN( ONE, REC*TJJ )
-                        USCAL = CLADIV( USCAL, TJJS )
-                     END IF
-                  IF( REC.LT.ONE ) THEN
-                     CALL CSSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                     XMAX = XMAX*REC
-                  END IF
-               END IF
-*
-               CSUMJ = ZERO
-               IF( USCAL.EQ.CMPLX( ONE ) ) THEN
-*
-*                 If the scaling needed for A in the dot product is 1,
-*                 call CDOTC to perform the dot product.
-*
-                  IF( UPPER ) THEN
-                     CSUMJ = CDOTC( J-1, A( 1, J ), 1, X, 1 )
-                  ELSE IF( J.LT.N ) THEN
-                     CSUMJ = CDOTC( N-J, A( J+1, J ), 1, X( J+1 ), 1 )
-                  END IF
-               ELSE
-*
-*                 Otherwise, use in-line code for the dot product.
-*
-                  IF( UPPER ) THEN
-                     DO 160 I = 1, J - 1
-                        CSUMJ = CSUMJ + ( CONJG( A( I, J ) )*USCAL )*
-     $                          X( I )
-  160                CONTINUE
-                  ELSE IF( J.LT.N ) THEN
-                     DO 170 I = J + 1, N
-                        CSUMJ = CSUMJ + ( CONJG( A( I, J ) )*USCAL )*
-     $                          X( I )
-  170                CONTINUE
-                  END IF
-               END IF
-*
-               IF( USCAL.EQ.CMPLX( TSCAL ) ) THEN
-*
-*                 Compute x(j) := ( x(j) - CSUMJ ) / A(j,j) if 1/A(j,j)
-*                 was not used to scale the dotproduct.
-*
-                  X( J ) = X( J ) - CSUMJ
-                  XJ = CABS1( X( J ) )
-                  IF( NOUNIT ) THEN
-                     TJJS = CONJG( A( J, J ) )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                     IF( TSCAL.EQ.ONE )
-     $                  GO TO 185
-                  END IF
-*
-*                    Compute x(j) = x(j) / A(j,j), scaling if necessary.
-*
-                     TJJ = CABS1( TJJS )
-                     IF( TJJ.GT.SMLNUM ) THEN
-*
-*                       abs(A(j,j)) > SMLNUM:
-*
-                        IF( TJJ.LT.ONE ) THEN
-                           IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                             Scale X by 1/abs(x(j)).
-*
-                              REC = ONE / XJ
-                              CALL CSSCAL( N, REC, X, 1 )
-                              SCALE = SCALE*REC
-                              XMAX = XMAX*REC
-                           END IF
-                        END IF
-                        X( J ) = CLADIV( X( J ), TJJS )
-                     ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                       0 < abs(A(j,j)) <= SMLNUM:
-*
-                        IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM.
-*
-                           REC = ( TJJ*BIGNUM ) / XJ
-                           CALL CSSCAL( N, REC, X, 1 )
-                           SCALE = SCALE*REC
-                           XMAX = XMAX*REC
-                        END IF
-                        X( J ) = CLADIV( X( J ), TJJS )
-                     ELSE
-*
-*                       A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                       scale = 0 and compute a solution to A**H *x = 0.
-*
-                        DO 180 I = 1, N
-                           X( I ) = ZERO
-  180                   CONTINUE
-                        X( J ) = ONE
-                        SCALE = ZERO
-                        XMAX = ZERO
-                     END IF
-  185             CONTINUE
-               ELSE
-*
-*                 Compute x(j) := x(j) / A(j,j) - CSUMJ if the dot
-*                 product has already been divided by 1/A(j,j).
-*
-                  X( J ) = CLADIV( X( J ), TJJS ) - CSUMJ
-               END IF
-               XMAX = MAX( XMAX, CABS1( X( J ) ) )
-  190       CONTINUE
-         END IF
-         SCALE = SCALE / TSCAL
-      END IF
-*
-*     Scale the column norms by 1/TSCAL for return.
-*
-      IF( TSCAL.NE.ONE ) THEN
-         CALL SSCAL( N, ONE / TSCAL, CNORM, 1 )
-      END IF
-*
-      RETURN
-*
-*     End of CLATRS
-*
-      END
--- a/libcruft/lapack/clatrz.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,133 +0,0 @@
-      SUBROUTINE CLATRZ( M, N, L, A, LDA, TAU, WORK )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            L, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLATRZ factors the M-by-(M+L) complex upper trapezoidal matrix
-*  [ A1 A2 ] = [ A(1:M,1:M) A(1:M,N-L+1:N) ] as ( R  0 ) * Z by means
-*  of unitary transformations, where  Z is an (M+L)-by-(M+L) unitary
-*  matrix and, R and A1 are M-by-M upper triangular matrices.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  L       (input) INTEGER
-*          The number of columns of the matrix A containing the
-*          meaningful part of the Householder vectors. N-M >= L >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the leading M-by-N upper trapezoidal part of the
-*          array A must contain the matrix to be factorized.
-*          On exit, the leading M-by-M upper triangular part of A
-*          contains the upper triangular matrix R, and elements N-L+1 to
-*          N of the first M rows of A, with the array TAU, represent the
-*          unitary matrix Z as a product of M elementary reflectors.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) COMPLEX array, dimension (M)
-*          The scalar factors of the elementary reflectors.
-*
-*  WORK    (workspace) COMPLEX array, dimension (M)
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  The factorization is obtained by Householder's method.  The kth
-*  transformation matrix, Z( k ), which is used to introduce zeros into
-*  the ( m - k + 1 )th row of A, is given in the form
-*
-*     Z( k ) = ( I     0   ),
-*              ( 0  T( k ) )
-*
-*  where
-*
-*     T( k ) = I - tau*u( k )*u( k )',   u( k ) = (   1    ),
-*                                                 (   0    )
-*                                                 ( z( k ) )
-*
-*  tau is a scalar and z( k ) is an l element vector. tau and z( k )
-*  are chosen to annihilate the elements of the kth row of A2.
-*
-*  The scalar tau is returned in the kth element of TAU and the vector
-*  u( k ) in the kth row of A2, such that the elements of z( k ) are
-*  in  a( k, l + 1 ), ..., a( k, n ). The elements of R are returned in
-*  the upper triangular part of A1.
-*
-*  Z is given by
-*
-*     Z =  Z( 1 ) * Z( 2 ) * ... * Z( m ).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      COMPLEX            ALPHA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLACGV, CLARFG, CLARZ
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CONJG
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 ) THEN
-         RETURN
-      ELSE IF( M.EQ.N ) THEN
-         DO 10 I = 1, N
-            TAU( I ) = ZERO
-   10    CONTINUE
-         RETURN
-      END IF
-*
-      DO 20 I = M, 1, -1
-*
-*        Generate elementary reflector H(i) to annihilate
-*        [ A(i,i) A(i,n-l+1:n) ]
-*
-         CALL CLACGV( L, A( I, N-L+1 ), LDA )
-         ALPHA = CONJG( A( I, I ) )
-         CALL CLARFG( L+1, ALPHA, A( I, N-L+1 ), LDA, TAU( I ) )
-         TAU( I ) = CONJG( TAU( I ) )
-*
-*        Apply H(i) to A(1:i-1,i:n) from the right
-*
-         CALL CLARZ( 'Right', I-1, N-I+1, L, A( I, N-L+1 ), LDA,
-     $               CONJG( TAU( I ) ), A( 1, I ), LDA, WORK )
-         A( I, I ) = CONJG( ALPHA )
-*
-   20 CONTINUE
-*
-      RETURN
-*
-*     End of CLATRZ
-*
-      END
--- a/libcruft/lapack/clauu2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,143 +0,0 @@
-      SUBROUTINE CLAUU2( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLAUU2 computes the product U * U' or L' * L, where the triangular
-*  factor U or L is stored in the upper or lower triangular part of
-*  the array A.
-*
-*  If UPLO = 'U' or 'u' then the upper triangle of the result is stored,
-*  overwriting the factor U in A.
-*  If UPLO = 'L' or 'l' then the lower triangle of the result is stored,
-*  overwriting the factor L in A.
-*
-*  This is the unblocked form of the algorithm, calling Level 2 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the triangular factor stored in the array A
-*          is upper or lower triangular:
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the triangular factor U or L.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the triangular factor U or L.
-*          On exit, if UPLO = 'U', the upper triangle of A is
-*          overwritten with the upper triangle of the product U * U';
-*          if UPLO = 'L', the lower triangle of A is overwritten with
-*          the lower triangle of the product L' * L.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            I
-      REAL               AII
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      COMPLEX            CDOTC
-      EXTERNAL           LSAME, CDOTC
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEMV, CLACGV, CSSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CMPLX, MAX, REAL
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CLAUU2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Compute the product U * U'.
-*
-         DO 10 I = 1, N
-            AII = A( I, I )
-            IF( I.LT.N ) THEN
-               A( I, I ) = AII*AII + REAL( CDOTC( N-I, A( I, I+1 ), LDA,
-     $                     A( I, I+1 ), LDA ) )
-               CALL CLACGV( N-I, A( I, I+1 ), LDA )
-               CALL CGEMV( 'No transpose', I-1, N-I, ONE, A( 1, I+1 ),
-     $                     LDA, A( I, I+1 ), LDA, CMPLX( AII ),
-     $                     A( 1, I ), 1 )
-               CALL CLACGV( N-I, A( I, I+1 ), LDA )
-            ELSE
-               CALL CSSCAL( I, AII, A( 1, I ), 1 )
-            END IF
-   10    CONTINUE
-*
-      ELSE
-*
-*        Compute the product L' * L.
-*
-         DO 20 I = 1, N
-            AII = A( I, I )
-            IF( I.LT.N ) THEN
-               A( I, I ) = AII*AII + REAL( CDOTC( N-I, A( I+1, I ), 1,
-     $                     A( I+1, I ), 1 ) )
-               CALL CLACGV( I-1, A( I, 1 ), LDA )
-               CALL CGEMV( 'Conjugate transpose', N-I, I-1, ONE,
-     $                     A( I+1, 1 ), LDA, A( I+1, I ), 1,
-     $                     CMPLX( AII ), A( I, 1 ), LDA )
-               CALL CLACGV( I-1, A( I, 1 ), LDA )
-            ELSE
-               CALL CSSCAL( I, AII, A( I, 1 ), LDA )
-            END IF
-   20    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of CLAUU2
-*
-      END
--- a/libcruft/lapack/clauum.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,160 +0,0 @@
-      SUBROUTINE CLAUUM( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CLAUUM computes the product U * U' or L' * L, where the triangular
-*  factor U or L is stored in the upper or lower triangular part of
-*  the array A.
-*
-*  If UPLO = 'U' or 'u' then the upper triangle of the result is stored,
-*  overwriting the factor U in A.
-*  If UPLO = 'L' or 'l' then the lower triangle of the result is stored,
-*  overwriting the factor L in A.
-*
-*  This is the blocked form of the algorithm, calling Level 3 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the triangular factor stored in the array A
-*          is upper or lower triangular:
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the triangular factor U or L.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the triangular factor U or L.
-*          On exit, if UPLO = 'U', the upper triangle of A is
-*          overwritten with the upper triangle of the product U * U';
-*          if UPLO = 'L', the lower triangle of A is overwritten with
-*          the lower triangle of the product L' * L.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-      COMPLEX            CONE
-      PARAMETER          ( CONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            I, IB, NB
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEMM, CHERK, CLAUU2, CTRMM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CLAUUM', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'CLAUUM', UPLO, N, -1, -1, -1 )
-*
-      IF( NB.LE.1 .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code
-*
-         CALL CLAUU2( UPLO, N, A, LDA, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( UPPER ) THEN
-*
-*           Compute the product U * U'.
-*
-            DO 10 I = 1, N, NB
-               IB = MIN( NB, N-I+1 )
-               CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose',
-     $                     'Non-unit', I-1, IB, CONE, A( I, I ), LDA,
-     $                     A( 1, I ), LDA )
-               CALL CLAUU2( 'Upper', IB, A( I, I ), LDA, INFO )
-               IF( I+IB.LE.N ) THEN
-                  CALL CGEMM( 'No transpose', 'Conjugate transpose',
-     $                        I-1, IB, N-I-IB+1, CONE, A( 1, I+IB ),
-     $                        LDA, A( I, I+IB ), LDA, CONE, A( 1, I ),
-     $                        LDA )
-                  CALL CHERK( 'Upper', 'No transpose', IB, N-I-IB+1,
-     $                        ONE, A( I, I+IB ), LDA, ONE, A( I, I ),
-     $                        LDA )
-               END IF
-   10       CONTINUE
-         ELSE
-*
-*           Compute the product L' * L.
-*
-            DO 20 I = 1, N, NB
-               IB = MIN( NB, N-I+1 )
-               CALL CTRMM( 'Left', 'Lower', 'Conjugate transpose',
-     $                     'Non-unit', IB, I-1, CONE, A( I, I ), LDA,
-     $                     A( I, 1 ), LDA )
-               CALL CLAUU2( 'Lower', IB, A( I, I ), LDA, INFO )
-               IF( I+IB.LE.N ) THEN
-                  CALL CGEMM( 'Conjugate transpose', 'No transpose', IB,
-     $                        I-1, N-I-IB+1, CONE, A( I+IB, I ), LDA,
-     $                        A( I+IB, 1 ), LDA, CONE, A( I, 1 ), LDA )
-                  CALL CHERK( 'Lower', 'Conjugate transpose', IB,
-     $                        N-I-IB+1, ONE, A( I+IB, I ), LDA, ONE,
-     $                        A( I, I ), LDA )
-               END IF
-   20       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of CLAUUM
-*
-      END
--- a/libcruft/lapack/cpbcon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,198 +0,0 @@
-      SUBROUTINE CPBCON( UPLO, N, KD, AB, LDAB, ANORM, RCOND, WORK,
-     $                   RWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call CLACN2 in place of CLACON, 10 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, KD, LDAB, N
-      REAL               ANORM, RCOND
-*     ..
-*     .. Array Arguments ..
-      REAL               RWORK( * )
-      COMPLEX            AB( LDAB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CPBCON estimates the reciprocal of the condition number (in the
-*  1-norm) of a complex Hermitian positive definite band matrix using
-*  the Cholesky factorization A = U**H*U or A = L*L**H computed by
-*  CPBTRF.
-*
-*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
-*  condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))).
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangular factor stored in AB;
-*          = 'L':  Lower triangular factor stored in AB.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of superdiagonals of the matrix A if UPLO = 'U',
-*          or the number of sub-diagonals if UPLO = 'L'.  KD >= 0.
-*
-*  AB      (input) COMPLEX array, dimension (LDAB,N)
-*          The triangular factor U or L from the Cholesky factorization
-*          A = U**H*U or A = L*L**H of the band matrix A, stored in the
-*          first KD+1 rows of the array.  The j-th column of U or L is
-*          stored in the j-th column of the array AB as follows:
-*          if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO ='L', AB(1+i-j,j)    = L(i,j) for j<=i<=min(n,j+kd).
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  ANORM   (input) REAL
-*          The 1-norm (or infinity-norm) of the Hermitian band matrix A.
-*
-*  RCOND   (output) REAL
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an
-*          estimate of the 1-norm of inv(A) computed in this routine.
-*
-*  WORK    (workspace) COMPLEX array, dimension (2*N)
-*
-*  RWORK   (workspace) REAL array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      CHARACTER          NORMIN
-      INTEGER            IX, KASE
-      REAL               AINVNM, SCALE, SCALEL, SCALEU, SMLNUM
-      COMPLEX            ZDUM
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ICAMAX
-      REAL               SLAMCH
-      EXTERNAL           LSAME, ICAMAX, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLACN2, CLATBS, CSRSCL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, REAL
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( REAL( ZDUM ) ) + ABS( AIMAG( ZDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -5
-      ELSE IF( ANORM.LT.ZERO ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CPBCON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      RCOND = ZERO
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      ELSE IF( ANORM.EQ.ZERO ) THEN
-         RETURN
-      END IF
-*
-      SMLNUM = SLAMCH( 'Safe minimum' )
-*
-*     Estimate the 1-norm of the inverse.
-*
-      KASE = 0
-      NORMIN = 'N'
-   10 CONTINUE
-      CALL CLACN2( N, WORK( N+1 ), WORK, AINVNM, KASE, ISAVE )
-      IF( KASE.NE.0 ) THEN
-         IF( UPPER ) THEN
-*
-*           Multiply by inv(U').
-*
-            CALL CLATBS( 'Upper', 'Conjugate transpose', 'Non-unit',
-     $                   NORMIN, N, KD, AB, LDAB, WORK, SCALEL, RWORK,
-     $                   INFO )
-            NORMIN = 'Y'
-*
-*           Multiply by inv(U).
-*
-            CALL CLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   KD, AB, LDAB, WORK, SCALEU, RWORK, INFO )
-         ELSE
-*
-*           Multiply by inv(L).
-*
-            CALL CLATBS( 'Lower', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   KD, AB, LDAB, WORK, SCALEL, RWORK, INFO )
-            NORMIN = 'Y'
-*
-*           Multiply by inv(L').
-*
-            CALL CLATBS( 'Lower', 'Conjugate transpose', 'Non-unit',
-     $                   NORMIN, N, KD, AB, LDAB, WORK, SCALEU, RWORK,
-     $                   INFO )
-         END IF
-*
-*        Multiply by 1/SCALE if doing so will not cause overflow.
-*
-         SCALE = SCALEL*SCALEU
-         IF( SCALE.NE.ONE ) THEN
-            IX = ICAMAX( N, WORK, 1 )
-            IF( SCALE.LT.CABS1( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
-     $         GO TO 20
-            CALL CSRSCL( N, SCALE, WORK, 1 )
-         END IF
-         GO TO 10
-      END IF
-*
-*     Compute the estimate of the reciprocal condition number.
-*
-      IF( AINVNM.NE.ZERO )
-     $   RCOND = ( ONE / AINVNM ) / ANORM
-*
-   20 CONTINUE
-*
-      RETURN
-*
-*     End of CPBCON
-*
-      END
--- a/libcruft/lapack/cpbtf2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,200 +0,0 @@
-      SUBROUTINE CPBTF2( UPLO, N, KD, AB, LDAB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, KD, LDAB, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            AB( LDAB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CPBTF2 computes the Cholesky factorization of a complex Hermitian
-*  positive definite band matrix A.
-*
-*  The factorization has the form
-*     A = U' * U ,  if UPLO = 'U', or
-*     A = L  * L',  if UPLO = 'L',
-*  where U is an upper triangular matrix, U' is the conjugate transpose
-*  of U, and L is lower triangular.
-*
-*  This is the unblocked version of the algorithm, calling Level 2 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          Hermitian matrix A is stored:
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of super-diagonals of the matrix A if UPLO = 'U',
-*          or the number of sub-diagonals if UPLO = 'L'.  KD >= 0.
-*
-*  AB      (input/output) COMPLEX array, dimension (LDAB,N)
-*          On entry, the upper or lower triangle of the Hermitian band
-*          matrix A, stored in the first KD+1 rows of the array.  The
-*          j-th column of A is stored in the j-th column of the array AB
-*          as follows:
-*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
-*
-*          On exit, if INFO = 0, the triangular factor U or L from the
-*          Cholesky factorization A = U'*U or A = L*L' of the band
-*          matrix A, in the same storage format as A.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*          > 0: if INFO = k, the leading minor of order k is not
-*               positive definite, and the factorization could not be
-*               completed.
-*
-*  Further Details
-*  ===============
-*
-*  The band storage scheme is illustrated by the following example, when
-*  N = 6, KD = 2, and UPLO = 'U':
-*
-*  On entry:                       On exit:
-*
-*      *    *   a13  a24  a35  a46      *    *   u13  u24  u35  u46
-*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
-*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
-*
-*  Similarly, if UPLO = 'L' the format of A is as follows:
-*
-*  On entry:                       On exit:
-*
-*     a11  a22  a33  a44  a55  a66     l11  l22  l33  l44  l55  l66
-*     a21  a32  a43  a54  a65   *      l21  l32  l43  l54  l65   *
-*     a31  a42  a53  a64   *    *      l31  l42  l53  l64   *    *
-*
-*  Array elements marked * are not used by the routine.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            J, KLD, KN
-      REAL               AJJ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CHER, CLACGV, CSSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN, REAL, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CPBTF2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      KLD = MAX( 1, LDAB-1 )
-*
-      IF( UPPER ) THEN
-*
-*        Compute the Cholesky factorization A = U'*U.
-*
-         DO 10 J = 1, N
-*
-*           Compute U(J,J) and test for non-positive-definiteness.
-*
-            AJJ = REAL( AB( KD+1, J ) )
-            IF( AJJ.LE.ZERO ) THEN
-               AB( KD+1, J ) = AJJ
-               GO TO 30
-            END IF
-            AJJ = SQRT( AJJ )
-            AB( KD+1, J ) = AJJ
-*
-*           Compute elements J+1:J+KN of row J and update the
-*           trailing submatrix within the band.
-*
-            KN = MIN( KD, N-J )
-            IF( KN.GT.0 ) THEN
-               CALL CSSCAL( KN, ONE / AJJ, AB( KD, J+1 ), KLD )
-               CALL CLACGV( KN, AB( KD, J+1 ), KLD )
-               CALL CHER( 'Upper', KN, -ONE, AB( KD, J+1 ), KLD,
-     $                    AB( KD+1, J+1 ), KLD )
-               CALL CLACGV( KN, AB( KD, J+1 ), KLD )
-            END IF
-   10    CONTINUE
-      ELSE
-*
-*        Compute the Cholesky factorization A = L*L'.
-*
-         DO 20 J = 1, N
-*
-*           Compute L(J,J) and test for non-positive-definiteness.
-*
-            AJJ = REAL( AB( 1, J ) )
-            IF( AJJ.LE.ZERO ) THEN
-               AB( 1, J ) = AJJ
-               GO TO 30
-            END IF
-            AJJ = SQRT( AJJ )
-            AB( 1, J ) = AJJ
-*
-*           Compute elements J+1:J+KN of column J and update the
-*           trailing submatrix within the band.
-*
-            KN = MIN( KD, N-J )
-            IF( KN.GT.0 ) THEN
-               CALL CSSCAL( KN, ONE / AJJ, AB( 2, J ), 1 )
-               CALL CHER( 'Lower', KN, -ONE, AB( 2, J ), 1,
-     $                    AB( 1, J+1 ), KLD )
-            END IF
-   20    CONTINUE
-      END IF
-      RETURN
-*
-   30 CONTINUE
-      INFO = J
-      RETURN
-*
-*     End of CPBTF2
-*
-      END
--- a/libcruft/lapack/cpbtrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,371 +0,0 @@
-      SUBROUTINE CPBTRF( UPLO, N, KD, AB, LDAB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, KD, LDAB, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            AB( LDAB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CPBTRF computes the Cholesky factorization of a complex Hermitian
-*  positive definite band matrix A.
-*
-*  The factorization has the form
-*     A = U**H * U,  if UPLO = 'U', or
-*     A = L  * L**H,  if UPLO = 'L',
-*  where U is an upper triangular matrix and L is lower triangular.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of superdiagonals of the matrix A if UPLO = 'U',
-*          or the number of subdiagonals if UPLO = 'L'.  KD >= 0.
-*
-*  AB      (input/output) COMPLEX array, dimension (LDAB,N)
-*          On entry, the upper or lower triangle of the Hermitian band
-*          matrix A, stored in the first KD+1 rows of the array.  The
-*          j-th column of A is stored in the j-th column of the array AB
-*          as follows:
-*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
-*
-*          On exit, if INFO = 0, the triangular factor U or L from the
-*          Cholesky factorization A = U**H*U or A = L*L**H of the band
-*          matrix A, in the same storage format as A.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the leading minor of order i is not
-*                positive definite, and the factorization could not be
-*                completed.
-*
-*  Further Details
-*  ===============
-*
-*  The band storage scheme is illustrated by the following example, when
-*  N = 6, KD = 2, and UPLO = 'U':
-*
-*  On entry:                       On exit:
-*
-*      *    *   a13  a24  a35  a46      *    *   u13  u24  u35  u46
-*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
-*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
-*
-*  Similarly, if UPLO = 'L' the format of A is as follows:
-*
-*  On entry:                       On exit:
-*
-*     a11  a22  a33  a44  a55  a66     l11  l22  l33  l44  l55  l66
-*     a21  a32  a43  a54  a65   *      l21  l32  l43  l54  l65   *
-*     a31  a42  a53  a64   *    *      l31  l42  l53  l64   *    *
-*
-*  Array elements marked * are not used by the routine.
-*
-*  Contributed by
-*  Peter Mayes and Giuseppe Radicati, IBM ECSEC, Rome, March 23, 1989
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-      COMPLEX            CONE
-      PARAMETER          ( CONE = ( 1.0E+0, 0.0E+0 ) )
-      INTEGER            NBMAX, LDWORK
-      PARAMETER          ( NBMAX = 32, LDWORK = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I2, I3, IB, II, J, JJ, NB
-*     ..
-*     .. Local Arrays ..
-      COMPLEX            WORK( LDWORK, NBMAX )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEMM, CHERK, CPBTF2, CPOTF2, CTRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( ( .NOT.LSAME( UPLO, 'U' ) ) .AND.
-     $    ( .NOT.LSAME( UPLO, 'L' ) ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CPBTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment
-*
-      NB = ILAENV( 1, 'CPBTRF', UPLO, N, KD, -1, -1 )
-*
-*     The block size must not exceed the semi-bandwidth KD, and must not
-*     exceed the limit set by the size of the local array WORK.
-*
-      NB = MIN( NB, NBMAX )
-*
-      IF( NB.LE.1 .OR. NB.GT.KD ) THEN
-*
-*        Use unblocked code
-*
-         CALL CPBTF2( UPLO, N, KD, AB, LDAB, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( LSAME( UPLO, 'U' ) ) THEN
-*
-*           Compute the Cholesky factorization of a Hermitian band
-*           matrix, given the upper triangle of the matrix in band
-*           storage.
-*
-*           Zero the upper triangle of the work array.
-*
-            DO 20 J = 1, NB
-               DO 10 I = 1, J - 1
-                  WORK( I, J ) = ZERO
-   10          CONTINUE
-   20       CONTINUE
-*
-*           Process the band matrix one diagonal block at a time.
-*
-            DO 70 I = 1, N, NB
-               IB = MIN( NB, N-I+1 )
-*
-*              Factorize the diagonal block
-*
-               CALL CPOTF2( UPLO, IB, AB( KD+1, I ), LDAB-1, II )
-               IF( II.NE.0 ) THEN
-                  INFO = I + II - 1
-                  GO TO 150
-               END IF
-               IF( I+IB.LE.N ) THEN
-*
-*                 Update the relevant part of the trailing submatrix.
-*                 If A11 denotes the diagonal block which has just been
-*                 factorized, then we need to update the remaining
-*                 blocks in the diagram:
-*
-*                    A11   A12   A13
-*                          A22   A23
-*                                A33
-*
-*                 The numbers of rows and columns in the partitioning
-*                 are IB, I2, I3 respectively. The blocks A12, A22 and
-*                 A23 are empty if IB = KD. The upper triangle of A13
-*                 lies outside the band.
-*
-                  I2 = MIN( KD-IB, N-I-IB+1 )
-                  I3 = MIN( IB, N-I-KD+1 )
-*
-                  IF( I2.GT.0 ) THEN
-*
-*                    Update A12
-*
-                     CALL CTRSM( 'Left', 'Upper', 'Conjugate transpose',
-     $                           'Non-unit', IB, I2, CONE,
-     $                           AB( KD+1, I ), LDAB-1,
-     $                           AB( KD+1-IB, I+IB ), LDAB-1 )
-*
-*                    Update A22
-*
-                     CALL CHERK( 'Upper', 'Conjugate transpose', I2, IB,
-     $                           -ONE, AB( KD+1-IB, I+IB ), LDAB-1, ONE,
-     $                           AB( KD+1, I+IB ), LDAB-1 )
-                  END IF
-*
-                  IF( I3.GT.0 ) THEN
-*
-*                    Copy the lower triangle of A13 into the work array.
-*
-                     DO 40 JJ = 1, I3
-                        DO 30 II = JJ, IB
-                           WORK( II, JJ ) = AB( II-JJ+1, JJ+I+KD-1 )
-   30                   CONTINUE
-   40                CONTINUE
-*
-*                    Update A13 (in the work array).
-*
-                     CALL CTRSM( 'Left', 'Upper', 'Conjugate transpose',
-     $                           'Non-unit', IB, I3, CONE,
-     $                           AB( KD+1, I ), LDAB-1, WORK, LDWORK )
-*
-*                    Update A23
-*
-                     IF( I2.GT.0 )
-     $                  CALL CGEMM( 'Conjugate transpose',
-     $                              'No transpose', I2, I3, IB, -CONE,
-     $                              AB( KD+1-IB, I+IB ), LDAB-1, WORK,
-     $                              LDWORK, CONE, AB( 1+IB, I+KD ),
-     $                              LDAB-1 )
-*
-*                    Update A33
-*
-                     CALL CHERK( 'Upper', 'Conjugate transpose', I3, IB,
-     $                           -ONE, WORK, LDWORK, ONE,
-     $                           AB( KD+1, I+KD ), LDAB-1 )
-*
-*                    Copy the lower triangle of A13 back into place.
-*
-                     DO 60 JJ = 1, I3
-                        DO 50 II = JJ, IB
-                           AB( II-JJ+1, JJ+I+KD-1 ) = WORK( II, JJ )
-   50                   CONTINUE
-   60                CONTINUE
-                  END IF
-               END IF
-   70       CONTINUE
-         ELSE
-*
-*           Compute the Cholesky factorization of a Hermitian band
-*           matrix, given the lower triangle of the matrix in band
-*           storage.
-*
-*           Zero the lower triangle of the work array.
-*
-            DO 90 J = 1, NB
-               DO 80 I = J + 1, NB
-                  WORK( I, J ) = ZERO
-   80          CONTINUE
-   90       CONTINUE
-*
-*           Process the band matrix one diagonal block at a time.
-*
-            DO 140 I = 1, N, NB
-               IB = MIN( NB, N-I+1 )
-*
-*              Factorize the diagonal block
-*
-               CALL CPOTF2( UPLO, IB, AB( 1, I ), LDAB-1, II )
-               IF( II.NE.0 ) THEN
-                  INFO = I + II - 1
-                  GO TO 150
-               END IF
-               IF( I+IB.LE.N ) THEN
-*
-*                 Update the relevant part of the trailing submatrix.
-*                 If A11 denotes the diagonal block which has just been
-*                 factorized, then we need to update the remaining
-*                 blocks in the diagram:
-*
-*                    A11
-*                    A21   A22
-*                    A31   A32   A33
-*
-*                 The numbers of rows and columns in the partitioning
-*                 are IB, I2, I3 respectively. The blocks A21, A22 and
-*                 A32 are empty if IB = KD. The lower triangle of A31
-*                 lies outside the band.
-*
-                  I2 = MIN( KD-IB, N-I-IB+1 )
-                  I3 = MIN( IB, N-I-KD+1 )
-*
-                  IF( I2.GT.0 ) THEN
-*
-*                    Update A21
-*
-                     CALL CTRSM( 'Right', 'Lower',
-     $                           'Conjugate transpose', 'Non-unit', I2,
-     $                           IB, CONE, AB( 1, I ), LDAB-1,
-     $                           AB( 1+IB, I ), LDAB-1 )
-*
-*                    Update A22
-*
-                     CALL CHERK( 'Lower', 'No transpose', I2, IB, -ONE,
-     $                           AB( 1+IB, I ), LDAB-1, ONE,
-     $                           AB( 1, I+IB ), LDAB-1 )
-                  END IF
-*
-                  IF( I3.GT.0 ) THEN
-*
-*                    Copy the upper triangle of A31 into the work array.
-*
-                     DO 110 JJ = 1, IB
-                        DO 100 II = 1, MIN( JJ, I3 )
-                           WORK( II, JJ ) = AB( KD+1-JJ+II, JJ+I-1 )
-  100                   CONTINUE
-  110                CONTINUE
-*
-*                    Update A31 (in the work array).
-*
-                     CALL CTRSM( 'Right', 'Lower',
-     $                           'Conjugate transpose', 'Non-unit', I3,
-     $                           IB, CONE, AB( 1, I ), LDAB-1, WORK,
-     $                           LDWORK )
-*
-*                    Update A32
-*
-                     IF( I2.GT.0 )
-     $                  CALL CGEMM( 'No transpose',
-     $                              'Conjugate transpose', I3, I2, IB,
-     $                              -CONE, WORK, LDWORK, AB( 1+IB, I ),
-     $                              LDAB-1, CONE, AB( 1+KD-IB, I+IB ),
-     $                              LDAB-1 )
-*
-*                    Update A33
-*
-                     CALL CHERK( 'Lower', 'No transpose', I3, IB, -ONE,
-     $                           WORK, LDWORK, ONE, AB( 1, I+KD ),
-     $                           LDAB-1 )
-*
-*                    Copy the upper triangle of A31 back into place.
-*
-                     DO 130 JJ = 1, IB
-                        DO 120 II = 1, MIN( JJ, I3 )
-                           AB( KD+1-JJ+II, JJ+I-1 ) = WORK( II, JJ )
-  120                   CONTINUE
-  130                CONTINUE
-                  END IF
-               END IF
-  140       CONTINUE
-         END IF
-      END IF
-      RETURN
-*
-  150 CONTINUE
-      RETURN
-*
-*     End of CPBTRF
-*
-      END
--- a/libcruft/lapack/cpbtrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-      SUBROUTINE CPBTRS( UPLO, N, KD, NRHS, AB, LDAB, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, KD, LDAB, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            AB( LDAB, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CPBTRS solves a system of linear equations A*X = B with a Hermitian
-*  positive definite band matrix A using the Cholesky factorization
-*  A = U**H*U or A = L*L**H computed by CPBTRF.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangular factor stored in AB;
-*          = 'L':  Lower triangular factor stored in AB.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of superdiagonals of the matrix A if UPLO = 'U',
-*          or the number of subdiagonals if UPLO = 'L'.  KD >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  AB      (input) COMPLEX array, dimension (LDAB,N)
-*          The triangular factor U or L from the Cholesky factorization
-*          A = U**H*U or A = L*L**H of the band matrix A, stored in the
-*          first KD+1 rows of the array.  The j-th column of U or L is
-*          stored in the j-th column of the array AB as follows:
-*          if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO ='L', AB(1+i-j,j)    = L(i,j) for j<=i<=min(n,j+kd).
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  B       (input/output) COMPLEX array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CTBSV, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -6
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CPBTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Solve A*X = B where A = U'*U.
-*
-         DO 10 J = 1, NRHS
-*
-*           Solve U'*X = B, overwriting B with X.
-*
-            CALL CTBSV( 'Upper', 'Conjugate transpose', 'Non-unit', N,
-     $                  KD, AB, LDAB, B( 1, J ), 1 )
-*
-*           Solve U*X = B, overwriting B with X.
-*
-            CALL CTBSV( 'Upper', 'No transpose', 'Non-unit', N, KD, AB,
-     $                  LDAB, B( 1, J ), 1 )
-   10    CONTINUE
-      ELSE
-*
-*        Solve A*X = B where A = L*L'.
-*
-         DO 20 J = 1, NRHS
-*
-*           Solve L*X = B, overwriting B with X.
-*
-            CALL CTBSV( 'Lower', 'No transpose', 'Non-unit', N, KD, AB,
-     $                  LDAB, B( 1, J ), 1 )
-*
-*           Solve L'*X = B, overwriting B with X.
-*
-            CALL CTBSV( 'Lower', 'Conjugate transpose', 'Non-unit', N,
-     $                  KD, AB, LDAB, B( 1, J ), 1 )
-   20    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of CPBTRS
-*
-      END
--- a/libcruft/lapack/cpocon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,184 +0,0 @@
-      SUBROUTINE CPOCON( UPLO, N, A, LDA, ANORM, RCOND, WORK, RWORK,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call CLACN2 in place of CLACON, 10 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-      REAL               ANORM, RCOND
-*     ..
-*     .. Array Arguments ..
-      REAL               RWORK( * )
-      COMPLEX            A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CPOCON estimates the reciprocal of the condition number (in the
-*  1-norm) of a complex Hermitian positive definite matrix using the
-*  Cholesky factorization A = U**H*U or A = L*L**H computed by CPOTRF.
-*
-*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
-*  condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))).
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input) COMPLEX array, dimension (LDA,N)
-*          The triangular factor U or L from the Cholesky factorization
-*          A = U**H*U or A = L*L**H, as computed by CPOTRF.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  ANORM   (input) REAL
-*          The 1-norm (or infinity-norm) of the Hermitian matrix A.
-*
-*  RCOND   (output) REAL
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an
-*          estimate of the 1-norm of inv(A) computed in this routine.
-*
-*  WORK    (workspace) COMPLEX array, dimension (2*N)
-*
-*  RWORK   (workspace) REAL array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      CHARACTER          NORMIN
-      INTEGER            IX, KASE
-      REAL               AINVNM, SCALE, SCALEL, SCALEU, SMLNUM
-      COMPLEX            ZDUM
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ICAMAX
-      REAL               SLAMCH
-      EXTERNAL           LSAME, ICAMAX, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLACN2, CLATRS, CSRSCL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, MAX, REAL
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( REAL( ZDUM ) ) + ABS( AIMAG( ZDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( ANORM.LT.ZERO ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CPOCON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      RCOND = ZERO
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      ELSE IF( ANORM.EQ.ZERO ) THEN
-         RETURN
-      END IF
-*
-      SMLNUM = SLAMCH( 'Safe minimum' )
-*
-*     Estimate the 1-norm of inv(A).
-*
-      KASE = 0
-      NORMIN = 'N'
-   10 CONTINUE
-      CALL CLACN2( N, WORK( N+1 ), WORK, AINVNM, KASE, ISAVE )
-      IF( KASE.NE.0 ) THEN
-         IF( UPPER ) THEN
-*
-*           Multiply by inv(U').
-*
-            CALL CLATRS( 'Upper', 'Conjugate transpose', 'Non-unit',
-     $                   NORMIN, N, A, LDA, WORK, SCALEL, RWORK, INFO )
-            NORMIN = 'Y'
-*
-*           Multiply by inv(U).
-*
-            CALL CLATRS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   A, LDA, WORK, SCALEU, RWORK, INFO )
-         ELSE
-*
-*           Multiply by inv(L).
-*
-            CALL CLATRS( 'Lower', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   A, LDA, WORK, SCALEL, RWORK, INFO )
-            NORMIN = 'Y'
-*
-*           Multiply by inv(L').
-*
-            CALL CLATRS( 'Lower', 'Conjugate transpose', 'Non-unit',
-     $                   NORMIN, N, A, LDA, WORK, SCALEU, RWORK, INFO )
-         END IF
-*
-*        Multiply by 1/SCALE if doing so will not cause overflow.
-*
-         SCALE = SCALEL*SCALEU
-         IF( SCALE.NE.ONE ) THEN
-            IX = ICAMAX( N, WORK, 1 )
-            IF( SCALE.LT.CABS1( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
-     $         GO TO 20
-            CALL CSRSCL( N, SCALE, WORK, 1 )
-         END IF
-         GO TO 10
-      END IF
-*
-*     Compute the estimate of the reciprocal condition number.
-*
-      IF( AINVNM.NE.ZERO )
-     $   RCOND = ( ONE / AINVNM ) / ANORM
-*
-   20 CONTINUE
-      RETURN
-*
-*     End of CPOCON
-*
-      END
--- a/libcruft/lapack/cpotf2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,174 +0,0 @@
-      SUBROUTINE CPOTF2( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CPOTF2 computes the Cholesky factorization of a complex Hermitian
-*  positive definite matrix A.
-*
-*  The factorization has the form
-*     A = U' * U ,  if UPLO = 'U', or
-*     A = L  * L',  if UPLO = 'L',
-*  where U is an upper triangular matrix and L is lower triangular.
-*
-*  This is the unblocked version of the algorithm, calling Level 2 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          Hermitian matrix A is stored.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the leading
-*          n by n upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n by n lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*
-*          On exit, if INFO = 0, the factor U or L from the Cholesky
-*          factorization A = U'*U  or A = L*L'.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*          > 0: if INFO = k, the leading minor of order k is not
-*               positive definite, and the factorization could not be
-*               completed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-      COMPLEX            CONE
-      PARAMETER          ( CONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            J
-      REAL               AJJ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      COMPLEX            CDOTC
-      EXTERNAL           LSAME, CDOTC
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEMV, CLACGV, CSSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, REAL, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CPOTF2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Compute the Cholesky factorization A = U'*U.
-*
-         DO 10 J = 1, N
-*
-*           Compute U(J,J) and test for non-positive-definiteness.
-*
-            AJJ = REAL( A( J, J ) ) - CDOTC( J-1, A( 1, J ), 1,
-     $            A( 1, J ), 1 )
-            IF( AJJ.LE.ZERO ) THEN
-               A( J, J ) = AJJ
-               GO TO 30
-            END IF
-            AJJ = SQRT( AJJ )
-            A( J, J ) = AJJ
-*
-*           Compute elements J+1:N of row J.
-*
-            IF( J.LT.N ) THEN
-               CALL CLACGV( J-1, A( 1, J ), 1 )
-               CALL CGEMV( 'Transpose', J-1, N-J, -CONE, A( 1, J+1 ),
-     $                     LDA, A( 1, J ), 1, CONE, A( J, J+1 ), LDA )
-               CALL CLACGV( J-1, A( 1, J ), 1 )
-               CALL CSSCAL( N-J, ONE / AJJ, A( J, J+1 ), LDA )
-            END IF
-   10    CONTINUE
-      ELSE
-*
-*        Compute the Cholesky factorization A = L*L'.
-*
-         DO 20 J = 1, N
-*
-*           Compute L(J,J) and test for non-positive-definiteness.
-*
-            AJJ = REAL( A( J, J ) ) - CDOTC( J-1, A( J, 1 ), LDA,
-     $            A( J, 1 ), LDA )
-            IF( AJJ.LE.ZERO ) THEN
-               A( J, J ) = AJJ
-               GO TO 30
-            END IF
-            AJJ = SQRT( AJJ )
-            A( J, J ) = AJJ
-*
-*           Compute elements J+1:N of column J.
-*
-            IF( J.LT.N ) THEN
-               CALL CLACGV( J-1, A( J, 1 ), LDA )
-               CALL CGEMV( 'No transpose', N-J, J-1, -CONE, A( J+1, 1 ),
-     $                     LDA, A( J, 1 ), LDA, CONE, A( J+1, J ), 1 )
-               CALL CLACGV( J-1, A( J, 1 ), LDA )
-               CALL CSSCAL( N-J, ONE / AJJ, A( J+1, J ), 1 )
-            END IF
-   20    CONTINUE
-      END IF
-      GO TO 40
-*
-   30 CONTINUE
-      INFO = J
-*
-   40 CONTINUE
-      RETURN
-*
-*     End of CPOTF2
-*
-      END
--- a/libcruft/lapack/cpotrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,186 +0,0 @@
-      SUBROUTINE CPOTRF( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CPOTRF computes the Cholesky factorization of a complex Hermitian
-*  positive definite matrix A.
-*
-*  The factorization has the form
-*     A = U**H * U,  if UPLO = 'U', or
-*     A = L  * L**H,  if UPLO = 'L',
-*  where U is an upper triangular matrix and L is lower triangular.
-*
-*  This is the block version of the algorithm, calling Level 3 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the leading
-*          N-by-N upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading N-by-N lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*
-*          On exit, if INFO = 0, the factor U or L from the Cholesky
-*          factorization A = U**H*U or A = L*L**H.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the leading minor of order i is not
-*                positive definite, and the factorization could not be
-*                completed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      COMPLEX            CONE
-      PARAMETER          ( ONE = 1.0E+0, CONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            J, JB, NB
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEMM, CHERK, CPOTF2, CTRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CPOTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'CPOTRF', UPLO, N, -1, -1, -1 )
-      IF( NB.LE.1 .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code.
-*
-         CALL CPOTF2( UPLO, N, A, LDA, INFO )
-      ELSE
-*
-*        Use blocked code.
-*
-         IF( UPPER ) THEN
-*
-*           Compute the Cholesky factorization A = U'*U.
-*
-            DO 10 J = 1, N, NB
-*
-*              Update and factorize the current diagonal block and test
-*              for non-positive-definiteness.
-*
-               JB = MIN( NB, N-J+1 )
-               CALL CHERK( 'Upper', 'Conjugate transpose', JB, J-1,
-     $                     -ONE, A( 1, J ), LDA, ONE, A( J, J ), LDA )
-               CALL CPOTF2( 'Upper', JB, A( J, J ), LDA, INFO )
-               IF( INFO.NE.0 )
-     $            GO TO 30
-               IF( J+JB.LE.N ) THEN
-*
-*                 Compute the current block row.
-*
-                  CALL CGEMM( 'Conjugate transpose', 'No transpose', JB,
-     $                        N-J-JB+1, J-1, -CONE, A( 1, J ), LDA,
-     $                        A( 1, J+JB ), LDA, CONE, A( J, J+JB ),
-     $                        LDA )
-                  CALL CTRSM( 'Left', 'Upper', 'Conjugate transpose',
-     $                        'Non-unit', JB, N-J-JB+1, CONE, A( J, J ),
-     $                        LDA, A( J, J+JB ), LDA )
-               END IF
-   10       CONTINUE
-*
-         ELSE
-*
-*           Compute the Cholesky factorization A = L*L'.
-*
-            DO 20 J = 1, N, NB
-*
-*              Update and factorize the current diagonal block and test
-*              for non-positive-definiteness.
-*
-               JB = MIN( NB, N-J+1 )
-               CALL CHERK( 'Lower', 'No transpose', JB, J-1, -ONE,
-     $                     A( J, 1 ), LDA, ONE, A( J, J ), LDA )
-               CALL CPOTF2( 'Lower', JB, A( J, J ), LDA, INFO )
-               IF( INFO.NE.0 )
-     $            GO TO 30
-               IF( J+JB.LE.N ) THEN
-*
-*                 Compute the current block column.
-*
-                  CALL CGEMM( 'No transpose', 'Conjugate transpose',
-     $                        N-J-JB+1, JB, J-1, -CONE, A( J+JB, 1 ),
-     $                        LDA, A( J, 1 ), LDA, CONE, A( J+JB, J ),
-     $                        LDA )
-                  CALL CTRSM( 'Right', 'Lower', 'Conjugate transpose',
-     $                        'Non-unit', N-J-JB+1, JB, CONE, A( J, J ),
-     $                        LDA, A( J+JB, J ), LDA )
-               END IF
-   20       CONTINUE
-         END IF
-      END IF
-      GO TO 40
-*
-   30 CONTINUE
-      INFO = INFO + J - 1
-*
-   40 CONTINUE
-      RETURN
-*
-*     End of CPOTRF
-*
-      END
--- a/libcruft/lapack/cpotri.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-      SUBROUTINE CPOTRI( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CPOTRI computes the inverse of a complex Hermitian positive definite
-*  matrix A using the Cholesky factorization A = U**H*U or A = L*L**H
-*  computed by CPOTRF.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the triangular factor U or L from the Cholesky
-*          factorization A = U**H*U or A = L*L**H, as computed by
-*          CPOTRF.
-*          On exit, the upper or lower triangle of the (Hermitian)
-*          inverse of A, overwriting the input factor U or L.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the (i,i) element of the factor U or L is
-*                zero, and the inverse could not be computed.
-*
-*  =====================================================================
-*
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLAUUM, CTRTRI, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CPOTRI', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Invert the triangular Cholesky factor U or L.
-*
-      CALL CTRTRI( UPLO, 'Non-unit', N, A, LDA, INFO )
-      IF( INFO.GT.0 )
-     $   RETURN
-*
-*     Form inv(U)*inv(U)' or inv(L)'*inv(L).
-*
-      CALL CLAUUM( UPLO, N, A, LDA, INFO )
-*
-      RETURN
-*
-*     End of CPOTRI
-*
-      END
--- a/libcruft/lapack/cpotrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-      SUBROUTINE CPOTRS( UPLO, N, NRHS, A, LDA, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CPOTRS solves a system of linear equations A*X = B with a Hermitian
-*  positive definite matrix A using the Cholesky factorization 
-*  A = U**H*U or A = L*L**H computed by CPOTRF.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  A       (input) COMPLEX array, dimension (LDA,N)
-*          The triangular factor U or L from the Cholesky factorization
-*          A = U**H*U or A = L*L**H, as computed by CPOTRF.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input/output) COMPLEX array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CTRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CPOTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Solve A*X = B where A = U'*U.
-*
-*        Solve U'*X = B, overwriting B with X.
-*
-         CALL CTRSM( 'Left', 'Upper', 'Conjugate transpose', 'Non-unit',
-     $               N, NRHS, ONE, A, LDA, B, LDB )
-*
-*        Solve U*X = B, overwriting B with X.
-*
-         CALL CTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N,
-     $               NRHS, ONE, A, LDA, B, LDB )
-      ELSE
-*
-*        Solve A*X = B where A = L*L'.
-*
-*        Solve L*X = B, overwriting B with X.
-*
-         CALL CTRSM( 'Left', 'Lower', 'No transpose', 'Non-unit', N,
-     $               NRHS, ONE, A, LDA, B, LDB )
-*
-*        Solve L'*X = B, overwriting B with X.
-*
-         CALL CTRSM( 'Left', 'Lower', 'Conjugate transpose', 'Non-unit',
-     $               N, NRHS, ONE, A, LDA, B, LDB )
-      END IF
-*
-      RETURN
-*
-*     End of CPOTRS
-*
-      END
--- a/libcruft/lapack/cptsv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-      SUBROUTINE CPTSV( N, NRHS, D, E, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * )
-      COMPLEX            B( LDB, * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CPTSV computes the solution to a complex system of linear equations
-*  A*X = B, where A is an N-by-N Hermitian positive definite tridiagonal
-*  matrix, and X and B are N-by-NRHS matrices.
-*
-*  A is factored as A = L*D*L**H, and the factored form of A is then
-*  used to solve the system of equations.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  D       (input/output) REAL array, dimension (N)
-*          On entry, the n diagonal elements of the tridiagonal matrix
-*          A.  On exit, the n diagonal elements of the diagonal matrix
-*          D from the factorization A = L*D*L**H.
-*
-*  E       (input/output) COMPLEX array, dimension (N-1)
-*          On entry, the (n-1) subdiagonal elements of the tridiagonal
-*          matrix A.  On exit, the (n-1) subdiagonal elements of the
-*          unit bidiagonal factor L from the L*D*L**H factorization of
-*          A.  E can also be regarded as the superdiagonal of the unit
-*          bidiagonal factor U from the U**H*D*U factorization of A.
-*
-*  B       (input/output) COMPLEX array, dimension (LDB,NRHS)
-*          On entry, the N-by-NRHS right hand side matrix B.
-*          On exit, if INFO = 0, the N-by-NRHS solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the leading minor of order i is not
-*                positive definite, and the solution has not been
-*                computed.  The factorization has not been completed
-*                unless i = N.
-*
-*  =====================================================================
-*
-*     .. External Subroutines ..
-      EXTERNAL           CPTTRF, CPTTRS, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CPTSV ', -INFO )
-         RETURN
-      END IF
-*
-*     Compute the L*D*L' (or U'*D*U) factorization of A.
-*
-      CALL CPTTRF( N, D, E, INFO )
-      IF( INFO.EQ.0 ) THEN
-*
-*        Solve the system A*X = B, overwriting B with X.
-*
-         CALL CPTTRS( 'Lower', N, NRHS, D, E, B, LDB, INFO )
-      END IF
-      RETURN
-*
-*     End of CPTSV
-*
-      END
--- a/libcruft/lapack/cpttrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,168 +0,0 @@
-      SUBROUTINE CPTTRF( N, D, E, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, N
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * )
-      COMPLEX            E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CPTTRF computes the L*D*L' factorization of a complex Hermitian
-*  positive definite tridiagonal matrix A.  The factorization may also
-*  be regarded as having the form A = U'*D*U.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  D       (input/output) REAL array, dimension (N)
-*          On entry, the n diagonal elements of the tridiagonal matrix
-*          A.  On exit, the n diagonal elements of the diagonal matrix
-*          D from the L*D*L' factorization of A.
-*
-*  E       (input/output) COMPLEX array, dimension (N-1)
-*          On entry, the (n-1) subdiagonal elements of the tridiagonal
-*          matrix A.  On exit, the (n-1) subdiagonal elements of the
-*          unit bidiagonal factor L from the L*D*L' factorization of A.
-*          E can also be regarded as the superdiagonal of the unit
-*          bidiagonal factor U from the U'*D*U factorization of A.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*          > 0: if INFO = k, the leading minor of order k is not
-*               positive definite; if k < N, the factorization could not
-*               be completed, while if k = N, the factorization was
-*               completed, but D(N) <= 0.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I4
-      REAL               EII, EIR, F, G
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          AIMAG, CMPLX, MOD, REAL
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-         CALL XERBLA( 'CPTTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Compute the L*D*L' (or U'*D*U) factorization of A.
-*
-      I4 = MOD( N-1, 4 )
-      DO 10 I = 1, I4
-         IF( D( I ).LE.ZERO ) THEN
-            INFO = I
-            GO TO 20
-         END IF
-         EIR = REAL( E( I ) )
-         EII = AIMAG( E( I ) )
-         F = EIR / D( I )
-         G = EII / D( I )
-         E( I ) = CMPLX( F, G )
-         D( I+1 ) = D( I+1 ) - F*EIR - G*EII
-   10 CONTINUE
-*
-      DO 110 I = I4+1, N - 4, 4
-*
-*        Drop out of the loop if d(i) <= 0: the matrix is not positive
-*        definite.
-*
-         IF( D( I ).LE.ZERO ) THEN
-            INFO = I
-            GO TO 20
-         END IF
-*
-*        Solve for e(i) and d(i+1).
-*
-         EIR = REAL( E( I ) )
-         EII = AIMAG( E( I ) )
-         F = EIR / D( I )
-         G = EII / D( I )
-         E( I ) = CMPLX( F, G )
-         D( I+1 ) = D( I+1 ) - F*EIR - G*EII
-*
-         IF( D( I+1 ).LE.ZERO ) THEN
-            INFO = I+1
-            GO TO 20
-         END IF
-*
-*        Solve for e(i+1) and d(i+2).
-*
-         EIR = REAL( E( I+1 ) )
-         EII = AIMAG( E( I+1 ) )
-         F = EIR / D( I+1 )
-         G = EII / D( I+1 )
-         E( I+1 ) = CMPLX( F, G )
-         D( I+2 ) = D( I+2 ) - F*EIR - G*EII
-*
-         IF( D( I+2 ).LE.ZERO ) THEN
-            INFO = I+2
-            GO TO 20
-         END IF
-*
-*        Solve for e(i+2) and d(i+3).
-*
-         EIR = REAL( E( I+2 ) )
-         EII = AIMAG( E( I+2 ) )
-         F = EIR / D( I+2 )
-         G = EII / D( I+2 )
-         E( I+2 ) = CMPLX( F, G )
-         D( I+3 ) = D( I+3 ) - F*EIR - G*EII
-*
-         IF( D( I+3 ).LE.ZERO ) THEN
-            INFO = I+3
-            GO TO 20
-         END IF
-*
-*        Solve for e(i+3) and d(i+4).
-*
-         EIR = REAL( E( I+3 ) )
-         EII = AIMAG( E( I+3 ) )
-         F = EIR / D( I+3 )
-         G = EII / D( I+3 )
-         E( I+3 ) = CMPLX( F, G )
-         D( I+4 ) = D( I+4 ) - F*EIR - G*EII
-  110 CONTINUE
-*
-*     Check d(n) for positive definiteness.
-*
-      IF( D( N ).LE.ZERO )
-     $   INFO = N
-*
-   20 CONTINUE
-      RETURN
-*
-*     End of CPTTRF
-*
-      END
--- a/libcruft/lapack/cpttrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,135 +0,0 @@
-      SUBROUTINE CPTTRS( UPLO, N, NRHS, D, E, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * )
-      COMPLEX            B( LDB, * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CPTTRS solves a tridiagonal system of the form
-*     A * X = B
-*  using the factorization A = U'*D*U or A = L*D*L' computed by CPTTRF.
-*  D is a diagonal matrix specified in the vector D, U (or L) is a unit
-*  bidiagonal matrix whose superdiagonal (subdiagonal) is specified in
-*  the vector E, and X and B are N by NRHS matrices.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies the form of the factorization and whether the
-*          vector E is the superdiagonal of the upper bidiagonal factor
-*          U or the subdiagonal of the lower bidiagonal factor L.
-*          = 'U':  A = U'*D*U, E is the superdiagonal of U
-*          = 'L':  A = L*D*L', E is the subdiagonal of L
-*
-*  N       (input) INTEGER
-*          The order of the tridiagonal matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  D       (input) REAL array, dimension (N)
-*          The n diagonal elements of the diagonal matrix D from the
-*          factorization A = U'*D*U or A = L*D*L'.
-*
-*  E       (input) COMPLEX array, dimension (N-1)
-*          If UPLO = 'U', the (n-1) superdiagonal elements of the unit
-*          bidiagonal factor U from the factorization A = U'*D*U.
-*          If UPLO = 'L', the (n-1) subdiagonal elements of the unit
-*          bidiagonal factor L from the factorization A = L*D*L'.
-*
-*  B       (input/output) REAL array, dimension (LDB,NRHS)
-*          On entry, the right hand side vectors B for the system of
-*          linear equations.
-*          On exit, the solution vectors, X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            IUPLO, J, JB, NB
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CPTTS2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments.
-*
-      INFO = 0
-      UPPER = ( UPLO.EQ.'U' .OR. UPLO.EQ.'u' )
-      IF( .NOT.UPPER .AND. .NOT.( UPLO.EQ.'L' .OR. UPLO.EQ.'l' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CPTTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-*     Determine the number of right-hand sides to solve at a time.
-*
-      IF( NRHS.EQ.1 ) THEN
-         NB = 1
-      ELSE
-         NB = MAX( 1, ILAENV( 1, 'CPTTRS', UPLO, N, NRHS, -1, -1 ) )
-      END IF
-*
-*     Decode UPLO
-*
-      IF( UPPER ) THEN
-         IUPLO = 1
-      ELSE
-         IUPLO = 0
-      END IF
-*
-      IF( NB.GE.NRHS ) THEN
-         CALL CPTTS2( IUPLO, N, NRHS, D, E, B, LDB )
-      ELSE
-         DO 10 J = 1, NRHS, NB
-            JB = MIN( NRHS-J+1, NB )
-            CALL CPTTS2( IUPLO, N, JB, D, E, B( 1, J ), LDB )
-   10    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of CPTTRS
-*
-      END
--- a/libcruft/lapack/cptts2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,176 +0,0 @@
-      SUBROUTINE CPTTS2( IUPLO, N, NRHS, D, E, B, LDB )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IUPLO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * )
-      COMPLEX            B( LDB, * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CPTTS2 solves a tridiagonal system of the form
-*     A * X = B
-*  using the factorization A = U'*D*U or A = L*D*L' computed by CPTTRF.
-*  D is a diagonal matrix specified in the vector D, U (or L) is a unit
-*  bidiagonal matrix whose superdiagonal (subdiagonal) is specified in
-*  the vector E, and X and B are N by NRHS matrices.
-*
-*  Arguments
-*  =========
-*
-*  IUPLO   (input) INTEGER
-*          Specifies the form of the factorization and whether the
-*          vector E is the superdiagonal of the upper bidiagonal factor
-*          U or the subdiagonal of the lower bidiagonal factor L.
-*          = 1:  A = U'*D*U, E is the superdiagonal of U
-*          = 0:  A = L*D*L', E is the subdiagonal of L
-*
-*  N       (input) INTEGER
-*          The order of the tridiagonal matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  D       (input) REAL array, dimension (N)
-*          The n diagonal elements of the diagonal matrix D from the
-*          factorization A = U'*D*U or A = L*D*L'.
-*
-*  E       (input) COMPLEX array, dimension (N-1)
-*          If IUPLO = 1, the (n-1) superdiagonal elements of the unit
-*          bidiagonal factor U from the factorization A = U'*D*U.
-*          If IUPLO = 0, the (n-1) subdiagonal elements of the unit
-*          bidiagonal factor L from the factorization A = L*D*L'.
-*
-*  B       (input/output) REAL array, dimension (LDB,NRHS)
-*          On entry, the right hand side vectors B for the system of
-*          linear equations.
-*          On exit, the solution vectors, X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, J
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CSSCAL
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CONJG
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 ) THEN
-         IF( N.EQ.1 )
-     $      CALL CSSCAL( NRHS, 1. / D( 1 ), B, LDB )
-         RETURN
-      END IF
-*
-      IF( IUPLO.EQ.1 ) THEN
-*
-*        Solve A * X = B using the factorization A = U'*D*U,
-*        overwriting each right hand side vector with its solution.
-*
-         IF( NRHS.LE.2 ) THEN
-            J = 1
-    5       CONTINUE
-*
-*           Solve U' * x = b.
-*
-            DO 10 I = 2, N
-               B( I, J ) = B( I, J ) - B( I-1, J )*CONJG( E( I-1 ) )
-   10       CONTINUE
-*
-*           Solve D * U * x = b.
-*
-            DO 20 I = 1, N
-               B( I, J ) = B( I, J ) / D( I )
-   20       CONTINUE
-            DO 30 I = N - 1, 1, -1
-               B( I, J ) = B( I, J ) - B( I+1, J )*E( I )
-   30       CONTINUE
-            IF( J.LT.NRHS ) THEN
-               J = J + 1
-               GO TO 5
-            END IF
-         ELSE
-            DO 60 J = 1, NRHS
-*
-*              Solve U' * x = b.
-*
-               DO 40 I = 2, N
-                  B( I, J ) = B( I, J ) - B( I-1, J )*CONJG( E( I-1 ) )
-   40          CONTINUE
-*
-*              Solve D * U * x = b.
-*
-               B( N, J ) = B( N, J ) / D( N )
-               DO 50 I = N - 1, 1, -1
-                  B( I, J ) = B( I, J ) / D( I ) - B( I+1, J )*E( I )
-   50          CONTINUE
-   60       CONTINUE
-         END IF
-      ELSE
-*
-*        Solve A * X = B using the factorization A = L*D*L',
-*        overwriting each right hand side vector with its solution.
-*
-         IF( NRHS.LE.2 ) THEN
-            J = 1
-   65       CONTINUE
-*
-*           Solve L * x = b.
-*
-            DO 70 I = 2, N
-               B( I, J ) = B( I, J ) - B( I-1, J )*E( I-1 )
-   70       CONTINUE
-*
-*           Solve D * L' * x = b.
-*
-            DO 80 I = 1, N
-               B( I, J ) = B( I, J ) / D( I )
-   80       CONTINUE
-            DO 90 I = N - 1, 1, -1
-               B( I, J ) = B( I, J ) - B( I+1, J )*CONJG( E( I ) )
-   90       CONTINUE
-            IF( J.LT.NRHS ) THEN
-               J = J + 1
-               GO TO 65
-            END IF
-         ELSE
-            DO 120 J = 1, NRHS
-*
-*              Solve L * x = b.
-*
-               DO 100 I = 2, N
-                  B( I, J ) = B( I, J ) - B( I-1, J )*E( I-1 )
-  100          CONTINUE
-*
-*              Solve D * L' * x = b.
-*
-               B( N, J ) = B( N, J ) / D( N )
-               DO 110 I = N - 1, 1, -1
-                  B( I, J ) = B( I, J ) / D( I ) -
-     $                        B( I+1, J )*CONJG( E( I ) )
-  110          CONTINUE
-  120       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of CPTTS2
-*
-      END
--- a/libcruft/lapack/crot.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-      SUBROUTINE CROT( N, CX, INCX, CY, INCY, C, S )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, INCY, N
-      REAL               C
-      COMPLEX            S
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            CX( * ), CY( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CROT   applies a plane rotation, where the cos (C) is real and the
-*  sin (S) is complex, and the vectors CX and CY are complex.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of elements in the vectors CX and CY.
-*
-*  CX      (input/output) COMPLEX array, dimension (N)
-*          On input, the vector X.
-*          On output, CX is overwritten with C*X + S*Y.
-*
-*  INCX    (input) INTEGER
-*          The increment between successive values of CY.  INCX <> 0.
-*
-*  CY      (input/output) COMPLEX array, dimension (N)
-*          On input, the vector Y.
-*          On output, CY is overwritten with -CONJG(S)*X + C*Y.
-*
-*  INCY    (input) INTEGER
-*          The increment between successive values of CY.  INCX <> 0.
-*
-*  C       (input) REAL
-*  S       (input) COMPLEX
-*          C and S define a rotation
-*             [  C          S  ]
-*             [ -conjg(S)   C  ]
-*          where C*C + S*CONJG(S) = 1.0.
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, IX, IY
-      COMPLEX            STEMP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CONJG
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.LE.0 )
-     $   RETURN
-      IF( INCX.EQ.1 .AND. INCY.EQ.1 )
-     $   GO TO 20
-*
-*     Code for unequal increments or equal increments not equal to 1
-*
-      IX = 1
-      IY = 1
-      IF( INCX.LT.0 )
-     $   IX = ( -N+1 )*INCX + 1
-      IF( INCY.LT.0 )
-     $   IY = ( -N+1 )*INCY + 1
-      DO 10 I = 1, N
-         STEMP = C*CX( IX ) + S*CY( IY )
-         CY( IY ) = C*CY( IY ) - CONJG( S )*CX( IX )
-         CX( IX ) = STEMP
-         IX = IX + INCX
-         IY = IY + INCY
-   10 CONTINUE
-      RETURN
-*
-*     Code for both increments equal to 1
-*
-   20 CONTINUE
-      DO 30 I = 1, N
-         STEMP = C*CX( I ) + S*CY( I )
-         CY( I ) = C*CY( I ) - CONJG( S )*CX( I )
-         CX( I ) = STEMP
-   30 CONTINUE
-      RETURN
-      END
--- a/libcruft/lapack/csrscl.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-      SUBROUTINE CSRSCL( N, SA, SX, INCX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-      REAL               SA
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            SX( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CSRSCL multiplies an n-element complex vector x by the real scalar
-*  1/a.  This is done without overflow or underflow as long as
-*  the final result x/a does not overflow or underflow.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of components of the vector x.
-*
-*  SA      (input) REAL
-*          The scalar a which is used to divide each component of x.
-*          SA must be >= 0, or the subroutine will divide by zero.
-*
-*  SX      (input/output) COMPLEX array, dimension
-*                         (1+(N-1)*abs(INCX))
-*          The n-element vector x.
-*
-*  INCX    (input) INTEGER
-*          The increment between successive values of the vector SX.
-*          > 0:  SX(1) = X(1) and SX(1+(i-1)*INCX) = x(i),     1< i<= n
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            DONE
-      REAL               BIGNUM, CDEN, CDEN1, CNUM, CNUM1, MUL, SMLNUM
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      EXTERNAL           SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CSSCAL, SLABAD
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-*     Get machine parameters
-*
-      SMLNUM = SLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-*
-*     Initialize the denominator to SA and the numerator to 1.
-*
-      CDEN = SA
-      CNUM = ONE
-*
-   10 CONTINUE
-      CDEN1 = CDEN*SMLNUM
-      CNUM1 = CNUM / BIGNUM
-      IF( ABS( CDEN1 ).GT.ABS( CNUM ) .AND. CNUM.NE.ZERO ) THEN
-*
-*        Pre-multiply X by SMLNUM if CDEN is large compared to CNUM.
-*
-         MUL = SMLNUM
-         DONE = .FALSE.
-         CDEN = CDEN1
-      ELSE IF( ABS( CNUM1 ).GT.ABS( CDEN ) ) THEN
-*
-*        Pre-multiply X by BIGNUM if CDEN is small compared to CNUM.
-*
-         MUL = BIGNUM
-         DONE = .FALSE.
-         CNUM = CNUM1
-      ELSE
-*
-*        Multiply X by CNUM / CDEN and return.
-*
-         MUL = CNUM / CDEN
-         DONE = .TRUE.
-      END IF
-*
-*     Scale the vector X by MUL
-*
-      CALL CSSCAL( N, MUL, SX, INCX )
-*
-      IF( .NOT.DONE )
-     $   GO TO 10
-*
-      RETURN
-*
-*     End of CSRSCL
-*
-      END
--- a/libcruft/lapack/csteqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,503 +0,0 @@
-      SUBROUTINE CSTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPZ
-      INTEGER            INFO, LDZ, N
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * ), E( * ), WORK( * )
-      COMPLEX            Z( LDZ, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CSTEQR computes all eigenvalues and, optionally, eigenvectors of a
-*  symmetric tridiagonal matrix using the implicit QL or QR method.
-*  The eigenvectors of a full or band complex Hermitian matrix can also
-*  be found if CHETRD or CHPTRD or CHBTRD has been used to reduce this
-*  matrix to tridiagonal form.
-*
-*  Arguments
-*  =========
-*
-*  COMPZ   (input) CHARACTER*1
-*          = 'N':  Compute eigenvalues only.
-*          = 'V':  Compute eigenvalues and eigenvectors of the original
-*                  Hermitian matrix.  On entry, Z must contain the
-*                  unitary matrix used to reduce the original matrix
-*                  to tridiagonal form.
-*          = 'I':  Compute eigenvalues and eigenvectors of the
-*                  tridiagonal matrix.  Z is initialized to the identity
-*                  matrix.
-*
-*  N       (input) INTEGER
-*          The order of the matrix.  N >= 0.
-*
-*  D       (input/output) REAL array, dimension (N)
-*          On entry, the diagonal elements of the tridiagonal matrix.
-*          On exit, if INFO = 0, the eigenvalues in ascending order.
-*
-*  E       (input/output) REAL array, dimension (N-1)
-*          On entry, the (n-1) subdiagonal elements of the tridiagonal
-*          matrix.
-*          On exit, E has been destroyed.
-*
-*  Z       (input/output) COMPLEX array, dimension (LDZ, N)
-*          On entry, if  COMPZ = 'V', then Z contains the unitary
-*          matrix used in the reduction to tridiagonal form.
-*          On exit, if INFO = 0, then if COMPZ = 'V', Z contains the
-*          orthonormal eigenvectors of the original Hermitian matrix,
-*          and if COMPZ = 'I', Z contains the orthonormal eigenvectors
-*          of the symmetric tridiagonal matrix.
-*          If COMPZ = 'N', then Z is not referenced.
-*
-*  LDZ     (input) INTEGER
-*          The leading dimension of the array Z.  LDZ >= 1, and if
-*          eigenvectors are desired, then  LDZ >= max(1,N).
-*
-*  WORK    (workspace) REAL array, dimension (max(1,2*N-2))
-*          If COMPZ = 'N', then WORK is not referenced.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  the algorithm has failed to find all the eigenvalues in
-*                a total of 30*N iterations; if INFO = i, then i
-*                elements of E have not converged to zero; on exit, D
-*                and E contain the elements of a symmetric tridiagonal
-*                matrix which is unitarily similar to the original
-*                matrix.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE, TWO, THREE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0,
-     $                   THREE = 3.0E0 )
-      COMPLEX            CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0E0, 0.0E0 ),
-     $                   CONE = ( 1.0E0, 0.0E0 ) )
-      INTEGER            MAXIT
-      PARAMETER          ( MAXIT = 30 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ICOMPZ, II, ISCALE, J, JTOT, K, L, L1, LEND,
-     $                   LENDM1, LENDP1, LENDSV, LM1, LSV, M, MM, MM1,
-     $                   NM1, NMAXIT
-      REAL               ANORM, B, C, EPS, EPS2, F, G, P, R, RT1, RT2,
-     $                   S, SAFMAX, SAFMIN, SSFMAX, SSFMIN, TST
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               SLAMCH, SLANST, SLAPY2
-      EXTERNAL           LSAME, SLAMCH, SLANST, SLAPY2
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLASET, CLASR, CSWAP, SLAE2, SLAEV2, SLARTG,
-     $                   SLASCL, SLASRT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( LSAME( COMPZ, 'N' ) ) THEN
-         ICOMPZ = 0
-      ELSE IF( LSAME( COMPZ, 'V' ) ) THEN
-         ICOMPZ = 1
-      ELSE IF( LSAME( COMPZ, 'I' ) ) THEN
-         ICOMPZ = 2
-      ELSE
-         ICOMPZ = -1
-      END IF
-      IF( ICOMPZ.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( ( LDZ.LT.1 ) .OR. ( ICOMPZ.GT.0 .AND. LDZ.LT.MAX( 1,
-     $         N ) ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CSTEQR', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( N.EQ.1 ) THEN
-         IF( ICOMPZ.EQ.2 )
-     $      Z( 1, 1 ) = CONE
-         RETURN
-      END IF
-*
-*     Determine the unit roundoff and over/underflow thresholds.
-*
-      EPS = SLAMCH( 'E' )
-      EPS2 = EPS**2
-      SAFMIN = SLAMCH( 'S' )
-      SAFMAX = ONE / SAFMIN
-      SSFMAX = SQRT( SAFMAX ) / THREE
-      SSFMIN = SQRT( SAFMIN ) / EPS2
-*
-*     Compute the eigenvalues and eigenvectors of the tridiagonal
-*     matrix.
-*
-      IF( ICOMPZ.EQ.2 )
-     $   CALL CLASET( 'Full', N, N, CZERO, CONE, Z, LDZ )
-*
-      NMAXIT = N*MAXIT
-      JTOT = 0
-*
-*     Determine where the matrix splits and choose QL or QR iteration
-*     for each block, according to whether top or bottom diagonal
-*     element is smaller.
-*
-      L1 = 1
-      NM1 = N - 1
-*
-   10 CONTINUE
-      IF( L1.GT.N )
-     $   GO TO 160
-      IF( L1.GT.1 )
-     $   E( L1-1 ) = ZERO
-      IF( L1.LE.NM1 ) THEN
-         DO 20 M = L1, NM1
-            TST = ABS( E( M ) )
-            IF( TST.EQ.ZERO )
-     $         GO TO 30
-            IF( TST.LE.( SQRT( ABS( D( M ) ) )*SQRT( ABS( D( M+
-     $          1 ) ) ) )*EPS ) THEN
-               E( M ) = ZERO
-               GO TO 30
-            END IF
-   20    CONTINUE
-      END IF
-      M = N
-*
-   30 CONTINUE
-      L = L1
-      LSV = L
-      LEND = M
-      LENDSV = LEND
-      L1 = M + 1
-      IF( LEND.EQ.L )
-     $   GO TO 10
-*
-*     Scale submatrix in rows and columns L to LEND
-*
-      ANORM = SLANST( 'I', LEND-L+1, D( L ), E( L ) )
-      ISCALE = 0
-      IF( ANORM.EQ.ZERO )
-     $   GO TO 10
-      IF( ANORM.GT.SSFMAX ) THEN
-         ISCALE = 1
-         CALL SLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L+1, 1, D( L ), N,
-     $                INFO )
-         CALL SLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L, 1, E( L ), N,
-     $                INFO )
-      ELSE IF( ANORM.LT.SSFMIN ) THEN
-         ISCALE = 2
-         CALL SLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L+1, 1, D( L ), N,
-     $                INFO )
-         CALL SLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L, 1, E( L ), N,
-     $                INFO )
-      END IF
-*
-*     Choose between QL and QR iteration
-*
-      IF( ABS( D( LEND ) ).LT.ABS( D( L ) ) ) THEN
-         LEND = LSV
-         L = LENDSV
-      END IF
-*
-      IF( LEND.GT.L ) THEN
-*
-*        QL Iteration
-*
-*        Look for small subdiagonal element.
-*
-   40    CONTINUE
-         IF( L.NE.LEND ) THEN
-            LENDM1 = LEND - 1
-            DO 50 M = L, LENDM1
-               TST = ABS( E( M ) )**2
-               IF( TST.LE.( EPS2*ABS( D( M ) ) )*ABS( D( M+1 ) )+
-     $             SAFMIN )GO TO 60
-   50       CONTINUE
-         END IF
-*
-         M = LEND
-*
-   60    CONTINUE
-         IF( M.LT.LEND )
-     $      E( M ) = ZERO
-         P = D( L )
-         IF( M.EQ.L )
-     $      GO TO 80
-*
-*        If remaining matrix is 2-by-2, use SLAE2 or SLAEV2
-*        to compute its eigensystem.
-*
-         IF( M.EQ.L+1 ) THEN
-            IF( ICOMPZ.GT.0 ) THEN
-               CALL SLAEV2( D( L ), E( L ), D( L+1 ), RT1, RT2, C, S )
-               WORK( L ) = C
-               WORK( N-1+L ) = S
-               CALL CLASR( 'R', 'V', 'B', N, 2, WORK( L ),
-     $                     WORK( N-1+L ), Z( 1, L ), LDZ )
-            ELSE
-               CALL SLAE2( D( L ), E( L ), D( L+1 ), RT1, RT2 )
-            END IF
-            D( L ) = RT1
-            D( L+1 ) = RT2
-            E( L ) = ZERO
-            L = L + 2
-            IF( L.LE.LEND )
-     $         GO TO 40
-            GO TO 140
-         END IF
-*
-         IF( JTOT.EQ.NMAXIT )
-     $      GO TO 140
-         JTOT = JTOT + 1
-*
-*        Form shift.
-*
-         G = ( D( L+1 )-P ) / ( TWO*E( L ) )
-         R = SLAPY2( G, ONE )
-         G = D( M ) - P + ( E( L ) / ( G+SIGN( R, G ) ) )
-*
-         S = ONE
-         C = ONE
-         P = ZERO
-*
-*        Inner loop
-*
-         MM1 = M - 1
-         DO 70 I = MM1, L, -1
-            F = S*E( I )
-            B = C*E( I )
-            CALL SLARTG( G, F, C, S, R )
-            IF( I.NE.M-1 )
-     $         E( I+1 ) = R
-            G = D( I+1 ) - P
-            R = ( D( I )-G )*S + TWO*C*B
-            P = S*R
-            D( I+1 ) = G + P
-            G = C*R - B
-*
-*           If eigenvectors are desired, then save rotations.
-*
-            IF( ICOMPZ.GT.0 ) THEN
-               WORK( I ) = C
-               WORK( N-1+I ) = -S
-            END IF
-*
-   70    CONTINUE
-*
-*        If eigenvectors are desired, then apply saved rotations.
-*
-         IF( ICOMPZ.GT.0 ) THEN
-            MM = M - L + 1
-            CALL CLASR( 'R', 'V', 'B', N, MM, WORK( L ), WORK( N-1+L ),
-     $                  Z( 1, L ), LDZ )
-         END IF
-*
-         D( L ) = D( L ) - P
-         E( L ) = G
-         GO TO 40
-*
-*        Eigenvalue found.
-*
-   80    CONTINUE
-         D( L ) = P
-*
-         L = L + 1
-         IF( L.LE.LEND )
-     $      GO TO 40
-         GO TO 140
-*
-      ELSE
-*
-*        QR Iteration
-*
-*        Look for small superdiagonal element.
-*
-   90    CONTINUE
-         IF( L.NE.LEND ) THEN
-            LENDP1 = LEND + 1
-            DO 100 M = L, LENDP1, -1
-               TST = ABS( E( M-1 ) )**2
-               IF( TST.LE.( EPS2*ABS( D( M ) ) )*ABS( D( M-1 ) )+
-     $             SAFMIN )GO TO 110
-  100       CONTINUE
-         END IF
-*
-         M = LEND
-*
-  110    CONTINUE
-         IF( M.GT.LEND )
-     $      E( M-1 ) = ZERO
-         P = D( L )
-         IF( M.EQ.L )
-     $      GO TO 130
-*
-*        If remaining matrix is 2-by-2, use SLAE2 or SLAEV2
-*        to compute its eigensystem.
-*
-         IF( M.EQ.L-1 ) THEN
-            IF( ICOMPZ.GT.0 ) THEN
-               CALL SLAEV2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2, C, S )
-               WORK( M ) = C
-               WORK( N-1+M ) = S
-               CALL CLASR( 'R', 'V', 'F', N, 2, WORK( M ),
-     $                     WORK( N-1+M ), Z( 1, L-1 ), LDZ )
-            ELSE
-               CALL SLAE2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2 )
-            END IF
-            D( L-1 ) = RT1
-            D( L ) = RT2
-            E( L-1 ) = ZERO
-            L = L - 2
-            IF( L.GE.LEND )
-     $         GO TO 90
-            GO TO 140
-         END IF
-*
-         IF( JTOT.EQ.NMAXIT )
-     $      GO TO 140
-         JTOT = JTOT + 1
-*
-*        Form shift.
-*
-         G = ( D( L-1 )-P ) / ( TWO*E( L-1 ) )
-         R = SLAPY2( G, ONE )
-         G = D( M ) - P + ( E( L-1 ) / ( G+SIGN( R, G ) ) )
-*
-         S = ONE
-         C = ONE
-         P = ZERO
-*
-*        Inner loop
-*
-         LM1 = L - 1
-         DO 120 I = M, LM1
-            F = S*E( I )
-            B = C*E( I )
-            CALL SLARTG( G, F, C, S, R )
-            IF( I.NE.M )
-     $         E( I-1 ) = R
-            G = D( I ) - P
-            R = ( D( I+1 )-G )*S + TWO*C*B
-            P = S*R
-            D( I ) = G + P
-            G = C*R - B
-*
-*           If eigenvectors are desired, then save rotations.
-*
-            IF( ICOMPZ.GT.0 ) THEN
-               WORK( I ) = C
-               WORK( N-1+I ) = S
-            END IF
-*
-  120    CONTINUE
-*
-*        If eigenvectors are desired, then apply saved rotations.
-*
-         IF( ICOMPZ.GT.0 ) THEN
-            MM = L - M + 1
-            CALL CLASR( 'R', 'V', 'F', N, MM, WORK( M ), WORK( N-1+M ),
-     $                  Z( 1, M ), LDZ )
-         END IF
-*
-         D( L ) = D( L ) - P
-         E( LM1 ) = G
-         GO TO 90
-*
-*        Eigenvalue found.
-*
-  130    CONTINUE
-         D( L ) = P
-*
-         L = L - 1
-         IF( L.GE.LEND )
-     $      GO TO 90
-         GO TO 140
-*
-      END IF
-*
-*     Undo scaling if necessary
-*
-  140 CONTINUE
-      IF( ISCALE.EQ.1 ) THEN
-         CALL SLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV+1, 1,
-     $                D( LSV ), N, INFO )
-         CALL SLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV, 1, E( LSV ),
-     $                N, INFO )
-      ELSE IF( ISCALE.EQ.2 ) THEN
-         CALL SLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV+1, 1,
-     $                D( LSV ), N, INFO )
-         CALL SLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV, 1, E( LSV ),
-     $                N, INFO )
-      END IF
-*
-*     Check for no convergence to an eigenvalue after a total
-*     of N*MAXIT iterations.
-*
-      IF( JTOT.EQ.NMAXIT ) THEN
-         DO 150 I = 1, N - 1
-            IF( E( I ).NE.ZERO )
-     $         INFO = INFO + 1
-  150    CONTINUE
-         RETURN
-      END IF
-      GO TO 10
-*
-*     Order eigenvalues and eigenvectors.
-*
-  160 CONTINUE
-      IF( ICOMPZ.EQ.0 ) THEN
-*
-*        Use Quick Sort
-*
-         CALL SLASRT( 'I', N, D, INFO )
-*
-      ELSE
-*
-*        Use Selection Sort to minimize swaps of eigenvectors
-*
-         DO 180 II = 2, N
-            I = II - 1
-            K = I
-            P = D( I )
-            DO 170 J = II, N
-               IF( D( J ).LT.P ) THEN
-                  K = J
-                  P = D( J )
-               END IF
-  170       CONTINUE
-            IF( K.NE.I ) THEN
-               D( K ) = D( I )
-               D( I ) = P
-               CALL CSWAP( N, Z( 1, I ), 1, Z( 1, K ), 1 )
-            END IF
-  180    CONTINUE
-      END IF
-      RETURN
-*
-*     End of CSTEQR
-*
-      END
--- a/libcruft/lapack/ctgevc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,633 +0,0 @@
-      SUBROUTINE CTGEVC( SIDE, HOWMNY, SELECT, N, S, LDS, P, LDP, VL,
-     $                   LDVL, VR, LDVR, MM, M, WORK, RWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          HOWMNY, SIDE
-      INTEGER            INFO, LDP, LDS, LDVL, LDVR, M, MM, N
-*     ..
-*     .. Array Arguments ..
-      LOGICAL            SELECT( * )
-      REAL               RWORK( * )
-      COMPLEX            P( LDP, * ), S( LDS, * ), VL( LDVL, * ),
-     $                   VR( LDVR, * ), WORK( * )
-*     ..
-*
-*
-*  Purpose
-*  =======
-*
-*  CTGEVC computes some or all of the right and/or left eigenvectors of
-*  a pair of complex matrices (S,P), where S and P are upper triangular.
-*  Matrix pairs of this type are produced by the generalized Schur
-*  factorization of a complex matrix pair (A,B):
-*  
-*     A = Q*S*Z**H,  B = Q*P*Z**H
-*  
-*  as computed by CGGHRD + CHGEQZ.
-*  
-*  The right eigenvector x and the left eigenvector y of (S,P)
-*  corresponding to an eigenvalue w are defined by:
-*  
-*     S*x = w*P*x,  (y**H)*S = w*(y**H)*P,
-*  
-*  where y**H denotes the conjugate tranpose of y.
-*  The eigenvalues are not input to this routine, but are computed
-*  directly from the diagonal elements of S and P.
-*  
-*  This routine returns the matrices X and/or Y of right and left
-*  eigenvectors of (S,P), or the products Z*X and/or Q*Y,
-*  where Z and Q are input matrices.
-*  If Q and Z are the unitary factors from the generalized Schur
-*  factorization of a matrix pair (A,B), then Z*X and Q*Y
-*  are the matrices of right and left eigenvectors of (A,B).
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'R': compute right eigenvectors only;
-*          = 'L': compute left eigenvectors only;
-*          = 'B': compute both right and left eigenvectors.
-*
-*  HOWMNY  (input) CHARACTER*1
-*          = 'A': compute all right and/or left eigenvectors;
-*          = 'B': compute all right and/or left eigenvectors,
-*                 backtransformed by the matrices in VR and/or VL;
-*          = 'S': compute selected right and/or left eigenvectors,
-*                 specified by the logical array SELECT.
-*
-*  SELECT  (input) LOGICAL array, dimension (N)
-*          If HOWMNY='S', SELECT specifies the eigenvectors to be
-*          computed.  The eigenvector corresponding to the j-th
-*          eigenvalue is computed if SELECT(j) = .TRUE..
-*          Not referenced if HOWMNY = 'A' or 'B'.
-*
-*  N       (input) INTEGER
-*          The order of the matrices S and P.  N >= 0.
-*
-*  S       (input) COMPLEX array, dimension (LDS,N)
-*          The upper triangular matrix S from a generalized Schur
-*          factorization, as computed by CHGEQZ.
-*
-*  LDS     (input) INTEGER
-*          The leading dimension of array S.  LDS >= max(1,N).
-*
-*  P       (input) COMPLEX array, dimension (LDP,N)
-*          The upper triangular matrix P from a generalized Schur
-*          factorization, as computed by CHGEQZ.  P must have real
-*          diagonal elements.
-*
-*  LDP     (input) INTEGER
-*          The leading dimension of array P.  LDP >= max(1,N).
-*
-*  VL      (input/output) COMPLEX array, dimension (LDVL,MM)
-*          On entry, if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must
-*          contain an N-by-N matrix Q (usually the unitary matrix Q
-*          of left Schur vectors returned by CHGEQZ).
-*          On exit, if SIDE = 'L' or 'B', VL contains:
-*          if HOWMNY = 'A', the matrix Y of left eigenvectors of (S,P);
-*          if HOWMNY = 'B', the matrix Q*Y;
-*          if HOWMNY = 'S', the left eigenvectors of (S,P) specified by
-*                      SELECT, stored consecutively in the columns of
-*                      VL, in the same order as their eigenvalues.
-*          Not referenced if SIDE = 'R'.
-*
-*  LDVL    (input) INTEGER
-*          The leading dimension of array VL.  LDVL >= 1, and if
-*          SIDE = 'L' or 'l' or 'B' or 'b', LDVL >= N.
-*
-*  VR      (input/output) COMPLEX array, dimension (LDVR,MM)
-*          On entry, if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must
-*          contain an N-by-N matrix Q (usually the unitary matrix Z
-*          of right Schur vectors returned by CHGEQZ).
-*          On exit, if SIDE = 'R' or 'B', VR contains:
-*          if HOWMNY = 'A', the matrix X of right eigenvectors of (S,P);
-*          if HOWMNY = 'B', the matrix Z*X;
-*          if HOWMNY = 'S', the right eigenvectors of (S,P) specified by
-*                      SELECT, stored consecutively in the columns of
-*                      VR, in the same order as their eigenvalues.
-*          Not referenced if SIDE = 'L'.
-*
-*  LDVR    (input) INTEGER
-*          The leading dimension of the array VR.  LDVR >= 1, and if
-*          SIDE = 'R' or 'B', LDVR >= N.
-*
-*  MM      (input) INTEGER
-*          The number of columns in the arrays VL and/or VR. MM >= M.
-*
-*  M       (output) INTEGER
-*          The number of columns in the arrays VL and/or VR actually
-*          used to store the eigenvectors.  If HOWMNY = 'A' or 'B', M
-*          is set to N.  Each selected eigenvector occupies one column.
-*
-*  WORK    (workspace) COMPLEX array, dimension (2*N)
-*
-*  RWORK   (workspace) REAL array, dimension (2*N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-      COMPLEX            CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0E+0, 0.0E+0 ),
-     $                   CONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            COMPL, COMPR, ILALL, ILBACK, ILBBAD, ILCOMP,
-     $                   LSA, LSB
-      INTEGER            I, IBEG, IEIG, IEND, IHWMNY, IM, ISIDE, ISRC,
-     $                   J, JE, JR
-      REAL               ACOEFA, ACOEFF, ANORM, ASCALE, BCOEFA, BIG,
-     $                   BIGNUM, BNORM, BSCALE, DMIN, SAFMIN, SBETA,
-     $                   SCALE, SMALL, TEMP, ULP, XMAX
-      COMPLEX            BCOEFF, CA, CB, D, SALPHA, SUM, SUMA, SUMB, X
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               SLAMCH
-      COMPLEX            CLADIV
-      EXTERNAL           LSAME, SLAMCH, CLADIV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CGEMV, SLABAD, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, CMPLX, CONJG, MAX, MIN, REAL
-*     ..
-*     .. Statement Functions ..
-      REAL               ABS1
-*     ..
-*     .. Statement Function definitions ..
-      ABS1( X ) = ABS( REAL( X ) ) + ABS( AIMAG( X ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and Test the input parameters
-*
-      IF( LSAME( HOWMNY, 'A' ) ) THEN
-         IHWMNY = 1
-         ILALL = .TRUE.
-         ILBACK = .FALSE.
-      ELSE IF( LSAME( HOWMNY, 'S' ) ) THEN
-         IHWMNY = 2
-         ILALL = .FALSE.
-         ILBACK = .FALSE.
-      ELSE IF( LSAME( HOWMNY, 'B' ) ) THEN
-         IHWMNY = 3
-         ILALL = .TRUE.
-         ILBACK = .TRUE.
-      ELSE
-         IHWMNY = -1
-      END IF
-*
-      IF( LSAME( SIDE, 'R' ) ) THEN
-         ISIDE = 1
-         COMPL = .FALSE.
-         COMPR = .TRUE.
-      ELSE IF( LSAME( SIDE, 'L' ) ) THEN
-         ISIDE = 2
-         COMPL = .TRUE.
-         COMPR = .FALSE.
-      ELSE IF( LSAME( SIDE, 'B' ) ) THEN
-         ISIDE = 3
-         COMPL = .TRUE.
-         COMPR = .TRUE.
-      ELSE
-         ISIDE = -1
-      END IF
-*
-      INFO = 0
-      IF( ISIDE.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( IHWMNY.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDS.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      ELSE IF( LDP.LT.MAX( 1, N ) ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CTGEVC', -INFO )
-         RETURN
-      END IF
-*
-*     Count the number of eigenvectors
-*
-      IF( .NOT.ILALL ) THEN
-         IM = 0
-         DO 10 J = 1, N
-            IF( SELECT( J ) )
-     $         IM = IM + 1
-   10    CONTINUE
-      ELSE
-         IM = N
-      END IF
-*
-*     Check diagonal of B
-*
-      ILBBAD = .FALSE.
-      DO 20 J = 1, N
-         IF( AIMAG( P( J, J ) ).NE.ZERO )
-     $      ILBBAD = .TRUE.
-   20 CONTINUE
-*
-      IF( ILBBAD ) THEN
-         INFO = -7
-      ELSE IF( COMPL .AND. LDVL.LT.N .OR. LDVL.LT.1 ) THEN
-         INFO = -10
-      ELSE IF( COMPR .AND. LDVR.LT.N .OR. LDVR.LT.1 ) THEN
-         INFO = -12
-      ELSE IF( MM.LT.IM ) THEN
-         INFO = -13
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CTGEVC', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      M = IM
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Machine Constants
-*
-      SAFMIN = SLAMCH( 'Safe minimum' )
-      BIG = ONE / SAFMIN
-      CALL SLABAD( SAFMIN, BIG )
-      ULP = SLAMCH( 'Epsilon' )*SLAMCH( 'Base' )
-      SMALL = SAFMIN*N / ULP
-      BIG = ONE / SMALL
-      BIGNUM = ONE / ( SAFMIN*N )
-*
-*     Compute the 1-norm of each column of the strictly upper triangular
-*     part of A and B to check for possible overflow in the triangular
-*     solver.
-*
-      ANORM = ABS1( S( 1, 1 ) )
-      BNORM = ABS1( P( 1, 1 ) )
-      RWORK( 1 ) = ZERO
-      RWORK( N+1 ) = ZERO
-      DO 40 J = 2, N
-         RWORK( J ) = ZERO
-         RWORK( N+J ) = ZERO
-         DO 30 I = 1, J - 1
-            RWORK( J ) = RWORK( J ) + ABS1( S( I, J ) )
-            RWORK( N+J ) = RWORK( N+J ) + ABS1( P( I, J ) )
-   30    CONTINUE
-         ANORM = MAX( ANORM, RWORK( J )+ABS1( S( J, J ) ) )
-         BNORM = MAX( BNORM, RWORK( N+J )+ABS1( P( J, J ) ) )
-   40 CONTINUE
-*
-      ASCALE = ONE / MAX( ANORM, SAFMIN )
-      BSCALE = ONE / MAX( BNORM, SAFMIN )
-*
-*     Left eigenvectors
-*
-      IF( COMPL ) THEN
-         IEIG = 0
-*
-*        Main loop over eigenvalues
-*
-         DO 140 JE = 1, N
-            IF( ILALL ) THEN
-               ILCOMP = .TRUE.
-            ELSE
-               ILCOMP = SELECT( JE )
-            END IF
-            IF( ILCOMP ) THEN
-               IEIG = IEIG + 1
-*
-               IF( ABS1( S( JE, JE ) ).LE.SAFMIN .AND.
-     $             ABS( REAL( P( JE, JE ) ) ).LE.SAFMIN ) THEN
-*
-*                 Singular matrix pencil -- return unit eigenvector
-*
-                  DO 50 JR = 1, N
-                     VL( JR, IEIG ) = CZERO
-   50             CONTINUE
-                  VL( IEIG, IEIG ) = CONE
-                  GO TO 140
-               END IF
-*
-*              Non-singular eigenvalue:
-*              Compute coefficients  a  and  b  in
-*                   H
-*                 y  ( a A - b B ) = 0
-*
-               TEMP = ONE / MAX( ABS1( S( JE, JE ) )*ASCALE,
-     $                ABS( REAL( P( JE, JE ) ) )*BSCALE, SAFMIN )
-               SALPHA = ( TEMP*S( JE, JE ) )*ASCALE
-               SBETA = ( TEMP*REAL( P( JE, JE ) ) )*BSCALE
-               ACOEFF = SBETA*ASCALE
-               BCOEFF = SALPHA*BSCALE
-*
-*              Scale to avoid underflow
-*
-               LSA = ABS( SBETA ).GE.SAFMIN .AND. ABS( ACOEFF ).LT.SMALL
-               LSB = ABS1( SALPHA ).GE.SAFMIN .AND. ABS1( BCOEFF ).LT.
-     $               SMALL
-*
-               SCALE = ONE
-               IF( LSA )
-     $            SCALE = ( SMALL / ABS( SBETA ) )*MIN( ANORM, BIG )
-               IF( LSB )
-     $            SCALE = MAX( SCALE, ( SMALL / ABS1( SALPHA ) )*
-     $                    MIN( BNORM, BIG ) )
-               IF( LSA .OR. LSB ) THEN
-                  SCALE = MIN( SCALE, ONE /
-     $                    ( SAFMIN*MAX( ONE, ABS( ACOEFF ),
-     $                    ABS1( BCOEFF ) ) ) )
-                  IF( LSA ) THEN
-                     ACOEFF = ASCALE*( SCALE*SBETA )
-                  ELSE
-                     ACOEFF = SCALE*ACOEFF
-                  END IF
-                  IF( LSB ) THEN
-                     BCOEFF = BSCALE*( SCALE*SALPHA )
-                  ELSE
-                     BCOEFF = SCALE*BCOEFF
-                  END IF
-               END IF
-*
-               ACOEFA = ABS( ACOEFF )
-               BCOEFA = ABS1( BCOEFF )
-               XMAX = ONE
-               DO 60 JR = 1, N
-                  WORK( JR ) = CZERO
-   60          CONTINUE
-               WORK( JE ) = CONE
-               DMIN = MAX( ULP*ACOEFA*ANORM, ULP*BCOEFA*BNORM, SAFMIN )
-*
-*                                              H
-*              Triangular solve of  (a A - b B)  y = 0
-*
-*                                      H
-*              (rowwise in  (a A - b B) , or columnwise in a A - b B)
-*
-               DO 100 J = JE + 1, N
-*
-*                 Compute
-*                       j-1
-*                 SUM = sum  conjg( a*S(k,j) - b*P(k,j) )*x(k)
-*                       k=je
-*                 (Scale if necessary)
-*
-                  TEMP = ONE / XMAX
-                  IF( ACOEFA*RWORK( J )+BCOEFA*RWORK( N+J ).GT.BIGNUM*
-     $                TEMP ) THEN
-                     DO 70 JR = JE, J - 1
-                        WORK( JR ) = TEMP*WORK( JR )
-   70                CONTINUE
-                     XMAX = ONE
-                  END IF
-                  SUMA = CZERO
-                  SUMB = CZERO
-*
-                  DO 80 JR = JE, J - 1
-                     SUMA = SUMA + CONJG( S( JR, J ) )*WORK( JR )
-                     SUMB = SUMB + CONJG( P( JR, J ) )*WORK( JR )
-   80             CONTINUE
-                  SUM = ACOEFF*SUMA - CONJG( BCOEFF )*SUMB
-*
-*                 Form x(j) = - SUM / conjg( a*S(j,j) - b*P(j,j) )
-*
-*                 with scaling and perturbation of the denominator
-*
-                  D = CONJG( ACOEFF*S( J, J )-BCOEFF*P( J, J ) )
-                  IF( ABS1( D ).LE.DMIN )
-     $               D = CMPLX( DMIN )
-*
-                  IF( ABS1( D ).LT.ONE ) THEN
-                     IF( ABS1( SUM ).GE.BIGNUM*ABS1( D ) ) THEN
-                        TEMP = ONE / ABS1( SUM )
-                        DO 90 JR = JE, J - 1
-                           WORK( JR ) = TEMP*WORK( JR )
-   90                   CONTINUE
-                        XMAX = TEMP*XMAX
-                        SUM = TEMP*SUM
-                     END IF
-                  END IF
-                  WORK( J ) = CLADIV( -SUM, D )
-                  XMAX = MAX( XMAX, ABS1( WORK( J ) ) )
-  100          CONTINUE
-*
-*              Back transform eigenvector if HOWMNY='B'.
-*
-               IF( ILBACK ) THEN
-                  CALL CGEMV( 'N', N, N+1-JE, CONE, VL( 1, JE ), LDVL,
-     $                        WORK( JE ), 1, CZERO, WORK( N+1 ), 1 )
-                  ISRC = 2
-                  IBEG = 1
-               ELSE
-                  ISRC = 1
-                  IBEG = JE
-               END IF
-*
-*              Copy and scale eigenvector into column of VL
-*
-               XMAX = ZERO
-               DO 110 JR = IBEG, N
-                  XMAX = MAX( XMAX, ABS1( WORK( ( ISRC-1 )*N+JR ) ) )
-  110          CONTINUE
-*
-               IF( XMAX.GT.SAFMIN ) THEN
-                  TEMP = ONE / XMAX
-                  DO 120 JR = IBEG, N
-                     VL( JR, IEIG ) = TEMP*WORK( ( ISRC-1 )*N+JR )
-  120             CONTINUE
-               ELSE
-                  IBEG = N + 1
-               END IF
-*
-               DO 130 JR = 1, IBEG - 1
-                  VL( JR, IEIG ) = CZERO
-  130          CONTINUE
-*
-            END IF
-  140    CONTINUE
-      END IF
-*
-*     Right eigenvectors
-*
-      IF( COMPR ) THEN
-         IEIG = IM + 1
-*
-*        Main loop over eigenvalues
-*
-         DO 250 JE = N, 1, -1
-            IF( ILALL ) THEN
-               ILCOMP = .TRUE.
-            ELSE
-               ILCOMP = SELECT( JE )
-            END IF
-            IF( ILCOMP ) THEN
-               IEIG = IEIG - 1
-*
-               IF( ABS1( S( JE, JE ) ).LE.SAFMIN .AND.
-     $             ABS( REAL( P( JE, JE ) ) ).LE.SAFMIN ) THEN
-*
-*                 Singular matrix pencil -- return unit eigenvector
-*
-                  DO 150 JR = 1, N
-                     VR( JR, IEIG ) = CZERO
-  150             CONTINUE
-                  VR( IEIG, IEIG ) = CONE
-                  GO TO 250
-               END IF
-*
-*              Non-singular eigenvalue:
-*              Compute coefficients  a  and  b  in
-*
-*              ( a A - b B ) x  = 0
-*
-               TEMP = ONE / MAX( ABS1( S( JE, JE ) )*ASCALE,
-     $                ABS( REAL( P( JE, JE ) ) )*BSCALE, SAFMIN )
-               SALPHA = ( TEMP*S( JE, JE ) )*ASCALE
-               SBETA = ( TEMP*REAL( P( JE, JE ) ) )*BSCALE
-               ACOEFF = SBETA*ASCALE
-               BCOEFF = SALPHA*BSCALE
-*
-*              Scale to avoid underflow
-*
-               LSA = ABS( SBETA ).GE.SAFMIN .AND. ABS( ACOEFF ).LT.SMALL
-               LSB = ABS1( SALPHA ).GE.SAFMIN .AND. ABS1( BCOEFF ).LT.
-     $               SMALL
-*
-               SCALE = ONE
-               IF( LSA )
-     $            SCALE = ( SMALL / ABS( SBETA ) )*MIN( ANORM, BIG )
-               IF( LSB )
-     $            SCALE = MAX( SCALE, ( SMALL / ABS1( SALPHA ) )*
-     $                    MIN( BNORM, BIG ) )
-               IF( LSA .OR. LSB ) THEN
-                  SCALE = MIN( SCALE, ONE /
-     $                    ( SAFMIN*MAX( ONE, ABS( ACOEFF ),
-     $                    ABS1( BCOEFF ) ) ) )
-                  IF( LSA ) THEN
-                     ACOEFF = ASCALE*( SCALE*SBETA )
-                  ELSE
-                     ACOEFF = SCALE*ACOEFF
-                  END IF
-                  IF( LSB ) THEN
-                     BCOEFF = BSCALE*( SCALE*SALPHA )
-                  ELSE
-                     BCOEFF = SCALE*BCOEFF
-                  END IF
-               END IF
-*
-               ACOEFA = ABS( ACOEFF )
-               BCOEFA = ABS1( BCOEFF )
-               XMAX = ONE
-               DO 160 JR = 1, N
-                  WORK( JR ) = CZERO
-  160          CONTINUE
-               WORK( JE ) = CONE
-               DMIN = MAX( ULP*ACOEFA*ANORM, ULP*BCOEFA*BNORM, SAFMIN )
-*
-*              Triangular solve of  (a A - b B) x = 0  (columnwise)
-*
-*              WORK(1:j-1) contains sums w,
-*              WORK(j+1:JE) contains x
-*
-               DO 170 JR = 1, JE - 1
-                  WORK( JR ) = ACOEFF*S( JR, JE ) - BCOEFF*P( JR, JE )
-  170          CONTINUE
-               WORK( JE ) = CONE
-*
-               DO 210 J = JE - 1, 1, -1
-*
-*                 Form x(j) := - w(j) / d
-*                 with scaling and perturbation of the denominator
-*
-                  D = ACOEFF*S( J, J ) - BCOEFF*P( J, J )
-                  IF( ABS1( D ).LE.DMIN )
-     $               D = CMPLX( DMIN )
-*
-                  IF( ABS1( D ).LT.ONE ) THEN
-                     IF( ABS1( WORK( J ) ).GE.BIGNUM*ABS1( D ) ) THEN
-                        TEMP = ONE / ABS1( WORK( J ) )
-                        DO 180 JR = 1, JE
-                           WORK( JR ) = TEMP*WORK( JR )
-  180                   CONTINUE
-                     END IF
-                  END IF
-*
-                  WORK( J ) = CLADIV( -WORK( J ), D )
-*
-                  IF( J.GT.1 ) THEN
-*
-*                    w = w + x(j)*(a S(*,j) - b P(*,j) ) with scaling
-*
-                     IF( ABS1( WORK( J ) ).GT.ONE ) THEN
-                        TEMP = ONE / ABS1( WORK( J ) )
-                        IF( ACOEFA*RWORK( J )+BCOEFA*RWORK( N+J ).GE.
-     $                      BIGNUM*TEMP ) THEN
-                           DO 190 JR = 1, JE
-                              WORK( JR ) = TEMP*WORK( JR )
-  190                      CONTINUE
-                        END IF
-                     END IF
-*
-                     CA = ACOEFF*WORK( J )
-                     CB = BCOEFF*WORK( J )
-                     DO 200 JR = 1, J - 1
-                        WORK( JR ) = WORK( JR ) + CA*S( JR, J ) -
-     $                               CB*P( JR, J )
-  200                CONTINUE
-                  END IF
-  210          CONTINUE
-*
-*              Back transform eigenvector if HOWMNY='B'.
-*
-               IF( ILBACK ) THEN
-                  CALL CGEMV( 'N', N, JE, CONE, VR, LDVR, WORK, 1,
-     $                        CZERO, WORK( N+1 ), 1 )
-                  ISRC = 2
-                  IEND = N
-               ELSE
-                  ISRC = 1
-                  IEND = JE
-               END IF
-*
-*              Copy and scale eigenvector into column of VR
-*
-               XMAX = ZERO
-               DO 220 JR = 1, IEND
-                  XMAX = MAX( XMAX, ABS1( WORK( ( ISRC-1 )*N+JR ) ) )
-  220          CONTINUE
-*
-               IF( XMAX.GT.SAFMIN ) THEN
-                  TEMP = ONE / XMAX
-                  DO 230 JR = 1, IEND
-                     VR( JR, IEIG ) = TEMP*WORK( ( ISRC-1 )*N+JR )
-  230             CONTINUE
-               ELSE
-                  IEND = 0
-               END IF
-*
-               DO 240 JR = IEND + 1, N
-                  VR( JR, IEIG ) = CZERO
-  240          CONTINUE
-*
-            END IF
-  250    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of CTGEVC
-*
-      END
--- a/libcruft/lapack/ctrcon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,204 +0,0 @@
-      SUBROUTINE CTRCON( NORM, UPLO, DIAG, N, A, LDA, RCOND, WORK,
-     $                   RWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call CLACN2 in place of CLACON, 10 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, NORM, UPLO
-      INTEGER            INFO, LDA, N
-      REAL               RCOND
-*     ..
-*     .. Array Arguments ..
-      REAL               RWORK( * )
-      COMPLEX            A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CTRCON estimates the reciprocal of the condition number of a
-*  triangular matrix A, in either the 1-norm or the infinity-norm.
-*
-*  The norm of A is computed and an estimate is obtained for
-*  norm(inv(A)), then the reciprocal of the condition number is
-*  computed as
-*     RCOND = 1 / ( norm(A) * norm(inv(A)) ).
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies whether the 1-norm condition number or the
-*          infinity-norm condition number is required:
-*          = '1' or 'O':  1-norm;
-*          = 'I':         Infinity-norm.
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  A is upper triangular;
-*          = 'L':  A is lower triangular.
-*
-*  DIAG    (input) CHARACTER*1
-*          = 'N':  A is non-unit triangular;
-*          = 'U':  A is unit triangular.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input) COMPLEX array, dimension (LDA,N)
-*          The triangular matrix A.  If UPLO = 'U', the leading N-by-N
-*          upper triangular part of the array A contains the upper
-*          triangular matrix, and the strictly lower triangular part of
-*          A is not referenced.  If UPLO = 'L', the leading N-by-N lower
-*          triangular part of the array A contains the lower triangular
-*          matrix, and the strictly upper triangular part of A is not
-*          referenced.  If DIAG = 'U', the diagonal elements of A are
-*          also not referenced and are assumed to be 1.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  RCOND   (output) REAL
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(norm(A) * norm(inv(A))).
-*
-*  WORK    (workspace) COMPLEX array, dimension (2*N)
-*
-*  RWORK   (workspace) REAL array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOUNIT, ONENRM, UPPER
-      CHARACTER          NORMIN
-      INTEGER            IX, KASE, KASE1
-      REAL               AINVNM, ANORM, SCALE, SMLNUM, XNORM
-      COMPLEX            ZDUM
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ICAMAX
-      REAL               CLANTR, SLAMCH
-      EXTERNAL           LSAME, ICAMAX, CLANTR, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLACN2, CLATRS, CSRSCL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, MAX, REAL
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( REAL( ZDUM ) ) + ABS( AIMAG( ZDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' )
-      NOUNIT = LSAME( DIAG, 'N' )
-*
-      IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CTRCON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      END IF
-*
-      RCOND = ZERO
-      SMLNUM = SLAMCH( 'Safe minimum' )*REAL( MAX( 1, N ) )
-*
-*     Compute the norm of the triangular matrix A.
-*
-      ANORM = CLANTR( NORM, UPLO, DIAG, N, N, A, LDA, RWORK )
-*
-*     Continue only if ANORM > 0.
-*
-      IF( ANORM.GT.ZERO ) THEN
-*
-*        Estimate the norm of the inverse of A.
-*
-         AINVNM = ZERO
-         NORMIN = 'N'
-         IF( ONENRM ) THEN
-            KASE1 = 1
-         ELSE
-            KASE1 = 2
-         END IF
-         KASE = 0
-   10    CONTINUE
-         CALL CLACN2( N, WORK( N+1 ), WORK, AINVNM, KASE, ISAVE )
-         IF( KASE.NE.0 ) THEN
-            IF( KASE.EQ.KASE1 ) THEN
-*
-*              Multiply by inv(A).
-*
-               CALL CLATRS( UPLO, 'No transpose', DIAG, NORMIN, N, A,
-     $                      LDA, WORK, SCALE, RWORK, INFO )
-            ELSE
-*
-*              Multiply by inv(A').
-*
-               CALL CLATRS( UPLO, 'Conjugate transpose', DIAG, NORMIN,
-     $                      N, A, LDA, WORK, SCALE, RWORK, INFO )
-            END IF
-            NORMIN = 'Y'
-*
-*           Multiply by 1/SCALE if doing so will not cause overflow.
-*
-            IF( SCALE.NE.ONE ) THEN
-               IX = ICAMAX( N, WORK, 1 )
-               XNORM = CABS1( WORK( IX ) )
-               IF( SCALE.LT.XNORM*SMLNUM .OR. SCALE.EQ.ZERO )
-     $            GO TO 20
-               CALL CSRSCL( N, SCALE, WORK, 1 )
-            END IF
-            GO TO 10
-         END IF
-*
-*        Compute the estimate of the reciprocal condition number.
-*
-         IF( AINVNM.NE.ZERO )
-     $      RCOND = ( ONE / ANORM ) / AINVNM
-      END IF
-*
-   20 CONTINUE
-      RETURN
-*
-*     End of CTRCON
-*
-      END
--- a/libcruft/lapack/ctrevc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,386 +0,0 @@
-      SUBROUTINE CTREVC( SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR,
-     $                   LDVR, MM, M, WORK, RWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          HOWMNY, SIDE
-      INTEGER            INFO, LDT, LDVL, LDVR, M, MM, N
-*     ..
-*     .. Array Arguments ..
-      LOGICAL            SELECT( * )
-      REAL               RWORK( * )
-      COMPLEX            T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CTREVC computes some or all of the right and/or left eigenvectors of
-*  a complex upper triangular matrix T.
-*  Matrices of this type are produced by the Schur factorization of
-*  a complex general matrix:  A = Q*T*Q**H, as computed by CHSEQR.
-*  
-*  The right eigenvector x and the left eigenvector y of T corresponding
-*  to an eigenvalue w are defined by:
-*  
-*               T*x = w*x,     (y**H)*T = w*(y**H)
-*  
-*  where y**H denotes the conjugate transpose of the vector y.
-*  The eigenvalues are not input to this routine, but are read directly
-*  from the diagonal of T.
-*  
-*  This routine returns the matrices X and/or Y of right and left
-*  eigenvectors of T, or the products Q*X and/or Q*Y, where Q is an
-*  input matrix.  If Q is the unitary factor that reduces a matrix A to
-*  Schur form T, then Q*X and Q*Y are the matrices of right and left
-*  eigenvectors of A.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'R':  compute right eigenvectors only;
-*          = 'L':  compute left eigenvectors only;
-*          = 'B':  compute both right and left eigenvectors.
-*
-*  HOWMNY  (input) CHARACTER*1
-*          = 'A':  compute all right and/or left eigenvectors;
-*          = 'B':  compute all right and/or left eigenvectors,
-*                  backtransformed using the matrices supplied in
-*                  VR and/or VL;
-*          = 'S':  compute selected right and/or left eigenvectors,
-*                  as indicated by the logical array SELECT.
-*
-*  SELECT  (input) LOGICAL array, dimension (N)
-*          If HOWMNY = 'S', SELECT specifies the eigenvectors to be
-*          computed.
-*          The eigenvector corresponding to the j-th eigenvalue is
-*          computed if SELECT(j) = .TRUE..
-*          Not referenced if HOWMNY = 'A' or 'B'.
-*
-*  N       (input) INTEGER
-*          The order of the matrix T. N >= 0.
-*
-*  T       (input/output) COMPLEX array, dimension (LDT,N)
-*          The upper triangular matrix T.  T is modified, but restored
-*          on exit.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= max(1,N).
-*
-*  VL      (input/output) COMPLEX array, dimension (LDVL,MM)
-*          On entry, if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must
-*          contain an N-by-N matrix Q (usually the unitary matrix Q of
-*          Schur vectors returned by CHSEQR).
-*          On exit, if SIDE = 'L' or 'B', VL contains:
-*          if HOWMNY = 'A', the matrix Y of left eigenvectors of T;
-*          if HOWMNY = 'B', the matrix Q*Y;
-*          if HOWMNY = 'S', the left eigenvectors of T specified by
-*                           SELECT, stored consecutively in the columns
-*                           of VL, in the same order as their
-*                           eigenvalues.
-*          Not referenced if SIDE = 'R'.
-*
-*  LDVL    (input) INTEGER
-*          The leading dimension of the array VL.  LDVL >= 1, and if
-*          SIDE = 'L' or 'B', LDVL >= N.
-*
-*  VR      (input/output) COMPLEX array, dimension (LDVR,MM)
-*          On entry, if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must
-*          contain an N-by-N matrix Q (usually the unitary matrix Q of
-*          Schur vectors returned by CHSEQR).
-*          On exit, if SIDE = 'R' or 'B', VR contains:
-*          if HOWMNY = 'A', the matrix X of right eigenvectors of T;
-*          if HOWMNY = 'B', the matrix Q*X;
-*          if HOWMNY = 'S', the right eigenvectors of T specified by
-*                           SELECT, stored consecutively in the columns
-*                           of VR, in the same order as their
-*                           eigenvalues.
-*          Not referenced if SIDE = 'L'.
-*
-*  LDVR    (input) INTEGER
-*          The leading dimension of the array VR.  LDVR >= 1, and if
-*          SIDE = 'R' or 'B'; LDVR >= N.
-*
-*  MM      (input) INTEGER
-*          The number of columns in the arrays VL and/or VR. MM >= M.
-*
-*  M       (output) INTEGER
-*          The number of columns in the arrays VL and/or VR actually
-*          used to store the eigenvectors.  If HOWMNY = 'A' or 'B', M
-*          is set to N.  Each selected eigenvector occupies one
-*          column.
-*
-*  WORK    (workspace) COMPLEX array, dimension (2*N)
-*
-*  RWORK   (workspace) REAL array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The algorithm used in this program is basically backward (forward)
-*  substitution, with scaling to make the the code robust against
-*  possible overflow.
-*
-*  Each eigenvector is normalized so that the element of largest
-*  magnitude has magnitude 1; here the magnitude of a complex number
-*  (x,y) is taken to be |x| + |y|.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-      COMPLEX            CMZERO, CMONE
-      PARAMETER          ( CMZERO = ( 0.0E+0, 0.0E+0 ),
-     $                   CMONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ALLV, BOTHV, LEFTV, OVER, RIGHTV, SOMEV
-      INTEGER            I, II, IS, J, K, KI
-      REAL               OVFL, REMAX, SCALE, SMIN, SMLNUM, ULP, UNFL
-      COMPLEX            CDUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ICAMAX
-      REAL               SCASUM, SLAMCH
-      EXTERNAL           LSAME, ICAMAX, SCASUM, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CCOPY, CGEMV, CLATRS, CSSCAL, SLABAD, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, CMPLX, CONJG, MAX, REAL
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( REAL( CDUM ) ) + ABS( AIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and test the input parameters
-*
-      BOTHV = LSAME( SIDE, 'B' )
-      RIGHTV = LSAME( SIDE, 'R' ) .OR. BOTHV
-      LEFTV = LSAME( SIDE, 'L' ) .OR. BOTHV
-*
-      ALLV = LSAME( HOWMNY, 'A' )
-      OVER = LSAME( HOWMNY, 'B' )
-      SOMEV = LSAME( HOWMNY, 'S' )
-*
-*     Set M to the number of columns required to store the selected
-*     eigenvectors.
-*
-      IF( SOMEV ) THEN
-         M = 0
-         DO 10 J = 1, N
-            IF( SELECT( J ) )
-     $         M = M + 1
-   10    CONTINUE
-      ELSE
-         M = N
-      END IF
-*
-      INFO = 0
-      IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
-         INFO = -1
-      ELSE IF( .NOT.ALLV .AND. .NOT.OVER .AND. .NOT.SOMEV ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDT.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      ELSE IF( LDVL.LT.1 .OR. ( LEFTV .AND. LDVL.LT.N ) ) THEN
-         INFO = -8
-      ELSE IF( LDVR.LT.1 .OR. ( RIGHTV .AND. LDVR.LT.N ) ) THEN
-         INFO = -10
-      ELSE IF( MM.LT.M ) THEN
-         INFO = -11
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CTREVC', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Set the constants to control overflow.
-*
-      UNFL = SLAMCH( 'Safe minimum' )
-      OVFL = ONE / UNFL
-      CALL SLABAD( UNFL, OVFL )
-      ULP = SLAMCH( 'Precision' )
-      SMLNUM = UNFL*( N / ULP )
-*
-*     Store the diagonal elements of T in working array WORK.
-*
-      DO 20 I = 1, N
-         WORK( I+N ) = T( I, I )
-   20 CONTINUE
-*
-*     Compute 1-norm of each column of strictly upper triangular
-*     part of T to control overflow in triangular solver.
-*
-      RWORK( 1 ) = ZERO
-      DO 30 J = 2, N
-         RWORK( J ) = SCASUM( J-1, T( 1, J ), 1 )
-   30 CONTINUE
-*
-      IF( RIGHTV ) THEN
-*
-*        Compute right eigenvectors.
-*
-         IS = M
-         DO 80 KI = N, 1, -1
-*
-            IF( SOMEV ) THEN
-               IF( .NOT.SELECT( KI ) )
-     $            GO TO 80
-            END IF
-            SMIN = MAX( ULP*( CABS1( T( KI, KI ) ) ), SMLNUM )
-*
-            WORK( 1 ) = CMONE
-*
-*           Form right-hand side.
-*
-            DO 40 K = 1, KI - 1
-               WORK( K ) = -T( K, KI )
-   40       CONTINUE
-*
-*           Solve the triangular system:
-*              (T(1:KI-1,1:KI-1) - T(KI,KI))*X = SCALE*WORK.
-*
-            DO 50 K = 1, KI - 1
-               T( K, K ) = T( K, K ) - T( KI, KI )
-               IF( CABS1( T( K, K ) ).LT.SMIN )
-     $            T( K, K ) = SMIN
-   50       CONTINUE
-*
-            IF( KI.GT.1 ) THEN
-               CALL CLATRS( 'Upper', 'No transpose', 'Non-unit', 'Y',
-     $                      KI-1, T, LDT, WORK( 1 ), SCALE, RWORK,
-     $                      INFO )
-               WORK( KI ) = SCALE
-            END IF
-*
-*           Copy the vector x or Q*x to VR and normalize.
-*
-            IF( .NOT.OVER ) THEN
-               CALL CCOPY( KI, WORK( 1 ), 1, VR( 1, IS ), 1 )
-*
-               II = ICAMAX( KI, VR( 1, IS ), 1 )
-               REMAX = ONE / CABS1( VR( II, IS ) )
-               CALL CSSCAL( KI, REMAX, VR( 1, IS ), 1 )
-*
-               DO 60 K = KI + 1, N
-                  VR( K, IS ) = CMZERO
-   60          CONTINUE
-            ELSE
-               IF( KI.GT.1 )
-     $            CALL CGEMV( 'N', N, KI-1, CMONE, VR, LDVR, WORK( 1 ),
-     $                        1, CMPLX( SCALE ), VR( 1, KI ), 1 )
-*
-               II = ICAMAX( N, VR( 1, KI ), 1 )
-               REMAX = ONE / CABS1( VR( II, KI ) )
-               CALL CSSCAL( N, REMAX, VR( 1, KI ), 1 )
-            END IF
-*
-*           Set back the original diagonal elements of T.
-*
-            DO 70 K = 1, KI - 1
-               T( K, K ) = WORK( K+N )
-   70       CONTINUE
-*
-            IS = IS - 1
-   80    CONTINUE
-      END IF
-*
-      IF( LEFTV ) THEN
-*
-*        Compute left eigenvectors.
-*
-         IS = 1
-         DO 130 KI = 1, N
-*
-            IF( SOMEV ) THEN
-               IF( .NOT.SELECT( KI ) )
-     $            GO TO 130
-            END IF
-            SMIN = MAX( ULP*( CABS1( T( KI, KI ) ) ), SMLNUM )
-*
-            WORK( N ) = CMONE
-*
-*           Form right-hand side.
-*
-            DO 90 K = KI + 1, N
-               WORK( K ) = -CONJG( T( KI, K ) )
-   90       CONTINUE
-*
-*           Solve the triangular system:
-*              (T(KI+1:N,KI+1:N) - T(KI,KI))'*X = SCALE*WORK.
-*
-            DO 100 K = KI + 1, N
-               T( K, K ) = T( K, K ) - T( KI, KI )
-               IF( CABS1( T( K, K ) ).LT.SMIN )
-     $            T( K, K ) = SMIN
-  100       CONTINUE
-*
-            IF( KI.LT.N ) THEN
-               CALL CLATRS( 'Upper', 'Conjugate transpose', 'Non-unit',
-     $                      'Y', N-KI, T( KI+1, KI+1 ), LDT,
-     $                      WORK( KI+1 ), SCALE, RWORK, INFO )
-               WORK( KI ) = SCALE
-            END IF
-*
-*           Copy the vector x or Q*x to VL and normalize.
-*
-            IF( .NOT.OVER ) THEN
-               CALL CCOPY( N-KI+1, WORK( KI ), 1, VL( KI, IS ), 1 )
-*
-               II = ICAMAX( N-KI+1, VL( KI, IS ), 1 ) + KI - 1
-               REMAX = ONE / CABS1( VL( II, IS ) )
-               CALL CSSCAL( N-KI+1, REMAX, VL( KI, IS ), 1 )
-*
-               DO 110 K = 1, KI - 1
-                  VL( K, IS ) = CMZERO
-  110          CONTINUE
-            ELSE
-               IF( KI.LT.N )
-     $            CALL CGEMV( 'N', N, N-KI, CMONE, VL( 1, KI+1 ), LDVL,
-     $                        WORK( KI+1 ), 1, CMPLX( SCALE ),
-     $                        VL( 1, KI ), 1 )
-*
-               II = ICAMAX( N, VL( 1, KI ), 1 )
-               REMAX = ONE / CABS1( VL( II, KI ) )
-               CALL CSSCAL( N, REMAX, VL( 1, KI ), 1 )
-            END IF
-*
-*           Set back the original diagonal elements of T.
-*
-            DO 120 K = KI + 1, N
-               T( K, K ) = WORK( K+N )
-  120       CONTINUE
-*
-            IS = IS + 1
-  130    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of CTREVC
-*
-      END
--- a/libcruft/lapack/ctrexc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,161 +0,0 @@
-      SUBROUTINE CTREXC( COMPQ, N, T, LDT, Q, LDQ, IFST, ILST, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPQ
-      INTEGER            IFST, ILST, INFO, LDQ, LDT, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            Q( LDQ, * ), T( LDT, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CTREXC reorders the Schur factorization of a complex matrix
-*  A = Q*T*Q**H, so that the diagonal element of T with row index IFST
-*  is moved to row ILST.
-*
-*  The Schur form T is reordered by a unitary similarity transformation
-*  Z**H*T*Z, and optionally the matrix Q of Schur vectors is updated by
-*  postmultplying it with Z.
-*
-*  Arguments
-*  =========
-*
-*  COMPQ   (input) CHARACTER*1
-*          = 'V':  update the matrix Q of Schur vectors;
-*          = 'N':  do not update Q.
-*
-*  N       (input) INTEGER
-*          The order of the matrix T. N >= 0.
-*
-*  T       (input/output) COMPLEX array, dimension (LDT,N)
-*          On entry, the upper triangular matrix T.
-*          On exit, the reordered upper triangular matrix.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= max(1,N).
-*
-*  Q       (input/output) COMPLEX array, dimension (LDQ,N)
-*          On entry, if COMPQ = 'V', the matrix Q of Schur vectors.
-*          On exit, if COMPQ = 'V', Q has been postmultiplied by the
-*          unitary transformation matrix Z which reorders T.
-*          If COMPQ = 'N', Q is not referenced.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.  LDQ >= max(1,N).
-*
-*  IFST    (input) INTEGER
-*  ILST    (input) INTEGER
-*          Specify the reordering of the diagonal elements of T:
-*          The element with row index IFST is moved to row ILST by a
-*          sequence of transpositions between adjacent elements.
-*          1 <= IFST <= N; 1 <= ILST <= N.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            WANTQ
-      INTEGER            K, M1, M2, M3
-      REAL               CS
-      COMPLEX            SN, T11, T22, TEMP
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLARTG, CROT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CONJG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and test the input parameters.
-*
-      INFO = 0
-      WANTQ = LSAME( COMPQ, 'V' )
-      IF( .NOT.LSAME( COMPQ, 'N' ) .AND. .NOT.WANTQ ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDT.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LDQ.LT.1 .OR. ( WANTQ .AND. LDQ.LT.MAX( 1, N ) ) ) THEN
-         INFO = -6
-      ELSE IF( IFST.LT.1 .OR. IFST.GT.N ) THEN
-         INFO = -7
-      ELSE IF( ILST.LT.1 .OR. ILST.GT.N ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CTREXC', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.1 .OR. IFST.EQ.ILST )
-     $   RETURN
-*
-      IF( IFST.LT.ILST ) THEN
-*
-*        Move the IFST-th diagonal element forward down the diagonal.
-*
-         M1 = 0
-         M2 = -1
-         M3 = 1
-      ELSE
-*
-*        Move the IFST-th diagonal element backward up the diagonal.
-*
-         M1 = -1
-         M2 = 0
-         M3 = -1
-      END IF
-*
-      DO 10 K = IFST + M1, ILST + M2, M3
-*
-*        Interchange the k-th and (k+1)-th diagonal elements.
-*
-         T11 = T( K, K )
-         T22 = T( K+1, K+1 )
-*
-*        Determine the transformation to perform the interchange.
-*
-         CALL CLARTG( T( K, K+1 ), T22-T11, CS, SN, TEMP )
-*
-*        Apply transformation to the matrix T.
-*
-         IF( K+2.LE.N )
-     $      CALL CROT( N-K-1, T( K, K+2 ), LDT, T( K+1, K+2 ), LDT, CS,
-     $                 SN )
-         CALL CROT( K-1, T( 1, K ), 1, T( 1, K+1 ), 1, CS, CONJG( SN ) )
-*
-         T( K, K ) = T22
-         T( K+1, K+1 ) = T11
-*
-         IF( WANTQ ) THEN
-*
-*           Accumulate transformation in the matrix Q.
-*
-            CALL CROT( N, Q( 1, K ), 1, Q( 1, K+1 ), 1, CS,
-     $                 CONJG( SN ) )
-         END IF
-*
-   10 CONTINUE
-*
-      RETURN
-*
-*     End of CTREXC
-*
-      END
--- a/libcruft/lapack/ctrsen.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,359 +0,0 @@
-      SUBROUTINE CTRSEN( JOB, COMPQ, SELECT, N, T, LDT, Q, LDQ, W, M, S,
-     $                   SEP, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call CLACN2 in place of CLACON, 10 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPQ, JOB
-      INTEGER            INFO, LDQ, LDT, LWORK, M, N
-      REAL               S, SEP
-*     ..
-*     .. Array Arguments ..
-      LOGICAL            SELECT( * )
-      COMPLEX            Q( LDQ, * ), T( LDT, * ), W( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CTRSEN reorders the Schur factorization of a complex matrix
-*  A = Q*T*Q**H, so that a selected cluster of eigenvalues appears in
-*  the leading positions on the diagonal of the upper triangular matrix
-*  T, and the leading columns of Q form an orthonormal basis of the
-*  corresponding right invariant subspace.
-*
-*  Optionally the routine computes the reciprocal condition numbers of
-*  the cluster of eigenvalues and/or the invariant subspace.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies whether condition numbers are required for the
-*          cluster of eigenvalues (S) or the invariant subspace (SEP):
-*          = 'N': none;
-*          = 'E': for eigenvalues only (S);
-*          = 'V': for invariant subspace only (SEP);
-*          = 'B': for both eigenvalues and invariant subspace (S and
-*                 SEP).
-*
-*  COMPQ   (input) CHARACTER*1
-*          = 'V': update the matrix Q of Schur vectors;
-*          = 'N': do not update Q.
-*
-*  SELECT  (input) LOGICAL array, dimension (N)
-*          SELECT specifies the eigenvalues in the selected cluster. To
-*          select the j-th eigenvalue, SELECT(j) must be set to .TRUE..
-*
-*  N       (input) INTEGER
-*          The order of the matrix T. N >= 0.
-*
-*  T       (input/output) COMPLEX array, dimension (LDT,N)
-*          On entry, the upper triangular matrix T.
-*          On exit, T is overwritten by the reordered matrix T, with the
-*          selected eigenvalues as the leading diagonal elements.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= max(1,N).
-*
-*  Q       (input/output) COMPLEX array, dimension (LDQ,N)
-*          On entry, if COMPQ = 'V', the matrix Q of Schur vectors.
-*          On exit, if COMPQ = 'V', Q has been postmultiplied by the
-*          unitary transformation matrix which reorders T; the leading M
-*          columns of Q form an orthonormal basis for the specified
-*          invariant subspace.
-*          If COMPQ = 'N', Q is not referenced.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.
-*          LDQ >= 1; and if COMPQ = 'V', LDQ >= N.
-*
-*  W       (output) COMPLEX array, dimension (N)
-*          The reordered eigenvalues of T, in the same order as they
-*          appear on the diagonal of T.
-*
-*  M       (output) INTEGER
-*          The dimension of the specified invariant subspace.
-*          0 <= M <= N.
-*
-*  S       (output) REAL
-*          If JOB = 'E' or 'B', S is a lower bound on the reciprocal
-*          condition number for the selected cluster of eigenvalues.
-*          S cannot underestimate the true reciprocal condition number
-*          by more than a factor of sqrt(N). If M = 0 or N, S = 1.
-*          If JOB = 'N' or 'V', S is not referenced.
-*
-*  SEP     (output) REAL
-*          If JOB = 'V' or 'B', SEP is the estimated reciprocal
-*          condition number of the specified invariant subspace. If
-*          M = 0 or N, SEP = norm(T).
-*          If JOB = 'N' or 'E', SEP is not referenced.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If JOB = 'N', LWORK >= 1;
-*          if JOB = 'E', LWORK = max(1,M*(N-M));
-*          if JOB = 'V' or 'B', LWORK >= max(1,2*M*(N-M)).
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  CTRSEN first collects the selected eigenvalues by computing a unitary
-*  transformation Z to move them to the top left corner of T. In other
-*  words, the selected eigenvalues are the eigenvalues of T11 in:
-*
-*                Z'*T*Z = ( T11 T12 ) n1
-*                         (  0  T22 ) n2
-*                            n1  n2
-*
-*  where N = n1+n2 and Z' means the conjugate transpose of Z. The first
-*  n1 columns of Z span the specified invariant subspace of T.
-*
-*  If T has been obtained from the Schur factorization of a matrix
-*  A = Q*T*Q', then the reordered Schur factorization of A is given by
-*  A = (Q*Z)*(Z'*T*Z)*(Q*Z)', and the first n1 columns of Q*Z span the
-*  corresponding invariant subspace of A.
-*
-*  The reciprocal condition number of the average of the eigenvalues of
-*  T11 may be returned in S. S lies between 0 (very badly conditioned)
-*  and 1 (very well conditioned). It is computed as follows. First we
-*  compute R so that
-*
-*                         P = ( I  R ) n1
-*                             ( 0  0 ) n2
-*                               n1 n2
-*
-*  is the projector on the invariant subspace associated with T11.
-*  R is the solution of the Sylvester equation:
-*
-*                        T11*R - R*T22 = T12.
-*
-*  Let F-norm(M) denote the Frobenius-norm of M and 2-norm(M) denote
-*  the two-norm of M. Then S is computed as the lower bound
-*
-*                      (1 + F-norm(R)**2)**(-1/2)
-*
-*  on the reciprocal of 2-norm(P), the true reciprocal condition number.
-*  S cannot underestimate 1 / 2-norm(P) by more than a factor of
-*  sqrt(N).
-*
-*  An approximate error bound for the computed average of the
-*  eigenvalues of T11 is
-*
-*                         EPS * norm(T) / S
-*
-*  where EPS is the machine precision.
-*
-*  The reciprocal condition number of the right invariant subspace
-*  spanned by the first n1 columns of Z (or of Q*Z) is returned in SEP.
-*  SEP is defined as the separation of T11 and T22:
-*
-*                     sep( T11, T22 ) = sigma-min( C )
-*
-*  where sigma-min(C) is the smallest singular value of the
-*  n1*n2-by-n1*n2 matrix
-*
-*     C  = kprod( I(n2), T11 ) - kprod( transpose(T22), I(n1) )
-*
-*  I(m) is an m by m identity matrix, and kprod denotes the Kronecker
-*  product. We estimate sigma-min(C) by the reciprocal of an estimate of
-*  the 1-norm of inverse(C). The true reciprocal 1-norm of inverse(C)
-*  cannot differ from sigma-min(C) by more than a factor of sqrt(n1*n2).
-*
-*  When SEP is small, small changes in T can cause large changes in
-*  the invariant subspace. An approximate bound on the maximum angular
-*  error in the computed right invariant subspace is
-*
-*                      EPS * norm(T) / SEP
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, WANTBH, WANTQ, WANTS, WANTSP
-      INTEGER            IERR, K, KASE, KS, LWMIN, N1, N2, NN
-      REAL               EST, RNORM, SCALE
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-      REAL               RWORK( 1 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               CLANGE
-      EXTERNAL           LSAME, CLANGE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLACN2, CLACPY, CTREXC, CTRSYL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and test the input parameters.
-*
-      WANTBH = LSAME( JOB, 'B' )
-      WANTS = LSAME( JOB, 'E' ) .OR. WANTBH
-      WANTSP = LSAME( JOB, 'V' ) .OR. WANTBH
-      WANTQ = LSAME( COMPQ, 'V' )
-*
-*     Set M to the number of selected eigenvalues.
-*
-      M = 0
-      DO 10 K = 1, N
-         IF( SELECT( K ) )
-     $      M = M + 1
-   10 CONTINUE
-*
-      N1 = M
-      N2 = N - M
-      NN = N1*N2
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-*
-      IF( WANTSP ) THEN
-         LWMIN = MAX( 1, 2*NN )
-      ELSE IF( LSAME( JOB, 'N' ) ) THEN
-         LWMIN = 1
-      ELSE IF( LSAME( JOB, 'E' ) ) THEN
-         LWMIN = MAX( 1, NN )
-      END IF
-*
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.WANTS .AND. .NOT.WANTSP )
-     $     THEN
-         INFO = -1
-      ELSE IF( .NOT.LSAME( COMPQ, 'N' ) .AND. .NOT.WANTQ ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDT.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      ELSE IF( LDQ.LT.1 .OR. ( WANTQ .AND. LDQ.LT.N ) ) THEN
-         INFO = -8
-      ELSE IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
-         INFO = -14
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         WORK( 1 ) = LWMIN
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CTRSEN', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.N .OR. M.EQ.0 ) THEN
-         IF( WANTS )
-     $      S = ONE
-         IF( WANTSP )
-     $      SEP = CLANGE( '1', N, N, T, LDT, RWORK )
-         GO TO 40
-      END IF
-*
-*     Collect the selected eigenvalues at the top left corner of T.
-*
-      KS = 0
-      DO 20 K = 1, N
-         IF( SELECT( K ) ) THEN
-            KS = KS + 1
-*
-*           Swap the K-th eigenvalue to position KS.
-*
-            IF( K.NE.KS )
-     $         CALL CTREXC( COMPQ, N, T, LDT, Q, LDQ, K, KS, IERR )
-         END IF
-   20 CONTINUE
-*
-      IF( WANTS ) THEN
-*
-*        Solve the Sylvester equation for R:
-*
-*           T11*R - R*T22 = scale*T12
-*
-         CALL CLACPY( 'F', N1, N2, T( 1, N1+1 ), LDT, WORK, N1 )
-         CALL CTRSYL( 'N', 'N', -1, N1, N2, T, LDT, T( N1+1, N1+1 ),
-     $                LDT, WORK, N1, SCALE, IERR )
-*
-*        Estimate the reciprocal of the condition number of the cluster
-*        of eigenvalues.
-*
-         RNORM = CLANGE( 'F', N1, N2, WORK, N1, RWORK )
-         IF( RNORM.EQ.ZERO ) THEN
-            S = ONE
-         ELSE
-            S = SCALE / ( SQRT( SCALE*SCALE / RNORM+RNORM )*
-     $          SQRT( RNORM ) )
-         END IF
-      END IF
-*
-      IF( WANTSP ) THEN
-*
-*        Estimate sep(T11,T22).
-*
-         EST = ZERO
-         KASE = 0
-   30    CONTINUE
-         CALL CLACN2( NN, WORK( NN+1 ), WORK, EST, KASE, ISAVE )
-         IF( KASE.NE.0 ) THEN
-            IF( KASE.EQ.1 ) THEN
-*
-*              Solve T11*R - R*T22 = scale*X.
-*
-               CALL CTRSYL( 'N', 'N', -1, N1, N2, T, LDT,
-     $                      T( N1+1, N1+1 ), LDT, WORK, N1, SCALE,
-     $                      IERR )
-            ELSE
-*
-*              Solve T11'*R - R*T22' = scale*X.
-*
-               CALL CTRSYL( 'C', 'C', -1, N1, N2, T, LDT,
-     $                      T( N1+1, N1+1 ), LDT, WORK, N1, SCALE,
-     $                      IERR )
-            END IF
-            GO TO 30
-         END IF
-*
-         SEP = SCALE / EST
-      END IF
-*
-   40 CONTINUE
-*
-*     Copy reordered eigenvalues to W.
-*
-      DO 50 K = 1, N
-         W( K ) = T( K, K )
-   50 CONTINUE
-*
-      WORK( 1 ) = LWMIN
-*
-      RETURN
-*
-*     End of CTRSEN
-*
-      END
--- a/libcruft/lapack/ctrsyl.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,365 +0,0 @@
-      SUBROUTINE CTRSYL( TRANA, TRANB, ISGN, M, N, A, LDA, B, LDB, C,
-     $                   LDC, SCALE, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TRANA, TRANB
-      INTEGER            INFO, ISGN, LDA, LDB, LDC, M, N
-      REAL               SCALE
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), B( LDB, * ), C( LDC, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CTRSYL solves the complex Sylvester matrix equation:
-*
-*     op(A)*X + X*op(B) = scale*C or
-*     op(A)*X - X*op(B) = scale*C,
-*
-*  where op(A) = A or A**H, and A and B are both upper triangular. A is
-*  M-by-M and B is N-by-N; the right hand side C and the solution X are
-*  M-by-N; and scale is an output scale factor, set <= 1 to avoid
-*  overflow in X.
-*
-*  Arguments
-*  =========
-*
-*  TRANA   (input) CHARACTER*1
-*          Specifies the option op(A):
-*          = 'N': op(A) = A    (No transpose)
-*          = 'C': op(A) = A**H (Conjugate transpose)
-*
-*  TRANB   (input) CHARACTER*1
-*          Specifies the option op(B):
-*          = 'N': op(B) = B    (No transpose)
-*          = 'C': op(B) = B**H (Conjugate transpose)
-*
-*  ISGN    (input) INTEGER
-*          Specifies the sign in the equation:
-*          = +1: solve op(A)*X + X*op(B) = scale*C
-*          = -1: solve op(A)*X - X*op(B) = scale*C
-*
-*  M       (input) INTEGER
-*          The order of the matrix A, and the number of rows in the
-*          matrices X and C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The order of the matrix B, and the number of columns in the
-*          matrices X and C. N >= 0.
-*
-*  A       (input) COMPLEX array, dimension (LDA,M)
-*          The upper triangular matrix A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  B       (input) COMPLEX array, dimension (LDB,N)
-*          The upper triangular matrix B.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B. LDB >= max(1,N).
-*
-*  C       (input/output) COMPLEX array, dimension (LDC,N)
-*          On entry, the M-by-N right hand side matrix C.
-*          On exit, C is overwritten by the solution matrix X.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M)
-*
-*  SCALE   (output) REAL
-*          The scale factor, scale, set <= 1 to avoid overflow in X.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          = 1: A and B have common or very close eigenvalues; perturbed
-*               values were used to solve the equation (but the matrices
-*               A and B are unchanged).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOTRNA, NOTRNB
-      INTEGER            J, K, L
-      REAL               BIGNUM, DA11, DB, EPS, SCALOC, SGN, SMIN,
-     $                   SMLNUM
-      COMPLEX            A11, SUML, SUMR, VEC, X11
-*     ..
-*     .. Local Arrays ..
-      REAL               DUM( 1 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               CLANGE, SLAMCH
-      COMPLEX            CDOTC, CDOTU, CLADIV
-      EXTERNAL           LSAME, CLANGE, SLAMCH, CDOTC, CDOTU, CLADIV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CSSCAL, SLABAD, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, AIMAG, CMPLX, CONJG, MAX, MIN, REAL
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and Test input parameters
-*
-      NOTRNA = LSAME( TRANA, 'N' )
-      NOTRNB = LSAME( TRANB, 'N' )
-*
-      INFO = 0
-      IF( .NOT.NOTRNA .AND. .NOT.LSAME( TRANA, 'C' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRNB .AND. .NOT.LSAME( TRANB, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( ISGN.NE.1 .AND. ISGN.NE.-1 ) THEN
-         INFO = -3
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -7
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -9
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -11
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CTRSYL', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Set constants to control overflow
-*
-      EPS = SLAMCH( 'P' )
-      SMLNUM = SLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SMLNUM*REAL( M*N ) / EPS
-      BIGNUM = ONE / SMLNUM
-      SMIN = MAX( SMLNUM, EPS*CLANGE( 'M', M, M, A, LDA, DUM ),
-     $       EPS*CLANGE( 'M', N, N, B, LDB, DUM ) )
-      SCALE = ONE
-      SGN = ISGN
-*
-      IF( NOTRNA .AND. NOTRNB ) THEN
-*
-*        Solve    A*X + ISGN*X*B = scale*C.
-*
-*        The (K,L)th block of X is determined starting from
-*        bottom-left corner column by column by
-*
-*            A(K,K)*X(K,L) + ISGN*X(K,L)*B(L,L) = C(K,L) - R(K,L)
-*
-*        Where
-*                    M                        L-1
-*          R(K,L) = SUM [A(K,I)*X(I,L)] +ISGN*SUM [X(K,J)*B(J,L)].
-*                  I=K+1                      J=1
-*
-         DO 30 L = 1, N
-            DO 20 K = M, 1, -1
-*
-               SUML = CDOTU( M-K, A( K, MIN( K+1, M ) ), LDA,
-     $                C( MIN( K+1, M ), L ), 1 )
-               SUMR = CDOTU( L-1, C( K, 1 ), LDC, B( 1, L ), 1 )
-               VEC = C( K, L ) - ( SUML+SGN*SUMR )
-*
-               SCALOC = ONE
-               A11 = A( K, K ) + SGN*B( L, L )
-               DA11 = ABS( REAL( A11 ) ) + ABS( AIMAG( A11 ) )
-               IF( DA11.LE.SMIN ) THEN
-                  A11 = SMIN
-                  DA11 = SMIN
-                  INFO = 1
-               END IF
-               DB = ABS( REAL( VEC ) ) + ABS( AIMAG( VEC ) )
-               IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
-                  IF( DB.GT.BIGNUM*DA11 )
-     $               SCALOC = ONE / DB
-               END IF
-               X11 = CLADIV( VEC*CMPLX( SCALOC ), A11 )
-*
-               IF( SCALOC.NE.ONE ) THEN
-                  DO 10 J = 1, N
-                     CALL CSSCAL( M, SCALOC, C( 1, J ), 1 )
-   10             CONTINUE
-                  SCALE = SCALE*SCALOC
-               END IF
-               C( K, L ) = X11
-*
-   20       CONTINUE
-   30    CONTINUE
-*
-      ELSE IF( .NOT.NOTRNA .AND. NOTRNB ) THEN
-*
-*        Solve    A' *X + ISGN*X*B = scale*C.
-*
-*        The (K,L)th block of X is determined starting from
-*        upper-left corner column by column by
-*
-*            A'(K,K)*X(K,L) + ISGN*X(K,L)*B(L,L) = C(K,L) - R(K,L)
-*
-*        Where
-*                   K-1                         L-1
-*          R(K,L) = SUM [A'(I,K)*X(I,L)] + ISGN*SUM [X(K,J)*B(J,L)]
-*                   I=1                         J=1
-*
-         DO 60 L = 1, N
-            DO 50 K = 1, M
-*
-               SUML = CDOTC( K-1, A( 1, K ), 1, C( 1, L ), 1 )
-               SUMR = CDOTU( L-1, C( K, 1 ), LDC, B( 1, L ), 1 )
-               VEC = C( K, L ) - ( SUML+SGN*SUMR )
-*
-               SCALOC = ONE
-               A11 = CONJG( A( K, K ) ) + SGN*B( L, L )
-               DA11 = ABS( REAL( A11 ) ) + ABS( AIMAG( A11 ) )
-               IF( DA11.LE.SMIN ) THEN
-                  A11 = SMIN
-                  DA11 = SMIN
-                  INFO = 1
-               END IF
-               DB = ABS( REAL( VEC ) ) + ABS( AIMAG( VEC ) )
-               IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
-                  IF( DB.GT.BIGNUM*DA11 )
-     $               SCALOC = ONE / DB
-               END IF
-*
-               X11 = CLADIV( VEC*CMPLX( SCALOC ), A11 )
-*
-               IF( SCALOC.NE.ONE ) THEN
-                  DO 40 J = 1, N
-                     CALL CSSCAL( M, SCALOC, C( 1, J ), 1 )
-   40             CONTINUE
-                  SCALE = SCALE*SCALOC
-               END IF
-               C( K, L ) = X11
-*
-   50       CONTINUE
-   60    CONTINUE
-*
-      ELSE IF( .NOT.NOTRNA .AND. .NOT.NOTRNB ) THEN
-*
-*        Solve    A'*X + ISGN*X*B' = C.
-*
-*        The (K,L)th block of X is determined starting from
-*        upper-right corner column by column by
-*
-*            A'(K,K)*X(K,L) + ISGN*X(K,L)*B'(L,L) = C(K,L) - R(K,L)
-*
-*        Where
-*                    K-1
-*           R(K,L) = SUM [A'(I,K)*X(I,L)] +
-*                    I=1
-*                           N
-*                     ISGN*SUM [X(K,J)*B'(L,J)].
-*                          J=L+1
-*
-         DO 90 L = N, 1, -1
-            DO 80 K = 1, M
-*
-               SUML = CDOTC( K-1, A( 1, K ), 1, C( 1, L ), 1 )
-               SUMR = CDOTC( N-L, C( K, MIN( L+1, N ) ), LDC,
-     $                B( L, MIN( L+1, N ) ), LDB )
-               VEC = C( K, L ) - ( SUML+SGN*CONJG( SUMR ) )
-*
-               SCALOC = ONE
-               A11 = CONJG( A( K, K )+SGN*B( L, L ) )
-               DA11 = ABS( REAL( A11 ) ) + ABS( AIMAG( A11 ) )
-               IF( DA11.LE.SMIN ) THEN
-                  A11 = SMIN
-                  DA11 = SMIN
-                  INFO = 1
-               END IF
-               DB = ABS( REAL( VEC ) ) + ABS( AIMAG( VEC ) )
-               IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
-                  IF( DB.GT.BIGNUM*DA11 )
-     $               SCALOC = ONE / DB
-               END IF
-*
-               X11 = CLADIV( VEC*CMPLX( SCALOC ), A11 )
-*
-               IF( SCALOC.NE.ONE ) THEN
-                  DO 70 J = 1, N
-                     CALL CSSCAL( M, SCALOC, C( 1, J ), 1 )
-   70             CONTINUE
-                  SCALE = SCALE*SCALOC
-               END IF
-               C( K, L ) = X11
-*
-   80       CONTINUE
-   90    CONTINUE
-*
-      ELSE IF( NOTRNA .AND. .NOT.NOTRNB ) THEN
-*
-*        Solve    A*X + ISGN*X*B' = C.
-*
-*        The (K,L)th block of X is determined starting from
-*        bottom-left corner column by column by
-*
-*           A(K,K)*X(K,L) + ISGN*X(K,L)*B'(L,L) = C(K,L) - R(K,L)
-*
-*        Where
-*                    M                          N
-*          R(K,L) = SUM [A(K,I)*X(I,L)] + ISGN*SUM [X(K,J)*B'(L,J)]
-*                  I=K+1                      J=L+1
-*
-         DO 120 L = N, 1, -1
-            DO 110 K = M, 1, -1
-*
-               SUML = CDOTU( M-K, A( K, MIN( K+1, M ) ), LDA,
-     $                C( MIN( K+1, M ), L ), 1 )
-               SUMR = CDOTC( N-L, C( K, MIN( L+1, N ) ), LDC,
-     $                B( L, MIN( L+1, N ) ), LDB )
-               VEC = C( K, L ) - ( SUML+SGN*CONJG( SUMR ) )
-*
-               SCALOC = ONE
-               A11 = A( K, K ) + SGN*CONJG( B( L, L ) )
-               DA11 = ABS( REAL( A11 ) ) + ABS( AIMAG( A11 ) )
-               IF( DA11.LE.SMIN ) THEN
-                  A11 = SMIN
-                  DA11 = SMIN
-                  INFO = 1
-               END IF
-               DB = ABS( REAL( VEC ) ) + ABS( AIMAG( VEC ) )
-               IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
-                  IF( DB.GT.BIGNUM*DA11 )
-     $               SCALOC = ONE / DB
-               END IF
-*
-               X11 = CLADIV( VEC*CMPLX( SCALOC ), A11 )
-*
-               IF( SCALOC.NE.ONE ) THEN
-                  DO 100 J = 1, N
-                     CALL CSSCAL( M, SCALOC, C( 1, J ), 1 )
-  100             CONTINUE
-                  SCALE = SCALE*SCALOC
-               END IF
-               C( K, L ) = X11
-*
-  110       CONTINUE
-  120    CONTINUE
-*
-      END IF
-*
-      RETURN
-*
-*     End of CTRSYL
-*
-      END
--- a/libcruft/lapack/ctrti2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-      SUBROUTINE CTRTI2( UPLO, DIAG, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CTRTI2 computes the inverse of a complex upper or lower triangular
-*  matrix.
-*
-*  This is the Level 2 BLAS version of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the matrix A is upper or lower triangular.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  DIAG    (input) CHARACTER*1
-*          Specifies whether or not the matrix A is unit triangular.
-*          = 'N':  Non-unit triangular
-*          = 'U':  Unit triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the triangular matrix A.  If UPLO = 'U', the
-*          leading n by n upper triangular part of the array A contains
-*          the upper triangular matrix, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n by n lower triangular part of the array A contains
-*          the lower triangular matrix, and the strictly upper
-*          triangular part of A is not referenced.  If DIAG = 'U', the
-*          diagonal elements of A are also not referenced and are
-*          assumed to be 1.
-*
-*          On exit, the (triangular) inverse of the original matrix, in
-*          the same storage format.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOUNIT, UPPER
-      INTEGER            J
-      COMPLEX            AJJ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CSCAL, CTRMV, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      NOUNIT = LSAME( DIAG, 'N' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CTRTI2', -INFO )
-         RETURN
-      END IF
-*
-      IF( UPPER ) THEN
-*
-*        Compute inverse of upper triangular matrix.
-*
-         DO 10 J = 1, N
-            IF( NOUNIT ) THEN
-               A( J, J ) = ONE / A( J, J )
-               AJJ = -A( J, J )
-            ELSE
-               AJJ = -ONE
-            END IF
-*
-*           Compute elements 1:j-1 of j-th column.
-*
-            CALL CTRMV( 'Upper', 'No transpose', DIAG, J-1, A, LDA,
-     $                  A( 1, J ), 1 )
-            CALL CSCAL( J-1, AJJ, A( 1, J ), 1 )
-   10    CONTINUE
-      ELSE
-*
-*        Compute inverse of lower triangular matrix.
-*
-         DO 20 J = N, 1, -1
-            IF( NOUNIT ) THEN
-               A( J, J ) = ONE / A( J, J )
-               AJJ = -A( J, J )
-            ELSE
-               AJJ = -ONE
-            END IF
-            IF( J.LT.N ) THEN
-*
-*              Compute elements j+1:n of j-th column.
-*
-               CALL CTRMV( 'Lower', 'No transpose', DIAG, N-J,
-     $                     A( J+1, J+1 ), LDA, A( J+1, J ), 1 )
-               CALL CSCAL( N-J, AJJ, A( J+1, J ), 1 )
-            END IF
-   20    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of CTRTI2
-*
-      END
--- a/libcruft/lapack/ctrtri.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,177 +0,0 @@
-      SUBROUTINE CTRTRI( UPLO, DIAG, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CTRTRI computes the inverse of a complex upper or lower triangular
-*  matrix A.
-*
-*  This is the Level 3 BLAS version of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  A is upper triangular;
-*          = 'L':  A is lower triangular.
-*
-*  DIAG    (input) CHARACTER*1
-*          = 'N':  A is non-unit triangular;
-*          = 'U':  A is unit triangular.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the triangular matrix A.  If UPLO = 'U', the
-*          leading N-by-N upper triangular part of the array A contains
-*          the upper triangular matrix, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading N-by-N lower triangular part of the array A contains
-*          the lower triangular matrix, and the strictly upper
-*          triangular part of A is not referenced.  If DIAG = 'U', the
-*          diagonal elements of A are also not referenced and are
-*          assumed to be 1.
-*          On exit, the (triangular) inverse of the original matrix, in
-*          the same storage format.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = i, A(i,i) is exactly zero.  The triangular
-*               matrix is singular and its inverse can not be computed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ),
-     $                   ZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOUNIT, UPPER
-      INTEGER            J, JB, NB, NN
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CTRMM, CTRSM, CTRTI2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      NOUNIT = LSAME( DIAG, 'N' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CTRTRI', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Check for singularity if non-unit.
-*
-      IF( NOUNIT ) THEN
-         DO 10 INFO = 1, N
-            IF( A( INFO, INFO ).EQ.ZERO )
-     $         RETURN
-   10    CONTINUE
-         INFO = 0
-      END IF
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'CTRTRI', UPLO // DIAG, N, -1, -1, -1 )
-      IF( NB.LE.1 .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code
-*
-         CALL CTRTI2( UPLO, DIAG, N, A, LDA, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( UPPER ) THEN
-*
-*           Compute inverse of upper triangular matrix
-*
-            DO 20 J = 1, N, NB
-               JB = MIN( NB, N-J+1 )
-*
-*              Compute rows 1:j-1 of current block column
-*
-               CALL CTRMM( 'Left', 'Upper', 'No transpose', DIAG, J-1,
-     $                     JB, ONE, A, LDA, A( 1, J ), LDA )
-               CALL CTRSM( 'Right', 'Upper', 'No transpose', DIAG, J-1,
-     $                     JB, -ONE, A( J, J ), LDA, A( 1, J ), LDA )
-*
-*              Compute inverse of current diagonal block
-*
-               CALL CTRTI2( 'Upper', DIAG, JB, A( J, J ), LDA, INFO )
-   20       CONTINUE
-         ELSE
-*
-*           Compute inverse of lower triangular matrix
-*
-            NN = ( ( N-1 ) / NB )*NB + 1
-            DO 30 J = NN, 1, -NB
-               JB = MIN( NB, N-J+1 )
-               IF( J+JB.LE.N ) THEN
-*
-*                 Compute rows j+jb:n of current block column
-*
-                  CALL CTRMM( 'Left', 'Lower', 'No transpose', DIAG,
-     $                        N-J-JB+1, JB, ONE, A( J+JB, J+JB ), LDA,
-     $                        A( J+JB, J ), LDA )
-                  CALL CTRSM( 'Right', 'Lower', 'No transpose', DIAG,
-     $                        N-J-JB+1, JB, -ONE, A( J, J ), LDA,
-     $                        A( J+JB, J ), LDA )
-               END IF
-*
-*              Compute inverse of current diagonal block
-*
-               CALL CTRTI2( 'Lower', DIAG, JB, A( J, J ), LDA, INFO )
-   30       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of CTRTRI
-*
-      END
--- a/libcruft/lapack/ctrtrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-      SUBROUTINE CTRTRS( UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, TRANS, UPLO
-      INTEGER            INFO, LDA, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CTRTRS solves a triangular system of the form
-*
-*     A * X = B,  A**T * X = B,  or  A**H * X = B,
-*
-*  where A is a triangular matrix of order N, and B is an N-by-NRHS
-*  matrix.  A check is made to verify that A is nonsingular.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  A is upper triangular;
-*          = 'L':  A is lower triangular.
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the form of the system of equations:
-*          = 'N':  A * X = B     (No transpose)
-*          = 'T':  A**T * X = B  (Transpose)
-*          = 'C':  A**H * X = B  (Conjugate transpose)
-*
-*  DIAG    (input) CHARACTER*1
-*          = 'N':  A is non-unit triangular;
-*          = 'U':  A is unit triangular.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  A       (input) COMPLEX array, dimension (LDA,N)
-*          The triangular matrix A.  If UPLO = 'U', the leading N-by-N
-*          upper triangular part of the array A contains the upper
-*          triangular matrix, and the strictly lower triangular part of
-*          A is not referenced.  If UPLO = 'L', the leading N-by-N lower
-*          triangular part of the array A contains the lower triangular
-*          matrix, and the strictly upper triangular part of A is not
-*          referenced.  If DIAG = 'U', the diagonal elements of A are
-*          also not referenced and are assumed to be 1.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input/output) COMPLEX array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, if INFO = 0, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = i, the i-th diagonal element of A is zero,
-*               indicating that the matrix is singular and the solutions
-*               X have not been computed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ),
-     $                   ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOUNIT
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CTRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      NOUNIT = LSAME( DIAG, 'N' )
-      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND. .NOT.
-     $         LSAME( TRANS, 'T' ) .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -9
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CTRTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Check for singularity.
-*
-      IF( NOUNIT ) THEN
-         DO 10 INFO = 1, N
-            IF( A( INFO, INFO ).EQ.ZERO )
-     $         RETURN
-   10    CONTINUE
-      END IF
-      INFO = 0
-*
-*     Solve A * x = b,  A**T * x = b,  or  A**H * x = b.
-*
-      CALL CTRSM( 'Left', UPLO, TRANS, DIAG, N, NRHS, ONE, A, LDA, B,
-     $            LDB )
-*
-      RETURN
-*
-*     End of CTRTRS
-*
-      END
--- a/libcruft/lapack/ctzrzf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,246 +0,0 @@
-      SUBROUTINE CTZRZF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CTZRZF reduces the M-by-N ( M<=N ) complex upper trapezoidal matrix A
-*  to upper triangular form by means of unitary transformations.
-*
-*  The upper trapezoidal matrix A is factored as
-*
-*     A = ( R  0 ) * Z,
-*
-*  where Z is an N-by-N unitary matrix and R is an M-by-M upper
-*  triangular matrix.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= M.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the leading M-by-N upper trapezoidal part of the
-*          array A must contain the matrix to be factorized.
-*          On exit, the leading M-by-M upper triangular part of A
-*          contains the upper triangular matrix R, and elements M+1 to
-*          N of the first M rows of A, with the array TAU, represent the
-*          unitary matrix Z as a product of M elementary reflectors.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) COMPLEX array, dimension (M)
-*          The scalar factors of the elementary reflectors.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,M).
-*          For optimum performance LWORK >= M*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  The factorization is obtained by Householder's method.  The kth
-*  transformation matrix, Z( k ), which is used to introduce zeros into
-*  the ( m - k + 1 )th row of A, is given in the form
-*
-*     Z( k ) = ( I     0   ),
-*              ( 0  T( k ) )
-*
-*  where
-*
-*     T( k ) = I - tau*u( k )*u( k )',   u( k ) = (   1    ),
-*                                                 (   0    )
-*                                                 ( z( k ) )
-*
-*  tau is a scalar and z( k ) is an ( n - m ) element vector.
-*  tau and z( k ) are chosen to annihilate the elements of the kth row
-*  of X.
-*
-*  The scalar tau is returned in the kth element of TAU and the vector
-*  u( k ) in the kth row of A, such that the elements of z( k ) are
-*  in  a( k, m + 1 ), ..., a( k, n ). The elements of R are returned in
-*  the upper triangular part of A.
-*
-*  Z is given by
-*
-*     Z =  Z( 1 ) * Z( 2 ) * ... * Z( m ).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IWS, KI, KK, LDWORK, LWKOPT, M1, MU, NB,
-     $                   NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLARZB, CLARZT, CLATRZ, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.M ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
-         INFO = -7
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( M.EQ.0 .OR. M.EQ.N ) THEN
-            LWKOPT = 1
-         ELSE
-*
-*           Determine the block size.
-*
-            NB = ILAENV( 1, 'CGERQF', ' ', M, N, -1, -1 )
-            LWKOPT = M*NB
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
-            INFO = -7
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CTZRZF', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 ) THEN
-         RETURN
-      ELSE IF( M.EQ.N ) THEN
-         DO 10 I = 1, N
-            TAU( I ) = ZERO
-   10    CONTINUE
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 1
-      IWS = M
-      IF( NB.GT.1 .AND. NB.LT.M ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'CGERQF', ' ', M, N, -1, -1 ) )
-         IF( NX.LT.M ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = M
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'CGERQF', ' ', M, N, -1,
-     $                 -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.M .AND. NX.LT.M ) THEN
-*
-*        Use blocked code initially.
-*        The last kk rows are handled by the block method.
-*
-         M1 = MIN( M+1, N )
-         KI = ( ( M-NX-1 ) / NB )*NB
-         KK = MIN( M, KI+NB )
-*
-         DO 20 I = M - KK + KI + 1, M - KK + 1, -NB
-            IB = MIN( M-I+1, NB )
-*
-*           Compute the TZ factorization of the current block
-*           A(i:i+ib-1,i:n)
-*
-            CALL CLATRZ( IB, N-I+1, N-M, A( I, I ), LDA, TAU( I ),
-     $                   WORK )
-            IF( I.GT.1 ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i+ib-1) . . . H(i+1) H(i)
-*
-               CALL CLARZT( 'Backward', 'Rowwise', N-M, IB, A( I, M1 ),
-     $                      LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H to A(1:i-1,i:n) from the right
-*
-               CALL CLARZB( 'Right', 'No transpose', 'Backward',
-     $                      'Rowwise', I-1, N-I+1, IB, N-M, A( I, M1 ),
-     $                      LDA, WORK, LDWORK, A( 1, I ), LDA,
-     $                      WORK( IB+1 ), LDWORK )
-            END IF
-   20    CONTINUE
-         MU = I + NB - 1
-      ELSE
-         MU = M
-      END IF
-*
-*     Use unblocked code to factor the last or only block
-*
-      IF( MU.GT.0 )
-     $   CALL CLATRZ( MU, N, N-M, A, LDA, TAU, WORK )
-*
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of CTZRZF
-*
-      END
--- a/libcruft/lapack/cung2l.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,128 +0,0 @@
-      SUBROUTINE CUNG2L( M, N, K, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CUNG2L generates an m by n complex matrix Q with orthonormal columns,
-*  which is defined as the last n columns of a product of k elementary
-*  reflectors of order m
-*
-*        Q  =  H(k) . . . H(2) H(1)
-*
-*  as returned by CGEQLF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. M >= N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. N >= K >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the (n-k+i)-th column must contain the vector which
-*          defines the elementary reflector H(i), for i = 1,2,...,k, as
-*          returned by CGEQLF in the last k columns of its array
-*          argument A.
-*          On exit, the m-by-n matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) COMPLEX array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by CGEQLF.
-*
-*  WORK    (workspace) COMPLEX array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ),
-     $                   ZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, II, J, L
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLARF, CSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CUNG2L', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-*     Initialise columns 1:n-k to columns of the unit matrix
-*
-      DO 20 J = 1, N - K
-         DO 10 L = 1, M
-            A( L, J ) = ZERO
-   10    CONTINUE
-         A( M-N+J, J ) = ONE
-   20 CONTINUE
-*
-      DO 40 I = 1, K
-         II = N - K + I
-*
-*        Apply H(i) to A(1:m-k+i,1:n-k+i) from the left
-*
-         A( M-N+II, II ) = ONE
-         CALL CLARF( 'Left', M-N+II, II-1, A( 1, II ), 1, TAU( I ), A,
-     $               LDA, WORK )
-         CALL CSCAL( M-N+II-1, -TAU( I ), A( 1, II ), 1 )
-         A( M-N+II, II ) = ONE - TAU( I )
-*
-*        Set A(m-k+i+1:m,n-k+i) to zero
-*
-         DO 30 L = M - N + II + 1, M
-            A( L, II ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-      RETURN
-*
-*     End of CUNG2L
-*
-      END
--- a/libcruft/lapack/cung2r.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,130 +0,0 @@
-      SUBROUTINE CUNG2R( M, N, K, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CUNG2R generates an m by n complex matrix Q with orthonormal columns,
-*  which is defined as the first n columns of a product of k elementary
-*  reflectors of order m
-*
-*        Q  =  H(1) H(2) . . . H(k)
-*
-*  as returned by CGEQRF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. M >= N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. N >= K >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the i-th column must contain the vector which
-*          defines the elementary reflector H(i), for i = 1,2,...,k, as
-*          returned by CGEQRF in the first k columns of its array
-*          argument A.
-*          On exit, the m by n matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) COMPLEX array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by CGEQRF.
-*
-*  WORK    (workspace) COMPLEX array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ),
-     $                   ZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J, L
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLARF, CSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CUNG2R', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-*     Initialise columns k+1:n to columns of the unit matrix
-*
-      DO 20 J = K + 1, N
-         DO 10 L = 1, M
-            A( L, J ) = ZERO
-   10    CONTINUE
-         A( J, J ) = ONE
-   20 CONTINUE
-*
-      DO 40 I = K, 1, -1
-*
-*        Apply H(i) to A(i:m,i:n) from the left
-*
-         IF( I.LT.N ) THEN
-            A( I, I ) = ONE
-            CALL CLARF( 'Left', M-I+1, N-I, A( I, I ), 1, TAU( I ),
-     $                  A( I, I+1 ), LDA, WORK )
-         END IF
-         IF( I.LT.M )
-     $      CALL CSCAL( M-I, -TAU( I ), A( I+1, I ), 1 )
-         A( I, I ) = ONE - TAU( I )
-*
-*        Set A(1:i-1,i) to zero
-*
-         DO 30 L = 1, I - 1
-            A( L, I ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-      RETURN
-*
-*     End of CUNG2R
-*
-      END
--- a/libcruft/lapack/cungbr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,245 +0,0 @@
-      SUBROUTINE CUNGBR( VECT, M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          VECT
-      INTEGER            INFO, K, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CUNGBR generates one of the complex unitary matrices Q or P**H
-*  determined by CGEBRD when reducing a complex matrix A to bidiagonal
-*  form: A = Q * B * P**H.  Q and P**H are defined as products of
-*  elementary reflectors H(i) or G(i) respectively.
-*
-*  If VECT = 'Q', A is assumed to have been an M-by-K matrix, and Q
-*  is of order M:
-*  if m >= k, Q = H(1) H(2) . . . H(k) and CUNGBR returns the first n
-*  columns of Q, where m >= n >= k;
-*  if m < k, Q = H(1) H(2) . . . H(m-1) and CUNGBR returns Q as an
-*  M-by-M matrix.
-*
-*  If VECT = 'P', A is assumed to have been a K-by-N matrix, and P**H
-*  is of order N:
-*  if k < n, P**H = G(k) . . . G(2) G(1) and CUNGBR returns the first m
-*  rows of P**H, where n >= m >= k;
-*  if k >= n, P**H = G(n-1) . . . G(2) G(1) and CUNGBR returns P**H as
-*  an N-by-N matrix.
-*
-*  Arguments
-*  =========
-*
-*  VECT    (input) CHARACTER*1
-*          Specifies whether the matrix Q or the matrix P**H is
-*          required, as defined in the transformation applied by CGEBRD:
-*          = 'Q':  generate Q;
-*          = 'P':  generate P**H.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q or P**H to be returned.
-*          M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q or P**H to be returned.
-*          N >= 0.
-*          If VECT = 'Q', M >= N >= min(M,K);
-*          if VECT = 'P', N >= M >= min(N,K).
-*
-*  K       (input) INTEGER
-*          If VECT = 'Q', the number of columns in the original M-by-K
-*          matrix reduced by CGEBRD.
-*          If VECT = 'P', the number of rows in the original K-by-N
-*          matrix reduced by CGEBRD.
-*          K >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the vectors which define the elementary reflectors,
-*          as returned by CGEBRD.
-*          On exit, the M-by-N matrix Q or P**H.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= M.
-*
-*  TAU     (input) COMPLEX array, dimension
-*                                (min(M,K)) if VECT = 'Q'
-*                                (min(N,K)) if VECT = 'P'
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i) or G(i), which determines Q or P**H, as
-*          returned by CGEBRD in its array argument TAUQ or TAUP.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,min(M,N)).
-*          For optimum performance LWORK >= min(M,N)*NB, where NB
-*          is the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ),
-     $                   ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, WANTQ
-      INTEGER            I, IINFO, J, LWKOPT, MN, NB
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV, LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CUNGLQ, CUNGQR, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      WANTQ = LSAME( VECT, 'Q' )
-      MN = MIN( M, N )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( .NOT.WANTQ .AND. .NOT.LSAME( VECT, 'P' ) ) THEN
-         INFO = -1
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 .OR. ( WANTQ .AND. ( N.GT.M .OR. N.LT.MIN( M,
-     $         K ) ) ) .OR. ( .NOT.WANTQ .AND. ( M.GT.N .OR. M.LT.
-     $         MIN( N, K ) ) ) ) THEN
-         INFO = -3
-      ELSE IF( K.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -6
-      ELSE IF( LWORK.LT.MAX( 1, MN ) .AND. .NOT.LQUERY ) THEN
-         INFO = -9
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( WANTQ ) THEN
-            NB = ILAENV( 1, 'CUNGQR', ' ', M, N, K, -1 )
-         ELSE
-            NB = ILAENV( 1, 'CUNGLQ', ' ', M, N, K, -1 )
-         END IF
-         LWKOPT = MAX( 1, MN )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CUNGBR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      IF( WANTQ ) THEN
-*
-*        Form Q, determined by a call to CGEBRD to reduce an m-by-k
-*        matrix
-*
-         IF( M.GE.K ) THEN
-*
-*           If m >= k, assume m >= n >= k
-*
-            CALL CUNGQR( M, N, K, A, LDA, TAU, WORK, LWORK, IINFO )
-*
-         ELSE
-*
-*           If m < k, assume m = n
-*
-*           Shift the vectors which define the elementary reflectors one
-*           column to the right, and set the first row and column of Q
-*           to those of the unit matrix
-*
-            DO 20 J = M, 2, -1
-               A( 1, J ) = ZERO
-               DO 10 I = J + 1, M
-                  A( I, J ) = A( I, J-1 )
-   10          CONTINUE
-   20       CONTINUE
-            A( 1, 1 ) = ONE
-            DO 30 I = 2, M
-               A( I, 1 ) = ZERO
-   30       CONTINUE
-            IF( M.GT.1 ) THEN
-*
-*              Form Q(2:m,2:m)
-*
-               CALL CUNGQR( M-1, M-1, M-1, A( 2, 2 ), LDA, TAU, WORK,
-     $                      LWORK, IINFO )
-            END IF
-         END IF
-      ELSE
-*
-*        Form P', determined by a call to CGEBRD to reduce a k-by-n
-*        matrix
-*
-         IF( K.LT.N ) THEN
-*
-*           If k < n, assume k <= m <= n
-*
-            CALL CUNGLQ( M, N, K, A, LDA, TAU, WORK, LWORK, IINFO )
-*
-         ELSE
-*
-*           If k >= n, assume m = n
-*
-*           Shift the vectors which define the elementary reflectors one
-*           row downward, and set the first row and column of P' to
-*           those of the unit matrix
-*
-            A( 1, 1 ) = ONE
-            DO 40 I = 2, N
-               A( I, 1 ) = ZERO
-   40       CONTINUE
-            DO 60 J = 2, N
-               DO 50 I = J - 1, 2, -1
-                  A( I, J ) = A( I-1, J )
-   50          CONTINUE
-               A( 1, J ) = ZERO
-   60       CONTINUE
-            IF( N.GT.1 ) THEN
-*
-*              Form P'(2:n,2:n)
-*
-               CALL CUNGLQ( N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK,
-     $                      LWORK, IINFO )
-            END IF
-         END IF
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of CUNGBR
-*
-      END
--- a/libcruft/lapack/cunghr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,165 +0,0 @@
-      SUBROUTINE CUNGHR( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, ILO, INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CUNGHR generates a complex unitary matrix Q which is defined as the
-*  product of IHI-ILO elementary reflectors of order N, as returned by
-*  CGEHRD:
-*
-*  Q = H(ilo) H(ilo+1) . . . H(ihi-1).
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix Q. N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          ILO and IHI must have the same values as in the previous call
-*          of CGEHRD. Q is equal to the unit matrix except in the
-*          submatrix Q(ilo+1:ihi,ilo+1:ihi).
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the vectors which define the elementary reflectors,
-*          as returned by CGEHRD.
-*          On exit, the N-by-N unitary matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,N).
-*
-*  TAU     (input) COMPLEX array, dimension (N-1)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by CGEHRD.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= IHI-ILO.
-*          For optimum performance LWORK >= (IHI-ILO)*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ),
-     $                   ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IINFO, J, LWKOPT, NB, NH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CUNGQR, XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NH = IHI - ILO
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -2
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LWORK.LT.MAX( 1, NH ) .AND. .NOT.LQUERY ) THEN
-         INFO = -8
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         NB = ILAENV( 1, 'CUNGQR', ' ', NH, NH, NH, -1 )
-         LWKOPT = MAX( 1, NH )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CUNGHR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-*     Shift the vectors which define the elementary reflectors one
-*     column to the right, and set the first ilo and the last n-ihi
-*     rows and columns to those of the unit matrix
-*
-      DO 40 J = IHI, ILO + 1, -1
-         DO 10 I = 1, J - 1
-            A( I, J ) = ZERO
-   10    CONTINUE
-         DO 20 I = J + 1, IHI
-            A( I, J ) = A( I, J-1 )
-   20    CONTINUE
-         DO 30 I = IHI + 1, N
-            A( I, J ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-      DO 60 J = 1, ILO
-         DO 50 I = 1, N
-            A( I, J ) = ZERO
-   50    CONTINUE
-         A( J, J ) = ONE
-   60 CONTINUE
-      DO 80 J = IHI + 1, N
-         DO 70 I = 1, N
-            A( I, J ) = ZERO
-   70    CONTINUE
-         A( J, J ) = ONE
-   80 CONTINUE
-*
-      IF( NH.GT.0 ) THEN
-*
-*        Generate Q(ilo+1:ihi,ilo+1:ihi)
-*
-         CALL CUNGQR( NH, NH, NH, A( ILO+1, ILO+1 ), LDA, TAU( ILO ),
-     $                WORK, LWORK, IINFO )
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of CUNGHR
-*
-      END
--- a/libcruft/lapack/cungl2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,136 +0,0 @@
-      SUBROUTINE CUNGL2( M, N, K, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CUNGL2 generates an m-by-n complex matrix Q with orthonormal rows,
-*  which is defined as the first m rows of a product of k elementary
-*  reflectors of order n
-*
-*        Q  =  H(k)' . . . H(2)' H(1)'
-*
-*  as returned by CGELQF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. N >= M.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. M >= K >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the i-th row must contain the vector which defines
-*          the elementary reflector H(i), for i = 1,2,...,k, as returned
-*          by CGELQF in the first k rows of its array argument A.
-*          On exit, the m by n matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) COMPLEX array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by CGELQF.
-*
-*  WORK    (workspace) COMPLEX array, dimension (M)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ),
-     $                   ZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J, L
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLACGV, CLARF, CSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CONJG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.M ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CUNGL2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 )
-     $   RETURN
-*
-      IF( K.LT.M ) THEN
-*
-*        Initialise rows k+1:m to rows of the unit matrix
-*
-         DO 20 J = 1, N
-            DO 10 L = K + 1, M
-               A( L, J ) = ZERO
-   10       CONTINUE
-            IF( J.GT.K .AND. J.LE.M )
-     $         A( J, J ) = ONE
-   20    CONTINUE
-      END IF
-*
-      DO 40 I = K, 1, -1
-*
-*        Apply H(i)' to A(i:m,i:n) from the right
-*
-         IF( I.LT.N ) THEN
-            CALL CLACGV( N-I, A( I, I+1 ), LDA )
-            IF( I.LT.M ) THEN
-               A( I, I ) = ONE
-               CALL CLARF( 'Right', M-I, N-I+1, A( I, I ), LDA,
-     $                     CONJG( TAU( I ) ), A( I+1, I ), LDA, WORK )
-            END IF
-            CALL CSCAL( N-I, -TAU( I ), A( I, I+1 ), LDA )
-            CALL CLACGV( N-I, A( I, I+1 ), LDA )
-         END IF
-         A( I, I ) = ONE - CONJG( TAU( I ) )
-*
-*        Set A(i,1:i-1,i) to zero
-*
-         DO 30 L = 1, I - 1
-            A( I, L ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-      RETURN
-*
-*     End of CUNGL2
-*
-      END
--- a/libcruft/lapack/cunglq.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,215 +0,0 @@
-      SUBROUTINE CUNGLQ( M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CUNGLQ generates an M-by-N complex matrix Q with orthonormal rows,
-*  which is defined as the first M rows of a product of K elementary
-*  reflectors of order N
-*
-*        Q  =  H(k)' . . . H(2)' H(1)'
-*
-*  as returned by CGELQF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. N >= M.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. M >= K >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the i-th row must contain the vector which defines
-*          the elementary reflector H(i), for i = 1,2,...,k, as returned
-*          by CGELQF in the first k rows of its array argument A.
-*          On exit, the M-by-N matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) COMPLEX array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by CGELQF.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,M).
-*          For optimum performance LWORK >= M*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit;
-*          < 0:  if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, J, KI, KK, L, LDWORK,
-     $                   LWKOPT, NB, NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLARFB, CLARFT, CUNGL2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NB = ILAENV( 1, 'CUNGLQ', ' ', M, N, K, -1 )
-      LWKOPT = MAX( 1, M )*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.M ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CUNGLQ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = M
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'CUNGLQ', ' ', M, N, K, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = M
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'CUNGLQ', ' ', M, N, K, -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code after the last block.
-*        The first kk rows are handled by the block method.
-*
-         KI = ( ( K-NX-1 ) / NB )*NB
-         KK = MIN( K, KI+NB )
-*
-*        Set A(kk+1:m,1:kk) to zero.
-*
-         DO 20 J = 1, KK
-            DO 10 I = KK + 1, M
-               A( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-      ELSE
-         KK = 0
-      END IF
-*
-*     Use unblocked code for the last or only block.
-*
-      IF( KK.LT.M )
-     $   CALL CUNGL2( M-KK, N-KK, K-KK, A( KK+1, KK+1 ), LDA,
-     $                TAU( KK+1 ), WORK, IINFO )
-*
-      IF( KK.GT.0 ) THEN
-*
-*        Use blocked code
-*
-         DO 50 I = KI + 1, 1, -NB
-            IB = MIN( NB, K-I+1 )
-            IF( I+IB.LE.M ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i) H(i+1) . . . H(i+ib-1)
-*
-               CALL CLARFT( 'Forward', 'Rowwise', N-I+1, IB, A( I, I ),
-     $                      LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H' to A(i+ib:m,i:n) from the right
-*
-               CALL CLARFB( 'Right', 'Conjugate transpose', 'Forward',
-     $                      'Rowwise', M-I-IB+1, N-I+1, IB, A( I, I ),
-     $                      LDA, WORK, LDWORK, A( I+IB, I ), LDA,
-     $                      WORK( IB+1 ), LDWORK )
-            END IF
-*
-*           Apply H' to columns i:n of current block
-*
-            CALL CUNGL2( IB, N-I+1, IB, A( I, I ), LDA, TAU( I ), WORK,
-     $                   IINFO )
-*
-*           Set columns 1:i-1 of current block to zero
-*
-            DO 40 J = 1, I - 1
-               DO 30 L = I, I + IB - 1
-                  A( L, J ) = ZERO
-   30          CONTINUE
-   40       CONTINUE
-   50    CONTINUE
-      END IF
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of CUNGLQ
-*
-      END
--- a/libcruft/lapack/cungql.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,222 +0,0 @@
-      SUBROUTINE CUNGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CUNGQL generates an M-by-N complex matrix Q with orthonormal columns,
-*  which is defined as the last N columns of a product of K elementary
-*  reflectors of order M
-*
-*        Q  =  H(k) . . . H(2) H(1)
-*
-*  as returned by CGEQLF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. M >= N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. N >= K >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the (n-k+i)-th column must contain the vector which
-*          defines the elementary reflector H(i), for i = 1,2,...,k, as
-*          returned by CGEQLF in the last k columns of its array
-*          argument A.
-*          On exit, the M-by-N matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) COMPLEX array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by CGEQLF.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,N).
-*          For optimum performance LWORK >= N*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, J, KK, L, LDWORK, LWKOPT,
-     $                   NB, NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLARFB, CLARFT, CUNG2L, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( N.EQ.0 ) THEN
-            LWKOPT = 1
-         ELSE
-            NB = ILAENV( 1, 'CUNGQL', ' ', M, N, K, -1 )
-            LWKOPT = N*NB
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-            INFO = -8
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CUNGQL', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 ) THEN
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = N
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'CUNGQL', ' ', M, N, K, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = N
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'CUNGQL', ' ', M, N, K, -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code after the first block.
-*        The last kk columns are handled by the block method.
-*
-         KK = MIN( K, ( ( K-NX+NB-1 ) / NB )*NB )
-*
-*        Set A(m-kk+1:m,1:n-kk) to zero.
-*
-         DO 20 J = 1, N - KK
-            DO 10 I = M - KK + 1, M
-               A( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-      ELSE
-         KK = 0
-      END IF
-*
-*     Use unblocked code for the first or only block.
-*
-      CALL CUNG2L( M-KK, N-KK, K-KK, A, LDA, TAU, WORK, IINFO )
-*
-      IF( KK.GT.0 ) THEN
-*
-*        Use blocked code
-*
-         DO 50 I = K - KK + 1, K, NB
-            IB = MIN( NB, K-I+1 )
-            IF( N-K+I.GT.1 ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i+ib-1) . . . H(i+1) H(i)
-*
-               CALL CLARFT( 'Backward', 'Columnwise', M-K+I+IB-1, IB,
-     $                      A( 1, N-K+I ), LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H to A(1:m-k+i+ib-1,1:n-k+i-1) from the left
-*
-               CALL CLARFB( 'Left', 'No transpose', 'Backward',
-     $                      'Columnwise', M-K+I+IB-1, N-K+I-1, IB,
-     $                      A( 1, N-K+I ), LDA, WORK, LDWORK, A, LDA,
-     $                      WORK( IB+1 ), LDWORK )
-            END IF
-*
-*           Apply H to rows 1:m-k+i+ib-1 of current block
-*
-            CALL CUNG2L( M-K+I+IB-1, IB, IB, A( 1, N-K+I ), LDA,
-     $                   TAU( I ), WORK, IINFO )
-*
-*           Set rows m-k+i+ib:m of current block to zero
-*
-            DO 40 J = N - K + I, N - K + I + IB - 1
-               DO 30 L = M - K + I + IB, M
-                  A( L, J ) = ZERO
-   30          CONTINUE
-   40       CONTINUE
-   50    CONTINUE
-      END IF
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of CUNGQL
-*
-      END
--- a/libcruft/lapack/cungqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,216 +0,0 @@
-      SUBROUTINE CUNGQR( M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CUNGQR generates an M-by-N complex matrix Q with orthonormal columns,
-*  which is defined as the first N columns of a product of K elementary
-*  reflectors of order M
-*
-*        Q  =  H(1) H(2) . . . H(k)
-*
-*  as returned by CGEQRF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. M >= N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. N >= K >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the i-th column must contain the vector which
-*          defines the elementary reflector H(i), for i = 1,2,...,k, as
-*          returned by CGEQRF in the first k columns of its array
-*          argument A.
-*          On exit, the M-by-N matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) COMPLEX array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by CGEQRF.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,N).
-*          For optimum performance LWORK >= N*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, J, KI, KK, L, LDWORK,
-     $                   LWKOPT, NB, NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLARFB, CLARFT, CUNG2R, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NB = ILAENV( 1, 'CUNGQR', ' ', M, N, K, -1 )
-      LWKOPT = MAX( 1, N )*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CUNGQR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = N
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'CUNGQR', ' ', M, N, K, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = N
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'CUNGQR', ' ', M, N, K, -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code after the last block.
-*        The first kk columns are handled by the block method.
-*
-         KI = ( ( K-NX-1 ) / NB )*NB
-         KK = MIN( K, KI+NB )
-*
-*        Set A(1:kk,kk+1:n) to zero.
-*
-         DO 20 J = KK + 1, N
-            DO 10 I = 1, KK
-               A( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-      ELSE
-         KK = 0
-      END IF
-*
-*     Use unblocked code for the last or only block.
-*
-      IF( KK.LT.N )
-     $   CALL CUNG2R( M-KK, N-KK, K-KK, A( KK+1, KK+1 ), LDA,
-     $                TAU( KK+1 ), WORK, IINFO )
-*
-      IF( KK.GT.0 ) THEN
-*
-*        Use blocked code
-*
-         DO 50 I = KI + 1, 1, -NB
-            IB = MIN( NB, K-I+1 )
-            IF( I+IB.LE.N ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i) H(i+1) . . . H(i+ib-1)
-*
-               CALL CLARFT( 'Forward', 'Columnwise', M-I+1, IB,
-     $                      A( I, I ), LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H to A(i:m,i+ib:n) from the left
-*
-               CALL CLARFB( 'Left', 'No transpose', 'Forward',
-     $                      'Columnwise', M-I+1, N-I-IB+1, IB,
-     $                      A( I, I ), LDA, WORK, LDWORK, A( I, I+IB ),
-     $                      LDA, WORK( IB+1 ), LDWORK )
-            END IF
-*
-*           Apply H to rows i:m of current block
-*
-            CALL CUNG2R( M-I+1, IB, IB, A( I, I ), LDA, TAU( I ), WORK,
-     $                   IINFO )
-*
-*           Set rows 1:i-1 of current block to zero
-*
-            DO 40 J = I, I + IB - 1
-               DO 30 L = 1, I - 1
-                  A( L, J ) = ZERO
-   30          CONTINUE
-   40       CONTINUE
-   50    CONTINUE
-      END IF
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of CUNGQR
-*
-      END
--- a/libcruft/lapack/cungtr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,184 +0,0 @@
-      SUBROUTINE CUNGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CUNGTR generates a complex unitary matrix Q which is defined as the
-*  product of n-1 elementary reflectors of order N, as returned by
-*  CHETRD:
-*
-*  if UPLO = 'U', Q = H(n-1) . . . H(2) H(1),
-*
-*  if UPLO = 'L', Q = H(1) H(2) . . . H(n-1).
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U': Upper triangle of A contains elementary reflectors
-*                 from CHETRD;
-*          = 'L': Lower triangle of A contains elementary reflectors
-*                 from CHETRD.
-*
-*  N       (input) INTEGER
-*          The order of the matrix Q. N >= 0.
-*
-*  A       (input/output) COMPLEX array, dimension (LDA,N)
-*          On entry, the vectors which define the elementary reflectors,
-*          as returned by CHETRD.
-*          On exit, the N-by-N unitary matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= N.
-*
-*  TAU     (input) COMPLEX array, dimension (N-1)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by CHETRD.
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= N-1.
-*          For optimum performance LWORK >= (N-1)*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ),
-     $                   ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, UPPER
-      INTEGER            I, IINFO, J, LWKOPT, NB
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV, LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CUNGQL, CUNGQR, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.MAX( 1, N-1 ) .AND. .NOT.LQUERY ) THEN
-         INFO = -7
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF ( UPPER ) THEN
-           NB = ILAENV( 1, 'CUNGQL', ' ', N-1, N-1, N-1, -1 )
-         ELSE
-           NB = ILAENV( 1, 'CUNGQR', ' ', N-1, N-1, N-1, -1 )
-         END IF
-         LWKOPT = MAX( 1, N-1 )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CUNGTR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      IF( UPPER ) THEN
-*
-*        Q was determined by a call to CHETRD with UPLO = 'U'
-*
-*        Shift the vectors which define the elementary reflectors one
-*        column to the left, and set the last row and column of Q to
-*        those of the unit matrix
-*
-         DO 20 J = 1, N - 1
-            DO 10 I = 1, J - 1
-               A( I, J ) = A( I, J+1 )
-   10       CONTINUE
-            A( N, J ) = ZERO
-   20    CONTINUE
-         DO 30 I = 1, N - 1
-            A( I, N ) = ZERO
-   30    CONTINUE
-         A( N, N ) = ONE
-*
-*        Generate Q(1:n-1,1:n-1)
-*
-         CALL CUNGQL( N-1, N-1, N-1, A, LDA, TAU, WORK, LWORK, IINFO )
-*
-      ELSE
-*
-*        Q was determined by a call to CHETRD with UPLO = 'L'.
-*
-*        Shift the vectors which define the elementary reflectors one
-*        column to the right, and set the first row and column of Q to
-*        those of the unit matrix
-*
-         DO 50 J = N, 2, -1
-            A( 1, J ) = ZERO
-            DO 40 I = J + 1, N
-               A( I, J ) = A( I, J-1 )
-   40       CONTINUE
-   50    CONTINUE
-         A( 1, 1 ) = ONE
-         DO 60 I = 2, N
-            A( I, 1 ) = ZERO
-   60    CONTINUE
-         IF( N.GT.1 ) THEN
-*
-*           Generate Q(2:n,2:n)
-*
-            CALL CUNGQR( N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK,
-     $                   LWORK, IINFO )
-         END IF
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of CUNGTR
-*
-      END
--- a/libcruft/lapack/cunm2r.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,201 +0,0 @@
-      SUBROUTINE CUNM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, LDA, LDC, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CUNM2R overwrites the general complex m-by-n matrix C with
-*
-*        Q * C  if SIDE = 'L' and TRANS = 'N', or
-*
-*        Q'* C  if SIDE = 'L' and TRANS = 'C', or
-*
-*        C * Q  if SIDE = 'R' and TRANS = 'N', or
-*
-*        C * Q' if SIDE = 'R' and TRANS = 'C',
-*
-*  where Q is a complex unitary matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(1) H(2) . . . H(k)
-*
-*  as returned by CGEQRF. Q is of order m if SIDE = 'L' and of order n
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q' from the Left
-*          = 'R': apply Q or Q' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply Q  (No transpose)
-*          = 'C': apply Q' (Conjugate transpose)
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  A       (input) COMPLEX array, dimension (LDA,K)
-*          The i-th column must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          CGEQRF in the first k columns of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.
-*          If SIDE = 'L', LDA >= max(1,M);
-*          if SIDE = 'R', LDA >= max(1,N).
-*
-*  TAU     (input) COMPLEX array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by CGEQRF.
-*
-*  C       (input/output) COMPLEX array, dimension (LDC,N)
-*          On entry, the m-by-n matrix C.
-*          On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) COMPLEX array, dimension
-*                                   (N) if SIDE = 'L',
-*                                   (M) if SIDE = 'R'
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, NOTRAN
-      INTEGER            I, I1, I2, I3, IC, JC, MI, NI, NQ
-      COMPLEX            AII, TAUI
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLARF, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CONJG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-*
-*     NQ is the order of Q
-*
-      IF( LEFT ) THEN
-         NQ = M
-      ELSE
-         NQ = N
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN
-         INFO = -7
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CUNM2R', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 )
-     $   RETURN
-*
-      IF( ( LEFT .AND. .NOT.NOTRAN .OR. .NOT.LEFT .AND. NOTRAN ) ) THEN
-         I1 = 1
-         I2 = K
-         I3 = 1
-      ELSE
-         I1 = K
-         I2 = 1
-         I3 = -1
-      END IF
-*
-      IF( LEFT ) THEN
-         NI = N
-         JC = 1
-      ELSE
-         MI = M
-         IC = 1
-      END IF
-*
-      DO 10 I = I1, I2, I3
-         IF( LEFT ) THEN
-*
-*           H(i) or H(i)' is applied to C(i:m,1:n)
-*
-            MI = M - I + 1
-            IC = I
-         ELSE
-*
-*           H(i) or H(i)' is applied to C(1:m,i:n)
-*
-            NI = N - I + 1
-            JC = I
-         END IF
-*
-*        Apply H(i) or H(i)'
-*
-         IF( NOTRAN ) THEN
-            TAUI = TAU( I )
-         ELSE
-            TAUI = CONJG( TAU( I ) )
-         END IF
-         AII = A( I, I )
-         A( I, I ) = ONE
-         CALL CLARF( SIDE, MI, NI, A( I, I ), 1, TAUI, C( IC, JC ), LDC,
-     $               WORK )
-         A( I, I ) = AII
-   10 CONTINUE
-      RETURN
-*
-*     End of CUNM2R
-*
-      END
--- a/libcruft/lapack/cunmbr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,289 +0,0 @@
-      SUBROUTINE CUNMBR( VECT, SIDE, TRANS, M, N, K, A, LDA, TAU, C,
-     $                   LDC, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS, VECT
-      INTEGER            INFO, K, LDA, LDC, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), C( LDC, * ), TAU( * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  If VECT = 'Q', CUNMBR overwrites the general complex M-by-N matrix C
-*  with
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      Q * C          C * Q
-*  TRANS = 'C':      Q**H * C       C * Q**H
-*
-*  If VECT = 'P', CUNMBR overwrites the general complex M-by-N matrix C
-*  with
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      P * C          C * P
-*  TRANS = 'C':      P**H * C       C * P**H
-*
-*  Here Q and P**H are the unitary matrices determined by CGEBRD when
-*  reducing a complex matrix A to bidiagonal form: A = Q * B * P**H. Q
-*  and P**H are defined as products of elementary reflectors H(i) and
-*  G(i) respectively.
-*
-*  Let nq = m if SIDE = 'L' and nq = n if SIDE = 'R'. Thus nq is the
-*  order of the unitary matrix Q or P**H that is applied.
-*
-*  If VECT = 'Q', A is assumed to have been an NQ-by-K matrix:
-*  if nq >= k, Q = H(1) H(2) . . . H(k);
-*  if nq < k, Q = H(1) H(2) . . . H(nq-1).
-*
-*  If VECT = 'P', A is assumed to have been a K-by-NQ matrix:
-*  if k < nq, P = G(1) G(2) . . . G(k);
-*  if k >= nq, P = G(1) G(2) . . . G(nq-1).
-*
-*  Arguments
-*  =========
-*
-*  VECT    (input) CHARACTER*1
-*          = 'Q': apply Q or Q**H;
-*          = 'P': apply P or P**H.
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q, Q**H, P or P**H from the Left;
-*          = 'R': apply Q, Q**H, P or P**H from the Right.
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N':  No transpose, apply Q or P;
-*          = 'C':  Conjugate transpose, apply Q**H or P**H.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          If VECT = 'Q', the number of columns in the original
-*          matrix reduced by CGEBRD.
-*          If VECT = 'P', the number of rows in the original
-*          matrix reduced by CGEBRD.
-*          K >= 0.
-*
-*  A       (input) COMPLEX array, dimension
-*                                (LDA,min(nq,K)) if VECT = 'Q'
-*                                (LDA,nq)        if VECT = 'P'
-*          The vectors which define the elementary reflectors H(i) and
-*          G(i), whose products determine the matrices Q and P, as
-*          returned by CGEBRD.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.
-*          If VECT = 'Q', LDA >= max(1,nq);
-*          if VECT = 'P', LDA >= max(1,min(nq,K)).
-*
-*  TAU     (input) COMPLEX array, dimension (min(nq,K))
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i) or G(i) which determines Q or P, as returned
-*          by CGEBRD in the array argument TAUQ or TAUP.
-*
-*  C       (input/output) COMPLEX array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q
-*          or P*C or P**H*C or C*P or C*P**H.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If SIDE = 'L', LWORK >= max(1,N);
-*          if SIDE = 'R', LWORK >= max(1,M);
-*          if N = 0 or M = 0, LWORK >= 1.
-*          For optimum performance LWORK >= max(1,N*NB) if SIDE = 'L',
-*          and LWORK >= max(1,M*NB) if SIDE = 'R', where NB is the
-*          optimal blocksize. (NB = 0 if M = 0 or N = 0.)
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            APPLYQ, LEFT, LQUERY, NOTRAN
-      CHARACTER          TRANST
-      INTEGER            I1, I2, IINFO, LWKOPT, MI, NB, NI, NQ, NW
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV, LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CUNMLQ, CUNMQR, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      APPLYQ = LSAME( VECT, 'Q' )
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-*     NQ is the order of Q or P and NW is the minimum dimension of WORK
-*
-      IF( LEFT ) THEN
-         NQ = M
-         NW = N
-      ELSE
-         NQ = N
-         NW = M
-      END IF
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         NW = 0
-      END IF
-      IF( .NOT.APPLYQ .AND. .NOT.LSAME( VECT, 'P' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -3
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( K.LT.0 ) THEN
-         INFO = -6
-      ELSE IF( ( APPLYQ .AND. LDA.LT.MAX( 1, NQ ) ) .OR.
-     $         ( .NOT.APPLYQ .AND. LDA.LT.MAX( 1, MIN( NQ, K ) ) ) )
-     $          THEN
-         INFO = -8
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -11
-      ELSE IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
-         INFO = -13
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( NW.GT.0 ) THEN
-            IF( APPLYQ ) THEN
-               IF( LEFT ) THEN
-                  NB = ILAENV( 1, 'CUNMQR', SIDE // TRANS, M-1, N, M-1,
-     $                         -1 )
-               ELSE
-                  NB = ILAENV( 1, 'CUNMQR', SIDE // TRANS, M, N-1, N-1,
-     $                         -1 )
-               END IF
-            ELSE
-               IF( LEFT ) THEN
-                  NB = ILAENV( 1, 'CUNMLQ', SIDE // TRANS, M-1, N, M-1,
-     $                         -1 )
-               ELSE
-                  NB = ILAENV( 1, 'CUNMLQ', SIDE // TRANS, M, N-1, N-1,
-     $                         -1 )
-               END IF
-            END IF
-            LWKOPT = MAX( 1, NW*NB )
-         ELSE
-            LWKOPT = 1
-         END IF
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CUNMBR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-      IF( APPLYQ ) THEN
-*
-*        Apply Q
-*
-         IF( NQ.GE.K ) THEN
-*
-*           Q was determined by a call to CGEBRD with nq >= k
-*
-            CALL CUNMQR( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, IINFO )
-         ELSE IF( NQ.GT.1 ) THEN
-*
-*           Q was determined by a call to CGEBRD with nq < k
-*
-            IF( LEFT ) THEN
-               MI = M - 1
-               NI = N
-               I1 = 2
-               I2 = 1
-            ELSE
-               MI = M
-               NI = N - 1
-               I1 = 1
-               I2 = 2
-            END IF
-            CALL CUNMQR( SIDE, TRANS, MI, NI, NQ-1, A( 2, 1 ), LDA, TAU,
-     $                   C( I1, I2 ), LDC, WORK, LWORK, IINFO )
-         END IF
-      ELSE
-*
-*        Apply P
-*
-         IF( NOTRAN ) THEN
-            TRANST = 'C'
-         ELSE
-            TRANST = 'N'
-         END IF
-         IF( NQ.GT.K ) THEN
-*
-*           P was determined by a call to CGEBRD with nq > k
-*
-            CALL CUNMLQ( SIDE, TRANST, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, IINFO )
-         ELSE IF( NQ.GT.1 ) THEN
-*
-*           P was determined by a call to CGEBRD with nq <= k
-*
-            IF( LEFT ) THEN
-               MI = M - 1
-               NI = N
-               I1 = 2
-               I2 = 1
-            ELSE
-               MI = M
-               NI = N - 1
-               I1 = 1
-               I2 = 2
-            END IF
-            CALL CUNMLQ( SIDE, TRANST, MI, NI, NQ-1, A( 1, 2 ), LDA,
-     $                   TAU, C( I1, I2 ), LDC, WORK, LWORK, IINFO )
-         END IF
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of CUNMBR
-*
-      END
--- a/libcruft/lapack/cunml2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,205 +0,0 @@
-      SUBROUTINE CUNML2( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, LDA, LDC, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CUNML2 overwrites the general complex m-by-n matrix C with
-*
-*        Q * C  if SIDE = 'L' and TRANS = 'N', or
-*
-*        Q'* C  if SIDE = 'L' and TRANS = 'C', or
-*
-*        C * Q  if SIDE = 'R' and TRANS = 'N', or
-*
-*        C * Q' if SIDE = 'R' and TRANS = 'C',
-*
-*  where Q is a complex unitary matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(k)' . . . H(2)' H(1)'
-*
-*  as returned by CGELQF. Q is of order m if SIDE = 'L' and of order n
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q' from the Left
-*          = 'R': apply Q or Q' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply Q  (No transpose)
-*          = 'C': apply Q' (Conjugate transpose)
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  A       (input) COMPLEX array, dimension
-*                               (LDA,M) if SIDE = 'L',
-*                               (LDA,N) if SIDE = 'R'
-*          The i-th row must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          CGELQF in the first k rows of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,K).
-*
-*  TAU     (input) COMPLEX array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by CGELQF.
-*
-*  C       (input/output) COMPLEX array, dimension (LDC,N)
-*          On entry, the m-by-n matrix C.
-*          On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) COMPLEX array, dimension
-*                                   (N) if SIDE = 'L',
-*                                   (M) if SIDE = 'R'
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX            ONE
-      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, NOTRAN
-      INTEGER            I, I1, I2, I3, IC, JC, MI, NI, NQ
-      COMPLEX            AII, TAUI
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLACGV, CLARF, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CONJG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-*
-*     NQ is the order of Q
-*
-      IF( LEFT ) THEN
-         NQ = M
-      ELSE
-         NQ = N
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
-         INFO = -7
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CUNML2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 )
-     $   RETURN
-*
-      IF( ( LEFT .AND. NOTRAN .OR. .NOT.LEFT .AND. .NOT.NOTRAN ) ) THEN
-         I1 = 1
-         I2 = K
-         I3 = 1
-      ELSE
-         I1 = K
-         I2 = 1
-         I3 = -1
-      END IF
-*
-      IF( LEFT ) THEN
-         NI = N
-         JC = 1
-      ELSE
-         MI = M
-         IC = 1
-      END IF
-*
-      DO 10 I = I1, I2, I3
-         IF( LEFT ) THEN
-*
-*           H(i) or H(i)' is applied to C(i:m,1:n)
-*
-            MI = M - I + 1
-            IC = I
-         ELSE
-*
-*           H(i) or H(i)' is applied to C(1:m,i:n)
-*
-            NI = N - I + 1
-            JC = I
-         END IF
-*
-*        Apply H(i) or H(i)'
-*
-         IF( NOTRAN ) THEN
-            TAUI = CONJG( TAU( I ) )
-         ELSE
-            TAUI = TAU( I )
-         END IF
-         IF( I.LT.NQ )
-     $      CALL CLACGV( NQ-I, A( I, I+1 ), LDA )
-         AII = A( I, I )
-         A( I, I ) = ONE
-         CALL CLARF( SIDE, MI, NI, A( I, I ), LDA, TAUI, C( IC, JC ),
-     $               LDC, WORK )
-         A( I, I ) = AII
-         IF( I.LT.NQ )
-     $      CALL CLACGV( NQ-I, A( I, I+1 ), LDA )
-   10 CONTINUE
-      RETURN
-*
-*     End of CUNML2
-*
-      END
--- a/libcruft/lapack/cunmlq.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,268 +0,0 @@
-      SUBROUTINE CUNMLQ( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, LDA, LDC, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), C( LDC, * ), TAU( * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CUNMLQ overwrites the general complex M-by-N matrix C with
-*
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      Q * C          C * Q
-*  TRANS = 'C':      Q**H * C       C * Q**H
-*
-*  where Q is a complex unitary matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(k)' . . . H(2)' H(1)'
-*
-*  as returned by CGELQF. Q is of order M if SIDE = 'L' and of order N
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q**H from the Left;
-*          = 'R': apply Q or Q**H from the Right.
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N':  No transpose, apply Q;
-*          = 'C':  Conjugate transpose, apply Q**H.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  A       (input) COMPLEX array, dimension
-*                               (LDA,M) if SIDE = 'L',
-*                               (LDA,N) if SIDE = 'R'
-*          The i-th row must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          CGELQF in the first k rows of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,K).
-*
-*  TAU     (input) COMPLEX array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by CGELQF.
-*
-*  C       (input/output) COMPLEX array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If SIDE = 'L', LWORK >= max(1,N);
-*          if SIDE = 'R', LWORK >= max(1,M).
-*          For optimum performance LWORK >= N*NB if SIDE 'L', and
-*          LWORK >= M*NB if SIDE = 'R', where NB is the optimal
-*          blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            NBMAX, LDT
-      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, LQUERY, NOTRAN
-      CHARACTER          TRANST
-      INTEGER            I, I1, I2, I3, IB, IC, IINFO, IWS, JC, LDWORK,
-     $                   LWKOPT, MI, NB, NBMIN, NI, NQ, NW
-*     ..
-*     .. Local Arrays ..
-      COMPLEX            T( LDT, NBMAX )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLARFB, CLARFT, CUNML2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-*     NQ is the order of Q and NW is the minimum dimension of WORK
-*
-      IF( LEFT ) THEN
-         NQ = M
-         NW = N
-      ELSE
-         NQ = N
-         NW = M
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
-         INFO = -7
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -10
-      ELSE IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
-         INFO = -12
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-*
-*        Determine the block size.  NB may be at most NBMAX, where NBMAX
-*        is used to define the local array T.
-*
-         NB = MIN( NBMAX, ILAENV( 1, 'CUNMLQ', SIDE // TRANS, M, N, K,
-     $             -1 ) )
-         LWKOPT = MAX( 1, NW )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CUNMLQ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      LDWORK = NW
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-         IWS = NW*NB
-         IF( LWORK.LT.IWS ) THEN
-            NB = LWORK / LDWORK
-            NBMIN = MAX( 2, ILAENV( 2, 'CUNMLQ', SIDE // TRANS, M, N, K,
-     $              -1 ) )
-         END IF
-      ELSE
-         IWS = NW
-      END IF
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
-*
-*        Use unblocked code
-*
-         CALL CUNML2( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK,
-     $                IINFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( ( LEFT .AND. NOTRAN ) .OR.
-     $       ( .NOT.LEFT .AND. .NOT.NOTRAN ) ) THEN
-            I1 = 1
-            I2 = K
-            I3 = NB
-         ELSE
-            I1 = ( ( K-1 ) / NB )*NB + 1
-            I2 = 1
-            I3 = -NB
-         END IF
-*
-         IF( LEFT ) THEN
-            NI = N
-            JC = 1
-         ELSE
-            MI = M
-            IC = 1
-         END IF
-*
-         IF( NOTRAN ) THEN
-            TRANST = 'C'
-         ELSE
-            TRANST = 'N'
-         END IF
-*
-         DO 10 I = I1, I2, I3
-            IB = MIN( NB, K-I+1 )
-*
-*           Form the triangular factor of the block reflector
-*           H = H(i) H(i+1) . . . H(i+ib-1)
-*
-            CALL CLARFT( 'Forward', 'Rowwise', NQ-I+1, IB, A( I, I ),
-     $                   LDA, TAU( I ), T, LDT )
-            IF( LEFT ) THEN
-*
-*              H or H' is applied to C(i:m,1:n)
-*
-               MI = M - I + 1
-               IC = I
-            ELSE
-*
-*              H or H' is applied to C(1:m,i:n)
-*
-               NI = N - I + 1
-               JC = I
-            END IF
-*
-*           Apply H or H'
-*
-            CALL CLARFB( SIDE, TRANST, 'Forward', 'Rowwise', MI, NI, IB,
-     $                   A( I, I ), LDA, T, LDT, C( IC, JC ), LDC, WORK,
-     $                   LDWORK )
-   10    CONTINUE
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of CUNMLQ
-*
-      END
--- a/libcruft/lapack/cunmqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,261 +0,0 @@
-      SUBROUTINE CUNMQR( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, LDA, LDC, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), C( LDC, * ), TAU( * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CUNMQR overwrites the general complex M-by-N matrix C with
-*
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      Q * C          C * Q
-*  TRANS = 'C':      Q**H * C       C * Q**H
-*
-*  where Q is a complex unitary matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(1) H(2) . . . H(k)
-*
-*  as returned by CGEQRF. Q is of order M if SIDE = 'L' and of order N
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q**H from the Left;
-*          = 'R': apply Q or Q**H from the Right.
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N':  No transpose, apply Q;
-*          = 'C':  Conjugate transpose, apply Q**H.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  A       (input) COMPLEX array, dimension (LDA,K)
-*          The i-th column must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          CGEQRF in the first k columns of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.
-*          If SIDE = 'L', LDA >= max(1,M);
-*          if SIDE = 'R', LDA >= max(1,N).
-*
-*  TAU     (input) COMPLEX array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by CGEQRF.
-*
-*  C       (input/output) COMPLEX array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If SIDE = 'L', LWORK >= max(1,N);
-*          if SIDE = 'R', LWORK >= max(1,M).
-*          For optimum performance LWORK >= N*NB if SIDE = 'L', and
-*          LWORK >= M*NB if SIDE = 'R', where NB is the optimal
-*          blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            NBMAX, LDT
-      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, LQUERY, NOTRAN
-      INTEGER            I, I1, I2, I3, IB, IC, IINFO, IWS, JC, LDWORK,
-     $                   LWKOPT, MI, NB, NBMIN, NI, NQ, NW
-*     ..
-*     .. Local Arrays ..
-      COMPLEX            T( LDT, NBMAX )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLARFB, CLARFT, CUNM2R, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-*     NQ is the order of Q and NW is the minimum dimension of WORK
-*
-      IF( LEFT ) THEN
-         NQ = M
-         NW = N
-      ELSE
-         NQ = N
-         NW = M
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN
-         INFO = -7
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -10
-      ELSE IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
-         INFO = -12
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-*
-*        Determine the block size.  NB may be at most NBMAX, where NBMAX
-*        is used to define the local array T.
-*
-         NB = MIN( NBMAX, ILAENV( 1, 'CUNMQR', SIDE // TRANS, M, N, K,
-     $        -1 ) )
-         LWKOPT = MAX( 1, NW )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CUNMQR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      LDWORK = NW
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-         IWS = NW*NB
-         IF( LWORK.LT.IWS ) THEN
-            NB = LWORK / LDWORK
-            NBMIN = MAX( 2, ILAENV( 2, 'CUNMQR', SIDE // TRANS, M, N, K,
-     $              -1 ) )
-         END IF
-      ELSE
-         IWS = NW
-      END IF
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
-*
-*        Use unblocked code
-*
-         CALL CUNM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK,
-     $                IINFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( ( LEFT .AND. .NOT.NOTRAN ) .OR.
-     $       ( .NOT.LEFT .AND. NOTRAN ) ) THEN
-            I1 = 1
-            I2 = K
-            I3 = NB
-         ELSE
-            I1 = ( ( K-1 ) / NB )*NB + 1
-            I2 = 1
-            I3 = -NB
-         END IF
-*
-         IF( LEFT ) THEN
-            NI = N
-            JC = 1
-         ELSE
-            MI = M
-            IC = 1
-         END IF
-*
-         DO 10 I = I1, I2, I3
-            IB = MIN( NB, K-I+1 )
-*
-*           Form the triangular factor of the block reflector
-*           H = H(i) H(i+1) . . . H(i+ib-1)
-*
-            CALL CLARFT( 'Forward', 'Columnwise', NQ-I+1, IB, A( I, I ),
-     $                   LDA, TAU( I ), T, LDT )
-            IF( LEFT ) THEN
-*
-*              H or H' is applied to C(i:m,1:n)
-*
-               MI = M - I + 1
-               IC = I
-            ELSE
-*
-*              H or H' is applied to C(1:m,i:n)
-*
-               NI = N - I + 1
-               JC = I
-            END IF
-*
-*           Apply H or H'
-*
-            CALL CLARFB( SIDE, TRANS, 'Forward', 'Columnwise', MI, NI,
-     $                   IB, A( I, I ), LDA, T, LDT, C( IC, JC ), LDC,
-     $                   WORK, LDWORK )
-   10    CONTINUE
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of CUNMQR
-*
-      END
--- a/libcruft/lapack/cunmr3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,212 +0,0 @@
-      SUBROUTINE CUNMR3( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC,
-     $                   WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, L, LDA, LDC, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CUNMR3 overwrites the general complex m by n matrix C with
-*
-*        Q * C  if SIDE = 'L' and TRANS = 'N', or
-*
-*        Q'* C  if SIDE = 'L' and TRANS = 'C', or
-*
-*        C * Q  if SIDE = 'R' and TRANS = 'N', or
-*
-*        C * Q' if SIDE = 'R' and TRANS = 'C',
-*
-*  where Q is a complex unitary matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(1) H(2) . . . H(k)
-*
-*  as returned by CTZRZF. Q is of order m if SIDE = 'L' and of order n
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q' from the Left
-*          = 'R': apply Q or Q' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply Q  (No transpose)
-*          = 'C': apply Q' (Conjugate transpose)
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  L       (input) INTEGER
-*          The number of columns of the matrix A containing
-*          the meaningful part of the Householder reflectors.
-*          If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
-*
-*  A       (input) COMPLEX array, dimension
-*                               (LDA,M) if SIDE = 'L',
-*                               (LDA,N) if SIDE = 'R'
-*          The i-th row must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          CTZRZF in the last k rows of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,K).
-*
-*  TAU     (input) COMPLEX array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by CTZRZF.
-*
-*  C       (input/output) COMPLEX array, dimension (LDC,N)
-*          On entry, the m-by-n matrix C.
-*          On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) COMPLEX array, dimension
-*                                   (N) if SIDE = 'L',
-*                                   (M) if SIDE = 'R'
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            LEFT, NOTRAN
-      INTEGER            I, I1, I2, I3, IC, JA, JC, MI, NI, NQ
-      COMPLEX            TAUI
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLARZ, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CONJG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-*
-*     NQ is the order of Q
-*
-      IF( LEFT ) THEN
-         NQ = M
-      ELSE
-         NQ = N
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( L.LT.0 .OR. ( LEFT .AND. ( L.GT.M ) ) .OR.
-     $         ( .NOT.LEFT .AND. ( L.GT.N ) ) ) THEN
-         INFO = -6
-      ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
-         INFO = -8
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -11
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CUNMR3', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 )
-     $   RETURN
-*
-      IF( ( LEFT .AND. .NOT.NOTRAN .OR. .NOT.LEFT .AND. NOTRAN ) ) THEN
-         I1 = 1
-         I2 = K
-         I3 = 1
-      ELSE
-         I1 = K
-         I2 = 1
-         I3 = -1
-      END IF
-*
-      IF( LEFT ) THEN
-         NI = N
-         JA = M - L + 1
-         JC = 1
-      ELSE
-         MI = M
-         JA = N - L + 1
-         IC = 1
-      END IF
-*
-      DO 10 I = I1, I2, I3
-         IF( LEFT ) THEN
-*
-*           H(i) or H(i)' is applied to C(i:m,1:n)
-*
-            MI = M - I + 1
-            IC = I
-         ELSE
-*
-*           H(i) or H(i)' is applied to C(1:m,i:n)
-*
-            NI = N - I + 1
-            JC = I
-         END IF
-*
-*        Apply H(i) or H(i)'
-*
-         IF( NOTRAN ) THEN
-            TAUI = TAU( I )
-         ELSE
-            TAUI = CONJG( TAU( I ) )
-         END IF
-         CALL CLARZ( SIDE, MI, NI, L, A( I, JA ), LDA, TAUI,
-     $               C( IC, JC ), LDC, WORK )
-*
-   10 CONTINUE
-*
-      RETURN
-*
-*     End of CUNMR3
-*
-      END
--- a/libcruft/lapack/cunmrz.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,297 +0,0 @@
-      SUBROUTINE CUNMRZ( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     January 2007
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, L, LDA, LDC, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  CUNMRZ overwrites the general complex M-by-N matrix C with
-*
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      Q * C          C * Q
-*  TRANS = 'C':      Q**H * C       C * Q**H
-*
-*  where Q is a complex unitary matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(1) H(2) . . . H(k)
-*
-*  as returned by CTZRZF. Q is of order M if SIDE = 'L' and of order N
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q**H from the Left;
-*          = 'R': apply Q or Q**H from the Right.
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N':  No transpose, apply Q;
-*          = 'C':  Conjugate transpose, apply Q**H.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  L       (input) INTEGER
-*          The number of columns of the matrix A containing
-*          the meaningful part of the Householder reflectors.
-*          If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
-*
-*  A       (input) COMPLEX array, dimension
-*                               (LDA,M) if SIDE = 'L',
-*                               (LDA,N) if SIDE = 'R'
-*          The i-th row must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          CTZRZF in the last k rows of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,K).
-*
-*  TAU     (input) COMPLEX array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by CTZRZF.
-*
-*  C       (input/output) COMPLEX array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace/output) COMPLEX array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If SIDE = 'L', LWORK >= max(1,N);
-*          if SIDE = 'R', LWORK >= max(1,M).
-*          For optimum performance LWORK >= N*NB if SIDE = 'L', and
-*          LWORK >= M*NB if SIDE = 'R', where NB is the optimal
-*          blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            NBMAX, LDT
-      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, LQUERY, NOTRAN
-      CHARACTER          TRANST
-      INTEGER            I, I1, I2, I3, IB, IC, IINFO, IWS, JA, JC,
-     $                   LDWORK, LWKOPT, MI, NB, NBMIN, NI, NQ, NW
-*     ..
-*     .. Local Arrays ..
-      COMPLEX            T( LDT, NBMAX )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           CLARZB, CLARZT, CUNMR3, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-*     NQ is the order of Q and NW is the minimum dimension of WORK
-*
-      IF( LEFT ) THEN
-         NQ = M
-         NW = MAX( 1, N )
-      ELSE
-         NQ = N
-         NW = MAX( 1, M )
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( L.LT.0 .OR. ( LEFT .AND. ( L.GT.M ) ) .OR.
-     $         ( .NOT.LEFT .AND. ( L.GT.N ) ) ) THEN
-         INFO = -6
-      ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
-         INFO = -8
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -11
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-            LWKOPT = 1
-         ELSE
-*
-*           Determine the block size.  NB may be at most NBMAX, where
-*           NBMAX is used to define the local array T.
-*
-            NB = MIN( NBMAX, ILAENV( 1, 'CUNMRQ', SIDE // TRANS, M, N,
-     $                               K, -1 ) )
-            LWKOPT = NW*NB
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
-            INFO = -13
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'CUNMRZ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         RETURN
-      END IF
-*
-*     Determine the block size.  NB may be at most NBMAX, where NBMAX
-*     is used to define the local array T.
-*
-      NB = MIN( NBMAX, ILAENV( 1, 'CUNMRQ', SIDE // TRANS, M, N, K,
-     $     -1 ) )
-      NBMIN = 2
-      LDWORK = NW
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-         IWS = NW*NB
-         IF( LWORK.LT.IWS ) THEN
-            NB = LWORK / LDWORK
-            NBMIN = MAX( 2, ILAENV( 2, 'CUNMRQ', SIDE // TRANS, M, N, K,
-     $              -1 ) )
-         END IF
-      ELSE
-         IWS = NW
-      END IF
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
-*
-*        Use unblocked code
-*
-         CALL CUNMR3( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC,
-     $                WORK, IINFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( ( LEFT .AND. .NOT.NOTRAN ) .OR.
-     $       ( .NOT.LEFT .AND. NOTRAN ) ) THEN
-            I1 = 1
-            I2 = K
-            I3 = NB
-         ELSE
-            I1 = ( ( K-1 ) / NB )*NB + 1
-            I2 = 1
-            I3 = -NB
-         END IF
-*
-         IF( LEFT ) THEN
-            NI = N
-            JC = 1
-            JA = M - L + 1
-         ELSE
-            MI = M
-            IC = 1
-            JA = N - L + 1
-         END IF
-*
-         IF( NOTRAN ) THEN
-            TRANST = 'C'
-         ELSE
-            TRANST = 'N'
-         END IF
-*
-         DO 10 I = I1, I2, I3
-            IB = MIN( NB, K-I+1 )
-*
-*           Form the triangular factor of the block reflector
-*           H = H(i+ib-1) . . . H(i+1) H(i)
-*
-            CALL CLARZT( 'Backward', 'Rowwise', L, IB, A( I, JA ), LDA,
-     $                   TAU( I ), T, LDT )
-*
-            IF( LEFT ) THEN
-*
-*              H or H' is applied to C(i:m,1:n)
-*
-               MI = M - I + 1
-               IC = I
-            ELSE
-*
-*              H or H' is applied to C(1:m,i:n)
-*
-               NI = N - I + 1
-               JC = I
-            END IF
-*
-*           Apply H or H'
-*
-            CALL CLARZB( SIDE, TRANST, 'Backward', 'Rowwise', MI, NI,
-     $                   IB, L, A( I, JA ), LDA, T, LDT, C( IC, JC ),
-     $                   LDC, WORK, LDWORK )
-   10    CONTINUE
-*
-      END IF
-*
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of CUNMRZ
-*
-      END
--- a/libcruft/lapack/dbdsqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,742 +0,0 @@
-      SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
-     $                   LDU, C, LDC, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     January 2007
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   C( LDC, * ), D( * ), E( * ), U( LDU, * ),
-     $                   VT( LDVT, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DBDSQR computes the singular values and, optionally, the right and/or
-*  left singular vectors from the singular value decomposition (SVD) of
-*  a real N-by-N (upper or lower) bidiagonal matrix B using the implicit
-*  zero-shift QR algorithm.  The SVD of B has the form
-* 
-*     B = Q * S * P**T
-* 
-*  where S is the diagonal matrix of singular values, Q is an orthogonal
-*  matrix of left singular vectors, and P is an orthogonal matrix of
-*  right singular vectors.  If left singular vectors are requested, this
-*  subroutine actually returns U*Q instead of Q, and, if right singular
-*  vectors are requested, this subroutine returns P**T*VT instead of
-*  P**T, for given real input matrices U and VT.  When U and VT are the
-*  orthogonal matrices that reduce a general matrix A to bidiagonal
-*  form:  A = U*B*VT, as computed by DGEBRD, then
-*
-*     A = (U*Q) * S * (P**T*VT)
-*
-*  is the SVD of A.  Optionally, the subroutine may also compute Q**T*C
-*  for a given real input matrix C.
-*
-*  See "Computing  Small Singular Values of Bidiagonal Matrices With
-*  Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan,
-*  LAPACK Working Note #3 (or SIAM J. Sci. Statist. Comput. vol. 11,
-*  no. 5, pp. 873-912, Sept 1990) and
-*  "Accurate singular values and differential qd algorithms," by
-*  B. Parlett and V. Fernando, Technical Report CPAM-554, Mathematics
-*  Department, University of California at Berkeley, July 1992
-*  for a detailed description of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  B is upper bidiagonal;
-*          = 'L':  B is lower bidiagonal.
-*
-*  N       (input) INTEGER
-*          The order of the matrix B.  N >= 0.
-*
-*  NCVT    (input) INTEGER
-*          The number of columns of the matrix VT. NCVT >= 0.
-*
-*  NRU     (input) INTEGER
-*          The number of rows of the matrix U. NRU >= 0.
-*
-*  NCC     (input) INTEGER
-*          The number of columns of the matrix C. NCC >= 0.
-*
-*  D       (input/output) DOUBLE PRECISION array, dimension (N)
-*          On entry, the n diagonal elements of the bidiagonal matrix B.
-*          On exit, if INFO=0, the singular values of B in decreasing
-*          order.
-*
-*  E       (input/output) DOUBLE PRECISION array, dimension (N-1)
-*          On entry, the N-1 offdiagonal elements of the bidiagonal
-*          matrix B. 
-*          On exit, if INFO = 0, E is destroyed; if INFO > 0, D and E
-*          will contain the diagonal and superdiagonal elements of a
-*          bidiagonal matrix orthogonally equivalent to the one given
-*          as input.
-*
-*  VT      (input/output) DOUBLE PRECISION array, dimension (LDVT, NCVT)
-*          On entry, an N-by-NCVT matrix VT.
-*          On exit, VT is overwritten by P**T * VT.
-*          Not referenced if NCVT = 0.
-*
-*  LDVT    (input) INTEGER
-*          The leading dimension of the array VT.
-*          LDVT >= max(1,N) if NCVT > 0; LDVT >= 1 if NCVT = 0.
-*
-*  U       (input/output) DOUBLE PRECISION array, dimension (LDU, N)
-*          On entry, an NRU-by-N matrix U.
-*          On exit, U is overwritten by U * Q.
-*          Not referenced if NRU = 0.
-*
-*  LDU     (input) INTEGER
-*          The leading dimension of the array U.  LDU >= max(1,NRU).
-*
-*  C       (input/output) DOUBLE PRECISION array, dimension (LDC, NCC)
-*          On entry, an N-by-NCC matrix C.
-*          On exit, C is overwritten by Q**T * C.
-*          Not referenced if NCC = 0.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C.
-*          LDC >= max(1,N) if NCC > 0; LDC >=1 if NCC = 0.
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (2*N)
-*          if NCVT = NRU = NCC = 0, (max(1, 4*N)) otherwise
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  If INFO = -i, the i-th argument had an illegal value
-*          > 0:  the algorithm did not converge; D and E contain the
-*                elements of a bidiagonal matrix which is orthogonally
-*                similar to the input matrix B;  if INFO = i, i
-*                elements of E have not converged to zero.
-*
-*  Internal Parameters
-*  ===================
-*
-*  TOLMUL  DOUBLE PRECISION, default = max(10,min(100,EPS**(-1/8)))
-*          TOLMUL controls the convergence criterion of the QR loop.
-*          If it is positive, TOLMUL*EPS is the desired relative
-*             precision in the computed singular values.
-*          If it is negative, abs(TOLMUL*EPS*sigma_max) is the
-*             desired absolute accuracy in the computed singular
-*             values (corresponds to relative accuracy
-*             abs(TOLMUL*EPS) in the largest singular value.
-*          abs(TOLMUL) should be between 1 and 1/EPS, and preferably
-*             between 10 (for fast convergence) and .1/EPS
-*             (for there to be some accuracy in the results).
-*          Default is to lose at either one eighth or 2 of the
-*             available decimal digits in each computed singular value
-*             (whichever is smaller).
-*
-*  MAXITR  INTEGER, default = 6
-*          MAXITR controls the maximum number of passes of the
-*          algorithm through its inner loop. The algorithms stops
-*          (and so fails to converge) if the number of passes
-*          through the inner loop exceeds MAXITR*N**2.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D0 )
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D0 )
-      DOUBLE PRECISION   NEGONE
-      PARAMETER          ( NEGONE = -1.0D0 )
-      DOUBLE PRECISION   HNDRTH
-      PARAMETER          ( HNDRTH = 0.01D0 )
-      DOUBLE PRECISION   TEN
-      PARAMETER          ( TEN = 10.0D0 )
-      DOUBLE PRECISION   HNDRD
-      PARAMETER          ( HNDRD = 100.0D0 )
-      DOUBLE PRECISION   MEIGTH
-      PARAMETER          ( MEIGTH = -0.125D0 )
-      INTEGER            MAXITR
-      PARAMETER          ( MAXITR = 6 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LOWER, ROTATE
-      INTEGER            I, IDIR, ISUB, ITER, J, LL, LLL, M, MAXIT, NM1,
-     $                   NM12, NM13, OLDLL, OLDM
-      DOUBLE PRECISION   ABSE, ABSS, COSL, COSR, CS, EPS, F, G, H, MU,
-     $                   OLDCS, OLDSN, R, SHIFT, SIGMN, SIGMX, SINL,
-     $                   SINR, SLL, SMAX, SMIN, SMINL, SMINOA,
-     $                   SN, THRESH, TOL, TOLMUL, UNFL
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           LSAME, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARTG, DLAS2, DLASQ1, DLASR, DLASV2, DROT,
-     $                   DSCAL, DSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, MAX, MIN, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      LOWER = LSAME( UPLO, 'L' )
-      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LOWER ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NCVT.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( NRU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( NCC.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( ( NCVT.EQ.0 .AND. LDVT.LT.1 ) .OR.
-     $         ( NCVT.GT.0 .AND. LDVT.LT.MAX( 1, N ) ) ) THEN
-         INFO = -9
-      ELSE IF( LDU.LT.MAX( 1, NRU ) ) THEN
-         INFO = -11
-      ELSE IF( ( NCC.EQ.0 .AND. LDC.LT.1 ) .OR.
-     $         ( NCC.GT.0 .AND. LDC.LT.MAX( 1, N ) ) ) THEN
-         INFO = -13
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DBDSQR', -INFO )
-         RETURN
-      END IF
-      IF( N.EQ.0 )
-     $   RETURN
-      IF( N.EQ.1 )
-     $   GO TO 160
-*
-*     ROTATE is true if any singular vectors desired, false otherwise
-*
-      ROTATE = ( NCVT.GT.0 ) .OR. ( NRU.GT.0 ) .OR. ( NCC.GT.0 )
-*
-*     If no singular vectors desired, use qd algorithm
-*
-      IF( .NOT.ROTATE ) THEN
-         CALL DLASQ1( N, D, E, WORK, INFO )
-         RETURN
-      END IF
-*
-      NM1 = N - 1
-      NM12 = NM1 + NM1
-      NM13 = NM12 + NM1
-      IDIR = 0
-*
-*     Get machine constants
-*
-      EPS = DLAMCH( 'Epsilon' )
-      UNFL = DLAMCH( 'Safe minimum' )
-*
-*     If matrix lower bidiagonal, rotate to be upper bidiagonal
-*     by applying Givens rotations on the left
-*
-      IF( LOWER ) THEN
-         DO 10 I = 1, N - 1
-            CALL DLARTG( D( I ), E( I ), CS, SN, R )
-            D( I ) = R
-            E( I ) = SN*D( I+1 )
-            D( I+1 ) = CS*D( I+1 )
-            WORK( I ) = CS
-            WORK( NM1+I ) = SN
-   10    CONTINUE
-*
-*        Update singular vectors if desired
-*
-         IF( NRU.GT.0 )
-     $      CALL DLASR( 'R', 'V', 'F', NRU, N, WORK( 1 ), WORK( N ), U,
-     $                  LDU )
-         IF( NCC.GT.0 )
-     $      CALL DLASR( 'L', 'V', 'F', N, NCC, WORK( 1 ), WORK( N ), C,
-     $                  LDC )
-      END IF
-*
-*     Compute singular values to relative accuracy TOL
-*     (By setting TOL to be negative, algorithm will compute
-*     singular values to absolute accuracy ABS(TOL)*norm(input matrix))
-*
-      TOLMUL = MAX( TEN, MIN( HNDRD, EPS**MEIGTH ) )
-      TOL = TOLMUL*EPS
-*
-*     Compute approximate maximum, minimum singular values
-*
-      SMAX = ZERO
-      DO 20 I = 1, N
-         SMAX = MAX( SMAX, ABS( D( I ) ) )
-   20 CONTINUE
-      DO 30 I = 1, N - 1
-         SMAX = MAX( SMAX, ABS( E( I ) ) )
-   30 CONTINUE
-      SMINL = ZERO
-      IF( TOL.GE.ZERO ) THEN
-*
-*        Relative accuracy desired
-*
-         SMINOA = ABS( D( 1 ) )
-         IF( SMINOA.EQ.ZERO )
-     $      GO TO 50
-         MU = SMINOA
-         DO 40 I = 2, N
-            MU = ABS( D( I ) )*( MU / ( MU+ABS( E( I-1 ) ) ) )
-            SMINOA = MIN( SMINOA, MU )
-            IF( SMINOA.EQ.ZERO )
-     $         GO TO 50
-   40    CONTINUE
-   50    CONTINUE
-         SMINOA = SMINOA / SQRT( DBLE( N ) )
-         THRESH = MAX( TOL*SMINOA, MAXITR*N*N*UNFL )
-      ELSE
-*
-*        Absolute accuracy desired
-*
-         THRESH = MAX( ABS( TOL )*SMAX, MAXITR*N*N*UNFL )
-      END IF
-*
-*     Prepare for main iteration loop for the singular values
-*     (MAXIT is the maximum number of passes through the inner
-*     loop permitted before nonconvergence signalled.)
-*
-      MAXIT = MAXITR*N*N
-      ITER = 0
-      OLDLL = -1
-      OLDM = -1
-*
-*     M points to last element of unconverged part of matrix
-*
-      M = N
-*
-*     Begin main iteration loop
-*
-   60 CONTINUE
-*
-*     Check for convergence or exceeding iteration count
-*
-      IF( M.LE.1 )
-     $   GO TO 160
-      IF( ITER.GT.MAXIT )
-     $   GO TO 200
-*
-*     Find diagonal block of matrix to work on
-*
-      IF( TOL.LT.ZERO .AND. ABS( D( M ) ).LE.THRESH )
-     $   D( M ) = ZERO
-      SMAX = ABS( D( M ) )
-      SMIN = SMAX
-      DO 70 LLL = 1, M - 1
-         LL = M - LLL
-         ABSS = ABS( D( LL ) )
-         ABSE = ABS( E( LL ) )
-         IF( TOL.LT.ZERO .AND. ABSS.LE.THRESH )
-     $      D( LL ) = ZERO
-         IF( ABSE.LE.THRESH )
-     $      GO TO 80
-         SMIN = MIN( SMIN, ABSS )
-         SMAX = MAX( SMAX, ABSS, ABSE )
-   70 CONTINUE
-      LL = 0
-      GO TO 90
-   80 CONTINUE
-      E( LL ) = ZERO
-*
-*     Matrix splits since E(LL) = 0
-*
-      IF( LL.EQ.M-1 ) THEN
-*
-*        Convergence of bottom singular value, return to top of loop
-*
-         M = M - 1
-         GO TO 60
-      END IF
-   90 CONTINUE
-      LL = LL + 1
-*
-*     E(LL) through E(M-1) are nonzero, E(LL-1) is zero
-*
-      IF( LL.EQ.M-1 ) THEN
-*
-*        2 by 2 block, handle separately
-*
-         CALL DLASV2( D( M-1 ), E( M-1 ), D( M ), SIGMN, SIGMX, SINR,
-     $                COSR, SINL, COSL )
-         D( M-1 ) = SIGMX
-         E( M-1 ) = ZERO
-         D( M ) = SIGMN
-*
-*        Compute singular vectors, if desired
-*
-         IF( NCVT.GT.0 )
-     $      CALL DROT( NCVT, VT( M-1, 1 ), LDVT, VT( M, 1 ), LDVT, COSR,
-     $                 SINR )
-         IF( NRU.GT.0 )
-     $      CALL DROT( NRU, U( 1, M-1 ), 1, U( 1, M ), 1, COSL, SINL )
-         IF( NCC.GT.0 )
-     $      CALL DROT( NCC, C( M-1, 1 ), LDC, C( M, 1 ), LDC, COSL,
-     $                 SINL )
-         M = M - 2
-         GO TO 60
-      END IF
-*
-*     If working on new submatrix, choose shift direction
-*     (from larger end diagonal element towards smaller)
-*
-      IF( LL.GT.OLDM .OR. M.LT.OLDLL ) THEN
-         IF( ABS( D( LL ) ).GE.ABS( D( M ) ) ) THEN
-*
-*           Chase bulge from top (big end) to bottom (small end)
-*
-            IDIR = 1
-         ELSE
-*
-*           Chase bulge from bottom (big end) to top (small end)
-*
-            IDIR = 2
-         END IF
-      END IF
-*
-*     Apply convergence tests
-*
-      IF( IDIR.EQ.1 ) THEN
-*
-*        Run convergence test in forward direction
-*        First apply standard test to bottom of matrix
-*
-         IF( ABS( E( M-1 ) ).LE.ABS( TOL )*ABS( D( M ) ) .OR.
-     $       ( TOL.LT.ZERO .AND. ABS( E( M-1 ) ).LE.THRESH ) ) THEN
-            E( M-1 ) = ZERO
-            GO TO 60
-         END IF
-*
-         IF( TOL.GE.ZERO ) THEN
-*
-*           If relative accuracy desired,
-*           apply convergence criterion forward
-*
-            MU = ABS( D( LL ) )
-            SMINL = MU
-            DO 100 LLL = LL, M - 1
-               IF( ABS( E( LLL ) ).LE.TOL*MU ) THEN
-                  E( LLL ) = ZERO
-                  GO TO 60
-               END IF
-               MU = ABS( D( LLL+1 ) )*( MU / ( MU+ABS( E( LLL ) ) ) )
-               SMINL = MIN( SMINL, MU )
-  100       CONTINUE
-         END IF
-*
-      ELSE
-*
-*        Run convergence test in backward direction
-*        First apply standard test to top of matrix
-*
-         IF( ABS( E( LL ) ).LE.ABS( TOL )*ABS( D( LL ) ) .OR.
-     $       ( TOL.LT.ZERO .AND. ABS( E( LL ) ).LE.THRESH ) ) THEN
-            E( LL ) = ZERO
-            GO TO 60
-         END IF
-*
-         IF( TOL.GE.ZERO ) THEN
-*
-*           If relative accuracy desired,
-*           apply convergence criterion backward
-*
-            MU = ABS( D( M ) )
-            SMINL = MU
-            DO 110 LLL = M - 1, LL, -1
-               IF( ABS( E( LLL ) ).LE.TOL*MU ) THEN
-                  E( LLL ) = ZERO
-                  GO TO 60
-               END IF
-               MU = ABS( D( LLL ) )*( MU / ( MU+ABS( E( LLL ) ) ) )
-               SMINL = MIN( SMINL, MU )
-  110       CONTINUE
-         END IF
-      END IF
-      OLDLL = LL
-      OLDM = M
-*
-*     Compute shift.  First, test if shifting would ruin relative
-*     accuracy, and if so set the shift to zero.
-*
-      IF( TOL.GE.ZERO .AND. N*TOL*( SMINL / SMAX ).LE.
-     $    MAX( EPS, HNDRTH*TOL ) ) THEN
-*
-*        Use a zero shift to avoid loss of relative accuracy
-*
-         SHIFT = ZERO
-      ELSE
-*
-*        Compute the shift from 2-by-2 block at end of matrix
-*
-         IF( IDIR.EQ.1 ) THEN
-            SLL = ABS( D( LL ) )
-            CALL DLAS2( D( M-1 ), E( M-1 ), D( M ), SHIFT, R )
-         ELSE
-            SLL = ABS( D( M ) )
-            CALL DLAS2( D( LL ), E( LL ), D( LL+1 ), SHIFT, R )
-         END IF
-*
-*        Test if shift negligible, and if so set to zero
-*
-         IF( SLL.GT.ZERO ) THEN
-            IF( ( SHIFT / SLL )**2.LT.EPS )
-     $         SHIFT = ZERO
-         END IF
-      END IF
-*
-*     Increment iteration count
-*
-      ITER = ITER + M - LL
-*
-*     If SHIFT = 0, do simplified QR iteration
-*
-      IF( SHIFT.EQ.ZERO ) THEN
-         IF( IDIR.EQ.1 ) THEN
-*
-*           Chase bulge from top to bottom
-*           Save cosines and sines for later singular vector updates
-*
-            CS = ONE
-            OLDCS = ONE
-            DO 120 I = LL, M - 1
-               CALL DLARTG( D( I )*CS, E( I ), CS, SN, R )
-               IF( I.GT.LL )
-     $            E( I-1 ) = OLDSN*R
-               CALL DLARTG( OLDCS*R, D( I+1 )*SN, OLDCS, OLDSN, D( I ) )
-               WORK( I-LL+1 ) = CS
-               WORK( I-LL+1+NM1 ) = SN
-               WORK( I-LL+1+NM12 ) = OLDCS
-               WORK( I-LL+1+NM13 ) = OLDSN
-  120       CONTINUE
-            H = D( M )*CS
-            D( M ) = H*OLDCS
-            E( M-1 ) = H*OLDSN
-*
-*           Update singular vectors
-*
-            IF( NCVT.GT.0 )
-     $         CALL DLASR( 'L', 'V', 'F', M-LL+1, NCVT, WORK( 1 ),
-     $                     WORK( N ), VT( LL, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL DLASR( 'R', 'V', 'F', NRU, M-LL+1, WORK( NM12+1 ),
-     $                     WORK( NM13+1 ), U( 1, LL ), LDU )
-            IF( NCC.GT.0 )
-     $         CALL DLASR( 'L', 'V', 'F', M-LL+1, NCC, WORK( NM12+1 ),
-     $                     WORK( NM13+1 ), C( LL, 1 ), LDC )
-*
-*           Test convergence
-*
-            IF( ABS( E( M-1 ) ).LE.THRESH )
-     $         E( M-1 ) = ZERO
-*
-         ELSE
-*
-*           Chase bulge from bottom to top
-*           Save cosines and sines for later singular vector updates
-*
-            CS = ONE
-            OLDCS = ONE
-            DO 130 I = M, LL + 1, -1
-               CALL DLARTG( D( I )*CS, E( I-1 ), CS, SN, R )
-               IF( I.LT.M )
-     $            E( I ) = OLDSN*R
-               CALL DLARTG( OLDCS*R, D( I-1 )*SN, OLDCS, OLDSN, D( I ) )
-               WORK( I-LL ) = CS
-               WORK( I-LL+NM1 ) = -SN
-               WORK( I-LL+NM12 ) = OLDCS
-               WORK( I-LL+NM13 ) = -OLDSN
-  130       CONTINUE
-            H = D( LL )*CS
-            D( LL ) = H*OLDCS
-            E( LL ) = H*OLDSN
-*
-*           Update singular vectors
-*
-            IF( NCVT.GT.0 )
-     $         CALL DLASR( 'L', 'V', 'B', M-LL+1, NCVT, WORK( NM12+1 ),
-     $                     WORK( NM13+1 ), VT( LL, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL DLASR( 'R', 'V', 'B', NRU, M-LL+1, WORK( 1 ),
-     $                     WORK( N ), U( 1, LL ), LDU )
-            IF( NCC.GT.0 )
-     $         CALL DLASR( 'L', 'V', 'B', M-LL+1, NCC, WORK( 1 ),
-     $                     WORK( N ), C( LL, 1 ), LDC )
-*
-*           Test convergence
-*
-            IF( ABS( E( LL ) ).LE.THRESH )
-     $         E( LL ) = ZERO
-         END IF
-      ELSE
-*
-*        Use nonzero shift
-*
-         IF( IDIR.EQ.1 ) THEN
-*
-*           Chase bulge from top to bottom
-*           Save cosines and sines for later singular vector updates
-*
-            F = ( ABS( D( LL ) )-SHIFT )*
-     $          ( SIGN( ONE, D( LL ) )+SHIFT / D( LL ) )
-            G = E( LL )
-            DO 140 I = LL, M - 1
-               CALL DLARTG( F, G, COSR, SINR, R )
-               IF( I.GT.LL )
-     $            E( I-1 ) = R
-               F = COSR*D( I ) + SINR*E( I )
-               E( I ) = COSR*E( I ) - SINR*D( I )
-               G = SINR*D( I+1 )
-               D( I+1 ) = COSR*D( I+1 )
-               CALL DLARTG( F, G, COSL, SINL, R )
-               D( I ) = R
-               F = COSL*E( I ) + SINL*D( I+1 )
-               D( I+1 ) = COSL*D( I+1 ) - SINL*E( I )
-               IF( I.LT.M-1 ) THEN
-                  G = SINL*E( I+1 )
-                  E( I+1 ) = COSL*E( I+1 )
-               END IF
-               WORK( I-LL+1 ) = COSR
-               WORK( I-LL+1+NM1 ) = SINR
-               WORK( I-LL+1+NM12 ) = COSL
-               WORK( I-LL+1+NM13 ) = SINL
-  140       CONTINUE
-            E( M-1 ) = F
-*
-*           Update singular vectors
-*
-            IF( NCVT.GT.0 )
-     $         CALL DLASR( 'L', 'V', 'F', M-LL+1, NCVT, WORK( 1 ),
-     $                     WORK( N ), VT( LL, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL DLASR( 'R', 'V', 'F', NRU, M-LL+1, WORK( NM12+1 ),
-     $                     WORK( NM13+1 ), U( 1, LL ), LDU )
-            IF( NCC.GT.0 )
-     $         CALL DLASR( 'L', 'V', 'F', M-LL+1, NCC, WORK( NM12+1 ),
-     $                     WORK( NM13+1 ), C( LL, 1 ), LDC )
-*
-*           Test convergence
-*
-            IF( ABS( E( M-1 ) ).LE.THRESH )
-     $         E( M-1 ) = ZERO
-*
-         ELSE
-*
-*           Chase bulge from bottom to top
-*           Save cosines and sines for later singular vector updates
-*
-            F = ( ABS( D( M ) )-SHIFT )*( SIGN( ONE, D( M ) )+SHIFT /
-     $          D( M ) )
-            G = E( M-1 )
-            DO 150 I = M, LL + 1, -1
-               CALL DLARTG( F, G, COSR, SINR, R )
-               IF( I.LT.M )
-     $            E( I ) = R
-               F = COSR*D( I ) + SINR*E( I-1 )
-               E( I-1 ) = COSR*E( I-1 ) - SINR*D( I )
-               G = SINR*D( I-1 )
-               D( I-1 ) = COSR*D( I-1 )
-               CALL DLARTG( F, G, COSL, SINL, R )
-               D( I ) = R
-               F = COSL*E( I-1 ) + SINL*D( I-1 )
-               D( I-1 ) = COSL*D( I-1 ) - SINL*E( I-1 )
-               IF( I.GT.LL+1 ) THEN
-                  G = SINL*E( I-2 )
-                  E( I-2 ) = COSL*E( I-2 )
-               END IF
-               WORK( I-LL ) = COSR
-               WORK( I-LL+NM1 ) = -SINR
-               WORK( I-LL+NM12 ) = COSL
-               WORK( I-LL+NM13 ) = -SINL
-  150       CONTINUE
-            E( LL ) = F
-*
-*           Test convergence
-*
-            IF( ABS( E( LL ) ).LE.THRESH )
-     $         E( LL ) = ZERO
-*
-*           Update singular vectors if desired
-*
-            IF( NCVT.GT.0 )
-     $         CALL DLASR( 'L', 'V', 'B', M-LL+1, NCVT, WORK( NM12+1 ),
-     $                     WORK( NM13+1 ), VT( LL, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL DLASR( 'R', 'V', 'B', NRU, M-LL+1, WORK( 1 ),
-     $                     WORK( N ), U( 1, LL ), LDU )
-            IF( NCC.GT.0 )
-     $         CALL DLASR( 'L', 'V', 'B', M-LL+1, NCC, WORK( 1 ),
-     $                     WORK( N ), C( LL, 1 ), LDC )
-         END IF
-      END IF
-*
-*     QR iteration finished, go back and check convergence
-*
-      GO TO 60
-*
-*     All singular values converged, so make them positive
-*
-  160 CONTINUE
-      DO 170 I = 1, N
-         IF( D( I ).LT.ZERO ) THEN
-            D( I ) = -D( I )
-*
-*           Change sign of singular vectors, if desired
-*
-            IF( NCVT.GT.0 )
-     $         CALL DSCAL( NCVT, NEGONE, VT( I, 1 ), LDVT )
-         END IF
-  170 CONTINUE
-*
-*     Sort the singular values into decreasing order (insertion sort on
-*     singular values, but only one transposition per singular vector)
-*
-      DO 190 I = 1, N - 1
-*
-*        Scan for smallest D(I)
-*
-         ISUB = 1
-         SMIN = D( 1 )
-         DO 180 J = 2, N + 1 - I
-            IF( D( J ).LE.SMIN ) THEN
-               ISUB = J
-               SMIN = D( J )
-            END IF
-  180    CONTINUE
-         IF( ISUB.NE.N+1-I ) THEN
-*
-*           Swap singular values and vectors
-*
-            D( ISUB ) = D( N+1-I )
-            D( N+1-I ) = SMIN
-            IF( NCVT.GT.0 )
-     $         CALL DSWAP( NCVT, VT( ISUB, 1 ), LDVT, VT( N+1-I, 1 ),
-     $                     LDVT )
-            IF( NRU.GT.0 )
-     $         CALL DSWAP( NRU, U( 1, ISUB ), 1, U( 1, N+1-I ), 1 )
-            IF( NCC.GT.0 )
-     $         CALL DSWAP( NCC, C( ISUB, 1 ), LDC, C( N+1-I, 1 ), LDC )
-         END IF
-  190 CONTINUE
-      GO TO 220
-*
-*     Maximum number of iterations exceeded, failure to converge
-*
-  200 CONTINUE
-      INFO = 0
-      DO 210 I = 1, N - 1
-         IF( E( I ).NE.ZERO )
-     $      INFO = INFO + 1
-  210 CONTINUE
-  220 CONTINUE
-      RETURN
-*
-*     End of DBDSQR
-*
-      END
--- a/libcruft/lapack/dgbcon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,226 +0,0 @@
-      SUBROUTINE DGBCON( NORM, N, KL, KU, AB, LDAB, IPIV, ANORM, RCOND,
-     $                   WORK, IWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            INFO, KL, KU, LDAB, N
-      DOUBLE PRECISION   ANORM, RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * ), IWORK( * )
-      DOUBLE PRECISION   AB( LDAB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGBCON estimates the reciprocal of the condition number of a real
-*  general band matrix A, in either the 1-norm or the infinity-norm,
-*  using the LU factorization computed by DGBTRF.
-*
-*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
-*  condition number is computed as
-*     RCOND = 1 / ( norm(A) * norm(inv(A)) ).
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies whether the 1-norm condition number or the
-*          infinity-norm condition number is required:
-*          = '1' or 'O':  1-norm;
-*          = 'I':         Infinity-norm.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KL      (input) INTEGER
-*          The number of subdiagonals within the band of A.  KL >= 0.
-*
-*  KU      (input) INTEGER
-*          The number of superdiagonals within the band of A.  KU >= 0.
-*
-*  AB      (input) DOUBLE PRECISION array, dimension (LDAB,N)
-*          Details of the LU factorization of the band matrix A, as
-*          computed by DGBTRF.  U is stored as an upper triangular band
-*          matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and
-*          the multipliers used during the factorization are stored in
-*          rows KL+KU+2 to 2*KL+KU+1.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= N, row i of the matrix was
-*          interchanged with row IPIV(i).
-*
-*  ANORM   (input) DOUBLE PRECISION
-*          If NORM = '1' or 'O', the 1-norm of the original matrix A.
-*          If NORM = 'I', the infinity-norm of the original matrix A.
-*
-*  RCOND   (output) DOUBLE PRECISION
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(norm(A) * norm(inv(A))).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (3*N)
-*
-*  IWORK   (workspace) INTEGER array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LNOTI, ONENRM
-      CHARACTER          NORMIN
-      INTEGER            IX, J, JP, KASE, KASE1, KD, LM
-      DOUBLE PRECISION   AINVNM, SCALE, SMLNUM, T
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DDOT, DLAMCH
-      EXTERNAL           LSAME, IDAMAX, DDOT, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DAXPY, DLACN2, DLATBS, DRSCL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' )
-      IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KL.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( KU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDAB.LT.2*KL+KU+1 ) THEN
-         INFO = -6
-      ELSE IF( ANORM.LT.ZERO ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGBCON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      RCOND = ZERO
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      ELSE IF( ANORM.EQ.ZERO ) THEN
-         RETURN
-      END IF
-*
-      SMLNUM = DLAMCH( 'Safe minimum' )
-*
-*     Estimate the norm of inv(A).
-*
-      AINVNM = ZERO
-      NORMIN = 'N'
-      IF( ONENRM ) THEN
-         KASE1 = 1
-      ELSE
-         KASE1 = 2
-      END IF
-      KD = KL + KU + 1
-      LNOTI = KL.GT.0
-      KASE = 0
-   10 CONTINUE
-      CALL DLACN2( N, WORK( N+1 ), WORK, IWORK, AINVNM, KASE, ISAVE )
-      IF( KASE.NE.0 ) THEN
-         IF( KASE.EQ.KASE1 ) THEN
-*
-*           Multiply by inv(L).
-*
-            IF( LNOTI ) THEN
-               DO 20 J = 1, N - 1
-                  LM = MIN( KL, N-J )
-                  JP = IPIV( J )
-                  T = WORK( JP )
-                  IF( JP.NE.J ) THEN
-                     WORK( JP ) = WORK( J )
-                     WORK( J ) = T
-                  END IF
-                  CALL DAXPY( LM, -T, AB( KD+1, J ), 1, WORK( J+1 ), 1 )
-   20          CONTINUE
-            END IF
-*
-*           Multiply by inv(U).
-*
-            CALL DLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   KL+KU, AB, LDAB, WORK, SCALE, WORK( 2*N+1 ),
-     $                   INFO )
-         ELSE
-*
-*           Multiply by inv(U').
-*
-            CALL DLATBS( 'Upper', 'Transpose', 'Non-unit', NORMIN, N,
-     $                   KL+KU, AB, LDAB, WORK, SCALE, WORK( 2*N+1 ),
-     $                   INFO )
-*
-*           Multiply by inv(L').
-*
-            IF( LNOTI ) THEN
-               DO 30 J = N - 1, 1, -1
-                  LM = MIN( KL, N-J )
-                  WORK( J ) = WORK( J ) - DDOT( LM, AB( KD+1, J ), 1,
-     $                        WORK( J+1 ), 1 )
-                  JP = IPIV( J )
-                  IF( JP.NE.J ) THEN
-                     T = WORK( JP )
-                     WORK( JP ) = WORK( J )
-                     WORK( J ) = T
-                  END IF
-   30          CONTINUE
-            END IF
-         END IF
-*
-*        Divide X by 1/SCALE if doing so will not cause overflow.
-*
-         NORMIN = 'Y'
-         IF( SCALE.NE.ONE ) THEN
-            IX = IDAMAX( N, WORK, 1 )
-            IF( SCALE.LT.ABS( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
-     $         GO TO 40
-            CALL DRSCL( N, SCALE, WORK, 1 )
-         END IF
-         GO TO 10
-      END IF
-*
-*     Compute the estimate of the reciprocal condition number.
-*
-      IF( AINVNM.NE.ZERO )
-     $   RCOND = ( ONE / AINVNM ) / ANORM
-*
-   40 CONTINUE
-      RETURN
-*
-*     End of DGBCON
-*
-      END
--- a/libcruft/lapack/dgbtf2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,202 +0,0 @@
-      SUBROUTINE DGBTF2( M, N, KL, KU, AB, LDAB, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, KL, KU, LDAB, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      DOUBLE PRECISION   AB( LDAB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGBTF2 computes an LU factorization of a real m-by-n band matrix A
-*  using partial pivoting with row interchanges.
-*
-*  This is the unblocked version of the algorithm, calling Level 2 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  KL      (input) INTEGER
-*          The number of subdiagonals within the band of A.  KL >= 0.
-*
-*  KU      (input) INTEGER
-*          The number of superdiagonals within the band of A.  KU >= 0.
-*
-*  AB      (input/output) DOUBLE PRECISION array, dimension (LDAB,N)
-*          On entry, the matrix A in band storage, in rows KL+1 to
-*          2*KL+KU+1; rows 1 to KL of the array need not be set.
-*          The j-th column of A is stored in the j-th column of the
-*          array AB as follows:
-*          AB(kl+ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl)
-*
-*          On exit, details of the factorization: U is stored as an
-*          upper triangular band matrix with KL+KU superdiagonals in
-*          rows 1 to KL+KU+1, and the multipliers used during the
-*          factorization are stored in rows KL+KU+2 to 2*KL+KU+1.
-*          See below for further details.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
-*
-*  IPIV    (output) INTEGER array, dimension (min(M,N))
-*          The pivot indices; for 1 <= i <= min(M,N), row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = +i, U(i,i) is exactly zero. The factorization
-*               has been completed, but the factor U is exactly
-*               singular, and division by zero will occur if it is used
-*               to solve a system of equations.
-*
-*  Further Details
-*  ===============
-*
-*  The band storage scheme is illustrated by the following example, when
-*  M = N = 6, KL = 2, KU = 1:
-*
-*  On entry:                       On exit:
-*
-*      *    *    *    +    +    +       *    *    *   u14  u25  u36
-*      *    *    +    +    +    +       *    *   u13  u24  u35  u46
-*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
-*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
-*     a21  a32  a43  a54  a65   *      m21  m32  m43  m54  m65   *
-*     a31  a42  a53  a64   *    *      m31  m42  m53  m64   *    *
-*
-*  Array elements marked * are not used by the routine; elements marked
-*  + need not be set on entry, but are required by the routine to store
-*  elements of U, because of fill-in resulting from the row
-*  interchanges.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J, JP, JU, KM, KV
-*     ..
-*     .. External Functions ..
-      INTEGER            IDAMAX
-      EXTERNAL           IDAMAX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGER, DSCAL, DSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     KV is the number of superdiagonals in the factor U, allowing for
-*     fill-in.
-*
-      KV = KU + KL
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KL.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( KU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDAB.LT.KL+KV+1 ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGBTF2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Gaussian elimination with partial pivoting
-*
-*     Set fill-in elements in columns KU+2 to KV to zero.
-*
-      DO 20 J = KU + 2, MIN( KV, N )
-         DO 10 I = KV - J + 2, KL
-            AB( I, J ) = ZERO
-   10    CONTINUE
-   20 CONTINUE
-*
-*     JU is the index of the last column affected by the current stage
-*     of the factorization.
-*
-      JU = 1
-*
-      DO 40 J = 1, MIN( M, N )
-*
-*        Set fill-in elements in column J+KV to zero.
-*
-         IF( J+KV.LE.N ) THEN
-            DO 30 I = 1, KL
-               AB( I, J+KV ) = ZERO
-   30       CONTINUE
-         END IF
-*
-*        Find pivot and test for singularity. KM is the number of
-*        subdiagonal elements in the current column.
-*
-         KM = MIN( KL, M-J )
-         JP = IDAMAX( KM+1, AB( KV+1, J ), 1 )
-         IPIV( J ) = JP + J - 1
-         IF( AB( KV+JP, J ).NE.ZERO ) THEN
-            JU = MAX( JU, MIN( J+KU+JP-1, N ) )
-*
-*           Apply interchange to columns J to JU.
-*
-            IF( JP.NE.1 )
-     $         CALL DSWAP( JU-J+1, AB( KV+JP, J ), LDAB-1,
-     $                     AB( KV+1, J ), LDAB-1 )
-*
-            IF( KM.GT.0 ) THEN
-*
-*              Compute multipliers.
-*
-               CALL DSCAL( KM, ONE / AB( KV+1, J ), AB( KV+2, J ), 1 )
-*
-*              Update trailing submatrix within the band.
-*
-               IF( JU.GT.J )
-     $            CALL DGER( KM, JU-J, -ONE, AB( KV+2, J ), 1,
-     $                       AB( KV, J+1 ), LDAB-1, AB( KV+1, J+1 ),
-     $                       LDAB-1 )
-            END IF
-         ELSE
-*
-*           If pivot is zero, set INFO to the index of the pivot
-*           unless a zero pivot has already been found.
-*
-            IF( INFO.EQ.0 )
-     $         INFO = J
-         END IF
-   40 CONTINUE
-      RETURN
-*
-*     End of DGBTF2
-*
-      END
--- a/libcruft/lapack/dgbtrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,441 +0,0 @@
-      SUBROUTINE DGBTRF( M, N, KL, KU, AB, LDAB, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, KL, KU, LDAB, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      DOUBLE PRECISION   AB( LDAB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGBTRF computes an LU factorization of a real m-by-n band matrix A
-*  using partial pivoting with row interchanges.
-*
-*  This is the blocked version of the algorithm, calling Level 3 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  KL      (input) INTEGER
-*          The number of subdiagonals within the band of A.  KL >= 0.
-*
-*  KU      (input) INTEGER
-*          The number of superdiagonals within the band of A.  KU >= 0.
-*
-*  AB      (input/output) DOUBLE PRECISION array, dimension (LDAB,N)
-*          On entry, the matrix A in band storage, in rows KL+1 to
-*          2*KL+KU+1; rows 1 to KL of the array need not be set.
-*          The j-th column of A is stored in the j-th column of the
-*          array AB as follows:
-*          AB(kl+ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl)
-*
-*          On exit, details of the factorization: U is stored as an
-*          upper triangular band matrix with KL+KU superdiagonals in
-*          rows 1 to KL+KU+1, and the multipliers used during the
-*          factorization are stored in rows KL+KU+2 to 2*KL+KU+1.
-*          See below for further details.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
-*
-*  IPIV    (output) INTEGER array, dimension (min(M,N))
-*          The pivot indices; for 1 <= i <= min(M,N), row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = +i, U(i,i) is exactly zero. The factorization
-*               has been completed, but the factor U is exactly
-*               singular, and division by zero will occur if it is used
-*               to solve a system of equations.
-*
-*  Further Details
-*  ===============
-*
-*  The band storage scheme is illustrated by the following example, when
-*  M = N = 6, KL = 2, KU = 1:
-*
-*  On entry:                       On exit:
-*
-*      *    *    *    +    +    +       *    *    *   u14  u25  u36
-*      *    *    +    +    +    +       *    *   u13  u24  u35  u46
-*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
-*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
-*     a21  a32  a43  a54  a65   *      m21  m32  m43  m54  m65   *
-*     a31  a42  a53  a64   *    *      m31  m42  m53  m64   *    *
-*
-*  Array elements marked * are not used by the routine; elements marked
-*  + need not be set on entry, but are required by the routine to store
-*  elements of U because of fill-in resulting from the row interchanges.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-      INTEGER            NBMAX, LDWORK
-      PARAMETER          ( NBMAX = 64, LDWORK = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I2, I3, II, IP, J, J2, J3, JB, JJ, JM, JP,
-     $                   JU, K2, KM, KV, NB, NW
-      DOUBLE PRECISION   TEMP
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   WORK13( LDWORK, NBMAX ),
-     $                   WORK31( LDWORK, NBMAX )
-*     ..
-*     .. External Functions ..
-      INTEGER            IDAMAX, ILAENV
-      EXTERNAL           IDAMAX, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DGBTF2, DGEMM, DGER, DLASWP, DSCAL,
-     $                   DSWAP, DTRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     KV is the number of superdiagonals in the factor U, allowing for
-*     fill-in
-*
-      KV = KU + KL
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KL.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( KU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDAB.LT.KL+KV+1 ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGBTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment
-*
-      NB = ILAENV( 1, 'DGBTRF', ' ', M, N, KL, KU )
-*
-*     The block size must not exceed the limit set by the size of the
-*     local arrays WORK13 and WORK31.
-*
-      NB = MIN( NB, NBMAX )
-*
-      IF( NB.LE.1 .OR. NB.GT.KL ) THEN
-*
-*        Use unblocked code
-*
-         CALL DGBTF2( M, N, KL, KU, AB, LDAB, IPIV, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-*        Zero the superdiagonal elements of the work array WORK13
-*
-         DO 20 J = 1, NB
-            DO 10 I = 1, J - 1
-               WORK13( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-*
-*        Zero the subdiagonal elements of the work array WORK31
-*
-         DO 40 J = 1, NB
-            DO 30 I = J + 1, NB
-               WORK31( I, J ) = ZERO
-   30       CONTINUE
-   40    CONTINUE
-*
-*        Gaussian elimination with partial pivoting
-*
-*        Set fill-in elements in columns KU+2 to KV to zero
-*
-         DO 60 J = KU + 2, MIN( KV, N )
-            DO 50 I = KV - J + 2, KL
-               AB( I, J ) = ZERO
-   50       CONTINUE
-   60    CONTINUE
-*
-*        JU is the index of the last column affected by the current
-*        stage of the factorization
-*
-         JU = 1
-*
-         DO 180 J = 1, MIN( M, N ), NB
-            JB = MIN( NB, MIN( M, N )-J+1 )
-*
-*           The active part of the matrix is partitioned
-*
-*              A11   A12   A13
-*              A21   A22   A23
-*              A31   A32   A33
-*
-*           Here A11, A21 and A31 denote the current block of JB columns
-*           which is about to be factorized. The number of rows in the
-*           partitioning are JB, I2, I3 respectively, and the numbers
-*           of columns are JB, J2, J3. The superdiagonal elements of A13
-*           and the subdiagonal elements of A31 lie outside the band.
-*
-            I2 = MIN( KL-JB, M-J-JB+1 )
-            I3 = MIN( JB, M-J-KL+1 )
-*
-*           J2 and J3 are computed after JU has been updated.
-*
-*           Factorize the current block of JB columns
-*
-            DO 80 JJ = J, J + JB - 1
-*
-*              Set fill-in elements in column JJ+KV to zero
-*
-               IF( JJ+KV.LE.N ) THEN
-                  DO 70 I = 1, KL
-                     AB( I, JJ+KV ) = ZERO
-   70             CONTINUE
-               END IF
-*
-*              Find pivot and test for singularity. KM is the number of
-*              subdiagonal elements in the current column.
-*
-               KM = MIN( KL, M-JJ )
-               JP = IDAMAX( KM+1, AB( KV+1, JJ ), 1 )
-               IPIV( JJ ) = JP + JJ - J
-               IF( AB( KV+JP, JJ ).NE.ZERO ) THEN
-                  JU = MAX( JU, MIN( JJ+KU+JP-1, N ) )
-                  IF( JP.NE.1 ) THEN
-*
-*                    Apply interchange to columns J to J+JB-1
-*
-                     IF( JP+JJ-1.LT.J+KL ) THEN
-*
-                        CALL DSWAP( JB, AB( KV+1+JJ-J, J ), LDAB-1,
-     $                              AB( KV+JP+JJ-J, J ), LDAB-1 )
-                     ELSE
-*
-*                       The interchange affects columns J to JJ-1 of A31
-*                       which are stored in the work array WORK31
-*
-                        CALL DSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1,
-     $                              WORK31( JP+JJ-J-KL, 1 ), LDWORK )
-                        CALL DSWAP( J+JB-JJ, AB( KV+1, JJ ), LDAB-1,
-     $                              AB( KV+JP, JJ ), LDAB-1 )
-                     END IF
-                  END IF
-*
-*                 Compute multipliers
-*
-                  CALL DSCAL( KM, ONE / AB( KV+1, JJ ), AB( KV+2, JJ ),
-     $                        1 )
-*
-*                 Update trailing submatrix within the band and within
-*                 the current block. JM is the index of the last column
-*                 which needs to be updated.
-*
-                  JM = MIN( JU, J+JB-1 )
-                  IF( JM.GT.JJ )
-     $               CALL DGER( KM, JM-JJ, -ONE, AB( KV+2, JJ ), 1,
-     $                          AB( KV, JJ+1 ), LDAB-1,
-     $                          AB( KV+1, JJ+1 ), LDAB-1 )
-               ELSE
-*
-*                 If pivot is zero, set INFO to the index of the pivot
-*                 unless a zero pivot has already been found.
-*
-                  IF( INFO.EQ.0 )
-     $               INFO = JJ
-               END IF
-*
-*              Copy current column of A31 into the work array WORK31
-*
-               NW = MIN( JJ-J+1, I3 )
-               IF( NW.GT.0 )
-     $            CALL DCOPY( NW, AB( KV+KL+1-JJ+J, JJ ), 1,
-     $                        WORK31( 1, JJ-J+1 ), 1 )
-   80       CONTINUE
-            IF( J+JB.LE.N ) THEN
-*
-*              Apply the row interchanges to the other blocks.
-*
-               J2 = MIN( JU-J+1, KV ) - JB
-               J3 = MAX( 0, JU-J-KV+1 )
-*
-*              Use DLASWP to apply the row interchanges to A12, A22, and
-*              A32.
-*
-               CALL DLASWP( J2, AB( KV+1-JB, J+JB ), LDAB-1, 1, JB,
-     $                      IPIV( J ), 1 )
-*
-*              Adjust the pivot indices.
-*
-               DO 90 I = J, J + JB - 1
-                  IPIV( I ) = IPIV( I ) + J - 1
-   90          CONTINUE
-*
-*              Apply the row interchanges to A13, A23, and A33
-*              columnwise.
-*
-               K2 = J - 1 + JB + J2
-               DO 110 I = 1, J3
-                  JJ = K2 + I
-                  DO 100 II = J + I - 1, J + JB - 1
-                     IP = IPIV( II )
-                     IF( IP.NE.II ) THEN
-                        TEMP = AB( KV+1+II-JJ, JJ )
-                        AB( KV+1+II-JJ, JJ ) = AB( KV+1+IP-JJ, JJ )
-                        AB( KV+1+IP-JJ, JJ ) = TEMP
-                     END IF
-  100             CONTINUE
-  110          CONTINUE
-*
-*              Update the relevant part of the trailing submatrix
-*
-               IF( J2.GT.0 ) THEN
-*
-*                 Update A12
-*
-                  CALL DTRSM( 'Left', 'Lower', 'No transpose', 'Unit',
-     $                        JB, J2, ONE, AB( KV+1, J ), LDAB-1,
-     $                        AB( KV+1-JB, J+JB ), LDAB-1 )
-*
-                  IF( I2.GT.0 ) THEN
-*
-*                    Update A22
-*
-                     CALL DGEMM( 'No transpose', 'No transpose', I2, J2,
-     $                           JB, -ONE, AB( KV+1+JB, J ), LDAB-1,
-     $                           AB( KV+1-JB, J+JB ), LDAB-1, ONE,
-     $                           AB( KV+1, J+JB ), LDAB-1 )
-                  END IF
-*
-                  IF( I3.GT.0 ) THEN
-*
-*                    Update A32
-*
-                     CALL DGEMM( 'No transpose', 'No transpose', I3, J2,
-     $                           JB, -ONE, WORK31, LDWORK,
-     $                           AB( KV+1-JB, J+JB ), LDAB-1, ONE,
-     $                           AB( KV+KL+1-JB, J+JB ), LDAB-1 )
-                  END IF
-               END IF
-*
-               IF( J3.GT.0 ) THEN
-*
-*                 Copy the lower triangle of A13 into the work array
-*                 WORK13
-*
-                  DO 130 JJ = 1, J3
-                     DO 120 II = JJ, JB
-                        WORK13( II, JJ ) = AB( II-JJ+1, JJ+J+KV-1 )
-  120                CONTINUE
-  130             CONTINUE
-*
-*                 Update A13 in the work array
-*
-                  CALL DTRSM( 'Left', 'Lower', 'No transpose', 'Unit',
-     $                        JB, J3, ONE, AB( KV+1, J ), LDAB-1,
-     $                        WORK13, LDWORK )
-*
-                  IF( I2.GT.0 ) THEN
-*
-*                    Update A23
-*
-                     CALL DGEMM( 'No transpose', 'No transpose', I2, J3,
-     $                           JB, -ONE, AB( KV+1+JB, J ), LDAB-1,
-     $                           WORK13, LDWORK, ONE, AB( 1+JB, J+KV ),
-     $                           LDAB-1 )
-                  END IF
-*
-                  IF( I3.GT.0 ) THEN
-*
-*                    Update A33
-*
-                     CALL DGEMM( 'No transpose', 'No transpose', I3, J3,
-     $                           JB, -ONE, WORK31, LDWORK, WORK13,
-     $                           LDWORK, ONE, AB( 1+KL, J+KV ), LDAB-1 )
-                  END IF
-*
-*                 Copy the lower triangle of A13 back into place
-*
-                  DO 150 JJ = 1, J3
-                     DO 140 II = JJ, JB
-                        AB( II-JJ+1, JJ+J+KV-1 ) = WORK13( II, JJ )
-  140                CONTINUE
-  150             CONTINUE
-               END IF
-            ELSE
-*
-*              Adjust the pivot indices.
-*
-               DO 160 I = J, J + JB - 1
-                  IPIV( I ) = IPIV( I ) + J - 1
-  160          CONTINUE
-            END IF
-*
-*           Partially undo the interchanges in the current block to
-*           restore the upper triangular form of A31 and copy the upper
-*           triangle of A31 back into place
-*
-            DO 170 JJ = J + JB - 1, J, -1
-               JP = IPIV( JJ ) - JJ + 1
-               IF( JP.NE.1 ) THEN
-*
-*                 Apply interchange to columns J to JJ-1
-*
-                  IF( JP+JJ-1.LT.J+KL ) THEN
-*
-*                    The interchange does not affect A31
-*
-                     CALL DSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1,
-     $                           AB( KV+JP+JJ-J, J ), LDAB-1 )
-                  ELSE
-*
-*                    The interchange does affect A31
-*
-                     CALL DSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1,
-     $                           WORK31( JP+JJ-J-KL, 1 ), LDWORK )
-                  END IF
-               END IF
-*
-*              Copy the current column of A31 back into place
-*
-               NW = MIN( I3, JJ-J+1 )
-               IF( NW.GT.0 )
-     $            CALL DCOPY( NW, WORK31( 1, JJ-J+1 ), 1,
-     $                        AB( KV+KL+1-JJ+J, JJ ), 1 )
-  170       CONTINUE
-  180    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of DGBTRF
-*
-      END
--- a/libcruft/lapack/dgbtrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,186 +0,0 @@
-      SUBROUTINE DGBTRS( TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TRANS
-      INTEGER            INFO, KL, KU, LDAB, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      DOUBLE PRECISION   AB( LDAB, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGBTRS solves a system of linear equations
-*     A * X = B  or  A' * X = B
-*  with a general band matrix A using the LU factorization computed
-*  by DGBTRF.
-*
-*  Arguments
-*  =========
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the form of the system of equations.
-*          = 'N':  A * X = B  (No transpose)
-*          = 'T':  A'* X = B  (Transpose)
-*          = 'C':  A'* X = B  (Conjugate transpose = Transpose)
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KL      (input) INTEGER
-*          The number of subdiagonals within the band of A.  KL >= 0.
-*
-*  KU      (input) INTEGER
-*          The number of superdiagonals within the band of A.  KU >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  AB      (input) DOUBLE PRECISION array, dimension (LDAB,N)
-*          Details of the LU factorization of the band matrix A, as
-*          computed by DGBTRF.  U is stored as an upper triangular band
-*          matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and
-*          the multipliers used during the factorization are stored in
-*          rows KL+KU+2 to 2*KL+KU+1.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= N, row i of the matrix was
-*          interchanged with row IPIV(i).
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LNOTI, NOTRAN
-      INTEGER            I, J, KD, L, LM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMV, DGER, DSWAP, DTBSV, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      NOTRAN = LSAME( TRANS, 'N' )
-      IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
-     $    LSAME( TRANS, 'C' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KL.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( KU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDAB.LT.( 2*KL+KU+1 ) ) THEN
-         INFO = -7
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGBTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      KD = KU + KL + 1
-      LNOTI = KL.GT.0
-*
-      IF( NOTRAN ) THEN
-*
-*        Solve  A*X = B.
-*
-*        Solve L*X = B, overwriting B with X.
-*
-*        L is represented as a product of permutations and unit lower
-*        triangular matrices L = P(1) * L(1) * ... * P(n-1) * L(n-1),
-*        where each transformation L(i) is a rank-one modification of
-*        the identity matrix.
-*
-         IF( LNOTI ) THEN
-            DO 10 J = 1, N - 1
-               LM = MIN( KL, N-J )
-               L = IPIV( J )
-               IF( L.NE.J )
-     $            CALL DSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
-               CALL DGER( LM, NRHS, -ONE, AB( KD+1, J ), 1, B( J, 1 ),
-     $                    LDB, B( J+1, 1 ), LDB )
-   10       CONTINUE
-         END IF
-*
-         DO 20 I = 1, NRHS
-*
-*           Solve U*X = B, overwriting B with X.
-*
-            CALL DTBSV( 'Upper', 'No transpose', 'Non-unit', N, KL+KU,
-     $                  AB, LDAB, B( 1, I ), 1 )
-   20    CONTINUE
-*
-      ELSE
-*
-*        Solve A'*X = B.
-*
-         DO 30 I = 1, NRHS
-*
-*           Solve U'*X = B, overwriting B with X.
-*
-            CALL DTBSV( 'Upper', 'Transpose', 'Non-unit', N, KL+KU, AB,
-     $                  LDAB, B( 1, I ), 1 )
-   30    CONTINUE
-*
-*        Solve L'*X = B, overwriting B with X.
-*
-         IF( LNOTI ) THEN
-            DO 40 J = N - 1, 1, -1
-               LM = MIN( KL, N-J )
-               CALL DGEMV( 'Transpose', LM, NRHS, -ONE, B( J+1, 1 ),
-     $                     LDB, AB( KD+1, J ), 1, ONE, B( J, 1 ), LDB )
-               L = IPIV( J )
-               IF( L.NE.J )
-     $            CALL DSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
-   40       CONTINUE
-         END IF
-      END IF
-      RETURN
-*
-*     End of DGBTRS
-*
-      END
--- a/libcruft/lapack/dgebak.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,188 +0,0 @@
-      SUBROUTINE DGEBAK( JOB, SIDE, N, ILO, IHI, SCALE, M, V, LDV,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOB, SIDE
-      INTEGER            IHI, ILO, INFO, LDV, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   SCALE( * ), V( LDV, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGEBAK forms the right or left eigenvectors of a real general matrix
-*  by backward transformation on the computed eigenvectors of the
-*  balanced matrix output by DGEBAL.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies the type of backward transformation required:
-*          = 'N', do nothing, return immediately;
-*          = 'P', do backward transformation for permutation only;
-*          = 'S', do backward transformation for scaling only;
-*          = 'B', do backward transformations for both permutation and
-*                 scaling.
-*          JOB must be the same as the argument JOB supplied to DGEBAL.
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'R':  V contains right eigenvectors;
-*          = 'L':  V contains left eigenvectors.
-*
-*  N       (input) INTEGER
-*          The number of rows of the matrix V.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          The integers ILO and IHI determined by DGEBAL.
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  SCALE   (input) DOUBLE PRECISION array, dimension (N)
-*          Details of the permutation and scaling factors, as returned
-*          by DGEBAL.
-*
-*  M       (input) INTEGER
-*          The number of columns of the matrix V.  M >= 0.
-*
-*  V       (input/output) DOUBLE PRECISION array, dimension (LDV,M)
-*          On entry, the matrix of right or left eigenvectors to be
-*          transformed, as returned by DHSEIN or DTREVC.
-*          On exit, V is overwritten by the transformed eigenvectors.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V. LDV >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFTV, RIGHTV
-      INTEGER            I, II, K
-      DOUBLE PRECISION   S
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DSCAL, DSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and Test the input parameters
-*
-      RIGHTV = LSAME( SIDE, 'R' )
-      LEFTV = LSAME( SIDE, 'L' )
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
-     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -5
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -7
-      ELSE IF( LDV.LT.MAX( 1, N ) ) THEN
-         INFO = -9
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGEBAK', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-      IF( M.EQ.0 )
-     $   RETURN
-      IF( LSAME( JOB, 'N' ) )
-     $   RETURN
-*
-      IF( ILO.EQ.IHI )
-     $   GO TO 30
-*
-*     Backward balance
-*
-      IF( LSAME( JOB, 'S' ) .OR. LSAME( JOB, 'B' ) ) THEN
-*
-         IF( RIGHTV ) THEN
-            DO 10 I = ILO, IHI
-               S = SCALE( I )
-               CALL DSCAL( M, S, V( I, 1 ), LDV )
-   10       CONTINUE
-         END IF
-*
-         IF( LEFTV ) THEN
-            DO 20 I = ILO, IHI
-               S = ONE / SCALE( I )
-               CALL DSCAL( M, S, V( I, 1 ), LDV )
-   20       CONTINUE
-         END IF
-*
-      END IF
-*
-*     Backward permutation
-*
-*     For  I = ILO-1 step -1 until 1,
-*              IHI+1 step 1 until N do --
-*
-   30 CONTINUE
-      IF( LSAME( JOB, 'P' ) .OR. LSAME( JOB, 'B' ) ) THEN
-         IF( RIGHTV ) THEN
-            DO 40 II = 1, N
-               I = II
-               IF( I.GE.ILO .AND. I.LE.IHI )
-     $            GO TO 40
-               IF( I.LT.ILO )
-     $            I = ILO - II
-               K = SCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 40
-               CALL DSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   40       CONTINUE
-         END IF
-*
-         IF( LEFTV ) THEN
-            DO 50 II = 1, N
-               I = II
-               IF( I.GE.ILO .AND. I.LE.IHI )
-     $            GO TO 50
-               IF( I.LT.ILO )
-     $            I = ILO - II
-               K = SCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 50
-               CALL DSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   50       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DGEBAK
-*
-      END
--- a/libcruft/lapack/dgebal.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,322 +0,0 @@
-      SUBROUTINE DGEBAL( JOB, N, A, LDA, ILO, IHI, SCALE, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOB
-      INTEGER            IHI, ILO, INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), SCALE( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGEBAL balances a general real matrix A.  This involves, first,
-*  permuting A by a similarity transformation to isolate eigenvalues
-*  in the first 1 to ILO-1 and last IHI+1 to N elements on the
-*  diagonal; and second, applying a diagonal similarity transformation
-*  to rows and columns ILO to IHI to make the rows and columns as
-*  close in norm as possible.  Both steps are optional.
-*
-*  Balancing may reduce the 1-norm of the matrix, and improve the
-*  accuracy of the computed eigenvalues and/or eigenvectors.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies the operations to be performed on A:
-*          = 'N':  none:  simply set ILO = 1, IHI = N, SCALE(I) = 1.0
-*                  for i = 1,...,N;
-*          = 'P':  permute only;
-*          = 'S':  scale only;
-*          = 'B':  both permute and scale.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the input matrix A.
-*          On exit,  A is overwritten by the balanced matrix.
-*          If JOB = 'N', A is not referenced.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  ILO     (output) INTEGER
-*  IHI     (output) INTEGER
-*          ILO and IHI are set to integers such that on exit
-*          A(i,j) = 0 if i > j and j = 1,...,ILO-1 or I = IHI+1,...,N.
-*          If JOB = 'N' or 'S', ILO = 1 and IHI = N.
-*
-*  SCALE   (output) DOUBLE PRECISION array, dimension (N)
-*          Details of the permutations and scaling factors applied to
-*          A.  If P(j) is the index of the row and column interchanged
-*          with row and column j and D(j) is the scaling factor
-*          applied to row and column j, then
-*          SCALE(j) = P(j)    for j = 1,...,ILO-1
-*                   = D(j)    for j = ILO,...,IHI
-*                   = P(j)    for j = IHI+1,...,N.
-*          The order in which the interchanges are made is N to IHI+1,
-*          then 1 to ILO-1.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The permutations consist of row and column interchanges which put
-*  the matrix in the form
-*
-*             ( T1   X   Y  )
-*     P A P = (  0   B   Z  )
-*             (  0   0   T2 )
-*
-*  where T1 and T2 are upper triangular matrices whose eigenvalues lie
-*  along the diagonal.  The column indices ILO and IHI mark the starting
-*  and ending columns of the submatrix B. Balancing consists of applying
-*  a diagonal similarity transformation inv(D) * B * D to make the
-*  1-norms of each row of B and its corresponding column nearly equal.
-*  The output matrix is
-*
-*     ( T1     X*D          Y    )
-*     (  0  inv(D)*B*D  inv(D)*Z ).
-*     (  0      0           T2   )
-*
-*  Information about the permutations P and the diagonal matrix D is
-*  returned in the vector SCALE.
-*
-*  This subroutine is based on the EISPACK routine BALANC.
-*
-*  Modified by Tzu-Yi Chen, Computer Science Division, University of
-*    California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-      DOUBLE PRECISION   SCLFAC
-      PARAMETER          ( SCLFAC = 2.0D+0 )
-      DOUBLE PRECISION   FACTOR
-      PARAMETER          ( FACTOR = 0.95D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOCONV
-      INTEGER            I, ICA, IEXC, IRA, J, K, L, M
-      DOUBLE PRECISION   C, CA, F, G, R, RA, S, SFMAX1, SFMAX2, SFMIN1,
-     $                   SFMIN2
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           LSAME, IDAMAX, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DSCAL, DSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
-     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGEBAL', -INFO )
-         RETURN
-      END IF
-*
-      K = 1
-      L = N
-*
-      IF( N.EQ.0 )
-     $   GO TO 210
-*
-      IF( LSAME( JOB, 'N' ) ) THEN
-         DO 10 I = 1, N
-            SCALE( I ) = ONE
-   10    CONTINUE
-         GO TO 210
-      END IF
-*
-      IF( LSAME( JOB, 'S' ) )
-     $   GO TO 120
-*
-*     Permutation to isolate eigenvalues if possible
-*
-      GO TO 50
-*
-*     Row and column exchange.
-*
-   20 CONTINUE
-      SCALE( M ) = J
-      IF( J.EQ.M )
-     $   GO TO 30
-*
-      CALL DSWAP( L, A( 1, J ), 1, A( 1, M ), 1 )
-      CALL DSWAP( N-K+1, A( J, K ), LDA, A( M, K ), LDA )
-*
-   30 CONTINUE
-      GO TO ( 40, 80 )IEXC
-*
-*     Search for rows isolating an eigenvalue and push them down.
-*
-   40 CONTINUE
-      IF( L.EQ.1 )
-     $   GO TO 210
-      L = L - 1
-*
-   50 CONTINUE
-      DO 70 J = L, 1, -1
-*
-         DO 60 I = 1, L
-            IF( I.EQ.J )
-     $         GO TO 60
-            IF( A( J, I ).NE.ZERO )
-     $         GO TO 70
-   60    CONTINUE
-*
-         M = L
-         IEXC = 1
-         GO TO 20
-   70 CONTINUE
-*
-      GO TO 90
-*
-*     Search for columns isolating an eigenvalue and push them left.
-*
-   80 CONTINUE
-      K = K + 1
-*
-   90 CONTINUE
-      DO 110 J = K, L
-*
-         DO 100 I = K, L
-            IF( I.EQ.J )
-     $         GO TO 100
-            IF( A( I, J ).NE.ZERO )
-     $         GO TO 110
-  100    CONTINUE
-*
-         M = K
-         IEXC = 2
-         GO TO 20
-  110 CONTINUE
-*
-  120 CONTINUE
-      DO 130 I = K, L
-         SCALE( I ) = ONE
-  130 CONTINUE
-*
-      IF( LSAME( JOB, 'P' ) )
-     $   GO TO 210
-*
-*     Balance the submatrix in rows K to L.
-*
-*     Iterative loop for norm reduction
-*
-      SFMIN1 = DLAMCH( 'S' ) / DLAMCH( 'P' )
-      SFMAX1 = ONE / SFMIN1
-      SFMIN2 = SFMIN1*SCLFAC
-      SFMAX2 = ONE / SFMIN2
-  140 CONTINUE
-      NOCONV = .FALSE.
-*
-      DO 200 I = K, L
-         C = ZERO
-         R = ZERO
-*
-         DO 150 J = K, L
-            IF( J.EQ.I )
-     $         GO TO 150
-            C = C + ABS( A( J, I ) )
-            R = R + ABS( A( I, J ) )
-  150    CONTINUE
-         ICA = IDAMAX( L, A( 1, I ), 1 )
-         CA = ABS( A( ICA, I ) )
-         IRA = IDAMAX( N-K+1, A( I, K ), LDA )
-         RA = ABS( A( I, IRA+K-1 ) )
-*
-*        Guard against zero C or R due to underflow.
-*
-         IF( C.EQ.ZERO .OR. R.EQ.ZERO )
-     $      GO TO 200
-         G = R / SCLFAC
-         F = ONE
-         S = C + R
-  160    CONTINUE
-         IF( C.GE.G .OR. MAX( F, C, CA ).GE.SFMAX2 .OR.
-     $       MIN( R, G, RA ).LE.SFMIN2 )GO TO 170
-         F = F*SCLFAC
-         C = C*SCLFAC
-         CA = CA*SCLFAC
-         R = R / SCLFAC
-         G = G / SCLFAC
-         RA = RA / SCLFAC
-         GO TO 160
-*
-  170    CONTINUE
-         G = C / SCLFAC
-  180    CONTINUE
-         IF( G.LT.R .OR. MAX( R, RA ).GE.SFMAX2 .OR.
-     $       MIN( F, C, G, CA ).LE.SFMIN2 )GO TO 190
-         F = F / SCLFAC
-         C = C / SCLFAC
-         G = G / SCLFAC
-         CA = CA / SCLFAC
-         R = R*SCLFAC
-         RA = RA*SCLFAC
-         GO TO 180
-*
-*        Now balance.
-*
-  190    CONTINUE
-         IF( ( C+R ).GE.FACTOR*S )
-     $      GO TO 200
-         IF( F.LT.ONE .AND. SCALE( I ).LT.ONE ) THEN
-            IF( F*SCALE( I ).LE.SFMIN1 )
-     $         GO TO 200
-         END IF
-         IF( F.GT.ONE .AND. SCALE( I ).GT.ONE ) THEN
-            IF( SCALE( I ).GE.SFMAX1 / F )
-     $         GO TO 200
-         END IF
-         G = ONE / F
-         SCALE( I ) = SCALE( I )*F
-         NOCONV = .TRUE.
-*
-         CALL DSCAL( N-K+1, G, A( I, K ), LDA )
-         CALL DSCAL( L, F, A( 1, I ), 1 )
-*
-  200 CONTINUE
-*
-      IF( NOCONV )
-     $   GO TO 140
-*
-  210 CONTINUE
-      ILO = K
-      IHI = L
-*
-      RETURN
-*
-*     End of DGEBAL
-*
-      END
--- a/libcruft/lapack/dgebd2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,239 +0,0 @@
-      SUBROUTINE DGEBD2( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), D( * ), E( * ), TAUP( * ),
-     $                   TAUQ( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGEBD2 reduces a real general m by n matrix A to upper or lower
-*  bidiagonal form B by an orthogonal transformation: Q' * A * P = B.
-*
-*  If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows in the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns in the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the m by n general matrix to be reduced.
-*          On exit,
-*          if m >= n, the diagonal and the first superdiagonal are
-*            overwritten with the upper bidiagonal matrix B; the
-*            elements below the diagonal, with the array TAUQ, represent
-*            the orthogonal matrix Q as a product of elementary
-*            reflectors, and the elements above the first superdiagonal,
-*            with the array TAUP, represent the orthogonal matrix P as
-*            a product of elementary reflectors;
-*          if m < n, the diagonal and the first subdiagonal are
-*            overwritten with the lower bidiagonal matrix B; the
-*            elements below the first subdiagonal, with the array TAUQ,
-*            represent the orthogonal matrix Q as a product of
-*            elementary reflectors, and the elements above the diagonal,
-*            with the array TAUP, represent the orthogonal matrix P as
-*            a product of elementary reflectors.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  D       (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The diagonal elements of the bidiagonal matrix B:
-*          D(i) = A(i,i).
-*
-*  E       (output) DOUBLE PRECISION array, dimension (min(M,N)-1)
-*          The off-diagonal elements of the bidiagonal matrix B:
-*          if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1;
-*          if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1.
-*
-*  TAUQ    (output) DOUBLE PRECISION array dimension (min(M,N))
-*          The scalar factors of the elementary reflectors which
-*          represent the orthogonal matrix Q. See Further Details.
-*
-*  TAUP    (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors which
-*          represent the orthogonal matrix P. See Further Details.
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (max(M,N))
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit.
-*          < 0: if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrices Q and P are represented as products of elementary
-*  reflectors:
-*
-*  If m >= n,
-*
-*     Q = H(1) H(2) . . . H(n)  and  P = G(1) G(2) . . . G(n-1)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are real scalars, and v and u are real vectors;
-*  v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in A(i+1:m,i);
-*  u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in A(i,i+2:n);
-*  tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  If m < n,
-*
-*     Q = H(1) H(2) . . . H(m-1)  and  P = G(1) G(2) . . . G(m)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are real scalars, and v and u are real vectors;
-*  v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in A(i+2:m,i);
-*  u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in A(i,i+1:n);
-*  tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  The contents of A on exit are illustrated by the following examples:
-*
-*  m = 6 and n = 5 (m > n):          m = 5 and n = 6 (m < n):
-*
-*    (  d   e   u1  u1  u1 )           (  d   u1  u1  u1  u1  u1 )
-*    (  v1  d   e   u2  u2 )           (  e   d   u2  u2  u2  u2 )
-*    (  v1  v2  d   e   u3 )           (  v1  e   d   u3  u3  u3 )
-*    (  v1  v2  v3  d   e  )           (  v1  v2  e   d   u4  u4 )
-*    (  v1  v2  v3  v4  d  )           (  v1  v2  v3  e   d   u5 )
-*    (  v1  v2  v3  v4  v5 )
-*
-*  where d and e denote diagonal and off-diagonal elements of B, vi
-*  denotes an element of the vector defining H(i), and ui an element of
-*  the vector defining G(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARF, DLARFG, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.LT.0 ) THEN
-         CALL XERBLA( 'DGEBD2', -INFO )
-         RETURN
-      END IF
-*
-      IF( M.GE.N ) THEN
-*
-*        Reduce to upper bidiagonal form
-*
-         DO 10 I = 1, N
-*
-*           Generate elementary reflector H(i) to annihilate A(i+1:m,i)
-*
-            CALL DLARFG( M-I+1, A( I, I ), A( MIN( I+1, M ), I ), 1,
-     $                   TAUQ( I ) )
-            D( I ) = A( I, I )
-            A( I, I ) = ONE
-*
-*           Apply H(i) to A(i:m,i+1:n) from the left
-*
-            IF( I.LT.N )
-     $         CALL DLARF( 'Left', M-I+1, N-I, A( I, I ), 1, TAUQ( I ),
-     $                     A( I, I+1 ), LDA, WORK )
-            A( I, I ) = D( I )
-*
-            IF( I.LT.N ) THEN
-*
-*              Generate elementary reflector G(i) to annihilate
-*              A(i,i+2:n)
-*
-               CALL DLARFG( N-I, A( I, I+1 ), A( I, MIN( I+2, N ) ),
-     $                      LDA, TAUP( I ) )
-               E( I ) = A( I, I+1 )
-               A( I, I+1 ) = ONE
-*
-*              Apply G(i) to A(i+1:m,i+1:n) from the right
-*
-               CALL DLARF( 'Right', M-I, N-I, A( I, I+1 ), LDA,
-     $                     TAUP( I ), A( I+1, I+1 ), LDA, WORK )
-               A( I, I+1 ) = E( I )
-            ELSE
-               TAUP( I ) = ZERO
-            END IF
-   10    CONTINUE
-      ELSE
-*
-*        Reduce to lower bidiagonal form
-*
-         DO 20 I = 1, M
-*
-*           Generate elementary reflector G(i) to annihilate A(i,i+1:n)
-*
-            CALL DLARFG( N-I+1, A( I, I ), A( I, MIN( I+1, N ) ), LDA,
-     $                   TAUP( I ) )
-            D( I ) = A( I, I )
-            A( I, I ) = ONE
-*
-*           Apply G(i) to A(i+1:m,i:n) from the right
-*
-            IF( I.LT.M )
-     $         CALL DLARF( 'Right', M-I, N-I+1, A( I, I ), LDA,
-     $                     TAUP( I ), A( I+1, I ), LDA, WORK )
-            A( I, I ) = D( I )
-*
-            IF( I.LT.M ) THEN
-*
-*              Generate elementary reflector H(i) to annihilate
-*              A(i+2:m,i)
-*
-               CALL DLARFG( M-I, A( I+1, I ), A( MIN( I+2, M ), I ), 1,
-     $                      TAUQ( I ) )
-               E( I ) = A( I+1, I )
-               A( I+1, I ) = ONE
-*
-*              Apply H(i) to A(i+1:m,i+1:n) from the left
-*
-               CALL DLARF( 'Left', M-I, N-I, A( I+1, I ), 1, TAUQ( I ),
-     $                     A( I+1, I+1 ), LDA, WORK )
-               A( I+1, I ) = E( I )
-            ELSE
-               TAUQ( I ) = ZERO
-            END IF
-   20    CONTINUE
-      END IF
-      RETURN
-*
-*     End of DGEBD2
-*
-      END
--- a/libcruft/lapack/dgebrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,268 +0,0 @@
-      SUBROUTINE DGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), D( * ), E( * ), TAUP( * ),
-     $                   TAUQ( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGEBRD reduces a general real M-by-N matrix A to upper or lower
-*  bidiagonal form B by an orthogonal transformation: Q**T * A * P = B.
-*
-*  If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows in the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns in the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the M-by-N general matrix to be reduced.
-*          On exit,
-*          if m >= n, the diagonal and the first superdiagonal are
-*            overwritten with the upper bidiagonal matrix B; the
-*            elements below the diagonal, with the array TAUQ, represent
-*            the orthogonal matrix Q as a product of elementary
-*            reflectors, and the elements above the first superdiagonal,
-*            with the array TAUP, represent the orthogonal matrix P as
-*            a product of elementary reflectors;
-*          if m < n, the diagonal and the first subdiagonal are
-*            overwritten with the lower bidiagonal matrix B; the
-*            elements below the first subdiagonal, with the array TAUQ,
-*            represent the orthogonal matrix Q as a product of
-*            elementary reflectors, and the elements above the diagonal,
-*            with the array TAUP, represent the orthogonal matrix P as
-*            a product of elementary reflectors.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  D       (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The diagonal elements of the bidiagonal matrix B:
-*          D(i) = A(i,i).
-*
-*  E       (output) DOUBLE PRECISION array, dimension (min(M,N)-1)
-*          The off-diagonal elements of the bidiagonal matrix B:
-*          if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1;
-*          if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1.
-*
-*  TAUQ    (output) DOUBLE PRECISION array dimension (min(M,N))
-*          The scalar factors of the elementary reflectors which
-*          represent the orthogonal matrix Q. See Further Details.
-*
-*  TAUP    (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors which
-*          represent the orthogonal matrix P. See Further Details.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The length of the array WORK.  LWORK >= max(1,M,N).
-*          For optimum performance LWORK >= (M+N)*NB, where NB
-*          is the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrices Q and P are represented as products of elementary
-*  reflectors:
-*
-*  If m >= n,
-*
-*     Q = H(1) H(2) . . . H(n)  and  P = G(1) G(2) . . . G(n-1)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are real scalars, and v and u are real vectors;
-*  v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in A(i+1:m,i);
-*  u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in A(i,i+2:n);
-*  tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  If m < n,
-*
-*     Q = H(1) H(2) . . . H(m-1)  and  P = G(1) G(2) . . . G(m)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are real scalars, and v and u are real vectors;
-*  v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in A(i+2:m,i);
-*  u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in A(i,i+1:n);
-*  tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  The contents of A on exit are illustrated by the following examples:
-*
-*  m = 6 and n = 5 (m > n):          m = 5 and n = 6 (m < n):
-*
-*    (  d   e   u1  u1  u1 )           (  d   u1  u1  u1  u1  u1 )
-*    (  v1  d   e   u2  u2 )           (  e   d   u2  u2  u2  u2 )
-*    (  v1  v2  d   e   u3 )           (  v1  e   d   u3  u3  u3 )
-*    (  v1  v2  v3  d   e  )           (  v1  v2  e   d   u4  u4 )
-*    (  v1  v2  v3  v4  d  )           (  v1  v2  v3  e   d   u5 )
-*    (  v1  v2  v3  v4  v5 )
-*
-*  where d and e denote diagonal and off-diagonal elements of B, vi
-*  denotes an element of the vector defining H(i), and ui an element of
-*  the vector defining G(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IINFO, J, LDWRKX, LDWRKY, LWKOPT, MINMN, NB,
-     $                   NBMIN, NX
-      DOUBLE PRECISION   WS
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEBD2, DGEMM, DLABRD, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      NB = MAX( 1, ILAENV( 1, 'DGEBRD', ' ', M, N, -1, -1 ) )
-      LWKOPT = ( M+N )*NB
-      WORK( 1 ) = DBLE( LWKOPT )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.MAX( 1, M, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.LT.0 ) THEN
-         CALL XERBLA( 'DGEBRD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      MINMN = MIN( M, N )
-      IF( MINMN.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      WS = MAX( M, N )
-      LDWRKX = M
-      LDWRKY = N
-*
-      IF( NB.GT.1 .AND. NB.LT.MINMN ) THEN
-*
-*        Set the crossover point NX.
-*
-         NX = MAX( NB, ILAENV( 3, 'DGEBRD', ' ', M, N, -1, -1 ) )
-*
-*        Determine when to switch from blocked to unblocked code.
-*
-         IF( NX.LT.MINMN ) THEN
-            WS = ( M+N )*NB
-            IF( LWORK.LT.WS ) THEN
-*
-*              Not enough work space for the optimal NB, consider using
-*              a smaller block size.
-*
-               NBMIN = ILAENV( 2, 'DGEBRD', ' ', M, N, -1, -1 )
-               IF( LWORK.GE.( M+N )*NBMIN ) THEN
-                  NB = LWORK / ( M+N )
-               ELSE
-                  NB = 1
-                  NX = MINMN
-               END IF
-            END IF
-         END IF
-      ELSE
-         NX = MINMN
-      END IF
-*
-      DO 30 I = 1, MINMN - NX, NB
-*
-*        Reduce rows and columns i:i+nb-1 to bidiagonal form and return
-*        the matrices X and Y which are needed to update the unreduced
-*        part of the matrix
-*
-         CALL DLABRD( M-I+1, N-I+1, NB, A( I, I ), LDA, D( I ), E( I ),
-     $                TAUQ( I ), TAUP( I ), WORK, LDWRKX,
-     $                WORK( LDWRKX*NB+1 ), LDWRKY )
-*
-*        Update the trailing submatrix A(i+nb:m,i+nb:n), using an update
-*        of the form  A := A - V*Y' - X*U'
-*
-         CALL DGEMM( 'No transpose', 'Transpose', M-I-NB+1, N-I-NB+1,
-     $               NB, -ONE, A( I+NB, I ), LDA,
-     $               WORK( LDWRKX*NB+NB+1 ), LDWRKY, ONE,
-     $               A( I+NB, I+NB ), LDA )
-         CALL DGEMM( 'No transpose', 'No transpose', M-I-NB+1, N-I-NB+1,
-     $               NB, -ONE, WORK( NB+1 ), LDWRKX, A( I, I+NB ), LDA,
-     $               ONE, A( I+NB, I+NB ), LDA )
-*
-*        Copy diagonal and off-diagonal elements of B back into A
-*
-         IF( M.GE.N ) THEN
-            DO 10 J = I, I + NB - 1
-               A( J, J ) = D( J )
-               A( J, J+1 ) = E( J )
-   10       CONTINUE
-         ELSE
-            DO 20 J = I, I + NB - 1
-               A( J, J ) = D( J )
-               A( J+1, J ) = E( J )
-   20       CONTINUE
-         END IF
-   30 CONTINUE
-*
-*     Use unblocked code to reduce the remainder of the matrix
-*
-      CALL DGEBD2( M-I+1, N-I+1, A( I, I ), LDA, D( I ), E( I ),
-     $             TAUQ( I ), TAUP( I ), WORK, IINFO )
-      WORK( 1 ) = WS
-      RETURN
-*
-*     End of DGEBRD
-*
-      END
--- a/libcruft/lapack/dgecon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,185 +0,0 @@
-      SUBROUTINE DGECON( NORM, N, A, LDA, ANORM, RCOND, WORK, IWORK,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            INFO, LDA, N
-      DOUBLE PRECISION   ANORM, RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      DOUBLE PRECISION   A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGECON estimates the reciprocal of the condition number of a general
-*  real matrix A, in either the 1-norm or the infinity-norm, using
-*  the LU factorization computed by DGETRF.
-*
-*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
-*  condition number is computed as
-*     RCOND = 1 / ( norm(A) * norm(inv(A)) ).
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies whether the 1-norm condition number or the
-*          infinity-norm condition number is required:
-*          = '1' or 'O':  1-norm;
-*          = 'I':         Infinity-norm.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA,N)
-*          The factors L and U from the factorization A = P*L*U
-*          as computed by DGETRF.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  ANORM   (input) DOUBLE PRECISION
-*          If NORM = '1' or 'O', the 1-norm of the original matrix A.
-*          If NORM = 'I', the infinity-norm of the original matrix A.
-*
-*  RCOND   (output) DOUBLE PRECISION
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(norm(A) * norm(inv(A))).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (4*N)
-*
-*  IWORK   (workspace) INTEGER array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ONENRM
-      CHARACTER          NORMIN
-      INTEGER            IX, KASE, KASE1
-      DOUBLE PRECISION   AINVNM, SCALE, SL, SMLNUM, SU
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           LSAME, IDAMAX, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLACN2, DLATRS, DRSCL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' )
-      IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( ANORM.LT.ZERO ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGECON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      RCOND = ZERO
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      ELSE IF( ANORM.EQ.ZERO ) THEN
-         RETURN
-      END IF
-*
-      SMLNUM = DLAMCH( 'Safe minimum' )
-*
-*     Estimate the norm of inv(A).
-*
-      AINVNM = ZERO
-      NORMIN = 'N'
-      IF( ONENRM ) THEN
-         KASE1 = 1
-      ELSE
-         KASE1 = 2
-      END IF
-      KASE = 0
-   10 CONTINUE
-      CALL DLACN2( N, WORK( N+1 ), WORK, IWORK, AINVNM, KASE, ISAVE )
-      IF( KASE.NE.0 ) THEN
-         IF( KASE.EQ.KASE1 ) THEN
-*
-*           Multiply by inv(L).
-*
-            CALL DLATRS( 'Lower', 'No transpose', 'Unit', NORMIN, N, A,
-     $                   LDA, WORK, SL, WORK( 2*N+1 ), INFO )
-*
-*           Multiply by inv(U).
-*
-            CALL DLATRS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   A, LDA, WORK, SU, WORK( 3*N+1 ), INFO )
-         ELSE
-*
-*           Multiply by inv(U').
-*
-            CALL DLATRS( 'Upper', 'Transpose', 'Non-unit', NORMIN, N, A,
-     $                   LDA, WORK, SU, WORK( 3*N+1 ), INFO )
-*
-*           Multiply by inv(L').
-*
-            CALL DLATRS( 'Lower', 'Transpose', 'Unit', NORMIN, N, A,
-     $                   LDA, WORK, SL, WORK( 2*N+1 ), INFO )
-         END IF
-*
-*        Divide X by 1/(SL*SU) if doing so will not cause overflow.
-*
-         SCALE = SL*SU
-         NORMIN = 'Y'
-         IF( SCALE.NE.ONE ) THEN
-            IX = IDAMAX( N, WORK, 1 )
-            IF( SCALE.LT.ABS( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
-     $         GO TO 20
-            CALL DRSCL( N, SCALE, WORK, 1 )
-         END IF
-         GO TO 10
-      END IF
-*
-*     Compute the estimate of the reciprocal condition number.
-*
-      IF( AINVNM.NE.ZERO )
-     $   RCOND = ( ONE / AINVNM ) / ANORM
-*
-   20 CONTINUE
-      RETURN
-*
-*     End of DGECON
-*
-      END
--- a/libcruft/lapack/dgeesx.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,527 +0,0 @@
-      SUBROUTINE DGEESX( JOBVS, SORT, SELECT, SENSE, N, A, LDA, SDIM,
-     $                   WR, WI, VS, LDVS, RCONDE, RCONDV, WORK, LWORK,
-     $                   IWORK, LIWORK, BWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBVS, SENSE, SORT
-      INTEGER            INFO, LDA, LDVS, LIWORK, LWORK, N, SDIM
-      DOUBLE PRECISION   RCONDE, RCONDV
-*     ..
-*     .. Array Arguments ..
-      LOGICAL            BWORK( * )
-      INTEGER            IWORK( * )
-      DOUBLE PRECISION   A( LDA, * ), VS( LDVS, * ), WI( * ), WORK( * ),
-     $                   WR( * )
-*     ..
-*     .. Function Arguments ..
-      LOGICAL            SELECT
-      EXTERNAL           SELECT
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGEESX computes for an N-by-N real nonsymmetric matrix A, the
-*  eigenvalues, the real Schur form T, and, optionally, the matrix of
-*  Schur vectors Z.  This gives the Schur factorization A = Z*T*(Z**T).
-*
-*  Optionally, it also orders the eigenvalues on the diagonal of the
-*  real Schur form so that selected eigenvalues are at the top left;
-*  computes a reciprocal condition number for the average of the
-*  selected eigenvalues (RCONDE); and computes a reciprocal condition
-*  number for the right invariant subspace corresponding to the
-*  selected eigenvalues (RCONDV).  The leading columns of Z form an
-*  orthonormal basis for this invariant subspace.
-*
-*  For further explanation of the reciprocal condition numbers RCONDE
-*  and RCONDV, see Section 4.10 of the LAPACK Users' Guide (where
-*  these quantities are called s and sep respectively).
-*
-*  A real matrix is in real Schur form if it is upper quasi-triangular
-*  with 1-by-1 and 2-by-2 blocks. 2-by-2 blocks will be standardized in
-*  the form
-*            [  a  b  ]
-*            [  c  a  ]
-*
-*  where b*c < 0. The eigenvalues of such a block are a +- sqrt(bc).
-*
-*  Arguments
-*  =========
-*
-*  JOBVS   (input) CHARACTER*1
-*          = 'N': Schur vectors are not computed;
-*          = 'V': Schur vectors are computed.
-*
-*  SORT    (input) CHARACTER*1
-*          Specifies whether or not to order the eigenvalues on the
-*          diagonal of the Schur form.
-*          = 'N': Eigenvalues are not ordered;
-*          = 'S': Eigenvalues are ordered (see SELECT).
-*
-*  SELECT  (external procedure) LOGICAL FUNCTION of two DOUBLE PRECISION arguments
-*          SELECT must be declared EXTERNAL in the calling subroutine.
-*          If SORT = 'S', SELECT is used to select eigenvalues to sort
-*          to the top left of the Schur form.
-*          If SORT = 'N', SELECT is not referenced.
-*          An eigenvalue WR(j)+sqrt(-1)*WI(j) is selected if
-*          SELECT(WR(j),WI(j)) is true; i.e., if either one of a
-*          complex conjugate pair of eigenvalues is selected, then both
-*          are.  Note that a selected complex eigenvalue may no longer
-*          satisfy SELECT(WR(j),WI(j)) = .TRUE. after ordering, since
-*          ordering may change the value of complex eigenvalues
-*          (especially if the eigenvalue is ill-conditioned); in this
-*          case INFO may be set to N+3 (see INFO below).
-*
-*  SENSE   (input) CHARACTER*1
-*          Determines which reciprocal condition numbers are computed.
-*          = 'N': None are computed;
-*          = 'E': Computed for average of selected eigenvalues only;
-*          = 'V': Computed for selected right invariant subspace only;
-*          = 'B': Computed for both.
-*          If SENSE = 'E', 'V' or 'B', SORT must equal 'S'.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A. N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA, N)
-*          On entry, the N-by-N matrix A.
-*          On exit, A is overwritten by its real Schur form T.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  SDIM    (output) INTEGER
-*          If SORT = 'N', SDIM = 0.
-*          If SORT = 'S', SDIM = number of eigenvalues (after sorting)
-*                         for which SELECT is true. (Complex conjugate
-*                         pairs for which SELECT is true for either
-*                         eigenvalue count as 2.)
-*
-*  WR      (output) DOUBLE PRECISION array, dimension (N)
-*  WI      (output) DOUBLE PRECISION array, dimension (N)
-*          WR and WI contain the real and imaginary parts, respectively,
-*          of the computed eigenvalues, in the same order that they
-*          appear on the diagonal of the output Schur form T.  Complex
-*          conjugate pairs of eigenvalues appear consecutively with the
-*          eigenvalue having the positive imaginary part first.
-*
-*  VS      (output) DOUBLE PRECISION array, dimension (LDVS,N)
-*          If JOBVS = 'V', VS contains the orthogonal matrix Z of Schur
-*          vectors.
-*          If JOBVS = 'N', VS is not referenced.
-*
-*  LDVS    (input) INTEGER
-*          The leading dimension of the array VS.  LDVS >= 1, and if
-*          JOBVS = 'V', LDVS >= N.
-*
-*  RCONDE  (output) DOUBLE PRECISION
-*          If SENSE = 'E' or 'B', RCONDE contains the reciprocal
-*          condition number for the average of the selected eigenvalues.
-*          Not referenced if SENSE = 'N' or 'V'.
-*
-*  RCONDV  (output) DOUBLE PRECISION
-*          If SENSE = 'V' or 'B', RCONDV contains the reciprocal
-*          condition number for the selected right invariant subspace.
-*          Not referenced if SENSE = 'N' or 'E'.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,3*N).
-*          Also, if SENSE = 'E' or 'V' or 'B',
-*          LWORK >= N+2*SDIM*(N-SDIM), where SDIM is the number of
-*          selected eigenvalues computed by this routine.  Note that
-*          N+2*SDIM*(N-SDIM) <= N+N*N/2. Note also that an error is only
-*          returned if LWORK < max(1,3*N), but if SENSE = 'E' or 'V' or
-*          'B' this may not be large enough.
-*          For good performance, LWORK must generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates upper bounds on the optimal sizes of the
-*          arrays WORK and IWORK, returns these values as the first
-*          entries of the WORK and IWORK arrays, and no error messages
-*          related to LWORK or LIWORK are issued by XERBLA.
-*
-*  IWORK   (workspace/output) INTEGER array, dimension (MAX(1,LIWORK))
-*          On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK.
-*
-*  LIWORK  (input) INTEGER
-*          The dimension of the array IWORK.
-*          LIWORK >= 1; if SENSE = 'V' or 'B', LIWORK >= SDIM*(N-SDIM).
-*          Note that SDIM*(N-SDIM) <= N*N/4. Note also that an error is
-*          only returned if LIWORK < 1, but if SENSE = 'V' or 'B' this
-*          may not be large enough.
-*
-*          If LIWORK = -1, then a workspace query is assumed; the
-*          routine only calculates upper bounds on the optimal sizes of
-*          the arrays WORK and IWORK, returns these values as the first
-*          entries of the WORK and IWORK arrays, and no error messages
-*          related to LWORK or LIWORK are issued by XERBLA.
-*
-*  BWORK   (workspace) LOGICAL array, dimension (N)
-*          Not referenced if SORT = 'N'.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value.
-*          > 0: if INFO = i, and i is
-*             <= N: the QR algorithm failed to compute all the
-*                   eigenvalues; elements 1:ILO-1 and i+1:N of WR and WI
-*                   contain those eigenvalues which have converged; if
-*                   JOBVS = 'V', VS contains the transformation which
-*                   reduces A to its partially converged Schur form.
-*             = N+1: the eigenvalues could not be reordered because some
-*                   eigenvalues were too close to separate (the problem
-*                   is very ill-conditioned);
-*             = N+2: after reordering, roundoff changed values of some
-*                   complex eigenvalues so that leading eigenvalues in
-*                   the Schur form no longer satisfy SELECT=.TRUE.  This
-*                   could also be caused by underflow due to scaling.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            CURSL, LASTSL, LQUERY, LST2SL, SCALEA, WANTSB,
-     $                   WANTSE, WANTSN, WANTST, WANTSV, WANTVS
-      INTEGER            HSWORK, I, I1, I2, IBAL, ICOND, IERR, IEVAL,
-     $                   IHI, ILO, INXT, IP, ITAU, IWRK, LIWRK, LWRK,
-     $                   MAXWRK, MINWRK
-      DOUBLE PRECISION   ANRM, BIGNUM, CSCALE, EPS, SMLNUM
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   DUM( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DGEBAK, DGEBAL, DGEHRD, DHSEQR, DLACPY,
-     $                   DLASCL, DORGHR, DSWAP, DTRSEN, XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      DOUBLE PRECISION   DLAMCH, DLANGE
-      EXTERNAL           LSAME, ILAENV, DLABAD, DLAMCH, DLANGE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      WANTVS = LSAME( JOBVS, 'V' )
-      WANTST = LSAME( SORT, 'S' )
-      WANTSN = LSAME( SENSE, 'N' )
-      WANTSE = LSAME( SENSE, 'E' )
-      WANTSV = LSAME( SENSE, 'V' )
-      WANTSB = LSAME( SENSE, 'B' )
-      LQUERY = ( LWORK.EQ.-1 .OR. LIWORK.EQ.-1 )
-      IF( ( .NOT.WANTVS ) .AND. ( .NOT.LSAME( JOBVS, 'N' ) ) ) THEN
-         INFO = -1
-      ELSE IF( ( .NOT.WANTST ) .AND. ( .NOT.LSAME( SORT, 'N' ) ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.( WANTSN .OR. WANTSE .OR. WANTSV .OR. WANTSB ) .OR.
-     $         ( .NOT.WANTST .AND. .NOT.WANTSN ) ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDVS.LT.1 .OR. ( WANTVS .AND. LDVS.LT.N ) ) THEN
-         INFO = -12
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "RWorkspace:" describe the
-*       minimal amount of real workspace needed at that point in the
-*       code, as well as the preferred amount for good performance.
-*       IWorkspace refers to integer workspace.
-*       NB refers to the optimal block size for the immediately
-*       following subroutine, as returned by ILAENV.
-*       HSWORK refers to the workspace preferred by DHSEQR, as
-*       calculated below. HSWORK is computed assuming ILO=1 and IHI=N,
-*       the worst case.
-*       If SENSE = 'E', 'V' or 'B', then the amount of workspace needed
-*       depends on SDIM, which is computed by the routine DTRSEN later
-*       in the code.)
-*
-      IF( INFO.EQ.0 ) THEN
-         LIWRK = 1
-         IF( N.EQ.0 ) THEN
-            MINWRK = 1
-            LWRK = 1
-         ELSE
-            MAXWRK = 2*N + N*ILAENV( 1, 'DGEHRD', ' ', N, 1, N, 0 )
-            MINWRK = 3*N
-*
-            CALL DHSEQR( 'S', JOBVS, N, 1, N, A, LDA, WR, WI, VS, LDVS,
-     $             WORK, -1, IEVAL )
-            HSWORK = WORK( 1 )
-*
-            IF( .NOT.WANTVS ) THEN
-               MAXWRK = MAX( MAXWRK, N + HSWORK )
-            ELSE
-               MAXWRK = MAX( MAXWRK, 2*N + ( N - 1 )*ILAENV( 1,
-     $                       'DORGHR', ' ', N, 1, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, N + HSWORK )
-            END IF
-            LWRK = MAXWRK
-            IF( .NOT.WANTSN )
-     $         LWRK = MAX( LWRK, N + ( N*N )/2 )
-            IF( WANTSV .OR. WANTSB )
-     $         LIWRK = ( N*N )/4
-         END IF
-         IWORK( 1 ) = LIWRK
-         WORK( 1 ) = LWRK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
-            INFO = -16
-         ELSE IF( LIWORK.LT.1 .AND. .NOT.LQUERY ) THEN
-            INFO = -18
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGEESX', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         SDIM = 0
-         RETURN
-      END IF
-*
-*     Get machine constants
-*
-      EPS = DLAMCH( 'P' )
-      SMLNUM = DLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SQRT( SMLNUM ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = DLANGE( 'M', N, N, A, LDA, DUM )
-      SCALEA = .FALSE.
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-         SCALEA = .TRUE.
-         CSCALE = SMLNUM
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-         SCALEA = .TRUE.
-         CSCALE = BIGNUM
-      END IF
-      IF( SCALEA )
-     $   CALL DLASCL( 'G', 0, 0, ANRM, CSCALE, N, N, A, LDA, IERR )
-*
-*     Permute the matrix to make it more nearly triangular
-*     (RWorkspace: need N)
-*
-      IBAL = 1
-      CALL DGEBAL( 'P', N, A, LDA, ILO, IHI, WORK( IBAL ), IERR )
-*
-*     Reduce to upper Hessenberg form
-*     (RWorkspace: need 3*N, prefer 2*N+N*NB)
-*
-      ITAU = N + IBAL
-      IWRK = N + ITAU
-      CALL DGEHRD( N, ILO, IHI, A, LDA, WORK( ITAU ), WORK( IWRK ),
-     $             LWORK-IWRK+1, IERR )
-*
-      IF( WANTVS ) THEN
-*
-*        Copy Householder vectors to VS
-*
-         CALL DLACPY( 'L', N, N, A, LDA, VS, LDVS )
-*
-*        Generate orthogonal matrix in VS
-*        (RWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*
-         CALL DORGHR( N, ILO, IHI, VS, LDVS, WORK( ITAU ), WORK( IWRK ),
-     $                LWORK-IWRK+1, IERR )
-      END IF
-*
-      SDIM = 0
-*
-*     Perform QR iteration, accumulating Schur vectors in VS if desired
-*     (RWorkspace: need N+1, prefer N+HSWORK (see comments) )
-*
-      IWRK = ITAU
-      CALL DHSEQR( 'S', JOBVS, N, ILO, IHI, A, LDA, WR, WI, VS, LDVS,
-     $             WORK( IWRK ), LWORK-IWRK+1, IEVAL )
-      IF( IEVAL.GT.0 )
-     $   INFO = IEVAL
-*
-*     Sort eigenvalues if desired
-*
-      IF( WANTST .AND. INFO.EQ.0 ) THEN
-         IF( SCALEA ) THEN
-            CALL DLASCL( 'G', 0, 0, CSCALE, ANRM, N, 1, WR, N, IERR )
-            CALL DLASCL( 'G', 0, 0, CSCALE, ANRM, N, 1, WI, N, IERR )
-         END IF
-         DO 10 I = 1, N
-            BWORK( I ) = SELECT( WR( I ), WI( I ) )
-   10    CONTINUE
-*
-*        Reorder eigenvalues, transform Schur vectors, and compute
-*        reciprocal condition numbers
-*        (RWorkspace: if SENSE is not 'N', need N+2*SDIM*(N-SDIM)
-*                     otherwise, need N )
-*        (IWorkspace: if SENSE is 'V' or 'B', need SDIM*(N-SDIM)
-*                     otherwise, need 0 )
-*
-         CALL DTRSEN( SENSE, JOBVS, BWORK, N, A, LDA, VS, LDVS, WR, WI,
-     $                SDIM, RCONDE, RCONDV, WORK( IWRK ), LWORK-IWRK+1,
-     $                IWORK, LIWORK, ICOND )
-         IF( .NOT.WANTSN )
-     $      MAXWRK = MAX( MAXWRK, N+2*SDIM*( N-SDIM ) )
-         IF( ICOND.EQ.-15 ) THEN
-*
-*           Not enough real workspace
-*
-            INFO = -16
-         ELSE IF( ICOND.EQ.-17 ) THEN
-*
-*           Not enough integer workspace
-*
-            INFO = -18
-         ELSE IF( ICOND.GT.0 ) THEN
-*
-*           DTRSEN failed to reorder or to restore standard Schur form
-*
-            INFO = ICOND + N
-         END IF
-      END IF
-*
-      IF( WANTVS ) THEN
-*
-*        Undo balancing
-*        (RWorkspace: need N)
-*
-         CALL DGEBAK( 'P', 'R', N, ILO, IHI, WORK( IBAL ), N, VS, LDVS,
-     $                IERR )
-      END IF
-*
-      IF( SCALEA ) THEN
-*
-*        Undo scaling for the Schur form of A
-*
-         CALL DLASCL( 'H', 0, 0, CSCALE, ANRM, N, N, A, LDA, IERR )
-         CALL DCOPY( N, A, LDA+1, WR, 1 )
-         IF( ( WANTSV .OR. WANTSB ) .AND. INFO.EQ.0 ) THEN
-            DUM( 1 ) = RCONDV
-            CALL DLASCL( 'G', 0, 0, CSCALE, ANRM, 1, 1, DUM, 1, IERR )
-            RCONDV = DUM( 1 )
-         END IF
-         IF( CSCALE.EQ.SMLNUM ) THEN
-*
-*           If scaling back towards underflow, adjust WI if an
-*           offdiagonal element of a 2-by-2 block in the Schur form
-*           underflows.
-*
-            IF( IEVAL.GT.0 ) THEN
-               I1 = IEVAL + 1
-               I2 = IHI - 1
-               CALL DLASCL( 'G', 0, 0, CSCALE, ANRM, ILO-1, 1, WI, N,
-     $                      IERR )
-            ELSE IF( WANTST ) THEN
-               I1 = 1
-               I2 = N - 1
-            ELSE
-               I1 = ILO
-               I2 = IHI - 1
-            END IF
-            INXT = I1 - 1
-            DO 20 I = I1, I2
-               IF( I.LT.INXT )
-     $            GO TO 20
-               IF( WI( I ).EQ.ZERO ) THEN
-                  INXT = I + 1
-               ELSE
-                  IF( A( I+1, I ).EQ.ZERO ) THEN
-                     WI( I ) = ZERO
-                     WI( I+1 ) = ZERO
-                  ELSE IF( A( I+1, I ).NE.ZERO .AND. A( I, I+1 ).EQ.
-     $                     ZERO ) THEN
-                     WI( I ) = ZERO
-                     WI( I+1 ) = ZERO
-                     IF( I.GT.1 )
-     $                  CALL DSWAP( I-1, A( 1, I ), 1, A( 1, I+1 ), 1 )
-                     IF( N.GT.I+1 )
-     $                  CALL DSWAP( N-I-1, A( I, I+2 ), LDA,
-     $                              A( I+1, I+2 ), LDA )
-                     CALL DSWAP( N, VS( 1, I ), 1, VS( 1, I+1 ), 1 )
-                     A( I, I+1 ) = A( I+1, I )
-                     A( I+1, I ) = ZERO
-                  END IF
-                  INXT = I + 2
-               END IF
-   20       CONTINUE
-         END IF
-         CALL DLASCL( 'G', 0, 0, CSCALE, ANRM, N-IEVAL, 1,
-     $                WI( IEVAL+1 ), MAX( N-IEVAL, 1 ), IERR )
-      END IF
-*
-      IF( WANTST .AND. INFO.EQ.0 ) THEN
-*
-*        Check if reordering successful
-*
-         LASTSL = .TRUE.
-         LST2SL = .TRUE.
-         SDIM = 0
-         IP = 0
-         DO 30 I = 1, N
-            CURSL = SELECT( WR( I ), WI( I ) )
-            IF( WI( I ).EQ.ZERO ) THEN
-               IF( CURSL )
-     $            SDIM = SDIM + 1
-               IP = 0
-               IF( CURSL .AND. .NOT.LASTSL )
-     $            INFO = N + 2
-            ELSE
-               IF( IP.EQ.1 ) THEN
-*
-*                 Last eigenvalue of conjugate pair
-*
-                  CURSL = CURSL .OR. LASTSL
-                  LASTSL = CURSL
-                  IF( CURSL )
-     $               SDIM = SDIM + 2
-                  IP = -1
-                  IF( CURSL .AND. .NOT.LST2SL )
-     $               INFO = N + 2
-               ELSE
-*
-*                 First eigenvalue of conjugate pair
-*
-                  IP = 1
-               END IF
-            END IF
-            LST2SL = LASTSL
-            LASTSL = CURSL
-   30    CONTINUE
-      END IF
-*
-      WORK( 1 ) = MAXWRK
-      IF( WANTSV .OR. WANTSB ) THEN
-         IWORK( 1 ) = MAX( 1, SDIM*( N-SDIM ) )
-      ELSE
-         IWORK( 1 ) = 1
-      END IF
-*
-      RETURN
-*
-*     End of DGEESX
-*
-      END
--- a/libcruft/lapack/dgeev.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,423 +0,0 @@
-      SUBROUTINE DGEEV( JOBVL, JOBVR, N, A, LDA, WR, WI, VL, LDVL, VR,
-     $                  LDVR, WORK, LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBVL, JOBVR
-      INTEGER            INFO, LDA, LDVL, LDVR, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), VL( LDVL, * ), VR( LDVR, * ),
-     $                   WI( * ), WORK( * ), WR( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGEEV computes for an N-by-N real nonsymmetric matrix A, the
-*  eigenvalues and, optionally, the left and/or right eigenvectors.
-*
-*  The right eigenvector v(j) of A satisfies
-*                   A * v(j) = lambda(j) * v(j)
-*  where lambda(j) is its eigenvalue.
-*  The left eigenvector u(j) of A satisfies
-*                u(j)**H * A = lambda(j) * u(j)**H
-*  where u(j)**H denotes the conjugate transpose of u(j).
-*
-*  The computed eigenvectors are normalized to have Euclidean norm
-*  equal to 1 and largest component real.
-*
-*  Arguments
-*  =========
-*
-*  JOBVL   (input) CHARACTER*1
-*          = 'N': left eigenvectors of A are not computed;
-*          = 'V': left eigenvectors of A are computed.
-*
-*  JOBVR   (input) CHARACTER*1
-*          = 'N': right eigenvectors of A are not computed;
-*          = 'V': right eigenvectors of A are computed.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A. N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the N-by-N matrix A.
-*          On exit, A has been overwritten.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  WR      (output) DOUBLE PRECISION array, dimension (N)
-*  WI      (output) DOUBLE PRECISION array, dimension (N)
-*          WR and WI contain the real and imaginary parts,
-*          respectively, of the computed eigenvalues.  Complex
-*          conjugate pairs of eigenvalues appear consecutively
-*          with the eigenvalue having the positive imaginary part
-*          first.
-*
-*  VL      (output) DOUBLE PRECISION array, dimension (LDVL,N)
-*          If JOBVL = 'V', the left eigenvectors u(j) are stored one
-*          after another in the columns of VL, in the same order
-*          as their eigenvalues.
-*          If JOBVL = 'N', VL is not referenced.
-*          If the j-th eigenvalue is real, then u(j) = VL(:,j),
-*          the j-th column of VL.
-*          If the j-th and (j+1)-st eigenvalues form a complex
-*          conjugate pair, then u(j) = VL(:,j) + i*VL(:,j+1) and
-*          u(j+1) = VL(:,j) - i*VL(:,j+1).
-*
-*  LDVL    (input) INTEGER
-*          The leading dimension of the array VL.  LDVL >= 1; if
-*          JOBVL = 'V', LDVL >= N.
-*
-*  VR      (output) DOUBLE PRECISION array, dimension (LDVR,N)
-*          If JOBVR = 'V', the right eigenvectors v(j) are stored one
-*          after another in the columns of VR, in the same order
-*          as their eigenvalues.
-*          If JOBVR = 'N', VR is not referenced.
-*          If the j-th eigenvalue is real, then v(j) = VR(:,j),
-*          the j-th column of VR.
-*          If the j-th and (j+1)-st eigenvalues form a complex
-*          conjugate pair, then v(j) = VR(:,j) + i*VR(:,j+1) and
-*          v(j+1) = VR(:,j) - i*VR(:,j+1).
-*
-*  LDVR    (input) INTEGER
-*          The leading dimension of the array VR.  LDVR >= 1; if
-*          JOBVR = 'V', LDVR >= N.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,3*N), and
-*          if JOBVL = 'V' or JOBVR = 'V', LWORK >= 4*N.  For good
-*          performance, LWORK must generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if INFO = i, the QR algorithm failed to compute all the
-*                eigenvalues, and no eigenvectors have been computed;
-*                elements i+1:N of WR and WI contain eigenvalues which
-*                have converged.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, SCALEA, WANTVL, WANTVR
-      CHARACTER          SIDE
-      INTEGER            HSWORK, I, IBAL, IERR, IHI, ILO, ITAU, IWRK, K,
-     $                   MAXWRK, MINWRK, NOUT
-      DOUBLE PRECISION   ANRM, BIGNUM, CS, CSCALE, EPS, R, SCL, SMLNUM,
-     $                   SN
-*     ..
-*     .. Local Arrays ..
-      LOGICAL            SELECT( 1 )
-      DOUBLE PRECISION   DUM( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEBAK, DGEBAL, DGEHRD, DHSEQR, DLABAD, DLACPY,
-     $                   DLARTG, DLASCL, DORGHR, DROT, DSCAL, DTREVC,
-     $                   XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IDAMAX, ILAENV
-      DOUBLE PRECISION   DLAMCH, DLANGE, DLAPY2, DNRM2
-      EXTERNAL           LSAME, IDAMAX, ILAENV, DLAMCH, DLANGE, DLAPY2,
-     $                   DNRM2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      WANTVL = LSAME( JOBVL, 'V' )
-      WANTVR = LSAME( JOBVR, 'V' )
-      IF( ( .NOT.WANTVL ) .AND. ( .NOT.LSAME( JOBVL, 'N' ) ) ) THEN
-         INFO = -1
-      ELSE IF( ( .NOT.WANTVR ) .AND. ( .NOT.LSAME( JOBVR, 'N' ) ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDVL.LT.1 .OR. ( WANTVL .AND. LDVL.LT.N ) ) THEN
-         INFO = -9
-      ELSE IF( LDVR.LT.1 .OR. ( WANTVR .AND. LDVR.LT.N ) ) THEN
-         INFO = -11
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of workspace needed at that point in the code,
-*       as well as the preferred amount for good performance.
-*       NB refers to the optimal block size for the immediately
-*       following subroutine, as returned by ILAENV.
-*       HSWORK refers to the workspace preferred by DHSEQR, as
-*       calculated below. HSWORK is computed assuming ILO=1 and IHI=N,
-*       the worst case.)
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( N.EQ.0 ) THEN
-            MINWRK = 1
-            MAXWRK = 1
-         ELSE
-            MAXWRK = 2*N + N*ILAENV( 1, 'DGEHRD', ' ', N, 1, N, 0 )
-            IF( WANTVL ) THEN
-               MINWRK = 4*N
-               MAXWRK = MAX( MAXWRK, 2*N + ( N - 1 )*ILAENV( 1,
-     $                       'DORGHR', ' ', N, 1, N, -1 ) )
-               CALL DHSEQR( 'S', 'V', N, 1, N, A, LDA, WR, WI, VL, LDVL,
-     $                WORK, -1, INFO )
-               HSWORK = WORK( 1 )
-               MAXWRK = MAX( MAXWRK, N + 1, N + HSWORK )
-               MAXWRK = MAX( MAXWRK, 4*N )
-            ELSE IF( WANTVR ) THEN
-               MINWRK = 4*N
-               MAXWRK = MAX( MAXWRK, 2*N + ( N - 1 )*ILAENV( 1,
-     $                       'DORGHR', ' ', N, 1, N, -1 ) )
-               CALL DHSEQR( 'S', 'V', N, 1, N, A, LDA, WR, WI, VR, LDVR,
-     $                WORK, -1, INFO )
-               HSWORK = WORK( 1 )
-               MAXWRK = MAX( MAXWRK, N + 1, N + HSWORK )
-               MAXWRK = MAX( MAXWRK, 4*N )
-            ELSE 
-               MINWRK = 3*N
-               CALL DHSEQR( 'E', 'N', N, 1, N, A, LDA, WR, WI, VR, LDVR,
-     $                WORK, -1, INFO )
-               HSWORK = WORK( 1 )
-               MAXWRK = MAX( MAXWRK, N + 1, N + HSWORK )
-            END IF
-            MAXWRK = MAX( MAXWRK, MINWRK )
-         END IF
-         WORK( 1 ) = MAXWRK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
-            INFO = -13
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGEEV ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Get machine constants
-*
-      EPS = DLAMCH( 'P' )
-      SMLNUM = DLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SQRT( SMLNUM ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = DLANGE( 'M', N, N, A, LDA, DUM )
-      SCALEA = .FALSE.
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-         SCALEA = .TRUE.
-         CSCALE = SMLNUM
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-         SCALEA = .TRUE.
-         CSCALE = BIGNUM
-      END IF
-      IF( SCALEA )
-     $   CALL DLASCL( 'G', 0, 0, ANRM, CSCALE, N, N, A, LDA, IERR )
-*
-*     Balance the matrix
-*     (Workspace: need N)
-*
-      IBAL = 1
-      CALL DGEBAL( 'B', N, A, LDA, ILO, IHI, WORK( IBAL ), IERR )
-*
-*     Reduce to upper Hessenberg form
-*     (Workspace: need 3*N, prefer 2*N+N*NB)
-*
-      ITAU = IBAL + N
-      IWRK = ITAU + N
-      CALL DGEHRD( N, ILO, IHI, A, LDA, WORK( ITAU ), WORK( IWRK ),
-     $             LWORK-IWRK+1, IERR )
-*
-      IF( WANTVL ) THEN
-*
-*        Want left eigenvectors
-*        Copy Householder vectors to VL
-*
-         SIDE = 'L'
-         CALL DLACPY( 'L', N, N, A, LDA, VL, LDVL )
-*
-*        Generate orthogonal matrix in VL
-*        (Workspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*
-         CALL DORGHR( N, ILO, IHI, VL, LDVL, WORK( ITAU ), WORK( IWRK ),
-     $                LWORK-IWRK+1, IERR )
-*
-*        Perform QR iteration, accumulating Schur vectors in VL
-*        (Workspace: need N+1, prefer N+HSWORK (see comments) )
-*
-         IWRK = ITAU
-         CALL DHSEQR( 'S', 'V', N, ILO, IHI, A, LDA, WR, WI, VL, LDVL,
-     $                WORK( IWRK ), LWORK-IWRK+1, INFO )
-*
-         IF( WANTVR ) THEN
-*
-*           Want left and right eigenvectors
-*           Copy Schur vectors to VR
-*
-            SIDE = 'B'
-            CALL DLACPY( 'F', N, N, VL, LDVL, VR, LDVR )
-         END IF
-*
-      ELSE IF( WANTVR ) THEN
-*
-*        Want right eigenvectors
-*        Copy Householder vectors to VR
-*
-         SIDE = 'R'
-         CALL DLACPY( 'L', N, N, A, LDA, VR, LDVR )
-*
-*        Generate orthogonal matrix in VR
-*        (Workspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*
-         CALL DORGHR( N, ILO, IHI, VR, LDVR, WORK( ITAU ), WORK( IWRK ),
-     $                LWORK-IWRK+1, IERR )
-*
-*        Perform QR iteration, accumulating Schur vectors in VR
-*        (Workspace: need N+1, prefer N+HSWORK (see comments) )
-*
-         IWRK = ITAU
-         CALL DHSEQR( 'S', 'V', N, ILO, IHI, A, LDA, WR, WI, VR, LDVR,
-     $                WORK( IWRK ), LWORK-IWRK+1, INFO )
-*
-      ELSE
-*
-*        Compute eigenvalues only
-*        (Workspace: need N+1, prefer N+HSWORK (see comments) )
-*
-         IWRK = ITAU
-         CALL DHSEQR( 'E', 'N', N, ILO, IHI, A, LDA, WR, WI, VR, LDVR,
-     $                WORK( IWRK ), LWORK-IWRK+1, INFO )
-      END IF
-*
-*     If INFO > 0 from DHSEQR, then quit
-*
-      IF( INFO.GT.0 )
-     $   GO TO 50
-*
-      IF( WANTVL .OR. WANTVR ) THEN
-*
-*        Compute left and/or right eigenvectors
-*        (Workspace: need 4*N)
-*
-         CALL DTREVC( SIDE, 'B', SELECT, N, A, LDA, VL, LDVL, VR, LDVR,
-     $                N, NOUT, WORK( IWRK ), IERR )
-      END IF
-*
-      IF( WANTVL ) THEN
-*
-*        Undo balancing of left eigenvectors
-*        (Workspace: need N)
-*
-         CALL DGEBAK( 'B', 'L', N, ILO, IHI, WORK( IBAL ), N, VL, LDVL,
-     $                IERR )
-*
-*        Normalize left eigenvectors and make largest component real
-*
-         DO 20 I = 1, N
-            IF( WI( I ).EQ.ZERO ) THEN
-               SCL = ONE / DNRM2( N, VL( 1, I ), 1 )
-               CALL DSCAL( N, SCL, VL( 1, I ), 1 )
-            ELSE IF( WI( I ).GT.ZERO ) THEN
-               SCL = ONE / DLAPY2( DNRM2( N, VL( 1, I ), 1 ),
-     $               DNRM2( N, VL( 1, I+1 ), 1 ) )
-               CALL DSCAL( N, SCL, VL( 1, I ), 1 )
-               CALL DSCAL( N, SCL, VL( 1, I+1 ), 1 )
-               DO 10 K = 1, N
-                  WORK( IWRK+K-1 ) = VL( K, I )**2 + VL( K, I+1 )**2
-   10          CONTINUE
-               K = IDAMAX( N, WORK( IWRK ), 1 )
-               CALL DLARTG( VL( K, I ), VL( K, I+1 ), CS, SN, R )
-               CALL DROT( N, VL( 1, I ), 1, VL( 1, I+1 ), 1, CS, SN )
-               VL( K, I+1 ) = ZERO
-            END IF
-   20    CONTINUE
-      END IF
-*
-      IF( WANTVR ) THEN
-*
-*        Undo balancing of right eigenvectors
-*        (Workspace: need N)
-*
-         CALL DGEBAK( 'B', 'R', N, ILO, IHI, WORK( IBAL ), N, VR, LDVR,
-     $                IERR )
-*
-*        Normalize right eigenvectors and make largest component real
-*
-         DO 40 I = 1, N
-            IF( WI( I ).EQ.ZERO ) THEN
-               SCL = ONE / DNRM2( N, VR( 1, I ), 1 )
-               CALL DSCAL( N, SCL, VR( 1, I ), 1 )
-            ELSE IF( WI( I ).GT.ZERO ) THEN
-               SCL = ONE / DLAPY2( DNRM2( N, VR( 1, I ), 1 ),
-     $               DNRM2( N, VR( 1, I+1 ), 1 ) )
-               CALL DSCAL( N, SCL, VR( 1, I ), 1 )
-               CALL DSCAL( N, SCL, VR( 1, I+1 ), 1 )
-               DO 30 K = 1, N
-                  WORK( IWRK+K-1 ) = VR( K, I )**2 + VR( K, I+1 )**2
-   30          CONTINUE
-               K = IDAMAX( N, WORK( IWRK ), 1 )
-               CALL DLARTG( VR( K, I ), VR( K, I+1 ), CS, SN, R )
-               CALL DROT( N, VR( 1, I ), 1, VR( 1, I+1 ), 1, CS, SN )
-               VR( K, I+1 ) = ZERO
-            END IF
-   40    CONTINUE
-      END IF
-*
-*     Undo scaling if necessary
-*
-   50 CONTINUE
-      IF( SCALEA ) THEN
-         CALL DLASCL( 'G', 0, 0, CSCALE, ANRM, N-INFO, 1, WR( INFO+1 ),
-     $                MAX( N-INFO, 1 ), IERR )
-         CALL DLASCL( 'G', 0, 0, CSCALE, ANRM, N-INFO, 1, WI( INFO+1 ),
-     $                MAX( N-INFO, 1 ), IERR )
-         IF( INFO.GT.0 ) THEN
-            CALL DLASCL( 'G', 0, 0, CSCALE, ANRM, ILO-1, 1, WR, N,
-     $                   IERR )
-            CALL DLASCL( 'G', 0, 0, CSCALE, ANRM, ILO-1, 1, WI, N,
-     $                   IERR )
-         END IF
-      END IF
-*
-      WORK( 1 ) = MAXWRK
-      RETURN
-*
-*     End of DGEEV
-*
-      END
--- a/libcruft/lapack/dgehd2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-      SUBROUTINE DGEHD2( N, ILO, IHI, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, ILO, INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGEHD2 reduces a real general matrix A to upper Hessenberg form H by
-*  an orthogonal similarity transformation:  Q' * A * Q = H .
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          It is assumed that A is already upper triangular in rows
-*          and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally
-*          set by a previous call to DGEBAL; otherwise they should be
-*          set to 1 and N respectively. See Further Details.
-*          1 <= ILO <= IHI <= max(1,N).
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the n by n general matrix to be reduced.
-*          On exit, the upper triangle and the first subdiagonal of A
-*          are overwritten with the upper Hessenberg matrix H, and the
-*          elements below the first subdiagonal, with the array TAU,
-*          represent the orthogonal matrix Q as a product of elementary
-*          reflectors. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  TAU     (output) DOUBLE PRECISION array, dimension (N-1)
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of (ihi-ilo) elementary
-*  reflectors
-*
-*     Q = H(ilo) H(ilo+1) . . . H(ihi-1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i) = 0, v(i+1) = 1 and v(ihi+1:n) = 0; v(i+2:ihi) is stored on
-*  exit in A(i+2:ihi,i), and tau in TAU(i).
-*
-*  The contents of A are illustrated by the following example, with
-*  n = 7, ilo = 2 and ihi = 6:
-*
-*  on entry,                        on exit,
-*
-*  ( a   a   a   a   a   a   a )    (  a   a   h   h   h   h   a )
-*  (     a   a   a   a   a   a )    (      a   h   h   h   h   a )
-*  (     a   a   a   a   a   a )    (      h   h   h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  h   h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  v3  h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  v3  v4  h   h   h )
-*  (                         a )    (                          a )
-*
-*  where a denotes an element of the original matrix A, h denotes a
-*  modified element of the upper Hessenberg matrix H, and vi denotes an
-*  element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      DOUBLE PRECISION   AII
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARF, DLARFG, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -2
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGEHD2', -INFO )
-         RETURN
-      END IF
-*
-      DO 10 I = ILO, IHI - 1
-*
-*        Compute elementary reflector H(i) to annihilate A(i+2:ihi,i)
-*
-         CALL DLARFG( IHI-I, A( I+1, I ), A( MIN( I+2, N ), I ), 1,
-     $                TAU( I ) )
-         AII = A( I+1, I )
-         A( I+1, I ) = ONE
-*
-*        Apply H(i) to A(1:ihi,i+1:ihi) from the right
-*
-         CALL DLARF( 'Right', IHI, IHI-I, A( I+1, I ), 1, TAU( I ),
-     $               A( 1, I+1 ), LDA, WORK )
-*
-*        Apply H(i) to A(i+1:ihi,i+1:n) from the left
-*
-         CALL DLARF( 'Left', IHI-I, N-I, A( I+1, I ), 1, TAU( I ),
-     $               A( I+1, I+1 ), LDA, WORK )
-*
-         A( I+1, I ) = AII
-   10 CONTINUE
-*
-      RETURN
-*
-*     End of DGEHD2
-*
-      END
--- a/libcruft/lapack/dgehrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,273 +0,0 @@
-      SUBROUTINE DGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, ILO, INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION  A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGEHRD reduces a real general matrix A to upper Hessenberg form H by
-*  an orthogonal similarity transformation:  Q' * A * Q = H .
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          It is assumed that A is already upper triangular in rows
-*          and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally
-*          set by a previous call to DGEBAL; otherwise they should be
-*          set to 1 and N respectively. See Further Details.
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the N-by-N general matrix to be reduced.
-*          On exit, the upper triangle and the first subdiagonal of A
-*          are overwritten with the upper Hessenberg matrix H, and the
-*          elements below the first subdiagonal, with the array TAU,
-*          represent the orthogonal matrix Q as a product of elementary
-*          reflectors. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  TAU     (output) DOUBLE PRECISION array, dimension (N-1)
-*          The scalar factors of the elementary reflectors (see Further
-*          Details). Elements 1:ILO-1 and IHI:N-1 of TAU are set to
-*          zero.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (LWORK)
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The length of the array WORK.  LWORK >= max(1,N).
-*          For optimum performance LWORK >= N*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of (ihi-ilo) elementary
-*  reflectors
-*
-*     Q = H(ilo) H(ilo+1) . . . H(ihi-1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i) = 0, v(i+1) = 1 and v(ihi+1:n) = 0; v(i+2:ihi) is stored on
-*  exit in A(i+2:ihi,i), and tau in TAU(i).
-*
-*  The contents of A are illustrated by the following example, with
-*  n = 7, ilo = 2 and ihi = 6:
-*
-*  on entry,                        on exit,
-*
-*  ( a   a   a   a   a   a   a )    (  a   a   h   h   h   h   a )
-*  (     a   a   a   a   a   a )    (      a   h   h   h   h   a )
-*  (     a   a   a   a   a   a )    (      h   h   h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  h   h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  v3  h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  v3  v4  h   h   h )
-*  (                         a )    (                          a )
-*
-*  where a denotes an element of the original matrix A, h denotes a
-*  modified element of the upper Hessenberg matrix H, and vi denotes an
-*  element of the vector defining H(i).
-*
-*  This file is a slight modification of LAPACK-3.0's DGEHRD
-*  subroutine incorporating improvements proposed by Quintana-Orti and
-*  Van de Geijn (2005). 
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            NBMAX, LDT
-      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1 )
-      DOUBLE PRECISION  ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, 
-     $                     ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, J, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NH, NX
-      DOUBLE PRECISION  EI
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION  T( LDT, NBMAX )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DAXPY, DGEHD2, DGEMM, DLAHR2, DLARFB, DTRMM,
-     $                   XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      NB = MIN( NBMAX, ILAENV( 1, 'DGEHRD', ' ', N, ILO, IHI, -1 ) )
-      LWKOPT = N*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -2
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGEHRD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Set elements 1:ILO-1 and IHI:N-1 of TAU to zero
-*
-      DO 10 I = 1, ILO - 1
-         TAU( I ) = ZERO
-   10 CONTINUE
-      DO 20 I = MAX( 1, IHI ), N - 1
-         TAU( I ) = ZERO
-   20 CONTINUE
-*
-*     Quick return if possible
-*
-      NH = IHI - ILO + 1
-      IF( NH.LE.1 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-*     Determine the block size
-*
-      NB = MIN( NBMAX, ILAENV( 1, 'DGEHRD', ' ', N, ILO, IHI, -1 ) )
-      NBMIN = 2
-      IWS = 1
-      IF( NB.GT.1 .AND. NB.LT.NH ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code
-*        (last block is always handled by unblocked code)
-*
-         NX = MAX( NB, ILAENV( 3, 'DGEHRD', ' ', N, ILO, IHI, -1 ) )
-         IF( NX.LT.NH ) THEN
-*
-*           Determine if workspace is large enough for blocked code
-*
-            IWS = N*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  determine the
-*              minimum value of NB, and reduce NB or force use of
-*              unblocked code
-*
-               NBMIN = MAX( 2, ILAENV( 2, 'DGEHRD', ' ', N, ILO, IHI,
-     $                 -1 ) )
-               IF( LWORK.GE.N*NBMIN ) THEN
-                  NB = LWORK / N
-               ELSE
-                  NB = 1
-               END IF
-            END IF
-         END IF
-      END IF
-      LDWORK = N
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.NH ) THEN
-*
-*        Use unblocked code below
-*
-         I = ILO
-*
-      ELSE
-*
-*        Use blocked code
-*
-         DO 40 I = ILO, IHI - 1 - NX, NB
-            IB = MIN( NB, IHI-I )
-*
-*           Reduce columns i:i+ib-1 to Hessenberg form, returning the
-*           matrices V and T of the block reflector H = I - V*T*V'
-*           which performs the reduction, and also the matrix Y = A*V*T
-*
-            CALL DLAHR2( IHI, I, IB, A( 1, I ), LDA, TAU( I ), T, LDT,
-     $                   WORK, LDWORK )
-*
-*           Apply the block reflector H to A(1:ihi,i+ib:ihi) from the
-*           right, computing  A := A - Y * V'. V(i+ib,ib-1) must be set
-*           to 1
-*
-            EI = A( I+IB, I+IB-1 )
-            A( I+IB, I+IB-1 ) = ONE
-            CALL DGEMM( 'No transpose', 'Transpose', 
-     $                  IHI, IHI-I-IB+1,
-     $                  IB, -ONE, WORK, LDWORK, A( I+IB, I ), LDA, ONE,
-     $                  A( 1, I+IB ), LDA )
-            A( I+IB, I+IB-1 ) = EI
-*
-*           Apply the block reflector H to A(1:i,i+1:i+ib-1) from the
-*           right
-*
-            CALL DTRMM( 'Right', 'Lower', 'Transpose',
-     $                  'Unit', I, IB-1,
-     $                  ONE, A( I+1, I ), LDA, WORK, LDWORK )
-            DO 30 J = 0, IB-2
-               CALL DAXPY( I, -ONE, WORK( LDWORK*J+1 ), 1,
-     $                     A( 1, I+J+1 ), 1 )
-   30       CONTINUE
-*
-*           Apply the block reflector H to A(i+1:ihi,i+ib:n) from the
-*           left
-*
-            CALL DLARFB( 'Left', 'Transpose', 'Forward',
-     $                   'Columnwise',
-     $                   IHI-I, N-I-IB+1, IB, A( I+1, I ), LDA, T, LDT,
-     $                   A( I+1, I+IB ), LDA, WORK, LDWORK )
-   40    CONTINUE
-      END IF
-*
-*     Use unblocked code to reduce the rest of the matrix
-*
-      CALL DGEHD2( N, I, IHI, A, LDA, TAU, WORK, IINFO )
-      WORK( 1 ) = IWS
-*
-      RETURN
-*
-*     End of DGEHRD
-*
-      END
--- a/libcruft/lapack/dgelq2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,121 +0,0 @@
-      SUBROUTINE DGELQ2( M, N, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGELQ2 computes an LQ factorization of a real m by n matrix A:
-*  A = L * Q.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the m by n matrix A.
-*          On exit, the elements on and below the diagonal of the array
-*          contain the m by min(m,n) lower trapezoidal matrix L (L is
-*          lower triangular if m <= n); the elements above the diagonal,
-*          with the array TAU, represent the orthogonal matrix Q as a
-*          product of elementary reflectors (see Further Details).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (M)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(k) . . . H(2) H(1), where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i-1) = 0 and v(i) = 1; v(i+1:n) is stored on exit in A(i,i+1:n),
-*  and tau in TAU(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, K
-      DOUBLE PRECISION   AII
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARF, DLARFG, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGELQ2', -INFO )
-         RETURN
-      END IF
-*
-      K = MIN( M, N )
-*
-      DO 10 I = 1, K
-*
-*        Generate elementary reflector H(i) to annihilate A(i,i+1:n)
-*
-         CALL DLARFG( N-I+1, A( I, I ), A( I, MIN( I+1, N ) ), LDA,
-     $                TAU( I ) )
-         IF( I.LT.M ) THEN
-*
-*           Apply H(i) to A(i+1:m,i:n) from the right
-*
-            AII = A( I, I )
-            A( I, I ) = ONE
-            CALL DLARF( 'Right', M-I, N-I+1, A( I, I ), LDA, TAU( I ),
-     $                  A( I+1, I ), LDA, WORK )
-            A( I, I ) = AII
-         END IF
-   10 CONTINUE
-      RETURN
-*
-*     End of DGELQ2
-*
-      END
--- a/libcruft/lapack/dgelqf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,195 +0,0 @@
-      SUBROUTINE DGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGELQF computes an LQ factorization of a real M-by-N matrix A:
-*  A = L * Q.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the elements on and below the diagonal of the array
-*          contain the m-by-min(m,n) lower trapezoidal matrix L (L is
-*          lower triangular if m <= n); the elements above the diagonal,
-*          with the array TAU, represent the orthogonal matrix Q as a
-*          product of elementary reflectors (see Further Details).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,M).
-*          For optimum performance LWORK >= M*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(k) . . . H(2) H(1), where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i-1) = 0 and v(i) = 1; v(i+1:n) is stored on exit in A(i,i+1:n),
-*  and tau in TAU(i).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, K, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGELQ2, DLARFB, DLARFT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NB = ILAENV( 1, 'DGELQF', ' ', M, N, -1, -1 )
-      LWKOPT = M*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGELQF', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      K = MIN( M, N )
-      IF( K.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = M
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'DGELQF', ' ', M, N, -1, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = M
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'DGELQF', ' ', M, N, -1,
-     $                 -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code initially
-*
-         DO 10 I = 1, K - NX, NB
-            IB = MIN( K-I+1, NB )
-*
-*           Compute the LQ factorization of the current block
-*           A(i:i+ib-1,i:n)
-*
-            CALL DGELQ2( IB, N-I+1, A( I, I ), LDA, TAU( I ), WORK,
-     $                   IINFO )
-            IF( I+IB.LE.M ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i) H(i+1) . . . H(i+ib-1)
-*
-               CALL DLARFT( 'Forward', 'Rowwise', N-I+1, IB, A( I, I ),
-     $                      LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H to A(i+ib:m,i:n) from the right
-*
-               CALL DLARFB( 'Right', 'No transpose', 'Forward',
-     $                      'Rowwise', M-I-IB+1, N-I+1, IB, A( I, I ),
-     $                      LDA, WORK, LDWORK, A( I+IB, I ), LDA,
-     $                      WORK( IB+1 ), LDWORK )
-            END IF
-   10    CONTINUE
-      ELSE
-         I = 1
-      END IF
-*
-*     Use unblocked code to factor the last or only block.
-*
-      IF( I.LE.K )
-     $   CALL DGELQ2( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK,
-     $                IINFO )
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of DGELQF
-*
-      END
--- a/libcruft/lapack/dgelsd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,528 +0,0 @@
-      SUBROUTINE DGELSD( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK,
-     $                   WORK, LWORK, IWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LDB, LWORK, M, N, NRHS, RANK
-      DOUBLE PRECISION   RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), S( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGELSD computes the minimum-norm solution to a real linear least
-*  squares problem:
-*      minimize 2-norm(| b - A*x |)
-*  using the singular value decomposition (SVD) of A. A is an M-by-N
-*  matrix which may be rank-deficient.
-*
-*  Several right hand side vectors b and solution vectors x can be
-*  handled in a single call; they are stored as the columns of the
-*  M-by-NRHS right hand side matrix B and the N-by-NRHS solution
-*  matrix X.
-*
-*  The problem is solved in three steps:
-*  (1) Reduce the coefficient matrix A to bidiagonal form with
-*      Householder transformations, reducing the original problem
-*      into a "bidiagonal least squares problem" (BLS)
-*  (2) Solve the BLS using a divide and conquer approach.
-*  (3) Apply back all the Householder tranformations to solve
-*      the original least squares problem.
-*
-*  The effective rank of A is determined by treating as zero those
-*  singular values which are less than RCOND times the largest singular
-*  value.
-*
-*  The divide and conquer algorithm makes very mild assumptions about
-*  floating point arithmetic. It will work on machines with a guard
-*  digit in add/subtract, or on those binary machines without guard
-*  digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or
-*  Cray-2. It could conceivably fail on hexadecimal or decimal machines
-*  without guard digits, but we know of none.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of A. N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrices B and X. NRHS >= 0.
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, A has been destroyed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*          On entry, the M-by-NRHS right hand side matrix B.
-*          On exit, B is overwritten by the N-by-NRHS solution
-*          matrix X.  If m >= n and RANK = n, the residual
-*          sum-of-squares for the solution in the i-th column is given
-*          by the sum of squares of elements n+1:m in that column.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B. LDB >= max(1,max(M,N)).
-*
-*  S       (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The singular values of A in decreasing order.
-*          The condition number of A in the 2-norm = S(1)/S(min(m,n)).
-*
-*  RCOND   (input) DOUBLE PRECISION
-*          RCOND is used to determine the effective rank of A.
-*          Singular values S(i) <= RCOND*S(1) are treated as zero.
-*          If RCOND < 0, machine precision is used instead.
-*
-*  RANK    (output) INTEGER
-*          The effective rank of A, i.e., the number of singular values
-*          which are greater than RCOND*S(1).
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK must be at least 1.
-*          The exact minimum amount of workspace needed depends on M,
-*          N and NRHS. As long as LWORK is at least
-*              12*N + 2*N*SMLSIZ + 8*N*NLVL + N*NRHS + (SMLSIZ+1)**2,
-*          if M is greater than or equal to N or
-*              12*M + 2*M*SMLSIZ + 8*M*NLVL + M*NRHS + (SMLSIZ+1)**2,
-*          if M is less than N, the code will execute correctly.
-*          SMLSIZ is returned by ILAENV and is equal to the maximum
-*          size of the subproblems at the bottom of the computation
-*          tree (usually about 25), and
-*             NLVL = MAX( 0, INT( LOG_2( MIN( M,N )/(SMLSIZ+1) ) ) + 1 )
-*          For good performance, LWORK should generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  IWORK   (workspace) INTEGER array, dimension (MAX(1,LIWORK))
-*          LIWORK >= 3 * MINMN * NLVL + 11 * MINMN,
-*          where MINMN = MIN( M,N ).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  the algorithm for computing the SVD failed to converge;
-*                if INFO = i, i off-diagonal elements of an intermediate
-*                bidiagonal form did not converge to zero.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Ren-Cang Li, Computer Science Division, University of
-*       California at Berkeley, USA
-*     Osni Marques, LBNL/NERSC, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            IASCL, IBSCL, IE, IL, ITAU, ITAUP, ITAUQ,
-     $                   LDWORK, MAXMN, MAXWRK, MINMN, MINWRK, MM,
-     $                   MNTHR, NLVL, NWORK, SMLSIZ, WLALSD
-      DOUBLE PRECISION   ANRM, BIGNUM, BNRM, EPS, SFMIN, SMLNUM
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEBRD, DGELQF, DGEQRF, DLABAD, DLACPY, DLALSD,
-     $                   DLASCL, DLASET, DORMBR, DORMLQ, DORMQR, XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      DOUBLE PRECISION   DLAMCH, DLANGE
-      EXTERNAL           ILAENV, DLAMCH, DLANGE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, INT, LOG, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments.
-*
-      INFO = 0
-      MINMN = MIN( M, N )
-      MAXMN = MAX( M, N )
-      MNTHR = ILAENV( 6, 'DGELSD', ' ', M, N, NRHS, -1 )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, MAXMN ) ) THEN
-         INFO = -7
-      END IF
-*
-      SMLSIZ = ILAENV( 9, 'DGELSD', ' ', 0, 0, 0, 0 )
-*
-*     Compute workspace.
-*     (Note: Comments in the code beginning "Workspace:" describe the
-*     minimal amount of workspace needed at that point in the code,
-*     as well as the preferred amount for good performance.
-*     NB refers to the optimal block size for the immediately
-*     following subroutine, as returned by ILAENV.)
-*
-      MINWRK = 1
-      MINMN = MAX( 1, MINMN )
-      NLVL = MAX( INT( LOG( DBLE( MINMN ) / DBLE( SMLSIZ+1 ) ) /
-     $       LOG( TWO ) ) + 1, 0 )
-*
-      IF( INFO.EQ.0 ) THEN
-         MAXWRK = 0
-         MM = M
-         IF( M.GE.N .AND. M.GE.MNTHR ) THEN
-*
-*           Path 1a - overdetermined, with many more rows than columns.
-*
-            MM = N
-            MAXWRK = MAX( MAXWRK, N+N*ILAENV( 1, 'DGEQRF', ' ', M, N,
-     $               -1, -1 ) )
-            MAXWRK = MAX( MAXWRK, N+NRHS*
-     $               ILAENV( 1, 'DORMQR', 'LT', M, NRHS, N, -1 ) )
-         END IF
-         IF( M.GE.N ) THEN
-*
-*           Path 1 - overdetermined or exactly determined.
-*
-            MAXWRK = MAX( MAXWRK, 3*N+( MM+N )*
-     $               ILAENV( 1, 'DGEBRD', ' ', MM, N, -1, -1 ) )
-            MAXWRK = MAX( MAXWRK, 3*N+NRHS*
-     $               ILAENV( 1, 'DORMBR', 'QLT', MM, NRHS, N, -1 ) )
-            MAXWRK = MAX( MAXWRK, 3*N+( N-1 )*
-     $               ILAENV( 1, 'DORMBR', 'PLN', N, NRHS, N, -1 ) )
-            WLALSD = 9*N+2*N*SMLSIZ+8*N*NLVL+N*NRHS+(SMLSIZ+1)**2
-            MAXWRK = MAX( MAXWRK, 3*N+WLALSD )
-            MINWRK = MAX( 3*N+MM, 3*N+NRHS, 3*N+WLALSD )
-         END IF
-         IF( N.GT.M ) THEN
-            WLALSD = 9*M+2*M*SMLSIZ+8*M*NLVL+M*NRHS+(SMLSIZ+1)**2
-            IF( N.GE.MNTHR ) THEN
-*
-*              Path 2a - underdetermined, with many more columns
-*              than rows.
-*
-               MAXWRK = M + M*ILAENV( 1, 'DGELQF', ' ', M, N, -1, -1 )
-               MAXWRK = MAX( MAXWRK, M*M+4*M+2*M*
-     $                  ILAENV( 1, 'DGEBRD', ' ', M, M, -1, -1 ) )
-               MAXWRK = MAX( MAXWRK, M*M+4*M+NRHS*
-     $                  ILAENV( 1, 'DORMBR', 'QLT', M, NRHS, M, -1 ) )
-               MAXWRK = MAX( MAXWRK, M*M+4*M+( M-1 )*
-     $                  ILAENV( 1, 'DORMBR', 'PLN', M, NRHS, M, -1 ) )
-               IF( NRHS.GT.1 ) THEN
-                  MAXWRK = MAX( MAXWRK, M*M+M+M*NRHS )
-               ELSE
-                  MAXWRK = MAX( MAXWRK, M*M+2*M )
-               END IF
-               MAXWRK = MAX( MAXWRK, M+NRHS*
-     $                  ILAENV( 1, 'DORMLQ', 'LT', N, NRHS, M, -1 ) )
-               MAXWRK = MAX( MAXWRK, M*M+4*M+WLALSD )
-            ELSE
-*
-*              Path 2 - remaining underdetermined cases.
-*
-               MAXWRK = 3*M + ( N+M )*ILAENV( 1, 'DGEBRD', ' ', M, N,
-     $                  -1, -1 )
-               MAXWRK = MAX( MAXWRK, 3*M+NRHS*
-     $                  ILAENV( 1, 'DORMBR', 'QLT', M, NRHS, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, 3*M+M*
-     $                  ILAENV( 1, 'DORMBR', 'PLN', N, NRHS, M, -1 ) )
-               MAXWRK = MAX( MAXWRK, 3*M+WLALSD )
-            END IF
-            MINWRK = MAX( 3*M+NRHS, 3*M+M, 3*M+WLALSD )
-         END IF
-         MINWRK = MIN( MINWRK, MAXWRK )
-         WORK( 1 ) = MAXWRK
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
-            INFO = -12
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGELSD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         GO TO 10
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         RANK = 0
-         RETURN
-      END IF
-*
-*     Get machine parameters.
-*
-      EPS = DLAMCH( 'P' )
-      SFMIN = DLAMCH( 'S' )
-      SMLNUM = SFMIN / EPS
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-*
-*     Scale A if max entry outside range [SMLNUM,BIGNUM].
-*
-      ANRM = DLANGE( 'M', M, N, A, LDA, WORK )
-      IASCL = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM.
-*
-         CALL DLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO )
-         IASCL = 1
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM.
-*
-         CALL DLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO )
-         IASCL = 2
-      ELSE IF( ANRM.EQ.ZERO ) THEN
-*
-*        Matrix all zero. Return zero solution.
-*
-         CALL DLASET( 'F', MAX( M, N ), NRHS, ZERO, ZERO, B, LDB )
-         CALL DLASET( 'F', MINMN, 1, ZERO, ZERO, S, 1 )
-         RANK = 0
-         GO TO 10
-      END IF
-*
-*     Scale B if max entry outside range [SMLNUM,BIGNUM].
-*
-      BNRM = DLANGE( 'M', M, NRHS, B, LDB, WORK )
-      IBSCL = 0
-      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM.
-*
-         CALL DLASCL( 'G', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 1
-      ELSE IF( BNRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM.
-*
-         CALL DLASCL( 'G', 0, 0, BNRM, BIGNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 2
-      END IF
-*
-*     If M < N make sure certain entries of B are zero.
-*
-      IF( M.LT.N )
-     $   CALL DLASET( 'F', N-M, NRHS, ZERO, ZERO, B( M+1, 1 ), LDB )
-*
-*     Overdetermined case.
-*
-      IF( M.GE.N ) THEN
-*
-*        Path 1 - overdetermined or exactly determined.
-*
-         MM = M
-         IF( M.GE.MNTHR ) THEN
-*
-*           Path 1a - overdetermined, with many more rows than columns.
-*
-            MM = N
-            ITAU = 1
-            NWORK = ITAU + N
-*
-*           Compute A=Q*R.
-*           (Workspace: need 2*N, prefer N+N*NB)
-*
-            CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
-     $                   LWORK-NWORK+1, INFO )
-*
-*           Multiply B by transpose(Q).
-*           (Workspace: need N+NRHS, prefer N+NRHS*NB)
-*
-            CALL DORMQR( 'L', 'T', M, NRHS, N, A, LDA, WORK( ITAU ), B,
-     $                   LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-*           Zero out below R.
-*
-            IF( N.GT.1 ) THEN
-               CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, A( 2, 1 ), LDA )
-            END IF
-         END IF
-*
-         IE = 1
-         ITAUQ = IE + N
-         ITAUP = ITAUQ + N
-         NWORK = ITAUP + N
-*
-*        Bidiagonalize R in A.
-*        (Workspace: need 3*N+MM, prefer 3*N+(MM+N)*NB)
-*
-         CALL DGEBRD( MM, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
-     $                WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
-     $                INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors of R.
-*        (Workspace: need 3*N+NRHS, prefer 3*N+NRHS*NB)
-*
-         CALL DORMBR( 'Q', 'L', 'T', MM, NRHS, N, A, LDA, WORK( ITAUQ ),
-     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-*        Solve the bidiagonal least squares problem.
-*
-         CALL DLALSD( 'U', SMLSIZ, N, NRHS, S, WORK( IE ), B, LDB,
-     $                RCOND, RANK, WORK( NWORK ), IWORK, INFO )
-         IF( INFO.NE.0 ) THEN
-            GO TO 10
-         END IF
-*
-*        Multiply B by right bidiagonalizing vectors of R.
-*
-         CALL DORMBR( 'P', 'L', 'N', N, NRHS, N, A, LDA, WORK( ITAUP ),
-     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-      ELSE IF( N.GE.MNTHR .AND. LWORK.GE.4*M+M*M+
-     $         MAX( M, 2*M-4, NRHS, N-3*M, WLALSD ) ) THEN
-*
-*        Path 2a - underdetermined, with many more columns than rows
-*        and sufficient workspace for an efficient algorithm.
-*
-         LDWORK = M
-         IF( LWORK.GE.MAX( 4*M+M*LDA+MAX( M, 2*M-4, NRHS, N-3*M ),
-     $       M*LDA+M+M*NRHS, 4*M+M*LDA+WLALSD ) )LDWORK = LDA
-         ITAU = 1
-         NWORK = M + 1
-*
-*        Compute A=L*Q.
-*        (Workspace: need 2*M, prefer M+M*NB)
-*
-         CALL DGELQF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
-     $                LWORK-NWORK+1, INFO )
-         IL = NWORK
-*
-*        Copy L to WORK(IL), zeroing out above its diagonal.
-*
-         CALL DLACPY( 'L', M, M, A, LDA, WORK( IL ), LDWORK )
-         CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, WORK( IL+LDWORK ),
-     $                LDWORK )
-         IE = IL + LDWORK*M
-         ITAUQ = IE + M
-         ITAUP = ITAUQ + M
-         NWORK = ITAUP + M
-*
-*        Bidiagonalize L in WORK(IL).
-*        (Workspace: need M*M+5*M, prefer M*M+4*M+2*M*NB)
-*
-         CALL DGEBRD( M, M, WORK( IL ), LDWORK, S, WORK( IE ),
-     $                WORK( ITAUQ ), WORK( ITAUP ), WORK( NWORK ),
-     $                LWORK-NWORK+1, INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors of L.
-*        (Workspace: need M*M+4*M+NRHS, prefer M*M+4*M+NRHS*NB)
-*
-         CALL DORMBR( 'Q', 'L', 'T', M, NRHS, M, WORK( IL ), LDWORK,
-     $                WORK( ITAUQ ), B, LDB, WORK( NWORK ),
-     $                LWORK-NWORK+1, INFO )
-*
-*        Solve the bidiagonal least squares problem.
-*
-         CALL DLALSD( 'U', SMLSIZ, M, NRHS, S, WORK( IE ), B, LDB,
-     $                RCOND, RANK, WORK( NWORK ), IWORK, INFO )
-         IF( INFO.NE.0 ) THEN
-            GO TO 10
-         END IF
-*
-*        Multiply B by right bidiagonalizing vectors of L.
-*
-         CALL DORMBR( 'P', 'L', 'N', M, NRHS, M, WORK( IL ), LDWORK,
-     $                WORK( ITAUP ), B, LDB, WORK( NWORK ),
-     $                LWORK-NWORK+1, INFO )
-*
-*        Zero out below first M rows of B.
-*
-         CALL DLASET( 'F', N-M, NRHS, ZERO, ZERO, B( M+1, 1 ), LDB )
-         NWORK = ITAU + M
-*
-*        Multiply transpose(Q) by B.
-*        (Workspace: need M+NRHS, prefer M+NRHS*NB)
-*
-         CALL DORMLQ( 'L', 'T', N, NRHS, M, A, LDA, WORK( ITAU ), B,
-     $                LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-      ELSE
-*
-*        Path 2 - remaining underdetermined cases.
-*
-         IE = 1
-         ITAUQ = IE + M
-         ITAUP = ITAUQ + M
-         NWORK = ITAUP + M
-*
-*        Bidiagonalize A.
-*        (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB)
-*
-         CALL DGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
-     $                WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
-     $                INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors.
-*        (Workspace: need 3*M+NRHS, prefer 3*M+NRHS*NB)
-*
-         CALL DORMBR( 'Q', 'L', 'T', M, NRHS, N, A, LDA, WORK( ITAUQ ),
-     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-*        Solve the bidiagonal least squares problem.
-*
-         CALL DLALSD( 'L', SMLSIZ, M, NRHS, S, WORK( IE ), B, LDB,
-     $                RCOND, RANK, WORK( NWORK ), IWORK, INFO )
-         IF( INFO.NE.0 ) THEN
-            GO TO 10
-         END IF
-*
-*        Multiply B by right bidiagonalizing vectors of A.
-*
-         CALL DORMBR( 'P', 'L', 'N', N, NRHS, M, A, LDA, WORK( ITAUP ),
-     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-      END IF
-*
-*     Undo scaling.
-*
-      IF( IASCL.EQ.1 ) THEN
-         CALL DLASCL( 'G', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO )
-         CALL DLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
-     $                INFO )
-      ELSE IF( IASCL.EQ.2 ) THEN
-         CALL DLASCL( 'G', 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB, INFO )
-         CALL DLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
-     $                INFO )
-      END IF
-      IF( IBSCL.EQ.1 ) THEN
-         CALL DLASCL( 'G', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO )
-      ELSE IF( IBSCL.EQ.2 ) THEN
-         CALL DLASCL( 'G', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO )
-      END IF
-*
-   10 CONTINUE
-      WORK( 1 ) = MAXWRK
-      RETURN
-*
-*     End of DGELSD
-*
-      END
--- a/libcruft/lapack/dgelss.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,617 +0,0 @@
-      SUBROUTINE DGELSS( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LDB, LWORK, M, N, NRHS, RANK
-      DOUBLE PRECISION   RCOND
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), S( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGELSS computes the minimum norm solution to a real linear least
-*  squares problem:
-*
-*  Minimize 2-norm(| b - A*x |).
-*
-*  using the singular value decomposition (SVD) of A. A is an M-by-N
-*  matrix which may be rank-deficient.
-*
-*  Several right hand side vectors b and solution vectors x can be
-*  handled in a single call; they are stored as the columns of the
-*  M-by-NRHS right hand side matrix B and the N-by-NRHS solution matrix
-*  X.
-*
-*  The effective rank of A is determined by treating as zero those
-*  singular values which are less than RCOND times the largest singular
-*  value.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrices B and X. NRHS >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the first min(m,n) rows of A are overwritten with
-*          its right singular vectors, stored rowwise.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*          On entry, the M-by-NRHS right hand side matrix B.
-*          On exit, B is overwritten by the N-by-NRHS solution
-*          matrix X.  If m >= n and RANK = n, the residual
-*          sum-of-squares for the solution in the i-th column is given
-*          by the sum of squares of elements n+1:m in that column.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B. LDB >= max(1,max(M,N)).
-*
-*  S       (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The singular values of A in decreasing order.
-*          The condition number of A in the 2-norm = S(1)/S(min(m,n)).
-*
-*  RCOND   (input) DOUBLE PRECISION
-*          RCOND is used to determine the effective rank of A.
-*          Singular values S(i) <= RCOND*S(1) are treated as zero.
-*          If RCOND < 0, machine precision is used instead.
-*
-*  RANK    (output) INTEGER
-*          The effective rank of A, i.e., the number of singular values
-*          which are greater than RCOND*S(1).
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= 1, and also:
-*          LWORK >= 3*min(M,N) + max( 2*min(M,N), max(M,N), NRHS )
-*          For good performance, LWORK should generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  the algorithm for computing the SVD failed to converge;
-*                if INFO = i, i off-diagonal elements of an intermediate
-*                bidiagonal form did not converge to zero.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            BDSPAC, BL, CHUNK, I, IASCL, IBSCL, IE, IL,
-     $                   ITAU, ITAUP, ITAUQ, IWORK, LDWORK, MAXMN,
-     $                   MAXWRK, MINMN, MINWRK, MM, MNTHR
-      DOUBLE PRECISION   ANRM, BIGNUM, BNRM, EPS, SFMIN, SMLNUM, THR
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   VDUM( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DBDSQR, DCOPY, DGEBRD, DGELQF, DGEMM, DGEMV,
-     $                   DGEQRF, DLABAD, DLACPY, DLASCL, DLASET, DORGBR,
-     $                   DORMBR, DORMLQ, DORMQR, DRSCL, XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      DOUBLE PRECISION   DLAMCH, DLANGE
-      EXTERNAL           ILAENV, DLAMCH, DLANGE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      MINMN = MIN( M, N )
-      MAXMN = MAX( M, N )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, MAXMN ) ) THEN
-         INFO = -7
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of workspace needed at that point in the code,
-*       as well as the preferred amount for good performance.
-*       NB refers to the optimal block size for the immediately
-*       following subroutine, as returned by ILAENV.)
-*
-      IF( INFO.EQ.0 ) THEN
-         MINWRK = 1
-         MAXWRK = 1
-         IF( MINMN.GT.0 ) THEN
-            MM = M
-            MNTHR = ILAENV( 6, 'DGELSS', ' ', M, N, NRHS, -1 )
-            IF( M.GE.N .AND. M.GE.MNTHR ) THEN
-*
-*              Path 1a - overdetermined, with many more rows than
-*                        columns
-*
-               MM = N
-               MAXWRK = MAX( MAXWRK, N + N*ILAENV( 1, 'DGEQRF', ' ', M,
-     $                       N, -1, -1 ) )
-               MAXWRK = MAX( MAXWRK, N + NRHS*ILAENV( 1, 'DORMQR', 'LT',
-     $                       M, NRHS, N, -1 ) )
-            END IF
-            IF( M.GE.N ) THEN
-*
-*              Path 1 - overdetermined or exactly determined
-*
-*              Compute workspace needed for DBDSQR
-*
-               BDSPAC = MAX( 1, 5*N )
-               MAXWRK = MAX( MAXWRK, 3*N + ( MM + N )*ILAENV( 1,
-     $                       'DGEBRD', ' ', MM, N, -1, -1 ) )
-               MAXWRK = MAX( MAXWRK, 3*N + NRHS*ILAENV( 1, 'DORMBR',
-     $                       'QLT', MM, NRHS, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, 3*N + ( N - 1 )*ILAENV( 1,
-     $                       'DORGBR', 'P', N, N, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, BDSPAC )
-               MAXWRK = MAX( MAXWRK, N*NRHS )
-               MINWRK = MAX( 3*N + MM, 3*N + NRHS, BDSPAC )
-               MAXWRK = MAX( MINWRK, MAXWRK )
-            END IF
-            IF( N.GT.M ) THEN
-*
-*              Compute workspace needed for DBDSQR
-*
-               BDSPAC = MAX( 1, 5*M )
-               MINWRK = MAX( 3*M+NRHS, 3*M+N, BDSPAC )
-               IF( N.GE.MNTHR ) THEN
-*
-*                 Path 2a - underdetermined, with many more columns
-*                 than rows
-*
-                  MAXWRK = M + M*ILAENV( 1, 'DGELQF', ' ', M, N, -1,
-     $                                  -1 )
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M + 2*M*ILAENV( 1,
-     $                          'DGEBRD', ' ', M, M, -1, -1 ) )
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M + NRHS*ILAENV( 1,
-     $                          'DORMBR', 'QLT', M, NRHS, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M +
-     $                          ( M - 1 )*ILAENV( 1, 'DORGBR', 'P', M,
-     $                          M, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, M*M + M + BDSPAC )
-                  IF( NRHS.GT.1 ) THEN
-                     MAXWRK = MAX( MAXWRK, M*M + M + M*NRHS )
-                  ELSE
-                     MAXWRK = MAX( MAXWRK, M*M + 2*M )
-                  END IF
-                  MAXWRK = MAX( MAXWRK, M + NRHS*ILAENV( 1, 'DORMLQ',
-     $                          'LT', N, NRHS, M, -1 ) )
-               ELSE
-*
-*                 Path 2 - underdetermined
-*
-                  MAXWRK = 3*M + ( N + M )*ILAENV( 1, 'DGEBRD', ' ', M,
-     $                     N, -1, -1 )
-                  MAXWRK = MAX( MAXWRK, 3*M + NRHS*ILAENV( 1, 'DORMBR',
-     $                          'QLT', M, NRHS, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, 3*M + M*ILAENV( 1, 'DORGBR',
-     $                          'P', M, N, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, BDSPAC )
-                  MAXWRK = MAX( MAXWRK, N*NRHS )
-               END IF
-            END IF
-            MAXWRK = MAX( MINWRK, MAXWRK )
-         END IF
-         WORK( 1 ) = MAXWRK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY )
-     $      INFO = -12
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGELSS', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         RANK = 0
-         RETURN
-      END IF
-*
-*     Get machine parameters
-*
-      EPS = DLAMCH( 'P' )
-      SFMIN = DLAMCH( 'S' )
-      SMLNUM = SFMIN / EPS
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = DLANGE( 'M', M, N, A, LDA, WORK )
-      IASCL = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL DLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO )
-         IASCL = 1
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM
-*
-         CALL DLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO )
-         IASCL = 2
-      ELSE IF( ANRM.EQ.ZERO ) THEN
-*
-*        Matrix all zero. Return zero solution.
-*
-         CALL DLASET( 'F', MAX( M, N ), NRHS, ZERO, ZERO, B, LDB )
-         CALL DLASET( 'F', MINMN, 1, ZERO, ZERO, S, 1 )
-         RANK = 0
-         GO TO 70
-      END IF
-*
-*     Scale B if max element outside range [SMLNUM,BIGNUM]
-*
-      BNRM = DLANGE( 'M', M, NRHS, B, LDB, WORK )
-      IBSCL = 0
-      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL DLASCL( 'G', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 1
-      ELSE IF( BNRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM
-*
-         CALL DLASCL( 'G', 0, 0, BNRM, BIGNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 2
-      END IF
-*
-*     Overdetermined case
-*
-      IF( M.GE.N ) THEN
-*
-*        Path 1 - overdetermined or exactly determined
-*
-         MM = M
-         IF( M.GE.MNTHR ) THEN
-*
-*           Path 1a - overdetermined, with many more rows than columns
-*
-            MM = N
-            ITAU = 1
-            IWORK = ITAU + N
-*
-*           Compute A=Q*R
-*           (Workspace: need 2*N, prefer N+N*NB)
-*
-            CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
-     $                   LWORK-IWORK+1, INFO )
-*
-*           Multiply B by transpose(Q)
-*           (Workspace: need N+NRHS, prefer N+NRHS*NB)
-*
-            CALL DORMQR( 'L', 'T', M, NRHS, N, A, LDA, WORK( ITAU ), B,
-     $                   LDB, WORK( IWORK ), LWORK-IWORK+1, INFO )
-*
-*           Zero out below R
-*
-            IF( N.GT.1 )
-     $         CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, A( 2, 1 ), LDA )
-         END IF
-*
-         IE = 1
-         ITAUQ = IE + N
-         ITAUP = ITAUQ + N
-         IWORK = ITAUP + N
-*
-*        Bidiagonalize R in A
-*        (Workspace: need 3*N+MM, prefer 3*N+(MM+N)*NB)
-*
-         CALL DGEBRD( MM, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
-     $                WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors of R
-*        (Workspace: need 3*N+NRHS, prefer 3*N+NRHS*NB)
-*
-         CALL DORMBR( 'Q', 'L', 'T', MM, NRHS, N, A, LDA, WORK( ITAUQ ),
-     $                B, LDB, WORK( IWORK ), LWORK-IWORK+1, INFO )
-*
-*        Generate right bidiagonalizing vectors of R in A
-*        (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-         CALL DORGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                WORK( IWORK ), LWORK-IWORK+1, INFO )
-         IWORK = IE + N
-*
-*        Perform bidiagonal QR iteration
-*          multiply B by transpose of left singular vectors
-*          compute right singular vectors in A
-*        (Workspace: need BDSPAC)
-*
-         CALL DBDSQR( 'U', N, N, 0, NRHS, S, WORK( IE ), A, LDA, VDUM,
-     $                1, B, LDB, WORK( IWORK ), INFO )
-         IF( INFO.NE.0 )
-     $      GO TO 70
-*
-*        Multiply B by reciprocals of singular values
-*
-         THR = MAX( RCOND*S( 1 ), SFMIN )
-         IF( RCOND.LT.ZERO )
-     $      THR = MAX( EPS*S( 1 ), SFMIN )
-         RANK = 0
-         DO 10 I = 1, N
-            IF( S( I ).GT.THR ) THEN
-               CALL DRSCL( NRHS, S( I ), B( I, 1 ), LDB )
-               RANK = RANK + 1
-            ELSE
-               CALL DLASET( 'F', 1, NRHS, ZERO, ZERO, B( I, 1 ), LDB )
-            END IF
-   10    CONTINUE
-*
-*        Multiply B by right singular vectors
-*        (Workspace: need N, prefer N*NRHS)
-*
-         IF( LWORK.GE.LDB*NRHS .AND. NRHS.GT.1 ) THEN
-            CALL DGEMM( 'T', 'N', N, NRHS, N, ONE, A, LDA, B, LDB, ZERO,
-     $                  WORK, LDB )
-            CALL DLACPY( 'G', N, NRHS, WORK, LDB, B, LDB )
-         ELSE IF( NRHS.GT.1 ) THEN
-            CHUNK = LWORK / N
-            DO 20 I = 1, NRHS, CHUNK
-               BL = MIN( NRHS-I+1, CHUNK )
-               CALL DGEMM( 'T', 'N', N, BL, N, ONE, A, LDA, B( 1, I ),
-     $                     LDB, ZERO, WORK, N )
-               CALL DLACPY( 'G', N, BL, WORK, N, B( 1, I ), LDB )
-   20       CONTINUE
-         ELSE
-            CALL DGEMV( 'T', N, N, ONE, A, LDA, B, 1, ZERO, WORK, 1 )
-            CALL DCOPY( N, WORK, 1, B, 1 )
-         END IF
-*
-      ELSE IF( N.GE.MNTHR .AND. LWORK.GE.4*M+M*M+
-     $         MAX( M, 2*M-4, NRHS, N-3*M ) ) THEN
-*
-*        Path 2a - underdetermined, with many more columns than rows
-*        and sufficient workspace for an efficient algorithm
-*
-         LDWORK = M
-         IF( LWORK.GE.MAX( 4*M+M*LDA+MAX( M, 2*M-4, NRHS, N-3*M ),
-     $       M*LDA+M+M*NRHS ) )LDWORK = LDA
-         ITAU = 1
-         IWORK = M + 1
-*
-*        Compute A=L*Q
-*        (Workspace: need 2*M, prefer M+M*NB)
-*
-         CALL DGELQF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
-     $                LWORK-IWORK+1, INFO )
-         IL = IWORK
-*
-*        Copy L to WORK(IL), zeroing out above it
-*
-         CALL DLACPY( 'L', M, M, A, LDA, WORK( IL ), LDWORK )
-         CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, WORK( IL+LDWORK ),
-     $                LDWORK )
-         IE = IL + LDWORK*M
-         ITAUQ = IE + M
-         ITAUP = ITAUQ + M
-         IWORK = ITAUP + M
-*
-*        Bidiagonalize L in WORK(IL)
-*        (Workspace: need M*M+5*M, prefer M*M+4*M+2*M*NB)
-*
-         CALL DGEBRD( M, M, WORK( IL ), LDWORK, S, WORK( IE ),
-     $                WORK( ITAUQ ), WORK( ITAUP ), WORK( IWORK ),
-     $                LWORK-IWORK+1, INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors of L
-*        (Workspace: need M*M+4*M+NRHS, prefer M*M+4*M+NRHS*NB)
-*
-         CALL DORMBR( 'Q', 'L', 'T', M, NRHS, M, WORK( IL ), LDWORK,
-     $                WORK( ITAUQ ), B, LDB, WORK( IWORK ),
-     $                LWORK-IWORK+1, INFO )
-*
-*        Generate right bidiagonalizing vectors of R in WORK(IL)
-*        (Workspace: need M*M+5*M-1, prefer M*M+4*M+(M-1)*NB)
-*
-         CALL DORGBR( 'P', M, M, M, WORK( IL ), LDWORK, WORK( ITAUP ),
-     $                WORK( IWORK ), LWORK-IWORK+1, INFO )
-         IWORK = IE + M
-*
-*        Perform bidiagonal QR iteration,
-*           computing right singular vectors of L in WORK(IL) and
-*           multiplying B by transpose of left singular vectors
-*        (Workspace: need M*M+M+BDSPAC)
-*
-         CALL DBDSQR( 'U', M, M, 0, NRHS, S, WORK( IE ), WORK( IL ),
-     $                LDWORK, A, LDA, B, LDB, WORK( IWORK ), INFO )
-         IF( INFO.NE.0 )
-     $      GO TO 70
-*
-*        Multiply B by reciprocals of singular values
-*
-         THR = MAX( RCOND*S( 1 ), SFMIN )
-         IF( RCOND.LT.ZERO )
-     $      THR = MAX( EPS*S( 1 ), SFMIN )
-         RANK = 0
-         DO 30 I = 1, M
-            IF( S( I ).GT.THR ) THEN
-               CALL DRSCL( NRHS, S( I ), B( I, 1 ), LDB )
-               RANK = RANK + 1
-            ELSE
-               CALL DLASET( 'F', 1, NRHS, ZERO, ZERO, B( I, 1 ), LDB )
-            END IF
-   30    CONTINUE
-         IWORK = IE
-*
-*        Multiply B by right singular vectors of L in WORK(IL)
-*        (Workspace: need M*M+2*M, prefer M*M+M+M*NRHS)
-*
-         IF( LWORK.GE.LDB*NRHS+IWORK-1 .AND. NRHS.GT.1 ) THEN
-            CALL DGEMM( 'T', 'N', M, NRHS, M, ONE, WORK( IL ), LDWORK,
-     $                  B, LDB, ZERO, WORK( IWORK ), LDB )
-            CALL DLACPY( 'G', M, NRHS, WORK( IWORK ), LDB, B, LDB )
-         ELSE IF( NRHS.GT.1 ) THEN
-            CHUNK = ( LWORK-IWORK+1 ) / M
-            DO 40 I = 1, NRHS, CHUNK
-               BL = MIN( NRHS-I+1, CHUNK )
-               CALL DGEMM( 'T', 'N', M, BL, M, ONE, WORK( IL ), LDWORK,
-     $                     B( 1, I ), LDB, ZERO, WORK( IWORK ), M )
-               CALL DLACPY( 'G', M, BL, WORK( IWORK ), M, B( 1, I ),
-     $                      LDB )
-   40       CONTINUE
-         ELSE
-            CALL DGEMV( 'T', M, M, ONE, WORK( IL ), LDWORK, B( 1, 1 ),
-     $                  1, ZERO, WORK( IWORK ), 1 )
-            CALL DCOPY( M, WORK( IWORK ), 1, B( 1, 1 ), 1 )
-         END IF
-*
-*        Zero out below first M rows of B
-*
-         CALL DLASET( 'F', N-M, NRHS, ZERO, ZERO, B( M+1, 1 ), LDB )
-         IWORK = ITAU + M
-*
-*        Multiply transpose(Q) by B
-*        (Workspace: need M+NRHS, prefer M+NRHS*NB)
-*
-         CALL DORMLQ( 'L', 'T', N, NRHS, M, A, LDA, WORK( ITAU ), B,
-     $                LDB, WORK( IWORK ), LWORK-IWORK+1, INFO )
-*
-      ELSE
-*
-*        Path 2 - remaining underdetermined cases
-*
-         IE = 1
-         ITAUQ = IE + M
-         ITAUP = ITAUQ + M
-         IWORK = ITAUP + M
-*
-*        Bidiagonalize A
-*        (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB)
-*
-         CALL DGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
-     $                WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors
-*        (Workspace: need 3*M+NRHS, prefer 3*M+NRHS*NB)
-*
-         CALL DORMBR( 'Q', 'L', 'T', M, NRHS, N, A, LDA, WORK( ITAUQ ),
-     $                B, LDB, WORK( IWORK ), LWORK-IWORK+1, INFO )
-*
-*        Generate right bidiagonalizing vectors in A
-*        (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-         CALL DORGBR( 'P', M, N, M, A, LDA, WORK( ITAUP ),
-     $                WORK( IWORK ), LWORK-IWORK+1, INFO )
-         IWORK = IE + M
-*
-*        Perform bidiagonal QR iteration,
-*           computing right singular vectors of A in A and
-*           multiplying B by transpose of left singular vectors
-*        (Workspace: need BDSPAC)
-*
-         CALL DBDSQR( 'L', M, N, 0, NRHS, S, WORK( IE ), A, LDA, VDUM,
-     $                1, B, LDB, WORK( IWORK ), INFO )
-         IF( INFO.NE.0 )
-     $      GO TO 70
-*
-*        Multiply B by reciprocals of singular values
-*
-         THR = MAX( RCOND*S( 1 ), SFMIN )
-         IF( RCOND.LT.ZERO )
-     $      THR = MAX( EPS*S( 1 ), SFMIN )
-         RANK = 0
-         DO 50 I = 1, M
-            IF( S( I ).GT.THR ) THEN
-               CALL DRSCL( NRHS, S( I ), B( I, 1 ), LDB )
-               RANK = RANK + 1
-            ELSE
-               CALL DLASET( 'F', 1, NRHS, ZERO, ZERO, B( I, 1 ), LDB )
-            END IF
-   50    CONTINUE
-*
-*        Multiply B by right singular vectors of A
-*        (Workspace: need N, prefer N*NRHS)
-*
-         IF( LWORK.GE.LDB*NRHS .AND. NRHS.GT.1 ) THEN
-            CALL DGEMM( 'T', 'N', N, NRHS, M, ONE, A, LDA, B, LDB, ZERO,
-     $                  WORK, LDB )
-            CALL DLACPY( 'F', N, NRHS, WORK, LDB, B, LDB )
-         ELSE IF( NRHS.GT.1 ) THEN
-            CHUNK = LWORK / N
-            DO 60 I = 1, NRHS, CHUNK
-               BL = MIN( NRHS-I+1, CHUNK )
-               CALL DGEMM( 'T', 'N', N, BL, M, ONE, A, LDA, B( 1, I ),
-     $                     LDB, ZERO, WORK, N )
-               CALL DLACPY( 'F', N, BL, WORK, N, B( 1, I ), LDB )
-   60       CONTINUE
-         ELSE
-            CALL DGEMV( 'T', M, N, ONE, A, LDA, B, 1, ZERO, WORK, 1 )
-            CALL DCOPY( N, WORK, 1, B, 1 )
-         END IF
-      END IF
-*
-*     Undo scaling
-*
-      IF( IASCL.EQ.1 ) THEN
-         CALL DLASCL( 'G', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO )
-         CALL DLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
-     $                INFO )
-      ELSE IF( IASCL.EQ.2 ) THEN
-         CALL DLASCL( 'G', 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB, INFO )
-         CALL DLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
-     $                INFO )
-      END IF
-      IF( IBSCL.EQ.1 ) THEN
-         CALL DLASCL( 'G', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO )
-      ELSE IF( IBSCL.EQ.2 ) THEN
-         CALL DLASCL( 'G', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO )
-      END IF
-*
-   70 CONTINUE
-      WORK( 1 ) = MAXWRK
-      RETURN
-*
-*     End of DGELSS
-*
-      END
--- a/libcruft/lapack/dgelsy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,391 +0,0 @@
-      SUBROUTINE DGELSY( M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND, RANK,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LDB, LWORK, M, N, NRHS, RANK
-      DOUBLE PRECISION   RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGELSY computes the minimum-norm solution to a real linear least
-*  squares problem:
-*      minimize || A * X - B ||
-*  using a complete orthogonal factorization of A.  A is an M-by-N
-*  matrix which may be rank-deficient.
-*
-*  Several right hand side vectors b and solution vectors x can be
-*  handled in a single call; they are stored as the columns of the
-*  M-by-NRHS right hand side matrix B and the N-by-NRHS solution
-*  matrix X.
-*
-*  The routine first computes a QR factorization with column pivoting:
-*      A * P = Q * [ R11 R12 ]
-*                  [  0  R22 ]
-*  with R11 defined as the largest leading submatrix whose estimated
-*  condition number is less than 1/RCOND.  The order of R11, RANK,
-*  is the effective rank of A.
-*
-*  Then, R22 is considered to be negligible, and R12 is annihilated
-*  by orthogonal transformations from the right, arriving at the
-*  complete orthogonal factorization:
-*     A * P = Q * [ T11 0 ] * Z
-*                 [  0  0 ]
-*  The minimum-norm solution is then
-*     X = P * Z' [ inv(T11)*Q1'*B ]
-*                [        0       ]
-*  where Q1 consists of the first RANK columns of Q.
-*
-*  This routine is basically identical to the original xGELSX except
-*  three differences:
-*    o The call to the subroutine xGEQPF has been substituted by the
-*      the call to the subroutine xGEQP3. This subroutine is a Blas-3
-*      version of the QR factorization with column pivoting.
-*    o Matrix B (the right hand side) is updated with Blas-3.
-*    o The permutation of matrix B (the right hand side) is faster and
-*      more simple.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of
-*          columns of matrices B and X. NRHS >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, A has been overwritten by details of its
-*          complete orthogonal factorization.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*          On entry, the M-by-NRHS right hand side matrix B.
-*          On exit, the N-by-NRHS solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B. LDB >= max(1,M,N).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          On entry, if JPVT(i) .ne. 0, the i-th column of A is permuted
-*          to the front of AP, otherwise column i is a free column.
-*          On exit, if JPVT(i) = k, then the i-th column of AP
-*          was the k-th column of A.
-*
-*  RCOND   (input) DOUBLE PRECISION
-*          RCOND is used to determine the effective rank of A, which
-*          is defined as the order of the largest leading triangular
-*          submatrix R11 in the QR factorization with pivoting of A,
-*          whose estimated condition number < 1/RCOND.
-*
-*  RANK    (output) INTEGER
-*          The effective rank of A, i.e., the order of the submatrix
-*          R11.  This is the same as the order of the submatrix T11
-*          in the complete orthogonal factorization of A.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          The unblocked strategy requires that:
-*             LWORK >= MAX( MN+3*N+1, 2*MN+NRHS ),
-*          where MN = min( M, N ).
-*          The block algorithm requires that:
-*             LWORK >= MAX( MN+2*N+NB*(N+1), 2*MN+NB*NRHS ),
-*          where NB is an upper bound on the blocksize returned
-*          by ILAENV for the routines DGEQP3, DTZRZF, STZRQF, DORMQR,
-*          and DORMRZ.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: If INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*    E. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*    G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            IMAX, IMIN
-      PARAMETER          ( IMAX = 1, IMIN = 2 )
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IASCL, IBSCL, ISMAX, ISMIN, J, LWKMIN,
-     $                   LWKOPT, MN, NB, NB1, NB2, NB3, NB4
-      DOUBLE PRECISION   ANRM, BIGNUM, BNRM, C1, C2, S1, S2, SMAX,
-     $                   SMAXPR, SMIN, SMINPR, SMLNUM, WSIZE
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      DOUBLE PRECISION   DLAMCH, DLANGE
-      EXTERNAL           ILAENV, DLAMCH, DLANGE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DGEQP3, DLABAD, DLAIC1, DLASCL, DLASET,
-     $                   DORMQR, DORMRZ, DTRSM, DTZRZF, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-      MN = MIN( M, N )
-      ISMIN = MN + 1
-      ISMAX = 2*MN + 1
-*
-*     Test the input arguments.
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, M, N ) ) THEN
-         INFO = -7
-      END IF
-*
-*     Figure out optimal block size
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( MN.EQ.0 .OR. NRHS.EQ.0 ) THEN
-            LWKMIN = 1
-            LWKOPT = 1
-         ELSE
-            NB1 = ILAENV( 1, 'DGEQRF', ' ', M, N, -1, -1 )
-            NB2 = ILAENV( 1, 'DGERQF', ' ', M, N, -1, -1 )
-            NB3 = ILAENV( 1, 'DORMQR', ' ', M, N, NRHS, -1 )
-            NB4 = ILAENV( 1, 'DORMRQ', ' ', M, N, NRHS, -1 )
-            NB = MAX( NB1, NB2, NB3, NB4 )
-            LWKMIN = MN + MAX( 2*MN, N + 1, MN + NRHS )
-            LWKOPT = MAX( LWKMIN,
-     $                    MN + 2*N + NB*( N + 1 ), 2*MN + NB*NRHS )
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
-            INFO = -12
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGELSY', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( MN.EQ.0 .OR. NRHS.EQ.0 ) THEN
-         RANK = 0
-         RETURN
-      END IF
-*
-*     Get machine parameters
-*
-      SMLNUM = DLAMCH( 'S' ) / DLAMCH( 'P' )
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-*
-*     Scale A, B if max entries outside range [SMLNUM,BIGNUM]
-*
-      ANRM = DLANGE( 'M', M, N, A, LDA, WORK )
-      IASCL = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL DLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO )
-         IASCL = 1
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM
-*
-         CALL DLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO )
-         IASCL = 2
-      ELSE IF( ANRM.EQ.ZERO ) THEN
-*
-*        Matrix all zero. Return zero solution.
-*
-         CALL DLASET( 'F', MAX( M, N ), NRHS, ZERO, ZERO, B, LDB )
-         RANK = 0
-         GO TO 70
-      END IF
-*
-      BNRM = DLANGE( 'M', M, NRHS, B, LDB, WORK )
-      IBSCL = 0
-      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL DLASCL( 'G', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 1
-      ELSE IF( BNRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM
-*
-         CALL DLASCL( 'G', 0, 0, BNRM, BIGNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 2
-      END IF
-*
-*     Compute QR factorization with column pivoting of A:
-*        A * P = Q * R
-*
-      CALL DGEQP3( M, N, A, LDA, JPVT, WORK( 1 ), WORK( MN+1 ),
-     $             LWORK-MN, INFO )
-      WSIZE = MN + WORK( MN+1 )
-*
-*     workspace: MN+2*N+NB*(N+1).
-*     Details of Householder rotations stored in WORK(1:MN).
-*
-*     Determine RANK using incremental condition estimation
-*
-      WORK( ISMIN ) = ONE
-      WORK( ISMAX ) = ONE
-      SMAX = ABS( A( 1, 1 ) )
-      SMIN = SMAX
-      IF( ABS( A( 1, 1 ) ).EQ.ZERO ) THEN
-         RANK = 0
-         CALL DLASET( 'F', MAX( M, N ), NRHS, ZERO, ZERO, B, LDB )
-         GO TO 70
-      ELSE
-         RANK = 1
-      END IF
-*
-   10 CONTINUE
-      IF( RANK.LT.MN ) THEN
-         I = RANK + 1
-         CALL DLAIC1( IMIN, RANK, WORK( ISMIN ), SMIN, A( 1, I ),
-     $                A( I, I ), SMINPR, S1, C1 )
-         CALL DLAIC1( IMAX, RANK, WORK( ISMAX ), SMAX, A( 1, I ),
-     $                A( I, I ), SMAXPR, S2, C2 )
-*
-         IF( SMAXPR*RCOND.LE.SMINPR ) THEN
-            DO 20 I = 1, RANK
-               WORK( ISMIN+I-1 ) = S1*WORK( ISMIN+I-1 )
-               WORK( ISMAX+I-1 ) = S2*WORK( ISMAX+I-1 )
-   20       CONTINUE
-            WORK( ISMIN+RANK ) = C1
-            WORK( ISMAX+RANK ) = C2
-            SMIN = SMINPR
-            SMAX = SMAXPR
-            RANK = RANK + 1
-            GO TO 10
-         END IF
-      END IF
-*
-*     workspace: 3*MN.
-*
-*     Logically partition R = [ R11 R12 ]
-*                             [  0  R22 ]
-*     where R11 = R(1:RANK,1:RANK)
-*
-*     [R11,R12] = [ T11, 0 ] * Y
-*
-      IF( RANK.LT.N )
-     $   CALL DTZRZF( RANK, N, A, LDA, WORK( MN+1 ), WORK( 2*MN+1 ),
-     $                LWORK-2*MN, INFO )
-*
-*     workspace: 2*MN.
-*     Details of Householder rotations stored in WORK(MN+1:2*MN)
-*
-*     B(1:M,1:NRHS) := Q' * B(1:M,1:NRHS)
-*
-      CALL DORMQR( 'Left', 'Transpose', M, NRHS, MN, A, LDA, WORK( 1 ),
-     $             B, LDB, WORK( 2*MN+1 ), LWORK-2*MN, INFO )
-      WSIZE = MAX( WSIZE, 2*MN+WORK( 2*MN+1 ) )
-*
-*     workspace: 2*MN+NB*NRHS.
-*
-*     B(1:RANK,1:NRHS) := inv(T11) * B(1:RANK,1:NRHS)
-*
-      CALL DTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', RANK,
-     $            NRHS, ONE, A, LDA, B, LDB )
-*
-      DO 40 J = 1, NRHS
-         DO 30 I = RANK + 1, N
-            B( I, J ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-*
-*     B(1:N,1:NRHS) := Y' * B(1:N,1:NRHS)
-*
-      IF( RANK.LT.N ) THEN
-         CALL DORMRZ( 'Left', 'Transpose', N, NRHS, RANK, N-RANK, A,
-     $                LDA, WORK( MN+1 ), B, LDB, WORK( 2*MN+1 ),
-     $                LWORK-2*MN, INFO )
-      END IF
-*
-*     workspace: 2*MN+NRHS.
-*
-*     B(1:N,1:NRHS) := P * B(1:N,1:NRHS)
-*
-      DO 60 J = 1, NRHS
-         DO 50 I = 1, N
-            WORK( JPVT( I ) ) = B( I, J )
-   50    CONTINUE
-         CALL DCOPY( N, WORK( 1 ), 1, B( 1, J ), 1 )
-   60 CONTINUE
-*
-*     workspace: N.
-*
-*     Undo scaling
-*
-      IF( IASCL.EQ.1 ) THEN
-         CALL DLASCL( 'G', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO )
-         CALL DLASCL( 'U', 0, 0, SMLNUM, ANRM, RANK, RANK, A, LDA,
-     $                INFO )
-      ELSE IF( IASCL.EQ.2 ) THEN
-         CALL DLASCL( 'G', 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB, INFO )
-         CALL DLASCL( 'U', 0, 0, BIGNUM, ANRM, RANK, RANK, A, LDA,
-     $                INFO )
-      END IF
-      IF( IBSCL.EQ.1 ) THEN
-         CALL DLASCL( 'G', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO )
-      ELSE IF( IBSCL.EQ.2 ) THEN
-         CALL DLASCL( 'G', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO )
-      END IF
-*
-   70 CONTINUE
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of DGELSY
-*
-      END
--- a/libcruft/lapack/dgeqp3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,287 +0,0 @@
-      SUBROUTINE DGEQP3( M, N, A, LDA, JPVT, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGEQP3 computes a QR factorization with column pivoting of a
-*  matrix A:  A*P = Q*R  using Level 3 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the upper triangle of the array contains the
-*          min(M,N)-by-N upper trapezoidal matrix R; the elements below
-*          the diagonal, together with the array TAU, represent the
-*          orthogonal matrix Q as a product of min(M,N) elementary
-*          reflectors.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          On entry, if JPVT(J).ne.0, the J-th column of A is permuted
-*          to the front of A*P (a leading column); if JPVT(J)=0,
-*          the J-th column of A is a free column.
-*          On exit, if JPVT(J)=K, then the J-th column of A*P was the
-*          the K-th column of A.
-*
-*  TAU     (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO=0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= 3*N+1.
-*          For optimal performance LWORK >= 2*N+( N+1 )*NB, where NB
-*          is the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit.
-*          < 0: if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(k), where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real/complex scalar, and v is a real/complex vector
-*  with v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in
-*  A(i+1:m,i), and tau in TAU(i).
-*
-*  Based on contributions by
-*    G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*    X. Sun, Computer Science Dept., Duke University, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            INB, INBMIN, IXOVER
-      PARAMETER          ( INB = 1, INBMIN = 2, IXOVER = 3 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            FJB, IWS, J, JB, LWKOPT, MINMN, MINWS, NA, NB,
-     $                   NBMIN, NFXD, NX, SM, SMINMN, SN, TOPBMN
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEQRF, DLAQP2, DLAQPS, DORMQR, DSWAP, XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      DOUBLE PRECISION   DNRM2
-      EXTERNAL           ILAENV, DNRM2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          INT, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test input arguments
-*     ====================
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         MINMN = MIN( M, N )
-         IF( MINMN.EQ.0 ) THEN
-            IWS = 1
-            LWKOPT = 1
-         ELSE
-            IWS = 3*N + 1
-            NB = ILAENV( INB, 'DGEQRF', ' ', M, N, -1, -1 )
-            LWKOPT = 2*N + ( N + 1 )*NB
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( ( LWORK.LT.IWS ) .AND. .NOT.LQUERY ) THEN
-            INFO = -8
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGEQP3', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( MINMN.EQ.0 ) THEN
-         RETURN
-      END IF
-*
-*     Move initial columns up front.
-*
-      NFXD = 1
-      DO 10 J = 1, N
-         IF( JPVT( J ).NE.0 ) THEN
-            IF( J.NE.NFXD ) THEN
-               CALL DSWAP( M, A( 1, J ), 1, A( 1, NFXD ), 1 )
-               JPVT( J ) = JPVT( NFXD )
-               JPVT( NFXD ) = J
-            ELSE
-               JPVT( J ) = J
-            END IF
-            NFXD = NFXD + 1
-         ELSE
-            JPVT( J ) = J
-         END IF
-   10 CONTINUE
-      NFXD = NFXD - 1
-*
-*     Factorize fixed columns
-*     =======================
-*
-*     Compute the QR factorization of fixed columns and update
-*     remaining columns.
-*
-      IF( NFXD.GT.0 ) THEN
-         NA = MIN( M, NFXD )
-*CC      CALL DGEQR2( M, NA, A, LDA, TAU, WORK, INFO )
-         CALL DGEQRF( M, NA, A, LDA, TAU, WORK, LWORK, INFO )
-         IWS = MAX( IWS, INT( WORK( 1 ) ) )
-         IF( NA.LT.N ) THEN
-*CC         CALL DORM2R( 'Left', 'Transpose', M, N-NA, NA, A, LDA,
-*CC  $                   TAU, A( 1, NA+1 ), LDA, WORK, INFO )
-            CALL DORMQR( 'Left', 'Transpose', M, N-NA, NA, A, LDA, TAU,
-     $                   A( 1, NA+1 ), LDA, WORK, LWORK, INFO )
-            IWS = MAX( IWS, INT( WORK( 1 ) ) )
-         END IF
-      END IF
-*
-*     Factorize free columns
-*     ======================
-*
-      IF( NFXD.LT.MINMN ) THEN
-*
-         SM = M - NFXD
-         SN = N - NFXD
-         SMINMN = MINMN - NFXD
-*
-*        Determine the block size.
-*
-         NB = ILAENV( INB, 'DGEQRF', ' ', SM, SN, -1, -1 )
-         NBMIN = 2
-         NX = 0
-*
-         IF( ( NB.GT.1 ) .AND. ( NB.LT.SMINMN ) ) THEN
-*
-*           Determine when to cross over from blocked to unblocked code.
-*
-            NX = MAX( 0, ILAENV( IXOVER, 'DGEQRF', ' ', SM, SN, -1,
-     $           -1 ) )
-*
-*
-            IF( NX.LT.SMINMN ) THEN
-*
-*              Determine if workspace is large enough for blocked code.
-*
-               MINWS = 2*SN + ( SN+1 )*NB
-               IWS = MAX( IWS, MINWS )
-               IF( LWORK.LT.MINWS ) THEN
-*
-*                 Not enough workspace to use optimal NB: Reduce NB and
-*                 determine the minimum value of NB.
-*
-                  NB = ( LWORK-2*SN ) / ( SN+1 )
-                  NBMIN = MAX( 2, ILAENV( INBMIN, 'DGEQRF', ' ', SM, SN,
-     $                    -1, -1 ) )
-*
-*
-               END IF
-            END IF
-         END IF
-*
-*        Initialize partial column norms. The first N elements of work
-*        store the exact column norms.
-*
-         DO 20 J = NFXD + 1, N
-            WORK( J ) = DNRM2( SM, A( NFXD+1, J ), 1 )
-            WORK( N+J ) = WORK( J )
-   20    CONTINUE
-*
-         IF( ( NB.GE.NBMIN ) .AND. ( NB.LT.SMINMN ) .AND.
-     $       ( NX.LT.SMINMN ) ) THEN
-*
-*           Use blocked code initially.
-*
-            J = NFXD + 1
-*
-*           Compute factorization: while loop.
-*
-*
-            TOPBMN = MINMN - NX
-   30       CONTINUE
-            IF( J.LE.TOPBMN ) THEN
-               JB = MIN( NB, TOPBMN-J+1 )
-*
-*              Factorize JB columns among columns J:N.
-*
-               CALL DLAQPS( M, N-J+1, J-1, JB, FJB, A( 1, J ), LDA,
-     $                      JPVT( J ), TAU( J ), WORK( J ), WORK( N+J ),
-     $                      WORK( 2*N+1 ), WORK( 2*N+JB+1 ), N-J+1 )
-*
-               J = J + FJB
-               GO TO 30
-            END IF
-         ELSE
-            J = NFXD + 1
-         END IF
-*
-*        Use unblocked code to factor the last or only block.
-*
-*
-         IF( J.LE.MINMN )
-     $      CALL DLAQP2( M, N-J+1, J-1, A( 1, J ), LDA, JPVT( J ),
-     $                   TAU( J ), WORK( J ), WORK( N+J ),
-     $                   WORK( 2*N+1 ) )
-*
-      END IF
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of DGEQP3
-*
-      END
--- a/libcruft/lapack/dgeqpf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,231 +0,0 @@
-      SUBROUTINE DGEQPF( M, N, A, LDA, JPVT, TAU, WORK, INFO )
-*
-*  -- LAPACK deprecated driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  This routine is deprecated and has been replaced by routine DGEQP3.
-*
-*  DGEQPF computes a QR factorization with column pivoting of a
-*  real M-by-N matrix A: A*P = Q*R.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the upper triangle of the array contains the
-*          min(M,N)-by-N upper triangular matrix R; the elements
-*          below the diagonal, together with the array TAU,
-*          represent the orthogonal matrix Q as a product of
-*          min(m,n) elementary reflectors.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          On entry, if JPVT(i) .ne. 0, the i-th column of A is permuted
-*          to the front of A*P (a leading column); if JPVT(i) = 0,
-*          the i-th column of A is a free column.
-*          On exit, if JPVT(i) = k, then the i-th column of A*P
-*          was the k-th column of A.
-*
-*  TAU     (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors.
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (3*N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(n)
-*
-*  Each H(i) has the form
-*
-*     H = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i).
-*
-*  The matrix P is represented in jpvt as follows: If
-*     jpvt(j) = i
-*  then the jth column of P is the ith canonical unit vector.
-*
-*  Partial column norm updating strategy modified by
-*    Z. Drmac and Z. Bujanovic, Dept. of Mathematics,
-*    University of Zagreb, Croatia.
-*    June 2006.
-*  For more details see LAPACK Working Note 176.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ITEMP, J, MA, MN, PVT
-      DOUBLE PRECISION   AII, TEMP, TEMP2, TOL3Z
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEQR2, DLARF, DLARFG, DORM2R, DSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. External Functions ..
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DLAMCH, DNRM2
-      EXTERNAL           IDAMAX, DLAMCH, DNRM2
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGEQPF', -INFO )
-         RETURN
-      END IF
-*
-      MN = MIN( M, N )
-      TOL3Z = SQRT(DLAMCH('Epsilon'))
-*
-*     Move initial columns up front
-*
-      ITEMP = 1
-      DO 10 I = 1, N
-         IF( JPVT( I ).NE.0 ) THEN
-            IF( I.NE.ITEMP ) THEN
-               CALL DSWAP( M, A( 1, I ), 1, A( 1, ITEMP ), 1 )
-               JPVT( I ) = JPVT( ITEMP )
-               JPVT( ITEMP ) = I
-            ELSE
-               JPVT( I ) = I
-            END IF
-            ITEMP = ITEMP + 1
-         ELSE
-            JPVT( I ) = I
-         END IF
-   10 CONTINUE
-      ITEMP = ITEMP - 1
-*
-*     Compute the QR factorization and update remaining columns
-*
-      IF( ITEMP.GT.0 ) THEN
-         MA = MIN( ITEMP, M )
-         CALL DGEQR2( M, MA, A, LDA, TAU, WORK, INFO )
-         IF( MA.LT.N ) THEN
-            CALL DORM2R( 'Left', 'Transpose', M, N-MA, MA, A, LDA, TAU,
-     $                   A( 1, MA+1 ), LDA, WORK, INFO )
-         END IF
-      END IF
-*
-      IF( ITEMP.LT.MN ) THEN
-*
-*        Initialize partial column norms. The first n elements of
-*        work store the exact column norms.
-*
-         DO 20 I = ITEMP + 1, N
-            WORK( I ) = DNRM2( M-ITEMP, A( ITEMP+1, I ), 1 )
-            WORK( N+I ) = WORK( I )
-   20    CONTINUE
-*
-*        Compute factorization
-*
-         DO 40 I = ITEMP + 1, MN
-*
-*           Determine ith pivot column and swap if necessary
-*
-            PVT = ( I-1 ) + IDAMAX( N-I+1, WORK( I ), 1 )
-*
-            IF( PVT.NE.I ) THEN
-               CALL DSWAP( M, A( 1, PVT ), 1, A( 1, I ), 1 )
-               ITEMP = JPVT( PVT )
-               JPVT( PVT ) = JPVT( I )
-               JPVT( I ) = ITEMP
-               WORK( PVT ) = WORK( I )
-               WORK( N+PVT ) = WORK( N+I )
-            END IF
-*
-*           Generate elementary reflector H(i)
-*
-            IF( I.LT.M ) THEN
-               CALL DLARFG( M-I+1, A( I, I ), A( I+1, I ), 1, TAU( I ) )
-            ELSE
-               CALL DLARFG( 1, A( M, M ), A( M, M ), 1, TAU( M ) )
-            END IF
-*
-            IF( I.LT.N ) THEN
-*
-*              Apply H(i) to A(i:m,i+1:n) from the left
-*
-               AII = A( I, I )
-               A( I, I ) = ONE
-               CALL DLARF( 'LEFT', M-I+1, N-I, A( I, I ), 1, TAU( I ),
-     $                     A( I, I+1 ), LDA, WORK( 2*N+1 ) )
-               A( I, I ) = AII
-            END IF
-*
-*           Update partial column norms
-*
-            DO 30 J = I + 1, N
-               IF( WORK( J ).NE.ZERO ) THEN
-*
-*                 NOTE: The following 4 lines follow from the analysis in
-*                 Lapack Working Note 176.
-*                 
-                  TEMP = ABS( A( I, J ) ) / WORK( J )
-                  TEMP = MAX( ZERO, ( ONE+TEMP )*( ONE-TEMP ) )
-                  TEMP2 = TEMP*( WORK( J ) / WORK( N+J ) )**2
-                  IF( TEMP2 .LE. TOL3Z ) THEN 
-                     IF( M-I.GT.0 ) THEN
-                        WORK( J ) = DNRM2( M-I, A( I+1, J ), 1 )
-                        WORK( N+J ) = WORK( J )
-                     ELSE
-                        WORK( J ) = ZERO
-                        WORK( N+J ) = ZERO
-                     END IF
-                  ELSE
-                     WORK( J ) = WORK( J )*SQRT( TEMP )
-                  END IF
-               END IF
-   30       CONTINUE
-*
-   40    CONTINUE
-      END IF
-      RETURN
-*
-*     End of DGEQPF
-*
-      END
--- a/libcruft/lapack/dgeqr2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,121 +0,0 @@
-      SUBROUTINE DGEQR2( M, N, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGEQR2 computes a QR factorization of a real m by n matrix A:
-*  A = Q * R.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the m by n matrix A.
-*          On exit, the elements on and above the diagonal of the array
-*          contain the min(m,n) by n upper trapezoidal matrix R (R is
-*          upper triangular if m >= n); the elements below the diagonal,
-*          with the array TAU, represent the orthogonal matrix Q as a
-*          product of elementary reflectors (see Further Details).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(k), where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i),
-*  and tau in TAU(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, K
-      DOUBLE PRECISION   AII
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARF, DLARFG, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGEQR2', -INFO )
-         RETURN
-      END IF
-*
-      K = MIN( M, N )
-*
-      DO 10 I = 1, K
-*
-*        Generate elementary reflector H(i) to annihilate A(i+1:m,i)
-*
-         CALL DLARFG( M-I+1, A( I, I ), A( MIN( I+1, M ), I ), 1,
-     $                TAU( I ) )
-         IF( I.LT.N ) THEN
-*
-*           Apply H(i) to A(i:m,i+1:n) from the left
-*
-            AII = A( I, I )
-            A( I, I ) = ONE
-            CALL DLARF( 'Left', M-I+1, N-I, A( I, I ), 1, TAU( I ),
-     $                  A( I, I+1 ), LDA, WORK )
-            A( I, I ) = AII
-         END IF
-   10 CONTINUE
-      RETURN
-*
-*     End of DGEQR2
-*
-      END
--- a/libcruft/lapack/dgeqrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,196 +0,0 @@
-      SUBROUTINE DGEQRF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGEQRF computes a QR factorization of a real M-by-N matrix A:
-*  A = Q * R.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the elements on and above the diagonal of the array
-*          contain the min(M,N)-by-N upper trapezoidal matrix R (R is
-*          upper triangular if m >= n); the elements below the diagonal,
-*          with the array TAU, represent the orthogonal matrix Q as a
-*          product of min(m,n) elementary reflectors (see Further
-*          Details).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,N).
-*          For optimum performance LWORK >= N*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(k), where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i),
-*  and tau in TAU(i).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, K, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEQR2, DLARFB, DLARFT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NB = ILAENV( 1, 'DGEQRF', ' ', M, N, -1, -1 )
-      LWKOPT = N*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGEQRF', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      K = MIN( M, N )
-      IF( K.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = N
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'DGEQRF', ' ', M, N, -1, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = N
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'DGEQRF', ' ', M, N, -1,
-     $                 -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code initially
-*
-         DO 10 I = 1, K - NX, NB
-            IB = MIN( K-I+1, NB )
-*
-*           Compute the QR factorization of the current block
-*           A(i:m,i:i+ib-1)
-*
-            CALL DGEQR2( M-I+1, IB, A( I, I ), LDA, TAU( I ), WORK,
-     $                   IINFO )
-            IF( I+IB.LE.N ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i) H(i+1) . . . H(i+ib-1)
-*
-               CALL DLARFT( 'Forward', 'Columnwise', M-I+1, IB,
-     $                      A( I, I ), LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H' to A(i:m,i+ib:n) from the left
-*
-               CALL DLARFB( 'Left', 'Transpose', 'Forward',
-     $                      'Columnwise', M-I+1, N-I-IB+1, IB,
-     $                      A( I, I ), LDA, WORK, LDWORK, A( I, I+IB ),
-     $                      LDA, WORK( IB+1 ), LDWORK )
-            END IF
-   10    CONTINUE
-      ELSE
-         I = 1
-      END IF
-*
-*     Use unblocked code to factor the last or only block.
-*
-      IF( I.LE.K )
-     $   CALL DGEQR2( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK,
-     $                IINFO )
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of DGEQRF
-*
-      END
--- a/libcruft/lapack/dgesv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-      SUBROUTINE DGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGESV computes the solution to a real system of linear equations
-*     A * X = B,
-*  where A is an N-by-N matrix and X and B are N-by-NRHS matrices.
-*
-*  The LU decomposition with partial pivoting and row interchanges is
-*  used to factor A as
-*     A = P * L * U,
-*  where P is a permutation matrix, L is unit lower triangular, and U is
-*  upper triangular.  The factored form of A is then used to solve the
-*  system of equations A * X = B.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of linear equations, i.e., the order of the
-*          matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the N-by-N coefficient matrix A.
-*          On exit, the factors L and U from the factorization
-*          A = P*L*U; the unit diagonal elements of L are not stored.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  IPIV    (output) INTEGER array, dimension (N)
-*          The pivot indices that define the permutation matrix P;
-*          row i of the matrix was interchanged with row IPIV(i).
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*          On entry, the N-by-NRHS matrix of right hand side matrix B.
-*          On exit, if INFO = 0, the N-by-NRHS solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, U(i,i) is exactly zero.  The factorization
-*                has been completed, but the factor U is exactly
-*                singular, so the solution could not be computed.
-*
-*  =====================================================================
-*
-*     .. External Subroutines ..
-      EXTERNAL           DGETRF, DGETRS, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGESV ', -INFO )
-         RETURN
-      END IF
-*
-*     Compute the LU factorization of A.
-*
-      CALL DGETRF( N, N, A, LDA, IPIV, INFO )
-      IF( INFO.EQ.0 ) THEN
-*
-*        Solve the system A*X = B, overwriting B with X.
-*
-         CALL DGETRS( 'No transpose', N, NRHS, A, LDA, IPIV, B, LDB,
-     $                INFO )
-      END IF
-      RETURN
-*
-*     End of DGESV
-*
-      END
--- a/libcruft/lapack/dgesvd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3401 +0,0 @@
-      SUBROUTINE DGESVD( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBU, JOBVT
-      INTEGER            INFO, LDA, LDU, LDVT, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), S( * ), U( LDU, * ),
-     $                   VT( LDVT, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGESVD computes the singular value decomposition (SVD) of a real
-*  M-by-N matrix A, optionally computing the left and/or right singular
-*  vectors. The SVD is written
-*
-*       A = U * SIGMA * transpose(V)
-*
-*  where SIGMA is an M-by-N matrix which is zero except for its
-*  min(m,n) diagonal elements, U is an M-by-M orthogonal matrix, and
-*  V is an N-by-N orthogonal matrix.  The diagonal elements of SIGMA
-*  are the singular values of A; they are real and non-negative, and
-*  are returned in descending order.  The first min(m,n) columns of
-*  U and V are the left and right singular vectors of A.
-*
-*  Note that the routine returns V**T, not V.
-*
-*  Arguments
-*  =========
-*
-*  JOBU    (input) CHARACTER*1
-*          Specifies options for computing all or part of the matrix U:
-*          = 'A':  all M columns of U are returned in array U:
-*          = 'S':  the first min(m,n) columns of U (the left singular
-*                  vectors) are returned in the array U;
-*          = 'O':  the first min(m,n) columns of U (the left singular
-*                  vectors) are overwritten on the array A;
-*          = 'N':  no columns of U (no left singular vectors) are
-*                  computed.
-*
-*  JOBVT   (input) CHARACTER*1
-*          Specifies options for computing all or part of the matrix
-*          V**T:
-*          = 'A':  all N rows of V**T are returned in the array VT;
-*          = 'S':  the first min(m,n) rows of V**T (the right singular
-*                  vectors) are returned in the array VT;
-*          = 'O':  the first min(m,n) rows of V**T (the right singular
-*                  vectors) are overwritten on the array A;
-*          = 'N':  no rows of V**T (no right singular vectors) are
-*                  computed.
-*
-*          JOBVT and JOBU cannot both be 'O'.
-*
-*  M       (input) INTEGER
-*          The number of rows of the input matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the input matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit,
-*          if JOBU = 'O',  A is overwritten with the first min(m,n)
-*                          columns of U (the left singular vectors,
-*                          stored columnwise);
-*          if JOBVT = 'O', A is overwritten with the first min(m,n)
-*                          rows of V**T (the right singular vectors,
-*                          stored rowwise);
-*          if JOBU .ne. 'O' and JOBVT .ne. 'O', the contents of A
-*                          are destroyed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  S       (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The singular values of A, sorted so that S(i) >= S(i+1).
-*
-*  U       (output) DOUBLE PRECISION array, dimension (LDU,UCOL)
-*          (LDU,M) if JOBU = 'A' or (LDU,min(M,N)) if JOBU = 'S'.
-*          If JOBU = 'A', U contains the M-by-M orthogonal matrix U;
-*          if JOBU = 'S', U contains the first min(m,n) columns of U
-*          (the left singular vectors, stored columnwise);
-*          if JOBU = 'N' or 'O', U is not referenced.
-*
-*  LDU     (input) INTEGER
-*          The leading dimension of the array U.  LDU >= 1; if
-*          JOBU = 'S' or 'A', LDU >= M.
-*
-*  VT      (output) DOUBLE PRECISION array, dimension (LDVT,N)
-*          If JOBVT = 'A', VT contains the N-by-N orthogonal matrix
-*          V**T;
-*          if JOBVT = 'S', VT contains the first min(m,n) rows of
-*          V**T (the right singular vectors, stored rowwise);
-*          if JOBVT = 'N' or 'O', VT is not referenced.
-*
-*  LDVT    (input) INTEGER
-*          The leading dimension of the array VT.  LDVT >= 1; if
-*          JOBVT = 'A', LDVT >= N; if JOBVT = 'S', LDVT >= min(M,N).
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK;
-*          if INFO > 0, WORK(2:MIN(M,N)) contains the unconverged
-*          superdiagonal elements of an upper bidiagonal matrix B
-*          whose diagonal is in S (not necessarily sorted). B
-*          satisfies A = U * B * VT, so it has the same singular values
-*          as A, and singular vectors related by U and VT.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          LWORK >= MAX(1,3*MIN(M,N)+MAX(M,N),5*MIN(M,N)).
-*          For good performance, LWORK should generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if DBDSQR did not converge, INFO specifies how many
-*                superdiagonals of an intermediate bidiagonal form B
-*                did not converge to zero. See the description of WORK
-*                above for details.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, WNTUA, WNTUAS, WNTUN, WNTUO, WNTUS,
-     $                   WNTVA, WNTVAS, WNTVN, WNTVO, WNTVS
-      INTEGER            BDSPAC, BLK, CHUNK, I, IE, IERR, IR, ISCL,
-     $                   ITAU, ITAUP, ITAUQ, IU, IWORK, LDWRKR, LDWRKU,
-     $                   MAXWRK, MINMN, MINWRK, MNTHR, NCU, NCVT, NRU,
-     $                   NRVT, WRKBL
-      DOUBLE PRECISION   ANRM, BIGNUM, EPS, SMLNUM
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   DUM( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DBDSQR, DGEBRD, DGELQF, DGEMM, DGEQRF, DLACPY,
-     $                   DLASCL, DLASET, DORGBR, DORGLQ, DORGQR, DORMBR,
-     $                   XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      DOUBLE PRECISION   DLAMCH, DLANGE
-      EXTERNAL           LSAME, ILAENV, DLAMCH, DLANGE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      MINMN = MIN( M, N )
-      WNTUA = LSAME( JOBU, 'A' )
-      WNTUS = LSAME( JOBU, 'S' )
-      WNTUAS = WNTUA .OR. WNTUS
-      WNTUO = LSAME( JOBU, 'O' )
-      WNTUN = LSAME( JOBU, 'N' )
-      WNTVA = LSAME( JOBVT, 'A' )
-      WNTVS = LSAME( JOBVT, 'S' )
-      WNTVAS = WNTVA .OR. WNTVS
-      WNTVO = LSAME( JOBVT, 'O' )
-      WNTVN = LSAME( JOBVT, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-      IF( .NOT.( WNTUA .OR. WNTUS .OR. WNTUO .OR. WNTUN ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.( WNTVA .OR. WNTVS .OR. WNTVO .OR. WNTVN ) .OR.
-     $         ( WNTVO .AND. WNTUO ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -6
-      ELSE IF( LDU.LT.1 .OR. ( WNTUAS .AND. LDU.LT.M ) ) THEN
-         INFO = -9
-      ELSE IF( LDVT.LT.1 .OR. ( WNTVA .AND. LDVT.LT.N ) .OR.
-     $         ( WNTVS .AND. LDVT.LT.MINMN ) ) THEN
-         INFO = -11
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of workspace needed at that point in the code,
-*       as well as the preferred amount for good performance.
-*       NB refers to the optimal block size for the immediately
-*       following subroutine, as returned by ILAENV.)
-*
-      IF( INFO.EQ.0 ) THEN
-         MINWRK = 1
-         MAXWRK = 1
-         IF( M.GE.N .AND. MINMN.GT.0 ) THEN
-*
-*           Compute space needed for DBDSQR
-*
-            MNTHR = ILAENV( 6, 'DGESVD', JOBU // JOBVT, M, N, 0, 0 )
-            BDSPAC = 5*N
-            IF( M.GE.MNTHR ) THEN
-               IF( WNTUN ) THEN
-*
-*                 Path 1 (M much larger than N, JOBU='N')
-*
-                  MAXWRK = N + N*ILAENV( 1, 'DGEQRF', ' ', M, N, -1,
-     $                     -1 )
-                  MAXWRK = MAX( MAXWRK, 3*N+2*N*
-     $                     ILAENV( 1, 'DGEBRD', ' ', N, N, -1, -1 ) )
-                  IF( WNTVO .OR. WNTVAS )
-     $               MAXWRK = MAX( MAXWRK, 3*N+( N-1 )*
-     $                        ILAENV( 1, 'DORGBR', 'P', N, N, N, -1 ) )
-                  MAXWRK = MAX( MAXWRK, BDSPAC )
-                  MINWRK = MAX( 4*N, BDSPAC )
-               ELSE IF( WNTUO .AND. WNTVN ) THEN
-*
-*                 Path 2 (M much larger than N, JOBU='O', JOBVT='N')
-*
-                  WRKBL = N + N*ILAENV( 1, 'DGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'DORGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+2*N*
-     $                    ILAENV( 1, 'DGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+N*
-     $                    ILAENV( 1, 'DORGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = MAX( N*N+WRKBL, N*N+M*N+N )
-                  MINWRK = MAX( 3*N+M, BDSPAC )
-               ELSE IF( WNTUO .AND. WNTVAS ) THEN
-*
-*                 Path 3 (M much larger than N, JOBU='O', JOBVT='S' or
-*                 'A')
-*
-                  WRKBL = N + N*ILAENV( 1, 'DGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'DORGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+2*N*
-     $                    ILAENV( 1, 'DGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+N*
-     $                    ILAENV( 1, 'DORGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+( N-1 )*
-     $                    ILAENV( 1, 'DORGBR', 'P', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = MAX( N*N+WRKBL, N*N+M*N+N )
-                  MINWRK = MAX( 3*N+M, BDSPAC )
-               ELSE IF( WNTUS .AND. WNTVN ) THEN
-*
-*                 Path 4 (M much larger than N, JOBU='S', JOBVT='N')
-*
-                  WRKBL = N + N*ILAENV( 1, 'DGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'DORGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+2*N*
-     $                    ILAENV( 1, 'DGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+N*
-     $                    ILAENV( 1, 'DORGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = N*N + WRKBL
-                  MINWRK = MAX( 3*N+M, BDSPAC )
-               ELSE IF( WNTUS .AND. WNTVO ) THEN
-*
-*                 Path 5 (M much larger than N, JOBU='S', JOBVT='O')
-*
-                  WRKBL = N + N*ILAENV( 1, 'DGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'DORGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+2*N*
-     $                    ILAENV( 1, 'DGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+N*
-     $                    ILAENV( 1, 'DORGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+( N-1 )*
-     $                    ILAENV( 1, 'DORGBR', 'P', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = 2*N*N + WRKBL
-                  MINWRK = MAX( 3*N+M, BDSPAC )
-               ELSE IF( WNTUS .AND. WNTVAS ) THEN
-*
-*                 Path 6 (M much larger than N, JOBU='S', JOBVT='S' or
-*                 'A')
-*
-                  WRKBL = N + N*ILAENV( 1, 'DGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'DORGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+2*N*
-     $                    ILAENV( 1, 'DGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+N*
-     $                    ILAENV( 1, 'DORGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+( N-1 )*
-     $                    ILAENV( 1, 'DORGBR', 'P', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = N*N + WRKBL
-                  MINWRK = MAX( 3*N+M, BDSPAC )
-               ELSE IF( WNTUA .AND. WNTVN ) THEN
-*
-*                 Path 7 (M much larger than N, JOBU='A', JOBVT='N')
-*
-                  WRKBL = N + N*ILAENV( 1, 'DGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+M*ILAENV( 1, 'DORGQR', ' ', M,
-     $                    M, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+2*N*
-     $                    ILAENV( 1, 'DGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+N*
-     $                    ILAENV( 1, 'DORGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = N*N + WRKBL
-                  MINWRK = MAX( 3*N+M, BDSPAC )
-               ELSE IF( WNTUA .AND. WNTVO ) THEN
-*
-*                 Path 8 (M much larger than N, JOBU='A', JOBVT='O')
-*
-                  WRKBL = N + N*ILAENV( 1, 'DGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+M*ILAENV( 1, 'DORGQR', ' ', M,
-     $                    M, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+2*N*
-     $                    ILAENV( 1, 'DGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+N*
-     $                    ILAENV( 1, 'DORGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+( N-1 )*
-     $                    ILAENV( 1, 'DORGBR', 'P', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = 2*N*N + WRKBL
-                  MINWRK = MAX( 3*N+M, BDSPAC )
-               ELSE IF( WNTUA .AND. WNTVAS ) THEN
-*
-*                 Path 9 (M much larger than N, JOBU='A', JOBVT='S' or
-*                 'A')
-*
-                  WRKBL = N + N*ILAENV( 1, 'DGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+M*ILAENV( 1, 'DORGQR', ' ', M,
-     $                    M, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+2*N*
-     $                    ILAENV( 1, 'DGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+N*
-     $                    ILAENV( 1, 'DORGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+( N-1 )*
-     $                    ILAENV( 1, 'DORGBR', 'P', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = N*N + WRKBL
-                  MINWRK = MAX( 3*N+M, BDSPAC )
-               END IF
-            ELSE
-*
-*              Path 10 (M at least N, but not much larger)
-*
-               MAXWRK = 3*N + ( M+N )*ILAENV( 1, 'DGEBRD', ' ', M, N,
-     $                  -1, -1 )
-               IF( WNTUS .OR. WNTUO )
-     $            MAXWRK = MAX( MAXWRK, 3*N+N*
-     $                     ILAENV( 1, 'DORGBR', 'Q', M, N, N, -1 ) )
-               IF( WNTUA )
-     $            MAXWRK = MAX( MAXWRK, 3*N+M*
-     $                     ILAENV( 1, 'DORGBR', 'Q', M, M, N, -1 ) )
-               IF( .NOT.WNTVN )
-     $            MAXWRK = MAX( MAXWRK, 3*N+( N-1 )*
-     $                     ILAENV( 1, 'DORGBR', 'P', N, N, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, BDSPAC )
-               MINWRK = MAX( 3*N+M, BDSPAC )
-            END IF
-         ELSE IF( MINMN.GT.0 ) THEN
-*
-*           Compute space needed for DBDSQR
-*
-            MNTHR = ILAENV( 6, 'DGESVD', JOBU // JOBVT, M, N, 0, 0 )
-            BDSPAC = 5*M
-            IF( N.GE.MNTHR ) THEN
-               IF( WNTVN ) THEN
-*
-*                 Path 1t(N much larger than M, JOBVT='N')
-*
-                  MAXWRK = M + M*ILAENV( 1, 'DGELQF', ' ', M, N, -1,
-     $                     -1 )
-                  MAXWRK = MAX( MAXWRK, 3*M+2*M*
-     $                     ILAENV( 1, 'DGEBRD', ' ', M, M, -1, -1 ) )
-                  IF( WNTUO .OR. WNTUAS )
-     $               MAXWRK = MAX( MAXWRK, 3*M+M*
-     $                        ILAENV( 1, 'DORGBR', 'Q', M, M, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, BDSPAC )
-                  MINWRK = MAX( 4*M, BDSPAC )
-               ELSE IF( WNTVO .AND. WNTUN ) THEN
-*
-*                 Path 2t(N much larger than M, JOBU='N', JOBVT='O')
-*
-                  WRKBL = M + M*ILAENV( 1, 'DGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'DORGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+2*M*
-     $                    ILAENV( 1, 'DGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+( M-1 )*
-     $                    ILAENV( 1, 'DORGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = MAX( M*M+WRKBL, M*M+M*N+M )
-                  MINWRK = MAX( 3*M+N, BDSPAC )
-               ELSE IF( WNTVO .AND. WNTUAS ) THEN
-*
-*                 Path 3t(N much larger than M, JOBU='S' or 'A',
-*                 JOBVT='O')
-*
-                  WRKBL = M + M*ILAENV( 1, 'DGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'DORGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+2*M*
-     $                    ILAENV( 1, 'DGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+( M-1 )*
-     $                    ILAENV( 1, 'DORGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+M*
-     $                    ILAENV( 1, 'DORGBR', 'Q', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = MAX( M*M+WRKBL, M*M+M*N+M )
-                  MINWRK = MAX( 3*M+N, BDSPAC )
-               ELSE IF( WNTVS .AND. WNTUN ) THEN
-*
-*                 Path 4t(N much larger than M, JOBU='N', JOBVT='S')
-*
-                  WRKBL = M + M*ILAENV( 1, 'DGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'DORGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+2*M*
-     $                    ILAENV( 1, 'DGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+( M-1 )*
-     $                    ILAENV( 1, 'DORGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = M*M + WRKBL
-                  MINWRK = MAX( 3*M+N, BDSPAC )
-               ELSE IF( WNTVS .AND. WNTUO ) THEN
-*
-*                 Path 5t(N much larger than M, JOBU='O', JOBVT='S')
-*
-                  WRKBL = M + M*ILAENV( 1, 'DGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'DORGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+2*M*
-     $                    ILAENV( 1, 'DGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+( M-1 )*
-     $                    ILAENV( 1, 'DORGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+M*
-     $                    ILAENV( 1, 'DORGBR', 'Q', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = 2*M*M + WRKBL
-                  MINWRK = MAX( 3*M+N, BDSPAC )
-               ELSE IF( WNTVS .AND. WNTUAS ) THEN
-*
-*                 Path 6t(N much larger than M, JOBU='S' or 'A',
-*                 JOBVT='S')
-*
-                  WRKBL = M + M*ILAENV( 1, 'DGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'DORGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+2*M*
-     $                    ILAENV( 1, 'DGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+( M-1 )*
-     $                    ILAENV( 1, 'DORGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+M*
-     $                    ILAENV( 1, 'DORGBR', 'Q', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = M*M + WRKBL
-                  MINWRK = MAX( 3*M+N, BDSPAC )
-               ELSE IF( WNTVA .AND. WNTUN ) THEN
-*
-*                 Path 7t(N much larger than M, JOBU='N', JOBVT='A')
-*
-                  WRKBL = M + M*ILAENV( 1, 'DGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+N*ILAENV( 1, 'DORGLQ', ' ', N,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+2*M*
-     $                    ILAENV( 1, 'DGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+( M-1 )*
-     $                    ILAENV( 1, 'DORGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = M*M + WRKBL
-                  MINWRK = MAX( 3*M+N, BDSPAC )
-               ELSE IF( WNTVA .AND. WNTUO ) THEN
-*
-*                 Path 8t(N much larger than M, JOBU='O', JOBVT='A')
-*
-                  WRKBL = M + M*ILAENV( 1, 'DGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+N*ILAENV( 1, 'DORGLQ', ' ', N,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+2*M*
-     $                    ILAENV( 1, 'DGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+( M-1 )*
-     $                    ILAENV( 1, 'DORGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+M*
-     $                    ILAENV( 1, 'DORGBR', 'Q', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = 2*M*M + WRKBL
-                  MINWRK = MAX( 3*M+N, BDSPAC )
-               ELSE IF( WNTVA .AND. WNTUAS ) THEN
-*
-*                 Path 9t(N much larger than M, JOBU='S' or 'A',
-*                 JOBVT='A')
-*
-                  WRKBL = M + M*ILAENV( 1, 'DGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+N*ILAENV( 1, 'DORGLQ', ' ', N,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+2*M*
-     $                    ILAENV( 1, 'DGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+( M-1 )*
-     $                    ILAENV( 1, 'DORGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+M*
-     $                    ILAENV( 1, 'DORGBR', 'Q', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = M*M + WRKBL
-                  MINWRK = MAX( 3*M+N, BDSPAC )
-               END IF
-            ELSE
-*
-*              Path 10t(N greater than M, but not much larger)
-*
-               MAXWRK = 3*M + ( M+N )*ILAENV( 1, 'DGEBRD', ' ', M, N,
-     $                  -1, -1 )
-               IF( WNTVS .OR. WNTVO )
-     $            MAXWRK = MAX( MAXWRK, 3*M+M*
-     $                     ILAENV( 1, 'DORGBR', 'P', M, N, M, -1 ) )
-               IF( WNTVA )
-     $            MAXWRK = MAX( MAXWRK, 3*M+N*
-     $                     ILAENV( 1, 'DORGBR', 'P', N, N, M, -1 ) )
-               IF( .NOT.WNTUN )
-     $            MAXWRK = MAX( MAXWRK, 3*M+( M-1 )*
-     $                     ILAENV( 1, 'DORGBR', 'Q', M, M, M, -1 ) )
-               MAXWRK = MAX( MAXWRK, BDSPAC )
-               MINWRK = MAX( 3*M+N, BDSPAC )
-            END IF
-         END IF
-         MAXWRK = MAX( MAXWRK, MINWRK )
-         WORK( 1 ) = MAXWRK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
-            INFO = -13
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGESVD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         RETURN
-      END IF
-*
-*     Get machine constants
-*
-      EPS = DLAMCH( 'P' )
-      SMLNUM = SQRT( DLAMCH( 'S' ) ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = DLANGE( 'M', M, N, A, LDA, DUM )
-      ISCL = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-         ISCL = 1
-         CALL DLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, IERR )
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-         ISCL = 1
-         CALL DLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, IERR )
-      END IF
-*
-      IF( M.GE.N ) THEN
-*
-*        A has at least as many rows as columns. If A has sufficiently
-*        more rows than columns, first reduce using the QR
-*        decomposition (if sufficient workspace available)
-*
-         IF( M.GE.MNTHR ) THEN
-*
-            IF( WNTUN ) THEN
-*
-*              Path 1 (M much larger than N, JOBU='N')
-*              No left singular vectors to be computed
-*
-               ITAU = 1
-               IWORK = ITAU + N
-*
-*              Compute A=Q*R
-*              (Workspace: need 2*N, prefer N+N*NB)
-*
-               CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
-     $                      LWORK-IWORK+1, IERR )
-*
-*              Zero out below R
-*
-               CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, A( 2, 1 ), LDA )
-               IE = 1
-               ITAUQ = IE + N
-               ITAUP = ITAUQ + N
-               IWORK = ITAUP + N
-*
-*              Bidiagonalize R in A
-*              (Workspace: need 4*N, prefer 3*N+2*N*NB)
-*
-               CALL DGEBRD( N, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
-     $                      WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                      IERR )
-               NCVT = 0
-               IF( WNTVO .OR. WNTVAS ) THEN
-*
-*                 If right singular vectors desired, generate P'.
-*                 (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-                  CALL DORGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  NCVT = N
-               END IF
-               IWORK = IE + N
-*
-*              Perform bidiagonal QR iteration, computing right
-*              singular vectors of A in A if desired
-*              (Workspace: need BDSPAC)
-*
-               CALL DBDSQR( 'U', N, NCVT, 0, 0, S, WORK( IE ), A, LDA,
-     $                      DUM, 1, DUM, 1, WORK( IWORK ), INFO )
-*
-*              If right singular vectors desired in VT, copy them there
-*
-               IF( WNTVAS )
-     $            CALL DLACPY( 'F', N, N, A, LDA, VT, LDVT )
-*
-            ELSE IF( WNTUO .AND. WNTVN ) THEN
-*
-*              Path 2 (M much larger than N, JOBU='O', JOBVT='N')
-*              N left singular vectors to be overwritten on A and
-*              no right singular vectors to be computed
-*
-               IF( LWORK.GE.N*N+MAX( 4*N, BDSPAC ) ) THEN
-*
-*                 Sufficient workspace for a fast algorithm
-*
-                  IR = 1
-                  IF( LWORK.GE.MAX( WRKBL, LDA*N+N )+LDA*N ) THEN
-*
-*                    WORK(IU) is LDA by N, WORK(IR) is LDA by N
-*
-                     LDWRKU = LDA
-                     LDWRKR = LDA
-                  ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N+N )+N*N ) THEN
-*
-*                    WORK(IU) is LDA by N, WORK(IR) is N by N
-*
-                     LDWRKU = LDA
-                     LDWRKR = N
-                  ELSE
-*
-*                    WORK(IU) is LDWRKU by N, WORK(IR) is N by N
-*
-                     LDWRKU = ( LWORK-N*N-N ) / N
-                     LDWRKR = N
-                  END IF
-                  ITAU = IR + LDWRKR*N
-                  IWORK = ITAU + N
-*
-*                 Compute A=Q*R
-*                 (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                  CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy R to WORK(IR) and zero out below it
-*
-                  CALL DLACPY( 'U', N, N, A, LDA, WORK( IR ), LDWRKR )
-                  CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, WORK( IR+1 ),
-     $                         LDWRKR )
-*
-*                 Generate Q in A
-*                 (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                  CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = ITAU
-                  ITAUQ = IE + N
-                  ITAUP = ITAUQ + N
-                  IWORK = ITAUP + N
-*
-*                 Bidiagonalize R in WORK(IR)
-*                 (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB)
-*
-                  CALL DGEBRD( N, N, WORK( IR ), LDWRKR, S, WORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Generate left vectors bidiagonalizing R
-*                 (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB)
-*
-                  CALL DORGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
-     $                         WORK( ITAUQ ), WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-                  IWORK = IE + N
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of R in WORK(IR)
-*                 (Workspace: need N*N+BDSPAC)
-*
-                  CALL DBDSQR( 'U', N, 0, N, 0, S, WORK( IE ), DUM, 1,
-     $                         WORK( IR ), LDWRKR, DUM, 1,
-     $                         WORK( IWORK ), INFO )
-                  IU = IE + N
-*
-*                 Multiply Q in A by left singular vectors of R in
-*                 WORK(IR), storing result in WORK(IU) and copying to A
-*                 (Workspace: need N*N+2*N, prefer N*N+M*N+N)
-*
-                  DO 10 I = 1, M, LDWRKU
-                     CHUNK = MIN( M-I+1, LDWRKU )
-                     CALL DGEMM( 'N', 'N', CHUNK, N, N, ONE, A( I, 1 ),
-     $                           LDA, WORK( IR ), LDWRKR, ZERO,
-     $                           WORK( IU ), LDWRKU )
-                     CALL DLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU,
-     $                            A( I, 1 ), LDA )
-   10             CONTINUE
-*
-               ELSE
-*
-*                 Insufficient workspace for a fast algorithm
-*
-                  IE = 1
-                  ITAUQ = IE + N
-                  ITAUP = ITAUQ + N
-                  IWORK = ITAUP + N
-*
-*                 Bidiagonalize A
-*                 (Workspace: need 3*N+M, prefer 3*N+(M+N)*NB)
-*
-                  CALL DGEBRD( M, N, A, LDA, S, WORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Generate left vectors bidiagonalizing A
-*                 (Workspace: need 4*N, prefer 3*N+N*NB)
-*
-                  CALL DORGBR( 'Q', M, N, N, A, LDA, WORK( ITAUQ ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IWORK = IE + N
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of A in A
-*                 (Workspace: need BDSPAC)
-*
-                  CALL DBDSQR( 'U', N, 0, M, 0, S, WORK( IE ), DUM, 1,
-     $                         A, LDA, DUM, 1, WORK( IWORK ), INFO )
-*
-               END IF
-*
-            ELSE IF( WNTUO .AND. WNTVAS ) THEN
-*
-*              Path 3 (M much larger than N, JOBU='O', JOBVT='S' or 'A')
-*              N left singular vectors to be overwritten on A and
-*              N right singular vectors to be computed in VT
-*
-               IF( LWORK.GE.N*N+MAX( 4*N, BDSPAC ) ) THEN
-*
-*                 Sufficient workspace for a fast algorithm
-*
-                  IR = 1
-                  IF( LWORK.GE.MAX( WRKBL, LDA*N+N )+LDA*N ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is LDA by N
-*
-                     LDWRKU = LDA
-                     LDWRKR = LDA
-                  ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N+N )+N*N ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is N by N
-*
-                     LDWRKU = LDA
-                     LDWRKR = N
-                  ELSE
-*
-*                    WORK(IU) is LDWRKU by N and WORK(IR) is N by N
-*
-                     LDWRKU = ( LWORK-N*N-N ) / N
-                     LDWRKR = N
-                  END IF
-                  ITAU = IR + LDWRKR*N
-                  IWORK = ITAU + N
-*
-*                 Compute A=Q*R
-*                 (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                  CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy R to VT, zeroing out below it
-*
-                  CALL DLACPY( 'U', N, N, A, LDA, VT, LDVT )
-                  IF( N.GT.1 )
-     $               CALL DLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                            VT( 2, 1 ), LDVT )
-*
-*                 Generate Q in A
-*                 (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                  CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = ITAU
-                  ITAUQ = IE + N
-                  ITAUP = ITAUQ + N
-                  IWORK = ITAUP + N
-*
-*                 Bidiagonalize R in VT, copying result to WORK(IR)
-*                 (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB)
-*
-                  CALL DGEBRD( N, N, VT, LDVT, S, WORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  CALL DLACPY( 'L', N, N, VT, LDVT, WORK( IR ), LDWRKR )
-*
-*                 Generate left vectors bidiagonalizing R in WORK(IR)
-*                 (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB)
-*
-                  CALL DORGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
-     $                         WORK( ITAUQ ), WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-*
-*                 Generate right vectors bidiagonalizing R in VT
-*                 (Workspace: need N*N+4*N-1, prefer N*N+3*N+(N-1)*NB)
-*
-                  CALL DORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IWORK = IE + N
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of R in WORK(IR) and computing right
-*                 singular vectors of R in VT
-*                 (Workspace: need N*N+BDSPAC)
-*
-                  CALL DBDSQR( 'U', N, N, N, 0, S, WORK( IE ), VT, LDVT,
-     $                         WORK( IR ), LDWRKR, DUM, 1,
-     $                         WORK( IWORK ), INFO )
-                  IU = IE + N
-*
-*                 Multiply Q in A by left singular vectors of R in
-*                 WORK(IR), storing result in WORK(IU) and copying to A
-*                 (Workspace: need N*N+2*N, prefer N*N+M*N+N)
-*
-                  DO 20 I = 1, M, LDWRKU
-                     CHUNK = MIN( M-I+1, LDWRKU )
-                     CALL DGEMM( 'N', 'N', CHUNK, N, N, ONE, A( I, 1 ),
-     $                           LDA, WORK( IR ), LDWRKR, ZERO,
-     $                           WORK( IU ), LDWRKU )
-                     CALL DLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU,
-     $                            A( I, 1 ), LDA )
-   20             CONTINUE
-*
-               ELSE
-*
-*                 Insufficient workspace for a fast algorithm
-*
-                  ITAU = 1
-                  IWORK = ITAU + N
-*
-*                 Compute A=Q*R
-*                 (Workspace: need 2*N, prefer N+N*NB)
-*
-                  CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy R to VT, zeroing out below it
-*
-                  CALL DLACPY( 'U', N, N, A, LDA, VT, LDVT )
-                  IF( N.GT.1 )
-     $               CALL DLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                            VT( 2, 1 ), LDVT )
-*
-*                 Generate Q in A
-*                 (Workspace: need 2*N, prefer N+N*NB)
-*
-                  CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = ITAU
-                  ITAUQ = IE + N
-                  ITAUP = ITAUQ + N
-                  IWORK = ITAUP + N
-*
-*                 Bidiagonalize R in VT
-*                 (Workspace: need 4*N, prefer 3*N+2*N*NB)
-*
-                  CALL DGEBRD( N, N, VT, LDVT, S, WORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Multiply Q in A by left vectors bidiagonalizing R
-*                 (Workspace: need 3*N+M, prefer 3*N+M*NB)
-*
-                  CALL DORMBR( 'Q', 'R', 'N', M, N, N, VT, LDVT,
-     $                         WORK( ITAUQ ), A, LDA, WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-*
-*                 Generate right vectors bidiagonalizing R in VT
-*                 (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-                  CALL DORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IWORK = IE + N
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of A in A and computing right
-*                 singular vectors of A in VT
-*                 (Workspace: need BDSPAC)
-*
-                  CALL DBDSQR( 'U', N, N, M, 0, S, WORK( IE ), VT, LDVT,
-     $                         A, LDA, DUM, 1, WORK( IWORK ), INFO )
-*
-               END IF
-*
-            ELSE IF( WNTUS ) THEN
-*
-               IF( WNTVN ) THEN
-*
-*                 Path 4 (M much larger than N, JOBU='S', JOBVT='N')
-*                 N left singular vectors to be computed in U and
-*                 no right singular vectors to be computed
-*
-                  IF( LWORK.GE.N*N+MAX( 4*N, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IR = 1
-                     IF( LWORK.GE.WRKBL+LDA*N ) THEN
-*
-*                       WORK(IR) is LDA by N
-*
-                        LDWRKR = LDA
-                     ELSE
-*
-*                       WORK(IR) is N by N
-*
-                        LDWRKR = N
-                     END IF
-                     ITAU = IR + LDWRKR*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R
-*                    (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                     CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IR), zeroing out below it
-*
-                     CALL DLACPY( 'U', N, N, A, LDA, WORK( IR ),
-     $                            LDWRKR )
-                     CALL DLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                            WORK( IR+1 ), LDWRKR )
-*
-*                    Generate Q in A
-*                    (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                     CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IR)
-*                    (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB)
-*
-                     CALL DGEBRD( N, N, WORK( IR ), LDWRKR, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left vectors bidiagonalizing R in WORK(IR)
-*                    (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB)
-*
-                     CALL DORGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IR)
-*                    (Workspace: need N*N+BDSPAC)
-*
-                     CALL DBDSQR( 'U', N, 0, N, 0, S, WORK( IE ), DUM,
-     $                            1, WORK( IR ), LDWRKR, DUM, 1,
-     $                            WORK( IWORK ), INFO )
-*
-*                    Multiply Q in A by left singular vectors of R in
-*                    WORK(IR), storing result in U
-*                    (Workspace: need N*N)
-*
-                     CALL DGEMM( 'N', 'N', M, N, N, ONE, A, LDA,
-     $                           WORK( IR ), LDWRKR, ZERO, U, LDU )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL DORGQR( M, N, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Zero out below R in A
-*
-                     CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, A( 2, 1 ),
-     $                            LDA )
-*
-*                    Bidiagonalize R in A
-*                    (Workspace: need 4*N, prefer 3*N+2*N*NB)
-*
-                     CALL DGEBRD( N, N, A, LDA, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left vectors bidiagonalizing R
-*                    (Workspace: need 3*N+M, prefer 3*N+M*NB)
-*
-                     CALL DORMBR( 'Q', 'R', 'N', M, N, N, A, LDA,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U
-*                    (Workspace: need BDSPAC)
-*
-                     CALL DBDSQR( 'U', N, 0, M, 0, S, WORK( IE ), DUM,
-     $                            1, U, LDU, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTVO ) THEN
-*
-*                 Path 5 (M much larger than N, JOBU='S', JOBVT='O')
-*                 N left singular vectors to be computed in U and
-*                 N right singular vectors to be overwritten on A
-*
-                  IF( LWORK.GE.2*N*N+MAX( 4*N, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+2*LDA*N ) THEN
-*
-*                       WORK(IU) is LDA by N and WORK(IR) is LDA by N
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*N
-                        LDWRKR = LDA
-                     ELSE IF( LWORK.GE.WRKBL+( LDA+N )*N ) THEN
-*
-*                       WORK(IU) is LDA by N and WORK(IR) is N by N
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*N
-                        LDWRKR = N
-                     ELSE
-*
-*                       WORK(IU) is N by N and WORK(IR) is N by N
-*
-                        LDWRKU = N
-                        IR = IU + LDWRKU*N
-                        LDWRKR = N
-                     END IF
-                     ITAU = IR + LDWRKR*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R
-*                    (Workspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB)
-*
-                     CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IU), zeroing out below it
-*
-                     CALL DLACPY( 'U', N, N, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL DLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                            WORK( IU+1 ), LDWRKU )
-*
-*                    Generate Q in A
-*                    (Workspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB)
-*
-                     CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IU), copying result to
-*                    WORK(IR)
-*                    (Workspace: need 2*N*N+4*N,
-*                                prefer 2*N*N+3*N+2*N*NB)
-*
-                     CALL DGEBRD( N, N, WORK( IU ), LDWRKU, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'U', N, N, WORK( IU ), LDWRKU,
-     $                            WORK( IR ), LDWRKR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IU)
-*                    (Workspace: need 2*N*N+4*N, prefer 2*N*N+3*N+N*NB)
-*
-                     CALL DORGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IR)
-*                    (Workspace: need 2*N*N+4*N-1,
-*                                prefer 2*N*N+3*N+(N-1)*NB)
-*
-                     CALL DORGBR( 'P', N, N, N, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IU) and computing
-*                    right singular vectors of R in WORK(IR)
-*                    (Workspace: need 2*N*N+BDSPAC)
-*
-                     CALL DBDSQR( 'U', N, N, N, 0, S, WORK( IE ),
-     $                            WORK( IR ), LDWRKR, WORK( IU ),
-     $                            LDWRKU, DUM, 1, WORK( IWORK ), INFO )
-*
-*                    Multiply Q in A by left singular vectors of R in
-*                    WORK(IU), storing result in U
-*                    (Workspace: need N*N)
-*
-                     CALL DGEMM( 'N', 'N', M, N, N, ONE, A, LDA,
-     $                           WORK( IU ), LDWRKU, ZERO, U, LDU )
-*
-*                    Copy right singular vectors of R to A
-*                    (Workspace: need N*N)
-*
-                     CALL DLACPY( 'F', N, N, WORK( IR ), LDWRKR, A,
-     $                            LDA )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL DORGQR( M, N, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Zero out below R in A
-*
-                     CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, A( 2, 1 ),
-     $                            LDA )
-*
-*                    Bidiagonalize R in A
-*                    (Workspace: need 4*N, prefer 3*N+2*N*NB)
-*
-                     CALL DGEBRD( N, N, A, LDA, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left vectors bidiagonalizing R
-*                    (Workspace: need 3*N+M, prefer 3*N+M*NB)
-*
-                     CALL DORMBR( 'Q', 'R', 'N', M, N, N, A, LDA,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right vectors bidiagonalizing R in A
-*                    (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-                     CALL DORGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in A
-*                    (Workspace: need BDSPAC)
-*
-                     CALL DBDSQR( 'U', N, N, M, 0, S, WORK( IE ), A,
-     $                            LDA, U, LDU, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTVAS ) THEN
-*
-*                 Path 6 (M much larger than N, JOBU='S', JOBVT='S'
-*                         or 'A')
-*                 N left singular vectors to be computed in U and
-*                 N right singular vectors to be computed in VT
-*
-                  IF( LWORK.GE.N*N+MAX( 4*N, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+LDA*N ) THEN
-*
-*                       WORK(IU) is LDA by N
-*
-                        LDWRKU = LDA
-                     ELSE
-*
-*                       WORK(IU) is N by N
-*
-                        LDWRKU = N
-                     END IF
-                     ITAU = IU + LDWRKU*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R
-*                    (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                     CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IU), zeroing out below it
-*
-                     CALL DLACPY( 'U', N, N, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL DLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                            WORK( IU+1 ), LDWRKU )
-*
-*                    Generate Q in A
-*                    (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                     CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IU), copying result to VT
-*                    (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB)
-*
-                     CALL DGEBRD( N, N, WORK( IU ), LDWRKU, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'U', N, N, WORK( IU ), LDWRKU, VT,
-     $                            LDVT )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IU)
-*                    (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB)
-*
-                     CALL DORGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in VT
-*                    (Workspace: need N*N+4*N-1,
-*                                prefer N*N+3*N+(N-1)*NB)
-*
-                     CALL DORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IU) and computing
-*                    right singular vectors of R in VT
-*                    (Workspace: need N*N+BDSPAC)
-*
-                     CALL DBDSQR( 'U', N, N, N, 0, S, WORK( IE ), VT,
-     $                            LDVT, WORK( IU ), LDWRKU, DUM, 1,
-     $                            WORK( IWORK ), INFO )
-*
-*                    Multiply Q in A by left singular vectors of R in
-*                    WORK(IU), storing result in U
-*                    (Workspace: need N*N)
-*
-                     CALL DGEMM( 'N', 'N', M, N, N, ONE, A, LDA,
-     $                           WORK( IU ), LDWRKU, ZERO, U, LDU )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL DORGQR( M, N, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to VT, zeroing out below it
-*
-                     CALL DLACPY( 'U', N, N, A, LDA, VT, LDVT )
-                     IF( N.GT.1 )
-     $                  CALL DLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                               VT( 2, 1 ), LDVT )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in VT
-*                    (Workspace: need 4*N, prefer 3*N+2*N*NB)
-*
-                     CALL DGEBRD( N, N, VT, LDVT, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left bidiagonalizing vectors
-*                    in VT
-*                    (Workspace: need 3*N+M, prefer 3*N+M*NB)
-*
-                     CALL DORMBR( 'Q', 'R', 'N', M, N, N, VT, LDVT,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in VT
-*                    (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-                     CALL DORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in VT
-*                    (Workspace: need BDSPAC)
-*
-                     CALL DBDSQR( 'U', N, N, M, 0, S, WORK( IE ), VT,
-     $                            LDVT, U, LDU, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               END IF
-*
-            ELSE IF( WNTUA ) THEN
-*
-               IF( WNTVN ) THEN
-*
-*                 Path 7 (M much larger than N, JOBU='A', JOBVT='N')
-*                 M left singular vectors to be computed in U and
-*                 no right singular vectors to be computed
-*
-                  IF( LWORK.GE.N*N+MAX( N+M, 4*N, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IR = 1
-                     IF( LWORK.GE.WRKBL+LDA*N ) THEN
-*
-*                       WORK(IR) is LDA by N
-*
-                        LDWRKR = LDA
-                     ELSE
-*
-*                       WORK(IR) is N by N
-*
-                        LDWRKR = N
-                     END IF
-                     ITAU = IR + LDWRKR*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                     CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Copy R to WORK(IR), zeroing out below it
-*
-                     CALL DLACPY( 'U', N, N, A, LDA, WORK( IR ),
-     $                            LDWRKR )
-                     CALL DLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                            WORK( IR+1 ), LDWRKR )
-*
-*                    Generate Q in U
-*                    (Workspace: need N*N+N+M, prefer N*N+N+M*NB)
-*
-                     CALL DORGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IR)
-*                    (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB)
-*
-                     CALL DGEBRD( N, N, WORK( IR ), LDWRKR, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IR)
-*                    (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB)
-*
-                     CALL DORGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IR)
-*                    (Workspace: need N*N+BDSPAC)
-*
-                     CALL DBDSQR( 'U', N, 0, N, 0, S, WORK( IE ), DUM,
-     $                            1, WORK( IR ), LDWRKR, DUM, 1,
-     $                            WORK( IWORK ), INFO )
-*
-*                    Multiply Q in U by left singular vectors of R in
-*                    WORK(IR), storing result in A
-*                    (Workspace: need N*N)
-*
-                     CALL DGEMM( 'N', 'N', M, N, N, ONE, U, LDU,
-     $                           WORK( IR ), LDWRKR, ZERO, A, LDA )
-*
-*                    Copy left singular vectors of A from A to U
-*
-                     CALL DLACPY( 'F', M, N, A, LDA, U, LDU )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (Workspace: need N+M, prefer N+M*NB)
-*
-                     CALL DORGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Zero out below R in A
-*
-                     CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, A( 2, 1 ),
-     $                            LDA )
-*
-*                    Bidiagonalize R in A
-*                    (Workspace: need 4*N, prefer 3*N+2*N*NB)
-*
-                     CALL DGEBRD( N, N, A, LDA, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left bidiagonalizing vectors
-*                    in A
-*                    (Workspace: need 3*N+M, prefer 3*N+M*NB)
-*
-                     CALL DORMBR( 'Q', 'R', 'N', M, N, N, A, LDA,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U
-*                    (Workspace: need BDSPAC)
-*
-                     CALL DBDSQR( 'U', N, 0, M, 0, S, WORK( IE ), DUM,
-     $                            1, U, LDU, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTVO ) THEN
-*
-*                 Path 8 (M much larger than N, JOBU='A', JOBVT='O')
-*                 M left singular vectors to be computed in U and
-*                 N right singular vectors to be overwritten on A
-*
-                  IF( LWORK.GE.2*N*N+MAX( N+M, 4*N, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+2*LDA*N ) THEN
-*
-*                       WORK(IU) is LDA by N and WORK(IR) is LDA by N
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*N
-                        LDWRKR = LDA
-                     ELSE IF( LWORK.GE.WRKBL+( LDA+N )*N ) THEN
-*
-*                       WORK(IU) is LDA by N and WORK(IR) is N by N
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*N
-                        LDWRKR = N
-                     ELSE
-*
-*                       WORK(IU) is N by N and WORK(IR) is N by N
-*
-                        LDWRKU = N
-                        IR = IU + LDWRKU*N
-                        LDWRKR = N
-                     END IF
-                     ITAU = IR + LDWRKR*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB)
-*
-                     CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (Workspace: need 2*N*N+N+M, prefer 2*N*N+N+M*NB)
-*
-                     CALL DORGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IU), zeroing out below it
-*
-                     CALL DLACPY( 'U', N, N, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL DLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                            WORK( IU+1 ), LDWRKU )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IU), copying result to
-*                    WORK(IR)
-*                    (Workspace: need 2*N*N+4*N,
-*                                prefer 2*N*N+3*N+2*N*NB)
-*
-                     CALL DGEBRD( N, N, WORK( IU ), LDWRKU, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'U', N, N, WORK( IU ), LDWRKU,
-     $                            WORK( IR ), LDWRKR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IU)
-*                    (Workspace: need 2*N*N+4*N, prefer 2*N*N+3*N+N*NB)
-*
-                     CALL DORGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IR)
-*                    (Workspace: need 2*N*N+4*N-1,
-*                                prefer 2*N*N+3*N+(N-1)*NB)
-*
-                     CALL DORGBR( 'P', N, N, N, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IU) and computing
-*                    right singular vectors of R in WORK(IR)
-*                    (Workspace: need 2*N*N+BDSPAC)
-*
-                     CALL DBDSQR( 'U', N, N, N, 0, S, WORK( IE ),
-     $                            WORK( IR ), LDWRKR, WORK( IU ),
-     $                            LDWRKU, DUM, 1, WORK( IWORK ), INFO )
-*
-*                    Multiply Q in U by left singular vectors of R in
-*                    WORK(IU), storing result in A
-*                    (Workspace: need N*N)
-*
-                     CALL DGEMM( 'N', 'N', M, N, N, ONE, U, LDU,
-     $                           WORK( IU ), LDWRKU, ZERO, A, LDA )
-*
-*                    Copy left singular vectors of A from A to U
-*
-                     CALL DLACPY( 'F', M, N, A, LDA, U, LDU )
-*
-*                    Copy right singular vectors of R from WORK(IR) to A
-*
-                     CALL DLACPY( 'F', N, N, WORK( IR ), LDWRKR, A,
-     $                            LDA )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (Workspace: need N+M, prefer N+M*NB)
-*
-                     CALL DORGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Zero out below R in A
-*
-                     CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, A( 2, 1 ),
-     $                            LDA )
-*
-*                    Bidiagonalize R in A
-*                    (Workspace: need 4*N, prefer 3*N+2*N*NB)
-*
-                     CALL DGEBRD( N, N, A, LDA, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left bidiagonalizing vectors
-*                    in A
-*                    (Workspace: need 3*N+M, prefer 3*N+M*NB)
-*
-                     CALL DORMBR( 'Q', 'R', 'N', M, N, N, A, LDA,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in A
-*                    (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-                     CALL DORGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in A
-*                    (Workspace: need BDSPAC)
-*
-                     CALL DBDSQR( 'U', N, N, M, 0, S, WORK( IE ), A,
-     $                            LDA, U, LDU, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTVAS ) THEN
-*
-*                 Path 9 (M much larger than N, JOBU='A', JOBVT='S'
-*                         or 'A')
-*                 M left singular vectors to be computed in U and
-*                 N right singular vectors to be computed in VT
-*
-                  IF( LWORK.GE.N*N+MAX( N+M, 4*N, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+LDA*N ) THEN
-*
-*                       WORK(IU) is LDA by N
-*
-                        LDWRKU = LDA
-                     ELSE
-*
-*                       WORK(IU) is N by N
-*
-                        LDWRKU = N
-                     END IF
-                     ITAU = IU + LDWRKU*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                     CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (Workspace: need N*N+N+M, prefer N*N+N+M*NB)
-*
-                     CALL DORGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IU), zeroing out below it
-*
-                     CALL DLACPY( 'U', N, N, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL DLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                            WORK( IU+1 ), LDWRKU )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IU), copying result to VT
-*                    (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB)
-*
-                     CALL DGEBRD( N, N, WORK( IU ), LDWRKU, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'U', N, N, WORK( IU ), LDWRKU, VT,
-     $                            LDVT )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IU)
-*                    (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB)
-*
-                     CALL DORGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in VT
-*                    (Workspace: need N*N+4*N-1,
-*                                prefer N*N+3*N+(N-1)*NB)
-*
-                     CALL DORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IU) and computing
-*                    right singular vectors of R in VT
-*                    (Workspace: need N*N+BDSPAC)
-*
-                     CALL DBDSQR( 'U', N, N, N, 0, S, WORK( IE ), VT,
-     $                            LDVT, WORK( IU ), LDWRKU, DUM, 1,
-     $                            WORK( IWORK ), INFO )
-*
-*                    Multiply Q in U by left singular vectors of R in
-*                    WORK(IU), storing result in A
-*                    (Workspace: need N*N)
-*
-                     CALL DGEMM( 'N', 'N', M, N, N, ONE, U, LDU,
-     $                           WORK( IU ), LDWRKU, ZERO, A, LDA )
-*
-*                    Copy left singular vectors of A from A to U
-*
-                     CALL DLACPY( 'F', M, N, A, LDA, U, LDU )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (Workspace: need N+M, prefer N+M*NB)
-*
-                     CALL DORGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R from A to VT, zeroing out below it
-*
-                     CALL DLACPY( 'U', N, N, A, LDA, VT, LDVT )
-                     IF( N.GT.1 )
-     $                  CALL DLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                               VT( 2, 1 ), LDVT )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in VT
-*                    (Workspace: need 4*N, prefer 3*N+2*N*NB)
-*
-                     CALL DGEBRD( N, N, VT, LDVT, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left bidiagonalizing vectors
-*                    in VT
-*                    (Workspace: need 3*N+M, prefer 3*N+M*NB)
-*
-                     CALL DORMBR( 'Q', 'R', 'N', M, N, N, VT, LDVT,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in VT
-*                    (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-                     CALL DORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in VT
-*                    (Workspace: need BDSPAC)
-*
-                     CALL DBDSQR( 'U', N, N, M, 0, S, WORK( IE ), VT,
-     $                            LDVT, U, LDU, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               END IF
-*
-            END IF
-*
-         ELSE
-*
-*           M .LT. MNTHR
-*
-*           Path 10 (M at least N, but not much larger)
-*           Reduce to bidiagonal form without QR decomposition
-*
-            IE = 1
-            ITAUQ = IE + N
-            ITAUP = ITAUQ + N
-            IWORK = ITAUP + N
-*
-*           Bidiagonalize A
-*           (Workspace: need 3*N+M, prefer 3*N+(M+N)*NB)
-*
-            CALL DGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
-     $                   WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                   IERR )
-            IF( WNTUAS ) THEN
-*
-*              If left singular vectors desired in U, copy result to U
-*              and generate left bidiagonalizing vectors in U
-*              (Workspace: need 3*N+NCU, prefer 3*N+NCU*NB)
-*
-               CALL DLACPY( 'L', M, N, A, LDA, U, LDU )
-               IF( WNTUS )
-     $            NCU = N
-               IF( WNTUA )
-     $            NCU = M
-               CALL DORGBR( 'Q', M, NCU, N, U, LDU, WORK( ITAUQ ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTVAS ) THEN
-*
-*              If right singular vectors desired in VT, copy result to
-*              VT and generate right bidiagonalizing vectors in VT
-*              (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-               CALL DLACPY( 'U', N, N, A, LDA, VT, LDVT )
-               CALL DORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTUO ) THEN
-*
-*              If left singular vectors desired in A, generate left
-*              bidiagonalizing vectors in A
-*              (Workspace: need 4*N, prefer 3*N+N*NB)
-*
-               CALL DORGBR( 'Q', M, N, N, A, LDA, WORK( ITAUQ ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTVO ) THEN
-*
-*              If right singular vectors desired in A, generate right
-*              bidiagonalizing vectors in A
-*              (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-               CALL DORGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IWORK = IE + N
-            IF( WNTUAS .OR. WNTUO )
-     $         NRU = M
-            IF( WNTUN )
-     $         NRU = 0
-            IF( WNTVAS .OR. WNTVO )
-     $         NCVT = N
-            IF( WNTVN )
-     $         NCVT = 0
-            IF( ( .NOT.WNTUO ) .AND. ( .NOT.WNTVO ) ) THEN
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in U and computing right singular
-*              vectors in VT
-*              (Workspace: need BDSPAC)
-*
-               CALL DBDSQR( 'U', N, NCVT, NRU, 0, S, WORK( IE ), VT,
-     $                      LDVT, U, LDU, DUM, 1, WORK( IWORK ), INFO )
-            ELSE IF( ( .NOT.WNTUO ) .AND. WNTVO ) THEN
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in U and computing right singular
-*              vectors in A
-*              (Workspace: need BDSPAC)
-*
-               CALL DBDSQR( 'U', N, NCVT, NRU, 0, S, WORK( IE ), A, LDA,
-     $                      U, LDU, DUM, 1, WORK( IWORK ), INFO )
-            ELSE
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in A and computing right singular
-*              vectors in VT
-*              (Workspace: need BDSPAC)
-*
-               CALL DBDSQR( 'U', N, NCVT, NRU, 0, S, WORK( IE ), VT,
-     $                      LDVT, A, LDA, DUM, 1, WORK( IWORK ), INFO )
-            END IF
-*
-         END IF
-*
-      ELSE
-*
-*        A has more columns than rows. If A has sufficiently more
-*        columns than rows, first reduce using the LQ decomposition (if
-*        sufficient workspace available)
-*
-         IF( N.GE.MNTHR ) THEN
-*
-            IF( WNTVN ) THEN
-*
-*              Path 1t(N much larger than M, JOBVT='N')
-*              No right singular vectors to be computed
-*
-               ITAU = 1
-               IWORK = ITAU + M
-*
-*              Compute A=L*Q
-*              (Workspace: need 2*M, prefer M+M*NB)
-*
-               CALL DGELQF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
-     $                      LWORK-IWORK+1, IERR )
-*
-*              Zero out above L
-*
-               CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, A( 1, 2 ), LDA )
-               IE = 1
-               ITAUQ = IE + M
-               ITAUP = ITAUQ + M
-               IWORK = ITAUP + M
-*
-*              Bidiagonalize L in A
-*              (Workspace: need 4*M, prefer 3*M+2*M*NB)
-*
-               CALL DGEBRD( M, M, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
-     $                      WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                      IERR )
-               IF( WNTUO .OR. WNTUAS ) THEN
-*
-*                 If left singular vectors desired, generate Q
-*                 (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-                  CALL DORGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-               END IF
-               IWORK = IE + M
-               NRU = 0
-               IF( WNTUO .OR. WNTUAS )
-     $            NRU = M
-*
-*              Perform bidiagonal QR iteration, computing left singular
-*              vectors of A in A if desired
-*              (Workspace: need BDSPAC)
-*
-               CALL DBDSQR( 'U', M, 0, NRU, 0, S, WORK( IE ), DUM, 1, A,
-     $                      LDA, DUM, 1, WORK( IWORK ), INFO )
-*
-*              If left singular vectors desired in U, copy them there
-*
-               IF( WNTUAS )
-     $            CALL DLACPY( 'F', M, M, A, LDA, U, LDU )
-*
-            ELSE IF( WNTVO .AND. WNTUN ) THEN
-*
-*              Path 2t(N much larger than M, JOBU='N', JOBVT='O')
-*              M right singular vectors to be overwritten on A and
-*              no left singular vectors to be computed
-*
-               IF( LWORK.GE.M*M+MAX( 4*M, BDSPAC ) ) THEN
-*
-*                 Sufficient workspace for a fast algorithm
-*
-                  IR = 1
-                  IF( LWORK.GE.MAX( WRKBL, LDA*N+M )+LDA*M ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is LDA by M
-*
-                     LDWRKU = LDA
-                     CHUNK = N
-                     LDWRKR = LDA
-                  ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N+M )+M*M ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is M by M
-*
-                     LDWRKU = LDA
-                     CHUNK = N
-                     LDWRKR = M
-                  ELSE
-*
-*                    WORK(IU) is M by CHUNK and WORK(IR) is M by M
-*
-                     LDWRKU = M
-                     CHUNK = ( LWORK-M*M-M ) / M
-                     LDWRKR = M
-                  END IF
-                  ITAU = IR + LDWRKR*M
-                  IWORK = ITAU + M
-*
-*                 Compute A=L*Q
-*                 (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                  CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy L to WORK(IR) and zero out above it
-*
-                  CALL DLACPY( 'L', M, M, A, LDA, WORK( IR ), LDWRKR )
-                  CALL DLASET( 'U', M-1, M-1, ZERO, ZERO,
-     $                         WORK( IR+LDWRKR ), LDWRKR )
-*
-*                 Generate Q in A
-*                 (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                  CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = ITAU
-                  ITAUQ = IE + M
-                  ITAUP = ITAUQ + M
-                  IWORK = ITAUP + M
-*
-*                 Bidiagonalize L in WORK(IR)
-*                 (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB)
-*
-                  CALL DGEBRD( M, M, WORK( IR ), LDWRKR, S, WORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Generate right vectors bidiagonalizing L
-*                 (Workspace: need M*M+4*M-1, prefer M*M+3*M+(M-1)*NB)
-*
-                  CALL DORGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
-     $                         WORK( ITAUP ), WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-                  IWORK = IE + M
-*
-*                 Perform bidiagonal QR iteration, computing right
-*                 singular vectors of L in WORK(IR)
-*                 (Workspace: need M*M+BDSPAC)
-*
-                  CALL DBDSQR( 'U', M, M, 0, 0, S, WORK( IE ),
-     $                         WORK( IR ), LDWRKR, DUM, 1, DUM, 1,
-     $                         WORK( IWORK ), INFO )
-                  IU = IE + M
-*
-*                 Multiply right singular vectors of L in WORK(IR) by Q
-*                 in A, storing result in WORK(IU) and copying to A
-*                 (Workspace: need M*M+2*M, prefer M*M+M*N+M)
-*
-                  DO 30 I = 1, N, CHUNK
-                     BLK = MIN( N-I+1, CHUNK )
-                     CALL DGEMM( 'N', 'N', M, BLK, M, ONE, WORK( IR ),
-     $                           LDWRKR, A( 1, I ), LDA, ZERO,
-     $                           WORK( IU ), LDWRKU )
-                     CALL DLACPY( 'F', M, BLK, WORK( IU ), LDWRKU,
-     $                            A( 1, I ), LDA )
-   30             CONTINUE
-*
-               ELSE
-*
-*                 Insufficient workspace for a fast algorithm
-*
-                  IE = 1
-                  ITAUQ = IE + M
-                  ITAUP = ITAUQ + M
-                  IWORK = ITAUP + M
-*
-*                 Bidiagonalize A
-*                 (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB)
-*
-                  CALL DGEBRD( M, N, A, LDA, S, WORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Generate right vectors bidiagonalizing A
-*                 (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-                  CALL DORGBR( 'P', M, N, M, A, LDA, WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IWORK = IE + M
-*
-*                 Perform bidiagonal QR iteration, computing right
-*                 singular vectors of A in A
-*                 (Workspace: need BDSPAC)
-*
-                  CALL DBDSQR( 'L', M, N, 0, 0, S, WORK( IE ), A, LDA,
-     $                         DUM, 1, DUM, 1, WORK( IWORK ), INFO )
-*
-               END IF
-*
-            ELSE IF( WNTVO .AND. WNTUAS ) THEN
-*
-*              Path 3t(N much larger than M, JOBU='S' or 'A', JOBVT='O')
-*              M right singular vectors to be overwritten on A and
-*              M left singular vectors to be computed in U
-*
-               IF( LWORK.GE.M*M+MAX( 4*M, BDSPAC ) ) THEN
-*
-*                 Sufficient workspace for a fast algorithm
-*
-                  IR = 1
-                  IF( LWORK.GE.MAX( WRKBL, LDA*N+M )+LDA*M ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is LDA by M
-*
-                     LDWRKU = LDA
-                     CHUNK = N
-                     LDWRKR = LDA
-                  ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N+M )+M*M ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is M by M
-*
-                     LDWRKU = LDA
-                     CHUNK = N
-                     LDWRKR = M
-                  ELSE
-*
-*                    WORK(IU) is M by CHUNK and WORK(IR) is M by M
-*
-                     LDWRKU = M
-                     CHUNK = ( LWORK-M*M-M ) / M
-                     LDWRKR = M
-                  END IF
-                  ITAU = IR + LDWRKR*M
-                  IWORK = ITAU + M
-*
-*                 Compute A=L*Q
-*                 (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                  CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy L to U, zeroing about above it
-*
-                  CALL DLACPY( 'L', M, M, A, LDA, U, LDU )
-                  CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, U( 1, 2 ),
-     $                         LDU )
-*
-*                 Generate Q in A
-*                 (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                  CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = ITAU
-                  ITAUQ = IE + M
-                  ITAUP = ITAUQ + M
-                  IWORK = ITAUP + M
-*
-*                 Bidiagonalize L in U, copying result to WORK(IR)
-*                 (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB)
-*
-                  CALL DGEBRD( M, M, U, LDU, S, WORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  CALL DLACPY( 'U', M, M, U, LDU, WORK( IR ), LDWRKR )
-*
-*                 Generate right vectors bidiagonalizing L in WORK(IR)
-*                 (Workspace: need M*M+4*M-1, prefer M*M+3*M+(M-1)*NB)
-*
-                  CALL DORGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
-     $                         WORK( ITAUP ), WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-*
-*                 Generate left vectors bidiagonalizing L in U
-*                 (Workspace: need M*M+4*M, prefer M*M+3*M+M*NB)
-*
-                  CALL DORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IWORK = IE + M
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of L in U, and computing right
-*                 singular vectors of L in WORK(IR)
-*                 (Workspace: need M*M+BDSPAC)
-*
-                  CALL DBDSQR( 'U', M, M, M, 0, S, WORK( IE ),
-     $                         WORK( IR ), LDWRKR, U, LDU, DUM, 1,
-     $                         WORK( IWORK ), INFO )
-                  IU = IE + M
-*
-*                 Multiply right singular vectors of L in WORK(IR) by Q
-*                 in A, storing result in WORK(IU) and copying to A
-*                 (Workspace: need M*M+2*M, prefer M*M+M*N+M))
-*
-                  DO 40 I = 1, N, CHUNK
-                     BLK = MIN( N-I+1, CHUNK )
-                     CALL DGEMM( 'N', 'N', M, BLK, M, ONE, WORK( IR ),
-     $                           LDWRKR, A( 1, I ), LDA, ZERO,
-     $                           WORK( IU ), LDWRKU )
-                     CALL DLACPY( 'F', M, BLK, WORK( IU ), LDWRKU,
-     $                            A( 1, I ), LDA )
-   40             CONTINUE
-*
-               ELSE
-*
-*                 Insufficient workspace for a fast algorithm
-*
-                  ITAU = 1
-                  IWORK = ITAU + M
-*
-*                 Compute A=L*Q
-*                 (Workspace: need 2*M, prefer M+M*NB)
-*
-                  CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy L to U, zeroing out above it
-*
-                  CALL DLACPY( 'L', M, M, A, LDA, U, LDU )
-                  CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, U( 1, 2 ),
-     $                         LDU )
-*
-*                 Generate Q in A
-*                 (Workspace: need 2*M, prefer M+M*NB)
-*
-                  CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = ITAU
-                  ITAUQ = IE + M
-                  ITAUP = ITAUQ + M
-                  IWORK = ITAUP + M
-*
-*                 Bidiagonalize L in U
-*                 (Workspace: need 4*M, prefer 3*M+2*M*NB)
-*
-                  CALL DGEBRD( M, M, U, LDU, S, WORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Multiply right vectors bidiagonalizing L by Q in A
-*                 (Workspace: need 3*M+N, prefer 3*M+N*NB)
-*
-                  CALL DORMBR( 'P', 'L', 'T', M, N, M, U, LDU,
-     $                         WORK( ITAUP ), A, LDA, WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-*
-*                 Generate left vectors bidiagonalizing L in U
-*                 (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-                  CALL DORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IWORK = IE + M
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of A in U and computing right
-*                 singular vectors of A in A
-*                 (Workspace: need BDSPAC)
-*
-                  CALL DBDSQR( 'U', M, N, M, 0, S, WORK( IE ), A, LDA,
-     $                         U, LDU, DUM, 1, WORK( IWORK ), INFO )
-*
-               END IF
-*
-            ELSE IF( WNTVS ) THEN
-*
-               IF( WNTUN ) THEN
-*
-*                 Path 4t(N much larger than M, JOBU='N', JOBVT='S')
-*                 M right singular vectors to be computed in VT and
-*                 no left singular vectors to be computed
-*
-                  IF( LWORK.GE.M*M+MAX( 4*M, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IR = 1
-                     IF( LWORK.GE.WRKBL+LDA*M ) THEN
-*
-*                       WORK(IR) is LDA by M
-*
-                        LDWRKR = LDA
-                     ELSE
-*
-*                       WORK(IR) is M by M
-*
-                        LDWRKR = M
-                     END IF
-                     ITAU = IR + LDWRKR*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q
-*                    (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                     CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IR), zeroing out above it
-*
-                     CALL DLACPY( 'L', M, M, A, LDA, WORK( IR ),
-     $                            LDWRKR )
-                     CALL DLASET( 'U', M-1, M-1, ZERO, ZERO,
-     $                            WORK( IR+LDWRKR ), LDWRKR )
-*
-*                    Generate Q in A
-*                    (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                     CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IR)
-*                    (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB)
-*
-                     CALL DGEBRD( M, M, WORK( IR ), LDWRKR, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right vectors bidiagonalizing L in
-*                    WORK(IR)
-*                    (Workspace: need M*M+4*M, prefer M*M+3*M+(M-1)*NB)
-*
-                     CALL DORGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing right
-*                    singular vectors of L in WORK(IR)
-*                    (Workspace: need M*M+BDSPAC)
-*
-                     CALL DBDSQR( 'U', M, M, 0, 0, S, WORK( IE ),
-     $                            WORK( IR ), LDWRKR, DUM, 1, DUM, 1,
-     $                            WORK( IWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IR) by
-*                    Q in A, storing result in VT
-*                    (Workspace: need M*M)
-*
-                     CALL DGEMM( 'N', 'N', M, N, M, ONE, WORK( IR ),
-     $                           LDWRKR, A, LDA, ZERO, VT, LDVT )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy result to VT
-*
-                     CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL DORGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Zero out above L in A
-*
-                     CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, A( 1, 2 ),
-     $                            LDA )
-*
-*                    Bidiagonalize L in A
-*                    (Workspace: need 4*M, prefer 3*M+2*M*NB)
-*
-                     CALL DGEBRD( M, M, A, LDA, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right vectors bidiagonalizing L by Q in VT
-*                    (Workspace: need 3*M+N, prefer 3*M+N*NB)
-*
-                     CALL DORMBR( 'P', 'L', 'T', M, N, M, A, LDA,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing right
-*                    singular vectors of A in VT
-*                    (Workspace: need BDSPAC)
-*
-                     CALL DBDSQR( 'U', M, N, 0, 0, S, WORK( IE ), VT,
-     $                            LDVT, DUM, 1, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTUO ) THEN
-*
-*                 Path 5t(N much larger than M, JOBU='O', JOBVT='S')
-*                 M right singular vectors to be computed in VT and
-*                 M left singular vectors to be overwritten on A
-*
-                  IF( LWORK.GE.2*M*M+MAX( 4*M, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+2*LDA*M ) THEN
-*
-*                       WORK(IU) is LDA by M and WORK(IR) is LDA by M
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*M
-                        LDWRKR = LDA
-                     ELSE IF( LWORK.GE.WRKBL+( LDA+M )*M ) THEN
-*
-*                       WORK(IU) is LDA by M and WORK(IR) is M by M
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*M
-                        LDWRKR = M
-                     ELSE
-*
-*                       WORK(IU) is M by M and WORK(IR) is M by M
-*
-                        LDWRKU = M
-                        IR = IU + LDWRKU*M
-                        LDWRKR = M
-                     END IF
-                     ITAU = IR + LDWRKR*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q
-*                    (Workspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB)
-*
-                     CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IU), zeroing out below it
-*
-                     CALL DLACPY( 'L', M, M, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL DLASET( 'U', M-1, M-1, ZERO, ZERO,
-     $                            WORK( IU+LDWRKU ), LDWRKU )
-*
-*                    Generate Q in A
-*                    (Workspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB)
-*
-                     CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IU), copying result to
-*                    WORK(IR)
-*                    (Workspace: need 2*M*M+4*M,
-*                                prefer 2*M*M+3*M+2*M*NB)
-*
-                     CALL DGEBRD( M, M, WORK( IU ), LDWRKU, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'L', M, M, WORK( IU ), LDWRKU,
-     $                            WORK( IR ), LDWRKR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IU)
-*                    (Workspace: need 2*M*M+4*M-1,
-*                                prefer 2*M*M+3*M+(M-1)*NB)
-*
-                     CALL DORGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IR)
-*                    (Workspace: need 2*M*M+4*M, prefer 2*M*M+3*M+M*NB)
-*
-                     CALL DORGBR( 'Q', M, M, M, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of L in WORK(IR) and computing
-*                    right singular vectors of L in WORK(IU)
-*                    (Workspace: need 2*M*M+BDSPAC)
-*
-                     CALL DBDSQR( 'U', M, M, M, 0, S, WORK( IE ),
-     $                            WORK( IU ), LDWRKU, WORK( IR ),
-     $                            LDWRKR, DUM, 1, WORK( IWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IU) by
-*                    Q in A, storing result in VT
-*                    (Workspace: need M*M)
-*
-                     CALL DGEMM( 'N', 'N', M, N, M, ONE, WORK( IU ),
-     $                           LDWRKU, A, LDA, ZERO, VT, LDVT )
-*
-*                    Copy left singular vectors of L to A
-*                    (Workspace: need M*M)
-*
-                     CALL DLACPY( 'F', M, M, WORK( IR ), LDWRKR, A,
-     $                            LDA )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL DORGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Zero out above L in A
-*
-                     CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, A( 1, 2 ),
-     $                            LDA )
-*
-*                    Bidiagonalize L in A
-*                    (Workspace: need 4*M, prefer 3*M+2*M*NB)
-*
-                     CALL DGEBRD( M, M, A, LDA, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right vectors bidiagonalizing L by Q in VT
-*                    (Workspace: need 3*M+N, prefer 3*M+N*NB)
-*
-                     CALL DORMBR( 'P', 'L', 'T', M, N, M, A, LDA,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors of L in A
-*                    (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-                     CALL DORGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, compute left
-*                    singular vectors of A in A and compute right
-*                    singular vectors of A in VT
-*                    (Workspace: need BDSPAC)
-*
-                     CALL DBDSQR( 'U', M, N, M, 0, S, WORK( IE ), VT,
-     $                            LDVT, A, LDA, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTUAS ) THEN
-*
-*                 Path 6t(N much larger than M, JOBU='S' or 'A',
-*                         JOBVT='S')
-*                 M right singular vectors to be computed in VT and
-*                 M left singular vectors to be computed in U
-*
-                  IF( LWORK.GE.M*M+MAX( 4*M, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+LDA*M ) THEN
-*
-*                       WORK(IU) is LDA by N
-*
-                        LDWRKU = LDA
-                     ELSE
-*
-*                       WORK(IU) is LDA by M
-*
-                        LDWRKU = M
-                     END IF
-                     ITAU = IU + LDWRKU*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q
-*                    (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                     CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IU), zeroing out above it
-*
-                     CALL DLACPY( 'L', M, M, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL DLASET( 'U', M-1, M-1, ZERO, ZERO,
-     $                            WORK( IU+LDWRKU ), LDWRKU )
-*
-*                    Generate Q in A
-*                    (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                     CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IU), copying result to U
-*                    (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB)
-*
-                     CALL DGEBRD( M, M, WORK( IU ), LDWRKU, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'L', M, M, WORK( IU ), LDWRKU, U,
-     $                            LDU )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IU)
-*                    (Workspace: need M*M+4*M-1,
-*                                prefer M*M+3*M+(M-1)*NB)
-*
-                     CALL DORGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in U
-*                    (Workspace: need M*M+4*M, prefer M*M+3*M+M*NB)
-*
-                     CALL DORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of L in U and computing right
-*                    singular vectors of L in WORK(IU)
-*                    (Workspace: need M*M+BDSPAC)
-*
-                     CALL DBDSQR( 'U', M, M, M, 0, S, WORK( IE ),
-     $                            WORK( IU ), LDWRKU, U, LDU, DUM, 1,
-     $                            WORK( IWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IU) by
-*                    Q in A, storing result in VT
-*                    (Workspace: need M*M)
-*
-                     CALL DGEMM( 'N', 'N', M, N, M, ONE, WORK( IU ),
-     $                           LDWRKU, A, LDA, ZERO, VT, LDVT )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL DORGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to U, zeroing out above it
-*
-                     CALL DLACPY( 'L', M, M, A, LDA, U, LDU )
-                     CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, U( 1, 2 ),
-     $                            LDU )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in U
-*                    (Workspace: need 4*M, prefer 3*M+2*M*NB)
-*
-                     CALL DGEBRD( M, M, U, LDU, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right bidiagonalizing vectors in U by Q
-*                    in VT
-*                    (Workspace: need 3*M+N, prefer 3*M+N*NB)
-*
-                     CALL DORMBR( 'P', 'L', 'T', M, N, M, U, LDU,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in U
-*                    (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-                     CALL DORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in VT
-*                    (Workspace: need BDSPAC)
-*
-                     CALL DBDSQR( 'U', M, N, M, 0, S, WORK( IE ), VT,
-     $                            LDVT, U, LDU, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               END IF
-*
-            ELSE IF( WNTVA ) THEN
-*
-               IF( WNTUN ) THEN
-*
-*                 Path 7t(N much larger than M, JOBU='N', JOBVT='A')
-*                 N right singular vectors to be computed in VT and
-*                 no left singular vectors to be computed
-*
-                  IF( LWORK.GE.M*M+MAX( N+M, 4*M, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IR = 1
-                     IF( LWORK.GE.WRKBL+LDA*M ) THEN
-*
-*                       WORK(IR) is LDA by M
-*
-                        LDWRKR = LDA
-                     ELSE
-*
-*                       WORK(IR) is M by M
-*
-                        LDWRKR = M
-                     END IF
-                     ITAU = IR + LDWRKR*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                     CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Copy L to WORK(IR), zeroing out above it
-*
-                     CALL DLACPY( 'L', M, M, A, LDA, WORK( IR ),
-     $                            LDWRKR )
-                     CALL DLASET( 'U', M-1, M-1, ZERO, ZERO,
-     $                            WORK( IR+LDWRKR ), LDWRKR )
-*
-*                    Generate Q in VT
-*                    (Workspace: need M*M+M+N, prefer M*M+M+N*NB)
-*
-                     CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IR)
-*                    (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB)
-*
-                     CALL DGEBRD( M, M, WORK( IR ), LDWRKR, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IR)
-*                    (Workspace: need M*M+4*M-1,
-*                                prefer M*M+3*M+(M-1)*NB)
-*
-                     CALL DORGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing right
-*                    singular vectors of L in WORK(IR)
-*                    (Workspace: need M*M+BDSPAC)
-*
-                     CALL DBDSQR( 'U', M, M, 0, 0, S, WORK( IE ),
-     $                            WORK( IR ), LDWRKR, DUM, 1, DUM, 1,
-     $                            WORK( IWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IR) by
-*                    Q in VT, storing result in A
-*                    (Workspace: need M*M)
-*
-                     CALL DGEMM( 'N', 'N', M, N, M, ONE, WORK( IR ),
-     $                           LDWRKR, VT, LDVT, ZERO, A, LDA )
-*
-*                    Copy right singular vectors of A from A to VT
-*
-                     CALL DLACPY( 'F', M, N, A, LDA, VT, LDVT )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (Workspace: need M+N, prefer M+N*NB)
-*
-                     CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Zero out above L in A
-*
-                     CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, A( 1, 2 ),
-     $                            LDA )
-*
-*                    Bidiagonalize L in A
-*                    (Workspace: need 4*M, prefer 3*M+2*M*NB)
-*
-                     CALL DGEBRD( M, M, A, LDA, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right bidiagonalizing vectors in A by Q
-*                    in VT
-*                    (Workspace: need 3*M+N, prefer 3*M+N*NB)
-*
-                     CALL DORMBR( 'P', 'L', 'T', M, N, M, A, LDA,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing right
-*                    singular vectors of A in VT
-*                    (Workspace: need BDSPAC)
-*
-                     CALL DBDSQR( 'U', M, N, 0, 0, S, WORK( IE ), VT,
-     $                            LDVT, DUM, 1, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTUO ) THEN
-*
-*                 Path 8t(N much larger than M, JOBU='O', JOBVT='A')
-*                 N right singular vectors to be computed in VT and
-*                 M left singular vectors to be overwritten on A
-*
-                  IF( LWORK.GE.2*M*M+MAX( N+M, 4*M, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+2*LDA*M ) THEN
-*
-*                       WORK(IU) is LDA by M and WORK(IR) is LDA by M
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*M
-                        LDWRKR = LDA
-                     ELSE IF( LWORK.GE.WRKBL+( LDA+M )*M ) THEN
-*
-*                       WORK(IU) is LDA by M and WORK(IR) is M by M
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*M
-                        LDWRKR = M
-                     ELSE
-*
-*                       WORK(IU) is M by M and WORK(IR) is M by M
-*
-                        LDWRKU = M
-                        IR = IU + LDWRKU*M
-                        LDWRKR = M
-                     END IF
-                     ITAU = IR + LDWRKR*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (Workspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB)
-*
-                     CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (Workspace: need 2*M*M+M+N, prefer 2*M*M+M+N*NB)
-*
-                     CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IU), zeroing out above it
-*
-                     CALL DLACPY( 'L', M, M, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL DLASET( 'U', M-1, M-1, ZERO, ZERO,
-     $                            WORK( IU+LDWRKU ), LDWRKU )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IU), copying result to
-*                    WORK(IR)
-*                    (Workspace: need 2*M*M+4*M,
-*                                prefer 2*M*M+3*M+2*M*NB)
-*
-                     CALL DGEBRD( M, M, WORK( IU ), LDWRKU, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'L', M, M, WORK( IU ), LDWRKU,
-     $                            WORK( IR ), LDWRKR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IU)
-*                    (Workspace: need 2*M*M+4*M-1,
-*                                prefer 2*M*M+3*M+(M-1)*NB)
-*
-                     CALL DORGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IR)
-*                    (Workspace: need 2*M*M+4*M, prefer 2*M*M+3*M+M*NB)
-*
-                     CALL DORGBR( 'Q', M, M, M, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of L in WORK(IR) and computing
-*                    right singular vectors of L in WORK(IU)
-*                    (Workspace: need 2*M*M+BDSPAC)
-*
-                     CALL DBDSQR( 'U', M, M, M, 0, S, WORK( IE ),
-     $                            WORK( IU ), LDWRKU, WORK( IR ),
-     $                            LDWRKR, DUM, 1, WORK( IWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IU) by
-*                    Q in VT, storing result in A
-*                    (Workspace: need M*M)
-*
-                     CALL DGEMM( 'N', 'N', M, N, M, ONE, WORK( IU ),
-     $                           LDWRKU, VT, LDVT, ZERO, A, LDA )
-*
-*                    Copy right singular vectors of A from A to VT
-*
-                     CALL DLACPY( 'F', M, N, A, LDA, VT, LDVT )
-*
-*                    Copy left singular vectors of A from WORK(IR) to A
-*
-                     CALL DLACPY( 'F', M, M, WORK( IR ), LDWRKR, A,
-     $                            LDA )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (Workspace: need M+N, prefer M+N*NB)
-*
-                     CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Zero out above L in A
-*
-                     CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, A( 1, 2 ),
-     $                            LDA )
-*
-*                    Bidiagonalize L in A
-*                    (Workspace: need 4*M, prefer 3*M+2*M*NB)
-*
-                     CALL DGEBRD( M, M, A, LDA, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right bidiagonalizing vectors in A by Q
-*                    in VT
-*                    (Workspace: need 3*M+N, prefer 3*M+N*NB)
-*
-                     CALL DORMBR( 'P', 'L', 'T', M, N, M, A, LDA,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in A
-*                    (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-                     CALL DORGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in A and computing right
-*                    singular vectors of A in VT
-*                    (Workspace: need BDSPAC)
-*
-                     CALL DBDSQR( 'U', M, N, M, 0, S, WORK( IE ), VT,
-     $                            LDVT, A, LDA, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTUAS ) THEN
-*
-*                 Path 9t(N much larger than M, JOBU='S' or 'A',
-*                         JOBVT='A')
-*                 N right singular vectors to be computed in VT and
-*                 M left singular vectors to be computed in U
-*
-                  IF( LWORK.GE.M*M+MAX( N+M, 4*M, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+LDA*M ) THEN
-*
-*                       WORK(IU) is LDA by M
-*
-                        LDWRKU = LDA
-                     ELSE
-*
-*                       WORK(IU) is M by M
-*
-                        LDWRKU = M
-                     END IF
-                     ITAU = IU + LDWRKU*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                     CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (Workspace: need M*M+M+N, prefer M*M+M+N*NB)
-*
-                     CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IU), zeroing out above it
-*
-                     CALL DLACPY( 'L', M, M, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL DLASET( 'U', M-1, M-1, ZERO, ZERO,
-     $                            WORK( IU+LDWRKU ), LDWRKU )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IU), copying result to U
-*                    (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB)
-*
-                     CALL DGEBRD( M, M, WORK( IU ), LDWRKU, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'L', M, M, WORK( IU ), LDWRKU, U,
-     $                            LDU )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IU)
-*                    (Workspace: need M*M+4*M, prefer M*M+3*M+(M-1)*NB)
-*
-                     CALL DORGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in U
-*                    (Workspace: need M*M+4*M, prefer M*M+3*M+M*NB)
-*
-                     CALL DORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of L in U and computing right
-*                    singular vectors of L in WORK(IU)
-*                    (Workspace: need M*M+BDSPAC)
-*
-                     CALL DBDSQR( 'U', M, M, M, 0, S, WORK( IE ),
-     $                            WORK( IU ), LDWRKU, U, LDU, DUM, 1,
-     $                            WORK( IWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IU) by
-*                    Q in VT, storing result in A
-*                    (Workspace: need M*M)
-*
-                     CALL DGEMM( 'N', 'N', M, N, M, ONE, WORK( IU ),
-     $                           LDWRKU, VT, LDVT, ZERO, A, LDA )
-*
-*                    Copy right singular vectors of A from A to VT
-*
-                     CALL DLACPY( 'F', M, N, A, LDA, VT, LDVT )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (Workspace: need M+N, prefer M+N*NB)
-*
-                     CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to U, zeroing out above it
-*
-                     CALL DLACPY( 'L', M, M, A, LDA, U, LDU )
-                     CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, U( 1, 2 ),
-     $                            LDU )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in U
-*                    (Workspace: need 4*M, prefer 3*M+2*M*NB)
-*
-                     CALL DGEBRD( M, M, U, LDU, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right bidiagonalizing vectors in U by Q
-*                    in VT
-*                    (Workspace: need 3*M+N, prefer 3*M+N*NB)
-*
-                     CALL DORMBR( 'P', 'L', 'T', M, N, M, U, LDU,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in U
-*                    (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-                     CALL DORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in VT
-*                    (Workspace: need BDSPAC)
-*
-                     CALL DBDSQR( 'U', M, N, M, 0, S, WORK( IE ), VT,
-     $                            LDVT, U, LDU, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               END IF
-*
-            END IF
-*
-         ELSE
-*
-*           N .LT. MNTHR
-*
-*           Path 10t(N greater than M, but not much larger)
-*           Reduce to bidiagonal form without LQ decomposition
-*
-            IE = 1
-            ITAUQ = IE + M
-            ITAUP = ITAUQ + M
-            IWORK = ITAUP + M
-*
-*           Bidiagonalize A
-*           (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB)
-*
-            CALL DGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
-     $                   WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                   IERR )
-            IF( WNTUAS ) THEN
-*
-*              If left singular vectors desired in U, copy result to U
-*              and generate left bidiagonalizing vectors in U
-*              (Workspace: need 4*M-1, prefer 3*M+(M-1)*NB)
-*
-               CALL DLACPY( 'L', M, M, A, LDA, U, LDU )
-               CALL DORGBR( 'Q', M, M, N, U, LDU, WORK( ITAUQ ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTVAS ) THEN
-*
-*              If right singular vectors desired in VT, copy result to
-*              VT and generate right bidiagonalizing vectors in VT
-*              (Workspace: need 3*M+NRVT, prefer 3*M+NRVT*NB)
-*
-               CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT )
-               IF( WNTVA )
-     $            NRVT = N
-               IF( WNTVS )
-     $            NRVT = M
-               CALL DORGBR( 'P', NRVT, N, M, VT, LDVT, WORK( ITAUP ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTUO ) THEN
-*
-*              If left singular vectors desired in A, generate left
-*              bidiagonalizing vectors in A
-*              (Workspace: need 4*M-1, prefer 3*M+(M-1)*NB)
-*
-               CALL DORGBR( 'Q', M, M, N, A, LDA, WORK( ITAUQ ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTVO ) THEN
-*
-*              If right singular vectors desired in A, generate right
-*              bidiagonalizing vectors in A
-*              (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-               CALL DORGBR( 'P', M, N, M, A, LDA, WORK( ITAUP ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IWORK = IE + M
-            IF( WNTUAS .OR. WNTUO )
-     $         NRU = M
-            IF( WNTUN )
-     $         NRU = 0
-            IF( WNTVAS .OR. WNTVO )
-     $         NCVT = N
-            IF( WNTVN )
-     $         NCVT = 0
-            IF( ( .NOT.WNTUO ) .AND. ( .NOT.WNTVO ) ) THEN
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in U and computing right singular
-*              vectors in VT
-*              (Workspace: need BDSPAC)
-*
-               CALL DBDSQR( 'L', M, NCVT, NRU, 0, S, WORK( IE ), VT,
-     $                      LDVT, U, LDU, DUM, 1, WORK( IWORK ), INFO )
-            ELSE IF( ( .NOT.WNTUO ) .AND. WNTVO ) THEN
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in U and computing right singular
-*              vectors in A
-*              (Workspace: need BDSPAC)
-*
-               CALL DBDSQR( 'L', M, NCVT, NRU, 0, S, WORK( IE ), A, LDA,
-     $                      U, LDU, DUM, 1, WORK( IWORK ), INFO )
-            ELSE
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in A and computing right singular
-*              vectors in VT
-*              (Workspace: need BDSPAC)
-*
-               CALL DBDSQR( 'L', M, NCVT, NRU, 0, S, WORK( IE ), VT,
-     $                      LDVT, A, LDA, DUM, 1, WORK( IWORK ), INFO )
-            END IF
-*
-         END IF
-*
-      END IF
-*
-*     If DBDSQR failed to converge, copy unconverged superdiagonals
-*     to WORK( 2:MINMN )
-*
-      IF( INFO.NE.0 ) THEN
-         IF( IE.GT.2 ) THEN
-            DO 50 I = 1, MINMN - 1
-               WORK( I+1 ) = WORK( I+IE-1 )
-   50       CONTINUE
-         END IF
-         IF( IE.LT.2 ) THEN
-            DO 60 I = MINMN - 1, 1, -1
-               WORK( I+1 ) = WORK( I+IE-1 )
-   60       CONTINUE
-         END IF
-      END IF
-*
-*     Undo scaling if necessary
-*
-      IF( ISCL.EQ.1 ) THEN
-         IF( ANRM.GT.BIGNUM )
-     $      CALL DLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
-     $                   IERR )
-         IF( INFO.NE.0 .AND. ANRM.GT.BIGNUM )
-     $      CALL DLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN-1, 1, WORK( 2 ),
-     $                   MINMN, IERR )
-         IF( ANRM.LT.SMLNUM )
-     $      CALL DLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
-     $                   IERR )
-         IF( INFO.NE.0 .AND. ANRM.LT.SMLNUM )
-     $      CALL DLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN-1, 1, WORK( 2 ),
-     $                   MINMN, IERR )
-      END IF
-*
-*     Return optimal workspace in WORK(1)
-*
-      WORK( 1 ) = MAXWRK
-*
-      RETURN
-*
-*     End of DGESVD
-*
-      END
--- a/libcruft/lapack/dgetf2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-      SUBROUTINE DGETF2( M, N, A, LDA, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      DOUBLE PRECISION   A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGETF2 computes an LU factorization of a general m-by-n matrix A
-*  using partial pivoting with row interchanges.
-*
-*  The factorization has the form
-*     A = P * L * U
-*  where P is a permutation matrix, L is lower triangular with unit
-*  diagonal elements (lower trapezoidal if m > n), and U is upper
-*  triangular (upper trapezoidal if m < n).
-*
-*  This is the right-looking Level 2 BLAS version of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the m by n matrix to be factored.
-*          On exit, the factors L and U from the factorization
-*          A = P*L*U; the unit diagonal elements of L are not stored.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  IPIV    (output) INTEGER array, dimension (min(M,N))
-*          The pivot indices; for 1 <= i <= min(M,N), row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*          > 0: if INFO = k, U(k,k) is exactly zero. The factorization
-*               has been completed, but the factor U is exactly
-*               singular, and division by zero will occur if it is used
-*               to solve a system of equations.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   SFMIN 
-      INTEGER            I, J, JP
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH      
-      INTEGER            IDAMAX
-      EXTERNAL           DLAMCH, IDAMAX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGER, DSCAL, DSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGETF2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Compute machine safe minimum 
-* 
-      SFMIN = DLAMCH('S')  
-*
-      DO 10 J = 1, MIN( M, N )
-*
-*        Find pivot and test for singularity.
-*
-         JP = J - 1 + IDAMAX( M-J+1, A( J, J ), 1 )
-         IPIV( J ) = JP
-         IF( A( JP, J ).NE.ZERO ) THEN
-*
-*           Apply the interchange to columns 1:N.
-*
-            IF( JP.NE.J )
-     $         CALL DSWAP( N, A( J, 1 ), LDA, A( JP, 1 ), LDA )
-*
-*           Compute elements J+1:M of J-th column.
-*
-            IF( J.LT.M ) THEN 
-               IF( ABS(A( J, J )) .GE. SFMIN ) THEN 
-                  CALL DSCAL( M-J, ONE / A( J, J ), A( J+1, J ), 1 ) 
-               ELSE 
-                 DO 20 I = 1, M-J 
-                    A( J+I, J ) = A( J+I, J ) / A( J, J ) 
-   20            CONTINUE 
-               END IF 
-            END IF 
-*
-         ELSE IF( INFO.EQ.0 ) THEN
-*
-            INFO = J
-         END IF
-*
-         IF( J.LT.MIN( M, N ) ) THEN
-*
-*           Update trailing submatrix.
-*
-            CALL DGER( M-J, N-J, -ONE, A( J+1, J ), 1, A( J, J+1 ), LDA,
-     $                 A( J+1, J+1 ), LDA )
-         END IF
-   10 CONTINUE
-      RETURN
-*
-*     End of DGETF2
-*
-      END
--- a/libcruft/lapack/dgetrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,159 +0,0 @@
-      SUBROUTINE DGETRF( M, N, A, LDA, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      DOUBLE PRECISION   A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGETRF computes an LU factorization of a general M-by-N matrix A
-*  using partial pivoting with row interchanges.
-*
-*  The factorization has the form
-*     A = P * L * U
-*  where P is a permutation matrix, L is lower triangular with unit
-*  diagonal elements (lower trapezoidal if m > n), and U is upper
-*  triangular (upper trapezoidal if m < n).
-*
-*  This is the right-looking Level 3 BLAS version of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the M-by-N matrix to be factored.
-*          On exit, the factors L and U from the factorization
-*          A = P*L*U; the unit diagonal elements of L are not stored.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  IPIV    (output) INTEGER array, dimension (min(M,N))
-*          The pivot indices; for 1 <= i <= min(M,N), row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, U(i,i) is exactly zero. The factorization
-*                has been completed, but the factor U is exactly
-*                singular, and division by zero will occur if it is used
-*                to solve a system of equations.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, IINFO, J, JB, NB
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMM, DGETF2, DLASWP, DTRSM, XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGETRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'DGETRF', ' ', M, N, -1, -1 )
-      IF( NB.LE.1 .OR. NB.GE.MIN( M, N ) ) THEN
-*
-*        Use unblocked code.
-*
-         CALL DGETF2( M, N, A, LDA, IPIV, INFO )
-      ELSE
-*
-*        Use blocked code.
-*
-         DO 20 J = 1, MIN( M, N ), NB
-            JB = MIN( MIN( M, N )-J+1, NB )
-*
-*           Factor diagonal and subdiagonal blocks and test for exact
-*           singularity.
-*
-            CALL DGETF2( M-J+1, JB, A( J, J ), LDA, IPIV( J ), IINFO )
-*
-*           Adjust INFO and the pivot indices.
-*
-            IF( INFO.EQ.0 .AND. IINFO.GT.0 )
-     $         INFO = IINFO + J - 1
-            DO 10 I = J, MIN( M, J+JB-1 )
-               IPIV( I ) = J - 1 + IPIV( I )
-   10       CONTINUE
-*
-*           Apply interchanges to columns 1:J-1.
-*
-            CALL DLASWP( J-1, A, LDA, J, J+JB-1, IPIV, 1 )
-*
-            IF( J+JB.LE.N ) THEN
-*
-*              Apply interchanges to columns J+JB:N.
-*
-               CALL DLASWP( N-J-JB+1, A( 1, J+JB ), LDA, J, J+JB-1,
-     $                      IPIV, 1 )
-*
-*              Compute block row of U.
-*
-               CALL DTRSM( 'Left', 'Lower', 'No transpose', 'Unit', JB,
-     $                     N-J-JB+1, ONE, A( J, J ), LDA, A( J, J+JB ),
-     $                     LDA )
-               IF( J+JB.LE.M ) THEN
-*
-*                 Update trailing submatrix.
-*
-                  CALL DGEMM( 'No transpose', 'No transpose', M-J-JB+1,
-     $                        N-J-JB+1, JB, -ONE, A( J+JB, J ), LDA,
-     $                        A( J, J+JB ), LDA, ONE, A( J+JB, J+JB ),
-     $                        LDA )
-               END IF
-            END IF
-   20    CONTINUE
-      END IF
-      RETURN
-*
-*     End of DGETRF
-*
-      END
--- a/libcruft/lapack/dgetri.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,192 +0,0 @@
-      SUBROUTINE DGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      DOUBLE PRECISION   A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGETRI computes the inverse of a matrix using the LU factorization
-*  computed by DGETRF.
-*
-*  This method inverts U and then computes inv(A) by solving the system
-*  inv(A)*L = inv(U) for inv(A).
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the factors L and U from the factorization
-*          A = P*L*U as computed by DGETRF.
-*          On exit, if INFO = 0, the inverse of the original matrix A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices from DGETRF; for 1<=i<=N, row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO=0, then WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,N).
-*          For optimal performance LWORK >= N*NB, where NB is
-*          the optimal blocksize returned by ILAENV.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, U(i,i) is exactly zero; the matrix is
-*                singular and its inverse could not be computed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IWS, J, JB, JJ, JP, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMM, DGEMV, DSWAP, DTRSM, DTRTRI, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      NB = ILAENV( 1, 'DGETRI', ' ', N, -1, -1, -1 )
-      LWKOPT = N*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -3
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGETRI', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Form inv(U).  If INFO > 0 from DTRTRI, then U is singular,
-*     and the inverse is not computed.
-*
-      CALL DTRTRI( 'Upper', 'Non-unit', N, A, LDA, INFO )
-      IF( INFO.GT.0 )
-     $   RETURN
-*
-      NBMIN = 2
-      LDWORK = N
-      IF( NB.GT.1 .AND. NB.LT.N ) THEN
-         IWS = MAX( LDWORK*NB, 1 )
-         IF( LWORK.LT.IWS ) THEN
-            NB = LWORK / LDWORK
-            NBMIN = MAX( 2, ILAENV( 2, 'DGETRI', ' ', N, -1, -1, -1 ) )
-         END IF
-      ELSE
-         IWS = N
-      END IF
-*
-*     Solve the equation inv(A)*L = inv(U) for inv(A).
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code.
-*
-         DO 20 J = N, 1, -1
-*
-*           Copy current column of L to WORK and replace with zeros.
-*
-            DO 10 I = J + 1, N
-               WORK( I ) = A( I, J )
-               A( I, J ) = ZERO
-   10       CONTINUE
-*
-*           Compute current column of inv(A).
-*
-            IF( J.LT.N )
-     $         CALL DGEMV( 'No transpose', N, N-J, -ONE, A( 1, J+1 ),
-     $                     LDA, WORK( J+1 ), 1, ONE, A( 1, J ), 1 )
-   20    CONTINUE
-      ELSE
-*
-*        Use blocked code.
-*
-         NN = ( ( N-1 ) / NB )*NB + 1
-         DO 50 J = NN, 1, -NB
-            JB = MIN( NB, N-J+1 )
-*
-*           Copy current block column of L to WORK and replace with
-*           zeros.
-*
-            DO 40 JJ = J, J + JB - 1
-               DO 30 I = JJ + 1, N
-                  WORK( I+( JJ-J )*LDWORK ) = A( I, JJ )
-                  A( I, JJ ) = ZERO
-   30          CONTINUE
-   40       CONTINUE
-*
-*           Compute current block column of inv(A).
-*
-            IF( J+JB.LE.N )
-     $         CALL DGEMM( 'No transpose', 'No transpose', N, JB,
-     $                     N-J-JB+1, -ONE, A( 1, J+JB ), LDA,
-     $                     WORK( J+JB ), LDWORK, ONE, A( 1, J ), LDA )
-            CALL DTRSM( 'Right', 'Lower', 'No transpose', 'Unit', N, JB,
-     $                  ONE, WORK( J ), LDWORK, A( 1, J ), LDA )
-   50    CONTINUE
-      END IF
-*
-*     Apply column interchanges.
-*
-      DO 60 J = N - 1, 1, -1
-         JP = IPIV( J )
-         IF( JP.NE.J )
-     $      CALL DSWAP( N, A( 1, J ), 1, A( 1, JP ), 1 )
-   60 CONTINUE
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of DGETRI
-*
-      END
--- a/libcruft/lapack/dgetrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-      SUBROUTINE DGETRS( TRANS, N, NRHS, A, LDA, IPIV, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TRANS
-      INTEGER            INFO, LDA, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGETRS solves a system of linear equations
-*     A * X = B  or  A' * X = B
-*  with a general N-by-N matrix A using the LU factorization computed
-*  by DGETRF.
-*
-*  Arguments
-*  =========
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the form of the system of equations:
-*          = 'N':  A * X = B  (No transpose)
-*          = 'T':  A'* X = B  (Transpose)
-*          = 'C':  A'* X = B  (Conjugate transpose = Transpose)
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA,N)
-*          The factors L and U from the factorization A = P*L*U
-*          as computed by DGETRF.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices from DGETRF; for 1<=i<=N, row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOTRAN
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLASWP, DTRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      NOTRAN = LSAME( TRANS, 'N' )
-      IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
-     $    LSAME( TRANS, 'C' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGETRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      IF( NOTRAN ) THEN
-*
-*        Solve A * X = B.
-*
-*        Apply row interchanges to the right hand sides.
-*
-         CALL DLASWP( NRHS, B, LDB, 1, N, IPIV, 1 )
-*
-*        Solve L*X = B, overwriting B with X.
-*
-         CALL DTRSM( 'Left', 'Lower', 'No transpose', 'Unit', N, NRHS,
-     $               ONE, A, LDA, B, LDB )
-*
-*        Solve U*X = B, overwriting B with X.
-*
-         CALL DTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N,
-     $               NRHS, ONE, A, LDA, B, LDB )
-      ELSE
-*
-*        Solve A' * X = B.
-*
-*        Solve U'*X = B, overwriting B with X.
-*
-         CALL DTRSM( 'Left', 'Upper', 'Transpose', 'Non-unit', N, NRHS,
-     $               ONE, A, LDA, B, LDB )
-*
-*        Solve L'*X = B, overwriting B with X.
-*
-         CALL DTRSM( 'Left', 'Lower', 'Transpose', 'Unit', N, NRHS, ONE,
-     $               A, LDA, B, LDB )
-*
-*        Apply row interchanges to the solution vectors.
-*
-         CALL DLASWP( NRHS, B, LDB, 1, N, IPIV, -1 )
-      END IF
-*
-      RETURN
-*
-*     End of DGETRS
-*
-      END
--- a/libcruft/lapack/dggbak.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,220 +0,0 @@
-      SUBROUTINE DGGBAK( JOB, SIDE, N, ILO, IHI, LSCALE, RSCALE, M, V,
-     $                   LDV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOB, SIDE
-      INTEGER            IHI, ILO, INFO, LDV, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   LSCALE( * ), RSCALE( * ), V( LDV, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGGBAK forms the right or left eigenvectors of a real generalized
-*  eigenvalue problem A*x = lambda*B*x, by backward transformation on
-*  the computed eigenvectors of the balanced pair of matrices output by
-*  DGGBAL.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies the type of backward transformation required:
-*          = 'N':  do nothing, return immediately;
-*          = 'P':  do backward transformation for permutation only;
-*          = 'S':  do backward transformation for scaling only;
-*          = 'B':  do backward transformations for both permutation and
-*                  scaling.
-*          JOB must be the same as the argument JOB supplied to DGGBAL.
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'R':  V contains right eigenvectors;
-*          = 'L':  V contains left eigenvectors.
-*
-*  N       (input) INTEGER
-*          The number of rows of the matrix V.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          The integers ILO and IHI determined by DGGBAL.
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  LSCALE  (input) DOUBLE PRECISION array, dimension (N)
-*          Details of the permutations and/or scaling factors applied
-*          to the left side of A and B, as returned by DGGBAL.
-*
-*  RSCALE  (input) DOUBLE PRECISION array, dimension (N)
-*          Details of the permutations and/or scaling factors applied
-*          to the right side of A and B, as returned by DGGBAL.
-*
-*  M       (input) INTEGER
-*          The number of columns of the matrix V.  M >= 0.
-*
-*  V       (input/output) DOUBLE PRECISION array, dimension (LDV,M)
-*          On entry, the matrix of right or left eigenvectors to be
-*          transformed, as returned by DTGEVC.
-*          On exit, V is overwritten by the transformed eigenvectors.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the matrix V. LDV >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  See R.C. Ward, Balancing the generalized eigenvalue problem,
-*                 SIAM J. Sci. Stat. Comp. 2 (1981), 141-152.
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            LEFTV, RIGHTV
-      INTEGER            I, K
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DSCAL, DSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      RIGHTV = LSAME( SIDE, 'R' )
-      LEFTV = LSAME( SIDE, 'L' )
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
-     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ILO.LT.1 ) THEN
-         INFO = -4
-      ELSE IF( N.EQ.0 .AND. IHI.EQ.0 .AND. ILO.NE.1 ) THEN
-         INFO = -4
-      ELSE IF( N.GT.0 .AND. ( IHI.LT.ILO .OR. IHI.GT.MAX( 1, N ) ) )
-     $   THEN
-         INFO = -5
-      ELSE IF( N.EQ.0 .AND. ILO.EQ.1 .AND. IHI.NE.0 ) THEN
-         INFO = -5
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -8
-      ELSE IF( LDV.LT.MAX( 1, N ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGGBAK', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-      IF( M.EQ.0 )
-     $   RETURN
-      IF( LSAME( JOB, 'N' ) )
-     $   RETURN
-*
-      IF( ILO.EQ.IHI )
-     $   GO TO 30
-*
-*     Backward balance
-*
-      IF( LSAME( JOB, 'S' ) .OR. LSAME( JOB, 'B' ) ) THEN
-*
-*        Backward transformation on right eigenvectors
-*
-         IF( RIGHTV ) THEN
-            DO 10 I = ILO, IHI
-               CALL DSCAL( M, RSCALE( I ), V( I, 1 ), LDV )
-   10       CONTINUE
-         END IF
-*
-*        Backward transformation on left eigenvectors
-*
-         IF( LEFTV ) THEN
-            DO 20 I = ILO, IHI
-               CALL DSCAL( M, LSCALE( I ), V( I, 1 ), LDV )
-   20       CONTINUE
-         END IF
-      END IF
-*
-*     Backward permutation
-*
-   30 CONTINUE
-      IF( LSAME( JOB, 'P' ) .OR. LSAME( JOB, 'B' ) ) THEN
-*
-*        Backward permutation on right eigenvectors
-*
-         IF( RIGHTV ) THEN
-            IF( ILO.EQ.1 )
-     $         GO TO 50
-*
-            DO 40 I = ILO - 1, 1, -1
-               K = RSCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 40
-               CALL DSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   40       CONTINUE
-*
-   50       CONTINUE
-            IF( IHI.EQ.N )
-     $         GO TO 70
-            DO 60 I = IHI + 1, N
-               K = RSCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 60
-               CALL DSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   60       CONTINUE
-         END IF
-*
-*        Backward permutation on left eigenvectors
-*
-   70    CONTINUE
-         IF( LEFTV ) THEN
-            IF( ILO.EQ.1 )
-     $         GO TO 90
-            DO 80 I = ILO - 1, 1, -1
-               K = LSCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 80
-               CALL DSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   80       CONTINUE
-*
-   90       CONTINUE
-            IF( IHI.EQ.N )
-     $         GO TO 110
-            DO 100 I = IHI + 1, N
-               K = LSCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 100
-               CALL DSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-  100       CONTINUE
-         END IF
-      END IF
-*
-  110 CONTINUE
-*
-      RETURN
-*
-*     End of DGGBAK
-*
-      END
--- a/libcruft/lapack/dggbal.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,469 +0,0 @@
-      SUBROUTINE DGGBAL( JOB, N, A, LDA, B, LDB, ILO, IHI, LSCALE,
-     $                   RSCALE, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOB
-      INTEGER            IHI, ILO, INFO, LDA, LDB, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), LSCALE( * ),
-     $                   RSCALE( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGGBAL balances a pair of general real matrices (A,B).  This
-*  involves, first, permuting A and B by similarity transformations to
-*  isolate eigenvalues in the first 1 to ILO$-$1 and last IHI+1 to N
-*  elements on the diagonal; and second, applying a diagonal similarity
-*  transformation to rows and columns ILO to IHI to make the rows
-*  and columns as close in norm as possible. Both steps are optional.
-*
-*  Balancing may reduce the 1-norm of the matrices, and improve the
-*  accuracy of the computed eigenvalues and/or eigenvectors in the
-*  generalized eigenvalue problem A*x = lambda*B*x.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies the operations to be performed on A and B:
-*          = 'N':  none:  simply set ILO = 1, IHI = N, LSCALE(I) = 1.0
-*                  and RSCALE(I) = 1.0 for i = 1,...,N.
-*          = 'P':  permute only;
-*          = 'S':  scale only;
-*          = 'B':  both permute and scale.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the input matrix A.
-*          On exit,  A is overwritten by the balanced matrix.
-*          If JOB = 'N', A is not referenced.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,N).
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,N)
-*          On entry, the input matrix B.
-*          On exit,  B is overwritten by the balanced matrix.
-*          If JOB = 'N', B is not referenced.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B. LDB >= max(1,N).
-*
-*  ILO     (output) INTEGER
-*  IHI     (output) INTEGER
-*          ILO and IHI are set to integers such that on exit
-*          A(i,j) = 0 and B(i,j) = 0 if i > j and
-*          j = 1,...,ILO-1 or i = IHI+1,...,N.
-*          If JOB = 'N' or 'S', ILO = 1 and IHI = N.
-*
-*  LSCALE  (output) DOUBLE PRECISION array, dimension (N)
-*          Details of the permutations and scaling factors applied
-*          to the left side of A and B.  If P(j) is the index of the
-*          row interchanged with row j, and D(j)
-*          is the scaling factor applied to row j, then
-*            LSCALE(j) = P(j)    for J = 1,...,ILO-1
-*                      = D(j)    for J = ILO,...,IHI
-*                      = P(j)    for J = IHI+1,...,N.
-*          The order in which the interchanges are made is N to IHI+1,
-*          then 1 to ILO-1.
-*
-*  RSCALE  (output) DOUBLE PRECISION array, dimension (N)
-*          Details of the permutations and scaling factors applied
-*          to the right side of A and B.  If P(j) is the index of the
-*          column interchanged with column j, and D(j)
-*          is the scaling factor applied to column j, then
-*            LSCALE(j) = P(j)    for J = 1,...,ILO-1
-*                      = D(j)    for J = ILO,...,IHI
-*                      = P(j)    for J = IHI+1,...,N.
-*          The order in which the interchanges are made is N to IHI+1,
-*          then 1 to ILO-1.
-*
-*  WORK    (workspace) REAL array, dimension (lwork)
-*          lwork must be at least max(1,6*N) when JOB = 'S' or 'B', and
-*          at least 1 when JOB = 'N' or 'P'.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  See R.C. WARD, Balancing the generalized eigenvalue problem,
-*                 SIAM J. Sci. Stat. Comp. 2 (1981), 141-152.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, HALF, ONE
-      PARAMETER          ( ZERO = 0.0D+0, HALF = 0.5D+0, ONE = 1.0D+0 )
-      DOUBLE PRECISION   THREE, SCLFAC
-      PARAMETER          ( THREE = 3.0D+0, SCLFAC = 1.0D+1 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ICAB, IFLOW, IP1, IR, IRAB, IT, J, JC, JP1,
-     $                   K, KOUNT, L, LCAB, LM1, LRAB, LSFMAX, LSFMIN,
-     $                   M, NR, NRP2
-      DOUBLE PRECISION   ALPHA, BASL, BETA, CAB, CMAX, COEF, COEF2,
-     $                   COEF5, COR, EW, EWC, GAMMA, PGAMMA, RAB, SFMAX,
-     $                   SFMIN, SUM, T, TA, TB, TC
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DDOT, DLAMCH
-      EXTERNAL           LSAME, IDAMAX, DDOT, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DAXPY, DSCAL, DSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, INT, LOG10, MAX, MIN, SIGN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
-     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGGBAL', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         ILO = 1
-         IHI = N
-         RETURN
-      END IF
-*
-      IF( N.EQ.1 ) THEN
-         ILO = 1
-         IHI = N
-         LSCALE( 1 ) = ONE
-         RSCALE( 1 ) = ONE
-         RETURN
-      END IF
-*
-      IF( LSAME( JOB, 'N' ) ) THEN
-         ILO = 1
-         IHI = N
-         DO 10 I = 1, N
-            LSCALE( I ) = ONE
-            RSCALE( I ) = ONE
-   10    CONTINUE
-         RETURN
-      END IF
-*
-      K = 1
-      L = N
-      IF( LSAME( JOB, 'S' ) )
-     $   GO TO 190
-*
-      GO TO 30
-*
-*     Permute the matrices A and B to isolate the eigenvalues.
-*
-*     Find row with one nonzero in columns 1 through L
-*
-   20 CONTINUE
-      L = LM1
-      IF( L.NE.1 )
-     $   GO TO 30
-*
-      RSCALE( 1 ) = ONE
-      LSCALE( 1 ) = ONE
-      GO TO 190
-*
-   30 CONTINUE
-      LM1 = L - 1
-      DO 80 I = L, 1, -1
-         DO 40 J = 1, LM1
-            JP1 = J + 1
-            IF( A( I, J ).NE.ZERO .OR. B( I, J ).NE.ZERO )
-     $         GO TO 50
-   40    CONTINUE
-         J = L
-         GO TO 70
-*
-   50    CONTINUE
-         DO 60 J = JP1, L
-            IF( A( I, J ).NE.ZERO .OR. B( I, J ).NE.ZERO )
-     $         GO TO 80
-   60    CONTINUE
-         J = JP1 - 1
-*
-   70    CONTINUE
-         M = L
-         IFLOW = 1
-         GO TO 160
-   80 CONTINUE
-      GO TO 100
-*
-*     Find column with one nonzero in rows K through N
-*
-   90 CONTINUE
-      K = K + 1
-*
-  100 CONTINUE
-      DO 150 J = K, L
-         DO 110 I = K, LM1
-            IP1 = I + 1
-            IF( A( I, J ).NE.ZERO .OR. B( I, J ).NE.ZERO )
-     $         GO TO 120
-  110    CONTINUE
-         I = L
-         GO TO 140
-  120    CONTINUE
-         DO 130 I = IP1, L
-            IF( A( I, J ).NE.ZERO .OR. B( I, J ).NE.ZERO )
-     $         GO TO 150
-  130    CONTINUE
-         I = IP1 - 1
-  140    CONTINUE
-         M = K
-         IFLOW = 2
-         GO TO 160
-  150 CONTINUE
-      GO TO 190
-*
-*     Permute rows M and I
-*
-  160 CONTINUE
-      LSCALE( M ) = I
-      IF( I.EQ.M )
-     $   GO TO 170
-      CALL DSWAP( N-K+1, A( I, K ), LDA, A( M, K ), LDA )
-      CALL DSWAP( N-K+1, B( I, K ), LDB, B( M, K ), LDB )
-*
-*     Permute columns M and J
-*
-  170 CONTINUE
-      RSCALE( M ) = J
-      IF( J.EQ.M )
-     $   GO TO 180
-      CALL DSWAP( L, A( 1, J ), 1, A( 1, M ), 1 )
-      CALL DSWAP( L, B( 1, J ), 1, B( 1, M ), 1 )
-*
-  180 CONTINUE
-      GO TO ( 20, 90 )IFLOW
-*
-  190 CONTINUE
-      ILO = K
-      IHI = L
-*
-      IF( LSAME( JOB, 'P' ) ) THEN
-         DO 195 I = ILO, IHI
-            LSCALE( I ) = ONE
-            RSCALE( I ) = ONE
-  195    CONTINUE
-         RETURN
-      END IF
-*
-      IF( ILO.EQ.IHI )
-     $   RETURN
-*
-*     Balance the submatrix in rows ILO to IHI.
-*
-      NR = IHI - ILO + 1
-      DO 200 I = ILO, IHI
-         RSCALE( I ) = ZERO
-         LSCALE( I ) = ZERO
-*
-         WORK( I ) = ZERO
-         WORK( I+N ) = ZERO
-         WORK( I+2*N ) = ZERO
-         WORK( I+3*N ) = ZERO
-         WORK( I+4*N ) = ZERO
-         WORK( I+5*N ) = ZERO
-  200 CONTINUE
-*
-*     Compute right side vector in resulting linear equations
-*
-      BASL = LOG10( SCLFAC )
-      DO 240 I = ILO, IHI
-         DO 230 J = ILO, IHI
-            TB = B( I, J )
-            TA = A( I, J )
-            IF( TA.EQ.ZERO )
-     $         GO TO 210
-            TA = LOG10( ABS( TA ) ) / BASL
-  210       CONTINUE
-            IF( TB.EQ.ZERO )
-     $         GO TO 220
-            TB = LOG10( ABS( TB ) ) / BASL
-  220       CONTINUE
-            WORK( I+4*N ) = WORK( I+4*N ) - TA - TB
-            WORK( J+5*N ) = WORK( J+5*N ) - TA - TB
-  230    CONTINUE
-  240 CONTINUE
-*
-      COEF = ONE / DBLE( 2*NR )
-      COEF2 = COEF*COEF
-      COEF5 = HALF*COEF2
-      NRP2 = NR + 2
-      BETA = ZERO
-      IT = 1
-*
-*     Start generalized conjugate gradient iteration
-*
-  250 CONTINUE
-*
-      GAMMA = DDOT( NR, WORK( ILO+4*N ), 1, WORK( ILO+4*N ), 1 ) +
-     $        DDOT( NR, WORK( ILO+5*N ), 1, WORK( ILO+5*N ), 1 )
-*
-      EW = ZERO
-      EWC = ZERO
-      DO 260 I = ILO, IHI
-         EW = EW + WORK( I+4*N )
-         EWC = EWC + WORK( I+5*N )
-  260 CONTINUE
-*
-      GAMMA = COEF*GAMMA - COEF2*( EW**2+EWC**2 ) - COEF5*( EW-EWC )**2
-      IF( GAMMA.EQ.ZERO )
-     $   GO TO 350
-      IF( IT.NE.1 )
-     $   BETA = GAMMA / PGAMMA
-      T = COEF5*( EWC-THREE*EW )
-      TC = COEF5*( EW-THREE*EWC )
-*
-      CALL DSCAL( NR, BETA, WORK( ILO ), 1 )
-      CALL DSCAL( NR, BETA, WORK( ILO+N ), 1 )
-*
-      CALL DAXPY( NR, COEF, WORK( ILO+4*N ), 1, WORK( ILO+N ), 1 )
-      CALL DAXPY( NR, COEF, WORK( ILO+5*N ), 1, WORK( ILO ), 1 )
-*
-      DO 270 I = ILO, IHI
-         WORK( I ) = WORK( I ) + TC
-         WORK( I+N ) = WORK( I+N ) + T
-  270 CONTINUE
-*
-*     Apply matrix to vector
-*
-      DO 300 I = ILO, IHI
-         KOUNT = 0
-         SUM = ZERO
-         DO 290 J = ILO, IHI
-            IF( A( I, J ).EQ.ZERO )
-     $         GO TO 280
-            KOUNT = KOUNT + 1
-            SUM = SUM + WORK( J )
-  280       CONTINUE
-            IF( B( I, J ).EQ.ZERO )
-     $         GO TO 290
-            KOUNT = KOUNT + 1
-            SUM = SUM + WORK( J )
-  290    CONTINUE
-         WORK( I+2*N ) = DBLE( KOUNT )*WORK( I+N ) + SUM
-  300 CONTINUE
-*
-      DO 330 J = ILO, IHI
-         KOUNT = 0
-         SUM = ZERO
-         DO 320 I = ILO, IHI
-            IF( A( I, J ).EQ.ZERO )
-     $         GO TO 310
-            KOUNT = KOUNT + 1
-            SUM = SUM + WORK( I+N )
-  310       CONTINUE
-            IF( B( I, J ).EQ.ZERO )
-     $         GO TO 320
-            KOUNT = KOUNT + 1
-            SUM = SUM + WORK( I+N )
-  320    CONTINUE
-         WORK( J+3*N ) = DBLE( KOUNT )*WORK( J ) + SUM
-  330 CONTINUE
-*
-      SUM = DDOT( NR, WORK( ILO+N ), 1, WORK( ILO+2*N ), 1 ) +
-     $      DDOT( NR, WORK( ILO ), 1, WORK( ILO+3*N ), 1 )
-      ALPHA = GAMMA / SUM
-*
-*     Determine correction to current iteration
-*
-      CMAX = ZERO
-      DO 340 I = ILO, IHI
-         COR = ALPHA*WORK( I+N )
-         IF( ABS( COR ).GT.CMAX )
-     $      CMAX = ABS( COR )
-         LSCALE( I ) = LSCALE( I ) + COR
-         COR = ALPHA*WORK( I )
-         IF( ABS( COR ).GT.CMAX )
-     $      CMAX = ABS( COR )
-         RSCALE( I ) = RSCALE( I ) + COR
-  340 CONTINUE
-      IF( CMAX.LT.HALF )
-     $   GO TO 350
-*
-      CALL DAXPY( NR, -ALPHA, WORK( ILO+2*N ), 1, WORK( ILO+4*N ), 1 )
-      CALL DAXPY( NR, -ALPHA, WORK( ILO+3*N ), 1, WORK( ILO+5*N ), 1 )
-*
-      PGAMMA = GAMMA
-      IT = IT + 1
-      IF( IT.LE.NRP2 )
-     $   GO TO 250
-*
-*     End generalized conjugate gradient iteration
-*
-  350 CONTINUE
-      SFMIN = DLAMCH( 'S' )
-      SFMAX = ONE / SFMIN
-      LSFMIN = INT( LOG10( SFMIN ) / BASL+ONE )
-      LSFMAX = INT( LOG10( SFMAX ) / BASL )
-      DO 360 I = ILO, IHI
-         IRAB = IDAMAX( N-ILO+1, A( I, ILO ), LDA )
-         RAB = ABS( A( I, IRAB+ILO-1 ) )
-         IRAB = IDAMAX( N-ILO+1, B( I, ILO ), LDB )
-         RAB = MAX( RAB, ABS( B( I, IRAB+ILO-1 ) ) )
-         LRAB = INT( LOG10( RAB+SFMIN ) / BASL+ONE )
-         IR = LSCALE( I ) + SIGN( HALF, LSCALE( I ) )
-         IR = MIN( MAX( IR, LSFMIN ), LSFMAX, LSFMAX-LRAB )
-         LSCALE( I ) = SCLFAC**IR
-         ICAB = IDAMAX( IHI, A( 1, I ), 1 )
-         CAB = ABS( A( ICAB, I ) )
-         ICAB = IDAMAX( IHI, B( 1, I ), 1 )
-         CAB = MAX( CAB, ABS( B( ICAB, I ) ) )
-         LCAB = INT( LOG10( CAB+SFMIN ) / BASL+ONE )
-         JC = RSCALE( I ) + SIGN( HALF, RSCALE( I ) )
-         JC = MIN( MAX( JC, LSFMIN ), LSFMAX, LSFMAX-LCAB )
-         RSCALE( I ) = SCLFAC**JC
-  360 CONTINUE
-*
-*     Row scaling of matrices A and B
-*
-      DO 370 I = ILO, IHI
-         CALL DSCAL( N-ILO+1, LSCALE( I ), A( I, ILO ), LDA )
-         CALL DSCAL( N-ILO+1, LSCALE( I ), B( I, ILO ), LDB )
-  370 CONTINUE
-*
-*     Column scaling of matrices A and B
-*
-      DO 380 J = ILO, IHI
-         CALL DSCAL( IHI, RSCALE( J ), A( 1, J ), 1 )
-         CALL DSCAL( IHI, RSCALE( J ), B( 1, J ), 1 )
-  380 CONTINUE
-*
-      RETURN
-*
-*     End of DGGBAL
-*
-      END
--- a/libcruft/lapack/dggev.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,489 +0,0 @@
-      SUBROUTINE DGGEV( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR, ALPHAI,
-     $                  BETA, VL, LDVL, VR, LDVR, WORK, LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBVL, JOBVR
-      INTEGER            INFO, LDA, LDB, LDVL, LDVR, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), ALPHAI( * ), ALPHAR( * ),
-     $                   B( LDB, * ), BETA( * ), VL( LDVL, * ),
-     $                   VR( LDVR, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGGEV computes for a pair of N-by-N real nonsymmetric matrices (A,B)
-*  the generalized eigenvalues, and optionally, the left and/or right
-*  generalized eigenvectors.
-*
-*  A generalized eigenvalue for a pair of matrices (A,B) is a scalar
-*  lambda or a ratio alpha/beta = lambda, such that A - lambda*B is
-*  singular. It is usually represented as the pair (alpha,beta), as
-*  there is a reasonable interpretation for beta=0, and even for both
-*  being zero.
-*
-*  The right eigenvector v(j) corresponding to the eigenvalue lambda(j)
-*  of (A,B) satisfies
-*
-*                   A * v(j) = lambda(j) * B * v(j).
-*
-*  The left eigenvector u(j) corresponding to the eigenvalue lambda(j)
-*  of (A,B) satisfies
-*
-*                   u(j)**H * A  = lambda(j) * u(j)**H * B .
-*
-*  where u(j)**H is the conjugate-transpose of u(j).
-*
-*
-*  Arguments
-*  =========
-*
-*  JOBVL   (input) CHARACTER*1
-*          = 'N':  do not compute the left generalized eigenvectors;
-*          = 'V':  compute the left generalized eigenvectors.
-*
-*  JOBVR   (input) CHARACTER*1
-*          = 'N':  do not compute the right generalized eigenvectors;
-*          = 'V':  compute the right generalized eigenvectors.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A, B, VL, and VR.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA, N)
-*          On entry, the matrix A in the pair (A,B).
-*          On exit, A has been overwritten.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of A.  LDA >= max(1,N).
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB, N)
-*          On entry, the matrix B in the pair (A,B).
-*          On exit, B has been overwritten.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of B.  LDB >= max(1,N).
-*
-*  ALPHAR  (output) DOUBLE PRECISION array, dimension (N)
-*  ALPHAI  (output) DOUBLE PRECISION array, dimension (N)
-*  BETA    (output) DOUBLE PRECISION array, dimension (N)
-*          On exit, (ALPHAR(j) + ALPHAI(j)*i)/BETA(j), j=1,...,N, will
-*          be the generalized eigenvalues.  If ALPHAI(j) is zero, then
-*          the j-th eigenvalue is real; if positive, then the j-th and
-*          (j+1)-st eigenvalues are a complex conjugate pair, with
-*          ALPHAI(j+1) negative.
-*
-*          Note: the quotients ALPHAR(j)/BETA(j) and ALPHAI(j)/BETA(j)
-*          may easily over- or underflow, and BETA(j) may even be zero.
-*          Thus, the user should avoid naively computing the ratio
-*          alpha/beta.  However, ALPHAR and ALPHAI will be always less
-*          than and usually comparable with norm(A) in magnitude, and
-*          BETA always less than and usually comparable with norm(B).
-*
-*  VL      (output) DOUBLE PRECISION array, dimension (LDVL,N)
-*          If JOBVL = 'V', the left eigenvectors u(j) are stored one
-*          after another in the columns of VL, in the same order as
-*          their eigenvalues. If the j-th eigenvalue is real, then
-*          u(j) = VL(:,j), the j-th column of VL. If the j-th and
-*          (j+1)-th eigenvalues form a complex conjugate pair, then
-*          u(j) = VL(:,j)+i*VL(:,j+1) and u(j+1) = VL(:,j)-i*VL(:,j+1).
-*          Each eigenvector is scaled so the largest component has
-*          abs(real part)+abs(imag. part)=1.
-*          Not referenced if JOBVL = 'N'.
-*
-*  LDVL    (input) INTEGER
-*          The leading dimension of the matrix VL. LDVL >= 1, and
-*          if JOBVL = 'V', LDVL >= N.
-*
-*  VR      (output) DOUBLE PRECISION array, dimension (LDVR,N)
-*          If JOBVR = 'V', the right eigenvectors v(j) are stored one
-*          after another in the columns of VR, in the same order as
-*          their eigenvalues. If the j-th eigenvalue is real, then
-*          v(j) = VR(:,j), the j-th column of VR. If the j-th and
-*          (j+1)-th eigenvalues form a complex conjugate pair, then
-*          v(j) = VR(:,j)+i*VR(:,j+1) and v(j+1) = VR(:,j)-i*VR(:,j+1).
-*          Each eigenvector is scaled so the largest component has
-*          abs(real part)+abs(imag. part)=1.
-*          Not referenced if JOBVR = 'N'.
-*
-*  LDVR    (input) INTEGER
-*          The leading dimension of the matrix VR. LDVR >= 1, and
-*          if JOBVR = 'V', LDVR >= N.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,8*N).
-*          For good performance, LWORK must generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          = 1,...,N:
-*                The QZ iteration failed.  No eigenvectors have been
-*                calculated, but ALPHAR(j), ALPHAI(j), and BETA(j)
-*                should be correct for j=INFO+1,...,N.
-*          > N:  =N+1: other than QZ iteration failed in DHGEQZ.
-*                =N+2: error return from DTGEVC.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY
-      CHARACTER          CHTEMP
-      INTEGER            ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT, ILO,
-     $                   IN, IRIGHT, IROWS, ITAU, IWRK, JC, JR, MAXWRK,
-     $                   MINWRK
-      DOUBLE PRECISION   ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
-     $                   SMLNUM, TEMP
-*     ..
-*     .. Local Arrays ..
-      LOGICAL            LDUMMA( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEQRF, DGGBAK, DGGBAL, DGGHRD, DHGEQZ, DLABAD,
-     $                   DLACPY,DLASCL, DLASET, DORGQR, DORMQR, DTGEVC,
-     $                   XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      DOUBLE PRECISION   DLAMCH, DLANGE
-      EXTERNAL           LSAME, ILAENV, DLAMCH, DLANGE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode the input arguments
-*
-      IF( LSAME( JOBVL, 'N' ) ) THEN
-         IJOBVL = 1
-         ILVL = .FALSE.
-      ELSE IF( LSAME( JOBVL, 'V' ) ) THEN
-         IJOBVL = 2
-         ILVL = .TRUE.
-      ELSE
-         IJOBVL = -1
-         ILVL = .FALSE.
-      END IF
-*
-      IF( LSAME( JOBVR, 'N' ) ) THEN
-         IJOBVR = 1
-         ILVR = .FALSE.
-      ELSE IF( LSAME( JOBVR, 'V' ) ) THEN
-         IJOBVR = 2
-         ILVR = .TRUE.
-      ELSE
-         IJOBVR = -1
-         ILVR = .FALSE.
-      END IF
-      ILV = ILVL .OR. ILVR
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( IJOBVL.LE.0 ) THEN
-         INFO = -1
-      ELSE IF( IJOBVR.LE.0 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDVL.LT.1 .OR. ( ILVL .AND. LDVL.LT.N ) ) THEN
-         INFO = -12
-      ELSE IF( LDVR.LT.1 .OR. ( ILVR .AND. LDVR.LT.N ) ) THEN
-         INFO = -14
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of workspace needed at that point in the code,
-*       as well as the preferred amount for good performance.
-*       NB refers to the optimal block size for the immediately
-*       following subroutine, as returned by ILAENV. The workspace is
-*       computed assuming ILO = 1 and IHI = N, the worst case.)
-*
-      IF( INFO.EQ.0 ) THEN
-         MINWRK = MAX( 1, 8*N )
-         MAXWRK = MAX( 1, N*( 7 +
-     $                 ILAENV( 1, 'DGEQRF', ' ', N, 1, N, 0 ) ) )
-         MAXWRK = MAX( MAXWRK, N*( 7 +
-     $                 ILAENV( 1, 'DORMQR', ' ', N, 1, N, 0 ) ) )
-         IF( ILVL ) THEN
-            MAXWRK = MAX( MAXWRK, N*( 7 +
-     $                 ILAENV( 1, 'DORGQR', ' ', N, 1, N, -1 ) ) )
-         END IF
-         WORK( 1 ) = MAXWRK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY )
-     $      INFO = -16
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGGEV ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Get machine constants
-*
-      EPS = DLAMCH( 'P' )
-      SMLNUM = DLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SQRT( SMLNUM ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = DLANGE( 'M', N, N, A, LDA, WORK )
-      ILASCL = .FALSE.
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-         ANRMTO = SMLNUM
-         ILASCL = .TRUE.
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-         ANRMTO = BIGNUM
-         ILASCL = .TRUE.
-      END IF
-      IF( ILASCL )
-     $   CALL DLASCL( 'G', 0, 0, ANRM, ANRMTO, N, N, A, LDA, IERR )
-*
-*     Scale B if max element outside range [SMLNUM,BIGNUM]
-*
-      BNRM = DLANGE( 'M', N, N, B, LDB, WORK )
-      ILBSCL = .FALSE.
-      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
-         BNRMTO = SMLNUM
-         ILBSCL = .TRUE.
-      ELSE IF( BNRM.GT.BIGNUM ) THEN
-         BNRMTO = BIGNUM
-         ILBSCL = .TRUE.
-      END IF
-      IF( ILBSCL )
-     $   CALL DLASCL( 'G', 0, 0, BNRM, BNRMTO, N, N, B, LDB, IERR )
-*
-*     Permute the matrices A, B to isolate eigenvalues if possible
-*     (Workspace: need 6*N)
-*
-      ILEFT = 1
-      IRIGHT = N + 1
-      IWRK = IRIGHT + N
-      CALL DGGBAL( 'P', N, A, LDA, B, LDB, ILO, IHI, WORK( ILEFT ),
-     $             WORK( IRIGHT ), WORK( IWRK ), IERR )
-*
-*     Reduce B to triangular form (QR decomposition of B)
-*     (Workspace: need N, prefer N*NB)
-*
-      IROWS = IHI + 1 - ILO
-      IF( ILV ) THEN
-         ICOLS = N + 1 - ILO
-      ELSE
-         ICOLS = IROWS
-      END IF
-      ITAU = IWRK
-      IWRK = ITAU + IROWS
-      CALL DGEQRF( IROWS, ICOLS, B( ILO, ILO ), LDB, WORK( ITAU ),
-     $             WORK( IWRK ), LWORK+1-IWRK, IERR )
-*
-*     Apply the orthogonal transformation to matrix A
-*     (Workspace: need N, prefer N*NB)
-*
-      CALL DORMQR( 'L', 'T', IROWS, ICOLS, IROWS, B( ILO, ILO ), LDB,
-     $             WORK( ITAU ), A( ILO, ILO ), LDA, WORK( IWRK ),
-     $             LWORK+1-IWRK, IERR )
-*
-*     Initialize VL
-*     (Workspace: need N, prefer N*NB)
-*
-      IF( ILVL ) THEN
-         CALL DLASET( 'Full', N, N, ZERO, ONE, VL, LDVL )
-         IF( IROWS.GT.1 ) THEN
-            CALL DLACPY( 'L', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
-     $                   VL( ILO+1, ILO ), LDVL )
-         END IF
-         CALL DORGQR( IROWS, IROWS, IROWS, VL( ILO, ILO ), LDVL,
-     $                WORK( ITAU ), WORK( IWRK ), LWORK+1-IWRK, IERR )
-      END IF
-*
-*     Initialize VR
-*
-      IF( ILVR )
-     $   CALL DLASET( 'Full', N, N, ZERO, ONE, VR, LDVR )
-*
-*     Reduce to generalized Hessenberg form
-*     (Workspace: none needed)
-*
-      IF( ILV ) THEN
-*
-*        Eigenvectors requested -- work on whole matrix.
-*
-         CALL DGGHRD( JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB, VL,
-     $                LDVL, VR, LDVR, IERR )
-      ELSE
-         CALL DGGHRD( 'N', 'N', IROWS, 1, IROWS, A( ILO, ILO ), LDA,
-     $                B( ILO, ILO ), LDB, VL, LDVL, VR, LDVR, IERR )
-      END IF
-*
-*     Perform QZ algorithm (Compute eigenvalues, and optionally, the
-*     Schur forms and Schur vectors)
-*     (Workspace: need N)
-*
-      IWRK = ITAU
-      IF( ILV ) THEN
-         CHTEMP = 'S'
-      ELSE
-         CHTEMP = 'E'
-      END IF
-      CALL DHGEQZ( CHTEMP, JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB,
-     $             ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR,
-     $             WORK( IWRK ), LWORK+1-IWRK, IERR )
-      IF( IERR.NE.0 ) THEN
-         IF( IERR.GT.0 .AND. IERR.LE.N ) THEN
-            INFO = IERR
-         ELSE IF( IERR.GT.N .AND. IERR.LE.2*N ) THEN
-            INFO = IERR - N
-         ELSE
-            INFO = N + 1
-         END IF
-         GO TO 110
-      END IF
-*
-*     Compute Eigenvectors
-*     (Workspace: need 6*N)
-*
-      IF( ILV ) THEN
-         IF( ILVL ) THEN
-            IF( ILVR ) THEN
-               CHTEMP = 'B'
-            ELSE
-               CHTEMP = 'L'
-            END IF
-         ELSE
-            CHTEMP = 'R'
-         END IF
-         CALL DTGEVC( CHTEMP, 'B', LDUMMA, N, A, LDA, B, LDB, VL, LDVL,
-     $                VR, LDVR, N, IN, WORK( IWRK ), IERR )
-         IF( IERR.NE.0 ) THEN
-            INFO = N + 2
-            GO TO 110
-         END IF
-*
-*        Undo balancing on VL and VR and normalization
-*        (Workspace: none needed)
-*
-         IF( ILVL ) THEN
-            CALL DGGBAK( 'P', 'L', N, ILO, IHI, WORK( ILEFT ),
-     $                   WORK( IRIGHT ), N, VL, LDVL, IERR )
-            DO 50 JC = 1, N
-               IF( ALPHAI( JC ).LT.ZERO )
-     $            GO TO 50
-               TEMP = ZERO
-               IF( ALPHAI( JC ).EQ.ZERO ) THEN
-                  DO 10 JR = 1, N
-                     TEMP = MAX( TEMP, ABS( VL( JR, JC ) ) )
-   10             CONTINUE
-               ELSE
-                  DO 20 JR = 1, N
-                     TEMP = MAX( TEMP, ABS( VL( JR, JC ) )+
-     $                      ABS( VL( JR, JC+1 ) ) )
-   20             CONTINUE
-               END IF
-               IF( TEMP.LT.SMLNUM )
-     $            GO TO 50
-               TEMP = ONE / TEMP
-               IF( ALPHAI( JC ).EQ.ZERO ) THEN
-                  DO 30 JR = 1, N
-                     VL( JR, JC ) = VL( JR, JC )*TEMP
-   30             CONTINUE
-               ELSE
-                  DO 40 JR = 1, N
-                     VL( JR, JC ) = VL( JR, JC )*TEMP
-                     VL( JR, JC+1 ) = VL( JR, JC+1 )*TEMP
-   40             CONTINUE
-               END IF
-   50       CONTINUE
-         END IF
-         IF( ILVR ) THEN
-            CALL DGGBAK( 'P', 'R', N, ILO, IHI, WORK( ILEFT ),
-     $                   WORK( IRIGHT ), N, VR, LDVR, IERR )
-            DO 100 JC = 1, N
-               IF( ALPHAI( JC ).LT.ZERO )
-     $            GO TO 100
-               TEMP = ZERO
-               IF( ALPHAI( JC ).EQ.ZERO ) THEN
-                  DO 60 JR = 1, N
-                     TEMP = MAX( TEMP, ABS( VR( JR, JC ) ) )
-   60             CONTINUE
-               ELSE
-                  DO 70 JR = 1, N
-                     TEMP = MAX( TEMP, ABS( VR( JR, JC ) )+
-     $                      ABS( VR( JR, JC+1 ) ) )
-   70             CONTINUE
-               END IF
-               IF( TEMP.LT.SMLNUM )
-     $            GO TO 100
-               TEMP = ONE / TEMP
-               IF( ALPHAI( JC ).EQ.ZERO ) THEN
-                  DO 80 JR = 1, N
-                     VR( JR, JC ) = VR( JR, JC )*TEMP
-   80             CONTINUE
-               ELSE
-                  DO 90 JR = 1, N
-                     VR( JR, JC ) = VR( JR, JC )*TEMP
-                     VR( JR, JC+1 ) = VR( JR, JC+1 )*TEMP
-   90             CONTINUE
-               END IF
-  100       CONTINUE
-         END IF
-*
-*        End of eigenvector calculation
-*
-      END IF
-*
-*     Undo scaling if necessary
-*
-      IF( ILASCL ) THEN
-         CALL DLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHAR, N, IERR )
-         CALL DLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHAI, N, IERR )
-      END IF
-*
-      IF( ILBSCL ) THEN
-         CALL DLASCL( 'G', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
-      END IF
-*
-  110 CONTINUE
-*
-      WORK( 1 ) = MAXWRK
-*
-      RETURN
-*
-*     End of DGGEV
-*
-      END
--- a/libcruft/lapack/dgghrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,264 +0,0 @@
-      SUBROUTINE DGGHRD( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
-     $                   LDQ, Z, LDZ, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPQ, COMPZ
-      INTEGER            IHI, ILO, INFO, LDA, LDB, LDQ, LDZ, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
-     $                   Z( LDZ, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGGHRD reduces a pair of real matrices (A,B) to generalized upper
-*  Hessenberg form using orthogonal transformations, where A is a
-*  general matrix and B is upper triangular.  The form of the
-*  generalized eigenvalue problem is
-*     A*x = lambda*B*x,
-*  and B is typically made upper triangular by computing its QR
-*  factorization and moving the orthogonal matrix Q to the left side
-*  of the equation.
-*
-*  This subroutine simultaneously reduces A to a Hessenberg matrix H:
-*     Q**T*A*Z = H
-*  and transforms B to another upper triangular matrix T:
-*     Q**T*B*Z = T
-*  in order to reduce the problem to its standard form
-*     H*y = lambda*T*y
-*  where y = Z**T*x.
-*
-*  The orthogonal matrices Q and Z are determined as products of Givens
-*  rotations.  They may either be formed explicitly, or they may be
-*  postmultiplied into input matrices Q1 and Z1, so that
-*
-*       Q1 * A * Z1**T = (Q1*Q) * H * (Z1*Z)**T
-*
-*       Q1 * B * Z1**T = (Q1*Q) * T * (Z1*Z)**T
-*
-*  If Q1 is the orthogonal matrix from the QR factorization of B in the
-*  original equation A*x = lambda*B*x, then DGGHRD reduces the original
-*  problem to generalized Hessenberg form.
-*
-*  Arguments
-*  =========
-*
-*  COMPQ   (input) CHARACTER*1
-*          = 'N': do not compute Q;
-*          = 'I': Q is initialized to the unit matrix, and the
-*                 orthogonal matrix Q is returned;
-*          = 'V': Q must contain an orthogonal matrix Q1 on entry,
-*                 and the product Q1*Q is returned.
-*
-*  COMPZ   (input) CHARACTER*1
-*          = 'N': do not compute Z;
-*          = 'I': Z is initialized to the unit matrix, and the
-*                 orthogonal matrix Z is returned;
-*          = 'V': Z must contain an orthogonal matrix Z1 on entry,
-*                 and the product Z1*Z is returned.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          ILO and IHI mark the rows and columns of A which are to be
-*          reduced.  It is assumed that A is already upper triangular
-*          in rows and columns 1:ILO-1 and IHI+1:N.  ILO and IHI are
-*          normally set by a previous call to SGGBAL; otherwise they
-*          should be set to 1 and N respectively.
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA, N)
-*          On entry, the N-by-N general matrix to be reduced.
-*          On exit, the upper triangle and the first subdiagonal of A
-*          are overwritten with the upper Hessenberg matrix H, and the
-*          rest is set to zero.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB, N)
-*          On entry, the N-by-N upper triangular matrix B.
-*          On exit, the upper triangular matrix T = Q**T B Z.  The
-*          elements below the diagonal are set to zero.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  Q       (input/output) DOUBLE PRECISION array, dimension (LDQ, N)
-*          On entry, if COMPQ = 'V', the orthogonal matrix Q1,
-*          typically from the QR factorization of B.
-*          On exit, if COMPQ='I', the orthogonal matrix Q, and if
-*          COMPQ = 'V', the product Q1*Q.
-*          Not referenced if COMPQ='N'.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.
-*          LDQ >= N if COMPQ='V' or 'I'; LDQ >= 1 otherwise.
-*
-*  Z       (input/output) DOUBLE PRECISION array, dimension (LDZ, N)
-*          On entry, if COMPZ = 'V', the orthogonal matrix Z1.
-*          On exit, if COMPZ='I', the orthogonal matrix Z, and if
-*          COMPZ = 'V', the product Z1*Z.
-*          Not referenced if COMPZ='N'.
-*
-*  LDZ     (input) INTEGER
-*          The leading dimension of the array Z.
-*          LDZ >= N if COMPZ='V' or 'I'; LDZ >= 1 otherwise.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  This routine reduces A to Hessenberg and B to triangular form by
-*  an unblocked reduction, as described in _Matrix_Computations_,
-*  by Golub and Van Loan (Johns Hopkins Press.)
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ILQ, ILZ
-      INTEGER            ICOMPQ, ICOMPZ, JCOL, JROW
-      DOUBLE PRECISION   C, S, TEMP
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARTG, DLASET, DROT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode COMPQ
-*
-      IF( LSAME( COMPQ, 'N' ) ) THEN
-         ILQ = .FALSE.
-         ICOMPQ = 1
-      ELSE IF( LSAME( COMPQ, 'V' ) ) THEN
-         ILQ = .TRUE.
-         ICOMPQ = 2
-      ELSE IF( LSAME( COMPQ, 'I' ) ) THEN
-         ILQ = .TRUE.
-         ICOMPQ = 3
-      ELSE
-         ICOMPQ = 0
-      END IF
-*
-*     Decode COMPZ
-*
-      IF( LSAME( COMPZ, 'N' ) ) THEN
-         ILZ = .FALSE.
-         ICOMPZ = 1
-      ELSE IF( LSAME( COMPZ, 'V' ) ) THEN
-         ILZ = .TRUE.
-         ICOMPZ = 2
-      ELSE IF( LSAME( COMPZ, 'I' ) ) THEN
-         ILZ = .TRUE.
-         ICOMPZ = 3
-      ELSE
-         ICOMPZ = 0
-      END IF
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( ICOMPQ.LE.0 ) THEN
-         INFO = -1
-      ELSE IF( ICOMPZ.LE.0 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ILO.LT.1 ) THEN
-         INFO = -4
-      ELSE IF( IHI.GT.N .OR. IHI.LT.ILO-1 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -9
-      ELSE IF( ( ILQ .AND. LDQ.LT.N ) .OR. LDQ.LT.1 ) THEN
-         INFO = -11
-      ELSE IF( ( ILZ .AND. LDZ.LT.N ) .OR. LDZ.LT.1 ) THEN
-         INFO = -13
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGGHRD', -INFO )
-         RETURN
-      END IF
-*
-*     Initialize Q and Z if desired.
-*
-      IF( ICOMPQ.EQ.3 )
-     $   CALL DLASET( 'Full', N, N, ZERO, ONE, Q, LDQ )
-      IF( ICOMPZ.EQ.3 )
-     $   CALL DLASET( 'Full', N, N, ZERO, ONE, Z, LDZ )
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 )
-     $   RETURN
-*
-*     Zero out lower triangle of B
-*
-      DO 20 JCOL = 1, N - 1
-         DO 10 JROW = JCOL + 1, N
-            B( JROW, JCOL ) = ZERO
-   10    CONTINUE
-   20 CONTINUE
-*
-*     Reduce A and B
-*
-      DO 40 JCOL = ILO, IHI - 2
-*
-         DO 30 JROW = IHI, JCOL + 2, -1
-*
-*           Step 1: rotate rows JROW-1, JROW to kill A(JROW,JCOL)
-*
-            TEMP = A( JROW-1, JCOL )
-            CALL DLARTG( TEMP, A( JROW, JCOL ), C, S,
-     $                   A( JROW-1, JCOL ) )
-            A( JROW, JCOL ) = ZERO
-            CALL DROT( N-JCOL, A( JROW-1, JCOL+1 ), LDA,
-     $                 A( JROW, JCOL+1 ), LDA, C, S )
-            CALL DROT( N+2-JROW, B( JROW-1, JROW-1 ), LDB,
-     $                 B( JROW, JROW-1 ), LDB, C, S )
-            IF( ILQ )
-     $         CALL DROT( N, Q( 1, JROW-1 ), 1, Q( 1, JROW ), 1, C, S )
-*
-*           Step 2: rotate columns JROW, JROW-1 to kill B(JROW,JROW-1)
-*
-            TEMP = B( JROW, JROW )
-            CALL DLARTG( TEMP, B( JROW, JROW-1 ), C, S,
-     $                   B( JROW, JROW ) )
-            B( JROW, JROW-1 ) = ZERO
-            CALL DROT( IHI, A( 1, JROW ), 1, A( 1, JROW-1 ), 1, C, S )
-            CALL DROT( JROW-1, B( 1, JROW ), 1, B( 1, JROW-1 ), 1, C,
-     $                 S )
-            IF( ILZ )
-     $         CALL DROT( N, Z( 1, JROW ), 1, Z( 1, JROW-1 ), 1, C, S )
-   30    CONTINUE
-   40 CONTINUE
-*
-      RETURN
-*
-*     End of DGGHRD
-*
-      END
--- a/libcruft/lapack/dgtsv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,262 +0,0 @@
-      SUBROUTINE DGTSV( N, NRHS, DL, D, DU, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   B( LDB, * ), D( * ), DL( * ), DU( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGTSV  solves the equation
-*
-*     A*X = B,
-*
-*  where A is an n by n tridiagonal matrix, by Gaussian elimination with
-*  partial pivoting.
-*
-*  Note that the equation  A'*X = B  may be solved by interchanging the
-*  order of the arguments DU and DL.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  DL      (input/output) DOUBLE PRECISION array, dimension (N-1)
-*          On entry, DL must contain the (n-1) sub-diagonal elements of
-*          A.
-*
-*          On exit, DL is overwritten by the (n-2) elements of the
-*          second super-diagonal of the upper triangular matrix U from
-*          the LU factorization of A, in DL(1), ..., DL(n-2).
-*
-*  D       (input/output) DOUBLE PRECISION array, dimension (N)
-*          On entry, D must contain the diagonal elements of A.
-*
-*          On exit, D is overwritten by the n diagonal elements of U.
-*
-*  DU      (input/output) DOUBLE PRECISION array, dimension (N-1)
-*          On entry, DU must contain the (n-1) super-diagonal elements
-*          of A.
-*
-*          On exit, DU is overwritten by the (n-1) elements of the first
-*          super-diagonal of U.
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*          On entry, the N by NRHS matrix of right hand side matrix B.
-*          On exit, if INFO = 0, the N by NRHS solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = i, U(i,i) is exactly zero, and the solution
-*               has not been computed.  The factorization has not been
-*               completed unless i = N.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      DOUBLE PRECISION   FACT, TEMP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGTSV ', -INFO )
-         RETURN
-      END IF
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( NRHS.EQ.1 ) THEN
-         DO 10 I = 1, N - 2
-            IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
-*
-*              No row interchange required
-*
-               IF( D( I ).NE.ZERO ) THEN
-                  FACT = DL( I ) / D( I )
-                  D( I+1 ) = D( I+1 ) - FACT*DU( I )
-                  B( I+1, 1 ) = B( I+1, 1 ) - FACT*B( I, 1 )
-               ELSE
-                  INFO = I
-                  RETURN
-               END IF
-               DL( I ) = ZERO
-            ELSE
-*
-*              Interchange rows I and I+1
-*
-               FACT = D( I ) / DL( I )
-               D( I ) = DL( I )
-               TEMP = D( I+1 )
-               D( I+1 ) = DU( I ) - FACT*TEMP
-               DL( I ) = DU( I+1 )
-               DU( I+1 ) = -FACT*DL( I )
-               DU( I ) = TEMP
-               TEMP = B( I, 1 )
-               B( I, 1 ) = B( I+1, 1 )
-               B( I+1, 1 ) = TEMP - FACT*B( I+1, 1 )
-            END IF
-   10    CONTINUE
-         IF( N.GT.1 ) THEN
-            I = N - 1
-            IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
-               IF( D( I ).NE.ZERO ) THEN
-                  FACT = DL( I ) / D( I )
-                  D( I+1 ) = D( I+1 ) - FACT*DU( I )
-                  B( I+1, 1 ) = B( I+1, 1 ) - FACT*B( I, 1 )
-               ELSE
-                  INFO = I
-                  RETURN
-               END IF
-            ELSE
-               FACT = D( I ) / DL( I )
-               D( I ) = DL( I )
-               TEMP = D( I+1 )
-               D( I+1 ) = DU( I ) - FACT*TEMP
-               DU( I ) = TEMP
-               TEMP = B( I, 1 )
-               B( I, 1 ) = B( I+1, 1 )
-               B( I+1, 1 ) = TEMP - FACT*B( I+1, 1 )
-            END IF
-         END IF
-         IF( D( N ).EQ.ZERO ) THEN
-            INFO = N
-            RETURN
-         END IF
-      ELSE
-         DO 40 I = 1, N - 2
-            IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
-*
-*              No row interchange required
-*
-               IF( D( I ).NE.ZERO ) THEN
-                  FACT = DL( I ) / D( I )
-                  D( I+1 ) = D( I+1 ) - FACT*DU( I )
-                  DO 20 J = 1, NRHS
-                     B( I+1, J ) = B( I+1, J ) - FACT*B( I, J )
-   20             CONTINUE
-               ELSE
-                  INFO = I
-                  RETURN
-               END IF
-               DL( I ) = ZERO
-            ELSE
-*
-*              Interchange rows I and I+1
-*
-               FACT = D( I ) / DL( I )
-               D( I ) = DL( I )
-               TEMP = D( I+1 )
-               D( I+1 ) = DU( I ) - FACT*TEMP
-               DL( I ) = DU( I+1 )
-               DU( I+1 ) = -FACT*DL( I )
-               DU( I ) = TEMP
-               DO 30 J = 1, NRHS
-                  TEMP = B( I, J )
-                  B( I, J ) = B( I+1, J )
-                  B( I+1, J ) = TEMP - FACT*B( I+1, J )
-   30          CONTINUE
-            END IF
-   40    CONTINUE
-         IF( N.GT.1 ) THEN
-            I = N - 1
-            IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
-               IF( D( I ).NE.ZERO ) THEN
-                  FACT = DL( I ) / D( I )
-                  D( I+1 ) = D( I+1 ) - FACT*DU( I )
-                  DO 50 J = 1, NRHS
-                     B( I+1, J ) = B( I+1, J ) - FACT*B( I, J )
-   50             CONTINUE
-               ELSE
-                  INFO = I
-                  RETURN
-               END IF
-            ELSE
-               FACT = D( I ) / DL( I )
-               D( I ) = DL( I )
-               TEMP = D( I+1 )
-               D( I+1 ) = DU( I ) - FACT*TEMP
-               DU( I ) = TEMP
-               DO 60 J = 1, NRHS
-                  TEMP = B( I, J )
-                  B( I, J ) = B( I+1, J )
-                  B( I+1, J ) = TEMP - FACT*B( I+1, J )
-   60          CONTINUE
-            END IF
-         END IF
-         IF( D( N ).EQ.ZERO ) THEN
-            INFO = N
-            RETURN
-         END IF
-      END IF
-*
-*     Back solve with the matrix U from the factorization.
-*
-      IF( NRHS.LE.2 ) THEN
-         J = 1
-   70    CONTINUE
-         B( N, J ) = B( N, J ) / D( N )
-         IF( N.GT.1 )
-     $      B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / D( N-1 )
-         DO 80 I = N - 2, 1, -1
-            B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DL( I )*
-     $                  B( I+2, J ) ) / D( I )
-   80    CONTINUE
-         IF( J.LT.NRHS ) THEN
-            J = J + 1
-            GO TO 70
-         END IF
-      ELSE
-         DO 100 J = 1, NRHS
-            B( N, J ) = B( N, J ) / D( N )
-            IF( N.GT.1 )
-     $         B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) /
-     $                       D( N-1 )
-            DO 90 I = N - 2, 1, -1
-               B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DL( I )*
-     $                     B( I+2, J ) ) / D( I )
-   90       CONTINUE
-  100    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of DGTSV
-*
-      END
--- a/libcruft/lapack/dgttrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,168 +0,0 @@
-      SUBROUTINE DGTTRF( N, DL, D, DU, DU2, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      DOUBLE PRECISION   D( * ), DL( * ), DU( * ), DU2( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGTTRF computes an LU factorization of a real tridiagonal matrix A
-*  using elimination with partial pivoting and row interchanges.
-*
-*  The factorization has the form
-*     A = L * U
-*  where L is a product of permutation and unit lower bidiagonal
-*  matrices and U is upper triangular with nonzeros in only the main
-*  diagonal and first two superdiagonals.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  DL      (input/output) DOUBLE PRECISION array, dimension (N-1)
-*          On entry, DL must contain the (n-1) sub-diagonal elements of
-*          A.
-*
-*          On exit, DL is overwritten by the (n-1) multipliers that
-*          define the matrix L from the LU factorization of A.
-*
-*  D       (input/output) DOUBLE PRECISION array, dimension (N)
-*          On entry, D must contain the diagonal elements of A.
-*
-*          On exit, D is overwritten by the n diagonal elements of the
-*          upper triangular matrix U from the LU factorization of A.
-*
-*  DU      (input/output) DOUBLE PRECISION array, dimension (N-1)
-*          On entry, DU must contain the (n-1) super-diagonal elements
-*          of A.
-*
-*          On exit, DU is overwritten by the (n-1) elements of the first
-*          super-diagonal of U.
-*
-*  DU2     (output) DOUBLE PRECISION array, dimension (N-2)
-*          On exit, DU2 is overwritten by the (n-2) elements of the
-*          second super-diagonal of U.
-*
-*  IPIV    (output) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= n, row i of the matrix was
-*          interchanged with row IPIV(i).  IPIV(i) will always be either
-*          i or i+1; IPIV(i) = i indicates a row interchange was not
-*          required.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -k, the k-th argument had an illegal value
-*          > 0:  if INFO = k, U(k,k) is exactly zero. The factorization
-*                has been completed, but the factor U is exactly
-*                singular, and division by zero will occur if it is used
-*                to solve a system of equations.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      DOUBLE PRECISION   FACT, TEMP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-         CALL XERBLA( 'DGTTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Initialize IPIV(i) = i and DU2(I) = 0
-*
-      DO 10 I = 1, N
-         IPIV( I ) = I
-   10 CONTINUE
-      DO 20 I = 1, N - 2
-         DU2( I ) = ZERO
-   20 CONTINUE
-*
-      DO 30 I = 1, N - 2
-         IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
-*
-*           No row interchange required, eliminate DL(I)
-*
-            IF( D( I ).NE.ZERO ) THEN
-               FACT = DL( I ) / D( I )
-               DL( I ) = FACT
-               D( I+1 ) = D( I+1 ) - FACT*DU( I )
-            END IF
-         ELSE
-*
-*           Interchange rows I and I+1, eliminate DL(I)
-*
-            FACT = D( I ) / DL( I )
-            D( I ) = DL( I )
-            DL( I ) = FACT
-            TEMP = DU( I )
-            DU( I ) = D( I+1 )
-            D( I+1 ) = TEMP - FACT*D( I+1 )
-            DU2( I ) = DU( I+1 )
-            DU( I+1 ) = -FACT*DU( I+1 )
-            IPIV( I ) = I + 1
-         END IF
-   30 CONTINUE
-      IF( N.GT.1 ) THEN
-         I = N - 1
-         IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
-            IF( D( I ).NE.ZERO ) THEN
-               FACT = DL( I ) / D( I )
-               DL( I ) = FACT
-               D( I+1 ) = D( I+1 ) - FACT*DU( I )
-            END IF
-         ELSE
-            FACT = D( I ) / DL( I )
-            D( I ) = DL( I )
-            DL( I ) = FACT
-            TEMP = DU( I )
-            DU( I ) = D( I+1 )
-            D( I+1 ) = TEMP - FACT*D( I+1 )
-            IPIV( I ) = I + 1
-         END IF
-      END IF
-*
-*     Check for a zero on the diagonal of U.
-*
-      DO 40 I = 1, N
-         IF( D( I ).EQ.ZERO ) THEN
-            INFO = I
-            GO TO 50
-         END IF
-   40 CONTINUE
-   50 CONTINUE
-*
-      RETURN
-*
-*     End of DGTTRF
-*
-      END
--- a/libcruft/lapack/dgttrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,140 +0,0 @@
-      SUBROUTINE DGTTRS( TRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TRANS
-      INTEGER            INFO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      DOUBLE PRECISION   B( LDB, * ), D( * ), DL( * ), DU( * ), DU2( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGTTRS solves one of the systems of equations
-*     A*X = B  or  A'*X = B,
-*  with a tridiagonal matrix A using the LU factorization computed
-*  by DGTTRF.
-*
-*  Arguments
-*  =========
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the form of the system of equations.
-*          = 'N':  A * X = B  (No transpose)
-*          = 'T':  A'* X = B  (Transpose)
-*          = 'C':  A'* X = B  (Conjugate transpose = Transpose)
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  DL      (input) DOUBLE PRECISION array, dimension (N-1)
-*          The (n-1) multipliers that define the matrix L from the
-*          LU factorization of A.
-*
-*  D       (input) DOUBLE PRECISION array, dimension (N)
-*          The n diagonal elements of the upper triangular matrix U from
-*          the LU factorization of A.
-*
-*  DU      (input) DOUBLE PRECISION array, dimension (N-1)
-*          The (n-1) elements of the first super-diagonal of U.
-*
-*  DU2     (input) DOUBLE PRECISION array, dimension (N-2)
-*          The (n-2) elements of the second super-diagonal of U.
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= n, row i of the matrix was
-*          interchanged with row IPIV(i).  IPIV(i) will always be either
-*          i or i+1; IPIV(i) = i indicates a row interchange was not
-*          required.
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*          On entry, the matrix of right hand side vectors B.
-*          On exit, B is overwritten by the solution vectors X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            NOTRAN
-      INTEGER            ITRANS, J, JB, NB
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGTTS2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      NOTRAN = ( TRANS.EQ.'N' .OR. TRANS.EQ.'n' )
-      IF( .NOT.NOTRAN .AND. .NOT.( TRANS.EQ.'T' .OR. TRANS.EQ.
-     $    't' ) .AND. .NOT.( TRANS.EQ.'C' .OR. TRANS.EQ.'c' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDB.LT.MAX( N, 1 ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DGTTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-*     Decode TRANS
-*
-      IF( NOTRAN ) THEN
-         ITRANS = 0
-      ELSE
-         ITRANS = 1
-      END IF
-*
-*     Determine the number of right-hand sides to solve at a time.
-*
-      IF( NRHS.EQ.1 ) THEN
-         NB = 1
-      ELSE
-         NB = MAX( 1, ILAENV( 1, 'DGTTRS', TRANS, N, NRHS, -1, -1 ) )
-      END IF
-*
-      IF( NB.GE.NRHS ) THEN
-         CALL DGTTS2( ITRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB )
-      ELSE
-         DO 10 J = 1, NRHS, NB
-            JB = MIN( NRHS-J+1, NB )
-            CALL DGTTS2( ITRANS, N, JB, DL, D, DU, DU2, IPIV, B( 1, J ),
-     $                   LDB )
-   10    CONTINUE
-      END IF
-*
-*     End of DGTTRS
-*
-      END
--- a/libcruft/lapack/dgtts2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,196 +0,0 @@
-      SUBROUTINE DGTTS2( ITRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            ITRANS, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      DOUBLE PRECISION   B( LDB, * ), D( * ), DL( * ), DU( * ), DU2( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DGTTS2 solves one of the systems of equations
-*     A*X = B  or  A'*X = B,
-*  with a tridiagonal matrix A using the LU factorization computed
-*  by DGTTRF.
-*
-*  Arguments
-*  =========
-*
-*  ITRANS  (input) INTEGER
-*          Specifies the form of the system of equations.
-*          = 0:  A * X = B  (No transpose)
-*          = 1:  A'* X = B  (Transpose)
-*          = 2:  A'* X = B  (Conjugate transpose = Transpose)
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  DL      (input) DOUBLE PRECISION array, dimension (N-1)
-*          The (n-1) multipliers that define the matrix L from the
-*          LU factorization of A.
-*
-*  D       (input) DOUBLE PRECISION array, dimension (N)
-*          The n diagonal elements of the upper triangular matrix U from
-*          the LU factorization of A.
-*
-*  DU      (input) DOUBLE PRECISION array, dimension (N-1)
-*          The (n-1) elements of the first super-diagonal of U.
-*
-*  DU2     (input) DOUBLE PRECISION array, dimension (N-2)
-*          The (n-2) elements of the second super-diagonal of U.
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= n, row i of the matrix was
-*          interchanged with row IPIV(i).  IPIV(i) will always be either
-*          i or i+1; IPIV(i) = i indicates a row interchange was not
-*          required.
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*          On entry, the matrix of right hand side vectors B.
-*          On exit, B is overwritten by the solution vectors X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, IP, J
-      DOUBLE PRECISION   TEMP
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      IF( ITRANS.EQ.0 ) THEN
-*
-*        Solve A*X = B using the LU factorization of A,
-*        overwriting each right hand side vector with its solution.
-*
-         IF( NRHS.LE.1 ) THEN
-            J = 1
-   10       CONTINUE
-*
-*           Solve L*x = b.
-*
-            DO 20 I = 1, N - 1
-               IP = IPIV( I )
-               TEMP = B( I+1-IP+I, J ) - DL( I )*B( IP, J )
-               B( I, J ) = B( IP, J )
-               B( I+1, J ) = TEMP
-   20       CONTINUE
-*
-*           Solve U*x = b.
-*
-            B( N, J ) = B( N, J ) / D( N )
-            IF( N.GT.1 )
-     $         B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) /
-     $                       D( N-1 )
-            DO 30 I = N - 2, 1, -1
-               B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DU2( I )*
-     $                     B( I+2, J ) ) / D( I )
-   30       CONTINUE
-            IF( J.LT.NRHS ) THEN
-               J = J + 1
-               GO TO 10
-            END IF
-         ELSE
-            DO 60 J = 1, NRHS
-*
-*              Solve L*x = b.
-*
-               DO 40 I = 1, N - 1
-                  IF( IPIV( I ).EQ.I ) THEN
-                     B( I+1, J ) = B( I+1, J ) - DL( I )*B( I, J )
-                  ELSE
-                     TEMP = B( I, J )
-                     B( I, J ) = B( I+1, J )
-                     B( I+1, J ) = TEMP - DL( I )*B( I, J )
-                  END IF
-   40          CONTINUE
-*
-*              Solve U*x = b.
-*
-               B( N, J ) = B( N, J ) / D( N )
-               IF( N.GT.1 )
-     $            B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) /
-     $                          D( N-1 )
-               DO 50 I = N - 2, 1, -1
-                  B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DU2( I )*
-     $                        B( I+2, J ) ) / D( I )
-   50          CONTINUE
-   60       CONTINUE
-         END IF
-      ELSE
-*
-*        Solve A' * X = B.
-*
-         IF( NRHS.LE.1 ) THEN
-*
-*           Solve U'*x = b.
-*
-            J = 1
-   70       CONTINUE
-            B( 1, J ) = B( 1, J ) / D( 1 )
-            IF( N.GT.1 )
-     $         B( 2, J ) = ( B( 2, J )-DU( 1 )*B( 1, J ) ) / D( 2 )
-            DO 80 I = 3, N
-               B( I, J ) = ( B( I, J )-DU( I-1 )*B( I-1, J )-DU2( I-2 )*
-     $                     B( I-2, J ) ) / D( I )
-   80       CONTINUE
-*
-*           Solve L'*x = b.
-*
-            DO 90 I = N - 1, 1, -1
-               IP = IPIV( I )
-               TEMP = B( I, J ) - DL( I )*B( I+1, J )
-               B( I, J ) = B( IP, J )
-               B( IP, J ) = TEMP
-   90       CONTINUE
-            IF( J.LT.NRHS ) THEN
-               J = J + 1
-               GO TO 70
-            END IF
-*
-         ELSE
-            DO 120 J = 1, NRHS
-*
-*              Solve U'*x = b.
-*
-               B( 1, J ) = B( 1, J ) / D( 1 )
-               IF( N.GT.1 )
-     $            B( 2, J ) = ( B( 2, J )-DU( 1 )*B( 1, J ) ) / D( 2 )
-               DO 100 I = 3, N
-                  B( I, J ) = ( B( I, J )-DU( I-1 )*B( I-1, J )-
-     $                        DU2( I-2 )*B( I-2, J ) ) / D( I )
-  100          CONTINUE
-               DO 110 I = N - 1, 1, -1
-                  IF( IPIV( I ).EQ.I ) THEN
-                     B( I, J ) = B( I, J ) - DL( I )*B( I+1, J )
-                  ELSE
-                     TEMP = B( I+1, J )
-                     B( I+1, J ) = B( I, J ) - DL( I )*TEMP
-                     B( I, J ) = TEMP
-                  END IF
-  110          CONTINUE
-  120       CONTINUE
-         END IF
-      END IF
-*
-*     End of DGTTS2
-*
-      END
--- a/libcruft/lapack/dhgeqz.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1243 +0,0 @@
-      SUBROUTINE DHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT,
-     $                   ALPHAR, ALPHAI, BETA, Q, LDQ, Z, LDZ, WORK,
-     $                   LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPQ, COMPZ, JOB
-      INTEGER            IHI, ILO, INFO, LDH, LDQ, LDT, LDZ, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   ALPHAI( * ), ALPHAR( * ), BETA( * ),
-     $                   H( LDH, * ), Q( LDQ, * ), T( LDT, * ),
-     $                   WORK( * ), Z( LDZ, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DHGEQZ computes the eigenvalues of a real matrix pair (H,T),
-*  where H is an upper Hessenberg matrix and T is upper triangular,
-*  using the double-shift QZ method.
-*  Matrix pairs of this type are produced by the reduction to
-*  generalized upper Hessenberg form of a real matrix pair (A,B):
-*
-*     A = Q1*H*Z1**T,  B = Q1*T*Z1**T,
-*
-*  as computed by DGGHRD.
-*
-*  If JOB='S', then the Hessenberg-triangular pair (H,T) is
-*  also reduced to generalized Schur form,
-*  
-*     H = Q*S*Z**T,  T = Q*P*Z**T,
-*  
-*  where Q and Z are orthogonal matrices, P is an upper triangular
-*  matrix, and S is a quasi-triangular matrix with 1-by-1 and 2-by-2
-*  diagonal blocks.
-*
-*  The 1-by-1 blocks correspond to real eigenvalues of the matrix pair
-*  (H,T) and the 2-by-2 blocks correspond to complex conjugate pairs of
-*  eigenvalues.
-*
-*  Additionally, the 2-by-2 upper triangular diagonal blocks of P
-*  corresponding to 2-by-2 blocks of S are reduced to positive diagonal
-*  form, i.e., if S(j+1,j) is non-zero, then P(j+1,j) = P(j,j+1) = 0,
-*  P(j,j) > 0, and P(j+1,j+1) > 0.
-*
-*  Optionally, the orthogonal matrix Q from the generalized Schur
-*  factorization may be postmultiplied into an input matrix Q1, and the
-*  orthogonal matrix Z may be postmultiplied into an input matrix Z1.
-*  If Q1 and Z1 are the orthogonal matrices from DGGHRD that reduced
-*  the matrix pair (A,B) to generalized upper Hessenberg form, then the
-*  output matrices Q1*Q and Z1*Z are the orthogonal factors from the
-*  generalized Schur factorization of (A,B):
-*
-*     A = (Q1*Q)*S*(Z1*Z)**T,  B = (Q1*Q)*P*(Z1*Z)**T.
-*  
-*  To avoid overflow, eigenvalues of the matrix pair (H,T) (equivalently,
-*  of (A,B)) are computed as a pair of values (alpha,beta), where alpha is
-*  complex and beta real.
-*  If beta is nonzero, lambda = alpha / beta is an eigenvalue of the
-*  generalized nonsymmetric eigenvalue problem (GNEP)
-*     A*x = lambda*B*x
-*  and if alpha is nonzero, mu = beta / alpha is an eigenvalue of the
-*  alternate form of the GNEP
-*     mu*A*y = B*y.
-*  Real eigenvalues can be read directly from the generalized Schur
-*  form: 
-*    alpha = S(i,i), beta = P(i,i).
-*
-*  Ref: C.B. Moler & G.W. Stewart, "An Algorithm for Generalized Matrix
-*       Eigenvalue Problems", SIAM J. Numer. Anal., 10(1973),
-*       pp. 241--256.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          = 'E': Compute eigenvalues only;
-*          = 'S': Compute eigenvalues and the Schur form. 
-*
-*  COMPQ   (input) CHARACTER*1
-*          = 'N': Left Schur vectors (Q) are not computed;
-*          = 'I': Q is initialized to the unit matrix and the matrix Q
-*                 of left Schur vectors of (H,T) is returned;
-*          = 'V': Q must contain an orthogonal matrix Q1 on entry and
-*                 the product Q1*Q is returned.
-*
-*  COMPZ   (input) CHARACTER*1
-*          = 'N': Right Schur vectors (Z) are not computed;
-*          = 'I': Z is initialized to the unit matrix and the matrix Z
-*                 of right Schur vectors of (H,T) is returned;
-*          = 'V': Z must contain an orthogonal matrix Z1 on entry and
-*                 the product Z1*Z is returned.
-*
-*  N       (input) INTEGER
-*          The order of the matrices H, T, Q, and Z.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          ILO and IHI mark the rows and columns of H which are in
-*          Hessenberg form.  It is assumed that A is already upper
-*          triangular in rows and columns 1:ILO-1 and IHI+1:N.
-*          If N > 0, 1 <= ILO <= IHI <= N; if N = 0, ILO=1 and IHI=0.
-*
-*  H       (input/output) DOUBLE PRECISION array, dimension (LDH, N)
-*          On entry, the N-by-N upper Hessenberg matrix H.
-*          On exit, if JOB = 'S', H contains the upper quasi-triangular
-*          matrix S from the generalized Schur factorization;
-*          2-by-2 diagonal blocks (corresponding to complex conjugate
-*          pairs of eigenvalues) are returned in standard form, with
-*          H(i,i) = H(i+1,i+1) and H(i+1,i)*H(i,i+1) < 0.
-*          If JOB = 'E', the diagonal blocks of H match those of S, but
-*          the rest of H is unspecified.
-*
-*  LDH     (input) INTEGER
-*          The leading dimension of the array H.  LDH >= max( 1, N ).
-*
-*  T       (input/output) DOUBLE PRECISION array, dimension (LDT, N)
-*          On entry, the N-by-N upper triangular matrix T.
-*          On exit, if JOB = 'S', T contains the upper triangular
-*          matrix P from the generalized Schur factorization;
-*          2-by-2 diagonal blocks of P corresponding to 2-by-2 blocks of S
-*          are reduced to positive diagonal form, i.e., if H(j+1,j) is
-*          non-zero, then T(j+1,j) = T(j,j+1) = 0, T(j,j) > 0, and
-*          T(j+1,j+1) > 0.
-*          If JOB = 'E', the diagonal blocks of T match those of P, but
-*          the rest of T is unspecified.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T.  LDT >= max( 1, N ).
-*
-*  ALPHAR  (output) DOUBLE PRECISION array, dimension (N)
-*          The real parts of each scalar alpha defining an eigenvalue
-*          of GNEP.
-*
-*  ALPHAI  (output) DOUBLE PRECISION array, dimension (N)
-*          The imaginary parts of each scalar alpha defining an
-*          eigenvalue of GNEP.
-*          If ALPHAI(j) is zero, then the j-th eigenvalue is real; if
-*          positive, then the j-th and (j+1)-st eigenvalues are a
-*          complex conjugate pair, with ALPHAI(j+1) = -ALPHAI(j).
-*
-*  BETA    (output) DOUBLE PRECISION array, dimension (N)
-*          The scalars beta that define the eigenvalues of GNEP.
-*          Together, the quantities alpha = (ALPHAR(j),ALPHAI(j)) and
-*          beta = BETA(j) represent the j-th eigenvalue of the matrix
-*          pair (A,B), in one of the forms lambda = alpha/beta or
-*          mu = beta/alpha.  Since either lambda or mu may overflow,
-*          they should not, in general, be computed.
-*
-*  Q       (input/output) DOUBLE PRECISION array, dimension (LDQ, N)
-*          On entry, if COMPZ = 'V', the orthogonal matrix Q1 used in
-*          the reduction of (A,B) to generalized Hessenberg form.
-*          On exit, if COMPZ = 'I', the orthogonal matrix of left Schur
-*          vectors of (H,T), and if COMPZ = 'V', the orthogonal matrix
-*          of left Schur vectors of (A,B).
-*          Not referenced if COMPZ = 'N'.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.  LDQ >= 1.
-*          If COMPQ='V' or 'I', then LDQ >= N.
-*
-*  Z       (input/output) DOUBLE PRECISION array, dimension (LDZ, N)
-*          On entry, if COMPZ = 'V', the orthogonal matrix Z1 used in
-*          the reduction of (A,B) to generalized Hessenberg form.
-*          On exit, if COMPZ = 'I', the orthogonal matrix of
-*          right Schur vectors of (H,T), and if COMPZ = 'V', the
-*          orthogonal matrix of right Schur vectors of (A,B).
-*          Not referenced if COMPZ = 'N'.
-*
-*  LDZ     (input) INTEGER
-*          The leading dimension of the array Z.  LDZ >= 1.
-*          If COMPZ='V' or 'I', then LDZ >= N.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO >= 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,N).
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          = 1,...,N: the QZ iteration did not converge.  (H,T) is not
-*                     in Schur form, but ALPHAR(i), ALPHAI(i), and
-*                     BETA(i), i=INFO+1,...,N should be correct.
-*          = N+1,...,2*N: the shift calculation failed.  (H,T) is not
-*                     in Schur form, but ALPHAR(i), ALPHAI(i), and
-*                     BETA(i), i=INFO-N+1,...,N should be correct.
-*
-*  Further Details
-*  ===============
-*
-*  Iteration counters:
-*
-*  JITER  -- counts iterations.
-*  IITER  -- counts iterations run since ILAST was last
-*            changed.  This is therefore reset only when a 1-by-1 or
-*            2-by-2 block deflates off the bottom.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-*    $                     SAFETY = 1.0E+0 )
-      DOUBLE PRECISION   HALF, ZERO, ONE, SAFETY
-      PARAMETER          ( HALF = 0.5D+0, ZERO = 0.0D+0, ONE = 1.0D+0,
-     $                   SAFETY = 1.0D+2 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ILAZR2, ILAZRO, ILPIVT, ILQ, ILSCHR, ILZ,
-     $                   LQUERY
-      INTEGER            ICOMPQ, ICOMPZ, IFIRST, IFRSTM, IITER, ILAST,
-     $                   ILASTM, IN, ISCHUR, ISTART, J, JC, JCH, JITER,
-     $                   JR, MAXIT
-      DOUBLE PRECISION   A11, A12, A1I, A1R, A21, A22, A2I, A2R, AD11,
-     $                   AD11L, AD12, AD12L, AD21, AD21L, AD22, AD22L,
-     $                   AD32L, AN, ANORM, ASCALE, ATOL, B11, B1A, B1I,
-     $                   B1R, B22, B2A, B2I, B2R, BN, BNORM, BSCALE,
-     $                   BTOL, C, C11I, C11R, C12, C21, C22I, C22R, CL,
-     $                   CQ, CR, CZ, ESHIFT, S, S1, S1INV, S2, SAFMAX,
-     $                   SAFMIN, SCALE, SL, SQI, SQR, SR, SZI, SZR, T1,
-     $                   TAU, TEMP, TEMP2, TEMPI, TEMPR, U1, U12, U12L,
-     $                   U2, ULP, VS, W11, W12, W21, W22, WABS, WI, WR,
-     $                   WR2
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   V( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   DLAMCH, DLANHS, DLAPY2, DLAPY3
-      EXTERNAL           LSAME, DLAMCH, DLANHS, DLAPY2, DLAPY3
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLAG2, DLARFG, DLARTG, DLASET, DLASV2, DROT,
-     $                   XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode JOB, COMPQ, COMPZ
-*
-      IF( LSAME( JOB, 'E' ) ) THEN
-         ILSCHR = .FALSE.
-         ISCHUR = 1
-      ELSE IF( LSAME( JOB, 'S' ) ) THEN
-         ILSCHR = .TRUE.
-         ISCHUR = 2
-      ELSE
-         ISCHUR = 0
-      END IF
-*
-      IF( LSAME( COMPQ, 'N' ) ) THEN
-         ILQ = .FALSE.
-         ICOMPQ = 1
-      ELSE IF( LSAME( COMPQ, 'V' ) ) THEN
-         ILQ = .TRUE.
-         ICOMPQ = 2
-      ELSE IF( LSAME( COMPQ, 'I' ) ) THEN
-         ILQ = .TRUE.
-         ICOMPQ = 3
-      ELSE
-         ICOMPQ = 0
-      END IF
-*
-      IF( LSAME( COMPZ, 'N' ) ) THEN
-         ILZ = .FALSE.
-         ICOMPZ = 1
-      ELSE IF( LSAME( COMPZ, 'V' ) ) THEN
-         ILZ = .TRUE.
-         ICOMPZ = 2
-      ELSE IF( LSAME( COMPZ, 'I' ) ) THEN
-         ILZ = .TRUE.
-         ICOMPZ = 3
-      ELSE
-         ICOMPZ = 0
-      END IF
-*
-*     Check Argument Values
-*
-      INFO = 0
-      WORK( 1 ) = MAX( 1, N )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( ISCHUR.EQ.0 ) THEN
-         INFO = -1
-      ELSE IF( ICOMPQ.EQ.0 ) THEN
-         INFO = -2
-      ELSE IF( ICOMPZ.EQ.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( ILO.LT.1 ) THEN
-         INFO = -5
-      ELSE IF( IHI.GT.N .OR. IHI.LT.ILO-1 ) THEN
-         INFO = -6
-      ELSE IF( LDH.LT.N ) THEN
-         INFO = -8
-      ELSE IF( LDT.LT.N ) THEN
-         INFO = -10
-      ELSE IF( LDQ.LT.1 .OR. ( ILQ .AND. LDQ.LT.N ) ) THEN
-         INFO = -15
-      ELSE IF( LDZ.LT.1 .OR. ( ILZ .AND. LDZ.LT.N ) ) THEN
-         INFO = -17
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -19
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DHGEQZ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 ) THEN
-         WORK( 1 ) = DBLE( 1 )
-         RETURN
-      END IF
-*
-*     Initialize Q and Z
-*
-      IF( ICOMPQ.EQ.3 )
-     $   CALL DLASET( 'Full', N, N, ZERO, ONE, Q, LDQ )
-      IF( ICOMPZ.EQ.3 )
-     $   CALL DLASET( 'Full', N, N, ZERO, ONE, Z, LDZ )
-*
-*     Machine Constants
-*
-      IN = IHI + 1 - ILO
-      SAFMIN = DLAMCH( 'S' )
-      SAFMAX = ONE / SAFMIN
-      ULP = DLAMCH( 'E' )*DLAMCH( 'B' )
-      ANORM = DLANHS( 'F', IN, H( ILO, ILO ), LDH, WORK )
-      BNORM = DLANHS( 'F', IN, T( ILO, ILO ), LDT, WORK )
-      ATOL = MAX( SAFMIN, ULP*ANORM )
-      BTOL = MAX( SAFMIN, ULP*BNORM )
-      ASCALE = ONE / MAX( SAFMIN, ANORM )
-      BSCALE = ONE / MAX( SAFMIN, BNORM )
-*
-*     Set Eigenvalues IHI+1:N
-*
-      DO 30 J = IHI + 1, N
-         IF( T( J, J ).LT.ZERO ) THEN
-            IF( ILSCHR ) THEN
-               DO 10 JR = 1, J
-                  H( JR, J ) = -H( JR, J )
-                  T( JR, J ) = -T( JR, J )
-   10          CONTINUE
-            ELSE
-               H( J, J ) = -H( J, J )
-               T( J, J ) = -T( J, J )
-            END IF
-            IF( ILZ ) THEN
-               DO 20 JR = 1, N
-                  Z( JR, J ) = -Z( JR, J )
-   20          CONTINUE
-            END IF
-         END IF
-         ALPHAR( J ) = H( J, J )
-         ALPHAI( J ) = ZERO
-         BETA( J ) = T( J, J )
-   30 CONTINUE
-*
-*     If IHI < ILO, skip QZ steps
-*
-      IF( IHI.LT.ILO )
-     $   GO TO 380
-*
-*     MAIN QZ ITERATION LOOP
-*
-*     Initialize dynamic indices
-*
-*     Eigenvalues ILAST+1:N have been found.
-*        Column operations modify rows IFRSTM:whatever.
-*        Row operations modify columns whatever:ILASTM.
-*
-*     If only eigenvalues are being computed, then
-*        IFRSTM is the row of the last splitting row above row ILAST;
-*        this is always at least ILO.
-*     IITER counts iterations since the last eigenvalue was found,
-*        to tell when to use an extraordinary shift.
-*     MAXIT is the maximum number of QZ sweeps allowed.
-*
-      ILAST = IHI
-      IF( ILSCHR ) THEN
-         IFRSTM = 1
-         ILASTM = N
-      ELSE
-         IFRSTM = ILO
-         ILASTM = IHI
-      END IF
-      IITER = 0
-      ESHIFT = ZERO
-      MAXIT = 30*( IHI-ILO+1 )
-*
-      DO 360 JITER = 1, MAXIT
-*
-*        Split the matrix if possible.
-*
-*        Two tests:
-*           1: H(j,j-1)=0  or  j=ILO
-*           2: T(j,j)=0
-*
-         IF( ILAST.EQ.ILO ) THEN
-*
-*           Special case: j=ILAST
-*
-            GO TO 80
-         ELSE
-            IF( ABS( H( ILAST, ILAST-1 ) ).LE.ATOL ) THEN
-               H( ILAST, ILAST-1 ) = ZERO
-               GO TO 80
-            END IF
-         END IF
-*
-         IF( ABS( T( ILAST, ILAST ) ).LE.BTOL ) THEN
-            T( ILAST, ILAST ) = ZERO
-            GO TO 70
-         END IF
-*
-*        General case: j<ILAST
-*
-         DO 60 J = ILAST - 1, ILO, -1
-*
-*           Test 1: for H(j,j-1)=0 or j=ILO
-*
-            IF( J.EQ.ILO ) THEN
-               ILAZRO = .TRUE.
-            ELSE
-               IF( ABS( H( J, J-1 ) ).LE.ATOL ) THEN
-                  H( J, J-1 ) = ZERO
-                  ILAZRO = .TRUE.
-               ELSE
-                  ILAZRO = .FALSE.
-               END IF
-            END IF
-*
-*           Test 2: for T(j,j)=0
-*
-            IF( ABS( T( J, J ) ).LT.BTOL ) THEN
-               T( J, J ) = ZERO
-*
-*              Test 1a: Check for 2 consecutive small subdiagonals in A
-*
-               ILAZR2 = .FALSE.
-               IF( .NOT.ILAZRO ) THEN
-                  TEMP = ABS( H( J, J-1 ) )
-                  TEMP2 = ABS( H( J, J ) )
-                  TEMPR = MAX( TEMP, TEMP2 )
-                  IF( TEMPR.LT.ONE .AND. TEMPR.NE.ZERO ) THEN
-                     TEMP = TEMP / TEMPR
-                     TEMP2 = TEMP2 / TEMPR
-                  END IF
-                  IF( TEMP*( ASCALE*ABS( H( J+1, J ) ) ).LE.TEMP2*
-     $                ( ASCALE*ATOL ) )ILAZR2 = .TRUE.
-               END IF
-*
-*              If both tests pass (1 & 2), i.e., the leading diagonal
-*              element of B in the block is zero, split a 1x1 block off
-*              at the top. (I.e., at the J-th row/column) The leading
-*              diagonal element of the remainder can also be zero, so
-*              this may have to be done repeatedly.
-*
-               IF( ILAZRO .OR. ILAZR2 ) THEN
-                  DO 40 JCH = J, ILAST - 1
-                     TEMP = H( JCH, JCH )
-                     CALL DLARTG( TEMP, H( JCH+1, JCH ), C, S,
-     $                            H( JCH, JCH ) )
-                     H( JCH+1, JCH ) = ZERO
-                     CALL DROT( ILASTM-JCH, H( JCH, JCH+1 ), LDH,
-     $                          H( JCH+1, JCH+1 ), LDH, C, S )
-                     CALL DROT( ILASTM-JCH, T( JCH, JCH+1 ), LDT,
-     $                          T( JCH+1, JCH+1 ), LDT, C, S )
-                     IF( ILQ )
-     $                  CALL DROT( N, Q( 1, JCH ), 1, Q( 1, JCH+1 ), 1,
-     $                             C, S )
-                     IF( ILAZR2 )
-     $                  H( JCH, JCH-1 ) = H( JCH, JCH-1 )*C
-                     ILAZR2 = .FALSE.
-                     IF( ABS( T( JCH+1, JCH+1 ) ).GE.BTOL ) THEN
-                        IF( JCH+1.GE.ILAST ) THEN
-                           GO TO 80
-                        ELSE
-                           IFIRST = JCH + 1
-                           GO TO 110
-                        END IF
-                     END IF
-                     T( JCH+1, JCH+1 ) = ZERO
-   40             CONTINUE
-                  GO TO 70
-               ELSE
-*
-*                 Only test 2 passed -- chase the zero to T(ILAST,ILAST)
-*                 Then process as in the case T(ILAST,ILAST)=0
-*
-                  DO 50 JCH = J, ILAST - 1
-                     TEMP = T( JCH, JCH+1 )
-                     CALL DLARTG( TEMP, T( JCH+1, JCH+1 ), C, S,
-     $                            T( JCH, JCH+1 ) )
-                     T( JCH+1, JCH+1 ) = ZERO
-                     IF( JCH.LT.ILASTM-1 )
-     $                  CALL DROT( ILASTM-JCH-1, T( JCH, JCH+2 ), LDT,
-     $                             T( JCH+1, JCH+2 ), LDT, C, S )
-                     CALL DROT( ILASTM-JCH+2, H( JCH, JCH-1 ), LDH,
-     $                          H( JCH+1, JCH-1 ), LDH, C, S )
-                     IF( ILQ )
-     $                  CALL DROT( N, Q( 1, JCH ), 1, Q( 1, JCH+1 ), 1,
-     $                             C, S )
-                     TEMP = H( JCH+1, JCH )
-                     CALL DLARTG( TEMP, H( JCH+1, JCH-1 ), C, S,
-     $                            H( JCH+1, JCH ) )
-                     H( JCH+1, JCH-1 ) = ZERO
-                     CALL DROT( JCH+1-IFRSTM, H( IFRSTM, JCH ), 1,
-     $                          H( IFRSTM, JCH-1 ), 1, C, S )
-                     CALL DROT( JCH-IFRSTM, T( IFRSTM, JCH ), 1,
-     $                          T( IFRSTM, JCH-1 ), 1, C, S )
-                     IF( ILZ )
-     $                  CALL DROT( N, Z( 1, JCH ), 1, Z( 1, JCH-1 ), 1,
-     $                             C, S )
-   50             CONTINUE
-                  GO TO 70
-               END IF
-            ELSE IF( ILAZRO ) THEN
-*
-*              Only test 1 passed -- work on J:ILAST
-*
-               IFIRST = J
-               GO TO 110
-            END IF
-*
-*           Neither test passed -- try next J
-*
-   60    CONTINUE
-*
-*        (Drop-through is "impossible")
-*
-         INFO = N + 1
-         GO TO 420
-*
-*        T(ILAST,ILAST)=0 -- clear H(ILAST,ILAST-1) to split off a
-*        1x1 block.
-*
-   70    CONTINUE
-         TEMP = H( ILAST, ILAST )
-         CALL DLARTG( TEMP, H( ILAST, ILAST-1 ), C, S,
-     $                H( ILAST, ILAST ) )
-         H( ILAST, ILAST-1 ) = ZERO
-         CALL DROT( ILAST-IFRSTM, H( IFRSTM, ILAST ), 1,
-     $              H( IFRSTM, ILAST-1 ), 1, C, S )
-         CALL DROT( ILAST-IFRSTM, T( IFRSTM, ILAST ), 1,
-     $              T( IFRSTM, ILAST-1 ), 1, C, S )
-         IF( ILZ )
-     $      CALL DROT( N, Z( 1, ILAST ), 1, Z( 1, ILAST-1 ), 1, C, S )
-*
-*        H(ILAST,ILAST-1)=0 -- Standardize B, set ALPHAR, ALPHAI,
-*                              and BETA
-*
-   80    CONTINUE
-         IF( T( ILAST, ILAST ).LT.ZERO ) THEN
-            IF( ILSCHR ) THEN
-               DO 90 J = IFRSTM, ILAST
-                  H( J, ILAST ) = -H( J, ILAST )
-                  T( J, ILAST ) = -T( J, ILAST )
-   90          CONTINUE
-            ELSE
-               H( ILAST, ILAST ) = -H( ILAST, ILAST )
-               T( ILAST, ILAST ) = -T( ILAST, ILAST )
-            END IF
-            IF( ILZ ) THEN
-               DO 100 J = 1, N
-                  Z( J, ILAST ) = -Z( J, ILAST )
-  100          CONTINUE
-            END IF
-         END IF
-         ALPHAR( ILAST ) = H( ILAST, ILAST )
-         ALPHAI( ILAST ) = ZERO
-         BETA( ILAST ) = T( ILAST, ILAST )
-*
-*        Go to next block -- exit if finished.
-*
-         ILAST = ILAST - 1
-         IF( ILAST.LT.ILO )
-     $      GO TO 380
-*
-*        Reset counters
-*
-         IITER = 0
-         ESHIFT = ZERO
-         IF( .NOT.ILSCHR ) THEN
-            ILASTM = ILAST
-            IF( IFRSTM.GT.ILAST )
-     $         IFRSTM = ILO
-         END IF
-         GO TO 350
-*
-*        QZ step
-*
-*        This iteration only involves rows/columns IFIRST:ILAST. We
-*        assume IFIRST < ILAST, and that the diagonal of B is non-zero.
-*
-  110    CONTINUE
-         IITER = IITER + 1
-         IF( .NOT.ILSCHR ) THEN
-            IFRSTM = IFIRST
-         END IF
-*
-*        Compute single shifts.
-*
-*        At this point, IFIRST < ILAST, and the diagonal elements of
-*        T(IFIRST:ILAST,IFIRST,ILAST) are larger than BTOL (in
-*        magnitude)
-*
-         IF( ( IITER / 10 )*10.EQ.IITER ) THEN
-*
-*           Exceptional shift.  Chosen for no particularly good reason.
-*           (Single shift only.)
-*
-            IF( ( DBLE( MAXIT )*SAFMIN )*ABS( H( ILAST-1, ILAST ) ).LT.
-     $          ABS( T( ILAST-1, ILAST-1 ) ) ) THEN
-               ESHIFT = ESHIFT + H( ILAST-1, ILAST ) /
-     $                  T( ILAST-1, ILAST-1 )
-            ELSE
-               ESHIFT = ESHIFT + ONE / ( SAFMIN*DBLE( MAXIT ) )
-            END IF
-            S1 = ONE
-            WR = ESHIFT
-*
-         ELSE
-*
-*           Shifts based on the generalized eigenvalues of the
-*           bottom-right 2x2 block of A and B. The first eigenvalue
-*           returned by DLAG2 is the Wilkinson shift (AEP p.512),
-*
-            CALL DLAG2( H( ILAST-1, ILAST-1 ), LDH,
-     $                  T( ILAST-1, ILAST-1 ), LDT, SAFMIN*SAFETY, S1,
-     $                  S2, WR, WR2, WI )
-*
-            TEMP = MAX( S1, SAFMIN*MAX( ONE, ABS( WR ), ABS( WI ) ) )
-            IF( WI.NE.ZERO )
-     $         GO TO 200
-         END IF
-*
-*        Fiddle with shift to avoid overflow
-*
-         TEMP = MIN( ASCALE, ONE )*( HALF*SAFMAX )
-         IF( S1.GT.TEMP ) THEN
-            SCALE = TEMP / S1
-         ELSE
-            SCALE = ONE
-         END IF
-*
-         TEMP = MIN( BSCALE, ONE )*( HALF*SAFMAX )
-         IF( ABS( WR ).GT.TEMP )
-     $      SCALE = MIN( SCALE, TEMP / ABS( WR ) )
-         S1 = SCALE*S1
-         WR = SCALE*WR
-*
-*        Now check for two consecutive small subdiagonals.
-*
-         DO 120 J = ILAST - 1, IFIRST + 1, -1
-            ISTART = J
-            TEMP = ABS( S1*H( J, J-1 ) )
-            TEMP2 = ABS( S1*H( J, J )-WR*T( J, J ) )
-            TEMPR = MAX( TEMP, TEMP2 )
-            IF( TEMPR.LT.ONE .AND. TEMPR.NE.ZERO ) THEN
-               TEMP = TEMP / TEMPR
-               TEMP2 = TEMP2 / TEMPR
-            END IF
-            IF( ABS( ( ASCALE*H( J+1, J ) )*TEMP ).LE.( ASCALE*ATOL )*
-     $          TEMP2 )GO TO 130
-  120    CONTINUE
-*
-         ISTART = IFIRST
-  130    CONTINUE
-*
-*        Do an implicit single-shift QZ sweep.
-*
-*        Initial Q
-*
-         TEMP = S1*H( ISTART, ISTART ) - WR*T( ISTART, ISTART )
-         TEMP2 = S1*H( ISTART+1, ISTART )
-         CALL DLARTG( TEMP, TEMP2, C, S, TEMPR )
-*
-*        Sweep
-*
-         DO 190 J = ISTART, ILAST - 1
-            IF( J.GT.ISTART ) THEN
-               TEMP = H( J, J-1 )
-               CALL DLARTG( TEMP, H( J+1, J-1 ), C, S, H( J, J-1 ) )
-               H( J+1, J-1 ) = ZERO
-            END IF
-*
-            DO 140 JC = J, ILASTM
-               TEMP = C*H( J, JC ) + S*H( J+1, JC )
-               H( J+1, JC ) = -S*H( J, JC ) + C*H( J+1, JC )
-               H( J, JC ) = TEMP
-               TEMP2 = C*T( J, JC ) + S*T( J+1, JC )
-               T( J+1, JC ) = -S*T( J, JC ) + C*T( J+1, JC )
-               T( J, JC ) = TEMP2
-  140       CONTINUE
-            IF( ILQ ) THEN
-               DO 150 JR = 1, N
-                  TEMP = C*Q( JR, J ) + S*Q( JR, J+1 )
-                  Q( JR, J+1 ) = -S*Q( JR, J ) + C*Q( JR, J+1 )
-                  Q( JR, J ) = TEMP
-  150          CONTINUE
-            END IF
-*
-            TEMP = T( J+1, J+1 )
-            CALL DLARTG( TEMP, T( J+1, J ), C, S, T( J+1, J+1 ) )
-            T( J+1, J ) = ZERO
-*
-            DO 160 JR = IFRSTM, MIN( J+2, ILAST )
-               TEMP = C*H( JR, J+1 ) + S*H( JR, J )
-               H( JR, J ) = -S*H( JR, J+1 ) + C*H( JR, J )
-               H( JR, J+1 ) = TEMP
-  160       CONTINUE
-            DO 170 JR = IFRSTM, J
-               TEMP = C*T( JR, J+1 ) + S*T( JR, J )
-               T( JR, J ) = -S*T( JR, J+1 ) + C*T( JR, J )
-               T( JR, J+1 ) = TEMP
-  170       CONTINUE
-            IF( ILZ ) THEN
-               DO 180 JR = 1, N
-                  TEMP = C*Z( JR, J+1 ) + S*Z( JR, J )
-                  Z( JR, J ) = -S*Z( JR, J+1 ) + C*Z( JR, J )
-                  Z( JR, J+1 ) = TEMP
-  180          CONTINUE
-            END IF
-  190    CONTINUE
-*
-         GO TO 350
-*
-*        Use Francis double-shift
-*
-*        Note: the Francis double-shift should work with real shifts,
-*              but only if the block is at least 3x3.
-*              This code may break if this point is reached with
-*              a 2x2 block with real eigenvalues.
-*
-  200    CONTINUE
-         IF( IFIRST+1.EQ.ILAST ) THEN
-*
-*           Special case -- 2x2 block with complex eigenvectors
-*
-*           Step 1: Standardize, that is, rotate so that
-*
-*                       ( B11  0  )
-*                   B = (         )  with B11 non-negative.
-*                       (  0  B22 )
-*
-            CALL DLASV2( T( ILAST-1, ILAST-1 ), T( ILAST-1, ILAST ),
-     $                   T( ILAST, ILAST ), B22, B11, SR, CR, SL, CL )
-*
-            IF( B11.LT.ZERO ) THEN
-               CR = -CR
-               SR = -SR
-               B11 = -B11
-               B22 = -B22
-            END IF
-*
-            CALL DROT( ILASTM+1-IFIRST, H( ILAST-1, ILAST-1 ), LDH,
-     $                 H( ILAST, ILAST-1 ), LDH, CL, SL )
-            CALL DROT( ILAST+1-IFRSTM, H( IFRSTM, ILAST-1 ), 1,
-     $                 H( IFRSTM, ILAST ), 1, CR, SR )
-*
-            IF( ILAST.LT.ILASTM )
-     $         CALL DROT( ILASTM-ILAST, T( ILAST-1, ILAST+1 ), LDT,
-     $                    T( ILAST, ILAST+1 ), LDH, CL, SL )
-            IF( IFRSTM.LT.ILAST-1 )
-     $         CALL DROT( IFIRST-IFRSTM, T( IFRSTM, ILAST-1 ), 1,
-     $                    T( IFRSTM, ILAST ), 1, CR, SR )
-*
-            IF( ILQ )
-     $         CALL DROT( N, Q( 1, ILAST-1 ), 1, Q( 1, ILAST ), 1, CL,
-     $                    SL )
-            IF( ILZ )
-     $         CALL DROT( N, Z( 1, ILAST-1 ), 1, Z( 1, ILAST ), 1, CR,
-     $                    SR )
-*
-            T( ILAST-1, ILAST-1 ) = B11
-            T( ILAST-1, ILAST ) = ZERO
-            T( ILAST, ILAST-1 ) = ZERO
-            T( ILAST, ILAST ) = B22
-*
-*           If B22 is negative, negate column ILAST
-*
-            IF( B22.LT.ZERO ) THEN
-               DO 210 J = IFRSTM, ILAST
-                  H( J, ILAST ) = -H( J, ILAST )
-                  T( J, ILAST ) = -T( J, ILAST )
-  210          CONTINUE
-*
-               IF( ILZ ) THEN
-                  DO 220 J = 1, N
-                     Z( J, ILAST ) = -Z( J, ILAST )
-  220             CONTINUE
-               END IF
-            END IF
-*
-*           Step 2: Compute ALPHAR, ALPHAI, and BETA (see refs.)
-*
-*           Recompute shift
-*
-            CALL DLAG2( H( ILAST-1, ILAST-1 ), LDH,
-     $                  T( ILAST-1, ILAST-1 ), LDT, SAFMIN*SAFETY, S1,
-     $                  TEMP, WR, TEMP2, WI )
-*
-*           If standardization has perturbed the shift onto real line,
-*           do another (real single-shift) QR step.
-*
-            IF( WI.EQ.ZERO )
-     $         GO TO 350
-            S1INV = ONE / S1
-*
-*           Do EISPACK (QZVAL) computation of alpha and beta
-*
-            A11 = H( ILAST-1, ILAST-1 )
-            A21 = H( ILAST, ILAST-1 )
-            A12 = H( ILAST-1, ILAST )
-            A22 = H( ILAST, ILAST )
-*
-*           Compute complex Givens rotation on right
-*           (Assume some element of C = (sA - wB) > unfl )
-*                            __
-*           (sA - wB) ( CZ   -SZ )
-*                     ( SZ    CZ )
-*
-            C11R = S1*A11 - WR*B11
-            C11I = -WI*B11
-            C12 = S1*A12
-            C21 = S1*A21
-            C22R = S1*A22 - WR*B22
-            C22I = -WI*B22
-*
-            IF( ABS( C11R )+ABS( C11I )+ABS( C12 ).GT.ABS( C21 )+
-     $          ABS( C22R )+ABS( C22I ) ) THEN
-               T1 = DLAPY3( C12, C11R, C11I )
-               CZ = C12 / T1
-               SZR = -C11R / T1
-               SZI = -C11I / T1
-            ELSE
-               CZ = DLAPY2( C22R, C22I )
-               IF( CZ.LE.SAFMIN ) THEN
-                  CZ = ZERO
-                  SZR = ONE
-                  SZI = ZERO
-               ELSE
-                  TEMPR = C22R / CZ
-                  TEMPI = C22I / CZ
-                  T1 = DLAPY2( CZ, C21 )
-                  CZ = CZ / T1
-                  SZR = -C21*TEMPR / T1
-                  SZI = C21*TEMPI / T1
-               END IF
-            END IF
-*
-*           Compute Givens rotation on left
-*
-*           (  CQ   SQ )
-*           (  __      )  A or B
-*           ( -SQ   CQ )
-*
-            AN = ABS( A11 ) + ABS( A12 ) + ABS( A21 ) + ABS( A22 )
-            BN = ABS( B11 ) + ABS( B22 )
-            WABS = ABS( WR ) + ABS( WI )
-            IF( S1*AN.GT.WABS*BN ) THEN
-               CQ = CZ*B11
-               SQR = SZR*B22
-               SQI = -SZI*B22
-            ELSE
-               A1R = CZ*A11 + SZR*A12
-               A1I = SZI*A12
-               A2R = CZ*A21 + SZR*A22
-               A2I = SZI*A22
-               CQ = DLAPY2( A1R, A1I )
-               IF( CQ.LE.SAFMIN ) THEN
-                  CQ = ZERO
-                  SQR = ONE
-                  SQI = ZERO
-               ELSE
-                  TEMPR = A1R / CQ
-                  TEMPI = A1I / CQ
-                  SQR = TEMPR*A2R + TEMPI*A2I
-                  SQI = TEMPI*A2R - TEMPR*A2I
-               END IF
-            END IF
-            T1 = DLAPY3( CQ, SQR, SQI )
-            CQ = CQ / T1
-            SQR = SQR / T1
-            SQI = SQI / T1
-*
-*           Compute diagonal elements of QBZ
-*
-            TEMPR = SQR*SZR - SQI*SZI
-            TEMPI = SQR*SZI + SQI*SZR
-            B1R = CQ*CZ*B11 + TEMPR*B22
-            B1I = TEMPI*B22
-            B1A = DLAPY2( B1R, B1I )
-            B2R = CQ*CZ*B22 + TEMPR*B11
-            B2I = -TEMPI*B11
-            B2A = DLAPY2( B2R, B2I )
-*
-*           Normalize so beta > 0, and Im( alpha1 ) > 0
-*
-            BETA( ILAST-1 ) = B1A
-            BETA( ILAST ) = B2A
-            ALPHAR( ILAST-1 ) = ( WR*B1A )*S1INV
-            ALPHAI( ILAST-1 ) = ( WI*B1A )*S1INV
-            ALPHAR( ILAST ) = ( WR*B2A )*S1INV
-            ALPHAI( ILAST ) = -( WI*B2A )*S1INV
-*
-*           Step 3: Go to next block -- exit if finished.
-*
-            ILAST = IFIRST - 1
-            IF( ILAST.LT.ILO )
-     $         GO TO 380
-*
-*           Reset counters
-*
-            IITER = 0
-            ESHIFT = ZERO
-            IF( .NOT.ILSCHR ) THEN
-               ILASTM = ILAST
-               IF( IFRSTM.GT.ILAST )
-     $            IFRSTM = ILO
-            END IF
-            GO TO 350
-         ELSE
-*
-*           Usual case: 3x3 or larger block, using Francis implicit
-*                       double-shift
-*
-*                                    2
-*           Eigenvalue equation is  w  - c w + d = 0,
-*
-*                                         -1 2        -1
-*           so compute 1st column of  (A B  )  - c A B   + d
-*           using the formula in QZIT (from EISPACK)
-*
-*           We assume that the block is at least 3x3
-*
-            AD11 = ( ASCALE*H( ILAST-1, ILAST-1 ) ) /
-     $             ( BSCALE*T( ILAST-1, ILAST-1 ) )
-            AD21 = ( ASCALE*H( ILAST, ILAST-1 ) ) /
-     $             ( BSCALE*T( ILAST-1, ILAST-1 ) )
-            AD12 = ( ASCALE*H( ILAST-1, ILAST ) ) /
-     $             ( BSCALE*T( ILAST, ILAST ) )
-            AD22 = ( ASCALE*H( ILAST, ILAST ) ) /
-     $             ( BSCALE*T( ILAST, ILAST ) )
-            U12 = T( ILAST-1, ILAST ) / T( ILAST, ILAST )
-            AD11L = ( ASCALE*H( IFIRST, IFIRST ) ) /
-     $              ( BSCALE*T( IFIRST, IFIRST ) )
-            AD21L = ( ASCALE*H( IFIRST+1, IFIRST ) ) /
-     $              ( BSCALE*T( IFIRST, IFIRST ) )
-            AD12L = ( ASCALE*H( IFIRST, IFIRST+1 ) ) /
-     $              ( BSCALE*T( IFIRST+1, IFIRST+1 ) )
-            AD22L = ( ASCALE*H( IFIRST+1, IFIRST+1 ) ) /
-     $              ( BSCALE*T( IFIRST+1, IFIRST+1 ) )
-            AD32L = ( ASCALE*H( IFIRST+2, IFIRST+1 ) ) /
-     $              ( BSCALE*T( IFIRST+1, IFIRST+1 ) )
-            U12L = T( IFIRST, IFIRST+1 ) / T( IFIRST+1, IFIRST+1 )
-*
-            V( 1 ) = ( AD11-AD11L )*( AD22-AD11L ) - AD12*AD21 +
-     $               AD21*U12*AD11L + ( AD12L-AD11L*U12L )*AD21L
-            V( 2 ) = ( ( AD22L-AD11L )-AD21L*U12L-( AD11-AD11L )-
-     $               ( AD22-AD11L )+AD21*U12 )*AD21L
-            V( 3 ) = AD32L*AD21L
-*
-            ISTART = IFIRST
-*
-            CALL DLARFG( 3, V( 1 ), V( 2 ), 1, TAU )
-            V( 1 ) = ONE
-*
-*           Sweep
-*
-            DO 290 J = ISTART, ILAST - 2
-*
-*              All but last elements: use 3x3 Householder transforms.
-*
-*              Zero (j-1)st column of A
-*
-               IF( J.GT.ISTART ) THEN
-                  V( 1 ) = H( J, J-1 )
-                  V( 2 ) = H( J+1, J-1 )
-                  V( 3 ) = H( J+2, J-1 )
-*
-                  CALL DLARFG( 3, H( J, J-1 ), V( 2 ), 1, TAU )
-                  V( 1 ) = ONE
-                  H( J+1, J-1 ) = ZERO
-                  H( J+2, J-1 ) = ZERO
-               END IF
-*
-               DO 230 JC = J, ILASTM
-                  TEMP = TAU*( H( J, JC )+V( 2 )*H( J+1, JC )+V( 3 )*
-     $                   H( J+2, JC ) )
-                  H( J, JC ) = H( J, JC ) - TEMP
-                  H( J+1, JC ) = H( J+1, JC ) - TEMP*V( 2 )
-                  H( J+2, JC ) = H( J+2, JC ) - TEMP*V( 3 )
-                  TEMP2 = TAU*( T( J, JC )+V( 2 )*T( J+1, JC )+V( 3 )*
-     $                    T( J+2, JC ) )
-                  T( J, JC ) = T( J, JC ) - TEMP2
-                  T( J+1, JC ) = T( J+1, JC ) - TEMP2*V( 2 )
-                  T( J+2, JC ) = T( J+2, JC ) - TEMP2*V( 3 )
-  230          CONTINUE
-               IF( ILQ ) THEN
-                  DO 240 JR = 1, N
-                     TEMP = TAU*( Q( JR, J )+V( 2 )*Q( JR, J+1 )+V( 3 )*
-     $                      Q( JR, J+2 ) )
-                     Q( JR, J ) = Q( JR, J ) - TEMP
-                     Q( JR, J+1 ) = Q( JR, J+1 ) - TEMP*V( 2 )
-                     Q( JR, J+2 ) = Q( JR, J+2 ) - TEMP*V( 3 )
-  240             CONTINUE
-               END IF
-*
-*              Zero j-th column of B (see DLAGBC for details)
-*
-*              Swap rows to pivot
-*
-               ILPIVT = .FALSE.
-               TEMP = MAX( ABS( T( J+1, J+1 ) ), ABS( T( J+1, J+2 ) ) )
-               TEMP2 = MAX( ABS( T( J+2, J+1 ) ), ABS( T( J+2, J+2 ) ) )
-               IF( MAX( TEMP, TEMP2 ).LT.SAFMIN ) THEN
-                  SCALE = ZERO
-                  U1 = ONE
-                  U2 = ZERO
-                  GO TO 250
-               ELSE IF( TEMP.GE.TEMP2 ) THEN
-                  W11 = T( J+1, J+1 )
-                  W21 = T( J+2, J+1 )
-                  W12 = T( J+1, J+2 )
-                  W22 = T( J+2, J+2 )
-                  U1 = T( J+1, J )
-                  U2 = T( J+2, J )
-               ELSE
-                  W21 = T( J+1, J+1 )
-                  W11 = T( J+2, J+1 )
-                  W22 = T( J+1, J+2 )
-                  W12 = T( J+2, J+2 )
-                  U2 = T( J+1, J )
-                  U1 = T( J+2, J )
-               END IF
-*
-*              Swap columns if nec.
-*
-               IF( ABS( W12 ).GT.ABS( W11 ) ) THEN
-                  ILPIVT = .TRUE.
-                  TEMP = W12
-                  TEMP2 = W22
-                  W12 = W11
-                  W22 = W21
-                  W11 = TEMP
-                  W21 = TEMP2
-               END IF
-*
-*              LU-factor
-*
-               TEMP = W21 / W11
-               U2 = U2 - TEMP*U1
-               W22 = W22 - TEMP*W12
-               W21 = ZERO
-*
-*              Compute SCALE
-*
-               SCALE = ONE
-               IF( ABS( W22 ).LT.SAFMIN ) THEN
-                  SCALE = ZERO
-                  U2 = ONE
-                  U1 = -W12 / W11
-                  GO TO 250
-               END IF
-               IF( ABS( W22 ).LT.ABS( U2 ) )
-     $            SCALE = ABS( W22 / U2 )
-               IF( ABS( W11 ).LT.ABS( U1 ) )
-     $            SCALE = MIN( SCALE, ABS( W11 / U1 ) )
-*
-*              Solve
-*
-               U2 = ( SCALE*U2 ) / W22
-               U1 = ( SCALE*U1-W12*U2 ) / W11
-*
-  250          CONTINUE
-               IF( ILPIVT ) THEN
-                  TEMP = U2
-                  U2 = U1
-                  U1 = TEMP
-               END IF
-*
-*              Compute Householder Vector
-*
-               T1 = SQRT( SCALE**2+U1**2+U2**2 )
-               TAU = ONE + SCALE / T1
-               VS = -ONE / ( SCALE+T1 )
-               V( 1 ) = ONE
-               V( 2 ) = VS*U1
-               V( 3 ) = VS*U2
-*
-*              Apply transformations from the right.
-*
-               DO 260 JR = IFRSTM, MIN( J+3, ILAST )
-                  TEMP = TAU*( H( JR, J )+V( 2 )*H( JR, J+1 )+V( 3 )*
-     $                   H( JR, J+2 ) )
-                  H( JR, J ) = H( JR, J ) - TEMP
-                  H( JR, J+1 ) = H( JR, J+1 ) - TEMP*V( 2 )
-                  H( JR, J+2 ) = H( JR, J+2 ) - TEMP*V( 3 )
-  260          CONTINUE
-               DO 270 JR = IFRSTM, J + 2
-                  TEMP = TAU*( T( JR, J )+V( 2 )*T( JR, J+1 )+V( 3 )*
-     $                   T( JR, J+2 ) )
-                  T( JR, J ) = T( JR, J ) - TEMP
-                  T( JR, J+1 ) = T( JR, J+1 ) - TEMP*V( 2 )
-                  T( JR, J+2 ) = T( JR, J+2 ) - TEMP*V( 3 )
-  270          CONTINUE
-               IF( ILZ ) THEN
-                  DO 280 JR = 1, N
-                     TEMP = TAU*( Z( JR, J )+V( 2 )*Z( JR, J+1 )+V( 3 )*
-     $                      Z( JR, J+2 ) )
-                     Z( JR, J ) = Z( JR, J ) - TEMP
-                     Z( JR, J+1 ) = Z( JR, J+1 ) - TEMP*V( 2 )
-                     Z( JR, J+2 ) = Z( JR, J+2 ) - TEMP*V( 3 )
-  280             CONTINUE
-               END IF
-               T( J+1, J ) = ZERO
-               T( J+2, J ) = ZERO
-  290       CONTINUE
-*
-*           Last elements: Use Givens rotations
-*
-*           Rotations from the left
-*
-            J = ILAST - 1
-            TEMP = H( J, J-1 )
-            CALL DLARTG( TEMP, H( J+1, J-1 ), C, S, H( J, J-1 ) )
-            H( J+1, J-1 ) = ZERO
-*
-            DO 300 JC = J, ILASTM
-               TEMP = C*H( J, JC ) + S*H( J+1, JC )
-               H( J+1, JC ) = -S*H( J, JC ) + C*H( J+1, JC )
-               H( J, JC ) = TEMP
-               TEMP2 = C*T( J, JC ) + S*T( J+1, JC )
-               T( J+1, JC ) = -S*T( J, JC ) + C*T( J+1, JC )
-               T( J, JC ) = TEMP2
-  300       CONTINUE
-            IF( ILQ ) THEN
-               DO 310 JR = 1, N
-                  TEMP = C*Q( JR, J ) + S*Q( JR, J+1 )
-                  Q( JR, J+1 ) = -S*Q( JR, J ) + C*Q( JR, J+1 )
-                  Q( JR, J ) = TEMP
-  310          CONTINUE
-            END IF
-*
-*           Rotations from the right.
-*
-            TEMP = T( J+1, J+1 )
-            CALL DLARTG( TEMP, T( J+1, J ), C, S, T( J+1, J+1 ) )
-            T( J+1, J ) = ZERO
-*
-            DO 320 JR = IFRSTM, ILAST
-               TEMP = C*H( JR, J+1 ) + S*H( JR, J )
-               H( JR, J ) = -S*H( JR, J+1 ) + C*H( JR, J )
-               H( JR, J+1 ) = TEMP
-  320       CONTINUE
-            DO 330 JR = IFRSTM, ILAST - 1
-               TEMP = C*T( JR, J+1 ) + S*T( JR, J )
-               T( JR, J ) = -S*T( JR, J+1 ) + C*T( JR, J )
-               T( JR, J+1 ) = TEMP
-  330       CONTINUE
-            IF( ILZ ) THEN
-               DO 340 JR = 1, N
-                  TEMP = C*Z( JR, J+1 ) + S*Z( JR, J )
-                  Z( JR, J ) = -S*Z( JR, J+1 ) + C*Z( JR, J )
-                  Z( JR, J+1 ) = TEMP
-  340          CONTINUE
-            END IF
-*
-*           End of Double-Shift code
-*
-         END IF
-*
-         GO TO 350
-*
-*        End of iteration loop
-*
-  350    CONTINUE
-  360 CONTINUE
-*
-*     Drop-through = non-convergence
-*
-      INFO = ILAST
-      GO TO 420
-*
-*     Successful completion of all QZ steps
-*
-  380 CONTINUE
-*
-*     Set Eigenvalues 1:ILO-1
-*
-      DO 410 J = 1, ILO - 1
-         IF( T( J, J ).LT.ZERO ) THEN
-            IF( ILSCHR ) THEN
-               DO 390 JR = 1, J
-                  H( JR, J ) = -H( JR, J )
-                  T( JR, J ) = -T( JR, J )
-  390          CONTINUE
-            ELSE
-               H( J, J ) = -H( J, J )
-               T( J, J ) = -T( J, J )
-            END IF
-            IF( ILZ ) THEN
-               DO 400 JR = 1, N
-                  Z( JR, J ) = -Z( JR, J )
-  400          CONTINUE
-            END IF
-         END IF
-         ALPHAR( J ) = H( J, J )
-         ALPHAI( J ) = ZERO
-         BETA( J ) = T( J, J )
-  410 CONTINUE
-*
-*     Normal Termination
-*
-      INFO = 0
-*
-*     Exit (other than argument error) -- return optimal workspace size
-*
-  420 CONTINUE
-      WORK( 1 ) = DBLE( N )
-      RETURN
-*
-*     End of DHGEQZ
-*
-      END
--- a/libcruft/lapack/dhseqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,407 +0,0 @@
-      SUBROUTINE DHSEQR( JOB, COMPZ, N, ILO, IHI, H, LDH, WR, WI, Z,
-     $                   LDZ, WORK, LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, ILO, INFO, LDH, LDZ, LWORK, N
-      CHARACTER          COMPZ, JOB
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   H( LDH, * ), WI( * ), WORK( * ), WR( * ),
-     $                   Z( LDZ, * )
-*     ..
-*     Purpose
-*     =======
-*
-*     DHSEQR computes the eigenvalues of a Hessenberg matrix H
-*     and, optionally, the matrices T and Z from the Schur decomposition
-*     H = Z T Z**T, where T is an upper quasi-triangular matrix (the
-*     Schur form), and Z is the orthogonal matrix of Schur vectors.
-*
-*     Optionally Z may be postmultiplied into an input orthogonal
-*     matrix Q so that this routine can give the Schur factorization
-*     of a matrix A which has been reduced to the Hessenberg form H
-*     by the orthogonal matrix Q:  A = Q*H*Q**T = (QZ)*T*(QZ)**T.
-*
-*     Arguments
-*     =========
-*
-*     JOB   (input) CHARACTER*1
-*           = 'E':  compute eigenvalues only;
-*           = 'S':  compute eigenvalues and the Schur form T.
-*
-*     COMPZ (input) CHARACTER*1
-*           = 'N':  no Schur vectors are computed;
-*           = 'I':  Z is initialized to the unit matrix and the matrix Z
-*                   of Schur vectors of H is returned;
-*           = 'V':  Z must contain an orthogonal matrix Q on entry, and
-*                   the product Q*Z is returned.
-*
-*     N     (input) INTEGER
-*           The order of the matrix H.  N .GE. 0.
-*
-*     ILO   (input) INTEGER
-*     IHI   (input) INTEGER
-*           It is assumed that H is already upper triangular in rows
-*           and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally
-*           set by a previous call to DGEBAL, and then passed to DGEHRD
-*           when the matrix output by DGEBAL is reduced to Hessenberg
-*           form. Otherwise ILO and IHI should be set to 1 and N
-*           respectively.  If N.GT.0, then 1.LE.ILO.LE.IHI.LE.N.
-*           If N = 0, then ILO = 1 and IHI = 0.
-*
-*     H     (input/output) DOUBLE PRECISION array, dimension (LDH,N)
-*           On entry, the upper Hessenberg matrix H.
-*           On exit, if INFO = 0 and JOB = 'S', then H contains the
-*           upper quasi-triangular matrix T from the Schur decomposition
-*           (the Schur form); 2-by-2 diagonal blocks (corresponding to
-*           complex conjugate pairs of eigenvalues) are returned in
-*           standard form, with H(i,i) = H(i+1,i+1) and
-*           H(i+1,i)*H(i,i+1).LT.0. If INFO = 0 and JOB = 'E', the
-*           contents of H are unspecified on exit.  (The output value of
-*           H when INFO.GT.0 is given under the description of INFO
-*           below.)
-*
-*           Unlike earlier versions of DHSEQR, this subroutine may
-*           explicitly H(i,j) = 0 for i.GT.j and j = 1, 2, ... ILO-1
-*           or j = IHI+1, IHI+2, ... N.
-*
-*     LDH   (input) INTEGER
-*           The leading dimension of the array H. LDH .GE. max(1,N).
-*
-*     WR    (output) DOUBLE PRECISION array, dimension (N)
-*     WI    (output) DOUBLE PRECISION array, dimension (N)
-*           The real and imaginary parts, respectively, of the computed
-*           eigenvalues. If two eigenvalues are computed as a complex
-*           conjugate pair, they are stored in consecutive elements of
-*           WR and WI, say the i-th and (i+1)th, with WI(i) .GT. 0 and
-*           WI(i+1) .LT. 0. If JOB = 'S', the eigenvalues are stored in
-*           the same order as on the diagonal of the Schur form returned
-*           in H, with WR(i) = H(i,i) and, if H(i:i+1,i:i+1) is a 2-by-2
-*           diagonal block, WI(i) = sqrt(-H(i+1,i)*H(i,i+1)) and
-*           WI(i+1) = -WI(i).
-*
-*     Z     (input/output) DOUBLE PRECISION array, dimension (LDZ,N)
-*           If COMPZ = 'N', Z is not referenced.
-*           If COMPZ = 'I', on entry Z need not be set and on exit,
-*           if INFO = 0, Z contains the orthogonal matrix Z of the Schur
-*           vectors of H.  If COMPZ = 'V', on entry Z must contain an
-*           N-by-N matrix Q, which is assumed to be equal to the unit
-*           matrix except for the submatrix Z(ILO:IHI,ILO:IHI). On exit,
-*           if INFO = 0, Z contains Q*Z.
-*           Normally Q is the orthogonal matrix generated by DORGHR
-*           after the call to DGEHRD which formed the Hessenberg matrix
-*           H. (The output value of Z when INFO.GT.0 is given under
-*           the description of INFO below.)
-*
-*     LDZ   (input) INTEGER
-*           The leading dimension of the array Z.  if COMPZ = 'I' or
-*           COMPZ = 'V', then LDZ.GE.MAX(1,N).  Otherwize, LDZ.GE.1.
-*
-*     WORK  (workspace/output) DOUBLE PRECISION array, dimension (LWORK)
-*           On exit, if INFO = 0, WORK(1) returns an estimate of
-*           the optimal value for LWORK.
-*
-*     LWORK (input) INTEGER
-*           The dimension of the array WORK.  LWORK .GE. max(1,N)
-*           is sufficient, but LWORK typically as large as 6*N may
-*           be required for optimal performance.  A workspace query
-*           to determine the optimal workspace size is recommended.
-*
-*           If LWORK = -1, then DHSEQR does a workspace query.
-*           In this case, DHSEQR checks the input parameters and
-*           estimates the optimal workspace size for the given
-*           values of N, ILO and IHI.  The estimate is returned
-*           in WORK(1).  No error message related to LWORK is
-*           issued by XERBLA.  Neither H nor Z are accessed.
-*
-*
-*     INFO  (output) INTEGER
-*             =  0:  successful exit
-*           .LT. 0:  if INFO = -i, the i-th argument had an illegal
-*                    value
-*           .GT. 0:  if INFO = i, DHSEQR failed to compute all of
-*                the eigenvalues.  Elements 1:ilo-1 and i+1:n of WR
-*                and WI contain those eigenvalues which have been
-*                successfully computed.  (Failures are rare.)
-*
-*                If INFO .GT. 0 and JOB = 'E', then on exit, the
-*                remaining unconverged eigenvalues are the eigen-
-*                values of the upper Hessenberg matrix rows and
-*                columns ILO through INFO of the final, output
-*                value of H.
-*
-*                If INFO .GT. 0 and JOB   = 'S', then on exit
-*
-*           (*)  (initial value of H)*U  = U*(final value of H)
-*
-*                where U is an orthogonal matrix.  The final
-*                value of H is upper Hessenberg and quasi-triangular
-*                in rows and columns INFO+1 through IHI.
-*
-*                If INFO .GT. 0 and COMPZ = 'V', then on exit
-*
-*                  (final value of Z)  =  (initial value of Z)*U
-*
-*                where U is the orthogonal matrix in (*) (regard-
-*                less of the value of JOB.)
-*
-*                If INFO .GT. 0 and COMPZ = 'I', then on exit
-*                      (final value of Z)  = U
-*                where U is the orthogonal matrix in (*) (regard-
-*                less of the value of JOB.)
-*
-*                If INFO .GT. 0 and COMPZ = 'N', then Z is not
-*                accessed.
-*
-*     ================================================================
-*             Default values supplied by
-*             ILAENV(ISPEC,'DHSEQR',JOB(:1)//COMPZ(:1),N,ILO,IHI,LWORK).
-*             It is suggested that these defaults be adjusted in order
-*             to attain best performance in each particular
-*             computational environment.
-*
-*            ISPEC=1:  The DLAHQR vs DLAQR0 crossover point.
-*                      Default: 75. (Must be at least 11.)
-*
-*            ISPEC=2:  Recommended deflation window size.
-*                      This depends on ILO, IHI and NS.  NS is the
-*                      number of simultaneous shifts returned
-*                      by ILAENV(ISPEC=4).  (See ISPEC=4 below.)
-*                      The default for (IHI-ILO+1).LE.500 is NS.
-*                      The default for (IHI-ILO+1).GT.500 is 3*NS/2.
-*
-*            ISPEC=3:  Nibble crossover point. (See ILAENV for
-*                      details.)  Default: 14% of deflation window
-*                      size.
-*
-*            ISPEC=4:  Number of simultaneous shifts, NS, in
-*                      a multi-shift QR iteration.
-*
-*                      If IHI-ILO+1 is ...
-*
-*                      greater than      ...but less    ... the
-*                      or equal to ...      than        default is
-*
-*                           1               30          NS -   2(+)
-*                          30               60          NS -   4(+)
-*                          60              150          NS =  10(+)
-*                         150              590          NS =  **
-*                         590             3000          NS =  64
-*                        3000             6000          NS = 128
-*                        6000             infinity      NS = 256
-*
-*                  (+)  By default some or all matrices of this order 
-*                       are passed to the implicit double shift routine
-*                       DLAHQR and NS is ignored.  See ISPEC=1 above 
-*                       and comments in IPARM for details.
-*
-*                       The asterisks (**) indicate an ad-hoc
-*                       function of N increasing from 10 to 64.
-*
-*            ISPEC=5:  Select structured matrix multiply.
-*                      (See ILAENV for details.) Default: 3.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ================================================================
-*     References:
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
-*       Performance, SIAM Journal of Matrix Analysis, volume 23, pages
-*       929--947, 2002.
-*
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part II: Aggressive Early Deflation, SIAM Journal
-*       of Matrix Analysis, volume 23, pages 948--973, 2002.
-*
-*     ================================================================
-*     .. Parameters ..
-*
-*     ==== Matrices of order NTINY or smaller must be processed by
-*     .    DLAHQR because of insufficient subdiagonal scratch space.
-*     .    (This is a hard limit.) ====
-*
-*     ==== NL allocates some local workspace to help small matrices
-*     .    through a rare DLAHQR failure.  NL .GT. NTINY = 11 is
-*     .    required and NL .LE. NMIN = ILAENV(ISPEC=1,...) is recom-
-*     .    mended.  (The default value of NMIN is 75.)  Using NL = 49
-*     .    allows up to six simultaneous shifts and a 16-by-16
-*     .    deflation window.  ====
-*
-      INTEGER            NTINY
-      PARAMETER          ( NTINY = 11 )
-      INTEGER            NL
-      PARAMETER          ( NL = 49 )
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0d0, ONE = 1.0d0 )
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   HL( NL, NL ), WORKL( NL )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, KBOT, NMIN
-      LOGICAL            INITZ, LQUERY, WANTT, WANTZ
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      LOGICAL            LSAME
-      EXTERNAL           ILAENV, LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLACPY, DLAHQR, DLAQR0, DLASET, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     ==== Decode and check the input parameters. ====
-*
-      WANTT = LSAME( JOB, 'S' )
-      INITZ = LSAME( COMPZ, 'I' )
-      WANTZ = INITZ .OR. LSAME( COMPZ, 'V' )
-      WORK( 1 ) = DBLE( MAX( 1, N ) )
-      LQUERY = LWORK.EQ.-1
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'E' ) .AND. .NOT.WANTT ) THEN
-         INFO = -1
-      ELSE IF( .NOT.LSAME( COMPZ, 'N' ) .AND. .NOT.WANTZ ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -5
-      ELSE IF( LDH.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDZ.LT.1 .OR. ( WANTZ .AND. LDZ.LT.MAX( 1, N ) ) ) THEN
-         INFO = -11
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -13
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-*
-*        ==== Quick return in case of invalid argument. ====
-*
-         CALL XERBLA( 'DHSEQR', -INFO )
-         RETURN
-*
-      ELSE IF( N.EQ.0 ) THEN
-*
-*        ==== Quick return in case N = 0; nothing to do. ====
-*
-         RETURN
-*
-      ELSE IF( LQUERY ) THEN
-*
-*        ==== Quick return in case of a workspace query ====
-*
-         CALL DLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI, ILO,
-     $                IHI, Z, LDZ, WORK, LWORK, INFO )
-*        ==== Ensure reported workspace size is backward-compatible with
-*        .    previous LAPACK versions. ====
-         WORK( 1 ) = MAX( DBLE( MAX( 1, N ) ), WORK( 1 ) )
-         RETURN
-*
-      ELSE
-*
-*        ==== copy eigenvalues isolated by DGEBAL ====
-*
-         DO 10 I = 1, ILO - 1
-            WR( I ) = H( I, I )
-            WI( I ) = ZERO
-   10    CONTINUE
-         DO 20 I = IHI + 1, N
-            WR( I ) = H( I, I )
-            WI( I ) = ZERO
-   20    CONTINUE
-*
-*        ==== Initialize Z, if requested ====
-*
-         IF( INITZ )
-     $      CALL DLASET( 'A', N, N, ZERO, ONE, Z, LDZ )
-*
-*        ==== Quick return if possible ====
-*
-         IF( ILO.EQ.IHI ) THEN
-            WR( ILO ) = H( ILO, ILO )
-            WI( ILO ) = ZERO
-            RETURN
-         END IF
-*
-*        ==== DLAHQR/DLAQR0 crossover point ====
-*
-         NMIN = ILAENV( 12, 'DHSEQR', JOB( : 1 ) // COMPZ( : 1 ), N,
-     $          ILO, IHI, LWORK )
-         NMIN = MAX( NTINY, NMIN )
-*
-*        ==== DLAQR0 for big matrices; DLAHQR for small ones ====
-*
-         IF( N.GT.NMIN ) THEN
-            CALL DLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI, ILO,
-     $                   IHI, Z, LDZ, WORK, LWORK, INFO )
-         ELSE
-*
-*           ==== Small matrix ====
-*
-            CALL DLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI, ILO,
-     $                   IHI, Z, LDZ, INFO )
-*
-            IF( INFO.GT.0 ) THEN
-*
-*              ==== A rare DLAHQR failure!  DLAQR0 sometimes succeeds
-*              .    when DLAHQR fails. ====
-*
-               KBOT = INFO
-*
-               IF( N.GE.NL ) THEN
-*
-*                 ==== Larger matrices have enough subdiagonal scratch
-*                 .    space to call DLAQR0 directly. ====
-*
-                  CALL DLAQR0( WANTT, WANTZ, N, ILO, KBOT, H, LDH, WR,
-     $                         WI, ILO, IHI, Z, LDZ, WORK, LWORK, INFO )
-*
-               ELSE
-*
-*                 ==== Tiny matrices don't have enough subdiagonal
-*                 .    scratch space to benefit from DLAQR0.  Hence,
-*                 .    tiny matrices must be copied into a larger
-*                 .    array before calling DLAQR0. ====
-*
-                  CALL DLACPY( 'A', N, N, H, LDH, HL, NL )
-                  HL( N+1, N ) = ZERO
-                  CALL DLASET( 'A', NL, NL-N, ZERO, ZERO, HL( 1, N+1 ),
-     $                         NL )
-                  CALL DLAQR0( WANTT, WANTZ, NL, ILO, KBOT, HL, NL, WR,
-     $                         WI, ILO, IHI, Z, LDZ, WORKL, NL, INFO )
-                  IF( WANTT .OR. INFO.NE.0 )
-     $               CALL DLACPY( 'A', N, N, HL, NL, H, LDH )
-               END IF
-            END IF
-         END IF
-*
-*        ==== Clear out the trash, if necessary. ====
-*
-         IF( ( WANTT .OR. INFO.NE.0 ) .AND. N.GT.2 )
-     $      CALL DLASET( 'L', N-2, N-2, ZERO, ZERO, H( 3, 1 ), LDH )
-*
-*        ==== Ensure reported workspace size is backward-compatible with
-*        .    previous LAPACK versions. ====
-*
-         WORK( 1 ) = MAX( DBLE( MAX( 1, N ) ), WORK( 1 ) )
-      END IF
-*
-*     ==== End of DHSEQR ====
-*
-      END
--- a/libcruft/lapack/dlabad.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-      SUBROUTINE DLABAD( SMALL, LARGE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   LARGE, SMALL
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLABAD takes as input the values computed by DLAMCH for underflow and
-*  overflow, and returns the square root of each of these values if the
-*  log of LARGE is sufficiently large.  This subroutine is intended to
-*  identify machines with a large exponent range, such as the Crays, and
-*  redefine the underflow and overflow limits to be the square roots of
-*  the values computed by DLAMCH.  This subroutine is needed because
-*  DLAMCH does not compensate for poor arithmetic in the upper half of
-*  the exponent range, as is found on a Cray.
-*
-*  Arguments
-*  =========
-*
-*  SMALL   (input/output) DOUBLE PRECISION
-*          On entry, the underflow threshold as computed by DLAMCH.
-*          On exit, if LOG10(LARGE) is sufficiently large, the square
-*          root of SMALL, otherwise unchanged.
-*
-*  LARGE   (input/output) DOUBLE PRECISION
-*          On entry, the overflow threshold as computed by DLAMCH.
-*          On exit, if LOG10(LARGE) is sufficiently large, the square
-*          root of LARGE, otherwise unchanged.
-*
-*  =====================================================================
-*
-*     .. Intrinsic Functions ..
-      INTRINSIC          LOG10, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     If it looks like we're on a Cray, take the square root of
-*     SMALL and LARGE to avoid overflow and underflow problems.
-*
-      IF( LOG10( LARGE ).GT.2000.D0 ) THEN
-         SMALL = SQRT( SMALL )
-         LARGE = SQRT( LARGE )
-      END IF
-*
-      RETURN
-*
-*     End of DLABAD
-*
-      END
--- a/libcruft/lapack/dlabrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,290 +0,0 @@
-      SUBROUTINE DLABRD( M, N, NB, A, LDA, D, E, TAUQ, TAUP, X, LDX, Y,
-     $                   LDY )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            LDA, LDX, LDY, M, N, NB
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), D( * ), E( * ), TAUP( * ),
-     $                   TAUQ( * ), X( LDX, * ), Y( LDY, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLABRD reduces the first NB rows and columns of a real general
-*  m by n matrix A to upper or lower bidiagonal form by an orthogonal
-*  transformation Q' * A * P, and returns the matrices X and Y which
-*  are needed to apply the transformation to the unreduced part of A.
-*
-*  If m >= n, A is reduced to upper bidiagonal form; if m < n, to lower
-*  bidiagonal form.
-*
-*  This is an auxiliary routine called by DGEBRD
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows in the matrix A.
-*
-*  N       (input) INTEGER
-*          The number of columns in the matrix A.
-*
-*  NB      (input) INTEGER
-*          The number of leading rows and columns of A to be reduced.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the m by n general matrix to be reduced.
-*          On exit, the first NB rows and columns of the matrix are
-*          overwritten; the rest of the array is unchanged.
-*          If m >= n, elements on and below the diagonal in the first NB
-*            columns, with the array TAUQ, represent the orthogonal
-*            matrix Q as a product of elementary reflectors; and
-*            elements above the diagonal in the first NB rows, with the
-*            array TAUP, represent the orthogonal matrix P as a product
-*            of elementary reflectors.
-*          If m < n, elements below the diagonal in the first NB
-*            columns, with the array TAUQ, represent the orthogonal
-*            matrix Q as a product of elementary reflectors, and
-*            elements on and above the diagonal in the first NB rows,
-*            with the array TAUP, represent the orthogonal matrix P as
-*            a product of elementary reflectors.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  D       (output) DOUBLE PRECISION array, dimension (NB)
-*          The diagonal elements of the first NB rows and columns of
-*          the reduced matrix.  D(i) = A(i,i).
-*
-*  E       (output) DOUBLE PRECISION array, dimension (NB)
-*          The off-diagonal elements of the first NB rows and columns of
-*          the reduced matrix.
-*
-*  TAUQ    (output) DOUBLE PRECISION array dimension (NB)
-*          The scalar factors of the elementary reflectors which
-*          represent the orthogonal matrix Q. See Further Details.
-*
-*  TAUP    (output) DOUBLE PRECISION array, dimension (NB)
-*          The scalar factors of the elementary reflectors which
-*          represent the orthogonal matrix P. See Further Details.
-*
-*  X       (output) DOUBLE PRECISION array, dimension (LDX,NB)
-*          The m-by-nb matrix X required to update the unreduced part
-*          of A.
-*
-*  LDX     (input) INTEGER
-*          The leading dimension of the array X. LDX >= M.
-*
-*  Y       (output) DOUBLE PRECISION array, dimension (LDY,NB)
-*          The n-by-nb matrix Y required to update the unreduced part
-*          of A.
-*
-*  LDY     (input) INTEGER
-*          The leading dimension of the array Y. LDY >= N.
-*
-*  Further Details
-*  ===============
-*
-*  The matrices Q and P are represented as products of elementary
-*  reflectors:
-*
-*     Q = H(1) H(2) . . . H(nb)  and  P = G(1) G(2) . . . G(nb)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are real scalars, and v and u are real vectors.
-*
-*  If m >= n, v(1:i-1) = 0, v(i) = 1, and v(i:m) is stored on exit in
-*  A(i:m,i); u(1:i) = 0, u(i+1) = 1, and u(i+1:n) is stored on exit in
-*  A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  If m < n, v(1:i) = 0, v(i+1) = 1, and v(i+1:m) is stored on exit in
-*  A(i+2:m,i); u(1:i-1) = 0, u(i) = 1, and u(i:n) is stored on exit in
-*  A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  The elements of the vectors v and u together form the m-by-nb matrix
-*  V and the nb-by-n matrix U' which are needed, with X and Y, to apply
-*  the transformation to the unreduced part of the matrix, using a block
-*  update of the form:  A := A - V*Y' - X*U'.
-*
-*  The contents of A on exit are illustrated by the following examples
-*  with nb = 2:
-*
-*  m = 6 and n = 5 (m > n):          m = 5 and n = 6 (m < n):
-*
-*    (  1   1   u1  u1  u1 )           (  1   u1  u1  u1  u1  u1 )
-*    (  v1  1   1   u2  u2 )           (  1   1   u2  u2  u2  u2 )
-*    (  v1  v2  a   a   a  )           (  v1  1   a   a   a   a  )
-*    (  v1  v2  a   a   a  )           (  v1  v2  a   a   a   a  )
-*    (  v1  v2  a   a   a  )           (  v1  v2  a   a   a   a  )
-*    (  v1  v2  a   a   a  )
-*
-*  where a denotes an element of the original matrix which is unchanged,
-*  vi denotes an element of the vector defining H(i), and ui an element
-*  of the vector defining G(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMV, DLARFG, DSCAL
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 .OR. N.LE.0 )
-     $   RETURN
-*
-      IF( M.GE.N ) THEN
-*
-*        Reduce to upper bidiagonal form
-*
-         DO 10 I = 1, NB
-*
-*           Update A(i:m,i)
-*
-            CALL DGEMV( 'No transpose', M-I+1, I-1, -ONE, A( I, 1 ),
-     $                  LDA, Y( I, 1 ), LDY, ONE, A( I, I ), 1 )
-            CALL DGEMV( 'No transpose', M-I+1, I-1, -ONE, X( I, 1 ),
-     $                  LDX, A( 1, I ), 1, ONE, A( I, I ), 1 )
-*
-*           Generate reflection Q(i) to annihilate A(i+1:m,i)
-*
-            CALL DLARFG( M-I+1, A( I, I ), A( MIN( I+1, M ), I ), 1,
-     $                   TAUQ( I ) )
-            D( I ) = A( I, I )
-            IF( I.LT.N ) THEN
-               A( I, I ) = ONE
-*
-*              Compute Y(i+1:n,i)
-*
-               CALL DGEMV( 'Transpose', M-I+1, N-I, ONE, A( I, I+1 ),
-     $                     LDA, A( I, I ), 1, ZERO, Y( I+1, I ), 1 )
-               CALL DGEMV( 'Transpose', M-I+1, I-1, ONE, A( I, 1 ), LDA,
-     $                     A( I, I ), 1, ZERO, Y( 1, I ), 1 )
-               CALL DGEMV( 'No transpose', N-I, I-1, -ONE, Y( I+1, 1 ),
-     $                     LDY, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
-               CALL DGEMV( 'Transpose', M-I+1, I-1, ONE, X( I, 1 ), LDX,
-     $                     A( I, I ), 1, ZERO, Y( 1, I ), 1 )
-               CALL DGEMV( 'Transpose', I-1, N-I, -ONE, A( 1, I+1 ),
-     $                     LDA, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
-               CALL DSCAL( N-I, TAUQ( I ), Y( I+1, I ), 1 )
-*
-*              Update A(i,i+1:n)
-*
-               CALL DGEMV( 'No transpose', N-I, I, -ONE, Y( I+1, 1 ),
-     $                     LDY, A( I, 1 ), LDA, ONE, A( I, I+1 ), LDA )
-               CALL DGEMV( 'Transpose', I-1, N-I, -ONE, A( 1, I+1 ),
-     $                     LDA, X( I, 1 ), LDX, ONE, A( I, I+1 ), LDA )
-*
-*              Generate reflection P(i) to annihilate A(i,i+2:n)
-*
-               CALL DLARFG( N-I, A( I, I+1 ), A( I, MIN( I+2, N ) ),
-     $                      LDA, TAUP( I ) )
-               E( I ) = A( I, I+1 )
-               A( I, I+1 ) = ONE
-*
-*              Compute X(i+1:m,i)
-*
-               CALL DGEMV( 'No transpose', M-I, N-I, ONE, A( I+1, I+1 ),
-     $                     LDA, A( I, I+1 ), LDA, ZERO, X( I+1, I ), 1 )
-               CALL DGEMV( 'Transpose', N-I, I, ONE, Y( I+1, 1 ), LDY,
-     $                     A( I, I+1 ), LDA, ZERO, X( 1, I ), 1 )
-               CALL DGEMV( 'No transpose', M-I, I, -ONE, A( I+1, 1 ),
-     $                     LDA, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
-               CALL DGEMV( 'No transpose', I-1, N-I, ONE, A( 1, I+1 ),
-     $                     LDA, A( I, I+1 ), LDA, ZERO, X( 1, I ), 1 )
-               CALL DGEMV( 'No transpose', M-I, I-1, -ONE, X( I+1, 1 ),
-     $                     LDX, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
-               CALL DSCAL( M-I, TAUP( I ), X( I+1, I ), 1 )
-            END IF
-   10    CONTINUE
-      ELSE
-*
-*        Reduce to lower bidiagonal form
-*
-         DO 20 I = 1, NB
-*
-*           Update A(i,i:n)
-*
-            CALL DGEMV( 'No transpose', N-I+1, I-1, -ONE, Y( I, 1 ),
-     $                  LDY, A( I, 1 ), LDA, ONE, A( I, I ), LDA )
-            CALL DGEMV( 'Transpose', I-1, N-I+1, -ONE, A( 1, I ), LDA,
-     $                  X( I, 1 ), LDX, ONE, A( I, I ), LDA )
-*
-*           Generate reflection P(i) to annihilate A(i,i+1:n)
-*
-            CALL DLARFG( N-I+1, A( I, I ), A( I, MIN( I+1, N ) ), LDA,
-     $                   TAUP( I ) )
-            D( I ) = A( I, I )
-            IF( I.LT.M ) THEN
-               A( I, I ) = ONE
-*
-*              Compute X(i+1:m,i)
-*
-               CALL DGEMV( 'No transpose', M-I, N-I+1, ONE, A( I+1, I ),
-     $                     LDA, A( I, I ), LDA, ZERO, X( I+1, I ), 1 )
-               CALL DGEMV( 'Transpose', N-I+1, I-1, ONE, Y( I, 1 ), LDY,
-     $                     A( I, I ), LDA, ZERO, X( 1, I ), 1 )
-               CALL DGEMV( 'No transpose', M-I, I-1, -ONE, A( I+1, 1 ),
-     $                     LDA, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
-               CALL DGEMV( 'No transpose', I-1, N-I+1, ONE, A( 1, I ),
-     $                     LDA, A( I, I ), LDA, ZERO, X( 1, I ), 1 )
-               CALL DGEMV( 'No transpose', M-I, I-1, -ONE, X( I+1, 1 ),
-     $                     LDX, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
-               CALL DSCAL( M-I, TAUP( I ), X( I+1, I ), 1 )
-*
-*              Update A(i+1:m,i)
-*
-               CALL DGEMV( 'No transpose', M-I, I-1, -ONE, A( I+1, 1 ),
-     $                     LDA, Y( I, 1 ), LDY, ONE, A( I+1, I ), 1 )
-               CALL DGEMV( 'No transpose', M-I, I, -ONE, X( I+1, 1 ),
-     $                     LDX, A( 1, I ), 1, ONE, A( I+1, I ), 1 )
-*
-*              Generate reflection Q(i) to annihilate A(i+2:m,i)
-*
-               CALL DLARFG( M-I, A( I+1, I ), A( MIN( I+2, M ), I ), 1,
-     $                      TAUQ( I ) )
-               E( I ) = A( I+1, I )
-               A( I+1, I ) = ONE
-*
-*              Compute Y(i+1:n,i)
-*
-               CALL DGEMV( 'Transpose', M-I, N-I, ONE, A( I+1, I+1 ),
-     $                     LDA, A( I+1, I ), 1, ZERO, Y( I+1, I ), 1 )
-               CALL DGEMV( 'Transpose', M-I, I-1, ONE, A( I+1, 1 ), LDA,
-     $                     A( I+1, I ), 1, ZERO, Y( 1, I ), 1 )
-               CALL DGEMV( 'No transpose', N-I, I-1, -ONE, Y( I+1, 1 ),
-     $                     LDY, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
-               CALL DGEMV( 'Transpose', M-I, I, ONE, X( I+1, 1 ), LDX,
-     $                     A( I+1, I ), 1, ZERO, Y( 1, I ), 1 )
-               CALL DGEMV( 'Transpose', I, N-I, -ONE, A( 1, I+1 ), LDA,
-     $                     Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
-               CALL DSCAL( N-I, TAUQ( I ), Y( I+1, I ), 1 )
-            END IF
-   20    CONTINUE
-      END IF
-      RETURN
-*
-*     End of DLABRD
-*
-      END
--- a/libcruft/lapack/dlacn2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,214 +0,0 @@
-      SUBROUTINE DLACN2( N, V, X, ISGN, EST, KASE, ISAVE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            KASE, N
-      DOUBLE PRECISION   EST
-*     ..
-*     .. Array Arguments ..
-      INTEGER            ISGN( * ), ISAVE( 3 )
-      DOUBLE PRECISION   V( * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLACN2 estimates the 1-norm of a square, real matrix A.
-*  Reverse communication is used for evaluating matrix-vector products.
-*
-*  Arguments
-*  =========
-*
-*  N      (input) INTEGER
-*         The order of the matrix.  N >= 1.
-*
-*  V      (workspace) DOUBLE PRECISION array, dimension (N)
-*         On the final return, V = A*W,  where  EST = norm(V)/norm(W)
-*         (W is not returned).
-*
-*  X      (input/output) DOUBLE PRECISION array, dimension (N)
-*         On an intermediate return, X should be overwritten by
-*               A * X,   if KASE=1,
-*               A' * X,  if KASE=2,
-*         and DLACN2 must be re-called with all the other parameters
-*         unchanged.
-*
-*  ISGN   (workspace) INTEGER array, dimension (N)
-*
-*  EST    (input/output) DOUBLE PRECISION
-*         On entry with KASE = 1 or 2 and ISAVE(1) = 3, EST should be
-*         unchanged from the previous call to DLACN2.
-*         On exit, EST is an estimate (a lower bound) for norm(A). 
-*
-*  KASE   (input/output) INTEGER
-*         On the initial call to DLACN2, KASE should be 0.
-*         On an intermediate return, KASE will be 1 or 2, indicating
-*         whether X should be overwritten by A * X  or A' * X.
-*         On the final return from DLACN2, KASE will again be 0.
-*
-*  ISAVE  (input/output) INTEGER array, dimension (3)
-*         ISAVE is used to save variables between calls to DLACN2
-*
-*  Further Details
-*  ======= =======
-*
-*  Contributed by Nick Higham, University of Manchester.
-*  Originally named SONEST, dated March 16, 1988.
-*
-*  Reference: N.J. Higham, "FORTRAN codes for estimating the one-norm of
-*  a real or complex matrix, with applications to condition estimation",
-*  ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988.
-*
-*  This is a thread safe version of DLACON, which uses the array ISAVE
-*  in place of a SAVE statement, as follows:
-*
-*     DLACON     DLACN2
-*      JUMP     ISAVE(1)
-*      J        ISAVE(2)
-*      ITER     ISAVE(3)
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            ITMAX
-      PARAMETER          ( ITMAX = 5 )
-      DOUBLE PRECISION   ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, JLAST
-      DOUBLE PRECISION   ALTSGN, ESTOLD, TEMP
-*     ..
-*     .. External Functions ..
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DASUM
-      EXTERNAL           IDAMAX, DASUM
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, NINT, SIGN
-*     ..
-*     .. Executable Statements ..
-*
-      IF( KASE.EQ.0 ) THEN
-         DO 10 I = 1, N
-            X( I ) = ONE / DBLE( N )
-   10    CONTINUE
-         KASE = 1
-         ISAVE( 1 ) = 1
-         RETURN
-      END IF
-*
-      GO TO ( 20, 40, 70, 110, 140 )ISAVE( 1 )
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 1)
-*     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY A*X.
-*
-   20 CONTINUE
-      IF( N.EQ.1 ) THEN
-         V( 1 ) = X( 1 )
-         EST = ABS( V( 1 ) )
-*        ... QUIT
-         GO TO 150
-      END IF
-      EST = DASUM( N, X, 1 )
-*
-      DO 30 I = 1, N
-         X( I ) = SIGN( ONE, X( I ) )
-         ISGN( I ) = NINT( X( I ) )
-   30 CONTINUE
-      KASE = 2
-      ISAVE( 1 ) = 2
-      RETURN
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 2)
-*     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X.
-*
-   40 CONTINUE
-      ISAVE( 2 ) = IDAMAX( N, X, 1 )
-      ISAVE( 3 ) = 2
-*
-*     MAIN LOOP - ITERATIONS 2,3,...,ITMAX.
-*
-   50 CONTINUE
-      DO 60 I = 1, N
-         X( I ) = ZERO
-   60 CONTINUE
-      X( ISAVE( 2 ) ) = ONE
-      KASE = 1
-      ISAVE( 1 ) = 3
-      RETURN
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 3)
-*     X HAS BEEN OVERWRITTEN BY A*X.
-*
-   70 CONTINUE
-      CALL DCOPY( N, X, 1, V, 1 )
-      ESTOLD = EST
-      EST = DASUM( N, V, 1 )
-      DO 80 I = 1, N
-         IF( NINT( SIGN( ONE, X( I ) ) ).NE.ISGN( I ) )
-     $      GO TO 90
-   80 CONTINUE
-*     REPEATED SIGN VECTOR DETECTED, HENCE ALGORITHM HAS CONVERGED.
-      GO TO 120
-*
-   90 CONTINUE
-*     TEST FOR CYCLING.
-      IF( EST.LE.ESTOLD )
-     $   GO TO 120
-*
-      DO 100 I = 1, N
-         X( I ) = SIGN( ONE, X( I ) )
-         ISGN( I ) = NINT( X( I ) )
-  100 CONTINUE
-      KASE = 2
-      ISAVE( 1 ) = 4
-      RETURN
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 4)
-*     X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X.
-*
-  110 CONTINUE
-      JLAST = ISAVE( 2 )
-      ISAVE( 2 ) = IDAMAX( N, X, 1 )
-      IF( ( X( JLAST ).NE.ABS( X( ISAVE( 2 ) ) ) ) .AND.
-     $    ( ISAVE( 3 ).LT.ITMAX ) ) THEN
-         ISAVE( 3 ) = ISAVE( 3 ) + 1
-         GO TO 50
-      END IF
-*
-*     ITERATION COMPLETE.  FINAL STAGE.
-*
-  120 CONTINUE
-      ALTSGN = ONE
-      DO 130 I = 1, N
-         X( I ) = ALTSGN*( ONE+DBLE( I-1 ) / DBLE( N-1 ) )
-         ALTSGN = -ALTSGN
-  130 CONTINUE
-      KASE = 1
-      ISAVE( 1 ) = 5
-      RETURN
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 5)
-*     X HAS BEEN OVERWRITTEN BY A*X.
-*
-  140 CONTINUE
-      TEMP = TWO*( DASUM( N, X, 1 ) / DBLE( 3*N ) )
-      IF( TEMP.GT.EST ) THEN
-         CALL DCOPY( N, X, 1, V, 1 )
-         EST = TEMP
-      END IF
-*
-  150 CONTINUE
-      KASE = 0
-      RETURN
-*
-*     End of DLACN2
-*
-      END
--- a/libcruft/lapack/dlacon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,205 +0,0 @@
-      SUBROUTINE DLACON( N, V, X, ISGN, EST, KASE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            KASE, N
-      DOUBLE PRECISION   EST
-*     ..
-*     .. Array Arguments ..
-      INTEGER            ISGN( * )
-      DOUBLE PRECISION   V( * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLACON estimates the 1-norm of a square, real matrix A.
-*  Reverse communication is used for evaluating matrix-vector products.
-*
-*  Arguments
-*  =========
-*
-*  N      (input) INTEGER
-*         The order of the matrix.  N >= 1.
-*
-*  V      (workspace) DOUBLE PRECISION array, dimension (N)
-*         On the final return, V = A*W,  where  EST = norm(V)/norm(W)
-*         (W is not returned).
-*
-*  X      (input/output) DOUBLE PRECISION array, dimension (N)
-*         On an intermediate return, X should be overwritten by
-*               A * X,   if KASE=1,
-*               A' * X,  if KASE=2,
-*         and DLACON must be re-called with all the other parameters
-*         unchanged.
-*
-*  ISGN   (workspace) INTEGER array, dimension (N)
-*
-*  EST    (input/output) DOUBLE PRECISION
-*         On entry with KASE = 1 or 2 and JUMP = 3, EST should be
-*         unchanged from the previous call to DLACON.
-*         On exit, EST is an estimate (a lower bound) for norm(A). 
-*
-*  KASE   (input/output) INTEGER
-*         On the initial call to DLACON, KASE should be 0.
-*         On an intermediate return, KASE will be 1 or 2, indicating
-*         whether X should be overwritten by A * X  or A' * X.
-*         On the final return from DLACON, KASE will again be 0.
-*
-*  Further Details
-*  ======= =======
-*
-*  Contributed by Nick Higham, University of Manchester.
-*  Originally named SONEST, dated March 16, 1988.
-*
-*  Reference: N.J. Higham, "FORTRAN codes for estimating the one-norm of
-*  a real or complex matrix, with applications to condition estimation",
-*  ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            ITMAX
-      PARAMETER          ( ITMAX = 5 )
-      DOUBLE PRECISION   ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ITER, J, JLAST, JUMP
-      DOUBLE PRECISION   ALTSGN, ESTOLD, TEMP
-*     ..
-*     .. External Functions ..
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DASUM
-      EXTERNAL           IDAMAX, DASUM
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, NINT, SIGN
-*     ..
-*     .. Save statement ..
-      SAVE
-*     ..
-*     .. Executable Statements ..
-*
-      IF( KASE.EQ.0 ) THEN
-         DO 10 I = 1, N
-            X( I ) = ONE / DBLE( N )
-   10    CONTINUE
-         KASE = 1
-         JUMP = 1
-         RETURN
-      END IF
-*
-      GO TO ( 20, 40, 70, 110, 140 )JUMP
-*
-*     ................ ENTRY   (JUMP = 1)
-*     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY A*X.
-*
-   20 CONTINUE
-      IF( N.EQ.1 ) THEN
-         V( 1 ) = X( 1 )
-         EST = ABS( V( 1 ) )
-*        ... QUIT
-         GO TO 150
-      END IF
-      EST = DASUM( N, X, 1 )
-*
-      DO 30 I = 1, N
-         X( I ) = SIGN( ONE, X( I ) )
-         ISGN( I ) = NINT( X( I ) )
-   30 CONTINUE
-      KASE = 2
-      JUMP = 2
-      RETURN
-*
-*     ................ ENTRY   (JUMP = 2)
-*     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X.
-*
-   40 CONTINUE
-      J = IDAMAX( N, X, 1 )
-      ITER = 2
-*
-*     MAIN LOOP - ITERATIONS 2,3,...,ITMAX.
-*
-   50 CONTINUE
-      DO 60 I = 1, N
-         X( I ) = ZERO
-   60 CONTINUE
-      X( J ) = ONE
-      KASE = 1
-      JUMP = 3
-      RETURN
-*
-*     ................ ENTRY   (JUMP = 3)
-*     X HAS BEEN OVERWRITTEN BY A*X.
-*
-   70 CONTINUE
-      CALL DCOPY( N, X, 1, V, 1 )
-      ESTOLD = EST
-      EST = DASUM( N, V, 1 )
-      DO 80 I = 1, N
-         IF( NINT( SIGN( ONE, X( I ) ) ).NE.ISGN( I ) )
-     $      GO TO 90
-   80 CONTINUE
-*     REPEATED SIGN VECTOR DETECTED, HENCE ALGORITHM HAS CONVERGED.
-      GO TO 120
-*
-   90 CONTINUE
-*     TEST FOR CYCLING.
-      IF( EST.LE.ESTOLD )
-     $   GO TO 120
-*
-      DO 100 I = 1, N
-         X( I ) = SIGN( ONE, X( I ) )
-         ISGN( I ) = NINT( X( I ) )
-  100 CONTINUE
-      KASE = 2
-      JUMP = 4
-      RETURN
-*
-*     ................ ENTRY   (JUMP = 4)
-*     X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X.
-*
-  110 CONTINUE
-      JLAST = J
-      J = IDAMAX( N, X, 1 )
-      IF( ( X( JLAST ).NE.ABS( X( J ) ) ) .AND. ( ITER.LT.ITMAX ) ) THEN
-         ITER = ITER + 1
-         GO TO 50
-      END IF
-*
-*     ITERATION COMPLETE.  FINAL STAGE.
-*
-  120 CONTINUE
-      ALTSGN = ONE
-      DO 130 I = 1, N
-         X( I ) = ALTSGN*( ONE+DBLE( I-1 ) / DBLE( N-1 ) )
-         ALTSGN = -ALTSGN
-  130 CONTINUE
-      KASE = 1
-      JUMP = 5
-      RETURN
-*
-*     ................ ENTRY   (JUMP = 5)
-*     X HAS BEEN OVERWRITTEN BY A*X.
-*
-  140 CONTINUE
-      TEMP = TWO*( DASUM( N, X, 1 ) / DBLE( 3*N ) )
-      IF( TEMP.GT.EST ) THEN
-         CALL DCOPY( N, X, 1, V, 1 )
-         EST = TEMP
-      END IF
-*
-  150 CONTINUE
-      KASE = 0
-      RETURN
-*
-*     End of DLACON
-*
-      END
--- a/libcruft/lapack/dlacpy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-      SUBROUTINE DLACPY( UPLO, M, N, A, LDA, B, LDB )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            LDA, LDB, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLACPY copies all or part of a two-dimensional matrix A to another
-*  matrix B.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies the part of the matrix A to be copied to B.
-*          = 'U':      Upper triangular part
-*          = 'L':      Lower triangular part
-*          Otherwise:  All of the matrix A
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA,N)
-*          The m by n matrix A.  If UPLO = 'U', only the upper triangle
-*          or trapezoid is accessed; if UPLO = 'L', only the lower
-*          triangle or trapezoid is accessed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  B       (output) DOUBLE PRECISION array, dimension (LDB,N)
-*          On exit, B = A in the locations specified by UPLO.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,M).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-      IF( LSAME( UPLO, 'U' ) ) THEN
-         DO 20 J = 1, N
-            DO 10 I = 1, MIN( J, M )
-               B( I, J ) = A( I, J )
-   10       CONTINUE
-   20    CONTINUE
-      ELSE IF( LSAME( UPLO, 'L' ) ) THEN
-         DO 40 J = 1, N
-            DO 30 I = J, M
-               B( I, J ) = A( I, J )
-   30       CONTINUE
-   40    CONTINUE
-      ELSE
-         DO 60 J = 1, N
-            DO 50 I = 1, M
-               B( I, J ) = A( I, J )
-   50       CONTINUE
-   60    CONTINUE
-      END IF
-      RETURN
-*
-*     End of DLACPY
-*
-      END
--- a/libcruft/lapack/dladiv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-      SUBROUTINE DLADIV( A, B, C, D, P, Q )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   A, B, C, D, P, Q
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLADIV performs complex division in  real arithmetic
-*
-*                        a + i*b
-*             p + i*q = ---------
-*                        c + i*d
-*
-*  The algorithm is due to Robert L. Smith and can be found
-*  in D. Knuth, The art of Computer Programming, Vol.2, p.195
-*
-*  Arguments
-*  =========
-*
-*  A       (input) DOUBLE PRECISION
-*  B       (input) DOUBLE PRECISION
-*  C       (input) DOUBLE PRECISION
-*  D       (input) DOUBLE PRECISION
-*          The scalars a, b, c, and d in the above expression.
-*
-*  P       (output) DOUBLE PRECISION
-*  Q       (output) DOUBLE PRECISION
-*          The scalars p and q in the above expression.
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      DOUBLE PRECISION   E, F
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. Executable Statements ..
-*
-      IF( ABS( D ).LT.ABS( C ) ) THEN
-         E = D / C
-         F = C + D*E
-         P = ( A+B*E ) / F
-         Q = ( B-A*E ) / F
-      ELSE
-         E = C / D
-         F = D + C*E
-         P = ( B+A*E ) / F
-         Q = ( -A+B*E ) / F
-      END IF
-*
-      RETURN
-*
-*     End of DLADIV
-*
-      END
--- a/libcruft/lapack/dlae2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,123 +0,0 @@
-      SUBROUTINE DLAE2( A, B, C, RT1, RT2 )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   A, B, C, RT1, RT2
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAE2  computes the eigenvalues of a 2-by-2 symmetric matrix
-*     [  A   B  ]
-*     [  B   C  ].
-*  On return, RT1 is the eigenvalue of larger absolute value, and RT2
-*  is the eigenvalue of smaller absolute value.
-*
-*  Arguments
-*  =========
-*
-*  A       (input) DOUBLE PRECISION
-*          The (1,1) element of the 2-by-2 matrix.
-*
-*  B       (input) DOUBLE PRECISION
-*          The (1,2) and (2,1) elements of the 2-by-2 matrix.
-*
-*  C       (input) DOUBLE PRECISION
-*          The (2,2) element of the 2-by-2 matrix.
-*
-*  RT1     (output) DOUBLE PRECISION
-*          The eigenvalue of larger absolute value.
-*
-*  RT2     (output) DOUBLE PRECISION
-*          The eigenvalue of smaller absolute value.
-*
-*  Further Details
-*  ===============
-*
-*  RT1 is accurate to a few ulps barring over/underflow.
-*
-*  RT2 may be inaccurate if there is massive cancellation in the
-*  determinant A*C-B*B; higher precision or correctly rounded or
-*  correctly truncated arithmetic would be needed to compute RT2
-*  accurately in all cases.
-*
-*  Overflow is possible only if RT1 is within a factor of 5 of overflow.
-*  Underflow is harmless if the input data is 0 or exceeds
-*     underflow_threshold / macheps.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D0 )
-      DOUBLE PRECISION   TWO
-      PARAMETER          ( TWO = 2.0D0 )
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D0 )
-      DOUBLE PRECISION   HALF
-      PARAMETER          ( HALF = 0.5D0 )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   AB, ACMN, ACMX, ADF, DF, RT, SM, TB
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Compute the eigenvalues
-*
-      SM = A + C
-      DF = A - C
-      ADF = ABS( DF )
-      TB = B + B
-      AB = ABS( TB )
-      IF( ABS( A ).GT.ABS( C ) ) THEN
-         ACMX = A
-         ACMN = C
-      ELSE
-         ACMX = C
-         ACMN = A
-      END IF
-      IF( ADF.GT.AB ) THEN
-         RT = ADF*SQRT( ONE+( AB / ADF )**2 )
-      ELSE IF( ADF.LT.AB ) THEN
-         RT = AB*SQRT( ONE+( ADF / AB )**2 )
-      ELSE
-*
-*        Includes case AB=ADF=0
-*
-         RT = AB*SQRT( TWO )
-      END IF
-      IF( SM.LT.ZERO ) THEN
-         RT1 = HALF*( SM-RT )
-*
-*        Order of execution important.
-*        To get fully accurate smaller eigenvalue,
-*        next line needs to be executed in higher precision.
-*
-         RT2 = ( ACMX / RT1 )*ACMN - ( B / RT1 )*B
-      ELSE IF( SM.GT.ZERO ) THEN
-         RT1 = HALF*( SM+RT )
-*
-*        Order of execution important.
-*        To get fully accurate smaller eigenvalue,
-*        next line needs to be executed in higher precision.
-*
-         RT2 = ( ACMX / RT1 )*ACMN - ( B / RT1 )*B
-      ELSE
-*
-*        Includes case RT1 = RT2 = 0
-*
-         RT1 = HALF*RT
-         RT2 = -HALF*RT
-      END IF
-      RETURN
-*
-*     End of DLAE2
-*
-      END
--- a/libcruft/lapack/dlaed6.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,327 +0,0 @@
-      SUBROUTINE DLAED6( KNITER, ORGATI, RHO, D, Z, FINIT, TAU, INFO )
-*
-*  -- LAPACK routine (version 3.1.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     February 2007
-*
-*     .. Scalar Arguments ..
-      LOGICAL            ORGATI
-      INTEGER            INFO, KNITER
-      DOUBLE PRECISION   FINIT, RHO, TAU
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( 3 ), Z( 3 )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAED6 computes the positive or negative root (closest to the origin)
-*  of
-*                   z(1)        z(2)        z(3)
-*  f(x) =   rho + --------- + ---------- + ---------
-*                  d(1)-x      d(2)-x      d(3)-x
-*
-*  It is assumed that
-*
-*        if ORGATI = .true. the root is between d(2) and d(3);
-*        otherwise it is between d(1) and d(2)
-*
-*  This routine will be called by DLAED4 when necessary. In most cases,
-*  the root sought is the smallest in magnitude, though it might not be
-*  in some extremely rare situations.
-*
-*  Arguments
-*  =========
-*
-*  KNITER       (input) INTEGER
-*               Refer to DLAED4 for its significance.
-*
-*  ORGATI       (input) LOGICAL
-*               If ORGATI is true, the needed root is between d(2) and
-*               d(3); otherwise it is between d(1) and d(2).  See
-*               DLAED4 for further details.
-*
-*  RHO          (input) DOUBLE PRECISION
-*               Refer to the equation f(x) above.
-*
-*  D            (input) DOUBLE PRECISION array, dimension (3)
-*               D satisfies d(1) < d(2) < d(3).
-*
-*  Z            (input) DOUBLE PRECISION array, dimension (3)
-*               Each of the elements in z must be positive.
-*
-*  FINIT        (input) DOUBLE PRECISION
-*               The value of f at 0. It is more accurate than the one
-*               evaluated inside this routine (if someone wants to do
-*               so).
-*
-*  TAU          (output) DOUBLE PRECISION
-*               The root of the equation f(x).
-*
-*  INFO         (output) INTEGER
-*               = 0: successful exit
-*               > 0: if INFO = 1, failure to converge
-*
-*  Further Details
-*  ===============
-*
-*  30/06/99: Based on contributions by
-*     Ren-Cang Li, Computer Science Division, University of California
-*     at Berkeley, USA
-*
-*  10/02/03: This version has a few statements commented out for thread
-*  safety (machine parameters are computed on each entry). SJH.
-*
-*  05/10/06: Modified from a new version of Ren-Cang Li, use
-*     Gragg-Thornton-Warner cubic convergent scheme for better stability.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            MAXIT
-      PARAMETER          ( MAXIT = 40 )
-      DOUBLE PRECISION   ZERO, ONE, TWO, THREE, FOUR, EIGHT
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0,
-     $                   THREE = 3.0D0, FOUR = 4.0D0, EIGHT = 8.0D0 )
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           DLAMCH
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   DSCALE( 3 ), ZSCALE( 3 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            SCALE
-      INTEGER            I, ITER, NITER
-      DOUBLE PRECISION   A, B, BASE, C, DDF, DF, EPS, ERRETM, ETA, F,
-     $                   FC, SCLFAC, SCLINV, SMALL1, SMALL2, SMINV1,
-     $                   SMINV2, TEMP, TEMP1, TEMP2, TEMP3, TEMP4, 
-     $                   LBD, UBD
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, INT, LOG, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-*
-      IF( ORGATI ) THEN
-         LBD = D(2)
-         UBD = D(3)
-      ELSE
-         LBD = D(1)
-         UBD = D(2)
-      END IF
-      IF( FINIT .LT. ZERO )THEN
-         LBD = ZERO
-      ELSE
-         UBD = ZERO 
-      END IF
-*
-      NITER = 1
-      TAU = ZERO
-      IF( KNITER.EQ.2 ) THEN
-         IF( ORGATI ) THEN
-            TEMP = ( D( 3 )-D( 2 ) ) / TWO
-            C = RHO + Z( 1 ) / ( ( D( 1 )-D( 2 ) )-TEMP )
-            A = C*( D( 2 )+D( 3 ) ) + Z( 2 ) + Z( 3 )
-            B = C*D( 2 )*D( 3 ) + Z( 2 )*D( 3 ) + Z( 3 )*D( 2 )
-         ELSE
-            TEMP = ( D( 1 )-D( 2 ) ) / TWO
-            C = RHO + Z( 3 ) / ( ( D( 3 )-D( 2 ) )-TEMP )
-            A = C*( D( 1 )+D( 2 ) ) + Z( 1 ) + Z( 2 )
-            B = C*D( 1 )*D( 2 ) + Z( 1 )*D( 2 ) + Z( 2 )*D( 1 )
-         END IF
-         TEMP = MAX( ABS( A ), ABS( B ), ABS( C ) )
-         A = A / TEMP
-         B = B / TEMP
-         C = C / TEMP
-         IF( C.EQ.ZERO ) THEN
-            TAU = B / A
-         ELSE IF( A.LE.ZERO ) THEN
-            TAU = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
-         ELSE
-            TAU = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) )
-         END IF
-         IF( TAU .LT. LBD .OR. TAU .GT. UBD )
-     $      TAU = ( LBD+UBD )/TWO
-         IF( D(1).EQ.TAU .OR. D(2).EQ.TAU .OR. D(3).EQ.TAU ) THEN
-            TAU = ZERO
-         ELSE
-            TEMP = FINIT + TAU*Z(1)/( D(1)*( D( 1 )-TAU ) ) +
-     $                     TAU*Z(2)/( D(2)*( D( 2 )-TAU ) ) +
-     $                     TAU*Z(3)/( D(3)*( D( 3 )-TAU ) )
-            IF( TEMP .LE. ZERO )THEN
-               LBD = TAU
-            ELSE
-               UBD = TAU
-            END IF
-            IF( ABS( FINIT ).LE.ABS( TEMP ) )
-     $         TAU = ZERO
-         END IF
-      END IF
-*
-*     get machine parameters for possible scaling to avoid overflow
-*
-*     modified by Sven: parameters SMALL1, SMINV1, SMALL2,
-*     SMINV2, EPS are not SAVEd anymore between one call to the
-*     others but recomputed at each call
-*
-      EPS = DLAMCH( 'Epsilon' )
-      BASE = DLAMCH( 'Base' )
-      SMALL1 = BASE**( INT( LOG( DLAMCH( 'SafMin' ) ) / LOG( BASE ) /
-     $         THREE ) )
-      SMINV1 = ONE / SMALL1
-      SMALL2 = SMALL1*SMALL1
-      SMINV2 = SMINV1*SMINV1
-*
-*     Determine if scaling of inputs necessary to avoid overflow
-*     when computing 1/TEMP**3
-*
-      IF( ORGATI ) THEN
-         TEMP = MIN( ABS( D( 2 )-TAU ), ABS( D( 3 )-TAU ) )
-      ELSE
-         TEMP = MIN( ABS( D( 1 )-TAU ), ABS( D( 2 )-TAU ) )
-      END IF
-      SCALE = .FALSE.
-      IF( TEMP.LE.SMALL1 ) THEN
-         SCALE = .TRUE.
-         IF( TEMP.LE.SMALL2 ) THEN
-*
-*        Scale up by power of radix nearest 1/SAFMIN**(2/3)
-*
-            SCLFAC = SMINV2
-            SCLINV = SMALL2
-         ELSE
-*
-*        Scale up by power of radix nearest 1/SAFMIN**(1/3)
-*
-            SCLFAC = SMINV1
-            SCLINV = SMALL1
-         END IF
-*
-*        Scaling up safe because D, Z, TAU scaled elsewhere to be O(1)
-*
-         DO 10 I = 1, 3
-            DSCALE( I ) = D( I )*SCLFAC
-            ZSCALE( I ) = Z( I )*SCLFAC
-   10    CONTINUE
-         TAU = TAU*SCLFAC
-         LBD = LBD*SCLFAC
-         UBD = UBD*SCLFAC
-      ELSE
-*
-*        Copy D and Z to DSCALE and ZSCALE
-*
-         DO 20 I = 1, 3
-            DSCALE( I ) = D( I )
-            ZSCALE( I ) = Z( I )
-   20    CONTINUE
-      END IF
-*
-      FC = ZERO
-      DF = ZERO
-      DDF = ZERO
-      DO 30 I = 1, 3
-         TEMP = ONE / ( DSCALE( I )-TAU )
-         TEMP1 = ZSCALE( I )*TEMP
-         TEMP2 = TEMP1*TEMP
-         TEMP3 = TEMP2*TEMP
-         FC = FC + TEMP1 / DSCALE( I )
-         DF = DF + TEMP2
-         DDF = DDF + TEMP3
-   30 CONTINUE
-      F = FINIT + TAU*FC
-*
-      IF( ABS( F ).LE.ZERO )
-     $   GO TO 60
-      IF( F .LE. ZERO )THEN
-         LBD = TAU
-      ELSE
-         UBD = TAU
-      END IF
-*
-*        Iteration begins -- Use Gragg-Thornton-Warner cubic convergent
-*                            scheme
-*
-*     It is not hard to see that
-*
-*           1) Iterations will go up monotonically
-*              if FINIT < 0;
-*
-*           2) Iterations will go down monotonically
-*              if FINIT > 0.
-*
-      ITER = NITER + 1
-*
-      DO 50 NITER = ITER, MAXIT
-*
-         IF( ORGATI ) THEN
-            TEMP1 = DSCALE( 2 ) - TAU
-            TEMP2 = DSCALE( 3 ) - TAU
-         ELSE
-            TEMP1 = DSCALE( 1 ) - TAU
-            TEMP2 = DSCALE( 2 ) - TAU
-         END IF
-         A = ( TEMP1+TEMP2 )*F - TEMP1*TEMP2*DF
-         B = TEMP1*TEMP2*F
-         C = F - ( TEMP1+TEMP2 )*DF + TEMP1*TEMP2*DDF
-         TEMP = MAX( ABS( A ), ABS( B ), ABS( C ) )
-         A = A / TEMP
-         B = B / TEMP
-         C = C / TEMP
-         IF( C.EQ.ZERO ) THEN
-            ETA = B / A
-         ELSE IF( A.LE.ZERO ) THEN
-            ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
-         ELSE
-            ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) )
-         END IF
-         IF( F*ETA.GE.ZERO ) THEN
-            ETA = -F / DF
-         END IF
-*
-         TAU = TAU + ETA
-         IF( TAU .LT. LBD .OR. TAU .GT. UBD )
-     $      TAU = ( LBD + UBD )/TWO 
-*
-         FC = ZERO
-         ERRETM = ZERO
-         DF = ZERO
-         DDF = ZERO
-         DO 40 I = 1, 3
-            TEMP = ONE / ( DSCALE( I )-TAU )
-            TEMP1 = ZSCALE( I )*TEMP
-            TEMP2 = TEMP1*TEMP
-            TEMP3 = TEMP2*TEMP
-            TEMP4 = TEMP1 / DSCALE( I )
-            FC = FC + TEMP4
-            ERRETM = ERRETM + ABS( TEMP4 )
-            DF = DF + TEMP2
-            DDF = DDF + TEMP3
-   40    CONTINUE
-         F = FINIT + TAU*FC
-         ERRETM = EIGHT*( ABS( FINIT )+ABS( TAU )*ERRETM ) +
-     $            ABS( TAU )*DF
-         IF( ABS( F ).LE.EPS*ERRETM )
-     $      GO TO 60
-         IF( F .LE. ZERO )THEN
-            LBD = TAU
-         ELSE
-            UBD = TAU
-         END IF
-   50 CONTINUE
-      INFO = 1
-   60 CONTINUE
-*
-*     Undo scaling
-*
-      IF( SCALE )
-     $   TAU = TAU*SCLINV
-      RETURN
-*
-*     End of DLAED6
-*
-      END
--- a/libcruft/lapack/dlaev2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,169 +0,0 @@
-      SUBROUTINE DLAEV2( A, B, C, RT1, RT2, CS1, SN1 )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   A, B, C, CS1, RT1, RT2, SN1
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAEV2 computes the eigendecomposition of a 2-by-2 symmetric matrix
-*     [  A   B  ]
-*     [  B   C  ].
-*  On return, RT1 is the eigenvalue of larger absolute value, RT2 is the
-*  eigenvalue of smaller absolute value, and (CS1,SN1) is the unit right
-*  eigenvector for RT1, giving the decomposition
-*
-*     [ CS1  SN1 ] [  A   B  ] [ CS1 -SN1 ]  =  [ RT1  0  ]
-*     [-SN1  CS1 ] [  B   C  ] [ SN1  CS1 ]     [  0  RT2 ].
-*
-*  Arguments
-*  =========
-*
-*  A       (input) DOUBLE PRECISION
-*          The (1,1) element of the 2-by-2 matrix.
-*
-*  B       (input) DOUBLE PRECISION
-*          The (1,2) element and the conjugate of the (2,1) element of
-*          the 2-by-2 matrix.
-*
-*  C       (input) DOUBLE PRECISION
-*          The (2,2) element of the 2-by-2 matrix.
-*
-*  RT1     (output) DOUBLE PRECISION
-*          The eigenvalue of larger absolute value.
-*
-*  RT2     (output) DOUBLE PRECISION
-*          The eigenvalue of smaller absolute value.
-*
-*  CS1     (output) DOUBLE PRECISION
-*  SN1     (output) DOUBLE PRECISION
-*          The vector (CS1, SN1) is a unit right eigenvector for RT1.
-*
-*  Further Details
-*  ===============
-*
-*  RT1 is accurate to a few ulps barring over/underflow.
-*
-*  RT2 may be inaccurate if there is massive cancellation in the
-*  determinant A*C-B*B; higher precision or correctly rounded or
-*  correctly truncated arithmetic would be needed to compute RT2
-*  accurately in all cases.
-*
-*  CS1 and SN1 are accurate to a few ulps barring over/underflow.
-*
-*  Overflow is possible only if RT1 is within a factor of 5 of overflow.
-*  Underflow is harmless if the input data is 0 or exceeds
-*     underflow_threshold / macheps.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D0 )
-      DOUBLE PRECISION   TWO
-      PARAMETER          ( TWO = 2.0D0 )
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D0 )
-      DOUBLE PRECISION   HALF
-      PARAMETER          ( HALF = 0.5D0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            SGN1, SGN2
-      DOUBLE PRECISION   AB, ACMN, ACMX, ACS, ADF, CS, CT, DF, RT, SM,
-     $                   TB, TN
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Compute the eigenvalues
-*
-      SM = A + C
-      DF = A - C
-      ADF = ABS( DF )
-      TB = B + B
-      AB = ABS( TB )
-      IF( ABS( A ).GT.ABS( C ) ) THEN
-         ACMX = A
-         ACMN = C
-      ELSE
-         ACMX = C
-         ACMN = A
-      END IF
-      IF( ADF.GT.AB ) THEN
-         RT = ADF*SQRT( ONE+( AB / ADF )**2 )
-      ELSE IF( ADF.LT.AB ) THEN
-         RT = AB*SQRT( ONE+( ADF / AB )**2 )
-      ELSE
-*
-*        Includes case AB=ADF=0
-*
-         RT = AB*SQRT( TWO )
-      END IF
-      IF( SM.LT.ZERO ) THEN
-         RT1 = HALF*( SM-RT )
-         SGN1 = -1
-*
-*        Order of execution important.
-*        To get fully accurate smaller eigenvalue,
-*        next line needs to be executed in higher precision.
-*
-         RT2 = ( ACMX / RT1 )*ACMN - ( B / RT1 )*B
-      ELSE IF( SM.GT.ZERO ) THEN
-         RT1 = HALF*( SM+RT )
-         SGN1 = 1
-*
-*        Order of execution important.
-*        To get fully accurate smaller eigenvalue,
-*        next line needs to be executed in higher precision.
-*
-         RT2 = ( ACMX / RT1 )*ACMN - ( B / RT1 )*B
-      ELSE
-*
-*        Includes case RT1 = RT2 = 0
-*
-         RT1 = HALF*RT
-         RT2 = -HALF*RT
-         SGN1 = 1
-      END IF
-*
-*     Compute the eigenvector
-*
-      IF( DF.GE.ZERO ) THEN
-         CS = DF + RT
-         SGN2 = 1
-      ELSE
-         CS = DF - RT
-         SGN2 = -1
-      END IF
-      ACS = ABS( CS )
-      IF( ACS.GT.AB ) THEN
-         CT = -TB / CS
-         SN1 = ONE / SQRT( ONE+CT*CT )
-         CS1 = CT*SN1
-      ELSE
-         IF( AB.EQ.ZERO ) THEN
-            CS1 = ONE
-            SN1 = ZERO
-         ELSE
-            TN = -CS / TB
-            CS1 = ONE / SQRT( ONE+TN*TN )
-            SN1 = TN*CS1
-         END IF
-      END IF
-      IF( SGN1.EQ.SGN2 ) THEN
-         TN = CS1
-         CS1 = -SN1
-         SN1 = TN
-      END IF
-      RETURN
-*
-*     End of DLAEV2
-*
-      END
--- a/libcruft/lapack/dlaexc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,354 +0,0 @@
-      SUBROUTINE DLAEXC( WANTQ, N, T, LDT, Q, LDQ, J1, N1, N2, WORK,
-     $                   INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            WANTQ
-      INTEGER            INFO, J1, LDQ, LDT, N, N1, N2
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   Q( LDQ, * ), T( LDT, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAEXC swaps adjacent diagonal blocks T11 and T22 of order 1 or 2 in
-*  an upper quasi-triangular matrix T by an orthogonal similarity
-*  transformation.
-*
-*  T must be in Schur canonical form, that is, block upper triangular
-*  with 1-by-1 and 2-by-2 diagonal blocks; each 2-by-2 diagonal block
-*  has its diagonal elemnts equal and its off-diagonal elements of
-*  opposite sign.
-*
-*  Arguments
-*  =========
-*
-*  WANTQ   (input) LOGICAL
-*          = .TRUE. : accumulate the transformation in the matrix Q;
-*          = .FALSE.: do not accumulate the transformation.
-*
-*  N       (input) INTEGER
-*          The order of the matrix T. N >= 0.
-*
-*  T       (input/output) DOUBLE PRECISION array, dimension (LDT,N)
-*          On entry, the upper quasi-triangular matrix T, in Schur
-*          canonical form.
-*          On exit, the updated matrix T, again in Schur canonical form.
-*
-*  LDT     (input)  INTEGER
-*          The leading dimension of the array T. LDT >= max(1,N).
-*
-*  Q       (input/output) DOUBLE PRECISION array, dimension (LDQ,N)
-*          On entry, if WANTQ is .TRUE., the orthogonal matrix Q.
-*          On exit, if WANTQ is .TRUE., the updated matrix Q.
-*          If WANTQ is .FALSE., Q is not referenced.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.
-*          LDQ >= 1; and if WANTQ is .TRUE., LDQ >= N.
-*
-*  J1      (input) INTEGER
-*          The index of the first row of the first block T11.
-*
-*  N1      (input) INTEGER
-*          The order of the first block T11. N1 = 0, 1 or 2.
-*
-*  N2      (input) INTEGER
-*          The order of the second block T22. N2 = 0, 1 or 2.
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          = 1: the transformed matrix T would be too far from Schur
-*               form; the blocks are not swapped and T and Q are
-*               unchanged.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-      DOUBLE PRECISION   TEN
-      PARAMETER          ( TEN = 1.0D+1 )
-      INTEGER            LDD, LDX
-      PARAMETER          ( LDD = 4, LDX = 2 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            IERR, J2, J3, J4, K, ND
-      DOUBLE PRECISION   CS, DNORM, EPS, SCALE, SMLNUM, SN, T11, T22,
-     $                   T33, TAU, TAU1, TAU2, TEMP, THRESH, WI1, WI2,
-     $                   WR1, WR2, XNORM
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   D( LDD, 4 ), U( 3 ), U1( 3 ), U2( 3 ),
-     $                   X( LDX, 2 )
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH, DLANGE
-      EXTERNAL           DLAMCH, DLANGE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLACPY, DLANV2, DLARFG, DLARFX, DLARTG, DLASY2,
-     $                   DROT
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. N1.EQ.0 .OR. N2.EQ.0 )
-     $   RETURN
-      IF( J1+N1.GT.N )
-     $   RETURN
-*
-      J2 = J1 + 1
-      J3 = J1 + 2
-      J4 = J1 + 3
-*
-      IF( N1.EQ.1 .AND. N2.EQ.1 ) THEN
-*
-*        Swap two 1-by-1 blocks.
-*
-         T11 = T( J1, J1 )
-         T22 = T( J2, J2 )
-*
-*        Determine the transformation to perform the interchange.
-*
-         CALL DLARTG( T( J1, J2 ), T22-T11, CS, SN, TEMP )
-*
-*        Apply transformation to the matrix T.
-*
-         IF( J3.LE.N )
-     $      CALL DROT( N-J1-1, T( J1, J3 ), LDT, T( J2, J3 ), LDT, CS,
-     $                 SN )
-         CALL DROT( J1-1, T( 1, J1 ), 1, T( 1, J2 ), 1, CS, SN )
-*
-         T( J1, J1 ) = T22
-         T( J2, J2 ) = T11
-*
-         IF( WANTQ ) THEN
-*
-*           Accumulate transformation in the matrix Q.
-*
-            CALL DROT( N, Q( 1, J1 ), 1, Q( 1, J2 ), 1, CS, SN )
-         END IF
-*
-      ELSE
-*
-*        Swapping involves at least one 2-by-2 block.
-*
-*        Copy the diagonal block of order N1+N2 to the local array D
-*        and compute its norm.
-*
-         ND = N1 + N2
-         CALL DLACPY( 'Full', ND, ND, T( J1, J1 ), LDT, D, LDD )
-         DNORM = DLANGE( 'Max', ND, ND, D, LDD, WORK )
-*
-*        Compute machine-dependent threshold for test for accepting
-*        swap.
-*
-         EPS = DLAMCH( 'P' )
-         SMLNUM = DLAMCH( 'S' ) / EPS
-         THRESH = MAX( TEN*EPS*DNORM, SMLNUM )
-*
-*        Solve T11*X - X*T22 = scale*T12 for X.
-*
-         CALL DLASY2( .FALSE., .FALSE., -1, N1, N2, D, LDD,
-     $                D( N1+1, N1+1 ), LDD, D( 1, N1+1 ), LDD, SCALE, X,
-     $                LDX, XNORM, IERR )
-*
-*        Swap the adjacent diagonal blocks.
-*
-         K = N1 + N1 + N2 - 3
-         GO TO ( 10, 20, 30 )K
-*
-   10    CONTINUE
-*
-*        N1 = 1, N2 = 2: generate elementary reflector H so that:
-*
-*        ( scale, X11, X12 ) H = ( 0, 0, * )
-*
-         U( 1 ) = SCALE
-         U( 2 ) = X( 1, 1 )
-         U( 3 ) = X( 1, 2 )
-         CALL DLARFG( 3, U( 3 ), U, 1, TAU )
-         U( 3 ) = ONE
-         T11 = T( J1, J1 )
-*
-*        Perform swap provisionally on diagonal block in D.
-*
-         CALL DLARFX( 'L', 3, 3, U, TAU, D, LDD, WORK )
-         CALL DLARFX( 'R', 3, 3, U, TAU, D, LDD, WORK )
-*
-*        Test whether to reject swap.
-*
-         IF( MAX( ABS( D( 3, 1 ) ), ABS( D( 3, 2 ) ), ABS( D( 3,
-     $       3 )-T11 ) ).GT.THRESH )GO TO 50
-*
-*        Accept swap: apply transformation to the entire matrix T.
-*
-         CALL DLARFX( 'L', 3, N-J1+1, U, TAU, T( J1, J1 ), LDT, WORK )
-         CALL DLARFX( 'R', J2, 3, U, TAU, T( 1, J1 ), LDT, WORK )
-*
-         T( J3, J1 ) = ZERO
-         T( J3, J2 ) = ZERO
-         T( J3, J3 ) = T11
-*
-         IF( WANTQ ) THEN
-*
-*           Accumulate transformation in the matrix Q.
-*
-            CALL DLARFX( 'R', N, 3, U, TAU, Q( 1, J1 ), LDQ, WORK )
-         END IF
-         GO TO 40
-*
-   20    CONTINUE
-*
-*        N1 = 2, N2 = 1: generate elementary reflector H so that:
-*
-*        H (  -X11 ) = ( * )
-*          (  -X21 ) = ( 0 )
-*          ( scale ) = ( 0 )
-*
-         U( 1 ) = -X( 1, 1 )
-         U( 2 ) = -X( 2, 1 )
-         U( 3 ) = SCALE
-         CALL DLARFG( 3, U( 1 ), U( 2 ), 1, TAU )
-         U( 1 ) = ONE
-         T33 = T( J3, J3 )
-*
-*        Perform swap provisionally on diagonal block in D.
-*
-         CALL DLARFX( 'L', 3, 3, U, TAU, D, LDD, WORK )
-         CALL DLARFX( 'R', 3, 3, U, TAU, D, LDD, WORK )
-*
-*        Test whether to reject swap.
-*
-         IF( MAX( ABS( D( 2, 1 ) ), ABS( D( 3, 1 ) ), ABS( D( 1,
-     $       1 )-T33 ) ).GT.THRESH )GO TO 50
-*
-*        Accept swap: apply transformation to the entire matrix T.
-*
-         CALL DLARFX( 'R', J3, 3, U, TAU, T( 1, J1 ), LDT, WORK )
-         CALL DLARFX( 'L', 3, N-J1, U, TAU, T( J1, J2 ), LDT, WORK )
-*
-         T( J1, J1 ) = T33
-         T( J2, J1 ) = ZERO
-         T( J3, J1 ) = ZERO
-*
-         IF( WANTQ ) THEN
-*
-*           Accumulate transformation in the matrix Q.
-*
-            CALL DLARFX( 'R', N, 3, U, TAU, Q( 1, J1 ), LDQ, WORK )
-         END IF
-         GO TO 40
-*
-   30    CONTINUE
-*
-*        N1 = 2, N2 = 2: generate elementary reflectors H(1) and H(2) so
-*        that:
-*
-*        H(2) H(1) (  -X11  -X12 ) = (  *  * )
-*                  (  -X21  -X22 )   (  0  * )
-*                  ( scale    0  )   (  0  0 )
-*                  (    0  scale )   (  0  0 )
-*
-         U1( 1 ) = -X( 1, 1 )
-         U1( 2 ) = -X( 2, 1 )
-         U1( 3 ) = SCALE
-         CALL DLARFG( 3, U1( 1 ), U1( 2 ), 1, TAU1 )
-         U1( 1 ) = ONE
-*
-         TEMP = -TAU1*( X( 1, 2 )+U1( 2 )*X( 2, 2 ) )
-         U2( 1 ) = -TEMP*U1( 2 ) - X( 2, 2 )
-         U2( 2 ) = -TEMP*U1( 3 )
-         U2( 3 ) = SCALE
-         CALL DLARFG( 3, U2( 1 ), U2( 2 ), 1, TAU2 )
-         U2( 1 ) = ONE
-*
-*        Perform swap provisionally on diagonal block in D.
-*
-         CALL DLARFX( 'L', 3, 4, U1, TAU1, D, LDD, WORK )
-         CALL DLARFX( 'R', 4, 3, U1, TAU1, D, LDD, WORK )
-         CALL DLARFX( 'L', 3, 4, U2, TAU2, D( 2, 1 ), LDD, WORK )
-         CALL DLARFX( 'R', 4, 3, U2, TAU2, D( 1, 2 ), LDD, WORK )
-*
-*        Test whether to reject swap.
-*
-         IF( MAX( ABS( D( 3, 1 ) ), ABS( D( 3, 2 ) ), ABS( D( 4, 1 ) ),
-     $       ABS( D( 4, 2 ) ) ).GT.THRESH )GO TO 50
-*
-*        Accept swap: apply transformation to the entire matrix T.
-*
-         CALL DLARFX( 'L', 3, N-J1+1, U1, TAU1, T( J1, J1 ), LDT, WORK )
-         CALL DLARFX( 'R', J4, 3, U1, TAU1, T( 1, J1 ), LDT, WORK )
-         CALL DLARFX( 'L', 3, N-J1+1, U2, TAU2, T( J2, J1 ), LDT, WORK )
-         CALL DLARFX( 'R', J4, 3, U2, TAU2, T( 1, J2 ), LDT, WORK )
-*
-         T( J3, J1 ) = ZERO
-         T( J3, J2 ) = ZERO
-         T( J4, J1 ) = ZERO
-         T( J4, J2 ) = ZERO
-*
-         IF( WANTQ ) THEN
-*
-*           Accumulate transformation in the matrix Q.
-*
-            CALL DLARFX( 'R', N, 3, U1, TAU1, Q( 1, J1 ), LDQ, WORK )
-            CALL DLARFX( 'R', N, 3, U2, TAU2, Q( 1, J2 ), LDQ, WORK )
-         END IF
-*
-   40    CONTINUE
-*
-         IF( N2.EQ.2 ) THEN
-*
-*           Standardize new 2-by-2 block T11
-*
-            CALL DLANV2( T( J1, J1 ), T( J1, J2 ), T( J2, J1 ),
-     $                   T( J2, J2 ), WR1, WI1, WR2, WI2, CS, SN )
-            CALL DROT( N-J1-1, T( J1, J1+2 ), LDT, T( J2, J1+2 ), LDT,
-     $                 CS, SN )
-            CALL DROT( J1-1, T( 1, J1 ), 1, T( 1, J2 ), 1, CS, SN )
-            IF( WANTQ )
-     $         CALL DROT( N, Q( 1, J1 ), 1, Q( 1, J2 ), 1, CS, SN )
-         END IF
-*
-         IF( N1.EQ.2 ) THEN
-*
-*           Standardize new 2-by-2 block T22
-*
-            J3 = J1 + N2
-            J4 = J3 + 1
-            CALL DLANV2( T( J3, J3 ), T( J3, J4 ), T( J4, J3 ),
-     $                   T( J4, J4 ), WR1, WI1, WR2, WI2, CS, SN )
-            IF( J3+2.LE.N )
-     $         CALL DROT( N-J3-1, T( J3, J3+2 ), LDT, T( J4, J3+2 ),
-     $                    LDT, CS, SN )
-            CALL DROT( J3-1, T( 1, J3 ), 1, T( 1, J4 ), 1, CS, SN )
-            IF( WANTQ )
-     $         CALL DROT( N, Q( 1, J3 ), 1, Q( 1, J4 ), 1, CS, SN )
-         END IF
-*
-      END IF
-      RETURN
-*
-*     Exit with INFO = 1 if swap was rejected.
-*
-   50 CONTINUE
-      INFO = 1
-      RETURN
-*
-*     End of DLAEXC
-*
-      END
--- a/libcruft/lapack/dlag2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,300 +0,0 @@
-      SUBROUTINE DLAG2( A, LDA, B, LDB, SAFMIN, SCALE1, SCALE2, WR1,
-     $                  WR2, WI )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            LDA, LDB
-      DOUBLE PRECISION   SAFMIN, SCALE1, SCALE2, WI, WR1, WR2
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAG2 computes the eigenvalues of a 2 x 2 generalized eigenvalue
-*  problem  A - w B, with scaling as necessary to avoid over-/underflow.
-*
-*  The scaling factor "s" results in a modified eigenvalue equation
-*
-*      s A - w B
-*
-*  where  s  is a non-negative scaling factor chosen so that  w,  w B,
-*  and  s A  do not overflow and, if possible, do not underflow, either.
-*
-*  Arguments
-*  =========
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA, 2)
-*          On entry, the 2 x 2 matrix A.  It is assumed that its 1-norm
-*          is less than 1/SAFMIN.  Entries less than
-*          sqrt(SAFMIN)*norm(A) are subject to being treated as zero.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= 2.
-*
-*  B       (input) DOUBLE PRECISION array, dimension (LDB, 2)
-*          On entry, the 2 x 2 upper triangular matrix B.  It is
-*          assumed that the one-norm of B is less than 1/SAFMIN.  The
-*          diagonals should be at least sqrt(SAFMIN) times the largest
-*          element of B (in absolute value); if a diagonal is smaller
-*          than that, then  +/- sqrt(SAFMIN) will be used instead of
-*          that diagonal.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= 2.
-*
-*  SAFMIN  (input) DOUBLE PRECISION
-*          The smallest positive number s.t. 1/SAFMIN does not
-*          overflow.  (This should always be DLAMCH('S') -- it is an
-*          argument in order to avoid having to call DLAMCH frequently.)
-*
-*  SCALE1  (output) DOUBLE PRECISION
-*          A scaling factor used to avoid over-/underflow in the
-*          eigenvalue equation which defines the first eigenvalue.  If
-*          the eigenvalues are complex, then the eigenvalues are
-*          ( WR1  +/-  WI i ) / SCALE1  (which may lie outside the
-*          exponent range of the machine), SCALE1=SCALE2, and SCALE1
-*          will always be positive.  If the eigenvalues are real, then
-*          the first (real) eigenvalue is  WR1 / SCALE1 , but this may
-*          overflow or underflow, and in fact, SCALE1 may be zero or
-*          less than the underflow threshhold if the exact eigenvalue
-*          is sufficiently large.
-*
-*  SCALE2  (output) DOUBLE PRECISION
-*          A scaling factor used to avoid over-/underflow in the
-*          eigenvalue equation which defines the second eigenvalue.  If
-*          the eigenvalues are complex, then SCALE2=SCALE1.  If the
-*          eigenvalues are real, then the second (real) eigenvalue is
-*          WR2 / SCALE2 , but this may overflow or underflow, and in
-*          fact, SCALE2 may be zero or less than the underflow
-*          threshhold if the exact eigenvalue is sufficiently large.
-*
-*  WR1     (output) DOUBLE PRECISION
-*          If the eigenvalue is real, then WR1 is SCALE1 times the
-*          eigenvalue closest to the (2,2) element of A B**(-1).  If the
-*          eigenvalue is complex, then WR1=WR2 is SCALE1 times the real
-*          part of the eigenvalues.
-*
-*  WR2     (output) DOUBLE PRECISION
-*          If the eigenvalue is real, then WR2 is SCALE2 times the
-*          other eigenvalue.  If the eigenvalue is complex, then
-*          WR1=WR2 is SCALE1 times the real part of the eigenvalues.
-*
-*  WI      (output) DOUBLE PRECISION
-*          If the eigenvalue is real, then WI is zero.  If the
-*          eigenvalue is complex, then WI is SCALE1 times the imaginary
-*          part of the eigenvalues.  WI will always be non-negative.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0 )
-      DOUBLE PRECISION   HALF
-      PARAMETER          ( HALF = ONE / TWO )
-      DOUBLE PRECISION   FUZZY1
-      PARAMETER          ( FUZZY1 = ONE+1.0D-5 )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   A11, A12, A21, A22, ABI22, ANORM, AS11, AS12,
-     $                   AS22, ASCALE, B11, B12, B22, BINV11, BINV22,
-     $                   BMIN, BNORM, BSCALE, BSIZE, C1, C2, C3, C4, C5,
-     $                   DIFF, DISCR, PP, QQ, R, RTMAX, RTMIN, S1, S2,
-     $                   SAFMAX, SHIFT, SS, SUM, WABS, WBIG, WDET,
-     $                   WSCALE, WSIZE, WSMALL
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      RTMIN = SQRT( SAFMIN )
-      RTMAX = ONE / RTMIN
-      SAFMAX = ONE / SAFMIN
-*
-*     Scale A
-*
-      ANORM = MAX( ABS( A( 1, 1 ) )+ABS( A( 2, 1 ) ),
-     $        ABS( A( 1, 2 ) )+ABS( A( 2, 2 ) ), SAFMIN )
-      ASCALE = ONE / ANORM
-      A11 = ASCALE*A( 1, 1 )
-      A21 = ASCALE*A( 2, 1 )
-      A12 = ASCALE*A( 1, 2 )
-      A22 = ASCALE*A( 2, 2 )
-*
-*     Perturb B if necessary to insure non-singularity
-*
-      B11 = B( 1, 1 )
-      B12 = B( 1, 2 )
-      B22 = B( 2, 2 )
-      BMIN = RTMIN*MAX( ABS( B11 ), ABS( B12 ), ABS( B22 ), RTMIN )
-      IF( ABS( B11 ).LT.BMIN )
-     $   B11 = SIGN( BMIN, B11 )
-      IF( ABS( B22 ).LT.BMIN )
-     $   B22 = SIGN( BMIN, B22 )
-*
-*     Scale B
-*
-      BNORM = MAX( ABS( B11 ), ABS( B12 )+ABS( B22 ), SAFMIN )
-      BSIZE = MAX( ABS( B11 ), ABS( B22 ) )
-      BSCALE = ONE / BSIZE
-      B11 = B11*BSCALE
-      B12 = B12*BSCALE
-      B22 = B22*BSCALE
-*
-*     Compute larger eigenvalue by method described by C. van Loan
-*
-*     ( AS is A shifted by -SHIFT*B )
-*
-      BINV11 = ONE / B11
-      BINV22 = ONE / B22
-      S1 = A11*BINV11
-      S2 = A22*BINV22
-      IF( ABS( S1 ).LE.ABS( S2 ) ) THEN
-         AS12 = A12 - S1*B12
-         AS22 = A22 - S1*B22
-         SS = A21*( BINV11*BINV22 )
-         ABI22 = AS22*BINV22 - SS*B12
-         PP = HALF*ABI22
-         SHIFT = S1
-      ELSE
-         AS12 = A12 - S2*B12
-         AS11 = A11 - S2*B11
-         SS = A21*( BINV11*BINV22 )
-         ABI22 = -SS*B12
-         PP = HALF*( AS11*BINV11+ABI22 )
-         SHIFT = S2
-      END IF
-      QQ = SS*AS12
-      IF( ABS( PP*RTMIN ).GE.ONE ) THEN
-         DISCR = ( RTMIN*PP )**2 + QQ*SAFMIN
-         R = SQRT( ABS( DISCR ) )*RTMAX
-      ELSE
-         IF( PP**2+ABS( QQ ).LE.SAFMIN ) THEN
-            DISCR = ( RTMAX*PP )**2 + QQ*SAFMAX
-            R = SQRT( ABS( DISCR ) )*RTMIN
-         ELSE
-            DISCR = PP**2 + QQ
-            R = SQRT( ABS( DISCR ) )
-         END IF
-      END IF
-*
-*     Note: the test of R in the following IF is to cover the case when
-*           DISCR is small and negative and is flushed to zero during
-*           the calculation of R.  On machines which have a consistent
-*           flush-to-zero threshhold and handle numbers above that
-*           threshhold correctly, it would not be necessary.
-*
-      IF( DISCR.GE.ZERO .OR. R.EQ.ZERO ) THEN
-         SUM = PP + SIGN( R, PP )
-         DIFF = PP - SIGN( R, PP )
-         WBIG = SHIFT + SUM
-*
-*        Compute smaller eigenvalue
-*
-         WSMALL = SHIFT + DIFF
-         IF( HALF*ABS( WBIG ).GT.MAX( ABS( WSMALL ), SAFMIN ) ) THEN
-            WDET = ( A11*A22-A12*A21 )*( BINV11*BINV22 )
-            WSMALL = WDET / WBIG
-         END IF
-*
-*        Choose (real) eigenvalue closest to 2,2 element of A*B**(-1)
-*        for WR1.
-*
-         IF( PP.GT.ABI22 ) THEN
-            WR1 = MIN( WBIG, WSMALL )
-            WR2 = MAX( WBIG, WSMALL )
-         ELSE
-            WR1 = MAX( WBIG, WSMALL )
-            WR2 = MIN( WBIG, WSMALL )
-         END IF
-         WI = ZERO
-      ELSE
-*
-*        Complex eigenvalues
-*
-         WR1 = SHIFT + PP
-         WR2 = WR1
-         WI = R
-      END IF
-*
-*     Further scaling to avoid underflow and overflow in computing
-*     SCALE1 and overflow in computing w*B.
-*
-*     This scale factor (WSCALE) is bounded from above using C1 and C2,
-*     and from below using C3 and C4.
-*        C1 implements the condition  s A  must never overflow.
-*        C2 implements the condition  w B  must never overflow.
-*        C3, with C2,
-*           implement the condition that s A - w B must never overflow.
-*        C4 implements the condition  s    should not underflow.
-*        C5 implements the condition  max(s,|w|) should be at least 2.
-*
-      C1 = BSIZE*( SAFMIN*MAX( ONE, ASCALE ) )
-      C2 = SAFMIN*MAX( ONE, BNORM )
-      C3 = BSIZE*SAFMIN
-      IF( ASCALE.LE.ONE .AND. BSIZE.LE.ONE ) THEN
-         C4 = MIN( ONE, ( ASCALE / SAFMIN )*BSIZE )
-      ELSE
-         C4 = ONE
-      END IF
-      IF( ASCALE.LE.ONE .OR. BSIZE.LE.ONE ) THEN
-         C5 = MIN( ONE, ASCALE*BSIZE )
-      ELSE
-         C5 = ONE
-      END IF
-*
-*     Scale first eigenvalue
-*
-      WABS = ABS( WR1 ) + ABS( WI )
-      WSIZE = MAX( SAFMIN, C1, FUZZY1*( WABS*C2+C3 ),
-     $        MIN( C4, HALF*MAX( WABS, C5 ) ) )
-      IF( WSIZE.NE.ONE ) THEN
-         WSCALE = ONE / WSIZE
-         IF( WSIZE.GT.ONE ) THEN
-            SCALE1 = ( MAX( ASCALE, BSIZE )*WSCALE )*
-     $               MIN( ASCALE, BSIZE )
-         ELSE
-            SCALE1 = ( MIN( ASCALE, BSIZE )*WSCALE )*
-     $               MAX( ASCALE, BSIZE )
-         END IF
-         WR1 = WR1*WSCALE
-         IF( WI.NE.ZERO ) THEN
-            WI = WI*WSCALE
-            WR2 = WR1
-            SCALE2 = SCALE1
-         END IF
-      ELSE
-         SCALE1 = ASCALE*BSIZE
-         SCALE2 = SCALE1
-      END IF
-*
-*     Scale second eigenvalue (if real)
-*
-      IF( WI.EQ.ZERO ) THEN
-         WSIZE = MAX( SAFMIN, C1, FUZZY1*( ABS( WR2 )*C2+C3 ),
-     $           MIN( C4, HALF*MAX( ABS( WR2 ), C5 ) ) )
-         IF( WSIZE.NE.ONE ) THEN
-            WSCALE = ONE / WSIZE
-            IF( WSIZE.GT.ONE ) THEN
-               SCALE2 = ( MAX( ASCALE, BSIZE )*WSCALE )*
-     $                  MIN( ASCALE, BSIZE )
-            ELSE
-               SCALE2 = ( MIN( ASCALE, BSIZE )*WSCALE )*
-     $                  MAX( ASCALE, BSIZE )
-            END IF
-            WR2 = WR2*WSCALE
-         ELSE
-            SCALE2 = ASCALE*BSIZE
-         END IF
-      END IF
-*
-*     End of DLAG2
-*
-      RETURN
-      END
--- a/libcruft/lapack/dlahqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,501 +0,0 @@
-      SUBROUTINE DLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI,
-     $                   ILOZ, IHIZ, Z, LDZ, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, N
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   H( LDH, * ), WI( * ), WR( * ), Z( LDZ, * )
-*     ..
-*
-*     Purpose
-*     =======
-*
-*     DLAHQR is an auxiliary routine called by DHSEQR to update the
-*     eigenvalues and Schur decomposition already computed by DHSEQR, by
-*     dealing with the Hessenberg submatrix in rows and columns ILO to
-*     IHI.
-*
-*     Arguments
-*     =========
-*
-*     WANTT   (input) LOGICAL
-*          = .TRUE. : the full Schur form T is required;
-*          = .FALSE.: only eigenvalues are required.
-*
-*     WANTZ   (input) LOGICAL
-*          = .TRUE. : the matrix of Schur vectors Z is required;
-*          = .FALSE.: Schur vectors are not required.
-*
-*     N       (input) INTEGER
-*          The order of the matrix H.  N >= 0.
-*
-*     ILO     (input) INTEGER
-*     IHI     (input) INTEGER
-*          It is assumed that H is already upper quasi-triangular in
-*          rows and columns IHI+1:N, and that H(ILO,ILO-1) = 0 (unless
-*          ILO = 1). DLAHQR works primarily with the Hessenberg
-*          submatrix in rows and columns ILO to IHI, but applies
-*          transformations to all of H if WANTT is .TRUE..
-*          1 <= ILO <= max(1,IHI); IHI <= N.
-*
-*     H       (input/output) DOUBLE PRECISION array, dimension (LDH,N)
-*          On entry, the upper Hessenberg matrix H.
-*          On exit, if INFO is zero and if WANTT is .TRUE., H is upper
-*          quasi-triangular in rows and columns ILO:IHI, with any
-*          2-by-2 diagonal blocks in standard form. If INFO is zero
-*          and WANTT is .FALSE., the contents of H are unspecified on
-*          exit.  The output state of H if INFO is nonzero is given
-*          below under the description of INFO.
-*
-*     LDH     (input) INTEGER
-*          The leading dimension of the array H. LDH >= max(1,N).
-*
-*     WR      (output) DOUBLE PRECISION array, dimension (N)
-*     WI      (output) DOUBLE PRECISION array, dimension (N)
-*          The real and imaginary parts, respectively, of the computed
-*          eigenvalues ILO to IHI are stored in the corresponding
-*          elements of WR and WI. If two eigenvalues are computed as a
-*          complex conjugate pair, they are stored in consecutive
-*          elements of WR and WI, say the i-th and (i+1)th, with
-*          WI(i) > 0 and WI(i+1) < 0. If WANTT is .TRUE., the
-*          eigenvalues are stored in the same order as on the diagonal
-*          of the Schur form returned in H, with WR(i) = H(i,i), and, if
-*          H(i:i+1,i:i+1) is a 2-by-2 diagonal block,
-*          WI(i) = sqrt(H(i+1,i)*H(i,i+1)) and WI(i+1) = -WI(i).
-*
-*     ILOZ    (input) INTEGER
-*     IHIZ    (input) INTEGER
-*          Specify the rows of Z to which transformations must be
-*          applied if WANTZ is .TRUE..
-*          1 <= ILOZ <= ILO; IHI <= IHIZ <= N.
-*
-*     Z       (input/output) DOUBLE PRECISION array, dimension (LDZ,N)
-*          If WANTZ is .TRUE., on entry Z must contain the current
-*          matrix Z of transformations accumulated by DHSEQR, and on
-*          exit Z has been updated; transformations are applied only to
-*          the submatrix Z(ILOZ:IHIZ,ILO:IHI).
-*          If WANTZ is .FALSE., Z is not referenced.
-*
-*     LDZ     (input) INTEGER
-*          The leading dimension of the array Z. LDZ >= max(1,N).
-*
-*     INFO    (output) INTEGER
-*           =   0: successful exit
-*          .GT. 0: If INFO = i, DLAHQR failed to compute all the
-*                  eigenvalues ILO to IHI in a total of 30 iterations
-*                  per eigenvalue; elements i+1:ihi of WR and WI
-*                  contain those eigenvalues which have been
-*                  successfully computed.
-*
-*                  If INFO .GT. 0 and WANTT is .FALSE., then on exit,
-*                  the remaining unconverged eigenvalues are the
-*                  eigenvalues of the upper Hessenberg matrix rows
-*                  and columns ILO thorugh INFO of the final, output
-*                  value of H.
-*
-*                  If INFO .GT. 0 and WANTT is .TRUE., then on exit
-*          (*)       (initial value of H)*U  = U*(final value of H)
-*                  where U is an orthognal matrix.    The final
-*                  value of H is upper Hessenberg and triangular in
-*                  rows and columns INFO+1 through IHI.
-*
-*                  If INFO .GT. 0 and WANTZ is .TRUE., then on exit
-*                      (final value of Z)  = (initial value of Z)*U
-*                  where U is the orthogonal matrix in (*)
-*                  (regardless of the value of WANTT.)
-*
-*     Further Details
-*     ===============
-*
-*     02-96 Based on modifications by
-*     David Day, Sandia National Laboratory, USA
-*
-*     12-04 Further modifications by
-*     Ralph Byers, University of Kansas, USA
-*
-*       This is a modified version of DLAHQR from LAPACK version 3.0.
-*       It is (1) more robust against overflow and underflow and
-*       (2) adopts the more conservative Ahues & Tisseur stopping
-*       criterion (LAWN 122, 1997).
-*
-*     =========================================================
-*
-*     .. Parameters ..
-      INTEGER            ITMAX
-      PARAMETER          ( ITMAX = 30 )
-      DOUBLE PRECISION   ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0d0, ONE = 1.0d0, TWO = 2.0d0 )
-      DOUBLE PRECISION   DAT1, DAT2
-      PARAMETER          ( DAT1 = 3.0d0 / 4.0d0, DAT2 = -0.4375d0 )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   AA, AB, BA, BB, CS, DET, H11, H12, H21, H21S,
-     $                   H22, RT1I, RT1R, RT2I, RT2R, RTDISC, S, SAFMAX,
-     $                   SAFMIN, SMLNUM, SN, SUM, T1, T2, T3, TR, TST,
-     $                   ULP, V2, V3
-      INTEGER            I, I1, I2, ITS, J, K, L, M, NH, NR, NZ
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   V( 3 )
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DLABAD, DLANV2, DLARFG, DROT
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-      IF( ILO.EQ.IHI ) THEN
-         WR( ILO ) = H( ILO, ILO )
-         WI( ILO ) = ZERO
-         RETURN
-      END IF
-*
-*     ==== clear out the trash ====
-      DO 10 J = ILO, IHI - 3
-         H( J+2, J ) = ZERO
-         H( J+3, J ) = ZERO
-   10 CONTINUE
-      IF( ILO.LE.IHI-2 )
-     $   H( IHI, IHI-2 ) = ZERO
-*
-      NH = IHI - ILO + 1
-      NZ = IHIZ - ILOZ + 1
-*
-*     Set machine-dependent constants for the stopping criterion.
-*
-      SAFMIN = DLAMCH( 'SAFE MINIMUM' )
-      SAFMAX = ONE / SAFMIN
-      CALL DLABAD( SAFMIN, SAFMAX )
-      ULP = DLAMCH( 'PRECISION' )
-      SMLNUM = SAFMIN*( DBLE( NH ) / ULP )
-*
-*     I1 and I2 are the indices of the first row and last column of H
-*     to which transformations must be applied. If eigenvalues only are
-*     being computed, I1 and I2 are set inside the main loop.
-*
-      IF( WANTT ) THEN
-         I1 = 1
-         I2 = N
-      END IF
-*
-*     The main loop begins here. I is the loop index and decreases from
-*     IHI to ILO in steps of 1 or 2. Each iteration of the loop works
-*     with the active submatrix in rows and columns L to I.
-*     Eigenvalues I+1 to IHI have already converged. Either L = ILO or
-*     H(L,L-1) is negligible so that the matrix splits.
-*
-      I = IHI
-   20 CONTINUE
-      L = ILO
-      IF( I.LT.ILO )
-     $   GO TO 160
-*
-*     Perform QR iterations on rows and columns ILO to I until a
-*     submatrix of order 1 or 2 splits off at the bottom because a
-*     subdiagonal element has become negligible.
-*
-      DO 140 ITS = 0, ITMAX
-*
-*        Look for a single small subdiagonal element.
-*
-         DO 30 K = I, L + 1, -1
-            IF( ABS( H( K, K-1 ) ).LE.SMLNUM )
-     $         GO TO 40
-            TST = ABS( H( K-1, K-1 ) ) + ABS( H( K, K ) )
-            IF( TST.EQ.ZERO ) THEN
-               IF( K-2.GE.ILO )
-     $            TST = TST + ABS( H( K-1, K-2 ) )
-               IF( K+1.LE.IHI )
-     $            TST = TST + ABS( H( K+1, K ) )
-            END IF
-*           ==== The following is a conservative small subdiagonal
-*           .    deflation  criterion due to Ahues & Tisseur (LAWN 122,
-*           .    1997). It has better mathematical foundation and
-*           .    improves accuracy in some cases.  ====
-            IF( ABS( H( K, K-1 ) ).LE.ULP*TST ) THEN
-               AB = MAX( ABS( H( K, K-1 ) ), ABS( H( K-1, K ) ) )
-               BA = MIN( ABS( H( K, K-1 ) ), ABS( H( K-1, K ) ) )
-               AA = MAX( ABS( H( K, K ) ),
-     $              ABS( H( K-1, K-1 )-H( K, K ) ) )
-               BB = MIN( ABS( H( K, K ) ),
-     $              ABS( H( K-1, K-1 )-H( K, K ) ) )
-               S = AA + AB
-               IF( BA*( AB / S ).LE.MAX( SMLNUM,
-     $             ULP*( BB*( AA / S ) ) ) )GO TO 40
-            END IF
-   30    CONTINUE
-   40    CONTINUE
-         L = K
-         IF( L.GT.ILO ) THEN
-*
-*           H(L,L-1) is negligible
-*
-            H( L, L-1 ) = ZERO
-         END IF
-*
-*        Exit from loop if a submatrix of order 1 or 2 has split off.
-*
-         IF( L.GE.I-1 )
-     $      GO TO 150
-*
-*        Now the active submatrix is in rows and columns L to I. If
-*        eigenvalues only are being computed, only the active submatrix
-*        need be transformed.
-*
-         IF( .NOT.WANTT ) THEN
-            I1 = L
-            I2 = I
-         END IF
-*
-         IF( ITS.EQ.10 .OR. ITS.EQ.20 ) THEN
-*
-*           Exceptional shift.
-*
-            H11 = DAT1*S + H( I, I )
-            H12 = DAT2*S
-            H21 = S
-            H22 = H11
-         ELSE
-*
-*           Prepare to use Francis' double shift
-*           (i.e. 2nd degree generalized Rayleigh quotient)
-*
-            H11 = H( I-1, I-1 )
-            H21 = H( I, I-1 )
-            H12 = H( I-1, I )
-            H22 = H( I, I )
-         END IF
-         S = ABS( H11 ) + ABS( H12 ) + ABS( H21 ) + ABS( H22 )
-         IF( S.EQ.ZERO ) THEN
-            RT1R = ZERO
-            RT1I = ZERO
-            RT2R = ZERO
-            RT2I = ZERO
-         ELSE
-            H11 = H11 / S
-            H21 = H21 / S
-            H12 = H12 / S
-            H22 = H22 / S
-            TR = ( H11+H22 ) / TWO
-            DET = ( H11-TR )*( H22-TR ) - H12*H21
-            RTDISC = SQRT( ABS( DET ) )
-            IF( DET.GE.ZERO ) THEN
-*
-*              ==== complex conjugate shifts ====
-*
-               RT1R = TR*S
-               RT2R = RT1R
-               RT1I = RTDISC*S
-               RT2I = -RT1I
-            ELSE
-*
-*              ==== real shifts (use only one of them)  ====
-*
-               RT1R = TR + RTDISC
-               RT2R = TR - RTDISC
-               IF( ABS( RT1R-H22 ).LE.ABS( RT2R-H22 ) ) THEN
-                  RT1R = RT1R*S
-                  RT2R = RT1R
-               ELSE
-                  RT2R = RT2R*S
-                  RT1R = RT2R
-               END IF
-               RT1I = ZERO
-               RT2I = ZERO
-            END IF
-         END IF
-*
-*        Look for two consecutive small subdiagonal elements.
-*
-         DO 50 M = I - 2, L, -1
-*           Determine the effect of starting the double-shift QR
-*           iteration at row M, and see if this would make H(M,M-1)
-*           negligible.  (The following uses scaling to avoid
-*           overflows and most underflows.)
-*
-            H21S = H( M+1, M )
-            S = ABS( H( M, M )-RT2R ) + ABS( RT2I ) + ABS( H21S )
-            H21S = H( M+1, M ) / S
-            V( 1 ) = H21S*H( M, M+1 ) + ( H( M, M )-RT1R )*
-     $               ( ( H( M, M )-RT2R ) / S ) - RT1I*( RT2I / S )
-            V( 2 ) = H21S*( H( M, M )+H( M+1, M+1 )-RT1R-RT2R )
-            V( 3 ) = H21S*H( M+2, M+1 )
-            S = ABS( V( 1 ) ) + ABS( V( 2 ) ) + ABS( V( 3 ) )
-            V( 1 ) = V( 1 ) / S
-            V( 2 ) = V( 2 ) / S
-            V( 3 ) = V( 3 ) / S
-            IF( M.EQ.L )
-     $         GO TO 60
-            IF( ABS( H( M, M-1 ) )*( ABS( V( 2 ) )+ABS( V( 3 ) ) ).LE.
-     $          ULP*ABS( V( 1 ) )*( ABS( H( M-1, M-1 ) )+ABS( H( M,
-     $          M ) )+ABS( H( M+1, M+1 ) ) ) )GO TO 60
-   50    CONTINUE
-   60    CONTINUE
-*
-*        Double-shift QR step
-*
-         DO 130 K = M, I - 1
-*
-*           The first iteration of this loop determines a reflection G
-*           from the vector V and applies it from left and right to H,
-*           thus creating a nonzero bulge below the subdiagonal.
-*
-*           Each subsequent iteration determines a reflection G to
-*           restore the Hessenberg form in the (K-1)th column, and thus
-*           chases the bulge one step toward the bottom of the active
-*           submatrix. NR is the order of G.
-*
-            NR = MIN( 3, I-K+1 )
-            IF( K.GT.M )
-     $         CALL DCOPY( NR, H( K, K-1 ), 1, V, 1 )
-            CALL DLARFG( NR, V( 1 ), V( 2 ), 1, T1 )
-            IF( K.GT.M ) THEN
-               H( K, K-1 ) = V( 1 )
-               H( K+1, K-1 ) = ZERO
-               IF( K.LT.I-1 )
-     $            H( K+2, K-1 ) = ZERO
-            ELSE IF( M.GT.L ) THEN
-               H( K, K-1 ) = -H( K, K-1 )
-            END IF
-            V2 = V( 2 )
-            T2 = T1*V2
-            IF( NR.EQ.3 ) THEN
-               V3 = V( 3 )
-               T3 = T1*V3
-*
-*              Apply G from the left to transform the rows of the matrix
-*              in columns K to I2.
-*
-               DO 70 J = K, I2
-                  SUM = H( K, J ) + V2*H( K+1, J ) + V3*H( K+2, J )
-                  H( K, J ) = H( K, J ) - SUM*T1
-                  H( K+1, J ) = H( K+1, J ) - SUM*T2
-                  H( K+2, J ) = H( K+2, J ) - SUM*T3
-   70          CONTINUE
-*
-*              Apply G from the right to transform the columns of the
-*              matrix in rows I1 to min(K+3,I).
-*
-               DO 80 J = I1, MIN( K+3, I )
-                  SUM = H( J, K ) + V2*H( J, K+1 ) + V3*H( J, K+2 )
-                  H( J, K ) = H( J, K ) - SUM*T1
-                  H( J, K+1 ) = H( J, K+1 ) - SUM*T2
-                  H( J, K+2 ) = H( J, K+2 ) - SUM*T3
-   80          CONTINUE
-*
-               IF( WANTZ ) THEN
-*
-*                 Accumulate transformations in the matrix Z
-*
-                  DO 90 J = ILOZ, IHIZ
-                     SUM = Z( J, K ) + V2*Z( J, K+1 ) + V3*Z( J, K+2 )
-                     Z( J, K ) = Z( J, K ) - SUM*T1
-                     Z( J, K+1 ) = Z( J, K+1 ) - SUM*T2
-                     Z( J, K+2 ) = Z( J, K+2 ) - SUM*T3
-   90             CONTINUE
-               END IF
-            ELSE IF( NR.EQ.2 ) THEN
-*
-*              Apply G from the left to transform the rows of the matrix
-*              in columns K to I2.
-*
-               DO 100 J = K, I2
-                  SUM = H( K, J ) + V2*H( K+1, J )
-                  H( K, J ) = H( K, J ) - SUM*T1
-                  H( K+1, J ) = H( K+1, J ) - SUM*T2
-  100          CONTINUE
-*
-*              Apply G from the right to transform the columns of the
-*              matrix in rows I1 to min(K+3,I).
-*
-               DO 110 J = I1, I
-                  SUM = H( J, K ) + V2*H( J, K+1 )
-                  H( J, K ) = H( J, K ) - SUM*T1
-                  H( J, K+1 ) = H( J, K+1 ) - SUM*T2
-  110          CONTINUE
-*
-               IF( WANTZ ) THEN
-*
-*                 Accumulate transformations in the matrix Z
-*
-                  DO 120 J = ILOZ, IHIZ
-                     SUM = Z( J, K ) + V2*Z( J, K+1 )
-                     Z( J, K ) = Z( J, K ) - SUM*T1
-                     Z( J, K+1 ) = Z( J, K+1 ) - SUM*T2
-  120             CONTINUE
-               END IF
-            END IF
-  130    CONTINUE
-*
-  140 CONTINUE
-*
-*     Failure to converge in remaining number of iterations
-*
-      INFO = I
-      RETURN
-*
-  150 CONTINUE
-*
-      IF( L.EQ.I ) THEN
-*
-*        H(I,I-1) is negligible: one eigenvalue has converged.
-*
-         WR( I ) = H( I, I )
-         WI( I ) = ZERO
-      ELSE IF( L.EQ.I-1 ) THEN
-*
-*        H(I-1,I-2) is negligible: a pair of eigenvalues have converged.
-*
-*        Transform the 2-by-2 submatrix to standard Schur form,
-*        and compute and store the eigenvalues.
-*
-         CALL DLANV2( H( I-1, I-1 ), H( I-1, I ), H( I, I-1 ),
-     $                H( I, I ), WR( I-1 ), WI( I-1 ), WR( I ), WI( I ),
-     $                CS, SN )
-*
-         IF( WANTT ) THEN
-*
-*           Apply the transformation to the rest of H.
-*
-            IF( I2.GT.I )
-     $         CALL DROT( I2-I, H( I-1, I+1 ), LDH, H( I, I+1 ), LDH,
-     $                    CS, SN )
-            CALL DROT( I-I1-1, H( I1, I-1 ), 1, H( I1, I ), 1, CS, SN )
-         END IF
-         IF( WANTZ ) THEN
-*
-*           Apply the transformation to Z.
-*
-            CALL DROT( NZ, Z( ILOZ, I-1 ), 1, Z( ILOZ, I ), 1, CS, SN )
-         END IF
-      END IF
-*
-*     return to start of the main loop with new value of I.
-*
-      I = L - 1
-      GO TO 20
-*
-  160 CONTINUE
-      RETURN
-*
-*     End of DLAHQR
-*
-      END
--- a/libcruft/lapack/dlahr2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,238 +0,0 @@
-      SUBROUTINE DLAHR2( N, K, NB, A, LDA, TAU, T, LDT, Y, LDY )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            K, LDA, LDT, LDY, N, NB
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION  A( LDA, * ), T( LDT, NB ), TAU( NB ),
-     $                   Y( LDY, NB )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAHR2 reduces the first NB columns of A real general n-BY-(n-k+1)
-*  matrix A so that elements below the k-th subdiagonal are zero. The
-*  reduction is performed by an orthogonal similarity transformation
-*  Q' * A * Q. The routine returns the matrices V and T which determine
-*  Q as a block reflector I - V*T*V', and also the matrix Y = A * V * T.
-*
-*  This is an auxiliary routine called by DGEHRD.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  K       (input) INTEGER
-*          The offset for the reduction. Elements below the k-th
-*          subdiagonal in the first NB columns are reduced to zero.
-*          K < N.
-*
-*  NB      (input) INTEGER
-*          The number of columns to be reduced.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N-K+1)
-*          On entry, the n-by-(n-k+1) general matrix A.
-*          On exit, the elements on and above the k-th subdiagonal in
-*          the first NB columns are overwritten with the corresponding
-*          elements of the reduced matrix; the elements below the k-th
-*          subdiagonal, with the array TAU, represent the matrix Q as a
-*          product of elementary reflectors. The other columns of A are
-*          unchanged. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  TAU     (output) DOUBLE PRECISION array, dimension (NB)
-*          The scalar factors of the elementary reflectors. See Further
-*          Details.
-*
-*  T       (output) DOUBLE PRECISION array, dimension (LDT,NB)
-*          The upper triangular matrix T.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T.  LDT >= NB.
-*
-*  Y       (output) DOUBLE PRECISION array, dimension (LDY,NB)
-*          The n-by-nb matrix Y.
-*
-*  LDY     (input) INTEGER
-*          The leading dimension of the array Y. LDY >= N.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of nb elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(nb).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i+k-1) = 0, v(i+k) = 1; v(i+k+1:n) is stored on exit in
-*  A(i+k+1:n,i), and tau in TAU(i).
-*
-*  The elements of the vectors v together form the (n-k+1)-by-nb matrix
-*  V which is needed, with T and Y, to apply the transformation to the
-*  unreduced part of the matrix, using an update of the form:
-*  A := (I - V*T*V') * (A - Y*V').
-*
-*  The contents of A on exit are illustrated by the following example
-*  with n = 7, k = 3 and nb = 2:
-*
-*     ( a   a   a   a   a )
-*     ( a   a   a   a   a )
-*     ( a   a   a   a   a )
-*     ( h   h   a   a   a )
-*     ( v1  h   a   a   a )
-*     ( v1  v2  a   a   a )
-*     ( v1  v2  a   a   a )
-*
-*  where a denotes an element of the original matrix A, h denotes a
-*  modified element of the upper Hessenberg matrix H, and vi denotes an
-*  element of the vector defining H(i).
-*
-*  This file is a slight modification of LAPACK-3.0's DLAHRD
-*  incorporating improvements proposed by Quintana-Orti and Van de
-*  Gejin. Note that the entries of A(1:K,2:NB) differ from those
-*  returned by the original LAPACK routine. This function is
-*  not backward compatible with LAPACK3.0.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION  ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, 
-     $                     ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      DOUBLE PRECISION  EI
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DAXPY, DCOPY, DGEMM, DGEMV, DLACPY,
-     $                   DLARFG, DSCAL, DTRMM, DTRMV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 )
-     $   RETURN
-*
-      DO 10 I = 1, NB
-         IF( I.GT.1 ) THEN
-*
-*           Update A(K+1:N,I)
-*
-*           Update I-th column of A - Y * V'
-*
-            CALL DGEMV( 'NO TRANSPOSE', N-K, I-1, -ONE, Y(K+1,1), LDY,
-     $                  A( K+I-1, 1 ), LDA, ONE, A( K+1, I ), 1 )
-*
-*           Apply I - V * T' * V' to this column (call it b) from the
-*           left, using the last column of T as workspace
-*
-*           Let  V = ( V1 )   and   b = ( b1 )   (first I-1 rows)
-*                    ( V2 )             ( b2 )
-*
-*           where V1 is unit lower triangular
-*
-*           w := V1' * b1
-*
-            CALL DCOPY( I-1, A( K+1, I ), 1, T( 1, NB ), 1 )
-            CALL DTRMV( 'Lower', 'Transpose', 'UNIT', 
-     $                  I-1, A( K+1, 1 ),
-     $                  LDA, T( 1, NB ), 1 )
-*
-*           w := w + V2'*b2
-*
-            CALL DGEMV( 'Transpose', N-K-I+1, I-1, 
-     $                  ONE, A( K+I, 1 ),
-     $                  LDA, A( K+I, I ), 1, ONE, T( 1, NB ), 1 )
-*
-*           w := T'*w
-*
-            CALL DTRMV( 'Upper', 'Transpose', 'NON-UNIT', 
-     $                  I-1, T, LDT,
-     $                  T( 1, NB ), 1 )
-*
-*           b2 := b2 - V2*w
-*
-            CALL DGEMV( 'NO TRANSPOSE', N-K-I+1, I-1, -ONE, 
-     $                  A( K+I, 1 ),
-     $                  LDA, T( 1, NB ), 1, ONE, A( K+I, I ), 1 )
-*
-*           b1 := b1 - V1*w
-*
-            CALL DTRMV( 'Lower', 'NO TRANSPOSE', 
-     $                  'UNIT', I-1,
-     $                  A( K+1, 1 ), LDA, T( 1, NB ), 1 )
-            CALL DAXPY( I-1, -ONE, T( 1, NB ), 1, A( K+1, I ), 1 )
-*
-            A( K+I-1, I-1 ) = EI
-         END IF
-*
-*        Generate the elementary reflector H(I) to annihilate
-*        A(K+I+1:N,I)
-*
-         CALL DLARFG( N-K-I+1, A( K+I, I ), A( MIN( K+I+1, N ), I ), 1,
-     $                TAU( I ) )
-         EI = A( K+I, I )
-         A( K+I, I ) = ONE
-*
-*        Compute  Y(K+1:N,I)
-*
-         CALL DGEMV( 'NO TRANSPOSE', N-K, N-K-I+1, 
-     $               ONE, A( K+1, I+1 ),
-     $               LDA, A( K+I, I ), 1, ZERO, Y( K+1, I ), 1 )
-         CALL DGEMV( 'Transpose', N-K-I+1, I-1, 
-     $               ONE, A( K+I, 1 ), LDA,
-     $               A( K+I, I ), 1, ZERO, T( 1, I ), 1 )
-         CALL DGEMV( 'NO TRANSPOSE', N-K, I-1, -ONE, 
-     $               Y( K+1, 1 ), LDY,
-     $               T( 1, I ), 1, ONE, Y( K+1, I ), 1 )
-         CALL DSCAL( N-K, TAU( I ), Y( K+1, I ), 1 )
-*
-*        Compute T(1:I,I)
-*
-         CALL DSCAL( I-1, -TAU( I ), T( 1, I ), 1 )
-         CALL DTRMV( 'Upper', 'No Transpose', 'NON-UNIT', 
-     $               I-1, T, LDT,
-     $               T( 1, I ), 1 )
-         T( I, I ) = TAU( I )
-*
-   10 CONTINUE
-      A( K+NB, NB ) = EI
-*
-*     Compute Y(1:K,1:NB)
-*
-      CALL DLACPY( 'ALL', K, NB, A( 1, 2 ), LDA, Y, LDY )
-      CALL DTRMM( 'RIGHT', 'Lower', 'NO TRANSPOSE', 
-     $            'UNIT', K, NB,
-     $            ONE, A( K+1, 1 ), LDA, Y, LDY )
-      IF( N.GT.K+NB )
-     $   CALL DGEMM( 'NO TRANSPOSE', 'NO TRANSPOSE', K, 
-     $               NB, N-K-NB, ONE,
-     $               A( 1, 2+NB ), LDA, A( K+1+NB, 1 ), LDA, ONE, Y,
-     $               LDY )
-      CALL DTRMM( 'RIGHT', 'Upper', 'NO TRANSPOSE', 
-     $            'NON-UNIT', K, NB,
-     $            ONE, T, LDT, Y, LDY )
-*
-      RETURN
-*
-*     End of DLAHR2
-*
-      END
--- a/libcruft/lapack/dlahrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,207 +0,0 @@
-      SUBROUTINE DLAHRD( N, K, NB, A, LDA, TAU, T, LDT, Y, LDY )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            K, LDA, LDT, LDY, N, NB
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), T( LDT, NB ), TAU( NB ),
-     $                   Y( LDY, NB )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAHRD reduces the first NB columns of a real general n-by-(n-k+1)
-*  matrix A so that elements below the k-th subdiagonal are zero. The
-*  reduction is performed by an orthogonal similarity transformation
-*  Q' * A * Q. The routine returns the matrices V and T which determine
-*  Q as a block reflector I - V*T*V', and also the matrix Y = A * V * T.
-*
-*  This is an OBSOLETE auxiliary routine. 
-*  This routine will be 'deprecated' in a  future release.
-*  Please use the new routine DLAHR2 instead.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  K       (input) INTEGER
-*          The offset for the reduction. Elements below the k-th
-*          subdiagonal in the first NB columns are reduced to zero.
-*
-*  NB      (input) INTEGER
-*          The number of columns to be reduced.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N-K+1)
-*          On entry, the n-by-(n-k+1) general matrix A.
-*          On exit, the elements on and above the k-th subdiagonal in
-*          the first NB columns are overwritten with the corresponding
-*          elements of the reduced matrix; the elements below the k-th
-*          subdiagonal, with the array TAU, represent the matrix Q as a
-*          product of elementary reflectors. The other columns of A are
-*          unchanged. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  TAU     (output) DOUBLE PRECISION array, dimension (NB)
-*          The scalar factors of the elementary reflectors. See Further
-*          Details.
-*
-*  T       (output) DOUBLE PRECISION array, dimension (LDT,NB)
-*          The upper triangular matrix T.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T.  LDT >= NB.
-*
-*  Y       (output) DOUBLE PRECISION array, dimension (LDY,NB)
-*          The n-by-nb matrix Y.
-*
-*  LDY     (input) INTEGER
-*          The leading dimension of the array Y. LDY >= N.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of nb elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(nb).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i+k-1) = 0, v(i+k) = 1; v(i+k+1:n) is stored on exit in
-*  A(i+k+1:n,i), and tau in TAU(i).
-*
-*  The elements of the vectors v together form the (n-k+1)-by-nb matrix
-*  V which is needed, with T and Y, to apply the transformation to the
-*  unreduced part of the matrix, using an update of the form:
-*  A := (I - V*T*V') * (A - Y*V').
-*
-*  The contents of A on exit are illustrated by the following example
-*  with n = 7, k = 3 and nb = 2:
-*
-*     ( a   h   a   a   a )
-*     ( a   h   a   a   a )
-*     ( a   h   a   a   a )
-*     ( h   h   a   a   a )
-*     ( v1  h   a   a   a )
-*     ( v1  v2  a   a   a )
-*     ( v1  v2  a   a   a )
-*
-*  where a denotes an element of the original matrix A, h denotes a
-*  modified element of the upper Hessenberg matrix H, and vi denotes an
-*  element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      DOUBLE PRECISION   EI
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DAXPY, DCOPY, DGEMV, DLARFG, DSCAL, DTRMV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 )
-     $   RETURN
-*
-      DO 10 I = 1, NB
-         IF( I.GT.1 ) THEN
-*
-*           Update A(1:n,i)
-*
-*           Compute i-th column of A - Y * V'
-*
-            CALL DGEMV( 'No transpose', N, I-1, -ONE, Y, LDY,
-     $                  A( K+I-1, 1 ), LDA, ONE, A( 1, I ), 1 )
-*
-*           Apply I - V * T' * V' to this column (call it b) from the
-*           left, using the last column of T as workspace
-*
-*           Let  V = ( V1 )   and   b = ( b1 )   (first I-1 rows)
-*                    ( V2 )             ( b2 )
-*
-*           where V1 is unit lower triangular
-*
-*           w := V1' * b1
-*
-            CALL DCOPY( I-1, A( K+1, I ), 1, T( 1, NB ), 1 )
-            CALL DTRMV( 'Lower', 'Transpose', 'Unit', I-1, A( K+1, 1 ),
-     $                  LDA, T( 1, NB ), 1 )
-*
-*           w := w + V2'*b2
-*
-            CALL DGEMV( 'Transpose', N-K-I+1, I-1, ONE, A( K+I, 1 ),
-     $                  LDA, A( K+I, I ), 1, ONE, T( 1, NB ), 1 )
-*
-*           w := T'*w
-*
-            CALL DTRMV( 'Upper', 'Transpose', 'Non-unit', I-1, T, LDT,
-     $                  T( 1, NB ), 1 )
-*
-*           b2 := b2 - V2*w
-*
-            CALL DGEMV( 'No transpose', N-K-I+1, I-1, -ONE, A( K+I, 1 ),
-     $                  LDA, T( 1, NB ), 1, ONE, A( K+I, I ), 1 )
-*
-*           b1 := b1 - V1*w
-*
-            CALL DTRMV( 'Lower', 'No transpose', 'Unit', I-1,
-     $                  A( K+1, 1 ), LDA, T( 1, NB ), 1 )
-            CALL DAXPY( I-1, -ONE, T( 1, NB ), 1, A( K+1, I ), 1 )
-*
-            A( K+I-1, I-1 ) = EI
-         END IF
-*
-*        Generate the elementary reflector H(i) to annihilate
-*        A(k+i+1:n,i)
-*
-         CALL DLARFG( N-K-I+1, A( K+I, I ), A( MIN( K+I+1, N ), I ), 1,
-     $                TAU( I ) )
-         EI = A( K+I, I )
-         A( K+I, I ) = ONE
-*
-*        Compute  Y(1:n,i)
-*
-         CALL DGEMV( 'No transpose', N, N-K-I+1, ONE, A( 1, I+1 ), LDA,
-     $               A( K+I, I ), 1, ZERO, Y( 1, I ), 1 )
-         CALL DGEMV( 'Transpose', N-K-I+1, I-1, ONE, A( K+I, 1 ), LDA,
-     $               A( K+I, I ), 1, ZERO, T( 1, I ), 1 )
-         CALL DGEMV( 'No transpose', N, I-1, -ONE, Y, LDY, T( 1, I ), 1,
-     $               ONE, Y( 1, I ), 1 )
-         CALL DSCAL( N, TAU( I ), Y( 1, I ), 1 )
-*
-*        Compute T(1:i,i)
-*
-         CALL DSCAL( I-1, -TAU( I ), T( 1, I ), 1 )
-         CALL DTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, LDT,
-     $               T( 1, I ), 1 )
-         T( I, I ) = TAU( I )
-*
-   10 CONTINUE
-      A( K+NB, NB ) = EI
-*
-      RETURN
-*
-*     End of DLAHRD
-*
-      END
--- a/libcruft/lapack/dlaic1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,292 +0,0 @@
-      SUBROUTINE DLAIC1( JOB, J, X, SEST, W, GAMMA, SESTPR, S, C )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            J, JOB
-      DOUBLE PRECISION   C, GAMMA, S, SEST, SESTPR
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   W( J ), X( J )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAIC1 applies one step of incremental condition estimation in
-*  its simplest version:
-*
-*  Let x, twonorm(x) = 1, be an approximate singular vector of an j-by-j
-*  lower triangular matrix L, such that
-*           twonorm(L*x) = sest
-*  Then DLAIC1 computes sestpr, s, c such that
-*  the vector
-*                  [ s*x ]
-*           xhat = [  c  ]
-*  is an approximate singular vector of
-*                  [ L     0  ]
-*           Lhat = [ w' gamma ]
-*  in the sense that
-*           twonorm(Lhat*xhat) = sestpr.
-*
-*  Depending on JOB, an estimate for the largest or smallest singular
-*  value is computed.
-*
-*  Note that [s c]' and sestpr**2 is an eigenpair of the system
-*
-*      diag(sest*sest, 0) + [alpha  gamma] * [ alpha ]
-*                                            [ gamma ]
-*
-*  where  alpha =  x'*w.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) INTEGER
-*          = 1: an estimate for the largest singular value is computed.
-*          = 2: an estimate for the smallest singular value is computed.
-*
-*  J       (input) INTEGER
-*          Length of X and W
-*
-*  X       (input) DOUBLE PRECISION array, dimension (J)
-*          The j-vector x.
-*
-*  SEST    (input) DOUBLE PRECISION
-*          Estimated singular value of j by j matrix L
-*
-*  W       (input) DOUBLE PRECISION array, dimension (J)
-*          The j-vector w.
-*
-*  GAMMA   (input) DOUBLE PRECISION
-*          The diagonal element gamma.
-*
-*  SESTPR  (output) DOUBLE PRECISION
-*          Estimated singular value of (j+1) by (j+1) matrix Lhat.
-*
-*  S       (output) DOUBLE PRECISION
-*          Sine needed in forming xhat.
-*
-*  C       (output) DOUBLE PRECISION
-*          Cosine needed in forming xhat.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0 )
-      DOUBLE PRECISION   HALF, FOUR
-      PARAMETER          ( HALF = 0.5D0, FOUR = 4.0D0 )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   ABSALP, ABSEST, ABSGAM, ALPHA, B, COSINE, EPS,
-     $                   NORMA, S1, S2, SINE, T, TEST, TMP, ZETA1, ZETA2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SIGN, SQRT
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DDOT, DLAMCH
-      EXTERNAL           DDOT, DLAMCH
-*     ..
-*     .. Executable Statements ..
-*
-      EPS = DLAMCH( 'Epsilon' )
-      ALPHA = DDOT( J, X, 1, W, 1 )
-*
-      ABSALP = ABS( ALPHA )
-      ABSGAM = ABS( GAMMA )
-      ABSEST = ABS( SEST )
-*
-      IF( JOB.EQ.1 ) THEN
-*
-*        Estimating largest singular value
-*
-*        special cases
-*
-         IF( SEST.EQ.ZERO ) THEN
-            S1 = MAX( ABSGAM, ABSALP )
-            IF( S1.EQ.ZERO ) THEN
-               S = ZERO
-               C = ONE
-               SESTPR = ZERO
-            ELSE
-               S = ALPHA / S1
-               C = GAMMA / S1
-               TMP = SQRT( S*S+C*C )
-               S = S / TMP
-               C = C / TMP
-               SESTPR = S1*TMP
-            END IF
-            RETURN
-         ELSE IF( ABSGAM.LE.EPS*ABSEST ) THEN
-            S = ONE
-            C = ZERO
-            TMP = MAX( ABSEST, ABSALP )
-            S1 = ABSEST / TMP
-            S2 = ABSALP / TMP
-            SESTPR = TMP*SQRT( S1*S1+S2*S2 )
-            RETURN
-         ELSE IF( ABSALP.LE.EPS*ABSEST ) THEN
-            S1 = ABSGAM
-            S2 = ABSEST
-            IF( S1.LE.S2 ) THEN
-               S = ONE
-               C = ZERO
-               SESTPR = S2
-            ELSE
-               S = ZERO
-               C = ONE
-               SESTPR = S1
-            END IF
-            RETURN
-         ELSE IF( ABSEST.LE.EPS*ABSALP .OR. ABSEST.LE.EPS*ABSGAM ) THEN
-            S1 = ABSGAM
-            S2 = ABSALP
-            IF( S1.LE.S2 ) THEN
-               TMP = S1 / S2
-               S = SQRT( ONE+TMP*TMP )
-               SESTPR = S2*S
-               C = ( GAMMA / S2 ) / S
-               S = SIGN( ONE, ALPHA ) / S
-            ELSE
-               TMP = S2 / S1
-               C = SQRT( ONE+TMP*TMP )
-               SESTPR = S1*C
-               S = ( ALPHA / S1 ) / C
-               C = SIGN( ONE, GAMMA ) / C
-            END IF
-            RETURN
-         ELSE
-*
-*           normal case
-*
-            ZETA1 = ALPHA / ABSEST
-            ZETA2 = GAMMA / ABSEST
-*
-            B = ( ONE-ZETA1*ZETA1-ZETA2*ZETA2 )*HALF
-            C = ZETA1*ZETA1
-            IF( B.GT.ZERO ) THEN
-               T = C / ( B+SQRT( B*B+C ) )
-            ELSE
-               T = SQRT( B*B+C ) - B
-            END IF
-*
-            SINE = -ZETA1 / T
-            COSINE = -ZETA2 / ( ONE+T )
-            TMP = SQRT( SINE*SINE+COSINE*COSINE )
-            S = SINE / TMP
-            C = COSINE / TMP
-            SESTPR = SQRT( T+ONE )*ABSEST
-            RETURN
-         END IF
-*
-      ELSE IF( JOB.EQ.2 ) THEN
-*
-*        Estimating smallest singular value
-*
-*        special cases
-*
-         IF( SEST.EQ.ZERO ) THEN
-            SESTPR = ZERO
-            IF( MAX( ABSGAM, ABSALP ).EQ.ZERO ) THEN
-               SINE = ONE
-               COSINE = ZERO
-            ELSE
-               SINE = -GAMMA
-               COSINE = ALPHA
-            END IF
-            S1 = MAX( ABS( SINE ), ABS( COSINE ) )
-            S = SINE / S1
-            C = COSINE / S1
-            TMP = SQRT( S*S+C*C )
-            S = S / TMP
-            C = C / TMP
-            RETURN
-         ELSE IF( ABSGAM.LE.EPS*ABSEST ) THEN
-            S = ZERO
-            C = ONE
-            SESTPR = ABSGAM
-            RETURN
-         ELSE IF( ABSALP.LE.EPS*ABSEST ) THEN
-            S1 = ABSGAM
-            S2 = ABSEST
-            IF( S1.LE.S2 ) THEN
-               S = ZERO
-               C = ONE
-               SESTPR = S1
-            ELSE
-               S = ONE
-               C = ZERO
-               SESTPR = S2
-            END IF
-            RETURN
-         ELSE IF( ABSEST.LE.EPS*ABSALP .OR. ABSEST.LE.EPS*ABSGAM ) THEN
-            S1 = ABSGAM
-            S2 = ABSALP
-            IF( S1.LE.S2 ) THEN
-               TMP = S1 / S2
-               C = SQRT( ONE+TMP*TMP )
-               SESTPR = ABSEST*( TMP / C )
-               S = -( GAMMA / S2 ) / C
-               C = SIGN( ONE, ALPHA ) / C
-            ELSE
-               TMP = S2 / S1
-               S = SQRT( ONE+TMP*TMP )
-               SESTPR = ABSEST / S
-               C = ( ALPHA / S1 ) / S
-               S = -SIGN( ONE, GAMMA ) / S
-            END IF
-            RETURN
-         ELSE
-*
-*           normal case
-*
-            ZETA1 = ALPHA / ABSEST
-            ZETA2 = GAMMA / ABSEST
-*
-            NORMA = MAX( ONE+ZETA1*ZETA1+ABS( ZETA1*ZETA2 ),
-     $              ABS( ZETA1*ZETA2 )+ZETA2*ZETA2 )
-*
-*           See if root is closer to zero or to ONE
-*
-            TEST = ONE + TWO*( ZETA1-ZETA2 )*( ZETA1+ZETA2 )
-            IF( TEST.GE.ZERO ) THEN
-*
-*              root is close to zero, compute directly
-*
-               B = ( ZETA1*ZETA1+ZETA2*ZETA2+ONE )*HALF
-               C = ZETA2*ZETA2
-               T = C / ( B+SQRT( ABS( B*B-C ) ) )
-               SINE = ZETA1 / ( ONE-T )
-               COSINE = -ZETA2 / T
-               SESTPR = SQRT( T+FOUR*EPS*EPS*NORMA )*ABSEST
-            ELSE
-*
-*              root is closer to ONE, shift by that amount
-*
-               B = ( ZETA2*ZETA2+ZETA1*ZETA1-ONE )*HALF
-               C = ZETA1*ZETA1
-               IF( B.GE.ZERO ) THEN
-                  T = -C / ( B+SQRT( B*B+C ) )
-               ELSE
-                  T = B - SQRT( B*B+C )
-               END IF
-               SINE = -ZETA1 / T
-               COSINE = -ZETA2 / ( ONE+T )
-               SESTPR = SQRT( ONE+T+FOUR*EPS*EPS*NORMA )*ABSEST
-            END IF
-            TMP = SQRT( SINE*SINE+COSINE*COSINE )
-            S = SINE / TMP
-            C = COSINE / TMP
-            RETURN
-*
-         END IF
-      END IF
-      RETURN
-*
-*     End of DLAIC1
-*
-      END
--- a/libcruft/lapack/dlaln2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,507 +0,0 @@
-      SUBROUTINE DLALN2( LTRANS, NA, NW, SMIN, CA, A, LDA, D1, D2, B,
-     $                   LDB, WR, WI, X, LDX, SCALE, XNORM, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            LTRANS
-      INTEGER            INFO, LDA, LDB, LDX, NA, NW
-      DOUBLE PRECISION   CA, D1, D2, SCALE, SMIN, WI, WR, XNORM
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), X( LDX, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLALN2 solves a system of the form  (ca A - w D ) X = s B
-*  or (ca A' - w D) X = s B   with possible scaling ("s") and
-*  perturbation of A.  (A' means A-transpose.)
-*
-*  A is an NA x NA real matrix, ca is a real scalar, D is an NA x NA
-*  real diagonal matrix, w is a real or complex value, and X and B are
-*  NA x 1 matrices -- real if w is real, complex if w is complex.  NA
-*  may be 1 or 2.
-*
-*  If w is complex, X and B are represented as NA x 2 matrices,
-*  the first column of each being the real part and the second
-*  being the imaginary part.
-*
-*  "s" is a scaling factor (.LE. 1), computed by DLALN2, which is
-*  so chosen that X can be computed without overflow.  X is further
-*  scaled if necessary to assure that norm(ca A - w D)*norm(X) is less
-*  than overflow.
-*
-*  If both singular values of (ca A - w D) are less than SMIN,
-*  SMIN*identity will be used instead of (ca A - w D).  If only one
-*  singular value is less than SMIN, one element of (ca A - w D) will be
-*  perturbed enough to make the smallest singular value roughly SMIN.
-*  If both singular values are at least SMIN, (ca A - w D) will not be
-*  perturbed.  In any case, the perturbation will be at most some small
-*  multiple of max( SMIN, ulp*norm(ca A - w D) ).  The singular values
-*  are computed by infinity-norm approximations, and thus will only be
-*  correct to a factor of 2 or so.
-*
-*  Note: all input quantities are assumed to be smaller than overflow
-*  by a reasonable factor.  (See BIGNUM.)
-*
-*  Arguments
-*  ==========
-*
-*  LTRANS  (input) LOGICAL
-*          =.TRUE.:  A-transpose will be used.
-*          =.FALSE.: A will be used (not transposed.)
-*
-*  NA      (input) INTEGER
-*          The size of the matrix A.  It may (only) be 1 or 2.
-*
-*  NW      (input) INTEGER
-*          1 if "w" is real, 2 if "w" is complex.  It may only be 1
-*          or 2.
-*
-*  SMIN    (input) DOUBLE PRECISION
-*          The desired lower bound on the singular values of A.  This
-*          should be a safe distance away from underflow or overflow,
-*          say, between (underflow/machine precision) and  (machine
-*          precision * overflow ).  (See BIGNUM and ULP.)
-*
-*  CA      (input) DOUBLE PRECISION
-*          The coefficient c, which A is multiplied by.
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA,NA)
-*          The NA x NA matrix A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of A.  It must be at least NA.
-*
-*  D1      (input) DOUBLE PRECISION
-*          The 1,1 element in the diagonal matrix D.
-*
-*  D2      (input) DOUBLE PRECISION
-*          The 2,2 element in the diagonal matrix D.  Not used if NW=1.
-*
-*  B       (input) DOUBLE PRECISION array, dimension (LDB,NW)
-*          The NA x NW matrix B (right-hand side).  If NW=2 ("w" is
-*          complex), column 1 contains the real part of B and column 2
-*          contains the imaginary part.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of B.  It must be at least NA.
-*
-*  WR      (input) DOUBLE PRECISION
-*          The real part of the scalar "w".
-*
-*  WI      (input) DOUBLE PRECISION
-*          The imaginary part of the scalar "w".  Not used if NW=1.
-*
-*  X       (output) DOUBLE PRECISION array, dimension (LDX,NW)
-*          The NA x NW matrix X (unknowns), as computed by DLALN2.
-*          If NW=2 ("w" is complex), on exit, column 1 will contain
-*          the real part of X and column 2 will contain the imaginary
-*          part.
-*
-*  LDX     (input) INTEGER
-*          The leading dimension of X.  It must be at least NA.
-*
-*  SCALE   (output) DOUBLE PRECISION
-*          The scale factor that B must be multiplied by to insure
-*          that overflow does not occur when computing X.  Thus,
-*          (ca A - w D) X  will be SCALE*B, not B (ignoring
-*          perturbations of A.)  It will be at most 1.
-*
-*  XNORM   (output) DOUBLE PRECISION
-*          The infinity-norm of X, when X is regarded as an NA x NW
-*          real matrix.
-*
-*  INFO    (output) INTEGER
-*          An error flag.  It will be set to zero if no error occurs,
-*          a negative number if an argument is in error, or a positive
-*          number if  ca A - w D  had to be perturbed.
-*          The possible values are:
-*          = 0: No error occurred, and (ca A - w D) did not have to be
-*                 perturbed.
-*          = 1: (ca A - w D) had to be perturbed to make its smallest
-*               (or only) singular value greater than SMIN.
-*          NOTE: In the interests of speed, this routine does not
-*                check the inputs for errors.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
-      DOUBLE PRECISION   TWO
-      PARAMETER          ( TWO = 2.0D0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            ICMAX, J
-      DOUBLE PRECISION   BBND, BI1, BI2, BIGNUM, BNORM, BR1, BR2, CI21,
-     $                   CI22, CMAX, CNORM, CR21, CR22, CSI, CSR, LI21,
-     $                   LR21, SMINI, SMLNUM, TEMP, U22ABS, UI11, UI11R,
-     $                   UI12, UI12S, UI22, UR11, UR11R, UR12, UR12S,
-     $                   UR22, XI1, XI2, XR1, XR2
-*     ..
-*     .. Local Arrays ..
-      LOGICAL            RSWAP( 4 ), ZSWAP( 4 )
-      INTEGER            IPIVOT( 4, 4 )
-      DOUBLE PRECISION   CI( 2, 2 ), CIV( 4 ), CR( 2, 2 ), CRV( 4 )
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLADIV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Equivalences ..
-      EQUIVALENCE        ( CI( 1, 1 ), CIV( 1 ) ),
-     $                   ( CR( 1, 1 ), CRV( 1 ) )
-*     ..
-*     .. Data statements ..
-      DATA               ZSWAP / .FALSE., .FALSE., .TRUE., .TRUE. /
-      DATA               RSWAP / .FALSE., .TRUE., .FALSE., .TRUE. /
-      DATA               IPIVOT / 1, 2, 3, 4, 2, 1, 4, 3, 3, 4, 1, 2, 4,
-     $                   3, 2, 1 /
-*     ..
-*     .. Executable Statements ..
-*
-*     Compute BIGNUM
-*
-      SMLNUM = TWO*DLAMCH( 'Safe minimum' )
-      BIGNUM = ONE / SMLNUM
-      SMINI = MAX( SMIN, SMLNUM )
-*
-*     Don't check for input errors
-*
-      INFO = 0
-*
-*     Standard Initializations
-*
-      SCALE = ONE
-*
-      IF( NA.EQ.1 ) THEN
-*
-*        1 x 1  (i.e., scalar) system   C X = B
-*
-         IF( NW.EQ.1 ) THEN
-*
-*           Real 1x1 system.
-*
-*           C = ca A - w D
-*
-            CSR = CA*A( 1, 1 ) - WR*D1
-            CNORM = ABS( CSR )
-*
-*           If | C | < SMINI, use C = SMINI
-*
-            IF( CNORM.LT.SMINI ) THEN
-               CSR = SMINI
-               CNORM = SMINI
-               INFO = 1
-            END IF
-*
-*           Check scaling for  X = B / C
-*
-            BNORM = ABS( B( 1, 1 ) )
-            IF( CNORM.LT.ONE .AND. BNORM.GT.ONE ) THEN
-               IF( BNORM.GT.BIGNUM*CNORM )
-     $            SCALE = ONE / BNORM
-            END IF
-*
-*           Compute X
-*
-            X( 1, 1 ) = ( B( 1, 1 )*SCALE ) / CSR
-            XNORM = ABS( X( 1, 1 ) )
-         ELSE
-*
-*           Complex 1x1 system (w is complex)
-*
-*           C = ca A - w D
-*
-            CSR = CA*A( 1, 1 ) - WR*D1
-            CSI = -WI*D1
-            CNORM = ABS( CSR ) + ABS( CSI )
-*
-*           If | C | < SMINI, use C = SMINI
-*
-            IF( CNORM.LT.SMINI ) THEN
-               CSR = SMINI
-               CSI = ZERO
-               CNORM = SMINI
-               INFO = 1
-            END IF
-*
-*           Check scaling for  X = B / C
-*
-            BNORM = ABS( B( 1, 1 ) ) + ABS( B( 1, 2 ) )
-            IF( CNORM.LT.ONE .AND. BNORM.GT.ONE ) THEN
-               IF( BNORM.GT.BIGNUM*CNORM )
-     $            SCALE = ONE / BNORM
-            END IF
-*
-*           Compute X
-*
-            CALL DLADIV( SCALE*B( 1, 1 ), SCALE*B( 1, 2 ), CSR, CSI,
-     $                   X( 1, 1 ), X( 1, 2 ) )
-            XNORM = ABS( X( 1, 1 ) ) + ABS( X( 1, 2 ) )
-         END IF
-*
-      ELSE
-*
-*        2x2 System
-*
-*        Compute the real part of  C = ca A - w D  (or  ca A' - w D )
-*
-         CR( 1, 1 ) = CA*A( 1, 1 ) - WR*D1
-         CR( 2, 2 ) = CA*A( 2, 2 ) - WR*D2
-         IF( LTRANS ) THEN
-            CR( 1, 2 ) = CA*A( 2, 1 )
-            CR( 2, 1 ) = CA*A( 1, 2 )
-         ELSE
-            CR( 2, 1 ) = CA*A( 2, 1 )
-            CR( 1, 2 ) = CA*A( 1, 2 )
-         END IF
-*
-         IF( NW.EQ.1 ) THEN
-*
-*           Real 2x2 system  (w is real)
-*
-*           Find the largest element in C
-*
-            CMAX = ZERO
-            ICMAX = 0
-*
-            DO 10 J = 1, 4
-               IF( ABS( CRV( J ) ).GT.CMAX ) THEN
-                  CMAX = ABS( CRV( J ) )
-                  ICMAX = J
-               END IF
-   10       CONTINUE
-*
-*           If norm(C) < SMINI, use SMINI*identity.
-*
-            IF( CMAX.LT.SMINI ) THEN
-               BNORM = MAX( ABS( B( 1, 1 ) ), ABS( B( 2, 1 ) ) )
-               IF( SMINI.LT.ONE .AND. BNORM.GT.ONE ) THEN
-                  IF( BNORM.GT.BIGNUM*SMINI )
-     $               SCALE = ONE / BNORM
-               END IF
-               TEMP = SCALE / SMINI
-               X( 1, 1 ) = TEMP*B( 1, 1 )
-               X( 2, 1 ) = TEMP*B( 2, 1 )
-               XNORM = TEMP*BNORM
-               INFO = 1
-               RETURN
-            END IF
-*
-*           Gaussian elimination with complete pivoting.
-*
-            UR11 = CRV( ICMAX )
-            CR21 = CRV( IPIVOT( 2, ICMAX ) )
-            UR12 = CRV( IPIVOT( 3, ICMAX ) )
-            CR22 = CRV( IPIVOT( 4, ICMAX ) )
-            UR11R = ONE / UR11
-            LR21 = UR11R*CR21
-            UR22 = CR22 - UR12*LR21
-*
-*           If smaller pivot < SMINI, use SMINI
-*
-            IF( ABS( UR22 ).LT.SMINI ) THEN
-               UR22 = SMINI
-               INFO = 1
-            END IF
-            IF( RSWAP( ICMAX ) ) THEN
-               BR1 = B( 2, 1 )
-               BR2 = B( 1, 1 )
-            ELSE
-               BR1 = B( 1, 1 )
-               BR2 = B( 2, 1 )
-            END IF
-            BR2 = BR2 - LR21*BR1
-            BBND = MAX( ABS( BR1*( UR22*UR11R ) ), ABS( BR2 ) )
-            IF( BBND.GT.ONE .AND. ABS( UR22 ).LT.ONE ) THEN
-               IF( BBND.GE.BIGNUM*ABS( UR22 ) )
-     $            SCALE = ONE / BBND
-            END IF
-*
-            XR2 = ( BR2*SCALE ) / UR22
-            XR1 = ( SCALE*BR1 )*UR11R - XR2*( UR11R*UR12 )
-            IF( ZSWAP( ICMAX ) ) THEN
-               X( 1, 1 ) = XR2
-               X( 2, 1 ) = XR1
-            ELSE
-               X( 1, 1 ) = XR1
-               X( 2, 1 ) = XR2
-            END IF
-            XNORM = MAX( ABS( XR1 ), ABS( XR2 ) )
-*
-*           Further scaling if  norm(A) norm(X) > overflow
-*
-            IF( XNORM.GT.ONE .AND. CMAX.GT.ONE ) THEN
-               IF( XNORM.GT.BIGNUM / CMAX ) THEN
-                  TEMP = CMAX / BIGNUM
-                  X( 1, 1 ) = TEMP*X( 1, 1 )
-                  X( 2, 1 ) = TEMP*X( 2, 1 )
-                  XNORM = TEMP*XNORM
-                  SCALE = TEMP*SCALE
-               END IF
-            END IF
-         ELSE
-*
-*           Complex 2x2 system  (w is complex)
-*
-*           Find the largest element in C
-*
-            CI( 1, 1 ) = -WI*D1
-            CI( 2, 1 ) = ZERO
-            CI( 1, 2 ) = ZERO
-            CI( 2, 2 ) = -WI*D2
-            CMAX = ZERO
-            ICMAX = 0
-*
-            DO 20 J = 1, 4
-               IF( ABS( CRV( J ) )+ABS( CIV( J ) ).GT.CMAX ) THEN
-                  CMAX = ABS( CRV( J ) ) + ABS( CIV( J ) )
-                  ICMAX = J
-               END IF
-   20       CONTINUE
-*
-*           If norm(C) < SMINI, use SMINI*identity.
-*
-            IF( CMAX.LT.SMINI ) THEN
-               BNORM = MAX( ABS( B( 1, 1 ) )+ABS( B( 1, 2 ) ),
-     $                 ABS( B( 2, 1 ) )+ABS( B( 2, 2 ) ) )
-               IF( SMINI.LT.ONE .AND. BNORM.GT.ONE ) THEN
-                  IF( BNORM.GT.BIGNUM*SMINI )
-     $               SCALE = ONE / BNORM
-               END IF
-               TEMP = SCALE / SMINI
-               X( 1, 1 ) = TEMP*B( 1, 1 )
-               X( 2, 1 ) = TEMP*B( 2, 1 )
-               X( 1, 2 ) = TEMP*B( 1, 2 )
-               X( 2, 2 ) = TEMP*B( 2, 2 )
-               XNORM = TEMP*BNORM
-               INFO = 1
-               RETURN
-            END IF
-*
-*           Gaussian elimination with complete pivoting.
-*
-            UR11 = CRV( ICMAX )
-            UI11 = CIV( ICMAX )
-            CR21 = CRV( IPIVOT( 2, ICMAX ) )
-            CI21 = CIV( IPIVOT( 2, ICMAX ) )
-            UR12 = CRV( IPIVOT( 3, ICMAX ) )
-            UI12 = CIV( IPIVOT( 3, ICMAX ) )
-            CR22 = CRV( IPIVOT( 4, ICMAX ) )
-            CI22 = CIV( IPIVOT( 4, ICMAX ) )
-            IF( ICMAX.EQ.1 .OR. ICMAX.EQ.4 ) THEN
-*
-*              Code when off-diagonals of pivoted C are real
-*
-               IF( ABS( UR11 ).GT.ABS( UI11 ) ) THEN
-                  TEMP = UI11 / UR11
-                  UR11R = ONE / ( UR11*( ONE+TEMP**2 ) )
-                  UI11R = -TEMP*UR11R
-               ELSE
-                  TEMP = UR11 / UI11
-                  UI11R = -ONE / ( UI11*( ONE+TEMP**2 ) )
-                  UR11R = -TEMP*UI11R
-               END IF
-               LR21 = CR21*UR11R
-               LI21 = CR21*UI11R
-               UR12S = UR12*UR11R
-               UI12S = UR12*UI11R
-               UR22 = CR22 - UR12*LR21
-               UI22 = CI22 - UR12*LI21
-            ELSE
-*
-*              Code when diagonals of pivoted C are real
-*
-               UR11R = ONE / UR11
-               UI11R = ZERO
-               LR21 = CR21*UR11R
-               LI21 = CI21*UR11R
-               UR12S = UR12*UR11R
-               UI12S = UI12*UR11R
-               UR22 = CR22 - UR12*LR21 + UI12*LI21
-               UI22 = -UR12*LI21 - UI12*LR21
-            END IF
-            U22ABS = ABS( UR22 ) + ABS( UI22 )
-*
-*           If smaller pivot < SMINI, use SMINI
-*
-            IF( U22ABS.LT.SMINI ) THEN
-               UR22 = SMINI
-               UI22 = ZERO
-               INFO = 1
-            END IF
-            IF( RSWAP( ICMAX ) ) THEN
-               BR2 = B( 1, 1 )
-               BR1 = B( 2, 1 )
-               BI2 = B( 1, 2 )
-               BI1 = B( 2, 2 )
-            ELSE
-               BR1 = B( 1, 1 )
-               BR2 = B( 2, 1 )
-               BI1 = B( 1, 2 )
-               BI2 = B( 2, 2 )
-            END IF
-            BR2 = BR2 - LR21*BR1 + LI21*BI1
-            BI2 = BI2 - LI21*BR1 - LR21*BI1
-            BBND = MAX( ( ABS( BR1 )+ABS( BI1 ) )*
-     $             ( U22ABS*( ABS( UR11R )+ABS( UI11R ) ) ),
-     $             ABS( BR2 )+ABS( BI2 ) )
-            IF( BBND.GT.ONE .AND. U22ABS.LT.ONE ) THEN
-               IF( BBND.GE.BIGNUM*U22ABS ) THEN
-                  SCALE = ONE / BBND
-                  BR1 = SCALE*BR1
-                  BI1 = SCALE*BI1
-                  BR2 = SCALE*BR2
-                  BI2 = SCALE*BI2
-               END IF
-            END IF
-*
-            CALL DLADIV( BR2, BI2, UR22, UI22, XR2, XI2 )
-            XR1 = UR11R*BR1 - UI11R*BI1 - UR12S*XR2 + UI12S*XI2
-            XI1 = UI11R*BR1 + UR11R*BI1 - UI12S*XR2 - UR12S*XI2
-            IF( ZSWAP( ICMAX ) ) THEN
-               X( 1, 1 ) = XR2
-               X( 2, 1 ) = XR1
-               X( 1, 2 ) = XI2
-               X( 2, 2 ) = XI1
-            ELSE
-               X( 1, 1 ) = XR1
-               X( 2, 1 ) = XR2
-               X( 1, 2 ) = XI1
-               X( 2, 2 ) = XI2
-            END IF
-            XNORM = MAX( ABS( XR1 )+ABS( XI1 ), ABS( XR2 )+ABS( XI2 ) )
-*
-*           Further scaling if  norm(A) norm(X) > overflow
-*
-            IF( XNORM.GT.ONE .AND. CMAX.GT.ONE ) THEN
-               IF( XNORM.GT.BIGNUM / CMAX ) THEN
-                  TEMP = CMAX / BIGNUM
-                  X( 1, 1 ) = TEMP*X( 1, 1 )
-                  X( 2, 1 ) = TEMP*X( 2, 1 )
-                  X( 1, 2 ) = TEMP*X( 1, 2 )
-                  X( 2, 2 ) = TEMP*X( 2, 2 )
-                  XNORM = TEMP*XNORM
-                  SCALE = TEMP*SCALE
-               END IF
-            END IF
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DLALN2
-*
-      END
--- a/libcruft/lapack/dlals0.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,377 +0,0 @@
-      SUBROUTINE DLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B, LDB, BX, LDBX,
-     $                   PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM,
-     $                   POLES, DIFL, DIFR, Z, K, C, S, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            GIVPTR, ICOMPQ, INFO, K, LDB, LDBX, LDGCOL,
-     $                   LDGNUM, NL, NR, NRHS, SQRE
-      DOUBLE PRECISION   C, S
-*     ..
-*     .. Array Arguments ..
-      INTEGER            GIVCOL( LDGCOL, * ), PERM( * )
-      DOUBLE PRECISION   B( LDB, * ), BX( LDBX, * ), DIFL( * ),
-     $                   DIFR( LDGNUM, * ), GIVNUM( LDGNUM, * ),
-     $                   POLES( LDGNUM, * ), WORK( * ), Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLALS0 applies back the multiplying factors of either the left or the
-*  right singular vector matrix of a diagonal matrix appended by a row
-*  to the right hand side matrix B in solving the least squares problem
-*  using the divide-and-conquer SVD approach.
-*
-*  For the left singular vector matrix, three types of orthogonal
-*  matrices are involved:
-*
-*  (1L) Givens rotations: the number of such rotations is GIVPTR; the
-*       pairs of columns/rows they were applied to are stored in GIVCOL;
-*       and the C- and S-values of these rotations are stored in GIVNUM.
-*
-*  (2L) Permutation. The (NL+1)-st row of B is to be moved to the first
-*       row, and for J=2:N, PERM(J)-th row of B is to be moved to the
-*       J-th row.
-*
-*  (3L) The left singular vector matrix of the remaining matrix.
-*
-*  For the right singular vector matrix, four types of orthogonal
-*  matrices are involved:
-*
-*  (1R) The right singular vector matrix of the remaining matrix.
-*
-*  (2R) If SQRE = 1, one extra Givens rotation to generate the right
-*       null space.
-*
-*  (3R) The inverse transformation of (2L).
-*
-*  (4R) The inverse transformation of (1L).
-*
-*  Arguments
-*  =========
-*
-*  ICOMPQ (input) INTEGER
-*         Specifies whether singular vectors are to be computed in
-*         factored form:
-*         = 0: Left singular vector matrix.
-*         = 1: Right singular vector matrix.
-*
-*  NL     (input) INTEGER
-*         The row dimension of the upper block. NL >= 1.
-*
-*  NR     (input) INTEGER
-*         The row dimension of the lower block. NR >= 1.
-*
-*  SQRE   (input) INTEGER
-*         = 0: the lower block is an NR-by-NR square matrix.
-*         = 1: the lower block is an NR-by-(NR+1) rectangular matrix.
-*
-*         The bidiagonal matrix has row dimension N = NL + NR + 1,
-*         and column dimension M = N + SQRE.
-*
-*  NRHS   (input) INTEGER
-*         The number of columns of B and BX. NRHS must be at least 1.
-*
-*  B      (input/output) DOUBLE PRECISION array, dimension ( LDB, NRHS )
-*         On input, B contains the right hand sides of the least
-*         squares problem in rows 1 through M. On output, B contains
-*         the solution X in rows 1 through N.
-*
-*  LDB    (input) INTEGER
-*         The leading dimension of B. LDB must be at least
-*         max(1,MAX( M, N ) ).
-*
-*  BX     (workspace) DOUBLE PRECISION array, dimension ( LDBX, NRHS )
-*
-*  LDBX   (input) INTEGER
-*         The leading dimension of BX.
-*
-*  PERM   (input) INTEGER array, dimension ( N )
-*         The permutations (from deflation and sorting) applied
-*         to the two blocks.
-*
-*  GIVPTR (input) INTEGER
-*         The number of Givens rotations which took place in this
-*         subproblem.
-*
-*  GIVCOL (input) INTEGER array, dimension ( LDGCOL, 2 )
-*         Each pair of numbers indicates a pair of rows/columns
-*         involved in a Givens rotation.
-*
-*  LDGCOL (input) INTEGER
-*         The leading dimension of GIVCOL, must be at least N.
-*
-*  GIVNUM (input) DOUBLE PRECISION array, dimension ( LDGNUM, 2 )
-*         Each number indicates the C or S value used in the
-*         corresponding Givens rotation.
-*
-*  LDGNUM (input) INTEGER
-*         The leading dimension of arrays DIFR, POLES and
-*         GIVNUM, must be at least K.
-*
-*  POLES  (input) DOUBLE PRECISION array, dimension ( LDGNUM, 2 )
-*         On entry, POLES(1:K, 1) contains the new singular
-*         values obtained from solving the secular equation, and
-*         POLES(1:K, 2) is an array containing the poles in the secular
-*         equation.
-*
-*  DIFL   (input) DOUBLE PRECISION array, dimension ( K ).
-*         On entry, DIFL(I) is the distance between I-th updated
-*         (undeflated) singular value and the I-th (undeflated) old
-*         singular value.
-*
-*  DIFR   (input) DOUBLE PRECISION array, dimension ( LDGNUM, 2 ).
-*         On entry, DIFR(I, 1) contains the distances between I-th
-*         updated (undeflated) singular value and the I+1-th
-*         (undeflated) old singular value. And DIFR(I, 2) is the
-*         normalizing factor for the I-th right singular vector.
-*
-*  Z      (input) DOUBLE PRECISION array, dimension ( K )
-*         Contain the components of the deflation-adjusted updating row
-*         vector.
-*
-*  K      (input) INTEGER
-*         Contains the dimension of the non-deflated matrix,
-*         This is the order of the related secular equation. 1 <= K <=N.
-*
-*  C      (input) DOUBLE PRECISION
-*         C contains garbage if SQRE =0 and the C-value of a Givens
-*         rotation related to the right null space if SQRE = 1.
-*
-*  S      (input) DOUBLE PRECISION
-*         S contains garbage if SQRE =0 and the S-value of a Givens
-*         rotation related to the right null space if SQRE = 1.
-*
-*  WORK   (workspace) DOUBLE PRECISION array, dimension ( K )
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Ren-Cang Li, Computer Science Division, University of
-*       California at Berkeley, USA
-*     Osni Marques, LBNL/NERSC, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO, NEGONE
-      PARAMETER          ( ONE = 1.0D0, ZERO = 0.0D0, NEGONE = -1.0D0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J, M, N, NLP1
-      DOUBLE PRECISION   DIFLJ, DIFRJ, DJ, DSIGJ, DSIGJP, TEMP
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DGEMV, DLACPY, DLASCL, DROT, DSCAL,
-     $                   XERBLA
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMC3, DNRM2
-      EXTERNAL           DLAMC3, DNRM2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN
-         INFO = -1
-      ELSE IF( NL.LT.1 ) THEN
-         INFO = -2
-      ELSE IF( NR.LT.1 ) THEN
-         INFO = -3
-      ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN
-         INFO = -4
-      END IF
-*
-      N = NL + NR + 1
-*
-      IF( NRHS.LT.1 ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.N ) THEN
-         INFO = -7
-      ELSE IF( LDBX.LT.N ) THEN
-         INFO = -9
-      ELSE IF( GIVPTR.LT.0 ) THEN
-         INFO = -11
-      ELSE IF( LDGCOL.LT.N ) THEN
-         INFO = -13
-      ELSE IF( LDGNUM.LT.N ) THEN
-         INFO = -15
-      ELSE IF( K.LT.1 ) THEN
-         INFO = -20
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLALS0', -INFO )
-         RETURN
-      END IF
-*
-      M = N + SQRE
-      NLP1 = NL + 1
-*
-      IF( ICOMPQ.EQ.0 ) THEN
-*
-*        Apply back orthogonal transformations from the left.
-*
-*        Step (1L): apply back the Givens rotations performed.
-*
-         DO 10 I = 1, GIVPTR
-            CALL DROT( NRHS, B( GIVCOL( I, 2 ), 1 ), LDB,
-     $                 B( GIVCOL( I, 1 ), 1 ), LDB, GIVNUM( I, 2 ),
-     $                 GIVNUM( I, 1 ) )
-   10    CONTINUE
-*
-*        Step (2L): permute rows of B.
-*
-         CALL DCOPY( NRHS, B( NLP1, 1 ), LDB, BX( 1, 1 ), LDBX )
-         DO 20 I = 2, N
-            CALL DCOPY( NRHS, B( PERM( I ), 1 ), LDB, BX( I, 1 ), LDBX )
-   20    CONTINUE
-*
-*        Step (3L): apply the inverse of the left singular vector
-*        matrix to BX.
-*
-         IF( K.EQ.1 ) THEN
-            CALL DCOPY( NRHS, BX, LDBX, B, LDB )
-            IF( Z( 1 ).LT.ZERO ) THEN
-               CALL DSCAL( NRHS, NEGONE, B, LDB )
-            END IF
-         ELSE
-            DO 50 J = 1, K
-               DIFLJ = DIFL( J )
-               DJ = POLES( J, 1 )
-               DSIGJ = -POLES( J, 2 )
-               IF( J.LT.K ) THEN
-                  DIFRJ = -DIFR( J, 1 )
-                  DSIGJP = -POLES( J+1, 2 )
-               END IF
-               IF( ( Z( J ).EQ.ZERO ) .OR. ( POLES( J, 2 ).EQ.ZERO ) )
-     $              THEN
-                  WORK( J ) = ZERO
-               ELSE
-                  WORK( J ) = -POLES( J, 2 )*Z( J ) / DIFLJ /
-     $                        ( POLES( J, 2 )+DJ )
-               END IF
-               DO 30 I = 1, J - 1
-                  IF( ( Z( I ).EQ.ZERO ) .OR.
-     $                ( POLES( I, 2 ).EQ.ZERO ) ) THEN
-                     WORK( I ) = ZERO
-                  ELSE
-                     WORK( I ) = POLES( I, 2 )*Z( I ) /
-     $                           ( DLAMC3( POLES( I, 2 ), DSIGJ )-
-     $                           DIFLJ ) / ( POLES( I, 2 )+DJ )
-                  END IF
-   30          CONTINUE
-               DO 40 I = J + 1, K
-                  IF( ( Z( I ).EQ.ZERO ) .OR.
-     $                ( POLES( I, 2 ).EQ.ZERO ) ) THEN
-                     WORK( I ) = ZERO
-                  ELSE
-                     WORK( I ) = POLES( I, 2 )*Z( I ) /
-     $                           ( DLAMC3( POLES( I, 2 ), DSIGJP )+
-     $                           DIFRJ ) / ( POLES( I, 2 )+DJ )
-                  END IF
-   40          CONTINUE
-               WORK( 1 ) = NEGONE
-               TEMP = DNRM2( K, WORK, 1 )
-               CALL DGEMV( 'T', K, NRHS, ONE, BX, LDBX, WORK, 1, ZERO,
-     $                     B( J, 1 ), LDB )
-               CALL DLASCL( 'G', 0, 0, TEMP, ONE, 1, NRHS, B( J, 1 ),
-     $                      LDB, INFO )
-   50       CONTINUE
-         END IF
-*
-*        Move the deflated rows of BX to B also.
-*
-         IF( K.LT.MAX( M, N ) )
-     $      CALL DLACPY( 'A', N-K, NRHS, BX( K+1, 1 ), LDBX,
-     $                   B( K+1, 1 ), LDB )
-      ELSE
-*
-*        Apply back the right orthogonal transformations.
-*
-*        Step (1R): apply back the new right singular vector matrix
-*        to B.
-*
-         IF( K.EQ.1 ) THEN
-            CALL DCOPY( NRHS, B, LDB, BX, LDBX )
-         ELSE
-            DO 80 J = 1, K
-               DSIGJ = POLES( J, 2 )
-               IF( Z( J ).EQ.ZERO ) THEN
-                  WORK( J ) = ZERO
-               ELSE
-                  WORK( J ) = -Z( J ) / DIFL( J ) /
-     $                        ( DSIGJ+POLES( J, 1 ) ) / DIFR( J, 2 )
-               END IF
-               DO 60 I = 1, J - 1
-                  IF( Z( J ).EQ.ZERO ) THEN
-                     WORK( I ) = ZERO
-                  ELSE
-                     WORK( I ) = Z( J ) / ( DLAMC3( DSIGJ, -POLES( I+1,
-     $                           2 ) )-DIFR( I, 1 ) ) /
-     $                           ( DSIGJ+POLES( I, 1 ) ) / DIFR( I, 2 )
-                  END IF
-   60          CONTINUE
-               DO 70 I = J + 1, K
-                  IF( Z( J ).EQ.ZERO ) THEN
-                     WORK( I ) = ZERO
-                  ELSE
-                     WORK( I ) = Z( J ) / ( DLAMC3( DSIGJ, -POLES( I,
-     $                           2 ) )-DIFL( I ) ) /
-     $                           ( DSIGJ+POLES( I, 1 ) ) / DIFR( I, 2 )
-                  END IF
-   70          CONTINUE
-               CALL DGEMV( 'T', K, NRHS, ONE, B, LDB, WORK, 1, ZERO,
-     $                     BX( J, 1 ), LDBX )
-   80       CONTINUE
-         END IF
-*
-*        Step (2R): if SQRE = 1, apply back the rotation that is
-*        related to the right null space of the subproblem.
-*
-         IF( SQRE.EQ.1 ) THEN
-            CALL DCOPY( NRHS, B( M, 1 ), LDB, BX( M, 1 ), LDBX )
-            CALL DROT( NRHS, BX( 1, 1 ), LDBX, BX( M, 1 ), LDBX, C, S )
-         END IF
-         IF( K.LT.MAX( M, N ) )
-     $      CALL DLACPY( 'A', N-K, NRHS, B( K+1, 1 ), LDB, BX( K+1, 1 ),
-     $                   LDBX )
-*
-*        Step (3R): permute rows of B.
-*
-         CALL DCOPY( NRHS, BX( 1, 1 ), LDBX, B( NLP1, 1 ), LDB )
-         IF( SQRE.EQ.1 ) THEN
-            CALL DCOPY( NRHS, BX( M, 1 ), LDBX, B( M, 1 ), LDB )
-         END IF
-         DO 90 I = 2, N
-            CALL DCOPY( NRHS, BX( I, 1 ), LDBX, B( PERM( I ), 1 ), LDB )
-   90    CONTINUE
-*
-*        Step (4R): apply back the Givens rotations performed.
-*
-         DO 100 I = GIVPTR, 1, -1
-            CALL DROT( NRHS, B( GIVCOL( I, 2 ), 1 ), LDB,
-     $                 B( GIVCOL( I, 1 ), 1 ), LDB, GIVNUM( I, 2 ),
-     $                 -GIVNUM( I, 1 ) )
-  100    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of DLALS0
-*
-      END
--- a/libcruft/lapack/dlalsa.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,362 +0,0 @@
-      SUBROUTINE DLALSA( ICOMPQ, SMLSIZ, N, NRHS, B, LDB, BX, LDBX, U,
-     $                   LDU, VT, K, DIFL, DIFR, Z, POLES, GIVPTR,
-     $                   GIVCOL, LDGCOL, PERM, GIVNUM, C, S, WORK,
-     $                   IWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            ICOMPQ, INFO, LDB, LDBX, LDGCOL, LDU, N, NRHS,
-     $                   SMLSIZ
-*     ..
-*     .. Array Arguments ..
-      INTEGER            GIVCOL( LDGCOL, * ), GIVPTR( * ), IWORK( * ),
-     $                   K( * ), PERM( LDGCOL, * )
-      DOUBLE PRECISION   B( LDB, * ), BX( LDBX, * ), C( * ),
-     $                   DIFL( LDU, * ), DIFR( LDU, * ),
-     $                   GIVNUM( LDU, * ), POLES( LDU, * ), S( * ),
-     $                   U( LDU, * ), VT( LDU, * ), WORK( * ),
-     $                   Z( LDU, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLALSA is an itermediate step in solving the least squares problem
-*  by computing the SVD of the coefficient matrix in compact form (The
-*  singular vectors are computed as products of simple orthorgonal
-*  matrices.).
-*
-*  If ICOMPQ = 0, DLALSA applies the inverse of the left singular vector
-*  matrix of an upper bidiagonal matrix to the right hand side; and if
-*  ICOMPQ = 1, DLALSA applies the right singular vector matrix to the
-*  right hand side. The singular vector matrices were generated in
-*  compact form by DLALSA.
-*
-*  Arguments
-*  =========
-*
-*
-*  ICOMPQ (input) INTEGER
-*         Specifies whether the left or the right singular vector
-*         matrix is involved.
-*         = 0: Left singular vector matrix
-*         = 1: Right singular vector matrix
-*
-*  SMLSIZ (input) INTEGER
-*         The maximum size of the subproblems at the bottom of the
-*         computation tree.
-*
-*  N      (input) INTEGER
-*         The row and column dimensions of the upper bidiagonal matrix.
-*
-*  NRHS   (input) INTEGER
-*         The number of columns of B and BX. NRHS must be at least 1.
-*
-*  B      (input/output) DOUBLE PRECISION array, dimension ( LDB, NRHS )
-*         On input, B contains the right hand sides of the least
-*         squares problem in rows 1 through M.
-*         On output, B contains the solution X in rows 1 through N.
-*
-*  LDB    (input) INTEGER
-*         The leading dimension of B in the calling subprogram.
-*         LDB must be at least max(1,MAX( M, N ) ).
-*
-*  BX     (output) DOUBLE PRECISION array, dimension ( LDBX, NRHS )
-*         On exit, the result of applying the left or right singular
-*         vector matrix to B.
-*
-*  LDBX   (input) INTEGER
-*         The leading dimension of BX.
-*
-*  U      (input) DOUBLE PRECISION array, dimension ( LDU, SMLSIZ ).
-*         On entry, U contains the left singular vector matrices of all
-*         subproblems at the bottom level.
-*
-*  LDU    (input) INTEGER, LDU = > N.
-*         The leading dimension of arrays U, VT, DIFL, DIFR,
-*         POLES, GIVNUM, and Z.
-*
-*  VT     (input) DOUBLE PRECISION array, dimension ( LDU, SMLSIZ+1 ).
-*         On entry, VT' contains the right singular vector matrices of
-*         all subproblems at the bottom level.
-*
-*  K      (input) INTEGER array, dimension ( N ).
-*
-*  DIFL   (input) DOUBLE PRECISION array, dimension ( LDU, NLVL ).
-*         where NLVL = INT(log_2 (N/(SMLSIZ+1))) + 1.
-*
-*  DIFR   (input) DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ).
-*         On entry, DIFL(*, I) and DIFR(*, 2 * I -1) record
-*         distances between singular values on the I-th level and
-*         singular values on the (I -1)-th level, and DIFR(*, 2 * I)
-*         record the normalizing factors of the right singular vectors
-*         matrices of subproblems on I-th level.
-*
-*  Z      (input) DOUBLE PRECISION array, dimension ( LDU, NLVL ).
-*         On entry, Z(1, I) contains the components of the deflation-
-*         adjusted updating row vector for subproblems on the I-th
-*         level.
-*
-*  POLES  (input) DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ).
-*         On entry, POLES(*, 2 * I -1: 2 * I) contains the new and old
-*         singular values involved in the secular equations on the I-th
-*         level.
-*
-*  GIVPTR (input) INTEGER array, dimension ( N ).
-*         On entry, GIVPTR( I ) records the number of Givens
-*         rotations performed on the I-th problem on the computation
-*         tree.
-*
-*  GIVCOL (input) INTEGER array, dimension ( LDGCOL, 2 * NLVL ).
-*         On entry, for each I, GIVCOL(*, 2 * I - 1: 2 * I) records the
-*         locations of Givens rotations performed on the I-th level on
-*         the computation tree.
-*
-*  LDGCOL (input) INTEGER, LDGCOL = > N.
-*         The leading dimension of arrays GIVCOL and PERM.
-*
-*  PERM   (input) INTEGER array, dimension ( LDGCOL, NLVL ).
-*         On entry, PERM(*, I) records permutations done on the I-th
-*         level of the computation tree.
-*
-*  GIVNUM (input) DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ).
-*         On entry, GIVNUM(*, 2 *I -1 : 2 * I) records the C- and S-
-*         values of Givens rotations performed on the I-th level on the
-*         computation tree.
-*
-*  C      (input) DOUBLE PRECISION array, dimension ( N ).
-*         On entry, if the I-th subproblem is not square,
-*         C( I ) contains the C-value of a Givens rotation related to
-*         the right null space of the I-th subproblem.
-*
-*  S      (input) DOUBLE PRECISION array, dimension ( N ).
-*         On entry, if the I-th subproblem is not square,
-*         S( I ) contains the S-value of a Givens rotation related to
-*         the right null space of the I-th subproblem.
-*
-*  WORK   (workspace) DOUBLE PRECISION array.
-*         The dimension must be at least N.
-*
-*  IWORK  (workspace) INTEGER array.
-*         The dimension must be at least 3 * N
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Ren-Cang Li, Computer Science Division, University of
-*       California at Berkeley, USA
-*     Osni Marques, LBNL/NERSC, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I1, IC, IM1, INODE, J, LF, LL, LVL, LVL2,
-     $                   ND, NDB1, NDIML, NDIMR, NL, NLF, NLP1, NLVL,
-     $                   NR, NRF, NRP1, SQRE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DGEMM, DLALS0, DLASDT, XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN
-         INFO = -1
-      ELSE IF( SMLSIZ.LT.3 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.SMLSIZ ) THEN
-         INFO = -3
-      ELSE IF( NRHS.LT.1 ) THEN
-         INFO = -4
-      ELSE IF( LDB.LT.N ) THEN
-         INFO = -6
-      ELSE IF( LDBX.LT.N ) THEN
-         INFO = -8
-      ELSE IF( LDU.LT.N ) THEN
-         INFO = -10
-      ELSE IF( LDGCOL.LT.N ) THEN
-         INFO = -19
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLALSA', -INFO )
-         RETURN
-      END IF
-*
-*     Book-keeping and  setting up the computation tree.
-*
-      INODE = 1
-      NDIML = INODE + N
-      NDIMR = NDIML + N
-*
-      CALL DLASDT( N, NLVL, ND, IWORK( INODE ), IWORK( NDIML ),
-     $             IWORK( NDIMR ), SMLSIZ )
-*
-*     The following code applies back the left singular vector factors.
-*     For applying back the right singular vector factors, go to 50.
-*
-      IF( ICOMPQ.EQ.1 ) THEN
-         GO TO 50
-      END IF
-*
-*     The nodes on the bottom level of the tree were solved
-*     by DLASDQ. The corresponding left and right singular vector
-*     matrices are in explicit form. First apply back the left
-*     singular vector matrices.
-*
-      NDB1 = ( ND+1 ) / 2
-      DO 10 I = NDB1, ND
-*
-*        IC : center row of each node
-*        NL : number of rows of left  subproblem
-*        NR : number of rows of right subproblem
-*        NLF: starting row of the left   subproblem
-*        NRF: starting row of the right  subproblem
-*
-         I1 = I - 1
-         IC = IWORK( INODE+I1 )
-         NL = IWORK( NDIML+I1 )
-         NR = IWORK( NDIMR+I1 )
-         NLF = IC - NL
-         NRF = IC + 1
-         CALL DGEMM( 'T', 'N', NL, NRHS, NL, ONE, U( NLF, 1 ), LDU,
-     $               B( NLF, 1 ), LDB, ZERO, BX( NLF, 1 ), LDBX )
-         CALL DGEMM( 'T', 'N', NR, NRHS, NR, ONE, U( NRF, 1 ), LDU,
-     $               B( NRF, 1 ), LDB, ZERO, BX( NRF, 1 ), LDBX )
-   10 CONTINUE
-*
-*     Next copy the rows of B that correspond to unchanged rows
-*     in the bidiagonal matrix to BX.
-*
-      DO 20 I = 1, ND
-         IC = IWORK( INODE+I-1 )
-         CALL DCOPY( NRHS, B( IC, 1 ), LDB, BX( IC, 1 ), LDBX )
-   20 CONTINUE
-*
-*     Finally go through the left singular vector matrices of all
-*     the other subproblems bottom-up on the tree.
-*
-      J = 2**NLVL
-      SQRE = 0
-*
-      DO 40 LVL = NLVL, 1, -1
-         LVL2 = 2*LVL - 1
-*
-*        find the first node LF and last node LL on
-*        the current level LVL
-*
-         IF( LVL.EQ.1 ) THEN
-            LF = 1
-            LL = 1
-         ELSE
-            LF = 2**( LVL-1 )
-            LL = 2*LF - 1
-         END IF
-         DO 30 I = LF, LL
-            IM1 = I - 1
-            IC = IWORK( INODE+IM1 )
-            NL = IWORK( NDIML+IM1 )
-            NR = IWORK( NDIMR+IM1 )
-            NLF = IC - NL
-            NRF = IC + 1
-            J = J - 1
-            CALL DLALS0( ICOMPQ, NL, NR, SQRE, NRHS, BX( NLF, 1 ), LDBX,
-     $                   B( NLF, 1 ), LDB, PERM( NLF, LVL ),
-     $                   GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL,
-     $                   GIVNUM( NLF, LVL2 ), LDU, POLES( NLF, LVL2 ),
-     $                   DIFL( NLF, LVL ), DIFR( NLF, LVL2 ),
-     $                   Z( NLF, LVL ), K( J ), C( J ), S( J ), WORK,
-     $                   INFO )
-   30    CONTINUE
-   40 CONTINUE
-      GO TO 90
-*
-*     ICOMPQ = 1: applying back the right singular vector factors.
-*
-   50 CONTINUE
-*
-*     First now go through the right singular vector matrices of all
-*     the tree nodes top-down.
-*
-      J = 0
-      DO 70 LVL = 1, NLVL
-         LVL2 = 2*LVL - 1
-*
-*        Find the first node LF and last node LL on
-*        the current level LVL.
-*
-         IF( LVL.EQ.1 ) THEN
-            LF = 1
-            LL = 1
-         ELSE
-            LF = 2**( LVL-1 )
-            LL = 2*LF - 1
-         END IF
-         DO 60 I = LL, LF, -1
-            IM1 = I - 1
-            IC = IWORK( INODE+IM1 )
-            NL = IWORK( NDIML+IM1 )
-            NR = IWORK( NDIMR+IM1 )
-            NLF = IC - NL
-            NRF = IC + 1
-            IF( I.EQ.LL ) THEN
-               SQRE = 0
-            ELSE
-               SQRE = 1
-            END IF
-            J = J + 1
-            CALL DLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B( NLF, 1 ), LDB,
-     $                   BX( NLF, 1 ), LDBX, PERM( NLF, LVL ),
-     $                   GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL,
-     $                   GIVNUM( NLF, LVL2 ), LDU, POLES( NLF, LVL2 ),
-     $                   DIFL( NLF, LVL ), DIFR( NLF, LVL2 ),
-     $                   Z( NLF, LVL ), K( J ), C( J ), S( J ), WORK,
-     $                   INFO )
-   60    CONTINUE
-   70 CONTINUE
-*
-*     The nodes on the bottom level of the tree were solved
-*     by DLASDQ. The corresponding right singular vector
-*     matrices are in explicit form. Apply them back.
-*
-      NDB1 = ( ND+1 ) / 2
-      DO 80 I = NDB1, ND
-         I1 = I - 1
-         IC = IWORK( INODE+I1 )
-         NL = IWORK( NDIML+I1 )
-         NR = IWORK( NDIMR+I1 )
-         NLP1 = NL + 1
-         IF( I.EQ.ND ) THEN
-            NRP1 = NR
-         ELSE
-            NRP1 = NR + 1
-         END IF
-         NLF = IC - NL
-         NRF = IC + 1
-         CALL DGEMM( 'T', 'N', NLP1, NRHS, NLP1, ONE, VT( NLF, 1 ), LDU,
-     $               B( NLF, 1 ), LDB, ZERO, BX( NLF, 1 ), LDBX )
-         CALL DGEMM( 'T', 'N', NRP1, NRHS, NRP1, ONE, VT( NRF, 1 ), LDU,
-     $               B( NRF, 1 ), LDB, ZERO, BX( NRF, 1 ), LDBX )
-   80 CONTINUE
-*
-   90 CONTINUE
-*
-      RETURN
-*
-*     End of DLALSA
-*
-      END
--- a/libcruft/lapack/dlalsd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,434 +0,0 @@
-      SUBROUTINE DLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND,
-     $                   RANK, WORK, IWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDB, N, NRHS, RANK, SMLSIZ
-      DOUBLE PRECISION   RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      DOUBLE PRECISION   B( LDB, * ), D( * ), E( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLALSD uses the singular value decomposition of A to solve the least
-*  squares problem of finding X to minimize the Euclidean norm of each
-*  column of A*X-B, where A is N-by-N upper bidiagonal, and X and B
-*  are N-by-NRHS. The solution X overwrites B.
-*
-*  The singular values of A smaller than RCOND times the largest
-*  singular value are treated as zero in solving the least squares
-*  problem; in this case a minimum norm solution is returned.
-*  The actual singular values are returned in D in ascending order.
-*
-*  This code makes very mild assumptions about floating point
-*  arithmetic. It will work on machines with a guard digit in
-*  add/subtract, or on those binary machines without guard digits
-*  which subtract like the Cray XMP, Cray YMP, Cray C 90, or Cray 2.
-*  It could conceivably fail on hexadecimal or decimal machines
-*  without guard digits, but we know of none.
-*
-*  Arguments
-*  =========
-*
-*  UPLO   (input) CHARACTER*1
-*         = 'U': D and E define an upper bidiagonal matrix.
-*         = 'L': D and E define a  lower bidiagonal matrix.
-*
-*  SMLSIZ (input) INTEGER
-*         The maximum size of the subproblems at the bottom of the
-*         computation tree.
-*
-*  N      (input) INTEGER
-*         The dimension of the  bidiagonal matrix.  N >= 0.
-*
-*  NRHS   (input) INTEGER
-*         The number of columns of B. NRHS must be at least 1.
-*
-*  D      (input/output) DOUBLE PRECISION array, dimension (N)
-*         On entry D contains the main diagonal of the bidiagonal
-*         matrix. On exit, if INFO = 0, D contains its singular values.
-*
-*  E      (input/output) DOUBLE PRECISION array, dimension (N-1)
-*         Contains the super-diagonal entries of the bidiagonal matrix.
-*         On exit, E has been destroyed.
-*
-*  B      (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*         On input, B contains the right hand sides of the least
-*         squares problem. On output, B contains the solution X.
-*
-*  LDB    (input) INTEGER
-*         The leading dimension of B in the calling subprogram.
-*         LDB must be at least max(1,N).
-*
-*  RCOND  (input) DOUBLE PRECISION
-*         The singular values of A less than or equal to RCOND times
-*         the largest singular value are treated as zero in solving
-*         the least squares problem. If RCOND is negative,
-*         machine precision is used instead.
-*         For example, if diag(S)*X=B were the least squares problem,
-*         where diag(S) is a diagonal matrix of singular values, the
-*         solution would be X(i) = B(i) / S(i) if S(i) is greater than
-*         RCOND*max(S), and X(i) = 0 if S(i) is less than or equal to
-*         RCOND*max(S).
-*
-*  RANK   (output) INTEGER
-*         The number of singular values of A greater than RCOND times
-*         the largest singular value.
-*
-*  WORK   (workspace) DOUBLE PRECISION array, dimension at least
-*         (9*N + 2*N*SMLSIZ + 8*N*NLVL + N*NRHS + (SMLSIZ+1)**2),
-*         where NLVL = max(0, INT(log_2 (N/(SMLSIZ+1))) + 1).
-*
-*  IWORK  (workspace) INTEGER array, dimension at least
-*         (3*N*NLVL + 11*N)
-*
-*  INFO   (output) INTEGER
-*         = 0:  successful exit.
-*         < 0:  if INFO = -i, the i-th argument had an illegal value.
-*         > 0:  The algorithm failed to compute an singular value while
-*               working on the submatrix lying in rows and columns
-*               INFO/(N+1) through MOD(INFO,N+1).
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Ren-Cang Li, Computer Science Division, University of
-*       California at Berkeley, USA
-*     Osni Marques, LBNL/NERSC, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            BX, BXST, C, DIFL, DIFR, GIVCOL, GIVNUM,
-     $                   GIVPTR, I, ICMPQ1, ICMPQ2, IWK, J, K, NLVL,
-     $                   NM1, NSIZE, NSUB, NWORK, PERM, POLES, S, SIZEI,
-     $                   SMLSZP, SQRE, ST, ST1, U, VT, Z
-      DOUBLE PRECISION   CS, EPS, ORGNRM, R, RCND, SN, TOL
-*     ..
-*     .. External Functions ..
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DLAMCH, DLANST
-      EXTERNAL           IDAMAX, DLAMCH, DLANST
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DGEMM, DLACPY, DLALSA, DLARTG, DLASCL,
-     $                   DLASDA, DLASDQ, DLASET, DLASRT, DROT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, INT, LOG, SIGN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( NRHS.LT.1 ) THEN
-         INFO = -4
-      ELSE IF( ( LDB.LT.1 ) .OR. ( LDB.LT.N ) ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLALSD', -INFO )
-         RETURN
-      END IF
-*
-      EPS = DLAMCH( 'Epsilon' )
-*
-*     Set up the tolerance.
-*
-      IF( ( RCOND.LE.ZERO ) .OR. ( RCOND.GE.ONE ) ) THEN
-         RCND = EPS
-      ELSE
-         RCND = RCOND
-      END IF
-*
-      RANK = 0
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 ) THEN
-         RETURN
-      ELSE IF( N.EQ.1 ) THEN
-         IF( D( 1 ).EQ.ZERO ) THEN
-            CALL DLASET( 'A', 1, NRHS, ZERO, ZERO, B, LDB )
-         ELSE
-            RANK = 1
-            CALL DLASCL( 'G', 0, 0, D( 1 ), ONE, 1, NRHS, B, LDB, INFO )
-            D( 1 ) = ABS( D( 1 ) )
-         END IF
-         RETURN
-      END IF
-*
-*     Rotate the matrix if it is lower bidiagonal.
-*
-      IF( UPLO.EQ.'L' ) THEN
-         DO 10 I = 1, N - 1
-            CALL DLARTG( D( I ), E( I ), CS, SN, R )
-            D( I ) = R
-            E( I ) = SN*D( I+1 )
-            D( I+1 ) = CS*D( I+1 )
-            IF( NRHS.EQ.1 ) THEN
-               CALL DROT( 1, B( I, 1 ), 1, B( I+1, 1 ), 1, CS, SN )
-            ELSE
-               WORK( I*2-1 ) = CS
-               WORK( I*2 ) = SN
-            END IF
-   10    CONTINUE
-         IF( NRHS.GT.1 ) THEN
-            DO 30 I = 1, NRHS
-               DO 20 J = 1, N - 1
-                  CS = WORK( J*2-1 )
-                  SN = WORK( J*2 )
-                  CALL DROT( 1, B( J, I ), 1, B( J+1, I ), 1, CS, SN )
-   20          CONTINUE
-   30       CONTINUE
-         END IF
-      END IF
-*
-*     Scale.
-*
-      NM1 = N - 1
-      ORGNRM = DLANST( 'M', N, D, E )
-      IF( ORGNRM.EQ.ZERO ) THEN
-         CALL DLASET( 'A', N, NRHS, ZERO, ZERO, B, LDB )
-         RETURN
-      END IF
-*
-      CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, N, 1, D, N, INFO )
-      CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, NM1, 1, E, NM1, INFO )
-*
-*     If N is smaller than the minimum divide size SMLSIZ, then solve
-*     the problem with another solver.
-*
-      IF( N.LE.SMLSIZ ) THEN
-         NWORK = 1 + N*N
-         CALL DLASET( 'A', N, N, ZERO, ONE, WORK, N )
-         CALL DLASDQ( 'U', 0, N, N, 0, NRHS, D, E, WORK, N, WORK, N, B,
-     $                LDB, WORK( NWORK ), INFO )
-         IF( INFO.NE.0 ) THEN
-            RETURN
-         END IF
-         TOL = RCND*ABS( D( IDAMAX( N, D, 1 ) ) )
-         DO 40 I = 1, N
-            IF( D( I ).LE.TOL ) THEN
-               CALL DLASET( 'A', 1, NRHS, ZERO, ZERO, B( I, 1 ), LDB )
-            ELSE
-               CALL DLASCL( 'G', 0, 0, D( I ), ONE, 1, NRHS, B( I, 1 ),
-     $                      LDB, INFO )
-               RANK = RANK + 1
-            END IF
-   40    CONTINUE
-         CALL DGEMM( 'T', 'N', N, NRHS, N, ONE, WORK, N, B, LDB, ZERO,
-     $               WORK( NWORK ), N )
-         CALL DLACPY( 'A', N, NRHS, WORK( NWORK ), N, B, LDB )
-*
-*        Unscale.
-*
-         CALL DLASCL( 'G', 0, 0, ONE, ORGNRM, N, 1, D, N, INFO )
-         CALL DLASRT( 'D', N, D, INFO )
-         CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, N, NRHS, B, LDB, INFO )
-*
-         RETURN
-      END IF
-*
-*     Book-keeping and setting up some constants.
-*
-      NLVL = INT( LOG( DBLE( N ) / DBLE( SMLSIZ+1 ) ) / LOG( TWO ) ) + 1
-*
-      SMLSZP = SMLSIZ + 1
-*
-      U = 1
-      VT = 1 + SMLSIZ*N
-      DIFL = VT + SMLSZP*N
-      DIFR = DIFL + NLVL*N
-      Z = DIFR + NLVL*N*2
-      C = Z + NLVL*N
-      S = C + N
-      POLES = S + N
-      GIVNUM = POLES + 2*NLVL*N
-      BX = GIVNUM + 2*NLVL*N
-      NWORK = BX + N*NRHS
-*
-      SIZEI = 1 + N
-      K = SIZEI + N
-      GIVPTR = K + N
-      PERM = GIVPTR + N
-      GIVCOL = PERM + NLVL*N
-      IWK = GIVCOL + NLVL*N*2
-*
-      ST = 1
-      SQRE = 0
-      ICMPQ1 = 1
-      ICMPQ2 = 0
-      NSUB = 0
-*
-      DO 50 I = 1, N
-         IF( ABS( D( I ) ).LT.EPS ) THEN
-            D( I ) = SIGN( EPS, D( I ) )
-         END IF
-   50 CONTINUE
-*
-      DO 60 I = 1, NM1
-         IF( ( ABS( E( I ) ).LT.EPS ) .OR. ( I.EQ.NM1 ) ) THEN
-            NSUB = NSUB + 1
-            IWORK( NSUB ) = ST
-*
-*           Subproblem found. First determine its size and then
-*           apply divide and conquer on it.
-*
-            IF( I.LT.NM1 ) THEN
-*
-*              A subproblem with E(I) small for I < NM1.
-*
-               NSIZE = I - ST + 1
-               IWORK( SIZEI+NSUB-1 ) = NSIZE
-            ELSE IF( ABS( E( I ) ).GE.EPS ) THEN
-*
-*              A subproblem with E(NM1) not too small but I = NM1.
-*
-               NSIZE = N - ST + 1
-               IWORK( SIZEI+NSUB-1 ) = NSIZE
-            ELSE
-*
-*              A subproblem with E(NM1) small. This implies an
-*              1-by-1 subproblem at D(N), which is not solved
-*              explicitly.
-*
-               NSIZE = I - ST + 1
-               IWORK( SIZEI+NSUB-1 ) = NSIZE
-               NSUB = NSUB + 1
-               IWORK( NSUB ) = N
-               IWORK( SIZEI+NSUB-1 ) = 1
-               CALL DCOPY( NRHS, B( N, 1 ), LDB, WORK( BX+NM1 ), N )
-            END IF
-            ST1 = ST - 1
-            IF( NSIZE.EQ.1 ) THEN
-*
-*              This is a 1-by-1 subproblem and is not solved
-*              explicitly.
-*
-               CALL DCOPY( NRHS, B( ST, 1 ), LDB, WORK( BX+ST1 ), N )
-            ELSE IF( NSIZE.LE.SMLSIZ ) THEN
-*
-*              This is a small subproblem and is solved by DLASDQ.
-*
-               CALL DLASET( 'A', NSIZE, NSIZE, ZERO, ONE,
-     $                      WORK( VT+ST1 ), N )
-               CALL DLASDQ( 'U', 0, NSIZE, NSIZE, 0, NRHS, D( ST ),
-     $                      E( ST ), WORK( VT+ST1 ), N, WORK( NWORK ),
-     $                      N, B( ST, 1 ), LDB, WORK( NWORK ), INFO )
-               IF( INFO.NE.0 ) THEN
-                  RETURN
-               END IF
-               CALL DLACPY( 'A', NSIZE, NRHS, B( ST, 1 ), LDB,
-     $                      WORK( BX+ST1 ), N )
-            ELSE
-*
-*              A large problem. Solve it using divide and conquer.
-*
-               CALL DLASDA( ICMPQ1, SMLSIZ, NSIZE, SQRE, D( ST ),
-     $                      E( ST ), WORK( U+ST1 ), N, WORK( VT+ST1 ),
-     $                      IWORK( K+ST1 ), WORK( DIFL+ST1 ),
-     $                      WORK( DIFR+ST1 ), WORK( Z+ST1 ),
-     $                      WORK( POLES+ST1 ), IWORK( GIVPTR+ST1 ),
-     $                      IWORK( GIVCOL+ST1 ), N, IWORK( PERM+ST1 ),
-     $                      WORK( GIVNUM+ST1 ), WORK( C+ST1 ),
-     $                      WORK( S+ST1 ), WORK( NWORK ), IWORK( IWK ),
-     $                      INFO )
-               IF( INFO.NE.0 ) THEN
-                  RETURN
-               END IF
-               BXST = BX + ST1
-               CALL DLALSA( ICMPQ2, SMLSIZ, NSIZE, NRHS, B( ST, 1 ),
-     $                      LDB, WORK( BXST ), N, WORK( U+ST1 ), N,
-     $                      WORK( VT+ST1 ), IWORK( K+ST1 ),
-     $                      WORK( DIFL+ST1 ), WORK( DIFR+ST1 ),
-     $                      WORK( Z+ST1 ), WORK( POLES+ST1 ),
-     $                      IWORK( GIVPTR+ST1 ), IWORK( GIVCOL+ST1 ), N,
-     $                      IWORK( PERM+ST1 ), WORK( GIVNUM+ST1 ),
-     $                      WORK( C+ST1 ), WORK( S+ST1 ), WORK( NWORK ),
-     $                      IWORK( IWK ), INFO )
-               IF( INFO.NE.0 ) THEN
-                  RETURN
-               END IF
-            END IF
-            ST = I + 1
-         END IF
-   60 CONTINUE
-*
-*     Apply the singular values and treat the tiny ones as zero.
-*
-      TOL = RCND*ABS( D( IDAMAX( N, D, 1 ) ) )
-*
-      DO 70 I = 1, N
-*
-*        Some of the elements in D can be negative because 1-by-1
-*        subproblems were not solved explicitly.
-*
-         IF( ABS( D( I ) ).LE.TOL ) THEN
-            CALL DLASET( 'A', 1, NRHS, ZERO, ZERO, WORK( BX+I-1 ), N )
-         ELSE
-            RANK = RANK + 1
-            CALL DLASCL( 'G', 0, 0, D( I ), ONE, 1, NRHS,
-     $                   WORK( BX+I-1 ), N, INFO )
-         END IF
-         D( I ) = ABS( D( I ) )
-   70 CONTINUE
-*
-*     Now apply back the right singular vectors.
-*
-      ICMPQ2 = 1
-      DO 80 I = 1, NSUB
-         ST = IWORK( I )
-         ST1 = ST - 1
-         NSIZE = IWORK( SIZEI+I-1 )
-         BXST = BX + ST1
-         IF( NSIZE.EQ.1 ) THEN
-            CALL DCOPY( NRHS, WORK( BXST ), N, B( ST, 1 ), LDB )
-         ELSE IF( NSIZE.LE.SMLSIZ ) THEN
-            CALL DGEMM( 'T', 'N', NSIZE, NRHS, NSIZE, ONE,
-     $                  WORK( VT+ST1 ), N, WORK( BXST ), N, ZERO,
-     $                  B( ST, 1 ), LDB )
-         ELSE
-            CALL DLALSA( ICMPQ2, SMLSIZ, NSIZE, NRHS, WORK( BXST ), N,
-     $                   B( ST, 1 ), LDB, WORK( U+ST1 ), N,
-     $                   WORK( VT+ST1 ), IWORK( K+ST1 ),
-     $                   WORK( DIFL+ST1 ), WORK( DIFR+ST1 ),
-     $                   WORK( Z+ST1 ), WORK( POLES+ST1 ),
-     $                   IWORK( GIVPTR+ST1 ), IWORK( GIVCOL+ST1 ), N,
-     $                   IWORK( PERM+ST1 ), WORK( GIVNUM+ST1 ),
-     $                   WORK( C+ST1 ), WORK( S+ST1 ), WORK( NWORK ),
-     $                   IWORK( IWK ), INFO )
-            IF( INFO.NE.0 ) THEN
-               RETURN
-            END IF
-         END IF
-   80 CONTINUE
-*
-*     Unscale and sort the singular values.
-*
-      CALL DLASCL( 'G', 0, 0, ONE, ORGNRM, N, 1, D, N, INFO )
-      CALL DLASRT( 'D', N, D, INFO )
-      CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, N, NRHS, B, LDB, INFO )
-*
-      RETURN
-*
-*     End of DLALSD
-*
-      END
--- a/libcruft/lapack/dlamc1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,183 +0,0 @@
-      SUBROUTINE DLAMC1( BETA, T, RND, IEEE1 )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            IEEE1, RND
-      INTEGER            BETA, T
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAMC1 determines the machine parameters given by BETA, T, RND, and
-*  IEEE1.
-*
-*  Arguments
-*  =========
-*
-*  BETA    (output) INTEGER
-*          The base of the machine.
-*
-*  T       (output) INTEGER
-*          The number of ( BETA ) digits in the mantissa.
-*
-*  RND     (output) LOGICAL
-*          Specifies whether proper rounding  ( RND = .TRUE. )  or
-*          chopping  ( RND = .FALSE. )  occurs in addition. This may not
-*          be a reliable guide to the way in which the machine performs
-*          its arithmetic.
-*
-*  IEEE1   (output) LOGICAL
-*          Specifies whether rounding appears to be done in the IEEE
-*          'round to nearest' style.
-*
-*  Further Details
-*  ===============
-*
-*  The routine is based on the routine  ENVRON  by Malcolm and
-*  incorporates suggestions by Gentleman and Marovich. See
-*
-*     Malcolm M. A. (1972) Algorithms to reveal properties of
-*        floating-point arithmetic. Comms. of the ACM, 15, 949-951.
-*
-*     Gentleman W. M. and Marovich S. B. (1974) More on algorithms
-*        that reveal properties of floating point arithmetic units.
-*        Comms. of the ACM, 17, 276-277.
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            FIRST, LIEEE1, LRND
-      INTEGER            LBETA, LT
-      DOUBLE PRECISION   A, B, C, F, ONE, QTR, SAVEC, T1, T2
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMC3
-      EXTERNAL           DLAMC3
-*     ..
-*     .. Save statement ..
-      SAVE               FIRST, LIEEE1, LBETA, LRND, LT
-*     ..
-*     .. Data statements ..
-      DATA               FIRST / .TRUE. /
-*     ..
-*     .. Executable Statements ..
-*
-      IF( FIRST ) THEN
-         ONE = 1
-*
-*        LBETA,  LIEEE1,  LT and  LRND  are the  local values  of  BETA,
-*        IEEE1, T and RND.
-*
-*        Throughout this routine  we use the function  DLAMC3  to ensure
-*        that relevant values are  stored and not held in registers,  or
-*        are not affected by optimizers.
-*
-*        Compute  a = 2.0**m  with the  smallest positive integer m such
-*        that
-*
-*           fl( a + 1.0 ) = a.
-*
-         A = 1
-         C = 1
-*
-*+       WHILE( C.EQ.ONE )LOOP
-   10    CONTINUE
-         IF( C.EQ.ONE ) THEN
-            A = 2*A
-            C = DLAMC3( A, ONE )
-            C = DLAMC3( C, -A )
-            GO TO 10
-         END IF
-*+       END WHILE
-*
-*        Now compute  b = 2.0**m  with the smallest positive integer m
-*        such that
-*
-*           fl( a + b ) .gt. a.
-*
-         B = 1
-         C = DLAMC3( A, B )
-*
-*+       WHILE( C.EQ.A )LOOP
-   20    CONTINUE
-         IF( C.EQ.A ) THEN
-            B = 2*B
-            C = DLAMC3( A, B )
-            GO TO 20
-         END IF
-*+       END WHILE
-*
-*        Now compute the base.  a and c  are neighbouring floating point
-*        numbers  in the  interval  ( beta**t, beta**( t + 1 ) )  and so
-*        their difference is beta. Adding 0.25 to c is to ensure that it
-*        is truncated to beta and not ( beta - 1 ).
-*
-         QTR = ONE / 4
-         SAVEC = C
-         C = DLAMC3( C, -A )
-         LBETA = C + QTR
-*
-*        Now determine whether rounding or chopping occurs,  by adding a
-*        bit  less  than  beta/2  and a  bit  more  than  beta/2  to  a.
-*
-         B = LBETA
-         F = DLAMC3( B / 2, -B / 100 )
-         C = DLAMC3( F, A )
-         IF( C.EQ.A ) THEN
-            LRND = .TRUE.
-         ELSE
-            LRND = .FALSE.
-         END IF
-         F = DLAMC3( B / 2, B / 100 )
-         C = DLAMC3( F, A )
-         IF( ( LRND ) .AND. ( C.EQ.A ) )
-     $      LRND = .FALSE.
-*
-*        Try and decide whether rounding is done in the  IEEE  'round to
-*        nearest' style. B/2 is half a unit in the last place of the two
-*        numbers A and SAVEC. Furthermore, A is even, i.e. has last  bit
-*        zero, and SAVEC is odd. Thus adding B/2 to A should not  change
-*        A, but adding B/2 to SAVEC should change SAVEC.
-*
-         T1 = DLAMC3( B / 2, A )
-         T2 = DLAMC3( B / 2, SAVEC )
-         LIEEE1 = ( T1.EQ.A ) .AND. ( T2.GT.SAVEC ) .AND. LRND
-*
-*        Now find  the  mantissa, t.  It should  be the  integer part of
-*        log to the base beta of a,  however it is safer to determine  t
-*        by powering.  So we find t as the smallest positive integer for
-*        which
-*
-*           fl( beta**t + 1.0 ) = 1.0.
-*
-         LT = 0
-         A = 1
-         C = 1
-*
-*+       WHILE( C.EQ.ONE )LOOP
-   30    CONTINUE
-         IF( C.EQ.ONE ) THEN
-            LT = LT + 1
-            A = A*LBETA
-            C = DLAMC3( A, ONE )
-            C = DLAMC3( C, -A )
-            GO TO 30
-         END IF
-*+       END WHILE
-*
-      END IF
-*
-      BETA = LBETA
-      T = LT
-      RND = LRND
-      IEEE1 = LIEEE1
-      FIRST = .FALSE.
-      RETURN
-*
-*     End of DLAMC1
-*
-      END
--- a/libcruft/lapack/dlamc2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,255 +0,0 @@
-      SUBROUTINE DLAMC2( BETA, T, RND, EPS, EMIN, RMIN, EMAX, RMAX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            RND
-      INTEGER            BETA, EMAX, EMIN, T
-      DOUBLE PRECISION   EPS, RMAX, RMIN
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAMC2 determines the machine parameters specified in its argument
-*  list.
-*
-*  Arguments
-*  =========
-*
-*  BETA    (output) INTEGER
-*          The base of the machine.
-*
-*  T       (output) INTEGER
-*          The number of ( BETA ) digits in the mantissa.
-*
-*  RND     (output) LOGICAL
-*          Specifies whether proper rounding  ( RND = .TRUE. )  or
-*          chopping  ( RND = .FALSE. )  occurs in addition. This may not
-*          be a reliable guide to the way in which the machine performs
-*          its arithmetic.
-*
-*  EPS     (output) DOUBLE PRECISION
-*          The smallest positive number such that
-*
-*             fl( 1.0 - EPS ) .LT. 1.0,
-*
-*          where fl denotes the computed value.
-*
-*  EMIN    (output) INTEGER
-*          The minimum exponent before (gradual) underflow occurs.
-*
-*  RMIN    (output) DOUBLE PRECISION
-*          The smallest normalized number for the machine, given by
-*          BASE**( EMIN - 1 ), where  BASE  is the floating point value
-*          of BETA.
-*
-*  EMAX    (output) INTEGER
-*          The maximum exponent before overflow occurs.
-*
-*  RMAX    (output) DOUBLE PRECISION
-*          The largest positive number for the machine, given by
-*          BASE**EMAX * ( 1 - EPS ), where  BASE  is the floating point
-*          value of BETA.
-*
-*  Further Details
-*  ===============
-*
-*  The computation of  EPS  is based on a routine PARANOIA by
-*  W. Kahan of the University of California at Berkeley.
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            FIRST, IEEE, IWARN, LIEEE1, LRND
-      INTEGER            GNMIN, GPMIN, I, LBETA, LEMAX, LEMIN, LT,
-     $                   NGNMIN, NGPMIN
-      DOUBLE PRECISION   A, B, C, HALF, LEPS, LRMAX, LRMIN, ONE, RBASE,
-     $                   SIXTH, SMALL, THIRD, TWO, ZERO
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMC3
-      EXTERNAL           DLAMC3
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLAMC1, DLAMC4, DLAMC5
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN
-*     ..
-*     .. Save statement ..
-      SAVE               FIRST, IWARN, LBETA, LEMAX, LEMIN, LEPS, LRMAX,
-     $                   LRMIN, LT
-*     ..
-*     .. Data statements ..
-      DATA               FIRST / .TRUE. / , IWARN / .FALSE. /
-*     ..
-*     .. Executable Statements ..
-*
-      IF( FIRST ) THEN
-         ZERO = 0
-         ONE = 1
-         TWO = 2
-*
-*        LBETA, LT, LRND, LEPS, LEMIN and LRMIN  are the local values of
-*        BETA, T, RND, EPS, EMIN and RMIN.
-*
-*        Throughout this routine  we use the function  DLAMC3  to ensure
-*        that relevant values are stored  and not held in registers,  or
-*        are not affected by optimizers.
-*
-*        DLAMC1 returns the parameters  LBETA, LT, LRND and LIEEE1.
-*
-         CALL DLAMC1( LBETA, LT, LRND, LIEEE1 )
-*
-*        Start to find EPS.
-*
-         B = LBETA
-         A = B**( -LT )
-         LEPS = A
-*
-*        Try some tricks to see whether or not this is the correct  EPS.
-*
-         B = TWO / 3
-         HALF = ONE / 2
-         SIXTH = DLAMC3( B, -HALF )
-         THIRD = DLAMC3( SIXTH, SIXTH )
-         B = DLAMC3( THIRD, -HALF )
-         B = DLAMC3( B, SIXTH )
-         B = ABS( B )
-         IF( B.LT.LEPS )
-     $      B = LEPS
-*
-         LEPS = 1
-*
-*+       WHILE( ( LEPS.GT.B ).AND.( B.GT.ZERO ) )LOOP
-   10    CONTINUE
-         IF( ( LEPS.GT.B ) .AND. ( B.GT.ZERO ) ) THEN
-            LEPS = B
-            C = DLAMC3( HALF*LEPS, ( TWO**5 )*( LEPS**2 ) )
-            C = DLAMC3( HALF, -C )
-            B = DLAMC3( HALF, C )
-            C = DLAMC3( HALF, -B )
-            B = DLAMC3( HALF, C )
-            GO TO 10
-         END IF
-*+       END WHILE
-*
-         IF( A.LT.LEPS )
-     $      LEPS = A
-*
-*        Computation of EPS complete.
-*
-*        Now find  EMIN.  Let A = + or - 1, and + or - (1 + BASE**(-3)).
-*        Keep dividing  A by BETA until (gradual) underflow occurs. This
-*        is detected when we cannot recover the previous A.
-*
-         RBASE = ONE / LBETA
-         SMALL = ONE
-         DO 20 I = 1, 3
-            SMALL = DLAMC3( SMALL*RBASE, ZERO )
-   20    CONTINUE
-         A = DLAMC3( ONE, SMALL )
-         CALL DLAMC4( NGPMIN, ONE, LBETA )
-         CALL DLAMC4( NGNMIN, -ONE, LBETA )
-         CALL DLAMC4( GPMIN, A, LBETA )
-         CALL DLAMC4( GNMIN, -A, LBETA )
-         IEEE = .FALSE.
-*
-         IF( ( NGPMIN.EQ.NGNMIN ) .AND. ( GPMIN.EQ.GNMIN ) ) THEN
-            IF( NGPMIN.EQ.GPMIN ) THEN
-               LEMIN = NGPMIN
-*            ( Non twos-complement machines, no gradual underflow;
-*              e.g.,  VAX )
-            ELSE IF( ( GPMIN-NGPMIN ).EQ.3 ) THEN
-               LEMIN = NGPMIN - 1 + LT
-               IEEE = .TRUE.
-*            ( Non twos-complement machines, with gradual underflow;
-*              e.g., IEEE standard followers )
-            ELSE
-               LEMIN = MIN( NGPMIN, GPMIN )
-*            ( A guess; no known machine )
-               IWARN = .TRUE.
-            END IF
-*
-         ELSE IF( ( NGPMIN.EQ.GPMIN ) .AND. ( NGNMIN.EQ.GNMIN ) ) THEN
-            IF( ABS( NGPMIN-NGNMIN ).EQ.1 ) THEN
-               LEMIN = MAX( NGPMIN, NGNMIN )
-*            ( Twos-complement machines, no gradual underflow;
-*              e.g., CYBER 205 )
-            ELSE
-               LEMIN = MIN( NGPMIN, NGNMIN )
-*            ( A guess; no known machine )
-               IWARN = .TRUE.
-            END IF
-*
-         ELSE IF( ( ABS( NGPMIN-NGNMIN ).EQ.1 ) .AND.
-     $            ( GPMIN.EQ.GNMIN ) ) THEN
-            IF( ( GPMIN-MIN( NGPMIN, NGNMIN ) ).EQ.3 ) THEN
-               LEMIN = MAX( NGPMIN, NGNMIN ) - 1 + LT
-*            ( Twos-complement machines with gradual underflow;
-*              no known machine )
-            ELSE
-               LEMIN = MIN( NGPMIN, NGNMIN )
-*            ( A guess; no known machine )
-               IWARN = .TRUE.
-            END IF
-*
-         ELSE
-            LEMIN = MIN( NGPMIN, NGNMIN, GPMIN, GNMIN )
-*         ( A guess; no known machine )
-            IWARN = .TRUE.
-         END IF
-         FIRST = .FALSE.
-***
-* Comment out this if block if EMIN is ok
-         IF( IWARN ) THEN
-            FIRST = .TRUE.
-            WRITE( 6, FMT = 9999 )LEMIN
-         END IF
-***
-*
-*        Assume IEEE arithmetic if we found denormalised  numbers above,
-*        or if arithmetic seems to round in the  IEEE style,  determined
-*        in routine DLAMC1. A true IEEE machine should have both  things
-*        true; however, faulty machines may have one or the other.
-*
-         IEEE = IEEE .OR. LIEEE1
-*
-*        Compute  RMIN by successive division by  BETA. We could compute
-*        RMIN as BASE**( EMIN - 1 ),  but some machines underflow during
-*        this computation.
-*
-         LRMIN = 1
-         DO 30 I = 1, 1 - LEMIN
-            LRMIN = DLAMC3( LRMIN*RBASE, ZERO )
-   30    CONTINUE
-*
-*        Finally, call DLAMC5 to compute EMAX and RMAX.
-*
-         CALL DLAMC5( LBETA, LT, LEMIN, IEEE, LEMAX, LRMAX )
-      END IF
-*
-      BETA = LBETA
-      T = LT
-      RND = LRND
-      EPS = LEPS
-      EMIN = LEMIN
-      RMIN = LRMIN
-      EMAX = LEMAX
-      RMAX = LRMAX
-*
-      RETURN
-*
- 9999 FORMAT( / / ' WARNING. The value EMIN may be incorrect:-',
-     $      '  EMIN = ', I8, /
-     $      ' If, after inspection, the value EMIN looks',
-     $      ' acceptable please comment out ',
-     $      / ' the IF block as marked within the code of routine',
-     $      ' DLAMC2,', / ' otherwise supply EMIN explicitly.', / )
-*
-*     End of DLAMC2
-*
-      END
--- a/libcruft/lapack/dlamc3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-      DOUBLE PRECISION FUNCTION DLAMC3( A, B )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   A, B
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAMC3  is intended to force  A  and  B  to be stored prior to doing
-*  the addition of  A  and  B ,  for use in situations where optimizers
-*  might hold one of these in a register.
-*
-*  Arguments
-*  =========
-*
-*  A       (input) DOUBLE PRECISION
-*  B       (input) DOUBLE PRECISION
-*          The values A and B.
-*
-* =====================================================================
-*
-*     .. Executable Statements ..
-*
-      DLAMC3 = A + B
-*
-      RETURN
-*
-*     End of DLAMC3
-*
-      END
--- a/libcruft/lapack/dlamc4.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-      SUBROUTINE DLAMC4( EMIN, START, BASE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            BASE, EMIN
-      DOUBLE PRECISION   START
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAMC4 is a service routine for DLAMC2.
-*
-*  Arguments
-*  =========
-*
-*  EMIN    (output) INTEGER 
-*          The minimum exponent before (gradual) underflow, computed by
-*          setting A = START and dividing by BASE until the previous A
-*          can not be recovered.
-*
-*  START   (input) DOUBLE PRECISION
-*          The starting point for determining EMIN.
-*
-*  BASE    (input) INTEGER
-*          The base of the machine.
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I
-      DOUBLE PRECISION   A, B1, B2, C1, C2, D1, D2, ONE, RBASE, ZERO
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMC3
-      EXTERNAL           DLAMC3
-*     ..
-*     .. Executable Statements ..
-*
-      A = START
-      ONE = 1
-      RBASE = ONE / BASE
-      ZERO = 0
-      EMIN = 1
-      B1 = DLAMC3( A*RBASE, ZERO )
-      C1 = A
-      C2 = A
-      D1 = A
-      D2 = A
-*+    WHILE( ( C1.EQ.A ).AND.( C2.EQ.A ).AND.
-*    $       ( D1.EQ.A ).AND.( D2.EQ.A )      )LOOP
-   10 CONTINUE
-      IF( ( C1.EQ.A ) .AND. ( C2.EQ.A ) .AND. ( D1.EQ.A ) .AND.
-     $    ( D2.EQ.A ) ) THEN
-         EMIN = EMIN - 1
-         A = B1
-         B1 = DLAMC3( A / BASE, ZERO )
-         C1 = DLAMC3( B1*BASE, ZERO )
-         D1 = ZERO
-         DO 20 I = 1, BASE
-            D1 = D1 + B1
-   20    CONTINUE
-         B2 = DLAMC3( A*RBASE, ZERO )
-         C2 = DLAMC3( B2 / RBASE, ZERO )
-         D2 = ZERO
-         DO 30 I = 1, BASE
-            D2 = D2 + B2
-   30    CONTINUE
-         GO TO 10
-      END IF
-*+    END WHILE
-*
-      RETURN
-*
-*     End of DLAMC4
-*
-      END
--- a/libcruft/lapack/dlamc5.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,158 +0,0 @@
-      SUBROUTINE DLAMC5( BETA, P, EMIN, IEEE, EMAX, RMAX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            IEEE
-      INTEGER            BETA, EMAX, EMIN, P
-      DOUBLE PRECISION   RMAX
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAMC5 attempts to compute RMAX, the largest machine floating-point
-*  number, without overflow.  It assumes that EMAX + abs(EMIN) sum
-*  approximately to a power of 2.  It will fail on machines where this
-*  assumption does not hold, for example, the Cyber 205 (EMIN = -28625,
-*  EMAX = 28718).  It will also fail if the value supplied for EMIN is
-*  too large (i.e. too close to zero), probably with overflow.
-*
-*  Arguments
-*  =========
-*
-*  BETA    (input) INTEGER
-*          The base of floating-point arithmetic.
-*
-*  P       (input) INTEGER
-*          The number of base BETA digits in the mantissa of a
-*          floating-point value.
-*
-*  EMIN    (input) INTEGER
-*          The minimum exponent before (gradual) underflow.
-*
-*  IEEE    (input) LOGICAL
-*          A logical flag specifying whether or not the arithmetic
-*          system is thought to comply with the IEEE standard.
-*
-*  EMAX    (output) INTEGER
-*          The largest exponent before overflow
-*
-*  RMAX    (output) DOUBLE PRECISION
-*          The largest machine floating-point number.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            EXBITS, EXPSUM, I, LEXP, NBITS, TRY, UEXP
-      DOUBLE PRECISION   OLDY, RECBAS, Y, Z
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMC3
-      EXTERNAL           DLAMC3
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MOD
-*     ..
-*     .. Executable Statements ..
-*
-*     First compute LEXP and UEXP, two powers of 2 that bound
-*     abs(EMIN). We then assume that EMAX + abs(EMIN) will sum
-*     approximately to the bound that is closest to abs(EMIN).
-*     (EMAX is the exponent of the required number RMAX).
-*
-      LEXP = 1
-      EXBITS = 1
-   10 CONTINUE
-      TRY = LEXP*2
-      IF( TRY.LE.( -EMIN ) ) THEN
-         LEXP = TRY
-         EXBITS = EXBITS + 1
-         GO TO 10
-      END IF
-      IF( LEXP.EQ.-EMIN ) THEN
-         UEXP = LEXP
-      ELSE
-         UEXP = TRY
-         EXBITS = EXBITS + 1
-      END IF
-*
-*     Now -LEXP is less than or equal to EMIN, and -UEXP is greater
-*     than or equal to EMIN. EXBITS is the number of bits needed to
-*     store the exponent.
-*
-      IF( ( UEXP+EMIN ).GT.( -LEXP-EMIN ) ) THEN
-         EXPSUM = 2*LEXP
-      ELSE
-         EXPSUM = 2*UEXP
-      END IF
-*
-*     EXPSUM is the exponent range, approximately equal to
-*     EMAX - EMIN + 1 .
-*
-      EMAX = EXPSUM + EMIN - 1
-      NBITS = 1 + EXBITS + P
-*
-*     NBITS is the total number of bits needed to store a
-*     floating-point number.
-*
-      IF( ( MOD( NBITS, 2 ).EQ.1 ) .AND. ( BETA.EQ.2 ) ) THEN
-*
-*        Either there are an odd number of bits used to store a
-*        floating-point number, which is unlikely, or some bits are
-*        not used in the representation of numbers, which is possible,
-*        (e.g. Cray machines) or the mantissa has an implicit bit,
-*        (e.g. IEEE machines, Dec Vax machines), which is perhaps the
-*        most likely. We have to assume the last alternative.
-*        If this is true, then we need to reduce EMAX by one because
-*        there must be some way of representing zero in an implicit-bit
-*        system. On machines like Cray, we are reducing EMAX by one
-*        unnecessarily.
-*
-         EMAX = EMAX - 1
-      END IF
-*
-      IF( IEEE ) THEN
-*
-*        Assume we are on an IEEE machine which reserves one exponent
-*        for infinity and NaN.
-*
-         EMAX = EMAX - 1
-      END IF
-*
-*     Now create RMAX, the largest machine number, which should
-*     be equal to (1.0 - BETA**(-P)) * BETA**EMAX .
-*
-*     First compute 1.0 - BETA**(-P), being careful that the
-*     result is less than 1.0 .
-*
-      RECBAS = ONE / BETA
-      Z = BETA - ONE
-      Y = ZERO
-      DO 20 I = 1, P
-         Z = Z*RECBAS
-         IF( Y.LT.ONE )
-     $      OLDY = Y
-         Y = DLAMC3( Y, Z )
-   20 CONTINUE
-      IF( Y.GE.ONE )
-     $   Y = OLDY
-*
-*     Now multiply by BETA**EMAX to get RMAX.
-*
-      DO 30 I = 1, EMAX
-         Y = DLAMC3( Y*BETA, ZERO )
-   30 CONTINUE
-*
-      RMAX = Y
-      RETURN
-*
-*     End of DLAMC5
-*
-      END
--- a/libcruft/lapack/dlamch.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,126 +0,0 @@
-      DOUBLE PRECISION FUNCTION DLAMCH( CMACH )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          CMACH
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAMCH determines double precision machine parameters.
-*
-*  Arguments
-*  =========
-*
-*  CMACH   (input) CHARACTER*1
-*          Specifies the value to be returned by DLAMCH:
-*          = 'E' or 'e',   DLAMCH := eps
-*          = 'S' or 's ,   DLAMCH := sfmin
-*          = 'B' or 'b',   DLAMCH := base
-*          = 'P' or 'p',   DLAMCH := eps*base
-*          = 'N' or 'n',   DLAMCH := t
-*          = 'R' or 'r',   DLAMCH := rnd
-*          = 'M' or 'm',   DLAMCH := emin
-*          = 'U' or 'u',   DLAMCH := rmin
-*          = 'L' or 'l',   DLAMCH := emax
-*          = 'O' or 'o',   DLAMCH := rmax
-*
-*          where
-*
-*          eps   = relative machine precision
-*          sfmin = safe minimum, such that 1/sfmin does not overflow
-*          base  = base of the machine
-*          prec  = eps*base
-*          t     = number of (base) digits in the mantissa
-*          rnd   = 1.0 when rounding occurs in addition, 0.0 otherwise
-*          emin  = minimum exponent before (gradual) underflow
-*          rmin  = underflow threshold - base**(emin-1)
-*          emax  = largest exponent before overflow
-*          rmax  = overflow threshold  - (base**emax)*(1-eps)
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            FIRST, LRND
-      INTEGER            BETA, IMAX, IMIN, IT
-      DOUBLE PRECISION   BASE, EMAX, EMIN, EPS, PREC, RMACH, RMAX, RMIN,
-     $                   RND, SFMIN, SMALL, T
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLAMC2
-*     ..
-*     .. Save statement ..
-      SAVE               FIRST, EPS, SFMIN, BASE, T, RND, EMIN, RMIN,
-     $                   EMAX, RMAX, PREC
-*     ..
-*     .. Data statements ..
-      DATA               FIRST / .TRUE. /
-*     ..
-*     .. Executable Statements ..
-*
-      IF( FIRST ) THEN
-         CALL DLAMC2( BETA, IT, LRND, EPS, IMIN, RMIN, IMAX, RMAX )
-         BASE = BETA
-         T = IT
-         IF( LRND ) THEN
-            RND = ONE
-            EPS = ( BASE**( 1-IT ) ) / 2
-         ELSE
-            RND = ZERO
-            EPS = BASE**( 1-IT )
-         END IF
-         PREC = EPS*BASE
-         EMIN = IMIN
-         EMAX = IMAX
-         SFMIN = RMIN
-         SMALL = ONE / RMAX
-         IF( SMALL.GE.SFMIN ) THEN
-*
-*           Use SMALL plus a bit, to avoid the possibility of rounding
-*           causing overflow when computing  1/sfmin.
-*
-            SFMIN = SMALL*( ONE+EPS )
-         END IF
-      END IF
-*
-      IF( LSAME( CMACH, 'E' ) ) THEN
-         RMACH = EPS
-      ELSE IF( LSAME( CMACH, 'S' ) ) THEN
-         RMACH = SFMIN
-      ELSE IF( LSAME( CMACH, 'B' ) ) THEN
-         RMACH = BASE
-      ELSE IF( LSAME( CMACH, 'P' ) ) THEN
-         RMACH = PREC
-      ELSE IF( LSAME( CMACH, 'N' ) ) THEN
-         RMACH = T
-      ELSE IF( LSAME( CMACH, 'R' ) ) THEN
-         RMACH = RND
-      ELSE IF( LSAME( CMACH, 'M' ) ) THEN
-         RMACH = EMIN
-      ELSE IF( LSAME( CMACH, 'U' ) ) THEN
-         RMACH = RMIN
-      ELSE IF( LSAME( CMACH, 'L' ) ) THEN
-         RMACH = EMAX
-      ELSE IF( LSAME( CMACH, 'O' ) ) THEN
-         RMACH = RMAX
-      END IF
-*
-      DLAMCH = RMACH
-      FIRST  = .FALSE.
-      RETURN
-*
-*     End of DLAMCH
-*
-      END
--- a/libcruft/lapack/dlamrg.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,103 +0,0 @@
-      SUBROUTINE DLAMRG( N1, N2, A, DTRD1, DTRD2, INDEX )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            DTRD1, DTRD2, N1, N2
-*     ..
-*     .. Array Arguments ..
-      INTEGER            INDEX( * )
-      DOUBLE PRECISION   A( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAMRG will create a permutation list which will merge the elements
-*  of A (which is composed of two independently sorted sets) into a
-*  single set which is sorted in ascending order.
-*
-*  Arguments
-*  =========
-*
-*  N1     (input) INTEGER
-*  N2     (input) INTEGER
-*         These arguements contain the respective lengths of the two
-*         sorted lists to be merged.
-*
-*  A      (input) DOUBLE PRECISION array, dimension (N1+N2)
-*         The first N1 elements of A contain a list of numbers which
-*         are sorted in either ascending or descending order.  Likewise
-*         for the final N2 elements.
-*
-*  DTRD1  (input) INTEGER
-*  DTRD2  (input) INTEGER
-*         These are the strides to be taken through the array A.
-*         Allowable strides are 1 and -1.  They indicate whether a
-*         subset of A is sorted in ascending (DTRDx = 1) or descending
-*         (DTRDx = -1) order.
-*
-*  INDEX  (output) INTEGER array, dimension (N1+N2)
-*         On exit this array will contain a permutation such that
-*         if B( I ) = A( INDEX( I ) ) for I=1,N1+N2, then B will be
-*         sorted in ascending order.
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, IND1, IND2, N1SV, N2SV
-*     ..
-*     .. Executable Statements ..
-*
-      N1SV = N1
-      N2SV = N2
-      IF( DTRD1.GT.0 ) THEN
-         IND1 = 1
-      ELSE
-         IND1 = N1
-      END IF
-      IF( DTRD2.GT.0 ) THEN
-         IND2 = 1 + N1
-      ELSE
-         IND2 = N1 + N2
-      END IF
-      I = 1
-*     while ( (N1SV > 0) & (N2SV > 0) )
-   10 CONTINUE
-      IF( N1SV.GT.0 .AND. N2SV.GT.0 ) THEN
-         IF( A( IND1 ).LE.A( IND2 ) ) THEN
-            INDEX( I ) = IND1
-            I = I + 1
-            IND1 = IND1 + DTRD1
-            N1SV = N1SV - 1
-         ELSE
-            INDEX( I ) = IND2
-            I = I + 1
-            IND2 = IND2 + DTRD2
-            N2SV = N2SV - 1
-         END IF
-         GO TO 10
-      END IF
-*     end while
-      IF( N1SV.EQ.0 ) THEN
-         DO 20 N1SV = 1, N2SV
-            INDEX( I ) = IND2
-            I = I + 1
-            IND2 = IND2 + DTRD2
-   20    CONTINUE
-      ELSE
-*     N2SV .EQ. 0
-         DO 30 N2SV = 1, N1SV
-            INDEX( I ) = IND1
-            I = I + 1
-            IND1 = IND1 + DTRD1
-   30    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of DLAMRG
-*
-      END
--- a/libcruft/lapack/dlange.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-      DOUBLE PRECISION FUNCTION DLANGE( NORM, M, N, A, LDA, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLANGE  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  real matrix A.
-*
-*  Description
-*  ===========
-*
-*  DLANGE returns the value
-*
-*     DLANGE = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in DLANGE as described
-*          above.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.  When M = 0,
-*          DLANGE is set to zero.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.  When N = 0,
-*          DLANGE is set to zero.
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA,N)
-*          The m by n matrix A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(M,1).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)),
-*          where LWORK >= M when NORM = 'I'; otherwise, WORK is not
-*          referenced.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      DOUBLE PRECISION   SCALE, SUM, VALUE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLASSQ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( MIN( M, N ).EQ.0 ) THEN
-         VALUE = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         VALUE = ZERO
-         DO 20 J = 1, N
-            DO 10 I = 1, M
-               VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   10       CONTINUE
-   20    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN
-*
-*        Find norm1(A).
-*
-         VALUE = ZERO
-         DO 40 J = 1, N
-            SUM = ZERO
-            DO 30 I = 1, M
-               SUM = SUM + ABS( A( I, J ) )
-   30       CONTINUE
-            VALUE = MAX( VALUE, SUM )
-   40    CONTINUE
-      ELSE IF( LSAME( NORM, 'I' ) ) THEN
-*
-*        Find normI(A).
-*
-         DO 50 I = 1, M
-            WORK( I ) = ZERO
-   50    CONTINUE
-         DO 70 J = 1, N
-            DO 60 I = 1, M
-               WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-   60       CONTINUE
-   70    CONTINUE
-         VALUE = ZERO
-         DO 80 I = 1, M
-            VALUE = MAX( VALUE, WORK( I ) )
-   80    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         SCALE = ZERO
-         SUM = ONE
-         DO 90 J = 1, N
-            CALL DLASSQ( M, A( 1, J ), 1, SCALE, SUM )
-   90    CONTINUE
-         VALUE = SCALE*SQRT( SUM )
-      END IF
-*
-      DLANGE = VALUE
-      RETURN
-*
-*     End of DLANGE
-*
-      END
--- a/libcruft/lapack/dlanhs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,141 +0,0 @@
-      DOUBLE PRECISION FUNCTION DLANHS( NORM, N, A, LDA, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            LDA, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLANHS  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  Hessenberg matrix A.
-*
-*  Description
-*  ===========
-*
-*  DLANHS returns the value
-*
-*     DLANHS = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in DLANHS as described
-*          above.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.  When N = 0, DLANHS is
-*          set to zero.
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA,N)
-*          The n by n upper Hessenberg matrix A; the part of A below the
-*          first sub-diagonal is not referenced.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(N,1).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)),
-*          where LWORK >= N when NORM = 'I'; otherwise, WORK is not
-*          referenced.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      DOUBLE PRECISION   SCALE, SUM, VALUE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLASSQ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.EQ.0 ) THEN
-         VALUE = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         VALUE = ZERO
-         DO 20 J = 1, N
-            DO 10 I = 1, MIN( N, J+1 )
-               VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   10       CONTINUE
-   20    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN
-*
-*        Find norm1(A).
-*
-         VALUE = ZERO
-         DO 40 J = 1, N
-            SUM = ZERO
-            DO 30 I = 1, MIN( N, J+1 )
-               SUM = SUM + ABS( A( I, J ) )
-   30       CONTINUE
-            VALUE = MAX( VALUE, SUM )
-   40    CONTINUE
-      ELSE IF( LSAME( NORM, 'I' ) ) THEN
-*
-*        Find normI(A).
-*
-         DO 50 I = 1, N
-            WORK( I ) = ZERO
-   50    CONTINUE
-         DO 70 J = 1, N
-            DO 60 I = 1, MIN( N, J+1 )
-               WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-   60       CONTINUE
-   70    CONTINUE
-         VALUE = ZERO
-         DO 80 I = 1, N
-            VALUE = MAX( VALUE, WORK( I ) )
-   80    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         SCALE = ZERO
-         SUM = ONE
-         DO 90 J = 1, N
-            CALL DLASSQ( MIN( N, J+1 ), A( 1, J ), 1, SCALE, SUM )
-   90    CONTINUE
-         VALUE = SCALE*SQRT( SUM )
-      END IF
-*
-      DLANHS = VALUE
-      RETURN
-*
-*     End of DLANHS
-*
-      END
--- a/libcruft/lapack/dlanst.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,124 +0,0 @@
-      DOUBLE PRECISION FUNCTION DLANST( NORM, N, D, E )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLANST  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  real symmetric tridiagonal matrix A.
-*
-*  Description
-*  ===========
-*
-*  DLANST returns the value
-*
-*     DLANST = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in DLANST as described
-*          above.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.  When N = 0, DLANST is
-*          set to zero.
-*
-*  D       (input) DOUBLE PRECISION array, dimension (N)
-*          The diagonal elements of A.
-*
-*  E       (input) DOUBLE PRECISION array, dimension (N-1)
-*          The (n-1) sub-diagonal or super-diagonal elements of A.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      DOUBLE PRECISION   ANORM, SCALE, SUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLASSQ
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.LE.0 ) THEN
-         ANORM = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         ANORM = ABS( D( N ) )
-         DO 10 I = 1, N - 1
-            ANORM = MAX( ANORM, ABS( D( I ) ) )
-            ANORM = MAX( ANORM, ABS( E( I ) ) )
-   10    CONTINUE
-      ELSE IF( LSAME( NORM, 'O' ) .OR. NORM.EQ.'1' .OR.
-     $         LSAME( NORM, 'I' ) ) THEN
-*
-*        Find norm1(A).
-*
-         IF( N.EQ.1 ) THEN
-            ANORM = ABS( D( 1 ) )
-         ELSE
-            ANORM = MAX( ABS( D( 1 ) )+ABS( E( 1 ) ),
-     $              ABS( E( N-1 ) )+ABS( D( N ) ) )
-            DO 20 I = 2, N - 1
-               ANORM = MAX( ANORM, ABS( D( I ) )+ABS( E( I ) )+
-     $                 ABS( E( I-1 ) ) )
-   20       CONTINUE
-         END IF
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         SCALE = ZERO
-         SUM = ONE
-         IF( N.GT.1 ) THEN
-            CALL DLASSQ( N-1, E, 1, SCALE, SUM )
-            SUM = 2*SUM
-         END IF
-         CALL DLASSQ( N, D, 1, SCALE, SUM )
-         ANORM = SCALE*SQRT( SUM )
-      END IF
-*
-      DLANST = ANORM
-      RETURN
-*
-*     End of DLANST
-*
-      END
--- a/libcruft/lapack/dlansy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,173 +0,0 @@
-      DOUBLE PRECISION FUNCTION DLANSY( NORM, UPLO, N, A, LDA, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM, UPLO
-      INTEGER            LDA, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLANSY  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  real symmetric matrix A.
-*
-*  Description
-*  ===========
-*
-*  DLANSY returns the value
-*
-*     DLANSY = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in DLANSY as described
-*          above.
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          symmetric matrix A is to be referenced.
-*          = 'U':  Upper triangular part of A is referenced
-*          = 'L':  Lower triangular part of A is referenced
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.  When N = 0, DLANSY is
-*          set to zero.
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA,N)
-*          The symmetric matrix A.  If UPLO = 'U', the leading n by n
-*          upper triangular part of A contains the upper triangular part
-*          of the matrix A, and the strictly lower triangular part of A
-*          is not referenced.  If UPLO = 'L', the leading n by n lower
-*          triangular part of A contains the lower triangular part of
-*          the matrix A, and the strictly upper triangular part of A is
-*          not referenced.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(N,1).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)),
-*          where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise,
-*          WORK is not referenced.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      DOUBLE PRECISION   ABSA, SCALE, SUM, VALUE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLASSQ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.EQ.0 ) THEN
-         VALUE = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         VALUE = ZERO
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            DO 20 J = 1, N
-               DO 10 I = 1, J
-                  VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   10          CONTINUE
-   20       CONTINUE
-         ELSE
-            DO 40 J = 1, N
-               DO 30 I = J, N
-                  VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   30          CONTINUE
-   40       CONTINUE
-         END IF
-      ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR.
-     $         ( NORM.EQ.'1' ) ) THEN
-*
-*        Find normI(A) ( = norm1(A), since A is symmetric).
-*
-         VALUE = ZERO
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            DO 60 J = 1, N
-               SUM = ZERO
-               DO 50 I = 1, J - 1
-                  ABSA = ABS( A( I, J ) )
-                  SUM = SUM + ABSA
-                  WORK( I ) = WORK( I ) + ABSA
-   50          CONTINUE
-               WORK( J ) = SUM + ABS( A( J, J ) )
-   60       CONTINUE
-            DO 70 I = 1, N
-               VALUE = MAX( VALUE, WORK( I ) )
-   70       CONTINUE
-         ELSE
-            DO 80 I = 1, N
-               WORK( I ) = ZERO
-   80       CONTINUE
-            DO 100 J = 1, N
-               SUM = WORK( J ) + ABS( A( J, J ) )
-               DO 90 I = J + 1, N
-                  ABSA = ABS( A( I, J ) )
-                  SUM = SUM + ABSA
-                  WORK( I ) = WORK( I ) + ABSA
-   90          CONTINUE
-               VALUE = MAX( VALUE, SUM )
-  100       CONTINUE
-         END IF
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         SCALE = ZERO
-         SUM = ONE
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            DO 110 J = 2, N
-               CALL DLASSQ( J-1, A( 1, J ), 1, SCALE, SUM )
-  110       CONTINUE
-         ELSE
-            DO 120 J = 1, N - 1
-               CALL DLASSQ( N-J, A( J+1, J ), 1, SCALE, SUM )
-  120       CONTINUE
-         END IF
-         SUM = 2*SUM
-         CALL DLASSQ( N, A, LDA+1, SCALE, SUM )
-         VALUE = SCALE*SQRT( SUM )
-      END IF
-*
-      DLANSY = VALUE
-      RETURN
-*
-*     End of DLANSY
-*
-      END
--- a/libcruft/lapack/dlantr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,276 +0,0 @@
-      DOUBLE PRECISION FUNCTION DLANTR( NORM, UPLO, DIAG, M, N, A, LDA,
-     $                 WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, NORM, UPLO
-      INTEGER            LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLANTR  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  trapezoidal or triangular matrix A.
-*
-*  Description
-*  ===========
-*
-*  DLANTR returns the value
-*
-*     DLANTR = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in DLANTR as described
-*          above.
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the matrix A is upper or lower trapezoidal.
-*          = 'U':  Upper trapezoidal
-*          = 'L':  Lower trapezoidal
-*          Note that A is triangular instead of trapezoidal if M = N.
-*
-*  DIAG    (input) CHARACTER*1
-*          Specifies whether or not the matrix A has unit diagonal.
-*          = 'N':  Non-unit diagonal
-*          = 'U':  Unit diagonal
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0, and if
-*          UPLO = 'U', M <= N.  When M = 0, DLANTR is set to zero.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0, and if
-*          UPLO = 'L', N <= M.  When N = 0, DLANTR is set to zero.
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA,N)
-*          The trapezoidal matrix A (A is triangular if M = N).
-*          If UPLO = 'U', the leading m by n upper trapezoidal part of
-*          the array A contains the upper trapezoidal matrix, and the
-*          strictly lower triangular part of A is not referenced.
-*          If UPLO = 'L', the leading m by n lower trapezoidal part of
-*          the array A contains the lower trapezoidal matrix, and the
-*          strictly upper triangular part of A is not referenced.  Note
-*          that when DIAG = 'U', the diagonal elements of A are not
-*          referenced and are assumed to be one.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(M,1).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)),
-*          where LWORK >= M when NORM = 'I'; otherwise, WORK is not
-*          referenced.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UDIAG
-      INTEGER            I, J
-      DOUBLE PRECISION   SCALE, SUM, VALUE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLASSQ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( MIN( M, N ).EQ.0 ) THEN
-         VALUE = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         IF( LSAME( DIAG, 'U' ) ) THEN
-            VALUE = ONE
-            IF( LSAME( UPLO, 'U' ) ) THEN
-               DO 20 J = 1, N
-                  DO 10 I = 1, MIN( M, J-1 )
-                     VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   10             CONTINUE
-   20          CONTINUE
-            ELSE
-               DO 40 J = 1, N
-                  DO 30 I = J + 1, M
-                     VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   30             CONTINUE
-   40          CONTINUE
-            END IF
-         ELSE
-            VALUE = ZERO
-            IF( LSAME( UPLO, 'U' ) ) THEN
-               DO 60 J = 1, N
-                  DO 50 I = 1, MIN( M, J )
-                     VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   50             CONTINUE
-   60          CONTINUE
-            ELSE
-               DO 80 J = 1, N
-                  DO 70 I = J, M
-                     VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   70             CONTINUE
-   80          CONTINUE
-            END IF
-         END IF
-      ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN
-*
-*        Find norm1(A).
-*
-         VALUE = ZERO
-         UDIAG = LSAME( DIAG, 'U' )
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            DO 110 J = 1, N
-               IF( ( UDIAG ) .AND. ( J.LE.M ) ) THEN
-                  SUM = ONE
-                  DO 90 I = 1, J - 1
-                     SUM = SUM + ABS( A( I, J ) )
-   90             CONTINUE
-               ELSE
-                  SUM = ZERO
-                  DO 100 I = 1, MIN( M, J )
-                     SUM = SUM + ABS( A( I, J ) )
-  100             CONTINUE
-               END IF
-               VALUE = MAX( VALUE, SUM )
-  110       CONTINUE
-         ELSE
-            DO 140 J = 1, N
-               IF( UDIAG ) THEN
-                  SUM = ONE
-                  DO 120 I = J + 1, M
-                     SUM = SUM + ABS( A( I, J ) )
-  120             CONTINUE
-               ELSE
-                  SUM = ZERO
-                  DO 130 I = J, M
-                     SUM = SUM + ABS( A( I, J ) )
-  130             CONTINUE
-               END IF
-               VALUE = MAX( VALUE, SUM )
-  140       CONTINUE
-         END IF
-      ELSE IF( LSAME( NORM, 'I' ) ) THEN
-*
-*        Find normI(A).
-*
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            IF( LSAME( DIAG, 'U' ) ) THEN
-               DO 150 I = 1, M
-                  WORK( I ) = ONE
-  150          CONTINUE
-               DO 170 J = 1, N
-                  DO 160 I = 1, MIN( M, J-1 )
-                     WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-  160             CONTINUE
-  170          CONTINUE
-            ELSE
-               DO 180 I = 1, M
-                  WORK( I ) = ZERO
-  180          CONTINUE
-               DO 200 J = 1, N
-                  DO 190 I = 1, MIN( M, J )
-                     WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-  190             CONTINUE
-  200          CONTINUE
-            END IF
-         ELSE
-            IF( LSAME( DIAG, 'U' ) ) THEN
-               DO 210 I = 1, N
-                  WORK( I ) = ONE
-  210          CONTINUE
-               DO 220 I = N + 1, M
-                  WORK( I ) = ZERO
-  220          CONTINUE
-               DO 240 J = 1, N
-                  DO 230 I = J + 1, M
-                     WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-  230             CONTINUE
-  240          CONTINUE
-            ELSE
-               DO 250 I = 1, M
-                  WORK( I ) = ZERO
-  250          CONTINUE
-               DO 270 J = 1, N
-                  DO 260 I = J, M
-                     WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-  260             CONTINUE
-  270          CONTINUE
-            END IF
-         END IF
-         VALUE = ZERO
-         DO 280 I = 1, M
-            VALUE = MAX( VALUE, WORK( I ) )
-  280    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            IF( LSAME( DIAG, 'U' ) ) THEN
-               SCALE = ONE
-               SUM = MIN( M, N )
-               DO 290 J = 2, N
-                  CALL DLASSQ( MIN( M, J-1 ), A( 1, J ), 1, SCALE, SUM )
-  290          CONTINUE
-            ELSE
-               SCALE = ZERO
-               SUM = ONE
-               DO 300 J = 1, N
-                  CALL DLASSQ( MIN( M, J ), A( 1, J ), 1, SCALE, SUM )
-  300          CONTINUE
-            END IF
-         ELSE
-            IF( LSAME( DIAG, 'U' ) ) THEN
-               SCALE = ONE
-               SUM = MIN( M, N )
-               DO 310 J = 1, N
-                  CALL DLASSQ( M-J, A( MIN( M, J+1 ), J ), 1, SCALE,
-     $                         SUM )
-  310          CONTINUE
-            ELSE
-               SCALE = ZERO
-               SUM = ONE
-               DO 320 J = 1, N
-                  CALL DLASSQ( M-J+1, A( J, J ), 1, SCALE, SUM )
-  320          CONTINUE
-            END IF
-         END IF
-         VALUE = SCALE*SQRT( SUM )
-      END IF
-*
-      DLANTR = VALUE
-      RETURN
-*
-*     End of DLANTR
-*
-      END
--- a/libcruft/lapack/dlanv2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,205 +0,0 @@
-      SUBROUTINE DLANV2( A, B, C, D, RT1R, RT1I, RT2R, RT2I, CS, SN )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   A, B, C, CS, D, RT1I, RT1R, RT2I, RT2R, SN
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLANV2 computes the Schur factorization of a real 2-by-2 nonsymmetric
-*  matrix in standard form:
-*
-*       [ A  B ] = [ CS -SN ] [ AA  BB ] [ CS  SN ]
-*       [ C  D ]   [ SN  CS ] [ CC  DD ] [-SN  CS ]
-*
-*  where either
-*  1) CC = 0 so that AA and DD are real eigenvalues of the matrix, or
-*  2) AA = DD and BB*CC < 0, so that AA + or - sqrt(BB*CC) are complex
-*  conjugate eigenvalues.
-*
-*  Arguments
-*  =========
-*
-*  A       (input/output) DOUBLE PRECISION
-*  B       (input/output) DOUBLE PRECISION
-*  C       (input/output) DOUBLE PRECISION
-*  D       (input/output) DOUBLE PRECISION
-*          On entry, the elements of the input matrix.
-*          On exit, they are overwritten by the elements of the
-*          standardised Schur form.
-*
-*  RT1R    (output) DOUBLE PRECISION
-*  RT1I    (output) DOUBLE PRECISION
-*  RT2R    (output) DOUBLE PRECISION
-*  RT2I    (output) DOUBLE PRECISION
-*          The real and imaginary parts of the eigenvalues. If the
-*          eigenvalues are a complex conjugate pair, RT1I > 0.
-*
-*  CS      (output) DOUBLE PRECISION
-*  SN      (output) DOUBLE PRECISION
-*          Parameters of the rotation matrix.
-*
-*  Further Details
-*  ===============
-*
-*  Modified by V. Sima, Research Institute for Informatics, Bucharest,
-*  Romania, to reduce the risk of cancellation errors,
-*  when computing real eigenvalues, and to ensure, if possible, that
-*  abs(RT1R) >= abs(RT2R).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, HALF, ONE
-      PARAMETER          ( ZERO = 0.0D+0, HALF = 0.5D+0, ONE = 1.0D+0 )
-      DOUBLE PRECISION   MULTPL
-      PARAMETER          ( MULTPL = 4.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   AA, BB, BCMAX, BCMIS, CC, CS1, DD, EPS, P, SAB,
-     $                   SAC, SCALE, SIGMA, SN1, TAU, TEMP, Z
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH, DLAPY2
-      EXTERNAL           DLAMCH, DLAPY2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      EPS = DLAMCH( 'P' )
-      IF( C.EQ.ZERO ) THEN
-         CS = ONE
-         SN = ZERO
-         GO TO 10
-*
-      ELSE IF( B.EQ.ZERO ) THEN
-*
-*        Swap rows and columns
-*
-         CS = ZERO
-         SN = ONE
-         TEMP = D
-         D = A
-         A = TEMP
-         B = -C
-         C = ZERO
-         GO TO 10
-      ELSE IF( ( A-D ).EQ.ZERO .AND. SIGN( ONE, B ).NE.SIGN( ONE, C ) )
-     $          THEN
-         CS = ONE
-         SN = ZERO
-         GO TO 10
-      ELSE
-*
-         TEMP = A - D
-         P = HALF*TEMP
-         BCMAX = MAX( ABS( B ), ABS( C ) )
-         BCMIS = MIN( ABS( B ), ABS( C ) )*SIGN( ONE, B )*SIGN( ONE, C )
-         SCALE = MAX( ABS( P ), BCMAX )
-         Z = ( P / SCALE )*P + ( BCMAX / SCALE )*BCMIS
-*
-*        If Z is of the order of the machine accuracy, postpone the
-*        decision on the nature of eigenvalues
-*
-         IF( Z.GE.MULTPL*EPS ) THEN
-*
-*           Real eigenvalues. Compute A and D.
-*
-            Z = P + SIGN( SQRT( SCALE )*SQRT( Z ), P )
-            A = D + Z
-            D = D - ( BCMAX / Z )*BCMIS
-*
-*           Compute B and the rotation matrix
-*
-            TAU = DLAPY2( C, Z )
-            CS = Z / TAU
-            SN = C / TAU
-            B = B - C
-            C = ZERO
-         ELSE
-*
-*           Complex eigenvalues, or real (almost) equal eigenvalues.
-*           Make diagonal elements equal.
-*
-            SIGMA = B + C
-            TAU = DLAPY2( SIGMA, TEMP )
-            CS = SQRT( HALF*( ONE+ABS( SIGMA ) / TAU ) )
-            SN = -( P / ( TAU*CS ) )*SIGN( ONE, SIGMA )
-*
-*           Compute [ AA  BB ] = [ A  B ] [ CS -SN ]
-*                   [ CC  DD ]   [ C  D ] [ SN  CS ]
-*
-            AA = A*CS + B*SN
-            BB = -A*SN + B*CS
-            CC = C*CS + D*SN
-            DD = -C*SN + D*CS
-*
-*           Compute [ A  B ] = [ CS  SN ] [ AA  BB ]
-*                   [ C  D ]   [-SN  CS ] [ CC  DD ]
-*
-            A = AA*CS + CC*SN
-            B = BB*CS + DD*SN
-            C = -AA*SN + CC*CS
-            D = -BB*SN + DD*CS
-*
-            TEMP = HALF*( A+D )
-            A = TEMP
-            D = TEMP
-*
-            IF( C.NE.ZERO ) THEN
-               IF( B.NE.ZERO ) THEN
-                  IF( SIGN( ONE, B ).EQ.SIGN( ONE, C ) ) THEN
-*
-*                    Real eigenvalues: reduce to upper triangular form
-*
-                     SAB = SQRT( ABS( B ) )
-                     SAC = SQRT( ABS( C ) )
-                     P = SIGN( SAB*SAC, C )
-                     TAU = ONE / SQRT( ABS( B+C ) )
-                     A = TEMP + P
-                     D = TEMP - P
-                     B = B - C
-                     C = ZERO
-                     CS1 = SAB*TAU
-                     SN1 = SAC*TAU
-                     TEMP = CS*CS1 - SN*SN1
-                     SN = CS*SN1 + SN*CS1
-                     CS = TEMP
-                  END IF
-               ELSE
-                  B = -C
-                  C = ZERO
-                  TEMP = CS
-                  CS = -SN
-                  SN = TEMP
-               END IF
-            END IF
-         END IF
-*
-      END IF
-*
-   10 CONTINUE
-*
-*     Store eigenvalues in (RT1R,RT1I) and (RT2R,RT2I).
-*
-      RT1R = A
-      RT2R = D
-      IF( C.EQ.ZERO ) THEN
-         RT1I = ZERO
-         RT2I = ZERO
-      ELSE
-         RT1I = SQRT( ABS( B ) )*SQRT( ABS( C ) )
-         RT2I = -RT1I
-      END IF
-      RETURN
-*
-*     End of DLANV2
-*
-      END
--- a/libcruft/lapack/dlapy2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-      DOUBLE PRECISION FUNCTION DLAPY2( X, Y )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   X, Y
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAPY2 returns sqrt(x**2+y**2), taking care not to cause unnecessary
-*  overflow.
-*
-*  Arguments
-*  =========
-*
-*  X       (input) DOUBLE PRECISION
-*  Y       (input) DOUBLE PRECISION
-*          X and Y specify the values x and y.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D0 )
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D0 )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   W, XABS, YABS, Z
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      XABS = ABS( X )
-      YABS = ABS( Y )
-      W = MAX( XABS, YABS )
-      Z = MIN( XABS, YABS )
-      IF( Z.EQ.ZERO ) THEN
-         DLAPY2 = W
-      ELSE
-         DLAPY2 = W*SQRT( ONE+( Z / W )**2 )
-      END IF
-      RETURN
-*
-*     End of DLAPY2
-*
-      END
--- a/libcruft/lapack/dlapy3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-      DOUBLE PRECISION FUNCTION DLAPY3( X, Y, Z )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   X, Y, Z
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAPY3 returns sqrt(x**2+y**2+z**2), taking care not to cause
-*  unnecessary overflow.
-*
-*  Arguments
-*  =========
-*
-*  X       (input) DOUBLE PRECISION
-*  Y       (input) DOUBLE PRECISION
-*  Z       (input) DOUBLE PRECISION
-*          X, Y and Z specify the values x, y and z.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D0 )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   W, XABS, YABS, ZABS
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      XABS = ABS( X )
-      YABS = ABS( Y )
-      ZABS = ABS( Z )
-      W = MAX( XABS, YABS, ZABS )
-      IF( W.EQ.ZERO ) THEN
-*     W can be zero for max(0,nan,0)
-*     adding all three entries together will make sure
-*     NaN will not disappear.
-         DLAPY3 =  XABS + YABS + ZABS
-      ELSE
-         DLAPY3 = W*SQRT( ( XABS / W )**2+( YABS / W )**2+
-     $            ( ZABS / W )**2 )
-      END IF
-      RETURN
-*
-*     End of DLAPY3
-*
-      END
--- a/libcruft/lapack/dlaqp2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,175 +0,0 @@
-      SUBROUTINE DLAQP2( M, N, OFFSET, A, LDA, JPVT, TAU, VN1, VN2,
-     $                   WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            LDA, M, N, OFFSET
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), VN1( * ), VN2( * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAQP2 computes a QR factorization with column pivoting of
-*  the block A(OFFSET+1:M,1:N).
-*  The block A(1:OFFSET,1:N) is accordingly pivoted, but not factorized.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0.
-*
-*  OFFSET  (input) INTEGER
-*          The number of rows of the matrix A that must be pivoted
-*          but no factorized. OFFSET >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the upper triangle of block A(OFFSET+1:M,1:N) is 
-*          the triangular factor obtained; the elements in block
-*          A(OFFSET+1:M,1:N) below the diagonal, together with the
-*          array TAU, represent the orthogonal matrix Q as a product of
-*          elementary reflectors. Block A(1:OFFSET,1:N) has been
-*          accordingly pivoted, but no factorized.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          On entry, if JPVT(i) .ne. 0, the i-th column of A is permuted
-*          to the front of A*P (a leading column); if JPVT(i) = 0,
-*          the i-th column of A is a free column.
-*          On exit, if JPVT(i) = k, then the i-th column of A*P
-*          was the k-th column of A.
-*
-*  TAU     (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors.
-*
-*  VN1     (input/output) DOUBLE PRECISION array, dimension (N)
-*          The vector with the partial column norms.
-*
-*  VN2     (input/output) DOUBLE PRECISION array, dimension (N)
-*          The vector with the exact column norms.
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (N)
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*    X. Sun, Computer Science Dept., Duke University, USA
-*
-*  Partial column norm updating strategy modified by
-*    Z. Drmac and Z. Bujanovic, Dept. of Mathematics,
-*    University of Zagreb, Croatia.
-*    June 2006.
-*  For more details see LAPACK Working Note 176.
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ITEMP, J, MN, OFFPI, PVT
-      DOUBLE PRECISION   AII, TEMP, TEMP2, TOL3Z
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARF, DLARFG, DSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. External Functions ..
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DLAMCH, DNRM2
-      EXTERNAL           IDAMAX, DLAMCH, DNRM2
-*     ..
-*     .. Executable Statements ..
-*
-      MN = MIN( M-OFFSET, N )
-      TOL3Z = SQRT(DLAMCH('Epsilon'))
-*
-*     Compute factorization.
-*
-      DO 20 I = 1, MN
-*
-         OFFPI = OFFSET + I
-*
-*        Determine ith pivot column and swap if necessary.
-*
-         PVT = ( I-1 ) + IDAMAX( N-I+1, VN1( I ), 1 )
-*
-         IF( PVT.NE.I ) THEN
-            CALL DSWAP( M, A( 1, PVT ), 1, A( 1, I ), 1 )
-            ITEMP = JPVT( PVT )
-            JPVT( PVT ) = JPVT( I )
-            JPVT( I ) = ITEMP
-            VN1( PVT ) = VN1( I )
-            VN2( PVT ) = VN2( I )
-         END IF
-*
-*        Generate elementary reflector H(i).
-*
-         IF( OFFPI.LT.M ) THEN
-            CALL DLARFG( M-OFFPI+1, A( OFFPI, I ), A( OFFPI+1, I ), 1,
-     $                   TAU( I ) )
-         ELSE
-            CALL DLARFG( 1, A( M, I ), A( M, I ), 1, TAU( I ) )
-         END IF
-*
-         IF( I.LT.N ) THEN
-*
-*           Apply H(i)' to A(offset+i:m,i+1:n) from the left.
-*
-            AII = A( OFFPI, I )
-            A( OFFPI, I ) = ONE
-            CALL DLARF( 'Left', M-OFFPI+1, N-I, A( OFFPI, I ), 1,
-     $                  TAU( I ), A( OFFPI, I+1 ), LDA, WORK( 1 ) )
-            A( OFFPI, I ) = AII
-         END IF
-*
-*        Update partial column norms.
-*
-         DO 10 J = I + 1, N
-            IF( VN1( J ).NE.ZERO ) THEN
-*
-*              NOTE: The following 4 lines follow from the analysis in
-*              Lapack Working Note 176.
-*
-               TEMP = ONE - ( ABS( A( OFFPI, J ) ) / VN1( J ) )**2
-               TEMP = MAX( TEMP, ZERO )
-               TEMP2 = TEMP*( VN1( J ) / VN2( J ) )**2
-               IF( TEMP2 .LE. TOL3Z ) THEN
-                  IF( OFFPI.LT.M ) THEN
-                     VN1( J ) = DNRM2( M-OFFPI, A( OFFPI+1, J ), 1 )
-                     VN2( J ) = VN1( J )
-                  ELSE
-                     VN1( J ) = ZERO
-                     VN2( J ) = ZERO
-                  END IF
-               ELSE
-                  VN1( J ) = VN1( J )*SQRT( TEMP )
-               END IF
-            END IF
-   10    CONTINUE
-*
-   20 CONTINUE
-*
-      RETURN
-*
-*     End of DLAQP2
-*
-      END
--- a/libcruft/lapack/dlaqps.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,259 +0,0 @@
-      SUBROUTINE DLAQPS( M, N, OFFSET, NB, KB, A, LDA, JPVT, TAU, VN1,
-     $                   VN2, AUXV, F, LDF )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            KB, LDA, LDF, M, N, NB, OFFSET
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      DOUBLE PRECISION   A( LDA, * ), AUXV( * ), F( LDF, * ), TAU( * ),
-     $                   VN1( * ), VN2( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAQPS computes a step of QR factorization with column pivoting
-*  of a real M-by-N matrix A by using Blas-3.  It tries to factorize
-*  NB columns from A starting from the row OFFSET+1, and updates all
-*  of the matrix with Blas-3 xGEMM.
-*
-*  In some cases, due to catastrophic cancellations, it cannot
-*  factorize NB columns.  Hence, the actual number of factorized
-*  columns is returned in KB.
-*
-*  Block A(1:OFFSET,1:N) is accordingly pivoted, but not factorized.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0
-*
-*  OFFSET  (input) INTEGER
-*          The number of rows of A that have been factorized in
-*          previous steps.
-*
-*  NB      (input) INTEGER
-*          The number of columns to factorize.
-*
-*  KB      (output) INTEGER
-*          The number of columns actually factorized.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, block A(OFFSET+1:M,1:KB) is the triangular
-*          factor obtained and block A(1:OFFSET,1:N) has been
-*          accordingly pivoted, but no factorized.
-*          The rest of the matrix, block A(OFFSET+1:M,KB+1:N) has
-*          been updated.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          JPVT(I) = K <==> Column K of the full matrix A has been
-*          permuted into position I in AP.
-*
-*  TAU     (output) DOUBLE PRECISION array, dimension (KB)
-*          The scalar factors of the elementary reflectors.
-*
-*  VN1     (input/output) DOUBLE PRECISION array, dimension (N)
-*          The vector with the partial column norms.
-*
-*  VN2     (input/output) DOUBLE PRECISION array, dimension (N)
-*          The vector with the exact column norms.
-*
-*  AUXV    (input/output) DOUBLE PRECISION array, dimension (NB)
-*          Auxiliar vector.
-*
-*  F       (input/output) DOUBLE PRECISION array, dimension (LDF,NB)
-*          Matrix F' = L*Y'*A.
-*
-*  LDF     (input) INTEGER
-*          The leading dimension of the array F. LDF >= max(1,N).
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*    X. Sun, Computer Science Dept., Duke University, USA
-*
-*  Partial column norm updating strategy modified by
-*    Z. Drmac and Z. Bujanovic, Dept. of Mathematics,
-*    University of Zagreb, Croatia.
-*    June 2006.
-*  For more details see LAPACK Working Note 176.
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            ITEMP, J, K, LASTRK, LSTICC, PVT, RK
-      DOUBLE PRECISION   AKK, TEMP, TEMP2, TOL3Z
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMM, DGEMV, DLARFG, DSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, MAX, MIN, NINT, SQRT
-*     ..
-*     .. External Functions ..
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DLAMCH, DNRM2
-      EXTERNAL           IDAMAX, DLAMCH, DNRM2
-*     ..
-*     .. Executable Statements ..
-*
-      LASTRK = MIN( M, N+OFFSET )
-      LSTICC = 0
-      K = 0
-      TOL3Z = SQRT(DLAMCH('Epsilon'))
-*
-*     Beginning of while loop.
-*
-   10 CONTINUE
-      IF( ( K.LT.NB ) .AND. ( LSTICC.EQ.0 ) ) THEN
-         K = K + 1
-         RK = OFFSET + K
-*
-*        Determine ith pivot column and swap if necessary
-*
-         PVT = ( K-1 ) + IDAMAX( N-K+1, VN1( K ), 1 )
-         IF( PVT.NE.K ) THEN
-            CALL DSWAP( M, A( 1, PVT ), 1, A( 1, K ), 1 )
-            CALL DSWAP( K-1, F( PVT, 1 ), LDF, F( K, 1 ), LDF )
-            ITEMP = JPVT( PVT )
-            JPVT( PVT ) = JPVT( K )
-            JPVT( K ) = ITEMP
-            VN1( PVT ) = VN1( K )
-            VN2( PVT ) = VN2( K )
-         END IF
-*
-*        Apply previous Householder reflectors to column K:
-*        A(RK:M,K) := A(RK:M,K) - A(RK:M,1:K-1)*F(K,1:K-1)'.
-*
-         IF( K.GT.1 ) THEN
-            CALL DGEMV( 'No transpose', M-RK+1, K-1, -ONE, A( RK, 1 ),
-     $                  LDA, F( K, 1 ), LDF, ONE, A( RK, K ), 1 )
-         END IF
-*
-*        Generate elementary reflector H(k).
-*
-         IF( RK.LT.M ) THEN
-            CALL DLARFG( M-RK+1, A( RK, K ), A( RK+1, K ), 1, TAU( K ) )
-         ELSE
-            CALL DLARFG( 1, A( RK, K ), A( RK, K ), 1, TAU( K ) )
-         END IF
-*
-         AKK = A( RK, K )
-         A( RK, K ) = ONE
-*
-*        Compute Kth column of F:
-*
-*        Compute  F(K+1:N,K) := tau(K)*A(RK:M,K+1:N)'*A(RK:M,K).
-*
-         IF( K.LT.N ) THEN
-            CALL DGEMV( 'Transpose', M-RK+1, N-K, TAU( K ),
-     $                  A( RK, K+1 ), LDA, A( RK, K ), 1, ZERO,
-     $                  F( K+1, K ), 1 )
-         END IF
-*
-*        Padding F(1:K,K) with zeros.
-*
-         DO 20 J = 1, K
-            F( J, K ) = ZERO
-   20    CONTINUE
-*
-*        Incremental updating of F:
-*        F(1:N,K) := F(1:N,K) - tau(K)*F(1:N,1:K-1)*A(RK:M,1:K-1)'
-*                    *A(RK:M,K).
-*
-         IF( K.GT.1 ) THEN
-            CALL DGEMV( 'Transpose', M-RK+1, K-1, -TAU( K ), A( RK, 1 ),
-     $                  LDA, A( RK, K ), 1, ZERO, AUXV( 1 ), 1 )
-*
-            CALL DGEMV( 'No transpose', N, K-1, ONE, F( 1, 1 ), LDF,
-     $                  AUXV( 1 ), 1, ONE, F( 1, K ), 1 )
-         END IF
-*
-*        Update the current row of A:
-*        A(RK,K+1:N) := A(RK,K+1:N) - A(RK,1:K)*F(K+1:N,1:K)'.
-*
-         IF( K.LT.N ) THEN
-            CALL DGEMV( 'No transpose', N-K, K, -ONE, F( K+1, 1 ), LDF,
-     $                  A( RK, 1 ), LDA, ONE, A( RK, K+1 ), LDA )
-         END IF
-*
-*        Update partial column norms.
-*
-         IF( RK.LT.LASTRK ) THEN
-            DO 30 J = K + 1, N
-               IF( VN1( J ).NE.ZERO ) THEN
-*
-*                 NOTE: The following 4 lines follow from the analysis in
-*                 Lapack Working Note 176.
-*
-                  TEMP = ABS( A( RK, J ) ) / VN1( J )
-                  TEMP = MAX( ZERO, ( ONE+TEMP )*( ONE-TEMP ) )
-                  TEMP2 = TEMP*( VN1( J ) / VN2( J ) )**2
-                  IF( TEMP2 .LE. TOL3Z ) THEN
-                     VN2( J ) = DBLE( LSTICC )
-                     LSTICC = J
-                  ELSE
-                     VN1( J ) = VN1( J )*SQRT( TEMP )
-                  END IF
-               END IF
-   30       CONTINUE
-         END IF
-*
-         A( RK, K ) = AKK
-*
-*        End of while loop.
-*
-         GO TO 10
-      END IF
-      KB = K
-      RK = OFFSET + KB
-*
-*     Apply the block reflector to the rest of the matrix:
-*     A(OFFSET+KB+1:M,KB+1:N) := A(OFFSET+KB+1:M,KB+1:N) -
-*                         A(OFFSET+KB+1:M,1:KB)*F(KB+1:N,1:KB)'.
-*
-      IF( KB.LT.MIN( N, M-OFFSET ) ) THEN
-         CALL DGEMM( 'No transpose', 'Transpose', M-RK, N-KB, KB, -ONE,
-     $               A( RK+1, 1 ), LDA, F( KB+1, 1 ), LDF, ONE,
-     $               A( RK+1, KB+1 ), LDA )
-      END IF
-*
-*     Recomputation of difficult columns.
-*
-   40 CONTINUE
-      IF( LSTICC.GT.0 ) THEN
-         ITEMP = NINT( VN2( LSTICC ) )
-         VN1( LSTICC ) = DNRM2( M-RK, A( RK+1, LSTICC ), 1 )
-*
-*        NOTE: The computation of VN1( LSTICC ) relies on the fact that 
-*        SNRM2 does not fail on vectors with norm below the value of
-*        SQRT(DLAMCH('S')) 
-*
-         VN2( LSTICC ) = VN1( LSTICC )
-         LSTICC = ITEMP
-         GO TO 40
-      END IF
-*
-      RETURN
-*
-*     End of DLAQPS
-*
-      END
--- a/libcruft/lapack/dlaqr0.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,642 +0,0 @@
-      SUBROUTINE DLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI,
-     $                   ILOZ, IHIZ, Z, LDZ, WORK, LWORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, LWORK, N
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   H( LDH, * ), WI( * ), WORK( * ), WR( * ),
-     $                   Z( LDZ, * )
-*     ..
-*
-*     Purpose
-*     =======
-*
-*     DLAQR0 computes the eigenvalues of a Hessenberg matrix H
-*     and, optionally, the matrices T and Z from the Schur decomposition
-*     H = Z T Z**T, where T is an upper quasi-triangular matrix (the
-*     Schur form), and Z is the orthogonal matrix of Schur vectors.
-*
-*     Optionally Z may be postmultiplied into an input orthogonal
-*     matrix Q so that this routine can give the Schur factorization
-*     of a matrix A which has been reduced to the Hessenberg form H
-*     by the orthogonal matrix Q:  A = Q*H*Q**T = (QZ)*T*(QZ)**T.
-*
-*     Arguments
-*     =========
-*
-*     WANTT   (input) LOGICAL
-*          = .TRUE. : the full Schur form T is required;
-*          = .FALSE.: only eigenvalues are required.
-*
-*     WANTZ   (input) LOGICAL
-*          = .TRUE. : the matrix of Schur vectors Z is required;
-*          = .FALSE.: Schur vectors are not required.
-*
-*     N     (input) INTEGER
-*           The order of the matrix H.  N .GE. 0.
-*
-*     ILO   (input) INTEGER
-*     IHI   (input) INTEGER
-*           It is assumed that H is already upper triangular in rows
-*           and columns 1:ILO-1 and IHI+1:N and, if ILO.GT.1,
-*           H(ILO,ILO-1) is zero. ILO and IHI are normally set by a
-*           previous call to DGEBAL, and then passed to DGEHRD when the
-*           matrix output by DGEBAL is reduced to Hessenberg form.
-*           Otherwise, ILO and IHI should be set to 1 and N,
-*           respectively.  If N.GT.0, then 1.LE.ILO.LE.IHI.LE.N.
-*           If N = 0, then ILO = 1 and IHI = 0.
-*
-*     H     (input/output) DOUBLE PRECISION array, dimension (LDH,N)
-*           On entry, the upper Hessenberg matrix H.
-*           On exit, if INFO = 0 and WANTT is .TRUE., then H contains
-*           the upper quasi-triangular matrix T from the Schur
-*           decomposition (the Schur form); 2-by-2 diagonal blocks
-*           (corresponding to complex conjugate pairs of eigenvalues)
-*           are returned in standard form, with H(i,i) = H(i+1,i+1)
-*           and H(i+1,i)*H(i,i+1).LT.0. If INFO = 0 and WANTT is
-*           .FALSE., then the contents of H are unspecified on exit.
-*           (The output value of H when INFO.GT.0 is given under the
-*           description of INFO below.)
-*
-*           This subroutine may explicitly set H(i,j) = 0 for i.GT.j and
-*           j = 1, 2, ... ILO-1 or j = IHI+1, IHI+2, ... N.
-*
-*     LDH   (input) INTEGER
-*           The leading dimension of the array H. LDH .GE. max(1,N).
-*
-*     WR    (output) DOUBLE PRECISION array, dimension (IHI)
-*     WI    (output) DOUBLE PRECISION array, dimension (IHI)
-*           The real and imaginary parts, respectively, of the computed
-*           eigenvalues of H(ILO:IHI,ILO:IHI) are stored WR(ILO:IHI)
-*           and WI(ILO:IHI). If two eigenvalues are computed as a
-*           complex conjugate pair, they are stored in consecutive
-*           elements of WR and WI, say the i-th and (i+1)th, with
-*           WI(i) .GT. 0 and WI(i+1) .LT. 0. If WANTT is .TRUE., then
-*           the eigenvalues are stored in the same order as on the
-*           diagonal of the Schur form returned in H, with
-*           WR(i) = H(i,i) and, if H(i:i+1,i:i+1) is a 2-by-2 diagonal
-*           block, WI(i) = sqrt(-H(i+1,i)*H(i,i+1)) and
-*           WI(i+1) = -WI(i).
-*
-*     ILOZ     (input) INTEGER
-*     IHIZ     (input) INTEGER
-*           Specify the rows of Z to which transformations must be
-*           applied if WANTZ is .TRUE..
-*           1 .LE. ILOZ .LE. ILO; IHI .LE. IHIZ .LE. N.
-*
-*     Z     (input/output) DOUBLE PRECISION array, dimension (LDZ,IHI)
-*           If WANTZ is .FALSE., then Z is not referenced.
-*           If WANTZ is .TRUE., then Z(ILO:IHI,ILOZ:IHIZ) is
-*           replaced by Z(ILO:IHI,ILOZ:IHIZ)*U where U is the
-*           orthogonal Schur factor of H(ILO:IHI,ILO:IHI).
-*           (The output value of Z when INFO.GT.0 is given under
-*           the description of INFO below.)
-*
-*     LDZ   (input) INTEGER
-*           The leading dimension of the array Z.  if WANTZ is .TRUE.
-*           then LDZ.GE.MAX(1,IHIZ).  Otherwize, LDZ.GE.1.
-*
-*     WORK  (workspace/output) DOUBLE PRECISION array, dimension LWORK
-*           On exit, if LWORK = -1, WORK(1) returns an estimate of
-*           the optimal value for LWORK.
-*
-*     LWORK (input) INTEGER
-*           The dimension of the array WORK.  LWORK .GE. max(1,N)
-*           is sufficient, but LWORK typically as large as 6*N may
-*           be required for optimal performance.  A workspace query
-*           to determine the optimal workspace size is recommended.
-*
-*           If LWORK = -1, then DLAQR0 does a workspace query.
-*           In this case, DLAQR0 checks the input parameters and
-*           estimates the optimal workspace size for the given
-*           values of N, ILO and IHI.  The estimate is returned
-*           in WORK(1).  No error message related to LWORK is
-*           issued by XERBLA.  Neither H nor Z are accessed.
-*
-*
-*     INFO  (output) INTEGER
-*             =  0:  successful exit
-*           .GT. 0:  if INFO = i, DLAQR0 failed to compute all of
-*                the eigenvalues.  Elements 1:ilo-1 and i+1:n of WR
-*                and WI contain those eigenvalues which have been
-*                successfully computed.  (Failures are rare.)
-*
-*                If INFO .GT. 0 and WANT is .FALSE., then on exit,
-*                the remaining unconverged eigenvalues are the eigen-
-*                values of the upper Hessenberg matrix rows and
-*                columns ILO through INFO of the final, output
-*                value of H.
-*
-*                If INFO .GT. 0 and WANTT is .TRUE., then on exit
-*
-*           (*)  (initial value of H)*U  = U*(final value of H)
-*
-*                where U is an orthogonal matrix.  The final
-*                value of H is upper Hessenberg and quasi-triangular
-*                in rows and columns INFO+1 through IHI.
-*
-*                If INFO .GT. 0 and WANTZ is .TRUE., then on exit
-*
-*                  (final value of Z(ILO:IHI,ILOZ:IHIZ)
-*                   =  (initial value of Z(ILO:IHI,ILOZ:IHIZ)*U
-*
-*                where U is the orthogonal matrix in (*) (regard-
-*                less of the value of WANTT.)
-*
-*                If INFO .GT. 0 and WANTZ is .FALSE., then Z is not
-*                accessed.
-*
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ================================================================
-*
-*     References:
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
-*       Performance, SIAM Journal of Matrix Analysis, volume 23, pages
-*       929--947, 2002.
-*
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part II: Aggressive Early Deflation, SIAM Journal
-*       of Matrix Analysis, volume 23, pages 948--973, 2002.
-*
-*     ================================================================
-*     .. Parameters ..
-*
-*     ==== Matrices of order NTINY or smaller must be processed by
-*     .    DLAHQR because of insufficient subdiagonal scratch space.
-*     .    (This is a hard limit.) ====
-*
-*     ==== Exceptional deflation windows:  try to cure rare
-*     .    slow convergence by increasing the size of the
-*     .    deflation window after KEXNW iterations. =====
-*
-*     ==== Exceptional shifts: try to cure rare slow convergence
-*     .    with ad-hoc exceptional shifts every KEXSH iterations.
-*     .    The constants WILK1 and WILK2 are used to form the
-*     .    exceptional shifts. ====
-*
-      INTEGER            NTINY
-      PARAMETER          ( NTINY = 11 )
-      INTEGER            KEXNW, KEXSH
-      PARAMETER          ( KEXNW = 5, KEXSH = 6 )
-      DOUBLE PRECISION   WILK1, WILK2
-      PARAMETER          ( WILK1 = 0.75d0, WILK2 = -0.4375d0 )
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0d0, ONE = 1.0d0 )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   AA, BB, CC, CS, DD, SN, SS, SWAP
-      INTEGER            I, INF, IT, ITMAX, K, KACC22, KBOT, KDU, KS,
-     $                   KT, KTOP, KU, KV, KWH, KWTOP, KWV, LD, LS,
-     $                   LWKOPT, NDFL, NH, NHO, NIBBLE, NMIN, NS, NSMAX,
-     $                   NSR, NVE, NW, NWMAX, NWR
-      LOGICAL            NWINC, SORTED
-      CHARACTER          JBCMPZ*2
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   ZDUM( 1, 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLACPY, DLAHQR, DLANV2, DLAQR3, DLAQR4, DLAQR5
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, INT, MAX, MIN, MOD
-*     ..
-*     .. Executable Statements ..
-      INFO = 0
-*
-*     ==== Quick return for N = 0: nothing to do. ====
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = ONE
-         RETURN
-      END IF
-*
-*     ==== Set up job flags for ILAENV. ====
-*
-      IF( WANTT ) THEN
-         JBCMPZ( 1: 1 ) = 'S'
-      ELSE
-         JBCMPZ( 1: 1 ) = 'E'
-      END IF
-      IF( WANTZ ) THEN
-         JBCMPZ( 2: 2 ) = 'V'
-      ELSE
-         JBCMPZ( 2: 2 ) = 'N'
-      END IF
-*
-*     ==== Tiny matrices must use DLAHQR. ====
-*
-      IF( N.LE.NTINY ) THEN
-*
-*        ==== Estimate optimal workspace. ====
-*
-         LWKOPT = 1
-         IF( LWORK.NE.-1 )
-     $      CALL DLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI,
-     $                   ILOZ, IHIZ, Z, LDZ, INFO )
-      ELSE
-*
-*        ==== Use small bulge multi-shift QR with aggressive early
-*        .    deflation on larger-than-tiny matrices. ====
-*
-*        ==== Hope for the best. ====
-*
-         INFO = 0
-*
-*        ==== NWR = recommended deflation window size.  At this
-*        .    point,  N .GT. NTINY = 11, so there is enough
-*        .    subdiagonal workspace for NWR.GE.2 as required.
-*        .    (In fact, there is enough subdiagonal space for
-*        .    NWR.GE.3.) ====
-*
-         NWR = ILAENV( 13, 'DLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         NWR = MAX( 2, NWR )
-         NWR = MIN( IHI-ILO+1, ( N-1 ) / 3, NWR )
-         NW = NWR
-*
-*        ==== NSR = recommended number of simultaneous shifts.
-*        .    At this point N .GT. NTINY = 11, so there is at
-*        .    enough subdiagonal workspace for NSR to be even
-*        .    and greater than or equal to two as required. ====
-*
-         NSR = ILAENV( 15, 'DLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         NSR = MIN( NSR, ( N+6 ) / 9, IHI-ILO )
-         NSR = MAX( 2, NSR-MOD( NSR, 2 ) )
-*
-*        ==== Estimate optimal workspace ====
-*
-*        ==== Workspace query call to DLAQR3 ====
-*
-         CALL DLAQR3( WANTT, WANTZ, N, ILO, IHI, NWR+1, H, LDH, ILOZ,
-     $                IHIZ, Z, LDZ, LS, LD, WR, WI, H, LDH, N, H, LDH,
-     $                N, H, LDH, WORK, -1 )
-*
-*        ==== Optimal workspace = MAX(DLAQR5, DLAQR3) ====
-*
-         LWKOPT = MAX( 3*NSR / 2, INT( WORK( 1 ) ) )
-*
-*        ==== Quick return in case of workspace query. ====
-*
-         IF( LWORK.EQ.-1 ) THEN
-            WORK( 1 ) = DBLE( LWKOPT )
-            RETURN
-         END IF
-*
-*        ==== DLAHQR/DLAQR0 crossover point ====
-*
-         NMIN = ILAENV( 12, 'DLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         NMIN = MAX( NTINY, NMIN )
-*
-*        ==== Nibble crossover point ====
-*
-         NIBBLE = ILAENV( 14, 'DLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         NIBBLE = MAX( 0, NIBBLE )
-*
-*        ==== Accumulate reflections during ttswp?  Use block
-*        .    2-by-2 structure during matrix-matrix multiply? ====
-*
-         KACC22 = ILAENV( 16, 'DLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         KACC22 = MAX( 0, KACC22 )
-         KACC22 = MIN( 2, KACC22 )
-*
-*        ==== NWMAX = the largest possible deflation window for
-*        .    which there is sufficient workspace. ====
-*
-         NWMAX = MIN( ( N-1 ) / 3, LWORK / 2 )
-*
-*        ==== NSMAX = the Largest number of simultaneous shifts
-*        .    for which there is sufficient workspace. ====
-*
-         NSMAX = MIN( ( N+6 ) / 9, 2*LWORK / 3 )
-         NSMAX = NSMAX - MOD( NSMAX, 2 )
-*
-*        ==== NDFL: an iteration count restarted at deflation. ====
-*
-         NDFL = 1
-*
-*        ==== ITMAX = iteration limit ====
-*
-         ITMAX = MAX( 30, 2*KEXSH )*MAX( 10, ( IHI-ILO+1 ) )
-*
-*        ==== Last row and column in the active block ====
-*
-         KBOT = IHI
-*
-*        ==== Main Loop ====
-*
-         DO 80 IT = 1, ITMAX
-*
-*           ==== Done when KBOT falls below ILO ====
-*
-            IF( KBOT.LT.ILO )
-     $         GO TO 90
-*
-*           ==== Locate active block ====
-*
-            DO 10 K = KBOT, ILO + 1, -1
-               IF( H( K, K-1 ).EQ.ZERO )
-     $            GO TO 20
-   10       CONTINUE
-            K = ILO
-   20       CONTINUE
-            KTOP = K
-*
-*           ==== Select deflation window size ====
-*
-            NH = KBOT - KTOP + 1
-            IF( NDFL.LT.KEXNW .OR. NH.LT.NW ) THEN
-*
-*              ==== Typical deflation window.  If possible and
-*              .    advisable, nibble the entire active block.
-*              .    If not, use size NWR or NWR+1 depending upon
-*              .    which has the smaller corresponding subdiagonal
-*              .    entry (a heuristic). ====
-*
-               NWINC = .TRUE.
-               IF( NH.LE.MIN( NMIN, NWMAX ) ) THEN
-                  NW = NH
-               ELSE
-                  NW = MIN( NWR, NH, NWMAX )
-                  IF( NW.LT.NWMAX ) THEN
-                     IF( NW.GE.NH-1 ) THEN
-                        NW = NH
-                     ELSE
-                        KWTOP = KBOT - NW + 1
-                        IF( ABS( H( KWTOP, KWTOP-1 ) ).GT.
-     $                      ABS( H( KWTOP-1, KWTOP-2 ) ) )NW = NW + 1
-                     END IF
-                  END IF
-               END IF
-            ELSE
-*
-*              ==== Exceptional deflation window.  If there have
-*              .    been no deflations in KEXNW or more iterations,
-*              .    then vary the deflation window size.   At first,
-*              .    because, larger windows are, in general, more
-*              .    powerful than smaller ones, rapidly increase the
-*              .    window up to the maximum reasonable and possible.
-*              .    Then maybe try a slightly smaller window.  ====
-*
-               IF( NWINC .AND. NW.LT.MIN( NWMAX, NH ) ) THEN
-                  NW = MIN( NWMAX, NH, 2*NW )
-               ELSE
-                  NWINC = .FALSE.
-                  IF( NW.EQ.NH .AND. NH.GT.2 )
-     $               NW = NH - 1
-               END IF
-            END IF
-*
-*           ==== Aggressive early deflation:
-*           .    split workspace under the subdiagonal into
-*           .      - an nw-by-nw work array V in the lower
-*           .        left-hand-corner,
-*           .      - an NW-by-at-least-NW-but-more-is-better
-*           .        (NW-by-NHO) horizontal work array along
-*           .        the bottom edge,
-*           .      - an at-least-NW-but-more-is-better (NHV-by-NW)
-*           .        vertical work array along the left-hand-edge.
-*           .        ====
-*
-            KV = N - NW + 1
-            KT = NW + 1
-            NHO = ( N-NW-1 ) - KT + 1
-            KWV = NW + 2
-            NVE = ( N-NW ) - KWV + 1
-*
-*           ==== Aggressive early deflation ====
-*
-            CALL DLAQR3( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
-     $                   IHIZ, Z, LDZ, LS, LD, WR, WI, H( KV, 1 ), LDH,
-     $                   NHO, H( KV, KT ), LDH, NVE, H( KWV, 1 ), LDH,
-     $                   WORK, LWORK )
-*
-*           ==== Adjust KBOT accounting for new deflations. ====
-*
-            KBOT = KBOT - LD
-*
-*           ==== KS points to the shifts. ====
-*
-            KS = KBOT - LS + 1
-*
-*           ==== Skip an expensive QR sweep if there is a (partly
-*           .    heuristic) reason to expect that many eigenvalues
-*           .    will deflate without it.  Here, the QR sweep is
-*           .    skipped if many eigenvalues have just been deflated
-*           .    or if the remaining active block is small.
-*
-            IF( ( LD.EQ.0 ) .OR. ( ( 100*LD.LE.NW*NIBBLE ) .AND. ( KBOT-
-     $          KTOP+1.GT.MIN( NMIN, NWMAX ) ) ) ) THEN
-*
-*              ==== NS = nominal number of simultaneous shifts.
-*              .    This may be lowered (slightly) if DLAQR3
-*              .    did not provide that many shifts. ====
-*
-               NS = MIN( NSMAX, NSR, MAX( 2, KBOT-KTOP ) )
-               NS = NS - MOD( NS, 2 )
-*
-*              ==== If there have been no deflations
-*              .    in a multiple of KEXSH iterations,
-*              .    then try exceptional shifts.
-*              .    Otherwise use shifts provided by
-*              .    DLAQR3 above or from the eigenvalues
-*              .    of a trailing principal submatrix. ====
-*
-               IF( MOD( NDFL, KEXSH ).EQ.0 ) THEN
-                  KS = KBOT - NS + 1
-                  DO 30 I = KBOT, MAX( KS+1, KTOP+2 ), -2
-                     SS = ABS( H( I, I-1 ) ) + ABS( H( I-1, I-2 ) )
-                     AA = WILK1*SS + H( I, I )
-                     BB = SS
-                     CC = WILK2*SS
-                     DD = AA
-                     CALL DLANV2( AA, BB, CC, DD, WR( I-1 ), WI( I-1 ),
-     $                            WR( I ), WI( I ), CS, SN )
-   30             CONTINUE
-                  IF( KS.EQ.KTOP ) THEN
-                     WR( KS+1 ) = H( KS+1, KS+1 )
-                     WI( KS+1 ) = ZERO
-                     WR( KS ) = WR( KS+1 )
-                     WI( KS ) = WI( KS+1 )
-                  END IF
-               ELSE
-*
-*                 ==== Got NS/2 or fewer shifts? Use DLAQR4 or
-*                 .    DLAHQR on a trailing principal submatrix to
-*                 .    get more. (Since NS.LE.NSMAX.LE.(N+6)/9,
-*                 .    there is enough space below the subdiagonal
-*                 .    to fit an NS-by-NS scratch array.) ====
-*
-                  IF( KBOT-KS+1.LE.NS / 2 ) THEN
-                     KS = KBOT - NS + 1
-                     KT = N - NS + 1
-                     CALL DLACPY( 'A', NS, NS, H( KS, KS ), LDH,
-     $                            H( KT, 1 ), LDH )
-                     IF( NS.GT.NMIN ) THEN
-                        CALL DLAQR4( .false., .false., NS, 1, NS,
-     $                               H( KT, 1 ), LDH, WR( KS ),
-     $                               WI( KS ), 1, 1, ZDUM, 1, WORK,
-     $                               LWORK, INF )
-                     ELSE
-                        CALL DLAHQR( .false., .false., NS, 1, NS,
-     $                               H( KT, 1 ), LDH, WR( KS ),
-     $                               WI( KS ), 1, 1, ZDUM, 1, INF )
-                     END IF
-                     KS = KS + INF
-*
-*                    ==== In case of a rare QR failure use
-*                    .    eigenvalues of the trailing 2-by-2
-*                    .    principal submatrix.  ====
-*
-                     IF( KS.GE.KBOT ) THEN
-                        AA = H( KBOT-1, KBOT-1 )
-                        CC = H( KBOT, KBOT-1 )
-                        BB = H( KBOT-1, KBOT )
-                        DD = H( KBOT, KBOT )
-                        CALL DLANV2( AA, BB, CC, DD, WR( KBOT-1 ),
-     $                               WI( KBOT-1 ), WR( KBOT ),
-     $                               WI( KBOT ), CS, SN )
-                        KS = KBOT - 1
-                     END IF
-                  END IF
-*
-                  IF( KBOT-KS+1.GT.NS ) THEN
-*
-*                    ==== Sort the shifts (Helps a little)
-*                    .    Bubble sort keeps complex conjugate
-*                    .    pairs together. ====
-*
-                     SORTED = .false.
-                     DO 50 K = KBOT, KS + 1, -1
-                        IF( SORTED )
-     $                     GO TO 60
-                        SORTED = .true.
-                        DO 40 I = KS, K - 1
-                           IF( ABS( WR( I ) )+ABS( WI( I ) ).LT.
-     $                         ABS( WR( I+1 ) )+ABS( WI( I+1 ) ) ) THEN
-                              SORTED = .false.
-*
-                              SWAP = WR( I )
-                              WR( I ) = WR( I+1 )
-                              WR( I+1 ) = SWAP
-*
-                              SWAP = WI( I )
-                              WI( I ) = WI( I+1 )
-                              WI( I+1 ) = SWAP
-                           END IF
-   40                   CONTINUE
-   50                CONTINUE
-   60                CONTINUE
-                  END IF
-*
-*                 ==== Shuffle shifts into pairs of real shifts
-*                 .    and pairs of complex conjugate shifts
-*                 .    assuming complex conjugate shifts are
-*                 .    already adjacent to one another. (Yes,
-*                 .    they are.)  ====
-*
-                  DO 70 I = KBOT, KS + 2, -2
-                     IF( WI( I ).NE.-WI( I-1 ) ) THEN
-*
-                        SWAP = WR( I )
-                        WR( I ) = WR( I-1 )
-                        WR( I-1 ) = WR( I-2 )
-                        WR( I-2 ) = SWAP
-*
-                        SWAP = WI( I )
-                        WI( I ) = WI( I-1 )
-                        WI( I-1 ) = WI( I-2 )
-                        WI( I-2 ) = SWAP
-                     END IF
-   70             CONTINUE
-               END IF
-*
-*              ==== If there are only two shifts and both are
-*              .    real, then use only one.  ====
-*
-               IF( KBOT-KS+1.EQ.2 ) THEN
-                  IF( WI( KBOT ).EQ.ZERO ) THEN
-                     IF( ABS( WR( KBOT )-H( KBOT, KBOT ) ).LT.
-     $                   ABS( WR( KBOT-1 )-H( KBOT, KBOT ) ) ) THEN
-                        WR( KBOT-1 ) = WR( KBOT )
-                     ELSE
-                        WR( KBOT ) = WR( KBOT-1 )
-                     END IF
-                  END IF
-               END IF
-*
-*              ==== Use up to NS of the the smallest magnatiude
-*              .    shifts.  If there aren't NS shifts available,
-*              .    then use them all, possibly dropping one to
-*              .    make the number of shifts even. ====
-*
-               NS = MIN( NS, KBOT-KS+1 )
-               NS = NS - MOD( NS, 2 )
-               KS = KBOT - NS + 1
-*
-*              ==== Small-bulge multi-shift QR sweep:
-*              .    split workspace under the subdiagonal into
-*              .    - a KDU-by-KDU work array U in the lower
-*              .      left-hand-corner,
-*              .    - a KDU-by-at-least-KDU-but-more-is-better
-*              .      (KDU-by-NHo) horizontal work array WH along
-*              .      the bottom edge,
-*              .    - and an at-least-KDU-but-more-is-better-by-KDU
-*              .      (NVE-by-KDU) vertical work WV arrow along
-*              .      the left-hand-edge. ====
-*
-               KDU = 3*NS - 3
-               KU = N - KDU + 1
-               KWH = KDU + 1
-               NHO = ( N-KDU+1-4 ) - ( KDU+1 ) + 1
-               KWV = KDU + 4
-               NVE = N - KDU - KWV + 1
-*
-*              ==== Small-bulge multi-shift QR sweep ====
-*
-               CALL DLAQR5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NS,
-     $                      WR( KS ), WI( KS ), H, LDH, ILOZ, IHIZ, Z,
-     $                      LDZ, WORK, 3, H( KU, 1 ), LDH, NVE,
-     $                      H( KWV, 1 ), LDH, NHO, H( KU, KWH ), LDH )
-            END IF
-*
-*           ==== Note progress (or the lack of it). ====
-*
-            IF( LD.GT.0 ) THEN
-               NDFL = 1
-            ELSE
-               NDFL = NDFL + 1
-            END IF
-*
-*           ==== End of main loop ====
-   80    CONTINUE
-*
-*        ==== Iteration limit exceeded.  Set INFO to show where
-*        .    the problem occurred and exit. ====
-*
-         INFO = KBOT
-   90    CONTINUE
-      END IF
-*
-*     ==== Return the optimal value of LWORK. ====
-*
-      WORK( 1 ) = DBLE( LWKOPT )
-*
-*     ==== End of DLAQR0 ====
-*
-      END
--- a/libcruft/lapack/dlaqr1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-      SUBROUTINE DLAQR1( N, H, LDH, SR1, SI1, SR2, SI2, V )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   SI1, SI2, SR1, SR2
-      INTEGER            LDH, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   H( LDH, * ), V( * )
-*     ..
-*
-*       Given a 2-by-2 or 3-by-3 matrix H, DLAQR1 sets v to a
-*       scalar multiple of the first column of the product
-*
-*       (*)  K = (H - (sr1 + i*si1)*I)*(H - (sr2 + i*si2)*I)
-*
-*       scaling to avoid overflows and most underflows. It
-*       is assumed that either
-*
-*               1) sr1 = sr2 and si1 = -si2
-*           or
-*               2) si1 = si2 = 0.
-*
-*       This is useful for starting double implicit shift bulges
-*       in the QR algorithm.
-*
-*
-*       N      (input) integer
-*              Order of the matrix H. N must be either 2 or 3.
-*
-*       H      (input) DOUBLE PRECISION array of dimension (LDH,N)
-*              The 2-by-2 or 3-by-3 matrix H in (*).
-*
-*       LDH    (input) integer
-*              The leading dimension of H as declared in
-*              the calling procedure.  LDH.GE.N
-*
-*       SR1    (input) DOUBLE PRECISION
-*       SI1    The shifts in (*).
-*       SR2
-*       SI2
-*
-*       V      (output) DOUBLE PRECISION array of dimension N
-*              A scalar multiple of the first column of the
-*              matrix K in (*).
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0d0 )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   H21S, H31S, S
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. Executable Statements ..
-      IF( N.EQ.2 ) THEN
-         S = ABS( H( 1, 1 )-SR2 ) + ABS( SI2 ) + ABS( H( 2, 1 ) )
-         IF( S.EQ.ZERO ) THEN
-            V( 1 ) = ZERO
-            V( 2 ) = ZERO
-         ELSE
-            H21S = H( 2, 1 ) / S
-            V( 1 ) = H21S*H( 1, 2 ) + ( H( 1, 1 )-SR1 )*
-     $               ( ( H( 1, 1 )-SR2 ) / S ) - SI1*( SI2 / S )
-            V( 2 ) = H21S*( H( 1, 1 )+H( 2, 2 )-SR1-SR2 )
-         END IF
-      ELSE
-         S = ABS( H( 1, 1 )-SR2 ) + ABS( SI2 ) + ABS( H( 2, 1 ) ) +
-     $       ABS( H( 3, 1 ) )
-         IF( S.EQ.ZERO ) THEN
-            V( 1 ) = ZERO
-            V( 2 ) = ZERO
-            V( 3 ) = ZERO
-         ELSE
-            H21S = H( 2, 1 ) / S
-            H31S = H( 3, 1 ) / S
-            V( 1 ) = ( H( 1, 1 )-SR1 )*( ( H( 1, 1 )-SR2 ) / S ) -
-     $               SI1*( SI2 / S ) + H( 1, 2 )*H21S + H( 1, 3 )*H31S
-            V( 2 ) = H21S*( H( 1, 1 )+H( 2, 2 )-SR1-SR2 ) +
-     $               H( 2, 3 )*H31S
-            V( 3 ) = H31S*( H( 1, 1 )+H( 3, 3 )-SR1-SR2 ) +
-     $               H21S*H( 3, 2 )
-         END IF
-      END IF
-      END
--- a/libcruft/lapack/dlaqr2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,551 +0,0 @@
-      SUBROUTINE DLAQR2( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
-     $                   IHIZ, Z, LDZ, NS, ND, SR, SI, V, LDV, NH, T,
-     $                   LDT, NV, WV, LDWV, WORK, LWORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHIZ, ILOZ, KBOT, KTOP, LDH, LDT, LDV, LDWV,
-     $                   LDZ, LWORK, N, ND, NH, NS, NV, NW
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   H( LDH, * ), SI( * ), SR( * ), T( LDT, * ),
-     $                   V( LDV, * ), WORK( * ), WV( LDWV, * ),
-     $                   Z( LDZ, * )
-*     ..
-*
-*     This subroutine is identical to DLAQR3 except that it avoids
-*     recursion by calling DLAHQR instead of DLAQR4.
-*
-*
-*     ******************************************************************
-*     Aggressive early deflation:
-*
-*     This subroutine accepts as input an upper Hessenberg matrix
-*     H and performs an orthogonal similarity transformation
-*     designed to detect and deflate fully converged eigenvalues from
-*     a trailing principal submatrix.  On output H has been over-
-*     written by a new Hessenberg matrix that is a perturbation of
-*     an orthogonal similarity transformation of H.  It is to be
-*     hoped that the final version of H has many zero subdiagonal
-*     entries.
-*
-*     ******************************************************************
-*     WANTT   (input) LOGICAL
-*          If .TRUE., then the Hessenberg matrix H is fully updated
-*          so that the quasi-triangular Schur factor may be
-*          computed (in cooperation with the calling subroutine).
-*          If .FALSE., then only enough of H is updated to preserve
-*          the eigenvalues.
-*
-*     WANTZ   (input) LOGICAL
-*          If .TRUE., then the orthogonal matrix Z is updated so
-*          so that the orthogonal Schur factor may be computed
-*          (in cooperation with the calling subroutine).
-*          If .FALSE., then Z is not referenced.
-*
-*     N       (input) INTEGER
-*          The order of the matrix H and (if WANTZ is .TRUE.) the
-*          order of the orthogonal matrix Z.
-*
-*     KTOP    (input) INTEGER
-*          It is assumed that either KTOP = 1 or H(KTOP,KTOP-1)=0.
-*          KBOT and KTOP together determine an isolated block
-*          along the diagonal of the Hessenberg matrix.
-*
-*     KBOT    (input) INTEGER
-*          It is assumed without a check that either
-*          KBOT = N or H(KBOT+1,KBOT)=0.  KBOT and KTOP together
-*          determine an isolated block along the diagonal of the
-*          Hessenberg matrix.
-*
-*     NW      (input) INTEGER
-*          Deflation window size.  1 .LE. NW .LE. (KBOT-KTOP+1).
-*
-*     H       (input/output) DOUBLE PRECISION array, dimension (LDH,N)
-*          On input the initial N-by-N section of H stores the
-*          Hessenberg matrix undergoing aggressive early deflation.
-*          On output H has been transformed by an orthogonal
-*          similarity transformation, perturbed, and the returned
-*          to Hessenberg form that (it is to be hoped) has some
-*          zero subdiagonal entries.
-*
-*     LDH     (input) integer
-*          Leading dimension of H just as declared in the calling
-*          subroutine.  N .LE. LDH
-*
-*     ILOZ    (input) INTEGER
-*     IHIZ    (input) INTEGER
-*          Specify the rows of Z to which transformations must be
-*          applied if WANTZ is .TRUE.. 1 .LE. ILOZ .LE. IHIZ .LE. N.
-*
-*     Z       (input/output) DOUBLE PRECISION array, dimension (LDZ,IHI)
-*          IF WANTZ is .TRUE., then on output, the orthogonal
-*          similarity transformation mentioned above has been
-*          accumulated into Z(ILOZ:IHIZ,ILO:IHI) from the right.
-*          If WANTZ is .FALSE., then Z is unreferenced.
-*
-*     LDZ     (input) integer
-*          The leading dimension of Z just as declared in the
-*          calling subroutine.  1 .LE. LDZ.
-*
-*     NS      (output) integer
-*          The number of unconverged (ie approximate) eigenvalues
-*          returned in SR and SI that may be used as shifts by the
-*          calling subroutine.
-*
-*     ND      (output) integer
-*          The number of converged eigenvalues uncovered by this
-*          subroutine.
-*
-*     SR      (output) DOUBLE PRECISION array, dimension KBOT
-*     SI      (output) DOUBLE PRECISION array, dimension KBOT
-*          On output, the real and imaginary parts of approximate
-*          eigenvalues that may be used for shifts are stored in
-*          SR(KBOT-ND-NS+1) through SR(KBOT-ND) and
-*          SI(KBOT-ND-NS+1) through SI(KBOT-ND), respectively.
-*          The real and imaginary parts of converged eigenvalues
-*          are stored in SR(KBOT-ND+1) through SR(KBOT) and
-*          SI(KBOT-ND+1) through SI(KBOT), respectively.
-*
-*     V       (workspace) DOUBLE PRECISION array, dimension (LDV,NW)
-*          An NW-by-NW work array.
-*
-*     LDV     (input) integer scalar
-*          The leading dimension of V just as declared in the
-*          calling subroutine.  NW .LE. LDV
-*
-*     NH      (input) integer scalar
-*          The number of columns of T.  NH.GE.NW.
-*
-*     T       (workspace) DOUBLE PRECISION array, dimension (LDT,NW)
-*
-*     LDT     (input) integer
-*          The leading dimension of T just as declared in the
-*          calling subroutine.  NW .LE. LDT
-*
-*     NV      (input) integer
-*          The number of rows of work array WV available for
-*          workspace.  NV.GE.NW.
-*
-*     WV      (workspace) DOUBLE PRECISION array, dimension (LDWV,NW)
-*
-*     LDWV    (input) integer
-*          The leading dimension of W just as declared in the
-*          calling subroutine.  NW .LE. LDV
-*
-*     WORK    (workspace) DOUBLE PRECISION array, dimension LWORK.
-*          On exit, WORK(1) is set to an estimate of the optimal value
-*          of LWORK for the given values of N, NW, KTOP and KBOT.
-*
-*     LWORK   (input) integer
-*          The dimension of the work array WORK.  LWORK = 2*NW
-*          suffices, but greater efficiency may result from larger
-*          values of LWORK.
-*
-*          If LWORK = -1, then a workspace query is assumed; DLAQR2
-*          only estimates the optimal workspace size for the given
-*          values of N, NW, KTOP and KBOT.  The estimate is returned
-*          in WORK(1).  No error message related to LWORK is issued
-*          by XERBLA.  Neither H nor Z are accessed.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ================================================================
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0d0, ONE = 1.0d0 )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   AA, BB, BETA, CC, CS, DD, EVI, EVK, FOO, S,
-     $                   SAFMAX, SAFMIN, SMLNUM, SN, TAU, ULP
-      INTEGER            I, IFST, ILST, INFO, INFQR, J, JW, K, KCOL,
-     $                   KEND, KLN, KROW, KWTOP, LTOP, LWK1, LWK2,
-     $                   LWKOPT
-      LOGICAL            BULGE, SORTED
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DGEHRD, DGEMM, DLABAD, DLACPY, DLAHQR,
-     $                   DLANV2, DLARF, DLARFG, DLASET, DORGHR, DTREXC
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, INT, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     ==== Estimate optimal workspace. ====
-*
-      JW = MIN( NW, KBOT-KTOP+1 )
-      IF( JW.LE.2 ) THEN
-         LWKOPT = 1
-      ELSE
-*
-*        ==== Workspace query call to DGEHRD ====
-*
-         CALL DGEHRD( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
-         LWK1 = INT( WORK( 1 ) )
-*
-*        ==== Workspace query call to DORGHR ====
-*
-         CALL DORGHR( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
-         LWK2 = INT( WORK( 1 ) )
-*
-*        ==== Optimal workspace ====
-*
-         LWKOPT = JW + MAX( LWK1, LWK2 )
-      END IF
-*
-*     ==== Quick return in case of workspace query. ====
-*
-      IF( LWORK.EQ.-1 ) THEN
-         WORK( 1 ) = DBLE( LWKOPT )
-         RETURN
-      END IF
-*
-*     ==== Nothing to do ...
-*     ... for an empty active block ... ====
-      NS = 0
-      ND = 0
-      IF( KTOP.GT.KBOT )
-     $   RETURN
-*     ... nor for an empty deflation window. ====
-      IF( NW.LT.1 )
-     $   RETURN
-*
-*     ==== Machine constants ====
-*
-      SAFMIN = DLAMCH( 'SAFE MINIMUM' )
-      SAFMAX = ONE / SAFMIN
-      CALL DLABAD( SAFMIN, SAFMAX )
-      ULP = DLAMCH( 'PRECISION' )
-      SMLNUM = SAFMIN*( DBLE( N ) / ULP )
-*
-*     ==== Setup deflation window ====
-*
-      JW = MIN( NW, KBOT-KTOP+1 )
-      KWTOP = KBOT - JW + 1
-      IF( KWTOP.EQ.KTOP ) THEN
-         S = ZERO
-      ELSE
-         S = H( KWTOP, KWTOP-1 )
-      END IF
-*
-      IF( KBOT.EQ.KWTOP ) THEN
-*
-*        ==== 1-by-1 deflation window: not much to do ====
-*
-         SR( KWTOP ) = H( KWTOP, KWTOP )
-         SI( KWTOP ) = ZERO
-         NS = 1
-         ND = 0
-         IF( ABS( S ).LE.MAX( SMLNUM, ULP*ABS( H( KWTOP, KWTOP ) ) ) )
-     $        THEN
-            NS = 0
-            ND = 1
-            IF( KWTOP.GT.KTOP )
-     $         H( KWTOP, KWTOP-1 ) = ZERO
-         END IF
-         RETURN
-      END IF
-*
-*     ==== Convert to spike-triangular form.  (In case of a
-*     .    rare QR failure, this routine continues to do
-*     .    aggressive early deflation using that part of
-*     .    the deflation window that converged using INFQR
-*     .    here and there to keep track.) ====
-*
-      CALL DLACPY( 'U', JW, JW, H( KWTOP, KWTOP ), LDH, T, LDT )
-      CALL DCOPY( JW-1, H( KWTOP+1, KWTOP ), LDH+1, T( 2, 1 ), LDT+1 )
-*
-      CALL DLASET( 'A', JW, JW, ZERO, ONE, V, LDV )
-      CALL DLAHQR( .true., .true., JW, 1, JW, T, LDT, SR( KWTOP ),
-     $             SI( KWTOP ), 1, JW, V, LDV, INFQR )
-*
-*     ==== DTREXC needs a clean margin near the diagonal ====
-*
-      DO 10 J = 1, JW - 3
-         T( J+2, J ) = ZERO
-         T( J+3, J ) = ZERO
-   10 CONTINUE
-      IF( JW.GT.2 )
-     $   T( JW, JW-2 ) = ZERO
-*
-*     ==== Deflation detection loop ====
-*
-      NS = JW
-      ILST = INFQR + 1
-   20 CONTINUE
-      IF( ILST.LE.NS ) THEN
-         IF( NS.EQ.1 ) THEN
-            BULGE = .FALSE.
-         ELSE
-            BULGE = T( NS, NS-1 ).NE.ZERO
-         END IF
-*
-*        ==== Small spike tip test for deflation ====
-*
-         IF( .NOT.BULGE ) THEN
-*
-*           ==== Real eigenvalue ====
-*
-            FOO = ABS( T( NS, NS ) )
-            IF( FOO.EQ.ZERO )
-     $         FOO = ABS( S )
-            IF( ABS( S*V( 1, NS ) ).LE.MAX( SMLNUM, ULP*FOO ) ) THEN
-*
-*              ==== Deflatable ====
-*
-               NS = NS - 1
-            ELSE
-*
-*              ==== Undeflatable.   Move it up out of the way.
-*              .    (DTREXC can not fail in this case.) ====
-*
-               IFST = NS
-               CALL DTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, WORK,
-     $                      INFO )
-               ILST = ILST + 1
-            END IF
-         ELSE
-*
-*           ==== Complex conjugate pair ====
-*
-            FOO = ABS( T( NS, NS ) ) + SQRT( ABS( T( NS, NS-1 ) ) )*
-     $            SQRT( ABS( T( NS-1, NS ) ) )
-            IF( FOO.EQ.ZERO )
-     $         FOO = ABS( S )
-            IF( MAX( ABS( S*V( 1, NS ) ), ABS( S*V( 1, NS-1 ) ) ).LE.
-     $          MAX( SMLNUM, ULP*FOO ) ) THEN
-*
-*              ==== Deflatable ====
-*
-               NS = NS - 2
-            ELSE
-*
-*              ==== Undflatable. Move them up out of the way.
-*              .    Fortunately, DTREXC does the right thing with
-*              .    ILST in case of a rare exchange failure. ====
-*
-               IFST = NS
-               CALL DTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, WORK,
-     $                      INFO )
-               ILST = ILST + 2
-            END IF
-         END IF
-*
-*        ==== End deflation detection loop ====
-*
-         GO TO 20
-      END IF
-*
-*        ==== Return to Hessenberg form ====
-*
-      IF( NS.EQ.0 )
-     $   S = ZERO
-*
-      IF( NS.LT.JW ) THEN
-*
-*        ==== sorting diagonal blocks of T improves accuracy for
-*        .    graded matrices.  Bubble sort deals well with
-*        .    exchange failures. ====
-*
-         SORTED = .false.
-         I = NS + 1
-   30    CONTINUE
-         IF( SORTED )
-     $      GO TO 50
-         SORTED = .true.
-*
-         KEND = I - 1
-         I = INFQR + 1
-         IF( I.EQ.NS ) THEN
-            K = I + 1
-         ELSE IF( T( I+1, I ).EQ.ZERO ) THEN
-            K = I + 1
-         ELSE
-            K = I + 2
-         END IF
-   40    CONTINUE
-         IF( K.LE.KEND ) THEN
-            IF( K.EQ.I+1 ) THEN
-               EVI = ABS( T( I, I ) )
-            ELSE
-               EVI = ABS( T( I, I ) ) + SQRT( ABS( T( I+1, I ) ) )*
-     $               SQRT( ABS( T( I, I+1 ) ) )
-            END IF
-*
-            IF( K.EQ.KEND ) THEN
-               EVK = ABS( T( K, K ) )
-            ELSE IF( T( K+1, K ).EQ.ZERO ) THEN
-               EVK = ABS( T( K, K ) )
-            ELSE
-               EVK = ABS( T( K, K ) ) + SQRT( ABS( T( K+1, K ) ) )*
-     $               SQRT( ABS( T( K, K+1 ) ) )
-            END IF
-*
-            IF( EVI.GE.EVK ) THEN
-               I = K
-            ELSE
-               SORTED = .false.
-               IFST = I
-               ILST = K
-               CALL DTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, WORK,
-     $                      INFO )
-               IF( INFO.EQ.0 ) THEN
-                  I = ILST
-               ELSE
-                  I = K
-               END IF
-            END IF
-            IF( I.EQ.KEND ) THEN
-               K = I + 1
-            ELSE IF( T( I+1, I ).EQ.ZERO ) THEN
-               K = I + 1
-            ELSE
-               K = I + 2
-            END IF
-            GO TO 40
-         END IF
-         GO TO 30
-   50    CONTINUE
-      END IF
-*
-*     ==== Restore shift/eigenvalue array from T ====
-*
-      I = JW
-   60 CONTINUE
-      IF( I.GE.INFQR+1 ) THEN
-         IF( I.EQ.INFQR+1 ) THEN
-            SR( KWTOP+I-1 ) = T( I, I )
-            SI( KWTOP+I-1 ) = ZERO
-            I = I - 1
-         ELSE IF( T( I, I-1 ).EQ.ZERO ) THEN
-            SR( KWTOP+I-1 ) = T( I, I )
-            SI( KWTOP+I-1 ) = ZERO
-            I = I - 1
-         ELSE
-            AA = T( I-1, I-1 )
-            CC = T( I, I-1 )
-            BB = T( I-1, I )
-            DD = T( I, I )
-            CALL DLANV2( AA, BB, CC, DD, SR( KWTOP+I-2 ),
-     $                   SI( KWTOP+I-2 ), SR( KWTOP+I-1 ),
-     $                   SI( KWTOP+I-1 ), CS, SN )
-            I = I - 2
-         END IF
-         GO TO 60
-      END IF
-*
-      IF( NS.LT.JW .OR. S.EQ.ZERO ) THEN
-         IF( NS.GT.1 .AND. S.NE.ZERO ) THEN
-*
-*           ==== Reflect spike back into lower triangle ====
-*
-            CALL DCOPY( NS, V, LDV, WORK, 1 )
-            BETA = WORK( 1 )
-            CALL DLARFG( NS, BETA, WORK( 2 ), 1, TAU )
-            WORK( 1 ) = ONE
-*
-            CALL DLASET( 'L', JW-2, JW-2, ZERO, ZERO, T( 3, 1 ), LDT )
-*
-            CALL DLARF( 'L', NS, JW, WORK, 1, TAU, T, LDT,
-     $                  WORK( JW+1 ) )
-            CALL DLARF( 'R', NS, NS, WORK, 1, TAU, T, LDT,
-     $                  WORK( JW+1 ) )
-            CALL DLARF( 'R', JW, NS, WORK, 1, TAU, V, LDV,
-     $                  WORK( JW+1 ) )
-*
-            CALL DGEHRD( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
-     $                   LWORK-JW, INFO )
-         END IF
-*
-*        ==== Copy updated reduced window into place ====
-*
-         IF( KWTOP.GT.1 )
-     $      H( KWTOP, KWTOP-1 ) = S*V( 1, 1 )
-         CALL DLACPY( 'U', JW, JW, T, LDT, H( KWTOP, KWTOP ), LDH )
-         CALL DCOPY( JW-1, T( 2, 1 ), LDT+1, H( KWTOP+1, KWTOP ),
-     $               LDH+1 )
-*
-*        ==== Accumulate orthogonal matrix in order update
-*        .    H and Z, if requested.  (A modified version
-*        .    of  DORGHR that accumulates block Householder
-*        .    transformations into V directly might be
-*        .    marginally more efficient than the following.) ====
-*
-         IF( NS.GT.1 .AND. S.NE.ZERO ) THEN
-            CALL DORGHR( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
-     $                   LWORK-JW, INFO )
-            CALL DGEMM( 'N', 'N', JW, NS, NS, ONE, V, LDV, T, LDT, ZERO,
-     $                  WV, LDWV )
-            CALL DLACPY( 'A', JW, NS, WV, LDWV, V, LDV )
-         END IF
-*
-*        ==== Update vertical slab in H ====
-*
-         IF( WANTT ) THEN
-            LTOP = 1
-         ELSE
-            LTOP = KTOP
-         END IF
-         DO 70 KROW = LTOP, KWTOP - 1, NV
-            KLN = MIN( NV, KWTOP-KROW )
-            CALL DGEMM( 'N', 'N', KLN, JW, JW, ONE, H( KROW, KWTOP ),
-     $                  LDH, V, LDV, ZERO, WV, LDWV )
-            CALL DLACPY( 'A', KLN, JW, WV, LDWV, H( KROW, KWTOP ), LDH )
-   70    CONTINUE
-*
-*        ==== Update horizontal slab in H ====
-*
-         IF( WANTT ) THEN
-            DO 80 KCOL = KBOT + 1, N, NH
-               KLN = MIN( NH, N-KCOL+1 )
-               CALL DGEMM( 'C', 'N', JW, KLN, JW, ONE, V, LDV,
-     $                     H( KWTOP, KCOL ), LDH, ZERO, T, LDT )
-               CALL DLACPY( 'A', JW, KLN, T, LDT, H( KWTOP, KCOL ),
-     $                      LDH )
-   80       CONTINUE
-         END IF
-*
-*        ==== Update vertical slab in Z ====
-*
-         IF( WANTZ ) THEN
-            DO 90 KROW = ILOZ, IHIZ, NV
-               KLN = MIN( NV, IHIZ-KROW+1 )
-               CALL DGEMM( 'N', 'N', KLN, JW, JW, ONE, Z( KROW, KWTOP ),
-     $                     LDZ, V, LDV, ZERO, WV, LDWV )
-               CALL DLACPY( 'A', KLN, JW, WV, LDWV, Z( KROW, KWTOP ),
-     $                      LDZ )
-   90       CONTINUE
-         END IF
-      END IF
-*
-*     ==== Return the number of deflations ... ====
-*
-      ND = JW - NS
-*
-*     ==== ... and the number of shifts. (Subtracting
-*     .    INFQR from the spike length takes care
-*     .    of the case of a rare QR failure while
-*     .    calculating eigenvalues of the deflation
-*     .    window.)  ====
-*
-      NS = NS - INFQR
-*
-*      ==== Return optimal workspace. ====
-*
-      WORK( 1 ) = DBLE( LWKOPT )
-*
-*     ==== End of DLAQR2 ====
-*
-      END
--- a/libcruft/lapack/dlaqr3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,561 +0,0 @@
-      SUBROUTINE DLAQR3( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
-     $                   IHIZ, Z, LDZ, NS, ND, SR, SI, V, LDV, NH, T,
-     $                   LDT, NV, WV, LDWV, WORK, LWORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHIZ, ILOZ, KBOT, KTOP, LDH, LDT, LDV, LDWV,
-     $                   LDZ, LWORK, N, ND, NH, NS, NV, NW
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   H( LDH, * ), SI( * ), SR( * ), T( LDT, * ),
-     $                   V( LDV, * ), WORK( * ), WV( LDWV, * ),
-     $                   Z( LDZ, * )
-*     ..
-*
-*     ******************************************************************
-*     Aggressive early deflation:
-*
-*     This subroutine accepts as input an upper Hessenberg matrix
-*     H and performs an orthogonal similarity transformation
-*     designed to detect and deflate fully converged eigenvalues from
-*     a trailing principal submatrix.  On output H has been over-
-*     written by a new Hessenberg matrix that is a perturbation of
-*     an orthogonal similarity transformation of H.  It is to be
-*     hoped that the final version of H has many zero subdiagonal
-*     entries.
-*
-*     ******************************************************************
-*     WANTT   (input) LOGICAL
-*          If .TRUE., then the Hessenberg matrix H is fully updated
-*          so that the quasi-triangular Schur factor may be
-*          computed (in cooperation with the calling subroutine).
-*          If .FALSE., then only enough of H is updated to preserve
-*          the eigenvalues.
-*
-*     WANTZ   (input) LOGICAL
-*          If .TRUE., then the orthogonal matrix Z is updated so
-*          so that the orthogonal Schur factor may be computed
-*          (in cooperation with the calling subroutine).
-*          If .FALSE., then Z is not referenced.
-*
-*     N       (input) INTEGER
-*          The order of the matrix H and (if WANTZ is .TRUE.) the
-*          order of the orthogonal matrix Z.
-*
-*     KTOP    (input) INTEGER
-*          It is assumed that either KTOP = 1 or H(KTOP,KTOP-1)=0.
-*          KBOT and KTOP together determine an isolated block
-*          along the diagonal of the Hessenberg matrix.
-*
-*     KBOT    (input) INTEGER
-*          It is assumed without a check that either
-*          KBOT = N or H(KBOT+1,KBOT)=0.  KBOT and KTOP together
-*          determine an isolated block along the diagonal of the
-*          Hessenberg matrix.
-*
-*     NW      (input) INTEGER
-*          Deflation window size.  1 .LE. NW .LE. (KBOT-KTOP+1).
-*
-*     H       (input/output) DOUBLE PRECISION array, dimension (LDH,N)
-*          On input the initial N-by-N section of H stores the
-*          Hessenberg matrix undergoing aggressive early deflation.
-*          On output H has been transformed by an orthogonal
-*          similarity transformation, perturbed, and the returned
-*          to Hessenberg form that (it is to be hoped) has some
-*          zero subdiagonal entries.
-*
-*     LDH     (input) integer
-*          Leading dimension of H just as declared in the calling
-*          subroutine.  N .LE. LDH
-*
-*     ILOZ    (input) INTEGER
-*     IHIZ    (input) INTEGER
-*          Specify the rows of Z to which transformations must be
-*          applied if WANTZ is .TRUE.. 1 .LE. ILOZ .LE. IHIZ .LE. N.
-*
-*     Z       (input/output) DOUBLE PRECISION array, dimension (LDZ,IHI)
-*          IF WANTZ is .TRUE., then on output, the orthogonal
-*          similarity transformation mentioned above has been
-*          accumulated into Z(ILOZ:IHIZ,ILO:IHI) from the right.
-*          If WANTZ is .FALSE., then Z is unreferenced.
-*
-*     LDZ     (input) integer
-*          The leading dimension of Z just as declared in the
-*          calling subroutine.  1 .LE. LDZ.
-*
-*     NS      (output) integer
-*          The number of unconverged (ie approximate) eigenvalues
-*          returned in SR and SI that may be used as shifts by the
-*          calling subroutine.
-*
-*     ND      (output) integer
-*          The number of converged eigenvalues uncovered by this
-*          subroutine.
-*
-*     SR      (output) DOUBLE PRECISION array, dimension KBOT
-*     SI      (output) DOUBLE PRECISION array, dimension KBOT
-*          On output, the real and imaginary parts of approximate
-*          eigenvalues that may be used for shifts are stored in
-*          SR(KBOT-ND-NS+1) through SR(KBOT-ND) and
-*          SI(KBOT-ND-NS+1) through SI(KBOT-ND), respectively.
-*          The real and imaginary parts of converged eigenvalues
-*          are stored in SR(KBOT-ND+1) through SR(KBOT) and
-*          SI(KBOT-ND+1) through SI(KBOT), respectively.
-*
-*     V       (workspace) DOUBLE PRECISION array, dimension (LDV,NW)
-*          An NW-by-NW work array.
-*
-*     LDV     (input) integer scalar
-*          The leading dimension of V just as declared in the
-*          calling subroutine.  NW .LE. LDV
-*
-*     NH      (input) integer scalar
-*          The number of columns of T.  NH.GE.NW.
-*
-*     T       (workspace) DOUBLE PRECISION array, dimension (LDT,NW)
-*
-*     LDT     (input) integer
-*          The leading dimension of T just as declared in the
-*          calling subroutine.  NW .LE. LDT
-*
-*     NV      (input) integer
-*          The number of rows of work array WV available for
-*          workspace.  NV.GE.NW.
-*
-*     WV      (workspace) DOUBLE PRECISION array, dimension (LDWV,NW)
-*
-*     LDWV    (input) integer
-*          The leading dimension of W just as declared in the
-*          calling subroutine.  NW .LE. LDV
-*
-*     WORK    (workspace) DOUBLE PRECISION array, dimension LWORK.
-*          On exit, WORK(1) is set to an estimate of the optimal value
-*          of LWORK for the given values of N, NW, KTOP and KBOT.
-*
-*     LWORK   (input) integer
-*          The dimension of the work array WORK.  LWORK = 2*NW
-*          suffices, but greater efficiency may result from larger
-*          values of LWORK.
-*
-*          If LWORK = -1, then a workspace query is assumed; DLAQR3
-*          only estimates the optimal workspace size for the given
-*          values of N, NW, KTOP and KBOT.  The estimate is returned
-*          in WORK(1).  No error message related to LWORK is issued
-*          by XERBLA.  Neither H nor Z are accessed.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ==================================================================
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0d0, ONE = 1.0d0 )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   AA, BB, BETA, CC, CS, DD, EVI, EVK, FOO, S,
-     $                   SAFMAX, SAFMIN, SMLNUM, SN, TAU, ULP
-      INTEGER            I, IFST, ILST, INFO, INFQR, J, JW, K, KCOL,
-     $                   KEND, KLN, KROW, KWTOP, LTOP, LWK1, LWK2, LWK3,
-     $                   LWKOPT, NMIN
-      LOGICAL            BULGE, SORTED
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH
-      INTEGER            ILAENV
-      EXTERNAL           DLAMCH, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DGEHRD, DGEMM, DLABAD, DLACPY, DLAHQR,
-     $                   DLANV2, DLAQR4, DLARF, DLARFG, DLASET, DORGHR,
-     $                   DTREXC
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, INT, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     ==== Estimate optimal workspace. ====
-*
-      JW = MIN( NW, KBOT-KTOP+1 )
-      IF( JW.LE.2 ) THEN
-         LWKOPT = 1
-      ELSE
-*
-*        ==== Workspace query call to DGEHRD ====
-*
-         CALL DGEHRD( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
-         LWK1 = INT( WORK( 1 ) )
-*
-*        ==== Workspace query call to DORGHR ====
-*
-         CALL DORGHR( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
-         LWK2 = INT( WORK( 1 ) )
-*
-*        ==== Workspace query call to DLAQR4 ====
-*
-         CALL DLAQR4( .true., .true., JW, 1, JW, T, LDT, SR, SI, 1, JW,
-     $                V, LDV, WORK, -1, INFQR )
-         LWK3 = INT( WORK( 1 ) )
-*
-*        ==== Optimal workspace ====
-*
-         LWKOPT = MAX( JW+MAX( LWK1, LWK2 ), LWK3 )
-      END IF
-*
-*     ==== Quick return in case of workspace query. ====
-*
-      IF( LWORK.EQ.-1 ) THEN
-         WORK( 1 ) = DBLE( LWKOPT )
-         RETURN
-      END IF
-*
-*     ==== Nothing to do ...
-*     ... for an empty active block ... ====
-      NS = 0
-      ND = 0
-      IF( KTOP.GT.KBOT )
-     $   RETURN
-*     ... nor for an empty deflation window. ====
-      IF( NW.LT.1 )
-     $   RETURN
-*
-*     ==== Machine constants ====
-*
-      SAFMIN = DLAMCH( 'SAFE MINIMUM' )
-      SAFMAX = ONE / SAFMIN
-      CALL DLABAD( SAFMIN, SAFMAX )
-      ULP = DLAMCH( 'PRECISION' )
-      SMLNUM = SAFMIN*( DBLE( N ) / ULP )
-*
-*     ==== Setup deflation window ====
-*
-      JW = MIN( NW, KBOT-KTOP+1 )
-      KWTOP = KBOT - JW + 1
-      IF( KWTOP.EQ.KTOP ) THEN
-         S = ZERO
-      ELSE
-         S = H( KWTOP, KWTOP-1 )
-      END IF
-*
-      IF( KBOT.EQ.KWTOP ) THEN
-*
-*        ==== 1-by-1 deflation window: not much to do ====
-*
-         SR( KWTOP ) = H( KWTOP, KWTOP )
-         SI( KWTOP ) = ZERO
-         NS = 1
-         ND = 0
-         IF( ABS( S ).LE.MAX( SMLNUM, ULP*ABS( H( KWTOP, KWTOP ) ) ) )
-     $        THEN
-            NS = 0
-            ND = 1
-            IF( KWTOP.GT.KTOP )
-     $         H( KWTOP, KWTOP-1 ) = ZERO
-         END IF
-         RETURN
-      END IF
-*
-*     ==== Convert to spike-triangular form.  (In case of a
-*     .    rare QR failure, this routine continues to do
-*     .    aggressive early deflation using that part of
-*     .    the deflation window that converged using INFQR
-*     .    here and there to keep track.) ====
-*
-      CALL DLACPY( 'U', JW, JW, H( KWTOP, KWTOP ), LDH, T, LDT )
-      CALL DCOPY( JW-1, H( KWTOP+1, KWTOP ), LDH+1, T( 2, 1 ), LDT+1 )
-*
-      CALL DLASET( 'A', JW, JW, ZERO, ONE, V, LDV )
-      NMIN = ILAENV( 12, 'DLAQR3', 'SV', JW, 1, JW, LWORK )
-      IF( JW.GT.NMIN ) THEN
-         CALL DLAQR4( .true., .true., JW, 1, JW, T, LDT, SR( KWTOP ),
-     $                SI( KWTOP ), 1, JW, V, LDV, WORK, LWORK, INFQR )
-      ELSE
-         CALL DLAHQR( .true., .true., JW, 1, JW, T, LDT, SR( KWTOP ),
-     $                SI( KWTOP ), 1, JW, V, LDV, INFQR )
-      END IF
-*
-*     ==== DTREXC needs a clean margin near the diagonal ====
-*
-      DO 10 J = 1, JW - 3
-         T( J+2, J ) = ZERO
-         T( J+3, J ) = ZERO
-   10 CONTINUE
-      IF( JW.GT.2 )
-     $   T( JW, JW-2 ) = ZERO
-*
-*     ==== Deflation detection loop ====
-*
-      NS = JW
-      ILST = INFQR + 1
-   20 CONTINUE
-      IF( ILST.LE.NS ) THEN
-         IF( NS.EQ.1 ) THEN
-            BULGE = .FALSE.
-         ELSE
-            BULGE = T( NS, NS-1 ).NE.ZERO
-         END IF
-*
-*        ==== Small spike tip test for deflation ====
-*
-         IF( .NOT.BULGE ) THEN
-*
-*           ==== Real eigenvalue ====
-*
-            FOO = ABS( T( NS, NS ) )
-            IF( FOO.EQ.ZERO )
-     $         FOO = ABS( S )
-            IF( ABS( S*V( 1, NS ) ).LE.MAX( SMLNUM, ULP*FOO ) ) THEN
-*
-*              ==== Deflatable ====
-*
-               NS = NS - 1
-            ELSE
-*
-*              ==== Undeflatable.   Move it up out of the way.
-*              .    (DTREXC can not fail in this case.) ====
-*
-               IFST = NS
-               CALL DTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, WORK,
-     $                      INFO )
-               ILST = ILST + 1
-            END IF
-         ELSE
-*
-*           ==== Complex conjugate pair ====
-*
-            FOO = ABS( T( NS, NS ) ) + SQRT( ABS( T( NS, NS-1 ) ) )*
-     $            SQRT( ABS( T( NS-1, NS ) ) )
-            IF( FOO.EQ.ZERO )
-     $         FOO = ABS( S )
-            IF( MAX( ABS( S*V( 1, NS ) ), ABS( S*V( 1, NS-1 ) ) ).LE.
-     $          MAX( SMLNUM, ULP*FOO ) ) THEN
-*
-*              ==== Deflatable ====
-*
-               NS = NS - 2
-            ELSE
-*
-*              ==== Undflatable. Move them up out of the way.
-*              .    Fortunately, DTREXC does the right thing with
-*              .    ILST in case of a rare exchange failure. ====
-*
-               IFST = NS
-               CALL DTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, WORK,
-     $                      INFO )
-               ILST = ILST + 2
-            END IF
-         END IF
-*
-*        ==== End deflation detection loop ====
-*
-         GO TO 20
-      END IF
-*
-*        ==== Return to Hessenberg form ====
-*
-      IF( NS.EQ.0 )
-     $   S = ZERO
-*
-      IF( NS.LT.JW ) THEN
-*
-*        ==== sorting diagonal blocks of T improves accuracy for
-*        .    graded matrices.  Bubble sort deals well with
-*        .    exchange failures. ====
-*
-         SORTED = .false.
-         I = NS + 1
-   30    CONTINUE
-         IF( SORTED )
-     $      GO TO 50
-         SORTED = .true.
-*
-         KEND = I - 1
-         I = INFQR + 1
-         IF( I.EQ.NS ) THEN
-            K = I + 1
-         ELSE IF( T( I+1, I ).EQ.ZERO ) THEN
-            K = I + 1
-         ELSE
-            K = I + 2
-         END IF
-   40    CONTINUE
-         IF( K.LE.KEND ) THEN
-            IF( K.EQ.I+1 ) THEN
-               EVI = ABS( T( I, I ) )
-            ELSE
-               EVI = ABS( T( I, I ) ) + SQRT( ABS( T( I+1, I ) ) )*
-     $               SQRT( ABS( T( I, I+1 ) ) )
-            END IF
-*
-            IF( K.EQ.KEND ) THEN
-               EVK = ABS( T( K, K ) )
-            ELSE IF( T( K+1, K ).EQ.ZERO ) THEN
-               EVK = ABS( T( K, K ) )
-            ELSE
-               EVK = ABS( T( K, K ) ) + SQRT( ABS( T( K+1, K ) ) )*
-     $               SQRT( ABS( T( K, K+1 ) ) )
-            END IF
-*
-            IF( EVI.GE.EVK ) THEN
-               I = K
-            ELSE
-               SORTED = .false.
-               IFST = I
-               ILST = K
-               CALL DTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, WORK,
-     $                      INFO )
-               IF( INFO.EQ.0 ) THEN
-                  I = ILST
-               ELSE
-                  I = K
-               END IF
-            END IF
-            IF( I.EQ.KEND ) THEN
-               K = I + 1
-            ELSE IF( T( I+1, I ).EQ.ZERO ) THEN
-               K = I + 1
-            ELSE
-               K = I + 2
-            END IF
-            GO TO 40
-         END IF
-         GO TO 30
-   50    CONTINUE
-      END IF
-*
-*     ==== Restore shift/eigenvalue array from T ====
-*
-      I = JW
-   60 CONTINUE
-      IF( I.GE.INFQR+1 ) THEN
-         IF( I.EQ.INFQR+1 ) THEN
-            SR( KWTOP+I-1 ) = T( I, I )
-            SI( KWTOP+I-1 ) = ZERO
-            I = I - 1
-         ELSE IF( T( I, I-1 ).EQ.ZERO ) THEN
-            SR( KWTOP+I-1 ) = T( I, I )
-            SI( KWTOP+I-1 ) = ZERO
-            I = I - 1
-         ELSE
-            AA = T( I-1, I-1 )
-            CC = T( I, I-1 )
-            BB = T( I-1, I )
-            DD = T( I, I )
-            CALL DLANV2( AA, BB, CC, DD, SR( KWTOP+I-2 ),
-     $                   SI( KWTOP+I-2 ), SR( KWTOP+I-1 ),
-     $                   SI( KWTOP+I-1 ), CS, SN )
-            I = I - 2
-         END IF
-         GO TO 60
-      END IF
-*
-      IF( NS.LT.JW .OR. S.EQ.ZERO ) THEN
-         IF( NS.GT.1 .AND. S.NE.ZERO ) THEN
-*
-*           ==== Reflect spike back into lower triangle ====
-*
-            CALL DCOPY( NS, V, LDV, WORK, 1 )
-            BETA = WORK( 1 )
-            CALL DLARFG( NS, BETA, WORK( 2 ), 1, TAU )
-            WORK( 1 ) = ONE
-*
-            CALL DLASET( 'L', JW-2, JW-2, ZERO, ZERO, T( 3, 1 ), LDT )
-*
-            CALL DLARF( 'L', NS, JW, WORK, 1, TAU, T, LDT,
-     $                  WORK( JW+1 ) )
-            CALL DLARF( 'R', NS, NS, WORK, 1, TAU, T, LDT,
-     $                  WORK( JW+1 ) )
-            CALL DLARF( 'R', JW, NS, WORK, 1, TAU, V, LDV,
-     $                  WORK( JW+1 ) )
-*
-            CALL DGEHRD( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
-     $                   LWORK-JW, INFO )
-         END IF
-*
-*        ==== Copy updated reduced window into place ====
-*
-         IF( KWTOP.GT.1 )
-     $      H( KWTOP, KWTOP-1 ) = S*V( 1, 1 )
-         CALL DLACPY( 'U', JW, JW, T, LDT, H( KWTOP, KWTOP ), LDH )
-         CALL DCOPY( JW-1, T( 2, 1 ), LDT+1, H( KWTOP+1, KWTOP ),
-     $               LDH+1 )
-*
-*        ==== Accumulate orthogonal matrix in order update
-*        .    H and Z, if requested.  (A modified version
-*        .    of  DORGHR that accumulates block Householder
-*        .    transformations into V directly might be
-*        .    marginally more efficient than the following.) ====
-*
-         IF( NS.GT.1 .AND. S.NE.ZERO ) THEN
-            CALL DORGHR( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
-     $                   LWORK-JW, INFO )
-            CALL DGEMM( 'N', 'N', JW, NS, NS, ONE, V, LDV, T, LDT, ZERO,
-     $                  WV, LDWV )
-            CALL DLACPY( 'A', JW, NS, WV, LDWV, V, LDV )
-         END IF
-*
-*        ==== Update vertical slab in H ====
-*
-         IF( WANTT ) THEN
-            LTOP = 1
-         ELSE
-            LTOP = KTOP
-         END IF
-         DO 70 KROW = LTOP, KWTOP - 1, NV
-            KLN = MIN( NV, KWTOP-KROW )
-            CALL DGEMM( 'N', 'N', KLN, JW, JW, ONE, H( KROW, KWTOP ),
-     $                  LDH, V, LDV, ZERO, WV, LDWV )
-            CALL DLACPY( 'A', KLN, JW, WV, LDWV, H( KROW, KWTOP ), LDH )
-   70    CONTINUE
-*
-*        ==== Update horizontal slab in H ====
-*
-         IF( WANTT ) THEN
-            DO 80 KCOL = KBOT + 1, N, NH
-               KLN = MIN( NH, N-KCOL+1 )
-               CALL DGEMM( 'C', 'N', JW, KLN, JW, ONE, V, LDV,
-     $                     H( KWTOP, KCOL ), LDH, ZERO, T, LDT )
-               CALL DLACPY( 'A', JW, KLN, T, LDT, H( KWTOP, KCOL ),
-     $                      LDH )
-   80       CONTINUE
-         END IF
-*
-*        ==== Update vertical slab in Z ====
-*
-         IF( WANTZ ) THEN
-            DO 90 KROW = ILOZ, IHIZ, NV
-               KLN = MIN( NV, IHIZ-KROW+1 )
-               CALL DGEMM( 'N', 'N', KLN, JW, JW, ONE, Z( KROW, KWTOP ),
-     $                     LDZ, V, LDV, ZERO, WV, LDWV )
-               CALL DLACPY( 'A', KLN, JW, WV, LDWV, Z( KROW, KWTOP ),
-     $                      LDZ )
-   90       CONTINUE
-         END IF
-      END IF
-*
-*     ==== Return the number of deflations ... ====
-*
-      ND = JW - NS
-*
-*     ==== ... and the number of shifts. (Subtracting
-*     .    INFQR from the spike length takes care
-*     .    of the case of a rare QR failure while
-*     .    calculating eigenvalues of the deflation
-*     .    window.)  ====
-*
-      NS = NS - INFQR
-*
-*      ==== Return optimal workspace. ====
-*
-      WORK( 1 ) = DBLE( LWKOPT )
-*
-*     ==== End of DLAQR3 ====
-*
-      END
--- a/libcruft/lapack/dlaqr4.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,640 +0,0 @@
-      SUBROUTINE DLAQR4( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI,
-     $                   ILOZ, IHIZ, Z, LDZ, WORK, LWORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, LWORK, N
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   H( LDH, * ), WI( * ), WORK( * ), WR( * ),
-     $                   Z( LDZ, * )
-*     ..
-*
-*     This subroutine implements one level of recursion for DLAQR0.
-*     It is a complete implementation of the small bulge multi-shift
-*     QR algorithm.  It may be called by DLAQR0 and, for large enough
-*     deflation window size, it may be called by DLAQR3.  This
-*     subroutine is identical to DLAQR0 except that it calls DLAQR2
-*     instead of DLAQR3.
-*
-*     Purpose
-*     =======
-*
-*     DLAQR4 computes the eigenvalues of a Hessenberg matrix H
-*     and, optionally, the matrices T and Z from the Schur decomposition
-*     H = Z T Z**T, where T is an upper quasi-triangular matrix (the
-*     Schur form), and Z is the orthogonal matrix of Schur vectors.
-*
-*     Optionally Z may be postmultiplied into an input orthogonal
-*     matrix Q so that this routine can give the Schur factorization
-*     of a matrix A which has been reduced to the Hessenberg form H
-*     by the orthogonal matrix Q:  A = Q*H*Q**T = (QZ)*T*(QZ)**T.
-*
-*     Arguments
-*     =========
-*
-*     WANTT   (input) LOGICAL
-*          = .TRUE. : the full Schur form T is required;
-*          = .FALSE.: only eigenvalues are required.
-*
-*     WANTZ   (input) LOGICAL
-*          = .TRUE. : the matrix of Schur vectors Z is required;
-*          = .FALSE.: Schur vectors are not required.
-*
-*     N     (input) INTEGER
-*           The order of the matrix H.  N .GE. 0.
-*
-*     ILO   (input) INTEGER
-*     IHI   (input) INTEGER
-*           It is assumed that H is already upper triangular in rows
-*           and columns 1:ILO-1 and IHI+1:N and, if ILO.GT.1,
-*           H(ILO,ILO-1) is zero. ILO and IHI are normally set by a
-*           previous call to DGEBAL, and then passed to DGEHRD when the
-*           matrix output by DGEBAL is reduced to Hessenberg form.
-*           Otherwise, ILO and IHI should be set to 1 and N,
-*           respectively.  If N.GT.0, then 1.LE.ILO.LE.IHI.LE.N.
-*           If N = 0, then ILO = 1 and IHI = 0.
-*
-*     H     (input/output) DOUBLE PRECISION array, dimension (LDH,N)
-*           On entry, the upper Hessenberg matrix H.
-*           On exit, if INFO = 0 and WANTT is .TRUE., then H contains
-*           the upper quasi-triangular matrix T from the Schur
-*           decomposition (the Schur form); 2-by-2 diagonal blocks
-*           (corresponding to complex conjugate pairs of eigenvalues)
-*           are returned in standard form, with H(i,i) = H(i+1,i+1)
-*           and H(i+1,i)*H(i,i+1).LT.0. If INFO = 0 and WANTT is
-*           .FALSE., then the contents of H are unspecified on exit.
-*           (The output value of H when INFO.GT.0 is given under the
-*           description of INFO below.)
-*
-*           This subroutine may explicitly set H(i,j) = 0 for i.GT.j and
-*           j = 1, 2, ... ILO-1 or j = IHI+1, IHI+2, ... N.
-*
-*     LDH   (input) INTEGER
-*           The leading dimension of the array H. LDH .GE. max(1,N).
-*
-*     WR    (output) DOUBLE PRECISION array, dimension (IHI)
-*     WI    (output) DOUBLE PRECISION array, dimension (IHI)
-*           The real and imaginary parts, respectively, of the computed
-*           eigenvalues of H(ILO:IHI,ILO:IHI) are stored WR(ILO:IHI)
-*           and WI(ILO:IHI). If two eigenvalues are computed as a
-*           complex conjugate pair, they are stored in consecutive
-*           elements of WR and WI, say the i-th and (i+1)th, with
-*           WI(i) .GT. 0 and WI(i+1) .LT. 0. If WANTT is .TRUE., then
-*           the eigenvalues are stored in the same order as on the
-*           diagonal of the Schur form returned in H, with
-*           WR(i) = H(i,i) and, if H(i:i+1,i:i+1) is a 2-by-2 diagonal
-*           block, WI(i) = sqrt(-H(i+1,i)*H(i,i+1)) and
-*           WI(i+1) = -WI(i).
-*
-*     ILOZ     (input) INTEGER
-*     IHIZ     (input) INTEGER
-*           Specify the rows of Z to which transformations must be
-*           applied if WANTZ is .TRUE..
-*           1 .LE. ILOZ .LE. ILO; IHI .LE. IHIZ .LE. N.
-*
-*     Z     (input/output) DOUBLE PRECISION array, dimension (LDZ,IHI)
-*           If WANTZ is .FALSE., then Z is not referenced.
-*           If WANTZ is .TRUE., then Z(ILO:IHI,ILOZ:IHIZ) is
-*           replaced by Z(ILO:IHI,ILOZ:IHIZ)*U where U is the
-*           orthogonal Schur factor of H(ILO:IHI,ILO:IHI).
-*           (The output value of Z when INFO.GT.0 is given under
-*           the description of INFO below.)
-*
-*     LDZ   (input) INTEGER
-*           The leading dimension of the array Z.  if WANTZ is .TRUE.
-*           then LDZ.GE.MAX(1,IHIZ).  Otherwize, LDZ.GE.1.
-*
-*     WORK  (workspace/output) DOUBLE PRECISION array, dimension LWORK
-*           On exit, if LWORK = -1, WORK(1) returns an estimate of
-*           the optimal value for LWORK.
-*
-*     LWORK (input) INTEGER
-*           The dimension of the array WORK.  LWORK .GE. max(1,N)
-*           is sufficient, but LWORK typically as large as 6*N may
-*           be required for optimal performance.  A workspace query
-*           to determine the optimal workspace size is recommended.
-*
-*           If LWORK = -1, then DLAQR4 does a workspace query.
-*           In this case, DLAQR4 checks the input parameters and
-*           estimates the optimal workspace size for the given
-*           values of N, ILO and IHI.  The estimate is returned
-*           in WORK(1).  No error message related to LWORK is
-*           issued by XERBLA.  Neither H nor Z are accessed.
-*
-*
-*     INFO  (output) INTEGER
-*             =  0:  successful exit
-*           .GT. 0:  if INFO = i, DLAQR4 failed to compute all of
-*                the eigenvalues.  Elements 1:ilo-1 and i+1:n of WR
-*                and WI contain those eigenvalues which have been
-*                successfully computed.  (Failures are rare.)
-*
-*                If INFO .GT. 0 and WANT is .FALSE., then on exit,
-*                the remaining unconverged eigenvalues are the eigen-
-*                values of the upper Hessenberg matrix rows and
-*                columns ILO through INFO of the final, output
-*                value of H.
-*
-*                If INFO .GT. 0 and WANTT is .TRUE., then on exit
-*
-*           (*)  (initial value of H)*U  = U*(final value of H)
-*
-*                where U is an orthogonal matrix.  The final
-*                value of H is upper Hessenberg and quasi-triangular
-*                in rows and columns INFO+1 through IHI.
-*
-*                If INFO .GT. 0 and WANTZ is .TRUE., then on exit
-*
-*                  (final value of Z(ILO:IHI,ILOZ:IHIZ)
-*                   =  (initial value of Z(ILO:IHI,ILOZ:IHIZ)*U
-*
-*                where U is the orthogonal matrix in (*) (regard-
-*                less of the value of WANTT.)
-*
-*                If INFO .GT. 0 and WANTZ is .FALSE., then Z is not
-*                accessed.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ================================================================
-*     References:
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
-*       Performance, SIAM Journal of Matrix Analysis, volume 23, pages
-*       929--947, 2002.
-*
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part II: Aggressive Early Deflation, SIAM Journal
-*       of Matrix Analysis, volume 23, pages 948--973, 2002.
-*
-*     ================================================================
-*     .. Parameters ..
-*
-*     ==== Matrices of order NTINY or smaller must be processed by
-*     .    DLAHQR because of insufficient subdiagonal scratch space.
-*     .    (This is a hard limit.) ====
-*
-*     ==== Exceptional deflation windows:  try to cure rare
-*     .    slow convergence by increasing the size of the
-*     .    deflation window after KEXNW iterations. =====
-*
-*     ==== Exceptional shifts: try to cure rare slow convergence
-*     .    with ad-hoc exceptional shifts every KEXSH iterations.
-*     .    The constants WILK1 and WILK2 are used to form the
-*     .    exceptional shifts. ====
-*
-      INTEGER            NTINY
-      PARAMETER          ( NTINY = 11 )
-      INTEGER            KEXNW, KEXSH
-      PARAMETER          ( KEXNW = 5, KEXSH = 6 )
-      DOUBLE PRECISION   WILK1, WILK2
-      PARAMETER          ( WILK1 = 0.75d0, WILK2 = -0.4375d0 )
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0d0, ONE = 1.0d0 )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   AA, BB, CC, CS, DD, SN, SS, SWAP
-      INTEGER            I, INF, IT, ITMAX, K, KACC22, KBOT, KDU, KS,
-     $                   KT, KTOP, KU, KV, KWH, KWTOP, KWV, LD, LS,
-     $                   LWKOPT, NDFL, NH, NHO, NIBBLE, NMIN, NS, NSMAX,
-     $                   NSR, NVE, NW, NWMAX, NWR
-      LOGICAL            NWINC, SORTED
-      CHARACTER          JBCMPZ*2
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   ZDUM( 1, 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLACPY, DLAHQR, DLANV2, DLAQR2, DLAQR5
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, INT, MAX, MIN, MOD
-*     ..
-*     .. Executable Statements ..
-      INFO = 0
-*
-*     ==== Quick return for N = 0: nothing to do. ====
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = ONE
-         RETURN
-      END IF
-*
-*     ==== Set up job flags for ILAENV. ====
-*
-      IF( WANTT ) THEN
-         JBCMPZ( 1: 1 ) = 'S'
-      ELSE
-         JBCMPZ( 1: 1 ) = 'E'
-      END IF
-      IF( WANTZ ) THEN
-         JBCMPZ( 2: 2 ) = 'V'
-      ELSE
-         JBCMPZ( 2: 2 ) = 'N'
-      END IF
-*
-*     ==== Tiny matrices must use DLAHQR. ====
-*
-      IF( N.LE.NTINY ) THEN
-*
-*        ==== Estimate optimal workspace. ====
-*
-         LWKOPT = 1
-         IF( LWORK.NE.-1 )
-     $      CALL DLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI,
-     $                   ILOZ, IHIZ, Z, LDZ, INFO )
-      ELSE
-*
-*        ==== Use small bulge multi-shift QR with aggressive early
-*        .    deflation on larger-than-tiny matrices. ====
-*
-*        ==== Hope for the best. ====
-*
-         INFO = 0
-*
-*        ==== NWR = recommended deflation window size.  At this
-*        .    point,  N .GT. NTINY = 11, so there is enough
-*        .    subdiagonal workspace for NWR.GE.2 as required.
-*        .    (In fact, there is enough subdiagonal space for
-*        .    NWR.GE.3.) ====
-*
-         NWR = ILAENV( 13, 'DLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         NWR = MAX( 2, NWR )
-         NWR = MIN( IHI-ILO+1, ( N-1 ) / 3, NWR )
-         NW = NWR
-*
-*        ==== NSR = recommended number of simultaneous shifts.
-*        .    At this point N .GT. NTINY = 11, so there is at
-*        .    enough subdiagonal workspace for NSR to be even
-*        .    and greater than or equal to two as required. ====
-*
-         NSR = ILAENV( 15, 'DLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         NSR = MIN( NSR, ( N+6 ) / 9, IHI-ILO )
-         NSR = MAX( 2, NSR-MOD( NSR, 2 ) )
-*
-*        ==== Estimate optimal workspace ====
-*
-*        ==== Workspace query call to DLAQR2 ====
-*
-         CALL DLAQR2( WANTT, WANTZ, N, ILO, IHI, NWR+1, H, LDH, ILOZ,
-     $                IHIZ, Z, LDZ, LS, LD, WR, WI, H, LDH, N, H, LDH,
-     $                N, H, LDH, WORK, -1 )
-*
-*        ==== Optimal workspace = MAX(DLAQR5, DLAQR2) ====
-*
-         LWKOPT = MAX( 3*NSR / 2, INT( WORK( 1 ) ) )
-*
-*        ==== Quick return in case of workspace query. ====
-*
-         IF( LWORK.EQ.-1 ) THEN
-            WORK( 1 ) = DBLE( LWKOPT )
-            RETURN
-         END IF
-*
-*        ==== DLAHQR/DLAQR0 crossover point ====
-*
-         NMIN = ILAENV( 12, 'DLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         NMIN = MAX( NTINY, NMIN )
-*
-*        ==== Nibble crossover point ====
-*
-         NIBBLE = ILAENV( 14, 'DLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         NIBBLE = MAX( 0, NIBBLE )
-*
-*        ==== Accumulate reflections during ttswp?  Use block
-*        .    2-by-2 structure during matrix-matrix multiply? ====
-*
-         KACC22 = ILAENV( 16, 'DLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         KACC22 = MAX( 0, KACC22 )
-         KACC22 = MIN( 2, KACC22 )
-*
-*        ==== NWMAX = the largest possible deflation window for
-*        .    which there is sufficient workspace. ====
-*
-         NWMAX = MIN( ( N-1 ) / 3, LWORK / 2 )
-*
-*        ==== NSMAX = the Largest number of simultaneous shifts
-*        .    for which there is sufficient workspace. ====
-*
-         NSMAX = MIN( ( N+6 ) / 9, 2*LWORK / 3 )
-         NSMAX = NSMAX - MOD( NSMAX, 2 )
-*
-*        ==== NDFL: an iteration count restarted at deflation. ====
-*
-         NDFL = 1
-*
-*        ==== ITMAX = iteration limit ====
-*
-         ITMAX = MAX( 30, 2*KEXSH )*MAX( 10, ( IHI-ILO+1 ) )
-*
-*        ==== Last row and column in the active block ====
-*
-         KBOT = IHI
-*
-*        ==== Main Loop ====
-*
-         DO 80 IT = 1, ITMAX
-*
-*           ==== Done when KBOT falls below ILO ====
-*
-            IF( KBOT.LT.ILO )
-     $         GO TO 90
-*
-*           ==== Locate active block ====
-*
-            DO 10 K = KBOT, ILO + 1, -1
-               IF( H( K, K-1 ).EQ.ZERO )
-     $            GO TO 20
-   10       CONTINUE
-            K = ILO
-   20       CONTINUE
-            KTOP = K
-*
-*           ==== Select deflation window size ====
-*
-            NH = KBOT - KTOP + 1
-            IF( NDFL.LT.KEXNW .OR. NH.LT.NW ) THEN
-*
-*              ==== Typical deflation window.  If possible and
-*              .    advisable, nibble the entire active block.
-*              .    If not, use size NWR or NWR+1 depending upon
-*              .    which has the smaller corresponding subdiagonal
-*              .    entry (a heuristic). ====
-*
-               NWINC = .TRUE.
-               IF( NH.LE.MIN( NMIN, NWMAX ) ) THEN
-                  NW = NH
-               ELSE
-                  NW = MIN( NWR, NH, NWMAX )
-                  IF( NW.LT.NWMAX ) THEN
-                     IF( NW.GE.NH-1 ) THEN
-                        NW = NH
-                     ELSE
-                        KWTOP = KBOT - NW + 1
-                        IF( ABS( H( KWTOP, KWTOP-1 ) ).GT.
-     $                      ABS( H( KWTOP-1, KWTOP-2 ) ) )NW = NW + 1
-                     END IF
-                  END IF
-               END IF
-            ELSE
-*
-*              ==== Exceptional deflation window.  If there have
-*              .    been no deflations in KEXNW or more iterations,
-*              .    then vary the deflation window size.   At first,
-*              .    because, larger windows are, in general, more
-*              .    powerful than smaller ones, rapidly increase the
-*              .    window up to the maximum reasonable and possible.
-*              .    Then maybe try a slightly smaller window.  ====
-*
-               IF( NWINC .AND. NW.LT.MIN( NWMAX, NH ) ) THEN
-                  NW = MIN( NWMAX, NH, 2*NW )
-               ELSE
-                  NWINC = .FALSE.
-                  IF( NW.EQ.NH .AND. NH.GT.2 )
-     $               NW = NH - 1
-               END IF
-            END IF
-*
-*           ==== Aggressive early deflation:
-*           .    split workspace under the subdiagonal into
-*           .      - an nw-by-nw work array V in the lower
-*           .        left-hand-corner,
-*           .      - an NW-by-at-least-NW-but-more-is-better
-*           .        (NW-by-NHO) horizontal work array along
-*           .        the bottom edge,
-*           .      - an at-least-NW-but-more-is-better (NHV-by-NW)
-*           .        vertical work array along the left-hand-edge.
-*           .        ====
-*
-            KV = N - NW + 1
-            KT = NW + 1
-            NHO = ( N-NW-1 ) - KT + 1
-            KWV = NW + 2
-            NVE = ( N-NW ) - KWV + 1
-*
-*           ==== Aggressive early deflation ====
-*
-            CALL DLAQR2( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
-     $                   IHIZ, Z, LDZ, LS, LD, WR, WI, H( KV, 1 ), LDH,
-     $                   NHO, H( KV, KT ), LDH, NVE, H( KWV, 1 ), LDH,
-     $                   WORK, LWORK )
-*
-*           ==== Adjust KBOT accounting for new deflations. ====
-*
-            KBOT = KBOT - LD
-*
-*           ==== KS points to the shifts. ====
-*
-            KS = KBOT - LS + 1
-*
-*           ==== Skip an expensive QR sweep if there is a (partly
-*           .    heuristic) reason to expect that many eigenvalues
-*           .    will deflate without it.  Here, the QR sweep is
-*           .    skipped if many eigenvalues have just been deflated
-*           .    or if the remaining active block is small.
-*
-            IF( ( LD.EQ.0 ) .OR. ( ( 100*LD.LE.NW*NIBBLE ) .AND. ( KBOT-
-     $          KTOP+1.GT.MIN( NMIN, NWMAX ) ) ) ) THEN
-*
-*              ==== NS = nominal number of simultaneous shifts.
-*              .    This may be lowered (slightly) if DLAQR2
-*              .    did not provide that many shifts. ====
-*
-               NS = MIN( NSMAX, NSR, MAX( 2, KBOT-KTOP ) )
-               NS = NS - MOD( NS, 2 )
-*
-*              ==== If there have been no deflations
-*              .    in a multiple of KEXSH iterations,
-*              .    then try exceptional shifts.
-*              .    Otherwise use shifts provided by
-*              .    DLAQR2 above or from the eigenvalues
-*              .    of a trailing principal submatrix. ====
-*
-               IF( MOD( NDFL, KEXSH ).EQ.0 ) THEN
-                  KS = KBOT - NS + 1
-                  DO 30 I = KBOT, MAX( KS+1, KTOP+2 ), -2
-                     SS = ABS( H( I, I-1 ) ) + ABS( H( I-1, I-2 ) )
-                     AA = WILK1*SS + H( I, I )
-                     BB = SS
-                     CC = WILK2*SS
-                     DD = AA
-                     CALL DLANV2( AA, BB, CC, DD, WR( I-1 ), WI( I-1 ),
-     $                            WR( I ), WI( I ), CS, SN )
-   30             CONTINUE
-                  IF( KS.EQ.KTOP ) THEN
-                     WR( KS+1 ) = H( KS+1, KS+1 )
-                     WI( KS+1 ) = ZERO
-                     WR( KS ) = WR( KS+1 )
-                     WI( KS ) = WI( KS+1 )
-                  END IF
-               ELSE
-*
-*                 ==== Got NS/2 or fewer shifts? Use DLAHQR
-*                 .    on a trailing principal submatrix to
-*                 .    get more. (Since NS.LE.NSMAX.LE.(N+6)/9,
-*                 .    there is enough space below the subdiagonal
-*                 .    to fit an NS-by-NS scratch array.) ====
-*
-                  IF( KBOT-KS+1.LE.NS / 2 ) THEN
-                     KS = KBOT - NS + 1
-                     KT = N - NS + 1
-                     CALL DLACPY( 'A', NS, NS, H( KS, KS ), LDH,
-     $                            H( KT, 1 ), LDH )
-                     CALL DLAHQR( .false., .false., NS, 1, NS,
-     $                            H( KT, 1 ), LDH, WR( KS ), WI( KS ),
-     $                            1, 1, ZDUM, 1, INF )
-                     KS = KS + INF
-*
-*                    ==== In case of a rare QR failure use
-*                    .    eigenvalues of the trailing 2-by-2
-*                    .    principal submatrix.  ====
-*
-                     IF( KS.GE.KBOT ) THEN
-                        AA = H( KBOT-1, KBOT-1 )
-                        CC = H( KBOT, KBOT-1 )
-                        BB = H( KBOT-1, KBOT )
-                        DD = H( KBOT, KBOT )
-                        CALL DLANV2( AA, BB, CC, DD, WR( KBOT-1 ),
-     $                               WI( KBOT-1 ), WR( KBOT ),
-     $                               WI( KBOT ), CS, SN )
-                        KS = KBOT - 1
-                     END IF
-                  END IF
-*
-                  IF( KBOT-KS+1.GT.NS ) THEN
-*
-*                    ==== Sort the shifts (Helps a little)
-*                    .    Bubble sort keeps complex conjugate
-*                    .    pairs together. ====
-*
-                     SORTED = .false.
-                     DO 50 K = KBOT, KS + 1, -1
-                        IF( SORTED )
-     $                     GO TO 60
-                        SORTED = .true.
-                        DO 40 I = KS, K - 1
-                           IF( ABS( WR( I ) )+ABS( WI( I ) ).LT.
-     $                         ABS( WR( I+1 ) )+ABS( WI( I+1 ) ) ) THEN
-                              SORTED = .false.
-*
-                              SWAP = WR( I )
-                              WR( I ) = WR( I+1 )
-                              WR( I+1 ) = SWAP
-*
-                              SWAP = WI( I )
-                              WI( I ) = WI( I+1 )
-                              WI( I+1 ) = SWAP
-                           END IF
-   40                   CONTINUE
-   50                CONTINUE
-   60                CONTINUE
-                  END IF
-*
-*                 ==== Shuffle shifts into pairs of real shifts
-*                 .    and pairs of complex conjugate shifts
-*                 .    assuming complex conjugate shifts are
-*                 .    already adjacent to one another. (Yes,
-*                 .    they are.)  ====
-*
-                  DO 70 I = KBOT, KS + 2, -2
-                     IF( WI( I ).NE.-WI( I-1 ) ) THEN
-*
-                        SWAP = WR( I )
-                        WR( I ) = WR( I-1 )
-                        WR( I-1 ) = WR( I-2 )
-                        WR( I-2 ) = SWAP
-*
-                        SWAP = WI( I )
-                        WI( I ) = WI( I-1 )
-                        WI( I-1 ) = WI( I-2 )
-                        WI( I-2 ) = SWAP
-                     END IF
-   70             CONTINUE
-               END IF
-*
-*              ==== If there are only two shifts and both are
-*              .    real, then use only one.  ====
-*
-               IF( KBOT-KS+1.EQ.2 ) THEN
-                  IF( WI( KBOT ).EQ.ZERO ) THEN
-                     IF( ABS( WR( KBOT )-H( KBOT, KBOT ) ).LT.
-     $                   ABS( WR( KBOT-1 )-H( KBOT, KBOT ) ) ) THEN
-                        WR( KBOT-1 ) = WR( KBOT )
-                     ELSE
-                        WR( KBOT ) = WR( KBOT-1 )
-                     END IF
-                  END IF
-               END IF
-*
-*              ==== Use up to NS of the the smallest magnatiude
-*              .    shifts.  If there aren't NS shifts available,
-*              .    then use them all, possibly dropping one to
-*              .    make the number of shifts even. ====
-*
-               NS = MIN( NS, KBOT-KS+1 )
-               NS = NS - MOD( NS, 2 )
-               KS = KBOT - NS + 1
-*
-*              ==== Small-bulge multi-shift QR sweep:
-*              .    split workspace under the subdiagonal into
-*              .    - a KDU-by-KDU work array U in the lower
-*              .      left-hand-corner,
-*              .    - a KDU-by-at-least-KDU-but-more-is-better
-*              .      (KDU-by-NHo) horizontal work array WH along
-*              .      the bottom edge,
-*              .    - and an at-least-KDU-but-more-is-better-by-KDU
-*              .      (NVE-by-KDU) vertical work WV arrow along
-*              .      the left-hand-edge. ====
-*
-               KDU = 3*NS - 3
-               KU = N - KDU + 1
-               KWH = KDU + 1
-               NHO = ( N-KDU+1-4 ) - ( KDU+1 ) + 1
-               KWV = KDU + 4
-               NVE = N - KDU - KWV + 1
-*
-*              ==== Small-bulge multi-shift QR sweep ====
-*
-               CALL DLAQR5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NS,
-     $                      WR( KS ), WI( KS ), H, LDH, ILOZ, IHIZ, Z,
-     $                      LDZ, WORK, 3, H( KU, 1 ), LDH, NVE,
-     $                      H( KWV, 1 ), LDH, NHO, H( KU, KWH ), LDH )
-            END IF
-*
-*           ==== Note progress (or the lack of it). ====
-*
-            IF( LD.GT.0 ) THEN
-               NDFL = 1
-            ELSE
-               NDFL = NDFL + 1
-            END IF
-*
-*           ==== End of main loop ====
-   80    CONTINUE
-*
-*        ==== Iteration limit exceeded.  Set INFO to show where
-*        .    the problem occurred and exit. ====
-*
-         INFO = KBOT
-   90    CONTINUE
-      END IF
-*
-*     ==== Return the optimal value of LWORK. ====
-*
-      WORK( 1 ) = DBLE( LWKOPT )
-*
-*     ==== End of DLAQR4 ====
-*
-      END
--- a/libcruft/lapack/dlaqr5.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,812 +0,0 @@
-      SUBROUTINE DLAQR5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NSHFTS,
-     $                   SR, SI, H, LDH, ILOZ, IHIZ, Z, LDZ, V, LDV, U,
-     $                   LDU, NV, WV, LDWV, NH, WH, LDWH )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHIZ, ILOZ, KACC22, KBOT, KTOP, LDH, LDU, LDV,
-     $                   LDWH, LDWV, LDZ, N, NH, NSHFTS, NV
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   H( LDH, * ), SI( * ), SR( * ), U( LDU, * ),
-     $                   V( LDV, * ), WH( LDWH, * ), WV( LDWV, * ),
-     $                   Z( LDZ, * )
-*     ..
-*
-*     This auxiliary subroutine called by DLAQR0 performs a
-*     single small-bulge multi-shift QR sweep.
-*
-*      WANTT  (input) logical scalar
-*             WANTT = .true. if the quasi-triangular Schur factor
-*             is being computed.  WANTT is set to .false. otherwise.
-*
-*      WANTZ  (input) logical scalar
-*             WANTZ = .true. if the orthogonal Schur factor is being
-*             computed.  WANTZ is set to .false. otherwise.
-*
-*      KACC22 (input) integer with value 0, 1, or 2.
-*             Specifies the computation mode of far-from-diagonal
-*             orthogonal updates.
-*        = 0: DLAQR5 does not accumulate reflections and does not
-*             use matrix-matrix multiply to update far-from-diagonal
-*             matrix entries.
-*        = 1: DLAQR5 accumulates reflections and uses matrix-matrix
-*             multiply to update the far-from-diagonal matrix entries.
-*        = 2: DLAQR5 accumulates reflections, uses matrix-matrix
-*             multiply to update the far-from-diagonal matrix entries,
-*             and takes advantage of 2-by-2 block structure during
-*             matrix multiplies.
-*
-*      N      (input) integer scalar
-*             N is the order of the Hessenberg matrix H upon which this
-*             subroutine operates.
-*
-*      KTOP   (input) integer scalar
-*      KBOT   (input) integer scalar
-*             These are the first and last rows and columns of an
-*             isolated diagonal block upon which the QR sweep is to be
-*             applied. It is assumed without a check that
-*                       either KTOP = 1  or   H(KTOP,KTOP-1) = 0
-*             and
-*                       either KBOT = N  or   H(KBOT+1,KBOT) = 0.
-*
-*      NSHFTS (input) integer scalar
-*             NSHFTS gives the number of simultaneous shifts.  NSHFTS
-*             must be positive and even.
-*
-*      SR     (input) DOUBLE PRECISION array of size (NSHFTS)
-*      SI     (input) DOUBLE PRECISION array of size (NSHFTS)
-*             SR contains the real parts and SI contains the imaginary
-*             parts of the NSHFTS shifts of origin that define the
-*             multi-shift QR sweep.
-*
-*      H      (input/output) DOUBLE PRECISION array of size (LDH,N)
-*             On input H contains a Hessenberg matrix.  On output a
-*             multi-shift QR sweep with shifts SR(J)+i*SI(J) is applied
-*             to the isolated diagonal block in rows and columns KTOP
-*             through KBOT.
-*
-*      LDH    (input) integer scalar
-*             LDH is the leading dimension of H just as declared in the
-*             calling procedure.  LDH.GE.MAX(1,N).
-*
-*      ILOZ   (input) INTEGER
-*      IHIZ   (input) INTEGER
-*             Specify the rows of Z to which transformations must be
-*             applied if WANTZ is .TRUE.. 1 .LE. ILOZ .LE. IHIZ .LE. N
-*
-*      Z      (input/output) DOUBLE PRECISION array of size (LDZ,IHI)
-*             If WANTZ = .TRUE., then the QR Sweep orthogonal
-*             similarity transformation is accumulated into
-*             Z(ILOZ:IHIZ,ILO:IHI) from the right.
-*             If WANTZ = .FALSE., then Z is unreferenced.
-*
-*      LDZ    (input) integer scalar
-*             LDA is the leading dimension of Z just as declared in
-*             the calling procedure. LDZ.GE.N.
-*
-*      V      (workspace) DOUBLE PRECISION array of size (LDV,NSHFTS/2)
-*
-*      LDV    (input) integer scalar
-*             LDV is the leading dimension of V as declared in the
-*             calling procedure.  LDV.GE.3.
-*
-*      U      (workspace) DOUBLE PRECISION array of size
-*             (LDU,3*NSHFTS-3)
-*
-*      LDU    (input) integer scalar
-*             LDU is the leading dimension of U just as declared in the
-*             in the calling subroutine.  LDU.GE.3*NSHFTS-3.
-*
-*      NH     (input) integer scalar
-*             NH is the number of columns in array WH available for
-*             workspace. NH.GE.1.
-*
-*      WH     (workspace) DOUBLE PRECISION array of size (LDWH,NH)
-*
-*      LDWH   (input) integer scalar
-*             Leading dimension of WH just as declared in the
-*             calling procedure.  LDWH.GE.3*NSHFTS-3.
-*
-*      NV     (input) integer scalar
-*             NV is the number of rows in WV agailable for workspace.
-*             NV.GE.1.
-*
-*      WV     (workspace) DOUBLE PRECISION array of size
-*             (LDWV,3*NSHFTS-3)
-*
-*      LDWV   (input) integer scalar
-*             LDWV is the leading dimension of WV as declared in the
-*             in the calling subroutine.  LDWV.GE.NV.
-*
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ============================================================
-*     Reference:
-*
-*     K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*     Algorithm Part I: Maintaining Well Focused Shifts, and
-*     Level 3 Performance, SIAM Journal of Matrix Analysis,
-*     volume 23, pages 929--947, 2002.
-*
-*     ============================================================
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0d0, ONE = 1.0d0 )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   ALPHA, BETA, H11, H12, H21, H22, REFSUM,
-     $                   SAFMAX, SAFMIN, SCL, SMLNUM, SWAP, TST1, TST2,
-     $                   ULP
-      INTEGER            I, I2, I4, INCOL, J, J2, J4, JBOT, JCOL, JLEN,
-     $                   JROW, JTOP, K, K1, KDU, KMS, KNZ, KRCOL, KZS,
-     $                   M, M22, MBOT, MEND, MSTART, MTOP, NBMPS, NDCOL,
-     $                   NS, NU
-      LOGICAL            ACCUM, BLK22, BMP22
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           DLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-*
-      INTRINSIC          ABS, DBLE, MAX, MIN, MOD
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   VT( 3 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMM, DLABAD, DLACPY, DLAQR1, DLARFG, DLASET,
-     $                   DTRMM
-*     ..
-*     .. Executable Statements ..
-*
-*     ==== If there are no shifts, then there is nothing to do. ====
-*
-      IF( NSHFTS.LT.2 )
-     $   RETURN
-*
-*     ==== If the active block is empty or 1-by-1, then there
-*     .    is nothing to do. ====
-*
-      IF( KTOP.GE.KBOT )
-     $   RETURN
-*
-*     ==== Shuffle shifts into pairs of real shifts and pairs
-*     .    of complex conjugate shifts assuming complex
-*     .    conjugate shifts are already adjacent to one
-*     .    another. ====
-*
-      DO 10 I = 1, NSHFTS - 2, 2
-         IF( SI( I ).NE.-SI( I+1 ) ) THEN
-*
-            SWAP = SR( I )
-            SR( I ) = SR( I+1 )
-            SR( I+1 ) = SR( I+2 )
-            SR( I+2 ) = SWAP
-*
-            SWAP = SI( I )
-            SI( I ) = SI( I+1 )
-            SI( I+1 ) = SI( I+2 )
-            SI( I+2 ) = SWAP
-         END IF
-   10 CONTINUE
-*
-*     ==== NSHFTS is supposed to be even, but if is odd,
-*     .    then simply reduce it by one.  The shuffle above
-*     .    ensures that the dropped shift is real and that
-*     .    the remaining shifts are paired. ====
-*
-      NS = NSHFTS - MOD( NSHFTS, 2 )
-*
-*     ==== Machine constants for deflation ====
-*
-      SAFMIN = DLAMCH( 'SAFE MINIMUM' )
-      SAFMAX = ONE / SAFMIN
-      CALL DLABAD( SAFMIN, SAFMAX )
-      ULP = DLAMCH( 'PRECISION' )
-      SMLNUM = SAFMIN*( DBLE( N ) / ULP )
-*
-*     ==== Use accumulated reflections to update far-from-diagonal
-*     .    entries ? ====
-*
-      ACCUM = ( KACC22.EQ.1 ) .OR. ( KACC22.EQ.2 )
-*
-*     ==== If so, exploit the 2-by-2 block structure? ====
-*
-      BLK22 = ( NS.GT.2 ) .AND. ( KACC22.EQ.2 )
-*
-*     ==== clear trash ====
-*
-      IF( KTOP+2.LE.KBOT )
-     $   H( KTOP+2, KTOP ) = ZERO
-*
-*     ==== NBMPS = number of 2-shift bulges in the chain ====
-*
-      NBMPS = NS / 2
-*
-*     ==== KDU = width of slab ====
-*
-      KDU = 6*NBMPS - 3
-*
-*     ==== Create and chase chains of NBMPS bulges ====
-*
-      DO 220 INCOL = 3*( 1-NBMPS ) + KTOP - 1, KBOT - 2, 3*NBMPS - 2
-         NDCOL = INCOL + KDU
-         IF( ACCUM )
-     $      CALL DLASET( 'ALL', KDU, KDU, ZERO, ONE, U, LDU )
-*
-*        ==== Near-the-diagonal bulge chase.  The following loop
-*        .    performs the near-the-diagonal part of a small bulge
-*        .    multi-shift QR sweep.  Each 6*NBMPS-2 column diagonal
-*        .    chunk extends from column INCOL to column NDCOL
-*        .    (including both column INCOL and column NDCOL). The
-*        .    following loop chases a 3*NBMPS column long chain of
-*        .    NBMPS bulges 3*NBMPS-2 columns to the right.  (INCOL
-*        .    may be less than KTOP and and NDCOL may be greater than
-*        .    KBOT indicating phantom columns from which to chase
-*        .    bulges before they are actually introduced or to which
-*        .    to chase bulges beyond column KBOT.)  ====
-*
-         DO 150 KRCOL = INCOL, MIN( INCOL+3*NBMPS-3, KBOT-2 )
-*
-*           ==== Bulges number MTOP to MBOT are active double implicit
-*           .    shift bulges.  There may or may not also be small
-*           .    2-by-2 bulge, if there is room.  The inactive bulges
-*           .    (if any) must wait until the active bulges have moved
-*           .    down the diagonal to make room.  The phantom matrix
-*           .    paradigm described above helps keep track.  ====
-*
-            MTOP = MAX( 1, ( ( KTOP-1 )-KRCOL+2 ) / 3+1 )
-            MBOT = MIN( NBMPS, ( KBOT-KRCOL ) / 3 )
-            M22 = MBOT + 1
-            BMP22 = ( MBOT.LT.NBMPS ) .AND. ( KRCOL+3*( M22-1 ) ).EQ.
-     $              ( KBOT-2 )
-*
-*           ==== Generate reflections to chase the chain right
-*           .    one column.  (The minimum value of K is KTOP-1.) ====
-*
-            DO 20 M = MTOP, MBOT
-               K = KRCOL + 3*( M-1 )
-               IF( K.EQ.KTOP-1 ) THEN
-                  CALL DLAQR1( 3, H( KTOP, KTOP ), LDH, SR( 2*M-1 ),
-     $                         SI( 2*M-1 ), SR( 2*M ), SI( 2*M ),
-     $                         V( 1, M ) )
-                  ALPHA = V( 1, M )
-                  CALL DLARFG( 3, ALPHA, V( 2, M ), 1, V( 1, M ) )
-               ELSE
-                  BETA = H( K+1, K )
-                  V( 2, M ) = H( K+2, K )
-                  V( 3, M ) = H( K+3, K )
-                  CALL DLARFG( 3, BETA, V( 2, M ), 1, V( 1, M ) )
-*
-*                 ==== A Bulge may collapse because of vigilant
-*                 .    deflation or destructive underflow.  (The
-*                 .    initial bulge is always collapsed.) Use
-*                 .    the two-small-subdiagonals trick to try
-*                 .    to get it started again. If V(2,M).NE.0 and
-*                 .    V(3,M) = H(K+3,K+1) = H(K+3,K+2) = 0, then
-*                 .    this bulge is collapsing into a zero
-*                 .    subdiagonal.  It will be restarted next
-*                 .    trip through the loop.)
-*
-                  IF( V( 1, M ).NE.ZERO .AND.
-     $                ( V( 3, M ).NE.ZERO .OR. ( H( K+3,
-     $                K+1 ).EQ.ZERO .AND. H( K+3, K+2 ).EQ.ZERO ) ) )
-     $                 THEN
-*
-*                    ==== Typical case: not collapsed (yet). ====
-*
-                     H( K+1, K ) = BETA
-                     H( K+2, K ) = ZERO
-                     H( K+3, K ) = ZERO
-                  ELSE
-*
-*                    ==== Atypical case: collapsed.  Attempt to
-*                    .    reintroduce ignoring H(K+1,K).  If the
-*                    .    fill resulting from the new reflector
-*                    .    is too large, then abandon it.
-*                    .    Otherwise, use the new one. ====
-*
-                     CALL DLAQR1( 3, H( K+1, K+1 ), LDH, SR( 2*M-1 ),
-     $                            SI( 2*M-1 ), SR( 2*M ), SI( 2*M ),
-     $                            VT )
-                     SCL = ABS( VT( 1 ) ) + ABS( VT( 2 ) ) +
-     $                     ABS( VT( 3 ) )
-                     IF( SCL.NE.ZERO ) THEN
-                        VT( 1 ) = VT( 1 ) / SCL
-                        VT( 2 ) = VT( 2 ) / SCL
-                        VT( 3 ) = VT( 3 ) / SCL
-                     END IF
-*
-*                    ==== The following is the traditional and
-*                    .    conservative two-small-subdiagonals
-*                    .    test.  ====
-*                    .
-                     IF( ABS( H( K+1, K ) )*( ABS( VT( 2 ) )+
-     $                   ABS( VT( 3 ) ) ).GT.ULP*ABS( VT( 1 ) )*
-     $                   ( ABS( H( K, K ) )+ABS( H( K+1,
-     $                   K+1 ) )+ABS( H( K+2, K+2 ) ) ) ) THEN
-*
-*                       ==== Starting a new bulge here would
-*                       .    create non-negligible fill.   If
-*                       .    the old reflector is diagonal (only
-*                       .    possible with underflows), then
-*                       .    change it to I.  Otherwise, use
-*                       .    it with trepidation. ====
-*
-                        IF( V( 2, M ).EQ.ZERO .AND. V( 3, M ).EQ.ZERO )
-     $                       THEN
-                           V( 1, M ) = ZERO
-                        ELSE
-                           H( K+1, K ) = BETA
-                           H( K+2, K ) = ZERO
-                           H( K+3, K ) = ZERO
-                        END IF
-                     ELSE
-*
-*                       ==== Stating a new bulge here would
-*                       .    create only negligible fill.
-*                       .    Replace the old reflector with
-*                       .    the new one. ====
-*
-                        ALPHA = VT( 1 )
-                        CALL DLARFG( 3, ALPHA, VT( 2 ), 1, VT( 1 ) )
-                        REFSUM = H( K+1, K ) + H( K+2, K )*VT( 2 ) +
-     $                           H( K+3, K )*VT( 3 )
-                        H( K+1, K ) = H( K+1, K ) - VT( 1 )*REFSUM
-                        H( K+2, K ) = ZERO
-                        H( K+3, K ) = ZERO
-                        V( 1, M ) = VT( 1 )
-                        V( 2, M ) = VT( 2 )
-                        V( 3, M ) = VT( 3 )
-                     END IF
-                  END IF
-               END IF
-   20       CONTINUE
-*
-*           ==== Generate a 2-by-2 reflection, if needed. ====
-*
-            K = KRCOL + 3*( M22-1 )
-            IF( BMP22 ) THEN
-               IF( K.EQ.KTOP-1 ) THEN
-                  CALL DLAQR1( 2, H( K+1, K+1 ), LDH, SR( 2*M22-1 ),
-     $                         SI( 2*M22-1 ), SR( 2*M22 ), SI( 2*M22 ),
-     $                         V( 1, M22 ) )
-                  BETA = V( 1, M22 )
-                  CALL DLARFG( 2, BETA, V( 2, M22 ), 1, V( 1, M22 ) )
-               ELSE
-                  BETA = H( K+1, K )
-                  V( 2, M22 ) = H( K+2, K )
-                  CALL DLARFG( 2, BETA, V( 2, M22 ), 1, V( 1, M22 ) )
-                  H( K+1, K ) = BETA
-                  H( K+2, K ) = ZERO
-               END IF
-            ELSE
-*
-*              ==== Initialize V(1,M22) here to avoid possible undefined
-*              .    variable problems later. ====
-*
-               V( 1, M22 ) = ZERO
-            END IF
-*
-*           ==== Multiply H by reflections from the left ====
-*
-            IF( ACCUM ) THEN
-               JBOT = MIN( NDCOL, KBOT )
-            ELSE IF( WANTT ) THEN
-               JBOT = N
-            ELSE
-               JBOT = KBOT
-            END IF
-            DO 40 J = MAX( KTOP, KRCOL ), JBOT
-               MEND = MIN( MBOT, ( J-KRCOL+2 ) / 3 )
-               DO 30 M = MTOP, MEND
-                  K = KRCOL + 3*( M-1 )
-                  REFSUM = V( 1, M )*( H( K+1, J )+V( 2, M )*
-     $                     H( K+2, J )+V( 3, M )*H( K+3, J ) )
-                  H( K+1, J ) = H( K+1, J ) - REFSUM
-                  H( K+2, J ) = H( K+2, J ) - REFSUM*V( 2, M )
-                  H( K+3, J ) = H( K+3, J ) - REFSUM*V( 3, M )
-   30          CONTINUE
-   40       CONTINUE
-            IF( BMP22 ) THEN
-               K = KRCOL + 3*( M22-1 )
-               DO 50 J = MAX( K+1, KTOP ), JBOT
-                  REFSUM = V( 1, M22 )*( H( K+1, J )+V( 2, M22 )*
-     $                     H( K+2, J ) )
-                  H( K+1, J ) = H( K+1, J ) - REFSUM
-                  H( K+2, J ) = H( K+2, J ) - REFSUM*V( 2, M22 )
-   50          CONTINUE
-            END IF
-*
-*           ==== Multiply H by reflections from the right.
-*           .    Delay filling in the last row until the
-*           .    vigilant deflation check is complete. ====
-*
-            IF( ACCUM ) THEN
-               JTOP = MAX( KTOP, INCOL )
-            ELSE IF( WANTT ) THEN
-               JTOP = 1
-            ELSE
-               JTOP = KTOP
-            END IF
-            DO 90 M = MTOP, MBOT
-               IF( V( 1, M ).NE.ZERO ) THEN
-                  K = KRCOL + 3*( M-1 )
-                  DO 60 J = JTOP, MIN( KBOT, K+3 )
-                     REFSUM = V( 1, M )*( H( J, K+1 )+V( 2, M )*
-     $                        H( J, K+2 )+V( 3, M )*H( J, K+3 ) )
-                     H( J, K+1 ) = H( J, K+1 ) - REFSUM
-                     H( J, K+2 ) = H( J, K+2 ) - REFSUM*V( 2, M )
-                     H( J, K+3 ) = H( J, K+3 ) - REFSUM*V( 3, M )
-   60             CONTINUE
-*
-                  IF( ACCUM ) THEN
-*
-*                    ==== Accumulate U. (If necessary, update Z later
-*                    .    with with an efficient matrix-matrix
-*                    .    multiply.) ====
-*
-                     KMS = K - INCOL
-                     DO 70 J = MAX( 1, KTOP-INCOL ), KDU
-                        REFSUM = V( 1, M )*( U( J, KMS+1 )+V( 2, M )*
-     $                           U( J, KMS+2 )+V( 3, M )*U( J, KMS+3 ) )
-                        U( J, KMS+1 ) = U( J, KMS+1 ) - REFSUM
-                        U( J, KMS+2 ) = U( J, KMS+2 ) - REFSUM*V( 2, M )
-                        U( J, KMS+3 ) = U( J, KMS+3 ) - REFSUM*V( 3, M )
-   70                CONTINUE
-                  ELSE IF( WANTZ ) THEN
-*
-*                    ==== U is not accumulated, so update Z
-*                    .    now by multiplying by reflections
-*                    .    from the right. ====
-*
-                     DO 80 J = ILOZ, IHIZ
-                        REFSUM = V( 1, M )*( Z( J, K+1 )+V( 2, M )*
-     $                           Z( J, K+2 )+V( 3, M )*Z( J, K+3 ) )
-                        Z( J, K+1 ) = Z( J, K+1 ) - REFSUM
-                        Z( J, K+2 ) = Z( J, K+2 ) - REFSUM*V( 2, M )
-                        Z( J, K+3 ) = Z( J, K+3 ) - REFSUM*V( 3, M )
-   80                CONTINUE
-                  END IF
-               END IF
-   90       CONTINUE
-*
-*           ==== Special case: 2-by-2 reflection (if needed) ====
-*
-            K = KRCOL + 3*( M22-1 )
-            IF( BMP22 .AND. ( V( 1, M22 ).NE.ZERO ) ) THEN
-               DO 100 J = JTOP, MIN( KBOT, K+3 )
-                  REFSUM = V( 1, M22 )*( H( J, K+1 )+V( 2, M22 )*
-     $                     H( J, K+2 ) )
-                  H( J, K+1 ) = H( J, K+1 ) - REFSUM
-                  H( J, K+2 ) = H( J, K+2 ) - REFSUM*V( 2, M22 )
-  100          CONTINUE
-*
-               IF( ACCUM ) THEN
-                  KMS = K - INCOL
-                  DO 110 J = MAX( 1, KTOP-INCOL ), KDU
-                     REFSUM = V( 1, M22 )*( U( J, KMS+1 )+V( 2, M22 )*
-     $                        U( J, KMS+2 ) )
-                     U( J, KMS+1 ) = U( J, KMS+1 ) - REFSUM
-                     U( J, KMS+2 ) = U( J, KMS+2 ) - REFSUM*V( 2, M22 )
-  110             CONTINUE
-               ELSE IF( WANTZ ) THEN
-                  DO 120 J = ILOZ, IHIZ
-                     REFSUM = V( 1, M22 )*( Z( J, K+1 )+V( 2, M22 )*
-     $                        Z( J, K+2 ) )
-                     Z( J, K+1 ) = Z( J, K+1 ) - REFSUM
-                     Z( J, K+2 ) = Z( J, K+2 ) - REFSUM*V( 2, M22 )
-  120             CONTINUE
-               END IF
-            END IF
-*
-*           ==== Vigilant deflation check ====
-*
-            MSTART = MTOP
-            IF( KRCOL+3*( MSTART-1 ).LT.KTOP )
-     $         MSTART = MSTART + 1
-            MEND = MBOT
-            IF( BMP22 )
-     $         MEND = MEND + 1
-            IF( KRCOL.EQ.KBOT-2 )
-     $         MEND = MEND + 1
-            DO 130 M = MSTART, MEND
-               K = MIN( KBOT-1, KRCOL+3*( M-1 ) )
-*
-*              ==== The following convergence test requires that
-*              .    the tradition small-compared-to-nearby-diagonals
-*              .    criterion and the Ahues & Tisseur (LAWN 122, 1997)
-*              .    criteria both be satisfied.  The latter improves
-*              .    accuracy in some examples. Falling back on an
-*              .    alternate convergence criterion when TST1 or TST2
-*              .    is zero (as done here) is traditional but probably
-*              .    unnecessary. ====
-*
-               IF( H( K+1, K ).NE.ZERO ) THEN
-                  TST1 = ABS( H( K, K ) ) + ABS( H( K+1, K+1 ) )
-                  IF( TST1.EQ.ZERO ) THEN
-                     IF( K.GE.KTOP+1 )
-     $                  TST1 = TST1 + ABS( H( K, K-1 ) )
-                     IF( K.GE.KTOP+2 )
-     $                  TST1 = TST1 + ABS( H( K, K-2 ) )
-                     IF( K.GE.KTOP+3 )
-     $                  TST1 = TST1 + ABS( H( K, K-3 ) )
-                     IF( K.LE.KBOT-2 )
-     $                  TST1 = TST1 + ABS( H( K+2, K+1 ) )
-                     IF( K.LE.KBOT-3 )
-     $                  TST1 = TST1 + ABS( H( K+3, K+1 ) )
-                     IF( K.LE.KBOT-4 )
-     $                  TST1 = TST1 + ABS( H( K+4, K+1 ) )
-                  END IF
-                  IF( ABS( H( K+1, K ) ).LE.MAX( SMLNUM, ULP*TST1 ) )
-     $                 THEN
-                     H12 = MAX( ABS( H( K+1, K ) ), ABS( H( K, K+1 ) ) )
-                     H21 = MIN( ABS( H( K+1, K ) ), ABS( H( K, K+1 ) ) )
-                     H11 = MAX( ABS( H( K+1, K+1 ) ),
-     $                     ABS( H( K, K )-H( K+1, K+1 ) ) )
-                     H22 = MIN( ABS( H( K+1, K+1 ) ),
-     $                     ABS( H( K, K )-H( K+1, K+1 ) ) )
-                     SCL = H11 + H12
-                     TST2 = H22*( H11 / SCL )
-*
-                     IF( TST2.EQ.ZERO .OR. H21*( H12 / SCL ).LE.
-     $                   MAX( SMLNUM, ULP*TST2 ) )H( K+1, K ) = ZERO
-                  END IF
-               END IF
-  130       CONTINUE
-*
-*           ==== Fill in the last row of each bulge. ====
-*
-            MEND = MIN( NBMPS, ( KBOT-KRCOL-1 ) / 3 )
-            DO 140 M = MTOP, MEND
-               K = KRCOL + 3*( M-1 )
-               REFSUM = V( 1, M )*V( 3, M )*H( K+4, K+3 )
-               H( K+4, K+1 ) = -REFSUM
-               H( K+4, K+2 ) = -REFSUM*V( 2, M )
-               H( K+4, K+3 ) = H( K+4, K+3 ) - REFSUM*V( 3, M )
-  140       CONTINUE
-*
-*           ==== End of near-the-diagonal bulge chase. ====
-*
-  150    CONTINUE
-*
-*        ==== Use U (if accumulated) to update far-from-diagonal
-*        .    entries in H.  If required, use U to update Z as
-*        .    well. ====
-*
-         IF( ACCUM ) THEN
-            IF( WANTT ) THEN
-               JTOP = 1
-               JBOT = N
-            ELSE
-               JTOP = KTOP
-               JBOT = KBOT
-            END IF
-            IF( ( .NOT.BLK22 ) .OR. ( INCOL.LT.KTOP ) .OR.
-     $          ( NDCOL.GT.KBOT ) .OR. ( NS.LE.2 ) ) THEN
-*
-*              ==== Updates not exploiting the 2-by-2 block
-*              .    structure of U.  K1 and NU keep track of
-*              .    the location and size of U in the special
-*              .    cases of introducing bulges and chasing
-*              .    bulges off the bottom.  In these special
-*              .    cases and in case the number of shifts
-*              .    is NS = 2, there is no 2-by-2 block
-*              .    structure to exploit.  ====
-*
-               K1 = MAX( 1, KTOP-INCOL )
-               NU = ( KDU-MAX( 0, NDCOL-KBOT ) ) - K1 + 1
-*
-*              ==== Horizontal Multiply ====
-*
-               DO 160 JCOL = MIN( NDCOL, KBOT ) + 1, JBOT, NH
-                  JLEN = MIN( NH, JBOT-JCOL+1 )
-                  CALL DGEMM( 'C', 'N', NU, JLEN, NU, ONE, U( K1, K1 ),
-     $                        LDU, H( INCOL+K1, JCOL ), LDH, ZERO, WH,
-     $                        LDWH )
-                  CALL DLACPY( 'ALL', NU, JLEN, WH, LDWH,
-     $                         H( INCOL+K1, JCOL ), LDH )
-  160          CONTINUE
-*
-*              ==== Vertical multiply ====
-*
-               DO 170 JROW = JTOP, MAX( KTOP, INCOL ) - 1, NV
-                  JLEN = MIN( NV, MAX( KTOP, INCOL )-JROW )
-                  CALL DGEMM( 'N', 'N', JLEN, NU, NU, ONE,
-     $                        H( JROW, INCOL+K1 ), LDH, U( K1, K1 ),
-     $                        LDU, ZERO, WV, LDWV )
-                  CALL DLACPY( 'ALL', JLEN, NU, WV, LDWV,
-     $                         H( JROW, INCOL+K1 ), LDH )
-  170          CONTINUE
-*
-*              ==== Z multiply (also vertical) ====
-*
-               IF( WANTZ ) THEN
-                  DO 180 JROW = ILOZ, IHIZ, NV
-                     JLEN = MIN( NV, IHIZ-JROW+1 )
-                     CALL DGEMM( 'N', 'N', JLEN, NU, NU, ONE,
-     $                           Z( JROW, INCOL+K1 ), LDZ, U( K1, K1 ),
-     $                           LDU, ZERO, WV, LDWV )
-                     CALL DLACPY( 'ALL', JLEN, NU, WV, LDWV,
-     $                            Z( JROW, INCOL+K1 ), LDZ )
-  180             CONTINUE
-               END IF
-            ELSE
-*
-*              ==== Updates exploiting U's 2-by-2 block structure.
-*              .    (I2, I4, J2, J4 are the last rows and columns
-*              .    of the blocks.) ====
-*
-               I2 = ( KDU+1 ) / 2
-               I4 = KDU
-               J2 = I4 - I2
-               J4 = KDU
-*
-*              ==== KZS and KNZ deal with the band of zeros
-*              .    along the diagonal of one of the triangular
-*              .    blocks. ====
-*
-               KZS = ( J4-J2 ) - ( NS+1 )
-               KNZ = NS + 1
-*
-*              ==== Horizontal multiply ====
-*
-               DO 190 JCOL = MIN( NDCOL, KBOT ) + 1, JBOT, NH
-                  JLEN = MIN( NH, JBOT-JCOL+1 )
-*
-*                 ==== Copy bottom of H to top+KZS of scratch ====
-*                  (The first KZS rows get multiplied by zero.) ====
-*
-                  CALL DLACPY( 'ALL', KNZ, JLEN, H( INCOL+1+J2, JCOL ),
-     $                         LDH, WH( KZS+1, 1 ), LDWH )
-*
-*                 ==== Multiply by U21' ====
-*
-                  CALL DLASET( 'ALL', KZS, JLEN, ZERO, ZERO, WH, LDWH )
-                  CALL DTRMM( 'L', 'U', 'C', 'N', KNZ, JLEN, ONE,
-     $                        U( J2+1, 1+KZS ), LDU, WH( KZS+1, 1 ),
-     $                        LDWH )
-*
-*                 ==== Multiply top of H by U11' ====
-*
-                  CALL DGEMM( 'C', 'N', I2, JLEN, J2, ONE, U, LDU,
-     $                        H( INCOL+1, JCOL ), LDH, ONE, WH, LDWH )
-*
-*                 ==== Copy top of H bottom of WH ====
-*
-                  CALL DLACPY( 'ALL', J2, JLEN, H( INCOL+1, JCOL ), LDH,
-     $                         WH( I2+1, 1 ), LDWH )
-*
-*                 ==== Multiply by U21' ====
-*
-                  CALL DTRMM( 'L', 'L', 'C', 'N', J2, JLEN, ONE,
-     $                        U( 1, I2+1 ), LDU, WH( I2+1, 1 ), LDWH )
-*
-*                 ==== Multiply by U22 ====
-*
-                  CALL DGEMM( 'C', 'N', I4-I2, JLEN, J4-J2, ONE,
-     $                        U( J2+1, I2+1 ), LDU,
-     $                        H( INCOL+1+J2, JCOL ), LDH, ONE,
-     $                        WH( I2+1, 1 ), LDWH )
-*
-*                 ==== Copy it back ====
-*
-                  CALL DLACPY( 'ALL', KDU, JLEN, WH, LDWH,
-     $                         H( INCOL+1, JCOL ), LDH )
-  190          CONTINUE
-*
-*              ==== Vertical multiply ====
-*
-               DO 200 JROW = JTOP, MAX( INCOL, KTOP ) - 1, NV
-                  JLEN = MIN( NV, MAX( INCOL, KTOP )-JROW )
-*
-*                 ==== Copy right of H to scratch (the first KZS
-*                 .    columns get multiplied by zero) ====
-*
-                  CALL DLACPY( 'ALL', JLEN, KNZ, H( JROW, INCOL+1+J2 ),
-     $                         LDH, WV( 1, 1+KZS ), LDWV )
-*
-*                 ==== Multiply by U21 ====
-*
-                  CALL DLASET( 'ALL', JLEN, KZS, ZERO, ZERO, WV, LDWV )
-                  CALL DTRMM( 'R', 'U', 'N', 'N', JLEN, KNZ, ONE,
-     $                        U( J2+1, 1+KZS ), LDU, WV( 1, 1+KZS ),
-     $                        LDWV )
-*
-*                 ==== Multiply by U11 ====
-*
-                  CALL DGEMM( 'N', 'N', JLEN, I2, J2, ONE,
-     $                        H( JROW, INCOL+1 ), LDH, U, LDU, ONE, WV,
-     $                        LDWV )
-*
-*                 ==== Copy left of H to right of scratch ====
-*
-                  CALL DLACPY( 'ALL', JLEN, J2, H( JROW, INCOL+1 ), LDH,
-     $                         WV( 1, 1+I2 ), LDWV )
-*
-*                 ==== Multiply by U21 ====
-*
-                  CALL DTRMM( 'R', 'L', 'N', 'N', JLEN, I4-I2, ONE,
-     $                        U( 1, I2+1 ), LDU, WV( 1, 1+I2 ), LDWV )
-*
-*                 ==== Multiply by U22 ====
-*
-                  CALL DGEMM( 'N', 'N', JLEN, I4-I2, J4-J2, ONE,
-     $                        H( JROW, INCOL+1+J2 ), LDH,
-     $                        U( J2+1, I2+1 ), LDU, ONE, WV( 1, 1+I2 ),
-     $                        LDWV )
-*
-*                 ==== Copy it back ====
-*
-                  CALL DLACPY( 'ALL', JLEN, KDU, WV, LDWV,
-     $                         H( JROW, INCOL+1 ), LDH )
-  200          CONTINUE
-*
-*              ==== Multiply Z (also vertical) ====
-*
-               IF( WANTZ ) THEN
-                  DO 210 JROW = ILOZ, IHIZ, NV
-                     JLEN = MIN( NV, IHIZ-JROW+1 )
-*
-*                    ==== Copy right of Z to left of scratch (first
-*                    .     KZS columns get multiplied by zero) ====
-*
-                     CALL DLACPY( 'ALL', JLEN, KNZ,
-     $                            Z( JROW, INCOL+1+J2 ), LDZ,
-     $                            WV( 1, 1+KZS ), LDWV )
-*
-*                    ==== Multiply by U12 ====
-*
-                     CALL DLASET( 'ALL', JLEN, KZS, ZERO, ZERO, WV,
-     $                            LDWV )
-                     CALL DTRMM( 'R', 'U', 'N', 'N', JLEN, KNZ, ONE,
-     $                           U( J2+1, 1+KZS ), LDU, WV( 1, 1+KZS ),
-     $                           LDWV )
-*
-*                    ==== Multiply by U11 ====
-*
-                     CALL DGEMM( 'N', 'N', JLEN, I2, J2, ONE,
-     $                           Z( JROW, INCOL+1 ), LDZ, U, LDU, ONE,
-     $                           WV, LDWV )
-*
-*                    ==== Copy left of Z to right of scratch ====
-*
-                     CALL DLACPY( 'ALL', JLEN, J2, Z( JROW, INCOL+1 ),
-     $                            LDZ, WV( 1, 1+I2 ), LDWV )
-*
-*                    ==== Multiply by U21 ====
-*
-                     CALL DTRMM( 'R', 'L', 'N', 'N', JLEN, I4-I2, ONE,
-     $                           U( 1, I2+1 ), LDU, WV( 1, 1+I2 ),
-     $                           LDWV )
-*
-*                    ==== Multiply by U22 ====
-*
-                     CALL DGEMM( 'N', 'N', JLEN, I4-I2, J4-J2, ONE,
-     $                           Z( JROW, INCOL+1+J2 ), LDZ,
-     $                           U( J2+1, I2+1 ), LDU, ONE,
-     $                           WV( 1, 1+I2 ), LDWV )
-*
-*                    ==== Copy the result back to Z ====
-*
-                     CALL DLACPY( 'ALL', JLEN, KDU, WV, LDWV,
-     $                            Z( JROW, INCOL+1 ), LDZ )
-  210             CONTINUE
-               END IF
-            END IF
-         END IF
-  220 CONTINUE
-*
-*     ==== End of DLAQR5 ====
-*
-      END
--- a/libcruft/lapack/dlarf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,115 +0,0 @@
-      SUBROUTINE DLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE
-      INTEGER            INCV, LDC, M, N
-      DOUBLE PRECISION   TAU
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   C( LDC, * ), V( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLARF applies a real elementary reflector H to a real m by n matrix
-*  C, from either the left or the right. H is represented in the form
-*
-*        H = I - tau * v * v'
-*
-*  where tau is a real scalar and v is a real vector.
-*
-*  If tau = 0, then H is taken to be the unit matrix.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': form  H * C
-*          = 'R': form  C * H
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  V       (input) DOUBLE PRECISION array, dimension
-*                     (1 + (M-1)*abs(INCV)) if SIDE = 'L'
-*                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R'
-*          The vector v in the representation of H. V is not used if
-*          TAU = 0.
-*
-*  INCV    (input) INTEGER
-*          The increment between elements of v. INCV <> 0.
-*
-*  TAU     (input) DOUBLE PRECISION
-*          The value tau in the representation of H.
-*
-*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
-*          On entry, the m by n matrix C.
-*          On exit, C is overwritten by the matrix H * C if SIDE = 'L',
-*          or C * H if SIDE = 'R'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension
-*                         (N) if SIDE = 'L'
-*                      or (M) if SIDE = 'R'
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMV, DGER
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  H * C
-*
-         IF( TAU.NE.ZERO ) THEN
-*
-*           w := C' * v
-*
-            CALL DGEMV( 'Transpose', M, N, ONE, C, LDC, V, INCV, ZERO,
-     $                  WORK, 1 )
-*
-*           C := C - v * w'
-*
-            CALL DGER( M, N, -TAU, V, INCV, WORK, 1, C, LDC )
-         END IF
-      ELSE
-*
-*        Form  C * H
-*
-         IF( TAU.NE.ZERO ) THEN
-*
-*           w := C * v
-*
-            CALL DGEMV( 'No transpose', M, N, ONE, C, LDC, V, INCV,
-     $                  ZERO, WORK, 1 )
-*
-*           C := C - w * v'
-*
-            CALL DGER( M, N, -TAU, WORK, 1, V, INCV, C, LDC )
-         END IF
-      END IF
-      RETURN
-*
-*     End of DLARF
-*
-      END
--- a/libcruft/lapack/dlarfb.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,587 +0,0 @@
-      SUBROUTINE DLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,
-     $                   T, LDT, C, LDC, WORK, LDWORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, SIDE, STOREV, TRANS
-      INTEGER            K, LDC, LDT, LDV, LDWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   C( LDC, * ), T( LDT, * ), V( LDV, * ),
-     $                   WORK( LDWORK, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLARFB applies a real block reflector H or its transpose H' to a
-*  real m by n matrix C, from either the left or the right.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply H or H' from the Left
-*          = 'R': apply H or H' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply H (No transpose)
-*          = 'T': apply H' (Transpose)
-*
-*  DIRECT  (input) CHARACTER*1
-*          Indicates how H is formed from a product of elementary
-*          reflectors
-*          = 'F': H = H(1) H(2) . . . H(k) (Forward)
-*          = 'B': H = H(k) . . . H(2) H(1) (Backward)
-*
-*  STOREV  (input) CHARACTER*1
-*          Indicates how the vectors which define the elementary
-*          reflectors are stored:
-*          = 'C': Columnwise
-*          = 'R': Rowwise
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  K       (input) INTEGER
-*          The order of the matrix T (= the number of elementary
-*          reflectors whose product defines the block reflector).
-*
-*  V       (input) DOUBLE PRECISION array, dimension
-*                                (LDV,K) if STOREV = 'C'
-*                                (LDV,M) if STOREV = 'R' and SIDE = 'L'
-*                                (LDV,N) if STOREV = 'R' and SIDE = 'R'
-*          The matrix V. See further details.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V.
-*          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M);
-*          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N);
-*          if STOREV = 'R', LDV >= K.
-*
-*  T       (input) DOUBLE PRECISION array, dimension (LDT,K)
-*          The triangular k by k matrix T in the representation of the
-*          block reflector.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= K.
-*
-*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
-*          On entry, the m by n matrix C.
-*          On exit, C is overwritten by H*C or H'*C or C*H or C*H'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDA >= max(1,M).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (LDWORK,K)
-*
-*  LDWORK  (input) INTEGER
-*          The leading dimension of the array WORK.
-*          If SIDE = 'L', LDWORK >= max(1,N);
-*          if SIDE = 'R', LDWORK >= max(1,M).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      CHARACTER          TRANST
-      INTEGER            I, J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DGEMM, DTRMM
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 .OR. N.LE.0 )
-     $   RETURN
-*
-      IF( LSAME( TRANS, 'N' ) ) THEN
-         TRANST = 'T'
-      ELSE
-         TRANST = 'N'
-      END IF
-*
-      IF( LSAME( STOREV, 'C' ) ) THEN
-*
-         IF( LSAME( DIRECT, 'F' ) ) THEN
-*
-*           Let  V =  ( V1 )    (first K rows)
-*                     ( V2 )
-*           where  V1  is unit lower triangular.
-*
-            IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*              Form  H * C  or  H' * C  where  C = ( C1 )
-*                                                  ( C2 )
-*
-*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK)
-*
-*              W := C1'
-*
-               DO 10 J = 1, K
-                  CALL DCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 )
-   10          CONTINUE
-*
-*              W := W * V1
-*
-               CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', N,
-     $                     K, ONE, V, LDV, WORK, LDWORK )
-               IF( M.GT.K ) THEN
-*
-*                 W := W + C2'*V2
-*
-                  CALL DGEMM( 'Transpose', 'No transpose', N, K, M-K,
-     $                        ONE, C( K+1, 1 ), LDC, V( K+1, 1 ), LDV,
-     $                        ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T'  or  W * T
-*
-               CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit', N, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - V * W'
-*
-               IF( M.GT.K ) THEN
-*
-*                 C2 := C2 - V2 * W'
-*
-                  CALL DGEMM( 'No transpose', 'Transpose', M-K, N, K,
-     $                        -ONE, V( K+1, 1 ), LDV, WORK, LDWORK, ONE,
-     $                        C( K+1, 1 ), LDC )
-               END IF
-*
-*              W := W * V1'
-*
-               CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', N, K,
-     $                     ONE, V, LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W'
-*
-               DO 30 J = 1, K
-                  DO 20 I = 1, N
-                     C( J, I ) = C( J, I ) - WORK( I, J )
-   20             CONTINUE
-   30          CONTINUE
-*
-            ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*              Form  C * H  or  C * H'  where  C = ( C1  C2 )
-*
-*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)
-*
-*              W := C1
-*
-               DO 40 J = 1, K
-                  CALL DCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 )
-   40          CONTINUE
-*
-*              W := W * V1
-*
-               CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', M,
-     $                     K, ONE, V, LDV, WORK, LDWORK )
-               IF( N.GT.K ) THEN
-*
-*                 W := W + C2 * V2
-*
-                  CALL DGEMM( 'No transpose', 'No transpose', M, K, N-K,
-     $                        ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV,
-     $                        ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T  or  W * T'
-*
-               CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit', M, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - W * V'
-*
-               IF( N.GT.K ) THEN
-*
-*                 C2 := C2 - W * V2'
-*
-                  CALL DGEMM( 'No transpose', 'Transpose', M, N-K, K,
-     $                        -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, ONE,
-     $                        C( 1, K+1 ), LDC )
-               END IF
-*
-*              W := W * V1'
-*
-               CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', M, K,
-     $                     ONE, V, LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W
-*
-               DO 60 J = 1, K
-                  DO 50 I = 1, M
-                     C( I, J ) = C( I, J ) - WORK( I, J )
-   50             CONTINUE
-   60          CONTINUE
-            END IF
-*
-         ELSE
-*
-*           Let  V =  ( V1 )
-*                     ( V2 )    (last K rows)
-*           where  V2  is unit upper triangular.
-*
-            IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*              Form  H * C  or  H' * C  where  C = ( C1 )
-*                                                  ( C2 )
-*
-*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK)
-*
-*              W := C2'
-*
-               DO 70 J = 1, K
-                  CALL DCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ), 1 )
-   70          CONTINUE
-*
-*              W := W * V2
-*
-               CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', N,
-     $                     K, ONE, V( M-K+1, 1 ), LDV, WORK, LDWORK )
-               IF( M.GT.K ) THEN
-*
-*                 W := W + C1'*V1
-*
-                  CALL DGEMM( 'Transpose', 'No transpose', N, K, M-K,
-     $                        ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T'  or  W * T
-*
-               CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - V * W'
-*
-               IF( M.GT.K ) THEN
-*
-*                 C1 := C1 - V1 * W'
-*
-                  CALL DGEMM( 'No transpose', 'Transpose', M-K, N, K,
-     $                        -ONE, V, LDV, WORK, LDWORK, ONE, C, LDC )
-               END IF
-*
-*              W := W * V2'
-*
-               CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', N, K,
-     $                     ONE, V( M-K+1, 1 ), LDV, WORK, LDWORK )
-*
-*              C2 := C2 - W'
-*
-               DO 90 J = 1, K
-                  DO 80 I = 1, N
-                     C( M-K+J, I ) = C( M-K+J, I ) - WORK( I, J )
-   80             CONTINUE
-   90          CONTINUE
-*
-            ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*              Form  C * H  or  C * H'  where  C = ( C1  C2 )
-*
-*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)
-*
-*              W := C2
-*
-               DO 100 J = 1, K
-                  CALL DCOPY( M, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )
-  100          CONTINUE
-*
-*              W := W * V2
-*
-               CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', M,
-     $                     K, ONE, V( N-K+1, 1 ), LDV, WORK, LDWORK )
-               IF( N.GT.K ) THEN
-*
-*                 W := W + C1 * V1
-*
-                  CALL DGEMM( 'No transpose', 'No transpose', M, K, N-K,
-     $                        ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T  or  W * T'
-*
-               CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - W * V'
-*
-               IF( N.GT.K ) THEN
-*
-*                 C1 := C1 - W * V1'
-*
-                  CALL DGEMM( 'No transpose', 'Transpose', M, N-K, K,
-     $                        -ONE, WORK, LDWORK, V, LDV, ONE, C, LDC )
-               END IF
-*
-*              W := W * V2'
-*
-               CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', M, K,
-     $                     ONE, V( N-K+1, 1 ), LDV, WORK, LDWORK )
-*
-*              C2 := C2 - W
-*
-               DO 120 J = 1, K
-                  DO 110 I = 1, M
-                     C( I, N-K+J ) = C( I, N-K+J ) - WORK( I, J )
-  110             CONTINUE
-  120          CONTINUE
-            END IF
-         END IF
-*
-      ELSE IF( LSAME( STOREV, 'R' ) ) THEN
-*
-         IF( LSAME( DIRECT, 'F' ) ) THEN
-*
-*           Let  V =  ( V1  V2 )    (V1: first K columns)
-*           where  V1  is unit upper triangular.
-*
-            IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*              Form  H * C  or  H' * C  where  C = ( C1 )
-*                                                  ( C2 )
-*
-*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK)
-*
-*              W := C1'
-*
-               DO 130 J = 1, K
-                  CALL DCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 )
-  130          CONTINUE
-*
-*              W := W * V1'
-*
-               CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', N, K,
-     $                     ONE, V, LDV, WORK, LDWORK )
-               IF( M.GT.K ) THEN
-*
-*                 W := W + C2'*V2'
-*
-                  CALL DGEMM( 'Transpose', 'Transpose', N, K, M-K, ONE,
-     $                        C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, ONE,
-     $                        WORK, LDWORK )
-               END IF
-*
-*              W := W * T'  or  W * T
-*
-               CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit', N, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - V' * W'
-*
-               IF( M.GT.K ) THEN
-*
-*                 C2 := C2 - V2' * W'
-*
-                  CALL DGEMM( 'Transpose', 'Transpose', M-K, N, K, -ONE,
-     $                        V( 1, K+1 ), LDV, WORK, LDWORK, ONE,
-     $                        C( K+1, 1 ), LDC )
-               END IF
-*
-*              W := W * V1
-*
-               CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', N,
-     $                     K, ONE, V, LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W'
-*
-               DO 150 J = 1, K
-                  DO 140 I = 1, N
-                     C( J, I ) = C( J, I ) - WORK( I, J )
-  140             CONTINUE
-  150          CONTINUE
-*
-            ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*              Form  C * H  or  C * H'  where  C = ( C1  C2 )
-*
-*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK)
-*
-*              W := C1
-*
-               DO 160 J = 1, K
-                  CALL DCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 )
-  160          CONTINUE
-*
-*              W := W * V1'
-*
-               CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', M, K,
-     $                     ONE, V, LDV, WORK, LDWORK )
-               IF( N.GT.K ) THEN
-*
-*                 W := W + C2 * V2'
-*
-                  CALL DGEMM( 'No transpose', 'Transpose', M, K, N-K,
-     $                        ONE, C( 1, K+1 ), LDC, V( 1, K+1 ), LDV,
-     $                        ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T  or  W * T'
-*
-               CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit', M, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - W * V
-*
-               IF( N.GT.K ) THEN
-*
-*                 C2 := C2 - W * V2
-*
-                  CALL DGEMM( 'No transpose', 'No transpose', M, N-K, K,
-     $                        -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, ONE,
-     $                        C( 1, K+1 ), LDC )
-               END IF
-*
-*              W := W * V1
-*
-               CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', M,
-     $                     K, ONE, V, LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W
-*
-               DO 180 J = 1, K
-                  DO 170 I = 1, M
-                     C( I, J ) = C( I, J ) - WORK( I, J )
-  170             CONTINUE
-  180          CONTINUE
-*
-            END IF
-*
-         ELSE
-*
-*           Let  V =  ( V1  V2 )    (V2: last K columns)
-*           where  V2  is unit lower triangular.
-*
-            IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*              Form  H * C  or  H' * C  where  C = ( C1 )
-*                                                  ( C2 )
-*
-*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK)
-*
-*              W := C2'
-*
-               DO 190 J = 1, K
-                  CALL DCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ), 1 )
-  190          CONTINUE
-*
-*              W := W * V2'
-*
-               CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', N, K,
-     $                     ONE, V( 1, M-K+1 ), LDV, WORK, LDWORK )
-               IF( M.GT.K ) THEN
-*
-*                 W := W + C1'*V1'
-*
-                  CALL DGEMM( 'Transpose', 'Transpose', N, K, M-K, ONE,
-     $                        C, LDC, V, LDV, ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T'  or  W * T
-*
-               CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - V' * W'
-*
-               IF( M.GT.K ) THEN
-*
-*                 C1 := C1 - V1' * W'
-*
-                  CALL DGEMM( 'Transpose', 'Transpose', M-K, N, K, -ONE,
-     $                        V, LDV, WORK, LDWORK, ONE, C, LDC )
-               END IF
-*
-*              W := W * V2
-*
-               CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', N,
-     $                     K, ONE, V( 1, M-K+1 ), LDV, WORK, LDWORK )
-*
-*              C2 := C2 - W'
-*
-               DO 210 J = 1, K
-                  DO 200 I = 1, N
-                     C( M-K+J, I ) = C( M-K+J, I ) - WORK( I, J )
-  200             CONTINUE
-  210          CONTINUE
-*
-            ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*              Form  C * H  or  C * H'  where  C = ( C1  C2 )
-*
-*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK)
-*
-*              W := C2
-*
-               DO 220 J = 1, K
-                  CALL DCOPY( M, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )
-  220          CONTINUE
-*
-*              W := W * V2'
-*
-               CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', M, K,
-     $                     ONE, V( 1, N-K+1 ), LDV, WORK, LDWORK )
-               IF( N.GT.K ) THEN
-*
-*                 W := W + C1 * V1'
-*
-                  CALL DGEMM( 'No transpose', 'Transpose', M, K, N-K,
-     $                        ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T  or  W * T'
-*
-               CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - W * V
-*
-               IF( N.GT.K ) THEN
-*
-*                 C1 := C1 - W * V1
-*
-                  CALL DGEMM( 'No transpose', 'No transpose', M, N-K, K,
-     $                        -ONE, WORK, LDWORK, V, LDV, ONE, C, LDC )
-               END IF
-*
-*              W := W * V2
-*
-               CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', M,
-     $                     K, ONE, V( 1, N-K+1 ), LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W
-*
-               DO 240 J = 1, K
-                  DO 230 I = 1, M
-                     C( I, N-K+J ) = C( I, N-K+J ) - WORK( I, J )
-  230             CONTINUE
-  240          CONTINUE
-*
-            END IF
-*
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DLARFB
-*
-      END
--- a/libcruft/lapack/dlarfg.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,137 +0,0 @@
-      SUBROUTINE DLARFG( N, ALPHA, X, INCX, TAU )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-      DOUBLE PRECISION   ALPHA, TAU
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLARFG generates a real elementary reflector H of order n, such
-*  that
-*
-*        H * ( alpha ) = ( beta ),   H' * H = I.
-*            (   x   )   (   0  )
-*
-*  where alpha and beta are scalars, and x is an (n-1)-element real
-*  vector. H is represented in the form
-*
-*        H = I - tau * ( 1 ) * ( 1 v' ) ,
-*                      ( v )
-*
-*  where tau is a real scalar and v is a real (n-1)-element
-*  vector.
-*
-*  If the elements of x are all zero, then tau = 0 and H is taken to be
-*  the unit matrix.
-*
-*  Otherwise  1 <= tau <= 2.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the elementary reflector.
-*
-*  ALPHA   (input/output) DOUBLE PRECISION
-*          On entry, the value alpha.
-*          On exit, it is overwritten with the value beta.
-*
-*  X       (input/output) DOUBLE PRECISION array, dimension
-*                         (1+(N-2)*abs(INCX))
-*          On entry, the vector x.
-*          On exit, it is overwritten with the vector v.
-*
-*  INCX    (input) INTEGER
-*          The increment between elements of X. INCX > 0.
-*
-*  TAU     (output) DOUBLE PRECISION
-*          The value tau.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            J, KNT
-      DOUBLE PRECISION   BETA, RSAFMN, SAFMIN, XNORM
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH, DLAPY2, DNRM2
-      EXTERNAL           DLAMCH, DLAPY2, DNRM2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, SIGN
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DSCAL
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.LE.1 ) THEN
-         TAU = ZERO
-         RETURN
-      END IF
-*
-      XNORM = DNRM2( N-1, X, INCX )
-*
-      IF( XNORM.EQ.ZERO ) THEN
-*
-*        H  =  I
-*
-         TAU = ZERO
-      ELSE
-*
-*        general case
-*
-         BETA = -SIGN( DLAPY2( ALPHA, XNORM ), ALPHA )
-         SAFMIN = DLAMCH( 'S' ) / DLAMCH( 'E' )
-         IF( ABS( BETA ).LT.SAFMIN ) THEN
-*
-*           XNORM, BETA may be inaccurate; scale X and recompute them
-*
-            RSAFMN = ONE / SAFMIN
-            KNT = 0
-   10       CONTINUE
-            KNT = KNT + 1
-            CALL DSCAL( N-1, RSAFMN, X, INCX )
-            BETA = BETA*RSAFMN
-            ALPHA = ALPHA*RSAFMN
-            IF( ABS( BETA ).LT.SAFMIN )
-     $         GO TO 10
-*
-*           New BETA is at most 1, at least SAFMIN
-*
-            XNORM = DNRM2( N-1, X, INCX )
-            BETA = -SIGN( DLAPY2( ALPHA, XNORM ), ALPHA )
-            TAU = ( BETA-ALPHA ) / BETA
-            CALL DSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX )
-*
-*           If ALPHA is subnormal, it may lose relative accuracy
-*
-            ALPHA = BETA
-            DO 20 J = 1, KNT
-               ALPHA = ALPHA*SAFMIN
-   20       CONTINUE
-         ELSE
-            TAU = ( BETA-ALPHA ) / BETA
-            CALL DSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX )
-            ALPHA = BETA
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DLARFG
-*
-      END
--- a/libcruft/lapack/dlarft.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,217 +0,0 @@
-      SUBROUTINE DLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, STOREV
-      INTEGER            K, LDT, LDV, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   T( LDT, * ), TAU( * ), V( LDV, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLARFT forms the triangular factor T of a real block reflector H
-*  of order n, which is defined as a product of k elementary reflectors.
-*
-*  If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular;
-*
-*  If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular.
-*
-*  If STOREV = 'C', the vector which defines the elementary reflector
-*  H(i) is stored in the i-th column of the array V, and
-*
-*     H  =  I - V * T * V'
-*
-*  If STOREV = 'R', the vector which defines the elementary reflector
-*  H(i) is stored in the i-th row of the array V, and
-*
-*     H  =  I - V' * T * V
-*
-*  Arguments
-*  =========
-*
-*  DIRECT  (input) CHARACTER*1
-*          Specifies the order in which the elementary reflectors are
-*          multiplied to form the block reflector:
-*          = 'F': H = H(1) H(2) . . . H(k) (Forward)
-*          = 'B': H = H(k) . . . H(2) H(1) (Backward)
-*
-*  STOREV  (input) CHARACTER*1
-*          Specifies how the vectors which define the elementary
-*          reflectors are stored (see also Further Details):
-*          = 'C': columnwise
-*          = 'R': rowwise
-*
-*  N       (input) INTEGER
-*          The order of the block reflector H. N >= 0.
-*
-*  K       (input) INTEGER
-*          The order of the triangular factor T (= the number of
-*          elementary reflectors). K >= 1.
-*
-*  V       (input/output) DOUBLE PRECISION array, dimension
-*                               (LDV,K) if STOREV = 'C'
-*                               (LDV,N) if STOREV = 'R'
-*          The matrix V. See further details.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V.
-*          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K.
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i).
-*
-*  T       (output) DOUBLE PRECISION array, dimension (LDT,K)
-*          The k by k triangular factor T of the block reflector.
-*          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is
-*          lower triangular. The rest of the array is not used.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= K.
-*
-*  Further Details
-*  ===============
-*
-*  The shape of the matrix V and the storage of the vectors which define
-*  the H(i) is best illustrated by the following example with n = 5 and
-*  k = 3. The elements equal to 1 are not stored; the corresponding
-*  array elements are modified but restored on exit. The rest of the
-*  array is not used.
-*
-*  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':
-*
-*               V = (  1       )                 V = (  1 v1 v1 v1 v1 )
-*                   ( v1  1    )                     (     1 v2 v2 v2 )
-*                   ( v1 v2  1 )                     (        1 v3 v3 )
-*                   ( v1 v2 v3 )
-*                   ( v1 v2 v3 )
-*
-*  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R':
-*
-*               V = ( v1 v2 v3 )                 V = ( v1 v1  1       )
-*                   ( v1 v2 v3 )                     ( v2 v2 v2  1    )
-*                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 )
-*                   (     1 v3 )
-*                   (        1 )
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      DOUBLE PRECISION   VII
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMV, DTRMV
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( LSAME( DIRECT, 'F' ) ) THEN
-         DO 20 I = 1, K
-            IF( TAU( I ).EQ.ZERO ) THEN
-*
-*              H(i)  =  I
-*
-               DO 10 J = 1, I
-                  T( J, I ) = ZERO
-   10          CONTINUE
-            ELSE
-*
-*              general case
-*
-               VII = V( I, I )
-               V( I, I ) = ONE
-               IF( LSAME( STOREV, 'C' ) ) THEN
-*
-*                 T(1:i-1,i) := - tau(i) * V(i:n,1:i-1)' * V(i:n,i)
-*
-                  CALL DGEMV( 'Transpose', N-I+1, I-1, -TAU( I ),
-     $                        V( I, 1 ), LDV, V( I, I ), 1, ZERO,
-     $                        T( 1, I ), 1 )
-               ELSE
-*
-*                 T(1:i-1,i) := - tau(i) * V(1:i-1,i:n) * V(i,i:n)'
-*
-                  CALL DGEMV( 'No transpose', I-1, N-I+1, -TAU( I ),
-     $                        V( 1, I ), LDV, V( I, I ), LDV, ZERO,
-     $                        T( 1, I ), 1 )
-               END IF
-               V( I, I ) = VII
-*
-*              T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i)
-*
-               CALL DTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T,
-     $                     LDT, T( 1, I ), 1 )
-               T( I, I ) = TAU( I )
-            END IF
-   20    CONTINUE
-      ELSE
-         DO 40 I = K, 1, -1
-            IF( TAU( I ).EQ.ZERO ) THEN
-*
-*              H(i)  =  I
-*
-               DO 30 J = I, K
-                  T( J, I ) = ZERO
-   30          CONTINUE
-            ELSE
-*
-*              general case
-*
-               IF( I.LT.K ) THEN
-                  IF( LSAME( STOREV, 'C' ) ) THEN
-                     VII = V( N-K+I, I )
-                     V( N-K+I, I ) = ONE
-*
-*                    T(i+1:k,i) :=
-*                            - tau(i) * V(1:n-k+i,i+1:k)' * V(1:n-k+i,i)
-*
-                     CALL DGEMV( 'Transpose', N-K+I, K-I, -TAU( I ),
-     $                           V( 1, I+1 ), LDV, V( 1, I ), 1, ZERO,
-     $                           T( I+1, I ), 1 )
-                     V( N-K+I, I ) = VII
-                  ELSE
-                     VII = V( I, N-K+I )
-                     V( I, N-K+I ) = ONE
-*
-*                    T(i+1:k,i) :=
-*                            - tau(i) * V(i+1:k,1:n-k+i) * V(i,1:n-k+i)'
-*
-                     CALL DGEMV( 'No transpose', K-I, N-K+I, -TAU( I ),
-     $                           V( I+1, 1 ), LDV, V( I, 1 ), LDV, ZERO,
-     $                           T( I+1, I ), 1 )
-                     V( I, N-K+I ) = VII
-                  END IF
-*
-*                 T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i)
-*
-                  CALL DTRMV( 'Lower', 'No transpose', 'Non-unit', K-I,
-     $                        T( I+1, I+1 ), LDT, T( I+1, I ), 1 )
-               END IF
-               T( I, I ) = TAU( I )
-            END IF
-   40    CONTINUE
-      END IF
-      RETURN
-*
-*     End of DLARFT
-*
-      END
--- a/libcruft/lapack/dlarfx.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,638 +0,0 @@
-      SUBROUTINE DLARFX( SIDE, M, N, V, TAU, C, LDC, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE
-      INTEGER            LDC, M, N
-      DOUBLE PRECISION   TAU
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   C( LDC, * ), V( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLARFX applies a real elementary reflector H to a real m by n
-*  matrix C, from either the left or the right. H is represented in the
-*  form
-*
-*        H = I - tau * v * v'
-*
-*  where tau is a real scalar and v is a real vector.
-*
-*  If tau = 0, then H is taken to be the unit matrix
-*
-*  This version uses inline code if H has order < 11.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': form  H * C
-*          = 'R': form  C * H
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  V       (input) DOUBLE PRECISION array, dimension (M) if SIDE = 'L'
-*                                     or (N) if SIDE = 'R'
-*          The vector v in the representation of H.
-*
-*  TAU     (input) DOUBLE PRECISION
-*          The value tau in the representation of H.
-*
-*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
-*          On entry, the m by n matrix C.
-*          On exit, C is overwritten by the matrix H * C if SIDE = 'L',
-*          or C * H if SIDE = 'R'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDA >= (1,M).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension
-*                      (N) if SIDE = 'L'
-*                      or (M) if SIDE = 'R'
-*          WORK is not referenced if H has order < 11.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            J
-      DOUBLE PRECISION   SUM, T1, T10, T2, T3, T4, T5, T6, T7, T8, T9,
-     $                   V1, V10, V2, V3, V4, V5, V6, V7, V8, V9
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMV, DGER
-*     ..
-*     .. Executable Statements ..
-*
-      IF( TAU.EQ.ZERO )
-     $   RETURN
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  H * C, where H has order m.
-*
-         GO TO ( 10, 30, 50, 70, 90, 110, 130, 150,
-     $           170, 190 )M
-*
-*        Code for general M
-*
-*        w := C'*v
-*
-         CALL DGEMV( 'Transpose', M, N, ONE, C, LDC, V, 1, ZERO, WORK,
-     $               1 )
-*
-*        C := C - tau * v * w'
-*
-         CALL DGER( M, N, -TAU, V, 1, WORK, 1, C, LDC )
-         GO TO 410
-   10    CONTINUE
-*
-*        Special code for 1 x 1 Householder
-*
-         T1 = ONE - TAU*V( 1 )*V( 1 )
-         DO 20 J = 1, N
-            C( 1, J ) = T1*C( 1, J )
-   20    CONTINUE
-         GO TO 410
-   30    CONTINUE
-*
-*        Special code for 2 x 2 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         DO 40 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-   40    CONTINUE
-         GO TO 410
-   50    CONTINUE
-*
-*        Special code for 3 x 3 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         DO 60 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-   60    CONTINUE
-         GO TO 410
-   70    CONTINUE
-*
-*        Special code for 4 x 4 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         DO 80 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-   80    CONTINUE
-         GO TO 410
-   90    CONTINUE
-*
-*        Special code for 5 x 5 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         DO 100 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-  100    CONTINUE
-         GO TO 410
-  110    CONTINUE
-*
-*        Special code for 6 x 6 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         DO 120 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-  120    CONTINUE
-         GO TO 410
-  130    CONTINUE
-*
-*        Special code for 7 x 7 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         V7 = V( 7 )
-         T7 = TAU*V7
-         DO 140 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J ) +
-     $            V7*C( 7, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-            C( 7, J ) = C( 7, J ) - SUM*T7
-  140    CONTINUE
-         GO TO 410
-  150    CONTINUE
-*
-*        Special code for 8 x 8 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         V7 = V( 7 )
-         T7 = TAU*V7
-         V8 = V( 8 )
-         T8 = TAU*V8
-         DO 160 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J ) +
-     $            V7*C( 7, J ) + V8*C( 8, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-            C( 7, J ) = C( 7, J ) - SUM*T7
-            C( 8, J ) = C( 8, J ) - SUM*T8
-  160    CONTINUE
-         GO TO 410
-  170    CONTINUE
-*
-*        Special code for 9 x 9 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         V7 = V( 7 )
-         T7 = TAU*V7
-         V8 = V( 8 )
-         T8 = TAU*V8
-         V9 = V( 9 )
-         T9 = TAU*V9
-         DO 180 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J ) +
-     $            V7*C( 7, J ) + V8*C( 8, J ) + V9*C( 9, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-            C( 7, J ) = C( 7, J ) - SUM*T7
-            C( 8, J ) = C( 8, J ) - SUM*T8
-            C( 9, J ) = C( 9, J ) - SUM*T9
-  180    CONTINUE
-         GO TO 410
-  190    CONTINUE
-*
-*        Special code for 10 x 10 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         V7 = V( 7 )
-         T7 = TAU*V7
-         V8 = V( 8 )
-         T8 = TAU*V8
-         V9 = V( 9 )
-         T9 = TAU*V9
-         V10 = V( 10 )
-         T10 = TAU*V10
-         DO 200 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J ) +
-     $            V7*C( 7, J ) + V8*C( 8, J ) + V9*C( 9, J ) +
-     $            V10*C( 10, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-            C( 7, J ) = C( 7, J ) - SUM*T7
-            C( 8, J ) = C( 8, J ) - SUM*T8
-            C( 9, J ) = C( 9, J ) - SUM*T9
-            C( 10, J ) = C( 10, J ) - SUM*T10
-  200    CONTINUE
-         GO TO 410
-      ELSE
-*
-*        Form  C * H, where H has order n.
-*
-         GO TO ( 210, 230, 250, 270, 290, 310, 330, 350,
-     $           370, 390 )N
-*
-*        Code for general N
-*
-*        w := C * v
-*
-         CALL DGEMV( 'No transpose', M, N, ONE, C, LDC, V, 1, ZERO,
-     $               WORK, 1 )
-*
-*        C := C - tau * w * v'
-*
-         CALL DGER( M, N, -TAU, WORK, 1, V, 1, C, LDC )
-         GO TO 410
-  210    CONTINUE
-*
-*        Special code for 1 x 1 Householder
-*
-         T1 = ONE - TAU*V( 1 )*V( 1 )
-         DO 220 J = 1, M
-            C( J, 1 ) = T1*C( J, 1 )
-  220    CONTINUE
-         GO TO 410
-  230    CONTINUE
-*
-*        Special code for 2 x 2 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         DO 240 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-  240    CONTINUE
-         GO TO 410
-  250    CONTINUE
-*
-*        Special code for 3 x 3 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         DO 260 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-  260    CONTINUE
-         GO TO 410
-  270    CONTINUE
-*
-*        Special code for 4 x 4 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         DO 280 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-  280    CONTINUE
-         GO TO 410
-  290    CONTINUE
-*
-*        Special code for 5 x 5 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         DO 300 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-  300    CONTINUE
-         GO TO 410
-  310    CONTINUE
-*
-*        Special code for 6 x 6 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         DO 320 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-  320    CONTINUE
-         GO TO 410
-  330    CONTINUE
-*
-*        Special code for 7 x 7 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         V7 = V( 7 )
-         T7 = TAU*V7
-         DO 340 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 ) +
-     $            V7*C( J, 7 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-            C( J, 7 ) = C( J, 7 ) - SUM*T7
-  340    CONTINUE
-         GO TO 410
-  350    CONTINUE
-*
-*        Special code for 8 x 8 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         V7 = V( 7 )
-         T7 = TAU*V7
-         V8 = V( 8 )
-         T8 = TAU*V8
-         DO 360 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 ) +
-     $            V7*C( J, 7 ) + V8*C( J, 8 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-            C( J, 7 ) = C( J, 7 ) - SUM*T7
-            C( J, 8 ) = C( J, 8 ) - SUM*T8
-  360    CONTINUE
-         GO TO 410
-  370    CONTINUE
-*
-*        Special code for 9 x 9 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         V7 = V( 7 )
-         T7 = TAU*V7
-         V8 = V( 8 )
-         T8 = TAU*V8
-         V9 = V( 9 )
-         T9 = TAU*V9
-         DO 380 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 ) +
-     $            V7*C( J, 7 ) + V8*C( J, 8 ) + V9*C( J, 9 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-            C( J, 7 ) = C( J, 7 ) - SUM*T7
-            C( J, 8 ) = C( J, 8 ) - SUM*T8
-            C( J, 9 ) = C( J, 9 ) - SUM*T9
-  380    CONTINUE
-         GO TO 410
-  390    CONTINUE
-*
-*        Special code for 10 x 10 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         V7 = V( 7 )
-         T7 = TAU*V7
-         V8 = V( 8 )
-         T8 = TAU*V8
-         V9 = V( 9 )
-         T9 = TAU*V9
-         V10 = V( 10 )
-         T10 = TAU*V10
-         DO 400 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 ) +
-     $            V7*C( J, 7 ) + V8*C( J, 8 ) + V9*C( J, 9 ) +
-     $            V10*C( J, 10 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-            C( J, 7 ) = C( J, 7 ) - SUM*T7
-            C( J, 8 ) = C( J, 8 ) - SUM*T8
-            C( J, 9 ) = C( J, 9 ) - SUM*T9
-            C( J, 10 ) = C( J, 10 ) - SUM*T10
-  400    CONTINUE
-         GO TO 410
-      END IF
-  410 CONTINUE
-      RETURN
-*
-*     End of DLARFX
-*
-      END
--- a/libcruft/lapack/dlartg.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-      SUBROUTINE DLARTG( F, G, CS, SN, R )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   CS, F, G, R, SN
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLARTG generate a plane rotation so that
-*
-*     [  CS  SN  ]  .  [ F ]  =  [ R ]   where CS**2 + SN**2 = 1.
-*     [ -SN  CS  ]     [ G ]     [ 0 ]
-*
-*  This is a slower, more accurate version of the BLAS1 routine DROTG,
-*  with the following other differences:
-*     F and G are unchanged on return.
-*     If G=0, then CS=1 and SN=0.
-*     If F=0 and (G .ne. 0), then CS=0 and SN=1 without doing any
-*        floating point operations (saves work in DBDSQR when
-*        there are zeros on the diagonal).
-*
-*  If F exceeds G in magnitude, CS will be positive.
-*
-*  Arguments
-*  =========
-*
-*  F       (input) DOUBLE PRECISION
-*          The first component of vector to be rotated.
-*
-*  G       (input) DOUBLE PRECISION
-*          The second component of vector to be rotated.
-*
-*  CS      (output) DOUBLE PRECISION
-*          The cosine of the rotation.
-*
-*  SN      (output) DOUBLE PRECISION
-*          The sine of the rotation.
-*
-*  R       (output) DOUBLE PRECISION
-*          The nonzero component of the rotated vector.
-*
-*  This version has a few statements commented out for thread safety
-*  (machine parameters are computed on each entry). 10 feb 03, SJH.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D0 )
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D0 )
-      DOUBLE PRECISION   TWO
-      PARAMETER          ( TWO = 2.0D0 )
-*     ..
-*     .. Local Scalars ..
-*     LOGICAL            FIRST
-      INTEGER            COUNT, I
-      DOUBLE PRECISION   EPS, F1, G1, SAFMIN, SAFMN2, SAFMX2, SCALE
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           DLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, INT, LOG, MAX, SQRT
-*     ..
-*     .. Save statement ..
-*     SAVE               FIRST, SAFMX2, SAFMIN, SAFMN2
-*     ..
-*     .. Data statements ..
-*     DATA               FIRST / .TRUE. /
-*     ..
-*     .. Executable Statements ..
-*
-*     IF( FIRST ) THEN
-         SAFMIN = DLAMCH( 'S' )
-         EPS = DLAMCH( 'E' )
-         SAFMN2 = DLAMCH( 'B' )**INT( LOG( SAFMIN / EPS ) /
-     $            LOG( DLAMCH( 'B' ) ) / TWO )
-         SAFMX2 = ONE / SAFMN2
-*        FIRST = .FALSE.
-*     END IF
-      IF( G.EQ.ZERO ) THEN
-         CS = ONE
-         SN = ZERO
-         R = F
-      ELSE IF( F.EQ.ZERO ) THEN
-         CS = ZERO
-         SN = ONE
-         R = G
-      ELSE
-         F1 = F
-         G1 = G
-         SCALE = MAX( ABS( F1 ), ABS( G1 ) )
-         IF( SCALE.GE.SAFMX2 ) THEN
-            COUNT = 0
-   10       CONTINUE
-            COUNT = COUNT + 1
-            F1 = F1*SAFMN2
-            G1 = G1*SAFMN2
-            SCALE = MAX( ABS( F1 ), ABS( G1 ) )
-            IF( SCALE.GE.SAFMX2 )
-     $         GO TO 10
-            R = SQRT( F1**2+G1**2 )
-            CS = F1 / R
-            SN = G1 / R
-            DO 20 I = 1, COUNT
-               R = R*SAFMX2
-   20       CONTINUE
-         ELSE IF( SCALE.LE.SAFMN2 ) THEN
-            COUNT = 0
-   30       CONTINUE
-            COUNT = COUNT + 1
-            F1 = F1*SAFMX2
-            G1 = G1*SAFMX2
-            SCALE = MAX( ABS( F1 ), ABS( G1 ) )
-            IF( SCALE.LE.SAFMN2 )
-     $         GO TO 30
-            R = SQRT( F1**2+G1**2 )
-            CS = F1 / R
-            SN = G1 / R
-            DO 40 I = 1, COUNT
-               R = R*SAFMN2
-   40       CONTINUE
-         ELSE
-            R = SQRT( F1**2+G1**2 )
-            CS = F1 / R
-            SN = G1 / R
-         END IF
-         IF( ABS( F ).GT.ABS( G ) .AND. CS.LT.ZERO ) THEN
-            CS = -CS
-            SN = -SN
-            R = -R
-         END IF
-      END IF
-      RETURN
-*
-*     End of DLARTG
-*
-      END
--- a/libcruft/lapack/dlarz.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,152 +0,0 @@
-      SUBROUTINE DLARZ( SIDE, M, N, L, V, INCV, TAU, C, LDC, WORK )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE
-      INTEGER            INCV, L, LDC, M, N
-      DOUBLE PRECISION   TAU
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   C( LDC, * ), V( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLARZ applies a real elementary reflector H to a real M-by-N
-*  matrix C, from either the left or the right. H is represented in the
-*  form
-*
-*        H = I - tau * v * v'
-*
-*  where tau is a real scalar and v is a real vector.
-*
-*  If tau = 0, then H is taken to be the unit matrix.
-*
-*
-*  H is a product of k elementary reflectors as returned by DTZRZF.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': form  H * C
-*          = 'R': form  C * H
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  L       (input) INTEGER
-*          The number of entries of the vector V containing
-*          the meaningful part of the Householder vectors.
-*          If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
-*
-*  V       (input) DOUBLE PRECISION array, dimension (1+(L-1)*abs(INCV))
-*          The vector v in the representation of H as returned by
-*          DTZRZF. V is not used if TAU = 0.
-*
-*  INCV    (input) INTEGER
-*          The increment between elements of v. INCV <> 0.
-*
-*  TAU     (input) DOUBLE PRECISION
-*          The value tau in the representation of H.
-*
-*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by the matrix H * C if SIDE = 'L',
-*          or C * H if SIDE = 'R'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension
-*                         (N) if SIDE = 'L'
-*                      or (M) if SIDE = 'R'
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DAXPY, DCOPY, DGEMV, DGER
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  H * C
-*
-         IF( TAU.NE.ZERO ) THEN
-*
-*           w( 1:n ) = C( 1, 1:n )
-*
-            CALL DCOPY( N, C, LDC, WORK, 1 )
-*
-*           w( 1:n ) = w( 1:n ) + C( m-l+1:m, 1:n )' * v( 1:l )
-*
-            CALL DGEMV( 'Transpose', L, N, ONE, C( M-L+1, 1 ), LDC, V,
-     $                  INCV, ONE, WORK, 1 )
-*
-*           C( 1, 1:n ) = C( 1, 1:n ) - tau * w( 1:n )
-*
-            CALL DAXPY( N, -TAU, WORK, 1, C, LDC )
-*
-*           C( m-l+1:m, 1:n ) = C( m-l+1:m, 1:n ) - ...
-*                               tau * v( 1:l ) * w( 1:n )'
-*
-            CALL DGER( L, N, -TAU, V, INCV, WORK, 1, C( M-L+1, 1 ),
-     $                 LDC )
-         END IF
-*
-      ELSE
-*
-*        Form  C * H
-*
-         IF( TAU.NE.ZERO ) THEN
-*
-*           w( 1:m ) = C( 1:m, 1 )
-*
-            CALL DCOPY( M, C, 1, WORK, 1 )
-*
-*           w( 1:m ) = w( 1:m ) + C( 1:m, n-l+1:n, 1:n ) * v( 1:l )
-*
-            CALL DGEMV( 'No transpose', M, L, ONE, C( 1, N-L+1 ), LDC,
-     $                  V, INCV, ONE, WORK, 1 )
-*
-*           C( 1:m, 1 ) = C( 1:m, 1 ) - tau * w( 1:m )
-*
-            CALL DAXPY( M, -TAU, WORK, 1, C, 1 )
-*
-*           C( 1:m, n-l+1:n ) = C( 1:m, n-l+1:n ) - ...
-*                               tau * w( 1:m ) * v( 1:l )'
-*
-            CALL DGER( M, L, -TAU, WORK, 1, V, INCV, C( 1, N-L+1 ),
-     $                 LDC )
-*
-         END IF
-*
-      END IF
-*
-      RETURN
-*
-*     End of DLARZ
-*
-      END
--- a/libcruft/lapack/dlarzb.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,220 +0,0 @@
-      SUBROUTINE DLARZB( SIDE, TRANS, DIRECT, STOREV, M, N, K, L, V,
-     $                   LDV, T, LDT, C, LDC, WORK, LDWORK )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, SIDE, STOREV, TRANS
-      INTEGER            K, L, LDC, LDT, LDV, LDWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   C( LDC, * ), T( LDT, * ), V( LDV, * ),
-     $                   WORK( LDWORK, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLARZB applies a real block reflector H or its transpose H**T to
-*  a real distributed M-by-N  C from the left or the right.
-*
-*  Currently, only STOREV = 'R' and DIRECT = 'B' are supported.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply H or H' from the Left
-*          = 'R': apply H or H' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply H (No transpose)
-*          = 'C': apply H' (Transpose)
-*
-*  DIRECT  (input) CHARACTER*1
-*          Indicates how H is formed from a product of elementary
-*          reflectors
-*          = 'F': H = H(1) H(2) . . . H(k) (Forward, not supported yet)
-*          = 'B': H = H(k) . . . H(2) H(1) (Backward)
-*
-*  STOREV  (input) CHARACTER*1
-*          Indicates how the vectors which define the elementary
-*          reflectors are stored:
-*          = 'C': Columnwise                        (not supported yet)
-*          = 'R': Rowwise
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  K       (input) INTEGER
-*          The order of the matrix T (= the number of elementary
-*          reflectors whose product defines the block reflector).
-*
-*  L       (input) INTEGER
-*          The number of columns of the matrix V containing the
-*          meaningful part of the Householder reflectors.
-*          If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
-*
-*  V       (input) DOUBLE PRECISION array, dimension (LDV,NV).
-*          If STOREV = 'C', NV = K; if STOREV = 'R', NV = L.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V.
-*          If STOREV = 'C', LDV >= L; if STOREV = 'R', LDV >= K.
-*
-*  T       (input) DOUBLE PRECISION array, dimension (LDT,K)
-*          The triangular K-by-K matrix T in the representation of the
-*          block reflector.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= K.
-*
-*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by H*C or H'*C or C*H or C*H'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (LDWORK,K)
-*
-*  LDWORK  (input) INTEGER
-*          The leading dimension of the array WORK.
-*          If SIDE = 'L', LDWORK >= max(1,N);
-*          if SIDE = 'R', LDWORK >= max(1,M).
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      CHARACTER          TRANST
-      INTEGER            I, INFO, J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DGEMM, DTRMM, XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 .OR. N.LE.0 )
-     $   RETURN
-*
-*     Check for currently supported options
-*
-      INFO = 0
-      IF( .NOT.LSAME( DIRECT, 'B' ) ) THEN
-         INFO = -3
-      ELSE IF( .NOT.LSAME( STOREV, 'R' ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLARZB', -INFO )
-         RETURN
-      END IF
-*
-      IF( LSAME( TRANS, 'N' ) ) THEN
-         TRANST = 'T'
-      ELSE
-         TRANST = 'N'
-      END IF
-*
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  H * C  or  H' * C
-*
-*        W( 1:n, 1:k ) = C( 1:k, 1:n )'
-*
-         DO 10 J = 1, K
-            CALL DCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 )
-   10    CONTINUE
-*
-*        W( 1:n, 1:k ) = W( 1:n, 1:k ) + ...
-*                        C( m-l+1:m, 1:n )' * V( 1:k, 1:l )'
-*
-         IF( L.GT.0 )
-     $      CALL DGEMM( 'Transpose', 'Transpose', N, K, L, ONE,
-     $                  C( M-L+1, 1 ), LDC, V, LDV, ONE, WORK, LDWORK )
-*
-*        W( 1:n, 1:k ) = W( 1:n, 1:k ) * T'  or  W( 1:m, 1:k ) * T
-*
-         CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K, ONE, T,
-     $               LDT, WORK, LDWORK )
-*
-*        C( 1:k, 1:n ) = C( 1:k, 1:n ) - W( 1:n, 1:k )'
-*
-         DO 30 J = 1, N
-            DO 20 I = 1, K
-               C( I, J ) = C( I, J ) - WORK( J, I )
-   20       CONTINUE
-   30    CONTINUE
-*
-*        C( m-l+1:m, 1:n ) = C( m-l+1:m, 1:n ) - ...
-*                            V( 1:k, 1:l )' * W( 1:n, 1:k )'
-*
-         IF( L.GT.0 )
-     $      CALL DGEMM( 'Transpose', 'Transpose', L, N, K, -ONE, V, LDV,
-     $                  WORK, LDWORK, ONE, C( M-L+1, 1 ), LDC )
-*
-      ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*        Form  C * H  or  C * H'
-*
-*        W( 1:m, 1:k ) = C( 1:m, 1:k )
-*
-         DO 40 J = 1, K
-            CALL DCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 )
-   40    CONTINUE
-*
-*        W( 1:m, 1:k ) = W( 1:m, 1:k ) + ...
-*                        C( 1:m, n-l+1:n ) * V( 1:k, 1:l )'
-*
-         IF( L.GT.0 )
-     $      CALL DGEMM( 'No transpose', 'Transpose', M, K, L, ONE,
-     $                  C( 1, N-L+1 ), LDC, V, LDV, ONE, WORK, LDWORK )
-*
-*        W( 1:m, 1:k ) = W( 1:m, 1:k ) * T  or  W( 1:m, 1:k ) * T'
-*
-         CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K, ONE, T,
-     $               LDT, WORK, LDWORK )
-*
-*        C( 1:m, 1:k ) = C( 1:m, 1:k ) - W( 1:m, 1:k )
-*
-         DO 60 J = 1, K
-            DO 50 I = 1, M
-               C( I, J ) = C( I, J ) - WORK( I, J )
-   50       CONTINUE
-   60    CONTINUE
-*
-*        C( 1:m, n-l+1:n ) = C( 1:m, n-l+1:n ) - ...
-*                            W( 1:m, 1:k ) * V( 1:k, 1:l )
-*
-         IF( L.GT.0 )
-     $      CALL DGEMM( 'No transpose', 'No transpose', M, L, K, -ONE,
-     $                  WORK, LDWORK, V, LDV, ONE, C( 1, N-L+1 ), LDC )
-*
-      END IF
-*
-      RETURN
-*
-*     End of DLARZB
-*
-      END
--- a/libcruft/lapack/dlarzt.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,184 +0,0 @@
-      SUBROUTINE DLARZT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, STOREV
-      INTEGER            K, LDT, LDV, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   T( LDT, * ), TAU( * ), V( LDV, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLARZT forms the triangular factor T of a real block reflector
-*  H of order > n, which is defined as a product of k elementary
-*  reflectors.
-*
-*  If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular;
-*
-*  If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular.
-*
-*  If STOREV = 'C', the vector which defines the elementary reflector
-*  H(i) is stored in the i-th column of the array V, and
-*
-*     H  =  I - V * T * V'
-*
-*  If STOREV = 'R', the vector which defines the elementary reflector
-*  H(i) is stored in the i-th row of the array V, and
-*
-*     H  =  I - V' * T * V
-*
-*  Currently, only STOREV = 'R' and DIRECT = 'B' are supported.
-*
-*  Arguments
-*  =========
-*
-*  DIRECT  (input) CHARACTER*1
-*          Specifies the order in which the elementary reflectors are
-*          multiplied to form the block reflector:
-*          = 'F': H = H(1) H(2) . . . H(k) (Forward, not supported yet)
-*          = 'B': H = H(k) . . . H(2) H(1) (Backward)
-*
-*  STOREV  (input) CHARACTER*1
-*          Specifies how the vectors which define the elementary
-*          reflectors are stored (see also Further Details):
-*          = 'C': columnwise                        (not supported yet)
-*          = 'R': rowwise
-*
-*  N       (input) INTEGER
-*          The order of the block reflector H. N >= 0.
-*
-*  K       (input) INTEGER
-*          The order of the triangular factor T (= the number of
-*          elementary reflectors). K >= 1.
-*
-*  V       (input/output) DOUBLE PRECISION array, dimension
-*                               (LDV,K) if STOREV = 'C'
-*                               (LDV,N) if STOREV = 'R'
-*          The matrix V. See further details.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V.
-*          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K.
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i).
-*
-*  T       (output) DOUBLE PRECISION array, dimension (LDT,K)
-*          The k by k triangular factor T of the block reflector.
-*          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is
-*          lower triangular. The rest of the array is not used.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= K.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  The shape of the matrix V and the storage of the vectors which define
-*  the H(i) is best illustrated by the following example with n = 5 and
-*  k = 3. The elements equal to 1 are not stored; the corresponding
-*  array elements are modified but restored on exit. The rest of the
-*  array is not used.
-*
-*  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':
-*
-*                                              ______V_____
-*         ( v1 v2 v3 )                        /            \
-*         ( v1 v2 v3 )                      ( v1 v1 v1 v1 v1 . . . . 1 )
-*     V = ( v1 v2 v3 )                      ( v2 v2 v2 v2 v2 . . . 1   )
-*         ( v1 v2 v3 )                      ( v3 v3 v3 v3 v3 . . 1     )
-*         ( v1 v2 v3 )
-*            .  .  .
-*            .  .  .
-*            1  .  .
-*               1  .
-*                  1
-*
-*  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R':
-*
-*                                                        ______V_____
-*            1                                          /            \
-*            .  1                           ( 1 . . . . v1 v1 v1 v1 v1 )
-*            .  .  1                        ( . 1 . . . v2 v2 v2 v2 v2 )
-*            .  .  .                        ( . . 1 . . v3 v3 v3 v3 v3 )
-*            .  .  .
-*         ( v1 v2 v3 )
-*         ( v1 v2 v3 )
-*     V = ( v1 v2 v3 )
-*         ( v1 v2 v3 )
-*         ( v1 v2 v3 )
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, INFO, J
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMV, DTRMV, XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-*     Check for currently supported options
-*
-      INFO = 0
-      IF( .NOT.LSAME( DIRECT, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.LSAME( STOREV, 'R' ) ) THEN
-         INFO = -2
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLARZT', -INFO )
-         RETURN
-      END IF
-*
-      DO 20 I = K, 1, -1
-         IF( TAU( I ).EQ.ZERO ) THEN
-*
-*           H(i)  =  I
-*
-            DO 10 J = I, K
-               T( J, I ) = ZERO
-   10       CONTINUE
-         ELSE
-*
-*           general case
-*
-            IF( I.LT.K ) THEN
-*
-*              T(i+1:k,i) = - tau(i) * V(i+1:k,1:n) * V(i,1:n)'
-*
-               CALL DGEMV( 'No transpose', K-I, N, -TAU( I ),
-     $                     V( I+1, 1 ), LDV, V( I, 1 ), LDV, ZERO,
-     $                     T( I+1, I ), 1 )
-*
-*              T(i+1:k,i) = T(i+1:k,i+1:k) * T(i+1:k,i)
-*
-               CALL DTRMV( 'Lower', 'No transpose', 'Non-unit', K-I,
-     $                     T( I+1, I+1 ), LDT, T( I+1, I ), 1 )
-            END IF
-            T( I, I ) = TAU( I )
-         END IF
-   20 CONTINUE
-      RETURN
-*
-*     End of DLARZT
-*
-      END
--- a/libcruft/lapack/dlas2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,121 +0,0 @@
-      SUBROUTINE DLAS2( F, G, H, SSMIN, SSMAX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   F, G, H, SSMAX, SSMIN
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAS2  computes the singular values of the 2-by-2 matrix
-*     [  F   G  ]
-*     [  0   H  ].
-*  On return, SSMIN is the smaller singular value and SSMAX is the
-*  larger singular value.
-*
-*  Arguments
-*  =========
-*
-*  F       (input) DOUBLE PRECISION
-*          The (1,1) element of the 2-by-2 matrix.
-*
-*  G       (input) DOUBLE PRECISION
-*          The (1,2) element of the 2-by-2 matrix.
-*
-*  H       (input) DOUBLE PRECISION
-*          The (2,2) element of the 2-by-2 matrix.
-*
-*  SSMIN   (output) DOUBLE PRECISION
-*          The smaller singular value.
-*
-*  SSMAX   (output) DOUBLE PRECISION
-*          The larger singular value.
-*
-*  Further Details
-*  ===============
-*
-*  Barring over/underflow, all output quantities are correct to within
-*  a few units in the last place (ulps), even in the absence of a guard
-*  digit in addition/subtraction.
-*
-*  In IEEE arithmetic, the code works correctly if one matrix element is
-*  infinite.
-*
-*  Overflow will not occur unless the largest singular value itself
-*  overflows, or is within a few ulps of overflow. (On machines with
-*  partial overflow, like the Cray, overflow may occur if the largest
-*  singular value is within a factor of 2 of overflow.)
-*
-*  Underflow is harmless if underflow is gradual. Otherwise, results
-*  may correspond to a matrix modified by perturbations of size near
-*  the underflow threshold.
-*
-*  ====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D0 )
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D0 )
-      DOUBLE PRECISION   TWO
-      PARAMETER          ( TWO = 2.0D0 )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   AS, AT, AU, C, FA, FHMN, FHMX, GA, HA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      FA = ABS( F )
-      GA = ABS( G )
-      HA = ABS( H )
-      FHMN = MIN( FA, HA )
-      FHMX = MAX( FA, HA )
-      IF( FHMN.EQ.ZERO ) THEN
-         SSMIN = ZERO
-         IF( FHMX.EQ.ZERO ) THEN
-            SSMAX = GA
-         ELSE
-            SSMAX = MAX( FHMX, GA )*SQRT( ONE+
-     $              ( MIN( FHMX, GA ) / MAX( FHMX, GA ) )**2 )
-         END IF
-      ELSE
-         IF( GA.LT.FHMX ) THEN
-            AS = ONE + FHMN / FHMX
-            AT = ( FHMX-FHMN ) / FHMX
-            AU = ( GA / FHMX )**2
-            C = TWO / ( SQRT( AS*AS+AU )+SQRT( AT*AT+AU ) )
-            SSMIN = FHMN*C
-            SSMAX = FHMX / C
-         ELSE
-            AU = FHMX / GA
-            IF( AU.EQ.ZERO ) THEN
-*
-*              Avoid possible harmful underflow if exponent range
-*              asymmetric (true SSMIN may not underflow even if
-*              AU underflows)
-*
-               SSMIN = ( FHMN*FHMX ) / GA
-               SSMAX = GA
-            ELSE
-               AS = ONE + FHMN / FHMX
-               AT = ( FHMX-FHMN ) / FHMX
-               C = ONE / ( SQRT( ONE+( AS*AU )**2 )+
-     $             SQRT( ONE+( AT*AU )**2 ) )
-               SSMIN = ( FHMN*C )*AU
-               SSMIN = SSMIN + SSMIN
-               SSMAX = GA / ( C+C )
-            END IF
-         END IF
-      END IF
-      RETURN
-*
-*     End of DLAS2
-*
-      END
--- a/libcruft/lapack/dlascl.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,267 +0,0 @@
-      SUBROUTINE DLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TYPE
-      INTEGER            INFO, KL, KU, LDA, M, N
-      DOUBLE PRECISION   CFROM, CTO
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASCL multiplies the M by N real matrix A by the real scalar
-*  CTO/CFROM.  This is done without over/underflow as long as the final
-*  result CTO*A(I,J)/CFROM does not over/underflow. TYPE specifies that
-*  A may be full, upper triangular, lower triangular, upper Hessenberg,
-*  or banded.
-*
-*  Arguments
-*  =========
-*
-*  TYPE    (input) CHARACTER*1
-*          TYPE indices the storage type of the input matrix.
-*          = 'G':  A is a full matrix.
-*          = 'L':  A is a lower triangular matrix.
-*          = 'U':  A is an upper triangular matrix.
-*          = 'H':  A is an upper Hessenberg matrix.
-*          = 'B':  A is a symmetric band matrix with lower bandwidth KL
-*                  and upper bandwidth KU and with the only the lower
-*                  half stored.
-*          = 'Q':  A is a symmetric band matrix with lower bandwidth KL
-*                  and upper bandwidth KU and with the only the upper
-*                  half stored.
-*          = 'Z':  A is a band matrix with lower bandwidth KL and upper
-*                  bandwidth KU.
-*
-*  KL      (input) INTEGER
-*          The lower bandwidth of A.  Referenced only if TYPE = 'B',
-*          'Q' or 'Z'.
-*
-*  KU      (input) INTEGER
-*          The upper bandwidth of A.  Referenced only if TYPE = 'B',
-*          'Q' or 'Z'.
-*
-*  CFROM   (input) DOUBLE PRECISION
-*  CTO     (input) DOUBLE PRECISION
-*          The matrix A is multiplied by CTO/CFROM. A(I,J) is computed
-*          without over/underflow if the final result CTO*A(I,J)/CFROM
-*          can be represented without over/underflow.  CFROM must be
-*          nonzero.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          The matrix to be multiplied by CTO/CFROM.  See TYPE for the
-*          storage type.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  INFO    (output) INTEGER
-*          0  - successful exit
-*          <0 - if INFO = -i, the i-th argument had an illegal value.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            DONE
-      INTEGER            I, ITYPE, J, K1, K2, K3, K4
-      DOUBLE PRECISION   BIGNUM, CFROM1, CFROMC, CTO1, CTOC, MUL, SMLNUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           LSAME, DLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-*
-      IF( LSAME( TYPE, 'G' ) ) THEN
-         ITYPE = 0
-      ELSE IF( LSAME( TYPE, 'L' ) ) THEN
-         ITYPE = 1
-      ELSE IF( LSAME( TYPE, 'U' ) ) THEN
-         ITYPE = 2
-      ELSE IF( LSAME( TYPE, 'H' ) ) THEN
-         ITYPE = 3
-      ELSE IF( LSAME( TYPE, 'B' ) ) THEN
-         ITYPE = 4
-      ELSE IF( LSAME( TYPE, 'Q' ) ) THEN
-         ITYPE = 5
-      ELSE IF( LSAME( TYPE, 'Z' ) ) THEN
-         ITYPE = 6
-      ELSE
-         ITYPE = -1
-      END IF
-*
-      IF( ITYPE.EQ.-1 ) THEN
-         INFO = -1
-      ELSE IF( CFROM.EQ.ZERO ) THEN
-         INFO = -4
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -6
-      ELSE IF( N.LT.0 .OR. ( ITYPE.EQ.4 .AND. N.NE.M ) .OR.
-     $         ( ITYPE.EQ.5 .AND. N.NE.M ) ) THEN
-         INFO = -7
-      ELSE IF( ITYPE.LE.3 .AND. LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -9
-      ELSE IF( ITYPE.GE.4 ) THEN
-         IF( KL.LT.0 .OR. KL.GT.MAX( M-1, 0 ) ) THEN
-            INFO = -2
-         ELSE IF( KU.LT.0 .OR. KU.GT.MAX( N-1, 0 ) .OR.
-     $            ( ( ITYPE.EQ.4 .OR. ITYPE.EQ.5 ) .AND. KL.NE.KU ) )
-     $             THEN
-            INFO = -3
-         ELSE IF( ( ITYPE.EQ.4 .AND. LDA.LT.KL+1 ) .OR.
-     $            ( ITYPE.EQ.5 .AND. LDA.LT.KU+1 ) .OR.
-     $            ( ITYPE.EQ.6 .AND. LDA.LT.2*KL+KU+1 ) ) THEN
-            INFO = -9
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLASCL', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. M.EQ.0 )
-     $   RETURN
-*
-*     Get machine parameters
-*
-      SMLNUM = DLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-*
-      CFROMC = CFROM
-      CTOC = CTO
-*
-   10 CONTINUE
-      CFROM1 = CFROMC*SMLNUM
-      CTO1 = CTOC / BIGNUM
-      IF( ABS( CFROM1 ).GT.ABS( CTOC ) .AND. CTOC.NE.ZERO ) THEN
-         MUL = SMLNUM
-         DONE = .FALSE.
-         CFROMC = CFROM1
-      ELSE IF( ABS( CTO1 ).GT.ABS( CFROMC ) ) THEN
-         MUL = BIGNUM
-         DONE = .FALSE.
-         CTOC = CTO1
-      ELSE
-         MUL = CTOC / CFROMC
-         DONE = .TRUE.
-      END IF
-*
-      IF( ITYPE.EQ.0 ) THEN
-*
-*        Full matrix
-*
-         DO 30 J = 1, N
-            DO 20 I = 1, M
-               A( I, J ) = A( I, J )*MUL
-   20       CONTINUE
-   30    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.1 ) THEN
-*
-*        Lower triangular matrix
-*
-         DO 50 J = 1, N
-            DO 40 I = J, M
-               A( I, J ) = A( I, J )*MUL
-   40       CONTINUE
-   50    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.2 ) THEN
-*
-*        Upper triangular matrix
-*
-         DO 70 J = 1, N
-            DO 60 I = 1, MIN( J, M )
-               A( I, J ) = A( I, J )*MUL
-   60       CONTINUE
-   70    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.3 ) THEN
-*
-*        Upper Hessenberg matrix
-*
-         DO 90 J = 1, N
-            DO 80 I = 1, MIN( J+1, M )
-               A( I, J ) = A( I, J )*MUL
-   80       CONTINUE
-   90    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.4 ) THEN
-*
-*        Lower half of a symmetric band matrix
-*
-         K3 = KL + 1
-         K4 = N + 1
-         DO 110 J = 1, N
-            DO 100 I = 1, MIN( K3, K4-J )
-               A( I, J ) = A( I, J )*MUL
-  100       CONTINUE
-  110    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.5 ) THEN
-*
-*        Upper half of a symmetric band matrix
-*
-         K1 = KU + 2
-         K3 = KU + 1
-         DO 130 J = 1, N
-            DO 120 I = MAX( K1-J, 1 ), K3
-               A( I, J ) = A( I, J )*MUL
-  120       CONTINUE
-  130    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.6 ) THEN
-*
-*        Band matrix
-*
-         K1 = KL + KU + 2
-         K2 = KL + 1
-         K3 = 2*KL + KU + 1
-         K4 = KL + KU + 1 + M
-         DO 150 J = 1, N
-            DO 140 I = MAX( K1-J, K2 ), MIN( K3, K4-J )
-               A( I, J ) = A( I, J )*MUL
-  140       CONTINUE
-  150    CONTINUE
-*
-      END IF
-*
-      IF( .NOT.DONE )
-     $   GO TO 10
-*
-      RETURN
-*
-*     End of DLASCL
-*
-      END
--- a/libcruft/lapack/dlasd0.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,230 +0,0 @@
-      SUBROUTINE DLASD0( N, SQRE, D, E, U, LDU, VT, LDVT, SMLSIZ, IWORK,
-     $                   WORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDU, LDVT, N, SMLSIZ, SQRE
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      DOUBLE PRECISION   D( * ), E( * ), U( LDU, * ), VT( LDVT, * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  Using a divide and conquer approach, DLASD0 computes the singular
-*  value decomposition (SVD) of a real upper bidiagonal N-by-M
-*  matrix B with diagonal D and offdiagonal E, where M = N + SQRE.
-*  The algorithm computes orthogonal matrices U and VT such that
-*  B = U * S * VT. The singular values S are overwritten on D.
-*
-*  A related subroutine, DLASDA, computes only the singular values,
-*  and optionally, the singular vectors in compact form.
-*
-*  Arguments
-*  =========
-*
-*  N      (input) INTEGER
-*         On entry, the row dimension of the upper bidiagonal matrix.
-*         This is also the dimension of the main diagonal array D.
-*
-*  SQRE   (input) INTEGER
-*         Specifies the column dimension of the bidiagonal matrix.
-*         = 0: The bidiagonal matrix has column dimension M = N;
-*         = 1: The bidiagonal matrix has column dimension M = N+1;
-*
-*  D      (input/output) DOUBLE PRECISION array, dimension (N)
-*         On entry D contains the main diagonal of the bidiagonal
-*         matrix.
-*         On exit D, if INFO = 0, contains its singular values.
-*
-*  E      (input) DOUBLE PRECISION array, dimension (M-1)
-*         Contains the subdiagonal entries of the bidiagonal matrix.
-*         On exit, E has been destroyed.
-*
-*  U      (output) DOUBLE PRECISION array, dimension at least (LDQ, N)
-*         On exit, U contains the left singular vectors.
-*
-*  LDU    (input) INTEGER
-*         On entry, leading dimension of U.
-*
-*  VT     (output) DOUBLE PRECISION array, dimension at least (LDVT, M)
-*         On exit, VT' contains the right singular vectors.
-*
-*  LDVT   (input) INTEGER
-*         On entry, leading dimension of VT.
-*
-*  SMLSIZ (input) INTEGER
-*         On entry, maximum size of the subproblems at the
-*         bottom of the computation tree.
-*
-*  IWORK  (workspace) INTEGER work array.
-*         Dimension must be at least (8 * N)
-*
-*  WORK   (workspace) DOUBLE PRECISION work array.
-*         Dimension must be at least (3 * M**2 + 2 * M)
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if INFO = 1, an singular value did not converge
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, I1, IC, IDXQ, IDXQC, IM1, INODE, ITEMP, IWK,
-     $                   J, LF, LL, LVL, M, NCC, ND, NDB1, NDIML, NDIMR,
-     $                   NL, NLF, NLP1, NLVL, NR, NRF, NRP1, SQREI
-      DOUBLE PRECISION   ALPHA, BETA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLASD1, DLASDQ, DLASDT, XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN
-         INFO = -2
-      END IF
-*
-      M = N + SQRE
-*
-      IF( LDU.LT.N ) THEN
-         INFO = -6
-      ELSE IF( LDVT.LT.M ) THEN
-         INFO = -8
-      ELSE IF( SMLSIZ.LT.3 ) THEN
-         INFO = -9
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLASD0', -INFO )
-         RETURN
-      END IF
-*
-*     If the input matrix is too small, call DLASDQ to find the SVD.
-*
-      IF( N.LE.SMLSIZ ) THEN
-         CALL DLASDQ( 'U', SQRE, N, M, N, 0, D, E, VT, LDVT, U, LDU, U,
-     $                LDU, WORK, INFO )
-         RETURN
-      END IF
-*
-*     Set up the computation tree.
-*
-      INODE = 1
-      NDIML = INODE + N
-      NDIMR = NDIML + N
-      IDXQ = NDIMR + N
-      IWK = IDXQ + N
-      CALL DLASDT( N, NLVL, ND, IWORK( INODE ), IWORK( NDIML ),
-     $             IWORK( NDIMR ), SMLSIZ )
-*
-*     For the nodes on bottom level of the tree, solve
-*     their subproblems by DLASDQ.
-*
-      NDB1 = ( ND+1 ) / 2
-      NCC = 0
-      DO 30 I = NDB1, ND
-*
-*     IC : center row of each node
-*     NL : number of rows of left  subproblem
-*     NR : number of rows of right subproblem
-*     NLF: starting row of the left   subproblem
-*     NRF: starting row of the right  subproblem
-*
-         I1 = I - 1
-         IC = IWORK( INODE+I1 )
-         NL = IWORK( NDIML+I1 )
-         NLP1 = NL + 1
-         NR = IWORK( NDIMR+I1 )
-         NRP1 = NR + 1
-         NLF = IC - NL
-         NRF = IC + 1
-         SQREI = 1
-         CALL DLASDQ( 'U', SQREI, NL, NLP1, NL, NCC, D( NLF ), E( NLF ),
-     $                VT( NLF, NLF ), LDVT, U( NLF, NLF ), LDU,
-     $                U( NLF, NLF ), LDU, WORK, INFO )
-         IF( INFO.NE.0 ) THEN
-            RETURN
-         END IF
-         ITEMP = IDXQ + NLF - 2
-         DO 10 J = 1, NL
-            IWORK( ITEMP+J ) = J
-   10    CONTINUE
-         IF( I.EQ.ND ) THEN
-            SQREI = SQRE
-         ELSE
-            SQREI = 1
-         END IF
-         NRP1 = NR + SQREI
-         CALL DLASDQ( 'U', SQREI, NR, NRP1, NR, NCC, D( NRF ), E( NRF ),
-     $                VT( NRF, NRF ), LDVT, U( NRF, NRF ), LDU,
-     $                U( NRF, NRF ), LDU, WORK, INFO )
-         IF( INFO.NE.0 ) THEN
-            RETURN
-         END IF
-         ITEMP = IDXQ + IC
-         DO 20 J = 1, NR
-            IWORK( ITEMP+J-1 ) = J
-   20    CONTINUE
-   30 CONTINUE
-*
-*     Now conquer each subproblem bottom-up.
-*
-      DO 50 LVL = NLVL, 1, -1
-*
-*        Find the first node LF and last node LL on the
-*        current level LVL.
-*
-         IF( LVL.EQ.1 ) THEN
-            LF = 1
-            LL = 1
-         ELSE
-            LF = 2**( LVL-1 )
-            LL = 2*LF - 1
-         END IF
-         DO 40 I = LF, LL
-            IM1 = I - 1
-            IC = IWORK( INODE+IM1 )
-            NL = IWORK( NDIML+IM1 )
-            NR = IWORK( NDIMR+IM1 )
-            NLF = IC - NL
-            IF( ( SQRE.EQ.0 ) .AND. ( I.EQ.LL ) ) THEN
-               SQREI = SQRE
-            ELSE
-               SQREI = 1
-            END IF
-            IDXQC = IDXQ + NLF - 1
-            ALPHA = D( IC )
-            BETA = E( IC )
-            CALL DLASD1( NL, NR, SQREI, D( NLF ), ALPHA, BETA,
-     $                   U( NLF, NLF ), LDU, VT( NLF, NLF ), LDVT,
-     $                   IWORK( IDXQC ), IWORK( IWK ), WORK, INFO )
-            IF( INFO.NE.0 ) THEN
-               RETURN
-            END IF
-   40    CONTINUE
-   50 CONTINUE
-*
-      RETURN
-*
-*     End of DLASD0
-*
-      END
--- a/libcruft/lapack/dlasd1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,232 +0,0 @@
-      SUBROUTINE DLASD1( NL, NR, SQRE, D, ALPHA, BETA, U, LDU, VT, LDVT,
-     $                   IDXQ, IWORK, WORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDU, LDVT, NL, NR, SQRE
-      DOUBLE PRECISION   ALPHA, BETA
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IDXQ( * ), IWORK( * )
-      DOUBLE PRECISION   D( * ), U( LDU, * ), VT( LDVT, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASD1 computes the SVD of an upper bidiagonal N-by-M matrix B,
-*  where N = NL + NR + 1 and M = N + SQRE. DLASD1 is called from DLASD0.
-*
-*  A related subroutine DLASD7 handles the case in which the singular
-*  values (and the singular vectors in factored form) are desired.
-*
-*  DLASD1 computes the SVD as follows:
-*
-*                ( D1(in)  0    0     0 )
-*    B = U(in) * (   Z1'   a   Z2'    b ) * VT(in)
-*                (   0     0   D2(in) 0 )
-*
-*      = U(out) * ( D(out) 0) * VT(out)
-*
-*  where Z' = (Z1' a Z2' b) = u' VT', and u is a vector of dimension M
-*  with ALPHA and BETA in the NL+1 and NL+2 th entries and zeros
-*  elsewhere; and the entry b is empty if SQRE = 0.
-*
-*  The left singular vectors of the original matrix are stored in U, and
-*  the transpose of the right singular vectors are stored in VT, and the
-*  singular values are in D.  The algorithm consists of three stages:
-*
-*     The first stage consists of deflating the size of the problem
-*     when there are multiple singular values or when there are zeros in
-*     the Z vector.  For each such occurence the dimension of the
-*     secular equation problem is reduced by one.  This stage is
-*     performed by the routine DLASD2.
-*
-*     The second stage consists of calculating the updated
-*     singular values. This is done by finding the square roots of the
-*     roots of the secular equation via the routine DLASD4 (as called
-*     by DLASD3). This routine also calculates the singular vectors of
-*     the current problem.
-*
-*     The final stage consists of computing the updated singular vectors
-*     directly using the updated singular values.  The singular vectors
-*     for the current problem are multiplied with the singular vectors
-*     from the overall problem.
-*
-*  Arguments
-*  =========
-*
-*  NL     (input) INTEGER
-*         The row dimension of the upper block.  NL >= 1.
-*
-*  NR     (input) INTEGER
-*         The row dimension of the lower block.  NR >= 1.
-*
-*  SQRE   (input) INTEGER
-*         = 0: the lower block is an NR-by-NR square matrix.
-*         = 1: the lower block is an NR-by-(NR+1) rectangular matrix.
-*
-*         The bidiagonal matrix has row dimension N = NL + NR + 1,
-*         and column dimension M = N + SQRE.
-*
-*  D      (input/output) DOUBLE PRECISION array,
-*                        dimension (N = NL+NR+1).
-*         On entry D(1:NL,1:NL) contains the singular values of the
-*         upper block; and D(NL+2:N) contains the singular values of
-*         the lower block. On exit D(1:N) contains the singular values
-*         of the modified matrix.
-*
-*  ALPHA  (input/output) DOUBLE PRECISION
-*         Contains the diagonal element associated with the added row.
-*
-*  BETA   (input/output) DOUBLE PRECISION
-*         Contains the off-diagonal element associated with the added
-*         row.
-*
-*  U      (input/output) DOUBLE PRECISION array, dimension(LDU,N)
-*         On entry U(1:NL, 1:NL) contains the left singular vectors of
-*         the upper block; U(NL+2:N, NL+2:N) contains the left singular
-*         vectors of the lower block. On exit U contains the left
-*         singular vectors of the bidiagonal matrix.
-*
-*  LDU    (input) INTEGER
-*         The leading dimension of the array U.  LDU >= max( 1, N ).
-*
-*  VT     (input/output) DOUBLE PRECISION array, dimension(LDVT,M)
-*         where M = N + SQRE.
-*         On entry VT(1:NL+1, 1:NL+1)' contains the right singular
-*         vectors of the upper block; VT(NL+2:M, NL+2:M)' contains
-*         the right singular vectors of the lower block. On exit
-*         VT' contains the right singular vectors of the
-*         bidiagonal matrix.
-*
-*  LDVT   (input) INTEGER
-*         The leading dimension of the array VT.  LDVT >= max( 1, M ).
-*
-*  IDXQ  (output) INTEGER array, dimension(N)
-*         This contains the permutation which will reintegrate the
-*         subproblem just solved back into sorted order, i.e.
-*         D( IDXQ( I = 1, N ) ) will be in ascending order.
-*
-*  IWORK  (workspace) INTEGER array, dimension( 4 * N )
-*
-*  WORK   (workspace) DOUBLE PRECISION array, dimension( 3*M**2 + 2*M )
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if INFO = 1, an singular value did not converge
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-*
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            COLTYP, I, IDX, IDXC, IDXP, IQ, ISIGMA, IU2,
-     $                   IVT2, IZ, K, LDQ, LDU2, LDVT2, M, N, N1, N2
-      DOUBLE PRECISION   ORGNRM
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLAMRG, DLASCL, DLASD2, DLASD3, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( NL.LT.1 ) THEN
-         INFO = -1
-      ELSE IF( NR.LT.1 ) THEN
-         INFO = -2
-      ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN
-         INFO = -3
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLASD1', -INFO )
-         RETURN
-      END IF
-*
-      N = NL + NR + 1
-      M = N + SQRE
-*
-*     The following values are for bookkeeping purposes only.  They are
-*     integer pointers which indicate the portion of the workspace
-*     used by a particular array in DLASD2 and DLASD3.
-*
-      LDU2 = N
-      LDVT2 = M
-*
-      IZ = 1
-      ISIGMA = IZ + M
-      IU2 = ISIGMA + N
-      IVT2 = IU2 + LDU2*N
-      IQ = IVT2 + LDVT2*M
-*
-      IDX = 1
-      IDXC = IDX + N
-      COLTYP = IDXC + N
-      IDXP = COLTYP + N
-*
-*     Scale.
-*
-      ORGNRM = MAX( ABS( ALPHA ), ABS( BETA ) )
-      D( NL+1 ) = ZERO
-      DO 10 I = 1, N
-         IF( ABS( D( I ) ).GT.ORGNRM ) THEN
-            ORGNRM = ABS( D( I ) )
-         END IF
-   10 CONTINUE
-      CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, N, 1, D, N, INFO )
-      ALPHA = ALPHA / ORGNRM
-      BETA = BETA / ORGNRM
-*
-*     Deflate singular values.
-*
-      CALL DLASD2( NL, NR, SQRE, K, D, WORK( IZ ), ALPHA, BETA, U, LDU,
-     $             VT, LDVT, WORK( ISIGMA ), WORK( IU2 ), LDU2,
-     $             WORK( IVT2 ), LDVT2, IWORK( IDXP ), IWORK( IDX ),
-     $             IWORK( IDXC ), IDXQ, IWORK( COLTYP ), INFO )
-*
-*     Solve Secular Equation and update singular vectors.
-*
-      LDQ = K
-      CALL DLASD3( NL, NR, SQRE, K, D, WORK( IQ ), LDQ, WORK( ISIGMA ),
-     $             U, LDU, WORK( IU2 ), LDU2, VT, LDVT, WORK( IVT2 ),
-     $             LDVT2, IWORK( IDXC ), IWORK( COLTYP ), WORK( IZ ),
-     $             INFO )
-      IF( INFO.NE.0 ) THEN
-         RETURN
-      END IF
-*
-*     Unscale.
-*
-      CALL DLASCL( 'G', 0, 0, ONE, ORGNRM, N, 1, D, N, INFO )
-*
-*     Prepare the IDXQ sorting permutation.
-*
-      N1 = K
-      N2 = N - K
-      CALL DLAMRG( N1, N2, D, 1, -1, IDXQ )
-*
-      RETURN
-*
-*     End of DLASD1
-*
-      END
--- a/libcruft/lapack/dlasd2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,512 +0,0 @@
-      SUBROUTINE DLASD2( NL, NR, SQRE, K, D, Z, ALPHA, BETA, U, LDU, VT,
-     $                   LDVT, DSIGMA, U2, LDU2, VT2, LDVT2, IDXP, IDX,
-     $                   IDXC, IDXQ, COLTYP, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDU, LDU2, LDVT, LDVT2, NL, NR, SQRE
-      DOUBLE PRECISION   ALPHA, BETA
-*     ..
-*     .. Array Arguments ..
-      INTEGER            COLTYP( * ), IDX( * ), IDXC( * ), IDXP( * ),
-     $                   IDXQ( * )
-      DOUBLE PRECISION   D( * ), DSIGMA( * ), U( LDU, * ),
-     $                   U2( LDU2, * ), VT( LDVT, * ), VT2( LDVT2, * ),
-     $                   Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASD2 merges the two sets of singular values together into a single
-*  sorted set.  Then it tries to deflate the size of the problem.
-*  There are two ways in which deflation can occur:  when two or more
-*  singular values are close together or if there is a tiny entry in the
-*  Z vector.  For each such occurrence the order of the related secular
-*  equation problem is reduced by one.
-*
-*  DLASD2 is called from DLASD1.
-*
-*  Arguments
-*  =========
-*
-*  NL     (input) INTEGER
-*         The row dimension of the upper block.  NL >= 1.
-*
-*  NR     (input) INTEGER
-*         The row dimension of the lower block.  NR >= 1.
-*
-*  SQRE   (input) INTEGER
-*         = 0: the lower block is an NR-by-NR square matrix.
-*         = 1: the lower block is an NR-by-(NR+1) rectangular matrix.
-*
-*         The bidiagonal matrix has N = NL + NR + 1 rows and
-*         M = N + SQRE >= N columns.
-*
-*  K      (output) INTEGER
-*         Contains the dimension of the non-deflated matrix,
-*         This is the order of the related secular equation. 1 <= K <=N.
-*
-*  D      (input/output) DOUBLE PRECISION array, dimension(N)
-*         On entry D contains the singular values of the two submatrices
-*         to be combined.  On exit D contains the trailing (N-K) updated
-*         singular values (those which were deflated) sorted into
-*         increasing order.
-*
-*  Z      (output) DOUBLE PRECISION array, dimension(N)
-*         On exit Z contains the updating row vector in the secular
-*         equation.
-*
-*  ALPHA  (input) DOUBLE PRECISION
-*         Contains the diagonal element associated with the added row.
-*
-*  BETA   (input) DOUBLE PRECISION
-*         Contains the off-diagonal element associated with the added
-*         row.
-*
-*  U      (input/output) DOUBLE PRECISION array, dimension(LDU,N)
-*         On entry U contains the left singular vectors of two
-*         submatrices in the two square blocks with corners at (1,1),
-*         (NL, NL), and (NL+2, NL+2), (N,N).
-*         On exit U contains the trailing (N-K) updated left singular
-*         vectors (those which were deflated) in its last N-K columns.
-*
-*  LDU    (input) INTEGER
-*         The leading dimension of the array U.  LDU >= N.
-*
-*  VT     (input/output) DOUBLE PRECISION array, dimension(LDVT,M)
-*         On entry VT' contains the right singular vectors of two
-*         submatrices in the two square blocks with corners at (1,1),
-*         (NL+1, NL+1), and (NL+2, NL+2), (M,M).
-*         On exit VT' contains the trailing (N-K) updated right singular
-*         vectors (those which were deflated) in its last N-K columns.
-*         In case SQRE =1, the last row of VT spans the right null
-*         space.
-*
-*  LDVT   (input) INTEGER
-*         The leading dimension of the array VT.  LDVT >= M.
-*
-*  DSIGMA (output) DOUBLE PRECISION array, dimension (N)
-*         Contains a copy of the diagonal elements (K-1 singular values
-*         and one zero) in the secular equation.
-*
-*  U2     (output) DOUBLE PRECISION array, dimension(LDU2,N)
-*         Contains a copy of the first K-1 left singular vectors which
-*         will be used by DLASD3 in a matrix multiply (DGEMM) to solve
-*         for the new left singular vectors. U2 is arranged into four
-*         blocks. The first block contains a column with 1 at NL+1 and
-*         zero everywhere else; the second block contains non-zero
-*         entries only at and above NL; the third contains non-zero
-*         entries only below NL+1; and the fourth is dense.
-*
-*  LDU2   (input) INTEGER
-*         The leading dimension of the array U2.  LDU2 >= N.
-*
-*  VT2    (output) DOUBLE PRECISION array, dimension(LDVT2,N)
-*         VT2' contains a copy of the first K right singular vectors
-*         which will be used by DLASD3 in a matrix multiply (DGEMM) to
-*         solve for the new right singular vectors. VT2 is arranged into
-*         three blocks. The first block contains a row that corresponds
-*         to the special 0 diagonal element in SIGMA; the second block
-*         contains non-zeros only at and before NL +1; the third block
-*         contains non-zeros only at and after  NL +2.
-*
-*  LDVT2  (input) INTEGER
-*         The leading dimension of the array VT2.  LDVT2 >= M.
-*
-*  IDXP   (workspace) INTEGER array dimension(N)
-*         This will contain the permutation used to place deflated
-*         values of D at the end of the array. On output IDXP(2:K)
-*         points to the nondeflated D-values and IDXP(K+1:N)
-*         points to the deflated singular values.
-*
-*  IDX    (workspace) INTEGER array dimension(N)
-*         This will contain the permutation used to sort the contents of
-*         D into ascending order.
-*
-*  IDXC   (output) INTEGER array dimension(N)
-*         This will contain the permutation used to arrange the columns
-*         of the deflated U matrix into three groups:  the first group
-*         contains non-zero entries only at and above NL, the second
-*         contains non-zero entries only below NL+2, and the third is
-*         dense.
-*
-*  IDXQ   (input/output) INTEGER array dimension(N)
-*         This contains the permutation which separately sorts the two
-*         sub-problems in D into ascending order.  Note that entries in
-*         the first hlaf of this permutation must first be moved one
-*         position backward; and entries in the second half
-*         must first have NL+1 added to their values.
-*
-*  COLTYP (workspace/output) INTEGER array dimension(N)
-*         As workspace, this will contain a label which will indicate
-*         which of the following types a column in the U2 matrix or a
-*         row in the VT2 matrix is:
-*         1 : non-zero in the upper half only
-*         2 : non-zero in the lower half only
-*         3 : dense
-*         4 : deflated
-*
-*         On exit, it is an array of dimension 4, with COLTYP(I) being
-*         the dimension of the I-th type columns.
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE, TWO, EIGHT
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0,
-     $                   EIGHT = 8.0D+0 )
-*     ..
-*     .. Local Arrays ..
-      INTEGER            CTOT( 4 ), PSM( 4 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            CT, I, IDXI, IDXJ, IDXJP, J, JP, JPREV, K2, M,
-     $                   N, NLP1, NLP2
-      DOUBLE PRECISION   C, EPS, HLFTOL, S, TAU, TOL, Z1
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH, DLAPY2
-      EXTERNAL           DLAMCH, DLAPY2
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DLACPY, DLAMRG, DLASET, DROT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( NL.LT.1 ) THEN
-         INFO = -1
-      ELSE IF( NR.LT.1 ) THEN
-         INFO = -2
-      ELSE IF( ( SQRE.NE.1 ) .AND. ( SQRE.NE.0 ) ) THEN
-         INFO = -3
-      END IF
-*
-      N = NL + NR + 1
-      M = N + SQRE
-*
-      IF( LDU.LT.N ) THEN
-         INFO = -10
-      ELSE IF( LDVT.LT.M ) THEN
-         INFO = -12
-      ELSE IF( LDU2.LT.N ) THEN
-         INFO = -15
-      ELSE IF( LDVT2.LT.M ) THEN
-         INFO = -17
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLASD2', -INFO )
-         RETURN
-      END IF
-*
-      NLP1 = NL + 1
-      NLP2 = NL + 2
-*
-*     Generate the first part of the vector Z; and move the singular
-*     values in the first part of D one position backward.
-*
-      Z1 = ALPHA*VT( NLP1, NLP1 )
-      Z( 1 ) = Z1
-      DO 10 I = NL, 1, -1
-         Z( I+1 ) = ALPHA*VT( I, NLP1 )
-         D( I+1 ) = D( I )
-         IDXQ( I+1 ) = IDXQ( I ) + 1
-   10 CONTINUE
-*
-*     Generate the second part of the vector Z.
-*
-      DO 20 I = NLP2, M
-         Z( I ) = BETA*VT( I, NLP2 )
-   20 CONTINUE
-*
-*     Initialize some reference arrays.
-*
-      DO 30 I = 2, NLP1
-         COLTYP( I ) = 1
-   30 CONTINUE
-      DO 40 I = NLP2, N
-         COLTYP( I ) = 2
-   40 CONTINUE
-*
-*     Sort the singular values into increasing order
-*
-      DO 50 I = NLP2, N
-         IDXQ( I ) = IDXQ( I ) + NLP1
-   50 CONTINUE
-*
-*     DSIGMA, IDXC, IDXC, and the first column of U2
-*     are used as storage space.
-*
-      DO 60 I = 2, N
-         DSIGMA( I ) = D( IDXQ( I ) )
-         U2( I, 1 ) = Z( IDXQ( I ) )
-         IDXC( I ) = COLTYP( IDXQ( I ) )
-   60 CONTINUE
-*
-      CALL DLAMRG( NL, NR, DSIGMA( 2 ), 1, 1, IDX( 2 ) )
-*
-      DO 70 I = 2, N
-         IDXI = 1 + IDX( I )
-         D( I ) = DSIGMA( IDXI )
-         Z( I ) = U2( IDXI, 1 )
-         COLTYP( I ) = IDXC( IDXI )
-   70 CONTINUE
-*
-*     Calculate the allowable deflation tolerance
-*
-      EPS = DLAMCH( 'Epsilon' )
-      TOL = MAX( ABS( ALPHA ), ABS( BETA ) )
-      TOL = EIGHT*EPS*MAX( ABS( D( N ) ), TOL )
-*
-*     There are 2 kinds of deflation -- first a value in the z-vector
-*     is small, second two (or more) singular values are very close
-*     together (their difference is small).
-*
-*     If the value in the z-vector is small, we simply permute the
-*     array so that the corresponding singular value is moved to the
-*     end.
-*
-*     If two values in the D-vector are close, we perform a two-sided
-*     rotation designed to make one of the corresponding z-vector
-*     entries zero, and then permute the array so that the deflated
-*     singular value is moved to the end.
-*
-*     If there are multiple singular values then the problem deflates.
-*     Here the number of equal singular values are found.  As each equal
-*     singular value is found, an elementary reflector is computed to
-*     rotate the corresponding singular subspace so that the
-*     corresponding components of Z are zero in this new basis.
-*
-      K = 1
-      K2 = N + 1
-      DO 80 J = 2, N
-         IF( ABS( Z( J ) ).LE.TOL ) THEN
-*
-*           Deflate due to small z component.
-*
-            K2 = K2 - 1
-            IDXP( K2 ) = J
-            COLTYP( J ) = 4
-            IF( J.EQ.N )
-     $         GO TO 120
-         ELSE
-            JPREV = J
-            GO TO 90
-         END IF
-   80 CONTINUE
-   90 CONTINUE
-      J = JPREV
-  100 CONTINUE
-      J = J + 1
-      IF( J.GT.N )
-     $   GO TO 110
-      IF( ABS( Z( J ) ).LE.TOL ) THEN
-*
-*        Deflate due to small z component.
-*
-         K2 = K2 - 1
-         IDXP( K2 ) = J
-         COLTYP( J ) = 4
-      ELSE
-*
-*        Check if singular values are close enough to allow deflation.
-*
-         IF( ABS( D( J )-D( JPREV ) ).LE.TOL ) THEN
-*
-*           Deflation is possible.
-*
-            S = Z( JPREV )
-            C = Z( J )
-*
-*           Find sqrt(a**2+b**2) without overflow or
-*           destructive underflow.
-*
-            TAU = DLAPY2( C, S )
-            C = C / TAU
-            S = -S / TAU
-            Z( J ) = TAU
-            Z( JPREV ) = ZERO
-*
-*           Apply back the Givens rotation to the left and right
-*           singular vector matrices.
-*
-            IDXJP = IDXQ( IDX( JPREV )+1 )
-            IDXJ = IDXQ( IDX( J )+1 )
-            IF( IDXJP.LE.NLP1 ) THEN
-               IDXJP = IDXJP - 1
-            END IF
-            IF( IDXJ.LE.NLP1 ) THEN
-               IDXJ = IDXJ - 1
-            END IF
-            CALL DROT( N, U( 1, IDXJP ), 1, U( 1, IDXJ ), 1, C, S )
-            CALL DROT( M, VT( IDXJP, 1 ), LDVT, VT( IDXJ, 1 ), LDVT, C,
-     $                 S )
-            IF( COLTYP( J ).NE.COLTYP( JPREV ) ) THEN
-               COLTYP( J ) = 3
-            END IF
-            COLTYP( JPREV ) = 4
-            K2 = K2 - 1
-            IDXP( K2 ) = JPREV
-            JPREV = J
-         ELSE
-            K = K + 1
-            U2( K, 1 ) = Z( JPREV )
-            DSIGMA( K ) = D( JPREV )
-            IDXP( K ) = JPREV
-            JPREV = J
-         END IF
-      END IF
-      GO TO 100
-  110 CONTINUE
-*
-*     Record the last singular value.
-*
-      K = K + 1
-      U2( K, 1 ) = Z( JPREV )
-      DSIGMA( K ) = D( JPREV )
-      IDXP( K ) = JPREV
-*
-  120 CONTINUE
-*
-*     Count up the total number of the various types of columns, then
-*     form a permutation which positions the four column types into
-*     four groups of uniform structure (although one or more of these
-*     groups may be empty).
-*
-      DO 130 J = 1, 4
-         CTOT( J ) = 0
-  130 CONTINUE
-      DO 140 J = 2, N
-         CT = COLTYP( J )
-         CTOT( CT ) = CTOT( CT ) + 1
-  140 CONTINUE
-*
-*     PSM(*) = Position in SubMatrix (of types 1 through 4)
-*
-      PSM( 1 ) = 2
-      PSM( 2 ) = 2 + CTOT( 1 )
-      PSM( 3 ) = PSM( 2 ) + CTOT( 2 )
-      PSM( 4 ) = PSM( 3 ) + CTOT( 3 )
-*
-*     Fill out the IDXC array so that the permutation which it induces
-*     will place all type-1 columns first, all type-2 columns next,
-*     then all type-3's, and finally all type-4's, starting from the
-*     second column. This applies similarly to the rows of VT.
-*
-      DO 150 J = 2, N
-         JP = IDXP( J )
-         CT = COLTYP( JP )
-         IDXC( PSM( CT ) ) = J
-         PSM( CT ) = PSM( CT ) + 1
-  150 CONTINUE
-*
-*     Sort the singular values and corresponding singular vectors into
-*     DSIGMA, U2, and VT2 respectively.  The singular values/vectors
-*     which were not deflated go into the first K slots of DSIGMA, U2,
-*     and VT2 respectively, while those which were deflated go into the
-*     last N - K slots, except that the first column/row will be treated
-*     separately.
-*
-      DO 160 J = 2, N
-         JP = IDXP( J )
-         DSIGMA( J ) = D( JP )
-         IDXJ = IDXQ( IDX( IDXP( IDXC( J ) ) )+1 )
-         IF( IDXJ.LE.NLP1 ) THEN
-            IDXJ = IDXJ - 1
-         END IF
-         CALL DCOPY( N, U( 1, IDXJ ), 1, U2( 1, J ), 1 )
-         CALL DCOPY( M, VT( IDXJ, 1 ), LDVT, VT2( J, 1 ), LDVT2 )
-  160 CONTINUE
-*
-*     Determine DSIGMA(1), DSIGMA(2) and Z(1)
-*
-      DSIGMA( 1 ) = ZERO
-      HLFTOL = TOL / TWO
-      IF( ABS( DSIGMA( 2 ) ).LE.HLFTOL )
-     $   DSIGMA( 2 ) = HLFTOL
-      IF( M.GT.N ) THEN
-         Z( 1 ) = DLAPY2( Z1, Z( M ) )
-         IF( Z( 1 ).LE.TOL ) THEN
-            C = ONE
-            S = ZERO
-            Z( 1 ) = TOL
-         ELSE
-            C = Z1 / Z( 1 )
-            S = Z( M ) / Z( 1 )
-         END IF
-      ELSE
-         IF( ABS( Z1 ).LE.TOL ) THEN
-            Z( 1 ) = TOL
-         ELSE
-            Z( 1 ) = Z1
-         END IF
-      END IF
-*
-*     Move the rest of the updating row to Z.
-*
-      CALL DCOPY( K-1, U2( 2, 1 ), 1, Z( 2 ), 1 )
-*
-*     Determine the first column of U2, the first row of VT2 and the
-*     last row of VT.
-*
-      CALL DLASET( 'A', N, 1, ZERO, ZERO, U2, LDU2 )
-      U2( NLP1, 1 ) = ONE
-      IF( M.GT.N ) THEN
-         DO 170 I = 1, NLP1
-            VT( M, I ) = -S*VT( NLP1, I )
-            VT2( 1, I ) = C*VT( NLP1, I )
-  170    CONTINUE
-         DO 180 I = NLP2, M
-            VT2( 1, I ) = S*VT( M, I )
-            VT( M, I ) = C*VT( M, I )
-  180    CONTINUE
-      ELSE
-         CALL DCOPY( M, VT( NLP1, 1 ), LDVT, VT2( 1, 1 ), LDVT2 )
-      END IF
-      IF( M.GT.N ) THEN
-         CALL DCOPY( M, VT( M, 1 ), LDVT, VT2( M, 1 ), LDVT2 )
-      END IF
-*
-*     The deflated singular values and their corresponding vectors go
-*     into the back of D, U, and V respectively.
-*
-      IF( N.GT.K ) THEN
-         CALL DCOPY( N-K, DSIGMA( K+1 ), 1, D( K+1 ), 1 )
-         CALL DLACPY( 'A', N, N-K, U2( 1, K+1 ), LDU2, U( 1, K+1 ),
-     $                LDU )
-         CALL DLACPY( 'A', N-K, M, VT2( K+1, 1 ), LDVT2, VT( K+1, 1 ),
-     $                LDVT )
-      END IF
-*
-*     Copy CTOT into COLTYP for referencing in DLASD3.
-*
-      DO 190 J = 1, 4
-         COLTYP( J ) = CTOT( J )
-  190 CONTINUE
-*
-      RETURN
-*
-*     End of DLASD2
-*
-      END
--- a/libcruft/lapack/dlasd3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,358 +0,0 @@
-      SUBROUTINE DLASD3( NL, NR, SQRE, K, D, Q, LDQ, DSIGMA, U, LDU, U2,
-     $                   LDU2, VT, LDVT, VT2, LDVT2, IDXC, CTOT, Z,
-     $                   INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDQ, LDU, LDU2, LDVT, LDVT2, NL, NR,
-     $                   SQRE
-*     ..
-*     .. Array Arguments ..
-      INTEGER            CTOT( * ), IDXC( * )
-      DOUBLE PRECISION   D( * ), DSIGMA( * ), Q( LDQ, * ), U( LDU, * ),
-     $                   U2( LDU2, * ), VT( LDVT, * ), VT2( LDVT2, * ),
-     $                   Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASD3 finds all the square roots of the roots of the secular
-*  equation, as defined by the values in D and Z.  It makes the
-*  appropriate calls to DLASD4 and then updates the singular
-*  vectors by matrix multiplication.
-*
-*  This code makes very mild assumptions about floating point
-*  arithmetic. It will work on machines with a guard digit in
-*  add/subtract, or on those binary machines without guard digits
-*  which subtract like the Cray XMP, Cray YMP, Cray C 90, or Cray 2.
-*  It could conceivably fail on hexadecimal or decimal machines
-*  without guard digits, but we know of none.
-*
-*  DLASD3 is called from DLASD1.
-*
-*  Arguments
-*  =========
-*
-*  NL     (input) INTEGER
-*         The row dimension of the upper block.  NL >= 1.
-*
-*  NR     (input) INTEGER
-*         The row dimension of the lower block.  NR >= 1.
-*
-*  SQRE   (input) INTEGER
-*         = 0: the lower block is an NR-by-NR square matrix.
-*         = 1: the lower block is an NR-by-(NR+1) rectangular matrix.
-*
-*         The bidiagonal matrix has N = NL + NR + 1 rows and
-*         M = N + SQRE >= N columns.
-*
-*  K      (input) INTEGER
-*         The size of the secular equation, 1 =< K = < N.
-*
-*  D      (output) DOUBLE PRECISION array, dimension(K)
-*         On exit the square roots of the roots of the secular equation,
-*         in ascending order.
-*
-*  Q      (workspace) DOUBLE PRECISION array,
-*                     dimension at least (LDQ,K).
-*
-*  LDQ    (input) INTEGER
-*         The leading dimension of the array Q.  LDQ >= K.
-*
-*  DSIGMA (input) DOUBLE PRECISION array, dimension(K)
-*         The first K elements of this array contain the old roots
-*         of the deflated updating problem.  These are the poles
-*         of the secular equation.
-*
-*  U      (output) DOUBLE PRECISION array, dimension (LDU, N)
-*         The last N - K columns of this matrix contain the deflated
-*         left singular vectors.
-*
-*  LDU    (input) INTEGER
-*         The leading dimension of the array U.  LDU >= N.
-*
-*  U2     (input/output) DOUBLE PRECISION array, dimension (LDU2, N)
-*         The first K columns of this matrix contain the non-deflated
-*         left singular vectors for the split problem.
-*
-*  LDU2   (input) INTEGER
-*         The leading dimension of the array U2.  LDU2 >= N.
-*
-*  VT     (output) DOUBLE PRECISION array, dimension (LDVT, M)
-*         The last M - K columns of VT' contain the deflated
-*         right singular vectors.
-*
-*  LDVT   (input) INTEGER
-*         The leading dimension of the array VT.  LDVT >= N.
-*
-*  VT2    (input/output) DOUBLE PRECISION array, dimension (LDVT2, N)
-*         The first K columns of VT2' contain the non-deflated
-*         right singular vectors for the split problem.
-*
-*  LDVT2  (input) INTEGER
-*         The leading dimension of the array VT2.  LDVT2 >= N.
-*
-*  IDXC   (input) INTEGER array, dimension ( N )
-*         The permutation used to arrange the columns of U (and rows of
-*         VT) into three groups:  the first group contains non-zero
-*         entries only at and above (or before) NL +1; the second
-*         contains non-zero entries only at and below (or after) NL+2;
-*         and the third is dense. The first column of U and the row of
-*         VT are treated separately, however.
-*
-*         The rows of the singular vectors found by DLASD4
-*         must be likewise permuted before the matrix multiplies can
-*         take place.
-*
-*  CTOT   (input) INTEGER array, dimension ( 4 )
-*         A count of the total number of the various types of columns
-*         in U (or rows in VT), as described in IDXC. The fourth column
-*         type is any column which has been deflated.
-*
-*  Z      (input) DOUBLE PRECISION array, dimension (K)
-*         The first K elements of this array contain the components
-*         of the deflation-adjusted updating row vector.
-*
-*  INFO   (output) INTEGER
-*         = 0:  successful exit.
-*         < 0:  if INFO = -i, the i-th argument had an illegal value.
-*         > 0:  if INFO = 1, an singular value did not converge
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO, NEGONE
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0,
-     $                   NEGONE = -1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            CTEMP, I, J, JC, KTEMP, M, N, NLP1, NLP2, NRP1
-      DOUBLE PRECISION   RHO, TEMP
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMC3, DNRM2
-      EXTERNAL           DLAMC3, DNRM2
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DGEMM, DLACPY, DLASCL, DLASD4, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( NL.LT.1 ) THEN
-         INFO = -1
-      ELSE IF( NR.LT.1 ) THEN
-         INFO = -2
-      ELSE IF( ( SQRE.NE.1 ) .AND. ( SQRE.NE.0 ) ) THEN
-         INFO = -3
-      END IF
-*
-      N = NL + NR + 1
-      M = N + SQRE
-      NLP1 = NL + 1
-      NLP2 = NL + 2
-*
-      IF( ( K.LT.1 ) .OR. ( K.GT.N ) ) THEN
-         INFO = -4
-      ELSE IF( LDQ.LT.K ) THEN
-         INFO = -7
-      ELSE IF( LDU.LT.N ) THEN
-         INFO = -10
-      ELSE IF( LDU2.LT.N ) THEN
-         INFO = -12
-      ELSE IF( LDVT.LT.M ) THEN
-         INFO = -14
-      ELSE IF( LDVT2.LT.M ) THEN
-         INFO = -16
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLASD3', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( K.EQ.1 ) THEN
-         D( 1 ) = ABS( Z( 1 ) )
-         CALL DCOPY( M, VT2( 1, 1 ), LDVT2, VT( 1, 1 ), LDVT )
-         IF( Z( 1 ).GT.ZERO ) THEN
-            CALL DCOPY( N, U2( 1, 1 ), 1, U( 1, 1 ), 1 )
-         ELSE
-            DO 10 I = 1, N
-               U( I, 1 ) = -U2( I, 1 )
-   10       CONTINUE
-         END IF
-         RETURN
-      END IF
-*
-*     Modify values DSIGMA(i) to make sure all DSIGMA(i)-DSIGMA(j) can
-*     be computed with high relative accuracy (barring over/underflow).
-*     This is a problem on machines without a guard digit in
-*     add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2).
-*     The following code replaces DSIGMA(I) by 2*DSIGMA(I)-DSIGMA(I),
-*     which on any of these machines zeros out the bottommost
-*     bit of DSIGMA(I) if it is 1; this makes the subsequent
-*     subtractions DSIGMA(I)-DSIGMA(J) unproblematic when cancellation
-*     occurs. On binary machines with a guard digit (almost all
-*     machines) it does not change DSIGMA(I) at all. On hexadecimal
-*     and decimal machines with a guard digit, it slightly
-*     changes the bottommost bits of DSIGMA(I). It does not account
-*     for hexadecimal or decimal machines without guard digits
-*     (we know of none). We use a subroutine call to compute
-*     2*DSIGMA(I) to prevent optimizing compilers from eliminating
-*     this code.
-*
-      DO 20 I = 1, K
-         DSIGMA( I ) = DLAMC3( DSIGMA( I ), DSIGMA( I ) ) - DSIGMA( I )
-   20 CONTINUE
-*
-*     Keep a copy of Z.
-*
-      CALL DCOPY( K, Z, 1, Q, 1 )
-*
-*     Normalize Z.
-*
-      RHO = DNRM2( K, Z, 1 )
-      CALL DLASCL( 'G', 0, 0, RHO, ONE, K, 1, Z, K, INFO )
-      RHO = RHO*RHO
-*
-*     Find the new singular values.
-*
-      DO 30 J = 1, K
-         CALL DLASD4( K, J, DSIGMA, Z, U( 1, J ), RHO, D( J ),
-     $                VT( 1, J ), INFO )
-*
-*        If the zero finder fails, the computation is terminated.
-*
-         IF( INFO.NE.0 ) THEN
-            RETURN
-         END IF
-   30 CONTINUE
-*
-*     Compute updated Z.
-*
-      DO 60 I = 1, K
-         Z( I ) = U( I, K )*VT( I, K )
-         DO 40 J = 1, I - 1
-            Z( I ) = Z( I )*( U( I, J )*VT( I, J ) /
-     $               ( DSIGMA( I )-DSIGMA( J ) ) /
-     $               ( DSIGMA( I )+DSIGMA( J ) ) )
-   40    CONTINUE
-         DO 50 J = I, K - 1
-            Z( I ) = Z( I )*( U( I, J )*VT( I, J ) /
-     $               ( DSIGMA( I )-DSIGMA( J+1 ) ) /
-     $               ( DSIGMA( I )+DSIGMA( J+1 ) ) )
-   50    CONTINUE
-         Z( I ) = SIGN( SQRT( ABS( Z( I ) ) ), Q( I, 1 ) )
-   60 CONTINUE
-*
-*     Compute left singular vectors of the modified diagonal matrix,
-*     and store related information for the right singular vectors.
-*
-      DO 90 I = 1, K
-         VT( 1, I ) = Z( 1 ) / U( 1, I ) / VT( 1, I )
-         U( 1, I ) = NEGONE
-         DO 70 J = 2, K
-            VT( J, I ) = Z( J ) / U( J, I ) / VT( J, I )
-            U( J, I ) = DSIGMA( J )*VT( J, I )
-   70    CONTINUE
-         TEMP = DNRM2( K, U( 1, I ), 1 )
-         Q( 1, I ) = U( 1, I ) / TEMP
-         DO 80 J = 2, K
-            JC = IDXC( J )
-            Q( J, I ) = U( JC, I ) / TEMP
-   80    CONTINUE
-   90 CONTINUE
-*
-*     Update the left singular vector matrix.
-*
-      IF( K.EQ.2 ) THEN
-         CALL DGEMM( 'N', 'N', N, K, K, ONE, U2, LDU2, Q, LDQ, ZERO, U,
-     $               LDU )
-         GO TO 100
-      END IF
-      IF( CTOT( 1 ).GT.0 ) THEN
-         CALL DGEMM( 'N', 'N', NL, K, CTOT( 1 ), ONE, U2( 1, 2 ), LDU2,
-     $               Q( 2, 1 ), LDQ, ZERO, U( 1, 1 ), LDU )
-         IF( CTOT( 3 ).GT.0 ) THEN
-            KTEMP = 2 + CTOT( 1 ) + CTOT( 2 )
-            CALL DGEMM( 'N', 'N', NL, K, CTOT( 3 ), ONE, U2( 1, KTEMP ),
-     $                  LDU2, Q( KTEMP, 1 ), LDQ, ONE, U( 1, 1 ), LDU )
-         END IF
-      ELSE IF( CTOT( 3 ).GT.0 ) THEN
-         KTEMP = 2 + CTOT( 1 ) + CTOT( 2 )
-         CALL DGEMM( 'N', 'N', NL, K, CTOT( 3 ), ONE, U2( 1, KTEMP ),
-     $               LDU2, Q( KTEMP, 1 ), LDQ, ZERO, U( 1, 1 ), LDU )
-      ELSE
-         CALL DLACPY( 'F', NL, K, U2, LDU2, U, LDU )
-      END IF
-      CALL DCOPY( K, Q( 1, 1 ), LDQ, U( NLP1, 1 ), LDU )
-      KTEMP = 2 + CTOT( 1 )
-      CTEMP = CTOT( 2 ) + CTOT( 3 )
-      CALL DGEMM( 'N', 'N', NR, K, CTEMP, ONE, U2( NLP2, KTEMP ), LDU2,
-     $            Q( KTEMP, 1 ), LDQ, ZERO, U( NLP2, 1 ), LDU )
-*
-*     Generate the right singular vectors.
-*
-  100 CONTINUE
-      DO 120 I = 1, K
-         TEMP = DNRM2( K, VT( 1, I ), 1 )
-         Q( I, 1 ) = VT( 1, I ) / TEMP
-         DO 110 J = 2, K
-            JC = IDXC( J )
-            Q( I, J ) = VT( JC, I ) / TEMP
-  110    CONTINUE
-  120 CONTINUE
-*
-*     Update the right singular vector matrix.
-*
-      IF( K.EQ.2 ) THEN
-         CALL DGEMM( 'N', 'N', K, M, K, ONE, Q, LDQ, VT2, LDVT2, ZERO,
-     $               VT, LDVT )
-         RETURN
-      END IF
-      KTEMP = 1 + CTOT( 1 )
-      CALL DGEMM( 'N', 'N', K, NLP1, KTEMP, ONE, Q( 1, 1 ), LDQ,
-     $            VT2( 1, 1 ), LDVT2, ZERO, VT( 1, 1 ), LDVT )
-      KTEMP = 2 + CTOT( 1 ) + CTOT( 2 )
-      IF( KTEMP.LE.LDVT2 )
-     $   CALL DGEMM( 'N', 'N', K, NLP1, CTOT( 3 ), ONE, Q( 1, KTEMP ),
-     $               LDQ, VT2( KTEMP, 1 ), LDVT2, ONE, VT( 1, 1 ),
-     $               LDVT )
-*
-      KTEMP = CTOT( 1 ) + 1
-      NRP1 = NR + SQRE
-      IF( KTEMP.GT.1 ) THEN
-         DO 130 I = 1, K
-            Q( I, KTEMP ) = Q( I, 1 )
-  130    CONTINUE
-         DO 140 I = NLP2, M
-            VT2( KTEMP, I ) = VT2( 1, I )
-  140    CONTINUE
-      END IF
-      CTEMP = 1 + CTOT( 2 ) + CTOT( 3 )
-      CALL DGEMM( 'N', 'N', K, NRP1, CTEMP, ONE, Q( 1, KTEMP ), LDQ,
-     $            VT2( KTEMP, NLP2 ), LDVT2, ZERO, VT( 1, NLP2 ), LDVT )
-*
-      RETURN
-*
-*     End of DLASD3
-*
-      END
--- a/libcruft/lapack/dlasd4.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,890 +0,0 @@
-      SUBROUTINE DLASD4( N, I, D, Z, DELTA, RHO, SIGMA, WORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            I, INFO, N
-      DOUBLE PRECISION   RHO, SIGMA
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * ), DELTA( * ), WORK( * ), Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  This subroutine computes the square root of the I-th updated
-*  eigenvalue of a positive symmetric rank-one modification to
-*  a positive diagonal matrix whose entries are given as the squares
-*  of the corresponding entries in the array d, and that
-*
-*         0 <= D(i) < D(j)  for  i < j
-*
-*  and that RHO > 0. This is arranged by the calling routine, and is
-*  no loss in generality.  The rank-one modified system is thus
-*
-*         diag( D ) * diag( D ) +  RHO *  Z * Z_transpose.
-*
-*  where we assume the Euclidean norm of Z is 1.
-*
-*  The method consists of approximating the rational functions in the
-*  secular equation by simpler interpolating rational functions.
-*
-*  Arguments
-*  =========
-*
-*  N      (input) INTEGER
-*         The length of all arrays.
-*
-*  I      (input) INTEGER
-*         The index of the eigenvalue to be computed.  1 <= I <= N.
-*
-*  D      (input) DOUBLE PRECISION array, dimension ( N )
-*         The original eigenvalues.  It is assumed that they are in
-*         order, 0 <= D(I) < D(J)  for I < J.
-*
-*  Z      (input) DOUBLE PRECISION array, dimension ( N )
-*         The components of the updating vector.
-*
-*  DELTA  (output) DOUBLE PRECISION array, dimension ( N )
-*         If N .ne. 1, DELTA contains (D(j) - sigma_I) in its  j-th
-*         component.  If N = 1, then DELTA(1) = 1.  The vector DELTA
-*         contains the information necessary to construct the
-*         (singular) eigenvectors.
-*
-*  RHO    (input) DOUBLE PRECISION
-*         The scalar in the symmetric updating formula.
-*
-*  SIGMA  (output) DOUBLE PRECISION
-*         The computed sigma_I, the I-th updated eigenvalue.
-*
-*  WORK   (workspace) DOUBLE PRECISION array, dimension ( N )
-*         If N .ne. 1, WORK contains (D(j) + sigma_I) in its  j-th
-*         component.  If N = 1, then WORK( 1 ) = 1.
-*
-*  INFO   (output) INTEGER
-*         = 0:  successful exit
-*         > 0:  if INFO = 1, the updating process failed.
-*
-*  Internal Parameters
-*  ===================
-*
-*  Logical variable ORGATI (origin-at-i?) is used for distinguishing
-*  whether D(i) or D(i+1) is treated as the origin.
-*
-*            ORGATI = .true.    origin at i
-*            ORGATI = .false.   origin at i+1
-*
-*  Logical variable SWTCH3 (switch-for-3-poles?) is for noting
-*  if we are working with THREE poles!
-*
-*  MAXIT is the maximum number of iterations allowed for each
-*  eigenvalue.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ren-Cang Li, Computer Science Division, University of California
-*     at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            MAXIT
-      PARAMETER          ( MAXIT = 20 )
-      DOUBLE PRECISION   ZERO, ONE, TWO, THREE, FOUR, EIGHT, TEN
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0,
-     $                   THREE = 3.0D+0, FOUR = 4.0D+0, EIGHT = 8.0D+0,
-     $                   TEN = 10.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ORGATI, SWTCH, SWTCH3
-      INTEGER            II, IIM1, IIP1, IP1, ITER, J, NITER
-      DOUBLE PRECISION   A, B, C, DELSQ, DELSQ2, DPHI, DPSI, DTIIM,
-     $                   DTIIP, DTIPSQ, DTISQ, DTNSQ, DTNSQ1, DW, EPS,
-     $                   ERRETM, ETA, PHI, PREW, PSI, RHOINV, SG2LB,
-     $                   SG2UB, TAU, TEMP, TEMP1, TEMP2, W
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   DD( 3 ), ZZ( 3 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLAED6, DLASD5
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           DLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Since this routine is called in an inner loop, we do no argument
-*     checking.
-*
-*     Quick return for N=1 and 2.
-*
-      INFO = 0
-      IF( N.EQ.1 ) THEN
-*
-*        Presumably, I=1 upon entry
-*
-         SIGMA = SQRT( D( 1 )*D( 1 )+RHO*Z( 1 )*Z( 1 ) )
-         DELTA( 1 ) = ONE
-         WORK( 1 ) = ONE
-         RETURN
-      END IF
-      IF( N.EQ.2 ) THEN
-         CALL DLASD5( I, D, Z, DELTA, RHO, SIGMA, WORK )
-         RETURN
-      END IF
-*
-*     Compute machine epsilon
-*
-      EPS = DLAMCH( 'Epsilon' )
-      RHOINV = ONE / RHO
-*
-*     The case I = N
-*
-      IF( I.EQ.N ) THEN
-*
-*        Initialize some basic variables
-*
-         II = N - 1
-         NITER = 1
-*
-*        Calculate initial guess
-*
-         TEMP = RHO / TWO
-*
-*        If ||Z||_2 is not one, then TEMP should be set to
-*        RHO * ||Z||_2^2 / TWO
-*
-         TEMP1 = TEMP / ( D( N )+SQRT( D( N )*D( N )+TEMP ) )
-         DO 10 J = 1, N
-            WORK( J ) = D( J ) + D( N ) + TEMP1
-            DELTA( J ) = ( D( J )-D( N ) ) - TEMP1
-   10    CONTINUE
-*
-         PSI = ZERO
-         DO 20 J = 1, N - 2
-            PSI = PSI + Z( J )*Z( J ) / ( DELTA( J )*WORK( J ) )
-   20    CONTINUE
-*
-         C = RHOINV + PSI
-         W = C + Z( II )*Z( II ) / ( DELTA( II )*WORK( II ) ) +
-     $       Z( N )*Z( N ) / ( DELTA( N )*WORK( N ) )
-*
-         IF( W.LE.ZERO ) THEN
-            TEMP1 = SQRT( D( N )*D( N )+RHO )
-            TEMP = Z( N-1 )*Z( N-1 ) / ( ( D( N-1 )+TEMP1 )*
-     $             ( D( N )-D( N-1 )+RHO / ( D( N )+TEMP1 ) ) ) +
-     $             Z( N )*Z( N ) / RHO
-*
-*           The following TAU is to approximate
-*           SIGMA_n^2 - D( N )*D( N )
-*
-            IF( C.LE.TEMP ) THEN
-               TAU = RHO
-            ELSE
-               DELSQ = ( D( N )-D( N-1 ) )*( D( N )+D( N-1 ) )
-               A = -C*DELSQ + Z( N-1 )*Z( N-1 ) + Z( N )*Z( N )
-               B = Z( N )*Z( N )*DELSQ
-               IF( A.LT.ZERO ) THEN
-                  TAU = TWO*B / ( SQRT( A*A+FOUR*B*C )-A )
-               ELSE
-                  TAU = ( A+SQRT( A*A+FOUR*B*C ) ) / ( TWO*C )
-               END IF
-            END IF
-*
-*           It can be proved that
-*               D(N)^2+RHO/2 <= SIGMA_n^2 < D(N)^2+TAU <= D(N)^2+RHO
-*
-         ELSE
-            DELSQ = ( D( N )-D( N-1 ) )*( D( N )+D( N-1 ) )
-            A = -C*DELSQ + Z( N-1 )*Z( N-1 ) + Z( N )*Z( N )
-            B = Z( N )*Z( N )*DELSQ
-*
-*           The following TAU is to approximate
-*           SIGMA_n^2 - D( N )*D( N )
-*
-            IF( A.LT.ZERO ) THEN
-               TAU = TWO*B / ( SQRT( A*A+FOUR*B*C )-A )
-            ELSE
-               TAU = ( A+SQRT( A*A+FOUR*B*C ) ) / ( TWO*C )
-            END IF
-*
-*           It can be proved that
-*           D(N)^2 < D(N)^2+TAU < SIGMA(N)^2 < D(N)^2+RHO/2
-*
-         END IF
-*
-*        The following ETA is to approximate SIGMA_n - D( N )
-*
-         ETA = TAU / ( D( N )+SQRT( D( N )*D( N )+TAU ) )
-*
-         SIGMA = D( N ) + ETA
-         DO 30 J = 1, N
-            DELTA( J ) = ( D( J )-D( I ) ) - ETA
-            WORK( J ) = D( J ) + D( I ) + ETA
-   30    CONTINUE
-*
-*        Evaluate PSI and the derivative DPSI
-*
-         DPSI = ZERO
-         PSI = ZERO
-         ERRETM = ZERO
-         DO 40 J = 1, II
-            TEMP = Z( J ) / ( DELTA( J )*WORK( J ) )
-            PSI = PSI + Z( J )*TEMP
-            DPSI = DPSI + TEMP*TEMP
-            ERRETM = ERRETM + PSI
-   40    CONTINUE
-         ERRETM = ABS( ERRETM )
-*
-*        Evaluate PHI and the derivative DPHI
-*
-         TEMP = Z( N ) / ( DELTA( N )*WORK( N ) )
-         PHI = Z( N )*TEMP
-         DPHI = TEMP*TEMP
-         ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV +
-     $            ABS( TAU )*( DPSI+DPHI )
-*
-         W = RHOINV + PHI + PSI
-*
-*        Test for convergence
-*
-         IF( ABS( W ).LE.EPS*ERRETM ) THEN
-            GO TO 240
-         END IF
-*
-*        Calculate the new step
-*
-         NITER = NITER + 1
-         DTNSQ1 = WORK( N-1 )*DELTA( N-1 )
-         DTNSQ = WORK( N )*DELTA( N )
-         C = W - DTNSQ1*DPSI - DTNSQ*DPHI
-         A = ( DTNSQ+DTNSQ1 )*W - DTNSQ*DTNSQ1*( DPSI+DPHI )
-         B = DTNSQ*DTNSQ1*W
-         IF( C.LT.ZERO )
-     $      C = ABS( C )
-         IF( C.EQ.ZERO ) THEN
-            ETA = RHO - SIGMA*SIGMA
-         ELSE IF( A.GE.ZERO ) THEN
-            ETA = ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
-         ELSE
-            ETA = TWO*B / ( A-SQRT( ABS( A*A-FOUR*B*C ) ) )
-         END IF
-*
-*        Note, eta should be positive if w is negative, and
-*        eta should be negative otherwise. However,
-*        if for some reason caused by roundoff, eta*w > 0,
-*        we simply use one Newton step instead. This way
-*        will guarantee eta*w < 0.
-*
-         IF( W*ETA.GT.ZERO )
-     $      ETA = -W / ( DPSI+DPHI )
-         TEMP = ETA - DTNSQ
-         IF( TEMP.GT.RHO )
-     $      ETA = RHO + DTNSQ
-*
-         TAU = TAU + ETA
-         ETA = ETA / ( SIGMA+SQRT( ETA+SIGMA*SIGMA ) )
-         DO 50 J = 1, N
-            DELTA( J ) = DELTA( J ) - ETA
-            WORK( J ) = WORK( J ) + ETA
-   50    CONTINUE
-*
-         SIGMA = SIGMA + ETA
-*
-*        Evaluate PSI and the derivative DPSI
-*
-         DPSI = ZERO
-         PSI = ZERO
-         ERRETM = ZERO
-         DO 60 J = 1, II
-            TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
-            PSI = PSI + Z( J )*TEMP
-            DPSI = DPSI + TEMP*TEMP
-            ERRETM = ERRETM + PSI
-   60    CONTINUE
-         ERRETM = ABS( ERRETM )
-*
-*        Evaluate PHI and the derivative DPHI
-*
-         TEMP = Z( N ) / ( WORK( N )*DELTA( N ) )
-         PHI = Z( N )*TEMP
-         DPHI = TEMP*TEMP
-         ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV +
-     $            ABS( TAU )*( DPSI+DPHI )
-*
-         W = RHOINV + PHI + PSI
-*
-*        Main loop to update the values of the array   DELTA
-*
-         ITER = NITER + 1
-*
-         DO 90 NITER = ITER, MAXIT
-*
-*           Test for convergence
-*
-            IF( ABS( W ).LE.EPS*ERRETM ) THEN
-               GO TO 240
-            END IF
-*
-*           Calculate the new step
-*
-            DTNSQ1 = WORK( N-1 )*DELTA( N-1 )
-            DTNSQ = WORK( N )*DELTA( N )
-            C = W - DTNSQ1*DPSI - DTNSQ*DPHI
-            A = ( DTNSQ+DTNSQ1 )*W - DTNSQ1*DTNSQ*( DPSI+DPHI )
-            B = DTNSQ1*DTNSQ*W
-            IF( A.GE.ZERO ) THEN
-               ETA = ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
-            ELSE
-               ETA = TWO*B / ( A-SQRT( ABS( A*A-FOUR*B*C ) ) )
-            END IF
-*
-*           Note, eta should be positive if w is negative, and
-*           eta should be negative otherwise. However,
-*           if for some reason caused by roundoff, eta*w > 0,
-*           we simply use one Newton step instead. This way
-*           will guarantee eta*w < 0.
-*
-            IF( W*ETA.GT.ZERO )
-     $         ETA = -W / ( DPSI+DPHI )
-            TEMP = ETA - DTNSQ
-            IF( TEMP.LE.ZERO )
-     $         ETA = ETA / TWO
-*
-            TAU = TAU + ETA
-            ETA = ETA / ( SIGMA+SQRT( ETA+SIGMA*SIGMA ) )
-            DO 70 J = 1, N
-               DELTA( J ) = DELTA( J ) - ETA
-               WORK( J ) = WORK( J ) + ETA
-   70       CONTINUE
-*
-            SIGMA = SIGMA + ETA
-*
-*           Evaluate PSI and the derivative DPSI
-*
-            DPSI = ZERO
-            PSI = ZERO
-            ERRETM = ZERO
-            DO 80 J = 1, II
-               TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
-               PSI = PSI + Z( J )*TEMP
-               DPSI = DPSI + TEMP*TEMP
-               ERRETM = ERRETM + PSI
-   80       CONTINUE
-            ERRETM = ABS( ERRETM )
-*
-*           Evaluate PHI and the derivative DPHI
-*
-            TEMP = Z( N ) / ( WORK( N )*DELTA( N ) )
-            PHI = Z( N )*TEMP
-            DPHI = TEMP*TEMP
-            ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV +
-     $               ABS( TAU )*( DPSI+DPHI )
-*
-            W = RHOINV + PHI + PSI
-   90    CONTINUE
-*
-*        Return with INFO = 1, NITER = MAXIT and not converged
-*
-         INFO = 1
-         GO TO 240
-*
-*        End for the case I = N
-*
-      ELSE
-*
-*        The case for I < N
-*
-         NITER = 1
-         IP1 = I + 1
-*
-*        Calculate initial guess
-*
-         DELSQ = ( D( IP1 )-D( I ) )*( D( IP1 )+D( I ) )
-         DELSQ2 = DELSQ / TWO
-         TEMP = DELSQ2 / ( D( I )+SQRT( D( I )*D( I )+DELSQ2 ) )
-         DO 100 J = 1, N
-            WORK( J ) = D( J ) + D( I ) + TEMP
-            DELTA( J ) = ( D( J )-D( I ) ) - TEMP
-  100    CONTINUE
-*
-         PSI = ZERO
-         DO 110 J = 1, I - 1
-            PSI = PSI + Z( J )*Z( J ) / ( WORK( J )*DELTA( J ) )
-  110    CONTINUE
-*
-         PHI = ZERO
-         DO 120 J = N, I + 2, -1
-            PHI = PHI + Z( J )*Z( J ) / ( WORK( J )*DELTA( J ) )
-  120    CONTINUE
-         C = RHOINV + PSI + PHI
-         W = C + Z( I )*Z( I ) / ( WORK( I )*DELTA( I ) ) +
-     $       Z( IP1 )*Z( IP1 ) / ( WORK( IP1 )*DELTA( IP1 ) )
-*
-         IF( W.GT.ZERO ) THEN
-*
-*           d(i)^2 < the ith sigma^2 < (d(i)^2+d(i+1)^2)/2
-*
-*           We choose d(i) as origin.
-*
-            ORGATI = .TRUE.
-            SG2LB = ZERO
-            SG2UB = DELSQ2
-            A = C*DELSQ + Z( I )*Z( I ) + Z( IP1 )*Z( IP1 )
-            B = Z( I )*Z( I )*DELSQ
-            IF( A.GT.ZERO ) THEN
-               TAU = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) )
-            ELSE
-               TAU = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
-            END IF
-*
-*           TAU now is an estimation of SIGMA^2 - D( I )^2. The
-*           following, however, is the corresponding estimation of
-*           SIGMA - D( I ).
-*
-            ETA = TAU / ( D( I )+SQRT( D( I )*D( I )+TAU ) )
-         ELSE
-*
-*           (d(i)^2+d(i+1)^2)/2 <= the ith sigma^2 < d(i+1)^2/2
-*
-*           We choose d(i+1) as origin.
-*
-            ORGATI = .FALSE.
-            SG2LB = -DELSQ2
-            SG2UB = ZERO
-            A = C*DELSQ - Z( I )*Z( I ) - Z( IP1 )*Z( IP1 )
-            B = Z( IP1 )*Z( IP1 )*DELSQ
-            IF( A.LT.ZERO ) THEN
-               TAU = TWO*B / ( A-SQRT( ABS( A*A+FOUR*B*C ) ) )
-            ELSE
-               TAU = -( A+SQRT( ABS( A*A+FOUR*B*C ) ) ) / ( TWO*C )
-            END IF
-*
-*           TAU now is an estimation of SIGMA^2 - D( IP1 )^2. The
-*           following, however, is the corresponding estimation of
-*           SIGMA - D( IP1 ).
-*
-            ETA = TAU / ( D( IP1 )+SQRT( ABS( D( IP1 )*D( IP1 )+
-     $            TAU ) ) )
-         END IF
-*
-         IF( ORGATI ) THEN
-            II = I
-            SIGMA = D( I ) + ETA
-            DO 130 J = 1, N
-               WORK( J ) = D( J ) + D( I ) + ETA
-               DELTA( J ) = ( D( J )-D( I ) ) - ETA
-  130       CONTINUE
-         ELSE
-            II = I + 1
-            SIGMA = D( IP1 ) + ETA
-            DO 140 J = 1, N
-               WORK( J ) = D( J ) + D( IP1 ) + ETA
-               DELTA( J ) = ( D( J )-D( IP1 ) ) - ETA
-  140       CONTINUE
-         END IF
-         IIM1 = II - 1
-         IIP1 = II + 1
-*
-*        Evaluate PSI and the derivative DPSI
-*
-         DPSI = ZERO
-         PSI = ZERO
-         ERRETM = ZERO
-         DO 150 J = 1, IIM1
-            TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
-            PSI = PSI + Z( J )*TEMP
-            DPSI = DPSI + TEMP*TEMP
-            ERRETM = ERRETM + PSI
-  150    CONTINUE
-         ERRETM = ABS( ERRETM )
-*
-*        Evaluate PHI and the derivative DPHI
-*
-         DPHI = ZERO
-         PHI = ZERO
-         DO 160 J = N, IIP1, -1
-            TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
-            PHI = PHI + Z( J )*TEMP
-            DPHI = DPHI + TEMP*TEMP
-            ERRETM = ERRETM + PHI
-  160    CONTINUE
-*
-         W = RHOINV + PHI + PSI
-*
-*        W is the value of the secular function with
-*        its ii-th element removed.
-*
-         SWTCH3 = .FALSE.
-         IF( ORGATI ) THEN
-            IF( W.LT.ZERO )
-     $         SWTCH3 = .TRUE.
-         ELSE
-            IF( W.GT.ZERO )
-     $         SWTCH3 = .TRUE.
-         END IF
-         IF( II.EQ.1 .OR. II.EQ.N )
-     $      SWTCH3 = .FALSE.
-*
-         TEMP = Z( II ) / ( WORK( II )*DELTA( II ) )
-         DW = DPSI + DPHI + TEMP*TEMP
-         TEMP = Z( II )*TEMP
-         W = W + TEMP
-         ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV +
-     $            THREE*ABS( TEMP ) + ABS( TAU )*DW
-*
-*        Test for convergence
-*
-         IF( ABS( W ).LE.EPS*ERRETM ) THEN
-            GO TO 240
-         END IF
-*
-         IF( W.LE.ZERO ) THEN
-            SG2LB = MAX( SG2LB, TAU )
-         ELSE
-            SG2UB = MIN( SG2UB, TAU )
-         END IF
-*
-*        Calculate the new step
-*
-         NITER = NITER + 1
-         IF( .NOT.SWTCH3 ) THEN
-            DTIPSQ = WORK( IP1 )*DELTA( IP1 )
-            DTISQ = WORK( I )*DELTA( I )
-            IF( ORGATI ) THEN
-               C = W - DTIPSQ*DW + DELSQ*( Z( I ) / DTISQ )**2
-            ELSE
-               C = W - DTISQ*DW - DELSQ*( Z( IP1 ) / DTIPSQ )**2
-            END IF
-            A = ( DTIPSQ+DTISQ )*W - DTIPSQ*DTISQ*DW
-            B = DTIPSQ*DTISQ*W
-            IF( C.EQ.ZERO ) THEN
-               IF( A.EQ.ZERO ) THEN
-                  IF( ORGATI ) THEN
-                     A = Z( I )*Z( I ) + DTIPSQ*DTIPSQ*( DPSI+DPHI )
-                  ELSE
-                     A = Z( IP1 )*Z( IP1 ) + DTISQ*DTISQ*( DPSI+DPHI )
-                  END IF
-               END IF
-               ETA = B / A
-            ELSE IF( A.LE.ZERO ) THEN
-               ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
-            ELSE
-               ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) )
-            END IF
-         ELSE
-*
-*           Interpolation using THREE most relevant poles
-*
-            DTIIM = WORK( IIM1 )*DELTA( IIM1 )
-            DTIIP = WORK( IIP1 )*DELTA( IIP1 )
-            TEMP = RHOINV + PSI + PHI
-            IF( ORGATI ) THEN
-               TEMP1 = Z( IIM1 ) / DTIIM
-               TEMP1 = TEMP1*TEMP1
-               C = ( TEMP - DTIIP*( DPSI+DPHI ) ) -
-     $             ( D( IIM1 )-D( IIP1 ) )*( D( IIM1 )+D( IIP1 ) )*TEMP1
-               ZZ( 1 ) = Z( IIM1 )*Z( IIM1 )
-               IF( DPSI.LT.TEMP1 ) THEN
-                  ZZ( 3 ) = DTIIP*DTIIP*DPHI
-               ELSE
-                  ZZ( 3 ) = DTIIP*DTIIP*( ( DPSI-TEMP1 )+DPHI )
-               END IF
-            ELSE
-               TEMP1 = Z( IIP1 ) / DTIIP
-               TEMP1 = TEMP1*TEMP1
-               C = ( TEMP - DTIIM*( DPSI+DPHI ) ) -
-     $             ( D( IIP1 )-D( IIM1 ) )*( D( IIM1 )+D( IIP1 ) )*TEMP1
-               IF( DPHI.LT.TEMP1 ) THEN
-                  ZZ( 1 ) = DTIIM*DTIIM*DPSI
-               ELSE
-                  ZZ( 1 ) = DTIIM*DTIIM*( DPSI+( DPHI-TEMP1 ) )
-               END IF
-               ZZ( 3 ) = Z( IIP1 )*Z( IIP1 )
-            END IF
-            ZZ( 2 ) = Z( II )*Z( II )
-            DD( 1 ) = DTIIM
-            DD( 2 ) = DELTA( II )*WORK( II )
-            DD( 3 ) = DTIIP
-            CALL DLAED6( NITER, ORGATI, C, DD, ZZ, W, ETA, INFO )
-            IF( INFO.NE.0 )
-     $         GO TO 240
-         END IF
-*
-*        Note, eta should be positive if w is negative, and
-*        eta should be negative otherwise. However,
-*        if for some reason caused by roundoff, eta*w > 0,
-*        we simply use one Newton step instead. This way
-*        will guarantee eta*w < 0.
-*
-         IF( W*ETA.GE.ZERO )
-     $      ETA = -W / DW
-         IF( ORGATI ) THEN
-            TEMP1 = WORK( I )*DELTA( I )
-            TEMP = ETA - TEMP1
-         ELSE
-            TEMP1 = WORK( IP1 )*DELTA( IP1 )
-            TEMP = ETA - TEMP1
-         END IF
-         IF( TEMP.GT.SG2UB .OR. TEMP.LT.SG2LB ) THEN
-            IF( W.LT.ZERO ) THEN
-               ETA = ( SG2UB-TAU ) / TWO
-            ELSE
-               ETA = ( SG2LB-TAU ) / TWO
-            END IF
-         END IF
-*
-         TAU = TAU + ETA
-         ETA = ETA / ( SIGMA+SQRT( SIGMA*SIGMA+ETA ) )
-*
-         PREW = W
-*
-         SIGMA = SIGMA + ETA
-         DO 170 J = 1, N
-            WORK( J ) = WORK( J ) + ETA
-            DELTA( J ) = DELTA( J ) - ETA
-  170    CONTINUE
-*
-*        Evaluate PSI and the derivative DPSI
-*
-         DPSI = ZERO
-         PSI = ZERO
-         ERRETM = ZERO
-         DO 180 J = 1, IIM1
-            TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
-            PSI = PSI + Z( J )*TEMP
-            DPSI = DPSI + TEMP*TEMP
-            ERRETM = ERRETM + PSI
-  180    CONTINUE
-         ERRETM = ABS( ERRETM )
-*
-*        Evaluate PHI and the derivative DPHI
-*
-         DPHI = ZERO
-         PHI = ZERO
-         DO 190 J = N, IIP1, -1
-            TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
-            PHI = PHI + Z( J )*TEMP
-            DPHI = DPHI + TEMP*TEMP
-            ERRETM = ERRETM + PHI
-  190    CONTINUE
-*
-         TEMP = Z( II ) / ( WORK( II )*DELTA( II ) )
-         DW = DPSI + DPHI + TEMP*TEMP
-         TEMP = Z( II )*TEMP
-         W = RHOINV + PHI + PSI + TEMP
-         ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV +
-     $            THREE*ABS( TEMP ) + ABS( TAU )*DW
-*
-         IF( W.LE.ZERO ) THEN
-            SG2LB = MAX( SG2LB, TAU )
-         ELSE
-            SG2UB = MIN( SG2UB, TAU )
-         END IF
-*
-         SWTCH = .FALSE.
-         IF( ORGATI ) THEN
-            IF( -W.GT.ABS( PREW ) / TEN )
-     $         SWTCH = .TRUE.
-         ELSE
-            IF( W.GT.ABS( PREW ) / TEN )
-     $         SWTCH = .TRUE.
-         END IF
-*
-*        Main loop to update the values of the array   DELTA and WORK
-*
-         ITER = NITER + 1
-*
-         DO 230 NITER = ITER, MAXIT
-*
-*           Test for convergence
-*
-            IF( ABS( W ).LE.EPS*ERRETM ) THEN
-               GO TO 240
-            END IF
-*
-*           Calculate the new step
-*
-            IF( .NOT.SWTCH3 ) THEN
-               DTIPSQ = WORK( IP1 )*DELTA( IP1 )
-               DTISQ = WORK( I )*DELTA( I )
-               IF( .NOT.SWTCH ) THEN
-                  IF( ORGATI ) THEN
-                     C = W - DTIPSQ*DW + DELSQ*( Z( I ) / DTISQ )**2
-                  ELSE
-                     C = W - DTISQ*DW - DELSQ*( Z( IP1 ) / DTIPSQ )**2
-                  END IF
-               ELSE
-                  TEMP = Z( II ) / ( WORK( II )*DELTA( II ) )
-                  IF( ORGATI ) THEN
-                     DPSI = DPSI + TEMP*TEMP
-                  ELSE
-                     DPHI = DPHI + TEMP*TEMP
-                  END IF
-                  C = W - DTISQ*DPSI - DTIPSQ*DPHI
-               END IF
-               A = ( DTIPSQ+DTISQ )*W - DTIPSQ*DTISQ*DW
-               B = DTIPSQ*DTISQ*W
-               IF( C.EQ.ZERO ) THEN
-                  IF( A.EQ.ZERO ) THEN
-                     IF( .NOT.SWTCH ) THEN
-                        IF( ORGATI ) THEN
-                           A = Z( I )*Z( I ) + DTIPSQ*DTIPSQ*
-     $                         ( DPSI+DPHI )
-                        ELSE
-                           A = Z( IP1 )*Z( IP1 ) +
-     $                         DTISQ*DTISQ*( DPSI+DPHI )
-                        END IF
-                     ELSE
-                        A = DTISQ*DTISQ*DPSI + DTIPSQ*DTIPSQ*DPHI
-                     END IF
-                  END IF
-                  ETA = B / A
-               ELSE IF( A.LE.ZERO ) THEN
-                  ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
-               ELSE
-                  ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) )
-               END IF
-            ELSE
-*
-*              Interpolation using THREE most relevant poles
-*
-               DTIIM = WORK( IIM1 )*DELTA( IIM1 )
-               DTIIP = WORK( IIP1 )*DELTA( IIP1 )
-               TEMP = RHOINV + PSI + PHI
-               IF( SWTCH ) THEN
-                  C = TEMP - DTIIM*DPSI - DTIIP*DPHI
-                  ZZ( 1 ) = DTIIM*DTIIM*DPSI
-                  ZZ( 3 ) = DTIIP*DTIIP*DPHI
-               ELSE
-                  IF( ORGATI ) THEN
-                     TEMP1 = Z( IIM1 ) / DTIIM
-                     TEMP1 = TEMP1*TEMP1
-                     TEMP2 = ( D( IIM1 )-D( IIP1 ) )*
-     $                       ( D( IIM1 )+D( IIP1 ) )*TEMP1
-                     C = TEMP - DTIIP*( DPSI+DPHI ) - TEMP2
-                     ZZ( 1 ) = Z( IIM1 )*Z( IIM1 )
-                     IF( DPSI.LT.TEMP1 ) THEN
-                        ZZ( 3 ) = DTIIP*DTIIP*DPHI
-                     ELSE
-                        ZZ( 3 ) = DTIIP*DTIIP*( ( DPSI-TEMP1 )+DPHI )
-                     END IF
-                  ELSE
-                     TEMP1 = Z( IIP1 ) / DTIIP
-                     TEMP1 = TEMP1*TEMP1
-                     TEMP2 = ( D( IIP1 )-D( IIM1 ) )*
-     $                       ( D( IIM1 )+D( IIP1 ) )*TEMP1
-                     C = TEMP - DTIIM*( DPSI+DPHI ) - TEMP2
-                     IF( DPHI.LT.TEMP1 ) THEN
-                        ZZ( 1 ) = DTIIM*DTIIM*DPSI
-                     ELSE
-                        ZZ( 1 ) = DTIIM*DTIIM*( DPSI+( DPHI-TEMP1 ) )
-                     END IF
-                     ZZ( 3 ) = Z( IIP1 )*Z( IIP1 )
-                  END IF
-               END IF
-               DD( 1 ) = DTIIM
-               DD( 2 ) = DELTA( II )*WORK( II )
-               DD( 3 ) = DTIIP
-               CALL DLAED6( NITER, ORGATI, C, DD, ZZ, W, ETA, INFO )
-               IF( INFO.NE.0 )
-     $            GO TO 240
-            END IF
-*
-*           Note, eta should be positive if w is negative, and
-*           eta should be negative otherwise. However,
-*           if for some reason caused by roundoff, eta*w > 0,
-*           we simply use one Newton step instead. This way
-*           will guarantee eta*w < 0.
-*
-            IF( W*ETA.GE.ZERO )
-     $         ETA = -W / DW
-            IF( ORGATI ) THEN
-               TEMP1 = WORK( I )*DELTA( I )
-               TEMP = ETA - TEMP1
-            ELSE
-               TEMP1 = WORK( IP1 )*DELTA( IP1 )
-               TEMP = ETA - TEMP1
-            END IF
-            IF( TEMP.GT.SG2UB .OR. TEMP.LT.SG2LB ) THEN
-               IF( W.LT.ZERO ) THEN
-                  ETA = ( SG2UB-TAU ) / TWO
-               ELSE
-                  ETA = ( SG2LB-TAU ) / TWO
-               END IF
-            END IF
-*
-            TAU = TAU + ETA
-            ETA = ETA / ( SIGMA+SQRT( SIGMA*SIGMA+ETA ) )
-*
-            SIGMA = SIGMA + ETA
-            DO 200 J = 1, N
-               WORK( J ) = WORK( J ) + ETA
-               DELTA( J ) = DELTA( J ) - ETA
-  200       CONTINUE
-*
-            PREW = W
-*
-*           Evaluate PSI and the derivative DPSI
-*
-            DPSI = ZERO
-            PSI = ZERO
-            ERRETM = ZERO
-            DO 210 J = 1, IIM1
-               TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
-               PSI = PSI + Z( J )*TEMP
-               DPSI = DPSI + TEMP*TEMP
-               ERRETM = ERRETM + PSI
-  210       CONTINUE
-            ERRETM = ABS( ERRETM )
-*
-*           Evaluate PHI and the derivative DPHI
-*
-            DPHI = ZERO
-            PHI = ZERO
-            DO 220 J = N, IIP1, -1
-               TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
-               PHI = PHI + Z( J )*TEMP
-               DPHI = DPHI + TEMP*TEMP
-               ERRETM = ERRETM + PHI
-  220       CONTINUE
-*
-            TEMP = Z( II ) / ( WORK( II )*DELTA( II ) )
-            DW = DPSI + DPHI + TEMP*TEMP
-            TEMP = Z( II )*TEMP
-            W = RHOINV + PHI + PSI + TEMP
-            ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV +
-     $               THREE*ABS( TEMP ) + ABS( TAU )*DW
-            IF( W*PREW.GT.ZERO .AND. ABS( W ).GT.ABS( PREW ) / TEN )
-     $         SWTCH = .NOT.SWTCH
-*
-            IF( W.LE.ZERO ) THEN
-               SG2LB = MAX( SG2LB, TAU )
-            ELSE
-               SG2UB = MIN( SG2UB, TAU )
-            END IF
-*
-  230    CONTINUE
-*
-*        Return with INFO = 1, NITER = MAXIT and not converged
-*
-         INFO = 1
-*
-      END IF
-*
-  240 CONTINUE
-      RETURN
-*
-*     End of DLASD4
-*
-      END
--- a/libcruft/lapack/dlasd5.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,163 +0,0 @@
-      SUBROUTINE DLASD5( I, D, Z, DELTA, RHO, DSIGMA, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            I
-      DOUBLE PRECISION   DSIGMA, RHO
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( 2 ), DELTA( 2 ), WORK( 2 ), Z( 2 )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  This subroutine computes the square root of the I-th eigenvalue
-*  of a positive symmetric rank-one modification of a 2-by-2 diagonal
-*  matrix
-*
-*             diag( D ) * diag( D ) +  RHO *  Z * transpose(Z) .
-*
-*  The diagonal entries in the array D are assumed to satisfy
-*
-*             0 <= D(i) < D(j)  for  i < j .
-*
-*  We also assume RHO > 0 and that the Euclidean norm of the vector
-*  Z is one.
-*
-*  Arguments
-*  =========
-*
-*  I      (input) INTEGER
-*         The index of the eigenvalue to be computed.  I = 1 or I = 2.
-*
-*  D      (input) DOUBLE PRECISION array, dimension ( 2 )
-*         The original eigenvalues.  We assume 0 <= D(1) < D(2).
-*
-*  Z      (input) DOUBLE PRECISION array, dimension ( 2 )
-*         The components of the updating vector.
-*
-*  DELTA  (output) DOUBLE PRECISION array, dimension ( 2 )
-*         Contains (D(j) - sigma_I) in its  j-th component.
-*         The vector DELTA contains the information necessary
-*         to construct the eigenvectors.
-*
-*  RHO    (input) DOUBLE PRECISION
-*         The scalar in the symmetric updating formula.
-*
-*  DSIGMA (output) DOUBLE PRECISION
-*         The computed sigma_I, the I-th updated eigenvalue.
-*
-*  WORK   (workspace) DOUBLE PRECISION array, dimension ( 2 )
-*         WORK contains (D(j) + sigma_I) in its  j-th component.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ren-Cang Li, Computer Science Division, University of California
-*     at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE, TWO, THREE, FOUR
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0,
-     $                   THREE = 3.0D+0, FOUR = 4.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   B, C, DEL, DELSQ, TAU, W
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      DEL = D( 2 ) - D( 1 )
-      DELSQ = DEL*( D( 2 )+D( 1 ) )
-      IF( I.EQ.1 ) THEN
-         W = ONE + FOUR*RHO*( Z( 2 )*Z( 2 ) / ( D( 1 )+THREE*D( 2 ) )-
-     $       Z( 1 )*Z( 1 ) / ( THREE*D( 1 )+D( 2 ) ) ) / DEL
-         IF( W.GT.ZERO ) THEN
-            B = DELSQ + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) )
-            C = RHO*Z( 1 )*Z( 1 )*DELSQ
-*
-*           B > ZERO, always
-*
-*           The following TAU is DSIGMA * DSIGMA - D( 1 ) * D( 1 )
-*
-            TAU = TWO*C / ( B+SQRT( ABS( B*B-FOUR*C ) ) )
-*
-*           The following TAU is DSIGMA - D( 1 )
-*
-            TAU = TAU / ( D( 1 )+SQRT( D( 1 )*D( 1 )+TAU ) )
-            DSIGMA = D( 1 ) + TAU
-            DELTA( 1 ) = -TAU
-            DELTA( 2 ) = DEL - TAU
-            WORK( 1 ) = TWO*D( 1 ) + TAU
-            WORK( 2 ) = ( D( 1 )+TAU ) + D( 2 )
-*           DELTA( 1 ) = -Z( 1 ) / TAU
-*           DELTA( 2 ) = Z( 2 ) / ( DEL-TAU )
-         ELSE
-            B = -DELSQ + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) )
-            C = RHO*Z( 2 )*Z( 2 )*DELSQ
-*
-*           The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 )
-*
-            IF( B.GT.ZERO ) THEN
-               TAU = -TWO*C / ( B+SQRT( B*B+FOUR*C ) )
-            ELSE
-               TAU = ( B-SQRT( B*B+FOUR*C ) ) / TWO
-            END IF
-*
-*           The following TAU is DSIGMA - D( 2 )
-*
-            TAU = TAU / ( D( 2 )+SQRT( ABS( D( 2 )*D( 2 )+TAU ) ) )
-            DSIGMA = D( 2 ) + TAU
-            DELTA( 1 ) = -( DEL+TAU )
-            DELTA( 2 ) = -TAU
-            WORK( 1 ) = D( 1 ) + TAU + D( 2 )
-            WORK( 2 ) = TWO*D( 2 ) + TAU
-*           DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU )
-*           DELTA( 2 ) = -Z( 2 ) / TAU
-         END IF
-*        TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) )
-*        DELTA( 1 ) = DELTA( 1 ) / TEMP
-*        DELTA( 2 ) = DELTA( 2 ) / TEMP
-      ELSE
-*
-*        Now I=2
-*
-         B = -DELSQ + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) )
-         C = RHO*Z( 2 )*Z( 2 )*DELSQ
-*
-*        The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 )
-*
-         IF( B.GT.ZERO ) THEN
-            TAU = ( B+SQRT( B*B+FOUR*C ) ) / TWO
-         ELSE
-            TAU = TWO*C / ( -B+SQRT( B*B+FOUR*C ) )
-         END IF
-*
-*        The following TAU is DSIGMA - D( 2 )
-*
-         TAU = TAU / ( D( 2 )+SQRT( D( 2 )*D( 2 )+TAU ) )
-         DSIGMA = D( 2 ) + TAU
-         DELTA( 1 ) = -( DEL+TAU )
-         DELTA( 2 ) = -TAU
-         WORK( 1 ) = D( 1 ) + TAU + D( 2 )
-         WORK( 2 ) = TWO*D( 2 ) + TAU
-*        DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU )
-*        DELTA( 2 ) = -Z( 2 ) / TAU
-*        TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) )
-*        DELTA( 1 ) = DELTA( 1 ) / TEMP
-*        DELTA( 2 ) = DELTA( 2 ) / TEMP
-      END IF
-      RETURN
-*
-*     End of DLASD5
-*
-      END
--- a/libcruft/lapack/dlasd6.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,305 +0,0 @@
-      SUBROUTINE DLASD6( ICOMPQ, NL, NR, SQRE, D, VF, VL, ALPHA, BETA,
-     $                   IDXQ, PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM,
-     $                   LDGNUM, POLES, DIFL, DIFR, Z, K, C, S, WORK,
-     $                   IWORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            GIVPTR, ICOMPQ, INFO, K, LDGCOL, LDGNUM, NL,
-     $                   NR, SQRE
-      DOUBLE PRECISION   ALPHA, BETA, C, S
-*     ..
-*     .. Array Arguments ..
-      INTEGER            GIVCOL( LDGCOL, * ), IDXQ( * ), IWORK( * ),
-     $                   PERM( * )
-      DOUBLE PRECISION   D( * ), DIFL( * ), DIFR( * ),
-     $                   GIVNUM( LDGNUM, * ), POLES( LDGNUM, * ),
-     $                   VF( * ), VL( * ), WORK( * ), Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASD6 computes the SVD of an updated upper bidiagonal matrix B
-*  obtained by merging two smaller ones by appending a row. This
-*  routine is used only for the problem which requires all singular
-*  values and optionally singular vector matrices in factored form.
-*  B is an N-by-M matrix with N = NL + NR + 1 and M = N + SQRE.
-*  A related subroutine, DLASD1, handles the case in which all singular
-*  values and singular vectors of the bidiagonal matrix are desired.
-*
-*  DLASD6 computes the SVD as follows:
-*
-*                ( D1(in)  0    0     0 )
-*    B = U(in) * (   Z1'   a   Z2'    b ) * VT(in)
-*                (   0     0   D2(in) 0 )
-*
-*      = U(out) * ( D(out) 0) * VT(out)
-*
-*  where Z' = (Z1' a Z2' b) = u' VT', and u is a vector of dimension M
-*  with ALPHA and BETA in the NL+1 and NL+2 th entries and zeros
-*  elsewhere; and the entry b is empty if SQRE = 0.
-*
-*  The singular values of B can be computed using D1, D2, the first
-*  components of all the right singular vectors of the lower block, and
-*  the last components of all the right singular vectors of the upper
-*  block. These components are stored and updated in VF and VL,
-*  respectively, in DLASD6. Hence U and VT are not explicitly
-*  referenced.
-*
-*  The singular values are stored in D. The algorithm consists of two
-*  stages:
-*
-*        The first stage consists of deflating the size of the problem
-*        when there are multiple singular values or if there is a zero
-*        in the Z vector. For each such occurence the dimension of the
-*        secular equation problem is reduced by one. This stage is
-*        performed by the routine DLASD7.
-*
-*        The second stage consists of calculating the updated
-*        singular values. This is done by finding the roots of the
-*        secular equation via the routine DLASD4 (as called by DLASD8).
-*        This routine also updates VF and VL and computes the distances
-*        between the updated singular values and the old singular
-*        values.
-*
-*  DLASD6 is called from DLASDA.
-*
-*  Arguments
-*  =========
-*
-*  ICOMPQ (input) INTEGER
-*         Specifies whether singular vectors are to be computed in
-*         factored form:
-*         = 0: Compute singular values only.
-*         = 1: Compute singular vectors in factored form as well.
-*
-*  NL     (input) INTEGER
-*         The row dimension of the upper block.  NL >= 1.
-*
-*  NR     (input) INTEGER
-*         The row dimension of the lower block.  NR >= 1.
-*
-*  SQRE   (input) INTEGER
-*         = 0: the lower block is an NR-by-NR square matrix.
-*         = 1: the lower block is an NR-by-(NR+1) rectangular matrix.
-*
-*         The bidiagonal matrix has row dimension N = NL + NR + 1,
-*         and column dimension M = N + SQRE.
-*
-*  D      (input/output) DOUBLE PRECISION array, dimension ( NL+NR+1 ).
-*         On entry D(1:NL,1:NL) contains the singular values of the
-*         upper block, and D(NL+2:N) contains the singular values
-*         of the lower block. On exit D(1:N) contains the singular
-*         values of the modified matrix.
-*
-*  VF     (input/output) DOUBLE PRECISION array, dimension ( M )
-*         On entry, VF(1:NL+1) contains the first components of all
-*         right singular vectors of the upper block; and VF(NL+2:M)
-*         contains the first components of all right singular vectors
-*         of the lower block. On exit, VF contains the first components
-*         of all right singular vectors of the bidiagonal matrix.
-*
-*  VL     (input/output) DOUBLE PRECISION array, dimension ( M )
-*         On entry, VL(1:NL+1) contains the  last components of all
-*         right singular vectors of the upper block; and VL(NL+2:M)
-*         contains the last components of all right singular vectors of
-*         the lower block. On exit, VL contains the last components of
-*         all right singular vectors of the bidiagonal matrix.
-*
-*  ALPHA  (input/output) DOUBLE PRECISION
-*         Contains the diagonal element associated with the added row.
-*
-*  BETA   (input/output) DOUBLE PRECISION
-*         Contains the off-diagonal element associated with the added
-*         row.
-*
-*  IDXQ   (output) INTEGER array, dimension ( N )
-*         This contains the permutation which will reintegrate the
-*         subproblem just solved back into sorted order, i.e.
-*         D( IDXQ( I = 1, N ) ) will be in ascending order.
-*
-*  PERM   (output) INTEGER array, dimension ( N )
-*         The permutations (from deflation and sorting) to be applied
-*         to each block. Not referenced if ICOMPQ = 0.
-*
-*  GIVPTR (output) INTEGER
-*         The number of Givens rotations which took place in this
-*         subproblem. Not referenced if ICOMPQ = 0.
-*
-*  GIVCOL (output) INTEGER array, dimension ( LDGCOL, 2 )
-*         Each pair of numbers indicates a pair of columns to take place
-*         in a Givens rotation. Not referenced if ICOMPQ = 0.
-*
-*  LDGCOL (input) INTEGER
-*         leading dimension of GIVCOL, must be at least N.
-*
-*  GIVNUM (output) DOUBLE PRECISION array, dimension ( LDGNUM, 2 )
-*         Each number indicates the C or S value to be used in the
-*         corresponding Givens rotation. Not referenced if ICOMPQ = 0.
-*
-*  LDGNUM (input) INTEGER
-*         The leading dimension of GIVNUM and POLES, must be at least N.
-*
-*  POLES  (output) DOUBLE PRECISION array, dimension ( LDGNUM, 2 )
-*         On exit, POLES(1,*) is an array containing the new singular
-*         values obtained from solving the secular equation, and
-*         POLES(2,*) is an array containing the poles in the secular
-*         equation. Not referenced if ICOMPQ = 0.
-*
-*  DIFL   (output) DOUBLE PRECISION array, dimension ( N )
-*         On exit, DIFL(I) is the distance between I-th updated
-*         (undeflated) singular value and the I-th (undeflated) old
-*         singular value.
-*
-*  DIFR   (output) DOUBLE PRECISION array,
-*                  dimension ( LDGNUM, 2 ) if ICOMPQ = 1 and
-*                  dimension ( N ) if ICOMPQ = 0.
-*         On exit, DIFR(I, 1) is the distance between I-th updated
-*         (undeflated) singular value and the I+1-th (undeflated) old
-*         singular value.
-*
-*         If ICOMPQ = 1, DIFR(1:K,2) is an array containing the
-*         normalizing factors for the right singular vector matrix.
-*
-*         See DLASD8 for details on DIFL and DIFR.
-*
-*  Z      (output) DOUBLE PRECISION array, dimension ( M )
-*         The first elements of this array contain the components
-*         of the deflation-adjusted updating row vector.
-*
-*  K      (output) INTEGER
-*         Contains the dimension of the non-deflated matrix,
-*         This is the order of the related secular equation. 1 <= K <=N.
-*
-*  C      (output) DOUBLE PRECISION
-*         C contains garbage if SQRE =0 and the C-value of a Givens
-*         rotation related to the right null space if SQRE = 1.
-*
-*  S      (output) DOUBLE PRECISION
-*         S contains garbage if SQRE =0 and the S-value of a Givens
-*         rotation related to the right null space if SQRE = 1.
-*
-*  WORK   (workspace) DOUBLE PRECISION array, dimension ( 4 * M )
-*
-*  IWORK  (workspace) INTEGER array, dimension ( 3 * N )
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if INFO = 1, an singular value did not converge
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, IDX, IDXC, IDXP, ISIGMA, IVFW, IVLW, IW, M,
-     $                   N, N1, N2
-      DOUBLE PRECISION   ORGNRM
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DLAMRG, DLASCL, DLASD7, DLASD8, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      N = NL + NR + 1
-      M = N + SQRE
-*
-      IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN
-         INFO = -1
-      ELSE IF( NL.LT.1 ) THEN
-         INFO = -2
-      ELSE IF( NR.LT.1 ) THEN
-         INFO = -3
-      ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN
-         INFO = -4
-      ELSE IF( LDGCOL.LT.N ) THEN
-         INFO = -14
-      ELSE IF( LDGNUM.LT.N ) THEN
-         INFO = -16
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLASD6', -INFO )
-         RETURN
-      END IF
-*
-*     The following values are for bookkeeping purposes only.  They are
-*     integer pointers which indicate the portion of the workspace
-*     used by a particular array in DLASD7 and DLASD8.
-*
-      ISIGMA = 1
-      IW = ISIGMA + N
-      IVFW = IW + M
-      IVLW = IVFW + M
-*
-      IDX = 1
-      IDXC = IDX + N
-      IDXP = IDXC + N
-*
-*     Scale.
-*
-      ORGNRM = MAX( ABS( ALPHA ), ABS( BETA ) )
-      D( NL+1 ) = ZERO
-      DO 10 I = 1, N
-         IF( ABS( D( I ) ).GT.ORGNRM ) THEN
-            ORGNRM = ABS( D( I ) )
-         END IF
-   10 CONTINUE
-      CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, N, 1, D, N, INFO )
-      ALPHA = ALPHA / ORGNRM
-      BETA = BETA / ORGNRM
-*
-*     Sort and Deflate singular values.
-*
-      CALL DLASD7( ICOMPQ, NL, NR, SQRE, K, D, Z, WORK( IW ), VF,
-     $             WORK( IVFW ), VL, WORK( IVLW ), ALPHA, BETA,
-     $             WORK( ISIGMA ), IWORK( IDX ), IWORK( IDXP ), IDXQ,
-     $             PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM, C, S,
-     $             INFO )
-*
-*     Solve Secular Equation, compute DIFL, DIFR, and update VF, VL.
-*
-      CALL DLASD8( ICOMPQ, K, D, Z, VF, VL, DIFL, DIFR, LDGNUM,
-     $             WORK( ISIGMA ), WORK( IW ), INFO )
-*
-*     Save the poles if ICOMPQ = 1.
-*
-      IF( ICOMPQ.EQ.1 ) THEN
-         CALL DCOPY( K, D, 1, POLES( 1, 1 ), 1 )
-         CALL DCOPY( K, WORK( ISIGMA ), 1, POLES( 1, 2 ), 1 )
-      END IF
-*
-*     Unscale.
-*
-      CALL DLASCL( 'G', 0, 0, ONE, ORGNRM, N, 1, D, N, INFO )
-*
-*     Prepare the IDXQ sorting permutation.
-*
-      N1 = K
-      N2 = N - K
-      CALL DLAMRG( N1, N2, D, 1, -1, IDXQ )
-*
-      RETURN
-*
-*     End of DLASD6
-*
-      END
--- a/libcruft/lapack/dlasd7.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,444 +0,0 @@
-      SUBROUTINE DLASD7( ICOMPQ, NL, NR, SQRE, K, D, Z, ZW, VF, VFW, VL,
-     $                   VLW, ALPHA, BETA, DSIGMA, IDX, IDXP, IDXQ,
-     $                   PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM,
-     $                   C, S, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            GIVPTR, ICOMPQ, INFO, K, LDGCOL, LDGNUM, NL,
-     $                   NR, SQRE
-      DOUBLE PRECISION   ALPHA, BETA, C, S
-*     ..
-*     .. Array Arguments ..
-      INTEGER            GIVCOL( LDGCOL, * ), IDX( * ), IDXP( * ),
-     $                   IDXQ( * ), PERM( * )
-      DOUBLE PRECISION   D( * ), DSIGMA( * ), GIVNUM( LDGNUM, * ),
-     $                   VF( * ), VFW( * ), VL( * ), VLW( * ), Z( * ),
-     $                   ZW( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASD7 merges the two sets of singular values together into a single
-*  sorted set. Then it tries to deflate the size of the problem. There
-*  are two ways in which deflation can occur:  when two or more singular
-*  values are close together or if there is a tiny entry in the Z
-*  vector. For each such occurrence the order of the related
-*  secular equation problem is reduced by one.
-*
-*  DLASD7 is called from DLASD6.
-*
-*  Arguments
-*  =========
-*
-*  ICOMPQ  (input) INTEGER
-*          Specifies whether singular vectors are to be computed
-*          in compact form, as follows:
-*          = 0: Compute singular values only.
-*          = 1: Compute singular vectors of upper
-*               bidiagonal matrix in compact form.
-*
-*  NL     (input) INTEGER
-*         The row dimension of the upper block. NL >= 1.
-*
-*  NR     (input) INTEGER
-*         The row dimension of the lower block. NR >= 1.
-*
-*  SQRE   (input) INTEGER
-*         = 0: the lower block is an NR-by-NR square matrix.
-*         = 1: the lower block is an NR-by-(NR+1) rectangular matrix.
-*
-*         The bidiagonal matrix has
-*         N = NL + NR + 1 rows and
-*         M = N + SQRE >= N columns.
-*
-*  K      (output) INTEGER
-*         Contains the dimension of the non-deflated matrix, this is
-*         the order of the related secular equation. 1 <= K <=N.
-*
-*  D      (input/output) DOUBLE PRECISION array, dimension ( N )
-*         On entry D contains the singular values of the two submatrices
-*         to be combined. On exit D contains the trailing (N-K) updated
-*         singular values (those which were deflated) sorted into
-*         increasing order.
-*
-*  Z      (output) DOUBLE PRECISION array, dimension ( M )
-*         On exit Z contains the updating row vector in the secular
-*         equation.
-*
-*  ZW     (workspace) DOUBLE PRECISION array, dimension ( M )
-*         Workspace for Z.
-*
-*  VF     (input/output) DOUBLE PRECISION array, dimension ( M )
-*         On entry, VF(1:NL+1) contains the first components of all
-*         right singular vectors of the upper block; and VF(NL+2:M)
-*         contains the first components of all right singular vectors
-*         of the lower block. On exit, VF contains the first components
-*         of all right singular vectors of the bidiagonal matrix.
-*
-*  VFW    (workspace) DOUBLE PRECISION array, dimension ( M )
-*         Workspace for VF.
-*
-*  VL     (input/output) DOUBLE PRECISION array, dimension ( M )
-*         On entry, VL(1:NL+1) contains the  last components of all
-*         right singular vectors of the upper block; and VL(NL+2:M)
-*         contains the last components of all right singular vectors
-*         of the lower block. On exit, VL contains the last components
-*         of all right singular vectors of the bidiagonal matrix.
-*
-*  VLW    (workspace) DOUBLE PRECISION array, dimension ( M )
-*         Workspace for VL.
-*
-*  ALPHA  (input) DOUBLE PRECISION
-*         Contains the diagonal element associated with the added row.
-*
-*  BETA   (input) DOUBLE PRECISION
-*         Contains the off-diagonal element associated with the added
-*         row.
-*
-*  DSIGMA (output) DOUBLE PRECISION array, dimension ( N )
-*         Contains a copy of the diagonal elements (K-1 singular values
-*         and one zero) in the secular equation.
-*
-*  IDX    (workspace) INTEGER array, dimension ( N )
-*         This will contain the permutation used to sort the contents of
-*         D into ascending order.
-*
-*  IDXP   (workspace) INTEGER array, dimension ( N )
-*         This will contain the permutation used to place deflated
-*         values of D at the end of the array. On output IDXP(2:K)
-*         points to the nondeflated D-values and IDXP(K+1:N)
-*         points to the deflated singular values.
-*
-*  IDXQ   (input) INTEGER array, dimension ( N )
-*         This contains the permutation which separately sorts the two
-*         sub-problems in D into ascending order.  Note that entries in
-*         the first half of this permutation must first be moved one
-*         position backward; and entries in the second half
-*         must first have NL+1 added to their values.
-*
-*  PERM   (output) INTEGER array, dimension ( N )
-*         The permutations (from deflation and sorting) to be applied
-*         to each singular block. Not referenced if ICOMPQ = 0.
-*
-*  GIVPTR (output) INTEGER
-*         The number of Givens rotations which took place in this
-*         subproblem. Not referenced if ICOMPQ = 0.
-*
-*  GIVCOL (output) INTEGER array, dimension ( LDGCOL, 2 )
-*         Each pair of numbers indicates a pair of columns to take place
-*         in a Givens rotation. Not referenced if ICOMPQ = 0.
-*
-*  LDGCOL (input) INTEGER
-*         The leading dimension of GIVCOL, must be at least N.
-*
-*  GIVNUM (output) DOUBLE PRECISION array, dimension ( LDGNUM, 2 )
-*         Each number indicates the C or S value to be used in the
-*         corresponding Givens rotation. Not referenced if ICOMPQ = 0.
-*
-*  LDGNUM (input) INTEGER
-*         The leading dimension of GIVNUM, must be at least N.
-*
-*  C      (output) DOUBLE PRECISION
-*         C contains garbage if SQRE =0 and the C-value of a Givens
-*         rotation related to the right null space if SQRE = 1.
-*
-*  S      (output) DOUBLE PRECISION
-*         S contains garbage if SQRE =0 and the S-value of a Givens
-*         rotation related to the right null space if SQRE = 1.
-*
-*  INFO   (output) INTEGER
-*         = 0:  successful exit.
-*         < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE, TWO, EIGHT
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0,
-     $                   EIGHT = 8.0D+0 )
-*     ..
-*     .. Local Scalars ..
-*
-      INTEGER            I, IDXI, IDXJ, IDXJP, J, JP, JPREV, K2, M, N,
-     $                   NLP1, NLP2
-      DOUBLE PRECISION   EPS, HLFTOL, TAU, TOL, Z1
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DLAMRG, DROT, XERBLA
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH, DLAPY2
-      EXTERNAL           DLAMCH, DLAPY2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      N = NL + NR + 1
-      M = N + SQRE
-*
-      IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN
-         INFO = -1
-      ELSE IF( NL.LT.1 ) THEN
-         INFO = -2
-      ELSE IF( NR.LT.1 ) THEN
-         INFO = -3
-      ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN
-         INFO = -4
-      ELSE IF( LDGCOL.LT.N ) THEN
-         INFO = -22
-      ELSE IF( LDGNUM.LT.N ) THEN
-         INFO = -24
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLASD7', -INFO )
-         RETURN
-      END IF
-*
-      NLP1 = NL + 1
-      NLP2 = NL + 2
-      IF( ICOMPQ.EQ.1 ) THEN
-         GIVPTR = 0
-      END IF
-*
-*     Generate the first part of the vector Z and move the singular
-*     values in the first part of D one position backward.
-*
-      Z1 = ALPHA*VL( NLP1 )
-      VL( NLP1 ) = ZERO
-      TAU = VF( NLP1 )
-      DO 10 I = NL, 1, -1
-         Z( I+1 ) = ALPHA*VL( I )
-         VL( I ) = ZERO
-         VF( I+1 ) = VF( I )
-         D( I+1 ) = D( I )
-         IDXQ( I+1 ) = IDXQ( I ) + 1
-   10 CONTINUE
-      VF( 1 ) = TAU
-*
-*     Generate the second part of the vector Z.
-*
-      DO 20 I = NLP2, M
-         Z( I ) = BETA*VF( I )
-         VF( I ) = ZERO
-   20 CONTINUE
-*
-*     Sort the singular values into increasing order
-*
-      DO 30 I = NLP2, N
-         IDXQ( I ) = IDXQ( I ) + NLP1
-   30 CONTINUE
-*
-*     DSIGMA, IDXC, IDXC, and ZW are used as storage space.
-*
-      DO 40 I = 2, N
-         DSIGMA( I ) = D( IDXQ( I ) )
-         ZW( I ) = Z( IDXQ( I ) )
-         VFW( I ) = VF( IDXQ( I ) )
-         VLW( I ) = VL( IDXQ( I ) )
-   40 CONTINUE
-*
-      CALL DLAMRG( NL, NR, DSIGMA( 2 ), 1, 1, IDX( 2 ) )
-*
-      DO 50 I = 2, N
-         IDXI = 1 + IDX( I )
-         D( I ) = DSIGMA( IDXI )
-         Z( I ) = ZW( IDXI )
-         VF( I ) = VFW( IDXI )
-         VL( I ) = VLW( IDXI )
-   50 CONTINUE
-*
-*     Calculate the allowable deflation tolerence
-*
-      EPS = DLAMCH( 'Epsilon' )
-      TOL = MAX( ABS( ALPHA ), ABS( BETA ) )
-      TOL = EIGHT*EIGHT*EPS*MAX( ABS( D( N ) ), TOL )
-*
-*     There are 2 kinds of deflation -- first a value in the z-vector
-*     is small, second two (or more) singular values are very close
-*     together (their difference is small).
-*
-*     If the value in the z-vector is small, we simply permute the
-*     array so that the corresponding singular value is moved to the
-*     end.
-*
-*     If two values in the D-vector are close, we perform a two-sided
-*     rotation designed to make one of the corresponding z-vector
-*     entries zero, and then permute the array so that the deflated
-*     singular value is moved to the end.
-*
-*     If there are multiple singular values then the problem deflates.
-*     Here the number of equal singular values are found.  As each equal
-*     singular value is found, an elementary reflector is computed to
-*     rotate the corresponding singular subspace so that the
-*     corresponding components of Z are zero in this new basis.
-*
-      K = 1
-      K2 = N + 1
-      DO 60 J = 2, N
-         IF( ABS( Z( J ) ).LE.TOL ) THEN
-*
-*           Deflate due to small z component.
-*
-            K2 = K2 - 1
-            IDXP( K2 ) = J
-            IF( J.EQ.N )
-     $         GO TO 100
-         ELSE
-            JPREV = J
-            GO TO 70
-         END IF
-   60 CONTINUE
-   70 CONTINUE
-      J = JPREV
-   80 CONTINUE
-      J = J + 1
-      IF( J.GT.N )
-     $   GO TO 90
-      IF( ABS( Z( J ) ).LE.TOL ) THEN
-*
-*        Deflate due to small z component.
-*
-         K2 = K2 - 1
-         IDXP( K2 ) = J
-      ELSE
-*
-*        Check if singular values are close enough to allow deflation.
-*
-         IF( ABS( D( J )-D( JPREV ) ).LE.TOL ) THEN
-*
-*           Deflation is possible.
-*
-            S = Z( JPREV )
-            C = Z( J )
-*
-*           Find sqrt(a**2+b**2) without overflow or
-*           destructive underflow.
-*
-            TAU = DLAPY2( C, S )
-            Z( J ) = TAU
-            Z( JPREV ) = ZERO
-            C = C / TAU
-            S = -S / TAU
-*
-*           Record the appropriate Givens rotation
-*
-            IF( ICOMPQ.EQ.1 ) THEN
-               GIVPTR = GIVPTR + 1
-               IDXJP = IDXQ( IDX( JPREV )+1 )
-               IDXJ = IDXQ( IDX( J )+1 )
-               IF( IDXJP.LE.NLP1 ) THEN
-                  IDXJP = IDXJP - 1
-               END IF
-               IF( IDXJ.LE.NLP1 ) THEN
-                  IDXJ = IDXJ - 1
-               END IF
-               GIVCOL( GIVPTR, 2 ) = IDXJP
-               GIVCOL( GIVPTR, 1 ) = IDXJ
-               GIVNUM( GIVPTR, 2 ) = C
-               GIVNUM( GIVPTR, 1 ) = S
-            END IF
-            CALL DROT( 1, VF( JPREV ), 1, VF( J ), 1, C, S )
-            CALL DROT( 1, VL( JPREV ), 1, VL( J ), 1, C, S )
-            K2 = K2 - 1
-            IDXP( K2 ) = JPREV
-            JPREV = J
-         ELSE
-            K = K + 1
-            ZW( K ) = Z( JPREV )
-            DSIGMA( K ) = D( JPREV )
-            IDXP( K ) = JPREV
-            JPREV = J
-         END IF
-      END IF
-      GO TO 80
-   90 CONTINUE
-*
-*     Record the last singular value.
-*
-      K = K + 1
-      ZW( K ) = Z( JPREV )
-      DSIGMA( K ) = D( JPREV )
-      IDXP( K ) = JPREV
-*
-  100 CONTINUE
-*
-*     Sort the singular values into DSIGMA. The singular values which
-*     were not deflated go into the first K slots of DSIGMA, except
-*     that DSIGMA(1) is treated separately.
-*
-      DO 110 J = 2, N
-         JP = IDXP( J )
-         DSIGMA( J ) = D( JP )
-         VFW( J ) = VF( JP )
-         VLW( J ) = VL( JP )
-  110 CONTINUE
-      IF( ICOMPQ.EQ.1 ) THEN
-         DO 120 J = 2, N
-            JP = IDXP( J )
-            PERM( J ) = IDXQ( IDX( JP )+1 )
-            IF( PERM( J ).LE.NLP1 ) THEN
-               PERM( J ) = PERM( J ) - 1
-            END IF
-  120    CONTINUE
-      END IF
-*
-*     The deflated singular values go back into the last N - K slots of
-*     D.
-*
-      CALL DCOPY( N-K, DSIGMA( K+1 ), 1, D( K+1 ), 1 )
-*
-*     Determine DSIGMA(1), DSIGMA(2), Z(1), VF(1), VL(1), VF(M), and
-*     VL(M).
-*
-      DSIGMA( 1 ) = ZERO
-      HLFTOL = TOL / TWO
-      IF( ABS( DSIGMA( 2 ) ).LE.HLFTOL )
-     $   DSIGMA( 2 ) = HLFTOL
-      IF( M.GT.N ) THEN
-         Z( 1 ) = DLAPY2( Z1, Z( M ) )
-         IF( Z( 1 ).LE.TOL ) THEN
-            C = ONE
-            S = ZERO
-            Z( 1 ) = TOL
-         ELSE
-            C = Z1 / Z( 1 )
-            S = -Z( M ) / Z( 1 )
-         END IF
-         CALL DROT( 1, VF( M ), 1, VF( 1 ), 1, C, S )
-         CALL DROT( 1, VL( M ), 1, VL( 1 ), 1, C, S )
-      ELSE
-         IF( ABS( Z1 ).LE.TOL ) THEN
-            Z( 1 ) = TOL
-         ELSE
-            Z( 1 ) = Z1
-         END IF
-      END IF
-*
-*     Restore Z, VF, and VL.
-*
-      CALL DCOPY( K-1, ZW( 2 ), 1, Z( 2 ), 1 )
-      CALL DCOPY( N-1, VFW( 2 ), 1, VF( 2 ), 1 )
-      CALL DCOPY( N-1, VLW( 2 ), 1, VL( 2 ), 1 )
-*
-      RETURN
-*
-*     End of DLASD7
-*
-      END
--- a/libcruft/lapack/dlasd8.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,253 +0,0 @@
-      SUBROUTINE DLASD8( ICOMPQ, K, D, Z, VF, VL, DIFL, DIFR, LDDIFR,
-     $                   DSIGMA, WORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            ICOMPQ, INFO, K, LDDIFR
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * ), DIFL( * ), DIFR( LDDIFR, * ),
-     $                   DSIGMA( * ), VF( * ), VL( * ), WORK( * ),
-     $                   Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASD8 finds the square roots of the roots of the secular equation,
-*  as defined by the values in DSIGMA and Z. It makes the appropriate
-*  calls to DLASD4, and stores, for each  element in D, the distance
-*  to its two nearest poles (elements in DSIGMA). It also updates
-*  the arrays VF and VL, the first and last components of all the
-*  right singular vectors of the original bidiagonal matrix.
-*
-*  DLASD8 is called from DLASD6.
-*
-*  Arguments
-*  =========
-*
-*  ICOMPQ  (input) INTEGER
-*          Specifies whether singular vectors are to be computed in
-*          factored form in the calling routine:
-*          = 0: Compute singular values only.
-*          = 1: Compute singular vectors in factored form as well.
-*
-*  K       (input) INTEGER
-*          The number of terms in the rational function to be solved
-*          by DLASD4.  K >= 1.
-*
-*  D       (output) DOUBLE PRECISION array, dimension ( K )
-*          On output, D contains the updated singular values.
-*
-*  Z       (input) DOUBLE PRECISION array, dimension ( K )
-*          The first K elements of this array contain the components
-*          of the deflation-adjusted updating row vector.
-*
-*  VF      (input/output) DOUBLE PRECISION array, dimension ( K )
-*          On entry, VF contains  information passed through DBEDE8.
-*          On exit, VF contains the first K components of the first
-*          components of all right singular vectors of the bidiagonal
-*          matrix.
-*
-*  VL      (input/output) DOUBLE PRECISION array, dimension ( K )
-*          On entry, VL contains  information passed through DBEDE8.
-*          On exit, VL contains the first K components of the last
-*          components of all right singular vectors of the bidiagonal
-*          matrix.
-*
-*  DIFL    (output) DOUBLE PRECISION array, dimension ( K )
-*          On exit, DIFL(I) = D(I) - DSIGMA(I).
-*
-*  DIFR    (output) DOUBLE PRECISION array,
-*                   dimension ( LDDIFR, 2 ) if ICOMPQ = 1 and
-*                   dimension ( K ) if ICOMPQ = 0.
-*          On exit, DIFR(I,1) = D(I) - DSIGMA(I+1), DIFR(K,1) is not
-*          defined and will not be referenced.
-*
-*          If ICOMPQ = 1, DIFR(1:K,2) is an array containing the
-*          normalizing factors for the right singular vector matrix.
-*
-*  LDDIFR  (input) INTEGER
-*          The leading dimension of DIFR, must be at least K.
-*
-*  DSIGMA  (input) DOUBLE PRECISION array, dimension ( K )
-*          The first K elements of this array contain the old roots
-*          of the deflated updating problem.  These are the poles
-*          of the secular equation.
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension at least 3 * K
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if INFO = 1, an singular value did not converge
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, IWK1, IWK2, IWK2I, IWK3, IWK3I, J
-      DOUBLE PRECISION   DIFLJ, DIFRJ, DJ, DSIGJ, DSIGJP, RHO, TEMP
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DLASCL, DLASD4, DLASET, XERBLA
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DDOT, DLAMC3, DNRM2
-      EXTERNAL           DDOT, DLAMC3, DNRM2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN
-         INFO = -1
-      ELSE IF( K.LT.1 ) THEN
-         INFO = -2
-      ELSE IF( LDDIFR.LT.K ) THEN
-         INFO = -9
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLASD8', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( K.EQ.1 ) THEN
-         D( 1 ) = ABS( Z( 1 ) )
-         DIFL( 1 ) = D( 1 )
-         IF( ICOMPQ.EQ.1 ) THEN
-            DIFL( 2 ) = ONE
-            DIFR( 1, 2 ) = ONE
-         END IF
-         RETURN
-      END IF
-*
-*     Modify values DSIGMA(i) to make sure all DSIGMA(i)-DSIGMA(j) can
-*     be computed with high relative accuracy (barring over/underflow).
-*     This is a problem on machines without a guard digit in
-*     add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2).
-*     The following code replaces DSIGMA(I) by 2*DSIGMA(I)-DSIGMA(I),
-*     which on any of these machines zeros out the bottommost
-*     bit of DSIGMA(I) if it is 1; this makes the subsequent
-*     subtractions DSIGMA(I)-DSIGMA(J) unproblematic when cancellation
-*     occurs. On binary machines with a guard digit (almost all
-*     machines) it does not change DSIGMA(I) at all. On hexadecimal
-*     and decimal machines with a guard digit, it slightly
-*     changes the bottommost bits of DSIGMA(I). It does not account
-*     for hexadecimal or decimal machines without guard digits
-*     (we know of none). We use a subroutine call to compute
-*     2*DSIGMA(I) to prevent optimizing compilers from eliminating
-*     this code.
-*
-      DO 10 I = 1, K
-         DSIGMA( I ) = DLAMC3( DSIGMA( I ), DSIGMA( I ) ) - DSIGMA( I )
-   10 CONTINUE
-*
-*     Book keeping.
-*
-      IWK1 = 1
-      IWK2 = IWK1 + K
-      IWK3 = IWK2 + K
-      IWK2I = IWK2 - 1
-      IWK3I = IWK3 - 1
-*
-*     Normalize Z.
-*
-      RHO = DNRM2( K, Z, 1 )
-      CALL DLASCL( 'G', 0, 0, RHO, ONE, K, 1, Z, K, INFO )
-      RHO = RHO*RHO
-*
-*     Initialize WORK(IWK3).
-*
-      CALL DLASET( 'A', K, 1, ONE, ONE, WORK( IWK3 ), K )
-*
-*     Compute the updated singular values, the arrays DIFL, DIFR,
-*     and the updated Z.
-*
-      DO 40 J = 1, K
-         CALL DLASD4( K, J, DSIGMA, Z, WORK( IWK1 ), RHO, D( J ),
-     $                WORK( IWK2 ), INFO )
-*
-*        If the root finder fails, the computation is terminated.
-*
-         IF( INFO.NE.0 ) THEN
-            RETURN
-         END IF
-         WORK( IWK3I+J ) = WORK( IWK3I+J )*WORK( J )*WORK( IWK2I+J )
-         DIFL( J ) = -WORK( J )
-         DIFR( J, 1 ) = -WORK( J+1 )
-         DO 20 I = 1, J - 1
-            WORK( IWK3I+I ) = WORK( IWK3I+I )*WORK( I )*
-     $                        WORK( IWK2I+I ) / ( DSIGMA( I )-
-     $                        DSIGMA( J ) ) / ( DSIGMA( I )+
-     $                        DSIGMA( J ) )
-   20    CONTINUE
-         DO 30 I = J + 1, K
-            WORK( IWK3I+I ) = WORK( IWK3I+I )*WORK( I )*
-     $                        WORK( IWK2I+I ) / ( DSIGMA( I )-
-     $                        DSIGMA( J ) ) / ( DSIGMA( I )+
-     $                        DSIGMA( J ) )
-   30    CONTINUE
-   40 CONTINUE
-*
-*     Compute updated Z.
-*
-      DO 50 I = 1, K
-         Z( I ) = SIGN( SQRT( ABS( WORK( IWK3I+I ) ) ), Z( I ) )
-   50 CONTINUE
-*
-*     Update VF and VL.
-*
-      DO 80 J = 1, K
-         DIFLJ = DIFL( J )
-         DJ = D( J )
-         DSIGJ = -DSIGMA( J )
-         IF( J.LT.K ) THEN
-            DIFRJ = -DIFR( J, 1 )
-            DSIGJP = -DSIGMA( J+1 )
-         END IF
-         WORK( J ) = -Z( J ) / DIFLJ / ( DSIGMA( J )+DJ )
-         DO 60 I = 1, J - 1
-            WORK( I ) = Z( I ) / ( DLAMC3( DSIGMA( I ), DSIGJ )-DIFLJ )
-     $                   / ( DSIGMA( I )+DJ )
-   60    CONTINUE
-         DO 70 I = J + 1, K
-            WORK( I ) = Z( I ) / ( DLAMC3( DSIGMA( I ), DSIGJP )+DIFRJ )
-     $                   / ( DSIGMA( I )+DJ )
-   70    CONTINUE
-         TEMP = DNRM2( K, WORK, 1 )
-         WORK( IWK2I+J ) = DDOT( K, WORK, 1, VF, 1 ) / TEMP
-         WORK( IWK3I+J ) = DDOT( K, WORK, 1, VL, 1 ) / TEMP
-         IF( ICOMPQ.EQ.1 ) THEN
-            DIFR( J, 2 ) = TEMP
-         END IF
-   80 CONTINUE
-*
-      CALL DCOPY( K, WORK( IWK2 ), 1, VF, 1 )
-      CALL DCOPY( K, WORK( IWK3 ), 1, VL, 1 )
-*
-      RETURN
-*
-*     End of DLASD8
-*
-      END
--- a/libcruft/lapack/dlasda.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,390 +0,0 @@
-      SUBROUTINE DLASDA( ICOMPQ, SMLSIZ, N, SQRE, D, E, U, LDU, VT, K,
-     $                   DIFL, DIFR, Z, POLES, GIVPTR, GIVCOL, LDGCOL,
-     $                   PERM, GIVNUM, C, S, WORK, IWORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            ICOMPQ, INFO, LDGCOL, LDU, N, SMLSIZ, SQRE
-*     ..
-*     .. Array Arguments ..
-      INTEGER            GIVCOL( LDGCOL, * ), GIVPTR( * ), IWORK( * ),
-     $                   K( * ), PERM( LDGCOL, * )
-      DOUBLE PRECISION   C( * ), D( * ), DIFL( LDU, * ), DIFR( LDU, * ),
-     $                   E( * ), GIVNUM( LDU, * ), POLES( LDU, * ),
-     $                   S( * ), U( LDU, * ), VT( LDU, * ), WORK( * ),
-     $                   Z( LDU, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  Using a divide and conquer approach, DLASDA computes the singular
-*  value decomposition (SVD) of a real upper bidiagonal N-by-M matrix
-*  B with diagonal D and offdiagonal E, where M = N + SQRE. The
-*  algorithm computes the singular values in the SVD B = U * S * VT.
-*  The orthogonal matrices U and VT are optionally computed in
-*  compact form.
-*
-*  A related subroutine, DLASD0, computes the singular values and
-*  the singular vectors in explicit form.
-*
-*  Arguments
-*  =========
-*
-*  ICOMPQ (input) INTEGER
-*         Specifies whether singular vectors are to be computed
-*         in compact form, as follows
-*         = 0: Compute singular values only.
-*         = 1: Compute singular vectors of upper bidiagonal
-*              matrix in compact form.
-*
-*  SMLSIZ (input) INTEGER
-*         The maximum size of the subproblems at the bottom of the
-*         computation tree.
-*
-*  N      (input) INTEGER
-*         The row dimension of the upper bidiagonal matrix. This is
-*         also the dimension of the main diagonal array D.
-*
-*  SQRE   (input) INTEGER
-*         Specifies the column dimension of the bidiagonal matrix.
-*         = 0: The bidiagonal matrix has column dimension M = N;
-*         = 1: The bidiagonal matrix has column dimension M = N + 1.
-*
-*  D      (input/output) DOUBLE PRECISION array, dimension ( N )
-*         On entry D contains the main diagonal of the bidiagonal
-*         matrix. On exit D, if INFO = 0, contains its singular values.
-*
-*  E      (input) DOUBLE PRECISION array, dimension ( M-1 )
-*         Contains the subdiagonal entries of the bidiagonal matrix.
-*         On exit, E has been destroyed.
-*
-*  U      (output) DOUBLE PRECISION array,
-*         dimension ( LDU, SMLSIZ ) if ICOMPQ = 1, and not referenced
-*         if ICOMPQ = 0. If ICOMPQ = 1, on exit, U contains the left
-*         singular vector matrices of all subproblems at the bottom
-*         level.
-*
-*  LDU    (input) INTEGER, LDU = > N.
-*         The leading dimension of arrays U, VT, DIFL, DIFR, POLES,
-*         GIVNUM, and Z.
-*
-*  VT     (output) DOUBLE PRECISION array,
-*         dimension ( LDU, SMLSIZ+1 ) if ICOMPQ = 1, and not referenced
-*         if ICOMPQ = 0. If ICOMPQ = 1, on exit, VT' contains the right
-*         singular vector matrices of all subproblems at the bottom
-*         level.
-*
-*  K      (output) INTEGER array,
-*         dimension ( N ) if ICOMPQ = 1 and dimension 1 if ICOMPQ = 0.
-*         If ICOMPQ = 1, on exit, K(I) is the dimension of the I-th
-*         secular equation on the computation tree.
-*
-*  DIFL   (output) DOUBLE PRECISION array, dimension ( LDU, NLVL ),
-*         where NLVL = floor(log_2 (N/SMLSIZ))).
-*
-*  DIFR   (output) DOUBLE PRECISION array,
-*                  dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1 and
-*                  dimension ( N ) if ICOMPQ = 0.
-*         If ICOMPQ = 1, on exit, DIFL(1:N, I) and DIFR(1:N, 2 * I - 1)
-*         record distances between singular values on the I-th
-*         level and singular values on the (I -1)-th level, and
-*         DIFR(1:N, 2 * I ) contains the normalizing factors for
-*         the right singular vector matrix. See DLASD8 for details.
-*
-*  Z      (output) DOUBLE PRECISION array,
-*                  dimension ( LDU, NLVL ) if ICOMPQ = 1 and
-*                  dimension ( N ) if ICOMPQ = 0.
-*         The first K elements of Z(1, I) contain the components of
-*         the deflation-adjusted updating row vector for subproblems
-*         on the I-th level.
-*
-*  POLES  (output) DOUBLE PRECISION array,
-*         dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1, and not referenced
-*         if ICOMPQ = 0. If ICOMPQ = 1, on exit, POLES(1, 2*I - 1) and
-*         POLES(1, 2*I) contain  the new and old singular values
-*         involved in the secular equations on the I-th level.
-*
-*  GIVPTR (output) INTEGER array,
-*         dimension ( N ) if ICOMPQ = 1, and not referenced if
-*         ICOMPQ = 0. If ICOMPQ = 1, on exit, GIVPTR( I ) records
-*         the number of Givens rotations performed on the I-th
-*         problem on the computation tree.
-*
-*  GIVCOL (output) INTEGER array,
-*         dimension ( LDGCOL, 2 * NLVL ) if ICOMPQ = 1, and not
-*         referenced if ICOMPQ = 0. If ICOMPQ = 1, on exit, for each I,
-*         GIVCOL(1, 2 *I - 1) and GIVCOL(1, 2 *I) record the locations
-*         of Givens rotations performed on the I-th level on the
-*         computation tree.
-*
-*  LDGCOL (input) INTEGER, LDGCOL = > N.
-*         The leading dimension of arrays GIVCOL and PERM.
-*
-*  PERM   (output) INTEGER array,
-*         dimension ( LDGCOL, NLVL ) if ICOMPQ = 1, and not referenced
-*         if ICOMPQ = 0. If ICOMPQ = 1, on exit, PERM(1, I) records
-*         permutations done on the I-th level of the computation tree.
-*
-*  GIVNUM (output) DOUBLE PRECISION array,
-*         dimension ( LDU,  2 * NLVL ) if ICOMPQ = 1, and not
-*         referenced if ICOMPQ = 0. If ICOMPQ = 1, on exit, for each I,
-*         GIVNUM(1, 2 *I - 1) and GIVNUM(1, 2 *I) record the C- and S-
-*         values of Givens rotations performed on the I-th level on
-*         the computation tree.
-*
-*  C      (output) DOUBLE PRECISION array,
-*         dimension ( N ) if ICOMPQ = 1, and dimension 1 if ICOMPQ = 0.
-*         If ICOMPQ = 1 and the I-th subproblem is not square, on exit,
-*         C( I ) contains the C-value of a Givens rotation related to
-*         the right null space of the I-th subproblem.
-*
-*  S      (output) DOUBLE PRECISION array, dimension ( N ) if
-*         ICOMPQ = 1, and dimension 1 if ICOMPQ = 0. If ICOMPQ = 1
-*         and the I-th subproblem is not square, on exit, S( I )
-*         contains the S-value of a Givens rotation related to
-*         the right null space of the I-th subproblem.
-*
-*  WORK   (workspace) DOUBLE PRECISION array, dimension
-*         (6 * N + (SMLSIZ + 1)*(SMLSIZ + 1)).
-*
-*  IWORK  (workspace) INTEGER array.
-*         Dimension must be at least (7 * N).
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if INFO = 1, an singular value did not converge
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I1, IC, IDXQ, IDXQI, IM1, INODE, ITEMP, IWK,
-     $                   J, LF, LL, LVL, LVL2, M, NCC, ND, NDB1, NDIML,
-     $                   NDIMR, NL, NLF, NLP1, NLVL, NR, NRF, NRP1, NRU,
-     $                   NWORK1, NWORK2, SMLSZP, SQREI, VF, VFI, VL, VLI
-      DOUBLE PRECISION   ALPHA, BETA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DLASD6, DLASDQ, DLASDT, DLASET, XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN
-         INFO = -1
-      ELSE IF( SMLSIZ.LT.3 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN
-         INFO = -4
-      ELSE IF( LDU.LT.( N+SQRE ) ) THEN
-         INFO = -8
-      ELSE IF( LDGCOL.LT.N ) THEN
-         INFO = -17
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLASDA', -INFO )
-         RETURN
-      END IF
-*
-      M = N + SQRE
-*
-*     If the input matrix is too small, call DLASDQ to find the SVD.
-*
-      IF( N.LE.SMLSIZ ) THEN
-         IF( ICOMPQ.EQ.0 ) THEN
-            CALL DLASDQ( 'U', SQRE, N, 0, 0, 0, D, E, VT, LDU, U, LDU,
-     $                   U, LDU, WORK, INFO )
-         ELSE
-            CALL DLASDQ( 'U', SQRE, N, M, N, 0, D, E, VT, LDU, U, LDU,
-     $                   U, LDU, WORK, INFO )
-         END IF
-         RETURN
-      END IF
-*
-*     Book-keeping and  set up the computation tree.
-*
-      INODE = 1
-      NDIML = INODE + N
-      NDIMR = NDIML + N
-      IDXQ = NDIMR + N
-      IWK = IDXQ + N
-*
-      NCC = 0
-      NRU = 0
-*
-      SMLSZP = SMLSIZ + 1
-      VF = 1
-      VL = VF + M
-      NWORK1 = VL + M
-      NWORK2 = NWORK1 + SMLSZP*SMLSZP
-*
-      CALL DLASDT( N, NLVL, ND, IWORK( INODE ), IWORK( NDIML ),
-     $             IWORK( NDIMR ), SMLSIZ )
-*
-*     for the nodes on bottom level of the tree, solve
-*     their subproblems by DLASDQ.
-*
-      NDB1 = ( ND+1 ) / 2
-      DO 30 I = NDB1, ND
-*
-*        IC : center row of each node
-*        NL : number of rows of left  subproblem
-*        NR : number of rows of right subproblem
-*        NLF: starting row of the left   subproblem
-*        NRF: starting row of the right  subproblem
-*
-         I1 = I - 1
-         IC = IWORK( INODE+I1 )
-         NL = IWORK( NDIML+I1 )
-         NLP1 = NL + 1
-         NR = IWORK( NDIMR+I1 )
-         NLF = IC - NL
-         NRF = IC + 1
-         IDXQI = IDXQ + NLF - 2
-         VFI = VF + NLF - 1
-         VLI = VL + NLF - 1
-         SQREI = 1
-         IF( ICOMPQ.EQ.0 ) THEN
-            CALL DLASET( 'A', NLP1, NLP1, ZERO, ONE, WORK( NWORK1 ),
-     $                   SMLSZP )
-            CALL DLASDQ( 'U', SQREI, NL, NLP1, NRU, NCC, D( NLF ),
-     $                   E( NLF ), WORK( NWORK1 ), SMLSZP,
-     $                   WORK( NWORK2 ), NL, WORK( NWORK2 ), NL,
-     $                   WORK( NWORK2 ), INFO )
-            ITEMP = NWORK1 + NL*SMLSZP
-            CALL DCOPY( NLP1, WORK( NWORK1 ), 1, WORK( VFI ), 1 )
-            CALL DCOPY( NLP1, WORK( ITEMP ), 1, WORK( VLI ), 1 )
-         ELSE
-            CALL DLASET( 'A', NL, NL, ZERO, ONE, U( NLF, 1 ), LDU )
-            CALL DLASET( 'A', NLP1, NLP1, ZERO, ONE, VT( NLF, 1 ), LDU )
-            CALL DLASDQ( 'U', SQREI, NL, NLP1, NL, NCC, D( NLF ),
-     $                   E( NLF ), VT( NLF, 1 ), LDU, U( NLF, 1 ), LDU,
-     $                   U( NLF, 1 ), LDU, WORK( NWORK1 ), INFO )
-            CALL DCOPY( NLP1, VT( NLF, 1 ), 1, WORK( VFI ), 1 )
-            CALL DCOPY( NLP1, VT( NLF, NLP1 ), 1, WORK( VLI ), 1 )
-         END IF
-         IF( INFO.NE.0 ) THEN
-            RETURN
-         END IF
-         DO 10 J = 1, NL
-            IWORK( IDXQI+J ) = J
-   10    CONTINUE
-         IF( ( I.EQ.ND ) .AND. ( SQRE.EQ.0 ) ) THEN
-            SQREI = 0
-         ELSE
-            SQREI = 1
-         END IF
-         IDXQI = IDXQI + NLP1
-         VFI = VFI + NLP1
-         VLI = VLI + NLP1
-         NRP1 = NR + SQREI
-         IF( ICOMPQ.EQ.0 ) THEN
-            CALL DLASET( 'A', NRP1, NRP1, ZERO, ONE, WORK( NWORK1 ),
-     $                   SMLSZP )
-            CALL DLASDQ( 'U', SQREI, NR, NRP1, NRU, NCC, D( NRF ),
-     $                   E( NRF ), WORK( NWORK1 ), SMLSZP,
-     $                   WORK( NWORK2 ), NR, WORK( NWORK2 ), NR,
-     $                   WORK( NWORK2 ), INFO )
-            ITEMP = NWORK1 + ( NRP1-1 )*SMLSZP
-            CALL DCOPY( NRP1, WORK( NWORK1 ), 1, WORK( VFI ), 1 )
-            CALL DCOPY( NRP1, WORK( ITEMP ), 1, WORK( VLI ), 1 )
-         ELSE
-            CALL DLASET( 'A', NR, NR, ZERO, ONE, U( NRF, 1 ), LDU )
-            CALL DLASET( 'A', NRP1, NRP1, ZERO, ONE, VT( NRF, 1 ), LDU )
-            CALL DLASDQ( 'U', SQREI, NR, NRP1, NR, NCC, D( NRF ),
-     $                   E( NRF ), VT( NRF, 1 ), LDU, U( NRF, 1 ), LDU,
-     $                   U( NRF, 1 ), LDU, WORK( NWORK1 ), INFO )
-            CALL DCOPY( NRP1, VT( NRF, 1 ), 1, WORK( VFI ), 1 )
-            CALL DCOPY( NRP1, VT( NRF, NRP1 ), 1, WORK( VLI ), 1 )
-         END IF
-         IF( INFO.NE.0 ) THEN
-            RETURN
-         END IF
-         DO 20 J = 1, NR
-            IWORK( IDXQI+J ) = J
-   20    CONTINUE
-   30 CONTINUE
-*
-*     Now conquer each subproblem bottom-up.
-*
-      J = 2**NLVL
-      DO 50 LVL = NLVL, 1, -1
-         LVL2 = LVL*2 - 1
-*
-*        Find the first node LF and last node LL on
-*        the current level LVL.
-*
-         IF( LVL.EQ.1 ) THEN
-            LF = 1
-            LL = 1
-         ELSE
-            LF = 2**( LVL-1 )
-            LL = 2*LF - 1
-         END IF
-         DO 40 I = LF, LL
-            IM1 = I - 1
-            IC = IWORK( INODE+IM1 )
-            NL = IWORK( NDIML+IM1 )
-            NR = IWORK( NDIMR+IM1 )
-            NLF = IC - NL
-            NRF = IC + 1
-            IF( I.EQ.LL ) THEN
-               SQREI = SQRE
-            ELSE
-               SQREI = 1
-            END IF
-            VFI = VF + NLF - 1
-            VLI = VL + NLF - 1
-            IDXQI = IDXQ + NLF - 1
-            ALPHA = D( IC )
-            BETA = E( IC )
-            IF( ICOMPQ.EQ.0 ) THEN
-               CALL DLASD6( ICOMPQ, NL, NR, SQREI, D( NLF ),
-     $                      WORK( VFI ), WORK( VLI ), ALPHA, BETA,
-     $                      IWORK( IDXQI ), PERM, GIVPTR( 1 ), GIVCOL,
-     $                      LDGCOL, GIVNUM, LDU, POLES, DIFL, DIFR, Z,
-     $                      K( 1 ), C( 1 ), S( 1 ), WORK( NWORK1 ),
-     $                      IWORK( IWK ), INFO )
-            ELSE
-               J = J - 1
-               CALL DLASD6( ICOMPQ, NL, NR, SQREI, D( NLF ),
-     $                      WORK( VFI ), WORK( VLI ), ALPHA, BETA,
-     $                      IWORK( IDXQI ), PERM( NLF, LVL ),
-     $                      GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL,
-     $                      GIVNUM( NLF, LVL2 ), LDU,
-     $                      POLES( NLF, LVL2 ), DIFL( NLF, LVL ),
-     $                      DIFR( NLF, LVL2 ), Z( NLF, LVL ), K( J ),
-     $                      C( J ), S( J ), WORK( NWORK1 ),
-     $                      IWORK( IWK ), INFO )
-            END IF
-            IF( INFO.NE.0 ) THEN
-               RETURN
-            END IF
-   40    CONTINUE
-   50 CONTINUE
-*
-      RETURN
-*
-*     End of DLASDA
-*
-      END
--- a/libcruft/lapack/dlasdq.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,316 +0,0 @@
-      SUBROUTINE DLASDQ( UPLO, SQRE, N, NCVT, NRU, NCC, D, E, VT, LDVT,
-     $                   U, LDU, C, LDC, WORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU, SQRE
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   C( LDC, * ), D( * ), E( * ), U( LDU, * ),
-     $                   VT( LDVT, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASDQ computes the singular value decomposition (SVD) of a real
-*  (upper or lower) bidiagonal matrix with diagonal D and offdiagonal
-*  E, accumulating the transformations if desired. Letting B denote
-*  the input bidiagonal matrix, the algorithm computes orthogonal
-*  matrices Q and P such that B = Q * S * P' (P' denotes the transpose
-*  of P). The singular values S are overwritten on D.
-*
-*  The input matrix U  is changed to U  * Q  if desired.
-*  The input matrix VT is changed to P' * VT if desired.
-*  The input matrix C  is changed to Q' * C  if desired.
-*
-*  See "Computing  Small Singular Values of Bidiagonal Matrices With
-*  Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan,
-*  LAPACK Working Note #3, for a detailed description of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  UPLO  (input) CHARACTER*1
-*        On entry, UPLO specifies whether the input bidiagonal matrix
-*        is upper or lower bidiagonal, and wether it is square are
-*        not.
-*           UPLO = 'U' or 'u'   B is upper bidiagonal.
-*           UPLO = 'L' or 'l'   B is lower bidiagonal.
-*
-*  SQRE  (input) INTEGER
-*        = 0: then the input matrix is N-by-N.
-*        = 1: then the input matrix is N-by-(N+1) if UPLU = 'U' and
-*             (N+1)-by-N if UPLU = 'L'.
-*
-*        The bidiagonal matrix has
-*        N = NL + NR + 1 rows and
-*        M = N + SQRE >= N columns.
-*
-*  N     (input) INTEGER
-*        On entry, N specifies the number of rows and columns
-*        in the matrix. N must be at least 0.
-*
-*  NCVT  (input) INTEGER
-*        On entry, NCVT specifies the number of columns of
-*        the matrix VT. NCVT must be at least 0.
-*
-*  NRU   (input) INTEGER
-*        On entry, NRU specifies the number of rows of
-*        the matrix U. NRU must be at least 0.
-*
-*  NCC   (input) INTEGER
-*        On entry, NCC specifies the number of columns of
-*        the matrix C. NCC must be at least 0.
-*
-*  D     (input/output) DOUBLE PRECISION array, dimension (N)
-*        On entry, D contains the diagonal entries of the
-*        bidiagonal matrix whose SVD is desired. On normal exit,
-*        D contains the singular values in ascending order.
-*
-*  E     (input/output) DOUBLE PRECISION array.
-*        dimension is (N-1) if SQRE = 0 and N if SQRE = 1.
-*        On entry, the entries of E contain the offdiagonal entries
-*        of the bidiagonal matrix whose SVD is desired. On normal
-*        exit, E will contain 0. If the algorithm does not converge,
-*        D and E will contain the diagonal and superdiagonal entries
-*        of a bidiagonal matrix orthogonally equivalent to the one
-*        given as input.
-*
-*  VT    (input/output) DOUBLE PRECISION array, dimension (LDVT, NCVT)
-*        On entry, contains a matrix which on exit has been
-*        premultiplied by P', dimension N-by-NCVT if SQRE = 0
-*        and (N+1)-by-NCVT if SQRE = 1 (not referenced if NCVT=0).
-*
-*  LDVT  (input) INTEGER
-*        On entry, LDVT specifies the leading dimension of VT as
-*        declared in the calling (sub) program. LDVT must be at
-*        least 1. If NCVT is nonzero LDVT must also be at least N.
-*
-*  U     (input/output) DOUBLE PRECISION array, dimension (LDU, N)
-*        On entry, contains a  matrix which on exit has been
-*        postmultiplied by Q, dimension NRU-by-N if SQRE = 0
-*        and NRU-by-(N+1) if SQRE = 1 (not referenced if NRU=0).
-*
-*  LDU   (input) INTEGER
-*        On entry, LDU  specifies the leading dimension of U as
-*        declared in the calling (sub) program. LDU must be at
-*        least max( 1, NRU ) .
-*
-*  C     (input/output) DOUBLE PRECISION array, dimension (LDC, NCC)
-*        On entry, contains an N-by-NCC matrix which on exit
-*        has been premultiplied by Q'  dimension N-by-NCC if SQRE = 0
-*        and (N+1)-by-NCC if SQRE = 1 (not referenced if NCC=0).
-*
-*  LDC   (input) INTEGER
-*        On entry, LDC  specifies the leading dimension of C as
-*        declared in the calling (sub) program. LDC must be at
-*        least 1. If NCC is nonzero, LDC must also be at least N.
-*
-*  WORK  (workspace) DOUBLE PRECISION array, dimension (4*N)
-*        Workspace. Only referenced if one of NCVT, NRU, or NCC is
-*        nonzero, and if N is at least 2.
-*
-*  INFO  (output) INTEGER
-*        On exit, a value of 0 indicates a successful exit.
-*        If INFO < 0, argument number -INFO is illegal.
-*        If INFO > 0, the algorithm did not converge, and INFO
-*        specifies how many superdiagonals did not converge.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ROTATE
-      INTEGER            I, ISUB, IUPLO, J, NP1, SQRE1
-      DOUBLE PRECISION   CS, R, SMIN, SN
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DBDSQR, DLARTG, DLASR, DSWAP, XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IUPLO = 0
-      IF( LSAME( UPLO, 'U' ) )
-     $   IUPLO = 1
-      IF( LSAME( UPLO, 'L' ) )
-     $   IUPLO = 2
-      IF( IUPLO.EQ.0 ) THEN
-         INFO = -1
-      ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( NCVT.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( NRU.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( NCC.LT.0 ) THEN
-         INFO = -6
-      ELSE IF( ( NCVT.EQ.0 .AND. LDVT.LT.1 ) .OR.
-     $         ( NCVT.GT.0 .AND. LDVT.LT.MAX( 1, N ) ) ) THEN
-         INFO = -10
-      ELSE IF( LDU.LT.MAX( 1, NRU ) ) THEN
-         INFO = -12
-      ELSE IF( ( NCC.EQ.0 .AND. LDC.LT.1 ) .OR.
-     $         ( NCC.GT.0 .AND. LDC.LT.MAX( 1, N ) ) ) THEN
-         INFO = -14
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLASDQ', -INFO )
-         RETURN
-      END IF
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     ROTATE is true if any singular vectors desired, false otherwise
-*
-      ROTATE = ( NCVT.GT.0 ) .OR. ( NRU.GT.0 ) .OR. ( NCC.GT.0 )
-      NP1 = N + 1
-      SQRE1 = SQRE
-*
-*     If matrix non-square upper bidiagonal, rotate to be lower
-*     bidiagonal.  The rotations are on the right.
-*
-      IF( ( IUPLO.EQ.1 ) .AND. ( SQRE1.EQ.1 ) ) THEN
-         DO 10 I = 1, N - 1
-            CALL DLARTG( D( I ), E( I ), CS, SN, R )
-            D( I ) = R
-            E( I ) = SN*D( I+1 )
-            D( I+1 ) = CS*D( I+1 )
-            IF( ROTATE ) THEN
-               WORK( I ) = CS
-               WORK( N+I ) = SN
-            END IF
-   10    CONTINUE
-         CALL DLARTG( D( N ), E( N ), CS, SN, R )
-         D( N ) = R
-         E( N ) = ZERO
-         IF( ROTATE ) THEN
-            WORK( N ) = CS
-            WORK( N+N ) = SN
-         END IF
-         IUPLO = 2
-         SQRE1 = 0
-*
-*        Update singular vectors if desired.
-*
-         IF( NCVT.GT.0 )
-     $      CALL DLASR( 'L', 'V', 'F', NP1, NCVT, WORK( 1 ),
-     $                  WORK( NP1 ), VT, LDVT )
-      END IF
-*
-*     If matrix lower bidiagonal, rotate to be upper bidiagonal
-*     by applying Givens rotations on the left.
-*
-      IF( IUPLO.EQ.2 ) THEN
-         DO 20 I = 1, N - 1
-            CALL DLARTG( D( I ), E( I ), CS, SN, R )
-            D( I ) = R
-            E( I ) = SN*D( I+1 )
-            D( I+1 ) = CS*D( I+1 )
-            IF( ROTATE ) THEN
-               WORK( I ) = CS
-               WORK( N+I ) = SN
-            END IF
-   20    CONTINUE
-*
-*        If matrix (N+1)-by-N lower bidiagonal, one additional
-*        rotation is needed.
-*
-         IF( SQRE1.EQ.1 ) THEN
-            CALL DLARTG( D( N ), E( N ), CS, SN, R )
-            D( N ) = R
-            IF( ROTATE ) THEN
-               WORK( N ) = CS
-               WORK( N+N ) = SN
-            END IF
-         END IF
-*
-*        Update singular vectors if desired.
-*
-         IF( NRU.GT.0 ) THEN
-            IF( SQRE1.EQ.0 ) THEN
-               CALL DLASR( 'R', 'V', 'F', NRU, N, WORK( 1 ),
-     $                     WORK( NP1 ), U, LDU )
-            ELSE
-               CALL DLASR( 'R', 'V', 'F', NRU, NP1, WORK( 1 ),
-     $                     WORK( NP1 ), U, LDU )
-            END IF
-         END IF
-         IF( NCC.GT.0 ) THEN
-            IF( SQRE1.EQ.0 ) THEN
-               CALL DLASR( 'L', 'V', 'F', N, NCC, WORK( 1 ),
-     $                     WORK( NP1 ), C, LDC )
-            ELSE
-               CALL DLASR( 'L', 'V', 'F', NP1, NCC, WORK( 1 ),
-     $                     WORK( NP1 ), C, LDC )
-            END IF
-         END IF
-      END IF
-*
-*     Call DBDSQR to compute the SVD of the reduced real
-*     N-by-N upper bidiagonal matrix.
-*
-      CALL DBDSQR( 'U', N, NCVT, NRU, NCC, D, E, VT, LDVT, U, LDU, C,
-     $             LDC, WORK, INFO )
-*
-*     Sort the singular values into ascending order (insertion sort on
-*     singular values, but only one transposition per singular vector)
-*
-      DO 40 I = 1, N
-*
-*        Scan for smallest D(I).
-*
-         ISUB = I
-         SMIN = D( I )
-         DO 30 J = I + 1, N
-            IF( D( J ).LT.SMIN ) THEN
-               ISUB = J
-               SMIN = D( J )
-            END IF
-   30    CONTINUE
-         IF( ISUB.NE.I ) THEN
-*
-*           Swap singular values and vectors.
-*
-            D( ISUB ) = D( I )
-            D( I ) = SMIN
-            IF( NCVT.GT.0 )
-     $         CALL DSWAP( NCVT, VT( ISUB, 1 ), LDVT, VT( I, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL DSWAP( NRU, U( 1, ISUB ), 1, U( 1, I ), 1 )
-            IF( NCC.GT.0 )
-     $         CALL DSWAP( NCC, C( ISUB, 1 ), LDC, C( I, 1 ), LDC )
-         END IF
-   40 CONTINUE
-*
-      RETURN
-*
-*     End of DLASDQ
-*
-      END
--- a/libcruft/lapack/dlasdt.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-      SUBROUTINE DLASDT( N, LVL, ND, INODE, NDIML, NDIMR, MSUB )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            LVL, MSUB, N, ND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            INODE( * ), NDIML( * ), NDIMR( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASDT creates a tree of subproblems for bidiagonal divide and
-*  conquer.
-*
-*  Arguments
-*  =========
-*
-*   N      (input) INTEGER
-*          On entry, the number of diagonal elements of the
-*          bidiagonal matrix.
-*
-*   LVL    (output) INTEGER
-*          On exit, the number of levels on the computation tree.
-*
-*   ND     (output) INTEGER
-*          On exit, the number of nodes on the tree.
-*
-*   INODE  (output) INTEGER array, dimension ( N )
-*          On exit, centers of subproblems.
-*
-*   NDIML  (output) INTEGER array, dimension ( N )
-*          On exit, row dimensions of left children.
-*
-*   NDIMR  (output) INTEGER array, dimension ( N )
-*          On exit, row dimensions of right children.
-*
-*   MSUB   (input) INTEGER.
-*          On entry, the maximum row dimension each subproblem at the
-*          bottom of the tree can be of.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   TWO
-      PARAMETER          ( TWO = 2.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, IL, IR, LLST, MAXN, NCRNT, NLVL
-      DOUBLE PRECISION   TEMP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, INT, LOG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Find the number of levels on the tree.
-*
-      MAXN = MAX( 1, N )
-      TEMP = LOG( DBLE( MAXN ) / DBLE( MSUB+1 ) ) / LOG( TWO )
-      LVL = INT( TEMP ) + 1
-*
-      I = N / 2
-      INODE( 1 ) = I + 1
-      NDIML( 1 ) = I
-      NDIMR( 1 ) = N - I - 1
-      IL = 0
-      IR = 1
-      LLST = 1
-      DO 20 NLVL = 1, LVL - 1
-*
-*        Constructing the tree at (NLVL+1)-st level. The number of
-*        nodes created on this level is LLST * 2.
-*
-         DO 10 I = 0, LLST - 1
-            IL = IL + 2
-            IR = IR + 2
-            NCRNT = LLST + I
-            NDIML( IL ) = NDIML( NCRNT ) / 2
-            NDIMR( IL ) = NDIML( NCRNT ) - NDIML( IL ) - 1
-            INODE( IL ) = INODE( NCRNT ) - NDIMR( IL ) - 1
-            NDIML( IR ) = NDIMR( NCRNT ) / 2
-            NDIMR( IR ) = NDIMR( NCRNT ) - NDIML( IR ) - 1
-            INODE( IR ) = INODE( NCRNT ) + NDIML( IR ) + 1
-   10    CONTINUE
-         LLST = LLST*2
-   20 CONTINUE
-      ND = LLST*2 - 1
-*
-      RETURN
-*
-*     End of DLASDT
-*
-      END
--- a/libcruft/lapack/dlaset.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-      SUBROUTINE DLASET( UPLO, M, N, ALPHA, BETA, A, LDA )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            LDA, M, N
-      DOUBLE PRECISION   ALPHA, BETA
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASET initializes an m-by-n matrix A to BETA on the diagonal and
-*  ALPHA on the offdiagonals.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies the part of the matrix A to be set.
-*          = 'U':      Upper triangular part is set; the strictly lower
-*                      triangular part of A is not changed.
-*          = 'L':      Lower triangular part is set; the strictly upper
-*                      triangular part of A is not changed.
-*          Otherwise:  All of the matrix A is set.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  ALPHA   (input) DOUBLE PRECISION
-*          The constant to which the offdiagonal elements are to be set.
-*
-*  BETA    (input) DOUBLE PRECISION
-*          The constant to which the diagonal elements are to be set.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On exit, the leading m-by-n submatrix of A is set as follows:
-*
-*          if UPLO = 'U', A(i,j) = ALPHA, 1<=i<=j-1, 1<=j<=n,
-*          if UPLO = 'L', A(i,j) = ALPHA, j+1<=i<=m, 1<=j<=n,
-*          otherwise,     A(i,j) = ALPHA, 1<=i<=m, 1<=j<=n, i.ne.j,
-*
-*          and, for all UPLO, A(i,i) = BETA, 1<=i<=min(m,n).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-      IF( LSAME( UPLO, 'U' ) ) THEN
-*
-*        Set the strictly upper triangular or trapezoidal part of the
-*        array to ALPHA.
-*
-         DO 20 J = 2, N
-            DO 10 I = 1, MIN( J-1, M )
-               A( I, J ) = ALPHA
-   10       CONTINUE
-   20    CONTINUE
-*
-      ELSE IF( LSAME( UPLO, 'L' ) ) THEN
-*
-*        Set the strictly lower triangular or trapezoidal part of the
-*        array to ALPHA.
-*
-         DO 40 J = 1, MIN( M, N )
-            DO 30 I = J + 1, M
-               A( I, J ) = ALPHA
-   30       CONTINUE
-   40    CONTINUE
-*
-      ELSE
-*
-*        Set the leading m-by-n submatrix to ALPHA.
-*
-         DO 60 J = 1, N
-            DO 50 I = 1, M
-               A( I, J ) = ALPHA
-   50       CONTINUE
-   60    CONTINUE
-      END IF
-*
-*     Set the first min(M,N) diagonal elements to BETA.
-*
-      DO 70 I = 1, MIN( M, N )
-         A( I, I ) = BETA
-   70 CONTINUE
-*
-      RETURN
-*
-*     End of DLASET
-*
-      END
--- a/libcruft/lapack/dlasq1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-      SUBROUTINE DLASQ1( N, D, E, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * ), E( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASQ1 computes the singular values of a real N-by-N bidiagonal
-*  matrix with diagonal D and off-diagonal E. The singular values
-*  are computed to high relative accuracy, in the absence of
-*  denormalization, underflow and overflow. The algorithm was first
-*  presented in
-*
-*  "Accurate singular values and differential qd algorithms" by K. V.
-*  Fernando and B. N. Parlett, Numer. Math., Vol-67, No. 2, pp. 191-230,
-*  1994,
-*
-*  and the present implementation is described in "An implementation of
-*  the dqds Algorithm (Positive Case)", LAPACK Working Note.
-*
-*  Arguments
-*  =========
-*
-*  N     (input) INTEGER
-*        The number of rows and columns in the matrix. N >= 0.
-*
-*  D     (input/output) DOUBLE PRECISION array, dimension (N)
-*        On entry, D contains the diagonal elements of the
-*        bidiagonal matrix whose SVD is desired. On normal exit,
-*        D contains the singular values in decreasing order.
-*
-*  E     (input/output) DOUBLE PRECISION array, dimension (N)
-*        On entry, elements E(1:N-1) contain the off-diagonal elements
-*        of the bidiagonal matrix whose SVD is desired.
-*        On exit, E is overwritten.
-*
-*  WORK  (workspace) DOUBLE PRECISION array, dimension (4*N)
-*
-*  INFO  (output) INTEGER
-*        = 0: successful exit
-*        < 0: if INFO = -i, the i-th argument had an illegal value
-*        > 0: the algorithm failed
-*             = 1, a split was marked by a positive value in E
-*             = 2, current block of Z not diagonalized after 30*N
-*                  iterations (in inner while loop)
-*             = 3, termination criterion of outer while loop not met 
-*                  (program created more than N unreduced blocks)
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, IINFO
-      DOUBLE PRECISION   EPS, SCALE, SAFMIN, SIGMN, SIGMX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DLAS2, DLASCL, DLASQ2, DLASRT, XERBLA
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           DLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -2
-         CALL XERBLA( 'DLASQ1', -INFO )
-         RETURN
-      ELSE IF( N.EQ.0 ) THEN
-         RETURN
-      ELSE IF( N.EQ.1 ) THEN
-         D( 1 ) = ABS( D( 1 ) )
-         RETURN
-      ELSE IF( N.EQ.2 ) THEN
-         CALL DLAS2( D( 1 ), E( 1 ), D( 2 ), SIGMN, SIGMX )
-         D( 1 ) = SIGMX
-         D( 2 ) = SIGMN
-         RETURN
-      END IF
-*
-*     Estimate the largest singular value.
-*
-      SIGMX = ZERO
-      DO 10 I = 1, N - 1
-         D( I ) = ABS( D( I ) )
-         SIGMX = MAX( SIGMX, ABS( E( I ) ) )
-   10 CONTINUE
-      D( N ) = ABS( D( N ) )
-*
-*     Early return if SIGMX is zero (matrix is already diagonal).
-*
-      IF( SIGMX.EQ.ZERO ) THEN
-         CALL DLASRT( 'D', N, D, IINFO )
-         RETURN
-      END IF
-*
-      DO 20 I = 1, N
-         SIGMX = MAX( SIGMX, D( I ) )
-   20 CONTINUE
-*
-*     Copy D and E into WORK (in the Z format) and scale (squaring the
-*     input data makes scaling by a power of the radix pointless).
-*
-      EPS = DLAMCH( 'Precision' )
-      SAFMIN = DLAMCH( 'Safe minimum' )
-      SCALE = SQRT( EPS / SAFMIN )
-      CALL DCOPY( N, D, 1, WORK( 1 ), 2 )
-      CALL DCOPY( N-1, E, 1, WORK( 2 ), 2 )
-      CALL DLASCL( 'G', 0, 0, SIGMX, SCALE, 2*N-1, 1, WORK, 2*N-1,
-     $             IINFO )
-*         
-*     Compute the q's and e's.
-*
-      DO 30 I = 1, 2*N - 1
-         WORK( I ) = WORK( I )**2
-   30 CONTINUE
-      WORK( 2*N ) = ZERO
-*
-      CALL DLASQ2( N, WORK, INFO )
-*
-      IF( INFO.EQ.0 ) THEN
-         DO 40 I = 1, N
-            D( I ) = SQRT( WORK( I ) )
-   40    CONTINUE
-         CALL DLASCL( 'G', 0, 0, SCALE, SIGMX, N, 1, D, N, IINFO )
-      END IF
-*
-      RETURN
-*
-*     End of DLASQ1
-*
-      END
--- a/libcruft/lapack/dlasq2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,448 +0,0 @@
-      SUBROUTINE DLASQ2( N, Z, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call DLAZQ3 in place of DLASQ3, 13 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASQ2 computes all the eigenvalues of the symmetric positive 
-*  definite tridiagonal matrix associated with the qd array Z to high
-*  relative accuracy are computed to high relative accuracy, in the
-*  absence of denormalization, underflow and overflow.
-*
-*  To see the relation of Z to the tridiagonal matrix, let L be a
-*  unit lower bidiagonal matrix with subdiagonals Z(2,4,6,,..) and
-*  let U be an upper bidiagonal matrix with 1's above and diagonal
-*  Z(1,3,5,,..). The tridiagonal is L*U or, if you prefer, the
-*  symmetric tridiagonal to which it is similar.
-*
-*  Note : DLASQ2 defines a logical variable, IEEE, which is true
-*  on machines which follow ieee-754 floating-point standard in their
-*  handling of infinities and NaNs, and false otherwise. This variable
-*  is passed to DLAZQ3.
-*
-*  Arguments
-*  =========
-*
-*  N     (input) INTEGER
-*        The number of rows and columns in the matrix. N >= 0.
-*
-*  Z     (workspace) DOUBLE PRECISION array, dimension ( 4*N )
-*        On entry Z holds the qd array. On exit, entries 1 to N hold
-*        the eigenvalues in decreasing order, Z( 2*N+1 ) holds the
-*        trace, and Z( 2*N+2 ) holds the sum of the eigenvalues. If
-*        N > 2, then Z( 2*N+3 ) holds the iteration count, Z( 2*N+4 )
-*        holds NDIVS/NIN^2, and Z( 2*N+5 ) holds the percentage of
-*        shifts that failed.
-*
-*  INFO  (output) INTEGER
-*        = 0: successful exit
-*        < 0: if the i-th argument is a scalar and had an illegal
-*             value, then INFO = -i, if the i-th argument is an
-*             array and the j-entry had an illegal value, then
-*             INFO = -(i*100+j)
-*        > 0: the algorithm failed
-*              = 1, a split was marked by a positive value in E
-*              = 2, current block of Z not diagonalized after 30*N
-*                   iterations (in inner while loop)
-*              = 3, termination criterion of outer while loop not met 
-*                   (program created more than N unreduced blocks)
-*
-*  Further Details
-*  ===============
-*  Local Variables: I0:N0 defines a current unreduced segment of Z.
-*  The shifts are accumulated in SIGMA. Iteration count is in ITER.
-*  Ping-pong is controlled by PP (alternates between 0 and 1).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   CBIAS
-      PARAMETER          ( CBIAS = 1.50D0 )
-      DOUBLE PRECISION   ZERO, HALF, ONE, TWO, FOUR, HUNDRD
-      PARAMETER          ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0,
-     $                     TWO = 2.0D0, FOUR = 4.0D0, HUNDRD = 100.0D0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            IEEE
-      INTEGER            I0, I4, IINFO, IPN4, ITER, IWHILA, IWHILB, K, 
-     $                   N0, NBIG, NDIV, NFAIL, PP, SPLT, TTYPE
-      DOUBLE PRECISION   D, DESIG, DMIN, DMIN1, DMIN2, DN, DN1, DN2, E,
-     $                   EMAX, EMIN, EPS, OLDEMN, QMAX, QMIN, S, SAFMIN,
-     $                   SIGMA, T, TAU, TEMP, TOL, TOL2, TRACE, ZMAX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLAZQ3, DLASRT, XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           DLAMCH, ILAENV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*      
-*     Test the input arguments.
-*     (in case DLASQ2 is not called by DLASQ1)
-*
-      INFO = 0
-      EPS = DLAMCH( 'Precision' )
-      SAFMIN = DLAMCH( 'Safe minimum' )
-      TOL = EPS*HUNDRD
-      TOL2 = TOL**2
-*
-      IF( N.LT.0 ) THEN
-         INFO = -1
-         CALL XERBLA( 'DLASQ2', 1 )
-         RETURN
-      ELSE IF( N.EQ.0 ) THEN
-         RETURN
-      ELSE IF( N.EQ.1 ) THEN
-*
-*        1-by-1 case.
-*
-         IF( Z( 1 ).LT.ZERO ) THEN
-            INFO = -201
-            CALL XERBLA( 'DLASQ2', 2 )
-         END IF
-         RETURN
-      ELSE IF( N.EQ.2 ) THEN
-*
-*        2-by-2 case.
-*
-         IF( Z( 2 ).LT.ZERO .OR. Z( 3 ).LT.ZERO ) THEN
-            INFO = -2
-            CALL XERBLA( 'DLASQ2', 2 )
-            RETURN
-         ELSE IF( Z( 3 ).GT.Z( 1 ) ) THEN
-            D = Z( 3 )
-            Z( 3 ) = Z( 1 )
-            Z( 1 ) = D
-         END IF
-         Z( 5 ) = Z( 1 ) + Z( 2 ) + Z( 3 )
-         IF( Z( 2 ).GT.Z( 3 )*TOL2 ) THEN
-            T = HALF*( ( Z( 1 )-Z( 3 ) )+Z( 2 ) ) 
-            S = Z( 3 )*( Z( 2 ) / T )
-            IF( S.LE.T ) THEN
-               S = Z( 3 )*( Z( 2 ) / ( T*( ONE+SQRT( ONE+S / T ) ) ) )
-            ELSE
-               S = Z( 3 )*( Z( 2 ) / ( T+SQRT( T )*SQRT( T+S ) ) )
-            END IF
-            T = Z( 1 ) + ( S+Z( 2 ) )
-            Z( 3 ) = Z( 3 )*( Z( 1 ) / T )
-            Z( 1 ) = T
-         END IF
-         Z( 2 ) = Z( 3 )
-         Z( 6 ) = Z( 2 ) + Z( 1 )
-         RETURN
-      END IF
-*
-*     Check for negative data and compute sums of q's and e's.
-*
-      Z( 2*N ) = ZERO
-      EMIN = Z( 2 )
-      QMAX = ZERO
-      ZMAX = ZERO
-      D = ZERO
-      E = ZERO
-*
-      DO 10 K = 1, 2*( N-1 ), 2
-         IF( Z( K ).LT.ZERO ) THEN
-            INFO = -( 200+K )
-            CALL XERBLA( 'DLASQ2', 2 )
-            RETURN
-         ELSE IF( Z( K+1 ).LT.ZERO ) THEN
-            INFO = -( 200+K+1 )
-            CALL XERBLA( 'DLASQ2', 2 )
-            RETURN
-         END IF
-         D = D + Z( K )
-         E = E + Z( K+1 )
-         QMAX = MAX( QMAX, Z( K ) )
-         EMIN = MIN( EMIN, Z( K+1 ) )
-         ZMAX = MAX( QMAX, ZMAX, Z( K+1 ) )
-   10 CONTINUE
-      IF( Z( 2*N-1 ).LT.ZERO ) THEN
-         INFO = -( 200+2*N-1 )
-         CALL XERBLA( 'DLASQ2', 2 )
-         RETURN
-      END IF
-      D = D + Z( 2*N-1 )
-      QMAX = MAX( QMAX, Z( 2*N-1 ) )
-      ZMAX = MAX( QMAX, ZMAX )
-*
-*     Check for diagonality.
-*
-      IF( E.EQ.ZERO ) THEN
-         DO 20 K = 2, N
-            Z( K ) = Z( 2*K-1 )
-   20    CONTINUE
-         CALL DLASRT( 'D', N, Z, IINFO )
-         Z( 2*N-1 ) = D
-         RETURN
-      END IF
-*
-      TRACE = D + E
-*
-*     Check for zero data.
-*
-      IF( TRACE.EQ.ZERO ) THEN
-         Z( 2*N-1 ) = ZERO
-         RETURN
-      END IF
-*         
-*     Check whether the machine is IEEE conformable.
-*         
-      IEEE = ILAENV( 10, 'DLASQ2', 'N', 1, 2, 3, 4 ).EQ.1 .AND.
-     $       ILAENV( 11, 'DLASQ2', 'N', 1, 2, 3, 4 ).EQ.1      
-*         
-*     Rearrange data for locality: Z=(q1,qq1,e1,ee1,q2,qq2,e2,ee2,...).
-*
-      DO 30 K = 2*N, 2, -2
-         Z( 2*K ) = ZERO 
-         Z( 2*K-1 ) = Z( K ) 
-         Z( 2*K-2 ) = ZERO 
-         Z( 2*K-3 ) = Z( K-1 ) 
-   30 CONTINUE
-*
-      I0 = 1
-      N0 = N
-*
-*     Reverse the qd-array, if warranted.
-*
-      IF( CBIAS*Z( 4*I0-3 ).LT.Z( 4*N0-3 ) ) THEN
-         IPN4 = 4*( I0+N0 )
-         DO 40 I4 = 4*I0, 2*( I0+N0-1 ), 4
-            TEMP = Z( I4-3 )
-            Z( I4-3 ) = Z( IPN4-I4-3 )
-            Z( IPN4-I4-3 ) = TEMP
-            TEMP = Z( I4-1 )
-            Z( I4-1 ) = Z( IPN4-I4-5 )
-            Z( IPN4-I4-5 ) = TEMP
-   40    CONTINUE
-      END IF
-*
-*     Initial split checking via dqd and Li's test.
-*
-      PP = 0
-*
-      DO 80 K = 1, 2
-*
-         D = Z( 4*N0+PP-3 )
-         DO 50 I4 = 4*( N0-1 ) + PP, 4*I0 + PP, -4
-            IF( Z( I4-1 ).LE.TOL2*D ) THEN
-               Z( I4-1 ) = -ZERO
-               D = Z( I4-3 )
-            ELSE
-               D = Z( I4-3 )*( D / ( D+Z( I4-1 ) ) )
-            END IF
-   50    CONTINUE
-*
-*        dqd maps Z to ZZ plus Li's test.
-*
-         EMIN = Z( 4*I0+PP+1 )
-         D = Z( 4*I0+PP-3 )
-         DO 60 I4 = 4*I0 + PP, 4*( N0-1 ) + PP, 4
-            Z( I4-2*PP-2 ) = D + Z( I4-1 )
-            IF( Z( I4-1 ).LE.TOL2*D ) THEN
-               Z( I4-1 ) = -ZERO
-               Z( I4-2*PP-2 ) = D
-               Z( I4-2*PP ) = ZERO
-               D = Z( I4+1 )
-            ELSE IF( SAFMIN*Z( I4+1 ).LT.Z( I4-2*PP-2 ) .AND.
-     $               SAFMIN*Z( I4-2*PP-2 ).LT.Z( I4+1 ) ) THEN
-               TEMP = Z( I4+1 ) / Z( I4-2*PP-2 )
-               Z( I4-2*PP ) = Z( I4-1 )*TEMP
-               D = D*TEMP
-            ELSE
-               Z( I4-2*PP ) = Z( I4+1 )*( Z( I4-1 ) / Z( I4-2*PP-2 ) )
-               D = Z( I4+1 )*( D / Z( I4-2*PP-2 ) )
-            END IF
-            EMIN = MIN( EMIN, Z( I4-2*PP ) )
-   60    CONTINUE 
-         Z( 4*N0-PP-2 ) = D
-*
-*        Now find qmax.
-*
-         QMAX = Z( 4*I0-PP-2 )
-         DO 70 I4 = 4*I0 - PP + 2, 4*N0 - PP - 2, 4
-            QMAX = MAX( QMAX, Z( I4 ) )
-   70    CONTINUE
-*
-*        Prepare for the next iteration on K.
-*
-         PP = 1 - PP
-   80 CONTINUE
-*
-*     Initialise variables to pass to DLAZQ3
-*
-      TTYPE = 0
-      DMIN1 = ZERO
-      DMIN2 = ZERO
-      DN    = ZERO
-      DN1   = ZERO
-      DN2   = ZERO
-      TAU   = ZERO
-*
-      ITER = 2
-      NFAIL = 0
-      NDIV = 2*( N0-I0 )
-*
-      DO 140 IWHILA = 1, N + 1
-         IF( N0.LT.1 ) 
-     $      GO TO 150
-*
-*        While array unfinished do 
-*
-*        E(N0) holds the value of SIGMA when submatrix in I0:N0
-*        splits from the rest of the array, but is negated.
-*      
-         DESIG = ZERO
-         IF( N0.EQ.N ) THEN
-            SIGMA = ZERO
-         ELSE
-            SIGMA = -Z( 4*N0-1 )
-         END IF
-         IF( SIGMA.LT.ZERO ) THEN
-            INFO = 1
-            RETURN
-         END IF
-*
-*        Find last unreduced submatrix's top index I0, find QMAX and
-*        EMIN. Find Gershgorin-type bound if Q's much greater than E's.
-*
-         EMAX = ZERO 
-         IF( N0.GT.I0 ) THEN
-            EMIN = ABS( Z( 4*N0-5 ) )
-         ELSE
-            EMIN = ZERO
-         END IF
-         QMIN = Z( 4*N0-3 )
-         QMAX = QMIN
-         DO 90 I4 = 4*N0, 8, -4
-            IF( Z( I4-5 ).LE.ZERO )
-     $         GO TO 100
-            IF( QMIN.GE.FOUR*EMAX ) THEN
-               QMIN = MIN( QMIN, Z( I4-3 ) )
-               EMAX = MAX( EMAX, Z( I4-5 ) )
-            END IF
-            QMAX = MAX( QMAX, Z( I4-7 )+Z( I4-5 ) )
-            EMIN = MIN( EMIN, Z( I4-5 ) )
-   90    CONTINUE
-         I4 = 4 
-*
-  100    CONTINUE
-         I0 = I4 / 4
-*
-*        Store EMIN for passing to DLAZQ3.
-*
-         Z( 4*N0-1 ) = EMIN
-*
-*        Put -(initial shift) into DMIN.
-*
-         DMIN = -MAX( ZERO, QMIN-TWO*SQRT( QMIN )*SQRT( EMAX ) )
-*
-*        Now I0:N0 is unreduced. PP = 0 for ping, PP = 1 for pong.
-*
-         PP = 0 
-*
-         NBIG = 30*( N0-I0+1 )
-         DO 120 IWHILB = 1, NBIG
-            IF( I0.GT.N0 ) 
-     $         GO TO 130
-*
-*           While submatrix unfinished take a good dqds step.
-*
-            CALL DLAZQ3( I0, N0, Z, PP, DMIN, SIGMA, DESIG, QMAX, NFAIL,
-     $                   ITER, NDIV, IEEE, TTYPE, DMIN1, DMIN2, DN, DN1,
-     $                   DN2, TAU )
-*
-            PP = 1 - PP
-*
-*           When EMIN is very small check for splits.
-*
-            IF( PP.EQ.0 .AND. N0-I0.GE.3 ) THEN
-               IF( Z( 4*N0 ).LE.TOL2*QMAX .OR.
-     $             Z( 4*N0-1 ).LE.TOL2*SIGMA ) THEN
-                  SPLT = I0 - 1
-                  QMAX = Z( 4*I0-3 )
-                  EMIN = Z( 4*I0-1 )
-                  OLDEMN = Z( 4*I0 )
-                  DO 110 I4 = 4*I0, 4*( N0-3 ), 4
-                     IF( Z( I4 ).LE.TOL2*Z( I4-3 ) .OR.
-     $                   Z( I4-1 ).LE.TOL2*SIGMA ) THEN
-                        Z( I4-1 ) = -SIGMA
-                        SPLT = I4 / 4
-                        QMAX = ZERO
-                        EMIN = Z( I4+3 )
-                        OLDEMN = Z( I4+4 )
-                     ELSE
-                        QMAX = MAX( QMAX, Z( I4+1 ) )
-                        EMIN = MIN( EMIN, Z( I4-1 ) )
-                        OLDEMN = MIN( OLDEMN, Z( I4 ) )
-                     END IF
-  110             CONTINUE
-                  Z( 4*N0-1 ) = EMIN
-                  Z( 4*N0 ) = OLDEMN
-                  I0 = SPLT + 1
-               END IF
-            END IF
-*
-  120    CONTINUE
-*
-         INFO = 2
-         RETURN
-*
-*        end IWHILB
-*
-  130    CONTINUE
-*
-  140 CONTINUE
-*
-      INFO = 3
-      RETURN
-*
-*     end IWHILA   
-*
-  150 CONTINUE
-*      
-*     Move q's to the front.
-*      
-      DO 160 K = 2, N
-         Z( K ) = Z( 4*K-3 )
-  160 CONTINUE
-*      
-*     Sort and compute sum of eigenvalues.
-*
-      CALL DLASRT( 'D', N, Z, IINFO )
-*
-      E = ZERO
-      DO 170 K = N, 1, -1
-         E = E + Z( K )
-  170 CONTINUE
-*
-*     Store trace, sum(eigenvalues) and information on performance.
-*
-      Z( 2*N+1 ) = TRACE 
-      Z( 2*N+2 ) = E
-      Z( 2*N+3 ) = DBLE( ITER )
-      Z( 2*N+4 ) = DBLE( NDIV ) / DBLE( N**2 )
-      Z( 2*N+5 ) = HUNDRD*NFAIL / DBLE( ITER )
-      RETURN
-*
-*     End of DLASQ2
-*
-      END
--- a/libcruft/lapack/dlasq3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,295 +0,0 @@
-      SUBROUTINE DLASQ3( I0, N0, Z, PP, DMIN, SIGMA, DESIG, QMAX, NFAIL,
-     $                   ITER, NDIV, IEEE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            IEEE
-      INTEGER            I0, ITER, N0, NDIV, NFAIL, PP
-      DOUBLE PRECISION   DESIG, DMIN, QMAX, SIGMA
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASQ3 checks for deflation, computes a shift (TAU) and calls dqds.
-*  In case of failure it changes shifts, and tries again until output
-*  is positive.
-*
-*  Arguments
-*  =========
-*
-*  I0     (input) INTEGER
-*         First index.
-*
-*  N0     (input) INTEGER
-*         Last index.
-*
-*  Z      (input) DOUBLE PRECISION array, dimension ( 4*N )
-*         Z holds the qd array.
-*
-*  PP     (input) INTEGER
-*         PP=0 for ping, PP=1 for pong.
-*
-*  DMIN   (output) DOUBLE PRECISION
-*         Minimum value of d.
-*
-*  SIGMA  (output) DOUBLE PRECISION
-*         Sum of shifts used in current segment.
-*
-*  DESIG  (input/output) DOUBLE PRECISION
-*         Lower order part of SIGMA
-*
-*  QMAX   (input) DOUBLE PRECISION
-*         Maximum value of q.
-*
-*  NFAIL  (output) INTEGER
-*         Number of times shift was too big.
-*
-*  ITER   (output) INTEGER
-*         Number of iterations.
-*
-*  NDIV   (output) INTEGER
-*         Number of divisions.
-*
-*  TTYPE  (output) INTEGER
-*         Shift type.
-*
-*  IEEE   (input) LOGICAL
-*         Flag for IEEE or non IEEE arithmetic (passed to DLASQ5).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   CBIAS
-      PARAMETER          ( CBIAS = 1.50D0 )
-      DOUBLE PRECISION   ZERO, QURTR, HALF, ONE, TWO, HUNDRD
-      PARAMETER          ( ZERO = 0.0D0, QURTR = 0.250D0, HALF = 0.5D0,
-     $                     ONE = 1.0D0, TWO = 2.0D0, HUNDRD = 100.0D0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            IPN4, J4, N0IN, NN, TTYPE
-      DOUBLE PRECISION   DMIN1, DMIN2, DN, DN1, DN2, EPS, S, SAFMIN, T,
-     $                   TAU, TEMP, TOL, TOL2
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLASQ4, DLASQ5, DLASQ6
-*     ..
-*     .. External Function ..
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           DLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Save statement ..
-      SAVE               TTYPE
-      SAVE               DMIN1, DMIN2, DN, DN1, DN2, TAU
-*     ..
-*     .. Data statement ..
-      DATA               TTYPE / 0 /
-      DATA               DMIN1 / ZERO /, DMIN2 / ZERO /, DN / ZERO /,
-     $                   DN1 / ZERO /, DN2 / ZERO /, TAU / ZERO /
-*     ..
-*     .. Executable Statements ..
-*
-      N0IN = N0
-      EPS = DLAMCH( 'Precision' )
-      SAFMIN = DLAMCH( 'Safe minimum' )
-      TOL = EPS*HUNDRD
-      TOL2 = TOL**2
-*
-*     Check for deflation.
-*
-   10 CONTINUE
-*
-      IF( N0.LT.I0 )
-     $   RETURN
-      IF( N0.EQ.I0 )
-     $   GO TO 20
-      NN = 4*N0 + PP
-      IF( N0.EQ.( I0+1 ) )
-     $   GO TO 40
-*
-*     Check whether E(N0-1) is negligible, 1 eigenvalue.
-*
-      IF( Z( NN-5 ).GT.TOL2*( SIGMA+Z( NN-3 ) ) .AND.
-     $    Z( NN-2*PP-4 ).GT.TOL2*Z( NN-7 ) )
-     $   GO TO 30
-*
-   20 CONTINUE
-*
-      Z( 4*N0-3 ) = Z( 4*N0+PP-3 ) + SIGMA
-      N0 = N0 - 1
-      GO TO 10
-*
-*     Check  whether E(N0-2) is negligible, 2 eigenvalues.
-*
-   30 CONTINUE
-*
-      IF( Z( NN-9 ).GT.TOL2*SIGMA .AND.
-     $    Z( NN-2*PP-8 ).GT.TOL2*Z( NN-11 ) )
-     $   GO TO 50
-*
-   40 CONTINUE
-*
-      IF( Z( NN-3 ).GT.Z( NN-7 ) ) THEN
-         S = Z( NN-3 )
-         Z( NN-3 ) = Z( NN-7 )
-         Z( NN-7 ) = S
-      END IF
-      IF( Z( NN-5 ).GT.Z( NN-3 )*TOL2 ) THEN
-         T = HALF*( ( Z( NN-7 )-Z( NN-3 ) )+Z( NN-5 ) )
-         S = Z( NN-3 )*( Z( NN-5 ) / T )
-         IF( S.LE.T ) THEN
-            S = Z( NN-3 )*( Z( NN-5 ) /
-     $          ( T*( ONE+SQRT( ONE+S / T ) ) ) )
-         ELSE
-            S = Z( NN-3 )*( Z( NN-5 ) / ( T+SQRT( T )*SQRT( T+S ) ) )
-         END IF
-         T = Z( NN-7 ) + ( S+Z( NN-5 ) )
-         Z( NN-3 ) = Z( NN-3 )*( Z( NN-7 ) / T )
-         Z( NN-7 ) = T
-      END IF
-      Z( 4*N0-7 ) = Z( NN-7 ) + SIGMA
-      Z( 4*N0-3 ) = Z( NN-3 ) + SIGMA
-      N0 = N0 - 2
-      GO TO 10
-*
-   50 CONTINUE
-*
-*     Reverse the qd-array, if warranted.
-*
-      IF( DMIN.LE.ZERO .OR. N0.LT.N0IN ) THEN
-         IF( CBIAS*Z( 4*I0+PP-3 ).LT.Z( 4*N0+PP-3 ) ) THEN
-            IPN4 = 4*( I0+N0 )
-            DO 60 J4 = 4*I0, 2*( I0+N0-1 ), 4
-               TEMP = Z( J4-3 )
-               Z( J4-3 ) = Z( IPN4-J4-3 )
-               Z( IPN4-J4-3 ) = TEMP
-               TEMP = Z( J4-2 )
-               Z( J4-2 ) = Z( IPN4-J4-2 )
-               Z( IPN4-J4-2 ) = TEMP
-               TEMP = Z( J4-1 )
-               Z( J4-1 ) = Z( IPN4-J4-5 )
-               Z( IPN4-J4-5 ) = TEMP
-               TEMP = Z( J4 )
-               Z( J4 ) = Z( IPN4-J4-4 )
-               Z( IPN4-J4-4 ) = TEMP
-   60       CONTINUE
-            IF( N0-I0.LE.4 ) THEN
-               Z( 4*N0+PP-1 ) = Z( 4*I0+PP-1 )
-               Z( 4*N0-PP ) = Z( 4*I0-PP )
-            END IF
-            DMIN2 = MIN( DMIN2, Z( 4*N0+PP-1 ) )
-            Z( 4*N0+PP-1 ) = MIN( Z( 4*N0+PP-1 ), Z( 4*I0+PP-1 ),
-     $                            Z( 4*I0+PP+3 ) )
-            Z( 4*N0-PP ) = MIN( Z( 4*N0-PP ), Z( 4*I0-PP ),
-     $                          Z( 4*I0-PP+4 ) )
-            QMAX = MAX( QMAX, Z( 4*I0+PP-3 ), Z( 4*I0+PP+1 ) )
-            DMIN = -ZERO
-         END IF
-      END IF
-*
-      IF( DMIN.LT.ZERO .OR. SAFMIN*QMAX.LT.MIN( Z( 4*N0+PP-1 ),
-     $    Z( 4*N0+PP-9 ), DMIN2+Z( 4*N0-PP ) ) ) THEN
-*
-*        Choose a shift.
-*
-         CALL DLASQ4( I0, N0, Z, PP, N0IN, DMIN, DMIN1, DMIN2, DN, DN1,
-     $                DN2, TAU, TTYPE )
-*
-*        Call dqds until DMIN > 0.
-*
-   80    CONTINUE
-*
-         CALL DLASQ5( I0, N0, Z, PP, TAU, DMIN, DMIN1, DMIN2, DN,
-     $                DN1, DN2, IEEE )
-*
-         NDIV = NDIV + ( N0-I0+2 )
-         ITER = ITER + 1
-*
-*        Check status.
-*
-         IF( DMIN.GE.ZERO .AND. DMIN1.GT.ZERO ) THEN
-*
-*           Success.
-*
-            GO TO 100
-*
-         ELSE IF( DMIN.LT.ZERO .AND. DMIN1.GT.ZERO .AND.
-     $            Z( 4*( N0-1 )-PP ).LT.TOL*( SIGMA+DN1 ) .AND.
-     $            ABS( DN ).LT.TOL*SIGMA ) THEN
-*
-*           Convergence hidden by negative DN.
-*
-            Z( 4*( N0-1 )-PP+2 ) = ZERO
-            DMIN = ZERO
-            GO TO 100
-         ELSE IF( DMIN.LT.ZERO ) THEN
-*
-*           TAU too big. Select new TAU and try again.
-*
-            NFAIL = NFAIL + 1
-            IF( TTYPE.LT.-22 ) THEN
-*
-*              Failed twice. Play it safe.
-*
-               TAU = ZERO
-            ELSE IF( DMIN1.GT.ZERO ) THEN
-*
-*              Late failure. Gives excellent shift.
-*
-               TAU = ( TAU+DMIN )*( ONE-TWO*EPS )
-               TTYPE = TTYPE - 11
-            ELSE
-*
-*              Early failure. Divide by 4.
-*
-               TAU = QURTR*TAU
-               TTYPE = TTYPE - 12
-            END IF
-            GO TO 80
-         ELSE IF( DMIN.NE.DMIN ) THEN
-*
-*           NaN.
-*
-            TAU = ZERO
-            GO TO 80
-         ELSE
-*
-*           Possible underflow. Play it safe.
-*
-            GO TO 90
-         END IF
-      END IF
-*
-*     Risk of underflow.
-*
-   90 CONTINUE
-      CALL DLASQ6( I0, N0, Z, PP, DMIN, DMIN1, DMIN2, DN, DN1, DN2 )
-      NDIV = NDIV + ( N0-I0+2 )
-      ITER = ITER + 1
-      TAU = ZERO
-*
-  100 CONTINUE
-      IF( TAU.LT.SIGMA ) THEN
-         DESIG = DESIG + TAU
-         T = SIGMA + DESIG
-         DESIG = DESIG - ( T-SIGMA )
-      ELSE
-         T = SIGMA + TAU
-         DESIG = SIGMA - ( T-TAU ) + DESIG
-      END IF
-      SIGMA = T
-*
-      RETURN
-*
-*     End of DLASQ3
-*
-      END
--- a/libcruft/lapack/dlasq4.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,329 +0,0 @@
-      SUBROUTINE DLASQ4( I0, N0, Z, PP, N0IN, DMIN, DMIN1, DMIN2, DN,
-     $                   DN1, DN2, TAU, TTYPE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            I0, N0, N0IN, PP, TTYPE
-      DOUBLE PRECISION   DMIN, DMIN1, DMIN2, DN, DN1, DN2, TAU
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASQ4 computes an approximation TAU to the smallest eigenvalue 
-*  using values of d from the previous transform.
-*
-*  I0    (input) INTEGER
-*        First index.
-*
-*  N0    (input) INTEGER
-*        Last index.
-*
-*  Z     (input) DOUBLE PRECISION array, dimension ( 4*N )
-*        Z holds the qd array.
-*
-*  PP    (input) INTEGER
-*        PP=0 for ping, PP=1 for pong.
-*
-*  N0IN  (input) INTEGER
-*        The value of N0 at start of EIGTEST.
-*
-*  DMIN  (input) DOUBLE PRECISION
-*        Minimum value of d.
-*
-*  DMIN1 (input) DOUBLE PRECISION
-*        Minimum value of d, excluding D( N0 ).
-*
-*  DMIN2 (input) DOUBLE PRECISION
-*        Minimum value of d, excluding D( N0 ) and D( N0-1 ).
-*
-*  DN    (input) DOUBLE PRECISION
-*        d(N)
-*
-*  DN1   (input) DOUBLE PRECISION
-*        d(N-1)
-*
-*  DN2   (input) DOUBLE PRECISION
-*        d(N-2)
-*
-*  TAU   (output) DOUBLE PRECISION
-*        This is the shift.
-*
-*  TTYPE (output) INTEGER
-*        Shift type.
-*
-*  Further Details
-*  ===============
-*  CNST1 = 9/16
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   CNST1, CNST2, CNST3
-      PARAMETER          ( CNST1 = 0.5630D0, CNST2 = 1.010D0,
-     $                   CNST3 = 1.050D0 )
-      DOUBLE PRECISION   QURTR, THIRD, HALF, ZERO, ONE, TWO, HUNDRD
-      PARAMETER          ( QURTR = 0.250D0, THIRD = 0.3330D0,
-     $                   HALF = 0.50D0, ZERO = 0.0D0, ONE = 1.0D0,
-     $                   TWO = 2.0D0, HUNDRD = 100.0D0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I4, NN, NP
-      DOUBLE PRECISION   A2, B1, B2, G, GAM, GAP1, GAP2, S
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN, SQRT
-*     ..
-*     .. Save statement ..
-      SAVE               G
-*     ..
-*     .. Data statement ..
-      DATA               G / ZERO /
-*     ..
-*     .. Executable Statements ..
-*
-*     A negative DMIN forces the shift to take that absolute value
-*     TTYPE records the type of shift.
-*
-      IF( DMIN.LE.ZERO ) THEN
-         TAU = -DMIN
-         TTYPE = -1
-         RETURN
-      END IF
-*       
-      NN = 4*N0 + PP
-      IF( N0IN.EQ.N0 ) THEN
-*
-*        No eigenvalues deflated.
-*
-         IF( DMIN.EQ.DN .OR. DMIN.EQ.DN1 ) THEN
-*
-            B1 = SQRT( Z( NN-3 ) )*SQRT( Z( NN-5 ) )
-            B2 = SQRT( Z( NN-7 ) )*SQRT( Z( NN-9 ) )
-            A2 = Z( NN-7 ) + Z( NN-5 )
-*
-*           Cases 2 and 3.
-*
-            IF( DMIN.EQ.DN .AND. DMIN1.EQ.DN1 ) THEN
-               GAP2 = DMIN2 - A2 - DMIN2*QURTR
-               IF( GAP2.GT.ZERO .AND. GAP2.GT.B2 ) THEN
-                  GAP1 = A2 - DN - ( B2 / GAP2 )*B2
-               ELSE
-                  GAP1 = A2 - DN - ( B1+B2 )
-               END IF
-               IF( GAP1.GT.ZERO .AND. GAP1.GT.B1 ) THEN
-                  S = MAX( DN-( B1 / GAP1 )*B1, HALF*DMIN )
-                  TTYPE = -2
-               ELSE
-                  S = ZERO
-                  IF( DN.GT.B1 )
-     $               S = DN - B1
-                  IF( A2.GT.( B1+B2 ) )
-     $               S = MIN( S, A2-( B1+B2 ) )
-                  S = MAX( S, THIRD*DMIN )
-                  TTYPE = -3
-               END IF
-            ELSE
-*
-*              Case 4.
-*
-               TTYPE = -4
-               S = QURTR*DMIN
-               IF( DMIN.EQ.DN ) THEN
-                  GAM = DN
-                  A2 = ZERO
-                  IF( Z( NN-5 ) .GT. Z( NN-7 ) )
-     $               RETURN
-                  B2 = Z( NN-5 ) / Z( NN-7 )
-                  NP = NN - 9
-               ELSE
-                  NP = NN - 2*PP
-                  B2 = Z( NP-2 )
-                  GAM = DN1
-                  IF( Z( NP-4 ) .GT. Z( NP-2 ) )
-     $               RETURN
-                  A2 = Z( NP-4 ) / Z( NP-2 )
-                  IF( Z( NN-9 ) .GT. Z( NN-11 ) )
-     $               RETURN
-                  B2 = Z( NN-9 ) / Z( NN-11 )
-                  NP = NN - 13
-               END IF
-*
-*              Approximate contribution to norm squared from I < NN-1.
-*
-               A2 = A2 + B2
-               DO 10 I4 = NP, 4*I0 - 1 + PP, -4
-                  IF( B2.EQ.ZERO )
-     $               GO TO 20
-                  B1 = B2
-                  IF( Z( I4 ) .GT. Z( I4-2 ) )
-     $               RETURN
-                  B2 = B2*( Z( I4 ) / Z( I4-2 ) )
-                  A2 = A2 + B2
-                  IF( HUNDRD*MAX( B2, B1 ).LT.A2 .OR. CNST1.LT.A2 ) 
-     $               GO TO 20
-   10          CONTINUE
-   20          CONTINUE
-               A2 = CNST3*A2
-*
-*              Rayleigh quotient residual bound.
-*
-               IF( A2.LT.CNST1 )
-     $            S = GAM*( ONE-SQRT( A2 ) ) / ( ONE+A2 )
-            END IF
-         ELSE IF( DMIN.EQ.DN2 ) THEN
-*
-*           Case 5.
-*
-            TTYPE = -5
-            S = QURTR*DMIN
-*
-*           Compute contribution to norm squared from I > NN-2.
-*
-            NP = NN - 2*PP
-            B1 = Z( NP-2 )
-            B2 = Z( NP-6 )
-            GAM = DN2
-            IF( Z( NP-8 ).GT.B2 .OR. Z( NP-4 ).GT.B1 )
-     $         RETURN
-            A2 = ( Z( NP-8 ) / B2 )*( ONE+Z( NP-4 ) / B1 )
-*
-*           Approximate contribution to norm squared from I < NN-2.
-*
-            IF( N0-I0.GT.2 ) THEN
-               B2 = Z( NN-13 ) / Z( NN-15 )
-               A2 = A2 + B2
-               DO 30 I4 = NN - 17, 4*I0 - 1 + PP, -4
-                  IF( B2.EQ.ZERO )
-     $               GO TO 40
-                  B1 = B2
-                  IF( Z( I4 ) .GT. Z( I4-2 ) )
-     $               RETURN
-                  B2 = B2*( Z( I4 ) / Z( I4-2 ) )
-                  A2 = A2 + B2
-                  IF( HUNDRD*MAX( B2, B1 ).LT.A2 .OR. CNST1.LT.A2 ) 
-     $               GO TO 40
-   30          CONTINUE
-   40          CONTINUE
-               A2 = CNST3*A2
-            END IF
-*
-            IF( A2.LT.CNST1 )
-     $         S = GAM*( ONE-SQRT( A2 ) ) / ( ONE+A2 )
-         ELSE
-*
-*           Case 6, no information to guide us.
-*
-            IF( TTYPE.EQ.-6 ) THEN
-               G = G + THIRD*( ONE-G )
-            ELSE IF( TTYPE.EQ.-18 ) THEN
-               G = QURTR*THIRD
-            ELSE
-               G = QURTR
-            END IF
-            S = G*DMIN
-            TTYPE = -6
-         END IF
-*
-      ELSE IF( N0IN.EQ.( N0+1 ) ) THEN
-*
-*        One eigenvalue just deflated. Use DMIN1, DN1 for DMIN and DN.
-*
-         IF( DMIN1.EQ.DN1 .AND. DMIN2.EQ.DN2 ) THEN 
-*
-*           Cases 7 and 8.
-*
-            TTYPE = -7
-            S = THIRD*DMIN1
-            IF( Z( NN-5 ).GT.Z( NN-7 ) )
-     $         RETURN
-            B1 = Z( NN-5 ) / Z( NN-7 )
-            B2 = B1
-            IF( B2.EQ.ZERO )
-     $         GO TO 60
-            DO 50 I4 = 4*N0 - 9 + PP, 4*I0 - 1 + PP, -4
-               A2 = B1
-               IF( Z( I4 ).GT.Z( I4-2 ) )
-     $            RETURN
-               B1 = B1*( Z( I4 ) / Z( I4-2 ) )
-               B2 = B2 + B1
-               IF( HUNDRD*MAX( B1, A2 ).LT.B2 ) 
-     $            GO TO 60
-   50       CONTINUE
-   60       CONTINUE
-            B2 = SQRT( CNST3*B2 )
-            A2 = DMIN1 / ( ONE+B2**2 )
-            GAP2 = HALF*DMIN2 - A2
-            IF( GAP2.GT.ZERO .AND. GAP2.GT.B2*A2 ) THEN
-               S = MAX( S, A2*( ONE-CNST2*A2*( B2 / GAP2 )*B2 ) )
-            ELSE 
-               S = MAX( S, A2*( ONE-CNST2*B2 ) )
-               TTYPE = -8
-            END IF
-         ELSE
-*
-*           Case 9.
-*
-            S = QURTR*DMIN1
-            IF( DMIN1.EQ.DN1 )
-     $         S = HALF*DMIN1
-            TTYPE = -9
-         END IF
-*
-      ELSE IF( N0IN.EQ.( N0+2 ) ) THEN
-*
-*        Two eigenvalues deflated. Use DMIN2, DN2 for DMIN and DN.
-*
-*        Cases 10 and 11.
-*
-         IF( DMIN2.EQ.DN2 .AND. TWO*Z( NN-5 ).LT.Z( NN-7 ) ) THEN 
-            TTYPE = -10
-            S = THIRD*DMIN2
-            IF( Z( NN-5 ).GT.Z( NN-7 ) )
-     $         RETURN
-            B1 = Z( NN-5 ) / Z( NN-7 )
-            B2 = B1
-            IF( B2.EQ.ZERO )
-     $         GO TO 80
-            DO 70 I4 = 4*N0 - 9 + PP, 4*I0 - 1 + PP, -4
-               IF( Z( I4 ).GT.Z( I4-2 ) )
-     $            RETURN
-               B1 = B1*( Z( I4 ) / Z( I4-2 ) )
-               B2 = B2 + B1
-               IF( HUNDRD*B1.LT.B2 )
-     $            GO TO 80
-   70       CONTINUE
-   80       CONTINUE
-            B2 = SQRT( CNST3*B2 )
-            A2 = DMIN2 / ( ONE+B2**2 )
-            GAP2 = Z( NN-7 ) + Z( NN-9 ) -
-     $             SQRT( Z( NN-11 ) )*SQRT( Z( NN-9 ) ) - A2
-            IF( GAP2.GT.ZERO .AND. GAP2.GT.B2*A2 ) THEN
-               S = MAX( S, A2*( ONE-CNST2*A2*( B2 / GAP2 )*B2 ) )
-            ELSE 
-               S = MAX( S, A2*( ONE-CNST2*B2 ) )
-            END IF
-         ELSE
-            S = QURTR*DMIN2
-            TTYPE = -11
-         END IF
-      ELSE IF( N0IN.GT.( N0+2 ) ) THEN
-*
-*        Case 12, more than two eigenvalues deflated. No information.
-*
-         S = ZERO 
-         TTYPE = -12
-      END IF
-*
-      TAU = S
-      RETURN
-*
-*     End of DLASQ4
-*
-      END
--- a/libcruft/lapack/dlasq5.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,195 +0,0 @@
-      SUBROUTINE DLASQ5( I0, N0, Z, PP, TAU, DMIN, DMIN1, DMIN2, DN,
-     $                   DNM1, DNM2, IEEE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            IEEE
-      INTEGER            I0, N0, PP
-      DOUBLE PRECISION   DMIN, DMIN1, DMIN2, DN, DNM1, DNM2, TAU
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASQ5 computes one dqds transform in ping-pong form, one
-*  version for IEEE machines another for non IEEE machines.
-*
-*  Arguments
-*  =========
-*
-*  I0    (input) INTEGER
-*        First index.
-*
-*  N0    (input) INTEGER
-*        Last index.
-*
-*  Z     (input) DOUBLE PRECISION array, dimension ( 4*N )
-*        Z holds the qd array. EMIN is stored in Z(4*N0) to avoid
-*        an extra argument.
-*
-*  PP    (input) INTEGER
-*        PP=0 for ping, PP=1 for pong.
-*
-*  TAU   (input) DOUBLE PRECISION
-*        This is the shift.
-*
-*  DMIN  (output) DOUBLE PRECISION
-*        Minimum value of d.
-*
-*  DMIN1 (output) DOUBLE PRECISION
-*        Minimum value of d, excluding D( N0 ).
-*
-*  DMIN2 (output) DOUBLE PRECISION
-*        Minimum value of d, excluding D( N0 ) and D( N0-1 ).
-*
-*  DN    (output) DOUBLE PRECISION
-*        d(N0), the last value of d.
-*
-*  DNM1  (output) DOUBLE PRECISION
-*        d(N0-1).
-*
-*  DNM2  (output) DOUBLE PRECISION
-*        d(N0-2).
-*
-*  IEEE  (input) LOGICAL
-*        Flag for IEEE or non IEEE arithmetic.
-*
-*  =====================================================================
-*
-*     .. Parameter ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            J4, J4P2
-      DOUBLE PRECISION   D, EMIN, TEMP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-      IF( ( N0-I0-1 ).LE.0 )
-     $   RETURN
-*
-      J4 = 4*I0 + PP - 3
-      EMIN = Z( J4+4 )
-      D = Z( J4 ) - TAU
-      DMIN = D
-      DMIN1 = -Z( J4 )
-*
-      IF( IEEE ) THEN
-*
-*        Code for IEEE arithmetic.
-*
-         IF( PP.EQ.0 ) THEN
-            DO 10 J4 = 4*I0, 4*( N0-3 ), 4
-               Z( J4-2 ) = D + Z( J4-1 )
-               TEMP = Z( J4+1 ) / Z( J4-2 )
-               D = D*TEMP - TAU
-               DMIN = MIN( DMIN, D )
-               Z( J4 ) = Z( J4-1 )*TEMP
-               EMIN = MIN( Z( J4 ), EMIN )
-   10       CONTINUE
-         ELSE
-            DO 20 J4 = 4*I0, 4*( N0-3 ), 4
-               Z( J4-3 ) = D + Z( J4 )
-               TEMP = Z( J4+2 ) / Z( J4-3 )
-               D = D*TEMP - TAU
-               DMIN = MIN( DMIN, D )
-               Z( J4-1 ) = Z( J4 )*TEMP
-               EMIN = MIN( Z( J4-1 ), EMIN )
-   20       CONTINUE
-         END IF
-*
-*        Unroll last two steps.
-*
-         DNM2 = D
-         DMIN2 = DMIN
-         J4 = 4*( N0-2 ) - PP
-         J4P2 = J4 + 2*PP - 1
-         Z( J4-2 ) = DNM2 + Z( J4P2 )
-         Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
-         DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
-         DMIN = MIN( DMIN, DNM1 )
-*
-         DMIN1 = DMIN
-         J4 = J4 + 4
-         J4P2 = J4 + 2*PP - 1
-         Z( J4-2 ) = DNM1 + Z( J4P2 )
-         Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
-         DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
-         DMIN = MIN( DMIN, DN )
-*
-      ELSE
-*
-*        Code for non IEEE arithmetic.
-*
-         IF( PP.EQ.0 ) THEN
-            DO 30 J4 = 4*I0, 4*( N0-3 ), 4
-               Z( J4-2 ) = D + Z( J4-1 )
-               IF( D.LT.ZERO ) THEN
-                  RETURN
-               ELSE
-                  Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) )
-                  D = Z( J4+1 )*( D / Z( J4-2 ) ) - TAU
-               END IF
-               DMIN = MIN( DMIN, D )
-               EMIN = MIN( EMIN, Z( J4 ) )
-   30       CONTINUE
-         ELSE
-            DO 40 J4 = 4*I0, 4*( N0-3 ), 4
-               Z( J4-3 ) = D + Z( J4 )
-               IF( D.LT.ZERO ) THEN
-                  RETURN
-               ELSE
-                  Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) )
-                  D = Z( J4+2 )*( D / Z( J4-3 ) ) - TAU
-               END IF
-               DMIN = MIN( DMIN, D )
-               EMIN = MIN( EMIN, Z( J4-1 ) )
-   40       CONTINUE
-         END IF
-*
-*        Unroll last two steps.
-*
-         DNM2 = D
-         DMIN2 = DMIN
-         J4 = 4*( N0-2 ) - PP
-         J4P2 = J4 + 2*PP - 1
-         Z( J4-2 ) = DNM2 + Z( J4P2 )
-         IF( DNM2.LT.ZERO ) THEN
-            RETURN
-         ELSE
-            Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
-            DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
-         END IF
-         DMIN = MIN( DMIN, DNM1 )
-*
-         DMIN1 = DMIN
-         J4 = J4 + 4
-         J4P2 = J4 + 2*PP - 1
-         Z( J4-2 ) = DNM1 + Z( J4P2 )
-         IF( DNM1.LT.ZERO ) THEN
-            RETURN
-         ELSE
-            Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
-            DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
-         END IF
-         DMIN = MIN( DMIN, DN )
-*
-      END IF
-*
-      Z( J4+2 ) = DN
-      Z( 4*N0-PP ) = EMIN
-      RETURN
-*
-*     End of DLASQ5
-*
-      END
--- a/libcruft/lapack/dlasq6.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,175 +0,0 @@
-      SUBROUTINE DLASQ6( I0, N0, Z, PP, DMIN, DMIN1, DMIN2, DN,
-     $                   DNM1, DNM2 )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            I0, N0, PP
-      DOUBLE PRECISION   DMIN, DMIN1, DMIN2, DN, DNM1, DNM2
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASQ6 computes one dqd (shift equal to zero) transform in
-*  ping-pong form, with protection against underflow and overflow.
-*
-*  Arguments
-*  =========
-*
-*  I0    (input) INTEGER
-*        First index.
-*
-*  N0    (input) INTEGER
-*        Last index.
-*
-*  Z     (input) DOUBLE PRECISION array, dimension ( 4*N )
-*        Z holds the qd array. EMIN is stored in Z(4*N0) to avoid
-*        an extra argument.
-*
-*  PP    (input) INTEGER
-*        PP=0 for ping, PP=1 for pong.
-*
-*  DMIN  (output) DOUBLE PRECISION
-*        Minimum value of d.
-*
-*  DMIN1 (output) DOUBLE PRECISION
-*        Minimum value of d, excluding D( N0 ).
-*
-*  DMIN2 (output) DOUBLE PRECISION
-*        Minimum value of d, excluding D( N0 ) and D( N0-1 ).
-*
-*  DN    (output) DOUBLE PRECISION
-*        d(N0), the last value of d.
-*
-*  DNM1  (output) DOUBLE PRECISION
-*        d(N0-1).
-*
-*  DNM2  (output) DOUBLE PRECISION
-*        d(N0-2).
-*
-*  =====================================================================
-*
-*     .. Parameter ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            J4, J4P2
-      DOUBLE PRECISION   D, EMIN, SAFMIN, TEMP
-*     ..
-*     .. External Function ..
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           DLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-      IF( ( N0-I0-1 ).LE.0 )
-     $   RETURN
-*
-      SAFMIN = DLAMCH( 'Safe minimum' )
-      J4 = 4*I0 + PP - 3
-      EMIN = Z( J4+4 ) 
-      D = Z( J4 )
-      DMIN = D
-*
-      IF( PP.EQ.0 ) THEN
-         DO 10 J4 = 4*I0, 4*( N0-3 ), 4
-            Z( J4-2 ) = D + Z( J4-1 ) 
-            IF( Z( J4-2 ).EQ.ZERO ) THEN
-               Z( J4 ) = ZERO
-               D = Z( J4+1 )
-               DMIN = D
-               EMIN = ZERO
-            ELSE IF( SAFMIN*Z( J4+1 ).LT.Z( J4-2 ) .AND.
-     $               SAFMIN*Z( J4-2 ).LT.Z( J4+1 ) ) THEN
-               TEMP = Z( J4+1 ) / Z( J4-2 )
-               Z( J4 ) = Z( J4-1 )*TEMP
-               D = D*TEMP
-            ELSE 
-               Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) )
-               D = Z( J4+1 )*( D / Z( J4-2 ) )
-            END IF
-            DMIN = MIN( DMIN, D )
-            EMIN = MIN( EMIN, Z( J4 ) )
-   10    CONTINUE
-      ELSE
-         DO 20 J4 = 4*I0, 4*( N0-3 ), 4
-            Z( J4-3 ) = D + Z( J4 ) 
-            IF( Z( J4-3 ).EQ.ZERO ) THEN
-               Z( J4-1 ) = ZERO
-               D = Z( J4+2 )
-               DMIN = D
-               EMIN = ZERO
-            ELSE IF( SAFMIN*Z( J4+2 ).LT.Z( J4-3 ) .AND.
-     $               SAFMIN*Z( J4-3 ).LT.Z( J4+2 ) ) THEN
-               TEMP = Z( J4+2 ) / Z( J4-3 )
-               Z( J4-1 ) = Z( J4 )*TEMP
-               D = D*TEMP
-            ELSE 
-               Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) )
-               D = Z( J4+2 )*( D / Z( J4-3 ) )
-            END IF
-            DMIN = MIN( DMIN, D )
-            EMIN = MIN( EMIN, Z( J4-1 ) )
-   20    CONTINUE
-      END IF
-*
-*     Unroll last two steps. 
-*
-      DNM2 = D
-      DMIN2 = DMIN
-      J4 = 4*( N0-2 ) - PP
-      J4P2 = J4 + 2*PP - 1
-      Z( J4-2 ) = DNM2 + Z( J4P2 )
-      IF( Z( J4-2 ).EQ.ZERO ) THEN
-         Z( J4 ) = ZERO
-         DNM1 = Z( J4P2+2 )
-         DMIN = DNM1
-         EMIN = ZERO
-      ELSE IF( SAFMIN*Z( J4P2+2 ).LT.Z( J4-2 ) .AND.
-     $         SAFMIN*Z( J4-2 ).LT.Z( J4P2+2 ) ) THEN
-         TEMP = Z( J4P2+2 ) / Z( J4-2 )
-         Z( J4 ) = Z( J4P2 )*TEMP
-         DNM1 = DNM2*TEMP
-      ELSE
-         Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
-         DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) )
-      END IF
-      DMIN = MIN( DMIN, DNM1 )
-*
-      DMIN1 = DMIN
-      J4 = J4 + 4
-      J4P2 = J4 + 2*PP - 1
-      Z( J4-2 ) = DNM1 + Z( J4P2 )
-      IF( Z( J4-2 ).EQ.ZERO ) THEN
-         Z( J4 ) = ZERO
-         DN = Z( J4P2+2 )
-         DMIN = DN
-         EMIN = ZERO
-      ELSE IF( SAFMIN*Z( J4P2+2 ).LT.Z( J4-2 ) .AND.
-     $         SAFMIN*Z( J4-2 ).LT.Z( J4P2+2 ) ) THEN
-         TEMP = Z( J4P2+2 ) / Z( J4-2 )
-         Z( J4 ) = Z( J4P2 )*TEMP
-         DN = DNM1*TEMP
-      ELSE
-         Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
-         DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) )
-      END IF
-      DMIN = MIN( DMIN, DN )
-*
-      Z( J4+2 ) = DN
-      Z( 4*N0-PP ) = EMIN
-      RETURN
-*
-*     End of DLASQ6
-*
-      END
--- a/libcruft/lapack/dlasr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,361 +0,0 @@
-      SUBROUTINE DLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, PIVOT, SIDE
-      INTEGER            LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), C( * ), S( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASR applies a sequence of plane rotations to a real matrix A,
-*  from either the left or the right.
-*  
-*  When SIDE = 'L', the transformation takes the form
-*  
-*     A := P*A
-*  
-*  and when SIDE = 'R', the transformation takes the form
-*  
-*     A := A*P**T
-*  
-*  where P is an orthogonal matrix consisting of a sequence of z plane
-*  rotations, with z = M when SIDE = 'L' and z = N when SIDE = 'R',
-*  and P**T is the transpose of P.
-*  
-*  When DIRECT = 'F' (Forward sequence), then
-*  
-*     P = P(z-1) * ... * P(2) * P(1)
-*  
-*  and when DIRECT = 'B' (Backward sequence), then
-*  
-*     P = P(1) * P(2) * ... * P(z-1)
-*  
-*  where P(k) is a plane rotation matrix defined by the 2-by-2 rotation
-*  
-*     R(k) = (  c(k)  s(k) )
-*          = ( -s(k)  c(k) ).
-*  
-*  When PIVOT = 'V' (Variable pivot), the rotation is performed
-*  for the plane (k,k+1), i.e., P(k) has the form
-*  
-*     P(k) = (  1                                            )
-*            (       ...                                     )
-*            (              1                                )
-*            (                   c(k)  s(k)                  )
-*            (                  -s(k)  c(k)                  )
-*            (                                1              )
-*            (                                     ...       )
-*            (                                            1  )
-*  
-*  where R(k) appears as a rank-2 modification to the identity matrix in
-*  rows and columns k and k+1.
-*  
-*  When PIVOT = 'T' (Top pivot), the rotation is performed for the
-*  plane (1,k+1), so P(k) has the form
-*  
-*     P(k) = (  c(k)                    s(k)                 )
-*            (         1                                     )
-*            (              ...                              )
-*            (                     1                         )
-*            ( -s(k)                    c(k)                 )
-*            (                                 1             )
-*            (                                      ...      )
-*            (                                             1 )
-*  
-*  where R(k) appears in rows and columns 1 and k+1.
-*  
-*  Similarly, when PIVOT = 'B' (Bottom pivot), the rotation is
-*  performed for the plane (k,z), giving P(k) the form
-*  
-*     P(k) = ( 1                                             )
-*            (      ...                                      )
-*            (             1                                 )
-*            (                  c(k)                    s(k) )
-*            (                         1                     )
-*            (                              ...              )
-*            (                                     1         )
-*            (                 -s(k)                    c(k) )
-*  
-*  where R(k) appears in rows and columns k and z.  The rotations are
-*  performed without ever forming P(k) explicitly.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          Specifies whether the plane rotation matrix P is applied to
-*          A on the left or the right.
-*          = 'L':  Left, compute A := P*A
-*          = 'R':  Right, compute A:= A*P**T
-*
-*  PIVOT   (input) CHARACTER*1
-*          Specifies the plane for which P(k) is a plane rotation
-*          matrix.
-*          = 'V':  Variable pivot, the plane (k,k+1)
-*          = 'T':  Top pivot, the plane (1,k+1)
-*          = 'B':  Bottom pivot, the plane (k,z)
-*
-*  DIRECT  (input) CHARACTER*1
-*          Specifies whether P is a forward or backward sequence of
-*          plane rotations.
-*          = 'F':  Forward, P = P(z-1)*...*P(2)*P(1)
-*          = 'B':  Backward, P = P(1)*P(2)*...*P(z-1)
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  If m <= 1, an immediate
-*          return is effected.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  If n <= 1, an
-*          immediate return is effected.
-*
-*  C       (input) DOUBLE PRECISION array, dimension
-*                  (M-1) if SIDE = 'L'
-*                  (N-1) if SIDE = 'R'
-*          The cosines c(k) of the plane rotations.
-*
-*  S       (input) DOUBLE PRECISION array, dimension
-*                  (M-1) if SIDE = 'L'
-*                  (N-1) if SIDE = 'R'
-*          The sines s(k) of the plane rotations.  The 2-by-2 plane
-*          rotation part of the matrix P(k), R(k), has the form
-*          R(k) = (  c(k)  s(k) )
-*                 ( -s(k)  c(k) ).
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          The M-by-N matrix A.  On exit, A is overwritten by P*A if
-*          SIDE = 'R' or by A*P**T if SIDE = 'L'.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, INFO, J
-      DOUBLE PRECISION   CTEMP, STEMP, TEMP
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( .NOT.( LSAME( SIDE, 'L' ) .OR. LSAME( SIDE, 'R' ) ) ) THEN
-         INFO = 1
-      ELSE IF( .NOT.( LSAME( PIVOT, 'V' ) .OR. LSAME( PIVOT,
-     $         'T' ) .OR. LSAME( PIVOT, 'B' ) ) ) THEN
-         INFO = 2
-      ELSE IF( .NOT.( LSAME( DIRECT, 'F' ) .OR. LSAME( DIRECT, 'B' ) ) )
-     $          THEN
-         INFO = 3
-      ELSE IF( M.LT.0 ) THEN
-         INFO = 4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = 5
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = 9
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLASR ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( ( M.EQ.0 ) .OR. ( N.EQ.0 ) )
-     $   RETURN
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  P * A
-*
-         IF( LSAME( PIVOT, 'V' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 20 J = 1, M - 1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 10 I = 1, N
-                        TEMP = A( J+1, I )
-                        A( J+1, I ) = CTEMP*TEMP - STEMP*A( J, I )
-                        A( J, I ) = STEMP*TEMP + CTEMP*A( J, I )
-   10                CONTINUE
-                  END IF
-   20          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 40 J = M - 1, 1, -1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 30 I = 1, N
-                        TEMP = A( J+1, I )
-                        A( J+1, I ) = CTEMP*TEMP - STEMP*A( J, I )
-                        A( J, I ) = STEMP*TEMP + CTEMP*A( J, I )
-   30                CONTINUE
-                  END IF
-   40          CONTINUE
-            END IF
-         ELSE IF( LSAME( PIVOT, 'T' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 60 J = 2, M
-                  CTEMP = C( J-1 )
-                  STEMP = S( J-1 )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 50 I = 1, N
-                        TEMP = A( J, I )
-                        A( J, I ) = CTEMP*TEMP - STEMP*A( 1, I )
-                        A( 1, I ) = STEMP*TEMP + CTEMP*A( 1, I )
-   50                CONTINUE
-                  END IF
-   60          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 80 J = M, 2, -1
-                  CTEMP = C( J-1 )
-                  STEMP = S( J-1 )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 70 I = 1, N
-                        TEMP = A( J, I )
-                        A( J, I ) = CTEMP*TEMP - STEMP*A( 1, I )
-                        A( 1, I ) = STEMP*TEMP + CTEMP*A( 1, I )
-   70                CONTINUE
-                  END IF
-   80          CONTINUE
-            END IF
-         ELSE IF( LSAME( PIVOT, 'B' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 100 J = 1, M - 1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 90 I = 1, N
-                        TEMP = A( J, I )
-                        A( J, I ) = STEMP*A( M, I ) + CTEMP*TEMP
-                        A( M, I ) = CTEMP*A( M, I ) - STEMP*TEMP
-   90                CONTINUE
-                  END IF
-  100          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 120 J = M - 1, 1, -1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 110 I = 1, N
-                        TEMP = A( J, I )
-                        A( J, I ) = STEMP*A( M, I ) + CTEMP*TEMP
-                        A( M, I ) = CTEMP*A( M, I ) - STEMP*TEMP
-  110                CONTINUE
-                  END IF
-  120          CONTINUE
-            END IF
-         END IF
-      ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*        Form A * P'
-*
-         IF( LSAME( PIVOT, 'V' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 140 J = 1, N - 1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 130 I = 1, M
-                        TEMP = A( I, J+1 )
-                        A( I, J+1 ) = CTEMP*TEMP - STEMP*A( I, J )
-                        A( I, J ) = STEMP*TEMP + CTEMP*A( I, J )
-  130                CONTINUE
-                  END IF
-  140          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 160 J = N - 1, 1, -1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 150 I = 1, M
-                        TEMP = A( I, J+1 )
-                        A( I, J+1 ) = CTEMP*TEMP - STEMP*A( I, J )
-                        A( I, J ) = STEMP*TEMP + CTEMP*A( I, J )
-  150                CONTINUE
-                  END IF
-  160          CONTINUE
-            END IF
-         ELSE IF( LSAME( PIVOT, 'T' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 180 J = 2, N
-                  CTEMP = C( J-1 )
-                  STEMP = S( J-1 )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 170 I = 1, M
-                        TEMP = A( I, J )
-                        A( I, J ) = CTEMP*TEMP - STEMP*A( I, 1 )
-                        A( I, 1 ) = STEMP*TEMP + CTEMP*A( I, 1 )
-  170                CONTINUE
-                  END IF
-  180          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 200 J = N, 2, -1
-                  CTEMP = C( J-1 )
-                  STEMP = S( J-1 )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 190 I = 1, M
-                        TEMP = A( I, J )
-                        A( I, J ) = CTEMP*TEMP - STEMP*A( I, 1 )
-                        A( I, 1 ) = STEMP*TEMP + CTEMP*A( I, 1 )
-  190                CONTINUE
-                  END IF
-  200          CONTINUE
-            END IF
-         ELSE IF( LSAME( PIVOT, 'B' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 220 J = 1, N - 1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 210 I = 1, M
-                        TEMP = A( I, J )
-                        A( I, J ) = STEMP*A( I, N ) + CTEMP*TEMP
-                        A( I, N ) = CTEMP*A( I, N ) - STEMP*TEMP
-  210                CONTINUE
-                  END IF
-  220          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 240 J = N - 1, 1, -1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 230 I = 1, M
-                        TEMP = A( I, J )
-                        A( I, J ) = STEMP*A( I, N ) + CTEMP*TEMP
-                        A( I, N ) = CTEMP*A( I, N ) - STEMP*TEMP
-  230                CONTINUE
-                  END IF
-  240          CONTINUE
-            END IF
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DLASR
-*
-      END
--- a/libcruft/lapack/dlasrt.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,243 +0,0 @@
-      SUBROUTINE DLASRT( ID, N, D, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          ID
-      INTEGER            INFO, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  Sort the numbers in D in increasing order (if ID = 'I') or
-*  in decreasing order (if ID = 'D' ).
-*
-*  Use Quick Sort, reverting to Insertion sort on arrays of
-*  size <= 20. Dimension of STACK limits N to about 2**32.
-*
-*  Arguments
-*  =========
-*
-*  ID      (input) CHARACTER*1
-*          = 'I': sort D in increasing order;
-*          = 'D': sort D in decreasing order.
-*
-*  N       (input) INTEGER
-*          The length of the array D.
-*
-*  D       (input/output) DOUBLE PRECISION array, dimension (N)
-*          On entry, the array to be sorted.
-*          On exit, D has been sorted into increasing order
-*          (D(1) <= ... <= D(N) ) or into decreasing order
-*          (D(1) >= ... >= D(N) ), depending on ID.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            SELECT
-      PARAMETER          ( SELECT = 20 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            DIR, ENDD, I, J, START, STKPNT
-      DOUBLE PRECISION   D1, D2, D3, DMNMX, TMP
-*     ..
-*     .. Local Arrays ..
-      INTEGER            STACK( 2, 32 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input paramters.
-*
-      INFO = 0
-      DIR = -1
-      IF( LSAME( ID, 'D' ) ) THEN
-         DIR = 0
-      ELSE IF( LSAME( ID, 'I' ) ) THEN
-         DIR = 1
-      END IF
-      IF( DIR.EQ.-1 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLASRT', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 )
-     $   RETURN
-*
-      STKPNT = 1
-      STACK( 1, 1 ) = 1
-      STACK( 2, 1 ) = N
-   10 CONTINUE
-      START = STACK( 1, STKPNT )
-      ENDD = STACK( 2, STKPNT )
-      STKPNT = STKPNT - 1
-      IF( ENDD-START.LE.SELECT .AND. ENDD-START.GT.0 ) THEN
-*
-*        Do Insertion sort on D( START:ENDD )
-*
-         IF( DIR.EQ.0 ) THEN
-*
-*           Sort into decreasing order
-*
-            DO 30 I = START + 1, ENDD
-               DO 20 J = I, START + 1, -1
-                  IF( D( J ).GT.D( J-1 ) ) THEN
-                     DMNMX = D( J )
-                     D( J ) = D( J-1 )
-                     D( J-1 ) = DMNMX
-                  ELSE
-                     GO TO 30
-                  END IF
-   20          CONTINUE
-   30       CONTINUE
-*
-         ELSE
-*
-*           Sort into increasing order
-*
-            DO 50 I = START + 1, ENDD
-               DO 40 J = I, START + 1, -1
-                  IF( D( J ).LT.D( J-1 ) ) THEN
-                     DMNMX = D( J )
-                     D( J ) = D( J-1 )
-                     D( J-1 ) = DMNMX
-                  ELSE
-                     GO TO 50
-                  END IF
-   40          CONTINUE
-   50       CONTINUE
-*
-         END IF
-*
-      ELSE IF( ENDD-START.GT.SELECT ) THEN
-*
-*        Partition D( START:ENDD ) and stack parts, largest one first
-*
-*        Choose partition entry as median of 3
-*
-         D1 = D( START )
-         D2 = D( ENDD )
-         I = ( START+ENDD ) / 2
-         D3 = D( I )
-         IF( D1.LT.D2 ) THEN
-            IF( D3.LT.D1 ) THEN
-               DMNMX = D1
-            ELSE IF( D3.LT.D2 ) THEN
-               DMNMX = D3
-            ELSE
-               DMNMX = D2
-            END IF
-         ELSE
-            IF( D3.LT.D2 ) THEN
-               DMNMX = D2
-            ELSE IF( D3.LT.D1 ) THEN
-               DMNMX = D3
-            ELSE
-               DMNMX = D1
-            END IF
-         END IF
-*
-         IF( DIR.EQ.0 ) THEN
-*
-*           Sort into decreasing order
-*
-            I = START - 1
-            J = ENDD + 1
-   60       CONTINUE
-   70       CONTINUE
-            J = J - 1
-            IF( D( J ).LT.DMNMX )
-     $         GO TO 70
-   80       CONTINUE
-            I = I + 1
-            IF( D( I ).GT.DMNMX )
-     $         GO TO 80
-            IF( I.LT.J ) THEN
-               TMP = D( I )
-               D( I ) = D( J )
-               D( J ) = TMP
-               GO TO 60
-            END IF
-            IF( J-START.GT.ENDD-J-1 ) THEN
-               STKPNT = STKPNT + 1
-               STACK( 1, STKPNT ) = START
-               STACK( 2, STKPNT ) = J
-               STKPNT = STKPNT + 1
-               STACK( 1, STKPNT ) = J + 1
-               STACK( 2, STKPNT ) = ENDD
-            ELSE
-               STKPNT = STKPNT + 1
-               STACK( 1, STKPNT ) = J + 1
-               STACK( 2, STKPNT ) = ENDD
-               STKPNT = STKPNT + 1
-               STACK( 1, STKPNT ) = START
-               STACK( 2, STKPNT ) = J
-            END IF
-         ELSE
-*
-*           Sort into increasing order
-*
-            I = START - 1
-            J = ENDD + 1
-   90       CONTINUE
-  100       CONTINUE
-            J = J - 1
-            IF( D( J ).GT.DMNMX )
-     $         GO TO 100
-  110       CONTINUE
-            I = I + 1
-            IF( D( I ).LT.DMNMX )
-     $         GO TO 110
-            IF( I.LT.J ) THEN
-               TMP = D( I )
-               D( I ) = D( J )
-               D( J ) = TMP
-               GO TO 90
-            END IF
-            IF( J-START.GT.ENDD-J-1 ) THEN
-               STKPNT = STKPNT + 1
-               STACK( 1, STKPNT ) = START
-               STACK( 2, STKPNT ) = J
-               STKPNT = STKPNT + 1
-               STACK( 1, STKPNT ) = J + 1
-               STACK( 2, STKPNT ) = ENDD
-            ELSE
-               STKPNT = STKPNT + 1
-               STACK( 1, STKPNT ) = J + 1
-               STACK( 2, STKPNT ) = ENDD
-               STKPNT = STKPNT + 1
-               STACK( 1, STKPNT ) = START
-               STACK( 2, STKPNT ) = J
-            END IF
-         END IF
-      END IF
-      IF( STKPNT.GT.0 )
-     $   GO TO 10
-      RETURN
-*
-*     End of DLASRT
-*
-      END
--- a/libcruft/lapack/dlassq.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-      SUBROUTINE DLASSQ( N, X, INCX, SCALE, SUMSQ )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-      DOUBLE PRECISION   SCALE, SUMSQ
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASSQ  returns the values  scl  and  smsq  such that
-*
-*     ( scl**2 )*smsq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq,
-*
-*  where  x( i ) = X( 1 + ( i - 1 )*INCX ). The value of  sumsq  is
-*  assumed to be non-negative and  scl  returns the value
-*
-*     scl = max( scale, abs( x( i ) ) ).
-*
-*  scale and sumsq must be supplied in SCALE and SUMSQ and
-*  scl and smsq are overwritten on SCALE and SUMSQ respectively.
-*
-*  The routine makes only one pass through the vector x.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of elements to be used from the vector X.
-*
-*  X       (input) DOUBLE PRECISION array, dimension (N)
-*          The vector for which a scaled sum of squares is computed.
-*             x( i )  = X( 1 + ( i - 1 )*INCX ), 1 <= i <= n.
-*
-*  INCX    (input) INTEGER
-*          The increment between successive values of the vector X.
-*          INCX > 0.
-*
-*  SCALE   (input/output) DOUBLE PRECISION
-*          On entry, the value  scale  in the equation above.
-*          On exit, SCALE is overwritten with  scl , the scaling factor
-*          for the sum of squares.
-*
-*  SUMSQ   (input/output) DOUBLE PRECISION
-*          On entry, the value  sumsq  in the equation above.
-*          On exit, SUMSQ is overwritten with  smsq , the basic sum of
-*          squares from which  scl  has been factored out.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            IX
-      DOUBLE PRECISION   ABSXI
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.GT.0 ) THEN
-         DO 10 IX = 1, 1 + ( N-1 )*INCX, INCX
-            IF( X( IX ).NE.ZERO ) THEN
-               ABSXI = ABS( X( IX ) )
-               IF( SCALE.LT.ABSXI ) THEN
-                  SUMSQ = 1 + SUMSQ*( SCALE / ABSXI )**2
-                  SCALE = ABSXI
-               ELSE
-                  SUMSQ = SUMSQ + ( ABSXI / SCALE )**2
-               END IF
-            END IF
-   10    CONTINUE
-      END IF
-      RETURN
-*
-*     End of DLASSQ
-*
-      END
--- a/libcruft/lapack/dlasv2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,249 +0,0 @@
-      SUBROUTINE DLASV2( F, G, H, SSMIN, SSMAX, SNR, CSR, SNL, CSL )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   CSL, CSR, F, G, H, SNL, SNR, SSMAX, SSMIN
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASV2 computes the singular value decomposition of a 2-by-2
-*  triangular matrix
-*     [  F   G  ]
-*     [  0   H  ].
-*  On return, abs(SSMAX) is the larger singular value, abs(SSMIN) is the
-*  smaller singular value, and (CSL,SNL) and (CSR,SNR) are the left and
-*  right singular vectors for abs(SSMAX), giving the decomposition
-*
-*     [ CSL  SNL ] [  F   G  ] [ CSR -SNR ]  =  [ SSMAX   0   ]
-*     [-SNL  CSL ] [  0   H  ] [ SNR  CSR ]     [  0    SSMIN ].
-*
-*  Arguments
-*  =========
-*
-*  F       (input) DOUBLE PRECISION
-*          The (1,1) element of the 2-by-2 matrix.
-*
-*  G       (input) DOUBLE PRECISION
-*          The (1,2) element of the 2-by-2 matrix.
-*
-*  H       (input) DOUBLE PRECISION
-*          The (2,2) element of the 2-by-2 matrix.
-*
-*  SSMIN   (output) DOUBLE PRECISION
-*          abs(SSMIN) is the smaller singular value.
-*
-*  SSMAX   (output) DOUBLE PRECISION
-*          abs(SSMAX) is the larger singular value.
-*
-*  SNL     (output) DOUBLE PRECISION
-*  CSL     (output) DOUBLE PRECISION
-*          The vector (CSL, SNL) is a unit left singular vector for the
-*          singular value abs(SSMAX).
-*
-*  SNR     (output) DOUBLE PRECISION
-*  CSR     (output) DOUBLE PRECISION
-*          The vector (CSR, SNR) is a unit right singular vector for the
-*          singular value abs(SSMAX).
-*
-*  Further Details
-*  ===============
-*
-*  Any input parameter may be aliased with any output parameter.
-*
-*  Barring over/underflow and assuming a guard digit in subtraction, all
-*  output quantities are correct to within a few units in the last
-*  place (ulps).
-*
-*  In IEEE arithmetic, the code works correctly if one matrix element is
-*  infinite.
-*
-*  Overflow will not occur unless the largest singular value itself
-*  overflows or is within a few ulps of overflow. (On machines with
-*  partial overflow, like the Cray, overflow may occur if the largest
-*  singular value is within a factor of 2 of overflow.)
-*
-*  Underflow is harmless if underflow is gradual. Otherwise, results
-*  may correspond to a matrix modified by perturbations of size near
-*  the underflow threshold.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D0 )
-      DOUBLE PRECISION   HALF
-      PARAMETER          ( HALF = 0.5D0 )
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D0 )
-      DOUBLE PRECISION   TWO
-      PARAMETER          ( TWO = 2.0D0 )
-      DOUBLE PRECISION   FOUR
-      PARAMETER          ( FOUR = 4.0D0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            GASMAL, SWAP
-      INTEGER            PMAX
-      DOUBLE PRECISION   A, CLT, CRT, D, FA, FT, GA, GT, HA, HT, L, M,
-     $                   MM, R, S, SLT, SRT, T, TEMP, TSIGN, TT
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, SIGN, SQRT
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           DLAMCH
-*     ..
-*     .. Executable Statements ..
-*
-      FT = F
-      FA = ABS( FT )
-      HT = H
-      HA = ABS( H )
-*
-*     PMAX points to the maximum absolute element of matrix
-*       PMAX = 1 if F largest in absolute values
-*       PMAX = 2 if G largest in absolute values
-*       PMAX = 3 if H largest in absolute values
-*
-      PMAX = 1
-      SWAP = ( HA.GT.FA )
-      IF( SWAP ) THEN
-         PMAX = 3
-         TEMP = FT
-         FT = HT
-         HT = TEMP
-         TEMP = FA
-         FA = HA
-         HA = TEMP
-*
-*        Now FA .ge. HA
-*
-      END IF
-      GT = G
-      GA = ABS( GT )
-      IF( GA.EQ.ZERO ) THEN
-*
-*        Diagonal matrix
-*
-         SSMIN = HA
-         SSMAX = FA
-         CLT = ONE
-         CRT = ONE
-         SLT = ZERO
-         SRT = ZERO
-      ELSE
-         GASMAL = .TRUE.
-         IF( GA.GT.FA ) THEN
-            PMAX = 2
-            IF( ( FA / GA ).LT.DLAMCH( 'EPS' ) ) THEN
-*
-*              Case of very large GA
-*
-               GASMAL = .FALSE.
-               SSMAX = GA
-               IF( HA.GT.ONE ) THEN
-                  SSMIN = FA / ( GA / HA )
-               ELSE
-                  SSMIN = ( FA / GA )*HA
-               END IF
-               CLT = ONE
-               SLT = HT / GT
-               SRT = ONE
-               CRT = FT / GT
-            END IF
-         END IF
-         IF( GASMAL ) THEN
-*
-*           Normal case
-*
-            D = FA - HA
-            IF( D.EQ.FA ) THEN
-*
-*              Copes with infinite F or H
-*
-               L = ONE
-            ELSE
-               L = D / FA
-            END IF
-*
-*           Note that 0 .le. L .le. 1
-*
-            M = GT / FT
-*
-*           Note that abs(M) .le. 1/macheps
-*
-            T = TWO - L
-*
-*           Note that T .ge. 1
-*
-            MM = M*M
-            TT = T*T
-            S = SQRT( TT+MM )
-*
-*           Note that 1 .le. S .le. 1 + 1/macheps
-*
-            IF( L.EQ.ZERO ) THEN
-               R = ABS( M )
-            ELSE
-               R = SQRT( L*L+MM )
-            END IF
-*
-*           Note that 0 .le. R .le. 1 + 1/macheps
-*
-            A = HALF*( S+R )
-*
-*           Note that 1 .le. A .le. 1 + abs(M)
-*
-            SSMIN = HA / A
-            SSMAX = FA*A
-            IF( MM.EQ.ZERO ) THEN
-*
-*              Note that M is very tiny
-*
-               IF( L.EQ.ZERO ) THEN
-                  T = SIGN( TWO, FT )*SIGN( ONE, GT )
-               ELSE
-                  T = GT / SIGN( D, FT ) + M / T
-               END IF
-            ELSE
-               T = ( M / ( S+T )+M / ( R+L ) )*( ONE+A )
-            END IF
-            L = SQRT( T*T+FOUR )
-            CRT = TWO / L
-            SRT = T / L
-            CLT = ( CRT+SRT*M ) / A
-            SLT = ( HT / FT )*SRT / A
-         END IF
-      END IF
-      IF( SWAP ) THEN
-         CSL = SRT
-         SNL = CRT
-         CSR = SLT
-         SNR = CLT
-      ELSE
-         CSL = CLT
-         SNL = SLT
-         CSR = CRT
-         SNR = SRT
-      END IF
-*
-*     Correct signs of SSMAX and SSMIN
-*
-      IF( PMAX.EQ.1 )
-     $   TSIGN = SIGN( ONE, CSR )*SIGN( ONE, CSL )*SIGN( ONE, F )
-      IF( PMAX.EQ.2 )
-     $   TSIGN = SIGN( ONE, SNR )*SIGN( ONE, CSL )*SIGN( ONE, G )
-      IF( PMAX.EQ.3 )
-     $   TSIGN = SIGN( ONE, SNR )*SIGN( ONE, SNL )*SIGN( ONE, H )
-      SSMAX = SIGN( SSMAX, TSIGN )
-      SSMIN = SIGN( SSMIN, TSIGN*SIGN( ONE, F )*SIGN( ONE, H ) )
-      RETURN
-*
-*     End of DLASV2
-*
-      END
--- a/libcruft/lapack/dlaswp.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,119 +0,0 @@
-      SUBROUTINE DLASWP( N, A, LDA, K1, K2, IPIV, INCX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, K1, K2, LDA, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      DOUBLE PRECISION   A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASWP performs a series of row interchanges on the matrix A.
-*  One row interchange is initiated for each of rows K1 through K2 of A.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the matrix of column dimension N to which the row
-*          interchanges will be applied.
-*          On exit, the permuted matrix.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.
-*
-*  K1      (input) INTEGER
-*          The first element of IPIV for which a row interchange will
-*          be done.
-*
-*  K2      (input) INTEGER
-*          The last element of IPIV for which a row interchange will
-*          be done.
-*
-*  IPIV    (input) INTEGER array, dimension (K2*abs(INCX))
-*          The vector of pivot indices.  Only the elements in positions
-*          K1 through K2 of IPIV are accessed.
-*          IPIV(K) = L implies rows K and L are to be interchanged.
-*
-*  INCX    (input) INTEGER
-*          The increment between successive values of IPIV.  If IPIV
-*          is negative, the pivots are applied in reverse order.
-*
-*  Further Details
-*  ===============
-*
-*  Modified by
-*   R. C. Whaley, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, I1, I2, INC, IP, IX, IX0, J, K, N32
-      DOUBLE PRECISION   TEMP
-*     ..
-*     .. Executable Statements ..
-*
-*     Interchange row I with row IPIV(I) for each of rows K1 through K2.
-*
-      IF( INCX.GT.0 ) THEN
-         IX0 = K1
-         I1 = K1
-         I2 = K2
-         INC = 1
-      ELSE IF( INCX.LT.0 ) THEN
-         IX0 = 1 + ( 1-K2 )*INCX
-         I1 = K2
-         I2 = K1
-         INC = -1
-      ELSE
-         RETURN
-      END IF
-*
-      N32 = ( N / 32 )*32
-      IF( N32.NE.0 ) THEN
-         DO 30 J = 1, N32, 32
-            IX = IX0
-            DO 20 I = I1, I2, INC
-               IP = IPIV( IX )
-               IF( IP.NE.I ) THEN
-                  DO 10 K = J, J + 31
-                     TEMP = A( I, K )
-                     A( I, K ) = A( IP, K )
-                     A( IP, K ) = TEMP
-   10             CONTINUE
-               END IF
-               IX = IX + INCX
-   20       CONTINUE
-   30    CONTINUE
-      END IF
-      IF( N32.NE.N ) THEN
-         N32 = N32 + 1
-         IX = IX0
-         DO 50 I = I1, I2, INC
-            IP = IPIV( IX )
-            IF( IP.NE.I ) THEN
-               DO 40 K = N32, N
-                  TEMP = A( I, K )
-                  A( I, K ) = A( IP, K )
-                  A( IP, K ) = TEMP
-   40          CONTINUE
-            END IF
-            IX = IX + INCX
-   50    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of DLASWP
-*
-      END
--- a/libcruft/lapack/dlasy2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,381 +0,0 @@
-      SUBROUTINE DLASY2( LTRANL, LTRANR, ISGN, N1, N2, TL, LDTL, TR,
-     $                   LDTR, B, LDB, SCALE, X, LDX, XNORM, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            LTRANL, LTRANR
-      INTEGER            INFO, ISGN, LDB, LDTL, LDTR, LDX, N1, N2
-      DOUBLE PRECISION   SCALE, XNORM
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   B( LDB, * ), TL( LDTL, * ), TR( LDTR, * ),
-     $                   X( LDX, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLASY2 solves for the N1 by N2 matrix X, 1 <= N1,N2 <= 2, in
-*
-*         op(TL)*X + ISGN*X*op(TR) = SCALE*B,
-*
-*  where TL is N1 by N1, TR is N2 by N2, B is N1 by N2, and ISGN = 1 or
-*  -1.  op(T) = T or T', where T' denotes the transpose of T.
-*
-*  Arguments
-*  =========
-*
-*  LTRANL  (input) LOGICAL
-*          On entry, LTRANL specifies the op(TL):
-*             = .FALSE., op(TL) = TL,
-*             = .TRUE., op(TL) = TL'.
-*
-*  LTRANR  (input) LOGICAL
-*          On entry, LTRANR specifies the op(TR):
-*            = .FALSE., op(TR) = TR,
-*            = .TRUE., op(TR) = TR'.
-*
-*  ISGN    (input) INTEGER
-*          On entry, ISGN specifies the sign of the equation
-*          as described before. ISGN may only be 1 or -1.
-*
-*  N1      (input) INTEGER
-*          On entry, N1 specifies the order of matrix TL.
-*          N1 may only be 0, 1 or 2.
-*
-*  N2      (input) INTEGER
-*          On entry, N2 specifies the order of matrix TR.
-*          N2 may only be 0, 1 or 2.
-*
-*  TL      (input) DOUBLE PRECISION array, dimension (LDTL,2)
-*          On entry, TL contains an N1 by N1 matrix.
-*
-*  LDTL    (input) INTEGER
-*          The leading dimension of the matrix TL. LDTL >= max(1,N1).
-*
-*  TR      (input) DOUBLE PRECISION array, dimension (LDTR,2)
-*          On entry, TR contains an N2 by N2 matrix.
-*
-*  LDTR    (input) INTEGER
-*          The leading dimension of the matrix TR. LDTR >= max(1,N2).
-*
-*  B       (input) DOUBLE PRECISION array, dimension (LDB,2)
-*          On entry, the N1 by N2 matrix B contains the right-hand
-*          side of the equation.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the matrix B. LDB >= max(1,N1).
-*
-*  SCALE   (output) DOUBLE PRECISION
-*          On exit, SCALE contains the scale factor. SCALE is chosen
-*          less than or equal to 1 to prevent the solution overflowing.
-*
-*  X       (output) DOUBLE PRECISION array, dimension (LDX,2)
-*          On exit, X contains the N1 by N2 solution.
-*
-*  LDX     (input) INTEGER
-*          The leading dimension of the matrix X. LDX >= max(1,N1).
-*
-*  XNORM   (output) DOUBLE PRECISION
-*          On exit, XNORM is the infinity-norm of the solution.
-*
-*  INFO    (output) INTEGER
-*          On exit, INFO is set to
-*             0: successful exit.
-*             1: TL and TR have too close eigenvalues, so TL or
-*                TR is perturbed to get a nonsingular equation.
-*          NOTE: In the interests of speed, this routine does not
-*                check the inputs for errors.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-      DOUBLE PRECISION   TWO, HALF, EIGHT
-      PARAMETER          ( TWO = 2.0D+0, HALF = 0.5D+0, EIGHT = 8.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            BSWAP, XSWAP
-      INTEGER            I, IP, IPIV, IPSV, J, JP, JPSV, K
-      DOUBLE PRECISION   BET, EPS, GAM, L21, SGN, SMIN, SMLNUM, TAU1,
-     $                   TEMP, U11, U12, U22, XMAX
-*     ..
-*     .. Local Arrays ..
-      LOGICAL            BSWPIV( 4 ), XSWPIV( 4 )
-      INTEGER            JPIV( 4 ), LOCL21( 4 ), LOCU12( 4 ),
-     $                   LOCU22( 4 )
-      DOUBLE PRECISION   BTMP( 4 ), T16( 4, 4 ), TMP( 4 ), X2( 2 )
-*     ..
-*     .. External Functions ..
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           IDAMAX, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DCOPY, DSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Data statements ..
-      DATA               LOCU12 / 3, 4, 1, 2 / , LOCL21 / 2, 1, 4, 3 / ,
-     $                   LOCU22 / 4, 3, 2, 1 /
-      DATA               XSWPIV / .FALSE., .FALSE., .TRUE., .TRUE. /
-      DATA               BSWPIV / .FALSE., .TRUE., .FALSE., .TRUE. /
-*     ..
-*     .. Executable Statements ..
-*
-*     Do not check the input parameters for errors
-*
-      INFO = 0
-*
-*     Quick return if possible
-*
-      IF( N1.EQ.0 .OR. N2.EQ.0 )
-     $   RETURN
-*
-*     Set constants to control overflow
-*
-      EPS = DLAMCH( 'P' )
-      SMLNUM = DLAMCH( 'S' ) / EPS
-      SGN = ISGN
-*
-      K = N1 + N1 + N2 - 2
-      GO TO ( 10, 20, 30, 50 )K
-*
-*     1 by 1: TL11*X + SGN*X*TR11 = B11
-*
-   10 CONTINUE
-      TAU1 = TL( 1, 1 ) + SGN*TR( 1, 1 )
-      BET = ABS( TAU1 )
-      IF( BET.LE.SMLNUM ) THEN
-         TAU1 = SMLNUM
-         BET = SMLNUM
-         INFO = 1
-      END IF
-*
-      SCALE = ONE
-      GAM = ABS( B( 1, 1 ) )
-      IF( SMLNUM*GAM.GT.BET )
-     $   SCALE = ONE / GAM
-*
-      X( 1, 1 ) = ( B( 1, 1 )*SCALE ) / TAU1
-      XNORM = ABS( X( 1, 1 ) )
-      RETURN
-*
-*     1 by 2:
-*     TL11*[X11 X12] + ISGN*[X11 X12]*op[TR11 TR12]  = [B11 B12]
-*                                       [TR21 TR22]
-*
-   20 CONTINUE
-*
-      SMIN = MAX( EPS*MAX( ABS( TL( 1, 1 ) ), ABS( TR( 1, 1 ) ),
-     $       ABS( TR( 1, 2 ) ), ABS( TR( 2, 1 ) ), ABS( TR( 2, 2 ) ) ),
-     $       SMLNUM )
-      TMP( 1 ) = TL( 1, 1 ) + SGN*TR( 1, 1 )
-      TMP( 4 ) = TL( 1, 1 ) + SGN*TR( 2, 2 )
-      IF( LTRANR ) THEN
-         TMP( 2 ) = SGN*TR( 2, 1 )
-         TMP( 3 ) = SGN*TR( 1, 2 )
-      ELSE
-         TMP( 2 ) = SGN*TR( 1, 2 )
-         TMP( 3 ) = SGN*TR( 2, 1 )
-      END IF
-      BTMP( 1 ) = B( 1, 1 )
-      BTMP( 2 ) = B( 1, 2 )
-      GO TO 40
-*
-*     2 by 1:
-*          op[TL11 TL12]*[X11] + ISGN* [X11]*TR11  = [B11]
-*            [TL21 TL22] [X21]         [X21]         [B21]
-*
-   30 CONTINUE
-      SMIN = MAX( EPS*MAX( ABS( TR( 1, 1 ) ), ABS( TL( 1, 1 ) ),
-     $       ABS( TL( 1, 2 ) ), ABS( TL( 2, 1 ) ), ABS( TL( 2, 2 ) ) ),
-     $       SMLNUM )
-      TMP( 1 ) = TL( 1, 1 ) + SGN*TR( 1, 1 )
-      TMP( 4 ) = TL( 2, 2 ) + SGN*TR( 1, 1 )
-      IF( LTRANL ) THEN
-         TMP( 2 ) = TL( 1, 2 )
-         TMP( 3 ) = TL( 2, 1 )
-      ELSE
-         TMP( 2 ) = TL( 2, 1 )
-         TMP( 3 ) = TL( 1, 2 )
-      END IF
-      BTMP( 1 ) = B( 1, 1 )
-      BTMP( 2 ) = B( 2, 1 )
-   40 CONTINUE
-*
-*     Solve 2 by 2 system using complete pivoting.
-*     Set pivots less than SMIN to SMIN.
-*
-      IPIV = IDAMAX( 4, TMP, 1 )
-      U11 = TMP( IPIV )
-      IF( ABS( U11 ).LE.SMIN ) THEN
-         INFO = 1
-         U11 = SMIN
-      END IF
-      U12 = TMP( LOCU12( IPIV ) )
-      L21 = TMP( LOCL21( IPIV ) ) / U11
-      U22 = TMP( LOCU22( IPIV ) ) - U12*L21
-      XSWAP = XSWPIV( IPIV )
-      BSWAP = BSWPIV( IPIV )
-      IF( ABS( U22 ).LE.SMIN ) THEN
-         INFO = 1
-         U22 = SMIN
-      END IF
-      IF( BSWAP ) THEN
-         TEMP = BTMP( 2 )
-         BTMP( 2 ) = BTMP( 1 ) - L21*TEMP
-         BTMP( 1 ) = TEMP
-      ELSE
-         BTMP( 2 ) = BTMP( 2 ) - L21*BTMP( 1 )
-      END IF
-      SCALE = ONE
-      IF( ( TWO*SMLNUM )*ABS( BTMP( 2 ) ).GT.ABS( U22 ) .OR.
-     $    ( TWO*SMLNUM )*ABS( BTMP( 1 ) ).GT.ABS( U11 ) ) THEN
-         SCALE = HALF / MAX( ABS( BTMP( 1 ) ), ABS( BTMP( 2 ) ) )
-         BTMP( 1 ) = BTMP( 1 )*SCALE
-         BTMP( 2 ) = BTMP( 2 )*SCALE
-      END IF
-      X2( 2 ) = BTMP( 2 ) / U22
-      X2( 1 ) = BTMP( 1 ) / U11 - ( U12 / U11 )*X2( 2 )
-      IF( XSWAP ) THEN
-         TEMP = X2( 2 )
-         X2( 2 ) = X2( 1 )
-         X2( 1 ) = TEMP
-      END IF
-      X( 1, 1 ) = X2( 1 )
-      IF( N1.EQ.1 ) THEN
-         X( 1, 2 ) = X2( 2 )
-         XNORM = ABS( X( 1, 1 ) ) + ABS( X( 1, 2 ) )
-      ELSE
-         X( 2, 1 ) = X2( 2 )
-         XNORM = MAX( ABS( X( 1, 1 ) ), ABS( X( 2, 1 ) ) )
-      END IF
-      RETURN
-*
-*     2 by 2:
-*     op[TL11 TL12]*[X11 X12] +ISGN* [X11 X12]*op[TR11 TR12] = [B11 B12]
-*       [TL21 TL22] [X21 X22]        [X21 X22]   [TR21 TR22]   [B21 B22]
-*
-*     Solve equivalent 4 by 4 system using complete pivoting.
-*     Set pivots less than SMIN to SMIN.
-*
-   50 CONTINUE
-      SMIN = MAX( ABS( TR( 1, 1 ) ), ABS( TR( 1, 2 ) ),
-     $       ABS( TR( 2, 1 ) ), ABS( TR( 2, 2 ) ) )
-      SMIN = MAX( SMIN, ABS( TL( 1, 1 ) ), ABS( TL( 1, 2 ) ),
-     $       ABS( TL( 2, 1 ) ), ABS( TL( 2, 2 ) ) )
-      SMIN = MAX( EPS*SMIN, SMLNUM )
-      BTMP( 1 ) = ZERO
-      CALL DCOPY( 16, BTMP, 0, T16, 1 )
-      T16( 1, 1 ) = TL( 1, 1 ) + SGN*TR( 1, 1 )
-      T16( 2, 2 ) = TL( 2, 2 ) + SGN*TR( 1, 1 )
-      T16( 3, 3 ) = TL( 1, 1 ) + SGN*TR( 2, 2 )
-      T16( 4, 4 ) = TL( 2, 2 ) + SGN*TR( 2, 2 )
-      IF( LTRANL ) THEN
-         T16( 1, 2 ) = TL( 2, 1 )
-         T16( 2, 1 ) = TL( 1, 2 )
-         T16( 3, 4 ) = TL( 2, 1 )
-         T16( 4, 3 ) = TL( 1, 2 )
-      ELSE
-         T16( 1, 2 ) = TL( 1, 2 )
-         T16( 2, 1 ) = TL( 2, 1 )
-         T16( 3, 4 ) = TL( 1, 2 )
-         T16( 4, 3 ) = TL( 2, 1 )
-      END IF
-      IF( LTRANR ) THEN
-         T16( 1, 3 ) = SGN*TR( 1, 2 )
-         T16( 2, 4 ) = SGN*TR( 1, 2 )
-         T16( 3, 1 ) = SGN*TR( 2, 1 )
-         T16( 4, 2 ) = SGN*TR( 2, 1 )
-      ELSE
-         T16( 1, 3 ) = SGN*TR( 2, 1 )
-         T16( 2, 4 ) = SGN*TR( 2, 1 )
-         T16( 3, 1 ) = SGN*TR( 1, 2 )
-         T16( 4, 2 ) = SGN*TR( 1, 2 )
-      END IF
-      BTMP( 1 ) = B( 1, 1 )
-      BTMP( 2 ) = B( 2, 1 )
-      BTMP( 3 ) = B( 1, 2 )
-      BTMP( 4 ) = B( 2, 2 )
-*
-*     Perform elimination
-*
-      DO 100 I = 1, 3
-         XMAX = ZERO
-         DO 70 IP = I, 4
-            DO 60 JP = I, 4
-               IF( ABS( T16( IP, JP ) ).GE.XMAX ) THEN
-                  XMAX = ABS( T16( IP, JP ) )
-                  IPSV = IP
-                  JPSV = JP
-               END IF
-   60       CONTINUE
-   70    CONTINUE
-         IF( IPSV.NE.I ) THEN
-            CALL DSWAP( 4, T16( IPSV, 1 ), 4, T16( I, 1 ), 4 )
-            TEMP = BTMP( I )
-            BTMP( I ) = BTMP( IPSV )
-            BTMP( IPSV ) = TEMP
-         END IF
-         IF( JPSV.NE.I )
-     $      CALL DSWAP( 4, T16( 1, JPSV ), 1, T16( 1, I ), 1 )
-         JPIV( I ) = JPSV
-         IF( ABS( T16( I, I ) ).LT.SMIN ) THEN
-            INFO = 1
-            T16( I, I ) = SMIN
-         END IF
-         DO 90 J = I + 1, 4
-            T16( J, I ) = T16( J, I ) / T16( I, I )
-            BTMP( J ) = BTMP( J ) - T16( J, I )*BTMP( I )
-            DO 80 K = I + 1, 4
-               T16( J, K ) = T16( J, K ) - T16( J, I )*T16( I, K )
-   80       CONTINUE
-   90    CONTINUE
-  100 CONTINUE
-      IF( ABS( T16( 4, 4 ) ).LT.SMIN )
-     $   T16( 4, 4 ) = SMIN
-      SCALE = ONE
-      IF( ( EIGHT*SMLNUM )*ABS( BTMP( 1 ) ).GT.ABS( T16( 1, 1 ) ) .OR.
-     $    ( EIGHT*SMLNUM )*ABS( BTMP( 2 ) ).GT.ABS( T16( 2, 2 ) ) .OR.
-     $    ( EIGHT*SMLNUM )*ABS( BTMP( 3 ) ).GT.ABS( T16( 3, 3 ) ) .OR.
-     $    ( EIGHT*SMLNUM )*ABS( BTMP( 4 ) ).GT.ABS( T16( 4, 4 ) ) ) THEN
-         SCALE = ( ONE / EIGHT ) / MAX( ABS( BTMP( 1 ) ),
-     $           ABS( BTMP( 2 ) ), ABS( BTMP( 3 ) ), ABS( BTMP( 4 ) ) )
-         BTMP( 1 ) = BTMP( 1 )*SCALE
-         BTMP( 2 ) = BTMP( 2 )*SCALE
-         BTMP( 3 ) = BTMP( 3 )*SCALE
-         BTMP( 4 ) = BTMP( 4 )*SCALE
-      END IF
-      DO 120 I = 1, 4
-         K = 5 - I
-         TEMP = ONE / T16( K, K )
-         TMP( K ) = BTMP( K )*TEMP
-         DO 110 J = K + 1, 4
-            TMP( K ) = TMP( K ) - ( TEMP*T16( K, J ) )*TMP( J )
-  110    CONTINUE
-  120 CONTINUE
-      DO 130 I = 1, 3
-         IF( JPIV( 4-I ).NE.4-I ) THEN
-            TEMP = TMP( 4-I )
-            TMP( 4-I ) = TMP( JPIV( 4-I ) )
-            TMP( JPIV( 4-I ) ) = TEMP
-         END IF
-  130 CONTINUE
-      X( 1, 1 ) = TMP( 1 )
-      X( 2, 1 ) = TMP( 2 )
-      X( 1, 2 ) = TMP( 3 )
-      X( 2, 2 ) = TMP( 4 )
-      XNORM = MAX( ABS( TMP( 1 ) )+ABS( TMP( 3 ) ),
-     $        ABS( TMP( 2 ) )+ABS( TMP( 4 ) ) )
-      RETURN
-*
-*     End of DLASY2
-*
-      END
--- a/libcruft/lapack/dlatbs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,723 +0,0 @@
-      SUBROUTINE DLATBS( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X,
-     $                   SCALE, CNORM, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, NORMIN, TRANS, UPLO
-      INTEGER            INFO, KD, LDAB, N
-      DOUBLE PRECISION   SCALE
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   AB( LDAB, * ), CNORM( * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLATBS solves one of the triangular systems
-*
-*     A *x = s*b  or  A'*x = s*b
-*
-*  with scaling to prevent overflow, where A is an upper or lower
-*  triangular band matrix.  Here A' denotes the transpose of A, x and b
-*  are n-element vectors, and s is a scaling factor, usually less than
-*  or equal to 1, chosen so that the components of x will be less than
-*  the overflow threshold.  If the unscaled problem will not cause
-*  overflow, the Level 2 BLAS routine DTBSV is called.  If the matrix A
-*  is singular (A(j,j) = 0 for some j), then s is set to 0 and a
-*  non-trivial solution to A*x = 0 is returned.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the matrix A is upper or lower triangular.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the operation applied to A.
-*          = 'N':  Solve A * x = s*b  (No transpose)
-*          = 'T':  Solve A'* x = s*b  (Transpose)
-*          = 'C':  Solve A'* x = s*b  (Conjugate transpose = Transpose)
-*
-*  DIAG    (input) CHARACTER*1
-*          Specifies whether or not the matrix A is unit triangular.
-*          = 'N':  Non-unit triangular
-*          = 'U':  Unit triangular
-*
-*  NORMIN  (input) CHARACTER*1
-*          Specifies whether CNORM has been set or not.
-*          = 'Y':  CNORM contains the column norms on entry
-*          = 'N':  CNORM is not set on entry.  On exit, the norms will
-*                  be computed and stored in CNORM.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of subdiagonals or superdiagonals in the
-*          triangular matrix A.  KD >= 0.
-*
-*  AB      (input) DOUBLE PRECISION array, dimension (LDAB,N)
-*          The upper or lower triangular band matrix A, stored in the
-*          first KD+1 rows of the array. The j-th column of A is stored
-*          in the j-th column of the array AB as follows:
-*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  X       (input/output) DOUBLE PRECISION array, dimension (N)
-*          On entry, the right hand side b of the triangular system.
-*          On exit, X is overwritten by the solution vector x.
-*
-*  SCALE   (output) DOUBLE PRECISION
-*          The scaling factor s for the triangular system
-*             A * x = s*b  or  A'* x = s*b.
-*          If SCALE = 0, the matrix A is singular or badly scaled, and
-*          the vector x is an exact or approximate solution to A*x = 0.
-*
-*  CNORM   (input or output) DOUBLE PRECISION array, dimension (N)
-*
-*          If NORMIN = 'Y', CNORM is an input argument and CNORM(j)
-*          contains the norm of the off-diagonal part of the j-th column
-*          of A.  If TRANS = 'N', CNORM(j) must be greater than or equal
-*          to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j)
-*          must be greater than or equal to the 1-norm.
-*
-*          If NORMIN = 'N', CNORM is an output argument and CNORM(j)
-*          returns the 1-norm of the offdiagonal part of the j-th column
-*          of A.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -k, the k-th argument had an illegal value
-*
-*  Further Details
-*  ======= =======
-*
-*  A rough bound on x is computed; if that is less than overflow, DTBSV
-*  is called, otherwise, specific code is used which checks for possible
-*  overflow or divide-by-zero at every operation.
-*
-*  A columnwise scheme is used for solving A*x = b.  The basic algorithm
-*  if A is lower triangular is
-*
-*       x[1:n] := b[1:n]
-*       for j = 1, ..., n
-*            x(j) := x(j) / A(j,j)
-*            x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j]
-*       end
-*
-*  Define bounds on the components of x after j iterations of the loop:
-*     M(j) = bound on x[1:j]
-*     G(j) = bound on x[j+1:n]
-*  Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}.
-*
-*  Then for iteration j+1 we have
-*     M(j+1) <= G(j) / | A(j+1,j+1) |
-*     G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] |
-*            <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | )
-*
-*  where CNORM(j+1) is greater than or equal to the infinity-norm of
-*  column j+1 of A, not counting the diagonal.  Hence
-*
-*     G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | )
-*                  1<=i<=j
-*  and
-*
-*     |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| )
-*                                   1<=i< j
-*
-*  Since |x(j)| <= M(j), we use the Level 2 BLAS routine DTBSV if the
-*  reciprocal of the largest M(j), j=1,..,n, is larger than
-*  max(underflow, 1/overflow).
-*
-*  The bound on x(j) is also used to determine when a step in the
-*  columnwise method can be performed without fear of overflow.  If
-*  the computed bound is greater than a large constant, x is scaled to
-*  prevent overflow, but if the bound overflows, x is set to 0, x(j) to
-*  1, and scale to 0, and a non-trivial solution to A*x = 0 is found.
-*
-*  Similarly, a row-wise scheme is used to solve A'*x = b.  The basic
-*  algorithm for A upper triangular is
-*
-*       for j = 1, ..., n
-*            x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j)
-*       end
-*
-*  We simultaneously compute two bounds
-*       G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j
-*       M(j) = bound on x(i), 1<=i<=j
-*
-*  The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we
-*  add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1.
-*  Then the bound on x(j) is
-*
-*       M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) |
-*
-*            <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| )
-*                      1<=i<=j
-*
-*  and we can safely call DTBSV if 1/M(n) and 1/G(n) are both greater
-*  than max(underflow, 1/overflow).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, HALF, ONE
-      PARAMETER          ( ZERO = 0.0D+0, HALF = 0.5D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOTRAN, NOUNIT, UPPER
-      INTEGER            I, IMAX, J, JFIRST, JINC, JLAST, JLEN, MAIND
-      DOUBLE PRECISION   BIGNUM, GROW, REC, SMLNUM, SUMJ, TJJ, TJJS,
-     $                   TMAX, TSCAL, USCAL, XBND, XJ, XMAX
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DASUM, DDOT, DLAMCH
-      EXTERNAL           LSAME, IDAMAX, DASUM, DDOT, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DAXPY, DSCAL, DTBSV, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      NOUNIT = LSAME( DIAG, 'N' )
-*
-*     Test the input parameters.
-*
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
-     $         LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -3
-      ELSE IF( .NOT.LSAME( NORMIN, 'Y' ) .AND. .NOT.
-     $         LSAME( NORMIN, 'N' ) ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -6
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLATBS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine machine dependent parameters to control overflow.
-*
-      SMLNUM = DLAMCH( 'Safe minimum' ) / DLAMCH( 'Precision' )
-      BIGNUM = ONE / SMLNUM
-      SCALE = ONE
-*
-      IF( LSAME( NORMIN, 'N' ) ) THEN
-*
-*        Compute the 1-norm of each column, not including the diagonal.
-*
-         IF( UPPER ) THEN
-*
-*           A is upper triangular.
-*
-            DO 10 J = 1, N
-               JLEN = MIN( KD, J-1 )
-               CNORM( J ) = DASUM( JLEN, AB( KD+1-JLEN, J ), 1 )
-   10       CONTINUE
-         ELSE
-*
-*           A is lower triangular.
-*
-            DO 20 J = 1, N
-               JLEN = MIN( KD, N-J )
-               IF( JLEN.GT.0 ) THEN
-                  CNORM( J ) = DASUM( JLEN, AB( 2, J ), 1 )
-               ELSE
-                  CNORM( J ) = ZERO
-               END IF
-   20       CONTINUE
-         END IF
-      END IF
-*
-*     Scale the column norms by TSCAL if the maximum element in CNORM is
-*     greater than BIGNUM.
-*
-      IMAX = IDAMAX( N, CNORM, 1 )
-      TMAX = CNORM( IMAX )
-      IF( TMAX.LE.BIGNUM ) THEN
-         TSCAL = ONE
-      ELSE
-         TSCAL = ONE / ( SMLNUM*TMAX )
-         CALL DSCAL( N, TSCAL, CNORM, 1 )
-      END IF
-*
-*     Compute a bound on the computed solution vector to see if the
-*     Level 2 BLAS routine DTBSV can be used.
-*
-      J = IDAMAX( N, X, 1 )
-      XMAX = ABS( X( J ) )
-      XBND = XMAX
-      IF( NOTRAN ) THEN
-*
-*        Compute the growth in A * x = b.
-*
-         IF( UPPER ) THEN
-            JFIRST = N
-            JLAST = 1
-            JINC = -1
-            MAIND = KD + 1
-         ELSE
-            JFIRST = 1
-            JLAST = N
-            JINC = 1
-            MAIND = 1
-         END IF
-*
-         IF( TSCAL.NE.ONE ) THEN
-            GROW = ZERO
-            GO TO 50
-         END IF
-*
-         IF( NOUNIT ) THEN
-*
-*           A is non-unit triangular.
-*
-*           Compute GROW = 1/G(j) and XBND = 1/M(j).
-*           Initially, G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = ONE / MAX( XBND, SMLNUM )
-            XBND = GROW
-            DO 30 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 50
-*
-*              M(j) = G(j-1) / abs(A(j,j))
-*
-               TJJ = ABS( AB( MAIND, J ) )
-               XBND = MIN( XBND, MIN( ONE, TJJ )*GROW )
-               IF( TJJ+CNORM( J ).GE.SMLNUM ) THEN
-*
-*                 G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) )
-*
-                  GROW = GROW*( TJJ / ( TJJ+CNORM( J ) ) )
-               ELSE
-*
-*                 G(j) could overflow, set GROW to 0.
-*
-                  GROW = ZERO
-               END IF
-   30       CONTINUE
-            GROW = XBND
-         ELSE
-*
-*           A is unit triangular.
-*
-*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) )
-            DO 40 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 50
-*
-*              G(j) = G(j-1)*( 1 + CNORM(j) )
-*
-               GROW = GROW*( ONE / ( ONE+CNORM( J ) ) )
-   40       CONTINUE
-         END IF
-   50    CONTINUE
-*
-      ELSE
-*
-*        Compute the growth in A' * x = b.
-*
-         IF( UPPER ) THEN
-            JFIRST = 1
-            JLAST = N
-            JINC = 1
-            MAIND = KD + 1
-         ELSE
-            JFIRST = N
-            JLAST = 1
-            JINC = -1
-            MAIND = 1
-         END IF
-*
-         IF( TSCAL.NE.ONE ) THEN
-            GROW = ZERO
-            GO TO 80
-         END IF
-*
-         IF( NOUNIT ) THEN
-*
-*           A is non-unit triangular.
-*
-*           Compute GROW = 1/G(j) and XBND = 1/M(j).
-*           Initially, M(0) = max{x(i), i=1,...,n}.
-*
-            GROW = ONE / MAX( XBND, SMLNUM )
-            XBND = GROW
-            DO 60 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 80
-*
-*              G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) )
-*
-               XJ = ONE + CNORM( J )
-               GROW = MIN( GROW, XBND / XJ )
-*
-*              M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j))
-*
-               TJJ = ABS( AB( MAIND, J ) )
-               IF( XJ.GT.TJJ )
-     $            XBND = XBND*( TJJ / XJ )
-   60       CONTINUE
-            GROW = MIN( GROW, XBND )
-         ELSE
-*
-*           A is unit triangular.
-*
-*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) )
-            DO 70 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 80
-*
-*              G(j) = ( 1 + CNORM(j) )*G(j-1)
-*
-               XJ = ONE + CNORM( J )
-               GROW = GROW / XJ
-   70       CONTINUE
-         END IF
-   80    CONTINUE
-      END IF
-*
-      IF( ( GROW*TSCAL ).GT.SMLNUM ) THEN
-*
-*        Use the Level 2 BLAS solve if the reciprocal of the bound on
-*        elements of X is not too small.
-*
-         CALL DTBSV( UPLO, TRANS, DIAG, N, KD, AB, LDAB, X, 1 )
-      ELSE
-*
-*        Use a Level 1 BLAS solve, scaling intermediate results.
-*
-         IF( XMAX.GT.BIGNUM ) THEN
-*
-*           Scale X so that its components are less than or equal to
-*           BIGNUM in absolute value.
-*
-            SCALE = BIGNUM / XMAX
-            CALL DSCAL( N, SCALE, X, 1 )
-            XMAX = BIGNUM
-         END IF
-*
-         IF( NOTRAN ) THEN
-*
-*           Solve A * x = b
-*
-            DO 110 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) / A(j,j), scaling x if necessary.
-*
-               XJ = ABS( X( J ) )
-               IF( NOUNIT ) THEN
-                  TJJS = AB( MAIND, J )*TSCAL
-               ELSE
-                  TJJS = TSCAL
-                  IF( TSCAL.EQ.ONE )
-     $               GO TO 100
-               END IF
-               TJJ = ABS( TJJS )
-               IF( TJJ.GT.SMLNUM ) THEN
-*
-*                    abs(A(j,j)) > SMLNUM:
-*
-                  IF( TJJ.LT.ONE ) THEN
-                     IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by 1/b(j).
-*
-                        REC = ONE / XJ
-                        CALL DSCAL( N, REC, X, 1 )
-                        SCALE = SCALE*REC
-                        XMAX = XMAX*REC
-                     END IF
-                  END IF
-                  X( J ) = X( J ) / TJJS
-                  XJ = ABS( X( J ) )
-               ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                    0 < abs(A(j,j)) <= SMLNUM:
-*
-                  IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                       Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM
-*                       to avoid overflow when dividing by A(j,j).
-*
-                     REC = ( TJJ*BIGNUM ) / XJ
-                     IF( CNORM( J ).GT.ONE ) THEN
-*
-*                          Scale by 1/CNORM(j) to avoid overflow when
-*                          multiplying x(j) times column j.
-*
-                        REC = REC / CNORM( J )
-                     END IF
-                     CALL DSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                     XMAX = XMAX*REC
-                  END IF
-                  X( J ) = X( J ) / TJJS
-                  XJ = ABS( X( J ) )
-               ELSE
-*
-*                    A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                    scale = 0, and compute a solution to A*x = 0.
-*
-                  DO 90 I = 1, N
-                     X( I ) = ZERO
-   90             CONTINUE
-                  X( J ) = ONE
-                  XJ = ONE
-                  SCALE = ZERO
-                  XMAX = ZERO
-               END IF
-  100          CONTINUE
-*
-*              Scale x if necessary to avoid overflow when adding a
-*              multiple of column j of A.
-*
-               IF( XJ.GT.ONE ) THEN
-                  REC = ONE / XJ
-                  IF( CNORM( J ).GT.( BIGNUM-XMAX )*REC ) THEN
-*
-*                    Scale x by 1/(2*abs(x(j))).
-*
-                     REC = REC*HALF
-                     CALL DSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                  END IF
-               ELSE IF( XJ*CNORM( J ).GT.( BIGNUM-XMAX ) ) THEN
-*
-*                 Scale x by 1/2.
-*
-                  CALL DSCAL( N, HALF, X, 1 )
-                  SCALE = SCALE*HALF
-               END IF
-*
-               IF( UPPER ) THEN
-                  IF( J.GT.1 ) THEN
-*
-*                    Compute the update
-*                       x(max(1,j-kd):j-1) := x(max(1,j-kd):j-1) -
-*                                             x(j)* A(max(1,j-kd):j-1,j)
-*
-                     JLEN = MIN( KD, J-1 )
-                     CALL DAXPY( JLEN, -X( J )*TSCAL,
-     $                           AB( KD+1-JLEN, J ), 1, X( J-JLEN ), 1 )
-                     I = IDAMAX( J-1, X, 1 )
-                     XMAX = ABS( X( I ) )
-                  END IF
-               ELSE IF( J.LT.N ) THEN
-*
-*                 Compute the update
-*                    x(j+1:min(j+kd,n)) := x(j+1:min(j+kd,n)) -
-*                                          x(j) * A(j+1:min(j+kd,n),j)
-*
-                  JLEN = MIN( KD, N-J )
-                  IF( JLEN.GT.0 )
-     $               CALL DAXPY( JLEN, -X( J )*TSCAL, AB( 2, J ), 1,
-     $                           X( J+1 ), 1 )
-                  I = J + IDAMAX( N-J, X( J+1 ), 1 )
-                  XMAX = ABS( X( I ) )
-               END IF
-  110       CONTINUE
-*
-         ELSE
-*
-*           Solve A' * x = b
-*
-            DO 160 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) - sum A(k,j)*x(k).
-*                                    k<>j
-*
-               XJ = ABS( X( J ) )
-               USCAL = TSCAL
-               REC = ONE / MAX( XMAX, ONE )
-               IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN
-*
-*                 If x(j) could overflow, scale x by 1/(2*XMAX).
-*
-                  REC = REC*HALF
-                  IF( NOUNIT ) THEN
-                     TJJS = AB( MAIND, J )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                  END IF
-                  TJJ = ABS( TJJS )
-                  IF( TJJ.GT.ONE ) THEN
-*
-*                       Divide by A(j,j) when scaling x if A(j,j) > 1.
-*
-                     REC = MIN( ONE, REC*TJJ )
-                     USCAL = USCAL / TJJS
-                  END IF
-                  IF( REC.LT.ONE ) THEN
-                     CALL DSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                     XMAX = XMAX*REC
-                  END IF
-               END IF
-*
-               SUMJ = ZERO
-               IF( USCAL.EQ.ONE ) THEN
-*
-*                 If the scaling needed for A in the dot product is 1,
-*                 call DDOT to perform the dot product.
-*
-                  IF( UPPER ) THEN
-                     JLEN = MIN( KD, J-1 )
-                     SUMJ = DDOT( JLEN, AB( KD+1-JLEN, J ), 1,
-     $                      X( J-JLEN ), 1 )
-                  ELSE
-                     JLEN = MIN( KD, N-J )
-                     IF( JLEN.GT.0 )
-     $                  SUMJ = DDOT( JLEN, AB( 2, J ), 1, X( J+1 ), 1 )
-                  END IF
-               ELSE
-*
-*                 Otherwise, use in-line code for the dot product.
-*
-                  IF( UPPER ) THEN
-                     JLEN = MIN( KD, J-1 )
-                     DO 120 I = 1, JLEN
-                        SUMJ = SUMJ + ( AB( KD+I-JLEN, J )*USCAL )*
-     $                         X( J-JLEN-1+I )
-  120                CONTINUE
-                  ELSE
-                     JLEN = MIN( KD, N-J )
-                     DO 130 I = 1, JLEN
-                        SUMJ = SUMJ + ( AB( I+1, J )*USCAL )*X( J+I )
-  130                CONTINUE
-                  END IF
-               END IF
-*
-               IF( USCAL.EQ.TSCAL ) THEN
-*
-*                 Compute x(j) := ( x(j) - sumj ) / A(j,j) if 1/A(j,j)
-*                 was not used to scale the dotproduct.
-*
-                  X( J ) = X( J ) - SUMJ
-                  XJ = ABS( X( J ) )
-                  IF( NOUNIT ) THEN
-*
-*                    Compute x(j) = x(j) / A(j,j), scaling if necessary.
-*
-                     TJJS = AB( MAIND, J )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                     IF( TSCAL.EQ.ONE )
-     $                  GO TO 150
-                  END IF
-                  TJJ = ABS( TJJS )
-                  IF( TJJ.GT.SMLNUM ) THEN
-*
-*                       abs(A(j,j)) > SMLNUM:
-*
-                     IF( TJJ.LT.ONE ) THEN
-                        IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                             Scale X by 1/abs(x(j)).
-*
-                           REC = ONE / XJ
-                           CALL DSCAL( N, REC, X, 1 )
-                           SCALE = SCALE*REC
-                           XMAX = XMAX*REC
-                        END IF
-                     END IF
-                     X( J ) = X( J ) / TJJS
-                  ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                       0 < abs(A(j,j)) <= SMLNUM:
-*
-                     IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM.
-*
-                        REC = ( TJJ*BIGNUM ) / XJ
-                        CALL DSCAL( N, REC, X, 1 )
-                        SCALE = SCALE*REC
-                        XMAX = XMAX*REC
-                     END IF
-                     X( J ) = X( J ) / TJJS
-                  ELSE
-*
-*                       A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                       scale = 0, and compute a solution to A'*x = 0.
-*
-                     DO 140 I = 1, N
-                        X( I ) = ZERO
-  140                CONTINUE
-                     X( J ) = ONE
-                     SCALE = ZERO
-                     XMAX = ZERO
-                  END IF
-  150             CONTINUE
-               ELSE
-*
-*                 Compute x(j) := x(j) / A(j,j) - sumj if the dot
-*                 product has already been divided by 1/A(j,j).
-*
-                  X( J ) = X( J ) / TJJS - SUMJ
-               END IF
-               XMAX = MAX( XMAX, ABS( X( J ) ) )
-  160       CONTINUE
-         END IF
-         SCALE = SCALE / TSCAL
-      END IF
-*
-*     Scale the column norms by 1/TSCAL for return.
-*
-      IF( TSCAL.NE.ONE ) THEN
-         CALL DSCAL( N, ONE / TSCAL, CNORM, 1 )
-      END IF
-*
-      RETURN
-*
-*     End of DLATBS
-*
-      END
--- a/libcruft/lapack/dlatrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,258 +0,0 @@
-      SUBROUTINE DLATRD( UPLO, N, NB, A, LDA, E, TAU, W, LDW )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            LDA, LDW, N, NB
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), E( * ), TAU( * ), W( LDW, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLATRD reduces NB rows and columns of a real symmetric matrix A to
-*  symmetric tridiagonal form by an orthogonal similarity
-*  transformation Q' * A * Q, and returns the matrices V and W which are
-*  needed to apply the transformation to the unreduced part of A.
-*
-*  If UPLO = 'U', DLATRD reduces the last NB rows and columns of a
-*  matrix, of which the upper triangle is supplied;
-*  if UPLO = 'L', DLATRD reduces the first NB rows and columns of a
-*  matrix, of which the lower triangle is supplied.
-*
-*  This is an auxiliary routine called by DSYTRD.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          symmetric matrix A is stored:
-*          = 'U': Upper triangular
-*          = 'L': Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  NB      (input) INTEGER
-*          The number of rows and columns to be reduced.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the leading
-*          n-by-n upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n-by-n lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*          On exit:
-*          if UPLO = 'U', the last NB columns have been reduced to
-*            tridiagonal form, with the diagonal elements overwriting
-*            the diagonal elements of A; the elements above the diagonal
-*            with the array TAU, represent the orthogonal matrix Q as a
-*            product of elementary reflectors;
-*          if UPLO = 'L', the first NB columns have been reduced to
-*            tridiagonal form, with the diagonal elements overwriting
-*            the diagonal elements of A; the elements below the diagonal
-*            with the array TAU, represent the  orthogonal matrix Q as a
-*            product of elementary reflectors.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= (1,N).
-*
-*  E       (output) DOUBLE PRECISION array, dimension (N-1)
-*          If UPLO = 'U', E(n-nb:n-1) contains the superdiagonal
-*          elements of the last NB columns of the reduced matrix;
-*          if UPLO = 'L', E(1:nb) contains the subdiagonal elements of
-*          the first NB columns of the reduced matrix.
-*
-*  TAU     (output) DOUBLE PRECISION array, dimension (N-1)
-*          The scalar factors of the elementary reflectors, stored in
-*          TAU(n-nb:n-1) if UPLO = 'U', and in TAU(1:nb) if UPLO = 'L'.
-*          See Further Details.
-*
-*  W       (output) DOUBLE PRECISION array, dimension (LDW,NB)
-*          The n-by-nb matrix W required to update the unreduced part
-*          of A.
-*
-*  LDW     (input) INTEGER
-*          The leading dimension of the array W. LDW >= max(1,N).
-*
-*  Further Details
-*  ===============
-*
-*  If UPLO = 'U', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(n) H(n-1) . . . H(n-nb+1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i),
-*  and tau in TAU(i-1).
-*
-*  If UPLO = 'L', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(1) H(2) . . . H(nb).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i),
-*  and tau in TAU(i).
-*
-*  The elements of the vectors v together form the n-by-nb matrix V
-*  which is needed, with W, to apply the transformation to the unreduced
-*  part of the matrix, using a symmetric rank-2k update of the form:
-*  A := A - V*W' - W*V'.
-*
-*  The contents of A on exit are illustrated by the following examples
-*  with n = 5 and nb = 2:
-*
-*  if UPLO = 'U':                       if UPLO = 'L':
-*
-*    (  a   a   a   v4  v5 )              (  d                  )
-*    (      a   a   v4  v5 )              (  1   d              )
-*    (          a   1   v5 )              (  v1  1   a          )
-*    (              d   1  )              (  v1  v2  a   a      )
-*    (                  d  )              (  v1  v2  a   a   a  )
-*
-*  where d denotes a diagonal element of the reduced matrix, a denotes
-*  an element of the original matrix that is unchanged, and vi denotes
-*  an element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE, HALF
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0, HALF = 0.5D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, IW
-      DOUBLE PRECISION   ALPHA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DAXPY, DGEMV, DLARFG, DSCAL, DSYMV
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   DDOT
-      EXTERNAL           LSAME, DDOT
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-      IF( LSAME( UPLO, 'U' ) ) THEN
-*
-*        Reduce last NB columns of upper triangle
-*
-         DO 10 I = N, N - NB + 1, -1
-            IW = I - N + NB
-            IF( I.LT.N ) THEN
-*
-*              Update A(1:i,i)
-*
-               CALL DGEMV( 'No transpose', I, N-I, -ONE, A( 1, I+1 ),
-     $                     LDA, W( I, IW+1 ), LDW, ONE, A( 1, I ), 1 )
-               CALL DGEMV( 'No transpose', I, N-I, -ONE, W( 1, IW+1 ),
-     $                     LDW, A( I, I+1 ), LDA, ONE, A( 1, I ), 1 )
-            END IF
-            IF( I.GT.1 ) THEN
-*
-*              Generate elementary reflector H(i) to annihilate
-*              A(1:i-2,i)
-*
-               CALL DLARFG( I-1, A( I-1, I ), A( 1, I ), 1, TAU( I-1 ) )
-               E( I-1 ) = A( I-1, I )
-               A( I-1, I ) = ONE
-*
-*              Compute W(1:i-1,i)
-*
-               CALL DSYMV( 'Upper', I-1, ONE, A, LDA, A( 1, I ), 1,
-     $                     ZERO, W( 1, IW ), 1 )
-               IF( I.LT.N ) THEN
-                  CALL DGEMV( 'Transpose', I-1, N-I, ONE, W( 1, IW+1 ),
-     $                        LDW, A( 1, I ), 1, ZERO, W( I+1, IW ), 1 )
-                  CALL DGEMV( 'No transpose', I-1, N-I, -ONE,
-     $                        A( 1, I+1 ), LDA, W( I+1, IW ), 1, ONE,
-     $                        W( 1, IW ), 1 )
-                  CALL DGEMV( 'Transpose', I-1, N-I, ONE, A( 1, I+1 ),
-     $                        LDA, A( 1, I ), 1, ZERO, W( I+1, IW ), 1 )
-                  CALL DGEMV( 'No transpose', I-1, N-I, -ONE,
-     $                        W( 1, IW+1 ), LDW, W( I+1, IW ), 1, ONE,
-     $                        W( 1, IW ), 1 )
-               END IF
-               CALL DSCAL( I-1, TAU( I-1 ), W( 1, IW ), 1 )
-               ALPHA = -HALF*TAU( I-1 )*DDOT( I-1, W( 1, IW ), 1,
-     $                 A( 1, I ), 1 )
-               CALL DAXPY( I-1, ALPHA, A( 1, I ), 1, W( 1, IW ), 1 )
-            END IF
-*
-   10    CONTINUE
-      ELSE
-*
-*        Reduce first NB columns of lower triangle
-*
-         DO 20 I = 1, NB
-*
-*           Update A(i:n,i)
-*
-            CALL DGEMV( 'No transpose', N-I+1, I-1, -ONE, A( I, 1 ),
-     $                  LDA, W( I, 1 ), LDW, ONE, A( I, I ), 1 )
-            CALL DGEMV( 'No transpose', N-I+1, I-1, -ONE, W( I, 1 ),
-     $                  LDW, A( I, 1 ), LDA, ONE, A( I, I ), 1 )
-            IF( I.LT.N ) THEN
-*
-*              Generate elementary reflector H(i) to annihilate
-*              A(i+2:n,i)
-*
-               CALL DLARFG( N-I, A( I+1, I ), A( MIN( I+2, N ), I ), 1,
-     $                      TAU( I ) )
-               E( I ) = A( I+1, I )
-               A( I+1, I ) = ONE
-*
-*              Compute W(i+1:n,i)
-*
-               CALL DSYMV( 'Lower', N-I, ONE, A( I+1, I+1 ), LDA,
-     $                     A( I+1, I ), 1, ZERO, W( I+1, I ), 1 )
-               CALL DGEMV( 'Transpose', N-I, I-1, ONE, W( I+1, 1 ), LDW,
-     $                     A( I+1, I ), 1, ZERO, W( 1, I ), 1 )
-               CALL DGEMV( 'No transpose', N-I, I-1, -ONE, A( I+1, 1 ),
-     $                     LDA, W( 1, I ), 1, ONE, W( I+1, I ), 1 )
-               CALL DGEMV( 'Transpose', N-I, I-1, ONE, A( I+1, 1 ), LDA,
-     $                     A( I+1, I ), 1, ZERO, W( 1, I ), 1 )
-               CALL DGEMV( 'No transpose', N-I, I-1, -ONE, W( I+1, 1 ),
-     $                     LDW, W( 1, I ), 1, ONE, W( I+1, I ), 1 )
-               CALL DSCAL( N-I, TAU( I ), W( I+1, I ), 1 )
-               ALPHA = -HALF*TAU( I )*DDOT( N-I, W( I+1, I ), 1,
-     $                 A( I+1, I ), 1 )
-               CALL DAXPY( N-I, ALPHA, A( I+1, I ), 1, W( I+1, I ), 1 )
-            END IF
-*
-   20    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of DLATRD
-*
-      END
--- a/libcruft/lapack/dlatrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,701 +0,0 @@
-      SUBROUTINE DLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
-     $                   CNORM, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, NORMIN, TRANS, UPLO
-      INTEGER            INFO, LDA, N
-      DOUBLE PRECISION   SCALE
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), CNORM( * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLATRS solves one of the triangular systems
-*
-*     A *x = s*b  or  A'*x = s*b
-*
-*  with scaling to prevent overflow.  Here A is an upper or lower
-*  triangular matrix, A' denotes the transpose of A, x and b are
-*  n-element vectors, and s is a scaling factor, usually less than
-*  or equal to 1, chosen so that the components of x will be less than
-*  the overflow threshold.  If the unscaled problem will not cause
-*  overflow, the Level 2 BLAS routine DTRSV is called.  If the matrix A
-*  is singular (A(j,j) = 0 for some j), then s is set to 0 and a
-*  non-trivial solution to A*x = 0 is returned.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the matrix A is upper or lower triangular.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the operation applied to A.
-*          = 'N':  Solve A * x = s*b  (No transpose)
-*          = 'T':  Solve A'* x = s*b  (Transpose)
-*          = 'C':  Solve A'* x = s*b  (Conjugate transpose = Transpose)
-*
-*  DIAG    (input) CHARACTER*1
-*          Specifies whether or not the matrix A is unit triangular.
-*          = 'N':  Non-unit triangular
-*          = 'U':  Unit triangular
-*
-*  NORMIN  (input) CHARACTER*1
-*          Specifies whether CNORM has been set or not.
-*          = 'Y':  CNORM contains the column norms on entry
-*          = 'N':  CNORM is not set on entry.  On exit, the norms will
-*                  be computed and stored in CNORM.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA,N)
-*          The triangular matrix A.  If UPLO = 'U', the leading n by n
-*          upper triangular part of the array A contains the upper
-*          triangular matrix, and the strictly lower triangular part of
-*          A is not referenced.  If UPLO = 'L', the leading n by n lower
-*          triangular part of the array A contains the lower triangular
-*          matrix, and the strictly upper triangular part of A is not
-*          referenced.  If DIAG = 'U', the diagonal elements of A are
-*          also not referenced and are assumed to be 1.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max (1,N).
-*
-*  X       (input/output) DOUBLE PRECISION array, dimension (N)
-*          On entry, the right hand side b of the triangular system.
-*          On exit, X is overwritten by the solution vector x.
-*
-*  SCALE   (output) DOUBLE PRECISION
-*          The scaling factor s for the triangular system
-*             A * x = s*b  or  A'* x = s*b.
-*          If SCALE = 0, the matrix A is singular or badly scaled, and
-*          the vector x is an exact or approximate solution to A*x = 0.
-*
-*  CNORM   (input or output) DOUBLE PRECISION array, dimension (N)
-*
-*          If NORMIN = 'Y', CNORM is an input argument and CNORM(j)
-*          contains the norm of the off-diagonal part of the j-th column
-*          of A.  If TRANS = 'N', CNORM(j) must be greater than or equal
-*          to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j)
-*          must be greater than or equal to the 1-norm.
-*
-*          If NORMIN = 'N', CNORM is an output argument and CNORM(j)
-*          returns the 1-norm of the offdiagonal part of the j-th column
-*          of A.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -k, the k-th argument had an illegal value
-*
-*  Further Details
-*  ======= =======
-*
-*  A rough bound on x is computed; if that is less than overflow, DTRSV
-*  is called, otherwise, specific code is used which checks for possible
-*  overflow or divide-by-zero at every operation.
-*
-*  A columnwise scheme is used for solving A*x = b.  The basic algorithm
-*  if A is lower triangular is
-*
-*       x[1:n] := b[1:n]
-*       for j = 1, ..., n
-*            x(j) := x(j) / A(j,j)
-*            x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j]
-*       end
-*
-*  Define bounds on the components of x after j iterations of the loop:
-*     M(j) = bound on x[1:j]
-*     G(j) = bound on x[j+1:n]
-*  Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}.
-*
-*  Then for iteration j+1 we have
-*     M(j+1) <= G(j) / | A(j+1,j+1) |
-*     G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] |
-*            <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | )
-*
-*  where CNORM(j+1) is greater than or equal to the infinity-norm of
-*  column j+1 of A, not counting the diagonal.  Hence
-*
-*     G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | )
-*                  1<=i<=j
-*  and
-*
-*     |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| )
-*                                   1<=i< j
-*
-*  Since |x(j)| <= M(j), we use the Level 2 BLAS routine DTRSV if the
-*  reciprocal of the largest M(j), j=1,..,n, is larger than
-*  max(underflow, 1/overflow).
-*
-*  The bound on x(j) is also used to determine when a step in the
-*  columnwise method can be performed without fear of overflow.  If
-*  the computed bound is greater than a large constant, x is scaled to
-*  prevent overflow, but if the bound overflows, x is set to 0, x(j) to
-*  1, and scale to 0, and a non-trivial solution to A*x = 0 is found.
-*
-*  Similarly, a row-wise scheme is used to solve A'*x = b.  The basic
-*  algorithm for A upper triangular is
-*
-*       for j = 1, ..., n
-*            x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j)
-*       end
-*
-*  We simultaneously compute two bounds
-*       G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j
-*       M(j) = bound on x(i), 1<=i<=j
-*
-*  The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we
-*  add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1.
-*  Then the bound on x(j) is
-*
-*       M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) |
-*
-*            <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| )
-*                      1<=i<=j
-*
-*  and we can safely call DTRSV if 1/M(n) and 1/G(n) are both greater
-*  than max(underflow, 1/overflow).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, HALF, ONE
-      PARAMETER          ( ZERO = 0.0D+0, HALF = 0.5D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOTRAN, NOUNIT, UPPER
-      INTEGER            I, IMAX, J, JFIRST, JINC, JLAST
-      DOUBLE PRECISION   BIGNUM, GROW, REC, SMLNUM, SUMJ, TJJ, TJJS,
-     $                   TMAX, TSCAL, USCAL, XBND, XJ, XMAX
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DASUM, DDOT, DLAMCH
-      EXTERNAL           LSAME, IDAMAX, DASUM, DDOT, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DAXPY, DSCAL, DTRSV, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      NOUNIT = LSAME( DIAG, 'N' )
-*
-*     Test the input parameters.
-*
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
-     $         LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -3
-      ELSE IF( .NOT.LSAME( NORMIN, 'Y' ) .AND. .NOT.
-     $         LSAME( NORMIN, 'N' ) ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLATRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine machine dependent parameters to control overflow.
-*
-      SMLNUM = DLAMCH( 'Safe minimum' ) / DLAMCH( 'Precision' )
-      BIGNUM = ONE / SMLNUM
-      SCALE = ONE
-*
-      IF( LSAME( NORMIN, 'N' ) ) THEN
-*
-*        Compute the 1-norm of each column, not including the diagonal.
-*
-         IF( UPPER ) THEN
-*
-*           A is upper triangular.
-*
-            DO 10 J = 1, N
-               CNORM( J ) = DASUM( J-1, A( 1, J ), 1 )
-   10       CONTINUE
-         ELSE
-*
-*           A is lower triangular.
-*
-            DO 20 J = 1, N - 1
-               CNORM( J ) = DASUM( N-J, A( J+1, J ), 1 )
-   20       CONTINUE
-            CNORM( N ) = ZERO
-         END IF
-      END IF
-*
-*     Scale the column norms by TSCAL if the maximum element in CNORM is
-*     greater than BIGNUM.
-*
-      IMAX = IDAMAX( N, CNORM, 1 )
-      TMAX = CNORM( IMAX )
-      IF( TMAX.LE.BIGNUM ) THEN
-         TSCAL = ONE
-      ELSE
-         TSCAL = ONE / ( SMLNUM*TMAX )
-         CALL DSCAL( N, TSCAL, CNORM, 1 )
-      END IF
-*
-*     Compute a bound on the computed solution vector to see if the
-*     Level 2 BLAS routine DTRSV can be used.
-*
-      J = IDAMAX( N, X, 1 )
-      XMAX = ABS( X( J ) )
-      XBND = XMAX
-      IF( NOTRAN ) THEN
-*
-*        Compute the growth in A * x = b.
-*
-         IF( UPPER ) THEN
-            JFIRST = N
-            JLAST = 1
-            JINC = -1
-         ELSE
-            JFIRST = 1
-            JLAST = N
-            JINC = 1
-         END IF
-*
-         IF( TSCAL.NE.ONE ) THEN
-            GROW = ZERO
-            GO TO 50
-         END IF
-*
-         IF( NOUNIT ) THEN
-*
-*           A is non-unit triangular.
-*
-*           Compute GROW = 1/G(j) and XBND = 1/M(j).
-*           Initially, G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = ONE / MAX( XBND, SMLNUM )
-            XBND = GROW
-            DO 30 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 50
-*
-*              M(j) = G(j-1) / abs(A(j,j))
-*
-               TJJ = ABS( A( J, J ) )
-               XBND = MIN( XBND, MIN( ONE, TJJ )*GROW )
-               IF( TJJ+CNORM( J ).GE.SMLNUM ) THEN
-*
-*                 G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) )
-*
-                  GROW = GROW*( TJJ / ( TJJ+CNORM( J ) ) )
-               ELSE
-*
-*                 G(j) could overflow, set GROW to 0.
-*
-                  GROW = ZERO
-               END IF
-   30       CONTINUE
-            GROW = XBND
-         ELSE
-*
-*           A is unit triangular.
-*
-*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) )
-            DO 40 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 50
-*
-*              G(j) = G(j-1)*( 1 + CNORM(j) )
-*
-               GROW = GROW*( ONE / ( ONE+CNORM( J ) ) )
-   40       CONTINUE
-         END IF
-   50    CONTINUE
-*
-      ELSE
-*
-*        Compute the growth in A' * x = b.
-*
-         IF( UPPER ) THEN
-            JFIRST = 1
-            JLAST = N
-            JINC = 1
-         ELSE
-            JFIRST = N
-            JLAST = 1
-            JINC = -1
-         END IF
-*
-         IF( TSCAL.NE.ONE ) THEN
-            GROW = ZERO
-            GO TO 80
-         END IF
-*
-         IF( NOUNIT ) THEN
-*
-*           A is non-unit triangular.
-*
-*           Compute GROW = 1/G(j) and XBND = 1/M(j).
-*           Initially, M(0) = max{x(i), i=1,...,n}.
-*
-            GROW = ONE / MAX( XBND, SMLNUM )
-            XBND = GROW
-            DO 60 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 80
-*
-*              G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) )
-*
-               XJ = ONE + CNORM( J )
-               GROW = MIN( GROW, XBND / XJ )
-*
-*              M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j))
-*
-               TJJ = ABS( A( J, J ) )
-               IF( XJ.GT.TJJ )
-     $            XBND = XBND*( TJJ / XJ )
-   60       CONTINUE
-            GROW = MIN( GROW, XBND )
-         ELSE
-*
-*           A is unit triangular.
-*
-*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) )
-            DO 70 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 80
-*
-*              G(j) = ( 1 + CNORM(j) )*G(j-1)
-*
-               XJ = ONE + CNORM( J )
-               GROW = GROW / XJ
-   70       CONTINUE
-         END IF
-   80    CONTINUE
-      END IF
-*
-      IF( ( GROW*TSCAL ).GT.SMLNUM ) THEN
-*
-*        Use the Level 2 BLAS solve if the reciprocal of the bound on
-*        elements of X is not too small.
-*
-         CALL DTRSV( UPLO, TRANS, DIAG, N, A, LDA, X, 1 )
-      ELSE
-*
-*        Use a Level 1 BLAS solve, scaling intermediate results.
-*
-         IF( XMAX.GT.BIGNUM ) THEN
-*
-*           Scale X so that its components are less than or equal to
-*           BIGNUM in absolute value.
-*
-            SCALE = BIGNUM / XMAX
-            CALL DSCAL( N, SCALE, X, 1 )
-            XMAX = BIGNUM
-         END IF
-*
-         IF( NOTRAN ) THEN
-*
-*           Solve A * x = b
-*
-            DO 110 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) / A(j,j), scaling x if necessary.
-*
-               XJ = ABS( X( J ) )
-               IF( NOUNIT ) THEN
-                  TJJS = A( J, J )*TSCAL
-               ELSE
-                  TJJS = TSCAL
-                  IF( TSCAL.EQ.ONE )
-     $               GO TO 100
-               END IF
-               TJJ = ABS( TJJS )
-               IF( TJJ.GT.SMLNUM ) THEN
-*
-*                    abs(A(j,j)) > SMLNUM:
-*
-                  IF( TJJ.LT.ONE ) THEN
-                     IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by 1/b(j).
-*
-                        REC = ONE / XJ
-                        CALL DSCAL( N, REC, X, 1 )
-                        SCALE = SCALE*REC
-                        XMAX = XMAX*REC
-                     END IF
-                  END IF
-                  X( J ) = X( J ) / TJJS
-                  XJ = ABS( X( J ) )
-               ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                    0 < abs(A(j,j)) <= SMLNUM:
-*
-                  IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                       Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM
-*                       to avoid overflow when dividing by A(j,j).
-*
-                     REC = ( TJJ*BIGNUM ) / XJ
-                     IF( CNORM( J ).GT.ONE ) THEN
-*
-*                          Scale by 1/CNORM(j) to avoid overflow when
-*                          multiplying x(j) times column j.
-*
-                        REC = REC / CNORM( J )
-                     END IF
-                     CALL DSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                     XMAX = XMAX*REC
-                  END IF
-                  X( J ) = X( J ) / TJJS
-                  XJ = ABS( X( J ) )
-               ELSE
-*
-*                    A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                    scale = 0, and compute a solution to A*x = 0.
-*
-                  DO 90 I = 1, N
-                     X( I ) = ZERO
-   90             CONTINUE
-                  X( J ) = ONE
-                  XJ = ONE
-                  SCALE = ZERO
-                  XMAX = ZERO
-               END IF
-  100          CONTINUE
-*
-*              Scale x if necessary to avoid overflow when adding a
-*              multiple of column j of A.
-*
-               IF( XJ.GT.ONE ) THEN
-                  REC = ONE / XJ
-                  IF( CNORM( J ).GT.( BIGNUM-XMAX )*REC ) THEN
-*
-*                    Scale x by 1/(2*abs(x(j))).
-*
-                     REC = REC*HALF
-                     CALL DSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                  END IF
-               ELSE IF( XJ*CNORM( J ).GT.( BIGNUM-XMAX ) ) THEN
-*
-*                 Scale x by 1/2.
-*
-                  CALL DSCAL( N, HALF, X, 1 )
-                  SCALE = SCALE*HALF
-               END IF
-*
-               IF( UPPER ) THEN
-                  IF( J.GT.1 ) THEN
-*
-*                    Compute the update
-*                       x(1:j-1) := x(1:j-1) - x(j) * A(1:j-1,j)
-*
-                     CALL DAXPY( J-1, -X( J )*TSCAL, A( 1, J ), 1, X,
-     $                           1 )
-                     I = IDAMAX( J-1, X, 1 )
-                     XMAX = ABS( X( I ) )
-                  END IF
-               ELSE
-                  IF( J.LT.N ) THEN
-*
-*                    Compute the update
-*                       x(j+1:n) := x(j+1:n) - x(j) * A(j+1:n,j)
-*
-                     CALL DAXPY( N-J, -X( J )*TSCAL, A( J+1, J ), 1,
-     $                           X( J+1 ), 1 )
-                     I = J + IDAMAX( N-J, X( J+1 ), 1 )
-                     XMAX = ABS( X( I ) )
-                  END IF
-               END IF
-  110       CONTINUE
-*
-         ELSE
-*
-*           Solve A' * x = b
-*
-            DO 160 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) - sum A(k,j)*x(k).
-*                                    k<>j
-*
-               XJ = ABS( X( J ) )
-               USCAL = TSCAL
-               REC = ONE / MAX( XMAX, ONE )
-               IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN
-*
-*                 If x(j) could overflow, scale x by 1/(2*XMAX).
-*
-                  REC = REC*HALF
-                  IF( NOUNIT ) THEN
-                     TJJS = A( J, J )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                  END IF
-                  TJJ = ABS( TJJS )
-                  IF( TJJ.GT.ONE ) THEN
-*
-*                       Divide by A(j,j) when scaling x if A(j,j) > 1.
-*
-                     REC = MIN( ONE, REC*TJJ )
-                     USCAL = USCAL / TJJS
-                  END IF
-                  IF( REC.LT.ONE ) THEN
-                     CALL DSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                     XMAX = XMAX*REC
-                  END IF
-               END IF
-*
-               SUMJ = ZERO
-               IF( USCAL.EQ.ONE ) THEN
-*
-*                 If the scaling needed for A in the dot product is 1,
-*                 call DDOT to perform the dot product.
-*
-                  IF( UPPER ) THEN
-                     SUMJ = DDOT( J-1, A( 1, J ), 1, X, 1 )
-                  ELSE IF( J.LT.N ) THEN
-                     SUMJ = DDOT( N-J, A( J+1, J ), 1, X( J+1 ), 1 )
-                  END IF
-               ELSE
-*
-*                 Otherwise, use in-line code for the dot product.
-*
-                  IF( UPPER ) THEN
-                     DO 120 I = 1, J - 1
-                        SUMJ = SUMJ + ( A( I, J )*USCAL )*X( I )
-  120                CONTINUE
-                  ELSE IF( J.LT.N ) THEN
-                     DO 130 I = J + 1, N
-                        SUMJ = SUMJ + ( A( I, J )*USCAL )*X( I )
-  130                CONTINUE
-                  END IF
-               END IF
-*
-               IF( USCAL.EQ.TSCAL ) THEN
-*
-*                 Compute x(j) := ( x(j) - sumj ) / A(j,j) if 1/A(j,j)
-*                 was not used to scale the dotproduct.
-*
-                  X( J ) = X( J ) - SUMJ
-                  XJ = ABS( X( J ) )
-                  IF( NOUNIT ) THEN
-                     TJJS = A( J, J )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                     IF( TSCAL.EQ.ONE )
-     $                  GO TO 150
-                  END IF
-*
-*                    Compute x(j) = x(j) / A(j,j), scaling if necessary.
-*
-                  TJJ = ABS( TJJS )
-                  IF( TJJ.GT.SMLNUM ) THEN
-*
-*                       abs(A(j,j)) > SMLNUM:
-*
-                     IF( TJJ.LT.ONE ) THEN
-                        IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                             Scale X by 1/abs(x(j)).
-*
-                           REC = ONE / XJ
-                           CALL DSCAL( N, REC, X, 1 )
-                           SCALE = SCALE*REC
-                           XMAX = XMAX*REC
-                        END IF
-                     END IF
-                     X( J ) = X( J ) / TJJS
-                  ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                       0 < abs(A(j,j)) <= SMLNUM:
-*
-                     IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM.
-*
-                        REC = ( TJJ*BIGNUM ) / XJ
-                        CALL DSCAL( N, REC, X, 1 )
-                        SCALE = SCALE*REC
-                        XMAX = XMAX*REC
-                     END IF
-                     X( J ) = X( J ) / TJJS
-                  ELSE
-*
-*                       A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                       scale = 0, and compute a solution to A'*x = 0.
-*
-                     DO 140 I = 1, N
-                        X( I ) = ZERO
-  140                CONTINUE
-                     X( J ) = ONE
-                     SCALE = ZERO
-                     XMAX = ZERO
-                  END IF
-  150             CONTINUE
-               ELSE
-*
-*                 Compute x(j) := x(j) / A(j,j)  - sumj if the dot
-*                 product has already been divided by 1/A(j,j).
-*
-                  X( J ) = X( J ) / TJJS - SUMJ
-               END IF
-               XMAX = MAX( XMAX, ABS( X( J ) ) )
-  160       CONTINUE
-         END IF
-         SCALE = SCALE / TSCAL
-      END IF
-*
-*     Scale the column norms by 1/TSCAL for return.
-*
-      IF( TSCAL.NE.ONE ) THEN
-         CALL DSCAL( N, ONE / TSCAL, CNORM, 1 )
-      END IF
-*
-      RETURN
-*
-*     End of DLATRS
-*
-      END
--- a/libcruft/lapack/dlatrz.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,127 +0,0 @@
-      SUBROUTINE DLATRZ( M, N, L, A, LDA, TAU, WORK )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            L, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLATRZ factors the M-by-(M+L) real upper trapezoidal matrix
-*  [ A1 A2 ] = [ A(1:M,1:M) A(1:M,N-L+1:N) ] as ( R  0 ) * Z, by means
-*  of orthogonal transformations.  Z is an (M+L)-by-(M+L) orthogonal
-*  matrix and, R and A1 are M-by-M upper triangular matrices.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  L       (input) INTEGER
-*          The number of columns of the matrix A containing the
-*          meaningful part of the Householder vectors. N-M >= L >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the leading M-by-N upper trapezoidal part of the
-*          array A must contain the matrix to be factorized.
-*          On exit, the leading M-by-M upper triangular part of A
-*          contains the upper triangular matrix R, and elements N-L+1 to
-*          N of the first M rows of A, with the array TAU, represent the
-*          orthogonal matrix Z as a product of M elementary reflectors.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) DOUBLE PRECISION array, dimension (M)
-*          The scalar factors of the elementary reflectors.
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (M)
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  The factorization is obtained by Householder's method.  The kth
-*  transformation matrix, Z( k ), which is used to introduce zeros into
-*  the ( m - k + 1 )th row of A, is given in the form
-*
-*     Z( k ) = ( I     0   ),
-*              ( 0  T( k ) )
-*
-*  where
-*
-*     T( k ) = I - tau*u( k )*u( k )',   u( k ) = (   1    ),
-*                                                 (   0    )
-*                                                 ( z( k ) )
-*
-*  tau is a scalar and z( k ) is an l element vector. tau and z( k )
-*  are chosen to annihilate the elements of the kth row of A2.
-*
-*  The scalar tau is returned in the kth element of TAU and the vector
-*  u( k ) in the kth row of A2, such that the elements of z( k ) are
-*  in  a( k, l + 1 ), ..., a( k, n ). The elements of R are returned in
-*  the upper triangular part of A1.
-*
-*  Z is given by
-*
-*     Z =  Z( 1 ) * Z( 2 ) * ... * Z( m ).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARFG, DLARZ
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 ) THEN
-         RETURN
-      ELSE IF( M.EQ.N ) THEN
-         DO 10 I = 1, N
-            TAU( I ) = ZERO
-   10    CONTINUE
-         RETURN
-      END IF
-*
-      DO 20 I = M, 1, -1
-*
-*        Generate elementary reflector H(i) to annihilate
-*        [ A(i,i) A(i,n-l+1:n) ]
-*
-         CALL DLARFG( L+1, A( I, I ), A( I, N-L+1 ), LDA, TAU( I ) )
-*
-*        Apply H(i) to A(1:i-1,i:n) from the right
-*
-         CALL DLARZ( 'Right', I-1, N-I+1, L, A( I, N-L+1 ), LDA,
-     $               TAU( I ), A( 1, I ), LDA, WORK )
-*
-   20 CONTINUE
-*
-      RETURN
-*
-*     End of DLATRZ
-*
-      END
--- a/libcruft/lapack/dlauu2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,135 +0,0 @@
-      SUBROUTINE DLAUU2( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAUU2 computes the product U * U' or L' * L, where the triangular
-*  factor U or L is stored in the upper or lower triangular part of
-*  the array A.
-*
-*  If UPLO = 'U' or 'u' then the upper triangle of the result is stored,
-*  overwriting the factor U in A.
-*  If UPLO = 'L' or 'l' then the lower triangle of the result is stored,
-*  overwriting the factor L in A.
-*
-*  This is the unblocked form of the algorithm, calling Level 2 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the triangular factor stored in the array A
-*          is upper or lower triangular:
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the triangular factor U or L.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the triangular factor U or L.
-*          On exit, if UPLO = 'U', the upper triangle of A is
-*          overwritten with the upper triangle of the product U * U';
-*          if UPLO = 'L', the lower triangle of A is overwritten with
-*          the lower triangle of the product L' * L.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            I
-      DOUBLE PRECISION   AII
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   DDOT
-      EXTERNAL           LSAME, DDOT
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMV, DSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLAUU2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Compute the product U * U'.
-*
-         DO 10 I = 1, N
-            AII = A( I, I )
-            IF( I.LT.N ) THEN
-               A( I, I ) = DDOT( N-I+1, A( I, I ), LDA, A( I, I ), LDA )
-               CALL DGEMV( 'No transpose', I-1, N-I, ONE, A( 1, I+1 ),
-     $                     LDA, A( I, I+1 ), LDA, AII, A( 1, I ), 1 )
-            ELSE
-               CALL DSCAL( I, AII, A( 1, I ), 1 )
-            END IF
-   10    CONTINUE
-*
-      ELSE
-*
-*        Compute the product L' * L.
-*
-         DO 20 I = 1, N
-            AII = A( I, I )
-            IF( I.LT.N ) THEN
-               A( I, I ) = DDOT( N-I+1, A( I, I ), 1, A( I, I ), 1 )
-               CALL DGEMV( 'Transpose', N-I, I-1, ONE, A( I+1, 1 ), LDA,
-     $                     A( I+1, I ), 1, AII, A( I, 1 ), LDA )
-            ELSE
-               CALL DSCAL( I, AII, A( I, 1 ), LDA )
-            END IF
-   20    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of DLAUU2
-*
-      END
--- a/libcruft/lapack/dlauum.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,155 +0,0 @@
-      SUBROUTINE DLAUUM( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAUUM computes the product U * U' or L' * L, where the triangular
-*  factor U or L is stored in the upper or lower triangular part of
-*  the array A.
-*
-*  If UPLO = 'U' or 'u' then the upper triangle of the result is stored,
-*  overwriting the factor U in A.
-*  If UPLO = 'L' or 'l' then the lower triangle of the result is stored,
-*  overwriting the factor L in A.
-*
-*  This is the blocked form of the algorithm, calling Level 3 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the triangular factor stored in the array A
-*          is upper or lower triangular:
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the triangular factor U or L.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the triangular factor U or L.
-*          On exit, if UPLO = 'U', the upper triangle of A is
-*          overwritten with the upper triangle of the product U * U';
-*          if UPLO = 'L', the lower triangle of A is overwritten with
-*          the lower triangle of the product L' * L.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            I, IB, NB
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMM, DLAUU2, DSYRK, DTRMM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DLAUUM', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'DLAUUM', UPLO, N, -1, -1, -1 )
-*
-      IF( NB.LE.1 .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code
-*
-         CALL DLAUU2( UPLO, N, A, LDA, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( UPPER ) THEN
-*
-*           Compute the product U * U'.
-*
-            DO 10 I = 1, N, NB
-               IB = MIN( NB, N-I+1 )
-               CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Non-unit',
-     $                     I-1, IB, ONE, A( I, I ), LDA, A( 1, I ),
-     $                     LDA )
-               CALL DLAUU2( 'Upper', IB, A( I, I ), LDA, INFO )
-               IF( I+IB.LE.N ) THEN
-                  CALL DGEMM( 'No transpose', 'Transpose', I-1, IB,
-     $                        N-I-IB+1, ONE, A( 1, I+IB ), LDA,
-     $                        A( I, I+IB ), LDA, ONE, A( 1, I ), LDA )
-                  CALL DSYRK( 'Upper', 'No transpose', IB, N-I-IB+1,
-     $                        ONE, A( I, I+IB ), LDA, ONE, A( I, I ),
-     $                        LDA )
-               END IF
-   10       CONTINUE
-         ELSE
-*
-*           Compute the product L' * L.
-*
-            DO 20 I = 1, N, NB
-               IB = MIN( NB, N-I+1 )
-               CALL DTRMM( 'Left', 'Lower', 'Transpose', 'Non-unit', IB,
-     $                     I-1, ONE, A( I, I ), LDA, A( I, 1 ), LDA )
-               CALL DLAUU2( 'Lower', IB, A( I, I ), LDA, INFO )
-               IF( I+IB.LE.N ) THEN
-                  CALL DGEMM( 'Transpose', 'No transpose', IB, I-1,
-     $                        N-I-IB+1, ONE, A( I+IB, I ), LDA,
-     $                        A( I+IB, 1 ), LDA, ONE, A( I, 1 ), LDA )
-                  CALL DSYRK( 'Lower', 'Transpose', IB, N-I-IB+1, ONE,
-     $                        A( I+IB, I ), LDA, ONE, A( I, I ), LDA )
-               END IF
-   20       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DLAUUM
-*
-      END
--- a/libcruft/lapack/dlazq3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,302 +0,0 @@
-      SUBROUTINE DLAZQ3( I0, N0, Z, PP, DMIN, SIGMA, DESIG, QMAX, NFAIL,
-     $                   ITER, NDIV, IEEE, TTYPE, DMIN1, DMIN2, DN, DN1,
-     $                   DN2, TAU )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            IEEE
-      INTEGER            I0, ITER, N0, NDIV, NFAIL, PP, TTYPE
-      DOUBLE PRECISION   DESIG, DMIN, DMIN1, DMIN2, DN, DN1, DN2, QMAX,
-     $                   SIGMA, TAU
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAZQ3 checks for deflation, computes a shift (TAU) and calls dqds.
-*  In case of failure it changes shifts, and tries again until output
-*  is positive.
-*
-*  Arguments
-*  =========
-*
-*  I0     (input) INTEGER
-*         First index.
-*
-*  N0     (input) INTEGER
-*         Last index.
-*
-*  Z      (input) DOUBLE PRECISION array, dimension ( 4*N )
-*         Z holds the qd array.
-*
-*  PP     (input) INTEGER
-*         PP=0 for ping, PP=1 for pong.
-*
-*  DMIN   (output) DOUBLE PRECISION
-*         Minimum value of d.
-*
-*  SIGMA  (output) DOUBLE PRECISION
-*         Sum of shifts used in current segment.
-*
-*  DESIG  (input/output) DOUBLE PRECISION
-*         Lower order part of SIGMA
-*
-*  QMAX   (input) DOUBLE PRECISION
-*         Maximum value of q.
-*
-*  NFAIL  (output) INTEGER
-*         Number of times shift was too big.
-*
-*  ITER   (output) INTEGER
-*         Number of iterations.
-*
-*  NDIV   (output) INTEGER
-*         Number of divisions.
-*
-*  IEEE   (input) LOGICAL
-*         Flag for IEEE or non IEEE arithmetic (passed to DLASQ5).
-*
-*  TTYPE  (input/output) INTEGER
-*         Shift type.  TTYPE is passed as an argument in order to save
-*         its value between calls to DLAZQ3
-*
-*  DMIN1  (input/output) REAL
-*  DMIN2  (input/output) REAL
-*  DN     (input/output) REAL
-*  DN1    (input/output) REAL
-*  DN2    (input/output) REAL
-*  TAU    (input/output) REAL
-*         These are passed as arguments in order to save their values
-*         between calls to DLAZQ3
-*
-*  This is a thread safe version of DLASQ3, which passes TTYPE, DMIN1,
-*  DMIN2, DN, DN1. DN2 and TAU through the argument list in place of
-*  declaring them in a SAVE statment.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   CBIAS
-      PARAMETER          ( CBIAS = 1.50D0 )
-      DOUBLE PRECISION   ZERO, QURTR, HALF, ONE, TWO, HUNDRD
-      PARAMETER          ( ZERO = 0.0D0, QURTR = 0.250D0, HALF = 0.5D0,
-     $                     ONE = 1.0D0, TWO = 2.0D0, HUNDRD = 100.0D0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            IPN4, J4, N0IN, NN
-      DOUBLE PRECISION   EPS, G, S, SAFMIN, T, TEMP, TOL, TOL2
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLASQ5, DLASQ6, DLAZQ4
-*     ..
-*     .. External Function ..
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           DLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      N0IN   = N0
-      EPS    = DLAMCH( 'Precision' )
-      SAFMIN = DLAMCH( 'Safe minimum' )
-      TOL    = EPS*HUNDRD
-      TOL2   = TOL**2
-      G      = ZERO
-*
-*     Check for deflation.
-*
-   10 CONTINUE
-*
-      IF( N0.LT.I0 )
-     $   RETURN
-      IF( N0.EQ.I0 )
-     $   GO TO 20
-      NN = 4*N0 + PP
-      IF( N0.EQ.( I0+1 ) )
-     $   GO TO 40
-*
-*     Check whether E(N0-1) is negligible, 1 eigenvalue.
-*
-      IF( Z( NN-5 ).GT.TOL2*( SIGMA+Z( NN-3 ) ) .AND.
-     $    Z( NN-2*PP-4 ).GT.TOL2*Z( NN-7 ) )
-     $   GO TO 30
-*
-   20 CONTINUE
-*
-      Z( 4*N0-3 ) = Z( 4*N0+PP-3 ) + SIGMA
-      N0 = N0 - 1
-      GO TO 10
-*
-*     Check  whether E(N0-2) is negligible, 2 eigenvalues.
-*
-   30 CONTINUE
-*
-      IF( Z( NN-9 ).GT.TOL2*SIGMA .AND.
-     $    Z( NN-2*PP-8 ).GT.TOL2*Z( NN-11 ) )
-     $   GO TO 50
-*
-   40 CONTINUE
-*
-      IF( Z( NN-3 ).GT.Z( NN-7 ) ) THEN
-         S = Z( NN-3 )
-         Z( NN-3 ) = Z( NN-7 )
-         Z( NN-7 ) = S
-      END IF
-      IF( Z( NN-5 ).GT.Z( NN-3 )*TOL2 ) THEN
-         T = HALF*( ( Z( NN-7 )-Z( NN-3 ) )+Z( NN-5 ) )
-         S = Z( NN-3 )*( Z( NN-5 ) / T )
-         IF( S.LE.T ) THEN
-            S = Z( NN-3 )*( Z( NN-5 ) /
-     $          ( T*( ONE+SQRT( ONE+S / T ) ) ) )
-         ELSE
-            S = Z( NN-3 )*( Z( NN-5 ) / ( T+SQRT( T )*SQRT( T+S ) ) )
-         END IF
-         T = Z( NN-7 ) + ( S+Z( NN-5 ) )
-         Z( NN-3 ) = Z( NN-3 )*( Z( NN-7 ) / T )
-         Z( NN-7 ) = T
-      END IF
-      Z( 4*N0-7 ) = Z( NN-7 ) + SIGMA
-      Z( 4*N0-3 ) = Z( NN-3 ) + SIGMA
-      N0 = N0 - 2
-      GO TO 10
-*
-   50 CONTINUE
-*
-*     Reverse the qd-array, if warranted.
-*
-      IF( DMIN.LE.ZERO .OR. N0.LT.N0IN ) THEN
-         IF( CBIAS*Z( 4*I0+PP-3 ).LT.Z( 4*N0+PP-3 ) ) THEN
-            IPN4 = 4*( I0+N0 )
-            DO 60 J4 = 4*I0, 2*( I0+N0-1 ), 4
-               TEMP = Z( J4-3 )
-               Z( J4-3 ) = Z( IPN4-J4-3 )
-               Z( IPN4-J4-3 ) = TEMP
-               TEMP = Z( J4-2 )
-               Z( J4-2 ) = Z( IPN4-J4-2 )
-               Z( IPN4-J4-2 ) = TEMP
-               TEMP = Z( J4-1 )
-               Z( J4-1 ) = Z( IPN4-J4-5 )
-               Z( IPN4-J4-5 ) = TEMP
-               TEMP = Z( J4 )
-               Z( J4 ) = Z( IPN4-J4-4 )
-               Z( IPN4-J4-4 ) = TEMP
-   60       CONTINUE
-            IF( N0-I0.LE.4 ) THEN
-               Z( 4*N0+PP-1 ) = Z( 4*I0+PP-1 )
-               Z( 4*N0-PP ) = Z( 4*I0-PP )
-            END IF
-            DMIN2 = MIN( DMIN2, Z( 4*N0+PP-1 ) )
-            Z( 4*N0+PP-1 ) = MIN( Z( 4*N0+PP-1 ), Z( 4*I0+PP-1 ),
-     $                            Z( 4*I0+PP+3 ) )
-            Z( 4*N0-PP ) = MIN( Z( 4*N0-PP ), Z( 4*I0-PP ),
-     $                          Z( 4*I0-PP+4 ) )
-            QMAX = MAX( QMAX, Z( 4*I0+PP-3 ), Z( 4*I0+PP+1 ) )
-            DMIN = -ZERO
-         END IF
-      END IF
-*
-      IF( DMIN.LT.ZERO .OR. SAFMIN*QMAX.LT.MIN( Z( 4*N0+PP-1 ),
-     $    Z( 4*N0+PP-9 ), DMIN2+Z( 4*N0-PP ) ) ) THEN
-*
-*        Choose a shift.
-*
-         CALL DLAZQ4( I0, N0, Z, PP, N0IN, DMIN, DMIN1, DMIN2, DN, DN1,
-     $                DN2, TAU, TTYPE, G )
-*
-*        Call dqds until DMIN > 0.
-*
-   80    CONTINUE
-*
-         CALL DLASQ5( I0, N0, Z, PP, TAU, DMIN, DMIN1, DMIN2, DN,
-     $                DN1, DN2, IEEE )
-*
-         NDIV = NDIV + ( N0-I0+2 )
-         ITER = ITER + 1
-*
-*        Check status.
-*
-         IF( DMIN.GE.ZERO .AND. DMIN1.GT.ZERO ) THEN
-*
-*           Success.
-*
-            GO TO 100
-*
-         ELSE IF( DMIN.LT.ZERO .AND. DMIN1.GT.ZERO .AND.
-     $            Z( 4*( N0-1 )-PP ).LT.TOL*( SIGMA+DN1 ) .AND.
-     $            ABS( DN ).LT.TOL*SIGMA ) THEN
-*
-*           Convergence hidden by negative DN.
-*
-            Z( 4*( N0-1 )-PP+2 ) = ZERO
-            DMIN = ZERO
-            GO TO 100
-         ELSE IF( DMIN.LT.ZERO ) THEN
-*
-*           TAU too big. Select new TAU and try again.
-*
-            NFAIL = NFAIL + 1
-            IF( TTYPE.LT.-22 ) THEN
-*
-*              Failed twice. Play it safe.
-*
-               TAU = ZERO
-            ELSE IF( DMIN1.GT.ZERO ) THEN
-*
-*              Late failure. Gives excellent shift.
-*
-               TAU = ( TAU+DMIN )*( ONE-TWO*EPS )
-               TTYPE = TTYPE - 11
-            ELSE
-*
-*              Early failure. Divide by 4.
-*
-               TAU = QURTR*TAU
-               TTYPE = TTYPE - 12
-            END IF
-            GO TO 80
-         ELSE IF( DMIN.NE.DMIN ) THEN
-*
-*           NaN.
-*
-            TAU = ZERO
-            GO TO 80
-         ELSE
-*
-*           Possible underflow. Play it safe.
-*
-            GO TO 90
-         END IF
-      END IF
-*
-*     Risk of underflow.
-*
-   90 CONTINUE
-      CALL DLASQ6( I0, N0, Z, PP, DMIN, DMIN1, DMIN2, DN, DN1, DN2 )
-      NDIV = NDIV + ( N0-I0+2 )
-      ITER = ITER + 1
-      TAU = ZERO
-*
-  100 CONTINUE
-      IF( TAU.LT.SIGMA ) THEN
-         DESIG = DESIG + TAU
-         T = SIGMA + DESIG
-         DESIG = DESIG - ( T-SIGMA )
-      ELSE
-         T = SIGMA + TAU
-         DESIG = SIGMA - ( T-TAU ) + DESIG
-      END IF
-      SIGMA = T
-*
-      RETURN
-*
-*     End of DLAZQ3
-*
-      END
--- a/libcruft/lapack/dlazq4.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,330 +0,0 @@
-      SUBROUTINE DLAZQ4( I0, N0, Z, PP, N0IN, DMIN, DMIN1, DMIN2, DN,
-     $                   DN1, DN2, TAU, TTYPE, G )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            I0, N0, N0IN, PP, TTYPE
-      DOUBLE PRECISION   DMIN, DMIN1, DMIN2, DN, DN1, DN2, G, TAU
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DLAZQ4 computes an approximation TAU to the smallest eigenvalue 
-*  using values of d from the previous transform.
-*
-*  I0    (input) INTEGER
-*        First index.
-*
-*  N0    (input) INTEGER
-*        Last index.
-*
-*  Z     (input) DOUBLE PRECISION array, dimension ( 4*N )
-*        Z holds the qd array.
-*
-*  PP    (input) INTEGER
-*        PP=0 for ping, PP=1 for pong.
-*
-*  N0IN  (input) INTEGER
-*        The value of N0 at start of EIGTEST.
-*
-*  DMIN  (input) DOUBLE PRECISION
-*        Minimum value of d.
-*
-*  DMIN1 (input) DOUBLE PRECISION
-*        Minimum value of d, excluding D( N0 ).
-*
-*  DMIN2 (input) DOUBLE PRECISION
-*        Minimum value of d, excluding D( N0 ) and D( N0-1 ).
-*
-*  DN    (input) DOUBLE PRECISION
-*        d(N)
-*
-*  DN1   (input) DOUBLE PRECISION
-*        d(N-1)
-*
-*  DN2   (input) DOUBLE PRECISION
-*        d(N-2)
-*
-*  TAU   (output) DOUBLE PRECISION
-*        This is the shift.
-*
-*  TTYPE (output) INTEGER
-*        Shift type.
-*
-*  G     (input/output) DOUBLE PRECISION
-*        G is passed as an argument in order to save its value between
-*        calls to DLAZQ4
-*
-*  Further Details
-*  ===============
-*  CNST1 = 9/16
-*
-*  This is a thread safe version of DLASQ4, which passes G through the
-*  argument list in place of declaring G in a SAVE statment.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   CNST1, CNST2, CNST3
-      PARAMETER          ( CNST1 = 0.5630D0, CNST2 = 1.010D0,
-     $                   CNST3 = 1.050D0 )
-      DOUBLE PRECISION   QURTR, THIRD, HALF, ZERO, ONE, TWO, HUNDRD
-      PARAMETER          ( QURTR = 0.250D0, THIRD = 0.3330D0,
-     $                   HALF = 0.50D0, ZERO = 0.0D0, ONE = 1.0D0,
-     $                   TWO = 2.0D0, HUNDRD = 100.0D0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I4, NN, NP
-      DOUBLE PRECISION   A2, B1, B2, GAM, GAP1, GAP2, S
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     A negative DMIN forces the shift to take that absolute value
-*     TTYPE records the type of shift.
-*
-      IF( DMIN.LE.ZERO ) THEN
-         TAU = -DMIN
-         TTYPE = -1
-         RETURN
-      END IF
-*       
-      NN = 4*N0 + PP
-      IF( N0IN.EQ.N0 ) THEN
-*
-*        No eigenvalues deflated.
-*
-         IF( DMIN.EQ.DN .OR. DMIN.EQ.DN1 ) THEN
-*
-            B1 = SQRT( Z( NN-3 ) )*SQRT( Z( NN-5 ) )
-            B2 = SQRT( Z( NN-7 ) )*SQRT( Z( NN-9 ) )
-            A2 = Z( NN-7 ) + Z( NN-5 )
-*
-*           Cases 2 and 3.
-*
-            IF( DMIN.EQ.DN .AND. DMIN1.EQ.DN1 ) THEN
-               GAP2 = DMIN2 - A2 - DMIN2*QURTR
-               IF( GAP2.GT.ZERO .AND. GAP2.GT.B2 ) THEN
-                  GAP1 = A2 - DN - ( B2 / GAP2 )*B2
-               ELSE
-                  GAP1 = A2 - DN - ( B1+B2 )
-               END IF
-               IF( GAP1.GT.ZERO .AND. GAP1.GT.B1 ) THEN
-                  S = MAX( DN-( B1 / GAP1 )*B1, HALF*DMIN )
-                  TTYPE = -2
-               ELSE
-                  S = ZERO
-                  IF( DN.GT.B1 )
-     $               S = DN - B1
-                  IF( A2.GT.( B1+B2 ) )
-     $               S = MIN( S, A2-( B1+B2 ) )
-                  S = MAX( S, THIRD*DMIN )
-                  TTYPE = -3
-               END IF
-            ELSE
-*
-*              Case 4.
-*
-               TTYPE = -4
-               S = QURTR*DMIN
-               IF( DMIN.EQ.DN ) THEN
-                  GAM = DN
-                  A2 = ZERO
-                  IF( Z( NN-5 ) .GT. Z( NN-7 ) )
-     $               RETURN
-                  B2 = Z( NN-5 ) / Z( NN-7 )
-                  NP = NN - 9
-               ELSE
-                  NP = NN - 2*PP
-                  B2 = Z( NP-2 )
-                  GAM = DN1
-                  IF( Z( NP-4 ) .GT. Z( NP-2 ) )
-     $               RETURN
-                  A2 = Z( NP-4 ) / Z( NP-2 )
-                  IF( Z( NN-9 ) .GT. Z( NN-11 ) )
-     $               RETURN
-                  B2 = Z( NN-9 ) / Z( NN-11 )
-                  NP = NN - 13
-               END IF
-*
-*              Approximate contribution to norm squared from I < NN-1.
-*
-               A2 = A2 + B2
-               DO 10 I4 = NP, 4*I0 - 1 + PP, -4
-                  IF( B2.EQ.ZERO )
-     $               GO TO 20
-                  B1 = B2
-                  IF( Z( I4 ) .GT. Z( I4-2 ) )
-     $               RETURN
-                  B2 = B2*( Z( I4 ) / Z( I4-2 ) )
-                  A2 = A2 + B2
-                  IF( HUNDRD*MAX( B2, B1 ).LT.A2 .OR. CNST1.LT.A2 ) 
-     $               GO TO 20
-   10          CONTINUE
-   20          CONTINUE
-               A2 = CNST3*A2
-*
-*              Rayleigh quotient residual bound.
-*
-               IF( A2.LT.CNST1 )
-     $            S = GAM*( ONE-SQRT( A2 ) ) / ( ONE+A2 )
-            END IF
-         ELSE IF( DMIN.EQ.DN2 ) THEN
-*
-*           Case 5.
-*
-            TTYPE = -5
-            S = QURTR*DMIN
-*
-*           Compute contribution to norm squared from I > NN-2.
-*
-            NP = NN - 2*PP
-            B1 = Z( NP-2 )
-            B2 = Z( NP-6 )
-            GAM = DN2
-            IF( Z( NP-8 ).GT.B2 .OR. Z( NP-4 ).GT.B1 )
-     $         RETURN
-            A2 = ( Z( NP-8 ) / B2 )*( ONE+Z( NP-4 ) / B1 )
-*
-*           Approximate contribution to norm squared from I < NN-2.
-*
-            IF( N0-I0.GT.2 ) THEN
-               B2 = Z( NN-13 ) / Z( NN-15 )
-               A2 = A2 + B2
-               DO 30 I4 = NN - 17, 4*I0 - 1 + PP, -4
-                  IF( B2.EQ.ZERO )
-     $               GO TO 40
-                  B1 = B2
-                  IF( Z( I4 ) .GT. Z( I4-2 ) )
-     $               RETURN
-                  B2 = B2*( Z( I4 ) / Z( I4-2 ) )
-                  A2 = A2 + B2
-                  IF( HUNDRD*MAX( B2, B1 ).LT.A2 .OR. CNST1.LT.A2 ) 
-     $               GO TO 40
-   30          CONTINUE
-   40          CONTINUE
-               A2 = CNST3*A2
-            END IF
-*
-            IF( A2.LT.CNST1 )
-     $         S = GAM*( ONE-SQRT( A2 ) ) / ( ONE+A2 )
-         ELSE
-*
-*           Case 6, no information to guide us.
-*
-            IF( TTYPE.EQ.-6 ) THEN
-               G = G + THIRD*( ONE-G )
-            ELSE IF( TTYPE.EQ.-18 ) THEN
-               G = QURTR*THIRD
-            ELSE
-               G = QURTR
-            END IF
-            S = G*DMIN
-            TTYPE = -6
-         END IF
-*
-      ELSE IF( N0IN.EQ.( N0+1 ) ) THEN
-*
-*        One eigenvalue just deflated. Use DMIN1, DN1 for DMIN and DN.
-*
-         IF( DMIN1.EQ.DN1 .AND. DMIN2.EQ.DN2 ) THEN 
-*
-*           Cases 7 and 8.
-*
-            TTYPE = -7
-            S = THIRD*DMIN1
-            IF( Z( NN-5 ).GT.Z( NN-7 ) )
-     $         RETURN
-            B1 = Z( NN-5 ) / Z( NN-7 )
-            B2 = B1
-            IF( B2.EQ.ZERO )
-     $         GO TO 60
-            DO 50 I4 = 4*N0 - 9 + PP, 4*I0 - 1 + PP, -4
-               A2 = B1
-               IF( Z( I4 ).GT.Z( I4-2 ) )
-     $            RETURN
-               B1 = B1*( Z( I4 ) / Z( I4-2 ) )
-               B2 = B2 + B1
-               IF( HUNDRD*MAX( B1, A2 ).LT.B2 ) 
-     $            GO TO 60
-   50       CONTINUE
-   60       CONTINUE
-            B2 = SQRT( CNST3*B2 )
-            A2 = DMIN1 / ( ONE+B2**2 )
-            GAP2 = HALF*DMIN2 - A2
-            IF( GAP2.GT.ZERO .AND. GAP2.GT.B2*A2 ) THEN
-               S = MAX( S, A2*( ONE-CNST2*A2*( B2 / GAP2 )*B2 ) )
-            ELSE 
-               S = MAX( S, A2*( ONE-CNST2*B2 ) )
-               TTYPE = -8
-            END IF
-         ELSE
-*
-*           Case 9.
-*
-            S = QURTR*DMIN1
-            IF( DMIN1.EQ.DN1 )
-     $         S = HALF*DMIN1
-            TTYPE = -9
-         END IF
-*
-      ELSE IF( N0IN.EQ.( N0+2 ) ) THEN
-*
-*        Two eigenvalues deflated. Use DMIN2, DN2 for DMIN and DN.
-*
-*        Cases 10 and 11.
-*
-         IF( DMIN2.EQ.DN2 .AND. TWO*Z( NN-5 ).LT.Z( NN-7 ) ) THEN 
-            TTYPE = -10
-            S = THIRD*DMIN2
-            IF( Z( NN-5 ).GT.Z( NN-7 ) )
-     $         RETURN
-            B1 = Z( NN-5 ) / Z( NN-7 )
-            B2 = B1
-            IF( B2.EQ.ZERO )
-     $         GO TO 80
-            DO 70 I4 = 4*N0 - 9 + PP, 4*I0 - 1 + PP, -4
-               IF( Z( I4 ).GT.Z( I4-2 ) )
-     $            RETURN
-               B1 = B1*( Z( I4 ) / Z( I4-2 ) )
-               B2 = B2 + B1
-               IF( HUNDRD*B1.LT.B2 )
-     $            GO TO 80
-   70       CONTINUE
-   80       CONTINUE
-            B2 = SQRT( CNST3*B2 )
-            A2 = DMIN2 / ( ONE+B2**2 )
-            GAP2 = Z( NN-7 ) + Z( NN-9 ) -
-     $             SQRT( Z( NN-11 ) )*SQRT( Z( NN-9 ) ) - A2
-            IF( GAP2.GT.ZERO .AND. GAP2.GT.B2*A2 ) THEN
-               S = MAX( S, A2*( ONE-CNST2*A2*( B2 / GAP2 )*B2 ) )
-            ELSE 
-               S = MAX( S, A2*( ONE-CNST2*B2 ) )
-            END IF
-         ELSE
-            S = QURTR*DMIN2
-            TTYPE = -11
-         END IF
-      ELSE IF( N0IN.GT.( N0+2 ) ) THEN
-*
-*        Case 12, more than two eigenvalues deflated. No information.
-*
-         S = ZERO 
-         TTYPE = -12
-      END IF
-*
-      TAU = S
-      RETURN
-*
-*     End of DLAZQ4
-*
-      END
--- a/libcruft/lapack/dorg2l.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,127 +0,0 @@
-      SUBROUTINE DORG2L( M, N, K, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DORG2L generates an m by n real matrix Q with orthonormal columns,
-*  which is defined as the last n columns of a product of k elementary
-*  reflectors of order m
-*
-*        Q  =  H(k) . . . H(2) H(1)
-*
-*  as returned by DGEQLF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. M >= N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. N >= K >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the (n-k+i)-th column must contain the vector which
-*          defines the elementary reflector H(i), for i = 1,2,...,k, as
-*          returned by DGEQLF in the last k columns of its array
-*          argument A.
-*          On exit, the m by n matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by DGEQLF.
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, II, J, L
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARF, DSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DORG2L', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-*     Initialise columns 1:n-k to columns of the unit matrix
-*
-      DO 20 J = 1, N - K
-         DO 10 L = 1, M
-            A( L, J ) = ZERO
-   10    CONTINUE
-         A( M-N+J, J ) = ONE
-   20 CONTINUE
-*
-      DO 40 I = 1, K
-         II = N - K + I
-*
-*        Apply H(i) to A(1:m-k+i,1:n-k+i) from the left
-*
-         A( M-N+II, II ) = ONE
-         CALL DLARF( 'Left', M-N+II, II-1, A( 1, II ), 1, TAU( I ), A,
-     $               LDA, WORK )
-         CALL DSCAL( M-N+II-1, -TAU( I ), A( 1, II ), 1 )
-         A( M-N+II, II ) = ONE - TAU( I )
-*
-*        Set A(m-k+i+1:m,n-k+i) to zero
-*
-         DO 30 L = M - N + II + 1, M
-            A( L, II ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-      RETURN
-*
-*     End of DORG2L
-*
-      END
--- a/libcruft/lapack/dorg2r.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,129 +0,0 @@
-      SUBROUTINE DORG2R( M, N, K, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DORG2R generates an m by n real matrix Q with orthonormal columns,
-*  which is defined as the first n columns of a product of k elementary
-*  reflectors of order m
-*
-*        Q  =  H(1) H(2) . . . H(k)
-*
-*  as returned by DGEQRF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. M >= N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. N >= K >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the i-th column must contain the vector which
-*          defines the elementary reflector H(i), for i = 1,2,...,k, as
-*          returned by DGEQRF in the first k columns of its array
-*          argument A.
-*          On exit, the m-by-n matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by DGEQRF.
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J, L
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARF, DSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DORG2R', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-*     Initialise columns k+1:n to columns of the unit matrix
-*
-      DO 20 J = K + 1, N
-         DO 10 L = 1, M
-            A( L, J ) = ZERO
-   10    CONTINUE
-         A( J, J ) = ONE
-   20 CONTINUE
-*
-      DO 40 I = K, 1, -1
-*
-*        Apply H(i) to A(i:m,i:n) from the left
-*
-         IF( I.LT.N ) THEN
-            A( I, I ) = ONE
-            CALL DLARF( 'Left', M-I+1, N-I, A( I, I ), 1, TAU( I ),
-     $                  A( I, I+1 ), LDA, WORK )
-         END IF
-         IF( I.LT.M )
-     $      CALL DSCAL( M-I, -TAU( I ), A( I+1, I ), 1 )
-         A( I, I ) = ONE - TAU( I )
-*
-*        Set A(1:i-1,i) to zero
-*
-         DO 30 L = 1, I - 1
-            A( L, I ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-      RETURN
-*
-*     End of DORG2R
-*
-      END
--- a/libcruft/lapack/dorgbr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,244 +0,0 @@
-      SUBROUTINE DORGBR( VECT, M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          VECT
-      INTEGER            INFO, K, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DORGBR generates one of the real orthogonal matrices Q or P**T
-*  determined by DGEBRD when reducing a real matrix A to bidiagonal
-*  form: A = Q * B * P**T.  Q and P**T are defined as products of
-*  elementary reflectors H(i) or G(i) respectively.
-*
-*  If VECT = 'Q', A is assumed to have been an M-by-K matrix, and Q
-*  is of order M:
-*  if m >= k, Q = H(1) H(2) . . . H(k) and DORGBR returns the first n
-*  columns of Q, where m >= n >= k;
-*  if m < k, Q = H(1) H(2) . . . H(m-1) and DORGBR returns Q as an
-*  M-by-M matrix.
-*
-*  If VECT = 'P', A is assumed to have been a K-by-N matrix, and P**T
-*  is of order N:
-*  if k < n, P**T = G(k) . . . G(2) G(1) and DORGBR returns the first m
-*  rows of P**T, where n >= m >= k;
-*  if k >= n, P**T = G(n-1) . . . G(2) G(1) and DORGBR returns P**T as
-*  an N-by-N matrix.
-*
-*  Arguments
-*  =========
-*
-*  VECT    (input) CHARACTER*1
-*          Specifies whether the matrix Q or the matrix P**T is
-*          required, as defined in the transformation applied by DGEBRD:
-*          = 'Q':  generate Q;
-*          = 'P':  generate P**T.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q or P**T to be returned.
-*          M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q or P**T to be returned.
-*          N >= 0.
-*          If VECT = 'Q', M >= N >= min(M,K);
-*          if VECT = 'P', N >= M >= min(N,K).
-*
-*  K       (input) INTEGER
-*          If VECT = 'Q', the number of columns in the original M-by-K
-*          matrix reduced by DGEBRD.
-*          If VECT = 'P', the number of rows in the original K-by-N
-*          matrix reduced by DGEBRD.
-*          K >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the vectors which define the elementary reflectors,
-*          as returned by DGEBRD.
-*          On exit, the M-by-N matrix Q or P**T.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension
-*                                (min(M,K)) if VECT = 'Q'
-*                                (min(N,K)) if VECT = 'P'
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i) or G(i), which determines Q or P**T, as
-*          returned by DGEBRD in its array argument TAUQ or TAUP.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,min(M,N)).
-*          For optimum performance LWORK >= min(M,N)*NB, where NB
-*          is the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, WANTQ
-      INTEGER            I, IINFO, J, LWKOPT, MN, NB
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DORGLQ, DORGQR, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      WANTQ = LSAME( VECT, 'Q' )
-      MN = MIN( M, N )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( .NOT.WANTQ .AND. .NOT.LSAME( VECT, 'P' ) ) THEN
-         INFO = -1
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 .OR. ( WANTQ .AND. ( N.GT.M .OR. N.LT.MIN( M,
-     $         K ) ) ) .OR. ( .NOT.WANTQ .AND. ( M.GT.N .OR. M.LT.
-     $         MIN( N, K ) ) ) ) THEN
-         INFO = -3
-      ELSE IF( K.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -6
-      ELSE IF( LWORK.LT.MAX( 1, MN ) .AND. .NOT.LQUERY ) THEN
-         INFO = -9
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( WANTQ ) THEN
-            NB = ILAENV( 1, 'DORGQR', ' ', M, N, K, -1 )
-         ELSE
-            NB = ILAENV( 1, 'DORGLQ', ' ', M, N, K, -1 )
-         END IF
-         LWKOPT = MAX( 1, MN )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DORGBR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      IF( WANTQ ) THEN
-*
-*        Form Q, determined by a call to DGEBRD to reduce an m-by-k
-*        matrix
-*
-         IF( M.GE.K ) THEN
-*
-*           If m >= k, assume m >= n >= k
-*
-            CALL DORGQR( M, N, K, A, LDA, TAU, WORK, LWORK, IINFO )
-*
-         ELSE
-*
-*           If m < k, assume m = n
-*
-*           Shift the vectors which define the elementary reflectors one
-*           column to the right, and set the first row and column of Q
-*           to those of the unit matrix
-*
-            DO 20 J = M, 2, -1
-               A( 1, J ) = ZERO
-               DO 10 I = J + 1, M
-                  A( I, J ) = A( I, J-1 )
-   10          CONTINUE
-   20       CONTINUE
-            A( 1, 1 ) = ONE
-            DO 30 I = 2, M
-               A( I, 1 ) = ZERO
-   30       CONTINUE
-            IF( M.GT.1 ) THEN
-*
-*              Form Q(2:m,2:m)
-*
-               CALL DORGQR( M-1, M-1, M-1, A( 2, 2 ), LDA, TAU, WORK,
-     $                      LWORK, IINFO )
-            END IF
-         END IF
-      ELSE
-*
-*        Form P', determined by a call to DGEBRD to reduce a k-by-n
-*        matrix
-*
-         IF( K.LT.N ) THEN
-*
-*           If k < n, assume k <= m <= n
-*
-            CALL DORGLQ( M, N, K, A, LDA, TAU, WORK, LWORK, IINFO )
-*
-         ELSE
-*
-*           If k >= n, assume m = n
-*
-*           Shift the vectors which define the elementary reflectors one
-*           row downward, and set the first row and column of P' to
-*           those of the unit matrix
-*
-            A( 1, 1 ) = ONE
-            DO 40 I = 2, N
-               A( I, 1 ) = ZERO
-   40       CONTINUE
-            DO 60 J = 2, N
-               DO 50 I = J - 1, 2, -1
-                  A( I, J ) = A( I-1, J )
-   50          CONTINUE
-               A( 1, J ) = ZERO
-   60       CONTINUE
-            IF( N.GT.1 ) THEN
-*
-*              Form P'(2:n,2:n)
-*
-               CALL DORGLQ( N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK,
-     $                      LWORK, IINFO )
-            END IF
-         END IF
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of DORGBR
-*
-      END
--- a/libcruft/lapack/dorghr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,164 +0,0 @@
-      SUBROUTINE DORGHR( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, ILO, INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DORGHR generates a real orthogonal matrix Q which is defined as the
-*  product of IHI-ILO elementary reflectors of order N, as returned by
-*  DGEHRD:
-*
-*  Q = H(ilo) H(ilo+1) . . . H(ihi-1).
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix Q. N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          ILO and IHI must have the same values as in the previous call
-*          of DGEHRD. Q is equal to the unit matrix except in the
-*          submatrix Q(ilo+1:ihi,ilo+1:ihi).
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the vectors which define the elementary reflectors,
-*          as returned by DGEHRD.
-*          On exit, the N-by-N orthogonal matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,N).
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension (N-1)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by DGEHRD.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= IHI-ILO.
-*          For optimum performance LWORK >= (IHI-ILO)*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IINFO, J, LWKOPT, NB, NH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DORGQR, XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NH = IHI - ILO
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -2
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LWORK.LT.MAX( 1, NH ) .AND. .NOT.LQUERY ) THEN
-         INFO = -8
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         NB = ILAENV( 1, 'DORGQR', ' ', NH, NH, NH, -1 )
-         LWKOPT = MAX( 1, NH )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DORGHR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-*     Shift the vectors which define the elementary reflectors one
-*     column to the right, and set the first ilo and the last n-ihi
-*     rows and columns to those of the unit matrix
-*
-      DO 40 J = IHI, ILO + 1, -1
-         DO 10 I = 1, J - 1
-            A( I, J ) = ZERO
-   10    CONTINUE
-         DO 20 I = J + 1, IHI
-            A( I, J ) = A( I, J-1 )
-   20    CONTINUE
-         DO 30 I = IHI + 1, N
-            A( I, J ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-      DO 60 J = 1, ILO
-         DO 50 I = 1, N
-            A( I, J ) = ZERO
-   50    CONTINUE
-         A( J, J ) = ONE
-   60 CONTINUE
-      DO 80 J = IHI + 1, N
-         DO 70 I = 1, N
-            A( I, J ) = ZERO
-   70    CONTINUE
-         A( J, J ) = ONE
-   80 CONTINUE
-*
-      IF( NH.GT.0 ) THEN
-*
-*        Generate Q(ilo+1:ihi,ilo+1:ihi)
-*
-         CALL DORGQR( NH, NH, NH, A( ILO+1, ILO+1 ), LDA, TAU( ILO ),
-     $                WORK, LWORK, IINFO )
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of DORGHR
-*
-      END
--- a/libcruft/lapack/dorgl2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,133 +0,0 @@
-      SUBROUTINE DORGL2( M, N, K, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DORGL2 generates an m by n real matrix Q with orthonormal rows,
-*  which is defined as the first m rows of a product of k elementary
-*  reflectors of order n
-*
-*        Q  =  H(k) . . . H(2) H(1)
-*
-*  as returned by DGELQF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. N >= M.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. M >= K >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the i-th row must contain the vector which defines
-*          the elementary reflector H(i), for i = 1,2,...,k, as returned
-*          by DGELQF in the first k rows of its array argument A.
-*          On exit, the m-by-n matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by DGELQF.
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (M)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J, L
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARF, DSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.M ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DORGL2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 )
-     $   RETURN
-*
-      IF( K.LT.M ) THEN
-*
-*        Initialise rows k+1:m to rows of the unit matrix
-*
-         DO 20 J = 1, N
-            DO 10 L = K + 1, M
-               A( L, J ) = ZERO
-   10       CONTINUE
-            IF( J.GT.K .AND. J.LE.M )
-     $         A( J, J ) = ONE
-   20    CONTINUE
-      END IF
-*
-      DO 40 I = K, 1, -1
-*
-*        Apply H(i) to A(i:m,i:n) from the right
-*
-         IF( I.LT.N ) THEN
-            IF( I.LT.M ) THEN
-               A( I, I ) = ONE
-               CALL DLARF( 'Right', M-I, N-I+1, A( I, I ), LDA,
-     $                     TAU( I ), A( I+1, I ), LDA, WORK )
-            END IF
-            CALL DSCAL( N-I, -TAU( I ), A( I, I+1 ), LDA )
-         END IF
-         A( I, I ) = ONE - TAU( I )
-*
-*        Set A(i,1:i-1) to zero
-*
-         DO 30 L = 1, I - 1
-            A( I, L ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-      RETURN
-*
-*     End of DORGL2
-*
-      END
--- a/libcruft/lapack/dorglq.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,215 +0,0 @@
-      SUBROUTINE DORGLQ( M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DORGLQ generates an M-by-N real matrix Q with orthonormal rows,
-*  which is defined as the first M rows of a product of K elementary
-*  reflectors of order N
-*
-*        Q  =  H(k) . . . H(2) H(1)
-*
-*  as returned by DGELQF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. N >= M.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. M >= K >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the i-th row must contain the vector which defines
-*          the elementary reflector H(i), for i = 1,2,...,k, as returned
-*          by DGELQF in the first k rows of its array argument A.
-*          On exit, the M-by-N matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by DGELQF.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,M).
-*          For optimum performance LWORK >= M*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, J, KI, KK, L, LDWORK,
-     $                   LWKOPT, NB, NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARFB, DLARFT, DORGL2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NB = ILAENV( 1, 'DORGLQ', ' ', M, N, K, -1 )
-      LWKOPT = MAX( 1, M )*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.M ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DORGLQ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = M
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'DORGLQ', ' ', M, N, K, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = M
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'DORGLQ', ' ', M, N, K, -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code after the last block.
-*        The first kk rows are handled by the block method.
-*
-         KI = ( ( K-NX-1 ) / NB )*NB
-         KK = MIN( K, KI+NB )
-*
-*        Set A(kk+1:m,1:kk) to zero.
-*
-         DO 20 J = 1, KK
-            DO 10 I = KK + 1, M
-               A( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-      ELSE
-         KK = 0
-      END IF
-*
-*     Use unblocked code for the last or only block.
-*
-      IF( KK.LT.M )
-     $   CALL DORGL2( M-KK, N-KK, K-KK, A( KK+1, KK+1 ), LDA,
-     $                TAU( KK+1 ), WORK, IINFO )
-*
-      IF( KK.GT.0 ) THEN
-*
-*        Use blocked code
-*
-         DO 50 I = KI + 1, 1, -NB
-            IB = MIN( NB, K-I+1 )
-            IF( I+IB.LE.M ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i) H(i+1) . . . H(i+ib-1)
-*
-               CALL DLARFT( 'Forward', 'Rowwise', N-I+1, IB, A( I, I ),
-     $                      LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H' to A(i+ib:m,i:n) from the right
-*
-               CALL DLARFB( 'Right', 'Transpose', 'Forward', 'Rowwise',
-     $                      M-I-IB+1, N-I+1, IB, A( I, I ), LDA, WORK,
-     $                      LDWORK, A( I+IB, I ), LDA, WORK( IB+1 ),
-     $                      LDWORK )
-            END IF
-*
-*           Apply H' to columns i:n of current block
-*
-            CALL DORGL2( IB, N-I+1, IB, A( I, I ), LDA, TAU( I ), WORK,
-     $                   IINFO )
-*
-*           Set columns 1:i-1 of current block to zero
-*
-            DO 40 J = 1, I - 1
-               DO 30 L = I, I + IB - 1
-                  A( L, J ) = ZERO
-   30          CONTINUE
-   40       CONTINUE
-   50    CONTINUE
-      END IF
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of DORGLQ
-*
-      END
--- a/libcruft/lapack/dorgql.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,222 +0,0 @@
-      SUBROUTINE DORGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DORGQL generates an M-by-N real matrix Q with orthonormal columns,
-*  which is defined as the last N columns of a product of K elementary
-*  reflectors of order M
-*
-*        Q  =  H(k) . . . H(2) H(1)
-*
-*  as returned by DGEQLF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. M >= N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. N >= K >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the (n-k+i)-th column must contain the vector which
-*          defines the elementary reflector H(i), for i = 1,2,...,k, as
-*          returned by DGEQLF in the last k columns of its array
-*          argument A.
-*          On exit, the M-by-N matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by DGEQLF.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,N).
-*          For optimum performance LWORK >= N*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, J, KK, L, LDWORK, LWKOPT,
-     $                   NB, NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARFB, DLARFT, DORG2L, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( N.EQ.0 ) THEN
-            LWKOPT = 1
-         ELSE
-            NB = ILAENV( 1, 'DORGQL', ' ', M, N, K, -1 )
-            LWKOPT = N*NB
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-            INFO = -8
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DORGQL', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 ) THEN
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = N
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'DORGQL', ' ', M, N, K, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = N
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'DORGQL', ' ', M, N, K, -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code after the first block.
-*        The last kk columns are handled by the block method.
-*
-         KK = MIN( K, ( ( K-NX+NB-1 ) / NB )*NB )
-*
-*        Set A(m-kk+1:m,1:n-kk) to zero.
-*
-         DO 20 J = 1, N - KK
-            DO 10 I = M - KK + 1, M
-               A( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-      ELSE
-         KK = 0
-      END IF
-*
-*     Use unblocked code for the first or only block.
-*
-      CALL DORG2L( M-KK, N-KK, K-KK, A, LDA, TAU, WORK, IINFO )
-*
-      IF( KK.GT.0 ) THEN
-*
-*        Use blocked code
-*
-         DO 50 I = K - KK + 1, K, NB
-            IB = MIN( NB, K-I+1 )
-            IF( N-K+I.GT.1 ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i+ib-1) . . . H(i+1) H(i)
-*
-               CALL DLARFT( 'Backward', 'Columnwise', M-K+I+IB-1, IB,
-     $                      A( 1, N-K+I ), LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H to A(1:m-k+i+ib-1,1:n-k+i-1) from the left
-*
-               CALL DLARFB( 'Left', 'No transpose', 'Backward',
-     $                      'Columnwise', M-K+I+IB-1, N-K+I-1, IB,
-     $                      A( 1, N-K+I ), LDA, WORK, LDWORK, A, LDA,
-     $                      WORK( IB+1 ), LDWORK )
-            END IF
-*
-*           Apply H to rows 1:m-k+i+ib-1 of current block
-*
-            CALL DORG2L( M-K+I+IB-1, IB, IB, A( 1, N-K+I ), LDA,
-     $                   TAU( I ), WORK, IINFO )
-*
-*           Set rows m-k+i+ib:m of current block to zero
-*
-            DO 40 J = N - K + I, N - K + I + IB - 1
-               DO 30 L = M - K + I + IB, M
-                  A( L, J ) = ZERO
-   30          CONTINUE
-   40       CONTINUE
-   50    CONTINUE
-      END IF
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of DORGQL
-*
-      END
--- a/libcruft/lapack/dorgqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,216 +0,0 @@
-      SUBROUTINE DORGQR( M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DORGQR generates an M-by-N real matrix Q with orthonormal columns,
-*  which is defined as the first N columns of a product of K elementary
-*  reflectors of order M
-*
-*        Q  =  H(1) H(2) . . . H(k)
-*
-*  as returned by DGEQRF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. M >= N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. N >= K >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the i-th column must contain the vector which
-*          defines the elementary reflector H(i), for i = 1,2,...,k, as
-*          returned by DGEQRF in the first k columns of its array
-*          argument A.
-*          On exit, the M-by-N matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by DGEQRF.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,N).
-*          For optimum performance LWORK >= N*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, J, KI, KK, L, LDWORK,
-     $                   LWKOPT, NB, NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARFB, DLARFT, DORG2R, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NB = ILAENV( 1, 'DORGQR', ' ', M, N, K, -1 )
-      LWKOPT = MAX( 1, N )*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DORGQR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = N
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'DORGQR', ' ', M, N, K, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = N
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'DORGQR', ' ', M, N, K, -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code after the last block.
-*        The first kk columns are handled by the block method.
-*
-         KI = ( ( K-NX-1 ) / NB )*NB
-         KK = MIN( K, KI+NB )
-*
-*        Set A(1:kk,kk+1:n) to zero.
-*
-         DO 20 J = KK + 1, N
-            DO 10 I = 1, KK
-               A( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-      ELSE
-         KK = 0
-      END IF
-*
-*     Use unblocked code for the last or only block.
-*
-      IF( KK.LT.N )
-     $   CALL DORG2R( M-KK, N-KK, K-KK, A( KK+1, KK+1 ), LDA,
-     $                TAU( KK+1 ), WORK, IINFO )
-*
-      IF( KK.GT.0 ) THEN
-*
-*        Use blocked code
-*
-         DO 50 I = KI + 1, 1, -NB
-            IB = MIN( NB, K-I+1 )
-            IF( I+IB.LE.N ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i) H(i+1) . . . H(i+ib-1)
-*
-               CALL DLARFT( 'Forward', 'Columnwise', M-I+1, IB,
-     $                      A( I, I ), LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H to A(i:m,i+ib:n) from the left
-*
-               CALL DLARFB( 'Left', 'No transpose', 'Forward',
-     $                      'Columnwise', M-I+1, N-I-IB+1, IB,
-     $                      A( I, I ), LDA, WORK, LDWORK, A( I, I+IB ),
-     $                      LDA, WORK( IB+1 ), LDWORK )
-            END IF
-*
-*           Apply H to rows i:m of current block
-*
-            CALL DORG2R( M-I+1, IB, IB, A( I, I ), LDA, TAU( I ), WORK,
-     $                   IINFO )
-*
-*           Set rows 1:i-1 of current block to zero
-*
-            DO 40 J = I, I + IB - 1
-               DO 30 L = 1, I - 1
-                  A( L, J ) = ZERO
-   30          CONTINUE
-   40       CONTINUE
-   50    CONTINUE
-      END IF
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of DORGQR
-*
-      END
--- a/libcruft/lapack/dorgtr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,183 +0,0 @@
-      SUBROUTINE DORGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DORGTR generates a real orthogonal matrix Q which is defined as the
-*  product of n-1 elementary reflectors of order N, as returned by
-*  DSYTRD:
-*
-*  if UPLO = 'U', Q = H(n-1) . . . H(2) H(1),
-*
-*  if UPLO = 'L', Q = H(1) H(2) . . . H(n-1).
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U': Upper triangle of A contains elementary reflectors
-*                 from DSYTRD;
-*          = 'L': Lower triangle of A contains elementary reflectors
-*                 from DSYTRD.
-*
-*  N       (input) INTEGER
-*          The order of the matrix Q. N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the vectors which define the elementary reflectors,
-*          as returned by DSYTRD.
-*          On exit, the N-by-N orthogonal matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,N).
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension (N-1)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by DSYTRD.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,N-1).
-*          For optimum performance LWORK >= (N-1)*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, UPPER
-      INTEGER            I, IINFO, J, LWKOPT, NB
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DORGQL, DORGQR, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.MAX( 1, N-1 ) .AND. .NOT.LQUERY ) THEN
-         INFO = -7
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( UPPER ) THEN
-            NB = ILAENV( 1, 'DORGQL', ' ', N-1, N-1, N-1, -1 )
-         ELSE
-            NB = ILAENV( 1, 'DORGQR', ' ', N-1, N-1, N-1, -1 )
-         END IF
-         LWKOPT = MAX( 1, N-1 )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DORGTR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      IF( UPPER ) THEN
-*
-*        Q was determined by a call to DSYTRD with UPLO = 'U'
-*
-*        Shift the vectors which define the elementary reflectors one
-*        column to the left, and set the last row and column of Q to
-*        those of the unit matrix
-*
-         DO 20 J = 1, N - 1
-            DO 10 I = 1, J - 1
-               A( I, J ) = A( I, J+1 )
-   10       CONTINUE
-            A( N, J ) = ZERO
-   20    CONTINUE
-         DO 30 I = 1, N - 1
-            A( I, N ) = ZERO
-   30    CONTINUE
-         A( N, N ) = ONE
-*
-*        Generate Q(1:n-1,1:n-1)
-*
-         CALL DORGQL( N-1, N-1, N-1, A, LDA, TAU, WORK, LWORK, IINFO )
-*
-      ELSE
-*
-*        Q was determined by a call to DSYTRD with UPLO = 'L'.
-*
-*        Shift the vectors which define the elementary reflectors one
-*        column to the right, and set the first row and column of Q to
-*        those of the unit matrix
-*
-         DO 50 J = N, 2, -1
-            A( 1, J ) = ZERO
-            DO 40 I = J + 1, N
-               A( I, J ) = A( I, J-1 )
-   40       CONTINUE
-   50    CONTINUE
-         A( 1, 1 ) = ONE
-         DO 60 I = 2, N
-            A( I, 1 ) = ZERO
-   60    CONTINUE
-         IF( N.GT.1 ) THEN
-*
-*           Generate Q(2:n,2:n)
-*
-            CALL DORGQR( N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK,
-     $                   LWORK, IINFO )
-         END IF
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of DORGTR
-*
-      END
--- a/libcruft/lapack/dorm2r.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,197 +0,0 @@
-      SUBROUTINE DORM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, LDA, LDC, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DORM2R overwrites the general real m by n matrix C with
-*
-*        Q * C  if SIDE = 'L' and TRANS = 'N', or
-*
-*        Q'* C  if SIDE = 'L' and TRANS = 'T', or
-*
-*        C * Q  if SIDE = 'R' and TRANS = 'N', or
-*
-*        C * Q' if SIDE = 'R' and TRANS = 'T',
-*
-*  where Q is a real orthogonal matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(1) H(2) . . . H(k)
-*
-*  as returned by DGEQRF. Q is of order m if SIDE = 'L' and of order n
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q' from the Left
-*          = 'R': apply Q or Q' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply Q  (No transpose)
-*          = 'T': apply Q' (Transpose)
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA,K)
-*          The i-th column must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          DGEQRF in the first k columns of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.
-*          If SIDE = 'L', LDA >= max(1,M);
-*          if SIDE = 'R', LDA >= max(1,N).
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by DGEQRF.
-*
-*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
-*          On entry, the m by n matrix C.
-*          On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension
-*                                   (N) if SIDE = 'L',
-*                                   (M) if SIDE = 'R'
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, NOTRAN
-      INTEGER            I, I1, I2, I3, IC, JC, MI, NI, NQ
-      DOUBLE PRECISION   AII
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARF, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-*
-*     NQ is the order of Q
-*
-      IF( LEFT ) THEN
-         NQ = M
-      ELSE
-         NQ = N
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN
-         INFO = -7
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DORM2R', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 )
-     $   RETURN
-*
-      IF( ( LEFT .AND. .NOT.NOTRAN ) .OR. ( .NOT.LEFT .AND. NOTRAN ) )
-     $     THEN
-         I1 = 1
-         I2 = K
-         I3 = 1
-      ELSE
-         I1 = K
-         I2 = 1
-         I3 = -1
-      END IF
-*
-      IF( LEFT ) THEN
-         NI = N
-         JC = 1
-      ELSE
-         MI = M
-         IC = 1
-      END IF
-*
-      DO 10 I = I1, I2, I3
-         IF( LEFT ) THEN
-*
-*           H(i) is applied to C(i:m,1:n)
-*
-            MI = M - I + 1
-            IC = I
-         ELSE
-*
-*           H(i) is applied to C(1:m,i:n)
-*
-            NI = N - I + 1
-            JC = I
-         END IF
-*
-*        Apply H(i)
-*
-         AII = A( I, I )
-         A( I, I ) = ONE
-         CALL DLARF( SIDE, MI, NI, A( I, I ), 1, TAU( I ), C( IC, JC ),
-     $               LDC, WORK )
-         A( I, I ) = AII
-   10 CONTINUE
-      RETURN
-*
-*     End of DORM2R
-*
-      END
--- a/libcruft/lapack/dormbr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,281 +0,0 @@
-      SUBROUTINE DORMBR( VECT, SIDE, TRANS, M, N, K, A, LDA, TAU, C,
-     $                   LDC, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS, VECT
-      INTEGER            INFO, K, LDA, LDC, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  If VECT = 'Q', DORMBR overwrites the general real M-by-N matrix C
-*  with
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      Q * C          C * Q
-*  TRANS = 'T':      Q**T * C       C * Q**T
-*
-*  If VECT = 'P', DORMBR overwrites the general real M-by-N matrix C
-*  with
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      P * C          C * P
-*  TRANS = 'T':      P**T * C       C * P**T
-*
-*  Here Q and P**T are the orthogonal matrices determined by DGEBRD when
-*  reducing a real matrix A to bidiagonal form: A = Q * B * P**T. Q and
-*  P**T are defined as products of elementary reflectors H(i) and G(i)
-*  respectively.
-*
-*  Let nq = m if SIDE = 'L' and nq = n if SIDE = 'R'. Thus nq is the
-*  order of the orthogonal matrix Q or P**T that is applied.
-*
-*  If VECT = 'Q', A is assumed to have been an NQ-by-K matrix:
-*  if nq >= k, Q = H(1) H(2) . . . H(k);
-*  if nq < k, Q = H(1) H(2) . . . H(nq-1).
-*
-*  If VECT = 'P', A is assumed to have been a K-by-NQ matrix:
-*  if k < nq, P = G(1) G(2) . . . G(k);
-*  if k >= nq, P = G(1) G(2) . . . G(nq-1).
-*
-*  Arguments
-*  =========
-*
-*  VECT    (input) CHARACTER*1
-*          = 'Q': apply Q or Q**T;
-*          = 'P': apply P or P**T.
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q, Q**T, P or P**T from the Left;
-*          = 'R': apply Q, Q**T, P or P**T from the Right.
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N':  No transpose, apply Q  or P;
-*          = 'T':  Transpose, apply Q**T or P**T.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          If VECT = 'Q', the number of columns in the original
-*          matrix reduced by DGEBRD.
-*          If VECT = 'P', the number of rows in the original
-*          matrix reduced by DGEBRD.
-*          K >= 0.
-*
-*  A       (input) DOUBLE PRECISION array, dimension
-*                                (LDA,min(nq,K)) if VECT = 'Q'
-*                                (LDA,nq)        if VECT = 'P'
-*          The vectors which define the elementary reflectors H(i) and
-*          G(i), whose products determine the matrices Q and P, as
-*          returned by DGEBRD.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.
-*          If VECT = 'Q', LDA >= max(1,nq);
-*          if VECT = 'P', LDA >= max(1,min(nq,K)).
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension (min(nq,K))
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i) or G(i) which determines Q or P, as returned
-*          by DGEBRD in the array argument TAUQ or TAUP.
-*
-*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q
-*          or P*C or P**T*C or C*P or C*P**T.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If SIDE = 'L', LWORK >= max(1,N);
-*          if SIDE = 'R', LWORK >= max(1,M).
-*          For optimum performance LWORK >= N*NB if SIDE = 'L', and
-*          LWORK >= M*NB if SIDE = 'R', where NB is the optimal
-*          blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            APPLYQ, LEFT, LQUERY, NOTRAN
-      CHARACTER          TRANST
-      INTEGER            I1, I2, IINFO, LWKOPT, MI, NB, NI, NQ, NW
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DORMLQ, DORMQR, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      APPLYQ = LSAME( VECT, 'Q' )
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-*     NQ is the order of Q or P and NW is the minimum dimension of WORK
-*
-      IF( LEFT ) THEN
-         NQ = M
-         NW = N
-      ELSE
-         NQ = N
-         NW = M
-      END IF
-      IF( .NOT.APPLYQ .AND. .NOT.LSAME( VECT, 'P' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN
-         INFO = -3
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( K.LT.0 ) THEN
-         INFO = -6
-      ELSE IF( ( APPLYQ .AND. LDA.LT.MAX( 1, NQ ) ) .OR.
-     $         ( .NOT.APPLYQ .AND. LDA.LT.MAX( 1, MIN( NQ, K ) ) ) )
-     $          THEN
-         INFO = -8
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -11
-      ELSE IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
-         INFO = -13
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( APPLYQ ) THEN
-            IF( LEFT ) THEN
-               NB = ILAENV( 1, 'DORMQR', SIDE // TRANS, M-1, N, M-1,
-     $              -1 )
-            ELSE
-               NB = ILAENV( 1, 'DORMQR', SIDE // TRANS, M, N-1, N-1,
-     $              -1 )
-            END IF
-         ELSE
-            IF( LEFT ) THEN
-               NB = ILAENV( 1, 'DORMLQ', SIDE // TRANS, M-1, N, M-1,
-     $              -1 )
-            ELSE
-               NB = ILAENV( 1, 'DORMLQ', SIDE // TRANS, M, N-1, N-1,
-     $              -1 )
-            END IF
-         END IF
-         LWKOPT = MAX( 1, NW )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DORMBR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      WORK( 1 ) = 1
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-      IF( APPLYQ ) THEN
-*
-*        Apply Q
-*
-         IF( NQ.GE.K ) THEN
-*
-*           Q was determined by a call to DGEBRD with nq >= k
-*
-            CALL DORMQR( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, IINFO )
-         ELSE IF( NQ.GT.1 ) THEN
-*
-*           Q was determined by a call to DGEBRD with nq < k
-*
-            IF( LEFT ) THEN
-               MI = M - 1
-               NI = N
-               I1 = 2
-               I2 = 1
-            ELSE
-               MI = M
-               NI = N - 1
-               I1 = 1
-               I2 = 2
-            END IF
-            CALL DORMQR( SIDE, TRANS, MI, NI, NQ-1, A( 2, 1 ), LDA, TAU,
-     $                   C( I1, I2 ), LDC, WORK, LWORK, IINFO )
-         END IF
-      ELSE
-*
-*        Apply P
-*
-         IF( NOTRAN ) THEN
-            TRANST = 'T'
-         ELSE
-            TRANST = 'N'
-         END IF
-         IF( NQ.GT.K ) THEN
-*
-*           P was determined by a call to DGEBRD with nq > k
-*
-            CALL DORMLQ( SIDE, TRANST, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, IINFO )
-         ELSE IF( NQ.GT.1 ) THEN
-*
-*           P was determined by a call to DGEBRD with nq <= k
-*
-            IF( LEFT ) THEN
-               MI = M - 1
-               NI = N
-               I1 = 2
-               I2 = 1
-            ELSE
-               MI = M
-               NI = N - 1
-               I1 = 1
-               I2 = 2
-            END IF
-            CALL DORMLQ( SIDE, TRANST, MI, NI, NQ-1, A( 1, 2 ), LDA,
-     $                   TAU, C( I1, I2 ), LDC, WORK, LWORK, IINFO )
-         END IF
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of DORMBR
-*
-      END
--- a/libcruft/lapack/dorml2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,197 +0,0 @@
-      SUBROUTINE DORML2( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, LDA, LDC, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DORML2 overwrites the general real m by n matrix C with
-*
-*        Q * C  if SIDE = 'L' and TRANS = 'N', or
-*
-*        Q'* C  if SIDE = 'L' and TRANS = 'T', or
-*
-*        C * Q  if SIDE = 'R' and TRANS = 'N', or
-*
-*        C * Q' if SIDE = 'R' and TRANS = 'T',
-*
-*  where Q is a real orthogonal matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(k) . . . H(2) H(1)
-*
-*  as returned by DGELQF. Q is of order m if SIDE = 'L' and of order n
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q' from the Left
-*          = 'R': apply Q or Q' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply Q  (No transpose)
-*          = 'T': apply Q' (Transpose)
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  A       (input) DOUBLE PRECISION array, dimension
-*                               (LDA,M) if SIDE = 'L',
-*                               (LDA,N) if SIDE = 'R'
-*          The i-th row must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          DGELQF in the first k rows of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,K).
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by DGELQF.
-*
-*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
-*          On entry, the m by n matrix C.
-*          On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension
-*                                   (N) if SIDE = 'L',
-*                                   (M) if SIDE = 'R'
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, NOTRAN
-      INTEGER            I, I1, I2, I3, IC, JC, MI, NI, NQ
-      DOUBLE PRECISION   AII
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARF, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-*
-*     NQ is the order of Q
-*
-      IF( LEFT ) THEN
-         NQ = M
-      ELSE
-         NQ = N
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
-         INFO = -7
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DORML2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 )
-     $   RETURN
-*
-      IF( ( LEFT .AND. NOTRAN ) .OR. ( .NOT.LEFT .AND. .NOT.NOTRAN ) )
-     $     THEN
-         I1 = 1
-         I2 = K
-         I3 = 1
-      ELSE
-         I1 = K
-         I2 = 1
-         I3 = -1
-      END IF
-*
-      IF( LEFT ) THEN
-         NI = N
-         JC = 1
-      ELSE
-         MI = M
-         IC = 1
-      END IF
-*
-      DO 10 I = I1, I2, I3
-         IF( LEFT ) THEN
-*
-*           H(i) is applied to C(i:m,1:n)
-*
-            MI = M - I + 1
-            IC = I
-         ELSE
-*
-*           H(i) is applied to C(1:m,i:n)
-*
-            NI = N - I + 1
-            JC = I
-         END IF
-*
-*        Apply H(i)
-*
-         AII = A( I, I )
-         A( I, I ) = ONE
-         CALL DLARF( SIDE, MI, NI, A( I, I ), LDA, TAU( I ),
-     $               C( IC, JC ), LDC, WORK )
-         A( I, I ) = AII
-   10 CONTINUE
-      RETURN
-*
-*     End of DORML2
-*
-      END
--- a/libcruft/lapack/dormlq.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,267 +0,0 @@
-      SUBROUTINE DORMLQ( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, LDA, LDC, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DORMLQ overwrites the general real M-by-N matrix C with
-*
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      Q * C          C * Q
-*  TRANS = 'T':      Q**T * C       C * Q**T
-*
-*  where Q is a real orthogonal matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(k) . . . H(2) H(1)
-*
-*  as returned by DGELQF. Q is of order M if SIDE = 'L' and of order N
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q**T from the Left;
-*          = 'R': apply Q or Q**T from the Right.
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N':  No transpose, apply Q;
-*          = 'T':  Transpose, apply Q**T.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  A       (input) DOUBLE PRECISION array, dimension
-*                               (LDA,M) if SIDE = 'L',
-*                               (LDA,N) if SIDE = 'R'
-*          The i-th row must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          DGELQF in the first k rows of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,K).
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by DGELQF.
-*
-*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If SIDE = 'L', LWORK >= max(1,N);
-*          if SIDE = 'R', LWORK >= max(1,M).
-*          For optimum performance LWORK >= N*NB if SIDE = 'L', and
-*          LWORK >= M*NB if SIDE = 'R', where NB is the optimal
-*          blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            NBMAX, LDT
-      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, LQUERY, NOTRAN
-      CHARACTER          TRANST
-      INTEGER            I, I1, I2, I3, IB, IC, IINFO, IWS, JC, LDWORK,
-     $                   LWKOPT, MI, NB, NBMIN, NI, NQ, NW
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   T( LDT, NBMAX )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARFB, DLARFT, DORML2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-*     NQ is the order of Q and NW is the minimum dimension of WORK
-*
-      IF( LEFT ) THEN
-         NQ = M
-         NW = N
-      ELSE
-         NQ = N
-         NW = M
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
-         INFO = -7
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -10
-      ELSE IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
-         INFO = -12
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-*
-*        Determine the block size.  NB may be at most NBMAX, where NBMAX
-*        is used to define the local array T.
-*
-         NB = MIN( NBMAX, ILAENV( 1, 'DORMLQ', SIDE // TRANS, M, N, K,
-     $        -1 ) )
-         LWKOPT = MAX( 1, NW )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DORMLQ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      LDWORK = NW
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-         IWS = NW*NB
-         IF( LWORK.LT.IWS ) THEN
-            NB = LWORK / LDWORK
-            NBMIN = MAX( 2, ILAENV( 2, 'DORMLQ', SIDE // TRANS, M, N, K,
-     $              -1 ) )
-         END IF
-      ELSE
-         IWS = NW
-      END IF
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
-*
-*        Use unblocked code
-*
-         CALL DORML2( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK,
-     $                IINFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( ( LEFT .AND. NOTRAN ) .OR.
-     $       ( .NOT.LEFT .AND. .NOT.NOTRAN ) ) THEN
-            I1 = 1
-            I2 = K
-            I3 = NB
-         ELSE
-            I1 = ( ( K-1 ) / NB )*NB + 1
-            I2 = 1
-            I3 = -NB
-         END IF
-*
-         IF( LEFT ) THEN
-            NI = N
-            JC = 1
-         ELSE
-            MI = M
-            IC = 1
-         END IF
-*
-         IF( NOTRAN ) THEN
-            TRANST = 'T'
-         ELSE
-            TRANST = 'N'
-         END IF
-*
-         DO 10 I = I1, I2, I3
-            IB = MIN( NB, K-I+1 )
-*
-*           Form the triangular factor of the block reflector
-*           H = H(i) H(i+1) . . . H(i+ib-1)
-*
-            CALL DLARFT( 'Forward', 'Rowwise', NQ-I+1, IB, A( I, I ),
-     $                   LDA, TAU( I ), T, LDT )
-            IF( LEFT ) THEN
-*
-*              H or H' is applied to C(i:m,1:n)
-*
-               MI = M - I + 1
-               IC = I
-            ELSE
-*
-*              H or H' is applied to C(1:m,i:n)
-*
-               NI = N - I + 1
-               JC = I
-            END IF
-*
-*           Apply H or H'
-*
-            CALL DLARFB( SIDE, TRANST, 'Forward', 'Rowwise', MI, NI, IB,
-     $                   A( I, I ), LDA, T, LDT, C( IC, JC ), LDC, WORK,
-     $                   LDWORK )
-   10    CONTINUE
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of DORMLQ
-*
-      END
--- a/libcruft/lapack/dormqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,260 +0,0 @@
-      SUBROUTINE DORMQR( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, LDA, LDC, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DORMQR overwrites the general real M-by-N matrix C with
-*
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      Q * C          C * Q
-*  TRANS = 'T':      Q**T * C       C * Q**T
-*
-*  where Q is a real orthogonal matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(1) H(2) . . . H(k)
-*
-*  as returned by DGEQRF. Q is of order M if SIDE = 'L' and of order N
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q**T from the Left;
-*          = 'R': apply Q or Q**T from the Right.
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N':  No transpose, apply Q;
-*          = 'T':  Transpose, apply Q**T.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA,K)
-*          The i-th column must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          DGEQRF in the first k columns of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.
-*          If SIDE = 'L', LDA >= max(1,M);
-*          if SIDE = 'R', LDA >= max(1,N).
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by DGEQRF.
-*
-*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If SIDE = 'L', LWORK >= max(1,N);
-*          if SIDE = 'R', LWORK >= max(1,M).
-*          For optimum performance LWORK >= N*NB if SIDE = 'L', and
-*          LWORK >= M*NB if SIDE = 'R', where NB is the optimal
-*          blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            NBMAX, LDT
-      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, LQUERY, NOTRAN
-      INTEGER            I, I1, I2, I3, IB, IC, IINFO, IWS, JC, LDWORK,
-     $                   LWKOPT, MI, NB, NBMIN, NI, NQ, NW
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   T( LDT, NBMAX )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARFB, DLARFT, DORM2R, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-*     NQ is the order of Q and NW is the minimum dimension of WORK
-*
-      IF( LEFT ) THEN
-         NQ = M
-         NW = N
-      ELSE
-         NQ = N
-         NW = M
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN
-         INFO = -7
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -10
-      ELSE IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
-         INFO = -12
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-*
-*        Determine the block size.  NB may be at most NBMAX, where NBMAX
-*        is used to define the local array T.
-*
-         NB = MIN( NBMAX, ILAENV( 1, 'DORMQR', SIDE // TRANS, M, N, K,
-     $        -1 ) )
-         LWKOPT = MAX( 1, NW )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DORMQR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      LDWORK = NW
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-         IWS = NW*NB
-         IF( LWORK.LT.IWS ) THEN
-            NB = LWORK / LDWORK
-            NBMIN = MAX( 2, ILAENV( 2, 'DORMQR', SIDE // TRANS, M, N, K,
-     $              -1 ) )
-         END IF
-      ELSE
-         IWS = NW
-      END IF
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
-*
-*        Use unblocked code
-*
-         CALL DORM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK,
-     $                IINFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( ( LEFT .AND. .NOT.NOTRAN ) .OR.
-     $       ( .NOT.LEFT .AND. NOTRAN ) ) THEN
-            I1 = 1
-            I2 = K
-            I3 = NB
-         ELSE
-            I1 = ( ( K-1 ) / NB )*NB + 1
-            I2 = 1
-            I3 = -NB
-         END IF
-*
-         IF( LEFT ) THEN
-            NI = N
-            JC = 1
-         ELSE
-            MI = M
-            IC = 1
-         END IF
-*
-         DO 10 I = I1, I2, I3
-            IB = MIN( NB, K-I+1 )
-*
-*           Form the triangular factor of the block reflector
-*           H = H(i) H(i+1) . . . H(i+ib-1)
-*
-            CALL DLARFT( 'Forward', 'Columnwise', NQ-I+1, IB, A( I, I ),
-     $                   LDA, TAU( I ), T, LDT )
-            IF( LEFT ) THEN
-*
-*              H or H' is applied to C(i:m,1:n)
-*
-               MI = M - I + 1
-               IC = I
-            ELSE
-*
-*              H or H' is applied to C(1:m,i:n)
-*
-               NI = N - I + 1
-               JC = I
-            END IF
-*
-*           Apply H or H'
-*
-            CALL DLARFB( SIDE, TRANS, 'Forward', 'Columnwise', MI, NI,
-     $                   IB, A( I, I ), LDA, T, LDT, C( IC, JC ), LDC,
-     $                   WORK, LDWORK )
-   10    CONTINUE
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of DORMQR
-*
-      END
--- a/libcruft/lapack/dormr3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,206 +0,0 @@
-      SUBROUTINE DORMR3( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC,
-     $                   WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, L, LDA, LDC, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DORMR3 overwrites the general real m by n matrix C with
-*
-*        Q * C  if SIDE = 'L' and TRANS = 'N', or
-*
-*        Q'* C  if SIDE = 'L' and TRANS = 'T', or
-*
-*        C * Q  if SIDE = 'R' and TRANS = 'N', or
-*
-*        C * Q' if SIDE = 'R' and TRANS = 'T',
-*
-*  where Q is a real orthogonal matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(1) H(2) . . . H(k)
-*
-*  as returned by DTZRZF. Q is of order m if SIDE = 'L' and of order n
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q' from the Left
-*          = 'R': apply Q or Q' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply Q  (No transpose)
-*          = 'T': apply Q' (Transpose)
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  L       (input) INTEGER
-*          The number of columns of the matrix A containing
-*          the meaningful part of the Householder reflectors.
-*          If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
-*
-*  A       (input) DOUBLE PRECISION array, dimension
-*                               (LDA,M) if SIDE = 'L',
-*                               (LDA,N) if SIDE = 'R'
-*          The i-th row must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          DTZRZF in the last k rows of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,K).
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by DTZRZF.
-*
-*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
-*          On entry, the m-by-n matrix C.
-*          On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension
-*                                   (N) if SIDE = 'L',
-*                                   (M) if SIDE = 'R'
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            LEFT, NOTRAN
-      INTEGER            I, I1, I2, I3, IC, JA, JC, MI, NI, NQ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARZ, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-*
-*     NQ is the order of Q
-*
-      IF( LEFT ) THEN
-         NQ = M
-      ELSE
-         NQ = N
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( L.LT.0 .OR. ( LEFT .AND. ( L.GT.M ) ) .OR.
-     $         ( .NOT.LEFT .AND. ( L.GT.N ) ) ) THEN
-         INFO = -6
-      ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
-         INFO = -8
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -11
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DORMR3', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 )
-     $   RETURN
-*
-      IF( ( LEFT .AND. .NOT.NOTRAN .OR. .NOT.LEFT .AND. NOTRAN ) ) THEN
-         I1 = 1
-         I2 = K
-         I3 = 1
-      ELSE
-         I1 = K
-         I2 = 1
-         I3 = -1
-      END IF
-*
-      IF( LEFT ) THEN
-         NI = N
-         JA = M - L + 1
-         JC = 1
-      ELSE
-         MI = M
-         JA = N - L + 1
-         IC = 1
-      END IF
-*
-      DO 10 I = I1, I2, I3
-         IF( LEFT ) THEN
-*
-*           H(i) or H(i)' is applied to C(i:m,1:n)
-*
-            MI = M - I + 1
-            IC = I
-         ELSE
-*
-*           H(i) or H(i)' is applied to C(1:m,i:n)
-*
-            NI = N - I + 1
-            JC = I
-         END IF
-*
-*        Apply H(i) or H(i)'
-*
-         CALL DLARZ( SIDE, MI, NI, L, A( I, JA ), LDA, TAU( I ),
-     $               C( IC, JC ), LDC, WORK )
-*
-   10 CONTINUE
-*
-      RETURN
-*
-*     End of DORMR3
-*
-      END
--- a/libcruft/lapack/dormrz.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,293 +0,0 @@
-      SUBROUTINE DORMRZ( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     January 2007
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, L, LDA, LDC, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DORMRZ overwrites the general real M-by-N matrix C with
-*
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      Q * C          C * Q
-*  TRANS = 'T':      Q**T * C       C * Q**T
-*
-*  where Q is a real orthogonal matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(1) H(2) . . . H(k)
-*
-*  as returned by DTZRZF. Q is of order M if SIDE = 'L' and of order N
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q**T from the Left;
-*          = 'R': apply Q or Q**T from the Right.
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N':  No transpose, apply Q;
-*          = 'T':  Transpose, apply Q**T.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  L       (input) INTEGER
-*          The number of columns of the matrix A containing
-*          the meaningful part of the Householder reflectors.
-*          If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
-*
-*  A       (input) DOUBLE PRECISION array, dimension
-*                               (LDA,M) if SIDE = 'L',
-*                               (LDA,N) if SIDE = 'R'
-*          The i-th row must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          DTZRZF in the last k rows of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,K).
-*
-*  TAU     (input) DOUBLE PRECISION array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by DTZRZF.
-*
-*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If SIDE = 'L', LWORK >= max(1,N);
-*          if SIDE = 'R', LWORK >= max(1,M).
-*          For optimum performance LWORK >= N*NB if SIDE = 'L', and
-*          LWORK >= M*NB if SIDE = 'R', where NB is the optimal
-*          blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            NBMAX, LDT
-      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, LQUERY, NOTRAN
-      CHARACTER          TRANST
-      INTEGER            I, I1, I2, I3, IB, IC, IINFO, IWS, JA, JC,
-     $                   LDWORK, LWKOPT, MI, NB, NBMIN, NI, NQ, NW
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   T( LDT, NBMAX )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARZB, DLARZT, DORMR3, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-*     NQ is the order of Q and NW is the minimum dimension of WORK
-*
-      IF( LEFT ) THEN
-         NQ = M
-         NW = MAX( 1, N )
-      ELSE
-         NQ = N
-         NW = MAX( 1, M )
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( L.LT.0 .OR. ( LEFT .AND. ( L.GT.M ) ) .OR.
-     $         ( .NOT.LEFT .AND. ( L.GT.N ) ) ) THEN
-         INFO = -6
-      ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
-         INFO = -8
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -11
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-            LWKOPT = 1
-         ELSE
-*
-*           Determine the block size.  NB may be at most NBMAX, where
-*           NBMAX is used to define the local array T.
-*
-            NB = MIN( NBMAX, ILAENV( 1, 'DORMRQ', SIDE // TRANS, M, N,
-     $                               K, -1 ) )
-            LWKOPT = NW*NB
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
-            INFO = -13
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DORMRZ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      LDWORK = NW
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-         IWS = NW*NB
-         IF( LWORK.LT.IWS ) THEN
-            NB = LWORK / LDWORK
-            NBMIN = MAX( 2, ILAENV( 2, 'DORMRQ', SIDE // TRANS, M, N, K,
-     $              -1 ) )
-         END IF
-      ELSE
-         IWS = NW
-      END IF
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
-*
-*        Use unblocked code
-*
-         CALL DORMR3( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC,
-     $                WORK, IINFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( ( LEFT .AND. .NOT.NOTRAN ) .OR.
-     $       ( .NOT.LEFT .AND. NOTRAN ) ) THEN
-            I1 = 1
-            I2 = K
-            I3 = NB
-         ELSE
-            I1 = ( ( K-1 ) / NB )*NB + 1
-            I2 = 1
-            I3 = -NB
-         END IF
-*
-         IF( LEFT ) THEN
-            NI = N
-            JC = 1
-            JA = M - L + 1
-         ELSE
-            MI = M
-            IC = 1
-            JA = N - L + 1
-         END IF
-*
-         IF( NOTRAN ) THEN
-            TRANST = 'T'
-         ELSE
-            TRANST = 'N'
-         END IF
-*
-         DO 10 I = I1, I2, I3
-            IB = MIN( NB, K-I+1 )
-*
-*           Form the triangular factor of the block reflector
-*           H = H(i+ib-1) . . . H(i+1) H(i)
-*
-            CALL DLARZT( 'Backward', 'Rowwise', L, IB, A( I, JA ), LDA,
-     $                   TAU( I ), T, LDT )
-*
-            IF( LEFT ) THEN
-*
-*              H or H' is applied to C(i:m,1:n)
-*
-               MI = M - I + 1
-               IC = I
-            ELSE
-*
-*              H or H' is applied to C(1:m,i:n)
-*
-               NI = N - I + 1
-               JC = I
-            END IF
-*
-*           Apply H or H'
-*
-            CALL DLARZB( SIDE, TRANST, 'Backward', 'Rowwise', MI, NI,
-     $                   IB, L, A( I, JA ), LDA, T, LDT, C( IC, JC ),
-     $                   LDC, WORK, LDWORK )
-   10    CONTINUE
-*
-      END IF
-*
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of DORMRZ
-*
-      END
--- a/libcruft/lapack/dpbcon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,192 +0,0 @@
-      SUBROUTINE DPBCON( UPLO, N, KD, AB, LDAB, ANORM, RCOND, WORK,
-     $                   IWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, KD, LDAB, N
-      DOUBLE PRECISION   ANORM, RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      DOUBLE PRECISION   AB( LDAB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DPBCON estimates the reciprocal of the condition number (in the
-*  1-norm) of a real symmetric positive definite band matrix using the
-*  Cholesky factorization A = U**T*U or A = L*L**T computed by DPBTRF.
-*
-*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
-*  condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))).
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangular factor stored in AB;
-*          = 'L':  Lower triangular factor stored in AB.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of superdiagonals of the matrix A if UPLO = 'U',
-*          or the number of subdiagonals if UPLO = 'L'.  KD >= 0.
-*
-*  AB      (input) DOUBLE PRECISION array, dimension (LDAB,N)
-*          The triangular factor U or L from the Cholesky factorization
-*          A = U**T*U or A = L*L**T of the band matrix A, stored in the
-*          first KD+1 rows of the array.  The j-th column of U or L is
-*          stored in the j-th column of the array AB as follows:
-*          if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO ='L', AB(1+i-j,j)    = L(i,j) for j<=i<=min(n,j+kd).
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  ANORM   (input) DOUBLE PRECISION
-*          The 1-norm (or infinity-norm) of the symmetric band matrix A.
-*
-*  RCOND   (output) DOUBLE PRECISION
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an
-*          estimate of the 1-norm of inv(A) computed in this routine.
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (3*N)
-*
-*  IWORK   (workspace) INTEGER array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      CHARACTER          NORMIN
-      INTEGER            IX, KASE
-      DOUBLE PRECISION   AINVNM, SCALE, SCALEL, SCALEU, SMLNUM
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           LSAME, IDAMAX, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLACN2, DLATBS, DRSCL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -5
-      ELSE IF( ANORM.LT.ZERO ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DPBCON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      RCOND = ZERO
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      ELSE IF( ANORM.EQ.ZERO ) THEN
-         RETURN
-      END IF
-*
-      SMLNUM = DLAMCH( 'Safe minimum' )
-*
-*     Estimate the 1-norm of the inverse.
-*
-      KASE = 0
-      NORMIN = 'N'
-   10 CONTINUE
-      CALL DLACN2( N, WORK( N+1 ), WORK, IWORK, AINVNM, KASE, ISAVE )
-      IF( KASE.NE.0 ) THEN
-         IF( UPPER ) THEN
-*
-*           Multiply by inv(U').
-*
-            CALL DLATBS( 'Upper', 'Transpose', 'Non-unit', NORMIN, N,
-     $                   KD, AB, LDAB, WORK, SCALEL, WORK( 2*N+1 ),
-     $                   INFO )
-            NORMIN = 'Y'
-*
-*           Multiply by inv(U).
-*
-            CALL DLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   KD, AB, LDAB, WORK, SCALEU, WORK( 2*N+1 ),
-     $                   INFO )
-         ELSE
-*
-*           Multiply by inv(L).
-*
-            CALL DLATBS( 'Lower', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   KD, AB, LDAB, WORK, SCALEL, WORK( 2*N+1 ),
-     $                   INFO )
-            NORMIN = 'Y'
-*
-*           Multiply by inv(L').
-*
-            CALL DLATBS( 'Lower', 'Transpose', 'Non-unit', NORMIN, N,
-     $                   KD, AB, LDAB, WORK, SCALEU, WORK( 2*N+1 ),
-     $                   INFO )
-         END IF
-*
-*        Multiply by 1/SCALE if doing so will not cause overflow.
-*
-         SCALE = SCALEL*SCALEU
-         IF( SCALE.NE.ONE ) THEN
-            IX = IDAMAX( N, WORK, 1 )
-            IF( SCALE.LT.ABS( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
-     $         GO TO 20
-            CALL DRSCL( N, SCALE, WORK, 1 )
-         END IF
-         GO TO 10
-      END IF
-*
-*     Compute the estimate of the reciprocal condition number.
-*
-      IF( AINVNM.NE.ZERO )
-     $   RCOND = ( ONE / AINVNM ) / ANORM
-*
-   20 CONTINUE
-*
-      RETURN
-*
-*     End of DPBCON
-*
-      END
--- a/libcruft/lapack/dpbtf2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,194 +0,0 @@
-      SUBROUTINE DPBTF2( UPLO, N, KD, AB, LDAB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, KD, LDAB, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   AB( LDAB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DPBTF2 computes the Cholesky factorization of a real symmetric
-*  positive definite band matrix A.
-*
-*  The factorization has the form
-*     A = U' * U ,  if UPLO = 'U', or
-*     A = L  * L',  if UPLO = 'L',
-*  where U is an upper triangular matrix, U' is the transpose of U, and
-*  L is lower triangular.
-*
-*  This is the unblocked version of the algorithm, calling Level 2 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          symmetric matrix A is stored:
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of super-diagonals of the matrix A if UPLO = 'U',
-*          or the number of sub-diagonals if UPLO = 'L'.  KD >= 0.
-*
-*  AB      (input/output) DOUBLE PRECISION array, dimension (LDAB,N)
-*          On entry, the upper or lower triangle of the symmetric band
-*          matrix A, stored in the first KD+1 rows of the array.  The
-*          j-th column of A is stored in the j-th column of the array AB
-*          as follows:
-*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
-*
-*          On exit, if INFO = 0, the triangular factor U or L from the
-*          Cholesky factorization A = U'*U or A = L*L' of the band
-*          matrix A, in the same storage format as A.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*          > 0: if INFO = k, the leading minor of order k is not
-*               positive definite, and the factorization could not be
-*               completed.
-*
-*  Further Details
-*  ===============
-*
-*  The band storage scheme is illustrated by the following example, when
-*  N = 6, KD = 2, and UPLO = 'U':
-*
-*  On entry:                       On exit:
-*
-*      *    *   a13  a24  a35  a46      *    *   u13  u24  u35  u46
-*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
-*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
-*
-*  Similarly, if UPLO = 'L' the format of A is as follows:
-*
-*  On entry:                       On exit:
-*
-*     a11  a22  a33  a44  a55  a66     l11  l22  l33  l44  l55  l66
-*     a21  a32  a43  a54  a65   *      l21  l32  l43  l54  l65   *
-*     a31  a42  a53  a64   *    *      l31  l42  l53  l64   *    *
-*
-*  Array elements marked * are not used by the routine.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            J, KLD, KN
-      DOUBLE PRECISION   AJJ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DSCAL, DSYR, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DPBTF2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      KLD = MAX( 1, LDAB-1 )
-*
-      IF( UPPER ) THEN
-*
-*        Compute the Cholesky factorization A = U'*U.
-*
-         DO 10 J = 1, N
-*
-*           Compute U(J,J) and test for non-positive-definiteness.
-*
-            AJJ = AB( KD+1, J )
-            IF( AJJ.LE.ZERO )
-     $         GO TO 30
-            AJJ = SQRT( AJJ )
-            AB( KD+1, J ) = AJJ
-*
-*           Compute elements J+1:J+KN of row J and update the
-*           trailing submatrix within the band.
-*
-            KN = MIN( KD, N-J )
-            IF( KN.GT.0 ) THEN
-               CALL DSCAL( KN, ONE / AJJ, AB( KD, J+1 ), KLD )
-               CALL DSYR( 'Upper', KN, -ONE, AB( KD, J+1 ), KLD,
-     $                    AB( KD+1, J+1 ), KLD )
-            END IF
-   10    CONTINUE
-      ELSE
-*
-*        Compute the Cholesky factorization A = L*L'.
-*
-         DO 20 J = 1, N
-*
-*           Compute L(J,J) and test for non-positive-definiteness.
-*
-            AJJ = AB( 1, J )
-            IF( AJJ.LE.ZERO )
-     $         GO TO 30
-            AJJ = SQRT( AJJ )
-            AB( 1, J ) = AJJ
-*
-*           Compute elements J+1:J+KN of column J and update the
-*           trailing submatrix within the band.
-*
-            KN = MIN( KD, N-J )
-            IF( KN.GT.0 ) THEN
-               CALL DSCAL( KN, ONE / AJJ, AB( 2, J ), 1 )
-               CALL DSYR( 'Lower', KN, -ONE, AB( 2, J ), 1,
-     $                    AB( 1, J+1 ), KLD )
-            END IF
-   20    CONTINUE
-      END IF
-      RETURN
-*
-   30 CONTINUE
-      INFO = J
-      RETURN
-*
-*     End of DPBTF2
-*
-      END
--- a/libcruft/lapack/dpbtrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,364 +0,0 @@
-      SUBROUTINE DPBTRF( UPLO, N, KD, AB, LDAB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, KD, LDAB, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   AB( LDAB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DPBTRF computes the Cholesky factorization of a real symmetric
-*  positive definite band matrix A.
-*
-*  The factorization has the form
-*     A = U**T * U,  if UPLO = 'U', or
-*     A = L  * L**T,  if UPLO = 'L',
-*  where U is an upper triangular matrix and L is lower triangular.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of superdiagonals of the matrix A if UPLO = 'U',
-*          or the number of subdiagonals if UPLO = 'L'.  KD >= 0.
-*
-*  AB      (input/output) DOUBLE PRECISION array, dimension (LDAB,N)
-*          On entry, the upper or lower triangle of the symmetric band
-*          matrix A, stored in the first KD+1 rows of the array.  The
-*          j-th column of A is stored in the j-th column of the array AB
-*          as follows:
-*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
-*
-*          On exit, if INFO = 0, the triangular factor U or L from the
-*          Cholesky factorization A = U**T*U or A = L*L**T of the band
-*          matrix A, in the same storage format as A.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the leading minor of order i is not
-*                positive definite, and the factorization could not be
-*                completed.
-*
-*  Further Details
-*  ===============
-*
-*  The band storage scheme is illustrated by the following example, when
-*  N = 6, KD = 2, and UPLO = 'U':
-*
-*  On entry:                       On exit:
-*
-*      *    *   a13  a24  a35  a46      *    *   u13  u24  u35  u46
-*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
-*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
-*
-*  Similarly, if UPLO = 'L' the format of A is as follows:
-*
-*  On entry:                       On exit:
-*
-*     a11  a22  a33  a44  a55  a66     l11  l22  l33  l44  l55  l66
-*     a21  a32  a43  a54  a65   *      l21  l32  l43  l54  l65   *
-*     a31  a42  a53  a64   *    *      l31  l42  l53  l64   *    *
-*
-*  Array elements marked * are not used by the routine.
-*
-*  Contributed by
-*  Peter Mayes and Giuseppe Radicati, IBM ECSEC, Rome, March 23, 1989
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-      INTEGER            NBMAX, LDWORK
-      PARAMETER          ( NBMAX = 32, LDWORK = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I2, I3, IB, II, J, JJ, NB
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   WORK( LDWORK, NBMAX )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMM, DPBTF2, DPOTF2, DSYRK, DTRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( ( .NOT.LSAME( UPLO, 'U' ) ) .AND.
-     $    ( .NOT.LSAME( UPLO, 'L' ) ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DPBTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment
-*
-      NB = ILAENV( 1, 'DPBTRF', UPLO, N, KD, -1, -1 )
-*
-*     The block size must not exceed the semi-bandwidth KD, and must not
-*     exceed the limit set by the size of the local array WORK.
-*
-      NB = MIN( NB, NBMAX )
-*
-      IF( NB.LE.1 .OR. NB.GT.KD ) THEN
-*
-*        Use unblocked code
-*
-         CALL DPBTF2( UPLO, N, KD, AB, LDAB, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( LSAME( UPLO, 'U' ) ) THEN
-*
-*           Compute the Cholesky factorization of a symmetric band
-*           matrix, given the upper triangle of the matrix in band
-*           storage.
-*
-*           Zero the upper triangle of the work array.
-*
-            DO 20 J = 1, NB
-               DO 10 I = 1, J - 1
-                  WORK( I, J ) = ZERO
-   10          CONTINUE
-   20       CONTINUE
-*
-*           Process the band matrix one diagonal block at a time.
-*
-            DO 70 I = 1, N, NB
-               IB = MIN( NB, N-I+1 )
-*
-*              Factorize the diagonal block
-*
-               CALL DPOTF2( UPLO, IB, AB( KD+1, I ), LDAB-1, II )
-               IF( II.NE.0 ) THEN
-                  INFO = I + II - 1
-                  GO TO 150
-               END IF
-               IF( I+IB.LE.N ) THEN
-*
-*                 Update the relevant part of the trailing submatrix.
-*                 If A11 denotes the diagonal block which has just been
-*                 factorized, then we need to update the remaining
-*                 blocks in the diagram:
-*
-*                    A11   A12   A13
-*                          A22   A23
-*                                A33
-*
-*                 The numbers of rows and columns in the partitioning
-*                 are IB, I2, I3 respectively. The blocks A12, A22 and
-*                 A23 are empty if IB = KD. The upper triangle of A13
-*                 lies outside the band.
-*
-                  I2 = MIN( KD-IB, N-I-IB+1 )
-                  I3 = MIN( IB, N-I-KD+1 )
-*
-                  IF( I2.GT.0 ) THEN
-*
-*                    Update A12
-*
-                     CALL DTRSM( 'Left', 'Upper', 'Transpose',
-     $                           'Non-unit', IB, I2, ONE, AB( KD+1, I ),
-     $                           LDAB-1, AB( KD+1-IB, I+IB ), LDAB-1 )
-*
-*                    Update A22
-*
-                     CALL DSYRK( 'Upper', 'Transpose', I2, IB, -ONE,
-     $                           AB( KD+1-IB, I+IB ), LDAB-1, ONE,
-     $                           AB( KD+1, I+IB ), LDAB-1 )
-                  END IF
-*
-                  IF( I3.GT.0 ) THEN
-*
-*                    Copy the lower triangle of A13 into the work array.
-*
-                     DO 40 JJ = 1, I3
-                        DO 30 II = JJ, IB
-                           WORK( II, JJ ) = AB( II-JJ+1, JJ+I+KD-1 )
-   30                   CONTINUE
-   40                CONTINUE
-*
-*                    Update A13 (in the work array).
-*
-                     CALL DTRSM( 'Left', 'Upper', 'Transpose',
-     $                           'Non-unit', IB, I3, ONE, AB( KD+1, I ),
-     $                           LDAB-1, WORK, LDWORK )
-*
-*                    Update A23
-*
-                     IF( I2.GT.0 )
-     $                  CALL DGEMM( 'Transpose', 'No Transpose', I2, I3,
-     $                              IB, -ONE, AB( KD+1-IB, I+IB ),
-     $                              LDAB-1, WORK, LDWORK, ONE,
-     $                              AB( 1+IB, I+KD ), LDAB-1 )
-*
-*                    Update A33
-*
-                     CALL DSYRK( 'Upper', 'Transpose', I3, IB, -ONE,
-     $                           WORK, LDWORK, ONE, AB( KD+1, I+KD ),
-     $                           LDAB-1 )
-*
-*                    Copy the lower triangle of A13 back into place.
-*
-                     DO 60 JJ = 1, I3
-                        DO 50 II = JJ, IB
-                           AB( II-JJ+1, JJ+I+KD-1 ) = WORK( II, JJ )
-   50                   CONTINUE
-   60                CONTINUE
-                  END IF
-               END IF
-   70       CONTINUE
-         ELSE
-*
-*           Compute the Cholesky factorization of a symmetric band
-*           matrix, given the lower triangle of the matrix in band
-*           storage.
-*
-*           Zero the lower triangle of the work array.
-*
-            DO 90 J = 1, NB
-               DO 80 I = J + 1, NB
-                  WORK( I, J ) = ZERO
-   80          CONTINUE
-   90       CONTINUE
-*
-*           Process the band matrix one diagonal block at a time.
-*
-            DO 140 I = 1, N, NB
-               IB = MIN( NB, N-I+1 )
-*
-*              Factorize the diagonal block
-*
-               CALL DPOTF2( UPLO, IB, AB( 1, I ), LDAB-1, II )
-               IF( II.NE.0 ) THEN
-                  INFO = I + II - 1
-                  GO TO 150
-               END IF
-               IF( I+IB.LE.N ) THEN
-*
-*                 Update the relevant part of the trailing submatrix.
-*                 If A11 denotes the diagonal block which has just been
-*                 factorized, then we need to update the remaining
-*                 blocks in the diagram:
-*
-*                    A11
-*                    A21   A22
-*                    A31   A32   A33
-*
-*                 The numbers of rows and columns in the partitioning
-*                 are IB, I2, I3 respectively. The blocks A21, A22 and
-*                 A32 are empty if IB = KD. The lower triangle of A31
-*                 lies outside the band.
-*
-                  I2 = MIN( KD-IB, N-I-IB+1 )
-                  I3 = MIN( IB, N-I-KD+1 )
-*
-                  IF( I2.GT.0 ) THEN
-*
-*                    Update A21
-*
-                     CALL DTRSM( 'Right', 'Lower', 'Transpose',
-     $                           'Non-unit', I2, IB, ONE, AB( 1, I ),
-     $                           LDAB-1, AB( 1+IB, I ), LDAB-1 )
-*
-*                    Update A22
-*
-                     CALL DSYRK( 'Lower', 'No Transpose', I2, IB, -ONE,
-     $                           AB( 1+IB, I ), LDAB-1, ONE,
-     $                           AB( 1, I+IB ), LDAB-1 )
-                  END IF
-*
-                  IF( I3.GT.0 ) THEN
-*
-*                    Copy the upper triangle of A31 into the work array.
-*
-                     DO 110 JJ = 1, IB
-                        DO 100 II = 1, MIN( JJ, I3 )
-                           WORK( II, JJ ) = AB( KD+1-JJ+II, JJ+I-1 )
-  100                   CONTINUE
-  110                CONTINUE
-*
-*                    Update A31 (in the work array).
-*
-                     CALL DTRSM( 'Right', 'Lower', 'Transpose',
-     $                           'Non-unit', I3, IB, ONE, AB( 1, I ),
-     $                           LDAB-1, WORK, LDWORK )
-*
-*                    Update A32
-*
-                     IF( I2.GT.0 )
-     $                  CALL DGEMM( 'No transpose', 'Transpose', I3, I2,
-     $                              IB, -ONE, WORK, LDWORK,
-     $                              AB( 1+IB, I ), LDAB-1, ONE,
-     $                              AB( 1+KD-IB, I+IB ), LDAB-1 )
-*
-*                    Update A33
-*
-                     CALL DSYRK( 'Lower', 'No Transpose', I3, IB, -ONE,
-     $                           WORK, LDWORK, ONE, AB( 1, I+KD ),
-     $                           LDAB-1 )
-*
-*                    Copy the upper triangle of A31 back into place.
-*
-                     DO 130 JJ = 1, IB
-                        DO 120 II = 1, MIN( JJ, I3 )
-                           AB( KD+1-JJ+II, JJ+I-1 ) = WORK( II, JJ )
-  120                   CONTINUE
-  130                CONTINUE
-                  END IF
-               END IF
-  140       CONTINUE
-         END IF
-      END IF
-      RETURN
-*
-  150 CONTINUE
-      RETURN
-*
-*     End of DPBTRF
-*
-      END
--- a/libcruft/lapack/dpbtrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-      SUBROUTINE DPBTRS( UPLO, N, KD, NRHS, AB, LDAB, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, KD, LDAB, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   AB( LDAB, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DPBTRS solves a system of linear equations A*X = B with a symmetric
-*  positive definite band matrix A using the Cholesky factorization
-*  A = U**T*U or A = L*L**T computed by DPBTRF.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangular factor stored in AB;
-*          = 'L':  Lower triangular factor stored in AB.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of superdiagonals of the matrix A if UPLO = 'U',
-*          or the number of subdiagonals if UPLO = 'L'.  KD >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  AB      (input) DOUBLE PRECISION array, dimension (LDAB,N)
-*          The triangular factor U or L from the Cholesky factorization
-*          A = U**T*U or A = L*L**T of the band matrix A, stored in the
-*          first KD+1 rows of the array.  The j-th column of U or L is
-*          stored in the j-th column of the array AB as follows:
-*          if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO ='L', AB(1+i-j,j)    = L(i,j) for j<=i<=min(n,j+kd).
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DTBSV, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -6
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DPBTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Solve A*X = B where A = U'*U.
-*
-         DO 10 J = 1, NRHS
-*
-*           Solve U'*X = B, overwriting B with X.
-*
-            CALL DTBSV( 'Upper', 'Transpose', 'Non-unit', N, KD, AB,
-     $                  LDAB, B( 1, J ), 1 )
-*
-*           Solve U*X = B, overwriting B with X.
-*
-            CALL DTBSV( 'Upper', 'No transpose', 'Non-unit', N, KD, AB,
-     $                  LDAB, B( 1, J ), 1 )
-   10    CONTINUE
-      ELSE
-*
-*        Solve A*X = B where A = L*L'.
-*
-         DO 20 J = 1, NRHS
-*
-*           Solve L*X = B, overwriting B with X.
-*
-            CALL DTBSV( 'Lower', 'No transpose', 'Non-unit', N, KD, AB,
-     $                  LDAB, B( 1, J ), 1 )
-*
-*           Solve L'*X = B, overwriting B with X.
-*
-            CALL DTBSV( 'Lower', 'Transpose', 'Non-unit', N, KD, AB,
-     $                  LDAB, B( 1, J ), 1 )
-   20    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of DPBTRS
-*
-      END
--- a/libcruft/lapack/dpocon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,177 +0,0 @@
-      SUBROUTINE DPOCON( UPLO, N, A, LDA, ANORM, RCOND, WORK, IWORK,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-      DOUBLE PRECISION   ANORM, RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      DOUBLE PRECISION   A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DPOCON estimates the reciprocal of the condition number (in the
-*  1-norm) of a real symmetric positive definite matrix using the
-*  Cholesky factorization A = U**T*U or A = L*L**T computed by DPOTRF.
-*
-*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
-*  condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))).
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA,N)
-*          The triangular factor U or L from the Cholesky factorization
-*          A = U**T*U or A = L*L**T, as computed by DPOTRF.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  ANORM   (input) DOUBLE PRECISION
-*          The 1-norm (or infinity-norm) of the symmetric matrix A.
-*
-*  RCOND   (output) DOUBLE PRECISION
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an
-*          estimate of the 1-norm of inv(A) computed in this routine.
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (3*N)
-*
-*  IWORK   (workspace) INTEGER array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      CHARACTER          NORMIN
-      INTEGER            IX, KASE
-      DOUBLE PRECISION   AINVNM, SCALE, SCALEL, SCALEU, SMLNUM
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           LSAME, IDAMAX, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLACN2, DLATRS, DRSCL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( ANORM.LT.ZERO ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DPOCON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      RCOND = ZERO
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      ELSE IF( ANORM.EQ.ZERO ) THEN
-         RETURN
-      END IF
-*
-      SMLNUM = DLAMCH( 'Safe minimum' )
-*
-*     Estimate the 1-norm of inv(A).
-*
-      KASE = 0
-      NORMIN = 'N'
-   10 CONTINUE
-      CALL DLACN2( N, WORK( N+1 ), WORK, IWORK, AINVNM, KASE, ISAVE )
-      IF( KASE.NE.0 ) THEN
-         IF( UPPER ) THEN
-*
-*           Multiply by inv(U').
-*
-            CALL DLATRS( 'Upper', 'Transpose', 'Non-unit', NORMIN, N, A,
-     $                   LDA, WORK, SCALEL, WORK( 2*N+1 ), INFO )
-            NORMIN = 'Y'
-*
-*           Multiply by inv(U).
-*
-            CALL DLATRS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   A, LDA, WORK, SCALEU, WORK( 2*N+1 ), INFO )
-         ELSE
-*
-*           Multiply by inv(L).
-*
-            CALL DLATRS( 'Lower', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   A, LDA, WORK, SCALEL, WORK( 2*N+1 ), INFO )
-            NORMIN = 'Y'
-*
-*           Multiply by inv(L').
-*
-            CALL DLATRS( 'Lower', 'Transpose', 'Non-unit', NORMIN, N, A,
-     $                   LDA, WORK, SCALEU, WORK( 2*N+1 ), INFO )
-         END IF
-*
-*        Multiply by 1/SCALE if doing so will not cause overflow.
-*
-         SCALE = SCALEL*SCALEU
-         IF( SCALE.NE.ONE ) THEN
-            IX = IDAMAX( N, WORK, 1 )
-            IF( SCALE.LT.ABS( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
-     $         GO TO 20
-            CALL DRSCL( N, SCALE, WORK, 1 )
-         END IF
-         GO TO 10
-      END IF
-*
-*     Compute the estimate of the reciprocal condition number.
-*
-      IF( AINVNM.NE.ZERO )
-     $   RCOND = ( ONE / AINVNM ) / ANORM
-*
-   20 CONTINUE
-      RETURN
-*
-*     End of DPOCON
-*
-      END
--- a/libcruft/lapack/dpotf2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,167 +0,0 @@
-      SUBROUTINE DPOTF2( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DPOTF2 computes the Cholesky factorization of a real symmetric
-*  positive definite matrix A.
-*
-*  The factorization has the form
-*     A = U' * U ,  if UPLO = 'U', or
-*     A = L  * L',  if UPLO = 'L',
-*  where U is an upper triangular matrix and L is lower triangular.
-*
-*  This is the unblocked version of the algorithm, calling Level 2 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          symmetric matrix A is stored.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the leading
-*          n by n upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n by n lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*
-*          On exit, if INFO = 0, the factor U or L from the Cholesky
-*          factorization A = U'*U  or A = L*L'.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*          > 0: if INFO = k, the leading minor of order k is not
-*               positive definite, and the factorization could not be
-*               completed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            J
-      DOUBLE PRECISION   AJJ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   DDOT
-      EXTERNAL           LSAME, DDOT
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMV, DSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DPOTF2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Compute the Cholesky factorization A = U'*U.
-*
-         DO 10 J = 1, N
-*
-*           Compute U(J,J) and test for non-positive-definiteness.
-*
-            AJJ = A( J, J ) - DDOT( J-1, A( 1, J ), 1, A( 1, J ), 1 )
-            IF( AJJ.LE.ZERO ) THEN
-               A( J, J ) = AJJ
-               GO TO 30
-            END IF
-            AJJ = SQRT( AJJ )
-            A( J, J ) = AJJ
-*
-*           Compute elements J+1:N of row J.
-*
-            IF( J.LT.N ) THEN
-               CALL DGEMV( 'Transpose', J-1, N-J, -ONE, A( 1, J+1 ),
-     $                     LDA, A( 1, J ), 1, ONE, A( J, J+1 ), LDA )
-               CALL DSCAL( N-J, ONE / AJJ, A( J, J+1 ), LDA )
-            END IF
-   10    CONTINUE
-      ELSE
-*
-*        Compute the Cholesky factorization A = L*L'.
-*
-         DO 20 J = 1, N
-*
-*           Compute L(J,J) and test for non-positive-definiteness.
-*
-            AJJ = A( J, J ) - DDOT( J-1, A( J, 1 ), LDA, A( J, 1 ),
-     $            LDA )
-            IF( AJJ.LE.ZERO ) THEN
-               A( J, J ) = AJJ
-               GO TO 30
-            END IF
-            AJJ = SQRT( AJJ )
-            A( J, J ) = AJJ
-*
-*           Compute elements J+1:N of column J.
-*
-            IF( J.LT.N ) THEN
-               CALL DGEMV( 'No transpose', N-J, J-1, -ONE, A( J+1, 1 ),
-     $                     LDA, A( J, 1 ), LDA, ONE, A( J+1, J ), 1 )
-               CALL DSCAL( N-J, ONE / AJJ, A( J+1, J ), 1 )
-            END IF
-   20    CONTINUE
-      END IF
-      GO TO 40
-*
-   30 CONTINUE
-      INFO = J
-*
-   40 CONTINUE
-      RETURN
-*
-*     End of DPOTF2
-*
-      END
--- a/libcruft/lapack/dpotrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,183 +0,0 @@
-      SUBROUTINE DPOTRF( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DPOTRF computes the Cholesky factorization of a real symmetric
-*  positive definite matrix A.
-*
-*  The factorization has the form
-*     A = U**T * U,  if UPLO = 'U', or
-*     A = L  * L**T,  if UPLO = 'L',
-*  where U is an upper triangular matrix and L is lower triangular.
-*
-*  This is the block version of the algorithm, calling Level 3 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the leading
-*          N-by-N upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading N-by-N lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*
-*          On exit, if INFO = 0, the factor U or L from the Cholesky
-*          factorization A = U**T*U or A = L*L**T.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the leading minor of order i is not
-*                positive definite, and the factorization could not be
-*                completed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            J, JB, NB
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMM, DPOTF2, DSYRK, DTRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DPOTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'DPOTRF', UPLO, N, -1, -1, -1 )
-      IF( NB.LE.1 .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code.
-*
-         CALL DPOTF2( UPLO, N, A, LDA, INFO )
-      ELSE
-*
-*        Use blocked code.
-*
-         IF( UPPER ) THEN
-*
-*           Compute the Cholesky factorization A = U'*U.
-*
-            DO 10 J = 1, N, NB
-*
-*              Update and factorize the current diagonal block and test
-*              for non-positive-definiteness.
-*
-               JB = MIN( NB, N-J+1 )
-               CALL DSYRK( 'Upper', 'Transpose', JB, J-1, -ONE,
-     $                     A( 1, J ), LDA, ONE, A( J, J ), LDA )
-               CALL DPOTF2( 'Upper', JB, A( J, J ), LDA, INFO )
-               IF( INFO.NE.0 )
-     $            GO TO 30
-               IF( J+JB.LE.N ) THEN
-*
-*                 Compute the current block row.
-*
-                  CALL DGEMM( 'Transpose', 'No transpose', JB, N-J-JB+1,
-     $                        J-1, -ONE, A( 1, J ), LDA, A( 1, J+JB ),
-     $                        LDA, ONE, A( J, J+JB ), LDA )
-                  CALL DTRSM( 'Left', 'Upper', 'Transpose', 'Non-unit',
-     $                        JB, N-J-JB+1, ONE, A( J, J ), LDA,
-     $                        A( J, J+JB ), LDA )
-               END IF
-   10       CONTINUE
-*
-         ELSE
-*
-*           Compute the Cholesky factorization A = L*L'.
-*
-            DO 20 J = 1, N, NB
-*
-*              Update and factorize the current diagonal block and test
-*              for non-positive-definiteness.
-*
-               JB = MIN( NB, N-J+1 )
-               CALL DSYRK( 'Lower', 'No transpose', JB, J-1, -ONE,
-     $                     A( J, 1 ), LDA, ONE, A( J, J ), LDA )
-               CALL DPOTF2( 'Lower', JB, A( J, J ), LDA, INFO )
-               IF( INFO.NE.0 )
-     $            GO TO 30
-               IF( J+JB.LE.N ) THEN
-*
-*                 Compute the current block column.
-*
-                  CALL DGEMM( 'No transpose', 'Transpose', N-J-JB+1, JB,
-     $                        J-1, -ONE, A( J+JB, 1 ), LDA, A( J, 1 ),
-     $                        LDA, ONE, A( J+JB, J ), LDA )
-                  CALL DTRSM( 'Right', 'Lower', 'Transpose', 'Non-unit',
-     $                        N-J-JB+1, JB, ONE, A( J, J ), LDA,
-     $                        A( J+JB, J ), LDA )
-               END IF
-   20       CONTINUE
-         END IF
-      END IF
-      GO TO 40
-*
-   30 CONTINUE
-      INFO = INFO + J - 1
-*
-   40 CONTINUE
-      RETURN
-*
-*     End of DPOTRF
-*
-      END
--- a/libcruft/lapack/dpotri.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-      SUBROUTINE DPOTRI( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DPOTRI computes the inverse of a real symmetric positive definite
-*  matrix A using the Cholesky factorization A = U**T*U or A = L*L**T
-*  computed by DPOTRF.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the triangular factor U or L from the Cholesky
-*          factorization A = U**T*U or A = L*L**T, as computed by
-*          DPOTRF.
-*          On exit, the upper or lower triangle of the (symmetric)
-*          inverse of A, overwriting the input factor U or L.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the (i,i) element of the factor U or L is
-*                zero, and the inverse could not be computed.
-*
-*  =====================================================================
-*
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLAUUM, DTRTRI, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DPOTRI', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Invert the triangular Cholesky factor U or L.
-*
-      CALL DTRTRI( UPLO, 'Non-unit', N, A, LDA, INFO )
-      IF( INFO.GT.0 )
-     $   RETURN
-*
-*     Form inv(U)*inv(U)' or inv(L)'*inv(L).
-*
-      CALL DLAUUM( UPLO, N, A, LDA, INFO )
-*
-      RETURN
-*
-*     End of DPOTRI
-*
-      END
--- a/libcruft/lapack/dpotrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-      SUBROUTINE DPOTRS( UPLO, N, NRHS, A, LDA, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DPOTRS solves a system of linear equations A*X = B with a symmetric
-*  positive definite matrix A using the Cholesky factorization
-*  A = U**T*U or A = L*L**T computed by DPOTRF.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA,N)
-*          The triangular factor U or L from the Cholesky factorization
-*          A = U**T*U or A = L*L**T, as computed by DPOTRF.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DTRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DPOTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Solve A*X = B where A = U'*U.
-*
-*        Solve U'*X = B, overwriting B with X.
-*
-         CALL DTRSM( 'Left', 'Upper', 'Transpose', 'Non-unit', N, NRHS,
-     $               ONE, A, LDA, B, LDB )
-*
-*        Solve U*X = B, overwriting B with X.
-*
-         CALL DTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N,
-     $               NRHS, ONE, A, LDA, B, LDB )
-      ELSE
-*
-*        Solve A*X = B where A = L*L'.
-*
-*        Solve L*X = B, overwriting B with X.
-*
-         CALL DTRSM( 'Left', 'Lower', 'No transpose', 'Non-unit', N,
-     $               NRHS, ONE, A, LDA, B, LDB )
-*
-*        Solve L'*X = B, overwriting B with X.
-*
-         CALL DTRSM( 'Left', 'Lower', 'Transpose', 'Non-unit', N, NRHS,
-     $               ONE, A, LDA, B, LDB )
-      END IF
-*
-      RETURN
-*
-*     End of DPOTRS
-*
-      END
--- a/libcruft/lapack/dptsv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-      SUBROUTINE DPTSV( N, NRHS, D, E, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   B( LDB, * ), D( * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DPTSV computes the solution to a real system of linear equations
-*  A*X = B, where A is an N-by-N symmetric positive definite tridiagonal
-*  matrix, and X and B are N-by-NRHS matrices.
-*
-*  A is factored as A = L*D*L**T, and the factored form of A is then
-*  used to solve the system of equations.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  D       (input/output) DOUBLE PRECISION array, dimension (N)
-*          On entry, the n diagonal elements of the tridiagonal matrix
-*          A.  On exit, the n diagonal elements of the diagonal matrix
-*          D from the factorization A = L*D*L**T.
-*
-*  E       (input/output) DOUBLE PRECISION array, dimension (N-1)
-*          On entry, the (n-1) subdiagonal elements of the tridiagonal
-*          matrix A.  On exit, the (n-1) subdiagonal elements of the
-*          unit bidiagonal factor L from the L*D*L**T factorization of
-*          A.  (E can also be regarded as the superdiagonal of the unit
-*          bidiagonal factor U from the U**T*D*U factorization of A.)
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*          On entry, the N-by-NRHS right hand side matrix B.
-*          On exit, if INFO = 0, the N-by-NRHS solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the leading minor of order i is not
-*                positive definite, and the solution has not been
-*                computed.  The factorization has not been completed
-*                unless i = N.
-*
-*  =====================================================================
-*
-*     .. External Subroutines ..
-      EXTERNAL           DPTTRF, DPTTRS, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DPTSV ', -INFO )
-         RETURN
-      END IF
-*
-*     Compute the L*D*L' (or U'*D*U) factorization of A.
-*
-      CALL DPTTRF( N, D, E, INFO )
-      IF( INFO.EQ.0 ) THEN
-*
-*        Solve the system A*X = B, overwriting B with X.
-*
-         CALL DPTTRS( N, NRHS, D, E, B, LDB, INFO )
-      END IF
-      RETURN
-*
-*     End of DPTSV
-*
-      END
--- a/libcruft/lapack/dpttrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,152 +0,0 @@
-      SUBROUTINE DPTTRF( N, D, E, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DPTTRF computes the L*D*L' factorization of a real symmetric
-*  positive definite tridiagonal matrix A.  The factorization may also
-*  be regarded as having the form A = U'*D*U.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  D       (input/output) DOUBLE PRECISION array, dimension (N)
-*          On entry, the n diagonal elements of the tridiagonal matrix
-*          A.  On exit, the n diagonal elements of the diagonal matrix
-*          D from the L*D*L' factorization of A.
-*
-*  E       (input/output) DOUBLE PRECISION array, dimension (N-1)
-*          On entry, the (n-1) subdiagonal elements of the tridiagonal
-*          matrix A.  On exit, the (n-1) subdiagonal elements of the
-*          unit bidiagonal factor L from the L*D*L' factorization of A.
-*          E can also be regarded as the superdiagonal of the unit
-*          bidiagonal factor U from the U'*D*U factorization of A.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*          > 0: if INFO = k, the leading minor of order k is not
-*               positive definite; if k < N, the factorization could not
-*               be completed, while if k = N, the factorization was
-*               completed, but D(N) <= 0.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I4
-      DOUBLE PRECISION   EI
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MOD
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-         CALL XERBLA( 'DPTTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Compute the L*D*L' (or U'*D*U) factorization of A.
-*
-      I4 = MOD( N-1, 4 )
-      DO 10 I = 1, I4
-         IF( D( I ).LE.ZERO ) THEN
-            INFO = I
-            GO TO 30
-         END IF
-         EI = E( I )
-         E( I ) = EI / D( I )
-         D( I+1 ) = D( I+1 ) - E( I )*EI
-   10 CONTINUE
-*
-      DO 20 I = I4 + 1, N - 4, 4
-*
-*        Drop out of the loop if d(i) <= 0: the matrix is not positive
-*        definite.
-*
-         IF( D( I ).LE.ZERO ) THEN
-            INFO = I
-            GO TO 30
-         END IF
-*
-*        Solve for e(i) and d(i+1).
-*
-         EI = E( I )
-         E( I ) = EI / D( I )
-         D( I+1 ) = D( I+1 ) - E( I )*EI
-*
-         IF( D( I+1 ).LE.ZERO ) THEN
-            INFO = I + 1
-            GO TO 30
-         END IF
-*
-*        Solve for e(i+1) and d(i+2).
-*
-         EI = E( I+1 )
-         E( I+1 ) = EI / D( I+1 )
-         D( I+2 ) = D( I+2 ) - E( I+1 )*EI
-*
-         IF( D( I+2 ).LE.ZERO ) THEN
-            INFO = I + 2
-            GO TO 30
-         END IF
-*
-*        Solve for e(i+2) and d(i+3).
-*
-         EI = E( I+2 )
-         E( I+2 ) = EI / D( I+2 )
-         D( I+3 ) = D( I+3 ) - E( I+2 )*EI
-*
-         IF( D( I+3 ).LE.ZERO ) THEN
-            INFO = I + 3
-            GO TO 30
-         END IF
-*
-*        Solve for e(i+3) and d(i+4).
-*
-         EI = E( I+3 )
-         E( I+3 ) = EI / D( I+3 )
-         D( I+4 ) = D( I+4 ) - E( I+3 )*EI
-   20 CONTINUE
-*
-*     Check d(n) for positive definiteness.
-*
-      IF( D( N ).LE.ZERO )
-     $   INFO = N
-*
-   30 CONTINUE
-      RETURN
-*
-*     End of DPTTRF
-*
-      END
--- a/libcruft/lapack/dpttrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-      SUBROUTINE DPTTRS( N, NRHS, D, E, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   B( LDB, * ), D( * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DPTTRS solves a tridiagonal system of the form
-*     A * X = B
-*  using the L*D*L' factorization of A computed by DPTTRF.  D is a
-*  diagonal matrix specified in the vector D, L is a unit bidiagonal
-*  matrix whose subdiagonal is specified in the vector E, and X and B
-*  are N by NRHS matrices.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the tridiagonal matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  D       (input) DOUBLE PRECISION array, dimension (N)
-*          The n diagonal elements of the diagonal matrix D from the
-*          L*D*L' factorization of A.
-*
-*  E       (input) DOUBLE PRECISION array, dimension (N-1)
-*          The (n-1) subdiagonal elements of the unit bidiagonal factor
-*          L from the L*D*L' factorization of A.  E can also be regarded
-*          as the superdiagonal of the unit bidiagonal factor U from the
-*          factorization A = U'*D*U.
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*          On entry, the right hand side vectors B for the system of
-*          linear equations.
-*          On exit, the solution vectors, X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            J, JB, NB
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DPTTS2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments.
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DPTTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-*     Determine the number of right-hand sides to solve at a time.
-*
-      IF( NRHS.EQ.1 ) THEN
-         NB = 1
-      ELSE
-         NB = MAX( 1, ILAENV( 1, 'DPTTRS', ' ', N, NRHS, -1, -1 ) )
-      END IF
-*
-      IF( NB.GE.NRHS ) THEN
-         CALL DPTTS2( N, NRHS, D, E, B, LDB )
-      ELSE
-         DO 10 J = 1, NRHS, NB
-            JB = MIN( NRHS-J+1, NB )
-            CALL DPTTS2( N, JB, D, E, B( 1, J ), LDB )
-   10    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of DPTTRS
-*
-      END
--- a/libcruft/lapack/dptts2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-      SUBROUTINE DPTTS2( N, NRHS, D, E, B, LDB )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   B( LDB, * ), D( * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DPTTS2 solves a tridiagonal system of the form
-*     A * X = B
-*  using the L*D*L' factorization of A computed by DPTTRF.  D is a
-*  diagonal matrix specified in the vector D, L is a unit bidiagonal
-*  matrix whose subdiagonal is specified in the vector E, and X and B
-*  are N by NRHS matrices.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the tridiagonal matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  D       (input) DOUBLE PRECISION array, dimension (N)
-*          The n diagonal elements of the diagonal matrix D from the
-*          L*D*L' factorization of A.
-*
-*  E       (input) DOUBLE PRECISION array, dimension (N-1)
-*          The (n-1) subdiagonal elements of the unit bidiagonal factor
-*          L from the L*D*L' factorization of A.  E can also be regarded
-*          as the superdiagonal of the unit bidiagonal factor U from the
-*          factorization A = U'*D*U.
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*          On entry, the right hand side vectors B for the system of
-*          linear equations.
-*          On exit, the solution vectors, X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, J
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DSCAL
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 ) THEN
-         IF( N.EQ.1 )
-     $      CALL DSCAL( NRHS, 1.D0 / D( 1 ), B, LDB )
-         RETURN
-      END IF
-*
-*     Solve A * X = B using the factorization A = L*D*L',
-*     overwriting each right hand side vector with its solution.
-*
-      DO 30 J = 1, NRHS
-*
-*           Solve L * x = b.
-*
-         DO 10 I = 2, N
-            B( I, J ) = B( I, J ) - B( I-1, J )*E( I-1 )
-   10    CONTINUE
-*
-*           Solve D * L' * x = b.
-*
-         B( N, J ) = B( N, J ) / D( N )
-         DO 20 I = N - 1, 1, -1
-            B( I, J ) = B( I, J ) / D( I ) - B( I+1, J )*E( I )
-   20    CONTINUE
-   30 CONTINUE
-*
-      RETURN
-*
-*     End of DPTTS2
-*
-      END
--- a/libcruft/lapack/drscl.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-      SUBROUTINE DRSCL( N, SA, SX, INCX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-      DOUBLE PRECISION   SA
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   SX( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DRSCL multiplies an n-element real vector x by the real scalar 1/a.
-*  This is done without overflow or underflow as long as
-*  the final result x/a does not overflow or underflow.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of components of the vector x.
-*
-*  SA      (input) DOUBLE PRECISION
-*          The scalar a which is used to divide each component of x.
-*          SA must be >= 0, or the subroutine will divide by zero.
-*
-*  SX      (input/output) DOUBLE PRECISION array, dimension
-*                         (1+(N-1)*abs(INCX))
-*          The n-element vector x.
-*
-*  INCX    (input) INTEGER
-*          The increment between successive values of the vector SX.
-*          > 0:  SX(1) = X(1) and SX(1+(i-1)*INCX) = x(i),     1< i<= n
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            DONE
-      DOUBLE PRECISION   BIGNUM, CDEN, CDEN1, CNUM, CNUM1, MUL, SMLNUM
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DSCAL
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-*     Get machine parameters
-*
-      SMLNUM = DLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-*
-*     Initialize the denominator to SA and the numerator to 1.
-*
-      CDEN = SA
-      CNUM = ONE
-*
-   10 CONTINUE
-      CDEN1 = CDEN*SMLNUM
-      CNUM1 = CNUM / BIGNUM
-      IF( ABS( CDEN1 ).GT.ABS( CNUM ) .AND. CNUM.NE.ZERO ) THEN
-*
-*        Pre-multiply X by SMLNUM if CDEN is large compared to CNUM.
-*
-         MUL = SMLNUM
-         DONE = .FALSE.
-         CDEN = CDEN1
-      ELSE IF( ABS( CNUM1 ).GT.ABS( CDEN ) ) THEN
-*
-*        Pre-multiply X by BIGNUM if CDEN is small compared to CNUM.
-*
-         MUL = BIGNUM
-         DONE = .FALSE.
-         CNUM = CNUM1
-      ELSE
-*
-*        Multiply X by CNUM / CDEN and return.
-*
-         MUL = CNUM / CDEN
-         DONE = .TRUE.
-      END IF
-*
-*     Scale the vector X by MUL
-*
-      CALL DSCAL( N, MUL, SX, INCX )
-*
-      IF( .NOT.DONE )
-     $   GO TO 10
-*
-      RETURN
-*
-*     End of DRSCL
-*
-      END
--- a/libcruft/lapack/dsteqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,500 +0,0 @@
-      SUBROUTINE DSTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPZ
-      INTEGER            INFO, LDZ, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * ), E( * ), WORK( * ), Z( LDZ, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DSTEQR computes all eigenvalues and, optionally, eigenvectors of a
-*  symmetric tridiagonal matrix using the implicit QL or QR method.
-*  The eigenvectors of a full or band symmetric matrix can also be found
-*  if DSYTRD or DSPTRD or DSBTRD has been used to reduce this matrix to
-*  tridiagonal form.
-*
-*  Arguments
-*  =========
-*
-*  COMPZ   (input) CHARACTER*1
-*          = 'N':  Compute eigenvalues only.
-*          = 'V':  Compute eigenvalues and eigenvectors of the original
-*                  symmetric matrix.  On entry, Z must contain the
-*                  orthogonal matrix used to reduce the original matrix
-*                  to tridiagonal form.
-*          = 'I':  Compute eigenvalues and eigenvectors of the
-*                  tridiagonal matrix.  Z is initialized to the identity
-*                  matrix.
-*
-*  N       (input) INTEGER
-*          The order of the matrix.  N >= 0.
-*
-*  D       (input/output) DOUBLE PRECISION array, dimension (N)
-*          On entry, the diagonal elements of the tridiagonal matrix.
-*          On exit, if INFO = 0, the eigenvalues in ascending order.
-*
-*  E       (input/output) DOUBLE PRECISION array, dimension (N-1)
-*          On entry, the (n-1) subdiagonal elements of the tridiagonal
-*          matrix.
-*          On exit, E has been destroyed.
-*
-*  Z       (input/output) DOUBLE PRECISION array, dimension (LDZ, N)
-*          On entry, if  COMPZ = 'V', then Z contains the orthogonal
-*          matrix used in the reduction to tridiagonal form.
-*          On exit, if INFO = 0, then if  COMPZ = 'V', Z contains the
-*          orthonormal eigenvectors of the original symmetric matrix,
-*          and if COMPZ = 'I', Z contains the orthonormal eigenvectors
-*          of the symmetric tridiagonal matrix.
-*          If COMPZ = 'N', then Z is not referenced.
-*
-*  LDZ     (input) INTEGER
-*          The leading dimension of the array Z.  LDZ >= 1, and if
-*          eigenvectors are desired, then  LDZ >= max(1,N).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (max(1,2*N-2))
-*          If COMPZ = 'N', then WORK is not referenced.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  the algorithm has failed to find all the eigenvalues in
-*                a total of 30*N iterations; if INFO = i, then i
-*                elements of E have not converged to zero; on exit, D
-*                and E contain the elements of a symmetric tridiagonal
-*                matrix which is orthogonally similar to the original
-*                matrix.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE, TWO, THREE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0,
-     $                   THREE = 3.0D0 )
-      INTEGER            MAXIT
-      PARAMETER          ( MAXIT = 30 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ICOMPZ, II, ISCALE, J, JTOT, K, L, L1, LEND,
-     $                   LENDM1, LENDP1, LENDSV, LM1, LSV, M, MM, MM1,
-     $                   NM1, NMAXIT
-      DOUBLE PRECISION   ANORM, B, C, EPS, EPS2, F, G, P, R, RT1, RT2,
-     $                   S, SAFMAX, SAFMIN, SSFMAX, SSFMIN, TST
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   DLAMCH, DLANST, DLAPY2
-      EXTERNAL           LSAME, DLAMCH, DLANST, DLAPY2
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLAE2, DLAEV2, DLARTG, DLASCL, DLASET, DLASR,
-     $                   DLASRT, DSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( LSAME( COMPZ, 'N' ) ) THEN
-         ICOMPZ = 0
-      ELSE IF( LSAME( COMPZ, 'V' ) ) THEN
-         ICOMPZ = 1
-      ELSE IF( LSAME( COMPZ, 'I' ) ) THEN
-         ICOMPZ = 2
-      ELSE
-         ICOMPZ = -1
-      END IF
-      IF( ICOMPZ.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( ( LDZ.LT.1 ) .OR. ( ICOMPZ.GT.0 .AND. LDZ.LT.MAX( 1,
-     $         N ) ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DSTEQR', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( N.EQ.1 ) THEN
-         IF( ICOMPZ.EQ.2 )
-     $      Z( 1, 1 ) = ONE
-         RETURN
-      END IF
-*
-*     Determine the unit roundoff and over/underflow thresholds.
-*
-      EPS = DLAMCH( 'E' )
-      EPS2 = EPS**2
-      SAFMIN = DLAMCH( 'S' )
-      SAFMAX = ONE / SAFMIN
-      SSFMAX = SQRT( SAFMAX ) / THREE
-      SSFMIN = SQRT( SAFMIN ) / EPS2
-*
-*     Compute the eigenvalues and eigenvectors of the tridiagonal
-*     matrix.
-*
-      IF( ICOMPZ.EQ.2 )
-     $   CALL DLASET( 'Full', N, N, ZERO, ONE, Z, LDZ )
-*
-      NMAXIT = N*MAXIT
-      JTOT = 0
-*
-*     Determine where the matrix splits and choose QL or QR iteration
-*     for each block, according to whether top or bottom diagonal
-*     element is smaller.
-*
-      L1 = 1
-      NM1 = N - 1
-*
-   10 CONTINUE
-      IF( L1.GT.N )
-     $   GO TO 160
-      IF( L1.GT.1 )
-     $   E( L1-1 ) = ZERO
-      IF( L1.LE.NM1 ) THEN
-         DO 20 M = L1, NM1
-            TST = ABS( E( M ) )
-            IF( TST.EQ.ZERO )
-     $         GO TO 30
-            IF( TST.LE.( SQRT( ABS( D( M ) ) )*SQRT( ABS( D( M+
-     $          1 ) ) ) )*EPS ) THEN
-               E( M ) = ZERO
-               GO TO 30
-            END IF
-   20    CONTINUE
-      END IF
-      M = N
-*
-   30 CONTINUE
-      L = L1
-      LSV = L
-      LEND = M
-      LENDSV = LEND
-      L1 = M + 1
-      IF( LEND.EQ.L )
-     $   GO TO 10
-*
-*     Scale submatrix in rows and columns L to LEND
-*
-      ANORM = DLANST( 'I', LEND-L+1, D( L ), E( L ) )
-      ISCALE = 0
-      IF( ANORM.EQ.ZERO )
-     $   GO TO 10
-      IF( ANORM.GT.SSFMAX ) THEN
-         ISCALE = 1
-         CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L+1, 1, D( L ), N,
-     $                INFO )
-         CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L, 1, E( L ), N,
-     $                INFO )
-      ELSE IF( ANORM.LT.SSFMIN ) THEN
-         ISCALE = 2
-         CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L+1, 1, D( L ), N,
-     $                INFO )
-         CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L, 1, E( L ), N,
-     $                INFO )
-      END IF
-*
-*     Choose between QL and QR iteration
-*
-      IF( ABS( D( LEND ) ).LT.ABS( D( L ) ) ) THEN
-         LEND = LSV
-         L = LENDSV
-      END IF
-*
-      IF( LEND.GT.L ) THEN
-*
-*        QL Iteration
-*
-*        Look for small subdiagonal element.
-*
-   40    CONTINUE
-         IF( L.NE.LEND ) THEN
-            LENDM1 = LEND - 1
-            DO 50 M = L, LENDM1
-               TST = ABS( E( M ) )**2
-               IF( TST.LE.( EPS2*ABS( D( M ) ) )*ABS( D( M+1 ) )+
-     $             SAFMIN )GO TO 60
-   50       CONTINUE
-         END IF
-*
-         M = LEND
-*
-   60    CONTINUE
-         IF( M.LT.LEND )
-     $      E( M ) = ZERO
-         P = D( L )
-         IF( M.EQ.L )
-     $      GO TO 80
-*
-*        If remaining matrix is 2-by-2, use DLAE2 or SLAEV2
-*        to compute its eigensystem.
-*
-         IF( M.EQ.L+1 ) THEN
-            IF( ICOMPZ.GT.0 ) THEN
-               CALL DLAEV2( D( L ), E( L ), D( L+1 ), RT1, RT2, C, S )
-               WORK( L ) = C
-               WORK( N-1+L ) = S
-               CALL DLASR( 'R', 'V', 'B', N, 2, WORK( L ),
-     $                     WORK( N-1+L ), Z( 1, L ), LDZ )
-            ELSE
-               CALL DLAE2( D( L ), E( L ), D( L+1 ), RT1, RT2 )
-            END IF
-            D( L ) = RT1
-            D( L+1 ) = RT2
-            E( L ) = ZERO
-            L = L + 2
-            IF( L.LE.LEND )
-     $         GO TO 40
-            GO TO 140
-         END IF
-*
-         IF( JTOT.EQ.NMAXIT )
-     $      GO TO 140
-         JTOT = JTOT + 1
-*
-*        Form shift.
-*
-         G = ( D( L+1 )-P ) / ( TWO*E( L ) )
-         R = DLAPY2( G, ONE )
-         G = D( M ) - P + ( E( L ) / ( G+SIGN( R, G ) ) )
-*
-         S = ONE
-         C = ONE
-         P = ZERO
-*
-*        Inner loop
-*
-         MM1 = M - 1
-         DO 70 I = MM1, L, -1
-            F = S*E( I )
-            B = C*E( I )
-            CALL DLARTG( G, F, C, S, R )
-            IF( I.NE.M-1 )
-     $         E( I+1 ) = R
-            G = D( I+1 ) - P
-            R = ( D( I )-G )*S + TWO*C*B
-            P = S*R
-            D( I+1 ) = G + P
-            G = C*R - B
-*
-*           If eigenvectors are desired, then save rotations.
-*
-            IF( ICOMPZ.GT.0 ) THEN
-               WORK( I ) = C
-               WORK( N-1+I ) = -S
-            END IF
-*
-   70    CONTINUE
-*
-*        If eigenvectors are desired, then apply saved rotations.
-*
-         IF( ICOMPZ.GT.0 ) THEN
-            MM = M - L + 1
-            CALL DLASR( 'R', 'V', 'B', N, MM, WORK( L ), WORK( N-1+L ),
-     $                  Z( 1, L ), LDZ )
-         END IF
-*
-         D( L ) = D( L ) - P
-         E( L ) = G
-         GO TO 40
-*
-*        Eigenvalue found.
-*
-   80    CONTINUE
-         D( L ) = P
-*
-         L = L + 1
-         IF( L.LE.LEND )
-     $      GO TO 40
-         GO TO 140
-*
-      ELSE
-*
-*        QR Iteration
-*
-*        Look for small superdiagonal element.
-*
-   90    CONTINUE
-         IF( L.NE.LEND ) THEN
-            LENDP1 = LEND + 1
-            DO 100 M = L, LENDP1, -1
-               TST = ABS( E( M-1 ) )**2
-               IF( TST.LE.( EPS2*ABS( D( M ) ) )*ABS( D( M-1 ) )+
-     $             SAFMIN )GO TO 110
-  100       CONTINUE
-         END IF
-*
-         M = LEND
-*
-  110    CONTINUE
-         IF( M.GT.LEND )
-     $      E( M-1 ) = ZERO
-         P = D( L )
-         IF( M.EQ.L )
-     $      GO TO 130
-*
-*        If remaining matrix is 2-by-2, use DLAE2 or SLAEV2
-*        to compute its eigensystem.
-*
-         IF( M.EQ.L-1 ) THEN
-            IF( ICOMPZ.GT.0 ) THEN
-               CALL DLAEV2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2, C, S )
-               WORK( M ) = C
-               WORK( N-1+M ) = S
-               CALL DLASR( 'R', 'V', 'F', N, 2, WORK( M ),
-     $                     WORK( N-1+M ), Z( 1, L-1 ), LDZ )
-            ELSE
-               CALL DLAE2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2 )
-            END IF
-            D( L-1 ) = RT1
-            D( L ) = RT2
-            E( L-1 ) = ZERO
-            L = L - 2
-            IF( L.GE.LEND )
-     $         GO TO 90
-            GO TO 140
-         END IF
-*
-         IF( JTOT.EQ.NMAXIT )
-     $      GO TO 140
-         JTOT = JTOT + 1
-*
-*        Form shift.
-*
-         G = ( D( L-1 )-P ) / ( TWO*E( L-1 ) )
-         R = DLAPY2( G, ONE )
-         G = D( M ) - P + ( E( L-1 ) / ( G+SIGN( R, G ) ) )
-*
-         S = ONE
-         C = ONE
-         P = ZERO
-*
-*        Inner loop
-*
-         LM1 = L - 1
-         DO 120 I = M, LM1
-            F = S*E( I )
-            B = C*E( I )
-            CALL DLARTG( G, F, C, S, R )
-            IF( I.NE.M )
-     $         E( I-1 ) = R
-            G = D( I ) - P
-            R = ( D( I+1 )-G )*S + TWO*C*B
-            P = S*R
-            D( I ) = G + P
-            G = C*R - B
-*
-*           If eigenvectors are desired, then save rotations.
-*
-            IF( ICOMPZ.GT.0 ) THEN
-               WORK( I ) = C
-               WORK( N-1+I ) = S
-            END IF
-*
-  120    CONTINUE
-*
-*        If eigenvectors are desired, then apply saved rotations.
-*
-         IF( ICOMPZ.GT.0 ) THEN
-            MM = L - M + 1
-            CALL DLASR( 'R', 'V', 'F', N, MM, WORK( M ), WORK( N-1+M ),
-     $                  Z( 1, M ), LDZ )
-         END IF
-*
-         D( L ) = D( L ) - P
-         E( LM1 ) = G
-         GO TO 90
-*
-*        Eigenvalue found.
-*
-  130    CONTINUE
-         D( L ) = P
-*
-         L = L - 1
-         IF( L.GE.LEND )
-     $      GO TO 90
-         GO TO 140
-*
-      END IF
-*
-*     Undo scaling if necessary
-*
-  140 CONTINUE
-      IF( ISCALE.EQ.1 ) THEN
-         CALL DLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV+1, 1,
-     $                D( LSV ), N, INFO )
-         CALL DLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV, 1, E( LSV ),
-     $                N, INFO )
-      ELSE IF( ISCALE.EQ.2 ) THEN
-         CALL DLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV+1, 1,
-     $                D( LSV ), N, INFO )
-         CALL DLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV, 1, E( LSV ),
-     $                N, INFO )
-      END IF
-*
-*     Check for no convergence to an eigenvalue after a total
-*     of N*MAXIT iterations.
-*
-      IF( JTOT.LT.NMAXIT )
-     $   GO TO 10
-      DO 150 I = 1, N - 1
-         IF( E( I ).NE.ZERO )
-     $      INFO = INFO + 1
-  150 CONTINUE
-      GO TO 190
-*
-*     Order eigenvalues and eigenvectors.
-*
-  160 CONTINUE
-      IF( ICOMPZ.EQ.0 ) THEN
-*
-*        Use Quick Sort
-*
-         CALL DLASRT( 'I', N, D, INFO )
-*
-      ELSE
-*
-*        Use Selection Sort to minimize swaps of eigenvectors
-*
-         DO 180 II = 2, N
-            I = II - 1
-            K = I
-            P = D( I )
-            DO 170 J = II, N
-               IF( D( J ).LT.P ) THEN
-                  K = J
-                  P = D( J )
-               END IF
-  170       CONTINUE
-            IF( K.NE.I ) THEN
-               D( K ) = D( I )
-               D( I ) = P
-               CALL DSWAP( N, Z( 1, I ), 1, Z( 1, K ), 1 )
-            END IF
-  180    CONTINUE
-      END IF
-*
-  190 CONTINUE
-      RETURN
-*
-*     End of DSTEQR
-*
-      END
--- a/libcruft/lapack/dsterf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,364 +0,0 @@
-      SUBROUTINE DSTERF( N, D, E, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DSTERF computes all eigenvalues of a symmetric tridiagonal matrix
-*  using the Pal-Walker-Kahan variant of the QL or QR algorithm.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix.  N >= 0.
-*
-*  D       (input/output) DOUBLE PRECISION array, dimension (N)
-*          On entry, the n diagonal elements of the tridiagonal matrix.
-*          On exit, if INFO = 0, the eigenvalues in ascending order.
-*
-*  E       (input/output) DOUBLE PRECISION array, dimension (N-1)
-*          On entry, the (n-1) subdiagonal elements of the tridiagonal
-*          matrix.
-*          On exit, E has been destroyed.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  the algorithm failed to find all of the eigenvalues in
-*                a total of 30*N iterations; if INFO = i, then i
-*                elements of E have not converged to zero.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE, TWO, THREE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0,
-     $                   THREE = 3.0D0 )
-      INTEGER            MAXIT
-      PARAMETER          ( MAXIT = 30 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ISCALE, JTOT, L, L1, LEND, LENDSV, LSV, M,
-     $                   NMAXIT
-      DOUBLE PRECISION   ALPHA, ANORM, BB, C, EPS, EPS2, GAMMA, OLDC,
-     $                   OLDGAM, P, R, RT1, RT2, RTE, S, SAFMAX, SAFMIN,
-     $                   SIGMA, SSFMAX, SSFMIN
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH, DLANST, DLAPY2
-      EXTERNAL           DLAMCH, DLANST, DLAPY2
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLAE2, DLASCL, DLASRT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-*     Quick return if possible
-*
-      IF( N.LT.0 ) THEN
-         INFO = -1
-         CALL XERBLA( 'DSTERF', -INFO )
-         RETURN
-      END IF
-      IF( N.LE.1 )
-     $   RETURN
-*
-*     Determine the unit roundoff for this environment.
-*
-      EPS = DLAMCH( 'E' )
-      EPS2 = EPS**2
-      SAFMIN = DLAMCH( 'S' )
-      SAFMAX = ONE / SAFMIN
-      SSFMAX = SQRT( SAFMAX ) / THREE
-      SSFMIN = SQRT( SAFMIN ) / EPS2
-*
-*     Compute the eigenvalues of the tridiagonal matrix.
-*
-      NMAXIT = N*MAXIT
-      SIGMA = ZERO
-      JTOT = 0
-*
-*     Determine where the matrix splits and choose QL or QR iteration
-*     for each block, according to whether top or bottom diagonal
-*     element is smaller.
-*
-      L1 = 1
-*
-   10 CONTINUE
-      IF( L1.GT.N )
-     $   GO TO 170
-      IF( L1.GT.1 )
-     $   E( L1-1 ) = ZERO
-      DO 20 M = L1, N - 1
-         IF( ABS( E( M ) ).LE.( SQRT( ABS( D( M ) ) )*SQRT( ABS( D( M+
-     $       1 ) ) ) )*EPS ) THEN
-            E( M ) = ZERO
-            GO TO 30
-         END IF
-   20 CONTINUE
-      M = N
-*
-   30 CONTINUE
-      L = L1
-      LSV = L
-      LEND = M
-      LENDSV = LEND
-      L1 = M + 1
-      IF( LEND.EQ.L )
-     $   GO TO 10
-*
-*     Scale submatrix in rows and columns L to LEND
-*
-      ANORM = DLANST( 'I', LEND-L+1, D( L ), E( L ) )
-      ISCALE = 0
-      IF( ANORM.GT.SSFMAX ) THEN
-         ISCALE = 1
-         CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L+1, 1, D( L ), N,
-     $                INFO )
-         CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L, 1, E( L ), N,
-     $                INFO )
-      ELSE IF( ANORM.LT.SSFMIN ) THEN
-         ISCALE = 2
-         CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L+1, 1, D( L ), N,
-     $                INFO )
-         CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L, 1, E( L ), N,
-     $                INFO )
-      END IF
-*
-      DO 40 I = L, LEND - 1
-         E( I ) = E( I )**2
-   40 CONTINUE
-*
-*     Choose between QL and QR iteration
-*
-      IF( ABS( D( LEND ) ).LT.ABS( D( L ) ) ) THEN
-         LEND = LSV
-         L = LENDSV
-      END IF
-*
-      IF( LEND.GE.L ) THEN
-*
-*        QL Iteration
-*
-*        Look for small subdiagonal element.
-*
-   50    CONTINUE
-         IF( L.NE.LEND ) THEN
-            DO 60 M = L, LEND - 1
-               IF( ABS( E( M ) ).LE.EPS2*ABS( D( M )*D( M+1 ) ) )
-     $            GO TO 70
-   60       CONTINUE
-         END IF
-         M = LEND
-*
-   70    CONTINUE
-         IF( M.LT.LEND )
-     $      E( M ) = ZERO
-         P = D( L )
-         IF( M.EQ.L )
-     $      GO TO 90
-*
-*        If remaining matrix is 2 by 2, use DLAE2 to compute its
-*        eigenvalues.
-*
-         IF( M.EQ.L+1 ) THEN
-            RTE = SQRT( E( L ) )
-            CALL DLAE2( D( L ), RTE, D( L+1 ), RT1, RT2 )
-            D( L ) = RT1
-            D( L+1 ) = RT2
-            E( L ) = ZERO
-            L = L + 2
-            IF( L.LE.LEND )
-     $         GO TO 50
-            GO TO 150
-         END IF
-*
-         IF( JTOT.EQ.NMAXIT )
-     $      GO TO 150
-         JTOT = JTOT + 1
-*
-*        Form shift.
-*
-         RTE = SQRT( E( L ) )
-         SIGMA = ( D( L+1 )-P ) / ( TWO*RTE )
-         R = DLAPY2( SIGMA, ONE )
-         SIGMA = P - ( RTE / ( SIGMA+SIGN( R, SIGMA ) ) )
-*
-         C = ONE
-         S = ZERO
-         GAMMA = D( M ) - SIGMA
-         P = GAMMA*GAMMA
-*
-*        Inner loop
-*
-         DO 80 I = M - 1, L, -1
-            BB = E( I )
-            R = P + BB
-            IF( I.NE.M-1 )
-     $         E( I+1 ) = S*R
-            OLDC = C
-            C = P / R
-            S = BB / R
-            OLDGAM = GAMMA
-            ALPHA = D( I )
-            GAMMA = C*( ALPHA-SIGMA ) - S*OLDGAM
-            D( I+1 ) = OLDGAM + ( ALPHA-GAMMA )
-            IF( C.NE.ZERO ) THEN
-               P = ( GAMMA*GAMMA ) / C
-            ELSE
-               P = OLDC*BB
-            END IF
-   80    CONTINUE
-*
-         E( L ) = S*P
-         D( L ) = SIGMA + GAMMA
-         GO TO 50
-*
-*        Eigenvalue found.
-*
-   90    CONTINUE
-         D( L ) = P
-*
-         L = L + 1
-         IF( L.LE.LEND )
-     $      GO TO 50
-         GO TO 150
-*
-      ELSE
-*
-*        QR Iteration
-*
-*        Look for small superdiagonal element.
-*
-  100    CONTINUE
-         DO 110 M = L, LEND + 1, -1
-            IF( ABS( E( M-1 ) ).LE.EPS2*ABS( D( M )*D( M-1 ) ) )
-     $         GO TO 120
-  110    CONTINUE
-         M = LEND
-*
-  120    CONTINUE
-         IF( M.GT.LEND )
-     $      E( M-1 ) = ZERO
-         P = D( L )
-         IF( M.EQ.L )
-     $      GO TO 140
-*
-*        If remaining matrix is 2 by 2, use DLAE2 to compute its
-*        eigenvalues.
-*
-         IF( M.EQ.L-1 ) THEN
-            RTE = SQRT( E( L-1 ) )
-            CALL DLAE2( D( L ), RTE, D( L-1 ), RT1, RT2 )
-            D( L ) = RT1
-            D( L-1 ) = RT2
-            E( L-1 ) = ZERO
-            L = L - 2
-            IF( L.GE.LEND )
-     $         GO TO 100
-            GO TO 150
-         END IF
-*
-         IF( JTOT.EQ.NMAXIT )
-     $      GO TO 150
-         JTOT = JTOT + 1
-*
-*        Form shift.
-*
-         RTE = SQRT( E( L-1 ) )
-         SIGMA = ( D( L-1 )-P ) / ( TWO*RTE )
-         R = DLAPY2( SIGMA, ONE )
-         SIGMA = P - ( RTE / ( SIGMA+SIGN( R, SIGMA ) ) )
-*
-         C = ONE
-         S = ZERO
-         GAMMA = D( M ) - SIGMA
-         P = GAMMA*GAMMA
-*
-*        Inner loop
-*
-         DO 130 I = M, L - 1
-            BB = E( I )
-            R = P + BB
-            IF( I.NE.M )
-     $         E( I-1 ) = S*R
-            OLDC = C
-            C = P / R
-            S = BB / R
-            OLDGAM = GAMMA
-            ALPHA = D( I+1 )
-            GAMMA = C*( ALPHA-SIGMA ) - S*OLDGAM
-            D( I ) = OLDGAM + ( ALPHA-GAMMA )
-            IF( C.NE.ZERO ) THEN
-               P = ( GAMMA*GAMMA ) / C
-            ELSE
-               P = OLDC*BB
-            END IF
-  130    CONTINUE
-*
-         E( L-1 ) = S*P
-         D( L ) = SIGMA + GAMMA
-         GO TO 100
-*
-*        Eigenvalue found.
-*
-  140    CONTINUE
-         D( L ) = P
-*
-         L = L - 1
-         IF( L.GE.LEND )
-     $      GO TO 100
-         GO TO 150
-*
-      END IF
-*
-*     Undo scaling if necessary
-*
-  150 CONTINUE
-      IF( ISCALE.EQ.1 )
-     $   CALL DLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV+1, 1,
-     $                D( LSV ), N, INFO )
-      IF( ISCALE.EQ.2 )
-     $   CALL DLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV+1, 1,
-     $                D( LSV ), N, INFO )
-*
-*     Check for no convergence to an eigenvalue after a total
-*     of N*MAXIT iterations.
-*
-      IF( JTOT.LT.NMAXIT )
-     $   GO TO 10
-      DO 160 I = 1, N - 1
-         IF( E( I ).NE.ZERO )
-     $      INFO = INFO + 1
-  160 CONTINUE
-      GO TO 180
-*
-*     Sort eigenvalues in increasing order.
-*
-  170 CONTINUE
-      CALL DLASRT( 'I', N, D, INFO )
-*
-  180 CONTINUE
-      RETURN
-*
-*     End of DSTERF
-*
-      END
--- a/libcruft/lapack/dsyev.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,211 +0,0 @@
-      SUBROUTINE DSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBZ, UPLO
-      INTEGER            INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), W( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DSYEV computes all eigenvalues and, optionally, eigenvectors of a
-*  real symmetric matrix A.
-*
-*  Arguments
-*  =========
-*
-*  JOBZ    (input) CHARACTER*1
-*          = 'N':  Compute eigenvalues only;
-*          = 'V':  Compute eigenvalues and eigenvectors.
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA, N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the
-*          leading N-by-N upper triangular part of A contains the
-*          upper triangular part of the matrix A.  If UPLO = 'L',
-*          the leading N-by-N lower triangular part of A contains
-*          the lower triangular part of the matrix A.
-*          On exit, if JOBZ = 'V', then if INFO = 0, A contains the
-*          orthonormal eigenvectors of the matrix A.
-*          If JOBZ = 'N', then on exit the lower triangle (if UPLO='L')
-*          or the upper triangle (if UPLO='U') of A, including the
-*          diagonal, is destroyed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  W       (output) DOUBLE PRECISION array, dimension (N)
-*          If INFO = 0, the eigenvalues in ascending order.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The length of the array WORK.  LWORK >= max(1,3*N-1).
-*          For optimal efficiency, LWORK >= (NB+2)*N,
-*          where NB is the blocksize for DSYTRD returned by ILAENV.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the algorithm failed to converge; i
-*                off-diagonal elements of an intermediate tridiagonal
-*                form did not converge to zero.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LOWER, LQUERY, WANTZ
-      INTEGER            IINFO, IMAX, INDE, INDTAU, INDWRK, ISCALE,
-     $                   LLWORK, LWKOPT, NB
-      DOUBLE PRECISION   ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
-     $                   SMLNUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      DOUBLE PRECISION   DLAMCH, DLANSY
-      EXTERNAL           LSAME, ILAENV, DLAMCH, DLANSY
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLASCL, DORGTR, DSCAL, DSTEQR, DSTERF, DSYTRD,
-     $                   XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      WANTZ = LSAME( JOBZ, 'V' )
-      LOWER = LSAME( UPLO, 'L' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-      INFO = 0
-      IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.( LOWER .OR. LSAME( UPLO, 'U' ) ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         NB = ILAENV( 1, 'DSYTRD', UPLO, N, -1, -1, -1 )
-         LWKOPT = MAX( 1, ( NB+2 )*N )
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, 3*N-1 ) .AND. .NOT.LQUERY )
-     $      INFO = -8
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DSYEV ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         RETURN
-      END IF
-*
-      IF( N.EQ.1 ) THEN
-         W( 1 ) = A( 1, 1 )
-         WORK( 1 ) = 2
-         IF( WANTZ )
-     $      A( 1, 1 ) = ONE
-         RETURN
-      END IF
-*
-*     Get machine constants.
-*
-      SAFMIN = DLAMCH( 'Safe minimum' )
-      EPS = DLAMCH( 'Precision' )
-      SMLNUM = SAFMIN / EPS
-      BIGNUM = ONE / SMLNUM
-      RMIN = SQRT( SMLNUM )
-      RMAX = SQRT( BIGNUM )
-*
-*     Scale matrix to allowable range, if necessary.
-*
-      ANRM = DLANSY( 'M', UPLO, N, A, LDA, WORK )
-      ISCALE = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.RMIN ) THEN
-         ISCALE = 1
-         SIGMA = RMIN / ANRM
-      ELSE IF( ANRM.GT.RMAX ) THEN
-         ISCALE = 1
-         SIGMA = RMAX / ANRM
-      END IF
-      IF( ISCALE.EQ.1 )
-     $   CALL DLASCL( UPLO, 0, 0, ONE, SIGMA, N, N, A, LDA, INFO )
-*
-*     Call DSYTRD to reduce symmetric matrix to tridiagonal form.
-*
-      INDE = 1
-      INDTAU = INDE + N
-      INDWRK = INDTAU + N
-      LLWORK = LWORK - INDWRK + 1
-      CALL DSYTRD( UPLO, N, A, LDA, W, WORK( INDE ), WORK( INDTAU ),
-     $             WORK( INDWRK ), LLWORK, IINFO )
-*
-*     For eigenvalues only, call DSTERF.  For eigenvectors, first call
-*     DORGTR to generate the orthogonal matrix, then call DSTEQR.
-*
-      IF( .NOT.WANTZ ) THEN
-         CALL DSTERF( N, W, WORK( INDE ), INFO )
-      ELSE
-         CALL DORGTR( UPLO, N, A, LDA, WORK( INDTAU ), WORK( INDWRK ),
-     $                LLWORK, IINFO )
-         CALL DSTEQR( JOBZ, N, W, WORK( INDE ), A, LDA, WORK( INDTAU ),
-     $                INFO )
-      END IF
-*
-*     If matrix was scaled, then rescale eigenvalues appropriately.
-*
-      IF( ISCALE.EQ.1 ) THEN
-         IF( INFO.EQ.0 ) THEN
-            IMAX = N
-         ELSE
-            IMAX = INFO - 1
-         END IF
-         CALL DSCAL( IMAX, ONE / SIGMA, W, 1 )
-      END IF
-*
-*     Set WORK(1) to optimal workspace size.
-*
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of DSYEV
-*
-      END
--- a/libcruft/lapack/dsygs2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,211 +0,0 @@
-      SUBROUTINE DSYGS2( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, ITYPE, LDA, LDB, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DSYGS2 reduces a real symmetric-definite generalized eigenproblem
-*  to standard form.
-*
-*  If ITYPE = 1, the problem is A*x = lambda*B*x,
-*  and A is overwritten by inv(U')*A*inv(U) or inv(L)*A*inv(L')
-*
-*  If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or
-*  B*A*x = lambda*x, and A is overwritten by U*A*U` or L'*A*L.
-*
-*  B must have been previously factorized as U'*U or L*L' by DPOTRF.
-*
-*  Arguments
-*  =========
-*
-*  ITYPE   (input) INTEGER
-*          = 1: compute inv(U')*A*inv(U) or inv(L)*A*inv(L');
-*          = 2 or 3: compute U*A*U' or L'*A*L.
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          symmetric matrix A is stored, and how B has been factorized.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the leading
-*          n by n upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n by n lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*
-*          On exit, if INFO = 0, the transformed matrix, stored in the
-*          same format as A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input) DOUBLE PRECISION array, dimension (LDB,N)
-*          The triangular factor from the Cholesky factorization of B,
-*          as returned by DPOTRF.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, HALF
-      PARAMETER          ( ONE = 1.0D0, HALF = 0.5D0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            K
-      DOUBLE PRECISION   AKK, BKK, CT
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DAXPY, DSCAL, DSYR2, DTRMV, DTRSV, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN
-         INFO = -1
-      ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DSYGS2', -INFO )
-         RETURN
-      END IF
-*
-      IF( ITYPE.EQ.1 ) THEN
-         IF( UPPER ) THEN
-*
-*           Compute inv(U')*A*inv(U)
-*
-            DO 10 K = 1, N
-*
-*              Update the upper triangle of A(k:n,k:n)
-*
-               AKK = A( K, K )
-               BKK = B( K, K )
-               AKK = AKK / BKK**2
-               A( K, K ) = AKK
-               IF( K.LT.N ) THEN
-                  CALL DSCAL( N-K, ONE / BKK, A( K, K+1 ), LDA )
-                  CT = -HALF*AKK
-                  CALL DAXPY( N-K, CT, B( K, K+1 ), LDB, A( K, K+1 ),
-     $                        LDA )
-                  CALL DSYR2( UPLO, N-K, -ONE, A( K, K+1 ), LDA,
-     $                        B( K, K+1 ), LDB, A( K+1, K+1 ), LDA )
-                  CALL DAXPY( N-K, CT, B( K, K+1 ), LDB, A( K, K+1 ),
-     $                        LDA )
-                  CALL DTRSV( UPLO, 'Transpose', 'Non-unit', N-K,
-     $                        B( K+1, K+1 ), LDB, A( K, K+1 ), LDA )
-               END IF
-   10       CONTINUE
-         ELSE
-*
-*           Compute inv(L)*A*inv(L')
-*
-            DO 20 K = 1, N
-*
-*              Update the lower triangle of A(k:n,k:n)
-*
-               AKK = A( K, K )
-               BKK = B( K, K )
-               AKK = AKK / BKK**2
-               A( K, K ) = AKK
-               IF( K.LT.N ) THEN
-                  CALL DSCAL( N-K, ONE / BKK, A( K+1, K ), 1 )
-                  CT = -HALF*AKK
-                  CALL DAXPY( N-K, CT, B( K+1, K ), 1, A( K+1, K ), 1 )
-                  CALL DSYR2( UPLO, N-K, -ONE, A( K+1, K ), 1,
-     $                        B( K+1, K ), 1, A( K+1, K+1 ), LDA )
-                  CALL DAXPY( N-K, CT, B( K+1, K ), 1, A( K+1, K ), 1 )
-                  CALL DTRSV( UPLO, 'No transpose', 'Non-unit', N-K,
-     $                        B( K+1, K+1 ), LDB, A( K+1, K ), 1 )
-               END IF
-   20       CONTINUE
-         END IF
-      ELSE
-         IF( UPPER ) THEN
-*
-*           Compute U*A*U'
-*
-            DO 30 K = 1, N
-*
-*              Update the upper triangle of A(1:k,1:k)
-*
-               AKK = A( K, K )
-               BKK = B( K, K )
-               CALL DTRMV( UPLO, 'No transpose', 'Non-unit', K-1, B,
-     $                     LDB, A( 1, K ), 1 )
-               CT = HALF*AKK
-               CALL DAXPY( K-1, CT, B( 1, K ), 1, A( 1, K ), 1 )
-               CALL DSYR2( UPLO, K-1, ONE, A( 1, K ), 1, B( 1, K ), 1,
-     $                     A, LDA )
-               CALL DAXPY( K-1, CT, B( 1, K ), 1, A( 1, K ), 1 )
-               CALL DSCAL( K-1, BKK, A( 1, K ), 1 )
-               A( K, K ) = AKK*BKK**2
-   30       CONTINUE
-         ELSE
-*
-*           Compute L'*A*L
-*
-            DO 40 K = 1, N
-*
-*              Update the lower triangle of A(1:k,1:k)
-*
-               AKK = A( K, K )
-               BKK = B( K, K )
-               CALL DTRMV( UPLO, 'Transpose', 'Non-unit', K-1, B, LDB,
-     $                     A( K, 1 ), LDA )
-               CT = HALF*AKK
-               CALL DAXPY( K-1, CT, B( K, 1 ), LDB, A( K, 1 ), LDA )
-               CALL DSYR2( UPLO, K-1, ONE, A( K, 1 ), LDA, B( K, 1 ),
-     $                     LDB, A, LDA )
-               CALL DAXPY( K-1, CT, B( K, 1 ), LDB, A( K, 1 ), LDA )
-               CALL DSCAL( K-1, BKK, A( K, 1 ), LDA )
-               A( K, K ) = AKK*BKK**2
-   40       CONTINUE
-         END IF
-      END IF
-      RETURN
-*
-*     End of DSYGS2
-*
-      END
--- a/libcruft/lapack/dsygst.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,249 +0,0 @@
-      SUBROUTINE DSYGST( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, ITYPE, LDA, LDB, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DSYGST reduces a real symmetric-definite generalized eigenproblem
-*  to standard form.
-*
-*  If ITYPE = 1, the problem is A*x = lambda*B*x,
-*  and A is overwritten by inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T)
-*
-*  If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or
-*  B*A*x = lambda*x, and A is overwritten by U*A*U**T or L**T*A*L.
-*
-*  B must have been previously factorized as U**T*U or L*L**T by DPOTRF.
-*
-*  Arguments
-*  =========
-*
-*  ITYPE   (input) INTEGER
-*          = 1: compute inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T);
-*          = 2 or 3: compute U*A*U**T or L**T*A*L.
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored and B is factored as
-*                  U**T*U;
-*          = 'L':  Lower triangle of A is stored and B is factored as
-*                  L*L**T.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the leading
-*          N-by-N upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading N-by-N lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*
-*          On exit, if INFO = 0, the transformed matrix, stored in the
-*          same format as A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input) DOUBLE PRECISION array, dimension (LDB,N)
-*          The triangular factor from the Cholesky factorization of B,
-*          as returned by DPOTRF.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, HALF
-      PARAMETER          ( ONE = 1.0D0, HALF = 0.5D0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            K, KB, NB
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DSYGS2, DSYMM, DSYR2K, DTRMM, DTRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN
-         INFO = -1
-      ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DSYGST', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'DSYGST', UPLO, N, -1, -1, -1 )
-*
-      IF( NB.LE.1 .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code
-*
-         CALL DSYGS2( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( ITYPE.EQ.1 ) THEN
-            IF( UPPER ) THEN
-*
-*              Compute inv(U')*A*inv(U)
-*
-               DO 10 K = 1, N, NB
-                  KB = MIN( N-K+1, NB )
-*
-*                 Update the upper triangle of A(k:n,k:n)
-*
-                  CALL DSYGS2( ITYPE, UPLO, KB, A( K, K ), LDA,
-     $                         B( K, K ), LDB, INFO )
-                  IF( K+KB.LE.N ) THEN
-                     CALL DTRSM( 'Left', UPLO, 'Transpose', 'Non-unit',
-     $                           KB, N-K-KB+1, ONE, B( K, K ), LDB,
-     $                           A( K, K+KB ), LDA )
-                     CALL DSYMM( 'Left', UPLO, KB, N-K-KB+1, -HALF,
-     $                           A( K, K ), LDA, B( K, K+KB ), LDB, ONE,
-     $                           A( K, K+KB ), LDA )
-                     CALL DSYR2K( UPLO, 'Transpose', N-K-KB+1, KB, -ONE,
-     $                            A( K, K+KB ), LDA, B( K, K+KB ), LDB,
-     $                            ONE, A( K+KB, K+KB ), LDA )
-                     CALL DSYMM( 'Left', UPLO, KB, N-K-KB+1, -HALF,
-     $                           A( K, K ), LDA, B( K, K+KB ), LDB, ONE,
-     $                           A( K, K+KB ), LDA )
-                     CALL DTRSM( 'Right', UPLO, 'No transpose',
-     $                           'Non-unit', KB, N-K-KB+1, ONE,
-     $                           B( K+KB, K+KB ), LDB, A( K, K+KB ),
-     $                           LDA )
-                  END IF
-   10          CONTINUE
-            ELSE
-*
-*              Compute inv(L)*A*inv(L')
-*
-               DO 20 K = 1, N, NB
-                  KB = MIN( N-K+1, NB )
-*
-*                 Update the lower triangle of A(k:n,k:n)
-*
-                  CALL DSYGS2( ITYPE, UPLO, KB, A( K, K ), LDA,
-     $                         B( K, K ), LDB, INFO )
-                  IF( K+KB.LE.N ) THEN
-                     CALL DTRSM( 'Right', UPLO, 'Transpose', 'Non-unit',
-     $                           N-K-KB+1, KB, ONE, B( K, K ), LDB,
-     $                           A( K+KB, K ), LDA )
-                     CALL DSYMM( 'Right', UPLO, N-K-KB+1, KB, -HALF,
-     $                           A( K, K ), LDA, B( K+KB, K ), LDB, ONE,
-     $                           A( K+KB, K ), LDA )
-                     CALL DSYR2K( UPLO, 'No transpose', N-K-KB+1, KB,
-     $                            -ONE, A( K+KB, K ), LDA, B( K+KB, K ),
-     $                            LDB, ONE, A( K+KB, K+KB ), LDA )
-                     CALL DSYMM( 'Right', UPLO, N-K-KB+1, KB, -HALF,
-     $                           A( K, K ), LDA, B( K+KB, K ), LDB, ONE,
-     $                           A( K+KB, K ), LDA )
-                     CALL DTRSM( 'Left', UPLO, 'No transpose',
-     $                           'Non-unit', N-K-KB+1, KB, ONE,
-     $                           B( K+KB, K+KB ), LDB, A( K+KB, K ),
-     $                           LDA )
-                  END IF
-   20          CONTINUE
-            END IF
-         ELSE
-            IF( UPPER ) THEN
-*
-*              Compute U*A*U'
-*
-               DO 30 K = 1, N, NB
-                  KB = MIN( N-K+1, NB )
-*
-*                 Update the upper triangle of A(1:k+kb-1,1:k+kb-1)
-*
-                  CALL DTRMM( 'Left', UPLO, 'No transpose', 'Non-unit',
-     $                        K-1, KB, ONE, B, LDB, A( 1, K ), LDA )
-                  CALL DSYMM( 'Right', UPLO, K-1, KB, HALF, A( K, K ),
-     $                        LDA, B( 1, K ), LDB, ONE, A( 1, K ), LDA )
-                  CALL DSYR2K( UPLO, 'No transpose', K-1, KB, ONE,
-     $                         A( 1, K ), LDA, B( 1, K ), LDB, ONE, A,
-     $                         LDA )
-                  CALL DSYMM( 'Right', UPLO, K-1, KB, HALF, A( K, K ),
-     $                        LDA, B( 1, K ), LDB, ONE, A( 1, K ), LDA )
-                  CALL DTRMM( 'Right', UPLO, 'Transpose', 'Non-unit',
-     $                        K-1, KB, ONE, B( K, K ), LDB, A( 1, K ),
-     $                        LDA )
-                  CALL DSYGS2( ITYPE, UPLO, KB, A( K, K ), LDA,
-     $                         B( K, K ), LDB, INFO )
-   30          CONTINUE
-            ELSE
-*
-*              Compute L'*A*L
-*
-               DO 40 K = 1, N, NB
-                  KB = MIN( N-K+1, NB )
-*
-*                 Update the lower triangle of A(1:k+kb-1,1:k+kb-1)
-*
-                  CALL DTRMM( 'Right', UPLO, 'No transpose', 'Non-unit',
-     $                        KB, K-1, ONE, B, LDB, A( K, 1 ), LDA )
-                  CALL DSYMM( 'Left', UPLO, KB, K-1, HALF, A( K, K ),
-     $                        LDA, B( K, 1 ), LDB, ONE, A( K, 1 ), LDA )
-                  CALL DSYR2K( UPLO, 'Transpose', K-1, KB, ONE,
-     $                         A( K, 1 ), LDA, B( K, 1 ), LDB, ONE, A,
-     $                         LDA )
-                  CALL DSYMM( 'Left', UPLO, KB, K-1, HALF, A( K, K ),
-     $                        LDA, B( K, 1 ), LDB, ONE, A( K, 1 ), LDA )
-                  CALL DTRMM( 'Left', UPLO, 'Transpose', 'Non-unit', KB,
-     $                        K-1, ONE, B( K, K ), LDB, A( K, 1 ), LDA )
-                  CALL DSYGS2( ITYPE, UPLO, KB, A( K, K ), LDA,
-     $                         B( K, K ), LDB, INFO )
-   40          CONTINUE
-            END IF
-         END IF
-      END IF
-      RETURN
-*
-*     End of DSYGST
-*
-      END
--- a/libcruft/lapack/dsygv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,229 +0,0 @@
-      SUBROUTINE DSYGV( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK,
-     $                  LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBZ, UPLO
-      INTEGER            INFO, ITYPE, LDA, LDB, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), W( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DSYGV computes all the eigenvalues, and optionally, the eigenvectors
-*  of a real generalized symmetric-definite eigenproblem, of the form
-*  A*x=(lambda)*B*x,  A*Bx=(lambda)*x,  or B*A*x=(lambda)*x.
-*  Here A and B are assumed to be symmetric and B is also
-*  positive definite.
-*
-*  Arguments
-*  =========
-*
-*  ITYPE   (input) INTEGER
-*          Specifies the problem type to be solved:
-*          = 1:  A*x = (lambda)*B*x
-*          = 2:  A*B*x = (lambda)*x
-*          = 3:  B*A*x = (lambda)*x
-*
-*  JOBZ    (input) CHARACTER*1
-*          = 'N':  Compute eigenvalues only;
-*          = 'V':  Compute eigenvalues and eigenvectors.
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangles of A and B are stored;
-*          = 'L':  Lower triangles of A and B are stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA, N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the
-*          leading N-by-N upper triangular part of A contains the
-*          upper triangular part of the matrix A.  If UPLO = 'L',
-*          the leading N-by-N lower triangular part of A contains
-*          the lower triangular part of the matrix A.
-*
-*          On exit, if JOBZ = 'V', then if INFO = 0, A contains the
-*          matrix Z of eigenvectors.  The eigenvectors are normalized
-*          as follows:
-*          if ITYPE = 1 or 2, Z**T*B*Z = I;
-*          if ITYPE = 3, Z**T*inv(B)*Z = I.
-*          If JOBZ = 'N', then on exit the upper triangle (if UPLO='U')
-*          or the lower triangle (if UPLO='L') of A, including the
-*          diagonal, is destroyed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB, N)
-*          On entry, the symmetric positive definite matrix B.
-*          If UPLO = 'U', the leading N-by-N upper triangular part of B
-*          contains the upper triangular part of the matrix B.
-*          If UPLO = 'L', the leading N-by-N lower triangular part of B
-*          contains the lower triangular part of the matrix B.
-*
-*          On exit, if INFO <= N, the part of B containing the matrix is
-*          overwritten by the triangular factor U or L from the Cholesky
-*          factorization B = U**T*U or B = L*L**T.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  W       (output) DOUBLE PRECISION array, dimension (N)
-*          If INFO = 0, the eigenvalues in ascending order.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The length of the array WORK.  LWORK >= max(1,3*N-1).
-*          For optimal efficiency, LWORK >= (NB+2)*N,
-*          where NB is the blocksize for DSYTRD returned by ILAENV.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  DPOTRF or DSYEV returned an error code:
-*             <= N:  if INFO = i, DSYEV failed to converge;
-*                    i off-diagonal elements of an intermediate
-*                    tridiagonal form did not converge to zero;
-*             > N:   if INFO = N + i, for 1 <= i <= N, then the leading
-*                    minor of order i of B is not positive definite.
-*                    The factorization of B could not be completed and
-*                    no eigenvalues or eigenvectors were computed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, UPPER, WANTZ
-      CHARACTER          TRANS
-      INTEGER            LWKMIN, LWKOPT, NB, NEIG
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DPOTRF, DSYEV, DSYGST, DTRMM, DTRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      WANTZ = LSAME( JOBZ, 'V' )
-      UPPER = LSAME( UPLO, 'U' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-      INFO = 0
-      IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN
-         INFO = -1
-      ELSE IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.( UPPER .OR. LSAME( UPLO, 'L' ) ) ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -8
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         LWKMIN = MAX( 1, 3*N - 1 )
-         NB = ILAENV( 1, 'DSYTRD', UPLO, N, -1, -1, -1 )
-         LWKOPT = MAX( LWKMIN, ( NB + 2 )*N )
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
-            INFO = -11
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DSYGV ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Form a Cholesky factorization of B.
-*
-      CALL DPOTRF( UPLO, N, B, LDB, INFO )
-      IF( INFO.NE.0 ) THEN
-         INFO = N + INFO
-         RETURN
-      END IF
-*
-*     Transform problem to standard eigenvalue problem and solve.
-*
-      CALL DSYGST( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
-      CALL DSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO )
-*
-      IF( WANTZ ) THEN
-*
-*        Backtransform eigenvectors to the original problem.
-*
-         NEIG = N
-         IF( INFO.GT.0 )
-     $      NEIG = INFO - 1
-         IF( ITYPE.EQ.1 .OR. ITYPE.EQ.2 ) THEN
-*
-*           For A*x=(lambda)*B*x and A*B*x=(lambda)*x;
-*           backtransform eigenvectors: x = inv(L)'*y or inv(U)*y
-*
-            IF( UPPER ) THEN
-               TRANS = 'N'
-            ELSE
-               TRANS = 'T'
-            END IF
-*
-            CALL DTRSM( 'Left', UPLO, TRANS, 'Non-unit', N, NEIG, ONE,
-     $                  B, LDB, A, LDA )
-*
-         ELSE IF( ITYPE.EQ.3 ) THEN
-*
-*           For B*A*x=(lambda)*x;
-*           backtransform eigenvectors: x = L*y or U'*y
-*
-            IF( UPPER ) THEN
-               TRANS = 'T'
-            ELSE
-               TRANS = 'N'
-            END IF
-*
-            CALL DTRMM( 'Left', UPLO, TRANS, 'Non-unit', N, NEIG, ONE,
-     $                  B, LDB, A, LDA )
-         END IF
-      END IF
-*
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of DSYGV
-*
-      END
--- a/libcruft/lapack/dsytd2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,248 +0,0 @@
-      SUBROUTINE DSYTD2( UPLO, N, A, LDA, D, E, TAU, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), D( * ), E( * ), TAU( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DSYTD2 reduces a real symmetric matrix A to symmetric tridiagonal
-*  form T by an orthogonal similarity transformation: Q' * A * Q = T.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          symmetric matrix A is stored:
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the leading
-*          n-by-n upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n-by-n lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*          On exit, if UPLO = 'U', the diagonal and first superdiagonal
-*          of A are overwritten by the corresponding elements of the
-*          tridiagonal matrix T, and the elements above the first
-*          superdiagonal, with the array TAU, represent the orthogonal
-*          matrix Q as a product of elementary reflectors; if UPLO
-*          = 'L', the diagonal and first subdiagonal of A are over-
-*          written by the corresponding elements of the tridiagonal
-*          matrix T, and the elements below the first subdiagonal, with
-*          the array TAU, represent the orthogonal matrix Q as a product
-*          of elementary reflectors. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  D       (output) DOUBLE PRECISION array, dimension (N)
-*          The diagonal elements of the tridiagonal matrix T:
-*          D(i) = A(i,i).
-*
-*  E       (output) DOUBLE PRECISION array, dimension (N-1)
-*          The off-diagonal elements of the tridiagonal matrix T:
-*          E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'.
-*
-*  TAU     (output) DOUBLE PRECISION array, dimension (N-1)
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  If UPLO = 'U', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(n-1) . . . H(2) H(1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in
-*  A(1:i-1,i+1), and tau in TAU(i).
-*
-*  If UPLO = 'L', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(1) H(2) . . . H(n-1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i),
-*  and tau in TAU(i).
-*
-*  The contents of A on exit are illustrated by the following examples
-*  with n = 5:
-*
-*  if UPLO = 'U':                       if UPLO = 'L':
-*
-*    (  d   e   v2  v3  v4 )              (  d                  )
-*    (      d   e   v3  v4 )              (  e   d              )
-*    (          d   e   v4 )              (  v1  e   d          )
-*    (              d   e  )              (  v1  v2  e   d      )
-*    (                  d  )              (  v1  v2  v3  e   d  )
-*
-*  where d and e denote diagonal and off-diagonal elements of T, and vi
-*  denotes an element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO, HALF
-      PARAMETER          ( ONE = 1.0D0, ZERO = 0.0D0,
-     $                   HALF = 1.0D0 / 2.0D0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            I
-      DOUBLE PRECISION   ALPHA, TAUI
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DAXPY, DLARFG, DSYMV, DSYR2, XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   DDOT
-      EXTERNAL           LSAME, DDOT
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DSYTD2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Reduce the upper triangle of A
-*
-         DO 10 I = N - 1, 1, -1
-*
-*           Generate elementary reflector H(i) = I - tau * v * v'
-*           to annihilate A(1:i-1,i+1)
-*
-            CALL DLARFG( I, A( I, I+1 ), A( 1, I+1 ), 1, TAUI )
-            E( I ) = A( I, I+1 )
-*
-            IF( TAUI.NE.ZERO ) THEN
-*
-*              Apply H(i) from both sides to A(1:i,1:i)
-*
-               A( I, I+1 ) = ONE
-*
-*              Compute  x := tau * A * v  storing x in TAU(1:i)
-*
-               CALL DSYMV( UPLO, I, TAUI, A, LDA, A( 1, I+1 ), 1, ZERO,
-     $                     TAU, 1 )
-*
-*              Compute  w := x - 1/2 * tau * (x'*v) * v
-*
-               ALPHA = -HALF*TAUI*DDOT( I, TAU, 1, A( 1, I+1 ), 1 )
-               CALL DAXPY( I, ALPHA, A( 1, I+1 ), 1, TAU, 1 )
-*
-*              Apply the transformation as a rank-2 update:
-*                 A := A - v * w' - w * v'
-*
-               CALL DSYR2( UPLO, I, -ONE, A( 1, I+1 ), 1, TAU, 1, A,
-     $                     LDA )
-*
-               A( I, I+1 ) = E( I )
-            END IF
-            D( I+1 ) = A( I+1, I+1 )
-            TAU( I ) = TAUI
-   10    CONTINUE
-         D( 1 ) = A( 1, 1 )
-      ELSE
-*
-*        Reduce the lower triangle of A
-*
-         DO 20 I = 1, N - 1
-*
-*           Generate elementary reflector H(i) = I - tau * v * v'
-*           to annihilate A(i+2:n,i)
-*
-            CALL DLARFG( N-I, A( I+1, I ), A( MIN( I+2, N ), I ), 1,
-     $                   TAUI )
-            E( I ) = A( I+1, I )
-*
-            IF( TAUI.NE.ZERO ) THEN
-*
-*              Apply H(i) from both sides to A(i+1:n,i+1:n)
-*
-               A( I+1, I ) = ONE
-*
-*              Compute  x := tau * A * v  storing y in TAU(i:n-1)
-*
-               CALL DSYMV( UPLO, N-I, TAUI, A( I+1, I+1 ), LDA,
-     $                     A( I+1, I ), 1, ZERO, TAU( I ), 1 )
-*
-*              Compute  w := x - 1/2 * tau * (x'*v) * v
-*
-               ALPHA = -HALF*TAUI*DDOT( N-I, TAU( I ), 1, A( I+1, I ),
-     $                 1 )
-               CALL DAXPY( N-I, ALPHA, A( I+1, I ), 1, TAU( I ), 1 )
-*
-*              Apply the transformation as a rank-2 update:
-*                 A := A - v * w' - w * v'
-*
-               CALL DSYR2( UPLO, N-I, -ONE, A( I+1, I ), 1, TAU( I ), 1,
-     $                     A( I+1, I+1 ), LDA )
-*
-               A( I+1, I ) = E( I )
-            END IF
-            D( I ) = A( I, I )
-            TAU( I ) = TAUI
-   20    CONTINUE
-         D( N ) = A( N, N )
-      END IF
-*
-      RETURN
-*
-*     End of DSYTD2
-*
-      END
--- a/libcruft/lapack/dsytrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,294 +0,0 @@
-      SUBROUTINE DSYTRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), D( * ), E( * ), TAU( * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DSYTRD reduces a real symmetric matrix A to real symmetric
-*  tridiagonal form T by an orthogonal similarity transformation:
-*  Q**T * A * Q = T.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the leading
-*          N-by-N upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading N-by-N lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*          On exit, if UPLO = 'U', the diagonal and first superdiagonal
-*          of A are overwritten by the corresponding elements of the
-*          tridiagonal matrix T, and the elements above the first
-*          superdiagonal, with the array TAU, represent the orthogonal
-*          matrix Q as a product of elementary reflectors; if UPLO
-*          = 'L', the diagonal and first subdiagonal of A are over-
-*          written by the corresponding elements of the tridiagonal
-*          matrix T, and the elements below the first subdiagonal, with
-*          the array TAU, represent the orthogonal matrix Q as a product
-*          of elementary reflectors. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  D       (output) DOUBLE PRECISION array, dimension (N)
-*          The diagonal elements of the tridiagonal matrix T:
-*          D(i) = A(i,i).
-*
-*  E       (output) DOUBLE PRECISION array, dimension (N-1)
-*          The off-diagonal elements of the tridiagonal matrix T:
-*          E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'.
-*
-*  TAU     (output) DOUBLE PRECISION array, dimension (N-1)
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= 1.
-*          For optimum performance LWORK >= N*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  If UPLO = 'U', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(n-1) . . . H(2) H(1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in
-*  A(1:i-1,i+1), and tau in TAU(i).
-*
-*  If UPLO = 'L', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(1) H(2) . . . H(n-1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i),
-*  and tau in TAU(i).
-*
-*  The contents of A on exit are illustrated by the following examples
-*  with n = 5:
-*
-*  if UPLO = 'U':                       if UPLO = 'L':
-*
-*    (  d   e   v2  v3  v4 )              (  d                  )
-*    (      d   e   v3  v4 )              (  e   d              )
-*    (          d   e   v4 )              (  v1  e   d          )
-*    (              d   e  )              (  v1  v2  e   d      )
-*    (                  d  )              (  v1  v2  v3  e   d  )
-*
-*  where d and e denote diagonal and off-diagonal elements of T, and vi
-*  denotes an element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, UPPER
-      INTEGER            I, IINFO, IWS, J, KK, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLATRD, DSYR2K, DSYTD2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.1 .AND. .NOT.LQUERY ) THEN
-         INFO = -9
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-*
-*        Determine the block size.
-*
-         NB = ILAENV( 1, 'DSYTRD', UPLO, N, -1, -1, -1 )
-         LWKOPT = N*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DSYTRD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NX = N
-      IWS = 1
-      IF( NB.GT.1 .AND. NB.LT.N ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code
-*        (last block is always handled by unblocked code).
-*
-         NX = MAX( NB, ILAENV( 3, 'DSYTRD', UPLO, N, -1, -1, -1 ) )
-         IF( NX.LT.N ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = N
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  determine the
-*              minimum value of NB, and reduce NB or force use of
-*              unblocked code by setting NX = N.
-*
-               NB = MAX( LWORK / LDWORK, 1 )
-               NBMIN = ILAENV( 2, 'DSYTRD', UPLO, N, -1, -1, -1 )
-               IF( NB.LT.NBMIN )
-     $            NX = N
-            END IF
-         ELSE
-            NX = N
-         END IF
-      ELSE
-         NB = 1
-      END IF
-*
-      IF( UPPER ) THEN
-*
-*        Reduce the upper triangle of A.
-*        Columns 1:kk are handled by the unblocked method.
-*
-         KK = N - ( ( N-NX+NB-1 ) / NB )*NB
-         DO 20 I = N - NB + 1, KK + 1, -NB
-*
-*           Reduce columns i:i+nb-1 to tridiagonal form and form the
-*           matrix W which is needed to update the unreduced part of
-*           the matrix
-*
-            CALL DLATRD( UPLO, I+NB-1, NB, A, LDA, E, TAU, WORK,
-     $                   LDWORK )
-*
-*           Update the unreduced submatrix A(1:i-1,1:i-1), using an
-*           update of the form:  A := A - V*W' - W*V'
-*
-            CALL DSYR2K( UPLO, 'No transpose', I-1, NB, -ONE, A( 1, I ),
-     $                   LDA, WORK, LDWORK, ONE, A, LDA )
-*
-*           Copy superdiagonal elements back into A, and diagonal
-*           elements into D
-*
-            DO 10 J = I, I + NB - 1
-               A( J-1, J ) = E( J-1 )
-               D( J ) = A( J, J )
-   10       CONTINUE
-   20    CONTINUE
-*
-*        Use unblocked code to reduce the last or only block
-*
-         CALL DSYTD2( UPLO, KK, A, LDA, D, E, TAU, IINFO )
-      ELSE
-*
-*        Reduce the lower triangle of A
-*
-         DO 40 I = 1, N - NX, NB
-*
-*           Reduce columns i:i+nb-1 to tridiagonal form and form the
-*           matrix W which is needed to update the unreduced part of
-*           the matrix
-*
-            CALL DLATRD( UPLO, N-I+1, NB, A( I, I ), LDA, E( I ),
-     $                   TAU( I ), WORK, LDWORK )
-*
-*           Update the unreduced submatrix A(i+ib:n,i+ib:n), using
-*           an update of the form:  A := A - V*W' - W*V'
-*
-            CALL DSYR2K( UPLO, 'No transpose', N-I-NB+1, NB, -ONE,
-     $                   A( I+NB, I ), LDA, WORK( NB+1 ), LDWORK, ONE,
-     $                   A( I+NB, I+NB ), LDA )
-*
-*           Copy subdiagonal elements back into A, and diagonal
-*           elements into D
-*
-            DO 30 J = I, I + NB - 1
-               A( J+1, J ) = E( J )
-               D( J ) = A( J, J )
-   30       CONTINUE
-   40    CONTINUE
-*
-*        Use unblocked code to reduce the last or only block
-*
-         CALL DSYTD2( UPLO, N-I+1, A( I, I ), LDA, D( I ), E( I ),
-     $                TAU( I ), IINFO )
-      END IF
-*
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of DSYTRD
-*
-      END
--- a/libcruft/lapack/dtgevc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1147 +0,0 @@
-      SUBROUTINE DTGEVC( SIDE, HOWMNY, SELECT, N, S, LDS, P, LDP, VL,
-     $                   LDVL, VR, LDVR, MM, M, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          HOWMNY, SIDE
-      INTEGER            INFO, LDP, LDS, LDVL, LDVR, M, MM, N
-*     ..
-*     .. Array Arguments ..
-      LOGICAL            SELECT( * )
-      DOUBLE PRECISION   P( LDP, * ), S( LDS, * ), VL( LDVL, * ),
-     $                   VR( LDVR, * ), WORK( * )
-*     ..
-*
-*
-*  Purpose
-*  =======
-*
-*  DTGEVC computes some or all of the right and/or left eigenvectors of
-*  a pair of real matrices (S,P), where S is a quasi-triangular matrix
-*  and P is upper triangular.  Matrix pairs of this type are produced by
-*  the generalized Schur factorization of a matrix pair (A,B):
-*
-*     A = Q*S*Z**T,  B = Q*P*Z**T
-*
-*  as computed by DGGHRD + DHGEQZ.
-*
-*  The right eigenvector x and the left eigenvector y of (S,P)
-*  corresponding to an eigenvalue w are defined by:
-*  
-*     S*x = w*P*x,  (y**H)*S = w*(y**H)*P,
-*  
-*  where y**H denotes the conjugate tranpose of y.
-*  The eigenvalues are not input to this routine, but are computed
-*  directly from the diagonal blocks of S and P.
-*  
-*  This routine returns the matrices X and/or Y of right and left
-*  eigenvectors of (S,P), or the products Z*X and/or Q*Y,
-*  where Z and Q are input matrices.
-*  If Q and Z are the orthogonal factors from the generalized Schur
-*  factorization of a matrix pair (A,B), then Z*X and Q*Y
-*  are the matrices of right and left eigenvectors of (A,B).
-* 
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'R': compute right eigenvectors only;
-*          = 'L': compute left eigenvectors only;
-*          = 'B': compute both right and left eigenvectors.
-*
-*  HOWMNY  (input) CHARACTER*1
-*          = 'A': compute all right and/or left eigenvectors;
-*          = 'B': compute all right and/or left eigenvectors,
-*                 backtransformed by the matrices in VR and/or VL;
-*          = 'S': compute selected right and/or left eigenvectors,
-*                 specified by the logical array SELECT.
-*
-*  SELECT  (input) LOGICAL array, dimension (N)
-*          If HOWMNY='S', SELECT specifies the eigenvectors to be
-*          computed.  If w(j) is a real eigenvalue, the corresponding
-*          real eigenvector is computed if SELECT(j) is .TRUE..
-*          If w(j) and w(j+1) are the real and imaginary parts of a
-*          complex eigenvalue, the corresponding complex eigenvector
-*          is computed if either SELECT(j) or SELECT(j+1) is .TRUE.,
-*          and on exit SELECT(j) is set to .TRUE. and SELECT(j+1) is
-*          set to .FALSE..
-*          Not referenced if HOWMNY = 'A' or 'B'.
-*
-*  N       (input) INTEGER
-*          The order of the matrices S and P.  N >= 0.
-*
-*  S       (input) DOUBLE PRECISION array, dimension (LDS,N)
-*          The upper quasi-triangular matrix S from a generalized Schur
-*          factorization, as computed by DHGEQZ.
-*
-*  LDS     (input) INTEGER
-*          The leading dimension of array S.  LDS >= max(1,N).
-*
-*  P       (input) DOUBLE PRECISION array, dimension (LDP,N)
-*          The upper triangular matrix P from a generalized Schur
-*          factorization, as computed by DHGEQZ.
-*          2-by-2 diagonal blocks of P corresponding to 2-by-2 blocks
-*          of S must be in positive diagonal form.
-*
-*  LDP     (input) INTEGER
-*          The leading dimension of array P.  LDP >= max(1,N).
-*
-*  VL      (input/output) DOUBLE PRECISION array, dimension (LDVL,MM)
-*          On entry, if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must
-*          contain an N-by-N matrix Q (usually the orthogonal matrix Q
-*          of left Schur vectors returned by DHGEQZ).
-*          On exit, if SIDE = 'L' or 'B', VL contains:
-*          if HOWMNY = 'A', the matrix Y of left eigenvectors of (S,P);
-*          if HOWMNY = 'B', the matrix Q*Y;
-*          if HOWMNY = 'S', the left eigenvectors of (S,P) specified by
-*                      SELECT, stored consecutively in the columns of
-*                      VL, in the same order as their eigenvalues.
-*
-*          A complex eigenvector corresponding to a complex eigenvalue
-*          is stored in two consecutive columns, the first holding the
-*          real part, and the second the imaginary part.
-*
-*          Not referenced if SIDE = 'R'.
-*
-*  LDVL    (input) INTEGER
-*          The leading dimension of array VL.  LDVL >= 1, and if
-*          SIDE = 'L' or 'B', LDVL >= N.
-*
-*  VR      (input/output) DOUBLE PRECISION array, dimension (LDVR,MM)
-*          On entry, if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must
-*          contain an N-by-N matrix Z (usually the orthogonal matrix Z
-*          of right Schur vectors returned by DHGEQZ).
-*
-*          On exit, if SIDE = 'R' or 'B', VR contains:
-*          if HOWMNY = 'A', the matrix X of right eigenvectors of (S,P);
-*          if HOWMNY = 'B' or 'b', the matrix Z*X;
-*          if HOWMNY = 'S' or 's', the right eigenvectors of (S,P)
-*                      specified by SELECT, stored consecutively in the
-*                      columns of VR, in the same order as their
-*                      eigenvalues.
-*
-*          A complex eigenvector corresponding to a complex eigenvalue
-*          is stored in two consecutive columns, the first holding the
-*          real part and the second the imaginary part.
-*          
-*          Not referenced if SIDE = 'L'.
-*
-*  LDVR    (input) INTEGER
-*          The leading dimension of the array VR.  LDVR >= 1, and if
-*          SIDE = 'R' or 'B', LDVR >= N.
-*
-*  MM      (input) INTEGER
-*          The number of columns in the arrays VL and/or VR. MM >= M.
-*
-*  M       (output) INTEGER
-*          The number of columns in the arrays VL and/or VR actually
-*          used to store the eigenvectors.  If HOWMNY = 'A' or 'B', M
-*          is set to N.  Each selected real eigenvector occupies one
-*          column and each selected complex eigenvector occupies two
-*          columns.
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (6*N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  the 2-by-2 block (INFO:INFO+1) does not have a complex
-*                eigenvalue.
-*
-*  Further Details
-*  ===============
-*
-*  Allocation of workspace:
-*  ---------- -- ---------
-*
-*     WORK( j ) = 1-norm of j-th column of A, above the diagonal
-*     WORK( N+j ) = 1-norm of j-th column of B, above the diagonal
-*     WORK( 2*N+1:3*N ) = real part of eigenvector
-*     WORK( 3*N+1:4*N ) = imaginary part of eigenvector
-*     WORK( 4*N+1:5*N ) = real part of back-transformed eigenvector
-*     WORK( 5*N+1:6*N ) = imaginary part of back-transformed eigenvector
-*
-*  Rowwise vs. columnwise solution methods:
-*  ------- --  ---------- -------- -------
-*
-*  Finding a generalized eigenvector consists basically of solving the
-*  singular triangular system
-*
-*   (A - w B) x = 0     (for right) or:   (A - w B)**H y = 0  (for left)
-*
-*  Consider finding the i-th right eigenvector (assume all eigenvalues
-*  are real). The equation to be solved is:
-*       n                   i
-*  0 = sum  C(j,k) v(k)  = sum  C(j,k) v(k)     for j = i,. . .,1
-*      k=j                 k=j
-*
-*  where  C = (A - w B)  (The components v(i+1:n) are 0.)
-*
-*  The "rowwise" method is:
-*
-*  (1)  v(i) := 1
-*  for j = i-1,. . .,1:
-*                          i
-*      (2) compute  s = - sum C(j,k) v(k)   and
-*                        k=j+1
-*
-*      (3) v(j) := s / C(j,j)
-*
-*  Step 2 is sometimes called the "dot product" step, since it is an
-*  inner product between the j-th row and the portion of the eigenvector
-*  that has been computed so far.
-*
-*  The "columnwise" method consists basically in doing the sums
-*  for all the rows in parallel.  As each v(j) is computed, the
-*  contribution of v(j) times the j-th column of C is added to the
-*  partial sums.  Since FORTRAN arrays are stored columnwise, this has
-*  the advantage that at each step, the elements of C that are accessed
-*  are adjacent to one another, whereas with the rowwise method, the
-*  elements accessed at a step are spaced LDS (and LDP) words apart.
-*
-*  When finding left eigenvectors, the matrix in question is the
-*  transpose of the one in storage, so the rowwise method then
-*  actually accesses columns of A and B at each step, and so is the
-*  preferred method.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE, SAFETY
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0,
-     $                   SAFETY = 1.0D+2 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            COMPL, COMPR, IL2BY2, ILABAD, ILALL, ILBACK,
-     $                   ILBBAD, ILCOMP, ILCPLX, LSA, LSB
-      INTEGER            I, IBEG, IEIG, IEND, IHWMNY, IINFO, IM, ISIDE,
-     $                   J, JA, JC, JE, JR, JW, NA, NW
-      DOUBLE PRECISION   ACOEF, ACOEFA, ANORM, ASCALE, BCOEFA, BCOEFI,
-     $                   BCOEFR, BIG, BIGNUM, BNORM, BSCALE, CIM2A,
-     $                   CIM2B, CIMAGA, CIMAGB, CRE2A, CRE2B, CREALA,
-     $                   CREALB, DMIN, SAFMIN, SALFAR, SBETA, SCALE,
-     $                   SMALL, TEMP, TEMP2, TEMP2I, TEMP2R, ULP, XMAX,
-     $                   XSCALE
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   BDIAG( 2 ), SUM( 2, 2 ), SUMS( 2, 2 ),
-     $                   SUMP( 2, 2 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           LSAME, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMV, DLABAD, DLACPY, DLAG2, DLALN2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and Test the input parameters
-*
-      IF( LSAME( HOWMNY, 'A' ) ) THEN
-         IHWMNY = 1
-         ILALL = .TRUE.
-         ILBACK = .FALSE.
-      ELSE IF( LSAME( HOWMNY, 'S' ) ) THEN
-         IHWMNY = 2
-         ILALL = .FALSE.
-         ILBACK = .FALSE.
-      ELSE IF( LSAME( HOWMNY, 'B' ) ) THEN
-         IHWMNY = 3
-         ILALL = .TRUE.
-         ILBACK = .TRUE.
-      ELSE
-         IHWMNY = -1
-         ILALL = .TRUE.
-      END IF
-*
-      IF( LSAME( SIDE, 'R' ) ) THEN
-         ISIDE = 1
-         COMPL = .FALSE.
-         COMPR = .TRUE.
-      ELSE IF( LSAME( SIDE, 'L' ) ) THEN
-         ISIDE = 2
-         COMPL = .TRUE.
-         COMPR = .FALSE.
-      ELSE IF( LSAME( SIDE, 'B' ) ) THEN
-         ISIDE = 3
-         COMPL = .TRUE.
-         COMPR = .TRUE.
-      ELSE
-         ISIDE = -1
-      END IF
-*
-      INFO = 0
-      IF( ISIDE.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( IHWMNY.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDS.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      ELSE IF( LDP.LT.MAX( 1, N ) ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DTGEVC', -INFO )
-         RETURN
-      END IF
-*
-*     Count the number of eigenvectors to be computed
-*
-      IF( .NOT.ILALL ) THEN
-         IM = 0
-         ILCPLX = .FALSE.
-         DO 10 J = 1, N
-            IF( ILCPLX ) THEN
-               ILCPLX = .FALSE.
-               GO TO 10
-            END IF
-            IF( J.LT.N ) THEN
-               IF( S( J+1, J ).NE.ZERO )
-     $            ILCPLX = .TRUE.
-            END IF
-            IF( ILCPLX ) THEN
-               IF( SELECT( J ) .OR. SELECT( J+1 ) )
-     $            IM = IM + 2
-            ELSE
-               IF( SELECT( J ) )
-     $            IM = IM + 1
-            END IF
-   10    CONTINUE
-      ELSE
-         IM = N
-      END IF
-*
-*     Check 2-by-2 diagonal blocks of A, B
-*
-      ILABAD = .FALSE.
-      ILBBAD = .FALSE.
-      DO 20 J = 1, N - 1
-         IF( S( J+1, J ).NE.ZERO ) THEN
-            IF( P( J, J ).EQ.ZERO .OR. P( J+1, J+1 ).EQ.ZERO .OR.
-     $          P( J, J+1 ).NE.ZERO )ILBBAD = .TRUE.
-            IF( J.LT.N-1 ) THEN
-               IF( S( J+2, J+1 ).NE.ZERO )
-     $            ILABAD = .TRUE.
-            END IF
-         END IF
-   20 CONTINUE
-*
-      IF( ILABAD ) THEN
-         INFO = -5
-      ELSE IF( ILBBAD ) THEN
-         INFO = -7
-      ELSE IF( COMPL .AND. LDVL.LT.N .OR. LDVL.LT.1 ) THEN
-         INFO = -10
-      ELSE IF( COMPR .AND. LDVR.LT.N .OR. LDVR.LT.1 ) THEN
-         INFO = -12
-      ELSE IF( MM.LT.IM ) THEN
-         INFO = -13
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DTGEVC', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      M = IM
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Machine Constants
-*
-      SAFMIN = DLAMCH( 'Safe minimum' )
-      BIG = ONE / SAFMIN
-      CALL DLABAD( SAFMIN, BIG )
-      ULP = DLAMCH( 'Epsilon' )*DLAMCH( 'Base' )
-      SMALL = SAFMIN*N / ULP
-      BIG = ONE / SMALL
-      BIGNUM = ONE / ( SAFMIN*N )
-*
-*     Compute the 1-norm of each column of the strictly upper triangular
-*     part (i.e., excluding all elements belonging to the diagonal
-*     blocks) of A and B to check for possible overflow in the
-*     triangular solver.
-*
-      ANORM = ABS( S( 1, 1 ) )
-      IF( N.GT.1 )
-     $   ANORM = ANORM + ABS( S( 2, 1 ) )
-      BNORM = ABS( P( 1, 1 ) )
-      WORK( 1 ) = ZERO
-      WORK( N+1 ) = ZERO
-*
-      DO 50 J = 2, N
-         TEMP = ZERO
-         TEMP2 = ZERO
-         IF( S( J, J-1 ).EQ.ZERO ) THEN
-            IEND = J - 1
-         ELSE
-            IEND = J - 2
-         END IF
-         DO 30 I = 1, IEND
-            TEMP = TEMP + ABS( S( I, J ) )
-            TEMP2 = TEMP2 + ABS( P( I, J ) )
-   30    CONTINUE
-         WORK( J ) = TEMP
-         WORK( N+J ) = TEMP2
-         DO 40 I = IEND + 1, MIN( J+1, N )
-            TEMP = TEMP + ABS( S( I, J ) )
-            TEMP2 = TEMP2 + ABS( P( I, J ) )
-   40    CONTINUE
-         ANORM = MAX( ANORM, TEMP )
-         BNORM = MAX( BNORM, TEMP2 )
-   50 CONTINUE
-*
-      ASCALE = ONE / MAX( ANORM, SAFMIN )
-      BSCALE = ONE / MAX( BNORM, SAFMIN )
-*
-*     Left eigenvectors
-*
-      IF( COMPL ) THEN
-         IEIG = 0
-*
-*        Main loop over eigenvalues
-*
-         ILCPLX = .FALSE.
-         DO 220 JE = 1, N
-*
-*           Skip this iteration if (a) HOWMNY='S' and SELECT=.FALSE., or
-*           (b) this would be the second of a complex pair.
-*           Check for complex eigenvalue, so as to be sure of which
-*           entry(-ies) of SELECT to look at.
-*
-            IF( ILCPLX ) THEN
-               ILCPLX = .FALSE.
-               GO TO 220
-            END IF
-            NW = 1
-            IF( JE.LT.N ) THEN
-               IF( S( JE+1, JE ).NE.ZERO ) THEN
-                  ILCPLX = .TRUE.
-                  NW = 2
-               END IF
-            END IF
-            IF( ILALL ) THEN
-               ILCOMP = .TRUE.
-            ELSE IF( ILCPLX ) THEN
-               ILCOMP = SELECT( JE ) .OR. SELECT( JE+1 )
-            ELSE
-               ILCOMP = SELECT( JE )
-            END IF
-            IF( .NOT.ILCOMP )
-     $         GO TO 220
-*
-*           Decide if (a) singular pencil, (b) real eigenvalue, or
-*           (c) complex eigenvalue.
-*
-            IF( .NOT.ILCPLX ) THEN
-               IF( ABS( S( JE, JE ) ).LE.SAFMIN .AND.
-     $             ABS( P( JE, JE ) ).LE.SAFMIN ) THEN
-*
-*                 Singular matrix pencil -- return unit eigenvector
-*
-                  IEIG = IEIG + 1
-                  DO 60 JR = 1, N
-                     VL( JR, IEIG ) = ZERO
-   60             CONTINUE
-                  VL( IEIG, IEIG ) = ONE
-                  GO TO 220
-               END IF
-            END IF
-*
-*           Clear vector
-*
-            DO 70 JR = 1, NW*N
-               WORK( 2*N+JR ) = ZERO
-   70       CONTINUE
-*                                                 T
-*           Compute coefficients in  ( a A - b B )  y = 0
-*              a  is  ACOEF
-*              b  is  BCOEFR + i*BCOEFI
-*
-            IF( .NOT.ILCPLX ) THEN
-*
-*              Real eigenvalue
-*
-               TEMP = ONE / MAX( ABS( S( JE, JE ) )*ASCALE,
-     $                ABS( P( JE, JE ) )*BSCALE, SAFMIN )
-               SALFAR = ( TEMP*S( JE, JE ) )*ASCALE
-               SBETA = ( TEMP*P( JE, JE ) )*BSCALE
-               ACOEF = SBETA*ASCALE
-               BCOEFR = SALFAR*BSCALE
-               BCOEFI = ZERO
-*
-*              Scale to avoid underflow
-*
-               SCALE = ONE
-               LSA = ABS( SBETA ).GE.SAFMIN .AND. ABS( ACOEF ).LT.SMALL
-               LSB = ABS( SALFAR ).GE.SAFMIN .AND. ABS( BCOEFR ).LT.
-     $               SMALL
-               IF( LSA )
-     $            SCALE = ( SMALL / ABS( SBETA ) )*MIN( ANORM, BIG )
-               IF( LSB )
-     $            SCALE = MAX( SCALE, ( SMALL / ABS( SALFAR ) )*
-     $                    MIN( BNORM, BIG ) )
-               IF( LSA .OR. LSB ) THEN
-                  SCALE = MIN( SCALE, ONE /
-     $                    ( SAFMIN*MAX( ONE, ABS( ACOEF ),
-     $                    ABS( BCOEFR ) ) ) )
-                  IF( LSA ) THEN
-                     ACOEF = ASCALE*( SCALE*SBETA )
-                  ELSE
-                     ACOEF = SCALE*ACOEF
-                  END IF
-                  IF( LSB ) THEN
-                     BCOEFR = BSCALE*( SCALE*SALFAR )
-                  ELSE
-                     BCOEFR = SCALE*BCOEFR
-                  END IF
-               END IF
-               ACOEFA = ABS( ACOEF )
-               BCOEFA = ABS( BCOEFR )
-*
-*              First component is 1
-*
-               WORK( 2*N+JE ) = ONE
-               XMAX = ONE
-            ELSE
-*
-*              Complex eigenvalue
-*
-               CALL DLAG2( S( JE, JE ), LDS, P( JE, JE ), LDP,
-     $                     SAFMIN*SAFETY, ACOEF, TEMP, BCOEFR, TEMP2,
-     $                     BCOEFI )
-               BCOEFI = -BCOEFI
-               IF( BCOEFI.EQ.ZERO ) THEN
-                  INFO = JE
-                  RETURN
-               END IF
-*
-*              Scale to avoid over/underflow
-*
-               ACOEFA = ABS( ACOEF )
-               BCOEFA = ABS( BCOEFR ) + ABS( BCOEFI )
-               SCALE = ONE
-               IF( ACOEFA*ULP.LT.SAFMIN .AND. ACOEFA.GE.SAFMIN )
-     $            SCALE = ( SAFMIN / ULP ) / ACOEFA
-               IF( BCOEFA*ULP.LT.SAFMIN .AND. BCOEFA.GE.SAFMIN )
-     $            SCALE = MAX( SCALE, ( SAFMIN / ULP ) / BCOEFA )
-               IF( SAFMIN*ACOEFA.GT.ASCALE )
-     $            SCALE = ASCALE / ( SAFMIN*ACOEFA )
-               IF( SAFMIN*BCOEFA.GT.BSCALE )
-     $            SCALE = MIN( SCALE, BSCALE / ( SAFMIN*BCOEFA ) )
-               IF( SCALE.NE.ONE ) THEN
-                  ACOEF = SCALE*ACOEF
-                  ACOEFA = ABS( ACOEF )
-                  BCOEFR = SCALE*BCOEFR
-                  BCOEFI = SCALE*BCOEFI
-                  BCOEFA = ABS( BCOEFR ) + ABS( BCOEFI )
-               END IF
-*
-*              Compute first two components of eigenvector
-*
-               TEMP = ACOEF*S( JE+1, JE )
-               TEMP2R = ACOEF*S( JE, JE ) - BCOEFR*P( JE, JE )
-               TEMP2I = -BCOEFI*P( JE, JE )
-               IF( ABS( TEMP ).GT.ABS( TEMP2R )+ABS( TEMP2I ) ) THEN
-                  WORK( 2*N+JE ) = ONE
-                  WORK( 3*N+JE ) = ZERO
-                  WORK( 2*N+JE+1 ) = -TEMP2R / TEMP
-                  WORK( 3*N+JE+1 ) = -TEMP2I / TEMP
-               ELSE
-                  WORK( 2*N+JE+1 ) = ONE
-                  WORK( 3*N+JE+1 ) = ZERO
-                  TEMP = ACOEF*S( JE, JE+1 )
-                  WORK( 2*N+JE ) = ( BCOEFR*P( JE+1, JE+1 )-ACOEF*
-     $                             S( JE+1, JE+1 ) ) / TEMP
-                  WORK( 3*N+JE ) = BCOEFI*P( JE+1, JE+1 ) / TEMP
-               END IF
-               XMAX = MAX( ABS( WORK( 2*N+JE ) )+ABS( WORK( 3*N+JE ) ),
-     $                ABS( WORK( 2*N+JE+1 ) )+ABS( WORK( 3*N+JE+1 ) ) )
-            END IF
-*
-            DMIN = MAX( ULP*ACOEFA*ANORM, ULP*BCOEFA*BNORM, SAFMIN )
-*
-*                                           T
-*           Triangular solve of  (a A - b B)  y = 0
-*
-*                                   T
-*           (rowwise in  (a A - b B) , or columnwise in (a A - b B) )
-*
-            IL2BY2 = .FALSE.
-*
-            DO 160 J = JE + NW, N
-               IF( IL2BY2 ) THEN
-                  IL2BY2 = .FALSE.
-                  GO TO 160
-               END IF
-*
-               NA = 1
-               BDIAG( 1 ) = P( J, J )
-               IF( J.LT.N ) THEN
-                  IF( S( J+1, J ).NE.ZERO ) THEN
-                     IL2BY2 = .TRUE.
-                     BDIAG( 2 ) = P( J+1, J+1 )
-                     NA = 2
-                  END IF
-               END IF
-*
-*              Check whether scaling is necessary for dot products
-*
-               XSCALE = ONE / MAX( ONE, XMAX )
-               TEMP = MAX( WORK( J ), WORK( N+J ),
-     $                ACOEFA*WORK( J )+BCOEFA*WORK( N+J ) )
-               IF( IL2BY2 )
-     $            TEMP = MAX( TEMP, WORK( J+1 ), WORK( N+J+1 ),
-     $                   ACOEFA*WORK( J+1 )+BCOEFA*WORK( N+J+1 ) )
-               IF( TEMP.GT.BIGNUM*XSCALE ) THEN
-                  DO 90 JW = 0, NW - 1
-                     DO 80 JR = JE, J - 1
-                        WORK( ( JW+2 )*N+JR ) = XSCALE*
-     $                     WORK( ( JW+2 )*N+JR )
-   80                CONTINUE
-   90             CONTINUE
-                  XMAX = XMAX*XSCALE
-               END IF
-*
-*              Compute dot products
-*
-*                    j-1
-*              SUM = sum  conjg( a*S(k,j) - b*P(k,j) )*x(k)
-*                    k=je
-*
-*              To reduce the op count, this is done as
-*
-*              _        j-1                  _        j-1
-*              a*conjg( sum  S(k,j)*x(k) ) - b*conjg( sum  P(k,j)*x(k) )
-*                       k=je                          k=je
-*
-*              which may cause underflow problems if A or B are close
-*              to underflow.  (E.g., less than SMALL.)
-*
-*
-*              A series of compiler directives to defeat vectorization
-*              for the next loop
-*
-*$PL$ CMCHAR=' '
-CDIR$          NEXTSCALAR
-C$DIR          SCALAR
-CDIR$          NEXT SCALAR
-CVD$L          NOVECTOR
-CDEC$          NOVECTOR
-CVD$           NOVECTOR
-*VDIR          NOVECTOR
-*VOCL          LOOP,SCALAR
-CIBM           PREFER SCALAR
-*$PL$ CMCHAR='*'
-*
-               DO 120 JW = 1, NW
-*
-*$PL$ CMCHAR=' '
-CDIR$             NEXTSCALAR
-C$DIR             SCALAR
-CDIR$             NEXT SCALAR
-CVD$L             NOVECTOR
-CDEC$             NOVECTOR
-CVD$              NOVECTOR
-*VDIR             NOVECTOR
-*VOCL             LOOP,SCALAR
-CIBM              PREFER SCALAR
-*$PL$ CMCHAR='*'
-*
-                  DO 110 JA = 1, NA
-                     SUMS( JA, JW ) = ZERO
-                     SUMP( JA, JW ) = ZERO
-*
-                     DO 100 JR = JE, J - 1
-                        SUMS( JA, JW ) = SUMS( JA, JW ) +
-     $                                   S( JR, J+JA-1 )*
-     $                                   WORK( ( JW+1 )*N+JR )
-                        SUMP( JA, JW ) = SUMP( JA, JW ) +
-     $                                   P( JR, J+JA-1 )*
-     $                                   WORK( ( JW+1 )*N+JR )
-  100                CONTINUE
-  110             CONTINUE
-  120          CONTINUE
-*
-*$PL$ CMCHAR=' '
-CDIR$          NEXTSCALAR
-C$DIR          SCALAR
-CDIR$          NEXT SCALAR
-CVD$L          NOVECTOR
-CDEC$          NOVECTOR
-CVD$           NOVECTOR
-*VDIR          NOVECTOR
-*VOCL          LOOP,SCALAR
-CIBM           PREFER SCALAR
-*$PL$ CMCHAR='*'
-*
-               DO 130 JA = 1, NA
-                  IF( ILCPLX ) THEN
-                     SUM( JA, 1 ) = -ACOEF*SUMS( JA, 1 ) +
-     $                              BCOEFR*SUMP( JA, 1 ) -
-     $                              BCOEFI*SUMP( JA, 2 )
-                     SUM( JA, 2 ) = -ACOEF*SUMS( JA, 2 ) +
-     $                              BCOEFR*SUMP( JA, 2 ) +
-     $                              BCOEFI*SUMP( JA, 1 )
-                  ELSE
-                     SUM( JA, 1 ) = -ACOEF*SUMS( JA, 1 ) +
-     $                              BCOEFR*SUMP( JA, 1 )
-                  END IF
-  130          CONTINUE
-*
-*                                  T
-*              Solve  ( a A - b B )  y = SUM(,)
-*              with scaling and perturbation of the denominator
-*
-               CALL DLALN2( .TRUE., NA, NW, DMIN, ACOEF, S( J, J ), LDS,
-     $                      BDIAG( 1 ), BDIAG( 2 ), SUM, 2, BCOEFR,
-     $                      BCOEFI, WORK( 2*N+J ), N, SCALE, TEMP,
-     $                      IINFO )
-               IF( SCALE.LT.ONE ) THEN
-                  DO 150 JW = 0, NW - 1
-                     DO 140 JR = JE, J - 1
-                        WORK( ( JW+2 )*N+JR ) = SCALE*
-     $                     WORK( ( JW+2 )*N+JR )
-  140                CONTINUE
-  150             CONTINUE
-                  XMAX = SCALE*XMAX
-               END IF
-               XMAX = MAX( XMAX, TEMP )
-  160       CONTINUE
-*
-*           Copy eigenvector to VL, back transforming if
-*           HOWMNY='B'.
-*
-            IEIG = IEIG + 1
-            IF( ILBACK ) THEN
-               DO 170 JW = 0, NW - 1
-                  CALL DGEMV( 'N', N, N+1-JE, ONE, VL( 1, JE ), LDVL,
-     $                        WORK( ( JW+2 )*N+JE ), 1, ZERO,
-     $                        WORK( ( JW+4 )*N+1 ), 1 )
-  170          CONTINUE
-               CALL DLACPY( ' ', N, NW, WORK( 4*N+1 ), N, VL( 1, JE ),
-     $                      LDVL )
-               IBEG = 1
-            ELSE
-               CALL DLACPY( ' ', N, NW, WORK( 2*N+1 ), N, VL( 1, IEIG ),
-     $                      LDVL )
-               IBEG = JE
-            END IF
-*
-*           Scale eigenvector
-*
-            XMAX = ZERO
-            IF( ILCPLX ) THEN
-               DO 180 J = IBEG, N
-                  XMAX = MAX( XMAX, ABS( VL( J, IEIG ) )+
-     $                   ABS( VL( J, IEIG+1 ) ) )
-  180          CONTINUE
-            ELSE
-               DO 190 J = IBEG, N
-                  XMAX = MAX( XMAX, ABS( VL( J, IEIG ) ) )
-  190          CONTINUE
-            END IF
-*
-            IF( XMAX.GT.SAFMIN ) THEN
-               XSCALE = ONE / XMAX
-*
-               DO 210 JW = 0, NW - 1
-                  DO 200 JR = IBEG, N
-                     VL( JR, IEIG+JW ) = XSCALE*VL( JR, IEIG+JW )
-  200             CONTINUE
-  210          CONTINUE
-            END IF
-            IEIG = IEIG + NW - 1
-*
-  220    CONTINUE
-      END IF
-*
-*     Right eigenvectors
-*
-      IF( COMPR ) THEN
-         IEIG = IM + 1
-*
-*        Main loop over eigenvalues
-*
-         ILCPLX = .FALSE.
-         DO 500 JE = N, 1, -1
-*
-*           Skip this iteration if (a) HOWMNY='S' and SELECT=.FALSE., or
-*           (b) this would be the second of a complex pair.
-*           Check for complex eigenvalue, so as to be sure of which
-*           entry(-ies) of SELECT to look at -- if complex, SELECT(JE)
-*           or SELECT(JE-1).
-*           If this is a complex pair, the 2-by-2 diagonal block
-*           corresponding to the eigenvalue is in rows/columns JE-1:JE
-*
-            IF( ILCPLX ) THEN
-               ILCPLX = .FALSE.
-               GO TO 500
-            END IF
-            NW = 1
-            IF( JE.GT.1 ) THEN
-               IF( S( JE, JE-1 ).NE.ZERO ) THEN
-                  ILCPLX = .TRUE.
-                  NW = 2
-               END IF
-            END IF
-            IF( ILALL ) THEN
-               ILCOMP = .TRUE.
-            ELSE IF( ILCPLX ) THEN
-               ILCOMP = SELECT( JE ) .OR. SELECT( JE-1 )
-            ELSE
-               ILCOMP = SELECT( JE )
-            END IF
-            IF( .NOT.ILCOMP )
-     $         GO TO 500
-*
-*           Decide if (a) singular pencil, (b) real eigenvalue, or
-*           (c) complex eigenvalue.
-*
-            IF( .NOT.ILCPLX ) THEN
-               IF( ABS( S( JE, JE ) ).LE.SAFMIN .AND.
-     $             ABS( P( JE, JE ) ).LE.SAFMIN ) THEN
-*
-*                 Singular matrix pencil -- unit eigenvector
-*
-                  IEIG = IEIG - 1
-                  DO 230 JR = 1, N
-                     VR( JR, IEIG ) = ZERO
-  230             CONTINUE
-                  VR( IEIG, IEIG ) = ONE
-                  GO TO 500
-               END IF
-            END IF
-*
-*           Clear vector
-*
-            DO 250 JW = 0, NW - 1
-               DO 240 JR = 1, N
-                  WORK( ( JW+2 )*N+JR ) = ZERO
-  240          CONTINUE
-  250       CONTINUE
-*
-*           Compute coefficients in  ( a A - b B ) x = 0
-*              a  is  ACOEF
-*              b  is  BCOEFR + i*BCOEFI
-*
-            IF( .NOT.ILCPLX ) THEN
-*
-*              Real eigenvalue
-*
-               TEMP = ONE / MAX( ABS( S( JE, JE ) )*ASCALE,
-     $                ABS( P( JE, JE ) )*BSCALE, SAFMIN )
-               SALFAR = ( TEMP*S( JE, JE ) )*ASCALE
-               SBETA = ( TEMP*P( JE, JE ) )*BSCALE
-               ACOEF = SBETA*ASCALE
-               BCOEFR = SALFAR*BSCALE
-               BCOEFI = ZERO
-*
-*              Scale to avoid underflow
-*
-               SCALE = ONE
-               LSA = ABS( SBETA ).GE.SAFMIN .AND. ABS( ACOEF ).LT.SMALL
-               LSB = ABS( SALFAR ).GE.SAFMIN .AND. ABS( BCOEFR ).LT.
-     $               SMALL
-               IF( LSA )
-     $            SCALE = ( SMALL / ABS( SBETA ) )*MIN( ANORM, BIG )
-               IF( LSB )
-     $            SCALE = MAX( SCALE, ( SMALL / ABS( SALFAR ) )*
-     $                    MIN( BNORM, BIG ) )
-               IF( LSA .OR. LSB ) THEN
-                  SCALE = MIN( SCALE, ONE /
-     $                    ( SAFMIN*MAX( ONE, ABS( ACOEF ),
-     $                    ABS( BCOEFR ) ) ) )
-                  IF( LSA ) THEN
-                     ACOEF = ASCALE*( SCALE*SBETA )
-                  ELSE
-                     ACOEF = SCALE*ACOEF
-                  END IF
-                  IF( LSB ) THEN
-                     BCOEFR = BSCALE*( SCALE*SALFAR )
-                  ELSE
-                     BCOEFR = SCALE*BCOEFR
-                  END IF
-               END IF
-               ACOEFA = ABS( ACOEF )
-               BCOEFA = ABS( BCOEFR )
-*
-*              First component is 1
-*
-               WORK( 2*N+JE ) = ONE
-               XMAX = ONE
-*
-*              Compute contribution from column JE of A and B to sum
-*              (See "Further Details", above.)
-*
-               DO 260 JR = 1, JE - 1
-                  WORK( 2*N+JR ) = BCOEFR*P( JR, JE ) -
-     $                             ACOEF*S( JR, JE )
-  260          CONTINUE
-            ELSE
-*
-*              Complex eigenvalue
-*
-               CALL DLAG2( S( JE-1, JE-1 ), LDS, P( JE-1, JE-1 ), LDP,
-     $                     SAFMIN*SAFETY, ACOEF, TEMP, BCOEFR, TEMP2,
-     $                     BCOEFI )
-               IF( BCOEFI.EQ.ZERO ) THEN
-                  INFO = JE - 1
-                  RETURN
-               END IF
-*
-*              Scale to avoid over/underflow
-*
-               ACOEFA = ABS( ACOEF )
-               BCOEFA = ABS( BCOEFR ) + ABS( BCOEFI )
-               SCALE = ONE
-               IF( ACOEFA*ULP.LT.SAFMIN .AND. ACOEFA.GE.SAFMIN )
-     $            SCALE = ( SAFMIN / ULP ) / ACOEFA
-               IF( BCOEFA*ULP.LT.SAFMIN .AND. BCOEFA.GE.SAFMIN )
-     $            SCALE = MAX( SCALE, ( SAFMIN / ULP ) / BCOEFA )
-               IF( SAFMIN*ACOEFA.GT.ASCALE )
-     $            SCALE = ASCALE / ( SAFMIN*ACOEFA )
-               IF( SAFMIN*BCOEFA.GT.BSCALE )
-     $            SCALE = MIN( SCALE, BSCALE / ( SAFMIN*BCOEFA ) )
-               IF( SCALE.NE.ONE ) THEN
-                  ACOEF = SCALE*ACOEF
-                  ACOEFA = ABS( ACOEF )
-                  BCOEFR = SCALE*BCOEFR
-                  BCOEFI = SCALE*BCOEFI
-                  BCOEFA = ABS( BCOEFR ) + ABS( BCOEFI )
-               END IF
-*
-*              Compute first two components of eigenvector
-*              and contribution to sums
-*
-               TEMP = ACOEF*S( JE, JE-1 )
-               TEMP2R = ACOEF*S( JE, JE ) - BCOEFR*P( JE, JE )
-               TEMP2I = -BCOEFI*P( JE, JE )
-               IF( ABS( TEMP ).GE.ABS( TEMP2R )+ABS( TEMP2I ) ) THEN
-                  WORK( 2*N+JE ) = ONE
-                  WORK( 3*N+JE ) = ZERO
-                  WORK( 2*N+JE-1 ) = -TEMP2R / TEMP
-                  WORK( 3*N+JE-1 ) = -TEMP2I / TEMP
-               ELSE
-                  WORK( 2*N+JE-1 ) = ONE
-                  WORK( 3*N+JE-1 ) = ZERO
-                  TEMP = ACOEF*S( JE-1, JE )
-                  WORK( 2*N+JE ) = ( BCOEFR*P( JE-1, JE-1 )-ACOEF*
-     $                             S( JE-1, JE-1 ) ) / TEMP
-                  WORK( 3*N+JE ) = BCOEFI*P( JE-1, JE-1 ) / TEMP
-               END IF
-*
-               XMAX = MAX( ABS( WORK( 2*N+JE ) )+ABS( WORK( 3*N+JE ) ),
-     $                ABS( WORK( 2*N+JE-1 ) )+ABS( WORK( 3*N+JE-1 ) ) )
-*
-*              Compute contribution from columns JE and JE-1
-*              of A and B to the sums.
-*
-               CREALA = ACOEF*WORK( 2*N+JE-1 )
-               CIMAGA = ACOEF*WORK( 3*N+JE-1 )
-               CREALB = BCOEFR*WORK( 2*N+JE-1 ) -
-     $                  BCOEFI*WORK( 3*N+JE-1 )
-               CIMAGB = BCOEFI*WORK( 2*N+JE-1 ) +
-     $                  BCOEFR*WORK( 3*N+JE-1 )
-               CRE2A = ACOEF*WORK( 2*N+JE )
-               CIM2A = ACOEF*WORK( 3*N+JE )
-               CRE2B = BCOEFR*WORK( 2*N+JE ) - BCOEFI*WORK( 3*N+JE )
-               CIM2B = BCOEFI*WORK( 2*N+JE ) + BCOEFR*WORK( 3*N+JE )
-               DO 270 JR = 1, JE - 2
-                  WORK( 2*N+JR ) = -CREALA*S( JR, JE-1 ) +
-     $                             CREALB*P( JR, JE-1 ) -
-     $                             CRE2A*S( JR, JE ) + CRE2B*P( JR, JE )
-                  WORK( 3*N+JR ) = -CIMAGA*S( JR, JE-1 ) +
-     $                             CIMAGB*P( JR, JE-1 ) -
-     $                             CIM2A*S( JR, JE ) + CIM2B*P( JR, JE )
-  270          CONTINUE
-            END IF
-*
-            DMIN = MAX( ULP*ACOEFA*ANORM, ULP*BCOEFA*BNORM, SAFMIN )
-*
-*           Columnwise triangular solve of  (a A - b B)  x = 0
-*
-            IL2BY2 = .FALSE.
-            DO 370 J = JE - NW, 1, -1
-*
-*              If a 2-by-2 block, is in position j-1:j, wait until
-*              next iteration to process it (when it will be j:j+1)
-*
-               IF( .NOT.IL2BY2 .AND. J.GT.1 ) THEN
-                  IF( S( J, J-1 ).NE.ZERO ) THEN
-                     IL2BY2 = .TRUE.
-                     GO TO 370
-                  END IF
-               END IF
-               BDIAG( 1 ) = P( J, J )
-               IF( IL2BY2 ) THEN
-                  NA = 2
-                  BDIAG( 2 ) = P( J+1, J+1 )
-               ELSE
-                  NA = 1
-               END IF
-*
-*              Compute x(j) (and x(j+1), if 2-by-2 block)
-*
-               CALL DLALN2( .FALSE., NA, NW, DMIN, ACOEF, S( J, J ),
-     $                      LDS, BDIAG( 1 ), BDIAG( 2 ), WORK( 2*N+J ),
-     $                      N, BCOEFR, BCOEFI, SUM, 2, SCALE, TEMP,
-     $                      IINFO )
-               IF( SCALE.LT.ONE ) THEN
-*
-                  DO 290 JW = 0, NW - 1
-                     DO 280 JR = 1, JE
-                        WORK( ( JW+2 )*N+JR ) = SCALE*
-     $                     WORK( ( JW+2 )*N+JR )
-  280                CONTINUE
-  290             CONTINUE
-               END IF
-               XMAX = MAX( SCALE*XMAX, TEMP )
-*
-               DO 310 JW = 1, NW
-                  DO 300 JA = 1, NA
-                     WORK( ( JW+1 )*N+J+JA-1 ) = SUM( JA, JW )
-  300             CONTINUE
-  310          CONTINUE
-*
-*              w = w + x(j)*(a S(*,j) - b P(*,j) ) with scaling
-*
-               IF( J.GT.1 ) THEN
-*
-*                 Check whether scaling is necessary for sum.
-*
-                  XSCALE = ONE / MAX( ONE, XMAX )
-                  TEMP = ACOEFA*WORK( J ) + BCOEFA*WORK( N+J )
-                  IF( IL2BY2 )
-     $               TEMP = MAX( TEMP, ACOEFA*WORK( J+1 )+BCOEFA*
-     $                      WORK( N+J+1 ) )
-                  TEMP = MAX( TEMP, ACOEFA, BCOEFA )
-                  IF( TEMP.GT.BIGNUM*XSCALE ) THEN
-*
-                     DO 330 JW = 0, NW - 1
-                        DO 320 JR = 1, JE
-                           WORK( ( JW+2 )*N+JR ) = XSCALE*
-     $                        WORK( ( JW+2 )*N+JR )
-  320                   CONTINUE
-  330                CONTINUE
-                     XMAX = XMAX*XSCALE
-                  END IF
-*
-*                 Compute the contributions of the off-diagonals of
-*                 column j (and j+1, if 2-by-2 block) of A and B to the
-*                 sums.
-*
-*
-                  DO 360 JA = 1, NA
-                     IF( ILCPLX ) THEN
-                        CREALA = ACOEF*WORK( 2*N+J+JA-1 )
-                        CIMAGA = ACOEF*WORK( 3*N+J+JA-1 )
-                        CREALB = BCOEFR*WORK( 2*N+J+JA-1 ) -
-     $                           BCOEFI*WORK( 3*N+J+JA-1 )
-                        CIMAGB = BCOEFI*WORK( 2*N+J+JA-1 ) +
-     $                           BCOEFR*WORK( 3*N+J+JA-1 )
-                        DO 340 JR = 1, J - 1
-                           WORK( 2*N+JR ) = WORK( 2*N+JR ) -
-     $                                      CREALA*S( JR, J+JA-1 ) +
-     $                                      CREALB*P( JR, J+JA-1 )
-                           WORK( 3*N+JR ) = WORK( 3*N+JR ) -
-     $                                      CIMAGA*S( JR, J+JA-1 ) +
-     $                                      CIMAGB*P( JR, J+JA-1 )
-  340                   CONTINUE
-                     ELSE
-                        CREALA = ACOEF*WORK( 2*N+J+JA-1 )
-                        CREALB = BCOEFR*WORK( 2*N+J+JA-1 )
-                        DO 350 JR = 1, J - 1
-                           WORK( 2*N+JR ) = WORK( 2*N+JR ) -
-     $                                      CREALA*S( JR, J+JA-1 ) +
-     $                                      CREALB*P( JR, J+JA-1 )
-  350                   CONTINUE
-                     END IF
-  360             CONTINUE
-               END IF
-*
-               IL2BY2 = .FALSE.
-  370       CONTINUE
-*
-*           Copy eigenvector to VR, back transforming if
-*           HOWMNY='B'.
-*
-            IEIG = IEIG - NW
-            IF( ILBACK ) THEN
-*
-               DO 410 JW = 0, NW - 1
-                  DO 380 JR = 1, N
-                     WORK( ( JW+4 )*N+JR ) = WORK( ( JW+2 )*N+1 )*
-     $                                       VR( JR, 1 )
-  380             CONTINUE
-*
-*                 A series of compiler directives to defeat
-*                 vectorization for the next loop
-*
-*
-                  DO 400 JC = 2, JE
-                     DO 390 JR = 1, N
-                        WORK( ( JW+4 )*N+JR ) = WORK( ( JW+4 )*N+JR ) +
-     $                     WORK( ( JW+2 )*N+JC )*VR( JR, JC )
-  390                CONTINUE
-  400             CONTINUE
-  410          CONTINUE
-*
-               DO 430 JW = 0, NW - 1
-                  DO 420 JR = 1, N
-                     VR( JR, IEIG+JW ) = WORK( ( JW+4 )*N+JR )
-  420             CONTINUE
-  430          CONTINUE
-*
-               IEND = N
-            ELSE
-               DO 450 JW = 0, NW - 1
-                  DO 440 JR = 1, N
-                     VR( JR, IEIG+JW ) = WORK( ( JW+2 )*N+JR )
-  440             CONTINUE
-  450          CONTINUE
-*
-               IEND = JE
-            END IF
-*
-*           Scale eigenvector
-*
-            XMAX = ZERO
-            IF( ILCPLX ) THEN
-               DO 460 J = 1, IEND
-                  XMAX = MAX( XMAX, ABS( VR( J, IEIG ) )+
-     $                   ABS( VR( J, IEIG+1 ) ) )
-  460          CONTINUE
-            ELSE
-               DO 470 J = 1, IEND
-                  XMAX = MAX( XMAX, ABS( VR( J, IEIG ) ) )
-  470          CONTINUE
-            END IF
-*
-            IF( XMAX.GT.SAFMIN ) THEN
-               XSCALE = ONE / XMAX
-               DO 490 JW = 0, NW - 1
-                  DO 480 JR = 1, IEND
-                     VR( JR, IEIG+JW ) = XSCALE*VR( JR, IEIG+JW )
-  480             CONTINUE
-  490          CONTINUE
-            END IF
-  500    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of DTGEVC
-*
-      END
--- a/libcruft/lapack/dtrcon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,197 +0,0 @@
-      SUBROUTINE DTRCON( NORM, UPLO, DIAG, N, A, LDA, RCOND, WORK,
-     $                   IWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, NORM, UPLO
-      INTEGER            INFO, LDA, N
-      DOUBLE PRECISION   RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      DOUBLE PRECISION   A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DTRCON estimates the reciprocal of the condition number of a
-*  triangular matrix A, in either the 1-norm or the infinity-norm.
-*
-*  The norm of A is computed and an estimate is obtained for
-*  norm(inv(A)), then the reciprocal of the condition number is
-*  computed as
-*     RCOND = 1 / ( norm(A) * norm(inv(A)) ).
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies whether the 1-norm condition number or the
-*          infinity-norm condition number is required:
-*          = '1' or 'O':  1-norm;
-*          = 'I':         Infinity-norm.
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  A is upper triangular;
-*          = 'L':  A is lower triangular.
-*
-*  DIAG    (input) CHARACTER*1
-*          = 'N':  A is non-unit triangular;
-*          = 'U':  A is unit triangular.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA,N)
-*          The triangular matrix A.  If UPLO = 'U', the leading N-by-N
-*          upper triangular part of the array A contains the upper
-*          triangular matrix, and the strictly lower triangular part of
-*          A is not referenced.  If UPLO = 'L', the leading N-by-N lower
-*          triangular part of the array A contains the lower triangular
-*          matrix, and the strictly upper triangular part of A is not
-*          referenced.  If DIAG = 'U', the diagonal elements of A are
-*          also not referenced and are assumed to be 1.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  RCOND   (output) DOUBLE PRECISION
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(norm(A) * norm(inv(A))).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (3*N)
-*
-*  IWORK   (workspace) INTEGER array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOUNIT, ONENRM, UPPER
-      CHARACTER          NORMIN
-      INTEGER            IX, KASE, KASE1
-      DOUBLE PRECISION   AINVNM, ANORM, SCALE, SMLNUM, XNORM
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DLAMCH, DLANTR
-      EXTERNAL           LSAME, IDAMAX, DLAMCH, DLANTR
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLACN2, DLATRS, DRSCL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' )
-      NOUNIT = LSAME( DIAG, 'N' )
-*
-      IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DTRCON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      END IF
-*
-      RCOND = ZERO
-      SMLNUM = DLAMCH( 'Safe minimum' )*DBLE( MAX( 1, N ) )
-*
-*     Compute the norm of the triangular matrix A.
-*
-      ANORM = DLANTR( NORM, UPLO, DIAG, N, N, A, LDA, WORK )
-*
-*     Continue only if ANORM > 0.
-*
-      IF( ANORM.GT.ZERO ) THEN
-*
-*        Estimate the norm of the inverse of A.
-*
-         AINVNM = ZERO
-         NORMIN = 'N'
-         IF( ONENRM ) THEN
-            KASE1 = 1
-         ELSE
-            KASE1 = 2
-         END IF
-         KASE = 0
-   10    CONTINUE
-         CALL DLACN2( N, WORK( N+1 ), WORK, IWORK, AINVNM, KASE, ISAVE )
-         IF( KASE.NE.0 ) THEN
-            IF( KASE.EQ.KASE1 ) THEN
-*
-*              Multiply by inv(A).
-*
-               CALL DLATRS( UPLO, 'No transpose', DIAG, NORMIN, N, A,
-     $                      LDA, WORK, SCALE, WORK( 2*N+1 ), INFO )
-            ELSE
-*
-*              Multiply by inv(A').
-*
-               CALL DLATRS( UPLO, 'Transpose', DIAG, NORMIN, N, A, LDA,
-     $                      WORK, SCALE, WORK( 2*N+1 ), INFO )
-            END IF
-            NORMIN = 'Y'
-*
-*           Multiply by 1/SCALE if doing so will not cause overflow.
-*
-            IF( SCALE.NE.ONE ) THEN
-               IX = IDAMAX( N, WORK, 1 )
-               XNORM = ABS( WORK( IX ) )
-               IF( SCALE.LT.XNORM*SMLNUM .OR. SCALE.EQ.ZERO )
-     $            GO TO 20
-               CALL DRSCL( N, SCALE, WORK, 1 )
-            END IF
-            GO TO 10
-         END IF
-*
-*        Compute the estimate of the reciprocal condition number.
-*
-         IF( AINVNM.NE.ZERO )
-     $      RCOND = ( ONE / ANORM ) / AINVNM
-      END IF
-*
-   20 CONTINUE
-      RETURN
-*
-*     End of DTRCON
-*
-      END
--- a/libcruft/lapack/dtrevc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,980 +0,0 @@
-      SUBROUTINE DTREVC( SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR,
-     $                   LDVR, MM, M, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          HOWMNY, SIDE
-      INTEGER            INFO, LDT, LDVL, LDVR, M, MM, N
-*     ..
-*     .. Array Arguments ..
-      LOGICAL            SELECT( * )
-      DOUBLE PRECISION   T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DTREVC computes some or all of the right and/or left eigenvectors of
-*  a real upper quasi-triangular matrix T.
-*  Matrices of this type are produced by the Schur factorization of
-*  a real general matrix:  A = Q*T*Q**T, as computed by DHSEQR.
-*  
-*  The right eigenvector x and the left eigenvector y of T corresponding
-*  to an eigenvalue w are defined by:
-*  
-*     T*x = w*x,     (y**H)*T = w*(y**H)
-*  
-*  where y**H denotes the conjugate transpose of y.
-*  The eigenvalues are not input to this routine, but are read directly
-*  from the diagonal blocks of T.
-*  
-*  This routine returns the matrices X and/or Y of right and left
-*  eigenvectors of T, or the products Q*X and/or Q*Y, where Q is an
-*  input matrix.  If Q is the orthogonal factor that reduces a matrix
-*  A to Schur form T, then Q*X and Q*Y are the matrices of right and
-*  left eigenvectors of A.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'R':  compute right eigenvectors only;
-*          = 'L':  compute left eigenvectors only;
-*          = 'B':  compute both right and left eigenvectors.
-*
-*  HOWMNY  (input) CHARACTER*1
-*          = 'A':  compute all right and/or left eigenvectors;
-*          = 'B':  compute all right and/or left eigenvectors,
-*                  backtransformed by the matrices in VR and/or VL;
-*          = 'S':  compute selected right and/or left eigenvectors,
-*                  as indicated by the logical array SELECT.
-*
-*  SELECT  (input/output) LOGICAL array, dimension (N)
-*          If HOWMNY = 'S', SELECT specifies the eigenvectors to be
-*          computed.
-*          If w(j) is a real eigenvalue, the corresponding real
-*          eigenvector is computed if SELECT(j) is .TRUE..
-*          If w(j) and w(j+1) are the real and imaginary parts of a
-*          complex eigenvalue, the corresponding complex eigenvector is
-*          computed if either SELECT(j) or SELECT(j+1) is .TRUE., and
-*          on exit SELECT(j) is set to .TRUE. and SELECT(j+1) is set to
-*          .FALSE..
-*          Not referenced if HOWMNY = 'A' or 'B'.
-*
-*  N       (input) INTEGER
-*          The order of the matrix T. N >= 0.
-*
-*  T       (input) DOUBLE PRECISION array, dimension (LDT,N)
-*          The upper quasi-triangular matrix T in Schur canonical form.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= max(1,N).
-*
-*  VL      (input/output) DOUBLE PRECISION array, dimension (LDVL,MM)
-*          On entry, if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must
-*          contain an N-by-N matrix Q (usually the orthogonal matrix Q
-*          of Schur vectors returned by DHSEQR).
-*          On exit, if SIDE = 'L' or 'B', VL contains:
-*          if HOWMNY = 'A', the matrix Y of left eigenvectors of T;
-*          if HOWMNY = 'B', the matrix Q*Y;
-*          if HOWMNY = 'S', the left eigenvectors of T specified by
-*                           SELECT, stored consecutively in the columns
-*                           of VL, in the same order as their
-*                           eigenvalues.
-*          A complex eigenvector corresponding to a complex eigenvalue
-*          is stored in two consecutive columns, the first holding the
-*          real part, and the second the imaginary part.
-*          Not referenced if SIDE = 'R'.
-*
-*  LDVL    (input) INTEGER
-*          The leading dimension of the array VL.  LDVL >= 1, and if
-*          SIDE = 'L' or 'B', LDVL >= N.
-*
-*  VR      (input/output) DOUBLE PRECISION array, dimension (LDVR,MM)
-*          On entry, if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must
-*          contain an N-by-N matrix Q (usually the orthogonal matrix Q
-*          of Schur vectors returned by DHSEQR).
-*          On exit, if SIDE = 'R' or 'B', VR contains:
-*          if HOWMNY = 'A', the matrix X of right eigenvectors of T;
-*          if HOWMNY = 'B', the matrix Q*X;
-*          if HOWMNY = 'S', the right eigenvectors of T specified by
-*                           SELECT, stored consecutively in the columns
-*                           of VR, in the same order as their
-*                           eigenvalues.
-*          A complex eigenvector corresponding to a complex eigenvalue
-*          is stored in two consecutive columns, the first holding the
-*          real part and the second the imaginary part.
-*          Not referenced if SIDE = 'L'.
-*
-*  LDVR    (input) INTEGER
-*          The leading dimension of the array VR.  LDVR >= 1, and if
-*          SIDE = 'R' or 'B', LDVR >= N.
-*
-*  MM      (input) INTEGER
-*          The number of columns in the arrays VL and/or VR. MM >= M.
-*
-*  M       (output) INTEGER
-*          The number of columns in the arrays VL and/or VR actually
-*          used to store the eigenvectors.
-*          If HOWMNY = 'A' or 'B', M is set to N.
-*          Each selected real eigenvector occupies one column and each
-*          selected complex eigenvector occupies two columns.
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (3*N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The algorithm used in this program is basically backward (forward)
-*  substitution, with scaling to make the the code robust against
-*  possible overflow.
-*
-*  Each eigenvector is normalized so that the element of largest
-*  magnitude has magnitude 1; here the magnitude of a complex number
-*  (x,y) is taken to be |x| + |y|.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ALLV, BOTHV, LEFTV, OVER, PAIR, RIGHTV, SOMEV
-      INTEGER            I, IERR, II, IP, IS, J, J1, J2, JNXT, K, KI, N2
-      DOUBLE PRECISION   BETA, BIGNUM, EMAX, OVFL, REC, REMAX, SCALE,
-     $                   SMIN, SMLNUM, ULP, UNFL, VCRIT, VMAX, WI, WR,
-     $                   XNORM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DDOT, DLAMCH
-      EXTERNAL           LSAME, IDAMAX, DDOT, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DAXPY, DCOPY, DGEMV, DLALN2, DSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SQRT
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   X( 2, 2 )
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and test the input parameters
-*
-      BOTHV = LSAME( SIDE, 'B' )
-      RIGHTV = LSAME( SIDE, 'R' ) .OR. BOTHV
-      LEFTV = LSAME( SIDE, 'L' ) .OR. BOTHV
-*
-      ALLV = LSAME( HOWMNY, 'A' )
-      OVER = LSAME( HOWMNY, 'B' )
-      SOMEV = LSAME( HOWMNY, 'S' )
-*
-      INFO = 0
-      IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
-         INFO = -1
-      ELSE IF( .NOT.ALLV .AND. .NOT.OVER .AND. .NOT.SOMEV ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDT.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      ELSE IF( LDVL.LT.1 .OR. ( LEFTV .AND. LDVL.LT.N ) ) THEN
-         INFO = -8
-      ELSE IF( LDVR.LT.1 .OR. ( RIGHTV .AND. LDVR.LT.N ) ) THEN
-         INFO = -10
-      ELSE
-*
-*        Set M to the number of columns required to store the selected
-*        eigenvectors, standardize the array SELECT if necessary, and
-*        test MM.
-*
-         IF( SOMEV ) THEN
-            M = 0
-            PAIR = .FALSE.
-            DO 10 J = 1, N
-               IF( PAIR ) THEN
-                  PAIR = .FALSE.
-                  SELECT( J ) = .FALSE.
-               ELSE
-                  IF( J.LT.N ) THEN
-                     IF( T( J+1, J ).EQ.ZERO ) THEN
-                        IF( SELECT( J ) )
-     $                     M = M + 1
-                     ELSE
-                        PAIR = .TRUE.
-                        IF( SELECT( J ) .OR. SELECT( J+1 ) ) THEN
-                           SELECT( J ) = .TRUE.
-                           M = M + 2
-                        END IF
-                     END IF
-                  ELSE
-                     IF( SELECT( N ) )
-     $                  M = M + 1
-                  END IF
-               END IF
-   10       CONTINUE
-         ELSE
-            M = N
-         END IF
-*
-         IF( MM.LT.M ) THEN
-            INFO = -11
-         END IF
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DTREVC', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Set the constants to control overflow.
-*
-      UNFL = DLAMCH( 'Safe minimum' )
-      OVFL = ONE / UNFL
-      CALL DLABAD( UNFL, OVFL )
-      ULP = DLAMCH( 'Precision' )
-      SMLNUM = UNFL*( N / ULP )
-      BIGNUM = ( ONE-ULP ) / SMLNUM
-*
-*     Compute 1-norm of each column of strictly upper triangular
-*     part of T to control overflow in triangular solver.
-*
-      WORK( 1 ) = ZERO
-      DO 30 J = 2, N
-         WORK( J ) = ZERO
-         DO 20 I = 1, J - 1
-            WORK( J ) = WORK( J ) + ABS( T( I, J ) )
-   20    CONTINUE
-   30 CONTINUE
-*
-*     Index IP is used to specify the real or complex eigenvalue:
-*       IP = 0, real eigenvalue,
-*            1, first of conjugate complex pair: (wr,wi)
-*           -1, second of conjugate complex pair: (wr,wi)
-*
-      N2 = 2*N
-*
-      IF( RIGHTV ) THEN
-*
-*        Compute right eigenvectors.
-*
-         IP = 0
-         IS = M
-         DO 140 KI = N, 1, -1
-*
-            IF( IP.EQ.1 )
-     $         GO TO 130
-            IF( KI.EQ.1 )
-     $         GO TO 40
-            IF( T( KI, KI-1 ).EQ.ZERO )
-     $         GO TO 40
-            IP = -1
-*
-   40       CONTINUE
-            IF( SOMEV ) THEN
-               IF( IP.EQ.0 ) THEN
-                  IF( .NOT.SELECT( KI ) )
-     $               GO TO 130
-               ELSE
-                  IF( .NOT.SELECT( KI-1 ) )
-     $               GO TO 130
-               END IF
-            END IF
-*
-*           Compute the KI-th eigenvalue (WR,WI).
-*
-            WR = T( KI, KI )
-            WI = ZERO
-            IF( IP.NE.0 )
-     $         WI = SQRT( ABS( T( KI, KI-1 ) ) )*
-     $              SQRT( ABS( T( KI-1, KI ) ) )
-            SMIN = MAX( ULP*( ABS( WR )+ABS( WI ) ), SMLNUM )
-*
-            IF( IP.EQ.0 ) THEN
-*
-*              Real right eigenvector
-*
-               WORK( KI+N ) = ONE
-*
-*              Form right-hand side
-*
-               DO 50 K = 1, KI - 1
-                  WORK( K+N ) = -T( K, KI )
-   50          CONTINUE
-*
-*              Solve the upper quasi-triangular system:
-*                 (T(1:KI-1,1:KI-1) - WR)*X = SCALE*WORK.
-*
-               JNXT = KI - 1
-               DO 60 J = KI - 1, 1, -1
-                  IF( J.GT.JNXT )
-     $               GO TO 60
-                  J1 = J
-                  J2 = J
-                  JNXT = J - 1
-                  IF( J.GT.1 ) THEN
-                     IF( T( J, J-1 ).NE.ZERO ) THEN
-                        J1 = J - 1
-                        JNXT = J - 2
-                     END IF
-                  END IF
-*
-                  IF( J1.EQ.J2 ) THEN
-*
-*                    1-by-1 diagonal block
-*
-                     CALL DLALN2( .FALSE., 1, 1, SMIN, ONE, T( J, J ),
-     $                            LDT, ONE, ONE, WORK( J+N ), N, WR,
-     $                            ZERO, X, 2, SCALE, XNORM, IERR )
-*
-*                    Scale X(1,1) to avoid overflow when updating
-*                    the right-hand side.
-*
-                     IF( XNORM.GT.ONE ) THEN
-                        IF( WORK( J ).GT.BIGNUM / XNORM ) THEN
-                           X( 1, 1 ) = X( 1, 1 ) / XNORM
-                           SCALE = SCALE / XNORM
-                        END IF
-                     END IF
-*
-*                    Scale if necessary
-*
-                     IF( SCALE.NE.ONE )
-     $                  CALL DSCAL( KI, SCALE, WORK( 1+N ), 1 )
-                     WORK( J+N ) = X( 1, 1 )
-*
-*                    Update right-hand side
-*
-                     CALL DAXPY( J-1, -X( 1, 1 ), T( 1, J ), 1,
-     $                           WORK( 1+N ), 1 )
-*
-                  ELSE
-*
-*                    2-by-2 diagonal block
-*
-                     CALL DLALN2( .FALSE., 2, 1, SMIN, ONE,
-     $                            T( J-1, J-1 ), LDT, ONE, ONE,
-     $                            WORK( J-1+N ), N, WR, ZERO, X, 2,
-     $                            SCALE, XNORM, IERR )
-*
-*                    Scale X(1,1) and X(2,1) to avoid overflow when
-*                    updating the right-hand side.
-*
-                     IF( XNORM.GT.ONE ) THEN
-                        BETA = MAX( WORK( J-1 ), WORK( J ) )
-                        IF( BETA.GT.BIGNUM / XNORM ) THEN
-                           X( 1, 1 ) = X( 1, 1 ) / XNORM
-                           X( 2, 1 ) = X( 2, 1 ) / XNORM
-                           SCALE = SCALE / XNORM
-                        END IF
-                     END IF
-*
-*                    Scale if necessary
-*
-                     IF( SCALE.NE.ONE )
-     $                  CALL DSCAL( KI, SCALE, WORK( 1+N ), 1 )
-                     WORK( J-1+N ) = X( 1, 1 )
-                     WORK( J+N ) = X( 2, 1 )
-*
-*                    Update right-hand side
-*
-                     CALL DAXPY( J-2, -X( 1, 1 ), T( 1, J-1 ), 1,
-     $                           WORK( 1+N ), 1 )
-                     CALL DAXPY( J-2, -X( 2, 1 ), T( 1, J ), 1,
-     $                           WORK( 1+N ), 1 )
-                  END IF
-   60          CONTINUE
-*
-*              Copy the vector x or Q*x to VR and normalize.
-*
-               IF( .NOT.OVER ) THEN
-                  CALL DCOPY( KI, WORK( 1+N ), 1, VR( 1, IS ), 1 )
-*
-                  II = IDAMAX( KI, VR( 1, IS ), 1 )
-                  REMAX = ONE / ABS( VR( II, IS ) )
-                  CALL DSCAL( KI, REMAX, VR( 1, IS ), 1 )
-*
-                  DO 70 K = KI + 1, N
-                     VR( K, IS ) = ZERO
-   70             CONTINUE
-               ELSE
-                  IF( KI.GT.1 )
-     $               CALL DGEMV( 'N', N, KI-1, ONE, VR, LDVR,
-     $                           WORK( 1+N ), 1, WORK( KI+N ),
-     $                           VR( 1, KI ), 1 )
-*
-                  II = IDAMAX( N, VR( 1, KI ), 1 )
-                  REMAX = ONE / ABS( VR( II, KI ) )
-                  CALL DSCAL( N, REMAX, VR( 1, KI ), 1 )
-               END IF
-*
-            ELSE
-*
-*              Complex right eigenvector.
-*
-*              Initial solve
-*                [ (T(KI-1,KI-1) T(KI-1,KI) ) - (WR + I* WI)]*X = 0.
-*                [ (T(KI,KI-1)   T(KI,KI)   )               ]
-*
-               IF( ABS( T( KI-1, KI ) ).GE.ABS( T( KI, KI-1 ) ) ) THEN
-                  WORK( KI-1+N ) = ONE
-                  WORK( KI+N2 ) = WI / T( KI-1, KI )
-               ELSE
-                  WORK( KI-1+N ) = -WI / T( KI, KI-1 )
-                  WORK( KI+N2 ) = ONE
-               END IF
-               WORK( KI+N ) = ZERO
-               WORK( KI-1+N2 ) = ZERO
-*
-*              Form right-hand side
-*
-               DO 80 K = 1, KI - 2
-                  WORK( K+N ) = -WORK( KI-1+N )*T( K, KI-1 )
-                  WORK( K+N2 ) = -WORK( KI+N2 )*T( K, KI )
-   80          CONTINUE
-*
-*              Solve upper quasi-triangular system:
-*              (T(1:KI-2,1:KI-2) - (WR+i*WI))*X = SCALE*(WORK+i*WORK2)
-*
-               JNXT = KI - 2
-               DO 90 J = KI - 2, 1, -1
-                  IF( J.GT.JNXT )
-     $               GO TO 90
-                  J1 = J
-                  J2 = J
-                  JNXT = J - 1
-                  IF( J.GT.1 ) THEN
-                     IF( T( J, J-1 ).NE.ZERO ) THEN
-                        J1 = J - 1
-                        JNXT = J - 2
-                     END IF
-                  END IF
-*
-                  IF( J1.EQ.J2 ) THEN
-*
-*                    1-by-1 diagonal block
-*
-                     CALL DLALN2( .FALSE., 1, 2, SMIN, ONE, T( J, J ),
-     $                            LDT, ONE, ONE, WORK( J+N ), N, WR, WI,
-     $                            X, 2, SCALE, XNORM, IERR )
-*
-*                    Scale X(1,1) and X(1,2) to avoid overflow when
-*                    updating the right-hand side.
-*
-                     IF( XNORM.GT.ONE ) THEN
-                        IF( WORK( J ).GT.BIGNUM / XNORM ) THEN
-                           X( 1, 1 ) = X( 1, 1 ) / XNORM
-                           X( 1, 2 ) = X( 1, 2 ) / XNORM
-                           SCALE = SCALE / XNORM
-                        END IF
-                     END IF
-*
-*                    Scale if necessary
-*
-                     IF( SCALE.NE.ONE ) THEN
-                        CALL DSCAL( KI, SCALE, WORK( 1+N ), 1 )
-                        CALL DSCAL( KI, SCALE, WORK( 1+N2 ), 1 )
-                     END IF
-                     WORK( J+N ) = X( 1, 1 )
-                     WORK( J+N2 ) = X( 1, 2 )
-*
-*                    Update the right-hand side
-*
-                     CALL DAXPY( J-1, -X( 1, 1 ), T( 1, J ), 1,
-     $                           WORK( 1+N ), 1 )
-                     CALL DAXPY( J-1, -X( 1, 2 ), T( 1, J ), 1,
-     $                           WORK( 1+N2 ), 1 )
-*
-                  ELSE
-*
-*                    2-by-2 diagonal block
-*
-                     CALL DLALN2( .FALSE., 2, 2, SMIN, ONE,
-     $                            T( J-1, J-1 ), LDT, ONE, ONE,
-     $                            WORK( J-1+N ), N, WR, WI, X, 2, SCALE,
-     $                            XNORM, IERR )
-*
-*                    Scale X to avoid overflow when updating
-*                    the right-hand side.
-*
-                     IF( XNORM.GT.ONE ) THEN
-                        BETA = MAX( WORK( J-1 ), WORK( J ) )
-                        IF( BETA.GT.BIGNUM / XNORM ) THEN
-                           REC = ONE / XNORM
-                           X( 1, 1 ) = X( 1, 1 )*REC
-                           X( 1, 2 ) = X( 1, 2 )*REC
-                           X( 2, 1 ) = X( 2, 1 )*REC
-                           X( 2, 2 ) = X( 2, 2 )*REC
-                           SCALE = SCALE*REC
-                        END IF
-                     END IF
-*
-*                    Scale if necessary
-*
-                     IF( SCALE.NE.ONE ) THEN
-                        CALL DSCAL( KI, SCALE, WORK( 1+N ), 1 )
-                        CALL DSCAL( KI, SCALE, WORK( 1+N2 ), 1 )
-                     END IF
-                     WORK( J-1+N ) = X( 1, 1 )
-                     WORK( J+N ) = X( 2, 1 )
-                     WORK( J-1+N2 ) = X( 1, 2 )
-                     WORK( J+N2 ) = X( 2, 2 )
-*
-*                    Update the right-hand side
-*
-                     CALL DAXPY( J-2, -X( 1, 1 ), T( 1, J-1 ), 1,
-     $                           WORK( 1+N ), 1 )
-                     CALL DAXPY( J-2, -X( 2, 1 ), T( 1, J ), 1,
-     $                           WORK( 1+N ), 1 )
-                     CALL DAXPY( J-2, -X( 1, 2 ), T( 1, J-1 ), 1,
-     $                           WORK( 1+N2 ), 1 )
-                     CALL DAXPY( J-2, -X( 2, 2 ), T( 1, J ), 1,
-     $                           WORK( 1+N2 ), 1 )
-                  END IF
-   90          CONTINUE
-*
-*              Copy the vector x or Q*x to VR and normalize.
-*
-               IF( .NOT.OVER ) THEN
-                  CALL DCOPY( KI, WORK( 1+N ), 1, VR( 1, IS-1 ), 1 )
-                  CALL DCOPY( KI, WORK( 1+N2 ), 1, VR( 1, IS ), 1 )
-*
-                  EMAX = ZERO
-                  DO 100 K = 1, KI
-                     EMAX = MAX( EMAX, ABS( VR( K, IS-1 ) )+
-     $                      ABS( VR( K, IS ) ) )
-  100             CONTINUE
-*
-                  REMAX = ONE / EMAX
-                  CALL DSCAL( KI, REMAX, VR( 1, IS-1 ), 1 )
-                  CALL DSCAL( KI, REMAX, VR( 1, IS ), 1 )
-*
-                  DO 110 K = KI + 1, N
-                     VR( K, IS-1 ) = ZERO
-                     VR( K, IS ) = ZERO
-  110             CONTINUE
-*
-               ELSE
-*
-                  IF( KI.GT.2 ) THEN
-                     CALL DGEMV( 'N', N, KI-2, ONE, VR, LDVR,
-     $                           WORK( 1+N ), 1, WORK( KI-1+N ),
-     $                           VR( 1, KI-1 ), 1 )
-                     CALL DGEMV( 'N', N, KI-2, ONE, VR, LDVR,
-     $                           WORK( 1+N2 ), 1, WORK( KI+N2 ),
-     $                           VR( 1, KI ), 1 )
-                  ELSE
-                     CALL DSCAL( N, WORK( KI-1+N ), VR( 1, KI-1 ), 1 )
-                     CALL DSCAL( N, WORK( KI+N2 ), VR( 1, KI ), 1 )
-                  END IF
-*
-                  EMAX = ZERO
-                  DO 120 K = 1, N
-                     EMAX = MAX( EMAX, ABS( VR( K, KI-1 ) )+
-     $                      ABS( VR( K, KI ) ) )
-  120             CONTINUE
-                  REMAX = ONE / EMAX
-                  CALL DSCAL( N, REMAX, VR( 1, KI-1 ), 1 )
-                  CALL DSCAL( N, REMAX, VR( 1, KI ), 1 )
-               END IF
-            END IF
-*
-            IS = IS - 1
-            IF( IP.NE.0 )
-     $         IS = IS - 1
-  130       CONTINUE
-            IF( IP.EQ.1 )
-     $         IP = 0
-            IF( IP.EQ.-1 )
-     $         IP = 1
-  140    CONTINUE
-      END IF
-*
-      IF( LEFTV ) THEN
-*
-*        Compute left eigenvectors.
-*
-         IP = 0
-         IS = 1
-         DO 260 KI = 1, N
-*
-            IF( IP.EQ.-1 )
-     $         GO TO 250
-            IF( KI.EQ.N )
-     $         GO TO 150
-            IF( T( KI+1, KI ).EQ.ZERO )
-     $         GO TO 150
-            IP = 1
-*
-  150       CONTINUE
-            IF( SOMEV ) THEN
-               IF( .NOT.SELECT( KI ) )
-     $            GO TO 250
-            END IF
-*
-*           Compute the KI-th eigenvalue (WR,WI).
-*
-            WR = T( KI, KI )
-            WI = ZERO
-            IF( IP.NE.0 )
-     $         WI = SQRT( ABS( T( KI, KI+1 ) ) )*
-     $              SQRT( ABS( T( KI+1, KI ) ) )
-            SMIN = MAX( ULP*( ABS( WR )+ABS( WI ) ), SMLNUM )
-*
-            IF( IP.EQ.0 ) THEN
-*
-*              Real left eigenvector.
-*
-               WORK( KI+N ) = ONE
-*
-*              Form right-hand side
-*
-               DO 160 K = KI + 1, N
-                  WORK( K+N ) = -T( KI, K )
-  160          CONTINUE
-*
-*              Solve the quasi-triangular system:
-*                 (T(KI+1:N,KI+1:N) - WR)'*X = SCALE*WORK
-*
-               VMAX = ONE
-               VCRIT = BIGNUM
-*
-               JNXT = KI + 1
-               DO 170 J = KI + 1, N
-                  IF( J.LT.JNXT )
-     $               GO TO 170
-                  J1 = J
-                  J2 = J
-                  JNXT = J + 1
-                  IF( J.LT.N ) THEN
-                     IF( T( J+1, J ).NE.ZERO ) THEN
-                        J2 = J + 1
-                        JNXT = J + 2
-                     END IF
-                  END IF
-*
-                  IF( J1.EQ.J2 ) THEN
-*
-*                    1-by-1 diagonal block
-*
-*                    Scale if necessary to avoid overflow when forming
-*                    the right-hand side.
-*
-                     IF( WORK( J ).GT.VCRIT ) THEN
-                        REC = ONE / VMAX
-                        CALL DSCAL( N-KI+1, REC, WORK( KI+N ), 1 )
-                        VMAX = ONE
-                        VCRIT = BIGNUM
-                     END IF
-*
-                     WORK( J+N ) = WORK( J+N ) -
-     $                             DDOT( J-KI-1, T( KI+1, J ), 1,
-     $                             WORK( KI+1+N ), 1 )
-*
-*                    Solve (T(J,J)-WR)'*X = WORK
-*
-                     CALL DLALN2( .FALSE., 1, 1, SMIN, ONE, T( J, J ),
-     $                            LDT, ONE, ONE, WORK( J+N ), N, WR,
-     $                            ZERO, X, 2, SCALE, XNORM, IERR )
-*
-*                    Scale if necessary
-*
-                     IF( SCALE.NE.ONE )
-     $                  CALL DSCAL( N-KI+1, SCALE, WORK( KI+N ), 1 )
-                     WORK( J+N ) = X( 1, 1 )
-                     VMAX = MAX( ABS( WORK( J+N ) ), VMAX )
-                     VCRIT = BIGNUM / VMAX
-*
-                  ELSE
-*
-*                    2-by-2 diagonal block
-*
-*                    Scale if necessary to avoid overflow when forming
-*                    the right-hand side.
-*
-                     BETA = MAX( WORK( J ), WORK( J+1 ) )
-                     IF( BETA.GT.VCRIT ) THEN
-                        REC = ONE / VMAX
-                        CALL DSCAL( N-KI+1, REC, WORK( KI+N ), 1 )
-                        VMAX = ONE
-                        VCRIT = BIGNUM
-                     END IF
-*
-                     WORK( J+N ) = WORK( J+N ) -
-     $                             DDOT( J-KI-1, T( KI+1, J ), 1,
-     $                             WORK( KI+1+N ), 1 )
-*
-                     WORK( J+1+N ) = WORK( J+1+N ) -
-     $                               DDOT( J-KI-1, T( KI+1, J+1 ), 1,
-     $                               WORK( KI+1+N ), 1 )
-*
-*                    Solve
-*                      [T(J,J)-WR   T(J,J+1)     ]'* X = SCALE*( WORK1 )
-*                      [T(J+1,J)    T(J+1,J+1)-WR]             ( WORK2 )
-*
-                     CALL DLALN2( .TRUE., 2, 1, SMIN, ONE, T( J, J ),
-     $                            LDT, ONE, ONE, WORK( J+N ), N, WR,
-     $                            ZERO, X, 2, SCALE, XNORM, IERR )
-*
-*                    Scale if necessary
-*
-                     IF( SCALE.NE.ONE )
-     $                  CALL DSCAL( N-KI+1, SCALE, WORK( KI+N ), 1 )
-                     WORK( J+N ) = X( 1, 1 )
-                     WORK( J+1+N ) = X( 2, 1 )
-*
-                     VMAX = MAX( ABS( WORK( J+N ) ),
-     $                      ABS( WORK( J+1+N ) ), VMAX )
-                     VCRIT = BIGNUM / VMAX
-*
-                  END IF
-  170          CONTINUE
-*
-*              Copy the vector x or Q*x to VL and normalize.
-*
-               IF( .NOT.OVER ) THEN
-                  CALL DCOPY( N-KI+1, WORK( KI+N ), 1, VL( KI, IS ), 1 )
-*
-                  II = IDAMAX( N-KI+1, VL( KI, IS ), 1 ) + KI - 1
-                  REMAX = ONE / ABS( VL( II, IS ) )
-                  CALL DSCAL( N-KI+1, REMAX, VL( KI, IS ), 1 )
-*
-                  DO 180 K = 1, KI - 1
-                     VL( K, IS ) = ZERO
-  180             CONTINUE
-*
-               ELSE
-*
-                  IF( KI.LT.N )
-     $               CALL DGEMV( 'N', N, N-KI, ONE, VL( 1, KI+1 ), LDVL,
-     $                           WORK( KI+1+N ), 1, WORK( KI+N ),
-     $                           VL( 1, KI ), 1 )
-*
-                  II = IDAMAX( N, VL( 1, KI ), 1 )
-                  REMAX = ONE / ABS( VL( II, KI ) )
-                  CALL DSCAL( N, REMAX, VL( 1, KI ), 1 )
-*
-               END IF
-*
-            ELSE
-*
-*              Complex left eigenvector.
-*
-*               Initial solve:
-*                 ((T(KI,KI)    T(KI,KI+1) )' - (WR - I* WI))*X = 0.
-*                 ((T(KI+1,KI) T(KI+1,KI+1))                )
-*
-               IF( ABS( T( KI, KI+1 ) ).GE.ABS( T( KI+1, KI ) ) ) THEN
-                  WORK( KI+N ) = WI / T( KI, KI+1 )
-                  WORK( KI+1+N2 ) = ONE
-               ELSE
-                  WORK( KI+N ) = ONE
-                  WORK( KI+1+N2 ) = -WI / T( KI+1, KI )
-               END IF
-               WORK( KI+1+N ) = ZERO
-               WORK( KI+N2 ) = ZERO
-*
-*              Form right-hand side
-*
-               DO 190 K = KI + 2, N
-                  WORK( K+N ) = -WORK( KI+N )*T( KI, K )
-                  WORK( K+N2 ) = -WORK( KI+1+N2 )*T( KI+1, K )
-  190          CONTINUE
-*
-*              Solve complex quasi-triangular system:
-*              ( T(KI+2,N:KI+2,N) - (WR-i*WI) )*X = WORK1+i*WORK2
-*
-               VMAX = ONE
-               VCRIT = BIGNUM
-*
-               JNXT = KI + 2
-               DO 200 J = KI + 2, N
-                  IF( J.LT.JNXT )
-     $               GO TO 200
-                  J1 = J
-                  J2 = J
-                  JNXT = J + 1
-                  IF( J.LT.N ) THEN
-                     IF( T( J+1, J ).NE.ZERO ) THEN
-                        J2 = J + 1
-                        JNXT = J + 2
-                     END IF
-                  END IF
-*
-                  IF( J1.EQ.J2 ) THEN
-*
-*                    1-by-1 diagonal block
-*
-*                    Scale if necessary to avoid overflow when
-*                    forming the right-hand side elements.
-*
-                     IF( WORK( J ).GT.VCRIT ) THEN
-                        REC = ONE / VMAX
-                        CALL DSCAL( N-KI+1, REC, WORK( KI+N ), 1 )
-                        CALL DSCAL( N-KI+1, REC, WORK( KI+N2 ), 1 )
-                        VMAX = ONE
-                        VCRIT = BIGNUM
-                     END IF
-*
-                     WORK( J+N ) = WORK( J+N ) -
-     $                             DDOT( J-KI-2, T( KI+2, J ), 1,
-     $                             WORK( KI+2+N ), 1 )
-                     WORK( J+N2 ) = WORK( J+N2 ) -
-     $                              DDOT( J-KI-2, T( KI+2, J ), 1,
-     $                              WORK( KI+2+N2 ), 1 )
-*
-*                    Solve (T(J,J)-(WR-i*WI))*(X11+i*X12)= WK+I*WK2
-*
-                     CALL DLALN2( .FALSE., 1, 2, SMIN, ONE, T( J, J ),
-     $                            LDT, ONE, ONE, WORK( J+N ), N, WR,
-     $                            -WI, X, 2, SCALE, XNORM, IERR )
-*
-*                    Scale if necessary
-*
-                     IF( SCALE.NE.ONE ) THEN
-                        CALL DSCAL( N-KI+1, SCALE, WORK( KI+N ), 1 )
-                        CALL DSCAL( N-KI+1, SCALE, WORK( KI+N2 ), 1 )
-                     END IF
-                     WORK( J+N ) = X( 1, 1 )
-                     WORK( J+N2 ) = X( 1, 2 )
-                     VMAX = MAX( ABS( WORK( J+N ) ),
-     $                      ABS( WORK( J+N2 ) ), VMAX )
-                     VCRIT = BIGNUM / VMAX
-*
-                  ELSE
-*
-*                    2-by-2 diagonal block
-*
-*                    Scale if necessary to avoid overflow when forming
-*                    the right-hand side elements.
-*
-                     BETA = MAX( WORK( J ), WORK( J+1 ) )
-                     IF( BETA.GT.VCRIT ) THEN
-                        REC = ONE / VMAX
-                        CALL DSCAL( N-KI+1, REC, WORK( KI+N ), 1 )
-                        CALL DSCAL( N-KI+1, REC, WORK( KI+N2 ), 1 )
-                        VMAX = ONE
-                        VCRIT = BIGNUM
-                     END IF
-*
-                     WORK( J+N ) = WORK( J+N ) -
-     $                             DDOT( J-KI-2, T( KI+2, J ), 1,
-     $                             WORK( KI+2+N ), 1 )
-*
-                     WORK( J+N2 ) = WORK( J+N2 ) -
-     $                              DDOT( J-KI-2, T( KI+2, J ), 1,
-     $                              WORK( KI+2+N2 ), 1 )
-*
-                     WORK( J+1+N ) = WORK( J+1+N ) -
-     $                               DDOT( J-KI-2, T( KI+2, J+1 ), 1,
-     $                               WORK( KI+2+N ), 1 )
-*
-                     WORK( J+1+N2 ) = WORK( J+1+N2 ) -
-     $                                DDOT( J-KI-2, T( KI+2, J+1 ), 1,
-     $                                WORK( KI+2+N2 ), 1 )
-*
-*                    Solve 2-by-2 complex linear equation
-*                      ([T(j,j)   T(j,j+1)  ]'-(wr-i*wi)*I)*X = SCALE*B
-*                      ([T(j+1,j) T(j+1,j+1)]             )
-*
-                     CALL DLALN2( .TRUE., 2, 2, SMIN, ONE, T( J, J ),
-     $                            LDT, ONE, ONE, WORK( J+N ), N, WR,
-     $                            -WI, X, 2, SCALE, XNORM, IERR )
-*
-*                    Scale if necessary
-*
-                     IF( SCALE.NE.ONE ) THEN
-                        CALL DSCAL( N-KI+1, SCALE, WORK( KI+N ), 1 )
-                        CALL DSCAL( N-KI+1, SCALE, WORK( KI+N2 ), 1 )
-                     END IF
-                     WORK( J+N ) = X( 1, 1 )
-                     WORK( J+N2 ) = X( 1, 2 )
-                     WORK( J+1+N ) = X( 2, 1 )
-                     WORK( J+1+N2 ) = X( 2, 2 )
-                     VMAX = MAX( ABS( X( 1, 1 ) ), ABS( X( 1, 2 ) ),
-     $                      ABS( X( 2, 1 ) ), ABS( X( 2, 2 ) ), VMAX )
-                     VCRIT = BIGNUM / VMAX
-*
-                  END IF
-  200          CONTINUE
-*
-*              Copy the vector x or Q*x to VL and normalize.
-*
-               IF( .NOT.OVER ) THEN
-                  CALL DCOPY( N-KI+1, WORK( KI+N ), 1, VL( KI, IS ), 1 )
-                  CALL DCOPY( N-KI+1, WORK( KI+N2 ), 1, VL( KI, IS+1 ),
-     $                        1 )
-*
-                  EMAX = ZERO
-                  DO 220 K = KI, N
-                     EMAX = MAX( EMAX, ABS( VL( K, IS ) )+
-     $                      ABS( VL( K, IS+1 ) ) )
-  220             CONTINUE
-                  REMAX = ONE / EMAX
-                  CALL DSCAL( N-KI+1, REMAX, VL( KI, IS ), 1 )
-                  CALL DSCAL( N-KI+1, REMAX, VL( KI, IS+1 ), 1 )
-*
-                  DO 230 K = 1, KI - 1
-                     VL( K, IS ) = ZERO
-                     VL( K, IS+1 ) = ZERO
-  230             CONTINUE
-               ELSE
-                  IF( KI.LT.N-1 ) THEN
-                     CALL DGEMV( 'N', N, N-KI-1, ONE, VL( 1, KI+2 ),
-     $                           LDVL, WORK( KI+2+N ), 1, WORK( KI+N ),
-     $                           VL( 1, KI ), 1 )
-                     CALL DGEMV( 'N', N, N-KI-1, ONE, VL( 1, KI+2 ),
-     $                           LDVL, WORK( KI+2+N2 ), 1,
-     $                           WORK( KI+1+N2 ), VL( 1, KI+1 ), 1 )
-                  ELSE
-                     CALL DSCAL( N, WORK( KI+N ), VL( 1, KI ), 1 )
-                     CALL DSCAL( N, WORK( KI+1+N2 ), VL( 1, KI+1 ), 1 )
-                  END IF
-*
-                  EMAX = ZERO
-                  DO 240 K = 1, N
-                     EMAX = MAX( EMAX, ABS( VL( K, KI ) )+
-     $                      ABS( VL( K, KI+1 ) ) )
-  240             CONTINUE
-                  REMAX = ONE / EMAX
-                  CALL DSCAL( N, REMAX, VL( 1, KI ), 1 )
-                  CALL DSCAL( N, REMAX, VL( 1, KI+1 ), 1 )
-*
-               END IF
-*
-            END IF
-*
-            IS = IS + 1
-            IF( IP.NE.0 )
-     $         IS = IS + 1
-  250       CONTINUE
-            IF( IP.EQ.-1 )
-     $         IP = 0
-            IF( IP.EQ.1 )
-     $         IP = -1
-*
-  260    CONTINUE
-*
-      END IF
-*
-      RETURN
-*
-*     End of DTREVC
-*
-      END
--- a/libcruft/lapack/dtrexc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,345 +0,0 @@
-      SUBROUTINE DTREXC( COMPQ, N, T, LDT, Q, LDQ, IFST, ILST, WORK,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPQ
-      INTEGER            IFST, ILST, INFO, LDQ, LDT, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   Q( LDQ, * ), T( LDT, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DTREXC reorders the real Schur factorization of a real matrix
-*  A = Q*T*Q**T, so that the diagonal block of T with row index IFST is
-*  moved to row ILST.
-*
-*  The real Schur form T is reordered by an orthogonal similarity
-*  transformation Z**T*T*Z, and optionally the matrix Q of Schur vectors
-*  is updated by postmultiplying it with Z.
-*
-*  T must be in Schur canonical form (as returned by DHSEQR), that is,
-*  block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; each
-*  2-by-2 diagonal block has its diagonal elements equal and its
-*  off-diagonal elements of opposite sign.
-*
-*  Arguments
-*  =========
-*
-*  COMPQ   (input) CHARACTER*1
-*          = 'V':  update the matrix Q of Schur vectors;
-*          = 'N':  do not update Q.
-*
-*  N       (input) INTEGER
-*          The order of the matrix T. N >= 0.
-*
-*  T       (input/output) DOUBLE PRECISION array, dimension (LDT,N)
-*          On entry, the upper quasi-triangular matrix T, in Schur
-*          Schur canonical form.
-*          On exit, the reordered upper quasi-triangular matrix, again
-*          in Schur canonical form.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= max(1,N).
-*
-*  Q       (input/output) DOUBLE PRECISION array, dimension (LDQ,N)
-*          On entry, if COMPQ = 'V', the matrix Q of Schur vectors.
-*          On exit, if COMPQ = 'V', Q has been postmultiplied by the
-*          orthogonal transformation matrix Z which reorders T.
-*          If COMPQ = 'N', Q is not referenced.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.  LDQ >= max(1,N).
-*
-*  IFST    (input/output) INTEGER
-*  ILST    (input/output) INTEGER
-*          Specify the reordering of the diagonal blocks of T.
-*          The block with row index IFST is moved to row ILST, by a
-*          sequence of transpositions between adjacent blocks.
-*          On exit, if IFST pointed on entry to the second row of a
-*          2-by-2 block, it is changed to point to the first row; ILST
-*          always points to the first row of the block in its final
-*          position (which may differ from its input value by +1 or -1).
-*          1 <= IFST <= N; 1 <= ILST <= N.
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          = 1:  two adjacent blocks were too close to swap (the problem
-*                is very ill-conditioned); T may have been partially
-*                reordered, and ILST points to the first row of the
-*                current position of the block being moved.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            WANTQ
-      INTEGER            HERE, NBF, NBL, NBNEXT
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLAEXC, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and test the input arguments.
-*
-      INFO = 0
-      WANTQ = LSAME( COMPQ, 'V' )
-      IF( .NOT.WANTQ .AND. .NOT.LSAME( COMPQ, 'N' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDT.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LDQ.LT.1 .OR. ( WANTQ .AND. LDQ.LT.MAX( 1, N ) ) ) THEN
-         INFO = -6
-      ELSE IF( IFST.LT.1 .OR. IFST.GT.N ) THEN
-         INFO = -7
-      ELSE IF( ILST.LT.1 .OR. ILST.GT.N ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DTREXC', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 )
-     $   RETURN
-*
-*     Determine the first row of specified block
-*     and find out it is 1 by 1 or 2 by 2.
-*
-      IF( IFST.GT.1 ) THEN
-         IF( T( IFST, IFST-1 ).NE.ZERO )
-     $      IFST = IFST - 1
-      END IF
-      NBF = 1
-      IF( IFST.LT.N ) THEN
-         IF( T( IFST+1, IFST ).NE.ZERO )
-     $      NBF = 2
-      END IF
-*
-*     Determine the first row of the final block
-*     and find out it is 1 by 1 or 2 by 2.
-*
-      IF( ILST.GT.1 ) THEN
-         IF( T( ILST, ILST-1 ).NE.ZERO )
-     $      ILST = ILST - 1
-      END IF
-      NBL = 1
-      IF( ILST.LT.N ) THEN
-         IF( T( ILST+1, ILST ).NE.ZERO )
-     $      NBL = 2
-      END IF
-*
-      IF( IFST.EQ.ILST )
-     $   RETURN
-*
-      IF( IFST.LT.ILST ) THEN
-*
-*        Update ILST
-*
-         IF( NBF.EQ.2 .AND. NBL.EQ.1 )
-     $      ILST = ILST - 1
-         IF( NBF.EQ.1 .AND. NBL.EQ.2 )
-     $      ILST = ILST + 1
-*
-         HERE = IFST
-*
-   10    CONTINUE
-*
-*        Swap block with next one below
-*
-         IF( NBF.EQ.1 .OR. NBF.EQ.2 ) THEN
-*
-*           Current block either 1 by 1 or 2 by 2
-*
-            NBNEXT = 1
-            IF( HERE+NBF+1.LE.N ) THEN
-               IF( T( HERE+NBF+1, HERE+NBF ).NE.ZERO )
-     $            NBNEXT = 2
-            END IF
-            CALL DLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE, NBF, NBNEXT,
-     $                   WORK, INFO )
-            IF( INFO.NE.0 ) THEN
-               ILST = HERE
-               RETURN
-            END IF
-            HERE = HERE + NBNEXT
-*
-*           Test if 2 by 2 block breaks into two 1 by 1 blocks
-*
-            IF( NBF.EQ.2 ) THEN
-               IF( T( HERE+1, HERE ).EQ.ZERO )
-     $            NBF = 3
-            END IF
-*
-         ELSE
-*
-*           Current block consists of two 1 by 1 blocks each of which
-*           must be swapped individually
-*
-            NBNEXT = 1
-            IF( HERE+3.LE.N ) THEN
-               IF( T( HERE+3, HERE+2 ).NE.ZERO )
-     $            NBNEXT = 2
-            END IF
-            CALL DLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE+1, 1, NBNEXT,
-     $                   WORK, INFO )
-            IF( INFO.NE.0 ) THEN
-               ILST = HERE
-               RETURN
-            END IF
-            IF( NBNEXT.EQ.1 ) THEN
-*
-*              Swap two 1 by 1 blocks, no problems possible
-*
-               CALL DLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE, 1, NBNEXT,
-     $                      WORK, INFO )
-               HERE = HERE + 1
-            ELSE
-*
-*              Recompute NBNEXT in case 2 by 2 split
-*
-               IF( T( HERE+2, HERE+1 ).EQ.ZERO )
-     $            NBNEXT = 1
-               IF( NBNEXT.EQ.2 ) THEN
-*
-*                 2 by 2 Block did not split
-*
-                  CALL DLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE, 1,
-     $                         NBNEXT, WORK, INFO )
-                  IF( INFO.NE.0 ) THEN
-                     ILST = HERE
-                     RETURN
-                  END IF
-                  HERE = HERE + 2
-               ELSE
-*
-*                 2 by 2 Block did split
-*
-                  CALL DLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE, 1, 1,
-     $                         WORK, INFO )
-                  CALL DLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE+1, 1, 1,
-     $                         WORK, INFO )
-                  HERE = HERE + 2
-               END IF
-            END IF
-         END IF
-         IF( HERE.LT.ILST )
-     $      GO TO 10
-*
-      ELSE
-*
-         HERE = IFST
-   20    CONTINUE
-*
-*        Swap block with next one above
-*
-         IF( NBF.EQ.1 .OR. NBF.EQ.2 ) THEN
-*
-*           Current block either 1 by 1 or 2 by 2
-*
-            NBNEXT = 1
-            IF( HERE.GE.3 ) THEN
-               IF( T( HERE-1, HERE-2 ).NE.ZERO )
-     $            NBNEXT = 2
-            END IF
-            CALL DLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE-NBNEXT, NBNEXT,
-     $                   NBF, WORK, INFO )
-            IF( INFO.NE.0 ) THEN
-               ILST = HERE
-               RETURN
-            END IF
-            HERE = HERE - NBNEXT
-*
-*           Test if 2 by 2 block breaks into two 1 by 1 blocks
-*
-            IF( NBF.EQ.2 ) THEN
-               IF( T( HERE+1, HERE ).EQ.ZERO )
-     $            NBF = 3
-            END IF
-*
-         ELSE
-*
-*           Current block consists of two 1 by 1 blocks each of which
-*           must be swapped individually
-*
-            NBNEXT = 1
-            IF( HERE.GE.3 ) THEN
-               IF( T( HERE-1, HERE-2 ).NE.ZERO )
-     $            NBNEXT = 2
-            END IF
-            CALL DLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE-NBNEXT, NBNEXT,
-     $                   1, WORK, INFO )
-            IF( INFO.NE.0 ) THEN
-               ILST = HERE
-               RETURN
-            END IF
-            IF( NBNEXT.EQ.1 ) THEN
-*
-*              Swap two 1 by 1 blocks, no problems possible
-*
-               CALL DLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE, NBNEXT, 1,
-     $                      WORK, INFO )
-               HERE = HERE - 1
-            ELSE
-*
-*              Recompute NBNEXT in case 2 by 2 split
-*
-               IF( T( HERE, HERE-1 ).EQ.ZERO )
-     $            NBNEXT = 1
-               IF( NBNEXT.EQ.2 ) THEN
-*
-*                 2 by 2 Block did not split
-*
-                  CALL DLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE-1, 2, 1,
-     $                         WORK, INFO )
-                  IF( INFO.NE.0 ) THEN
-                     ILST = HERE
-                     RETURN
-                  END IF
-                  HERE = HERE - 2
-               ELSE
-*
-*                 2 by 2 Block did split
-*
-                  CALL DLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE, 1, 1,
-     $                         WORK, INFO )
-                  CALL DLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE-1, 1, 1,
-     $                         WORK, INFO )
-                  HERE = HERE - 2
-               END IF
-            END IF
-         END IF
-         IF( HERE.GT.ILST )
-     $      GO TO 20
-      END IF
-      ILST = HERE
-*
-      RETURN
-*
-*     End of DTREXC
-*
-      END
--- a/libcruft/lapack/dtrsen.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,459 +0,0 @@
-      SUBROUTINE DTRSEN( JOB, COMPQ, SELECT, N, T, LDT, Q, LDQ, WR, WI,
-     $                   M, S, SEP, WORK, LWORK, IWORK, LIWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPQ, JOB
-      INTEGER            INFO, LDQ, LDT, LIWORK, LWORK, M, N
-      DOUBLE PRECISION   S, SEP
-*     ..
-*     .. Array Arguments ..
-      LOGICAL            SELECT( * )
-      INTEGER            IWORK( * )
-      DOUBLE PRECISION   Q( LDQ, * ), T( LDT, * ), WI( * ), WORK( * ),
-     $                   WR( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DTRSEN reorders the real Schur factorization of a real matrix
-*  A = Q*T*Q**T, so that a selected cluster of eigenvalues appears in
-*  the leading diagonal blocks of the upper quasi-triangular matrix T,
-*  and the leading columns of Q form an orthonormal basis of the
-*  corresponding right invariant subspace.
-*
-*  Optionally the routine computes the reciprocal condition numbers of
-*  the cluster of eigenvalues and/or the invariant subspace.
-*
-*  T must be in Schur canonical form (as returned by DHSEQR), that is,
-*  block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; each
-*  2-by-2 diagonal block has its diagonal elemnts equal and its
-*  off-diagonal elements of opposite sign.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies whether condition numbers are required for the
-*          cluster of eigenvalues (S) or the invariant subspace (SEP):
-*          = 'N': none;
-*          = 'E': for eigenvalues only (S);
-*          = 'V': for invariant subspace only (SEP);
-*          = 'B': for both eigenvalues and invariant subspace (S and
-*                 SEP).
-*
-*  COMPQ   (input) CHARACTER*1
-*          = 'V': update the matrix Q of Schur vectors;
-*          = 'N': do not update Q.
-*
-*  SELECT  (input) LOGICAL array, dimension (N)
-*          SELECT specifies the eigenvalues in the selected cluster. To
-*          select a real eigenvalue w(j), SELECT(j) must be set to
-*          .TRUE.. To select a complex conjugate pair of eigenvalues
-*          w(j) and w(j+1), corresponding to a 2-by-2 diagonal block,
-*          either SELECT(j) or SELECT(j+1) or both must be set to
-*          .TRUE.; a complex conjugate pair of eigenvalues must be
-*          either both included in the cluster or both excluded.
-*
-*  N       (input) INTEGER
-*          The order of the matrix T. N >= 0.
-*
-*  T       (input/output) DOUBLE PRECISION array, dimension (LDT,N)
-*          On entry, the upper quasi-triangular matrix T, in Schur
-*          canonical form.
-*          On exit, T is overwritten by the reordered matrix T, again in
-*          Schur canonical form, with the selected eigenvalues in the
-*          leading diagonal blocks.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= max(1,N).
-*
-*  Q       (input/output) DOUBLE PRECISION array, dimension (LDQ,N)
-*          On entry, if COMPQ = 'V', the matrix Q of Schur vectors.
-*          On exit, if COMPQ = 'V', Q has been postmultiplied by the
-*          orthogonal transformation matrix which reorders T; the
-*          leading M columns of Q form an orthonormal basis for the
-*          specified invariant subspace.
-*          If COMPQ = 'N', Q is not referenced.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.
-*          LDQ >= 1; and if COMPQ = 'V', LDQ >= N.
-*
-*  WR      (output) DOUBLE PRECISION array, dimension (N)
-*  WI      (output) DOUBLE PRECISION array, dimension (N)
-*          The real and imaginary parts, respectively, of the reordered
-*          eigenvalues of T. The eigenvalues are stored in the same
-*          order as on the diagonal of T, with WR(i) = T(i,i) and, if
-*          T(i:i+1,i:i+1) is a 2-by-2 diagonal block, WI(i) > 0 and
-*          WI(i+1) = -WI(i). Note that if a complex eigenvalue is
-*          sufficiently ill-conditioned, then its value may differ
-*          significantly from its value before reordering.
-*
-*  M       (output) INTEGER
-*          The dimension of the specified invariant subspace.
-*          0 < = M <= N.
-*
-*  S       (output) DOUBLE PRECISION
-*          If JOB = 'E' or 'B', S is a lower bound on the reciprocal
-*          condition number for the selected cluster of eigenvalues.
-*          S cannot underestimate the true reciprocal condition number
-*          by more than a factor of sqrt(N). If M = 0 or N, S = 1.
-*          If JOB = 'N' or 'V', S is not referenced.
-*
-*  SEP     (output) DOUBLE PRECISION
-*          If JOB = 'V' or 'B', SEP is the estimated reciprocal
-*          condition number of the specified invariant subspace. If
-*          M = 0 or N, SEP = norm(T).
-*          If JOB = 'N' or 'E', SEP is not referenced.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If JOB = 'N', LWORK >= max(1,N);
-*          if JOB = 'E', LWORK >= max(1,M*(N-M));
-*          if JOB = 'V' or 'B', LWORK >= max(1,2*M*(N-M)).
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  IWORK   (workspace) INTEGER array, dimension (MAX(1,LIWORK))
-*          On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK.
-*
-*  LIWORK  (input) INTEGER
-*          The dimension of the array IWORK.
-*          If JOB = 'N' or 'E', LIWORK >= 1;
-*          if JOB = 'V' or 'B', LIWORK >= max(1,M*(N-M)).
-*
-*          If LIWORK = -1, then a workspace query is assumed; the
-*          routine only calculates the optimal size of the IWORK array,
-*          returns this value as the first entry of the IWORK array, and
-*          no error message related to LIWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          = 1: reordering of T failed because some eigenvalues are too
-*               close to separate (the problem is very ill-conditioned);
-*               T may have been partially reordered, and WR and WI
-*               contain the eigenvalues in the same order as in T; S and
-*               SEP (if requested) are set to zero.
-*
-*  Further Details
-*  ===============
-*
-*  DTRSEN first collects the selected eigenvalues by computing an
-*  orthogonal transformation Z to move them to the top left corner of T.
-*  In other words, the selected eigenvalues are the eigenvalues of T11
-*  in:
-*
-*                Z'*T*Z = ( T11 T12 ) n1
-*                         (  0  T22 ) n2
-*                            n1  n2
-*
-*  where N = n1+n2 and Z' means the transpose of Z. The first n1 columns
-*  of Z span the specified invariant subspace of T.
-*
-*  If T has been obtained from the real Schur factorization of a matrix
-*  A = Q*T*Q', then the reordered real Schur factorization of A is given
-*  by A = (Q*Z)*(Z'*T*Z)*(Q*Z)', and the first n1 columns of Q*Z span
-*  the corresponding invariant subspace of A.
-*
-*  The reciprocal condition number of the average of the eigenvalues of
-*  T11 may be returned in S. S lies between 0 (very badly conditioned)
-*  and 1 (very well conditioned). It is computed as follows. First we
-*  compute R so that
-*
-*                         P = ( I  R ) n1
-*                             ( 0  0 ) n2
-*                               n1 n2
-*
-*  is the projector on the invariant subspace associated with T11.
-*  R is the solution of the Sylvester equation:
-*
-*                        T11*R - R*T22 = T12.
-*
-*  Let F-norm(M) denote the Frobenius-norm of M and 2-norm(M) denote
-*  the two-norm of M. Then S is computed as the lower bound
-*
-*                      (1 + F-norm(R)**2)**(-1/2)
-*
-*  on the reciprocal of 2-norm(P), the true reciprocal condition number.
-*  S cannot underestimate 1 / 2-norm(P) by more than a factor of
-*  sqrt(N).
-*
-*  An approximate error bound for the computed average of the
-*  eigenvalues of T11 is
-*
-*                         EPS * norm(T) / S
-*
-*  where EPS is the machine precision.
-*
-*  The reciprocal condition number of the right invariant subspace
-*  spanned by the first n1 columns of Z (or of Q*Z) is returned in SEP.
-*  SEP is defined as the separation of T11 and T22:
-*
-*                     sep( T11, T22 ) = sigma-min( C )
-*
-*  where sigma-min(C) is the smallest singular value of the
-*  n1*n2-by-n1*n2 matrix
-*
-*     C  = kprod( I(n2), T11 ) - kprod( transpose(T22), I(n1) )
-*
-*  I(m) is an m by m identity matrix, and kprod denotes the Kronecker
-*  product. We estimate sigma-min(C) by the reciprocal of an estimate of
-*  the 1-norm of inverse(C). The true reciprocal 1-norm of inverse(C)
-*  cannot differ from sigma-min(C) by more than a factor of sqrt(n1*n2).
-*
-*  When SEP is small, small changes in T can cause large changes in
-*  the invariant subspace. An approximate bound on the maximum angular
-*  error in the computed right invariant subspace is
-*
-*                      EPS * norm(T) / SEP
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, PAIR, SWAP, WANTBH, WANTQ, WANTS,
-     $                   WANTSP
-      INTEGER            IERR, K, KASE, KK, KS, LIWMIN, LWMIN, N1, N2,
-     $                   NN
-      DOUBLE PRECISION   EST, RNORM, SCALE
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   DLANGE
-      EXTERNAL           LSAME, DLANGE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLACN2, DLACPY, DTREXC, DTRSYL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and test the input parameters
-*
-      WANTBH = LSAME( JOB, 'B' )
-      WANTS = LSAME( JOB, 'E' ) .OR. WANTBH
-      WANTSP = LSAME( JOB, 'V' ) .OR. WANTBH
-      WANTQ = LSAME( COMPQ, 'V' )
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.WANTS .AND. .NOT.WANTSP )
-     $     THEN
-         INFO = -1
-      ELSE IF( .NOT.LSAME( COMPQ, 'N' ) .AND. .NOT.WANTQ ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDT.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      ELSE IF( LDQ.LT.1 .OR. ( WANTQ .AND. LDQ.LT.N ) ) THEN
-         INFO = -8
-      ELSE
-*
-*        Set M to the dimension of the specified invariant subspace,
-*        and test LWORK and LIWORK.
-*
-         M = 0
-         PAIR = .FALSE.
-         DO 10 K = 1, N
-            IF( PAIR ) THEN
-               PAIR = .FALSE.
-            ELSE
-               IF( K.LT.N ) THEN
-                  IF( T( K+1, K ).EQ.ZERO ) THEN
-                     IF( SELECT( K ) )
-     $                  M = M + 1
-                  ELSE
-                     PAIR = .TRUE.
-                     IF( SELECT( K ) .OR. SELECT( K+1 ) )
-     $                  M = M + 2
-                  END IF
-               ELSE
-                  IF( SELECT( N ) )
-     $               M = M + 1
-               END IF
-            END IF
-   10    CONTINUE
-*
-         N1 = M
-         N2 = N - M
-         NN = N1*N2
-*
-         IF( WANTSP ) THEN
-            LWMIN = MAX( 1, 2*NN )
-            LIWMIN = MAX( 1, NN )
-         ELSE IF( LSAME( JOB, 'N' ) ) THEN
-            LWMIN = MAX( 1, N )
-            LIWMIN = 1
-         ELSE IF( LSAME( JOB, 'E' ) ) THEN
-            LWMIN = MAX( 1, NN )
-            LIWMIN = 1
-         END IF
-*
-         IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
-            INFO = -15
-         ELSE IF( LIWORK.LT.LIWMIN .AND. .NOT.LQUERY ) THEN
-            INFO = -17
-         END IF
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         WORK( 1 ) = LWMIN
-         IWORK( 1 ) = LIWMIN
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DTRSEN', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( M.EQ.N .OR. M.EQ.0 ) THEN
-         IF( WANTS )
-     $      S = ONE
-         IF( WANTSP )
-     $      SEP = DLANGE( '1', N, N, T, LDT, WORK )
-         GO TO 40
-      END IF
-*
-*     Collect the selected blocks at the top-left corner of T.
-*
-      KS = 0
-      PAIR = .FALSE.
-      DO 20 K = 1, N
-         IF( PAIR ) THEN
-            PAIR = .FALSE.
-         ELSE
-            SWAP = SELECT( K )
-            IF( K.LT.N ) THEN
-               IF( T( K+1, K ).NE.ZERO ) THEN
-                  PAIR = .TRUE.
-                  SWAP = SWAP .OR. SELECT( K+1 )
-               END IF
-            END IF
-            IF( SWAP ) THEN
-               KS = KS + 1
-*
-*              Swap the K-th block to position KS.
-*
-               IERR = 0
-               KK = K
-               IF( K.NE.KS )
-     $            CALL DTREXC( COMPQ, N, T, LDT, Q, LDQ, KK, KS, WORK,
-     $                         IERR )
-               IF( IERR.EQ.1 .OR. IERR.EQ.2 ) THEN
-*
-*                 Blocks too close to swap: exit.
-*
-                  INFO = 1
-                  IF( WANTS )
-     $               S = ZERO
-                  IF( WANTSP )
-     $               SEP = ZERO
-                  GO TO 40
-               END IF
-               IF( PAIR )
-     $            KS = KS + 1
-            END IF
-         END IF
-   20 CONTINUE
-*
-      IF( WANTS ) THEN
-*
-*        Solve Sylvester equation for R:
-*
-*           T11*R - R*T22 = scale*T12
-*
-         CALL DLACPY( 'F', N1, N2, T( 1, N1+1 ), LDT, WORK, N1 )
-         CALL DTRSYL( 'N', 'N', -1, N1, N2, T, LDT, T( N1+1, N1+1 ),
-     $                LDT, WORK, N1, SCALE, IERR )
-*
-*        Estimate the reciprocal of the condition number of the cluster
-*        of eigenvalues.
-*
-         RNORM = DLANGE( 'F', N1, N2, WORK, N1, WORK )
-         IF( RNORM.EQ.ZERO ) THEN
-            S = ONE
-         ELSE
-            S = SCALE / ( SQRT( SCALE*SCALE / RNORM+RNORM )*
-     $          SQRT( RNORM ) )
-         END IF
-      END IF
-*
-      IF( WANTSP ) THEN
-*
-*        Estimate sep(T11,T22).
-*
-         EST = ZERO
-         KASE = 0
-   30    CONTINUE
-         CALL DLACN2( NN, WORK( NN+1 ), WORK, IWORK, EST, KASE, ISAVE )
-         IF( KASE.NE.0 ) THEN
-            IF( KASE.EQ.1 ) THEN
-*
-*              Solve  T11*R - R*T22 = scale*X.
-*
-               CALL DTRSYL( 'N', 'N', -1, N1, N2, T, LDT,
-     $                      T( N1+1, N1+1 ), LDT, WORK, N1, SCALE,
-     $                      IERR )
-            ELSE
-*
-*              Solve  T11'*R - R*T22' = scale*X.
-*
-               CALL DTRSYL( 'T', 'T', -1, N1, N2, T, LDT,
-     $                      T( N1+1, N1+1 ), LDT, WORK, N1, SCALE,
-     $                      IERR )
-            END IF
-            GO TO 30
-         END IF
-*
-         SEP = SCALE / EST
-      END IF
-*
-   40 CONTINUE
-*
-*     Store the output eigenvalues in WR and WI.
-*
-      DO 50 K = 1, N
-         WR( K ) = T( K, K )
-         WI( K ) = ZERO
-   50 CONTINUE
-      DO 60 K = 1, N - 1
-         IF( T( K+1, K ).NE.ZERO ) THEN
-            WI( K ) = SQRT( ABS( T( K, K+1 ) ) )*
-     $                SQRT( ABS( T( K+1, K ) ) )
-            WI( K+1 ) = -WI( K )
-         END IF
-   60 CONTINUE
-*
-      WORK( 1 ) = LWMIN
-      IWORK( 1 ) = LIWMIN
-*
-      RETURN
-*
-*     End of DTRSEN
-*
-      END
--- a/libcruft/lapack/dtrsyl.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,913 +0,0 @@
-      SUBROUTINE DTRSYL( TRANA, TRANB, ISGN, M, N, A, LDA, B, LDB, C,
-     $                   LDC, SCALE, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TRANA, TRANB
-      INTEGER            INFO, ISGN, LDA, LDB, LDC, M, N
-      DOUBLE PRECISION   SCALE
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), C( LDC, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DTRSYL solves the real Sylvester matrix equation:
-*
-*     op(A)*X + X*op(B) = scale*C or
-*     op(A)*X - X*op(B) = scale*C,
-*
-*  where op(A) = A or A**T, and  A and B are both upper quasi-
-*  triangular. A is M-by-M and B is N-by-N; the right hand side C and
-*  the solution X are M-by-N; and scale is an output scale factor, set
-*  <= 1 to avoid overflow in X.
-*
-*  A and B must be in Schur canonical form (as returned by DHSEQR), that
-*  is, block upper triangular with 1-by-1 and 2-by-2 diagonal blocks;
-*  each 2-by-2 diagonal block has its diagonal elements equal and its
-*  off-diagonal elements of opposite sign.
-*
-*  Arguments
-*  =========
-*
-*  TRANA   (input) CHARACTER*1
-*          Specifies the option op(A):
-*          = 'N': op(A) = A    (No transpose)
-*          = 'T': op(A) = A**T (Transpose)
-*          = 'C': op(A) = A**H (Conjugate transpose = Transpose)
-*
-*  TRANB   (input) CHARACTER*1
-*          Specifies the option op(B):
-*          = 'N': op(B) = B    (No transpose)
-*          = 'T': op(B) = B**T (Transpose)
-*          = 'C': op(B) = B**H (Conjugate transpose = Transpose)
-*
-*  ISGN    (input) INTEGER
-*          Specifies the sign in the equation:
-*          = +1: solve op(A)*X + X*op(B) = scale*C
-*          = -1: solve op(A)*X - X*op(B) = scale*C
-*
-*  M       (input) INTEGER
-*          The order of the matrix A, and the number of rows in the
-*          matrices X and C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The order of the matrix B, and the number of columns in the
-*          matrices X and C. N >= 0.
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA,M)
-*          The upper quasi-triangular matrix A, in Schur canonical form.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  B       (input) DOUBLE PRECISION array, dimension (LDB,N)
-*          The upper quasi-triangular matrix B, in Schur canonical form.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B. LDB >= max(1,N).
-*
-*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
-*          On entry, the M-by-N right hand side matrix C.
-*          On exit, C is overwritten by the solution matrix X.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M)
-*
-*  SCALE   (output) DOUBLE PRECISION
-*          The scale factor, scale, set <= 1 to avoid overflow in X.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          = 1: A and B have common or very close eigenvalues; perturbed
-*               values were used to solve the equation (but the matrices
-*               A and B are unchanged).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOTRNA, NOTRNB
-      INTEGER            IERR, J, K, K1, K2, KNEXT, L, L1, L2, LNEXT
-      DOUBLE PRECISION   A11, BIGNUM, DA11, DB, EPS, SCALOC, SGN, SMIN,
-     $                   SMLNUM, SUML, SUMR, XNORM
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   DUM( 1 ), VEC( 2, 2 ), X( 2, 2 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   DDOT, DLAMCH, DLANGE
-      EXTERNAL           LSAME, DDOT, DLAMCH, DLANGE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLABAD, DLALN2, DLASY2, DSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and Test input parameters
-*
-      NOTRNA = LSAME( TRANA, 'N' )
-      NOTRNB = LSAME( TRANB, 'N' )
-*
-      INFO = 0
-      IF( .NOT.NOTRNA .AND. .NOT.LSAME( TRANA, 'T' ) .AND. .NOT.
-     $    LSAME( TRANA, 'C' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRNB .AND. .NOT.LSAME( TRANB, 'T' ) .AND. .NOT.
-     $         LSAME( TRANB, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( ISGN.NE.1 .AND. ISGN.NE.-1 ) THEN
-         INFO = -3
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -7
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -9
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -11
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DTRSYL', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Set constants to control overflow
-*
-      EPS = DLAMCH( 'P' )
-      SMLNUM = DLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SMLNUM*DBLE( M*N ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-      SMIN = MAX( SMLNUM, EPS*DLANGE( 'M', M, M, A, LDA, DUM ),
-     $       EPS*DLANGE( 'M', N, N, B, LDB, DUM ) )
-*
-      SCALE = ONE
-      SGN = ISGN
-*
-      IF( NOTRNA .AND. NOTRNB ) THEN
-*
-*        Solve    A*X + ISGN*X*B = scale*C.
-*
-*        The (K,L)th block of X is determined starting from
-*        bottom-left corner column by column by
-*
-*         A(K,K)*X(K,L) + ISGN*X(K,L)*B(L,L) = C(K,L) - R(K,L)
-*
-*        Where
-*                  M                         L-1
-*        R(K,L) = SUM [A(K,I)*X(I,L)] + ISGN*SUM [X(K,J)*B(J,L)].
-*                I=K+1                       J=1
-*
-*        Start column loop (index = L)
-*        L1 (L2) : column index of the first (first) row of X(K,L).
-*
-         LNEXT = 1
-         DO 60 L = 1, N
-            IF( L.LT.LNEXT )
-     $         GO TO 60
-            IF( L.EQ.N ) THEN
-               L1 = L
-               L2 = L
-            ELSE
-               IF( B( L+1, L ).NE.ZERO ) THEN
-                  L1 = L
-                  L2 = L + 1
-                  LNEXT = L + 2
-               ELSE
-                  L1 = L
-                  L2 = L
-                  LNEXT = L + 1
-               END IF
-            END IF
-*
-*           Start row loop (index = K)
-*           K1 (K2): row index of the first (last) row of X(K,L).
-*
-            KNEXT = M
-            DO 50 K = M, 1, -1
-               IF( K.GT.KNEXT )
-     $            GO TO 50
-               IF( K.EQ.1 ) THEN
-                  K1 = K
-                  K2 = K
-               ELSE
-                  IF( A( K, K-1 ).NE.ZERO ) THEN
-                     K1 = K - 1
-                     K2 = K
-                     KNEXT = K - 2
-                  ELSE
-                     K1 = K
-                     K2 = K
-                     KNEXT = K - 1
-                  END IF
-               END IF
-*
-               IF( L1.EQ.L2 .AND. K1.EQ.K2 ) THEN
-                  SUML = DDOT( M-K1, A( K1, MIN( K1+1, M ) ), LDA,
-     $                   C( MIN( K1+1, M ), L1 ), 1 )
-                  SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-                  SCALOC = ONE
-*
-                  A11 = A( K1, K1 ) + SGN*B( L1, L1 )
-                  DA11 = ABS( A11 )
-                  IF( DA11.LE.SMIN ) THEN
-                     A11 = SMIN
-                     DA11 = SMIN
-                     INFO = 1
-                  END IF
-                  DB = ABS( VEC( 1, 1 ) )
-                  IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
-                     IF( DB.GT.BIGNUM*DA11 )
-     $                  SCALOC = ONE / DB
-                  END IF
-                  X( 1, 1 ) = ( VEC( 1, 1 )*SCALOC ) / A11
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 10 J = 1, N
-                        CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
-   10                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-*
-               ELSE IF( L1.EQ.L2 .AND. K1.NE.K2 ) THEN
-*
-                  SUML = DDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
-     $                   C( MIN( K2+1, M ), L1 ), 1 )
-                  SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = DDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
-     $                   C( MIN( K2+1, M ), L1 ), 1 )
-                  SUMR = DDOT( L1-1, C( K2, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
-*
-                  CALL DLALN2( .FALSE., 2, 1, SMIN, ONE, A( K1, K1 ),
-     $                         LDA, ONE, ONE, VEC, 2, -SGN*B( L1, L1 ),
-     $                         ZERO, X, 2, SCALOC, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 20 J = 1, N
-                        CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
-   20                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K2, L1 ) = X( 2, 1 )
-*
-               ELSE IF( L1.NE.L2 .AND. K1.EQ.K2 ) THEN
-*
-                  SUML = DDOT( M-K1, A( K1, MIN( K1+1, M ) ), LDA,
-     $                   C( MIN( K1+1, M ), L1 ), 1 )
-                  SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 1, 1 ) = SGN*( C( K1, L1 )-( SUML+SGN*SUMR ) )
-*
-                  SUML = DDOT( M-K1, A( K1, MIN( K1+1, M ) ), LDA,
-     $                   C( MIN( K1+1, M ), L2 ), 1 )
-                  SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L2 ), 1 )
-                  VEC( 2, 1 ) = SGN*( C( K1, L2 )-( SUML+SGN*SUMR ) )
-*
-                  CALL DLALN2( .TRUE., 2, 1, SMIN, ONE, B( L1, L1 ),
-     $                         LDB, ONE, ONE, VEC, 2, -SGN*A( K1, K1 ),
-     $                         ZERO, X, 2, SCALOC, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 30 J = 1, N
-                        CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
-   30                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K1, L2 ) = X( 2, 1 )
-*
-               ELSE IF( L1.NE.L2 .AND. K1.NE.K2 ) THEN
-*
-                  SUML = DDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
-     $                   C( MIN( K2+1, M ), L1 ), 1 )
-                  SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = DDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
-     $                   C( MIN( K2+1, M ), L2 ), 1 )
-                  SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L2 ), 1 )
-                  VEC( 1, 2 ) = C( K1, L2 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = DDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
-     $                   C( MIN( K2+1, M ), L1 ), 1 )
-                  SUMR = DDOT( L1-1, C( K2, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = DDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
-     $                   C( MIN( K2+1, M ), L2 ), 1 )
-                  SUMR = DDOT( L1-1, C( K2, 1 ), LDC, B( 1, L2 ), 1 )
-                  VEC( 2, 2 ) = C( K2, L2 ) - ( SUML+SGN*SUMR )
-*
-                  CALL DLASY2( .FALSE., .FALSE., ISGN, 2, 2,
-     $                         A( K1, K1 ), LDA, B( L1, L1 ), LDB, VEC,
-     $                         2, SCALOC, X, 2, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 40 J = 1, N
-                        CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
-   40                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K1, L2 ) = X( 1, 2 )
-                  C( K2, L1 ) = X( 2, 1 )
-                  C( K2, L2 ) = X( 2, 2 )
-               END IF
-*
-   50       CONTINUE
-*
-   60    CONTINUE
-*
-      ELSE IF( .NOT.NOTRNA .AND. NOTRNB ) THEN
-*
-*        Solve    A' *X + ISGN*X*B = scale*C.
-*
-*        The (K,L)th block of X is determined starting from
-*        upper-left corner column by column by
-*
-*          A(K,K)'*X(K,L) + ISGN*X(K,L)*B(L,L) = C(K,L) - R(K,L)
-*
-*        Where
-*                   K-1                        L-1
-*          R(K,L) = SUM [A(I,K)'*X(I,L)] +ISGN*SUM [X(K,J)*B(J,L)]
-*                   I=1                        J=1
-*
-*        Start column loop (index = L)
-*        L1 (L2): column index of the first (last) row of X(K,L)
-*
-         LNEXT = 1
-         DO 120 L = 1, N
-            IF( L.LT.LNEXT )
-     $         GO TO 120
-            IF( L.EQ.N ) THEN
-               L1 = L
-               L2 = L
-            ELSE
-               IF( B( L+1, L ).NE.ZERO ) THEN
-                  L1 = L
-                  L2 = L + 1
-                  LNEXT = L + 2
-               ELSE
-                  L1 = L
-                  L2 = L
-                  LNEXT = L + 1
-               END IF
-            END IF
-*
-*           Start row loop (index = K)
-*           K1 (K2): row index of the first (last) row of X(K,L)
-*
-            KNEXT = 1
-            DO 110 K = 1, M
-               IF( K.LT.KNEXT )
-     $            GO TO 110
-               IF( K.EQ.M ) THEN
-                  K1 = K
-                  K2 = K
-               ELSE
-                  IF( A( K+1, K ).NE.ZERO ) THEN
-                     K1 = K
-                     K2 = K + 1
-                     KNEXT = K + 2
-                  ELSE
-                     K1 = K
-                     K2 = K
-                     KNEXT = K + 1
-                  END IF
-               END IF
-*
-               IF( L1.EQ.L2 .AND. K1.EQ.K2 ) THEN
-                  SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
-                  SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-                  SCALOC = ONE
-*
-                  A11 = A( K1, K1 ) + SGN*B( L1, L1 )
-                  DA11 = ABS( A11 )
-                  IF( DA11.LE.SMIN ) THEN
-                     A11 = SMIN
-                     DA11 = SMIN
-                     INFO = 1
-                  END IF
-                  DB = ABS( VEC( 1, 1 ) )
-                  IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
-                     IF( DB.GT.BIGNUM*DA11 )
-     $                  SCALOC = ONE / DB
-                  END IF
-                  X( 1, 1 ) = ( VEC( 1, 1 )*SCALOC ) / A11
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 70 J = 1, N
-                        CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
-   70                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-*
-               ELSE IF( L1.EQ.L2 .AND. K1.NE.K2 ) THEN
-*
-                  SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
-                  SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = DDOT( K1-1, A( 1, K2 ), 1, C( 1, L1 ), 1 )
-                  SUMR = DDOT( L1-1, C( K2, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
-*
-                  CALL DLALN2( .TRUE., 2, 1, SMIN, ONE, A( K1, K1 ),
-     $                         LDA, ONE, ONE, VEC, 2, -SGN*B( L1, L1 ),
-     $                         ZERO, X, 2, SCALOC, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 80 J = 1, N
-                        CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
-   80                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K2, L1 ) = X( 2, 1 )
-*
-               ELSE IF( L1.NE.L2 .AND. K1.EQ.K2 ) THEN
-*
-                  SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
-                  SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 1, 1 ) = SGN*( C( K1, L1 )-( SUML+SGN*SUMR ) )
-*
-                  SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L2 ), 1 )
-                  SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L2 ), 1 )
-                  VEC( 2, 1 ) = SGN*( C( K1, L2 )-( SUML+SGN*SUMR ) )
-*
-                  CALL DLALN2( .TRUE., 2, 1, SMIN, ONE, B( L1, L1 ),
-     $                         LDB, ONE, ONE, VEC, 2, -SGN*A( K1, K1 ),
-     $                         ZERO, X, 2, SCALOC, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 90 J = 1, N
-                        CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
-   90                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K1, L2 ) = X( 2, 1 )
-*
-               ELSE IF( L1.NE.L2 .AND. K1.NE.K2 ) THEN
-*
-                  SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
-                  SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L2 ), 1 )
-                  SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L2 ), 1 )
-                  VEC( 1, 2 ) = C( K1, L2 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = DDOT( K1-1, A( 1, K2 ), 1, C( 1, L1 ), 1 )
-                  SUMR = DDOT( L1-1, C( K2, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = DDOT( K1-1, A( 1, K2 ), 1, C( 1, L2 ), 1 )
-                  SUMR = DDOT( L1-1, C( K2, 1 ), LDC, B( 1, L2 ), 1 )
-                  VEC( 2, 2 ) = C( K2, L2 ) - ( SUML+SGN*SUMR )
-*
-                  CALL DLASY2( .TRUE., .FALSE., ISGN, 2, 2, A( K1, K1 ),
-     $                         LDA, B( L1, L1 ), LDB, VEC, 2, SCALOC, X,
-     $                         2, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 100 J = 1, N
-                        CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
-  100                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K1, L2 ) = X( 1, 2 )
-                  C( K2, L1 ) = X( 2, 1 )
-                  C( K2, L2 ) = X( 2, 2 )
-               END IF
-*
-  110       CONTINUE
-  120    CONTINUE
-*
-      ELSE IF( .NOT.NOTRNA .AND. .NOT.NOTRNB ) THEN
-*
-*        Solve    A'*X + ISGN*X*B' = scale*C.
-*
-*        The (K,L)th block of X is determined starting from
-*        top-right corner column by column by
-*
-*           A(K,K)'*X(K,L) + ISGN*X(K,L)*B(L,L)' = C(K,L) - R(K,L)
-*
-*        Where
-*                     K-1                          N
-*            R(K,L) = SUM [A(I,K)'*X(I,L)] + ISGN*SUM [X(K,J)*B(L,J)'].
-*                     I=1                        J=L+1
-*
-*        Start column loop (index = L)
-*        L1 (L2): column index of the first (last) row of X(K,L)
-*
-         LNEXT = N
-         DO 180 L = N, 1, -1
-            IF( L.GT.LNEXT )
-     $         GO TO 180
-            IF( L.EQ.1 ) THEN
-               L1 = L
-               L2 = L
-            ELSE
-               IF( B( L, L-1 ).NE.ZERO ) THEN
-                  L1 = L - 1
-                  L2 = L
-                  LNEXT = L - 2
-               ELSE
-                  L1 = L
-                  L2 = L
-                  LNEXT = L - 1
-               END IF
-            END IF
-*
-*           Start row loop (index = K)
-*           K1 (K2): row index of the first (last) row of X(K,L)
-*
-            KNEXT = 1
-            DO 170 K = 1, M
-               IF( K.LT.KNEXT )
-     $            GO TO 170
-               IF( K.EQ.M ) THEN
-                  K1 = K
-                  K2 = K
-               ELSE
-                  IF( A( K+1, K ).NE.ZERO ) THEN
-                     K1 = K
-                     K2 = K + 1
-                     KNEXT = K + 2
-                  ELSE
-                     K1 = K
-                     K2 = K
-                     KNEXT = K + 1
-                  END IF
-               END IF
-*
-               IF( L1.EQ.L2 .AND. K1.EQ.K2 ) THEN
-                  SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
-                  SUMR = DDOT( N-L1, C( K1, MIN( L1+1, N ) ), LDC,
-     $                   B( L1, MIN( L1+1, N ) ), LDB )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-                  SCALOC = ONE
-*
-                  A11 = A( K1, K1 ) + SGN*B( L1, L1 )
-                  DA11 = ABS( A11 )
-                  IF( DA11.LE.SMIN ) THEN
-                     A11 = SMIN
-                     DA11 = SMIN
-                     INFO = 1
-                  END IF
-                  DB = ABS( VEC( 1, 1 ) )
-                  IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
-                     IF( DB.GT.BIGNUM*DA11 )
-     $                  SCALOC = ONE / DB
-                  END IF
-                  X( 1, 1 ) = ( VEC( 1, 1 )*SCALOC ) / A11
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 130 J = 1, N
-                        CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
-  130                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-*
-               ELSE IF( L1.EQ.L2 .AND. K1.NE.K2 ) THEN
-*
-                  SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
-                  SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                   B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = DDOT( K1-1, A( 1, K2 ), 1, C( 1, L1 ), 1 )
-                  SUMR = DDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
-     $                   B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
-*
-                  CALL DLALN2( .TRUE., 2, 1, SMIN, ONE, A( K1, K1 ),
-     $                         LDA, ONE, ONE, VEC, 2, -SGN*B( L1, L1 ),
-     $                         ZERO, X, 2, SCALOC, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 140 J = 1, N
-                        CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
-  140                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K2, L1 ) = X( 2, 1 )
-*
-               ELSE IF( L1.NE.L2 .AND. K1.EQ.K2 ) THEN
-*
-                  SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
-                  SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                   B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 1, 1 ) = SGN*( C( K1, L1 )-( SUML+SGN*SUMR ) )
-*
-                  SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L2 ), 1 )
-                  SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                   B( L2, MIN( L2+1, N ) ), LDB )
-                  VEC( 2, 1 ) = SGN*( C( K1, L2 )-( SUML+SGN*SUMR ) )
-*
-                  CALL DLALN2( .FALSE., 2, 1, SMIN, ONE, B( L1, L1 ),
-     $                         LDB, ONE, ONE, VEC, 2, -SGN*A( K1, K1 ),
-     $                         ZERO, X, 2, SCALOC, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 150 J = 1, N
-                        CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
-  150                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K1, L2 ) = X( 2, 1 )
-*
-               ELSE IF( L1.NE.L2 .AND. K1.NE.K2 ) THEN
-*
-                  SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
-                  SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                   B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L2 ), 1 )
-                  SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                   B( L2, MIN( L2+1, N ) ), LDB )
-                  VEC( 1, 2 ) = C( K1, L2 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = DDOT( K1-1, A( 1, K2 ), 1, C( 1, L1 ), 1 )
-                  SUMR = DDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
-     $                   B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = DDOT( K1-1, A( 1, K2 ), 1, C( 1, L2 ), 1 )
-                  SUMR = DDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
-     $                   B( L2, MIN( L2+1, N ) ), LDB )
-                  VEC( 2, 2 ) = C( K2, L2 ) - ( SUML+SGN*SUMR )
-*
-                  CALL DLASY2( .TRUE., .TRUE., ISGN, 2, 2, A( K1, K1 ),
-     $                         LDA, B( L1, L1 ), LDB, VEC, 2, SCALOC, X,
-     $                         2, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 160 J = 1, N
-                        CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
-  160                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K1, L2 ) = X( 1, 2 )
-                  C( K2, L1 ) = X( 2, 1 )
-                  C( K2, L2 ) = X( 2, 2 )
-               END IF
-*
-  170       CONTINUE
-  180    CONTINUE
-*
-      ELSE IF( NOTRNA .AND. .NOT.NOTRNB ) THEN
-*
-*        Solve    A*X + ISGN*X*B' = scale*C.
-*
-*        The (K,L)th block of X is determined starting from
-*        bottom-right corner column by column by
-*
-*            A(K,K)*X(K,L) + ISGN*X(K,L)*B(L,L)' = C(K,L) - R(K,L)
-*
-*        Where
-*                      M                          N
-*            R(K,L) = SUM [A(K,I)*X(I,L)] + ISGN*SUM [X(K,J)*B(L,J)'].
-*                    I=K+1                      J=L+1
-*
-*        Start column loop (index = L)
-*        L1 (L2): column index of the first (last) row of X(K,L)
-*
-         LNEXT = N
-         DO 240 L = N, 1, -1
-            IF( L.GT.LNEXT )
-     $         GO TO 240
-            IF( L.EQ.1 ) THEN
-               L1 = L
-               L2 = L
-            ELSE
-               IF( B( L, L-1 ).NE.ZERO ) THEN
-                  L1 = L - 1
-                  L2 = L
-                  LNEXT = L - 2
-               ELSE
-                  L1 = L
-                  L2 = L
-                  LNEXT = L - 1
-               END IF
-            END IF
-*
-*           Start row loop (index = K)
-*           K1 (K2): row index of the first (last) row of X(K,L)
-*
-            KNEXT = M
-            DO 230 K = M, 1, -1
-               IF( K.GT.KNEXT )
-     $            GO TO 230
-               IF( K.EQ.1 ) THEN
-                  K1 = K
-                  K2 = K
-               ELSE
-                  IF( A( K, K-1 ).NE.ZERO ) THEN
-                     K1 = K - 1
-                     K2 = K
-                     KNEXT = K - 2
-                  ELSE
-                     K1 = K
-                     K2 = K
-                     KNEXT = K - 1
-                  END IF
-               END IF
-*
-               IF( L1.EQ.L2 .AND. K1.EQ.K2 ) THEN
-                  SUML = DDOT( M-K1, A( K1, MIN( K1+1, M ) ), LDA,
-     $                   C( MIN( K1+1, M ), L1 ), 1 )
-                  SUMR = DDOT( N-L1, C( K1, MIN( L1+1, N ) ), LDC,
-     $                   B( L1, MIN( L1+1, N ) ), LDB )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-                  SCALOC = ONE
-*
-                  A11 = A( K1, K1 ) + SGN*B( L1, L1 )
-                  DA11 = ABS( A11 )
-                  IF( DA11.LE.SMIN ) THEN
-                     A11 = SMIN
-                     DA11 = SMIN
-                     INFO = 1
-                  END IF
-                  DB = ABS( VEC( 1, 1 ) )
-                  IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
-                     IF( DB.GT.BIGNUM*DA11 )
-     $                  SCALOC = ONE / DB
-                  END IF
-                  X( 1, 1 ) = ( VEC( 1, 1 )*SCALOC ) / A11
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 190 J = 1, N
-                        CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
-  190                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-*
-               ELSE IF( L1.EQ.L2 .AND. K1.NE.K2 ) THEN
-*
-                  SUML = DDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
-     $                   C( MIN( K2+1, M ), L1 ), 1 )
-                  SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                   B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = DDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
-     $                   C( MIN( K2+1, M ), L1 ), 1 )
-                  SUMR = DDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
-     $                   B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
-*
-                  CALL DLALN2( .FALSE., 2, 1, SMIN, ONE, A( K1, K1 ),
-     $                         LDA, ONE, ONE, VEC, 2, -SGN*B( L1, L1 ),
-     $                         ZERO, X, 2, SCALOC, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 200 J = 1, N
-                        CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
-  200                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K2, L1 ) = X( 2, 1 )
-*
-               ELSE IF( L1.NE.L2 .AND. K1.EQ.K2 ) THEN
-*
-                  SUML = DDOT( M-K1, A( K1, MIN( K1+1, M ) ), LDA,
-     $                   C( MIN( K1+1, M ), L1 ), 1 )
-                  SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                   B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 1, 1 ) = SGN*( C( K1, L1 )-( SUML+SGN*SUMR ) )
-*
-                  SUML = DDOT( M-K1, A( K1, MIN( K1+1, M ) ), LDA,
-     $                   C( MIN( K1+1, M ), L2 ), 1 )
-                  SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                   B( L2, MIN( L2+1, N ) ), LDB )
-                  VEC( 2, 1 ) = SGN*( C( K1, L2 )-( SUML+SGN*SUMR ) )
-*
-                  CALL DLALN2( .FALSE., 2, 1, SMIN, ONE, B( L1, L1 ),
-     $                         LDB, ONE, ONE, VEC, 2, -SGN*A( K1, K1 ),
-     $                         ZERO, X, 2, SCALOC, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 210 J = 1, N
-                        CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
-  210                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K1, L2 ) = X( 2, 1 )
-*
-               ELSE IF( L1.NE.L2 .AND. K1.NE.K2 ) THEN
-*
-                  SUML = DDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
-     $                   C( MIN( K2+1, M ), L1 ), 1 )
-                  SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                   B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = DDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
-     $                   C( MIN( K2+1, M ), L2 ), 1 )
-                  SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                   B( L2, MIN( L2+1, N ) ), LDB )
-                  VEC( 1, 2 ) = C( K1, L2 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = DDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
-     $                   C( MIN( K2+1, M ), L1 ), 1 )
-                  SUMR = DDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
-     $                   B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = DDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
-     $                   C( MIN( K2+1, M ), L2 ), 1 )
-                  SUMR = DDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
-     $                   B( L2, MIN( L2+1, N ) ), LDB )
-                  VEC( 2, 2 ) = C( K2, L2 ) - ( SUML+SGN*SUMR )
-*
-                  CALL DLASY2( .FALSE., .TRUE., ISGN, 2, 2, A( K1, K1 ),
-     $                         LDA, B( L1, L1 ), LDB, VEC, 2, SCALOC, X,
-     $                         2, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 220 J = 1, N
-                        CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
-  220                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K1, L2 ) = X( 1, 2 )
-                  C( K2, L1 ) = X( 2, 1 )
-                  C( K2, L2 ) = X( 2, 2 )
-               END IF
-*
-  230       CONTINUE
-  240    CONTINUE
-*
-      END IF
-*
-      RETURN
-*
-*     End of DTRSYL
-*
-      END
--- a/libcruft/lapack/dtrti2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-      SUBROUTINE DTRTI2( UPLO, DIAG, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DTRTI2 computes the inverse of a real upper or lower triangular
-*  matrix.
-*
-*  This is the Level 2 BLAS version of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the matrix A is upper or lower triangular.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  DIAG    (input) CHARACTER*1
-*          Specifies whether or not the matrix A is unit triangular.
-*          = 'N':  Non-unit triangular
-*          = 'U':  Unit triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the triangular matrix A.  If UPLO = 'U', the
-*          leading n by n upper triangular part of the array A contains
-*          the upper triangular matrix, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n by n lower triangular part of the array A contains
-*          the lower triangular matrix, and the strictly upper
-*          triangular part of A is not referenced.  If DIAG = 'U', the
-*          diagonal elements of A are also not referenced and are
-*          assumed to be 1.
-*
-*          On exit, the (triangular) inverse of the original matrix, in
-*          the same storage format.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOUNIT, UPPER
-      INTEGER            J
-      DOUBLE PRECISION   AJJ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DSCAL, DTRMV, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      NOUNIT = LSAME( DIAG, 'N' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DTRTI2', -INFO )
-         RETURN
-      END IF
-*
-      IF( UPPER ) THEN
-*
-*        Compute inverse of upper triangular matrix.
-*
-         DO 10 J = 1, N
-            IF( NOUNIT ) THEN
-               A( J, J ) = ONE / A( J, J )
-               AJJ = -A( J, J )
-            ELSE
-               AJJ = -ONE
-            END IF
-*
-*           Compute elements 1:j-1 of j-th column.
-*
-            CALL DTRMV( 'Upper', 'No transpose', DIAG, J-1, A, LDA,
-     $                  A( 1, J ), 1 )
-            CALL DSCAL( J-1, AJJ, A( 1, J ), 1 )
-   10    CONTINUE
-      ELSE
-*
-*        Compute inverse of lower triangular matrix.
-*
-         DO 20 J = N, 1, -1
-            IF( NOUNIT ) THEN
-               A( J, J ) = ONE / A( J, J )
-               AJJ = -A( J, J )
-            ELSE
-               AJJ = -ONE
-            END IF
-            IF( J.LT.N ) THEN
-*
-*              Compute elements j+1:n of j-th column.
-*
-               CALL DTRMV( 'Lower', 'No transpose', DIAG, N-J,
-     $                     A( J+1, J+1 ), LDA, A( J+1, J ), 1 )
-               CALL DSCAL( N-J, AJJ, A( J+1, J ), 1 )
-            END IF
-   20    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of DTRTI2
-*
-      END
--- a/libcruft/lapack/dtrtri.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,176 +0,0 @@
-      SUBROUTINE DTRTRI( UPLO, DIAG, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DTRTRI computes the inverse of a real upper or lower triangular
-*  matrix A.
-*
-*  This is the Level 3 BLAS version of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  A is upper triangular;
-*          = 'L':  A is lower triangular.
-*
-*  DIAG    (input) CHARACTER*1
-*          = 'N':  A is non-unit triangular;
-*          = 'U':  A is unit triangular.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the triangular matrix A.  If UPLO = 'U', the
-*          leading N-by-N upper triangular part of the array A contains
-*          the upper triangular matrix, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading N-by-N lower triangular part of the array A contains
-*          the lower triangular matrix, and the strictly upper
-*          triangular part of A is not referenced.  If DIAG = 'U', the
-*          diagonal elements of A are also not referenced and are
-*          assumed to be 1.
-*          On exit, the (triangular) inverse of the original matrix, in
-*          the same storage format.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = i, A(i,i) is exactly zero.  The triangular
-*               matrix is singular and its inverse can not be computed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOUNIT, UPPER
-      INTEGER            J, JB, NB, NN
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DTRMM, DTRSM, DTRTI2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      NOUNIT = LSAME( DIAG, 'N' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DTRTRI', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Check for singularity if non-unit.
-*
-      IF( NOUNIT ) THEN
-         DO 10 INFO = 1, N
-            IF( A( INFO, INFO ).EQ.ZERO )
-     $         RETURN
-   10    CONTINUE
-         INFO = 0
-      END IF
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'DTRTRI', UPLO // DIAG, N, -1, -1, -1 )
-      IF( NB.LE.1 .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code
-*
-         CALL DTRTI2( UPLO, DIAG, N, A, LDA, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( UPPER ) THEN
-*
-*           Compute inverse of upper triangular matrix
-*
-            DO 20 J = 1, N, NB
-               JB = MIN( NB, N-J+1 )
-*
-*              Compute rows 1:j-1 of current block column
-*
-               CALL DTRMM( 'Left', 'Upper', 'No transpose', DIAG, J-1,
-     $                     JB, ONE, A, LDA, A( 1, J ), LDA )
-               CALL DTRSM( 'Right', 'Upper', 'No transpose', DIAG, J-1,
-     $                     JB, -ONE, A( J, J ), LDA, A( 1, J ), LDA )
-*
-*              Compute inverse of current diagonal block
-*
-               CALL DTRTI2( 'Upper', DIAG, JB, A( J, J ), LDA, INFO )
-   20       CONTINUE
-         ELSE
-*
-*           Compute inverse of lower triangular matrix
-*
-            NN = ( ( N-1 ) / NB )*NB + 1
-            DO 30 J = NN, 1, -NB
-               JB = MIN( NB, N-J+1 )
-               IF( J+JB.LE.N ) THEN
-*
-*                 Compute rows j+jb:n of current block column
-*
-                  CALL DTRMM( 'Left', 'Lower', 'No transpose', DIAG,
-     $                        N-J-JB+1, JB, ONE, A( J+JB, J+JB ), LDA,
-     $                        A( J+JB, J ), LDA )
-                  CALL DTRSM( 'Right', 'Lower', 'No transpose', DIAG,
-     $                        N-J-JB+1, JB, -ONE, A( J, J ), LDA,
-     $                        A( J+JB, J ), LDA )
-               END IF
-*
-*              Compute inverse of current diagonal block
-*
-               CALL DTRTI2( 'Lower', DIAG, JB, A( J, J ), LDA, INFO )
-   30       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of DTRTRI
-*
-      END
--- a/libcruft/lapack/dtrtrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-      SUBROUTINE DTRTRS( UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, TRANS, UPLO
-      INTEGER            INFO, LDA, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DTRTRS solves a triangular system of the form
-*
-*     A * X = B  or  A**T * X = B,
-*
-*  where A is a triangular matrix of order N, and B is an N-by-NRHS
-*  matrix.  A check is made to verify that A is nonsingular.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  A is upper triangular;
-*          = 'L':  A is lower triangular.
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the form of the system of equations:
-*          = 'N':  A * X = B  (No transpose)
-*          = 'T':  A**T * X = B  (Transpose)
-*          = 'C':  A**H * X = B  (Conjugate transpose = Transpose)
-*
-*  DIAG    (input) CHARACTER*1
-*          = 'N':  A is non-unit triangular;
-*          = 'U':  A is unit triangular.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  A       (input) DOUBLE PRECISION array, dimension (LDA,N)
-*          The triangular matrix A.  If UPLO = 'U', the leading N-by-N
-*          upper triangular part of the array A contains the upper
-*          triangular matrix, and the strictly lower triangular part of
-*          A is not referenced.  If UPLO = 'L', the leading N-by-N lower
-*          triangular part of the array A contains the lower triangular
-*          matrix, and the strictly upper triangular part of A is not
-*          referenced.  If DIAG = 'U', the diagonal elements of A are
-*          also not referenced and are assumed to be 1.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, if INFO = 0, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = i, the i-th diagonal element of A is zero,
-*               indicating that the matrix is singular and the solutions
-*               X have not been computed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOUNIT
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DTRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      NOUNIT = LSAME( DIAG, 'N' )
-      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND. .NOT.
-     $         LSAME( TRANS, 'T' ) .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -9
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DTRTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Check for singularity.
-*
-      IF( NOUNIT ) THEN
-         DO 10 INFO = 1, N
-            IF( A( INFO, INFO ).EQ.ZERO )
-     $         RETURN
-   10    CONTINUE
-      END IF
-      INFO = 0
-*
-*     Solve A * x = b  or  A' * x = b.
-*
-      CALL DTRSM( 'Left', UPLO, TRANS, DIAG, N, NRHS, ONE, A, LDA, B,
-     $            LDB )
-*
-      RETURN
-*
-*     End of DTRTRS
-*
-      END
--- a/libcruft/lapack/dtzrzf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,244 +0,0 @@
-      SUBROUTINE DTZRZF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DTZRZF reduces the M-by-N ( M<=N ) real upper trapezoidal matrix A
-*  to upper triangular form by means of orthogonal transformations.
-*
-*  The upper trapezoidal matrix A is factored as
-*
-*     A = ( R  0 ) * Z,
-*
-*  where Z is an N-by-N orthogonal matrix and R is an M-by-M upper
-*  triangular matrix.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= M.
-*
-*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
-*          On entry, the leading M-by-N upper trapezoidal part of the
-*          array A must contain the matrix to be factorized.
-*          On exit, the leading M-by-M upper triangular part of A
-*          contains the upper triangular matrix R, and elements M+1 to
-*          N of the first M rows of A, with the array TAU, represent the
-*          orthogonal matrix Z as a product of M elementary reflectors.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) DOUBLE PRECISION array, dimension (M)
-*          The scalar factors of the elementary reflectors.
-*
-*  WORK    (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,M).
-*          For optimum performance LWORK >= M*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  The factorization is obtained by Householder's method.  The kth
-*  transformation matrix, Z( k ), which is used to introduce zeros into
-*  the ( m - k + 1 )th row of A, is given in the form
-*
-*     Z( k ) = ( I     0   ),
-*              ( 0  T( k ) )
-*
-*  where
-*
-*     T( k ) = I - tau*u( k )*u( k )',   u( k ) = (   1    ),
-*                                                 (   0    )
-*                                                 ( z( k ) )
-*
-*  tau is a scalar and z( k ) is an ( n - m ) element vector.
-*  tau and z( k ) are chosen to annihilate the elements of the kth row
-*  of X.
-*
-*  The scalar tau is returned in the kth element of TAU and the vector
-*  u( k ) in the kth row of A, such that the elements of z( k ) are
-*  in  a( k, m + 1 ), ..., a( k, n ). The elements of R are returned in
-*  the upper triangular part of A.
-*
-*  Z is given by
-*
-*     Z =  Z( 1 ) * Z( 2 ) * ... * Z( m ).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IWS, KI, KK, LDWORK, LWKOPT, M1, MU, NB,
-     $                   NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARZB, DLARZT, DLATRZ, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.M ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( M.EQ.0 .OR. M.EQ.N ) THEN
-            LWKOPT = 1
-         ELSE
-*
-*           Determine the block size.
-*
-            NB = ILAENV( 1, 'DGERQF', ' ', M, N, -1, -1 )
-            LWKOPT = M*NB
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
-            INFO = -7
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'DTZRZF', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 ) THEN
-         RETURN
-      ELSE IF( M.EQ.N ) THEN
-         DO 10 I = 1, N
-            TAU( I ) = ZERO
-   10    CONTINUE
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 1
-      IWS = M
-      IF( NB.GT.1 .AND. NB.LT.M ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'DGERQF', ' ', M, N, -1, -1 ) )
-         IF( NX.LT.M ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = M
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'DGERQF', ' ', M, N, -1,
-     $                 -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.M .AND. NX.LT.M ) THEN
-*
-*        Use blocked code initially.
-*        The last kk rows are handled by the block method.
-*
-         M1 = MIN( M+1, N )
-         KI = ( ( M-NX-1 ) / NB )*NB
-         KK = MIN( M, KI+NB )
-*
-         DO 20 I = M - KK + KI + 1, M - KK + 1, -NB
-            IB = MIN( M-I+1, NB )
-*
-*           Compute the TZ factorization of the current block
-*           A(i:i+ib-1,i:n)
-*
-            CALL DLATRZ( IB, N-I+1, N-M, A( I, I ), LDA, TAU( I ),
-     $                   WORK )
-            IF( I.GT.1 ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i+ib-1) . . . H(i+1) H(i)
-*
-               CALL DLARZT( 'Backward', 'Rowwise', N-M, IB, A( I, M1 ),
-     $                      LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H to A(1:i-1,i:n) from the right
-*
-               CALL DLARZB( 'Right', 'No transpose', 'Backward',
-     $                      'Rowwise', I-1, N-I+1, IB, N-M, A( I, M1 ),
-     $                      LDA, WORK, LDWORK, A( 1, I ), LDA,
-     $                      WORK( IB+1 ), LDWORK )
-            END IF
-   20    CONTINUE
-         MU = I + NB - 1
-      ELSE
-         MU = M
-      END IF
-*
-*     Use unblocked code to factor the last or only block
-*
-      IF( MU.GT.0 )
-     $   CALL DLATRZ( MU, N, N-M, A, LDA, TAU, WORK )
-*
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of DTZRZF
-*
-      END
--- a/libcruft/lapack/dzsum1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-      DOUBLE PRECISION FUNCTION DZSUM1( N, CX, INCX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         CX( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  DZSUM1 takes the sum of the absolute values of a complex
-*  vector and returns a double precision result.
-*
-*  Based on DZASUM from the Level 1 BLAS.
-*  The change is to use the 'genuine' absolute value.
-*
-*  Contributed by Nick Higham for use with ZLACON.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of elements in the vector CX.
-*
-*  CX      (input) COMPLEX*16 array, dimension (N)
-*          The vector whose elements will be summed.
-*
-*  INCX    (input) INTEGER
-*          The spacing between successive values of CX.  INCX > 0.
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, NINCX
-      DOUBLE PRECISION   STEMP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. Executable Statements ..
-*
-      DZSUM1 = 0.0D0
-      STEMP = 0.0D0
-      IF( N.LE.0 )
-     $   RETURN
-      IF( INCX.EQ.1 )
-     $   GO TO 20
-*
-*     CODE FOR INCREMENT NOT EQUAL TO 1
-*
-      NINCX = N*INCX
-      DO 10 I = 1, NINCX, INCX
-*
-*        NEXT LINE MODIFIED.
-*
-         STEMP = STEMP + ABS( CX( I ) )
-   10 CONTINUE
-      DZSUM1 = STEMP
-      RETURN
-*
-*     CODE FOR INCREMENT EQUAL TO 1
-*
-   20 CONTINUE
-      DO 30 I = 1, N
-*
-*        NEXT LINE MODIFIED.
-*
-         STEMP = STEMP + ABS( CX( I ) )
-   30 CONTINUE
-      DZSUM1 = STEMP
-      RETURN
-*
-*     End of DZSUM1
-*
-      END
--- a/libcruft/lapack/icmax1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,95 +0,0 @@
-      INTEGER          FUNCTION ICMAX1( N, CX, INCX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            CX( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ICMAX1 finds the index of the element whose real part has maximum
-*  absolute value.
-*
-*  Based on ICAMAX from Level 1 BLAS.
-*  The change is to use the 'genuine' absolute value.
-*
-*  Contributed by Nick Higham for use with CLACON.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of elements in the vector CX.
-*
-*  CX      (input) COMPLEX array, dimension (N)
-*          The vector whose elements will be summed.
-*
-*  INCX    (input) INTEGER
-*          The spacing between successive values of CX.  INCX >= 1.
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, IX
-      REAL               SMAX
-      COMPLEX            ZDUM
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. Statement Functions ..
-      REAL               CABS1
-*     ..
-*     .. Statement Function definitions ..
-*
-*     NEXT LINE IS THE ONLY MODIFICATION.
-      CABS1( ZDUM ) = ABS( ZDUM )
-*     ..
-*     .. Executable Statements ..
-*
-      ICMAX1 = 0
-      IF( N.LT.1 )
-     $   RETURN
-      ICMAX1 = 1
-      IF( N.EQ.1 )
-     $   RETURN
-      IF( INCX.EQ.1 )
-     $   GO TO 30
-*
-*     CODE FOR INCREMENT NOT EQUAL TO 1
-*
-      IX = 1
-      SMAX = CABS1( CX( 1 ) )
-      IX = IX + INCX
-      DO 20 I = 2, N
-         IF( CABS1( CX( IX ) ).LE.SMAX )
-     $      GO TO 10
-         ICMAX1 = I
-         SMAX = CABS1( CX( IX ) )
-   10    CONTINUE
-         IX = IX + INCX
-   20 CONTINUE
-      RETURN
-*
-*     CODE FOR INCREMENT EQUAL TO 1
-*
-   30 CONTINUE
-      SMAX = CABS1( CX( 1 ) )
-      DO 40 I = 2, N
-         IF( CABS1( CX( I ) ).LE.SMAX )
-     $      GO TO 40
-         ICMAX1 = I
-         SMAX = CABS1( CX( I ) )
-   40 CONTINUE
-      RETURN
-*
-*     End of ICMAX1
-*
-      END
--- a/libcruft/lapack/ieeeck.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-      INTEGER          FUNCTION IEEECK( ISPEC, ZERO, ONE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            ISPEC
-      REAL               ONE, ZERO
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  IEEECK is called from the ILAENV to verify that Infinity and
-*  possibly NaN arithmetic is safe (i.e. will not trap).
-*
-*  Arguments
-*  =========
-*
-*  ISPEC   (input) INTEGER
-*          Specifies whether to test just for inifinity arithmetic
-*          or whether to test for infinity and NaN arithmetic.
-*          = 0: Verify infinity arithmetic only.
-*          = 1: Verify infinity and NaN arithmetic.
-*
-*  ZERO    (input) REAL
-*          Must contain the value 0.0
-*          This is passed to prevent the compiler from optimizing
-*          away this code.
-*
-*  ONE     (input) REAL
-*          Must contain the value 1.0
-*          This is passed to prevent the compiler from optimizing
-*          away this code.
-*
-*  RETURN VALUE:  INTEGER
-*          = 0:  Arithmetic failed to produce the correct answers
-*          = 1:  Arithmetic produced the correct answers
-*
-*     .. Local Scalars ..
-      REAL               NAN1, NAN2, NAN3, NAN4, NAN5, NAN6, NEGINF,
-     $                   NEGZRO, NEWZRO, POSINF
-*     ..
-*     .. Executable Statements ..
-      IEEECK = 1
-*
-      POSINF = ONE / ZERO
-      IF( POSINF.LE.ONE ) THEN
-         IEEECK = 0
-         RETURN
-      END IF
-*
-      NEGINF = -ONE / ZERO
-      IF( NEGINF.GE.ZERO ) THEN
-         IEEECK = 0
-         RETURN
-      END IF
-*
-      NEGZRO = ONE / ( NEGINF+ONE )
-      IF( NEGZRO.NE.ZERO ) THEN
-         IEEECK = 0
-         RETURN
-      END IF
-*
-      NEGINF = ONE / NEGZRO
-      IF( NEGINF.GE.ZERO ) THEN
-         IEEECK = 0
-         RETURN
-      END IF
-*
-      NEWZRO = NEGZRO + ZERO
-      IF( NEWZRO.NE.ZERO ) THEN
-         IEEECK = 0
-         RETURN
-      END IF
-*
-      POSINF = ONE / NEWZRO
-      IF( POSINF.LE.ONE ) THEN
-         IEEECK = 0
-         RETURN
-      END IF
-*
-      NEGINF = NEGINF*POSINF
-      IF( NEGINF.GE.ZERO ) THEN
-         IEEECK = 0
-         RETURN
-      END IF
-*
-      POSINF = POSINF*POSINF
-      IF( POSINF.LE.ONE ) THEN
-         IEEECK = 0
-         RETURN
-      END IF
-*
-*
-*
-*
-*     Return if we were only asked to check infinity arithmetic
-*
-      IF( ISPEC.EQ.0 )
-     $   RETURN
-*
-      NAN1 = POSINF + NEGINF
-*
-      NAN2 = POSINF / NEGINF
-*
-      NAN3 = POSINF / POSINF
-*
-      NAN4 = POSINF*ZERO
-*
-      NAN5 = NEGINF*NEGZRO
-*
-      NAN6 = NAN5*0.0
-*
-      IF( NAN1.EQ.NAN1 ) THEN
-         IEEECK = 0
-         RETURN
-      END IF
-*
-      IF( NAN2.EQ.NAN2 ) THEN
-         IEEECK = 0
-         RETURN
-      END IF
-*
-      IF( NAN3.EQ.NAN3 ) THEN
-         IEEECK = 0
-         RETURN
-      END IF
-*
-      IF( NAN4.EQ.NAN4 ) THEN
-         IEEECK = 0
-         RETURN
-      END IF
-*
-      IF( NAN5.EQ.NAN5 ) THEN
-         IEEECK = 0
-         RETURN
-      END IF
-*
-      IF( NAN6.EQ.NAN6 ) THEN
-         IEEECK = 0
-         RETURN
-      END IF
-*
-      RETURN
-      END
--- a/libcruft/lapack/ilaenv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,552 +0,0 @@
-      INTEGER FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
-*
-*  -- LAPACK auxiliary routine (version 3.1.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     January 2007
-*
-*     .. Scalar Arguments ..
-      CHARACTER*( * )    NAME, OPTS
-      INTEGER            ISPEC, N1, N2, N3, N4
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ILAENV is called from the LAPACK routines to choose problem-dependent
-*  parameters for the local environment.  See ISPEC for a description of
-*  the parameters.
-*
-*  ILAENV returns an INTEGER
-*  if ILAENV >= 0: ILAENV returns the value of the parameter specified by ISPEC
-*  if ILAENV < 0:  if ILAENV = -k, the k-th argument had an illegal value.
-*
-*  This version provides a set of parameters which should give good,
-*  but not optimal, performance on many of the currently available
-*  computers.  Users are encouraged to modify this subroutine to set
-*  the tuning parameters for their particular machine using the option
-*  and problem size information in the arguments.
-*
-*  This routine will not function correctly if it is converted to all
-*  lower case.  Converting it to all upper case is allowed.
-*
-*  Arguments
-*  =========
-*
-*  ISPEC   (input) INTEGER
-*          Specifies the parameter to be returned as the value of
-*          ILAENV.
-*          = 1: the optimal blocksize; if this value is 1, an unblocked
-*               algorithm will give the best performance.
-*          = 2: the minimum block size for which the block routine
-*               should be used; if the usable block size is less than
-*               this value, an unblocked routine should be used.
-*          = 3: the crossover point (in a block routine, for N less
-*               than this value, an unblocked routine should be used)
-*          = 4: the number of shifts, used in the nonsymmetric
-*               eigenvalue routines (DEPRECATED)
-*          = 5: the minimum column dimension for blocking to be used;
-*               rectangular blocks must have dimension at least k by m,
-*               where k is given by ILAENV(2,...) and m by ILAENV(5,...)
-*          = 6: the crossover point for the SVD (when reducing an m by n
-*               matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds
-*               this value, a QR factorization is used first to reduce
-*               the matrix to a triangular form.)
-*          = 7: the number of processors
-*          = 8: the crossover point for the multishift QR method
-*               for nonsymmetric eigenvalue problems (DEPRECATED)
-*          = 9: maximum size of the subproblems at the bottom of the
-*               computation tree in the divide-and-conquer algorithm
-*               (used by xGELSD and xGESDD)
-*          =10: ieee NaN arithmetic can be trusted not to trap
-*          =11: infinity arithmetic can be trusted not to trap
-*          12 <= ISPEC <= 16:
-*               xHSEQR or one of its subroutines,
-*               see IPARMQ for detailed explanation
-*
-*  NAME    (input) CHARACTER*(*)
-*          The name of the calling subroutine, in either upper case or
-*          lower case.
-*
-*  OPTS    (input) CHARACTER*(*)
-*          The character options to the subroutine NAME, concatenated
-*          into a single character string.  For example, UPLO = 'U',
-*          TRANS = 'T', and DIAG = 'N' for a triangular routine would
-*          be specified as OPTS = 'UTN'.
-*
-*  N1      (input) INTEGER
-*  N2      (input) INTEGER
-*  N3      (input) INTEGER
-*  N4      (input) INTEGER
-*          Problem dimensions for the subroutine NAME; these may not all
-*          be required.
-*
-*  Further Details
-*  ===============
-*
-*  The following conventions have been used when calling ILAENV from the
-*  LAPACK routines:
-*  1)  OPTS is a concatenation of all of the character options to
-*      subroutine NAME, in the same order that they appear in the
-*      argument list for NAME, even if they are not used in determining
-*      the value of the parameter specified by ISPEC.
-*  2)  The problem dimensions N1, N2, N3, N4 are specified in the order
-*      that they appear in the argument list for NAME.  N1 is used
-*      first, N2 second, and so on, and unused problem dimensions are
-*      passed a value of -1.
-*  3)  The parameter value returned by ILAENV is checked for validity in
-*      the calling subroutine.  For example, ILAENV is used to retrieve
-*      the optimal blocksize for STRTRI as follows:
-*
-*      NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 )
-*      IF( NB.LE.1 ) NB = MAX( 1, N )
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, IC, IZ, NB, NBMIN, NX
-      LOGICAL            CNAME, SNAME
-      CHARACTER          C1*1, C2*2, C4*2, C3*3, SUBNAM*6
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          CHAR, ICHAR, INT, MIN, REAL
-*     ..
-*     .. External Functions ..
-      INTEGER            IEEECK, IPARMQ
-      EXTERNAL           IEEECK, IPARMQ
-*     ..
-*     .. Executable Statements ..
-*
-      GO TO ( 10, 10, 10, 80, 90, 100, 110, 120,
-     $        130, 140, 150, 160, 160, 160, 160, 160 )ISPEC
-*
-*     Invalid value for ISPEC
-*
-      ILAENV = -1
-      RETURN
-*
-   10 CONTINUE
-*
-*     Convert NAME to upper case if the first character is lower case.
-*
-      ILAENV = 1
-      SUBNAM = NAME
-      IC = ICHAR( SUBNAM( 1: 1 ) )
-      IZ = ICHAR( 'Z' )
-      IF( IZ.EQ.90 .OR. IZ.EQ.122 ) THEN
-*
-*        ASCII character set
-*
-         IF( IC.GE.97 .AND. IC.LE.122 ) THEN
-            SUBNAM( 1: 1 ) = CHAR( IC-32 )
-            DO 20 I = 2, 6
-               IC = ICHAR( SUBNAM( I: I ) )
-               IF( IC.GE.97 .AND. IC.LE.122 )
-     $            SUBNAM( I: I ) = CHAR( IC-32 )
-   20       CONTINUE
-         END IF
-*
-      ELSE IF( IZ.EQ.233 .OR. IZ.EQ.169 ) THEN
-*
-*        EBCDIC character set
-*
-         IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
-     $       ( IC.GE.145 .AND. IC.LE.153 ) .OR.
-     $       ( IC.GE.162 .AND. IC.LE.169 ) ) THEN
-            SUBNAM( 1: 1 ) = CHAR( IC+64 )
-            DO 30 I = 2, 6
-               IC = ICHAR( SUBNAM( I: I ) )
-               IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
-     $             ( IC.GE.145 .AND. IC.LE.153 ) .OR.
-     $             ( IC.GE.162 .AND. IC.LE.169 ) )SUBNAM( I:
-     $             I ) = CHAR( IC+64 )
-   30       CONTINUE
-         END IF
-*
-      ELSE IF( IZ.EQ.218 .OR. IZ.EQ.250 ) THEN
-*
-*        Prime machines:  ASCII+128
-*
-         IF( IC.GE.225 .AND. IC.LE.250 ) THEN
-            SUBNAM( 1: 1 ) = CHAR( IC-32 )
-            DO 40 I = 2, 6
-               IC = ICHAR( SUBNAM( I: I ) )
-               IF( IC.GE.225 .AND. IC.LE.250 )
-     $            SUBNAM( I: I ) = CHAR( IC-32 )
-   40       CONTINUE
-         END IF
-      END IF
-*
-      C1 = SUBNAM( 1: 1 )
-      SNAME = C1.EQ.'S' .OR. C1.EQ.'D'
-      CNAME = C1.EQ.'C' .OR. C1.EQ.'Z'
-      IF( .NOT.( CNAME .OR. SNAME ) )
-     $   RETURN
-      C2 = SUBNAM( 2: 3 )
-      C3 = SUBNAM( 4: 6 )
-      C4 = C3( 2: 3 )
-*
-      GO TO ( 50, 60, 70 )ISPEC
-*
-   50 CONTINUE
-*
-*     ISPEC = 1:  block size
-*
-*     In these examples, separate code is provided for setting NB for
-*     real and complex.  We assume that NB will take the same value in
-*     single or double precision.
-*
-      NB = 1
-*
-      IF( C2.EQ.'GE' ) THEN
-         IF( C3.EQ.'TRF' ) THEN
-            IF( SNAME ) THEN
-               NB = 64
-            ELSE
-               NB = 64
-            END IF
-         ELSE IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR.
-     $            C3.EQ.'QLF' ) THEN
-            IF( SNAME ) THEN
-               NB = 32
-            ELSE
-               NB = 32
-            END IF
-         ELSE IF( C3.EQ.'HRD' ) THEN
-            IF( SNAME ) THEN
-               NB = 32
-            ELSE
-               NB = 32
-            END IF
-         ELSE IF( C3.EQ.'BRD' ) THEN
-            IF( SNAME ) THEN
-               NB = 32
-            ELSE
-               NB = 32
-            END IF
-         ELSE IF( C3.EQ.'TRI' ) THEN
-            IF( SNAME ) THEN
-               NB = 64
-            ELSE
-               NB = 64
-            END IF
-         END IF
-      ELSE IF( C2.EQ.'PO' ) THEN
-         IF( C3.EQ.'TRF' ) THEN
-            IF( SNAME ) THEN
-               NB = 64
-            ELSE
-               NB = 64
-            END IF
-         END IF
-      ELSE IF( C2.EQ.'SY' ) THEN
-         IF( C3.EQ.'TRF' ) THEN
-            IF( SNAME ) THEN
-               NB = 64
-            ELSE
-               NB = 64
-            END IF
-         ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN
-            NB = 32
-         ELSE IF( SNAME .AND. C3.EQ.'GST' ) THEN
-            NB = 64
-         END IF
-      ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
-         IF( C3.EQ.'TRF' ) THEN
-            NB = 64
-         ELSE IF( C3.EQ.'TRD' ) THEN
-            NB = 32
-         ELSE IF( C3.EQ.'GST' ) THEN
-            NB = 64
-         END IF
-      ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
-         IF( C3( 1: 1 ).EQ.'G' ) THEN
-            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
-     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
-     $           THEN
-               NB = 32
-            END IF
-         ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
-            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
-     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
-     $           THEN
-               NB = 32
-            END IF
-         END IF
-      ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
-         IF( C3( 1: 1 ).EQ.'G' ) THEN
-            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
-     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
-     $           THEN
-               NB = 32
-            END IF
-         ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
-            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
-     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
-     $           THEN
-               NB = 32
-            END IF
-         END IF
-      ELSE IF( C2.EQ.'GB' ) THEN
-         IF( C3.EQ.'TRF' ) THEN
-            IF( SNAME ) THEN
-               IF( N4.LE.64 ) THEN
-                  NB = 1
-               ELSE
-                  NB = 32
-               END IF
-            ELSE
-               IF( N4.LE.64 ) THEN
-                  NB = 1
-               ELSE
-                  NB = 32
-               END IF
-            END IF
-         END IF
-      ELSE IF( C2.EQ.'PB' ) THEN
-         IF( C3.EQ.'TRF' ) THEN
-            IF( SNAME ) THEN
-               IF( N2.LE.64 ) THEN
-                  NB = 1
-               ELSE
-                  NB = 32
-               END IF
-            ELSE
-               IF( N2.LE.64 ) THEN
-                  NB = 1
-               ELSE
-                  NB = 32
-               END IF
-            END IF
-         END IF
-      ELSE IF( C2.EQ.'TR' ) THEN
-         IF( C3.EQ.'TRI' ) THEN
-            IF( SNAME ) THEN
-               NB = 64
-            ELSE
-               NB = 64
-            END IF
-         END IF
-      ELSE IF( C2.EQ.'LA' ) THEN
-         IF( C3.EQ.'UUM' ) THEN
-            IF( SNAME ) THEN
-               NB = 64
-            ELSE
-               NB = 64
-            END IF
-         END IF
-      ELSE IF( SNAME .AND. C2.EQ.'ST' ) THEN
-         IF( C3.EQ.'EBZ' ) THEN
-            NB = 1
-         END IF
-      END IF
-      ILAENV = NB
-      RETURN
-*
-   60 CONTINUE
-*
-*     ISPEC = 2:  minimum block size
-*
-      NBMIN = 2
-      IF( C2.EQ.'GE' ) THEN
-         IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. C3.EQ.
-     $       'QLF' ) THEN
-            IF( SNAME ) THEN
-               NBMIN = 2
-            ELSE
-               NBMIN = 2
-            END IF
-         ELSE IF( C3.EQ.'HRD' ) THEN
-            IF( SNAME ) THEN
-               NBMIN = 2
-            ELSE
-               NBMIN = 2
-            END IF
-         ELSE IF( C3.EQ.'BRD' ) THEN
-            IF( SNAME ) THEN
-               NBMIN = 2
-            ELSE
-               NBMIN = 2
-            END IF
-         ELSE IF( C3.EQ.'TRI' ) THEN
-            IF( SNAME ) THEN
-               NBMIN = 2
-            ELSE
-               NBMIN = 2
-            END IF
-         END IF
-      ELSE IF( C2.EQ.'SY' ) THEN
-         IF( C3.EQ.'TRF' ) THEN
-            IF( SNAME ) THEN
-               NBMIN = 8
-            ELSE
-               NBMIN = 8
-            END IF
-         ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN
-            NBMIN = 2
-         END IF
-      ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
-         IF( C3.EQ.'TRD' ) THEN
-            NBMIN = 2
-         END IF
-      ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
-         IF( C3( 1: 1 ).EQ.'G' ) THEN
-            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
-     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
-     $           THEN
-               NBMIN = 2
-            END IF
-         ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
-            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
-     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
-     $           THEN
-               NBMIN = 2
-            END IF
-         END IF
-      ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
-         IF( C3( 1: 1 ).EQ.'G' ) THEN
-            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
-     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
-     $           THEN
-               NBMIN = 2
-            END IF
-         ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
-            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
-     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
-     $           THEN
-               NBMIN = 2
-            END IF
-         END IF
-      END IF
-      ILAENV = NBMIN
-      RETURN
-*
-   70 CONTINUE
-*
-*     ISPEC = 3:  crossover point
-*
-      NX = 0
-      IF( C2.EQ.'GE' ) THEN
-         IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. C3.EQ.
-     $       'QLF' ) THEN
-            IF( SNAME ) THEN
-               NX = 128
-            ELSE
-               NX = 128
-            END IF
-         ELSE IF( C3.EQ.'HRD' ) THEN
-            IF( SNAME ) THEN
-               NX = 128
-            ELSE
-               NX = 128
-            END IF
-         ELSE IF( C3.EQ.'BRD' ) THEN
-            IF( SNAME ) THEN
-               NX = 128
-            ELSE
-               NX = 128
-            END IF
-         END IF
-      ELSE IF( C2.EQ.'SY' ) THEN
-         IF( SNAME .AND. C3.EQ.'TRD' ) THEN
-            NX = 32
-         END IF
-      ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
-         IF( C3.EQ.'TRD' ) THEN
-            NX = 32
-         END IF
-      ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
-         IF( C3( 1: 1 ).EQ.'G' ) THEN
-            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
-     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
-     $           THEN
-               NX = 128
-            END IF
-         END IF
-      ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
-         IF( C3( 1: 1 ).EQ.'G' ) THEN
-            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
-     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
-     $           THEN
-               NX = 128
-            END IF
-         END IF
-      END IF
-      ILAENV = NX
-      RETURN
-*
-   80 CONTINUE
-*
-*     ISPEC = 4:  number of shifts (used by xHSEQR)
-*
-      ILAENV = 6
-      RETURN
-*
-   90 CONTINUE
-*
-*     ISPEC = 5:  minimum column dimension (not used)
-*
-      ILAENV = 2
-      RETURN
-*
-  100 CONTINUE
-*
-*     ISPEC = 6:  crossover point for SVD (used by xGELSS and xGESVD)
-*
-      ILAENV = INT( REAL( MIN( N1, N2 ) )*1.6E0 )
-      RETURN
-*
-  110 CONTINUE
-*
-*     ISPEC = 7:  number of processors (not used)
-*
-      ILAENV = 1
-      RETURN
-*
-  120 CONTINUE
-*
-*     ISPEC = 8:  crossover point for multishift (used by xHSEQR)
-*
-      ILAENV = 50
-      RETURN
-*
-  130 CONTINUE
-*
-*     ISPEC = 9:  maximum size of the subproblems at the bottom of the
-*                 computation tree in the divide-and-conquer algorithm
-*                 (used by xGELSD and xGESDD)
-*
-      ILAENV = 25
-      RETURN
-*
-  140 CONTINUE
-*
-*     ISPEC = 10: ieee NaN arithmetic can be trusted not to trap
-*
-*     ILAENV = 0
-      ILAENV = 1
-      IF( ILAENV.EQ.1 ) THEN
-         ILAENV = IEEECK( 0, 0.0, 1.0 )
-      END IF
-      RETURN
-*
-  150 CONTINUE
-*
-*     ISPEC = 11: infinity arithmetic can be trusted not to trap
-*
-*     ILAENV = 0
-      ILAENV = 1
-      IF( ILAENV.EQ.1 ) THEN
-         ILAENV = IEEECK( 1, 0.0, 1.0 )
-      END IF
-      RETURN
-*
-  160 CONTINUE
-*
-*     12 <= ISPEC <= 16: xHSEQR or one of its subroutines. 
-*
-      ILAENV = IPARMQ( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
-      RETURN
-*
-*     End of ILAENV
-*
-      END
--- a/libcruft/lapack/iparmq.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,253 +0,0 @@
-      INTEGER FUNCTION IPARMQ( ISPEC, NAME, OPTS, N, ILO, IHI, LWORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*     
-*     .. Scalar Arguments ..
-      INTEGER            IHI, ILO, ISPEC, LWORK, N
-      CHARACTER          NAME*( * ), OPTS*( * )
-*
-*  Purpose
-*  =======
-*
-*       This program sets problem and machine dependent parameters
-*       useful for xHSEQR and its subroutines. It is called whenever 
-*       ILAENV is called with 12 <= ISPEC <= 16
-*
-*  Arguments
-*  =========
-*
-*       ISPEC  (input) integer scalar
-*              ISPEC specifies which tunable parameter IPARMQ should
-*              return.
-*
-*              ISPEC=12: (INMIN)  Matrices of order nmin or less
-*                        are sent directly to xLAHQR, the implicit
-*                        double shift QR algorithm.  NMIN must be
-*                        at least 11.
-*
-*              ISPEC=13: (INWIN)  Size of the deflation window.
-*                        This is best set greater than or equal to
-*                        the number of simultaneous shifts NS.
-*                        Larger matrices benefit from larger deflation
-*                        windows.
-*
-*              ISPEC=14: (INIBL) Determines when to stop nibbling and
-*                        invest in an (expensive) multi-shift QR sweep.
-*                        If the aggressive early deflation subroutine
-*                        finds LD converged eigenvalues from an order
-*                        NW deflation window and LD.GT.(NW*NIBBLE)/100,
-*                        then the next QR sweep is skipped and early
-*                        deflation is applied immediately to the
-*                        remaining active diagonal block.  Setting
-*                        IPARMQ(ISPEC=14) = 0 causes TTQRE to skip a
-*                        multi-shift QR sweep whenever early deflation
-*                        finds a converged eigenvalue.  Setting
-*                        IPARMQ(ISPEC=14) greater than or equal to 100
-*                        prevents TTQRE from skipping a multi-shift
-*                        QR sweep.
-*
-*              ISPEC=15: (NSHFTS) The number of simultaneous shifts in
-*                        a multi-shift QR iteration.
-*
-*              ISPEC=16: (IACC22) IPARMQ is set to 0, 1 or 2 with the
-*                        following meanings.
-*                        0:  During the multi-shift QR sweep,
-*                            xLAQR5 does not accumulate reflections and
-*                            does not use matrix-matrix multiply to
-*                            update the far-from-diagonal matrix
-*                            entries.
-*                        1:  During the multi-shift QR sweep,
-*                            xLAQR5 and/or xLAQRaccumulates reflections and uses
-*                            matrix-matrix multiply to update the
-*                            far-from-diagonal matrix entries.
-*                        2:  During the multi-shift QR sweep.
-*                            xLAQR5 accumulates reflections and takes
-*                            advantage of 2-by-2 block structure during
-*                            matrix-matrix multiplies.
-*                        (If xTRMM is slower than xGEMM, then
-*                        IPARMQ(ISPEC=16)=1 may be more efficient than
-*                        IPARMQ(ISPEC=16)=2 despite the greater level of
-*                        arithmetic work implied by the latter choice.)
-*
-*       NAME    (input) character string
-*               Name of the calling subroutine
-*
-*       OPTS    (input) character string
-*               This is a concatenation of the string arguments to
-*               TTQRE.
-*
-*       N       (input) integer scalar
-*               N is the order of the Hessenberg matrix H.
-*
-*       ILO     (input) INTEGER
-*       IHI     (input) INTEGER
-*               It is assumed that H is already upper triangular
-*               in rows and columns 1:ILO-1 and IHI+1:N.
-*
-*       LWORK   (input) integer scalar
-*               The amount of workspace available.
-*
-*  Further Details
-*  ===============
-*
-*       Little is known about how best to choose these parameters.
-*       It is possible to use different values of the parameters
-*       for each of CHSEQR, DHSEQR, SHSEQR and ZHSEQR.
-*
-*       It is probably best to choose different parameters for
-*       different matrices and different parameters at different
-*       times during the iteration, but this has not been
-*       implemented --- yet.
-*
-*
-*       The best choices of most of the parameters depend
-*       in an ill-understood way on the relative execution
-*       rate of xLAQR3 and xLAQR5 and on the nature of each
-*       particular eigenvalue problem.  Experiment may be the
-*       only practical way to determine which choices are most
-*       effective.
-*
-*       Following is a list of default values supplied by IPARMQ.
-*       These defaults may be adjusted in order to attain better
-*       performance in any particular computational environment.
-*
-*       IPARMQ(ISPEC=12) The xLAHQR vs xLAQR0 crossover point.
-*                        Default: 75. (Must be at least 11.)
-*
-*       IPARMQ(ISPEC=13) Recommended deflation window size.
-*                        This depends on ILO, IHI and NS, the
-*                        number of simultaneous shifts returned
-*                        by IPARMQ(ISPEC=15).  The default for
-*                        (IHI-ILO+1).LE.500 is NS.  The default
-*                        for (IHI-ILO+1).GT.500 is 3*NS/2.
-*
-*       IPARMQ(ISPEC=14) Nibble crossover point.  Default: 14.
-*
-*       IPARMQ(ISPEC=15) Number of simultaneous shifts, NS.
-*                        a multi-shift QR iteration.
-*
-*                        If IHI-ILO+1 is ...
-*
-*                        greater than      ...but less    ... the
-*                        or equal to ...      than        default is
-*
-*                                0               30       NS =   2+
-*                               30               60       NS =   4+
-*                               60              150       NS =  10
-*                              150              590       NS =  **
-*                              590             3000       NS =  64
-*                             3000             6000       NS = 128
-*                             6000             infinity   NS = 256
-*
-*                    (+)  By default matrices of this order are
-*                         passed to the implicit double shift routine
-*                         xLAHQR.  See IPARMQ(ISPEC=12) above.   These
-*                         values of NS are used only in case of a rare
-*                         xLAHQR failure.
-*
-*                    (**) The asterisks (**) indicate an ad-hoc
-*                         function increasing from 10 to 64.
-*
-*       IPARMQ(ISPEC=16) Select structured matrix multiply.
-*                        (See ISPEC=16 above for details.)
-*                        Default: 3.
-*
-*     ================================================================
-*     .. Parameters ..
-      INTEGER            INMIN, INWIN, INIBL, ISHFTS, IACC22
-      PARAMETER          ( INMIN = 12, INWIN = 13, INIBL = 14,
-     $                   ISHFTS = 15, IACC22 = 16 )
-      INTEGER            NMIN, K22MIN, KACMIN, NIBBLE, KNWSWP
-      PARAMETER          ( NMIN = 75, K22MIN = 14, KACMIN = 14,
-     $                   NIBBLE = 14, KNWSWP = 500 )
-      REAL               TWO
-      PARAMETER          ( TWO = 2.0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            NH, NS
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          LOG, MAX, MOD, NINT, REAL
-*     ..
-*     .. Executable Statements ..
-      IF( ( ISPEC.EQ.ISHFTS ) .OR. ( ISPEC.EQ.INWIN ) .OR.
-     $    ( ISPEC.EQ.IACC22 ) ) THEN
-*
-*        ==== Set the number simultaneous shifts ====
-*
-         NH = IHI - ILO + 1
-         NS = 2
-         IF( NH.GE.30 )
-     $      NS = 4
-         IF( NH.GE.60 )
-     $      NS = 10
-         IF( NH.GE.150 )
-     $      NS = MAX( 10, NH / NINT( LOG( REAL( NH ) ) / LOG( TWO ) ) )
-         IF( NH.GE.590 )
-     $      NS = 64
-         IF( NH.GE.3000 )
-     $      NS = 128
-         IF( NH.GE.6000 )
-     $      NS = 256
-         NS = MAX( 2, NS-MOD( NS, 2 ) )
-      END IF
-*
-      IF( ISPEC.EQ.INMIN ) THEN
-*
-*
-*        ===== Matrices of order smaller than NMIN get sent
-*        .     to xLAHQR, the classic double shift algorithm.
-*        .     This must be at least 11. ====
-*
-         IPARMQ = NMIN
-*
-      ELSE IF( ISPEC.EQ.INIBL ) THEN
-*
-*        ==== INIBL: skip a multi-shift qr iteration and
-*        .    whenever aggressive early deflation finds
-*        .    at least (NIBBLE*(window size)/100) deflations. ====
-*
-         IPARMQ = NIBBLE
-*
-      ELSE IF( ISPEC.EQ.ISHFTS ) THEN
-*
-*        ==== NSHFTS: The number of simultaneous shifts =====
-*
-         IPARMQ = NS
-*
-      ELSE IF( ISPEC.EQ.INWIN ) THEN
-*
-*        ==== NW: deflation window size.  ====
-*
-         IF( NH.LE.KNWSWP ) THEN
-            IPARMQ = NS
-         ELSE
-            IPARMQ = 3*NS / 2
-         END IF
-*
-      ELSE IF( ISPEC.EQ.IACC22 ) THEN
-*
-*        ==== IACC22: Whether to accumulate reflections
-*        .     before updating the far-from-diagonal elements
-*        .     and whether to use 2-by-2 block structure while
-*        .     doing it.  A small amount of work could be saved
-*        .     by making this choice dependent also upon the
-*        .     NH=IHI-ILO+1.
-*
-         IPARMQ = 0
-         IF( NS.GE.KACMIN )
-     $      IPARMQ = 1
-         IF( NS.GE.K22MIN )
-     $      IPARMQ = 2
-*
-      ELSE
-*        ===== invalid value of ispec =====
-         IPARMQ = -1
-*
-      END IF
-*
-*     ==== End of IPARMQ ====
-*
-      END
--- a/libcruft/lapack/izmax1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,95 +0,0 @@
-      INTEGER          FUNCTION IZMAX1( N, CX, INCX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         CX( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  IZMAX1 finds the index of the element whose real part has maximum
-*  absolute value.
-*
-*  Based on IZAMAX from Level 1 BLAS.
-*  The change is to use the 'genuine' absolute value.
-*
-*  Contributed by Nick Higham for use with ZLACON.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of elements in the vector CX.
-*
-*  CX      (input) COMPLEX*16 array, dimension (N)
-*          The vector whose elements will be summed.
-*
-*  INCX    (input) INTEGER
-*          The spacing between successive values of CX.  INCX >= 1.
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, IX
-      DOUBLE PRECISION   SMAX
-      COMPLEX*16         ZDUM
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Statement Function definitions ..
-*
-*     NEXT LINE IS THE ONLY MODIFICATION.
-      CABS1( ZDUM ) = ABS( ZDUM )
-*     ..
-*     .. Executable Statements ..
-*
-      IZMAX1 = 0
-      IF( N.LT.1 )
-     $   RETURN
-      IZMAX1 = 1
-      IF( N.EQ.1 )
-     $   RETURN
-      IF( INCX.EQ.1 )
-     $   GO TO 30
-*
-*     CODE FOR INCREMENT NOT EQUAL TO 1
-*
-      IX = 1
-      SMAX = CABS1( CX( 1 ) )
-      IX = IX + INCX
-      DO 20 I = 2, N
-         IF( CABS1( CX( IX ) ).LE.SMAX )
-     $      GO TO 10
-         IZMAX1 = I
-         SMAX = CABS1( CX( IX ) )
-   10    CONTINUE
-         IX = IX + INCX
-   20 CONTINUE
-      RETURN
-*
-*     CODE FOR INCREMENT EQUAL TO 1
-*
-   30 CONTINUE
-      SMAX = CABS1( CX( 1 ) )
-      DO 40 I = 2, N
-         IF( CABS1( CX( I ) ).LE.SMAX )
-     $      GO TO 40
-         IZMAX1 = I
-         SMAX = CABS1( CX( I ) )
-   40 CONTINUE
-      RETURN
-*
-*     End of IZMAX1
-*
-      END
--- a/libcruft/lapack/module.mk	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,750 +0,0 @@
-EXTRA_DIST += lapack/module.mk
-
-lapack/dlamc1.lo: FFLAGS += $(F77_FLOAT_STORE_FLAG)
-lapack/slamc1.lo: FFLAGS += $(F77_FLOAT_STORE_FLAG)
-
-LAPACK_SRC = \
-  lapack/cbdsqr.f \
-  lapack/cgbcon.f \
-  lapack/cgbtf2.f \
-  lapack/cgbtrf.f \
-  lapack/cgbtrs.f \
-  lapack/cgbtrs.f \
-  lapack/cgebak.f \
-  lapack/cgebal.f \
-  lapack/cgebd2.f \
-  lapack/cgebrd.f \
-  lapack/cgecon.f \
-  lapack/cgecon.f \
-  lapack/cgeesx.f \
-  lapack/cgeev.f \
-  lapack/cgehd2.f \
-  lapack/cgehrd.f \
-  lapack/cgelq2.f \
-  lapack/cgelq2.f \
-  lapack/cgelqf.f \
-  lapack/cgelsd.f \
-  lapack/cgelss.f \
-  lapack/cgelsy.f \
-  lapack/cgeqp3.f \
-  lapack/cgeqp3.f \
-  lapack/cgeqpf.f \
-  lapack/cgeqr2.f \
-  lapack/cgeqrf.f \
-  lapack/cgesvd.f \
-  lapack/cgesv.f \
-  lapack/cgesv.f \
-  lapack/cgetf2.f \
-  lapack/cgetrf.f \
-  lapack/cgetri.f \
-  lapack/cgetrs.f \
-  lapack/cggbak.f \
-  lapack/cggbak.f \
-  lapack/cggbal.f \
-  lapack/cggev.f \
-  lapack/cgghrd.f \
-  lapack/cgtsv.f \
-  lapack/cgttrf.f \
-  lapack/cgttrf.f \
-  lapack/cgttrs.f \
-  lapack/cgtts2.f \
-  lapack/cheev.f \
-  lapack/chetd2.f \
-  lapack/chetrd.f \
-  lapack/chetrd.f \
-  lapack/chgeqz.f \
-  lapack/chseqr.f \
-  lapack/clabrd.f \
-  lapack/clacgv.f \
-  lapack/clacn2.f \
-  lapack/clacn2.f \
-  lapack/clacon.f \
-  lapack/clacpy.f \
-  lapack/cladiv.f \
-  lapack/clahqr.f \
-  lapack/clahr2.f \
-  lapack/clahr2.f \
-  lapack/clahrd.f \
-  lapack/claic1.f \
-  lapack/clals0.f \
-  lapack/clalsa.f \
-  lapack/clalsd.f \
-  lapack/clalsd.f \
-  lapack/clange.f \
-  lapack/clanhe.f \
-  lapack/clanhs.f \
-  lapack/clantr.f \
-  lapack/claqp2.f \
-  lapack/claqp2.f \
-  lapack/claqps.f \
-  lapack/claqr0.f \
-  lapack/claqr1.f \
-  lapack/claqr2.f \
-  lapack/claqr3.f \
-  lapack/claqr3.f \
-  lapack/claqr4.f \
-  lapack/claqr5.f \
-  lapack/clarfb.f \
-  lapack/clarf.f \
-  lapack/clarfg.f \
-  lapack/clarfg.f \
-  lapack/clarft.f \
-  lapack/clarfx.f \
-  lapack/clartg.f \
-  lapack/clarzb.f \
-  lapack/clarz.f \
-  lapack/clarz.f \
-  lapack/clarzt.f \
-  lapack/clascl.f \
-  lapack/claset.f \
-  lapack/clasr.f \
-  lapack/classq.f \
-  lapack/classq.f \
-  lapack/claswp.f \
-  lapack/clatbs.f \
-  lapack/clatrd.f \
-  lapack/clatrs.f \
-  lapack/clatrz.f \
-  lapack/clatrz.f \
-  lapack/clauu2.f \
-  lapack/clauum.f \
-  lapack/cpbcon.f \
-  lapack/cpbtf2.f \
-  lapack/cpbtrf.f \
-  lapack/cpbtrf.f \
-  lapack/cpbtrs.f \
-  lapack/cpocon.f \
-  lapack/cpotf2.f \
-  lapack/cpotrf.f \
-  lapack/cpotri.f \
-  lapack/cpotri.f \
-  lapack/cpotrs.f \
-  lapack/cptsv.f \
-  lapack/cpttrf.f \
-  lapack/cpttrs.f \
-  lapack/cptts2.f \
-  lapack/cptts2.f \
-  lapack/crot.f \
-  lapack/csrscl.f \
-  lapack/csteqr.f \
-  lapack/ctgevc.f \
-  lapack/ctrcon.f \
-  lapack/ctrcon.f \
-  lapack/ctrevc.f \
-  lapack/ctrexc.f \
-  lapack/ctrsen.f \
-  lapack/ctrsyl.f \
-  lapack/ctrti2.f \
-  lapack/ctrti2.f \
-  lapack/ctrtri.f \
-  lapack/ctrtrs.f \
-  lapack/ctzrzf.f \
-  lapack/cung2l.f \
-  lapack/cung2r.f \
-  lapack/cung2r.f \
-  lapack/cungbr.f \
-  lapack/cunghr.f \
-  lapack/cungl2.f \
-  lapack/cunglq.f \
-  lapack/cungql.f \
-  lapack/cungql.f \
-  lapack/cungqr.f \
-  lapack/cungtr.f \
-  lapack/cunm2r.f \
-  lapack/cunmbr.f \
-  lapack/cunml2.f \
-  lapack/cunml2.f \
-  lapack/cunmlq.f \
-  lapack/cunmqr.f \
-  lapack/cunmr3.f \
-  lapack/cunmrz.f \
-  lapack/dbdsqr.f \
-  lapack/dbdsqr.f \
-  lapack/dgbcon.f \
-  lapack/dgbtf2.f \
-  lapack/dgbtrf.f \
-  lapack/dgbtrs.f \
-  lapack/dgebak.f \
-  lapack/dgebak.f \
-  lapack/dgebal.f \
-  lapack/dgebd2.f \
-  lapack/dgebrd.f \
-  lapack/dgecon.f \
-  lapack/dgeesx.f \
-  lapack/dgeesx.f \
-  lapack/dgeev.f \
-  lapack/dgehd2.f \
-  lapack/dgehrd.f \
-  lapack/dgelq2.f \
-  lapack/dgelqf.f \
-  lapack/dgelqf.f \
-  lapack/dgelsd.f \
-  lapack/dgelss.f \
-  lapack/dgelsy.f \
-  lapack/dgeqp3.f \
-  lapack/dgeqpf.f \
-  lapack/dgeqpf.f \
-  lapack/dgeqr2.f \
-  lapack/dgeqrf.f \
-  lapack/dgesvd.f \
-  lapack/dgesv.f \
-  lapack/dgetf2.f \
-  lapack/dgetf2.f \
-  lapack/dgetrf.f \
-  lapack/dgetri.f \
-  lapack/dgetrs.f \
-  lapack/dggbak.f \
-  lapack/dggbal.f \
-  lapack/dggbal.f \
-  lapack/dggev.f \
-  lapack/dgghrd.f \
-  lapack/dgtsv.f \
-  lapack/dgttrf.f \
-  lapack/dgttrs.f \
-  lapack/dgttrs.f \
-  lapack/dgtts2.f \
-  lapack/dhgeqz.f \
-  lapack/dhseqr.f \
-  lapack/dlabad.f \
-  lapack/dlabrd.f \
-  lapack/dlabrd.f \
-  lapack/dlacn2.f \
-  lapack/dlacon.f \
-  lapack/dlacpy.f \
-  lapack/dladiv.f \
-  lapack/dlae2.f \
-  lapack/dlae2.f \
-  lapack/dlaed6.f \
-  lapack/dlaev2.f \
-  lapack/dlaexc.f \
-  lapack/dlag2.f \
-  lapack/dlahqr.f \
-  lapack/dlahqr.f \
-  lapack/dlahr2.f \
-  lapack/dlahrd.f \
-  lapack/dlaic1.f \
-  lapack/dlaln2.f \
-  lapack/dlals0.f \
-  lapack/dlals0.f \
-  lapack/dlalsa.f \
-  lapack/dlalsd.f \
-  lapack/dlamc1.f \
-  lapack/dlamc2.f \
-  lapack/dlamc3.f \
-  lapack/dlamc3.f \
-  lapack/dlamc4.f \
-  lapack/dlamc5.f \
-  lapack/dlamch.f \
-  lapack/dlamrg.f \
-  lapack/dlange.f \
-  lapack/dlange.f \
-  lapack/dlanhs.f \
-  lapack/dlanst.f \
-  lapack/dlansy.f \
-  lapack/dlantr.f \
-  lapack/dlanv2.f \
-  lapack/dlanv2.f \
-  lapack/dlapy2.f \
-  lapack/dlapy3.f \
-  lapack/dlaqp2.f \
-  lapack/dlaqps.f \
-  lapack/dlaqr0.f \
-  lapack/dlaqr0.f \
-  lapack/dlaqr1.f \
-  lapack/dlaqr2.f \
-  lapack/dlaqr3.f \
-  lapack/dlaqr4.f \
-  lapack/dlaqr5.f \
-  lapack/dlaqr5.f \
-  lapack/dlarfb.f \
-  lapack/dlarf.f \
-  lapack/dlarfg.f \
-  lapack/dlarft.f \
-  lapack/dlarfx.f \
-  lapack/dlarfx.f \
-  lapack/dlartg.f \
-  lapack/dlarzb.f \
-  lapack/dlarz.f \
-  lapack/dlarzt.f \
-  lapack/dlas2.f \
-  lapack/dlas2.f \
-  lapack/dlascl.f \
-  lapack/dlasd0.f \
-  lapack/dlasd1.f \
-  lapack/dlasd2.f \
-  lapack/dlasd3.f \
-  lapack/dlasd3.f \
-  lapack/dlasd4.f \
-  lapack/dlasd5.f \
-  lapack/dlasd6.f \
-  lapack/dlasd7.f \
-  lapack/dlasd8.f \
-  lapack/dlasd8.f \
-  lapack/dlasda.f \
-  lapack/dlasdq.f \
-  lapack/dlasdt.f \
-  lapack/dlaset.f \
-  lapack/dlasq1.f \
-  lapack/dlasq1.f \
-  lapack/dlasq2.f \
-  lapack/dlasq3.f \
-  lapack/dlasq4.f \
-  lapack/dlasq5.f \
-  lapack/dlasq6.f \
-  lapack/dlasq6.f \
-  lapack/dlasr.f \
-  lapack/dlasrt.f \
-  lapack/dlassq.f \
-  lapack/dlasv2.f \
-  lapack/dlaswp.f \
-  lapack/dlaswp.f \
-  lapack/dlasy2.f \
-  lapack/dlatbs.f \
-  lapack/dlatrd.f \
-  lapack/dlatrs.f \
-  lapack/dlatrz.f \
-  lapack/dlatrz.f \
-  lapack/dlauu2.f \
-  lapack/dlauum.f \
-  lapack/dlazq3.f \
-  lapack/dlazq4.f \
-  lapack/dorg2l.f \
-  lapack/dorg2l.f \
-  lapack/dorg2r.f \
-  lapack/dorgbr.f \
-  lapack/dorghr.f \
-  lapack/dorgl2.f \
-  lapack/dorglq.f \
-  lapack/dorglq.f \
-  lapack/dorgql.f \
-  lapack/dorgqr.f \
-  lapack/dorgtr.f \
-  lapack/dorm2r.f \
-  lapack/dormbr.f \
-  lapack/dormbr.f \
-  lapack/dorml2.f \
-  lapack/dormlq.f \
-  lapack/dormqr.f \
-  lapack/dormr3.f \
-  lapack/dormrz.f \
-  lapack/dormrz.f \
-  lapack/dpbcon.f \
-  lapack/dpbtf2.f \
-  lapack/dpbtrf.f \
-  lapack/dpbtrs.f \
-  lapack/dpocon.f \
-  lapack/dpocon.f \
-  lapack/dpotf2.f \
-  lapack/dpotrf.f \
-  lapack/dpotri.f \
-  lapack/dpotrs.f \
-  lapack/dptsv.f \
-  lapack/dptsv.f \
-  lapack/dpttrf.f \
-  lapack/dpttrs.f \
-  lapack/dptts2.f \
-  lapack/drscl.f \
-  lapack/dsteqr.f \
-  lapack/dsteqr.f \
-  lapack/dsterf.f \
-  lapack/dsyev.f \
-  lapack/dsytd2.f \
-  lapack/dsytrd.f \
-  lapack/dtgevc.f \
-  lapack/dtgevc.f \
-  lapack/dtrcon.f \
-  lapack/dtrevc.f \
-  lapack/dtrexc.f \
-  lapack/dtrsen.f \
-  lapack/dtrsyl.f \
-  lapack/dtrsyl.f \
-  lapack/dtrti2.f \
-  lapack/dtrtri.f \
-  lapack/dtrtrs.f \
-  lapack/dtzrzf.f \
-  lapack/dzsum1.f \
-  lapack/dzsum1.f \
-  lapack/icmax1.f \
-  lapack/ieeeck.f \
-  lapack/ilaenv.f \
-  lapack/iparmq.f \
-  lapack/izmax1.f \
-  lapack/izmax1.f \
-  lapack/sbdsqr.f \
-  lapack/scsum1.f \
-  lapack/sgbcon.f \
-  lapack/sgbtf2.f \
-  lapack/sgbtrf.f \
-  lapack/sgbtrf.f \
-  lapack/sgbtrs.f \
-  lapack/sgebak.f \
-  lapack/sgebal.f \
-  lapack/sgebd2.f \
-  lapack/sgebrd.f \
-  lapack/sgebrd.f \
-  lapack/sgecon.f \
-  lapack/sgeesx.f \
-  lapack/sgeev.f \
-  lapack/sgehd2.f \
-  lapack/sgehrd.f \
-  lapack/sgehrd.f \
-  lapack/sgelq2.f \
-  lapack/sgelqf.f \
-  lapack/sgelsd.f \
-  lapack/sgelss.f \
-  lapack/sgelsy.f \
-  lapack/sgelsy.f \
-  lapack/sgeqp3.f \
-  lapack/sgeqpf.f \
-  lapack/sgeqr2.f \
-  lapack/sgeqrf.f \
-  lapack/sgesvd.f \
-  lapack/sgesvd.f \
-  lapack/sgesv.f \
-  lapack/sgetf2.f \
-  lapack/sgetrf.f \
-  lapack/sgetri.f \
-  lapack/sgetrs.f \
-  lapack/sgetrs.f \
-  lapack/sggbak.f \
-  lapack/sggbal.f \
-  lapack/sggev.f \
-  lapack/sgghrd.f \
-  lapack/sgtsv.f \
-  lapack/sgtsv.f \
-  lapack/sgttrf.f \
-  lapack/sgttrs.f \
-  lapack/sgtts2.f \
-  lapack/shgeqz.f \
-  lapack/shseqr.f \
-  lapack/shseqr.f \
-  lapack/slabad.f \
-  lapack/slabrd.f \
-  lapack/slacn2.f \
-  lapack/slacon.f \
-  lapack/slacpy.f \
-  lapack/slacpy.f \
-  lapack/sladiv.f \
-  lapack/slae2.f \
-  lapack/slaed6.f \
-  lapack/slaev2.f \
-  lapack/slaexc.f \
-  lapack/slaexc.f \
-  lapack/slag2.f \
-  lapack/slahqr.f \
-  lapack/slahr2.f \
-  lapack/slahrd.f \
-  lapack/slaic1.f \
-  lapack/slaic1.f \
-  lapack/slaln2.f \
-  lapack/slals0.f \
-  lapack/slalsa.f \
-  lapack/slalsd.f \
-  lapack/slamc1.f \
-  lapack/slamc1.f \
-  lapack/slamc2.f \
-  lapack/slamc3.f \
-  lapack/slamc4.f \
-  lapack/slamc5.f \
-  lapack/slamch.f \
-  lapack/slamch.f \
-  lapack/slamrg.f \
-  lapack/slange.f \
-  lapack/slanhs.f \
-  lapack/slanst.f \
-  lapack/slansy.f \
-  lapack/slansy.f \
-  lapack/slantr.f \
-  lapack/slanv2.f \
-  lapack/slapy2.f \
-  lapack/slapy3.f \
-  lapack/slaqp2.f \
-  lapack/slaqp2.f \
-  lapack/slaqps.f \
-  lapack/slaqr0.f \
-  lapack/slaqr1.f \
-  lapack/slaqr2.f \
-  lapack/slaqr3.f \
-  lapack/slaqr3.f \
-  lapack/slaqr4.f \
-  lapack/slaqr5.f \
-  lapack/slarfb.f \
-  lapack/slarf.f \
-  lapack/slarfg.f \
-  lapack/slarfg.f \
-  lapack/slarft.f \
-  lapack/slarfx.f \
-  lapack/slartg.f \
-  lapack/slarzb.f \
-  lapack/slarz.f \
-  lapack/slarz.f \
-  lapack/slarzt.f \
-  lapack/slas2.f \
-  lapack/slascl.f \
-  lapack/slasd0.f \
-  lapack/slasd1.f \
-  lapack/slasd1.f \
-  lapack/slasd2.f \
-  lapack/slasd3.f \
-  lapack/slasd4.f \
-  lapack/slasd5.f \
-  lapack/slasd6.f \
-  lapack/slasd6.f \
-  lapack/slasd7.f \
-  lapack/slasd8.f \
-  lapack/slasda.f \
-  lapack/slasdq.f \
-  lapack/slasdt.f \
-  lapack/slasdt.f \
-  lapack/slaset.f \
-  lapack/slasq1.f \
-  lapack/slasq2.f \
-  lapack/slasq3.f \
-  lapack/slasq4.f \
-  lapack/slasq4.f \
-  lapack/slasq5.f \
-  lapack/slasq6.f \
-  lapack/slasr.f \
-  lapack/slasrt.f \
-  lapack/slassq.f \
-  lapack/slassq.f \
-  lapack/slasv2.f \
-  lapack/slaswp.f \
-  lapack/slasy2.f \
-  lapack/slatbs.f \
-  lapack/slatrd.f \
-  lapack/slatrd.f \
-  lapack/slatrs.f \
-  lapack/slatrz.f \
-  lapack/slauu2.f \
-  lapack/slauum.f \
-  lapack/slazq3.f \
-  lapack/slazq3.f \
-  lapack/slazq4.f \
-  lapack/sorg2l.f \
-  lapack/sorg2r.f \
-  lapack/sorgbr.f \
-  lapack/sorghr.f \
-  lapack/sorghr.f \
-  lapack/sorgl2.f \
-  lapack/sorglq.f \
-  lapack/sorgql.f \
-  lapack/sorgqr.f \
-  lapack/sorgtr.f \
-  lapack/sorgtr.f \
-  lapack/sorm2r.f \
-  lapack/sormbr.f \
-  lapack/sorml2.f \
-  lapack/sormlq.f \
-  lapack/sormqr.f \
-  lapack/sormqr.f \
-  lapack/sormr3.f \
-  lapack/sormrz.f \
-  lapack/spbcon.f \
-  lapack/spbtf2.f \
-  lapack/spbtrf.f \
-  lapack/spbtrf.f \
-  lapack/spbtrs.f \
-  lapack/spocon.f \
-  lapack/spotf2.f \
-  lapack/spotrf.f \
-  lapack/spotri.f \
-  lapack/spotri.f \
-  lapack/spotrs.f \
-  lapack/sptsv.f \
-  lapack/spttrf.f \
-  lapack/spttrs.f \
-  lapack/sptts2.f \
-  lapack/sptts2.f \
-  lapack/srscl.f \
-  lapack/ssteqr.f \
-  lapack/ssterf.f \
-  lapack/ssyev.f \
-  lapack/ssytd2.f \
-  lapack/ssytd2.f \
-  lapack/ssytrd.f \
-  lapack/stgevc.f \
-  lapack/strcon.f \
-  lapack/strevc.f \
-  lapack/strexc.f \
-  lapack/strexc.f \
-  lapack/strsen.f \
-  lapack/strsyl.f \
-  lapack/strti2.f \
-  lapack/strtri.f \
-  lapack/strtrs.f \
-  lapack/strtrs.f \
-  lapack/stzrzf.f \
-  lapack/zbdsqr.f \
-  lapack/zdrscl.f \
-  lapack/zgbcon.f \
-  lapack/zgbtf2.f \
-  lapack/zgbtf2.f \
-  lapack/zgbtrf.f \
-  lapack/zgbtrs.f \
-  lapack/zgebak.f \
-  lapack/zgebal.f \
-  lapack/zgebd2.f \
-  lapack/zgebd2.f \
-  lapack/zgebrd.f \
-  lapack/zgecon.f \
-  lapack/zgeesx.f \
-  lapack/zgeev.f \
-  lapack/zgehd2.f \
-  lapack/zgehd2.f \
-  lapack/zgehrd.f \
-  lapack/zgelq2.f \
-  lapack/zgelqf.f \
-  lapack/zgelsd.f \
-  lapack/zgelss.f \
-  lapack/zgelss.f \
-  lapack/zgelsy.f \
-  lapack/zgeqp3.f \
-  lapack/zgeqpf.f \
-  lapack/zgeqr2.f \
-  lapack/zgeqrf.f \
-  lapack/zgeqrf.f \
-  lapack/zgesvd.f \
-  lapack/zgesv.f \
-  lapack/zgetf2.f \
-  lapack/zgetrf.f \
-  lapack/zgetri.f \
-  lapack/zgetri.f \
-  lapack/zgetrs.f \
-  lapack/zggbak.f \
-  lapack/zggbal.f \
-  lapack/zggev.f \
-  lapack/zgghrd.f \
-  lapack/zgghrd.f \
-  lapack/zgtsv.f \
-  lapack/zgttrf.f \
-  lapack/zgttrs.f \
-  lapack/zgtts2.f \
-  lapack/zheev.f \
-  lapack/zheev.f \
-  lapack/zhetd2.f \
-  lapack/zhetrd.f \
-  lapack/zhgeqz.f \
-  lapack/zhseqr.f \
-  lapack/zlabrd.f \
-  lapack/zlabrd.f \
-  lapack/zlacgv.f \
-  lapack/zlacn2.f \
-  lapack/zlacon.f \
-  lapack/zlacpy.f \
-  lapack/zladiv.f \
-  lapack/zladiv.f \
-  lapack/zlahqr.f \
-  lapack/zlahr2.f \
-  lapack/zlahrd.f \
-  lapack/zlaic1.f \
-  lapack/zlals0.f \
-  lapack/zlals0.f \
-  lapack/zlalsa.f \
-  lapack/zlalsd.f \
-  lapack/zlange.f \
-  lapack/zlanhe.f \
-  lapack/zlanhs.f \
-  lapack/zlanhs.f \
-  lapack/zlantr.f \
-  lapack/zlaqp2.f \
-  lapack/zlaqps.f \
-  lapack/zlaqr0.f \
-  lapack/zlaqr1.f \
-  lapack/zlaqr1.f \
-  lapack/zlaqr2.f \
-  lapack/zlaqr3.f \
-  lapack/zlaqr4.f \
-  lapack/zlaqr5.f \
-  lapack/zlarfb.f \
-  lapack/zlarfb.f \
-  lapack/zlarf.f \
-  lapack/zlarfg.f \
-  lapack/zlarft.f \
-  lapack/zlarfx.f \
-  lapack/zlartg.f \
-  lapack/zlartg.f \
-  lapack/zlarzb.f \
-  lapack/zlarz.f \
-  lapack/zlarzt.f \
-  lapack/zlascl.f \
-  lapack/zlaset.f \
-  lapack/zlaset.f \
-  lapack/zlasr.f \
-  lapack/zlassq.f \
-  lapack/zlaswp.f \
-  lapack/zlatbs.f \
-  lapack/zlatrd.f \
-  lapack/zlatrd.f \
-  lapack/zlatrs.f \
-  lapack/zlatrz.f \
-  lapack/zlauu2.f \
-  lapack/zlauum.f \
-  lapack/zpbcon.f \
-  lapack/zpbcon.f \
-  lapack/zpbtf2.f \
-  lapack/zpbtrf.f \
-  lapack/zpbtrs.f \
-  lapack/zpocon.f \
-  lapack/zpotf2.f \
-  lapack/zpotf2.f \
-  lapack/zpotrf.f \
-  lapack/zpotri.f \
-  lapack/zpotrs.f \
-  lapack/zptsv.f \
-  lapack/zpttrf.f \
-  lapack/zpttrf.f \
-  lapack/zpttrs.f \
-  lapack/zptts2.f \
-  lapack/zrot.f \
-  lapack/zsteqr.f \
-  lapack/ztgevc.f \
-  lapack/ztgevc.f \
-  lapack/ztrcon.f \
-  lapack/ztrevc.f \
-  lapack/ztrexc.f \
-  lapack/ztrsen.f \
-  lapack/ztrsyl.f \
-  lapack/ztrsyl.f \
-  lapack/ztrti2.f \
-  lapack/ztrtri.f \
-  lapack/ztrtrs.f \
-  lapack/ztzrzf.f \
-  lapack/zung2l.f \
-  lapack/zung2l.f \
-  lapack/zung2r.f \
-  lapack/zungbr.f \
-  lapack/zunghr.f \
-  lapack/zungl2.f \
-  lapack/zunglq.f \
-  lapack/zunglq.f \
-  lapack/zungql.f \
-  lapack/zungqr.f \
-  lapack/zungtr.f \
-  lapack/zunm2r.f \
-  lapack/zunmbr.f \
-  lapack/zunmbr.f \
-  lapack/zunml2.f \
-  lapack/zunmlq.f \
-  lapack/zunmqr.f \
-  lapack/zunmr3.f \
-  lapack/zunmrz.f \
-  lapack/zunmrz.f \
-  lapack/chegs2.f \
-  lapack/chegst.f \
-  lapack/chegv.f \
-  lapack/dsygs2.f \
-  lapack/dsygst.f \
-  lapack/dsygv.f \
-  lapack/ssygs2.f \
-  lapack/ssygst.f \
-  lapack/ssygv.f \
-  lapack/zhegs2.f \
-  lapack/zhegst.f \
-  lapack/zhegv.f
-
-if AMCOND_HAVE_LAPACK
-  EXTRA_DIST += $(LAPACK_SRC)
-else
-  libcruft_la_SOURCES += $(LAPACK_SRC)
-endif
--- a/libcruft/lapack/sbdsqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,742 +0,0 @@
-      SUBROUTINE SBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
-     $                   LDU, C, LDC, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     January 2007
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU
-*     ..
-*     .. Array Arguments ..
-      REAL               C( LDC, * ), D( * ), E( * ), U( LDU, * ),
-     $                   VT( LDVT, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SBDSQR computes the singular values and, optionally, the right and/or
-*  left singular vectors from the singular value decomposition (SVD) of
-*  a real N-by-N (upper or lower) bidiagonal matrix B using the implicit
-*  zero-shift QR algorithm.  The SVD of B has the form
-*  
-*     B = Q * S * P**T
-*  
-*  where S is the diagonal matrix of singular values, Q is an orthogonal
-*  matrix of left singular vectors, and P is an orthogonal matrix of
-*  right singular vectors.  If left singular vectors are requested, this
-*  subroutine actually returns U*Q instead of Q, and, if right singular
-*  vectors are requested, this subroutine returns P**T*VT instead of
-*  P**T, for given real input matrices U and VT.  When U and VT are the
-*  orthogonal matrices that reduce a general matrix A to bidiagonal
-*  form:  A = U*B*VT, as computed by SGEBRD, then
-* 
-*     A = (U*Q) * S * (P**T*VT)
-* 
-*  is the SVD of A.  Optionally, the subroutine may also compute Q**T*C
-*  for a given real input matrix C.
-*
-*  See "Computing  Small Singular Values of Bidiagonal Matrices With
-*  Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan,
-*  LAPACK Working Note #3 (or SIAM J. Sci. Statist. Comput. vol. 11,
-*  no. 5, pp. 873-912, Sept 1990) and
-*  "Accurate singular values and differential qd algorithms," by
-*  B. Parlett and V. Fernando, Technical Report CPAM-554, Mathematics
-*  Department, University of California at Berkeley, July 1992
-*  for a detailed description of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  B is upper bidiagonal;
-*          = 'L':  B is lower bidiagonal.
-*
-*  N       (input) INTEGER
-*          The order of the matrix B.  N >= 0.
-*
-*  NCVT    (input) INTEGER
-*          The number of columns of the matrix VT. NCVT >= 0.
-*
-*  NRU     (input) INTEGER
-*          The number of rows of the matrix U. NRU >= 0.
-*
-*  NCC     (input) INTEGER
-*          The number of columns of the matrix C. NCC >= 0.
-*
-*  D       (input/output) REAL array, dimension (N)
-*          On entry, the n diagonal elements of the bidiagonal matrix B.
-*          On exit, if INFO=0, the singular values of B in decreasing
-*          order.
-*
-*  E       (input/output) REAL array, dimension (N-1)
-*          On entry, the N-1 offdiagonal elements of the bidiagonal
-*          matrix B.
-*          On exit, if INFO = 0, E is destroyed; if INFO > 0, D and E
-*          will contain the diagonal and superdiagonal elements of a
-*          bidiagonal matrix orthogonally equivalent to the one given
-*          as input.
-*
-*  VT      (input/output) REAL array, dimension (LDVT, NCVT)
-*          On entry, an N-by-NCVT matrix VT.
-*          On exit, VT is overwritten by P**T * VT.
-*          Not referenced if NCVT = 0.
-*
-*  LDVT    (input) INTEGER
-*          The leading dimension of the array VT.
-*          LDVT >= max(1,N) if NCVT > 0; LDVT >= 1 if NCVT = 0.
-*
-*  U       (input/output) REAL array, dimension (LDU, N)
-*          On entry, an NRU-by-N matrix U.
-*          On exit, U is overwritten by U * Q.
-*          Not referenced if NRU = 0.
-*
-*  LDU     (input) INTEGER
-*          The leading dimension of the array U.  LDU >= max(1,NRU).
-*
-*  C       (input/output) REAL array, dimension (LDC, NCC)
-*          On entry, an N-by-NCC matrix C.
-*          On exit, C is overwritten by Q**T * C.
-*          Not referenced if NCC = 0.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C.
-*          LDC >= max(1,N) if NCC > 0; LDC >=1 if NCC = 0.
-*
-*  WORK    (workspace) REAL array, dimension (2*N)
-*          if NCVT = NRU = NCC = 0, (max(1, 4*N)) otherwise
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  If INFO = -i, the i-th argument had an illegal value
-*          > 0:  the algorithm did not converge; D and E contain the
-*                elements of a bidiagonal matrix which is orthogonally
-*                similar to the input matrix B;  if INFO = i, i
-*                elements of E have not converged to zero.
-*
-*  Internal Parameters
-*  ===================
-*
-*  TOLMUL  REAL, default = max(10,min(100,EPS**(-1/8)))
-*          TOLMUL controls the convergence criterion of the QR loop.
-*          If it is positive, TOLMUL*EPS is the desired relative
-*             precision in the computed singular values.
-*          If it is negative, abs(TOLMUL*EPS*sigma_max) is the
-*             desired absolute accuracy in the computed singular
-*             values (corresponds to relative accuracy
-*             abs(TOLMUL*EPS) in the largest singular value.
-*          abs(TOLMUL) should be between 1 and 1/EPS, and preferably
-*             between 10 (for fast convergence) and .1/EPS
-*             (for there to be some accuracy in the results).
-*          Default is to lose at either one eighth or 2 of the
-*             available decimal digits in each computed singular value
-*             (whichever is smaller).
-*
-*  MAXITR  INTEGER, default = 6
-*          MAXITR controls the maximum number of passes of the
-*          algorithm through its inner loop. The algorithms stops
-*          (and so fails to converge) if the number of passes
-*          through the inner loop exceeds MAXITR*N**2.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E0 )
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E0 )
-      REAL               NEGONE
-      PARAMETER          ( NEGONE = -1.0E0 )
-      REAL               HNDRTH
-      PARAMETER          ( HNDRTH = 0.01E0 )
-      REAL               TEN
-      PARAMETER          ( TEN = 10.0E0 )
-      REAL               HNDRD
-      PARAMETER          ( HNDRD = 100.0E0 )
-      REAL               MEIGTH
-      PARAMETER          ( MEIGTH = -0.125E0 )
-      INTEGER            MAXITR
-      PARAMETER          ( MAXITR = 6 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LOWER, ROTATE
-      INTEGER            I, IDIR, ISUB, ITER, J, LL, LLL, M, MAXIT, NM1,
-     $                   NM12, NM13, OLDLL, OLDM
-      REAL               ABSE, ABSS, COSL, COSR, CS, EPS, F, G, H, MU,
-     $                   OLDCS, OLDSN, R, SHIFT, SIGMN, SIGMX, SINL,
-     $                   SINR, SLL, SMAX, SMIN, SMINL,  SMINOA,
-     $                   SN, THRESH, TOL, TOLMUL, UNFL
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               SLAMCH
-      EXTERNAL           LSAME, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARTG, SLAS2, SLASQ1, SLASR, SLASV2, SROT,
-     $                   SSCAL, SSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, REAL, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      LOWER = LSAME( UPLO, 'L' )
-      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LOWER ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NCVT.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( NRU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( NCC.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( ( NCVT.EQ.0 .AND. LDVT.LT.1 ) .OR.
-     $         ( NCVT.GT.0 .AND. LDVT.LT.MAX( 1, N ) ) ) THEN
-         INFO = -9
-      ELSE IF( LDU.LT.MAX( 1, NRU ) ) THEN
-         INFO = -11
-      ELSE IF( ( NCC.EQ.0 .AND. LDC.LT.1 ) .OR.
-     $         ( NCC.GT.0 .AND. LDC.LT.MAX( 1, N ) ) ) THEN
-         INFO = -13
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SBDSQR', -INFO )
-         RETURN
-      END IF
-      IF( N.EQ.0 )
-     $   RETURN
-      IF( N.EQ.1 )
-     $   GO TO 160
-*
-*     ROTATE is true if any singular vectors desired, false otherwise
-*
-      ROTATE = ( NCVT.GT.0 ) .OR. ( NRU.GT.0 ) .OR. ( NCC.GT.0 )
-*
-*     If no singular vectors desired, use qd algorithm
-*
-      IF( .NOT.ROTATE ) THEN
-         CALL SLASQ1( N, D, E, WORK, INFO )
-         RETURN
-      END IF
-*
-      NM1 = N - 1
-      NM12 = NM1 + NM1
-      NM13 = NM12 + NM1
-      IDIR = 0
-*
-*     Get machine constants
-*
-      EPS = SLAMCH( 'Epsilon' )
-      UNFL = SLAMCH( 'Safe minimum' )
-*
-*     If matrix lower bidiagonal, rotate to be upper bidiagonal
-*     by applying Givens rotations on the left
-*
-      IF( LOWER ) THEN
-         DO 10 I = 1, N - 1
-            CALL SLARTG( D( I ), E( I ), CS, SN, R )
-            D( I ) = R
-            E( I ) = SN*D( I+1 )
-            D( I+1 ) = CS*D( I+1 )
-            WORK( I ) = CS
-            WORK( NM1+I ) = SN
-   10    CONTINUE
-*
-*        Update singular vectors if desired
-*
-         IF( NRU.GT.0 )
-     $      CALL SLASR( 'R', 'V', 'F', NRU, N, WORK( 1 ), WORK( N ), U,
-     $                  LDU )
-         IF( NCC.GT.0 )
-     $      CALL SLASR( 'L', 'V', 'F', N, NCC, WORK( 1 ), WORK( N ), C,
-     $                  LDC )
-      END IF
-*
-*     Compute singular values to relative accuracy TOL
-*     (By setting TOL to be negative, algorithm will compute
-*     singular values to absolute accuracy ABS(TOL)*norm(input matrix))
-*
-      TOLMUL = MAX( TEN, MIN( HNDRD, EPS**MEIGTH ) )
-      TOL = TOLMUL*EPS
-*
-*     Compute approximate maximum, minimum singular values
-*
-      SMAX = ZERO
-      DO 20 I = 1, N
-         SMAX = MAX( SMAX, ABS( D( I ) ) )
-   20 CONTINUE
-      DO 30 I = 1, N - 1
-         SMAX = MAX( SMAX, ABS( E( I ) ) )
-   30 CONTINUE
-      SMINL = ZERO
-      IF( TOL.GE.ZERO ) THEN
-*
-*        Relative accuracy desired
-*
-         SMINOA = ABS( D( 1 ) )
-         IF( SMINOA.EQ.ZERO )
-     $      GO TO 50
-         MU = SMINOA
-         DO 40 I = 2, N
-            MU = ABS( D( I ) )*( MU / ( MU+ABS( E( I-1 ) ) ) )
-            SMINOA = MIN( SMINOA, MU )
-            IF( SMINOA.EQ.ZERO )
-     $         GO TO 50
-   40    CONTINUE
-   50    CONTINUE
-         SMINOA = SMINOA / SQRT( REAL( N ) )
-         THRESH = MAX( TOL*SMINOA, MAXITR*N*N*UNFL )
-      ELSE
-*
-*        Absolute accuracy desired
-*
-         THRESH = MAX( ABS( TOL )*SMAX, MAXITR*N*N*UNFL )
-      END IF
-*
-*     Prepare for main iteration loop for the singular values
-*     (MAXIT is the maximum number of passes through the inner
-*     loop permitted before nonconvergence signalled.)
-*
-      MAXIT = MAXITR*N*N
-      ITER = 0
-      OLDLL = -1
-      OLDM = -1
-*
-*     M points to last element of unconverged part of matrix
-*
-      M = N
-*
-*     Begin main iteration loop
-*
-   60 CONTINUE
-*
-*     Check for convergence or exceeding iteration count
-*
-      IF( M.LE.1 )
-     $   GO TO 160
-      IF( ITER.GT.MAXIT )
-     $   GO TO 200
-*
-*     Find diagonal block of matrix to work on
-*
-      IF( TOL.LT.ZERO .AND. ABS( D( M ) ).LE.THRESH )
-     $   D( M ) = ZERO
-      SMAX = ABS( D( M ) )
-      SMIN = SMAX
-      DO 70 LLL = 1, M - 1
-         LL = M - LLL
-         ABSS = ABS( D( LL ) )
-         ABSE = ABS( E( LL ) )
-         IF( TOL.LT.ZERO .AND. ABSS.LE.THRESH )
-     $      D( LL ) = ZERO
-         IF( ABSE.LE.THRESH )
-     $      GO TO 80
-         SMIN = MIN( SMIN, ABSS )
-         SMAX = MAX( SMAX, ABSS, ABSE )
-   70 CONTINUE
-      LL = 0
-      GO TO 90
-   80 CONTINUE
-      E( LL ) = ZERO
-*
-*     Matrix splits since E(LL) = 0
-*
-      IF( LL.EQ.M-1 ) THEN
-*
-*        Convergence of bottom singular value, return to top of loop
-*
-         M = M - 1
-         GO TO 60
-      END IF
-   90 CONTINUE
-      LL = LL + 1
-*
-*     E(LL) through E(M-1) are nonzero, E(LL-1) is zero
-*
-      IF( LL.EQ.M-1 ) THEN
-*
-*        2 by 2 block, handle separately
-*
-         CALL SLASV2( D( M-1 ), E( M-1 ), D( M ), SIGMN, SIGMX, SINR,
-     $                COSR, SINL, COSL )
-         D( M-1 ) = SIGMX
-         E( M-1 ) = ZERO
-         D( M ) = SIGMN
-*
-*        Compute singular vectors, if desired
-*
-         IF( NCVT.GT.0 )
-     $      CALL SROT( NCVT, VT( M-1, 1 ), LDVT, VT( M, 1 ), LDVT, COSR,
-     $                 SINR )
-         IF( NRU.GT.0 )
-     $      CALL SROT( NRU, U( 1, M-1 ), 1, U( 1, M ), 1, COSL, SINL )
-         IF( NCC.GT.0 )
-     $      CALL SROT( NCC, C( M-1, 1 ), LDC, C( M, 1 ), LDC, COSL,
-     $                 SINL )
-         M = M - 2
-         GO TO 60
-      END IF
-*
-*     If working on new submatrix, choose shift direction
-*     (from larger end diagonal element towards smaller)
-*
-      IF( LL.GT.OLDM .OR. M.LT.OLDLL ) THEN
-         IF( ABS( D( LL ) ).GE.ABS( D( M ) ) ) THEN
-*
-*           Chase bulge from top (big end) to bottom (small end)
-*
-            IDIR = 1
-         ELSE
-*
-*           Chase bulge from bottom (big end) to top (small end)
-*
-            IDIR = 2
-         END IF
-      END IF
-*
-*     Apply convergence tests
-*
-      IF( IDIR.EQ.1 ) THEN
-*
-*        Run convergence test in forward direction
-*        First apply standard test to bottom of matrix
-*
-         IF( ABS( E( M-1 ) ).LE.ABS( TOL )*ABS( D( M ) ) .OR.
-     $       ( TOL.LT.ZERO .AND. ABS( E( M-1 ) ).LE.THRESH ) ) THEN
-            E( M-1 ) = ZERO
-            GO TO 60
-         END IF
-*
-         IF( TOL.GE.ZERO ) THEN
-*
-*           If relative accuracy desired,
-*           apply convergence criterion forward
-*
-            MU = ABS( D( LL ) )
-            SMINL = MU
-            DO 100 LLL = LL, M - 1
-               IF( ABS( E( LLL ) ).LE.TOL*MU ) THEN
-                  E( LLL ) = ZERO
-                  GO TO 60
-               END IF
-               MU = ABS( D( LLL+1 ) )*( MU / ( MU+ABS( E( LLL ) ) ) )
-               SMINL = MIN( SMINL, MU )
-  100       CONTINUE
-         END IF
-*
-      ELSE
-*
-*        Run convergence test in backward direction
-*        First apply standard test to top of matrix
-*
-         IF( ABS( E( LL ) ).LE.ABS( TOL )*ABS( D( LL ) ) .OR.
-     $       ( TOL.LT.ZERO .AND. ABS( E( LL ) ).LE.THRESH ) ) THEN
-            E( LL ) = ZERO
-            GO TO 60
-         END IF
-*
-         IF( TOL.GE.ZERO ) THEN
-*
-*           If relative accuracy desired,
-*           apply convergence criterion backward
-*
-            MU = ABS( D( M ) )
-            SMINL = MU
-            DO 110 LLL = M - 1, LL, -1
-               IF( ABS( E( LLL ) ).LE.TOL*MU ) THEN
-                  E( LLL ) = ZERO
-                  GO TO 60
-               END IF
-               MU = ABS( D( LLL ) )*( MU / ( MU+ABS( E( LLL ) ) ) )
-               SMINL = MIN( SMINL, MU )
-  110       CONTINUE
-         END IF
-      END IF
-      OLDLL = LL
-      OLDM = M
-*
-*     Compute shift.  First, test if shifting would ruin relative
-*     accuracy, and if so set the shift to zero.
-*
-      IF( TOL.GE.ZERO .AND. N*TOL*( SMINL / SMAX ).LE.
-     $    MAX( EPS, HNDRTH*TOL ) ) THEN
-*
-*        Use a zero shift to avoid loss of relative accuracy
-*
-         SHIFT = ZERO
-      ELSE
-*
-*        Compute the shift from 2-by-2 block at end of matrix
-*
-         IF( IDIR.EQ.1 ) THEN
-            SLL = ABS( D( LL ) )
-            CALL SLAS2( D( M-1 ), E( M-1 ), D( M ), SHIFT, R )
-         ELSE
-            SLL = ABS( D( M ) )
-            CALL SLAS2( D( LL ), E( LL ), D( LL+1 ), SHIFT, R )
-         END IF
-*
-*        Test if shift negligible, and if so set to zero
-*
-         IF( SLL.GT.ZERO ) THEN
-            IF( ( SHIFT / SLL )**2.LT.EPS )
-     $         SHIFT = ZERO
-         END IF
-      END IF
-*
-*     Increment iteration count
-*
-      ITER = ITER + M - LL
-*
-*     If SHIFT = 0, do simplified QR iteration
-*
-      IF( SHIFT.EQ.ZERO ) THEN
-         IF( IDIR.EQ.1 ) THEN
-*
-*           Chase bulge from top to bottom
-*           Save cosines and sines for later singular vector updates
-*
-            CS = ONE
-            OLDCS = ONE
-            DO 120 I = LL, M - 1
-               CALL SLARTG( D( I )*CS, E( I ), CS, SN, R )
-               IF( I.GT.LL )
-     $            E( I-1 ) = OLDSN*R
-               CALL SLARTG( OLDCS*R, D( I+1 )*SN, OLDCS, OLDSN, D( I ) )
-               WORK( I-LL+1 ) = CS
-               WORK( I-LL+1+NM1 ) = SN
-               WORK( I-LL+1+NM12 ) = OLDCS
-               WORK( I-LL+1+NM13 ) = OLDSN
-  120       CONTINUE
-            H = D( M )*CS
-            D( M ) = H*OLDCS
-            E( M-1 ) = H*OLDSN
-*
-*           Update singular vectors
-*
-            IF( NCVT.GT.0 )
-     $         CALL SLASR( 'L', 'V', 'F', M-LL+1, NCVT, WORK( 1 ),
-     $                     WORK( N ), VT( LL, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL SLASR( 'R', 'V', 'F', NRU, M-LL+1, WORK( NM12+1 ),
-     $                     WORK( NM13+1 ), U( 1, LL ), LDU )
-            IF( NCC.GT.0 )
-     $         CALL SLASR( 'L', 'V', 'F', M-LL+1, NCC, WORK( NM12+1 ),
-     $                     WORK( NM13+1 ), C( LL, 1 ), LDC )
-*
-*           Test convergence
-*
-            IF( ABS( E( M-1 ) ).LE.THRESH )
-     $         E( M-1 ) = ZERO
-*
-         ELSE
-*
-*           Chase bulge from bottom to top
-*           Save cosines and sines for later singular vector updates
-*
-            CS = ONE
-            OLDCS = ONE
-            DO 130 I = M, LL + 1, -1
-               CALL SLARTG( D( I )*CS, E( I-1 ), CS, SN, R )
-               IF( I.LT.M )
-     $            E( I ) = OLDSN*R
-               CALL SLARTG( OLDCS*R, D( I-1 )*SN, OLDCS, OLDSN, D( I ) )
-               WORK( I-LL ) = CS
-               WORK( I-LL+NM1 ) = -SN
-               WORK( I-LL+NM12 ) = OLDCS
-               WORK( I-LL+NM13 ) = -OLDSN
-  130       CONTINUE
-            H = D( LL )*CS
-            D( LL ) = H*OLDCS
-            E( LL ) = H*OLDSN
-*
-*           Update singular vectors
-*
-            IF( NCVT.GT.0 )
-     $         CALL SLASR( 'L', 'V', 'B', M-LL+1, NCVT, WORK( NM12+1 ),
-     $                     WORK( NM13+1 ), VT( LL, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL SLASR( 'R', 'V', 'B', NRU, M-LL+1, WORK( 1 ),
-     $                     WORK( N ), U( 1, LL ), LDU )
-            IF( NCC.GT.0 )
-     $         CALL SLASR( 'L', 'V', 'B', M-LL+1, NCC, WORK( 1 ),
-     $                     WORK( N ), C( LL, 1 ), LDC )
-*
-*           Test convergence
-*
-            IF( ABS( E( LL ) ).LE.THRESH )
-     $         E( LL ) = ZERO
-         END IF
-      ELSE
-*
-*        Use nonzero shift
-*
-         IF( IDIR.EQ.1 ) THEN
-*
-*           Chase bulge from top to bottom
-*           Save cosines and sines for later singular vector updates
-*
-            F = ( ABS( D( LL ) )-SHIFT )*
-     $          ( SIGN( ONE, D( LL ) )+SHIFT / D( LL ) )
-            G = E( LL )
-            DO 140 I = LL, M - 1
-               CALL SLARTG( F, G, COSR, SINR, R )
-               IF( I.GT.LL )
-     $            E( I-1 ) = R
-               F = COSR*D( I ) + SINR*E( I )
-               E( I ) = COSR*E( I ) - SINR*D( I )
-               G = SINR*D( I+1 )
-               D( I+1 ) = COSR*D( I+1 )
-               CALL SLARTG( F, G, COSL, SINL, R )
-               D( I ) = R
-               F = COSL*E( I ) + SINL*D( I+1 )
-               D( I+1 ) = COSL*D( I+1 ) - SINL*E( I )
-               IF( I.LT.M-1 ) THEN
-                  G = SINL*E( I+1 )
-                  E( I+1 ) = COSL*E( I+1 )
-               END IF
-               WORK( I-LL+1 ) = COSR
-               WORK( I-LL+1+NM1 ) = SINR
-               WORK( I-LL+1+NM12 ) = COSL
-               WORK( I-LL+1+NM13 ) = SINL
-  140       CONTINUE
-            E( M-1 ) = F
-*
-*           Update singular vectors
-*
-            IF( NCVT.GT.0 )
-     $         CALL SLASR( 'L', 'V', 'F', M-LL+1, NCVT, WORK( 1 ),
-     $                     WORK( N ), VT( LL, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL SLASR( 'R', 'V', 'F', NRU, M-LL+1, WORK( NM12+1 ),
-     $                     WORK( NM13+1 ), U( 1, LL ), LDU )
-            IF( NCC.GT.0 )
-     $         CALL SLASR( 'L', 'V', 'F', M-LL+1, NCC, WORK( NM12+1 ),
-     $                     WORK( NM13+1 ), C( LL, 1 ), LDC )
-*
-*           Test convergence
-*
-            IF( ABS( E( M-1 ) ).LE.THRESH )
-     $         E( M-1 ) = ZERO
-*
-         ELSE
-*
-*           Chase bulge from bottom to top
-*           Save cosines and sines for later singular vector updates
-*
-            F = ( ABS( D( M ) )-SHIFT )*( SIGN( ONE, D( M ) )+SHIFT /
-     $          D( M ) )
-            G = E( M-1 )
-            DO 150 I = M, LL + 1, -1
-               CALL SLARTG( F, G, COSR, SINR, R )
-               IF( I.LT.M )
-     $            E( I ) = R
-               F = COSR*D( I ) + SINR*E( I-1 )
-               E( I-1 ) = COSR*E( I-1 ) - SINR*D( I )
-               G = SINR*D( I-1 )
-               D( I-1 ) = COSR*D( I-1 )
-               CALL SLARTG( F, G, COSL, SINL, R )
-               D( I ) = R
-               F = COSL*E( I-1 ) + SINL*D( I-1 )
-               D( I-1 ) = COSL*D( I-1 ) - SINL*E( I-1 )
-               IF( I.GT.LL+1 ) THEN
-                  G = SINL*E( I-2 )
-                  E( I-2 ) = COSL*E( I-2 )
-               END IF
-               WORK( I-LL ) = COSR
-               WORK( I-LL+NM1 ) = -SINR
-               WORK( I-LL+NM12 ) = COSL
-               WORK( I-LL+NM13 ) = -SINL
-  150       CONTINUE
-            E( LL ) = F
-*
-*           Test convergence
-*
-            IF( ABS( E( LL ) ).LE.THRESH )
-     $         E( LL ) = ZERO
-*
-*           Update singular vectors if desired
-*
-            IF( NCVT.GT.0 )
-     $         CALL SLASR( 'L', 'V', 'B', M-LL+1, NCVT, WORK( NM12+1 ),
-     $                     WORK( NM13+1 ), VT( LL, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL SLASR( 'R', 'V', 'B', NRU, M-LL+1, WORK( 1 ),
-     $                     WORK( N ), U( 1, LL ), LDU )
-            IF( NCC.GT.0 )
-     $         CALL SLASR( 'L', 'V', 'B', M-LL+1, NCC, WORK( 1 ),
-     $                     WORK( N ), C( LL, 1 ), LDC )
-         END IF
-      END IF
-*
-*     QR iteration finished, go back and check convergence
-*
-      GO TO 60
-*
-*     All singular values converged, so make them positive
-*
-  160 CONTINUE
-      DO 170 I = 1, N
-         IF( D( I ).LT.ZERO ) THEN
-            D( I ) = -D( I )
-*
-*           Change sign of singular vectors, if desired
-*
-            IF( NCVT.GT.0 )
-     $         CALL SSCAL( NCVT, NEGONE, VT( I, 1 ), LDVT )
-         END IF
-  170 CONTINUE
-*
-*     Sort the singular values into decreasing order (insertion sort on
-*     singular values, but only one transposition per singular vector)
-*
-      DO 190 I = 1, N - 1
-*
-*        Scan for smallest D(I)
-*
-         ISUB = 1
-         SMIN = D( 1 )
-         DO 180 J = 2, N + 1 - I
-            IF( D( J ).LE.SMIN ) THEN
-               ISUB = J
-               SMIN = D( J )
-            END IF
-  180    CONTINUE
-         IF( ISUB.NE.N+1-I ) THEN
-*
-*           Swap singular values and vectors
-*
-            D( ISUB ) = D( N+1-I )
-            D( N+1-I ) = SMIN
-            IF( NCVT.GT.0 )
-     $         CALL SSWAP( NCVT, VT( ISUB, 1 ), LDVT, VT( N+1-I, 1 ),
-     $                     LDVT )
-            IF( NRU.GT.0 )
-     $         CALL SSWAP( NRU, U( 1, ISUB ), 1, U( 1, N+1-I ), 1 )
-            IF( NCC.GT.0 )
-     $         CALL SSWAP( NCC, C( ISUB, 1 ), LDC, C( N+1-I, 1 ), LDC )
-         END IF
-  190 CONTINUE
-      GO TO 220
-*
-*     Maximum number of iterations exceeded, failure to converge
-*
-  200 CONTINUE
-      INFO = 0
-      DO 210 I = 1, N - 1
-         IF( E( I ).NE.ZERO )
-     $      INFO = INFO + 1
-  210 CONTINUE
-  220 CONTINUE
-      RETURN
-*
-*     End of SBDSQR
-*
-      END
--- a/libcruft/lapack/scsum1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-      REAL             FUNCTION SCSUM1( N, CX, INCX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX            CX( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SCSUM1 takes the sum of the absolute values of a complex
-*  vector and returns a single precision result.
-*
-*  Based on SCASUM from the Level 1 BLAS.
-*  The change is to use the 'genuine' absolute value.
-*
-*  Contributed by Nick Higham for use with CLACON.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of elements in the vector CX.
-*
-*  CX      (input) COMPLEX array, dimension (N)
-*          The vector whose elements will be summed.
-*
-*  INCX    (input) INTEGER
-*          The spacing between successive values of CX.  INCX > 0.
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, NINCX
-      REAL               STEMP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. Executable Statements ..
-*
-      SCSUM1 = 0.0E0
-      STEMP = 0.0E0
-      IF( N.LE.0 )
-     $   RETURN
-      IF( INCX.EQ.1 )
-     $   GO TO 20
-*
-*     CODE FOR INCREMENT NOT EQUAL TO 1
-*
-      NINCX = N*INCX
-      DO 10 I = 1, NINCX, INCX
-*
-*        NEXT LINE MODIFIED.
-*
-         STEMP = STEMP + ABS( CX( I ) )
-   10 CONTINUE
-      SCSUM1 = STEMP
-      RETURN
-*
-*     CODE FOR INCREMENT EQUAL TO 1
-*
-   20 CONTINUE
-      DO 30 I = 1, N
-*
-*        NEXT LINE MODIFIED.
-*
-         STEMP = STEMP + ABS( CX( I ) )
-   30 CONTINUE
-      SCSUM1 = STEMP
-      RETURN
-*
-*     End of SCSUM1
-*
-      END
--- a/libcruft/lapack/sgbcon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,226 +0,0 @@
-      SUBROUTINE SGBCON( NORM, N, KL, KU, AB, LDAB, IPIV, ANORM, RCOND,
-     $                   WORK, IWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call SLACN2 in place of SLACON, 7 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            INFO, KL, KU, LDAB, N
-      REAL               ANORM, RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * ), IWORK( * )
-      REAL               AB( LDAB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGBCON estimates the reciprocal of the condition number of a real
-*  general band matrix A, in either the 1-norm or the infinity-norm,
-*  using the LU factorization computed by SGBTRF.
-*
-*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
-*  condition number is computed as
-*     RCOND = 1 / ( norm(A) * norm(inv(A)) ).
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies whether the 1-norm condition number or the
-*          infinity-norm condition number is required:
-*          = '1' or 'O':  1-norm;
-*          = 'I':         Infinity-norm.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KL      (input) INTEGER
-*          The number of subdiagonals within the band of A.  KL >= 0.
-*
-*  KU      (input) INTEGER
-*          The number of superdiagonals within the band of A.  KU >= 0.
-*
-*  AB      (input) REAL array, dimension (LDAB,N)
-*          Details of the LU factorization of the band matrix A, as
-*          computed by SGBTRF.  U is stored as an upper triangular band
-*          matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and
-*          the multipliers used during the factorization are stored in
-*          rows KL+KU+2 to 2*KL+KU+1.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= N, row i of the matrix was
-*          interchanged with row IPIV(i).
-*
-*  ANORM   (input) REAL
-*          If NORM = '1' or 'O', the 1-norm of the original matrix A.
-*          If NORM = 'I', the infinity-norm of the original matrix A.
-*
-*  RCOND   (output) REAL
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(norm(A) * norm(inv(A))).
-*
-*  WORK    (workspace) REAL array, dimension (3*N)
-*
-*  IWORK   (workspace) INTEGER array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LNOTI, ONENRM
-      CHARACTER          NORMIN
-      INTEGER            IX, J, JP, KASE, KASE1, KD, LM
-      REAL               AINVNM, SCALE, SMLNUM, T
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ISAMAX
-      REAL               SDOT, SLAMCH
-      EXTERNAL           LSAME, ISAMAX, SDOT, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SAXPY, SLACN2, SLATBS, SRSCL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' )
-      IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KL.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( KU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDAB.LT.2*KL+KU+1 ) THEN
-         INFO = -6
-      ELSE IF( ANORM.LT.ZERO ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGBCON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      RCOND = ZERO
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      ELSE IF( ANORM.EQ.ZERO ) THEN
-         RETURN
-      END IF
-*
-      SMLNUM = SLAMCH( 'Safe minimum' )
-*
-*     Estimate the norm of inv(A).
-*
-      AINVNM = ZERO
-      NORMIN = 'N'
-      IF( ONENRM ) THEN
-         KASE1 = 1
-      ELSE
-         KASE1 = 2
-      END IF
-      KD = KL + KU + 1
-      LNOTI = KL.GT.0
-      KASE = 0
-   10 CONTINUE
-      CALL SLACN2( N, WORK( N+1 ), WORK, IWORK, AINVNM, KASE, ISAVE )
-      IF( KASE.NE.0 ) THEN
-         IF( KASE.EQ.KASE1 ) THEN
-*
-*           Multiply by inv(L).
-*
-            IF( LNOTI ) THEN
-               DO 20 J = 1, N - 1
-                  LM = MIN( KL, N-J )
-                  JP = IPIV( J )
-                  T = WORK( JP )
-                  IF( JP.NE.J ) THEN
-                     WORK( JP ) = WORK( J )
-                     WORK( J ) = T
-                  END IF
-                  CALL SAXPY( LM, -T, AB( KD+1, J ), 1, WORK( J+1 ), 1 )
-   20          CONTINUE
-            END IF
-*
-*           Multiply by inv(U).
-*
-            CALL SLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   KL+KU, AB, LDAB, WORK, SCALE, WORK( 2*N+1 ),
-     $                   INFO )
-         ELSE
-*
-*           Multiply by inv(U').
-*
-            CALL SLATBS( 'Upper', 'Transpose', 'Non-unit', NORMIN, N,
-     $                   KL+KU, AB, LDAB, WORK, SCALE, WORK( 2*N+1 ),
-     $                   INFO )
-*
-*           Multiply by inv(L').
-*
-            IF( LNOTI ) THEN
-               DO 30 J = N - 1, 1, -1
-                  LM = MIN( KL, N-J )
-                  WORK( J ) = WORK( J ) - SDOT( LM, AB( KD+1, J ), 1,
-     $                        WORK( J+1 ), 1 )
-                  JP = IPIV( J )
-                  IF( JP.NE.J ) THEN
-                     T = WORK( JP )
-                     WORK( JP ) = WORK( J )
-                     WORK( J ) = T
-                  END IF
-   30          CONTINUE
-            END IF
-         END IF
-*
-*        Divide X by 1/SCALE if doing so will not cause overflow.
-*
-         NORMIN = 'Y'
-         IF( SCALE.NE.ONE ) THEN
-            IX = ISAMAX( N, WORK, 1 )
-            IF( SCALE.LT.ABS( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
-     $         GO TO 40
-            CALL SRSCL( N, SCALE, WORK, 1 )
-         END IF
-         GO TO 10
-      END IF
-*
-*     Compute the estimate of the reciprocal condition number.
-*
-      IF( AINVNM.NE.ZERO )
-     $   RCOND = ( ONE / AINVNM ) / ANORM
-*
-   40 CONTINUE
-      RETURN
-*
-*     End of SGBCON
-*
-      END
--- a/libcruft/lapack/sgbtf2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,202 +0,0 @@
-      SUBROUTINE SGBTF2( M, N, KL, KU, AB, LDAB, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, KL, KU, LDAB, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      REAL               AB( LDAB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGBTF2 computes an LU factorization of a real m-by-n band matrix A
-*  using partial pivoting with row interchanges.
-*
-*  This is the unblocked version of the algorithm, calling Level 2 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  KL      (input) INTEGER
-*          The number of subdiagonals within the band of A.  KL >= 0.
-*
-*  KU      (input) INTEGER
-*          The number of superdiagonals within the band of A.  KU >= 0.
-*
-*  AB      (input/output) REAL array, dimension (LDAB,N)
-*          On entry, the matrix A in band storage, in rows KL+1 to
-*          2*KL+KU+1; rows 1 to KL of the array need not be set.
-*          The j-th column of A is stored in the j-th column of the
-*          array AB as follows:
-*          AB(kl+ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl)
-*
-*          On exit, details of the factorization: U is stored as an
-*          upper triangular band matrix with KL+KU superdiagonals in
-*          rows 1 to KL+KU+1, and the multipliers used during the
-*          factorization are stored in rows KL+KU+2 to 2*KL+KU+1.
-*          See below for further details.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
-*
-*  IPIV    (output) INTEGER array, dimension (min(M,N))
-*          The pivot indices; for 1 <= i <= min(M,N), row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = +i, U(i,i) is exactly zero. The factorization
-*               has been completed, but the factor U is exactly
-*               singular, and division by zero will occur if it is used
-*               to solve a system of equations.
-*
-*  Further Details
-*  ===============
-*
-*  The band storage scheme is illustrated by the following example, when
-*  M = N = 6, KL = 2, KU = 1:
-*
-*  On entry:                       On exit:
-*
-*      *    *    *    +    +    +       *    *    *   u14  u25  u36
-*      *    *    +    +    +    +       *    *   u13  u24  u35  u46
-*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
-*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
-*     a21  a32  a43  a54  a65   *      m21  m32  m43  m54  m65   *
-*     a31  a42  a53  a64   *    *      m31  m42  m53  m64   *    *
-*
-*  Array elements marked * are not used by the routine; elements marked
-*  + need not be set on entry, but are required by the routine to store
-*  elements of U, because of fill-in resulting from the row
-*  interchanges.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J, JP, JU, KM, KV
-*     ..
-*     .. External Functions ..
-      INTEGER            ISAMAX
-      EXTERNAL           ISAMAX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGER, SSCAL, SSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     KV is the number of superdiagonals in the factor U, allowing for
-*     fill-in.
-*
-      KV = KU + KL
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KL.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( KU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDAB.LT.KL+KV+1 ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGBTF2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Gaussian elimination with partial pivoting
-*
-*     Set fill-in elements in columns KU+2 to KV to zero.
-*
-      DO 20 J = KU + 2, MIN( KV, N )
-         DO 10 I = KV - J + 2, KL
-            AB( I, J ) = ZERO
-   10    CONTINUE
-   20 CONTINUE
-*
-*     JU is the index of the last column affected by the current stage
-*     of the factorization.
-*
-      JU = 1
-*
-      DO 40 J = 1, MIN( M, N )
-*
-*        Set fill-in elements in column J+KV to zero.
-*
-         IF( J+KV.LE.N ) THEN
-            DO 30 I = 1, KL
-               AB( I, J+KV ) = ZERO
-   30       CONTINUE
-         END IF
-*
-*        Find pivot and test for singularity. KM is the number of
-*        subdiagonal elements in the current column.
-*
-         KM = MIN( KL, M-J )
-         JP = ISAMAX( KM+1, AB( KV+1, J ), 1 )
-         IPIV( J ) = JP + J - 1
-         IF( AB( KV+JP, J ).NE.ZERO ) THEN
-            JU = MAX( JU, MIN( J+KU+JP-1, N ) )
-*
-*           Apply interchange to columns J to JU.
-*
-            IF( JP.NE.1 )
-     $         CALL SSWAP( JU-J+1, AB( KV+JP, J ), LDAB-1,
-     $                     AB( KV+1, J ), LDAB-1 )
-*
-            IF( KM.GT.0 ) THEN
-*
-*              Compute multipliers.
-*
-               CALL SSCAL( KM, ONE / AB( KV+1, J ), AB( KV+2, J ), 1 )
-*
-*              Update trailing submatrix within the band.
-*
-               IF( JU.GT.J )
-     $            CALL SGER( KM, JU-J, -ONE, AB( KV+2, J ), 1,
-     $                       AB( KV, J+1 ), LDAB-1, AB( KV+1, J+1 ),
-     $                       LDAB-1 )
-            END IF
-         ELSE
-*
-*           If pivot is zero, set INFO to the index of the pivot
-*           unless a zero pivot has already been found.
-*
-            IF( INFO.EQ.0 )
-     $         INFO = J
-         END IF
-   40 CONTINUE
-      RETURN
-*
-*     End of SGBTF2
-*
-      END
--- a/libcruft/lapack/sgbtrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,441 +0,0 @@
-      SUBROUTINE SGBTRF( M, N, KL, KU, AB, LDAB, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, KL, KU, LDAB, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      REAL               AB( LDAB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGBTRF computes an LU factorization of a real m-by-n band matrix A
-*  using partial pivoting with row interchanges.
-*
-*  This is the blocked version of the algorithm, calling Level 3 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  KL      (input) INTEGER
-*          The number of subdiagonals within the band of A.  KL >= 0.
-*
-*  KU      (input) INTEGER
-*          The number of superdiagonals within the band of A.  KU >= 0.
-*
-*  AB      (input/output) REAL array, dimension (LDAB,N)
-*          On entry, the matrix A in band storage, in rows KL+1 to
-*          2*KL+KU+1; rows 1 to KL of the array need not be set.
-*          The j-th column of A is stored in the j-th column of the
-*          array AB as follows:
-*          AB(kl+ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl)
-*
-*          On exit, details of the factorization: U is stored as an
-*          upper triangular band matrix with KL+KU superdiagonals in
-*          rows 1 to KL+KU+1, and the multipliers used during the
-*          factorization are stored in rows KL+KU+2 to 2*KL+KU+1.
-*          See below for further details.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
-*
-*  IPIV    (output) INTEGER array, dimension (min(M,N))
-*          The pivot indices; for 1 <= i <= min(M,N), row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = +i, U(i,i) is exactly zero. The factorization
-*               has been completed, but the factor U is exactly
-*               singular, and division by zero will occur if it is used
-*               to solve a system of equations.
-*
-*  Further Details
-*  ===============
-*
-*  The band storage scheme is illustrated by the following example, when
-*  M = N = 6, KL = 2, KU = 1:
-*
-*  On entry:                       On exit:
-*
-*      *    *    *    +    +    +       *    *    *   u14  u25  u36
-*      *    *    +    +    +    +       *    *   u13  u24  u35  u46
-*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
-*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
-*     a21  a32  a43  a54  a65   *      m21  m32  m43  m54  m65   *
-*     a31  a42  a53  a64   *    *      m31  m42  m53  m64   *    *
-*
-*  Array elements marked * are not used by the routine; elements marked
-*  + need not be set on entry, but are required by the routine to store
-*  elements of U because of fill-in resulting from the row interchanges.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-      INTEGER            NBMAX, LDWORK
-      PARAMETER          ( NBMAX = 64, LDWORK = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I2, I3, II, IP, J, J2, J3, JB, JJ, JM, JP,
-     $                   JU, K2, KM, KV, NB, NW
-      REAL               TEMP
-*     ..
-*     .. Local Arrays ..
-      REAL               WORK13( LDWORK, NBMAX ),
-     $                   WORK31( LDWORK, NBMAX )
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV, ISAMAX
-      EXTERNAL           ILAENV, ISAMAX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SGBTF2, SGEMM, SGER, SLASWP, SSCAL,
-     $                   SSWAP, STRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     KV is the number of superdiagonals in the factor U, allowing for
-*     fill-in
-*
-      KV = KU + KL
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KL.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( KU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDAB.LT.KL+KV+1 ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGBTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment
-*
-      NB = ILAENV( 1, 'SGBTRF', ' ', M, N, KL, KU )
-*
-*     The block size must not exceed the limit set by the size of the
-*     local arrays WORK13 and WORK31.
-*
-      NB = MIN( NB, NBMAX )
-*
-      IF( NB.LE.1 .OR. NB.GT.KL ) THEN
-*
-*        Use unblocked code
-*
-         CALL SGBTF2( M, N, KL, KU, AB, LDAB, IPIV, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-*        Zero the superdiagonal elements of the work array WORK13
-*
-         DO 20 J = 1, NB
-            DO 10 I = 1, J - 1
-               WORK13( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-*
-*        Zero the subdiagonal elements of the work array WORK31
-*
-         DO 40 J = 1, NB
-            DO 30 I = J + 1, NB
-               WORK31( I, J ) = ZERO
-   30       CONTINUE
-   40    CONTINUE
-*
-*        Gaussian elimination with partial pivoting
-*
-*        Set fill-in elements in columns KU+2 to KV to zero
-*
-         DO 60 J = KU + 2, MIN( KV, N )
-            DO 50 I = KV - J + 2, KL
-               AB( I, J ) = ZERO
-   50       CONTINUE
-   60    CONTINUE
-*
-*        JU is the index of the last column affected by the current
-*        stage of the factorization
-*
-         JU = 1
-*
-         DO 180 J = 1, MIN( M, N ), NB
-            JB = MIN( NB, MIN( M, N )-J+1 )
-*
-*           The active part of the matrix is partitioned
-*
-*              A11   A12   A13
-*              A21   A22   A23
-*              A31   A32   A33
-*
-*           Here A11, A21 and A31 denote the current block of JB columns
-*           which is about to be factorized. The number of rows in the
-*           partitioning are JB, I2, I3 respectively, and the numbers
-*           of columns are JB, J2, J3. The superdiagonal elements of A13
-*           and the subdiagonal elements of A31 lie outside the band.
-*
-            I2 = MIN( KL-JB, M-J-JB+1 )
-            I3 = MIN( JB, M-J-KL+1 )
-*
-*           J2 and J3 are computed after JU has been updated.
-*
-*           Factorize the current block of JB columns
-*
-            DO 80 JJ = J, J + JB - 1
-*
-*              Set fill-in elements in column JJ+KV to zero
-*
-               IF( JJ+KV.LE.N ) THEN
-                  DO 70 I = 1, KL
-                     AB( I, JJ+KV ) = ZERO
-   70             CONTINUE
-               END IF
-*
-*              Find pivot and test for singularity. KM is the number of
-*              subdiagonal elements in the current column.
-*
-               KM = MIN( KL, M-JJ )
-               JP = ISAMAX( KM+1, AB( KV+1, JJ ), 1 )
-               IPIV( JJ ) = JP + JJ - J
-               IF( AB( KV+JP, JJ ).NE.ZERO ) THEN
-                  JU = MAX( JU, MIN( JJ+KU+JP-1, N ) )
-                  IF( JP.NE.1 ) THEN
-*
-*                    Apply interchange to columns J to J+JB-1
-*
-                     IF( JP+JJ-1.LT.J+KL ) THEN
-*
-                        CALL SSWAP( JB, AB( KV+1+JJ-J, J ), LDAB-1,
-     $                              AB( KV+JP+JJ-J, J ), LDAB-1 )
-                     ELSE
-*
-*                       The interchange affects columns J to JJ-1 of A31
-*                       which are stored in the work array WORK31
-*
-                        CALL SSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1,
-     $                              WORK31( JP+JJ-J-KL, 1 ), LDWORK )
-                        CALL SSWAP( J+JB-JJ, AB( KV+1, JJ ), LDAB-1,
-     $                              AB( KV+JP, JJ ), LDAB-1 )
-                     END IF
-                  END IF
-*
-*                 Compute multipliers
-*
-                  CALL SSCAL( KM, ONE / AB( KV+1, JJ ), AB( KV+2, JJ ),
-     $                        1 )
-*
-*                 Update trailing submatrix within the band and within
-*                 the current block. JM is the index of the last column
-*                 which needs to be updated.
-*
-                  JM = MIN( JU, J+JB-1 )
-                  IF( JM.GT.JJ )
-     $               CALL SGER( KM, JM-JJ, -ONE, AB( KV+2, JJ ), 1,
-     $                          AB( KV, JJ+1 ), LDAB-1,
-     $                          AB( KV+1, JJ+1 ), LDAB-1 )
-               ELSE
-*
-*                 If pivot is zero, set INFO to the index of the pivot
-*                 unless a zero pivot has already been found.
-*
-                  IF( INFO.EQ.0 )
-     $               INFO = JJ
-               END IF
-*
-*              Copy current column of A31 into the work array WORK31
-*
-               NW = MIN( JJ-J+1, I3 )
-               IF( NW.GT.0 )
-     $            CALL SCOPY( NW, AB( KV+KL+1-JJ+J, JJ ), 1,
-     $                        WORK31( 1, JJ-J+1 ), 1 )
-   80       CONTINUE
-            IF( J+JB.LE.N ) THEN
-*
-*              Apply the row interchanges to the other blocks.
-*
-               J2 = MIN( JU-J+1, KV ) - JB
-               J3 = MAX( 0, JU-J-KV+1 )
-*
-*              Use SLASWP to apply the row interchanges to A12, A22, and
-*              A32.
-*
-               CALL SLASWP( J2, AB( KV+1-JB, J+JB ), LDAB-1, 1, JB,
-     $                      IPIV( J ), 1 )
-*
-*              Adjust the pivot indices.
-*
-               DO 90 I = J, J + JB - 1
-                  IPIV( I ) = IPIV( I ) + J - 1
-   90          CONTINUE
-*
-*              Apply the row interchanges to A13, A23, and A33
-*              columnwise.
-*
-               K2 = J - 1 + JB + J2
-               DO 110 I = 1, J3
-                  JJ = K2 + I
-                  DO 100 II = J + I - 1, J + JB - 1
-                     IP = IPIV( II )
-                     IF( IP.NE.II ) THEN
-                        TEMP = AB( KV+1+II-JJ, JJ )
-                        AB( KV+1+II-JJ, JJ ) = AB( KV+1+IP-JJ, JJ )
-                        AB( KV+1+IP-JJ, JJ ) = TEMP
-                     END IF
-  100             CONTINUE
-  110          CONTINUE
-*
-*              Update the relevant part of the trailing submatrix
-*
-               IF( J2.GT.0 ) THEN
-*
-*                 Update A12
-*
-                  CALL STRSM( 'Left', 'Lower', 'No transpose', 'Unit',
-     $                        JB, J2, ONE, AB( KV+1, J ), LDAB-1,
-     $                        AB( KV+1-JB, J+JB ), LDAB-1 )
-*
-                  IF( I2.GT.0 ) THEN
-*
-*                    Update A22
-*
-                     CALL SGEMM( 'No transpose', 'No transpose', I2, J2,
-     $                           JB, -ONE, AB( KV+1+JB, J ), LDAB-1,
-     $                           AB( KV+1-JB, J+JB ), LDAB-1, ONE,
-     $                           AB( KV+1, J+JB ), LDAB-1 )
-                  END IF
-*
-                  IF( I3.GT.0 ) THEN
-*
-*                    Update A32
-*
-                     CALL SGEMM( 'No transpose', 'No transpose', I3, J2,
-     $                           JB, -ONE, WORK31, LDWORK,
-     $                           AB( KV+1-JB, J+JB ), LDAB-1, ONE,
-     $                           AB( KV+KL+1-JB, J+JB ), LDAB-1 )
-                  END IF
-               END IF
-*
-               IF( J3.GT.0 ) THEN
-*
-*                 Copy the lower triangle of A13 into the work array
-*                 WORK13
-*
-                  DO 130 JJ = 1, J3
-                     DO 120 II = JJ, JB
-                        WORK13( II, JJ ) = AB( II-JJ+1, JJ+J+KV-1 )
-  120                CONTINUE
-  130             CONTINUE
-*
-*                 Update A13 in the work array
-*
-                  CALL STRSM( 'Left', 'Lower', 'No transpose', 'Unit',
-     $                        JB, J3, ONE, AB( KV+1, J ), LDAB-1,
-     $                        WORK13, LDWORK )
-*
-                  IF( I2.GT.0 ) THEN
-*
-*                    Update A23
-*
-                     CALL SGEMM( 'No transpose', 'No transpose', I2, J3,
-     $                           JB, -ONE, AB( KV+1+JB, J ), LDAB-1,
-     $                           WORK13, LDWORK, ONE, AB( 1+JB, J+KV ),
-     $                           LDAB-1 )
-                  END IF
-*
-                  IF( I3.GT.0 ) THEN
-*
-*                    Update A33
-*
-                     CALL SGEMM( 'No transpose', 'No transpose', I3, J3,
-     $                           JB, -ONE, WORK31, LDWORK, WORK13,
-     $                           LDWORK, ONE, AB( 1+KL, J+KV ), LDAB-1 )
-                  END IF
-*
-*                 Copy the lower triangle of A13 back into place
-*
-                  DO 150 JJ = 1, J3
-                     DO 140 II = JJ, JB
-                        AB( II-JJ+1, JJ+J+KV-1 ) = WORK13( II, JJ )
-  140                CONTINUE
-  150             CONTINUE
-               END IF
-            ELSE
-*
-*              Adjust the pivot indices.
-*
-               DO 160 I = J, J + JB - 1
-                  IPIV( I ) = IPIV( I ) + J - 1
-  160          CONTINUE
-            END IF
-*
-*           Partially undo the interchanges in the current block to
-*           restore the upper triangular form of A31 and copy the upper
-*           triangle of A31 back into place
-*
-            DO 170 JJ = J + JB - 1, J, -1
-               JP = IPIV( JJ ) - JJ + 1
-               IF( JP.NE.1 ) THEN
-*
-*                 Apply interchange to columns J to JJ-1
-*
-                  IF( JP+JJ-1.LT.J+KL ) THEN
-*
-*                    The interchange does not affect A31
-*
-                     CALL SSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1,
-     $                           AB( KV+JP+JJ-J, J ), LDAB-1 )
-                  ELSE
-*
-*                    The interchange does affect A31
-*
-                     CALL SSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1,
-     $                           WORK31( JP+JJ-J-KL, 1 ), LDWORK )
-                  END IF
-               END IF
-*
-*              Copy the current column of A31 back into place
-*
-               NW = MIN( I3, JJ-J+1 )
-               IF( NW.GT.0 )
-     $            CALL SCOPY( NW, WORK31( 1, JJ-J+1 ), 1,
-     $                        AB( KV+KL+1-JJ+J, JJ ), 1 )
-  170       CONTINUE
-  180    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of SGBTRF
-*
-      END
--- a/libcruft/lapack/sgbtrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,186 +0,0 @@
-      SUBROUTINE SGBTRS( TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TRANS
-      INTEGER            INFO, KL, KU, LDAB, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      REAL               AB( LDAB, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGBTRS solves a system of linear equations
-*     A * X = B  or  A' * X = B
-*  with a general band matrix A using the LU factorization computed
-*  by SGBTRF.
-*
-*  Arguments
-*  =========
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the form of the system of equations.
-*          = 'N':  A * X = B  (No transpose)
-*          = 'T':  A'* X = B  (Transpose)
-*          = 'C':  A'* X = B  (Conjugate transpose = Transpose)
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KL      (input) INTEGER
-*          The number of subdiagonals within the band of A.  KL >= 0.
-*
-*  KU      (input) INTEGER
-*          The number of superdiagonals within the band of A.  KU >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  AB      (input) REAL array, dimension (LDAB,N)
-*          Details of the LU factorization of the band matrix A, as
-*          computed by SGBTRF.  U is stored as an upper triangular band
-*          matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and
-*          the multipliers used during the factorization are stored in
-*          rows KL+KU+2 to 2*KL+KU+1.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= N, row i of the matrix was
-*          interchanged with row IPIV(i).
-*
-*  B       (input/output) REAL array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LNOTI, NOTRAN
-      INTEGER            I, J, KD, L, LM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEMV, SGER, SSWAP, STBSV, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      NOTRAN = LSAME( TRANS, 'N' )
-      IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
-     $    LSAME( TRANS, 'C' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KL.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( KU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDAB.LT.( 2*KL+KU+1 ) ) THEN
-         INFO = -7
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGBTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      KD = KU + KL + 1
-      LNOTI = KL.GT.0
-*
-      IF( NOTRAN ) THEN
-*
-*        Solve  A*X = B.
-*
-*        Solve L*X = B, overwriting B with X.
-*
-*        L is represented as a product of permutations and unit lower
-*        triangular matrices L = P(1) * L(1) * ... * P(n-1) * L(n-1),
-*        where each transformation L(i) is a rank-one modification of
-*        the identity matrix.
-*
-         IF( LNOTI ) THEN
-            DO 10 J = 1, N - 1
-               LM = MIN( KL, N-J )
-               L = IPIV( J )
-               IF( L.NE.J )
-     $            CALL SSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
-               CALL SGER( LM, NRHS, -ONE, AB( KD+1, J ), 1, B( J, 1 ),
-     $                    LDB, B( J+1, 1 ), LDB )
-   10       CONTINUE
-         END IF
-*
-         DO 20 I = 1, NRHS
-*
-*           Solve U*X = B, overwriting B with X.
-*
-            CALL STBSV( 'Upper', 'No transpose', 'Non-unit', N, KL+KU,
-     $                  AB, LDAB, B( 1, I ), 1 )
-   20    CONTINUE
-*
-      ELSE
-*
-*        Solve A'*X = B.
-*
-         DO 30 I = 1, NRHS
-*
-*           Solve U'*X = B, overwriting B with X.
-*
-            CALL STBSV( 'Upper', 'Transpose', 'Non-unit', N, KL+KU, AB,
-     $                  LDAB, B( 1, I ), 1 )
-   30    CONTINUE
-*
-*        Solve L'*X = B, overwriting B with X.
-*
-         IF( LNOTI ) THEN
-            DO 40 J = N - 1, 1, -1
-               LM = MIN( KL, N-J )
-               CALL SGEMV( 'Transpose', LM, NRHS, -ONE, B( J+1, 1 ),
-     $                     LDB, AB( KD+1, J ), 1, ONE, B( J, 1 ), LDB )
-               L = IPIV( J )
-               IF( L.NE.J )
-     $            CALL SSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
-   40       CONTINUE
-         END IF
-      END IF
-      RETURN
-*
-*     End of SGBTRS
-*
-      END
--- a/libcruft/lapack/sgebak.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,188 +0,0 @@
-      SUBROUTINE SGEBAK( JOB, SIDE, N, ILO, IHI, SCALE, M, V, LDV,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOB, SIDE
-      INTEGER            IHI, ILO, INFO, LDV, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               V( LDV, * ), SCALE( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGEBAK forms the right or left eigenvectors of a real general matrix
-*  by backward transformation on the computed eigenvectors of the
-*  balanced matrix output by SGEBAL.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies the type of backward transformation required:
-*          = 'N', do nothing, return immediately;
-*          = 'P', do backward transformation for permutation only;
-*          = 'S', do backward transformation for scaling only;
-*          = 'B', do backward transformations for both permutation and
-*                 scaling.
-*          JOB must be the same as the argument JOB supplied to SGEBAL.
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'R':  V contains right eigenvectors;
-*          = 'L':  V contains left eigenvectors.
-*
-*  N       (input) INTEGER
-*          The number of rows of the matrix V.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          The integers ILO and IHI determined by SGEBAL.
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  SCALE   (input) REAL array, dimension (N)
-*          Details of the permutation and scaling factors, as returned
-*          by SGEBAL.
-*
-*  M       (input) INTEGER
-*          The number of columns of the matrix V.  M >= 0.
-*
-*  V       (input/output) REAL array, dimension (LDV,M)
-*          On entry, the matrix of right or left eigenvectors to be
-*          transformed, as returned by SHSEIN or STREVC.
-*          On exit, V is overwritten by the transformed eigenvectors.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V. LDV >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFTV, RIGHTV
-      INTEGER            I, II, K
-      REAL               S
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SSCAL, SSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and Test the input parameters
-*
-      RIGHTV = LSAME( SIDE, 'R' )
-      LEFTV = LSAME( SIDE, 'L' )
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
-     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -5
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -7
-      ELSE IF( LDV.LT.MAX( 1, N ) ) THEN
-         INFO = -9
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGEBAK', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-      IF( M.EQ.0 )
-     $   RETURN
-      IF( LSAME( JOB, 'N' ) )
-     $   RETURN
-*
-      IF( ILO.EQ.IHI )
-     $   GO TO 30
-*
-*     Backward balance
-*
-      IF( LSAME( JOB, 'S' ) .OR. LSAME( JOB, 'B' ) ) THEN
-*
-         IF( RIGHTV ) THEN
-            DO 10 I = ILO, IHI
-               S = SCALE( I )
-               CALL SSCAL( M, S, V( I, 1 ), LDV )
-   10       CONTINUE
-         END IF
-*
-         IF( LEFTV ) THEN
-            DO 20 I = ILO, IHI
-               S = ONE / SCALE( I )
-               CALL SSCAL( M, S, V( I, 1 ), LDV )
-   20       CONTINUE
-         END IF
-*
-      END IF
-*
-*     Backward permutation
-*
-*     For  I = ILO-1 step -1 until 1,
-*              IHI+1 step 1 until N do --
-*
-   30 CONTINUE
-      IF( LSAME( JOB, 'P' ) .OR. LSAME( JOB, 'B' ) ) THEN
-         IF( RIGHTV ) THEN
-            DO 40 II = 1, N
-               I = II
-               IF( I.GE.ILO .AND. I.LE.IHI )
-     $            GO TO 40
-               IF( I.LT.ILO )
-     $            I = ILO - II
-               K = SCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 40
-               CALL SSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   40       CONTINUE
-         END IF
-*
-         IF( LEFTV ) THEN
-            DO 50 II = 1, N
-               I = II
-               IF( I.GE.ILO .AND. I.LE.IHI )
-     $            GO TO 50
-               IF( I.LT.ILO )
-     $            I = ILO - II
-               K = SCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 50
-               CALL SSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   50       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of SGEBAK
-*
-      END
--- a/libcruft/lapack/sgebal.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,322 +0,0 @@
-      SUBROUTINE SGEBAL( JOB, N, A, LDA, ILO, IHI, SCALE, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOB
-      INTEGER            IHI, ILO, INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), SCALE( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGEBAL balances a general real matrix A.  This involves, first,
-*  permuting A by a similarity transformation to isolate eigenvalues
-*  in the first 1 to ILO-1 and last IHI+1 to N elements on the
-*  diagonal; and second, applying a diagonal similarity transformation
-*  to rows and columns ILO to IHI to make the rows and columns as
-*  close in norm as possible.  Both steps are optional.
-*
-*  Balancing may reduce the 1-norm of the matrix, and improve the
-*  accuracy of the computed eigenvalues and/or eigenvectors.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies the operations to be performed on A:
-*          = 'N':  none:  simply set ILO = 1, IHI = N, SCALE(I) = 1.0
-*                  for i = 1,...,N;
-*          = 'P':  permute only;
-*          = 'S':  scale only;
-*          = 'B':  both permute and scale.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the input matrix A.
-*          On exit,  A is overwritten by the balanced matrix.
-*          If JOB = 'N', A is not referenced.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  ILO     (output) INTEGER
-*  IHI     (output) INTEGER
-*          ILO and IHI are set to integers such that on exit
-*          A(i,j) = 0 if i > j and j = 1,...,ILO-1 or I = IHI+1,...,N.
-*          If JOB = 'N' or 'S', ILO = 1 and IHI = N.
-*
-*  SCALE   (output) REAL array, dimension (N)
-*          Details of the permutations and scaling factors applied to
-*          A.  If P(j) is the index of the row and column interchanged
-*          with row and column j and D(j) is the scaling factor
-*          applied to row and column j, then
-*          SCALE(j) = P(j)    for j = 1,...,ILO-1
-*                   = D(j)    for j = ILO,...,IHI
-*                   = P(j)    for j = IHI+1,...,N.
-*          The order in which the interchanges are made is N to IHI+1,
-*          then 1 to ILO-1.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The permutations consist of row and column interchanges which put
-*  the matrix in the form
-*
-*             ( T1   X   Y  )
-*     P A P = (  0   B   Z  )
-*             (  0   0   T2 )
-*
-*  where T1 and T2 are upper triangular matrices whose eigenvalues lie
-*  along the diagonal.  The column indices ILO and IHI mark the starting
-*  and ending columns of the submatrix B. Balancing consists of applying
-*  a diagonal similarity transformation inv(D) * B * D to make the
-*  1-norms of each row of B and its corresponding column nearly equal.
-*  The output matrix is
-*
-*     ( T1     X*D          Y    )
-*     (  0  inv(D)*B*D  inv(D)*Z ).
-*     (  0      0           T2   )
-*
-*  Information about the permutations P and the diagonal matrix D is
-*  returned in the vector SCALE.
-*
-*  This subroutine is based on the EISPACK routine BALANC.
-*
-*  Modified by Tzu-Yi Chen, Computer Science Division, University of
-*    California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-      REAL               SCLFAC
-      PARAMETER          ( SCLFAC = 2.0E+0 )
-      REAL               FACTOR
-      PARAMETER          ( FACTOR = 0.95E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOCONV
-      INTEGER            I, ICA, IEXC, IRA, J, K, L, M
-      REAL               C, CA, F, G, R, RA, S, SFMAX1, SFMAX2, SFMIN1,
-     $                   SFMIN2
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ISAMAX
-      REAL               SLAMCH
-      EXTERNAL           LSAME, ISAMAX, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SSCAL, SSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
-     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGEBAL', -INFO )
-         RETURN
-      END IF
-*
-      K = 1
-      L = N
-*
-      IF( N.EQ.0 )
-     $   GO TO 210
-*
-      IF( LSAME( JOB, 'N' ) ) THEN
-         DO 10 I = 1, N
-            SCALE( I ) = ONE
-   10    CONTINUE
-         GO TO 210
-      END IF
-*
-      IF( LSAME( JOB, 'S' ) )
-     $   GO TO 120
-*
-*     Permutation to isolate eigenvalues if possible
-*
-      GO TO 50
-*
-*     Row and column exchange.
-*
-   20 CONTINUE
-      SCALE( M ) = J
-      IF( J.EQ.M )
-     $   GO TO 30
-*
-      CALL SSWAP( L, A( 1, J ), 1, A( 1, M ), 1 )
-      CALL SSWAP( N-K+1, A( J, K ), LDA, A( M, K ), LDA )
-*
-   30 CONTINUE
-      GO TO ( 40, 80 )IEXC
-*
-*     Search for rows isolating an eigenvalue and push them down.
-*
-   40 CONTINUE
-      IF( L.EQ.1 )
-     $   GO TO 210
-      L = L - 1
-*
-   50 CONTINUE
-      DO 70 J = L, 1, -1
-*
-         DO 60 I = 1, L
-            IF( I.EQ.J )
-     $         GO TO 60
-            IF( A( J, I ).NE.ZERO )
-     $         GO TO 70
-   60    CONTINUE
-*
-         M = L
-         IEXC = 1
-         GO TO 20
-   70 CONTINUE
-*
-      GO TO 90
-*
-*     Search for columns isolating an eigenvalue and push them left.
-*
-   80 CONTINUE
-      K = K + 1
-*
-   90 CONTINUE
-      DO 110 J = K, L
-*
-         DO 100 I = K, L
-            IF( I.EQ.J )
-     $         GO TO 100
-            IF( A( I, J ).NE.ZERO )
-     $         GO TO 110
-  100    CONTINUE
-*
-         M = K
-         IEXC = 2
-         GO TO 20
-  110 CONTINUE
-*
-  120 CONTINUE
-      DO 130 I = K, L
-         SCALE( I ) = ONE
-  130 CONTINUE
-*
-      IF( LSAME( JOB, 'P' ) )
-     $   GO TO 210
-*
-*     Balance the submatrix in rows K to L.
-*
-*     Iterative loop for norm reduction
-*
-      SFMIN1 = SLAMCH( 'S' ) / SLAMCH( 'P' )
-      SFMAX1 = ONE / SFMIN1
-      SFMIN2 = SFMIN1*SCLFAC
-      SFMAX2 = ONE / SFMIN2
-  140 CONTINUE
-      NOCONV = .FALSE.
-*
-      DO 200 I = K, L
-         C = ZERO
-         R = ZERO
-*
-         DO 150 J = K, L
-            IF( J.EQ.I )
-     $         GO TO 150
-            C = C + ABS( A( J, I ) )
-            R = R + ABS( A( I, J ) )
-  150    CONTINUE
-         ICA = ISAMAX( L, A( 1, I ), 1 )
-         CA = ABS( A( ICA, I ) )
-         IRA = ISAMAX( N-K+1, A( I, K ), LDA )
-         RA = ABS( A( I, IRA+K-1 ) )
-*
-*        Guard against zero C or R due to underflow.
-*
-         IF( C.EQ.ZERO .OR. R.EQ.ZERO )
-     $      GO TO 200
-         G = R / SCLFAC
-         F = ONE
-         S = C + R
-  160    CONTINUE
-         IF( C.GE.G .OR. MAX( F, C, CA ).GE.SFMAX2 .OR.
-     $       MIN( R, G, RA ).LE.SFMIN2 )GO TO 170
-         F = F*SCLFAC
-         C = C*SCLFAC
-         CA = CA*SCLFAC
-         R = R / SCLFAC
-         G = G / SCLFAC
-         RA = RA / SCLFAC
-         GO TO 160
-*
-  170    CONTINUE
-         G = C / SCLFAC
-  180    CONTINUE
-         IF( G.LT.R .OR. MAX( R, RA ).GE.SFMAX2 .OR.
-     $       MIN( F, C, G, CA ).LE.SFMIN2 )GO TO 190
-         F = F / SCLFAC
-         C = C / SCLFAC
-         G = G / SCLFAC
-         CA = CA / SCLFAC
-         R = R*SCLFAC
-         RA = RA*SCLFAC
-         GO TO 180
-*
-*        Now balance.
-*
-  190    CONTINUE
-         IF( ( C+R ).GE.FACTOR*S )
-     $      GO TO 200
-         IF( F.LT.ONE .AND. SCALE( I ).LT.ONE ) THEN
-            IF( F*SCALE( I ).LE.SFMIN1 )
-     $         GO TO 200
-         END IF
-         IF( F.GT.ONE .AND. SCALE( I ).GT.ONE ) THEN
-            IF( SCALE( I ).GE.SFMAX1 / F )
-     $         GO TO 200
-         END IF
-         G = ONE / F
-         SCALE( I ) = SCALE( I )*F
-         NOCONV = .TRUE.
-*
-         CALL SSCAL( N-K+1, G, A( I, K ), LDA )
-         CALL SSCAL( L, F, A( 1, I ), 1 )
-*
-  200 CONTINUE
-*
-      IF( NOCONV )
-     $   GO TO 140
-*
-  210 CONTINUE
-      ILO = K
-      IHI = L
-*
-      RETURN
-*
-*     End of SGEBAL
-*
-      END
--- a/libcruft/lapack/sgebd2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,239 +0,0 @@
-      SUBROUTINE SGEBD2( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), D( * ), E( * ), TAUP( * ),
-     $                   TAUQ( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGEBD2 reduces a real general m by n matrix A to upper or lower
-*  bidiagonal form B by an orthogonal transformation: Q' * A * P = B.
-*
-*  If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows in the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns in the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the m by n general matrix to be reduced.
-*          On exit,
-*          if m >= n, the diagonal and the first superdiagonal are
-*            overwritten with the upper bidiagonal matrix B; the
-*            elements below the diagonal, with the array TAUQ, represent
-*            the orthogonal matrix Q as a product of elementary
-*            reflectors, and the elements above the first superdiagonal,
-*            with the array TAUP, represent the orthogonal matrix P as
-*            a product of elementary reflectors;
-*          if m < n, the diagonal and the first subdiagonal are
-*            overwritten with the lower bidiagonal matrix B; the
-*            elements below the first subdiagonal, with the array TAUQ,
-*            represent the orthogonal matrix Q as a product of
-*            elementary reflectors, and the elements above the diagonal,
-*            with the array TAUP, represent the orthogonal matrix P as
-*            a product of elementary reflectors.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  D       (output) REAL array, dimension (min(M,N))
-*          The diagonal elements of the bidiagonal matrix B:
-*          D(i) = A(i,i).
-*
-*  E       (output) REAL array, dimension (min(M,N)-1)
-*          The off-diagonal elements of the bidiagonal matrix B:
-*          if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1;
-*          if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1.
-*
-*  TAUQ    (output) REAL array dimension (min(M,N))
-*          The scalar factors of the elementary reflectors which
-*          represent the orthogonal matrix Q. See Further Details.
-*
-*  TAUP    (output) REAL array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors which
-*          represent the orthogonal matrix P. See Further Details.
-*
-*  WORK    (workspace) REAL array, dimension (max(M,N))
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit.
-*          < 0: if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrices Q and P are represented as products of elementary
-*  reflectors:
-*
-*  If m >= n,
-*
-*     Q = H(1) H(2) . . . H(n)  and  P = G(1) G(2) . . . G(n-1)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are real scalars, and v and u are real vectors;
-*  v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in A(i+1:m,i);
-*  u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in A(i,i+2:n);
-*  tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  If m < n,
-*
-*     Q = H(1) H(2) . . . H(m-1)  and  P = G(1) G(2) . . . G(m)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are real scalars, and v and u are real vectors;
-*  v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in A(i+2:m,i);
-*  u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in A(i,i+1:n);
-*  tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  The contents of A on exit are illustrated by the following examples:
-*
-*  m = 6 and n = 5 (m > n):          m = 5 and n = 6 (m < n):
-*
-*    (  d   e   u1  u1  u1 )           (  d   u1  u1  u1  u1  u1 )
-*    (  v1  d   e   u2  u2 )           (  e   d   u2  u2  u2  u2 )
-*    (  v1  v2  d   e   u3 )           (  v1  e   d   u3  u3  u3 )
-*    (  v1  v2  v3  d   e  )           (  v1  v2  e   d   u4  u4 )
-*    (  v1  v2  v3  v4  d  )           (  v1  v2  v3  e   d   u5 )
-*    (  v1  v2  v3  v4  v5 )
-*
-*  where d and e denote diagonal and off-diagonal elements of B, vi
-*  denotes an element of the vector defining H(i), and ui an element of
-*  the vector defining G(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARF, SLARFG, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.LT.0 ) THEN
-         CALL XERBLA( 'SGEBD2', -INFO )
-         RETURN
-      END IF
-*
-      IF( M.GE.N ) THEN
-*
-*        Reduce to upper bidiagonal form
-*
-         DO 10 I = 1, N
-*
-*           Generate elementary reflector H(i) to annihilate A(i+1:m,i)
-*
-            CALL SLARFG( M-I+1, A( I, I ), A( MIN( I+1, M ), I ), 1,
-     $                   TAUQ( I ) )
-            D( I ) = A( I, I )
-            A( I, I ) = ONE
-*
-*           Apply H(i) to A(i:m,i+1:n) from the left
-*
-            IF( I.LT.N )
-     $         CALL SLARF( 'Left', M-I+1, N-I, A( I, I ), 1, TAUQ( I ),
-     $                     A( I, I+1 ), LDA, WORK )
-            A( I, I ) = D( I )
-*
-            IF( I.LT.N ) THEN
-*
-*              Generate elementary reflector G(i) to annihilate
-*              A(i,i+2:n)
-*
-               CALL SLARFG( N-I, A( I, I+1 ), A( I, MIN( I+2, N ) ),
-     $                      LDA, TAUP( I ) )
-               E( I ) = A( I, I+1 )
-               A( I, I+1 ) = ONE
-*
-*              Apply G(i) to A(i+1:m,i+1:n) from the right
-*
-               CALL SLARF( 'Right', M-I, N-I, A( I, I+1 ), LDA,
-     $                     TAUP( I ), A( I+1, I+1 ), LDA, WORK )
-               A( I, I+1 ) = E( I )
-            ELSE
-               TAUP( I ) = ZERO
-            END IF
-   10    CONTINUE
-      ELSE
-*
-*        Reduce to lower bidiagonal form
-*
-         DO 20 I = 1, M
-*
-*           Generate elementary reflector G(i) to annihilate A(i,i+1:n)
-*
-            CALL SLARFG( N-I+1, A( I, I ), A( I, MIN( I+1, N ) ), LDA,
-     $                   TAUP( I ) )
-            D( I ) = A( I, I )
-            A( I, I ) = ONE
-*
-*           Apply G(i) to A(i+1:m,i:n) from the right
-*
-            IF( I.LT.M )
-     $         CALL SLARF( 'Right', M-I, N-I+1, A( I, I ), LDA,
-     $                     TAUP( I ), A( I+1, I ), LDA, WORK )
-            A( I, I ) = D( I )
-*
-            IF( I.LT.M ) THEN
-*
-*              Generate elementary reflector H(i) to annihilate
-*              A(i+2:m,i)
-*
-               CALL SLARFG( M-I, A( I+1, I ), A( MIN( I+2, M ), I ), 1,
-     $                      TAUQ( I ) )
-               E( I ) = A( I+1, I )
-               A( I+1, I ) = ONE
-*
-*              Apply H(i) to A(i+1:m,i+1:n) from the left
-*
-               CALL SLARF( 'Left', M-I, N-I, A( I+1, I ), 1, TAUQ( I ),
-     $                     A( I+1, I+1 ), LDA, WORK )
-               A( I+1, I ) = E( I )
-            ELSE
-               TAUQ( I ) = ZERO
-            END IF
-   20    CONTINUE
-      END IF
-      RETURN
-*
-*     End of SGEBD2
-*
-      END
--- a/libcruft/lapack/sgebrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,268 +0,0 @@
-      SUBROUTINE SGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), D( * ), E( * ), TAUP( * ),
-     $                   TAUQ( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGEBRD reduces a general real M-by-N matrix A to upper or lower
-*  bidiagonal form B by an orthogonal transformation: Q**T * A * P = B.
-*
-*  If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows in the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns in the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the M-by-N general matrix to be reduced.
-*          On exit,
-*          if m >= n, the diagonal and the first superdiagonal are
-*            overwritten with the upper bidiagonal matrix B; the
-*            elements below the diagonal, with the array TAUQ, represent
-*            the orthogonal matrix Q as a product of elementary
-*            reflectors, and the elements above the first superdiagonal,
-*            with the array TAUP, represent the orthogonal matrix P as
-*            a product of elementary reflectors;
-*          if m < n, the diagonal and the first subdiagonal are
-*            overwritten with the lower bidiagonal matrix B; the
-*            elements below the first subdiagonal, with the array TAUQ,
-*            represent the orthogonal matrix Q as a product of
-*            elementary reflectors, and the elements above the diagonal,
-*            with the array TAUP, represent the orthogonal matrix P as
-*            a product of elementary reflectors.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  D       (output) REAL array, dimension (min(M,N))
-*          The diagonal elements of the bidiagonal matrix B:
-*          D(i) = A(i,i).
-*
-*  E       (output) REAL array, dimension (min(M,N)-1)
-*          The off-diagonal elements of the bidiagonal matrix B:
-*          if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1;
-*          if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1.
-*
-*  TAUQ    (output) REAL array dimension (min(M,N))
-*          The scalar factors of the elementary reflectors which
-*          represent the orthogonal matrix Q. See Further Details.
-*
-*  TAUP    (output) REAL array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors which
-*          represent the orthogonal matrix P. See Further Details.
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The length of the array WORK.  LWORK >= max(1,M,N).
-*          For optimum performance LWORK >= (M+N)*NB, where NB
-*          is the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit 
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrices Q and P are represented as products of elementary
-*  reflectors:
-*
-*  If m >= n,
-*
-*     Q = H(1) H(2) . . . H(n)  and  P = G(1) G(2) . . . G(n-1)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are real scalars, and v and u are real vectors;
-*  v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in A(i+1:m,i);
-*  u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in A(i,i+2:n);
-*  tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  If m < n,
-*
-*     Q = H(1) H(2) . . . H(m-1)  and  P = G(1) G(2) . . . G(m)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are real scalars, and v and u are real vectors;
-*  v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in A(i+2:m,i);
-*  u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in A(i,i+1:n);
-*  tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  The contents of A on exit are illustrated by the following examples:
-*
-*  m = 6 and n = 5 (m > n):          m = 5 and n = 6 (m < n):
-*
-*    (  d   e   u1  u1  u1 )           (  d   u1  u1  u1  u1  u1 )
-*    (  v1  d   e   u2  u2 )           (  e   d   u2  u2  u2  u2 )
-*    (  v1  v2  d   e   u3 )           (  v1  e   d   u3  u3  u3 )
-*    (  v1  v2  v3  d   e  )           (  v1  v2  e   d   u4  u4 )
-*    (  v1  v2  v3  v4  d  )           (  v1  v2  v3  e   d   u5 )
-*    (  v1  v2  v3  v4  v5 )
-*
-*  where d and e denote diagonal and off-diagonal elements of B, vi
-*  denotes an element of the vector defining H(i), and ui an element of
-*  the vector defining G(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IINFO, J, LDWRKX, LDWRKY, LWKOPT, MINMN, NB,
-     $                   NBMIN, NX
-      REAL               WS
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEBD2, SGEMM, SLABRD, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN, REAL
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      NB = MAX( 1, ILAENV( 1, 'SGEBRD', ' ', M, N, -1, -1 ) )
-      LWKOPT = ( M+N )*NB
-      WORK( 1 ) = REAL( LWKOPT )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.MAX( 1, M, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.LT.0 ) THEN
-         CALL XERBLA( 'SGEBRD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      MINMN = MIN( M, N )
-      IF( MINMN.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      WS = MAX( M, N )
-      LDWRKX = M
-      LDWRKY = N
-*
-      IF( NB.GT.1 .AND. NB.LT.MINMN ) THEN
-*
-*        Set the crossover point NX.
-*
-         NX = MAX( NB, ILAENV( 3, 'SGEBRD', ' ', M, N, -1, -1 ) )
-*
-*        Determine when to switch from blocked to unblocked code.
-*
-         IF( NX.LT.MINMN ) THEN
-            WS = ( M+N )*NB
-            IF( LWORK.LT.WS ) THEN
-*
-*              Not enough work space for the optimal NB, consider using
-*              a smaller block size.
-*
-               NBMIN = ILAENV( 2, 'SGEBRD', ' ', M, N, -1, -1 )
-               IF( LWORK.GE.( M+N )*NBMIN ) THEN
-                  NB = LWORK / ( M+N )
-               ELSE
-                  NB = 1
-                  NX = MINMN
-               END IF
-            END IF
-         END IF
-      ELSE
-         NX = MINMN
-      END IF
-*
-      DO 30 I = 1, MINMN - NX, NB
-*
-*        Reduce rows and columns i:i+nb-1 to bidiagonal form and return
-*        the matrices X and Y which are needed to update the unreduced
-*        part of the matrix
-*
-         CALL SLABRD( M-I+1, N-I+1, NB, A( I, I ), LDA, D( I ), E( I ),
-     $                TAUQ( I ), TAUP( I ), WORK, LDWRKX,
-     $                WORK( LDWRKX*NB+1 ), LDWRKY )
-*
-*        Update the trailing submatrix A(i+nb:m,i+nb:n), using an update
-*        of the form  A := A - V*Y' - X*U'
-*
-         CALL SGEMM( 'No transpose', 'Transpose', M-I-NB+1, N-I-NB+1,
-     $               NB, -ONE, A( I+NB, I ), LDA,
-     $               WORK( LDWRKX*NB+NB+1 ), LDWRKY, ONE,
-     $               A( I+NB, I+NB ), LDA )
-         CALL SGEMM( 'No transpose', 'No transpose', M-I-NB+1, N-I-NB+1,
-     $               NB, -ONE, WORK( NB+1 ), LDWRKX, A( I, I+NB ), LDA,
-     $               ONE, A( I+NB, I+NB ), LDA )
-*
-*        Copy diagonal and off-diagonal elements of B back into A
-*
-         IF( M.GE.N ) THEN
-            DO 10 J = I, I + NB - 1
-               A( J, J ) = D( J )
-               A( J, J+1 ) = E( J )
-   10       CONTINUE
-         ELSE
-            DO 20 J = I, I + NB - 1
-               A( J, J ) = D( J )
-               A( J+1, J ) = E( J )
-   20       CONTINUE
-         END IF
-   30 CONTINUE
-*
-*     Use unblocked code to reduce the remainder of the matrix
-*
-      CALL SGEBD2( M-I+1, N-I+1, A( I, I ), LDA, D( I ), E( I ),
-     $             TAUQ( I ), TAUP( I ), WORK, IINFO )
-      WORK( 1 ) = WS
-      RETURN
-*
-*     End of SGEBRD
-*
-      END
--- a/libcruft/lapack/sgecon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,185 +0,0 @@
-      SUBROUTINE SGECON( NORM, N, A, LDA, ANORM, RCOND, WORK, IWORK,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call SLACN2 in place of SLACON, 7 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            INFO, LDA, N
-      REAL               ANORM, RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      REAL               A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGECON estimates the reciprocal of the condition number of a general
-*  real matrix A, in either the 1-norm or the infinity-norm, using
-*  the LU factorization computed by SGETRF.
-*
-*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
-*  condition number is computed as
-*     RCOND = 1 / ( norm(A) * norm(inv(A)) ).
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies whether the 1-norm condition number or the
-*          infinity-norm condition number is required:
-*          = '1' or 'O':  1-norm;
-*          = 'I':         Infinity-norm.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input) REAL array, dimension (LDA,N)
-*          The factors L and U from the factorization A = P*L*U
-*          as computed by SGETRF.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  ANORM   (input) REAL
-*          If NORM = '1' or 'O', the 1-norm of the original matrix A.
-*          If NORM = 'I', the infinity-norm of the original matrix A.
-*
-*  RCOND   (output) REAL
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(norm(A) * norm(inv(A))).
-*
-*  WORK    (workspace) REAL array, dimension (4*N)
-*
-*  IWORK   (workspace) INTEGER array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ONENRM
-      CHARACTER          NORMIN
-      INTEGER            IX, KASE, KASE1
-      REAL               AINVNM, SCALE, SL, SMLNUM, SU
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ISAMAX
-      REAL               SLAMCH
-      EXTERNAL           LSAME, ISAMAX, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLACN2, SLATRS, SRSCL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' )
-      IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( ANORM.LT.ZERO ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGECON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      RCOND = ZERO
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      ELSE IF( ANORM.EQ.ZERO ) THEN
-         RETURN
-      END IF
-*
-      SMLNUM = SLAMCH( 'Safe minimum' )
-*
-*     Estimate the norm of inv(A).
-*
-      AINVNM = ZERO
-      NORMIN = 'N'
-      IF( ONENRM ) THEN
-         KASE1 = 1
-      ELSE
-         KASE1 = 2
-      END IF
-      KASE = 0
-   10 CONTINUE
-      CALL SLACN2( N, WORK( N+1 ), WORK, IWORK, AINVNM, KASE, ISAVE )
-      IF( KASE.NE.0 ) THEN
-         IF( KASE.EQ.KASE1 ) THEN
-*
-*           Multiply by inv(L).
-*
-            CALL SLATRS( 'Lower', 'No transpose', 'Unit', NORMIN, N, A,
-     $                   LDA, WORK, SL, WORK( 2*N+1 ), INFO )
-*
-*           Multiply by inv(U).
-*
-            CALL SLATRS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   A, LDA, WORK, SU, WORK( 3*N+1 ), INFO )
-         ELSE
-*
-*           Multiply by inv(U').
-*
-            CALL SLATRS( 'Upper', 'Transpose', 'Non-unit', NORMIN, N, A,
-     $                   LDA, WORK, SU, WORK( 3*N+1 ), INFO )
-*
-*           Multiply by inv(L').
-*
-            CALL SLATRS( 'Lower', 'Transpose', 'Unit', NORMIN, N, A,
-     $                   LDA, WORK, SL, WORK( 2*N+1 ), INFO )
-         END IF
-*
-*        Divide X by 1/(SL*SU) if doing so will not cause overflow.
-*
-         SCALE = SL*SU
-         NORMIN = 'Y'
-         IF( SCALE.NE.ONE ) THEN
-            IX = ISAMAX( N, WORK, 1 )
-            IF( SCALE.LT.ABS( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
-     $         GO TO 20
-            CALL SRSCL( N, SCALE, WORK, 1 )
-         END IF
-         GO TO 10
-      END IF
-*
-*     Compute the estimate of the reciprocal condition number.
-*
-      IF( AINVNM.NE.ZERO )
-     $   RCOND = ( ONE / AINVNM ) / ANORM
-*
-   20 CONTINUE
-      RETURN
-*
-*     End of SGECON
-*
-      END
--- a/libcruft/lapack/sgeesx.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,527 +0,0 @@
-      SUBROUTINE SGEESX( JOBVS, SORT, SELECT, SENSE, N, A, LDA, SDIM,
-     $                   WR, WI, VS, LDVS, RCONDE, RCONDV, WORK, LWORK,
-     $                   IWORK, LIWORK, BWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBVS, SENSE, SORT
-      INTEGER            INFO, LDA, LDVS, LIWORK, LWORK, N, SDIM
-      REAL               RCONDE, RCONDV
-*     ..
-*     .. Array Arguments ..
-      LOGICAL            BWORK( * )
-      INTEGER            IWORK( * )
-      REAL               A( LDA, * ), VS( LDVS, * ), WI( * ), WORK( * ),
-     $                   WR( * )
-*     ..
-*     .. Function Arguments ..
-      LOGICAL            SELECT
-      EXTERNAL           SELECT
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGEESX computes for an N-by-N real nonsymmetric matrix A, the
-*  eigenvalues, the real Schur form T, and, optionally, the matrix of
-*  Schur vectors Z.  This gives the Schur factorization A = Z*T*(Z**T).
-*
-*  Optionally, it also orders the eigenvalues on the diagonal of the
-*  real Schur form so that selected eigenvalues are at the top left;
-*  computes a reciprocal condition number for the average of the
-*  selected eigenvalues (RCONDE); and computes a reciprocal condition
-*  number for the right invariant subspace corresponding to the
-*  selected eigenvalues (RCONDV).  The leading columns of Z form an
-*  orthonormal basis for this invariant subspace.
-*
-*  For further explanation of the reciprocal condition numbers RCONDE
-*  and RCONDV, see Section 4.10 of the LAPACK Users' Guide (where
-*  these quantities are called s and sep respectively).
-*
-*  A real matrix is in real Schur form if it is upper quasi-triangular
-*  with 1-by-1 and 2-by-2 blocks. 2-by-2 blocks will be standardized in
-*  the form
-*            [  a  b  ]
-*            [  c  a  ]
-*
-*  where b*c < 0. The eigenvalues of such a block are a +- sqrt(bc).
-*
-*  Arguments
-*  =========
-*
-*  JOBVS   (input) CHARACTER*1
-*          = 'N': Schur vectors are not computed;
-*          = 'V': Schur vectors are computed.
-*
-*  SORT    (input) CHARACTER*1
-*          Specifies whether or not to order the eigenvalues on the
-*          diagonal of the Schur form.
-*          = 'N': Eigenvalues are not ordered;
-*          = 'S': Eigenvalues are ordered (see SELECT).
-*
-*  SELECT  (external procedure) LOGICAL FUNCTION of two REAL arguments
-*          SELECT must be declared EXTERNAL in the calling subroutine.
-*          If SORT = 'S', SELECT is used to select eigenvalues to sort
-*          to the top left of the Schur form.
-*          If SORT = 'N', SELECT is not referenced.
-*          An eigenvalue WR(j)+sqrt(-1)*WI(j) is selected if
-*          SELECT(WR(j),WI(j)) is true; i.e., if either one of a
-*          complex conjugate pair of eigenvalues is selected, then both
-*          are.  Note that a selected complex eigenvalue may no longer
-*          satisfy SELECT(WR(j),WI(j)) = .TRUE. after ordering, since
-*          ordering may change the value of complex eigenvalues
-*          (especially if the eigenvalue is ill-conditioned); in this
-*          case INFO may be set to N+3 (see INFO below).
-*
-*  SENSE   (input) CHARACTER*1
-*          Determines which reciprocal condition numbers are computed.
-*          = 'N': None are computed;
-*          = 'E': Computed for average of selected eigenvalues only;
-*          = 'V': Computed for selected right invariant subspace only;
-*          = 'B': Computed for both.
-*          If SENSE = 'E', 'V' or 'B', SORT must equal 'S'.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A. N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA, N)
-*          On entry, the N-by-N matrix A.
-*          On exit, A is overwritten by its real Schur form T.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  SDIM    (output) INTEGER
-*          If SORT = 'N', SDIM = 0.
-*          If SORT = 'S', SDIM = number of eigenvalues (after sorting)
-*                         for which SELECT is true. (Complex conjugate
-*                         pairs for which SELECT is true for either
-*                         eigenvalue count as 2.)
-*
-*  WR      (output) REAL array, dimension (N)
-*  WI      (output) REAL array, dimension (N)
-*          WR and WI contain the real and imaginary parts, respectively,
-*          of the computed eigenvalues, in the same order that they
-*          appear on the diagonal of the output Schur form T.  Complex
-*          conjugate pairs of eigenvalues appear consecutively with the
-*          eigenvalue having the positive imaginary part first.
-*
-*  VS      (output) REAL array, dimension (LDVS,N)
-*          If JOBVS = 'V', VS contains the orthogonal matrix Z of Schur
-*          vectors.
-*          If JOBVS = 'N', VS is not referenced.
-*
-*  LDVS    (input) INTEGER
-*          The leading dimension of the array VS.  LDVS >= 1, and if
-*          JOBVS = 'V', LDVS >= N.
-*
-*  RCONDE  (output) REAL
-*          If SENSE = 'E' or 'B', RCONDE contains the reciprocal
-*          condition number for the average of the selected eigenvalues.
-*          Not referenced if SENSE = 'N' or 'V'.
-*
-*  RCONDV  (output) REAL
-*          If SENSE = 'V' or 'B', RCONDV contains the reciprocal
-*          condition number for the selected right invariant subspace.
-*          Not referenced if SENSE = 'N' or 'E'.
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,3*N).
-*          Also, if SENSE = 'E' or 'V' or 'B',
-*          LWORK >= N+2*SDIM*(N-SDIM), where SDIM is the number of
-*          selected eigenvalues computed by this routine.  Note that
-*          N+2*SDIM*(N-SDIM) <= N+N*N/2. Note also that an error is only
-*          returned if LWORK < max(1,3*N), but if SENSE = 'E' or 'V' or
-*          'B' this may not be large enough.
-*          For good performance, LWORK must generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates upper bounds on the optimal sizes of the
-*          arrays WORK and IWORK, returns these values as the first
-*          entries of the WORK and IWORK arrays, and no error messages
-*          related to LWORK or LIWORK are issued by XERBLA.
-*
-*  IWORK   (workspace/output) INTEGER array, dimension (MAX(1,LIWORK))
-*          On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK.
-*
-*  LIWORK  (input) INTEGER
-*          The dimension of the array IWORK.
-*          LIWORK >= 1; if SENSE = 'V' or 'B', LIWORK >= SDIM*(N-SDIM).
-*          Note that SDIM*(N-SDIM) <= N*N/4. Note also that an error is
-*          only returned if LIWORK < 1, but if SENSE = 'V' or 'B' this
-*          may not be large enough.
-*
-*          If LIWORK = -1, then a workspace query is assumed; the
-*          routine only calculates upper bounds on the optimal sizes of
-*          the arrays WORK and IWORK, returns these values as the first
-*          entries of the WORK and IWORK arrays, and no error messages
-*          related to LWORK or LIWORK are issued by XERBLA.
-*
-*  BWORK   (workspace) LOGICAL array, dimension (N)
-*          Not referenced if SORT = 'N'.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value.
-*          > 0: if INFO = i, and i is
-*             <= N: the QR algorithm failed to compute all the
-*                   eigenvalues; elements 1:ILO-1 and i+1:N of WR and WI
-*                   contain those eigenvalues which have converged; if
-*                   JOBVS = 'V', VS contains the transformation which
-*                   reduces A to its partially converged Schur form.
-*             = N+1: the eigenvalues could not be reordered because some
-*                   eigenvalues were too close to separate (the problem
-*                   is very ill-conditioned);
-*             = N+2: after reordering, roundoff changed values of some
-*                   complex eigenvalues so that leading eigenvalues in
-*                   the Schur form no longer satisfy SELECT=.TRUE.  This
-*                   could also be caused by underflow due to scaling.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            CURSL, LASTSL, LQUERY, LST2SL, SCALEA, WANTSB,
-     $                   WANTSE, WANTSN, WANTST, WANTSV, WANTVS
-      INTEGER            HSWORK, I, I1, I2, IBAL, ICOND, IERR, IEVAL,
-     $                   IHI, ILO, INXT, IP, ITAU, IWRK, LWRK, LIWRK,
-     $                   MAXWRK, MINWRK
-      REAL               ANRM, BIGNUM, CSCALE, EPS, SMLNUM
-*     ..
-*     .. Local Arrays ..
-      REAL               DUM( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SGEBAK, SGEBAL, SGEHRD, SHSEQR, SLABAD,
-     $                   SLACPY, SLASCL, SORGHR, SSWAP, STRSEN, XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      REAL               SLAMCH, SLANGE
-      EXTERNAL           LSAME, ILAENV, SLAMCH, SLANGE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      WANTVS = LSAME( JOBVS, 'V' )
-      WANTST = LSAME( SORT, 'S' )
-      WANTSN = LSAME( SENSE, 'N' )
-      WANTSE = LSAME( SENSE, 'E' )
-      WANTSV = LSAME( SENSE, 'V' )
-      WANTSB = LSAME( SENSE, 'B' )
-      LQUERY = ( LWORK.EQ.-1 .OR. LIWORK.EQ.-1 )
-      IF( ( .NOT.WANTVS ) .AND. ( .NOT.LSAME( JOBVS, 'N' ) ) ) THEN
-         INFO = -1
-      ELSE IF( ( .NOT.WANTST ) .AND. ( .NOT.LSAME( SORT, 'N' ) ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.( WANTSN .OR. WANTSE .OR. WANTSV .OR. WANTSB ) .OR.
-     $         ( .NOT.WANTST .AND. .NOT.WANTSN ) ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDVS.LT.1 .OR. ( WANTVS .AND. LDVS.LT.N ) ) THEN
-         INFO = -12
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "RWorkspace:" describe the
-*       minimal amount of real workspace needed at that point in the
-*       code, as well as the preferred amount for good performance.
-*       IWorkspace refers to integer workspace.
-*       NB refers to the optimal block size for the immediately
-*       following subroutine, as returned by ILAENV.
-*       HSWORK refers to the workspace preferred by SHSEQR, as
-*       calculated below. HSWORK is computed assuming ILO=1 and IHI=N,
-*       the worst case.
-*       If SENSE = 'E', 'V' or 'B', then the amount of workspace needed
-*       depends on SDIM, which is computed by the routine STRSEN later
-*       in the code.)
-*
-      IF( INFO.EQ.0 ) THEN
-         LIWRK = 1
-         IF( N.EQ.0 ) THEN
-            MINWRK = 1
-            LWRK = 1
-         ELSE
-            MAXWRK = 2*N + N*ILAENV( 1, 'SGEHRD', ' ', N, 1, N, 0 )
-            MINWRK = 3*N
-*
-            CALL SHSEQR( 'S', JOBVS, N, 1, N, A, LDA, WR, WI, VS, LDVS,
-     $             WORK, -1, IEVAL )
-            HSWORK = WORK( 1 )
-*
-            IF( .NOT.WANTVS ) THEN
-               MAXWRK = MAX( MAXWRK, N + HSWORK )
-            ELSE
-               MAXWRK = MAX( MAXWRK, 2*N + ( N - 1 )*ILAENV( 1,
-     $                       'SORGHR', ' ', N, 1, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, N + HSWORK )
-            END IF
-            LWRK = MAXWRK
-            IF( .NOT.WANTSN )
-     $         LWRK = MAX( LWRK, N + ( N*N )/2 )
-            IF( WANTSV .OR. WANTSB )
-     $         LIWRK = ( N*N )/4
-         END IF
-         IWORK( 1 ) = LIWRK
-         WORK( 1 ) = LWRK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
-            INFO = -16
-         ELSE IF( LIWORK.LT.1 .AND. .NOT.LQUERY ) THEN
-            INFO = -18
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGEESX', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         SDIM = 0
-         RETURN
-      END IF
-*
-*     Get machine constants
-*
-      EPS = SLAMCH( 'P' )
-      SMLNUM = SLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SQRT( SMLNUM ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = SLANGE( 'M', N, N, A, LDA, DUM )
-      SCALEA = .FALSE.
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-         SCALEA = .TRUE.
-         CSCALE = SMLNUM
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-         SCALEA = .TRUE.
-         CSCALE = BIGNUM
-      END IF
-      IF( SCALEA )
-     $   CALL SLASCL( 'G', 0, 0, ANRM, CSCALE, N, N, A, LDA, IERR )
-*
-*     Permute the matrix to make it more nearly triangular
-*     (RWorkspace: need N)
-*
-      IBAL = 1
-      CALL SGEBAL( 'P', N, A, LDA, ILO, IHI, WORK( IBAL ), IERR )
-*
-*     Reduce to upper Hessenberg form
-*     (RWorkspace: need 3*N, prefer 2*N+N*NB)
-*
-      ITAU = N + IBAL
-      IWRK = N + ITAU
-      CALL SGEHRD( N, ILO, IHI, A, LDA, WORK( ITAU ), WORK( IWRK ),
-     $             LWORK-IWRK+1, IERR )
-*
-      IF( WANTVS ) THEN
-*
-*        Copy Householder vectors to VS
-*
-         CALL SLACPY( 'L', N, N, A, LDA, VS, LDVS )
-*
-*        Generate orthogonal matrix in VS
-*        (RWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*
-         CALL SORGHR( N, ILO, IHI, VS, LDVS, WORK( ITAU ), WORK( IWRK ),
-     $                LWORK-IWRK+1, IERR )
-      END IF
-*
-      SDIM = 0
-*
-*     Perform QR iteration, accumulating Schur vectors in VS if desired
-*     (RWorkspace: need N+1, prefer N+HSWORK (see comments) )
-*
-      IWRK = ITAU
-      CALL SHSEQR( 'S', JOBVS, N, ILO, IHI, A, LDA, WR, WI, VS, LDVS,
-     $             WORK( IWRK ), LWORK-IWRK+1, IEVAL )
-      IF( IEVAL.GT.0 )
-     $   INFO = IEVAL
-*
-*     Sort eigenvalues if desired
-*
-      IF( WANTST .AND. INFO.EQ.0 ) THEN
-         IF( SCALEA ) THEN
-            CALL SLASCL( 'G', 0, 0, CSCALE, ANRM, N, 1, WR, N, IERR )
-            CALL SLASCL( 'G', 0, 0, CSCALE, ANRM, N, 1, WI, N, IERR )
-         END IF
-         DO 10 I = 1, N
-            BWORK( I ) = SELECT( WR( I ), WI( I ) )
-   10    CONTINUE
-*
-*        Reorder eigenvalues, transform Schur vectors, and compute
-*        reciprocal condition numbers
-*        (RWorkspace: if SENSE is not 'N', need N+2*SDIM*(N-SDIM)
-*                     otherwise, need N )
-*        (IWorkspace: if SENSE is 'V' or 'B', need SDIM*(N-SDIM)
-*                     otherwise, need 0 )
-*
-         CALL STRSEN( SENSE, JOBVS, BWORK, N, A, LDA, VS, LDVS, WR, WI,
-     $                SDIM, RCONDE, RCONDV, WORK( IWRK ), LWORK-IWRK+1,
-     $                IWORK, LIWORK, ICOND )
-         IF( .NOT.WANTSN )
-     $      MAXWRK = MAX( MAXWRK, N+2*SDIM*( N-SDIM ) )
-         IF( ICOND.EQ.-15 ) THEN
-*
-*           Not enough real workspace
-*
-            INFO = -16
-         ELSE IF( ICOND.EQ.-17 ) THEN
-*
-*           Not enough integer workspace
-*
-            INFO = -18
-         ELSE IF( ICOND.GT.0 ) THEN
-*
-*           STRSEN failed to reorder or to restore standard Schur form
-*
-            INFO = ICOND + N
-         END IF
-      END IF
-*
-      IF( WANTVS ) THEN
-*
-*        Undo balancing
-*        (RWorkspace: need N)
-*
-         CALL SGEBAK( 'P', 'R', N, ILO, IHI, WORK( IBAL ), N, VS, LDVS,
-     $                IERR )
-      END IF
-*
-      IF( SCALEA ) THEN
-*
-*        Undo scaling for the Schur form of A
-*
-         CALL SLASCL( 'H', 0, 0, CSCALE, ANRM, N, N, A, LDA, IERR )
-         CALL SCOPY( N, A, LDA+1, WR, 1 )
-         IF( ( WANTSV .OR. WANTSB ) .AND. INFO.EQ.0 ) THEN
-            DUM( 1 ) = RCONDV
-            CALL SLASCL( 'G', 0, 0, CSCALE, ANRM, 1, 1, DUM, 1, IERR )
-            RCONDV = DUM( 1 )
-         END IF
-         IF( CSCALE.EQ.SMLNUM ) THEN
-*
-*           If scaling back towards underflow, adjust WI if an
-*           offdiagonal element of a 2-by-2 block in the Schur form
-*           underflows.
-*
-            IF( IEVAL.GT.0 ) THEN
-               I1 = IEVAL + 1
-               I2 = IHI - 1
-               CALL SLASCL( 'G', 0, 0, CSCALE, ANRM, ILO-1, 1, WI, N,
-     $                      IERR )
-            ELSE IF( WANTST ) THEN
-               I1 = 1
-               I2 = N - 1
-            ELSE
-               I1 = ILO
-               I2 = IHI - 1
-            END IF
-            INXT = I1 - 1
-            DO 20 I = I1, I2
-               IF( I.LT.INXT )
-     $            GO TO 20
-               IF( WI( I ).EQ.ZERO ) THEN
-                  INXT = I + 1
-               ELSE
-                  IF( A( I+1, I ).EQ.ZERO ) THEN
-                     WI( I ) = ZERO
-                     WI( I+1 ) = ZERO
-                  ELSE IF( A( I+1, I ).NE.ZERO .AND. A( I, I+1 ).EQ.
-     $                     ZERO ) THEN
-                     WI( I ) = ZERO
-                     WI( I+1 ) = ZERO
-                     IF( I.GT.1 )
-     $                  CALL SSWAP( I-1, A( 1, I ), 1, A( 1, I+1 ), 1 )
-                     IF( N.GT.I+1 )
-     $                  CALL SSWAP( N-I-1, A( I, I+2 ), LDA,
-     $                              A( I+1, I+2 ), LDA )
-                     CALL SSWAP( N, VS( 1, I ), 1, VS( 1, I+1 ), 1 )
-                     A( I, I+1 ) = A( I+1, I )
-                     A( I+1, I ) = ZERO
-                  END IF
-                  INXT = I + 2
-               END IF
-   20       CONTINUE
-         END IF
-         CALL SLASCL( 'G', 0, 0, CSCALE, ANRM, N-IEVAL, 1,
-     $                WI( IEVAL+1 ), MAX( N-IEVAL, 1 ), IERR )
-      END IF
-*
-      IF( WANTST .AND. INFO.EQ.0 ) THEN
-*
-*        Check if reordering successful
-*
-         LASTSL = .TRUE.
-         LST2SL = .TRUE.
-         SDIM = 0
-         IP = 0
-         DO 30 I = 1, N
-            CURSL = SELECT( WR( I ), WI( I ) )
-            IF( WI( I ).EQ.ZERO ) THEN
-               IF( CURSL )
-     $            SDIM = SDIM + 1
-               IP = 0
-               IF( CURSL .AND. .NOT.LASTSL )
-     $            INFO = N + 2
-            ELSE
-               IF( IP.EQ.1 ) THEN
-*
-*                 Last eigenvalue of conjugate pair
-*
-                  CURSL = CURSL .OR. LASTSL
-                  LASTSL = CURSL
-                  IF( CURSL )
-     $               SDIM = SDIM + 2
-                  IP = -1
-                  IF( CURSL .AND. .NOT.LST2SL )
-     $               INFO = N + 2
-               ELSE
-*
-*                 First eigenvalue of conjugate pair
-*
-                  IP = 1
-               END IF
-            END IF
-            LST2SL = LASTSL
-            LASTSL = CURSL
-   30    CONTINUE
-      END IF
-*
-      WORK( 1 ) = MAXWRK
-      IF( WANTSV .OR. WANTSB ) THEN
-         IWORK( 1 ) = SDIM*(N-SDIM)
-      ELSE
-         IWORK( 1 ) = 1
-      END IF
-*
-      RETURN
-*
-*     End of SGEESX
-*
-      END
--- a/libcruft/lapack/sgeev.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,423 +0,0 @@
-      SUBROUTINE SGEEV( JOBVL, JOBVR, N, A, LDA, WR, WI, VL, LDVL, VR,
-     $                  LDVR, WORK, LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBVL, JOBVR
-      INTEGER            INFO, LDA, LDVL, LDVR, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), VL( LDVL, * ), VR( LDVR, * ),
-     $                   WI( * ), WORK( * ), WR( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGEEV computes for an N-by-N real nonsymmetric matrix A, the
-*  eigenvalues and, optionally, the left and/or right eigenvectors.
-*
-*  The right eigenvector v(j) of A satisfies
-*                   A * v(j) = lambda(j) * v(j)
-*  where lambda(j) is its eigenvalue.
-*  The left eigenvector u(j) of A satisfies
-*                u(j)**H * A = lambda(j) * u(j)**H
-*  where u(j)**H denotes the conjugate transpose of u(j).
-*
-*  The computed eigenvectors are normalized to have Euclidean norm
-*  equal to 1 and largest component real.
-*
-*  Arguments
-*  =========
-*
-*  JOBVL   (input) CHARACTER*1
-*          = 'N': left eigenvectors of A are not computed;
-*          = 'V': left eigenvectors of A are computed.
-*
-*  JOBVR   (input) CHARACTER*1
-*          = 'N': right eigenvectors of A are not computed;
-*          = 'V': right eigenvectors of A are computed.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A. N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the N-by-N matrix A.
-*          On exit, A has been overwritten.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  WR      (output) REAL array, dimension (N)
-*  WI      (output) REAL array, dimension (N)
-*          WR and WI contain the real and imaginary parts,
-*          respectively, of the computed eigenvalues.  Complex
-*          conjugate pairs of eigenvalues appear consecutively
-*          with the eigenvalue having the positive imaginary part
-*          first.
-*
-*  VL      (output) REAL array, dimension (LDVL,N)
-*          If JOBVL = 'V', the left eigenvectors u(j) are stored one
-*          after another in the columns of VL, in the same order
-*          as their eigenvalues.
-*          If JOBVL = 'N', VL is not referenced.
-*          If the j-th eigenvalue is real, then u(j) = VL(:,j),
-*          the j-th column of VL.
-*          If the j-th and (j+1)-st eigenvalues form a complex
-*          conjugate pair, then u(j) = VL(:,j) + i*VL(:,j+1) and
-*          u(j+1) = VL(:,j) - i*VL(:,j+1).
-*
-*  LDVL    (input) INTEGER
-*          The leading dimension of the array VL.  LDVL >= 1; if
-*          JOBVL = 'V', LDVL >= N.
-*
-*  VR      (output) REAL array, dimension (LDVR,N)
-*          If JOBVR = 'V', the right eigenvectors v(j) are stored one
-*          after another in the columns of VR, in the same order
-*          as their eigenvalues.
-*          If JOBVR = 'N', VR is not referenced.
-*          If the j-th eigenvalue is real, then v(j) = VR(:,j),
-*          the j-th column of VR.
-*          If the j-th and (j+1)-st eigenvalues form a complex
-*          conjugate pair, then v(j) = VR(:,j) + i*VR(:,j+1) and
-*          v(j+1) = VR(:,j) - i*VR(:,j+1).
-*
-*  LDVR    (input) INTEGER
-*          The leading dimension of the array VR.  LDVR >= 1; if
-*          JOBVR = 'V', LDVR >= N.
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,3*N), and
-*          if JOBVL = 'V' or JOBVR = 'V', LWORK >= 4*N.  For good
-*          performance, LWORK must generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if INFO = i, the QR algorithm failed to compute all the
-*                eigenvalues, and no eigenvectors have been computed;
-*                elements i+1:N of WR and WI contain eigenvalues which
-*                have converged.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, SCALEA, WANTVL, WANTVR
-      CHARACTER          SIDE
-      INTEGER            HSWORK, I, IBAL, IERR, IHI, ILO, ITAU, IWRK, K,
-     $                   MAXWRK, MINWRK, NOUT
-      REAL               ANRM, BIGNUM, CS, CSCALE, EPS, R, SCL, SMLNUM,
-     $                   SN
-*     ..
-*     .. Local Arrays ..
-      LOGICAL            SELECT( 1 )
-      REAL               DUM( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEBAK, SGEBAL, SGEHRD, SHSEQR, SLABAD, SLACPY,
-     $                   SLARTG, SLASCL, SORGHR, SROT, SSCAL, STREVC,
-     $                   XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV, ISAMAX
-      REAL               SLAMCH, SLANGE, SLAPY2, SNRM2
-      EXTERNAL           LSAME, ILAENV, ISAMAX, SLAMCH, SLANGE, SLAPY2,
-     $                   SNRM2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      WANTVL = LSAME( JOBVL, 'V' )
-      WANTVR = LSAME( JOBVR, 'V' )
-      IF( ( .NOT.WANTVL ) .AND. ( .NOT.LSAME( JOBVL, 'N' ) ) ) THEN
-         INFO = -1
-      ELSE IF( ( .NOT.WANTVR ) .AND. ( .NOT.LSAME( JOBVR, 'N' ) ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDVL.LT.1 .OR. ( WANTVL .AND. LDVL.LT.N ) ) THEN
-         INFO = -9
-      ELSE IF( LDVR.LT.1 .OR. ( WANTVR .AND. LDVR.LT.N ) ) THEN
-         INFO = -11
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of workspace needed at that point in the code,
-*       as well as the preferred amount for good performance.
-*       NB refers to the optimal block size for the immediately
-*       following subroutine, as returned by ILAENV.
-*       HSWORK refers to the workspace preferred by SHSEQR, as
-*       calculated below. HSWORK is computed assuming ILO=1 and IHI=N,
-*       the worst case.)
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( N.EQ.0 ) THEN
-            MINWRK = 1
-            MAXWRK = 1
-         ELSE
-            MAXWRK = 2*N + N*ILAENV( 1, 'SGEHRD', ' ', N, 1, N, 0 )
-            IF( WANTVL ) THEN
-               MINWRK = 4*N
-               MAXWRK = MAX( MAXWRK, 2*N + ( N - 1 )*ILAENV( 1,
-     $                       'SORGHR', ' ', N, 1, N, -1 ) )
-               CALL SHSEQR( 'S', 'V', N, 1, N, A, LDA, WR, WI, VL, LDVL,
-     $                WORK, -1, INFO )
-               HSWORK = WORK( 1 )
-               MAXWRK = MAX( MAXWRK, N + 1, N + HSWORK )
-               MAXWRK = MAX( MAXWRK, 4*N )
-            ELSE IF( WANTVR ) THEN
-               MINWRK = 4*N
-               MAXWRK = MAX( MAXWRK, 2*N + ( N - 1 )*ILAENV( 1,
-     $                       'SORGHR', ' ', N, 1, N, -1 ) )
-               CALL SHSEQR( 'S', 'V', N, 1, N, A, LDA, WR, WI, VR, LDVR,
-     $                WORK, -1, INFO )
-               HSWORK = WORK( 1 )
-               MAXWRK = MAX( MAXWRK, N + 1, N + HSWORK )
-               MAXWRK = MAX( MAXWRK, 4*N )
-            ELSE 
-               MINWRK = 3*N
-               CALL SHSEQR( 'E', 'N', N, 1, N, A, LDA, WR, WI, VR, LDVR,
-     $                WORK, -1, INFO )
-               HSWORK = WORK( 1 )
-               MAXWRK = MAX( MAXWRK, N + 1, N + HSWORK )
-            END IF
-            MAXWRK = MAX( MAXWRK, MINWRK )
-         END IF
-         WORK( 1 ) = MAXWRK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
-            INFO = -13
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGEEV ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Get machine constants
-*
-      EPS = SLAMCH( 'P' )
-      SMLNUM = SLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SQRT( SMLNUM ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = SLANGE( 'M', N, N, A, LDA, DUM )
-      SCALEA = .FALSE.
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-         SCALEA = .TRUE.
-         CSCALE = SMLNUM
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-         SCALEA = .TRUE.
-         CSCALE = BIGNUM
-      END IF
-      IF( SCALEA )
-     $   CALL SLASCL( 'G', 0, 0, ANRM, CSCALE, N, N, A, LDA, IERR )
-*
-*     Balance the matrix
-*     (Workspace: need N)
-*
-      IBAL = 1
-      CALL SGEBAL( 'B', N, A, LDA, ILO, IHI, WORK( IBAL ), IERR )
-*
-*     Reduce to upper Hessenberg form
-*     (Workspace: need 3*N, prefer 2*N+N*NB)
-*
-      ITAU = IBAL + N
-      IWRK = ITAU + N
-      CALL SGEHRD( N, ILO, IHI, A, LDA, WORK( ITAU ), WORK( IWRK ),
-     $             LWORK-IWRK+1, IERR )
-*
-      IF( WANTVL ) THEN
-*
-*        Want left eigenvectors
-*        Copy Householder vectors to VL
-*
-         SIDE = 'L'
-         CALL SLACPY( 'L', N, N, A, LDA, VL, LDVL )
-*
-*        Generate orthogonal matrix in VL
-*        (Workspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*
-         CALL SORGHR( N, ILO, IHI, VL, LDVL, WORK( ITAU ), WORK( IWRK ),
-     $                LWORK-IWRK+1, IERR )
-*
-*        Perform QR iteration, accumulating Schur vectors in VL
-*        (Workspace: need N+1, prefer N+HSWORK (see comments) )
-*
-         IWRK = ITAU
-         CALL SHSEQR( 'S', 'V', N, ILO, IHI, A, LDA, WR, WI, VL, LDVL,
-     $                WORK( IWRK ), LWORK-IWRK+1, INFO )
-*
-         IF( WANTVR ) THEN
-*
-*           Want left and right eigenvectors
-*           Copy Schur vectors to VR
-*
-            SIDE = 'B'
-            CALL SLACPY( 'F', N, N, VL, LDVL, VR, LDVR )
-         END IF
-*
-      ELSE IF( WANTVR ) THEN
-*
-*        Want right eigenvectors
-*        Copy Householder vectors to VR
-*
-         SIDE = 'R'
-         CALL SLACPY( 'L', N, N, A, LDA, VR, LDVR )
-*
-*        Generate orthogonal matrix in VR
-*        (Workspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*
-         CALL SORGHR( N, ILO, IHI, VR, LDVR, WORK( ITAU ), WORK( IWRK ),
-     $                LWORK-IWRK+1, IERR )
-*
-*        Perform QR iteration, accumulating Schur vectors in VR
-*        (Workspace: need N+1, prefer N+HSWORK (see comments) )
-*
-         IWRK = ITAU
-         CALL SHSEQR( 'S', 'V', N, ILO, IHI, A, LDA, WR, WI, VR, LDVR,
-     $                WORK( IWRK ), LWORK-IWRK+1, INFO )
-*
-      ELSE
-*
-*        Compute eigenvalues only
-*        (Workspace: need N+1, prefer N+HSWORK (see comments) )
-*
-         IWRK = ITAU
-         CALL SHSEQR( 'E', 'N', N, ILO, IHI, A, LDA, WR, WI, VR, LDVR,
-     $                WORK( IWRK ), LWORK-IWRK+1, INFO )
-      END IF
-*
-*     If INFO > 0 from SHSEQR, then quit
-*
-      IF( INFO.GT.0 )
-     $   GO TO 50
-*
-      IF( WANTVL .OR. WANTVR ) THEN
-*
-*        Compute left and/or right eigenvectors
-*        (Workspace: need 4*N)
-*
-         CALL STREVC( SIDE, 'B', SELECT, N, A, LDA, VL, LDVL, VR, LDVR,
-     $                N, NOUT, WORK( IWRK ), IERR )
-      END IF
-*
-      IF( WANTVL ) THEN
-*
-*        Undo balancing of left eigenvectors
-*        (Workspace: need N)
-*
-         CALL SGEBAK( 'B', 'L', N, ILO, IHI, WORK( IBAL ), N, VL, LDVL,
-     $                IERR )
-*
-*        Normalize left eigenvectors and make largest component real
-*
-         DO 20 I = 1, N
-            IF( WI( I ).EQ.ZERO ) THEN
-               SCL = ONE / SNRM2( N, VL( 1, I ), 1 )
-               CALL SSCAL( N, SCL, VL( 1, I ), 1 )
-            ELSE IF( WI( I ).GT.ZERO ) THEN
-               SCL = ONE / SLAPY2( SNRM2( N, VL( 1, I ), 1 ),
-     $               SNRM2( N, VL( 1, I+1 ), 1 ) )
-               CALL SSCAL( N, SCL, VL( 1, I ), 1 )
-               CALL SSCAL( N, SCL, VL( 1, I+1 ), 1 )
-               DO 10 K = 1, N
-                  WORK( IWRK+K-1 ) = VL( K, I )**2 + VL( K, I+1 )**2
-   10          CONTINUE
-               K = ISAMAX( N, WORK( IWRK ), 1 )
-               CALL SLARTG( VL( K, I ), VL( K, I+1 ), CS, SN, R )
-               CALL SROT( N, VL( 1, I ), 1, VL( 1, I+1 ), 1, CS, SN )
-               VL( K, I+1 ) = ZERO
-            END IF
-   20    CONTINUE
-      END IF
-*
-      IF( WANTVR ) THEN
-*
-*        Undo balancing of right eigenvectors
-*        (Workspace: need N)
-*
-         CALL SGEBAK( 'B', 'R', N, ILO, IHI, WORK( IBAL ), N, VR, LDVR,
-     $                IERR )
-*
-*        Normalize right eigenvectors and make largest component real
-*
-         DO 40 I = 1, N
-            IF( WI( I ).EQ.ZERO ) THEN
-               SCL = ONE / SNRM2( N, VR( 1, I ), 1 )
-               CALL SSCAL( N, SCL, VR( 1, I ), 1 )
-            ELSE IF( WI( I ).GT.ZERO ) THEN
-               SCL = ONE / SLAPY2( SNRM2( N, VR( 1, I ), 1 ),
-     $               SNRM2( N, VR( 1, I+1 ), 1 ) )
-               CALL SSCAL( N, SCL, VR( 1, I ), 1 )
-               CALL SSCAL( N, SCL, VR( 1, I+1 ), 1 )
-               DO 30 K = 1, N
-                  WORK( IWRK+K-1 ) = VR( K, I )**2 + VR( K, I+1 )**2
-   30          CONTINUE
-               K = ISAMAX( N, WORK( IWRK ), 1 )
-               CALL SLARTG( VR( K, I ), VR( K, I+1 ), CS, SN, R )
-               CALL SROT( N, VR( 1, I ), 1, VR( 1, I+1 ), 1, CS, SN )
-               VR( K, I+1 ) = ZERO
-            END IF
-   40    CONTINUE
-      END IF
-*
-*     Undo scaling if necessary
-*
-   50 CONTINUE
-      IF( SCALEA ) THEN
-         CALL SLASCL( 'G', 0, 0, CSCALE, ANRM, N-INFO, 1, WR( INFO+1 ),
-     $                MAX( N-INFO, 1 ), IERR )
-         CALL SLASCL( 'G', 0, 0, CSCALE, ANRM, N-INFO, 1, WI( INFO+1 ),
-     $                MAX( N-INFO, 1 ), IERR )
-         IF( INFO.GT.0 ) THEN
-            CALL SLASCL( 'G', 0, 0, CSCALE, ANRM, ILO-1, 1, WR, N,
-     $                   IERR )
-            CALL SLASCL( 'G', 0, 0, CSCALE, ANRM, ILO-1, 1, WI, N,
-     $                   IERR )
-         END IF
-      END IF
-*
-      WORK( 1 ) = MAXWRK
-      RETURN
-*
-*     End of SGEEV
-*
-      END
--- a/libcruft/lapack/sgehd2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-      SUBROUTINE SGEHD2( N, ILO, IHI, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, ILO, INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGEHD2 reduces a real general matrix A to upper Hessenberg form H by
-*  an orthogonal similarity transformation:  Q' * A * Q = H .
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          It is assumed that A is already upper triangular in rows
-*          and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally
-*          set by a previous call to SGEBAL; otherwise they should be
-*          set to 1 and N respectively. See Further Details.
-*          1 <= ILO <= IHI <= max(1,N).
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the n by n general matrix to be reduced.
-*          On exit, the upper triangle and the first subdiagonal of A
-*          are overwritten with the upper Hessenberg matrix H, and the
-*          elements below the first subdiagonal, with the array TAU,
-*          represent the orthogonal matrix Q as a product of elementary
-*          reflectors. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  TAU     (output) REAL array, dimension (N-1)
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace) REAL array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of (ihi-ilo) elementary
-*  reflectors
-*
-*     Q = H(ilo) H(ilo+1) . . . H(ihi-1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i) = 0, v(i+1) = 1 and v(ihi+1:n) = 0; v(i+2:ihi) is stored on
-*  exit in A(i+2:ihi,i), and tau in TAU(i).
-*
-*  The contents of A are illustrated by the following example, with
-*  n = 7, ilo = 2 and ihi = 6:
-*
-*  on entry,                        on exit,
-*
-*  ( a   a   a   a   a   a   a )    (  a   a   h   h   h   h   a )
-*  (     a   a   a   a   a   a )    (      a   h   h   h   h   a )
-*  (     a   a   a   a   a   a )    (      h   h   h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  h   h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  v3  h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  v3  v4  h   h   h )
-*  (                         a )    (                          a )
-*
-*  where a denotes an element of the original matrix A, h denotes a
-*  modified element of the upper Hessenberg matrix H, and vi denotes an
-*  element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      REAL               AII
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARF, SLARFG, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -2
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGEHD2', -INFO )
-         RETURN
-      END IF
-*
-      DO 10 I = ILO, IHI - 1
-*
-*        Compute elementary reflector H(i) to annihilate A(i+2:ihi,i)
-*
-         CALL SLARFG( IHI-I, A( I+1, I ), A( MIN( I+2, N ), I ), 1,
-     $                TAU( I ) )
-         AII = A( I+1, I )
-         A( I+1, I ) = ONE
-*
-*        Apply H(i) to A(1:ihi,i+1:ihi) from the right
-*
-         CALL SLARF( 'Right', IHI, IHI-I, A( I+1, I ), 1, TAU( I ),
-     $               A( 1, I+1 ), LDA, WORK )
-*
-*        Apply H(i) to A(i+1:ihi,i+1:n) from the left
-*
-         CALL SLARF( 'Left', IHI-I, N-I, A( I+1, I ), 1, TAU( I ),
-     $               A( I+1, I+1 ), LDA, WORK )
-*
-         A( I+1, I ) = AII
-   10 CONTINUE
-*
-      RETURN
-*
-*     End of SGEHD2
-*
-      END
--- a/libcruft/lapack/sgehrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,273 +0,0 @@
-      SUBROUTINE SGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, ILO, INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      REAL              A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGEHRD reduces a real general matrix A to upper Hessenberg form H by
-*  an orthogonal similarity transformation:  Q' * A * Q = H .
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          It is assumed that A is already upper triangular in rows
-*          and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally
-*          set by a previous call to SGEBAL; otherwise they should be
-*          set to 1 and N respectively. See Further Details.
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the N-by-N general matrix to be reduced.
-*          On exit, the upper triangle and the first subdiagonal of A
-*          are overwritten with the upper Hessenberg matrix H, and the
-*          elements below the first subdiagonal, with the array TAU,
-*          represent the orthogonal matrix Q as a product of elementary
-*          reflectors. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  TAU     (output) REAL array, dimension (N-1)
-*          The scalar factors of the elementary reflectors (see Further
-*          Details). Elements 1:ILO-1 and IHI:N-1 of TAU are set to
-*          zero.
-*
-*  WORK    (workspace/output) REAL array, dimension (LWORK)
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The length of the array WORK.  LWORK >= max(1,N).
-*          For optimum performance LWORK >= N*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of (ihi-ilo) elementary
-*  reflectors
-*
-*     Q = H(ilo) H(ilo+1) . . . H(ihi-1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i) = 0, v(i+1) = 1 and v(ihi+1:n) = 0; v(i+2:ihi) is stored on
-*  exit in A(i+2:ihi,i), and tau in TAU(i).
-*
-*  The contents of A are illustrated by the following example, with
-*  n = 7, ilo = 2 and ihi = 6:
-*
-*  on entry,                        on exit,
-*
-*  ( a   a   a   a   a   a   a )    (  a   a   h   h   h   h   a )
-*  (     a   a   a   a   a   a )    (      a   h   h   h   h   a )
-*  (     a   a   a   a   a   a )    (      h   h   h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  h   h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  v3  h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  v3  v4  h   h   h )
-*  (                         a )    (                          a )
-*
-*  where a denotes an element of the original matrix A, h denotes a
-*  modified element of the upper Hessenberg matrix H, and vi denotes an
-*  element of the vector defining H(i).
-*
-*  This file is a slight modification of LAPACK-3.0's SGEHRD
-*  subroutine incorporating improvements proposed by Quintana-Orti and
-*  Van de Geijn (2005). 
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            NBMAX, LDT
-      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1 )
-      REAL              ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, 
-     $                     ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, J, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NH, NX
-      REAL              EI
-*     ..
-*     .. Local Arrays ..
-      REAL              T( LDT, NBMAX )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SAXPY, SGEHD2, SGEMM, SLAHR2, SLARFB, STRMM,
-     $                   XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      NB = MIN( NBMAX, ILAENV( 1, 'SGEHRD', ' ', N, ILO, IHI, -1 ) )
-      LWKOPT = N*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -2
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGEHRD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Set elements 1:ILO-1 and IHI:N-1 of TAU to zero
-*
-      DO 10 I = 1, ILO - 1
-         TAU( I ) = ZERO
-   10 CONTINUE
-      DO 20 I = MAX( 1, IHI ), N - 1
-         TAU( I ) = ZERO
-   20 CONTINUE
-*
-*     Quick return if possible
-*
-      NH = IHI - ILO + 1
-      IF( NH.LE.1 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-*     Determine the block size
-*
-      NB = MIN( NBMAX, ILAENV( 1, 'SGEHRD', ' ', N, ILO, IHI, -1 ) )
-      NBMIN = 2
-      IWS = 1
-      IF( NB.GT.1 .AND. NB.LT.NH ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code
-*        (last block is always handled by unblocked code)
-*
-         NX = MAX( NB, ILAENV( 3, 'SGEHRD', ' ', N, ILO, IHI, -1 ) )
-         IF( NX.LT.NH ) THEN
-*
-*           Determine if workspace is large enough for blocked code
-*
-            IWS = N*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  determine the
-*              minimum value of NB, and reduce NB or force use of
-*              unblocked code
-*
-               NBMIN = MAX( 2, ILAENV( 2, 'SGEHRD', ' ', N, ILO, IHI,
-     $                 -1 ) )
-               IF( LWORK.GE.N*NBMIN ) THEN
-                  NB = LWORK / N
-               ELSE
-                  NB = 1
-               END IF
-            END IF
-         END IF
-      END IF
-      LDWORK = N
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.NH ) THEN
-*
-*        Use unblocked code below
-*
-         I = ILO
-*
-      ELSE
-*
-*        Use blocked code
-*
-         DO 40 I = ILO, IHI - 1 - NX, NB
-            IB = MIN( NB, IHI-I )
-*
-*           Reduce columns i:i+ib-1 to Hessenberg form, returning the
-*           matrices V and T of the block reflector H = I - V*T*V'
-*           which performs the reduction, and also the matrix Y = A*V*T
-*
-            CALL SLAHR2( IHI, I, IB, A( 1, I ), LDA, TAU( I ), T, LDT,
-     $                   WORK, LDWORK )
-*
-*           Apply the block reflector H to A(1:ihi,i+ib:ihi) from the
-*           right, computing  A := A - Y * V'. V(i+ib,ib-1) must be set
-*           to 1
-*
-            EI = A( I+IB, I+IB-1 )
-            A( I+IB, I+IB-1 ) = ONE
-            CALL SGEMM( 'No transpose', 'Transpose', 
-     $                  IHI, IHI-I-IB+1,
-     $                  IB, -ONE, WORK, LDWORK, A( I+IB, I ), LDA, ONE,
-     $                  A( 1, I+IB ), LDA )
-            A( I+IB, I+IB-1 ) = EI
-*
-*           Apply the block reflector H to A(1:i,i+1:i+ib-1) from the
-*           right
-*
-            CALL STRMM( 'Right', 'Lower', 'Transpose',
-     $                  'Unit', I, IB-1,
-     $                  ONE, A( I+1, I ), LDA, WORK, LDWORK )
-            DO 30 J = 0, IB-2
-               CALL SAXPY( I, -ONE, WORK( LDWORK*J+1 ), 1,
-     $                     A( 1, I+J+1 ), 1 )
-   30       CONTINUE
-*
-*           Apply the block reflector H to A(i+1:ihi,i+ib:n) from the
-*           left
-*
-            CALL SLARFB( 'Left', 'Transpose', 'Forward',
-     $                   'Columnwise',
-     $                   IHI-I, N-I-IB+1, IB, A( I+1, I ), LDA, T, LDT,
-     $                   A( I+1, I+IB ), LDA, WORK, LDWORK )
-   40    CONTINUE
-      END IF
-*
-*     Use unblocked code to reduce the rest of the matrix
-*
-      CALL SGEHD2( N, I, IHI, A, LDA, TAU, WORK, IINFO )
-      WORK( 1 ) = IWS
-*
-      RETURN
-*
-*     End of SGEHRD
-*
-      END
--- a/libcruft/lapack/sgelq2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,121 +0,0 @@
-      SUBROUTINE SGELQ2( M, N, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGELQ2 computes an LQ factorization of a real m by n matrix A:
-*  A = L * Q.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the m by n matrix A.
-*          On exit, the elements on and below the diagonal of the array
-*          contain the m by min(m,n) lower trapezoidal matrix L (L is
-*          lower triangular if m <= n); the elements above the diagonal,
-*          with the array TAU, represent the orthogonal matrix Q as a
-*          product of elementary reflectors (see Further Details).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) REAL array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace) REAL array, dimension (M)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(k) . . . H(2) H(1), where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i-1) = 0 and v(i) = 1; v(i+1:n) is stored on exit in A(i,i+1:n),
-*  and tau in TAU(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, K
-      REAL               AII
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARF, SLARFG, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGELQ2', -INFO )
-         RETURN
-      END IF
-*
-      K = MIN( M, N )
-*
-      DO 10 I = 1, K
-*
-*        Generate elementary reflector H(i) to annihilate A(i,i+1:n)
-*
-         CALL SLARFG( N-I+1, A( I, I ), A( I, MIN( I+1, N ) ), LDA,
-     $                TAU( I ) )
-         IF( I.LT.M ) THEN
-*
-*           Apply H(i) to A(i+1:m,i:n) from the right
-*
-            AII = A( I, I )
-            A( I, I ) = ONE
-            CALL SLARF( 'Right', M-I, N-I+1, A( I, I ), LDA, TAU( I ),
-     $                  A( I+1, I ), LDA, WORK )
-            A( I, I ) = AII
-         END IF
-   10 CONTINUE
-      RETURN
-*
-*     End of SGELQ2
-*
-      END
--- a/libcruft/lapack/sgelqf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,195 +0,0 @@
-      SUBROUTINE SGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGELQF computes an LQ factorization of a real M-by-N matrix A:
-*  A = L * Q.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the elements on and below the diagonal of the array
-*          contain the m-by-min(m,n) lower trapezoidal matrix L (L is
-*          lower triangular if m <= n); the elements above the diagonal,
-*          with the array TAU, represent the orthogonal matrix Q as a
-*          product of elementary reflectors (see Further Details).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) REAL array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,M).
-*          For optimum performance LWORK >= M*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(k) . . . H(2) H(1), where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i-1) = 0 and v(i) = 1; v(i+1:n) is stored on exit in A(i,i+1:n),
-*  and tau in TAU(i).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, K, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGELQ2, SLARFB, SLARFT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NB = ILAENV( 1, 'SGELQF', ' ', M, N, -1, -1 )
-      LWKOPT = M*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGELQF', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      K = MIN( M, N )
-      IF( K.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = M
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'SGELQF', ' ', M, N, -1, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = M
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'SGELQF', ' ', M, N, -1,
-     $                 -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code initially
-*
-         DO 10 I = 1, K - NX, NB
-            IB = MIN( K-I+1, NB )
-*
-*           Compute the LQ factorization of the current block
-*           A(i:i+ib-1,i:n)
-*
-            CALL SGELQ2( IB, N-I+1, A( I, I ), LDA, TAU( I ), WORK,
-     $                   IINFO )
-            IF( I+IB.LE.M ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i) H(i+1) . . . H(i+ib-1)
-*
-               CALL SLARFT( 'Forward', 'Rowwise', N-I+1, IB, A( I, I ),
-     $                      LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H to A(i+ib:m,i:n) from the right
-*
-               CALL SLARFB( 'Right', 'No transpose', 'Forward',
-     $                      'Rowwise', M-I-IB+1, N-I+1, IB, A( I, I ),
-     $                      LDA, WORK, LDWORK, A( I+IB, I ), LDA,
-     $                      WORK( IB+1 ), LDWORK )
-            END IF
-   10    CONTINUE
-      ELSE
-         I = 1
-      END IF
-*
-*     Use unblocked code to factor the last or only block.
-*
-      IF( I.LE.K )
-     $   CALL SGELQ2( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK,
-     $                IINFO )
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of SGELQF
-*
-      END
--- a/libcruft/lapack/sgelsd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,538 +0,0 @@
-      SUBROUTINE SGELSD( M, N, NRHS, A, LDA, B, LDB, S, RCOND,
-     $                   RANK, WORK, LWORK, IWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LDB, LWORK, M, N, NRHS, RANK
-      REAL               RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      REAL               A( LDA, * ), B( LDB, * ), S( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGELSD computes the minimum-norm solution to a real linear least
-*  squares problem:
-*      minimize 2-norm(| b - A*x |)
-*  using the singular value decomposition (SVD) of A. A is an M-by-N
-*  matrix which may be rank-deficient.
-*
-*  Several right hand side vectors b and solution vectors x can be
-*  handled in a single call; they are stored as the columns of the
-*  M-by-NRHS right hand side matrix B and the N-by-NRHS solution
-*  matrix X.
-*
-*  The problem is solved in three steps:
-*  (1) Reduce the coefficient matrix A to bidiagonal form with
-*      Householder transformations, reducing the original problem
-*      into a "bidiagonal least squares problem" (BLS)
-*  (2) Solve the BLS using a divide and conquer approach.
-*  (3) Apply back all the Householder tranformations to solve
-*      the original least squares problem.
-*
-*  The effective rank of A is determined by treating as zero those
-*  singular values which are less than RCOND times the largest singular
-*  value.
-*
-*  The divide and conquer algorithm makes very mild assumptions about
-*  floating point arithmetic. It will work on machines with a guard
-*  digit in add/subtract, or on those binary machines without guard
-*  digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or
-*  Cray-2. It could conceivably fail on hexadecimal or decimal machines
-*  without guard digits, but we know of none.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of A. N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrices B and X. NRHS >= 0.
-*
-*  A       (input) REAL array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, A has been destroyed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  B       (input/output) REAL array, dimension (LDB,NRHS)
-*          On entry, the M-by-NRHS right hand side matrix B.
-*          On exit, B is overwritten by the N-by-NRHS solution
-*          matrix X.  If m >= n and RANK = n, the residual
-*          sum-of-squares for the solution in the i-th column is given
-*          by the sum of squares of elements n+1:m in that column.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B. LDB >= max(1,max(M,N)).
-*
-*  S       (output) REAL array, dimension (min(M,N))
-*          The singular values of A in decreasing order.
-*          The condition number of A in the 2-norm = S(1)/S(min(m,n)).
-*
-*  RCOND   (input) REAL
-*          RCOND is used to determine the effective rank of A.
-*          Singular values S(i) <= RCOND*S(1) are treated as zero.
-*          If RCOND < 0, machine precision is used instead.
-*
-*  RANK    (output) INTEGER
-*          The effective rank of A, i.e., the number of singular values
-*          which are greater than RCOND*S(1).
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK must be at least 1.
-*          The exact minimum amount of workspace needed depends on M,
-*          N and NRHS. As long as LWORK is at least
-*              12*N + 2*N*SMLSIZ + 8*N*NLVL + N*NRHS + (SMLSIZ+1)**2,
-*          if M is greater than or equal to N or
-*              12*M + 2*M*SMLSIZ + 8*M*NLVL + M*NRHS + (SMLSIZ+1)**2,
-*          if M is less than N, the code will execute correctly.
-*          SMLSIZ is returned by ILAENV and is equal to the maximum
-*          size of the subproblems at the bottom of the computation
-*          tree (usually about 25), and
-*             NLVL = MAX( 0, INT( LOG_2( MIN( M,N )/(SMLSIZ+1) ) ) + 1 )
-*          For good performance, LWORK should generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the array WORK and the
-*          minimum size of the array IWORK, and returns these values as
-*          the first entries of the WORK and IWORK arrays, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  IWORK   (workspace) INTEGER array, dimension (MAX(1,LIWORK))
-*          LIWORK >= max(1, 3*MINMN*NLVL + 11*MINMN),
-*          where MINMN = MIN( M,N ).
-*          On exit, if INFO = 0, IWORK(1) returns the minimum LIWORK.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  the algorithm for computing the SVD failed to converge;
-*                if INFO = i, i off-diagonal elements of an intermediate
-*                bidiagonal form did not converge to zero.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Ren-Cang Li, Computer Science Division, University of
-*       California at Berkeley, USA
-*     Osni Marques, LBNL/NERSC, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            IASCL, IBSCL, IE, IL, ITAU, ITAUP, ITAUQ,
-     $                   LDWORK, LIWORK, MAXMN, MAXWRK, MINMN, MINWRK,
-     $                   MM, MNTHR, NLVL, NWORK, SMLSIZ, WLALSD
-      REAL               ANRM, BIGNUM, BNRM, EPS, SFMIN, SMLNUM
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEBRD, SGELQF, SGEQRF, SLABAD, SLACPY, SLALSD,
-     $                   SLASCL, SLASET, SORMBR, SORMLQ, SORMQR, XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      REAL               SLAMCH, SLANGE
-      EXTERNAL           SLAMCH, SLANGE, ILAENV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          INT, LOG, MAX, MIN, REAL
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments.
-*
-      INFO = 0
-      MINMN = MIN( M, N )
-      MAXMN = MAX( M, N )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, MAXMN ) ) THEN
-         INFO = -7
-      END IF
-*
-*     Compute workspace.
-*     (Note: Comments in the code beginning "Workspace:" describe the
-*     minimal amount of workspace needed at that point in the code,
-*     as well as the preferred amount for good performance.
-*     NB refers to the optimal block size for the immediately
-*     following subroutine, as returned by ILAENV.)
-*
-      IF( INFO.EQ.0 ) THEN
-         MINWRK = 1
-         MAXWRK = 1
-         LIWORK = 1
-         IF( MINMN.GT.0 ) THEN
-            SMLSIZ = ILAENV( 9, 'SGELSD', ' ', 0, 0, 0, 0 )
-            MNTHR = ILAENV( 6, 'SGELSD', ' ', M, N, NRHS, -1 )
-            NLVL = MAX( INT( LOG( REAL( MINMN ) / REAL( SMLSIZ + 1 ) ) /
-     $                  LOG( TWO ) ) + 1, 0 )
-            LIWORK = 3*MINMN*NLVL + 11*MINMN
-            MM = M
-            IF( M.GE.N .AND. M.GE.MNTHR ) THEN
-*
-*              Path 1a - overdetermined, with many more rows than
-*                        columns.
-*
-               MM = N
-               MAXWRK = MAX( MAXWRK, N + N*ILAENV( 1, 'SGEQRF', ' ', M,
-     $                       N, -1, -1 ) )
-               MAXWRK = MAX( MAXWRK, N + NRHS*ILAENV( 1, 'SORMQR', 'LT',
-     $                       M, NRHS, N, -1 ) )
-            END IF
-            IF( M.GE.N ) THEN
-*
-*              Path 1 - overdetermined or exactly determined.
-*
-               MAXWRK = MAX( MAXWRK, 3*N + ( MM + N )*ILAENV( 1,
-     $                       'SGEBRD', ' ', MM, N, -1, -1 ) )
-               MAXWRK = MAX( MAXWRK, 3*N + NRHS*ILAENV( 1, 'SORMBR',
-     $                       'QLT', MM, NRHS, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, 3*N + ( N - 1 )*ILAENV( 1,
-     $                       'SORMBR', 'PLN', N, NRHS, N, -1 ) )
-               WLALSD = 9*N + 2*N*SMLSIZ + 8*N*NLVL + N*NRHS +
-     $                  ( SMLSIZ + 1 )**2
-               MAXWRK = MAX( MAXWRK, 3*N + WLALSD )
-               MINWRK = MAX( 3*N + MM, 3*N + NRHS, 3*N + WLALSD )
-            END IF
-            IF( N.GT.M ) THEN
-               WLALSD = 9*M + 2*M*SMLSIZ + 8*M*NLVL + M*NRHS +
-     $                  ( SMLSIZ + 1 )**2
-               IF( N.GE.MNTHR ) THEN
-*
-*                 Path 2a - underdetermined, with many more columns
-*                           than rows.
-*
-                  MAXWRK = M + M*ILAENV( 1, 'SGELQF', ' ', M, N, -1,
-     $                                  -1 )
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M + 2*M*ILAENV( 1,
-     $                          'SGEBRD', ' ', M, M, -1, -1 ) )
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M + NRHS*ILAENV( 1,
-     $                          'SORMBR', 'QLT', M, NRHS, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M + ( M - 1 )*ILAENV( 1,
-     $                          'SORMBR', 'PLN', M, NRHS, M, -1 ) )
-                  IF( NRHS.GT.1 ) THEN
-                     MAXWRK = MAX( MAXWRK, M*M + M + M*NRHS )
-                  ELSE
-                     MAXWRK = MAX( MAXWRK, M*M + 2*M )
-                  END IF
-                  MAXWRK = MAX( MAXWRK, M + NRHS*ILAENV( 1, 'SORMLQ',
-     $                          'LT', N, NRHS, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M + WLALSD )
-               ELSE
-*
-*                 Path 2 - remaining underdetermined cases.
-*
-                  MAXWRK = 3*M + ( N + M )*ILAENV( 1, 'SGEBRD', ' ', M,
-     $                     N, -1, -1 )
-                  MAXWRK = MAX( MAXWRK, 3*M + NRHS*ILAENV( 1, 'SORMBR',
-     $                          'QLT', M, NRHS, N, -1 ) )
-                  MAXWRK = MAX( MAXWRK, 3*M + M*ILAENV( 1, 'SORMBR',
-     $                          'PLN', N, NRHS, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, 3*M + WLALSD )
-               END IF
-               MINWRK = MAX( 3*M + NRHS, 3*M + M, 3*M + WLALSD )
-            END IF
-         END IF
-         MINWRK = MIN( MINWRK, MAXWRK )
-         WORK( 1 ) = MAXWRK
-         IWORK( 1 ) = LIWORK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
-            INFO = -12
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGELSD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         RANK = 0
-         RETURN
-      END IF
-*
-*     Get machine parameters.
-*
-      EPS = SLAMCH( 'P' )
-      SFMIN = SLAMCH( 'S' )
-      SMLNUM = SFMIN / EPS
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-*
-*     Scale A if max entry outside range [SMLNUM,BIGNUM].
-*
-      ANRM = SLANGE( 'M', M, N, A, LDA, WORK )
-      IASCL = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM.
-*
-         CALL SLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO )
-         IASCL = 1
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM.
-*
-         CALL SLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO )
-         IASCL = 2
-      ELSE IF( ANRM.EQ.ZERO ) THEN
-*
-*        Matrix all zero. Return zero solution.
-*
-         CALL SLASET( 'F', MAX( M, N ), NRHS, ZERO, ZERO, B, LDB )
-         CALL SLASET( 'F', MINMN, 1, ZERO, ZERO, S, 1 )
-         RANK = 0
-         GO TO 10
-      END IF
-*
-*     Scale B if max entry outside range [SMLNUM,BIGNUM].
-*
-      BNRM = SLANGE( 'M', M, NRHS, B, LDB, WORK )
-      IBSCL = 0
-      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM.
-*
-         CALL SLASCL( 'G', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 1
-      ELSE IF( BNRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM.
-*
-         CALL SLASCL( 'G', 0, 0, BNRM, BIGNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 2
-      END IF
-*
-*     If M < N make sure certain entries of B are zero.
-*
-      IF( M.LT.N )
-     $   CALL SLASET( 'F', N-M, NRHS, ZERO, ZERO, B( M+1, 1 ), LDB )
-*
-*     Overdetermined case.
-*
-      IF( M.GE.N ) THEN
-*
-*        Path 1 - overdetermined or exactly determined.
-*
-         MM = M
-         IF( M.GE.MNTHR ) THEN
-*
-*           Path 1a - overdetermined, with many more rows than columns.
-*
-            MM = N
-            ITAU = 1
-            NWORK = ITAU + N
-*
-*           Compute A=Q*R.
-*           (Workspace: need 2*N, prefer N+N*NB)
-*
-            CALL SGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
-     $                   LWORK-NWORK+1, INFO )
-*
-*           Multiply B by transpose(Q).
-*           (Workspace: need N+NRHS, prefer N+NRHS*NB)
-*
-            CALL SORMQR( 'L', 'T', M, NRHS, N, A, LDA, WORK( ITAU ), B,
-     $                   LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-*           Zero out below R.
-*
-            IF( N.GT.1 ) THEN
-               CALL SLASET( 'L', N-1, N-1, ZERO, ZERO, A( 2, 1 ), LDA )
-            END IF
-         END IF
-*
-         IE = 1
-         ITAUQ = IE + N
-         ITAUP = ITAUQ + N
-         NWORK = ITAUP + N
-*
-*        Bidiagonalize R in A.
-*        (Workspace: need 3*N+MM, prefer 3*N+(MM+N)*NB)
-*
-         CALL SGEBRD( MM, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
-     $                WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
-     $                INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors of R.
-*        (Workspace: need 3*N+NRHS, prefer 3*N+NRHS*NB)
-*
-         CALL SORMBR( 'Q', 'L', 'T', MM, NRHS, N, A, LDA, WORK( ITAUQ ),
-     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-*        Solve the bidiagonal least squares problem.
-*
-         CALL SLALSD( 'U', SMLSIZ, N, NRHS, S, WORK( IE ), B, LDB,
-     $                RCOND, RANK, WORK( NWORK ), IWORK, INFO )
-         IF( INFO.NE.0 ) THEN
-            GO TO 10
-         END IF
-*
-*        Multiply B by right bidiagonalizing vectors of R.
-*
-         CALL SORMBR( 'P', 'L', 'N', N, NRHS, N, A, LDA, WORK( ITAUP ),
-     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-      ELSE IF( N.GE.MNTHR .AND. LWORK.GE.4*M+M*M+
-     $         MAX( M, 2*M-4, NRHS, N-3*M, WLALSD ) ) THEN
-*
-*        Path 2a - underdetermined, with many more columns than rows
-*        and sufficient workspace for an efficient algorithm.
-*
-         LDWORK = M
-         IF( LWORK.GE.MAX( 4*M+M*LDA+MAX( M, 2*M-4, NRHS, N-3*M ),
-     $       M*LDA+M+M*NRHS, 4*M+M*LDA+WLALSD ) )LDWORK = LDA
-         ITAU = 1
-         NWORK = M + 1
-*
-*        Compute A=L*Q.
-*        (Workspace: need 2*M, prefer M+M*NB)
-*
-         CALL SGELQF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
-     $                LWORK-NWORK+1, INFO )
-         IL = NWORK
-*
-*        Copy L to WORK(IL), zeroing out above its diagonal.
-*
-         CALL SLACPY( 'L', M, M, A, LDA, WORK( IL ), LDWORK )
-         CALL SLASET( 'U', M-1, M-1, ZERO, ZERO, WORK( IL+LDWORK ),
-     $                LDWORK )
-         IE = IL + LDWORK*M
-         ITAUQ = IE + M
-         ITAUP = ITAUQ + M
-         NWORK = ITAUP + M
-*
-*        Bidiagonalize L in WORK(IL).
-*        (Workspace: need M*M+5*M, prefer M*M+4*M+2*M*NB)
-*
-         CALL SGEBRD( M, M, WORK( IL ), LDWORK, S, WORK( IE ),
-     $                WORK( ITAUQ ), WORK( ITAUP ), WORK( NWORK ),
-     $                LWORK-NWORK+1, INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors of L.
-*        (Workspace: need M*M+4*M+NRHS, prefer M*M+4*M+NRHS*NB)
-*
-         CALL SORMBR( 'Q', 'L', 'T', M, NRHS, M, WORK( IL ), LDWORK,
-     $                WORK( ITAUQ ), B, LDB, WORK( NWORK ),
-     $                LWORK-NWORK+1, INFO )
-*
-*        Solve the bidiagonal least squares problem.
-*
-         CALL SLALSD( 'U', SMLSIZ, M, NRHS, S, WORK( IE ), B, LDB,
-     $                RCOND, RANK, WORK( NWORK ), IWORK, INFO )
-         IF( INFO.NE.0 ) THEN
-            GO TO 10
-         END IF
-*
-*        Multiply B by right bidiagonalizing vectors of L.
-*
-         CALL SORMBR( 'P', 'L', 'N', M, NRHS, M, WORK( IL ), LDWORK,
-     $                WORK( ITAUP ), B, LDB, WORK( NWORK ),
-     $                LWORK-NWORK+1, INFO )
-*
-*        Zero out below first M rows of B.
-*
-         CALL SLASET( 'F', N-M, NRHS, ZERO, ZERO, B( M+1, 1 ), LDB )
-         NWORK = ITAU + M
-*
-*        Multiply transpose(Q) by B.
-*        (Workspace: need M+NRHS, prefer M+NRHS*NB)
-*
-         CALL SORMLQ( 'L', 'T', N, NRHS, M, A, LDA, WORK( ITAU ), B,
-     $                LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-      ELSE
-*
-*        Path 2 - remaining underdetermined cases.
-*
-         IE = 1
-         ITAUQ = IE + M
-         ITAUP = ITAUQ + M
-         NWORK = ITAUP + M
-*
-*        Bidiagonalize A.
-*        (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB)
-*
-         CALL SGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
-     $                WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
-     $                INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors.
-*        (Workspace: need 3*M+NRHS, prefer 3*M+NRHS*NB)
-*
-         CALL SORMBR( 'Q', 'L', 'T', M, NRHS, N, A, LDA, WORK( ITAUQ ),
-     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-*        Solve the bidiagonal least squares problem.
-*
-         CALL SLALSD( 'L', SMLSIZ, M, NRHS, S, WORK( IE ), B, LDB,
-     $                RCOND, RANK, WORK( NWORK ), IWORK, INFO )
-         IF( INFO.NE.0 ) THEN
-            GO TO 10
-         END IF
-*
-*        Multiply B by right bidiagonalizing vectors of A.
-*
-         CALL SORMBR( 'P', 'L', 'N', N, NRHS, M, A, LDA, WORK( ITAUP ),
-     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-      END IF
-*
-*     Undo scaling.
-*
-      IF( IASCL.EQ.1 ) THEN
-         CALL SLASCL( 'G', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO )
-         CALL SLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
-     $                INFO )
-      ELSE IF( IASCL.EQ.2 ) THEN
-         CALL SLASCL( 'G', 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB, INFO )
-         CALL SLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
-     $                INFO )
-      END IF
-      IF( IBSCL.EQ.1 ) THEN
-         CALL SLASCL( 'G', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO )
-      ELSE IF( IBSCL.EQ.2 ) THEN
-         CALL SLASCL( 'G', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO )
-      END IF
-*
-   10 CONTINUE
-      WORK( 1 ) = MAXWRK
-      IWORK( 1 ) = LIWORK
-      RETURN
-*
-*     End of SGELSD
-*
-      END
--- a/libcruft/lapack/sgelss.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,617 +0,0 @@
-      SUBROUTINE SGELSS( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LDB, LWORK, M, N, NRHS, RANK
-      REAL               RCOND
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), B( LDB, * ), S( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGELSS computes the minimum norm solution to a real linear least
-*  squares problem:
-*
-*  Minimize 2-norm(| b - A*x |).
-*
-*  using the singular value decomposition (SVD) of A. A is an M-by-N
-*  matrix which may be rank-deficient.
-*
-*  Several right hand side vectors b and solution vectors x can be
-*  handled in a single call; they are stored as the columns of the
-*  M-by-NRHS right hand side matrix B and the N-by-NRHS solution matrix
-*  X.
-*
-*  The effective rank of A is determined by treating as zero those
-*  singular values which are less than RCOND times the largest singular
-*  value.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrices B and X. NRHS >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the first min(m,n) rows of A are overwritten with
-*          its right singular vectors, stored rowwise.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  B       (input/output) REAL array, dimension (LDB,NRHS)
-*          On entry, the M-by-NRHS right hand side matrix B.
-*          On exit, B is overwritten by the N-by-NRHS solution
-*          matrix X.  If m >= n and RANK = n, the residual
-*          sum-of-squares for the solution in the i-th column is given
-*          by the sum of squares of elements n+1:m in that column.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B. LDB >= max(1,max(M,N)).
-*
-*  S       (output) REAL array, dimension (min(M,N))
-*          The singular values of A in decreasing order.
-*          The condition number of A in the 2-norm = S(1)/S(min(m,n)).
-*
-*  RCOND   (input) REAL
-*          RCOND is used to determine the effective rank of A.
-*          Singular values S(i) <= RCOND*S(1) are treated as zero.
-*          If RCOND < 0, machine precision is used instead.
-*
-*  RANK    (output) INTEGER
-*          The effective rank of A, i.e., the number of singular values
-*          which are greater than RCOND*S(1).
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= 1, and also:
-*          LWORK >= 3*min(M,N) + max( 2*min(M,N), max(M,N), NRHS )
-*          For good performance, LWORK should generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  the algorithm for computing the SVD failed to converge;
-*                if INFO = i, i off-diagonal elements of an intermediate
-*                bidiagonal form did not converge to zero.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            BDSPAC, BL, CHUNK, I, IASCL, IBSCL, IE, IL,
-     $                   ITAU, ITAUP, ITAUQ, IWORK, LDWORK, MAXMN,
-     $                   MAXWRK, MINMN, MINWRK, MM, MNTHR
-      REAL               ANRM, BIGNUM, BNRM, EPS, SFMIN, SMLNUM, THR
-*     ..
-*     .. Local Arrays ..
-      REAL               VDUM( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SBDSQR, SCOPY, SGEBRD, SGELQF, SGEMM, SGEMV,
-     $                   SGEQRF, SLABAD, SLACPY, SLASCL, SLASET, SORGBR,
-     $                   SORMBR, SORMLQ, SORMQR, SRSCL, XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      REAL               SLAMCH, SLANGE
-      EXTERNAL           ILAENV, SLAMCH, SLANGE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      MINMN = MIN( M, N )
-      MAXMN = MAX( M, N )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, MAXMN ) ) THEN
-         INFO = -7
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of workspace needed at that point in the code,
-*       as well as the preferred amount for good performance.
-*       NB refers to the optimal block size for the immediately
-*       following subroutine, as returned by ILAENV.)
-*
-      IF( INFO.EQ.0 ) THEN
-         MINWRK = 1
-         MAXWRK = 1
-         IF( MINMN.GT.0 ) THEN
-            MM = M
-            MNTHR = ILAENV( 6, 'SGELSS', ' ', M, N, NRHS, -1 )
-            IF( M.GE.N .AND. M.GE.MNTHR ) THEN
-*
-*              Path 1a - overdetermined, with many more rows than
-*                        columns
-*
-               MM = N
-               MAXWRK = MAX( MAXWRK, N + N*ILAENV( 1, 'SGEQRF', ' ', M,
-     $                       N, -1, -1 ) )
-               MAXWRK = MAX( MAXWRK, N + NRHS*ILAENV( 1, 'SORMQR', 'LT',
-     $                       M, NRHS, N, -1 ) )
-            END IF
-            IF( M.GE.N ) THEN
-*
-*              Path 1 - overdetermined or exactly determined
-*
-*              Compute workspace needed for SBDSQR
-*
-               BDSPAC = MAX( 1, 5*N )
-               MAXWRK = MAX( MAXWRK, 3*N + ( MM + N )*ILAENV( 1,
-     $                       'SGEBRD', ' ', MM, N, -1, -1 ) )
-               MAXWRK = MAX( MAXWRK, 3*N + NRHS*ILAENV( 1, 'SORMBR',
-     $                       'QLT', MM, NRHS, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, 3*N + ( N - 1 )*ILAENV( 1,
-     $                       'SORGBR', 'P', N, N, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, BDSPAC )
-               MAXWRK = MAX( MAXWRK, N*NRHS )
-               MINWRK = MAX( 3*N + MM, 3*N + NRHS, BDSPAC )
-               MAXWRK = MAX( MINWRK, MAXWRK )
-            END IF
-            IF( N.GT.M ) THEN
-*
-*              Compute workspace needed for SBDSQR
-*
-               BDSPAC = MAX( 1, 5*M )
-               MINWRK = MAX( 3*M+NRHS, 3*M+N, BDSPAC )
-               IF( N.GE.MNTHR ) THEN
-*
-*                 Path 2a - underdetermined, with many more columns
-*                 than rows
-*
-                  MAXWRK = M + M*ILAENV( 1, 'SGELQF', ' ', M, N, -1,
-     $                                  -1 )
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M + 2*M*ILAENV( 1,
-     $                          'SGEBRD', ' ', M, M, -1, -1 ) )
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M + NRHS*ILAENV( 1,
-     $                          'SORMBR', 'QLT', M, NRHS, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M +
-     $                          ( M - 1 )*ILAENV( 1, 'SORGBR', 'P', M,
-     $                          M, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, M*M + M + BDSPAC )
-                  IF( NRHS.GT.1 ) THEN
-                     MAXWRK = MAX( MAXWRK, M*M + M + M*NRHS )
-                  ELSE
-                     MAXWRK = MAX( MAXWRK, M*M + 2*M )
-                  END IF
-                  MAXWRK = MAX( MAXWRK, M + NRHS*ILAENV( 1, 'SORMLQ',
-     $                          'LT', N, NRHS, M, -1 ) )
-               ELSE
-*
-*                 Path 2 - underdetermined
-*
-                  MAXWRK = 3*M + ( N + M )*ILAENV( 1, 'SGEBRD', ' ', M,
-     $                     N, -1, -1 )
-                  MAXWRK = MAX( MAXWRK, 3*M + NRHS*ILAENV( 1, 'SORMBR',
-     $                          'QLT', M, NRHS, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, 3*M + M*ILAENV( 1, 'SORGBR',
-     $                          'P', M, N, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, BDSPAC )
-                  MAXWRK = MAX( MAXWRK, N*NRHS )
-               END IF
-            END IF
-            MAXWRK = MAX( MINWRK, MAXWRK )
-         END IF
-         WORK( 1 ) = MAXWRK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY )
-     $      INFO = -12
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGELSS', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         RANK = 0
-         RETURN
-      END IF
-*
-*     Get machine parameters
-*
-      EPS = SLAMCH( 'P' )
-      SFMIN = SLAMCH( 'S' )
-      SMLNUM = SFMIN / EPS
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = SLANGE( 'M', M, N, A, LDA, WORK )
-      IASCL = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL SLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO )
-         IASCL = 1
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM
-*
-         CALL SLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO )
-         IASCL = 2
-      ELSE IF( ANRM.EQ.ZERO ) THEN
-*
-*        Matrix all zero. Return zero solution.
-*
-         CALL SLASET( 'F', MAX( M, N ), NRHS, ZERO, ZERO, B, LDB )
-         CALL SLASET( 'F', MINMN, 1, ZERO, ZERO, S, 1 )
-         RANK = 0
-         GO TO 70
-      END IF
-*
-*     Scale B if max element outside range [SMLNUM,BIGNUM]
-*
-      BNRM = SLANGE( 'M', M, NRHS, B, LDB, WORK )
-      IBSCL = 0
-      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL SLASCL( 'G', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 1
-      ELSE IF( BNRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM
-*
-         CALL SLASCL( 'G', 0, 0, BNRM, BIGNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 2
-      END IF
-*
-*     Overdetermined case
-*
-      IF( M.GE.N ) THEN
-*
-*        Path 1 - overdetermined or exactly determined
-*
-         MM = M
-         IF( M.GE.MNTHR ) THEN
-*
-*           Path 1a - overdetermined, with many more rows than columns
-*
-            MM = N
-            ITAU = 1
-            IWORK = ITAU + N
-*
-*           Compute A=Q*R
-*           (Workspace: need 2*N, prefer N+N*NB)
-*
-            CALL SGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
-     $                   LWORK-IWORK+1, INFO )
-*
-*           Multiply B by transpose(Q)
-*           (Workspace: need N+NRHS, prefer N+NRHS*NB)
-*
-            CALL SORMQR( 'L', 'T', M, NRHS, N, A, LDA, WORK( ITAU ), B,
-     $                   LDB, WORK( IWORK ), LWORK-IWORK+1, INFO )
-*
-*           Zero out below R
-*
-            IF( N.GT.1 )
-     $         CALL SLASET( 'L', N-1, N-1, ZERO, ZERO, A( 2, 1 ), LDA )
-         END IF
-*
-         IE = 1
-         ITAUQ = IE + N
-         ITAUP = ITAUQ + N
-         IWORK = ITAUP + N
-*
-*        Bidiagonalize R in A
-*        (Workspace: need 3*N+MM, prefer 3*N+(MM+N)*NB)
-*
-         CALL SGEBRD( MM, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
-     $                WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors of R
-*        (Workspace: need 3*N+NRHS, prefer 3*N+NRHS*NB)
-*
-         CALL SORMBR( 'Q', 'L', 'T', MM, NRHS, N, A, LDA, WORK( ITAUQ ),
-     $                B, LDB, WORK( IWORK ), LWORK-IWORK+1, INFO )
-*
-*        Generate right bidiagonalizing vectors of R in A
-*        (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-         CALL SORGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                WORK( IWORK ), LWORK-IWORK+1, INFO )
-         IWORK = IE + N
-*
-*        Perform bidiagonal QR iteration
-*          multiply B by transpose of left singular vectors
-*          compute right singular vectors in A
-*        (Workspace: need BDSPAC)
-*
-         CALL SBDSQR( 'U', N, N, 0, NRHS, S, WORK( IE ), A, LDA, VDUM,
-     $                1, B, LDB, WORK( IWORK ), INFO )
-         IF( INFO.NE.0 )
-     $      GO TO 70
-*
-*        Multiply B by reciprocals of singular values
-*
-         THR = MAX( RCOND*S( 1 ), SFMIN )
-         IF( RCOND.LT.ZERO )
-     $      THR = MAX( EPS*S( 1 ), SFMIN )
-         RANK = 0
-         DO 10 I = 1, N
-            IF( S( I ).GT.THR ) THEN
-               CALL SRSCL( NRHS, S( I ), B( I, 1 ), LDB )
-               RANK = RANK + 1
-            ELSE
-               CALL SLASET( 'F', 1, NRHS, ZERO, ZERO, B( I, 1 ), LDB )
-            END IF
-   10    CONTINUE
-*
-*        Multiply B by right singular vectors
-*        (Workspace: need N, prefer N*NRHS)
-*
-         IF( LWORK.GE.LDB*NRHS .AND. NRHS.GT.1 ) THEN
-            CALL SGEMM( 'T', 'N', N, NRHS, N, ONE, A, LDA, B, LDB, ZERO,
-     $                  WORK, LDB )
-            CALL SLACPY( 'G', N, NRHS, WORK, LDB, B, LDB )
-         ELSE IF( NRHS.GT.1 ) THEN
-            CHUNK = LWORK / N
-            DO 20 I = 1, NRHS, CHUNK
-               BL = MIN( NRHS-I+1, CHUNK )
-               CALL SGEMM( 'T', 'N', N, BL, N, ONE, A, LDA, B( 1, I ),
-     $                     LDB, ZERO, WORK, N )
-               CALL SLACPY( 'G', N, BL, WORK, N, B( 1, I ), LDB )
-   20       CONTINUE
-         ELSE
-            CALL SGEMV( 'T', N, N, ONE, A, LDA, B, 1, ZERO, WORK, 1 )
-            CALL SCOPY( N, WORK, 1, B, 1 )
-         END IF
-*
-      ELSE IF( N.GE.MNTHR .AND. LWORK.GE.4*M+M*M+
-     $         MAX( M, 2*M-4, NRHS, N-3*M ) ) THEN
-*
-*        Path 2a - underdetermined, with many more columns than rows
-*        and sufficient workspace for an efficient algorithm
-*
-         LDWORK = M
-         IF( LWORK.GE.MAX( 4*M+M*LDA+MAX( M, 2*M-4, NRHS, N-3*M ),
-     $       M*LDA+M+M*NRHS ) )LDWORK = LDA
-         ITAU = 1
-         IWORK = M + 1
-*
-*        Compute A=L*Q
-*        (Workspace: need 2*M, prefer M+M*NB)
-*
-         CALL SGELQF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
-     $                LWORK-IWORK+1, INFO )
-         IL = IWORK
-*
-*        Copy L to WORK(IL), zeroing out above it
-*
-         CALL SLACPY( 'L', M, M, A, LDA, WORK( IL ), LDWORK )
-         CALL SLASET( 'U', M-1, M-1, ZERO, ZERO, WORK( IL+LDWORK ),
-     $                LDWORK )
-         IE = IL + LDWORK*M
-         ITAUQ = IE + M
-         ITAUP = ITAUQ + M
-         IWORK = ITAUP + M
-*
-*        Bidiagonalize L in WORK(IL)
-*        (Workspace: need M*M+5*M, prefer M*M+4*M+2*M*NB)
-*
-         CALL SGEBRD( M, M, WORK( IL ), LDWORK, S, WORK( IE ),
-     $                WORK( ITAUQ ), WORK( ITAUP ), WORK( IWORK ),
-     $                LWORK-IWORK+1, INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors of L
-*        (Workspace: need M*M+4*M+NRHS, prefer M*M+4*M+NRHS*NB)
-*
-         CALL SORMBR( 'Q', 'L', 'T', M, NRHS, M, WORK( IL ), LDWORK,
-     $                WORK( ITAUQ ), B, LDB, WORK( IWORK ),
-     $                LWORK-IWORK+1, INFO )
-*
-*        Generate right bidiagonalizing vectors of R in WORK(IL)
-*        (Workspace: need M*M+5*M-1, prefer M*M+4*M+(M-1)*NB)
-*
-         CALL SORGBR( 'P', M, M, M, WORK( IL ), LDWORK, WORK( ITAUP ),
-     $                WORK( IWORK ), LWORK-IWORK+1, INFO )
-         IWORK = IE + M
-*
-*        Perform bidiagonal QR iteration,
-*           computing right singular vectors of L in WORK(IL) and
-*           multiplying B by transpose of left singular vectors
-*        (Workspace: need M*M+M+BDSPAC)
-*
-         CALL SBDSQR( 'U', M, M, 0, NRHS, S, WORK( IE ), WORK( IL ),
-     $                LDWORK, A, LDA, B, LDB, WORK( IWORK ), INFO )
-         IF( INFO.NE.0 )
-     $      GO TO 70
-*
-*        Multiply B by reciprocals of singular values
-*
-         THR = MAX( RCOND*S( 1 ), SFMIN )
-         IF( RCOND.LT.ZERO )
-     $      THR = MAX( EPS*S( 1 ), SFMIN )
-         RANK = 0
-         DO 30 I = 1, M
-            IF( S( I ).GT.THR ) THEN
-               CALL SRSCL( NRHS, S( I ), B( I, 1 ), LDB )
-               RANK = RANK + 1
-            ELSE
-               CALL SLASET( 'F', 1, NRHS, ZERO, ZERO, B( I, 1 ), LDB )
-            END IF
-   30    CONTINUE
-         IWORK = IE
-*
-*        Multiply B by right singular vectors of L in WORK(IL)
-*        (Workspace: need M*M+2*M, prefer M*M+M+M*NRHS)
-*
-         IF( LWORK.GE.LDB*NRHS+IWORK-1 .AND. NRHS.GT.1 ) THEN
-            CALL SGEMM( 'T', 'N', M, NRHS, M, ONE, WORK( IL ), LDWORK,
-     $                  B, LDB, ZERO, WORK( IWORK ), LDB )
-            CALL SLACPY( 'G', M, NRHS, WORK( IWORK ), LDB, B, LDB )
-         ELSE IF( NRHS.GT.1 ) THEN
-            CHUNK = ( LWORK-IWORK+1 ) / M
-            DO 40 I = 1, NRHS, CHUNK
-               BL = MIN( NRHS-I+1, CHUNK )
-               CALL SGEMM( 'T', 'N', M, BL, M, ONE, WORK( IL ), LDWORK,
-     $                     B( 1, I ), LDB, ZERO, WORK( IWORK ), M )
-               CALL SLACPY( 'G', M, BL, WORK( IWORK ), M, B( 1, I ),
-     $                      LDB )
-   40       CONTINUE
-         ELSE
-            CALL SGEMV( 'T', M, M, ONE, WORK( IL ), LDWORK, B( 1, 1 ),
-     $                  1, ZERO, WORK( IWORK ), 1 )
-            CALL SCOPY( M, WORK( IWORK ), 1, B( 1, 1 ), 1 )
-         END IF
-*
-*        Zero out below first M rows of B
-*
-         CALL SLASET( 'F', N-M, NRHS, ZERO, ZERO, B( M+1, 1 ), LDB )
-         IWORK = ITAU + M
-*
-*        Multiply transpose(Q) by B
-*        (Workspace: need M+NRHS, prefer M+NRHS*NB)
-*
-         CALL SORMLQ( 'L', 'T', N, NRHS, M, A, LDA, WORK( ITAU ), B,
-     $                LDB, WORK( IWORK ), LWORK-IWORK+1, INFO )
-*
-      ELSE
-*
-*        Path 2 - remaining underdetermined cases
-*
-         IE = 1
-         ITAUQ = IE + M
-         ITAUP = ITAUQ + M
-         IWORK = ITAUP + M
-*
-*        Bidiagonalize A
-*        (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB)
-*
-         CALL SGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
-     $                WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors
-*        (Workspace: need 3*M+NRHS, prefer 3*M+NRHS*NB)
-*
-         CALL SORMBR( 'Q', 'L', 'T', M, NRHS, N, A, LDA, WORK( ITAUQ ),
-     $                B, LDB, WORK( IWORK ), LWORK-IWORK+1, INFO )
-*
-*        Generate right bidiagonalizing vectors in A
-*        (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-         CALL SORGBR( 'P', M, N, M, A, LDA, WORK( ITAUP ),
-     $                WORK( IWORK ), LWORK-IWORK+1, INFO )
-         IWORK = IE + M
-*
-*        Perform bidiagonal QR iteration,
-*           computing right singular vectors of A in A and
-*           multiplying B by transpose of left singular vectors
-*        (Workspace: need BDSPAC)
-*
-         CALL SBDSQR( 'L', M, N, 0, NRHS, S, WORK( IE ), A, LDA, VDUM,
-     $                1, B, LDB, WORK( IWORK ), INFO )
-         IF( INFO.NE.0 )
-     $      GO TO 70
-*
-*        Multiply B by reciprocals of singular values
-*
-         THR = MAX( RCOND*S( 1 ), SFMIN )
-         IF( RCOND.LT.ZERO )
-     $      THR = MAX( EPS*S( 1 ), SFMIN )
-         RANK = 0
-         DO 50 I = 1, M
-            IF( S( I ).GT.THR ) THEN
-               CALL SRSCL( NRHS, S( I ), B( I, 1 ), LDB )
-               RANK = RANK + 1
-            ELSE
-               CALL SLASET( 'F', 1, NRHS, ZERO, ZERO, B( I, 1 ), LDB )
-            END IF
-   50    CONTINUE
-*
-*        Multiply B by right singular vectors of A
-*        (Workspace: need N, prefer N*NRHS)
-*
-         IF( LWORK.GE.LDB*NRHS .AND. NRHS.GT.1 ) THEN
-            CALL SGEMM( 'T', 'N', N, NRHS, M, ONE, A, LDA, B, LDB, ZERO,
-     $                  WORK, LDB )
-            CALL SLACPY( 'F', N, NRHS, WORK, LDB, B, LDB )
-         ELSE IF( NRHS.GT.1 ) THEN
-            CHUNK = LWORK / N
-            DO 60 I = 1, NRHS, CHUNK
-               BL = MIN( NRHS-I+1, CHUNK )
-               CALL SGEMM( 'T', 'N', N, BL, M, ONE, A, LDA, B( 1, I ),
-     $                     LDB, ZERO, WORK, N )
-               CALL SLACPY( 'F', N, BL, WORK, N, B( 1, I ), LDB )
-   60       CONTINUE
-         ELSE
-            CALL SGEMV( 'T', M, N, ONE, A, LDA, B, 1, ZERO, WORK, 1 )
-            CALL SCOPY( N, WORK, 1, B, 1 )
-         END IF
-      END IF
-*
-*     Undo scaling
-*
-      IF( IASCL.EQ.1 ) THEN
-         CALL SLASCL( 'G', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO )
-         CALL SLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
-     $                INFO )
-      ELSE IF( IASCL.EQ.2 ) THEN
-         CALL SLASCL( 'G', 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB, INFO )
-         CALL SLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
-     $                INFO )
-      END IF
-      IF( IBSCL.EQ.1 ) THEN
-         CALL SLASCL( 'G', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO )
-      ELSE IF( IBSCL.EQ.2 ) THEN
-         CALL SLASCL( 'G', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO )
-      END IF
-*
-   70 CONTINUE
-      WORK( 1 ) = MAXWRK
-      RETURN
-*
-*     End of SGELSS
-*
-      END
--- a/libcruft/lapack/sgelsy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,391 +0,0 @@
-      SUBROUTINE SGELSY( M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND, RANK,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LDB, LWORK, M, N, NRHS, RANK
-      REAL               RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      REAL               A( LDA, * ), B( LDB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGELSY computes the minimum-norm solution to a real linear least
-*  squares problem:
-*      minimize || A * X - B ||
-*  using a complete orthogonal factorization of A.  A is an M-by-N
-*  matrix which may be rank-deficient.
-*
-*  Several right hand side vectors b and solution vectors x can be
-*  handled in a single call; they are stored as the columns of the
-*  M-by-NRHS right hand side matrix B and the N-by-NRHS solution
-*  matrix X.
-*
-*  The routine first computes a QR factorization with column pivoting:
-*      A * P = Q * [ R11 R12 ]
-*                  [  0  R22 ]
-*  with R11 defined as the largest leading submatrix whose estimated
-*  condition number is less than 1/RCOND.  The order of R11, RANK,
-*  is the effective rank of A.
-*
-*  Then, R22 is considered to be negligible, and R12 is annihilated
-*  by orthogonal transformations from the right, arriving at the
-*  complete orthogonal factorization:
-*     A * P = Q * [ T11 0 ] * Z
-*                 [  0  0 ]
-*  The minimum-norm solution is then
-*     X = P * Z' [ inv(T11)*Q1'*B ]
-*                [        0       ]
-*  where Q1 consists of the first RANK columns of Q.
-*
-*  This routine is basically identical to the original xGELSX except
-*  three differences:
-*    o The call to the subroutine xGEQPF has been substituted by the
-*      the call to the subroutine xGEQP3. This subroutine is a Blas-3
-*      version of the QR factorization with column pivoting.
-*    o Matrix B (the right hand side) is updated with Blas-3.
-*    o The permutation of matrix B (the right hand side) is faster and
-*      more simple.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of
-*          columns of matrices B and X. NRHS >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, A has been overwritten by details of its
-*          complete orthogonal factorization.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  B       (input/output) REAL array, dimension (LDB,NRHS)
-*          On entry, the M-by-NRHS right hand side matrix B.
-*          On exit, the N-by-NRHS solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B. LDB >= max(1,M,N).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          On entry, if JPVT(i) .ne. 0, the i-th column of A is permuted
-*          to the front of AP, otherwise column i is a free column.
-*          On exit, if JPVT(i) = k, then the i-th column of AP
-*          was the k-th column of A.
-*
-*  RCOND   (input) REAL
-*          RCOND is used to determine the effective rank of A, which
-*          is defined as the order of the largest leading triangular
-*          submatrix R11 in the QR factorization with pivoting of A,
-*          whose estimated condition number < 1/RCOND.
-*
-*  RANK    (output) INTEGER
-*          The effective rank of A, i.e., the order of the submatrix
-*          R11.  This is the same as the order of the submatrix T11
-*          in the complete orthogonal factorization of A.
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          The unblocked strategy requires that:
-*             LWORK >= MAX( MN+3*N+1, 2*MN+NRHS ),
-*          where MN = min( M, N ).
-*          The block algorithm requires that:
-*             LWORK >= MAX( MN+2*N+NB*(N+1), 2*MN+NB*NRHS ),
-*          where NB is an upper bound on the blocksize returned
-*          by ILAENV for the routines SGEQP3, STZRZF, STZRQF, SORMQR,
-*          and SORMRZ.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: If INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*    E. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*    G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            IMAX, IMIN
-      PARAMETER          ( IMAX = 1, IMIN = 2 )
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IASCL, IBSCL, ISMAX, ISMIN, J, LWKMIN,
-     $                   LWKOPT, MN, NB, NB1, NB2, NB3, NB4
-      REAL               ANRM, BIGNUM, BNRM, C1, C2, S1, S2, SMAX,
-     $                   SMAXPR, SMIN, SMINPR, SMLNUM, WSIZE
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      REAL               SLAMCH, SLANGE
-      EXTERNAL           ILAENV, SLAMCH, SLANGE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SGEQP3, SLABAD, SLAIC1, SLASCL, SLASET,
-     $                   SORMQR, SORMRZ, STRSM, STZRZF, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-      MN = MIN( M, N )
-      ISMIN = MN + 1
-      ISMAX = 2*MN + 1
-*
-*     Test the input arguments.
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, M, N ) ) THEN
-         INFO = -7
-      END IF
-*
-*     Figure out optimal block size
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( MN.EQ.0 .OR. NRHS.EQ.0 ) THEN
-            LWKMIN = 1
-            LWKOPT = 1
-         ELSE
-            NB1 = ILAENV( 1, 'SGEQRF', ' ', M, N, -1, -1 )
-            NB2 = ILAENV( 1, 'SGERQF', ' ', M, N, -1, -1 )
-            NB3 = ILAENV( 1, 'SORMQR', ' ', M, N, NRHS, -1 )
-            NB4 = ILAENV( 1, 'SORMRQ', ' ', M, N, NRHS, -1 )
-            NB = MAX( NB1, NB2, NB3, NB4 )
-            LWKMIN = MN + MAX( 2*MN, N + 1, MN + NRHS )
-            LWKOPT = MAX( LWKMIN,
-     $                    MN + 2*N + NB*( N + 1 ), 2*MN + NB*NRHS )
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
-            INFO = -12
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGELSY', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( MN.EQ.0 .OR. NRHS.EQ.0 ) THEN
-         RANK = 0
-         RETURN
-      END IF
-*
-*     Get machine parameters
-*
-      SMLNUM = SLAMCH( 'S' ) / SLAMCH( 'P' )
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-*
-*     Scale A, B if max entries outside range [SMLNUM,BIGNUM]
-*
-      ANRM = SLANGE( 'M', M, N, A, LDA, WORK )
-      IASCL = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL SLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO )
-         IASCL = 1
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM
-*
-         CALL SLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO )
-         IASCL = 2
-      ELSE IF( ANRM.EQ.ZERO ) THEN
-*
-*        Matrix all zero. Return zero solution.
-*
-         CALL SLASET( 'F', MAX( M, N ), NRHS, ZERO, ZERO, B, LDB )
-         RANK = 0
-         GO TO 70
-      END IF
-*
-      BNRM = SLANGE( 'M', M, NRHS, B, LDB, WORK )
-      IBSCL = 0
-      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL SLASCL( 'G', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 1
-      ELSE IF( BNRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM
-*
-         CALL SLASCL( 'G', 0, 0, BNRM, BIGNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 2
-      END IF
-*
-*     Compute QR factorization with column pivoting of A:
-*        A * P = Q * R
-*
-      CALL SGEQP3( M, N, A, LDA, JPVT, WORK( 1 ), WORK( MN+1 ),
-     $             LWORK-MN, INFO )
-      WSIZE = MN + WORK( MN+1 )
-*
-*     workspace: MN+2*N+NB*(N+1).
-*     Details of Householder rotations stored in WORK(1:MN).
-*
-*     Determine RANK using incremental condition estimation
-*
-      WORK( ISMIN ) = ONE
-      WORK( ISMAX ) = ONE
-      SMAX = ABS( A( 1, 1 ) )
-      SMIN = SMAX
-      IF( ABS( A( 1, 1 ) ).EQ.ZERO ) THEN
-         RANK = 0
-         CALL SLASET( 'F', MAX( M, N ), NRHS, ZERO, ZERO, B, LDB )
-         GO TO 70
-      ELSE
-         RANK = 1
-      END IF
-*
-   10 CONTINUE
-      IF( RANK.LT.MN ) THEN
-         I = RANK + 1
-         CALL SLAIC1( IMIN, RANK, WORK( ISMIN ), SMIN, A( 1, I ),
-     $                A( I, I ), SMINPR, S1, C1 )
-         CALL SLAIC1( IMAX, RANK, WORK( ISMAX ), SMAX, A( 1, I ),
-     $                A( I, I ), SMAXPR, S2, C2 )
-*
-         IF( SMAXPR*RCOND.LE.SMINPR ) THEN
-            DO 20 I = 1, RANK
-               WORK( ISMIN+I-1 ) = S1*WORK( ISMIN+I-1 )
-               WORK( ISMAX+I-1 ) = S2*WORK( ISMAX+I-1 )
-   20       CONTINUE
-            WORK( ISMIN+RANK ) = C1
-            WORK( ISMAX+RANK ) = C2
-            SMIN = SMINPR
-            SMAX = SMAXPR
-            RANK = RANK + 1
-            GO TO 10
-         END IF
-      END IF
-*
-*     workspace: 3*MN.
-*
-*     Logically partition R = [ R11 R12 ]
-*                             [  0  R22 ]
-*     where R11 = R(1:RANK,1:RANK)
-*
-*     [R11,R12] = [ T11, 0 ] * Y
-*
-      IF( RANK.LT.N )
-     $   CALL STZRZF( RANK, N, A, LDA, WORK( MN+1 ), WORK( 2*MN+1 ),
-     $                LWORK-2*MN, INFO )
-*
-*     workspace: 2*MN.
-*     Details of Householder rotations stored in WORK(MN+1:2*MN)
-*
-*     B(1:M,1:NRHS) := Q' * B(1:M,1:NRHS)
-*
-      CALL SORMQR( 'Left', 'Transpose', M, NRHS, MN, A, LDA, WORK( 1 ),
-     $             B, LDB, WORK( 2*MN+1 ), LWORK-2*MN, INFO )
-      WSIZE = MAX( WSIZE, 2*MN+WORK( 2*MN+1 ) )
-*
-*     workspace: 2*MN+NB*NRHS.
-*
-*     B(1:RANK,1:NRHS) := inv(T11) * B(1:RANK,1:NRHS)
-*
-      CALL STRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', RANK,
-     $            NRHS, ONE, A, LDA, B, LDB )
-*
-      DO 40 J = 1, NRHS
-         DO 30 I = RANK + 1, N
-            B( I, J ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-*
-*     B(1:N,1:NRHS) := Y' * B(1:N,1:NRHS)
-*
-      IF( RANK.LT.N ) THEN
-         CALL SORMRZ( 'Left', 'Transpose', N, NRHS, RANK, N-RANK, A,
-     $                LDA, WORK( MN+1 ), B, LDB, WORK( 2*MN+1 ),
-     $                LWORK-2*MN, INFO )
-      END IF
-*
-*     workspace: 2*MN+NRHS.
-*
-*     B(1:N,1:NRHS) := P * B(1:N,1:NRHS)
-*
-      DO 60 J = 1, NRHS
-         DO 50 I = 1, N
-            WORK( JPVT( I ) ) = B( I, J )
-   50    CONTINUE
-         CALL SCOPY( N, WORK( 1 ), 1, B( 1, J ), 1 )
-   60 CONTINUE
-*
-*     workspace: N.
-*
-*     Undo scaling
-*
-      IF( IASCL.EQ.1 ) THEN
-         CALL SLASCL( 'G', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO )
-         CALL SLASCL( 'U', 0, 0, SMLNUM, ANRM, RANK, RANK, A, LDA,
-     $                INFO )
-      ELSE IF( IASCL.EQ.2 ) THEN
-         CALL SLASCL( 'G', 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB, INFO )
-         CALL SLASCL( 'U', 0, 0, BIGNUM, ANRM, RANK, RANK, A, LDA,
-     $                INFO )
-      END IF
-      IF( IBSCL.EQ.1 ) THEN
-         CALL SLASCL( 'G', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO )
-      ELSE IF( IBSCL.EQ.2 ) THEN
-         CALL SLASCL( 'G', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO )
-      END IF
-*
-   70 CONTINUE
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of SGELSY
-*
-      END
--- a/libcruft/lapack/sgeqp3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,284 +0,0 @@
-      SUBROUTINE SGEQP3( M, N, A, LDA, JPVT, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGEQP3 computes a QR factorization with column pivoting of a
-*  matrix A:  A*P = Q*R  using Level 3 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the upper triangle of the array contains the
-*          min(M,N)-by-N upper trapezoidal matrix R; the elements below
-*          the diagonal, together with the array TAU, represent the
-*          orthogonal matrix Q as a product of min(M,N) elementary
-*          reflectors.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          On entry, if JPVT(J).ne.0, the J-th column of A is permuted
-*          to the front of A*P (a leading column); if JPVT(J)=0,
-*          the J-th column of A is a free column.
-*          On exit, if JPVT(J)=K, then the J-th column of A*P was the
-*          the K-th column of A.
-*
-*  TAU     (output) REAL array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors.
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO=0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= 3*N+1.
-*          For optimal performance LWORK >= 2*N+( N+1 )*NB, where NB
-*          is the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit.
-*          < 0: if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(k), where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real/complex scalar, and v is a real/complex vector
-*  with v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in
-*  A(i+1:m,i), and tau in TAU(i).
-*
-*  Based on contributions by
-*    G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*    X. Sun, Computer Science Dept., Duke University, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            INB, INBMIN, IXOVER
-      PARAMETER          ( INB = 1, INBMIN = 2, IXOVER = 3 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            FJB, IWS, J, JB, LWKOPT, MINMN, MINWS, NA, NB,
-     $                   NBMIN, NFXD, NX, SM, SMINMN, SN, TOPBMN
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEQRF, SLAQP2, SLAQPS, SORMQR, SSWAP, XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      REAL               SNRM2
-      EXTERNAL           ILAENV, SNRM2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          INT, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         MINMN = MIN( M, N )
-         IF( MINMN.EQ.0 ) THEN
-            IWS = 1
-            LWKOPT = 1
-         ELSE
-            IWS = 3*N + 1
-            NB = ILAENV( INB, 'SGEQRF', ' ', M, N, -1, -1 )
-            LWKOPT = 2*N + ( N + 1 )*NB
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( ( LWORK.LT.IWS ) .AND. .NOT.LQUERY ) THEN
-            INFO = -8
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGEQP3', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( MINMN.EQ.0 ) THEN
-         RETURN
-      END IF
-*
-*     Move initial columns up front.
-*
-      NFXD = 1
-      DO 10 J = 1, N
-         IF( JPVT( J ).NE.0 ) THEN
-            IF( J.NE.NFXD ) THEN
-               CALL SSWAP( M, A( 1, J ), 1, A( 1, NFXD ), 1 )
-               JPVT( J ) = JPVT( NFXD )
-               JPVT( NFXD ) = J
-            ELSE
-               JPVT( J ) = J
-            END IF
-            NFXD = NFXD + 1
-         ELSE
-            JPVT( J ) = J
-         END IF
-   10 CONTINUE
-      NFXD = NFXD - 1
-*
-*     Factorize fixed columns
-*     =======================
-*
-*     Compute the QR factorization of fixed columns and update
-*     remaining columns.
-*
-      IF( NFXD.GT.0 ) THEN
-         NA = MIN( M, NFXD )
-*CC      CALL SGEQR2( M, NA, A, LDA, TAU, WORK, INFO )
-         CALL SGEQRF( M, NA, A, LDA, TAU, WORK, LWORK, INFO )
-         IWS = MAX( IWS, INT( WORK( 1 ) ) )
-         IF( NA.LT.N ) THEN
-*CC         CALL SORM2R( 'Left', 'Transpose', M, N-NA, NA, A, LDA,
-*CC  $                   TAU, A( 1, NA+1 ), LDA, WORK, INFO )
-            CALL SORMQR( 'Left', 'Transpose', M, N-NA, NA, A, LDA, TAU,
-     $                   A( 1, NA+1 ), LDA, WORK, LWORK, INFO )
-            IWS = MAX( IWS, INT( WORK( 1 ) ) )
-         END IF
-      END IF
-*
-*     Factorize free columns
-*     ======================
-*
-      IF( NFXD.LT.MINMN ) THEN
-*
-         SM = M - NFXD
-         SN = N - NFXD
-         SMINMN = MINMN - NFXD
-*
-*        Determine the block size.
-*
-         NB = ILAENV( INB, 'SGEQRF', ' ', SM, SN, -1, -1 )
-         NBMIN = 2
-         NX = 0
-*
-         IF( ( NB.GT.1 ) .AND. ( NB.LT.SMINMN ) ) THEN
-*
-*           Determine when to cross over from blocked to unblocked code.
-*
-            NX = MAX( 0, ILAENV( IXOVER, 'SGEQRF', ' ', SM, SN, -1,
-     $           -1 ) )
-*
-*
-            IF( NX.LT.SMINMN ) THEN
-*
-*              Determine if workspace is large enough for blocked code.
-*
-               MINWS = 2*SN + ( SN+1 )*NB
-               IWS = MAX( IWS, MINWS )
-               IF( LWORK.LT.MINWS ) THEN
-*
-*                 Not enough workspace to use optimal NB: Reduce NB and
-*                 determine the minimum value of NB.
-*
-                  NB = ( LWORK-2*SN ) / ( SN+1 )
-                  NBMIN = MAX( 2, ILAENV( INBMIN, 'SGEQRF', ' ', SM, SN,
-     $                    -1, -1 ) )
-*
-*
-               END IF
-            END IF
-         END IF
-*
-*        Initialize partial column norms. The first N elements of work
-*        store the exact column norms.
-*
-         DO 20 J = NFXD + 1, N
-            WORK( J ) = SNRM2( SM, A( NFXD+1, J ), 1 )
-            WORK( N+J ) = WORK( J )
-   20    CONTINUE
-*
-         IF( ( NB.GE.NBMIN ) .AND. ( NB.LT.SMINMN ) .AND.
-     $       ( NX.LT.SMINMN ) ) THEN
-*
-*           Use blocked code initially.
-*
-            J = NFXD + 1
-*
-*           Compute factorization: while loop.
-*
-*
-            TOPBMN = MINMN - NX
-   30       CONTINUE
-            IF( J.LE.TOPBMN ) THEN
-               JB = MIN( NB, TOPBMN-J+1 )
-*
-*              Factorize JB columns among columns J:N.
-*
-               CALL SLAQPS( M, N-J+1, J-1, JB, FJB, A( 1, J ), LDA,
-     $                      JPVT( J ), TAU( J ), WORK( J ), WORK( N+J ),
-     $                      WORK( 2*N+1 ), WORK( 2*N+JB+1 ), N-J+1 )
-*
-               J = J + FJB
-               GO TO 30
-            END IF
-         ELSE
-            J = NFXD + 1
-         END IF
-*
-*        Use unblocked code to factor the last or only block.
-*
-*
-         IF( J.LE.MINMN )
-     $      CALL SLAQP2( M, N-J+1, J-1, A( 1, J ), LDA, JPVT( J ),
-     $                   TAU( J ), WORK( J ), WORK( N+J ),
-     $                   WORK( 2*N+1 ) )
-*
-      END IF
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of SGEQP3
-*
-      END
--- a/libcruft/lapack/sgeqpf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,231 +0,0 @@
-      SUBROUTINE SGEQPF( M, N, A, LDA, JPVT, TAU, WORK, INFO )
-*
-*  -- LAPACK deprecated driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  This routine is deprecated and has been replaced by routine SGEQP3.
-*
-*  SGEQPF computes a QR factorization with column pivoting of a
-*  real M-by-N matrix A: A*P = Q*R.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the upper triangle of the array contains the
-*          min(M,N)-by-N upper triangular matrix R; the elements
-*          below the diagonal, together with the array TAU,
-*          represent the orthogonal matrix Q as a product of
-*          min(m,n) elementary reflectors.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          On entry, if JPVT(i) .ne. 0, the i-th column of A is permuted
-*          to the front of A*P (a leading column); if JPVT(i) = 0,
-*          the i-th column of A is a free column.
-*          On exit, if JPVT(i) = k, then the i-th column of A*P
-*          was the k-th column of A.
-*
-*  TAU     (output) REAL array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors.
-*
-*  WORK    (workspace) REAL array, dimension (3*N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(n)
-*
-*  Each H(i) has the form
-*
-*     H = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i).
-*
-*  The matrix P is represented in jpvt as follows: If
-*     jpvt(j) = i
-*  then the jth column of P is the ith canonical unit vector.
-*
-*  Partial column norm updating strategy modified by
-*    Z. Drmac and Z. Bujanovic, Dept. of Mathematics,
-*    University of Zagreb, Croatia.
-*    June 2006.
-*  For more details see LAPACK Working Note 176.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ITEMP, J, MA, MN, PVT
-      REAL               AII, TEMP, TEMP2, TOL3Z
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEQR2, SLARF, SLARFG, SORM2R, SSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. External Functions ..
-      INTEGER            ISAMAX
-      REAL               SLAMCH, SNRM2
-      EXTERNAL           ISAMAX, SLAMCH, SNRM2
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGEQPF', -INFO )
-         RETURN
-      END IF
-*
-      MN = MIN( M, N )
-      TOL3Z = SQRT(SLAMCH('Epsilon'))
-*
-*     Move initial columns up front
-*
-      ITEMP = 1
-      DO 10 I = 1, N
-         IF( JPVT( I ).NE.0 ) THEN
-            IF( I.NE.ITEMP ) THEN
-               CALL SSWAP( M, A( 1, I ), 1, A( 1, ITEMP ), 1 )
-               JPVT( I ) = JPVT( ITEMP )
-               JPVT( ITEMP ) = I
-            ELSE
-               JPVT( I ) = I
-            END IF
-            ITEMP = ITEMP + 1
-         ELSE
-            JPVT( I ) = I
-         END IF
-   10 CONTINUE
-      ITEMP = ITEMP - 1
-*
-*     Compute the QR factorization and update remaining columns
-*
-      IF( ITEMP.GT.0 ) THEN
-         MA = MIN( ITEMP, M )
-         CALL SGEQR2( M, MA, A, LDA, TAU, WORK, INFO )
-         IF( MA.LT.N ) THEN
-            CALL SORM2R( 'Left', 'Transpose', M, N-MA, MA, A, LDA, TAU,
-     $                   A( 1, MA+1 ), LDA, WORK, INFO )
-         END IF
-      END IF
-*
-      IF( ITEMP.LT.MN ) THEN
-*
-*        Initialize partial column norms. The first n elements of
-*        work store the exact column norms.
-*
-         DO 20 I = ITEMP + 1, N
-            WORK( I ) = SNRM2( M-ITEMP, A( ITEMP+1, I ), 1 )
-            WORK( N+I ) = WORK( I )
-   20    CONTINUE
-*
-*        Compute factorization
-*
-         DO 40 I = ITEMP + 1, MN
-*
-*           Determine ith pivot column and swap if necessary
-*
-            PVT = ( I-1 ) + ISAMAX( N-I+1, WORK( I ), 1 )
-*
-            IF( PVT.NE.I ) THEN
-               CALL SSWAP( M, A( 1, PVT ), 1, A( 1, I ), 1 )
-               ITEMP = JPVT( PVT )
-               JPVT( PVT ) = JPVT( I )
-               JPVT( I ) = ITEMP
-               WORK( PVT ) = WORK( I )
-               WORK( N+PVT ) = WORK( N+I )
-            END IF
-*
-*           Generate elementary reflector H(i)
-*
-            IF( I.LT.M ) THEN
-               CALL SLARFG( M-I+1, A( I, I ), A( I+1, I ), 1, TAU( I ) )
-            ELSE
-               CALL SLARFG( 1, A( M, M ), A( M, M ), 1, TAU( M ) )
-            END IF
-*
-            IF( I.LT.N ) THEN
-*
-*              Apply H(i) to A(i:m,i+1:n) from the left
-*
-               AII = A( I, I )
-               A( I, I ) = ONE
-               CALL SLARF( 'LEFT', M-I+1, N-I, A( I, I ), 1, TAU( I ),
-     $                     A( I, I+1 ), LDA, WORK( 2*N+1 ) )
-               A( I, I ) = AII
-            END IF
-*
-*           Update partial column norms
-*
-            DO 30 J = I + 1, N
-               IF( WORK( J ).NE.ZERO ) THEN
-*
-*                 NOTE: The following 4 lines follow from the analysis in
-*                 Lapack Working Note 176.
-*                 
-                  TEMP = ABS( A( I, J ) ) / WORK( J )
-                  TEMP = MAX( ZERO, ( ONE+TEMP )*( ONE-TEMP ) )
-                  TEMP2 = TEMP*( WORK( J ) / WORK( N+J ) )**2
-                  IF( TEMP2 .LE. TOL3Z ) THEN 
-                     IF( M-I.GT.0 ) THEN
-                        WORK( J ) = SNRM2( M-I, A( I+1, J ), 1 )
-                        WORK( N+J ) = WORK( J )
-                     ELSE
-                        WORK( J ) = ZERO
-                        WORK( N+J ) = ZERO
-                     END IF
-                  ELSE
-                     WORK( J ) = WORK( J )*SQRT( TEMP )
-                  END IF
-               END IF
-   30       CONTINUE
-*
-   40    CONTINUE
-      END IF
-      RETURN
-*
-*     End of SGEQPF
-*
-      END
--- a/libcruft/lapack/sgeqr2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,121 +0,0 @@
-      SUBROUTINE SGEQR2( M, N, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGEQR2 computes a QR factorization of a real m by n matrix A:
-*  A = Q * R.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the m by n matrix A.
-*          On exit, the elements on and above the diagonal of the array
-*          contain the min(m,n) by n upper trapezoidal matrix R (R is
-*          upper triangular if m >= n); the elements below the diagonal,
-*          with the array TAU, represent the orthogonal matrix Q as a
-*          product of elementary reflectors (see Further Details).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) REAL array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace) REAL array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(k), where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i),
-*  and tau in TAU(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, K
-      REAL               AII
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARF, SLARFG, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGEQR2', -INFO )
-         RETURN
-      END IF
-*
-      K = MIN( M, N )
-*
-      DO 10 I = 1, K
-*
-*        Generate elementary reflector H(i) to annihilate A(i+1:m,i)
-*
-         CALL SLARFG( M-I+1, A( I, I ), A( MIN( I+1, M ), I ), 1,
-     $                TAU( I ) )
-         IF( I.LT.N ) THEN
-*
-*           Apply H(i) to A(i:m,i+1:n) from the left
-*
-            AII = A( I, I )
-            A( I, I ) = ONE
-            CALL SLARF( 'Left', M-I+1, N-I, A( I, I ), 1, TAU( I ),
-     $                  A( I, I+1 ), LDA, WORK )
-            A( I, I ) = AII
-         END IF
-   10 CONTINUE
-      RETURN
-*
-*     End of SGEQR2
-*
-      END
--- a/libcruft/lapack/sgeqrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,196 +0,0 @@
-      SUBROUTINE SGEQRF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGEQRF computes a QR factorization of a real M-by-N matrix A:
-*  A = Q * R.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the elements on and above the diagonal of the array
-*          contain the min(M,N)-by-N upper trapezoidal matrix R (R is
-*          upper triangular if m >= n); the elements below the diagonal,
-*          with the array TAU, represent the orthogonal matrix Q as a
-*          product of min(m,n) elementary reflectors (see Further
-*          Details).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) REAL array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,N).
-*          For optimum performance LWORK >= N*NB, where NB is 
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(k), where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i),
-*  and tau in TAU(i).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, K, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEQR2, SLARFB, SLARFT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NB = ILAENV( 1, 'SGEQRF', ' ', M, N, -1, -1 )
-      LWKOPT = N*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGEQRF', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      K = MIN( M, N )
-      IF( K.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = N
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'SGEQRF', ' ', M, N, -1, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = N
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'SGEQRF', ' ', M, N, -1,
-     $                 -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code initially
-*
-         DO 10 I = 1, K - NX, NB
-            IB = MIN( K-I+1, NB )
-*
-*           Compute the QR factorization of the current block
-*           A(i:m,i:i+ib-1)
-*
-            CALL SGEQR2( M-I+1, IB, A( I, I ), LDA, TAU( I ), WORK,
-     $                   IINFO )
-            IF( I+IB.LE.N ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i) H(i+1) . . . H(i+ib-1)
-*
-               CALL SLARFT( 'Forward', 'Columnwise', M-I+1, IB,
-     $                      A( I, I ), LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H' to A(i:m,i+ib:n) from the left
-*
-               CALL SLARFB( 'Left', 'Transpose', 'Forward',
-     $                      'Columnwise', M-I+1, N-I-IB+1, IB,
-     $                      A( I, I ), LDA, WORK, LDWORK, A( I, I+IB ),
-     $                      LDA, WORK( IB+1 ), LDWORK )
-            END IF
-   10    CONTINUE
-      ELSE
-         I = 1
-      END IF
-*
-*     Use unblocked code to factor the last or only block.
-*
-      IF( I.LE.K )
-     $   CALL SGEQR2( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK,
-     $                IINFO )
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of SGEQRF
-*
-      END
--- a/libcruft/lapack/sgesv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-      SUBROUTINE SGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      REAL               A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGESV computes the solution to a real system of linear equations
-*     A * X = B,
-*  where A is an N-by-N matrix and X and B are N-by-NRHS matrices.
-*
-*  The LU decomposition with partial pivoting and row interchanges is
-*  used to factor A as
-*     A = P * L * U,
-*  where P is a permutation matrix, L is unit lower triangular, and U is
-*  upper triangular.  The factored form of A is then used to solve the
-*  system of equations A * X = B.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of linear equations, i.e., the order of the
-*          matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the N-by-N coefficient matrix A.
-*          On exit, the factors L and U from the factorization
-*          A = P*L*U; the unit diagonal elements of L are not stored.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  IPIV    (output) INTEGER array, dimension (N)
-*          The pivot indices that define the permutation matrix P;
-*          row i of the matrix was interchanged with row IPIV(i).
-*
-*  B       (input/output) REAL array, dimension (LDB,NRHS)
-*          On entry, the N-by-NRHS matrix of right hand side matrix B.
-*          On exit, if INFO = 0, the N-by-NRHS solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, U(i,i) is exactly zero.  The factorization
-*                has been completed, but the factor U is exactly
-*                singular, so the solution could not be computed.
-*
-*  =====================================================================
-*
-*     .. External Subroutines ..
-      EXTERNAL           SGETRF, SGETRS, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGESV ', -INFO )
-         RETURN
-      END IF
-*
-*     Compute the LU factorization of A.
-*
-      CALL SGETRF( N, N, A, LDA, IPIV, INFO )
-      IF( INFO.EQ.0 ) THEN
-*
-*        Solve the system A*X = B, overwriting B with X.
-*
-         CALL SGETRS( 'No transpose', N, NRHS, A, LDA, IPIV, B, LDB,
-     $                INFO )
-      END IF
-      RETURN
-*
-*     End of SGESV
-*
-      END
--- a/libcruft/lapack/sgesvd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3402 +0,0 @@
-      SUBROUTINE SGESVD( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBU, JOBVT
-      INTEGER            INFO, LDA, LDU, LDVT, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), S( * ), U( LDU, * ),
-     $                   VT( LDVT, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGESVD computes the singular value decomposition (SVD) of a real
-*  M-by-N matrix A, optionally computing the left and/or right singular
-*  vectors. The SVD is written
-*
-*       A = U * SIGMA * transpose(V)
-*
-*  where SIGMA is an M-by-N matrix which is zero except for its
-*  min(m,n) diagonal elements, U is an M-by-M orthogonal matrix, and
-*  V is an N-by-N orthogonal matrix.  The diagonal elements of SIGMA
-*  are the singular values of A; they are real and non-negative, and
-*  are returned in descending order.  The first min(m,n) columns of
-*  U and V are the left and right singular vectors of A.
-*
-*  Note that the routine returns V**T, not V.
-*
-*  Arguments
-*  =========
-*
-*  JOBU    (input) CHARACTER*1
-*          Specifies options for computing all or part of the matrix U:
-*          = 'A':  all M columns of U are returned in array U:
-*          = 'S':  the first min(m,n) columns of U (the left singular
-*                  vectors) are returned in the array U;
-*          = 'O':  the first min(m,n) columns of U (the left singular
-*                  vectors) are overwritten on the array A;
-*          = 'N':  no columns of U (no left singular vectors) are
-*                  computed.
-*
-*  JOBVT   (input) CHARACTER*1
-*          Specifies options for computing all or part of the matrix
-*          V**T:
-*          = 'A':  all N rows of V**T are returned in the array VT;
-*          = 'S':  the first min(m,n) rows of V**T (the right singular
-*                  vectors) are returned in the array VT;
-*          = 'O':  the first min(m,n) rows of V**T (the right singular
-*                  vectors) are overwritten on the array A;
-*          = 'N':  no rows of V**T (no right singular vectors) are
-*                  computed.
-*
-*          JOBVT and JOBU cannot both be 'O'.
-*
-*  M       (input) INTEGER
-*          The number of rows of the input matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the input matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit,
-*          if JOBU = 'O',  A is overwritten with the first min(m,n)
-*                          columns of U (the left singular vectors,
-*                          stored columnwise);
-*          if JOBVT = 'O', A is overwritten with the first min(m,n)
-*                          rows of V**T (the right singular vectors,
-*                          stored rowwise);
-*          if JOBU .ne. 'O' and JOBVT .ne. 'O', the contents of A
-*                          are destroyed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  S       (output) REAL array, dimension (min(M,N))
-*          The singular values of A, sorted so that S(i) >= S(i+1).
-*
-*  U       (output) REAL array, dimension (LDU,UCOL)
-*          (LDU,M) if JOBU = 'A' or (LDU,min(M,N)) if JOBU = 'S'.
-*          If JOBU = 'A', U contains the M-by-M orthogonal matrix U;
-*          if JOBU = 'S', U contains the first min(m,n) columns of U
-*          (the left singular vectors, stored columnwise);
-*          if JOBU = 'N' or 'O', U is not referenced.
-*
-*  LDU     (input) INTEGER
-*          The leading dimension of the array U.  LDU >= 1; if
-*          JOBU = 'S' or 'A', LDU >= M.
-*
-*  VT      (output) REAL array, dimension (LDVT,N)
-*          If JOBVT = 'A', VT contains the N-by-N orthogonal matrix
-*          V**T;
-*          if JOBVT = 'S', VT contains the first min(m,n) rows of
-*          V**T (the right singular vectors, stored rowwise);
-*          if JOBVT = 'N' or 'O', VT is not referenced.
-*
-*  LDVT    (input) INTEGER
-*          The leading dimension of the array VT.  LDVT >= 1; if
-*          JOBVT = 'A', LDVT >= N; if JOBVT = 'S', LDVT >= min(M,N).
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK;
-*          if INFO > 0, WORK(2:MIN(M,N)) contains the unconverged
-*          superdiagonal elements of an upper bidiagonal matrix B
-*          whose diagonal is in S (not necessarily sorted). B
-*          satisfies A = U * B * VT, so it has the same singular values
-*          as A, and singular vectors related by U and VT.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          LWORK >= MAX(1,3*MIN(M,N)+MAX(M,N),5*MIN(M,N)).
-*          For good performance, LWORK should generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if SBDSQR did not converge, INFO specifies how many
-*                superdiagonals of an intermediate bidiagonal form B
-*                did not converge to zero. See the description of WORK
-*                above for details.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, WNTUA, WNTUAS, WNTUN, WNTUO, WNTUS,
-     $                   WNTVA, WNTVAS, WNTVN, WNTVO, WNTVS
-      INTEGER            BDSPAC, BLK, CHUNK, I, IE, IERR, IR, ISCL,
-     $                   ITAU, ITAUP, ITAUQ, IU, IWORK, LDWRKR, LDWRKU,
-     $                   MAXWRK, MINMN, MINWRK, MNTHR, NCU, NCVT, NRU,
-     $                   NRVT, WRKBL
-      REAL               ANRM, BIGNUM, EPS, SMLNUM
-*     ..
-*     .. Local Arrays ..
-      REAL               DUM( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SBDSQR, SGEBRD, SGELQF, SGEMM, SGEQRF, SLACPY,
-     $                   SLASCL, SLASET, SORGBR, SORGLQ, SORGQR, SORMBR,
-     $                   XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      REAL               SLAMCH, SLANGE
-      EXTERNAL           LSAME, ILAENV, SLAMCH, SLANGE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      MINMN = MIN( M, N )
-      WNTUA = LSAME( JOBU, 'A' )
-      WNTUS = LSAME( JOBU, 'S' )
-      WNTUAS = WNTUA .OR. WNTUS
-      WNTUO = LSAME( JOBU, 'O' )
-      WNTUN = LSAME( JOBU, 'N' )
-      WNTVA = LSAME( JOBVT, 'A' )
-      WNTVS = LSAME( JOBVT, 'S' )
-      WNTVAS = WNTVA .OR. WNTVS
-      WNTVO = LSAME( JOBVT, 'O' )
-      WNTVN = LSAME( JOBVT, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-      IF( .NOT.( WNTUA .OR. WNTUS .OR. WNTUO .OR. WNTUN ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.( WNTVA .OR. WNTVS .OR. WNTVO .OR. WNTVN ) .OR.
-     $         ( WNTVO .AND. WNTUO ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -6
-      ELSE IF( LDU.LT.1 .OR. ( WNTUAS .AND. LDU.LT.M ) ) THEN
-         INFO = -9
-      ELSE IF( LDVT.LT.1 .OR. ( WNTVA .AND. LDVT.LT.N ) .OR.
-     $         ( WNTVS .AND. LDVT.LT.MINMN ) ) THEN
-         INFO = -11
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of workspace needed at that point in the code,
-*       as well as the preferred amount for good performance.
-*       NB refers to the optimal block size for the immediately
-*       following subroutine, as returned by ILAENV.)
-*
-      IF( INFO.EQ.0 ) THEN
-         MINWRK = 1
-         MAXWRK = 1
-         IF( M.GE.N .AND. MINMN.GT.0 ) THEN
-*
-*           Compute space needed for SBDSQR
-*
-            MNTHR = ILAENV( 6, 'SGESVD', JOBU // JOBVT, M, N, 0, 0 )
-            BDSPAC = 5*N
-            IF( M.GE.MNTHR ) THEN
-               IF( WNTUN ) THEN
-*
-*                 Path 1 (M much larger than N, JOBU='N')
-*
-                  MAXWRK = N + N*ILAENV( 1, 'SGEQRF', ' ', M, N, -1,
-     $                     -1 )
-                  MAXWRK = MAX( MAXWRK, 3*N+2*N*
-     $                     ILAENV( 1, 'SGEBRD', ' ', N, N, -1, -1 ) )
-                  IF( WNTVO .OR. WNTVAS )
-     $               MAXWRK = MAX( MAXWRK, 3*N+( N-1 )*
-     $                        ILAENV( 1, 'SORGBR', 'P', N, N, N, -1 ) )
-                  MAXWRK = MAX( MAXWRK, BDSPAC )
-                  MINWRK = MAX( 4*N, BDSPAC )
-               ELSE IF( WNTUO .AND. WNTVN ) THEN
-*
-*                 Path 2 (M much larger than N, JOBU='O', JOBVT='N')
-*
-                  WRKBL = N + N*ILAENV( 1, 'SGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'SORGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+2*N*
-     $                    ILAENV( 1, 'SGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+N*
-     $                    ILAENV( 1, 'SORGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = MAX( N*N+WRKBL, N*N+M*N+N )
-                  MINWRK = MAX( 3*N+M, BDSPAC )
-               ELSE IF( WNTUO .AND. WNTVAS ) THEN
-*
-*                 Path 3 (M much larger than N, JOBU='O', JOBVT='S' or
-*                 'A')
-*
-                  WRKBL = N + N*ILAENV( 1, 'SGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'SORGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+2*N*
-     $                    ILAENV( 1, 'SGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+N*
-     $                    ILAENV( 1, 'SORGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+( N-1 )*
-     $                    ILAENV( 1, 'SORGBR', 'P', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = MAX( N*N+WRKBL, N*N+M*N+N )
-                  MINWRK = MAX( 3*N+M, BDSPAC )
-               ELSE IF( WNTUS .AND. WNTVN ) THEN
-*
-*                 Path 4 (M much larger than N, JOBU='S', JOBVT='N')
-*
-                  WRKBL = N + N*ILAENV( 1, 'SGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'SORGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+2*N*
-     $                    ILAENV( 1, 'SGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+N*
-     $                    ILAENV( 1, 'SORGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = N*N + WRKBL
-                  MINWRK = MAX( 3*N+M, BDSPAC )
-               ELSE IF( WNTUS .AND. WNTVO ) THEN
-*
-*                 Path 5 (M much larger than N, JOBU='S', JOBVT='O')
-*
-                  WRKBL = N + N*ILAENV( 1, 'SGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'SORGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+2*N*
-     $                    ILAENV( 1, 'SGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+N*
-     $                    ILAENV( 1, 'SORGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+( N-1 )*
-     $                    ILAENV( 1, 'SORGBR', 'P', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = 2*N*N + WRKBL
-                  MINWRK = MAX( 3*N+M, BDSPAC )
-               ELSE IF( WNTUS .AND. WNTVAS ) THEN
-*
-*                 Path 6 (M much larger than N, JOBU='S', JOBVT='S' or
-*                 'A')
-*
-                  WRKBL = N + N*ILAENV( 1, 'SGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'SORGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+2*N*
-     $                    ILAENV( 1, 'SGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+N*
-     $                    ILAENV( 1, 'SORGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+( N-1 )*
-     $                    ILAENV( 1, 'SORGBR', 'P', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = N*N + WRKBL
-                  MINWRK = MAX( 3*N+M, BDSPAC )
-               ELSE IF( WNTUA .AND. WNTVN ) THEN
-*
-*                 Path 7 (M much larger than N, JOBU='A', JOBVT='N')
-*
-                  WRKBL = N + N*ILAENV( 1, 'SGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+M*ILAENV( 1, 'SORGQR', ' ', M,
-     $                    M, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+2*N*
-     $                    ILAENV( 1, 'SGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+N*
-     $                    ILAENV( 1, 'SORGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = N*N + WRKBL
-                  MINWRK = MAX( 3*N+M, BDSPAC )
-               ELSE IF( WNTUA .AND. WNTVO ) THEN
-*
-*                 Path 8 (M much larger than N, JOBU='A', JOBVT='O')
-*
-                  WRKBL = N + N*ILAENV( 1, 'SGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+M*ILAENV( 1, 'SORGQR', ' ', M,
-     $                    M, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+2*N*
-     $                    ILAENV( 1, 'SGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+N*
-     $                    ILAENV( 1, 'SORGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+( N-1 )*
-     $                    ILAENV( 1, 'SORGBR', 'P', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = 2*N*N + WRKBL
-                  MINWRK = MAX( 3*N+M, BDSPAC )
-               ELSE IF( WNTUA .AND. WNTVAS ) THEN
-*
-*                 Path 9 (M much larger than N, JOBU='A', JOBVT='S' or
-*                 'A')
-*
-                  WRKBL = N + N*ILAENV( 1, 'SGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+M*ILAENV( 1, 'SORGQR', ' ', M,
-     $                    M, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+2*N*
-     $                    ILAENV( 1, 'SGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+N*
-     $                    ILAENV( 1, 'SORGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*N+( N-1 )*
-     $                    ILAENV( 1, 'SORGBR', 'P', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = N*N + WRKBL
-                  MINWRK = MAX( 3*N+M, BDSPAC )
-               END IF
-            ELSE
-*
-*              Path 10 (M at least N, but not much larger)
-*
-               MAXWRK = 3*N + ( M+N )*ILAENV( 1, 'SGEBRD', ' ', M, N,
-     $                  -1, -1 )
-               IF( WNTUS .OR. WNTUO )
-     $            MAXWRK = MAX( MAXWRK, 3*N+N*
-     $                     ILAENV( 1, 'SORGBR', 'Q', M, N, N, -1 ) )
-               IF( WNTUA )
-     $            MAXWRK = MAX( MAXWRK, 3*N+M*
-     $                     ILAENV( 1, 'SORGBR', 'Q', M, M, N, -1 ) )
-               IF( .NOT.WNTVN )
-     $            MAXWRK = MAX( MAXWRK, 3*N+( N-1 )*
-     $                     ILAENV( 1, 'SORGBR', 'P', N, N, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, BDSPAC )
-               MINWRK = MAX( 3*N+M, BDSPAC )
-            END IF
-         ELSE IF( MINMN.GT.0 ) THEN
-*
-*           Compute space needed for SBDSQR
-*
-            MNTHR = ILAENV( 6, 'SGESVD', JOBU // JOBVT, M, N, 0, 0 )
-            BDSPAC = 5*M
-            IF( N.GE.MNTHR ) THEN
-               IF( WNTVN ) THEN
-*
-*                 Path 1t(N much larger than M, JOBVT='N')
-*
-                  MAXWRK = M + M*ILAENV( 1, 'SGELQF', ' ', M, N, -1,
-     $                     -1 )
-                  MAXWRK = MAX( MAXWRK, 3*M+2*M*
-     $                     ILAENV( 1, 'SGEBRD', ' ', M, M, -1, -1 ) )
-                  IF( WNTUO .OR. WNTUAS )
-     $               MAXWRK = MAX( MAXWRK, 3*M+M*
-     $                        ILAENV( 1, 'SORGBR', 'Q', M, M, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, BDSPAC )
-                  MINWRK = MAX( 4*M, BDSPAC )
-               ELSE IF( WNTVO .AND. WNTUN ) THEN
-*
-*                 Path 2t(N much larger than M, JOBU='N', JOBVT='O')
-*
-                  WRKBL = M + M*ILAENV( 1, 'SGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'SORGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+2*M*
-     $                    ILAENV( 1, 'SGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+( M-1 )*
-     $                    ILAENV( 1, 'SORGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = MAX( M*M+WRKBL, M*M+M*N+M )
-                  MINWRK = MAX( 3*M+N, BDSPAC )
-               ELSE IF( WNTVO .AND. WNTUAS ) THEN
-*
-*                 Path 3t(N much larger than M, JOBU='S' or 'A',
-*                 JOBVT='O')
-*
-                  WRKBL = M + M*ILAENV( 1, 'SGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'SORGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+2*M*
-     $                    ILAENV( 1, 'SGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+( M-1 )*
-     $                    ILAENV( 1, 'SORGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+M*
-     $                    ILAENV( 1, 'SORGBR', 'Q', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = MAX( M*M+WRKBL, M*M+M*N+M )
-                  MINWRK = MAX( 3*M+N, BDSPAC )
-               ELSE IF( WNTVS .AND. WNTUN ) THEN
-*
-*                 Path 4t(N much larger than M, JOBU='N', JOBVT='S')
-*
-                  WRKBL = M + M*ILAENV( 1, 'SGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'SORGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+2*M*
-     $                    ILAENV( 1, 'SGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+( M-1 )*
-     $                    ILAENV( 1, 'SORGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = M*M + WRKBL
-                  MINWRK = MAX( 3*M+N, BDSPAC )
-               ELSE IF( WNTVS .AND. WNTUO ) THEN
-*
-*                 Path 5t(N much larger than M, JOBU='O', JOBVT='S')
-*
-                  WRKBL = M + M*ILAENV( 1, 'SGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'SORGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+2*M*
-     $                    ILAENV( 1, 'SGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+( M-1 )*
-     $                    ILAENV( 1, 'SORGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+M*
-     $                    ILAENV( 1, 'SORGBR', 'Q', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = 2*M*M + WRKBL
-                  MINWRK = MAX( 3*M+N, BDSPAC )
-                  MAXWRK = MAX( MAXWRK, MINWRK )
-               ELSE IF( WNTVS .AND. WNTUAS ) THEN
-*
-*                 Path 6t(N much larger than M, JOBU='S' or 'A',
-*                 JOBVT='S')
-*
-                  WRKBL = M + M*ILAENV( 1, 'SGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'SORGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+2*M*
-     $                    ILAENV( 1, 'SGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+( M-1 )*
-     $                    ILAENV( 1, 'SORGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+M*
-     $                    ILAENV( 1, 'SORGBR', 'Q', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = M*M + WRKBL
-                  MINWRK = MAX( 3*M+N, BDSPAC )
-               ELSE IF( WNTVA .AND. WNTUN ) THEN
-*
-*                 Path 7t(N much larger than M, JOBU='N', JOBVT='A')
-*
-                  WRKBL = M + M*ILAENV( 1, 'SGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+N*ILAENV( 1, 'SORGLQ', ' ', N,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+2*M*
-     $                    ILAENV( 1, 'SGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+( M-1 )*
-     $                    ILAENV( 1, 'SORGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = M*M + WRKBL
-                  MINWRK = MAX( 3*M+N, BDSPAC )
-               ELSE IF( WNTVA .AND. WNTUO ) THEN
-*
-*                 Path 8t(N much larger than M, JOBU='O', JOBVT='A')
-*
-                  WRKBL = M + M*ILAENV( 1, 'SGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+N*ILAENV( 1, 'SORGLQ', ' ', N,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+2*M*
-     $                    ILAENV( 1, 'SGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+( M-1 )*
-     $                    ILAENV( 1, 'SORGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+M*
-     $                    ILAENV( 1, 'SORGBR', 'Q', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = 2*M*M + WRKBL
-                  MINWRK = MAX( 3*M+N, BDSPAC )
-               ELSE IF( WNTVA .AND. WNTUAS ) THEN
-*
-*                 Path 9t(N much larger than M, JOBU='S' or 'A',
-*                 JOBVT='A')
-*
-                  WRKBL = M + M*ILAENV( 1, 'SGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+N*ILAENV( 1, 'SORGLQ', ' ', N,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+2*M*
-     $                    ILAENV( 1, 'SGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+( M-1 )*
-     $                    ILAENV( 1, 'SORGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 3*M+M*
-     $                    ILAENV( 1, 'SORGBR', 'Q', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, BDSPAC )
-                  MAXWRK = M*M + WRKBL
-                  MINWRK = MAX( 3*M+N, BDSPAC )
-               END IF
-            ELSE
-*
-*              Path 10t(N greater than M, but not much larger)
-*
-               MAXWRK = 3*M + ( M+N )*ILAENV( 1, 'SGEBRD', ' ', M, N,
-     $                  -1, -1 )
-               IF( WNTVS .OR. WNTVO )
-     $            MAXWRK = MAX( MAXWRK, 3*M+M*
-     $                     ILAENV( 1, 'SORGBR', 'P', M, N, M, -1 ) )
-               IF( WNTVA )
-     $            MAXWRK = MAX( MAXWRK, 3*M+N*
-     $                     ILAENV( 1, 'SORGBR', 'P', N, N, M, -1 ) )
-               IF( .NOT.WNTUN )
-     $            MAXWRK = MAX( MAXWRK, 3*M+( M-1 )*
-     $                     ILAENV( 1, 'SORGBR', 'Q', M, M, M, -1 ) )
-               MAXWRK = MAX( MAXWRK, BDSPAC )
-               MINWRK = MAX( 3*M+N, BDSPAC )
-            END IF
-         END IF
-         MAXWRK = MAX( MAXWRK, MINWRK )
-         WORK( 1 ) = MAXWRK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
-            INFO = -13
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGESVD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         RETURN
-      END IF
-*
-*     Get machine constants
-*
-      EPS = SLAMCH( 'P' )
-      SMLNUM = SQRT( SLAMCH( 'S' ) ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = SLANGE( 'M', M, N, A, LDA, DUM )
-      ISCL = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-         ISCL = 1
-         CALL SLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, IERR )
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-         ISCL = 1
-         CALL SLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, IERR )
-      END IF
-*
-      IF( M.GE.N ) THEN
-*
-*        A has at least as many rows as columns. If A has sufficiently
-*        more rows than columns, first reduce using the QR
-*        decomposition (if sufficient workspace available)
-*
-         IF( M.GE.MNTHR ) THEN
-*
-            IF( WNTUN ) THEN
-*
-*              Path 1 (M much larger than N, JOBU='N')
-*              No left singular vectors to be computed
-*
-               ITAU = 1
-               IWORK = ITAU + N
-*
-*              Compute A=Q*R
-*              (Workspace: need 2*N, prefer N+N*NB)
-*
-               CALL SGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
-     $                      LWORK-IWORK+1, IERR )
-*
-*              Zero out below R
-*
-               CALL SLASET( 'L', N-1, N-1, ZERO, ZERO, A( 2, 1 ), LDA )
-               IE = 1
-               ITAUQ = IE + N
-               ITAUP = ITAUQ + N
-               IWORK = ITAUP + N
-*
-*              Bidiagonalize R in A
-*              (Workspace: need 4*N, prefer 3*N+2*N*NB)
-*
-               CALL SGEBRD( N, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
-     $                      WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                      IERR )
-               NCVT = 0
-               IF( WNTVO .OR. WNTVAS ) THEN
-*
-*                 If right singular vectors desired, generate P'.
-*                 (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-                  CALL SORGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  NCVT = N
-               END IF
-               IWORK = IE + N
-*
-*              Perform bidiagonal QR iteration, computing right
-*              singular vectors of A in A if desired
-*              (Workspace: need BDSPAC)
-*
-               CALL SBDSQR( 'U', N, NCVT, 0, 0, S, WORK( IE ), A, LDA,
-     $                      DUM, 1, DUM, 1, WORK( IWORK ), INFO )
-*
-*              If right singular vectors desired in VT, copy them there
-*
-               IF( WNTVAS )
-     $            CALL SLACPY( 'F', N, N, A, LDA, VT, LDVT )
-*
-            ELSE IF( WNTUO .AND. WNTVN ) THEN
-*
-*              Path 2 (M much larger than N, JOBU='O', JOBVT='N')
-*              N left singular vectors to be overwritten on A and
-*              no right singular vectors to be computed
-*
-               IF( LWORK.GE.N*N+MAX( 4*N, BDSPAC ) ) THEN
-*
-*                 Sufficient workspace for a fast algorithm
-*
-                  IR = 1
-                  IF( LWORK.GE.MAX( WRKBL, LDA*N+N )+LDA*N ) THEN
-*
-*                    WORK(IU) is LDA by N, WORK(IR) is LDA by N
-*
-                     LDWRKU = LDA
-                     LDWRKR = LDA
-                  ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N+N )+N*N ) THEN
-*
-*                    WORK(IU) is LDA by N, WORK(IR) is N by N
-*
-                     LDWRKU = LDA
-                     LDWRKR = N
-                  ELSE
-*
-*                    WORK(IU) is LDWRKU by N, WORK(IR) is N by N
-*
-                     LDWRKU = ( LWORK-N*N-N ) / N
-                     LDWRKR = N
-                  END IF
-                  ITAU = IR + LDWRKR*N
-                  IWORK = ITAU + N
-*
-*                 Compute A=Q*R
-*                 (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                  CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy R to WORK(IR) and zero out below it
-*
-                  CALL SLACPY( 'U', N, N, A, LDA, WORK( IR ), LDWRKR )
-                  CALL SLASET( 'L', N-1, N-1, ZERO, ZERO, WORK( IR+1 ),
-     $                         LDWRKR )
-*
-*                 Generate Q in A
-*                 (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                  CALL SORGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = ITAU
-                  ITAUQ = IE + N
-                  ITAUP = ITAUQ + N
-                  IWORK = ITAUP + N
-*
-*                 Bidiagonalize R in WORK(IR)
-*                 (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB)
-*
-                  CALL SGEBRD( N, N, WORK( IR ), LDWRKR, S, WORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Generate left vectors bidiagonalizing R
-*                 (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB)
-*
-                  CALL SORGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
-     $                         WORK( ITAUQ ), WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-                  IWORK = IE + N
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of R in WORK(IR)
-*                 (Workspace: need N*N+BDSPAC)
-*
-                  CALL SBDSQR( 'U', N, 0, N, 0, S, WORK( IE ), DUM, 1,
-     $                         WORK( IR ), LDWRKR, DUM, 1,
-     $                         WORK( IWORK ), INFO )
-                  IU = IE + N
-*
-*                 Multiply Q in A by left singular vectors of R in
-*                 WORK(IR), storing result in WORK(IU) and copying to A
-*                 (Workspace: need N*N+2*N, prefer N*N+M*N+N)
-*
-                  DO 10 I = 1, M, LDWRKU
-                     CHUNK = MIN( M-I+1, LDWRKU )
-                     CALL SGEMM( 'N', 'N', CHUNK, N, N, ONE, A( I, 1 ),
-     $                           LDA, WORK( IR ), LDWRKR, ZERO,
-     $                           WORK( IU ), LDWRKU )
-                     CALL SLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU,
-     $                            A( I, 1 ), LDA )
-   10             CONTINUE
-*
-               ELSE
-*
-*                 Insufficient workspace for a fast algorithm
-*
-                  IE = 1
-                  ITAUQ = IE + N
-                  ITAUP = ITAUQ + N
-                  IWORK = ITAUP + N
-*
-*                 Bidiagonalize A
-*                 (Workspace: need 3*N+M, prefer 3*N+(M+N)*NB)
-*
-                  CALL SGEBRD( M, N, A, LDA, S, WORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Generate left vectors bidiagonalizing A
-*                 (Workspace: need 4*N, prefer 3*N+N*NB)
-*
-                  CALL SORGBR( 'Q', M, N, N, A, LDA, WORK( ITAUQ ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IWORK = IE + N
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of A in A
-*                 (Workspace: need BDSPAC)
-*
-                  CALL SBDSQR( 'U', N, 0, M, 0, S, WORK( IE ), DUM, 1,
-     $                         A, LDA, DUM, 1, WORK( IWORK ), INFO )
-*
-               END IF
-*
-            ELSE IF( WNTUO .AND. WNTVAS ) THEN
-*
-*              Path 3 (M much larger than N, JOBU='O', JOBVT='S' or 'A')
-*              N left singular vectors to be overwritten on A and
-*              N right singular vectors to be computed in VT
-*
-               IF( LWORK.GE.N*N+MAX( 4*N, BDSPAC ) ) THEN
-*
-*                 Sufficient workspace for a fast algorithm
-*
-                  IR = 1
-                  IF( LWORK.GE.MAX( WRKBL, LDA*N+N )+LDA*N ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is LDA by N
-*
-                     LDWRKU = LDA
-                     LDWRKR = LDA
-                  ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N+N )+N*N ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is N by N
-*
-                     LDWRKU = LDA
-                     LDWRKR = N
-                  ELSE
-*
-*                    WORK(IU) is LDWRKU by N and WORK(IR) is N by N
-*
-                     LDWRKU = ( LWORK-N*N-N ) / N
-                     LDWRKR = N
-                  END IF
-                  ITAU = IR + LDWRKR*N
-                  IWORK = ITAU + N
-*
-*                 Compute A=Q*R
-*                 (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                  CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy R to VT, zeroing out below it
-*
-                  CALL SLACPY( 'U', N, N, A, LDA, VT, LDVT )
-                  IF( N.GT.1 )
-     $               CALL SLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                            VT( 2, 1 ), LDVT )
-*
-*                 Generate Q in A
-*                 (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                  CALL SORGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = ITAU
-                  ITAUQ = IE + N
-                  ITAUP = ITAUQ + N
-                  IWORK = ITAUP + N
-*
-*                 Bidiagonalize R in VT, copying result to WORK(IR)
-*                 (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB)
-*
-                  CALL SGEBRD( N, N, VT, LDVT, S, WORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  CALL SLACPY( 'L', N, N, VT, LDVT, WORK( IR ), LDWRKR )
-*
-*                 Generate left vectors bidiagonalizing R in WORK(IR)
-*                 (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB)
-*
-                  CALL SORGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
-     $                         WORK( ITAUQ ), WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-*
-*                 Generate right vectors bidiagonalizing R in VT
-*                 (Workspace: need N*N+4*N-1, prefer N*N+3*N+(N-1)*NB)
-*
-                  CALL SORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IWORK = IE + N
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of R in WORK(IR) and computing right
-*                 singular vectors of R in VT
-*                 (Workspace: need N*N+BDSPAC)
-*
-                  CALL SBDSQR( 'U', N, N, N, 0, S, WORK( IE ), VT, LDVT,
-     $                         WORK( IR ), LDWRKR, DUM, 1,
-     $                         WORK( IWORK ), INFO )
-                  IU = IE + N
-*
-*                 Multiply Q in A by left singular vectors of R in
-*                 WORK(IR), storing result in WORK(IU) and copying to A
-*                 (Workspace: need N*N+2*N, prefer N*N+M*N+N)
-*
-                  DO 20 I = 1, M, LDWRKU
-                     CHUNK = MIN( M-I+1, LDWRKU )
-                     CALL SGEMM( 'N', 'N', CHUNK, N, N, ONE, A( I, 1 ),
-     $                           LDA, WORK( IR ), LDWRKR, ZERO,
-     $                           WORK( IU ), LDWRKU )
-                     CALL SLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU,
-     $                            A( I, 1 ), LDA )
-   20             CONTINUE
-*
-               ELSE
-*
-*                 Insufficient workspace for a fast algorithm
-*
-                  ITAU = 1
-                  IWORK = ITAU + N
-*
-*                 Compute A=Q*R
-*                 (Workspace: need 2*N, prefer N+N*NB)
-*
-                  CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy R to VT, zeroing out below it
-*
-                  CALL SLACPY( 'U', N, N, A, LDA, VT, LDVT )
-                  IF( N.GT.1 )
-     $               CALL SLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                            VT( 2, 1 ), LDVT )
-*
-*                 Generate Q in A
-*                 (Workspace: need 2*N, prefer N+N*NB)
-*
-                  CALL SORGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = ITAU
-                  ITAUQ = IE + N
-                  ITAUP = ITAUQ + N
-                  IWORK = ITAUP + N
-*
-*                 Bidiagonalize R in VT
-*                 (Workspace: need 4*N, prefer 3*N+2*N*NB)
-*
-                  CALL SGEBRD( N, N, VT, LDVT, S, WORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Multiply Q in A by left vectors bidiagonalizing R
-*                 (Workspace: need 3*N+M, prefer 3*N+M*NB)
-*
-                  CALL SORMBR( 'Q', 'R', 'N', M, N, N, VT, LDVT,
-     $                         WORK( ITAUQ ), A, LDA, WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-*
-*                 Generate right vectors bidiagonalizing R in VT
-*                 (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-                  CALL SORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IWORK = IE + N
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of A in A and computing right
-*                 singular vectors of A in VT
-*                 (Workspace: need BDSPAC)
-*
-                  CALL SBDSQR( 'U', N, N, M, 0, S, WORK( IE ), VT, LDVT,
-     $                         A, LDA, DUM, 1, WORK( IWORK ), INFO )
-*
-               END IF
-*
-            ELSE IF( WNTUS ) THEN
-*
-               IF( WNTVN ) THEN
-*
-*                 Path 4 (M much larger than N, JOBU='S', JOBVT='N')
-*                 N left singular vectors to be computed in U and
-*                 no right singular vectors to be computed
-*
-                  IF( LWORK.GE.N*N+MAX( 4*N, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IR = 1
-                     IF( LWORK.GE.WRKBL+LDA*N ) THEN
-*
-*                       WORK(IR) is LDA by N
-*
-                        LDWRKR = LDA
-                     ELSE
-*
-*                       WORK(IR) is N by N
-*
-                        LDWRKR = N
-                     END IF
-                     ITAU = IR + LDWRKR*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R
-*                    (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                     CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IR), zeroing out below it
-*
-                     CALL SLACPY( 'U', N, N, A, LDA, WORK( IR ),
-     $                            LDWRKR )
-                     CALL SLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                            WORK( IR+1 ), LDWRKR )
-*
-*                    Generate Q in A
-*                    (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                     CALL SORGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IR)
-*                    (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB)
-*
-                     CALL SGEBRD( N, N, WORK( IR ), LDWRKR, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left vectors bidiagonalizing R in WORK(IR)
-*                    (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB)
-*
-                     CALL SORGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IR)
-*                    (Workspace: need N*N+BDSPAC)
-*
-                     CALL SBDSQR( 'U', N, 0, N, 0, S, WORK( IE ), DUM,
-     $                            1, WORK( IR ), LDWRKR, DUM, 1,
-     $                            WORK( IWORK ), INFO )
-*
-*                    Multiply Q in A by left singular vectors of R in
-*                    WORK(IR), storing result in U
-*                    (Workspace: need N*N)
-*
-                     CALL SGEMM( 'N', 'N', M, N, N, ONE, A, LDA,
-     $                           WORK( IR ), LDWRKR, ZERO, U, LDU )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL SORGQR( M, N, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Zero out below R in A
-*
-                     CALL SLASET( 'L', N-1, N-1, ZERO, ZERO, A( 2, 1 ),
-     $                            LDA )
-*
-*                    Bidiagonalize R in A
-*                    (Workspace: need 4*N, prefer 3*N+2*N*NB)
-*
-                     CALL SGEBRD( N, N, A, LDA, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left vectors bidiagonalizing R
-*                    (Workspace: need 3*N+M, prefer 3*N+M*NB)
-*
-                     CALL SORMBR( 'Q', 'R', 'N', M, N, N, A, LDA,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U
-*                    (Workspace: need BDSPAC)
-*
-                     CALL SBDSQR( 'U', N, 0, M, 0, S, WORK( IE ), DUM,
-     $                            1, U, LDU, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTVO ) THEN
-*
-*                 Path 5 (M much larger than N, JOBU='S', JOBVT='O')
-*                 N left singular vectors to be computed in U and
-*                 N right singular vectors to be overwritten on A
-*
-                  IF( LWORK.GE.2*N*N+MAX( 4*N, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+2*LDA*N ) THEN
-*
-*                       WORK(IU) is LDA by N and WORK(IR) is LDA by N
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*N
-                        LDWRKR = LDA
-                     ELSE IF( LWORK.GE.WRKBL+( LDA+N )*N ) THEN
-*
-*                       WORK(IU) is LDA by N and WORK(IR) is N by N
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*N
-                        LDWRKR = N
-                     ELSE
-*
-*                       WORK(IU) is N by N and WORK(IR) is N by N
-*
-                        LDWRKU = N
-                        IR = IU + LDWRKU*N
-                        LDWRKR = N
-                     END IF
-                     ITAU = IR + LDWRKR*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R
-*                    (Workspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB)
-*
-                     CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IU), zeroing out below it
-*
-                     CALL SLACPY( 'U', N, N, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL SLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                            WORK( IU+1 ), LDWRKU )
-*
-*                    Generate Q in A
-*                    (Workspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB)
-*
-                     CALL SORGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IU), copying result to
-*                    WORK(IR)
-*                    (Workspace: need 2*N*N+4*N,
-*                                prefer 2*N*N+3*N+2*N*NB)
-*
-                     CALL SGEBRD( N, N, WORK( IU ), LDWRKU, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'U', N, N, WORK( IU ), LDWRKU,
-     $                            WORK( IR ), LDWRKR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IU)
-*                    (Workspace: need 2*N*N+4*N, prefer 2*N*N+3*N+N*NB)
-*
-                     CALL SORGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IR)
-*                    (Workspace: need 2*N*N+4*N-1,
-*                                prefer 2*N*N+3*N+(N-1)*NB)
-*
-                     CALL SORGBR( 'P', N, N, N, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IU) and computing
-*                    right singular vectors of R in WORK(IR)
-*                    (Workspace: need 2*N*N+BDSPAC)
-*
-                     CALL SBDSQR( 'U', N, N, N, 0, S, WORK( IE ),
-     $                            WORK( IR ), LDWRKR, WORK( IU ),
-     $                            LDWRKU, DUM, 1, WORK( IWORK ), INFO )
-*
-*                    Multiply Q in A by left singular vectors of R in
-*                    WORK(IU), storing result in U
-*                    (Workspace: need N*N)
-*
-                     CALL SGEMM( 'N', 'N', M, N, N, ONE, A, LDA,
-     $                           WORK( IU ), LDWRKU, ZERO, U, LDU )
-*
-*                    Copy right singular vectors of R to A
-*                    (Workspace: need N*N)
-*
-                     CALL SLACPY( 'F', N, N, WORK( IR ), LDWRKR, A,
-     $                            LDA )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL SORGQR( M, N, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Zero out below R in A
-*
-                     CALL SLASET( 'L', N-1, N-1, ZERO, ZERO, A( 2, 1 ),
-     $                            LDA )
-*
-*                    Bidiagonalize R in A
-*                    (Workspace: need 4*N, prefer 3*N+2*N*NB)
-*
-                     CALL SGEBRD( N, N, A, LDA, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left vectors bidiagonalizing R
-*                    (Workspace: need 3*N+M, prefer 3*N+M*NB)
-*
-                     CALL SORMBR( 'Q', 'R', 'N', M, N, N, A, LDA,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right vectors bidiagonalizing R in A
-*                    (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-                     CALL SORGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in A
-*                    (Workspace: need BDSPAC)
-*
-                     CALL SBDSQR( 'U', N, N, M, 0, S, WORK( IE ), A,
-     $                            LDA, U, LDU, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTVAS ) THEN
-*
-*                 Path 6 (M much larger than N, JOBU='S', JOBVT='S'
-*                         or 'A')
-*                 N left singular vectors to be computed in U and
-*                 N right singular vectors to be computed in VT
-*
-                  IF( LWORK.GE.N*N+MAX( 4*N, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+LDA*N ) THEN
-*
-*                       WORK(IU) is LDA by N
-*
-                        LDWRKU = LDA
-                     ELSE
-*
-*                       WORK(IU) is N by N
-*
-                        LDWRKU = N
-                     END IF
-                     ITAU = IU + LDWRKU*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R
-*                    (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                     CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IU), zeroing out below it
-*
-                     CALL SLACPY( 'U', N, N, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL SLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                            WORK( IU+1 ), LDWRKU )
-*
-*                    Generate Q in A
-*                    (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                     CALL SORGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IU), copying result to VT
-*                    (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB)
-*
-                     CALL SGEBRD( N, N, WORK( IU ), LDWRKU, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'U', N, N, WORK( IU ), LDWRKU, VT,
-     $                            LDVT )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IU)
-*                    (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB)
-*
-                     CALL SORGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in VT
-*                    (Workspace: need N*N+4*N-1,
-*                                prefer N*N+3*N+(N-1)*NB)
-*
-                     CALL SORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IU) and computing
-*                    right singular vectors of R in VT
-*                    (Workspace: need N*N+BDSPAC)
-*
-                     CALL SBDSQR( 'U', N, N, N, 0, S, WORK( IE ), VT,
-     $                            LDVT, WORK( IU ), LDWRKU, DUM, 1,
-     $                            WORK( IWORK ), INFO )
-*
-*                    Multiply Q in A by left singular vectors of R in
-*                    WORK(IU), storing result in U
-*                    (Workspace: need N*N)
-*
-                     CALL SGEMM( 'N', 'N', M, N, N, ONE, A, LDA,
-     $                           WORK( IU ), LDWRKU, ZERO, U, LDU )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL SORGQR( M, N, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to VT, zeroing out below it
-*
-                     CALL SLACPY( 'U', N, N, A, LDA, VT, LDVT )
-                     IF( N.GT.1 )
-     $                  CALL SLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                               VT( 2, 1 ), LDVT )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in VT
-*                    (Workspace: need 4*N, prefer 3*N+2*N*NB)
-*
-                     CALL SGEBRD( N, N, VT, LDVT, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left bidiagonalizing vectors
-*                    in VT
-*                    (Workspace: need 3*N+M, prefer 3*N+M*NB)
-*
-                     CALL SORMBR( 'Q', 'R', 'N', M, N, N, VT, LDVT,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in VT
-*                    (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-                     CALL SORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in VT
-*                    (Workspace: need BDSPAC)
-*
-                     CALL SBDSQR( 'U', N, N, M, 0, S, WORK( IE ), VT,
-     $                            LDVT, U, LDU, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               END IF
-*
-            ELSE IF( WNTUA ) THEN
-*
-               IF( WNTVN ) THEN
-*
-*                 Path 7 (M much larger than N, JOBU='A', JOBVT='N')
-*                 M left singular vectors to be computed in U and
-*                 no right singular vectors to be computed
-*
-                  IF( LWORK.GE.N*N+MAX( N+M, 4*N, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IR = 1
-                     IF( LWORK.GE.WRKBL+LDA*N ) THEN
-*
-*                       WORK(IR) is LDA by N
-*
-                        LDWRKR = LDA
-                     ELSE
-*
-*                       WORK(IR) is N by N
-*
-                        LDWRKR = N
-                     END IF
-                     ITAU = IR + LDWRKR*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                     CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Copy R to WORK(IR), zeroing out below it
-*
-                     CALL SLACPY( 'U', N, N, A, LDA, WORK( IR ),
-     $                            LDWRKR )
-                     CALL SLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                            WORK( IR+1 ), LDWRKR )
-*
-*                    Generate Q in U
-*                    (Workspace: need N*N+N+M, prefer N*N+N+M*NB)
-*
-                     CALL SORGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IR)
-*                    (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB)
-*
-                     CALL SGEBRD( N, N, WORK( IR ), LDWRKR, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IR)
-*                    (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB)
-*
-                     CALL SORGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IR)
-*                    (Workspace: need N*N+BDSPAC)
-*
-                     CALL SBDSQR( 'U', N, 0, N, 0, S, WORK( IE ), DUM,
-     $                            1, WORK( IR ), LDWRKR, DUM, 1,
-     $                            WORK( IWORK ), INFO )
-*
-*                    Multiply Q in U by left singular vectors of R in
-*                    WORK(IR), storing result in A
-*                    (Workspace: need N*N)
-*
-                     CALL SGEMM( 'N', 'N', M, N, N, ONE, U, LDU,
-     $                           WORK( IR ), LDWRKR, ZERO, A, LDA )
-*
-*                    Copy left singular vectors of A from A to U
-*
-                     CALL SLACPY( 'F', M, N, A, LDA, U, LDU )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (Workspace: need N+M, prefer N+M*NB)
-*
-                     CALL SORGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Zero out below R in A
-*
-                     CALL SLASET( 'L', N-1, N-1, ZERO, ZERO, A( 2, 1 ),
-     $                            LDA )
-*
-*                    Bidiagonalize R in A
-*                    (Workspace: need 4*N, prefer 3*N+2*N*NB)
-*
-                     CALL SGEBRD( N, N, A, LDA, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left bidiagonalizing vectors
-*                    in A
-*                    (Workspace: need 3*N+M, prefer 3*N+M*NB)
-*
-                     CALL SORMBR( 'Q', 'R', 'N', M, N, N, A, LDA,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U
-*                    (Workspace: need BDSPAC)
-*
-                     CALL SBDSQR( 'U', N, 0, M, 0, S, WORK( IE ), DUM,
-     $                            1, U, LDU, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTVO ) THEN
-*
-*                 Path 8 (M much larger than N, JOBU='A', JOBVT='O')
-*                 M left singular vectors to be computed in U and
-*                 N right singular vectors to be overwritten on A
-*
-                  IF( LWORK.GE.2*N*N+MAX( N+M, 4*N, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+2*LDA*N ) THEN
-*
-*                       WORK(IU) is LDA by N and WORK(IR) is LDA by N
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*N
-                        LDWRKR = LDA
-                     ELSE IF( LWORK.GE.WRKBL+( LDA+N )*N ) THEN
-*
-*                       WORK(IU) is LDA by N and WORK(IR) is N by N
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*N
-                        LDWRKR = N
-                     ELSE
-*
-*                       WORK(IU) is N by N and WORK(IR) is N by N
-*
-                        LDWRKU = N
-                        IR = IU + LDWRKU*N
-                        LDWRKR = N
-                     END IF
-                     ITAU = IR + LDWRKR*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB)
-*
-                     CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (Workspace: need 2*N*N+N+M, prefer 2*N*N+N+M*NB)
-*
-                     CALL SORGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IU), zeroing out below it
-*
-                     CALL SLACPY( 'U', N, N, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL SLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                            WORK( IU+1 ), LDWRKU )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IU), copying result to
-*                    WORK(IR)
-*                    (Workspace: need 2*N*N+4*N,
-*                                prefer 2*N*N+3*N+2*N*NB)
-*
-                     CALL SGEBRD( N, N, WORK( IU ), LDWRKU, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'U', N, N, WORK( IU ), LDWRKU,
-     $                            WORK( IR ), LDWRKR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IU)
-*                    (Workspace: need 2*N*N+4*N, prefer 2*N*N+3*N+N*NB)
-*
-                     CALL SORGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IR)
-*                    (Workspace: need 2*N*N+4*N-1,
-*                                prefer 2*N*N+3*N+(N-1)*NB)
-*
-                     CALL SORGBR( 'P', N, N, N, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IU) and computing
-*                    right singular vectors of R in WORK(IR)
-*                    (Workspace: need 2*N*N+BDSPAC)
-*
-                     CALL SBDSQR( 'U', N, N, N, 0, S, WORK( IE ),
-     $                            WORK( IR ), LDWRKR, WORK( IU ),
-     $                            LDWRKU, DUM, 1, WORK( IWORK ), INFO )
-*
-*                    Multiply Q in U by left singular vectors of R in
-*                    WORK(IU), storing result in A
-*                    (Workspace: need N*N)
-*
-                     CALL SGEMM( 'N', 'N', M, N, N, ONE, U, LDU,
-     $                           WORK( IU ), LDWRKU, ZERO, A, LDA )
-*
-*                    Copy left singular vectors of A from A to U
-*
-                     CALL SLACPY( 'F', M, N, A, LDA, U, LDU )
-*
-*                    Copy right singular vectors of R from WORK(IR) to A
-*
-                     CALL SLACPY( 'F', N, N, WORK( IR ), LDWRKR, A,
-     $                            LDA )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (Workspace: need N+M, prefer N+M*NB)
-*
-                     CALL SORGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Zero out below R in A
-*
-                     CALL SLASET( 'L', N-1, N-1, ZERO, ZERO, A( 2, 1 ),
-     $                            LDA )
-*
-*                    Bidiagonalize R in A
-*                    (Workspace: need 4*N, prefer 3*N+2*N*NB)
-*
-                     CALL SGEBRD( N, N, A, LDA, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left bidiagonalizing vectors
-*                    in A
-*                    (Workspace: need 3*N+M, prefer 3*N+M*NB)
-*
-                     CALL SORMBR( 'Q', 'R', 'N', M, N, N, A, LDA,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in A
-*                    (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-                     CALL SORGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in A
-*                    (Workspace: need BDSPAC)
-*
-                     CALL SBDSQR( 'U', N, N, M, 0, S, WORK( IE ), A,
-     $                            LDA, U, LDU, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTVAS ) THEN
-*
-*                 Path 9 (M much larger than N, JOBU='A', JOBVT='S'
-*                         or 'A')
-*                 M left singular vectors to be computed in U and
-*                 N right singular vectors to be computed in VT
-*
-                  IF( LWORK.GE.N*N+MAX( N+M, 4*N, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+LDA*N ) THEN
-*
-*                       WORK(IU) is LDA by N
-*
-                        LDWRKU = LDA
-                     ELSE
-*
-*                       WORK(IU) is N by N
-*
-                        LDWRKU = N
-                     END IF
-                     ITAU = IU + LDWRKU*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need N*N+2*N, prefer N*N+N+N*NB)
-*
-                     CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (Workspace: need N*N+N+M, prefer N*N+N+M*NB)
-*
-                     CALL SORGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IU), zeroing out below it
-*
-                     CALL SLACPY( 'U', N, N, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL SLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                            WORK( IU+1 ), LDWRKU )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IU), copying result to VT
-*                    (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB)
-*
-                     CALL SGEBRD( N, N, WORK( IU ), LDWRKU, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'U', N, N, WORK( IU ), LDWRKU, VT,
-     $                            LDVT )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IU)
-*                    (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB)
-*
-                     CALL SORGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in VT
-*                    (Workspace: need N*N+4*N-1,
-*                                prefer N*N+3*N+(N-1)*NB)
-*
-                     CALL SORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IU) and computing
-*                    right singular vectors of R in VT
-*                    (Workspace: need N*N+BDSPAC)
-*
-                     CALL SBDSQR( 'U', N, N, N, 0, S, WORK( IE ), VT,
-     $                            LDVT, WORK( IU ), LDWRKU, DUM, 1,
-     $                            WORK( IWORK ), INFO )
-*
-*                    Multiply Q in U by left singular vectors of R in
-*                    WORK(IU), storing result in A
-*                    (Workspace: need N*N)
-*
-                     CALL SGEMM( 'N', 'N', M, N, N, ONE, U, LDU,
-     $                           WORK( IU ), LDWRKU, ZERO, A, LDA )
-*
-*                    Copy left singular vectors of A from A to U
-*
-                     CALL SLACPY( 'F', M, N, A, LDA, U, LDU )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (Workspace: need 2*N, prefer N+N*NB)
-*
-                     CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (Workspace: need N+M, prefer N+M*NB)
-*
-                     CALL SORGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R from A to VT, zeroing out below it
-*
-                     CALL SLACPY( 'U', N, N, A, LDA, VT, LDVT )
-                     IF( N.GT.1 )
-     $                  CALL SLASET( 'L', N-1, N-1, ZERO, ZERO,
-     $                               VT( 2, 1 ), LDVT )
-                     IE = ITAU
-                     ITAUQ = IE + N
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in VT
-*                    (Workspace: need 4*N, prefer 3*N+2*N*NB)
-*
-                     CALL SGEBRD( N, N, VT, LDVT, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left bidiagonalizing vectors
-*                    in VT
-*                    (Workspace: need 3*N+M, prefer 3*N+M*NB)
-*
-                     CALL SORMBR( 'Q', 'R', 'N', M, N, N, VT, LDVT,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in VT
-*                    (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-                     CALL SORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in VT
-*                    (Workspace: need BDSPAC)
-*
-                     CALL SBDSQR( 'U', N, N, M, 0, S, WORK( IE ), VT,
-     $                            LDVT, U, LDU, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               END IF
-*
-            END IF
-*
-         ELSE
-*
-*           M .LT. MNTHR
-*
-*           Path 10 (M at least N, but not much larger)
-*           Reduce to bidiagonal form without QR decomposition
-*
-            IE = 1
-            ITAUQ = IE + N
-            ITAUP = ITAUQ + N
-            IWORK = ITAUP + N
-*
-*           Bidiagonalize A
-*           (Workspace: need 3*N+M, prefer 3*N+(M+N)*NB)
-*
-            CALL SGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
-     $                   WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                   IERR )
-            IF( WNTUAS ) THEN
-*
-*              If left singular vectors desired in U, copy result to U
-*              and generate left bidiagonalizing vectors in U
-*              (Workspace: need 3*N+NCU, prefer 3*N+NCU*NB)
-*
-               CALL SLACPY( 'L', M, N, A, LDA, U, LDU )
-               IF( WNTUS )
-     $            NCU = N
-               IF( WNTUA )
-     $            NCU = M
-               CALL SORGBR( 'Q', M, NCU, N, U, LDU, WORK( ITAUQ ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTVAS ) THEN
-*
-*              If right singular vectors desired in VT, copy result to
-*              VT and generate right bidiagonalizing vectors in VT
-*              (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-               CALL SLACPY( 'U', N, N, A, LDA, VT, LDVT )
-               CALL SORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTUO ) THEN
-*
-*              If left singular vectors desired in A, generate left
-*              bidiagonalizing vectors in A
-*              (Workspace: need 4*N, prefer 3*N+N*NB)
-*
-               CALL SORGBR( 'Q', M, N, N, A, LDA, WORK( ITAUQ ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTVO ) THEN
-*
-*              If right singular vectors desired in A, generate right
-*              bidiagonalizing vectors in A
-*              (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB)
-*
-               CALL SORGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IWORK = IE + N
-            IF( WNTUAS .OR. WNTUO )
-     $         NRU = M
-            IF( WNTUN )
-     $         NRU = 0
-            IF( WNTVAS .OR. WNTVO )
-     $         NCVT = N
-            IF( WNTVN )
-     $         NCVT = 0
-            IF( ( .NOT.WNTUO ) .AND. ( .NOT.WNTVO ) ) THEN
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in U and computing right singular
-*              vectors in VT
-*              (Workspace: need BDSPAC)
-*
-               CALL SBDSQR( 'U', N, NCVT, NRU, 0, S, WORK( IE ), VT,
-     $                      LDVT, U, LDU, DUM, 1, WORK( IWORK ), INFO )
-            ELSE IF( ( .NOT.WNTUO ) .AND. WNTVO ) THEN
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in U and computing right singular
-*              vectors in A
-*              (Workspace: need BDSPAC)
-*
-               CALL SBDSQR( 'U', N, NCVT, NRU, 0, S, WORK( IE ), A, LDA,
-     $                      U, LDU, DUM, 1, WORK( IWORK ), INFO )
-            ELSE
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in A and computing right singular
-*              vectors in VT
-*              (Workspace: need BDSPAC)
-*
-               CALL SBDSQR( 'U', N, NCVT, NRU, 0, S, WORK( IE ), VT,
-     $                      LDVT, A, LDA, DUM, 1, WORK( IWORK ), INFO )
-            END IF
-*
-         END IF
-*
-      ELSE
-*
-*        A has more columns than rows. If A has sufficiently more
-*        columns than rows, first reduce using the LQ decomposition (if
-*        sufficient workspace available)
-*
-         IF( N.GE.MNTHR ) THEN
-*
-            IF( WNTVN ) THEN
-*
-*              Path 1t(N much larger than M, JOBVT='N')
-*              No right singular vectors to be computed
-*
-               ITAU = 1
-               IWORK = ITAU + M
-*
-*              Compute A=L*Q
-*              (Workspace: need 2*M, prefer M+M*NB)
-*
-               CALL SGELQF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
-     $                      LWORK-IWORK+1, IERR )
-*
-*              Zero out above L
-*
-               CALL SLASET( 'U', M-1, M-1, ZERO, ZERO, A( 1, 2 ), LDA )
-               IE = 1
-               ITAUQ = IE + M
-               ITAUP = ITAUQ + M
-               IWORK = ITAUP + M
-*
-*              Bidiagonalize L in A
-*              (Workspace: need 4*M, prefer 3*M+2*M*NB)
-*
-               CALL SGEBRD( M, M, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
-     $                      WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                      IERR )
-               IF( WNTUO .OR. WNTUAS ) THEN
-*
-*                 If left singular vectors desired, generate Q
-*                 (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-                  CALL SORGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-               END IF
-               IWORK = IE + M
-               NRU = 0
-               IF( WNTUO .OR. WNTUAS )
-     $            NRU = M
-*
-*              Perform bidiagonal QR iteration, computing left singular
-*              vectors of A in A if desired
-*              (Workspace: need BDSPAC)
-*
-               CALL SBDSQR( 'U', M, 0, NRU, 0, S, WORK( IE ), DUM, 1, A,
-     $                      LDA, DUM, 1, WORK( IWORK ), INFO )
-*
-*              If left singular vectors desired in U, copy them there
-*
-               IF( WNTUAS )
-     $            CALL SLACPY( 'F', M, M, A, LDA, U, LDU )
-*
-            ELSE IF( WNTVO .AND. WNTUN ) THEN
-*
-*              Path 2t(N much larger than M, JOBU='N', JOBVT='O')
-*              M right singular vectors to be overwritten on A and
-*              no left singular vectors to be computed
-*
-               IF( LWORK.GE.M*M+MAX( 4*M, BDSPAC ) ) THEN
-*
-*                 Sufficient workspace for a fast algorithm
-*
-                  IR = 1
-                  IF( LWORK.GE.MAX( WRKBL, LDA*N+M )+LDA*M ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is LDA by M
-*
-                     LDWRKU = LDA
-                     CHUNK = N
-                     LDWRKR = LDA
-                  ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N+M )+M*M ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is M by M
-*
-                     LDWRKU = LDA
-                     CHUNK = N
-                     LDWRKR = M
-                  ELSE
-*
-*                    WORK(IU) is M by CHUNK and WORK(IR) is M by M
-*
-                     LDWRKU = M
-                     CHUNK = ( LWORK-M*M-M ) / M
-                     LDWRKR = M
-                  END IF
-                  ITAU = IR + LDWRKR*M
-                  IWORK = ITAU + M
-*
-*                 Compute A=L*Q
-*                 (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                  CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy L to WORK(IR) and zero out above it
-*
-                  CALL SLACPY( 'L', M, M, A, LDA, WORK( IR ), LDWRKR )
-                  CALL SLASET( 'U', M-1, M-1, ZERO, ZERO,
-     $                         WORK( IR+LDWRKR ), LDWRKR )
-*
-*                 Generate Q in A
-*                 (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                  CALL SORGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = ITAU
-                  ITAUQ = IE + M
-                  ITAUP = ITAUQ + M
-                  IWORK = ITAUP + M
-*
-*                 Bidiagonalize L in WORK(IR)
-*                 (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB)
-*
-                  CALL SGEBRD( M, M, WORK( IR ), LDWRKR, S, WORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Generate right vectors bidiagonalizing L
-*                 (Workspace: need M*M+4*M-1, prefer M*M+3*M+(M-1)*NB)
-*
-                  CALL SORGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
-     $                         WORK( ITAUP ), WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-                  IWORK = IE + M
-*
-*                 Perform bidiagonal QR iteration, computing right
-*                 singular vectors of L in WORK(IR)
-*                 (Workspace: need M*M+BDSPAC)
-*
-                  CALL SBDSQR( 'U', M, M, 0, 0, S, WORK( IE ),
-     $                         WORK( IR ), LDWRKR, DUM, 1, DUM, 1,
-     $                         WORK( IWORK ), INFO )
-                  IU = IE + M
-*
-*                 Multiply right singular vectors of L in WORK(IR) by Q
-*                 in A, storing result in WORK(IU) and copying to A
-*                 (Workspace: need M*M+2*M, prefer M*M+M*N+M)
-*
-                  DO 30 I = 1, N, CHUNK
-                     BLK = MIN( N-I+1, CHUNK )
-                     CALL SGEMM( 'N', 'N', M, BLK, M, ONE, WORK( IR ),
-     $                           LDWRKR, A( 1, I ), LDA, ZERO,
-     $                           WORK( IU ), LDWRKU )
-                     CALL SLACPY( 'F', M, BLK, WORK( IU ), LDWRKU,
-     $                            A( 1, I ), LDA )
-   30             CONTINUE
-*
-               ELSE
-*
-*                 Insufficient workspace for a fast algorithm
-*
-                  IE = 1
-                  ITAUQ = IE + M
-                  ITAUP = ITAUQ + M
-                  IWORK = ITAUP + M
-*
-*                 Bidiagonalize A
-*                 (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB)
-*
-                  CALL SGEBRD( M, N, A, LDA, S, WORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Generate right vectors bidiagonalizing A
-*                 (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-                  CALL SORGBR( 'P', M, N, M, A, LDA, WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IWORK = IE + M
-*
-*                 Perform bidiagonal QR iteration, computing right
-*                 singular vectors of A in A
-*                 (Workspace: need BDSPAC)
-*
-                  CALL SBDSQR( 'L', M, N, 0, 0, S, WORK( IE ), A, LDA,
-     $                         DUM, 1, DUM, 1, WORK( IWORK ), INFO )
-*
-               END IF
-*
-            ELSE IF( WNTVO .AND. WNTUAS ) THEN
-*
-*              Path 3t(N much larger than M, JOBU='S' or 'A', JOBVT='O')
-*              M right singular vectors to be overwritten on A and
-*              M left singular vectors to be computed in U
-*
-               IF( LWORK.GE.M*M+MAX( 4*M, BDSPAC ) ) THEN
-*
-*                 Sufficient workspace for a fast algorithm
-*
-                  IR = 1
-                  IF( LWORK.GE.MAX( WRKBL, LDA*N+M )+LDA*M ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is LDA by M
-*
-                     LDWRKU = LDA
-                     CHUNK = N
-                     LDWRKR = LDA
-                  ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N+M )+M*M ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is M by M
-*
-                     LDWRKU = LDA
-                     CHUNK = N
-                     LDWRKR = M
-                  ELSE
-*
-*                    WORK(IU) is M by CHUNK and WORK(IR) is M by M
-*
-                     LDWRKU = M
-                     CHUNK = ( LWORK-M*M-M ) / M
-                     LDWRKR = M
-                  END IF
-                  ITAU = IR + LDWRKR*M
-                  IWORK = ITAU + M
-*
-*                 Compute A=L*Q
-*                 (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                  CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy L to U, zeroing about above it
-*
-                  CALL SLACPY( 'L', M, M, A, LDA, U, LDU )
-                  CALL SLASET( 'U', M-1, M-1, ZERO, ZERO, U( 1, 2 ),
-     $                         LDU )
-*
-*                 Generate Q in A
-*                 (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                  CALL SORGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = ITAU
-                  ITAUQ = IE + M
-                  ITAUP = ITAUQ + M
-                  IWORK = ITAUP + M
-*
-*                 Bidiagonalize L in U, copying result to WORK(IR)
-*                 (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB)
-*
-                  CALL SGEBRD( M, M, U, LDU, S, WORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  CALL SLACPY( 'U', M, M, U, LDU, WORK( IR ), LDWRKR )
-*
-*                 Generate right vectors bidiagonalizing L in WORK(IR)
-*                 (Workspace: need M*M+4*M-1, prefer M*M+3*M+(M-1)*NB)
-*
-                  CALL SORGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
-     $                         WORK( ITAUP ), WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-*
-*                 Generate left vectors bidiagonalizing L in U
-*                 (Workspace: need M*M+4*M, prefer M*M+3*M+M*NB)
-*
-                  CALL SORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IWORK = IE + M
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of L in U, and computing right
-*                 singular vectors of L in WORK(IR)
-*                 (Workspace: need M*M+BDSPAC)
-*
-                  CALL SBDSQR( 'U', M, M, M, 0, S, WORK( IE ),
-     $                         WORK( IR ), LDWRKR, U, LDU, DUM, 1,
-     $                         WORK( IWORK ), INFO )
-                  IU = IE + M
-*
-*                 Multiply right singular vectors of L in WORK(IR) by Q
-*                 in A, storing result in WORK(IU) and copying to A
-*                 (Workspace: need M*M+2*M, prefer M*M+M*N+M))
-*
-                  DO 40 I = 1, N, CHUNK
-                     BLK = MIN( N-I+1, CHUNK )
-                     CALL SGEMM( 'N', 'N', M, BLK, M, ONE, WORK( IR ),
-     $                           LDWRKR, A( 1, I ), LDA, ZERO,
-     $                           WORK( IU ), LDWRKU )
-                     CALL SLACPY( 'F', M, BLK, WORK( IU ), LDWRKU,
-     $                            A( 1, I ), LDA )
-   40             CONTINUE
-*
-               ELSE
-*
-*                 Insufficient workspace for a fast algorithm
-*
-                  ITAU = 1
-                  IWORK = ITAU + M
-*
-*                 Compute A=L*Q
-*                 (Workspace: need 2*M, prefer M+M*NB)
-*
-                  CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy L to U, zeroing out above it
-*
-                  CALL SLACPY( 'L', M, M, A, LDA, U, LDU )
-                  CALL SLASET( 'U', M-1, M-1, ZERO, ZERO, U( 1, 2 ),
-     $                         LDU )
-*
-*                 Generate Q in A
-*                 (Workspace: need 2*M, prefer M+M*NB)
-*
-                  CALL SORGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = ITAU
-                  ITAUQ = IE + M
-                  ITAUP = ITAUQ + M
-                  IWORK = ITAUP + M
-*
-*                 Bidiagonalize L in U
-*                 (Workspace: need 4*M, prefer 3*M+2*M*NB)
-*
-                  CALL SGEBRD( M, M, U, LDU, S, WORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Multiply right vectors bidiagonalizing L by Q in A
-*                 (Workspace: need 3*M+N, prefer 3*M+N*NB)
-*
-                  CALL SORMBR( 'P', 'L', 'T', M, N, M, U, LDU,
-     $                         WORK( ITAUP ), A, LDA, WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-*
-*                 Generate left vectors bidiagonalizing L in U
-*                 (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-                  CALL SORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IWORK = IE + M
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of A in U and computing right
-*                 singular vectors of A in A
-*                 (Workspace: need BDSPAC)
-*
-                  CALL SBDSQR( 'U', M, N, M, 0, S, WORK( IE ), A, LDA,
-     $                         U, LDU, DUM, 1, WORK( IWORK ), INFO )
-*
-               END IF
-*
-            ELSE IF( WNTVS ) THEN
-*
-               IF( WNTUN ) THEN
-*
-*                 Path 4t(N much larger than M, JOBU='N', JOBVT='S')
-*                 M right singular vectors to be computed in VT and
-*                 no left singular vectors to be computed
-*
-                  IF( LWORK.GE.M*M+MAX( 4*M, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IR = 1
-                     IF( LWORK.GE.WRKBL+LDA*M ) THEN
-*
-*                       WORK(IR) is LDA by M
-*
-                        LDWRKR = LDA
-                     ELSE
-*
-*                       WORK(IR) is M by M
-*
-                        LDWRKR = M
-                     END IF
-                     ITAU = IR + LDWRKR*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q
-*                    (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                     CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IR), zeroing out above it
-*
-                     CALL SLACPY( 'L', M, M, A, LDA, WORK( IR ),
-     $                            LDWRKR )
-                     CALL SLASET( 'U', M-1, M-1, ZERO, ZERO,
-     $                            WORK( IR+LDWRKR ), LDWRKR )
-*
-*                    Generate Q in A
-*                    (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                     CALL SORGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IR)
-*                    (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB)
-*
-                     CALL SGEBRD( M, M, WORK( IR ), LDWRKR, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right vectors bidiagonalizing L in
-*                    WORK(IR)
-*                    (Workspace: need M*M+4*M, prefer M*M+3*M+(M-1)*NB)
-*
-                     CALL SORGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing right
-*                    singular vectors of L in WORK(IR)
-*                    (Workspace: need M*M+BDSPAC)
-*
-                     CALL SBDSQR( 'U', M, M, 0, 0, S, WORK( IE ),
-     $                            WORK( IR ), LDWRKR, DUM, 1, DUM, 1,
-     $                            WORK( IWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IR) by
-*                    Q in A, storing result in VT
-*                    (Workspace: need M*M)
-*
-                     CALL SGEMM( 'N', 'N', M, N, M, ONE, WORK( IR ),
-     $                           LDWRKR, A, LDA, ZERO, VT, LDVT )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy result to VT
-*
-                     CALL SLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL SORGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Zero out above L in A
-*
-                     CALL SLASET( 'U', M-1, M-1, ZERO, ZERO, A( 1, 2 ),
-     $                            LDA )
-*
-*                    Bidiagonalize L in A
-*                    (Workspace: need 4*M, prefer 3*M+2*M*NB)
-*
-                     CALL SGEBRD( M, M, A, LDA, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right vectors bidiagonalizing L by Q in VT
-*                    (Workspace: need 3*M+N, prefer 3*M+N*NB)
-*
-                     CALL SORMBR( 'P', 'L', 'T', M, N, M, A, LDA,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing right
-*                    singular vectors of A in VT
-*                    (Workspace: need BDSPAC)
-*
-                     CALL SBDSQR( 'U', M, N, 0, 0, S, WORK( IE ), VT,
-     $                            LDVT, DUM, 1, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTUO ) THEN
-*
-*                 Path 5t(N much larger than M, JOBU='O', JOBVT='S')
-*                 M right singular vectors to be computed in VT and
-*                 M left singular vectors to be overwritten on A
-*
-                  IF( LWORK.GE.2*M*M+MAX( 4*M, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+2*LDA*M ) THEN
-*
-*                       WORK(IU) is LDA by M and WORK(IR) is LDA by M
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*M
-                        LDWRKR = LDA
-                     ELSE IF( LWORK.GE.WRKBL+( LDA+M )*M ) THEN
-*
-*                       WORK(IU) is LDA by M and WORK(IR) is M by M
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*M
-                        LDWRKR = M
-                     ELSE
-*
-*                       WORK(IU) is M by M and WORK(IR) is M by M
-*
-                        LDWRKU = M
-                        IR = IU + LDWRKU*M
-                        LDWRKR = M
-                     END IF
-                     ITAU = IR + LDWRKR*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q
-*                    (Workspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB)
-*
-                     CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IU), zeroing out below it
-*
-                     CALL SLACPY( 'L', M, M, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL SLASET( 'U', M-1, M-1, ZERO, ZERO,
-     $                            WORK( IU+LDWRKU ), LDWRKU )
-*
-*                    Generate Q in A
-*                    (Workspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB)
-*
-                     CALL SORGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IU), copying result to
-*                    WORK(IR)
-*                    (Workspace: need 2*M*M+4*M,
-*                                prefer 2*M*M+3*M+2*M*NB)
-*
-                     CALL SGEBRD( M, M, WORK( IU ), LDWRKU, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'L', M, M, WORK( IU ), LDWRKU,
-     $                            WORK( IR ), LDWRKR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IU)
-*                    (Workspace: need 2*M*M+4*M-1,
-*                                prefer 2*M*M+3*M+(M-1)*NB)
-*
-                     CALL SORGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IR)
-*                    (Workspace: need 2*M*M+4*M, prefer 2*M*M+3*M+M*NB)
-*
-                     CALL SORGBR( 'Q', M, M, M, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of L in WORK(IR) and computing
-*                    right singular vectors of L in WORK(IU)
-*                    (Workspace: need 2*M*M+BDSPAC)
-*
-                     CALL SBDSQR( 'U', M, M, M, 0, S, WORK( IE ),
-     $                            WORK( IU ), LDWRKU, WORK( IR ),
-     $                            LDWRKR, DUM, 1, WORK( IWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IU) by
-*                    Q in A, storing result in VT
-*                    (Workspace: need M*M)
-*
-                     CALL SGEMM( 'N', 'N', M, N, M, ONE, WORK( IU ),
-     $                           LDWRKU, A, LDA, ZERO, VT, LDVT )
-*
-*                    Copy left singular vectors of L to A
-*                    (Workspace: need M*M)
-*
-                     CALL SLACPY( 'F', M, M, WORK( IR ), LDWRKR, A,
-     $                            LDA )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL SORGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Zero out above L in A
-*
-                     CALL SLASET( 'U', M-1, M-1, ZERO, ZERO, A( 1, 2 ),
-     $                            LDA )
-*
-*                    Bidiagonalize L in A
-*                    (Workspace: need 4*M, prefer 3*M+2*M*NB)
-*
-                     CALL SGEBRD( M, M, A, LDA, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right vectors bidiagonalizing L by Q in VT
-*                    (Workspace: need 3*M+N, prefer 3*M+N*NB)
-*
-                     CALL SORMBR( 'P', 'L', 'T', M, N, M, A, LDA,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors of L in A
-*                    (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-                     CALL SORGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, compute left
-*                    singular vectors of A in A and compute right
-*                    singular vectors of A in VT
-*                    (Workspace: need BDSPAC)
-*
-                     CALL SBDSQR( 'U', M, N, M, 0, S, WORK( IE ), VT,
-     $                            LDVT, A, LDA, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTUAS ) THEN
-*
-*                 Path 6t(N much larger than M, JOBU='S' or 'A',
-*                         JOBVT='S')
-*                 M right singular vectors to be computed in VT and
-*                 M left singular vectors to be computed in U
-*
-                  IF( LWORK.GE.M*M+MAX( 4*M, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+LDA*M ) THEN
-*
-*                       WORK(IU) is LDA by N
-*
-                        LDWRKU = LDA
-                     ELSE
-*
-*                       WORK(IU) is LDA by M
-*
-                        LDWRKU = M
-                     END IF
-                     ITAU = IU + LDWRKU*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q
-*                    (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                     CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IU), zeroing out above it
-*
-                     CALL SLACPY( 'L', M, M, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL SLASET( 'U', M-1, M-1, ZERO, ZERO,
-     $                            WORK( IU+LDWRKU ), LDWRKU )
-*
-*                    Generate Q in A
-*                    (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                     CALL SORGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IU), copying result to U
-*                    (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB)
-*
-                     CALL SGEBRD( M, M, WORK( IU ), LDWRKU, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'L', M, M, WORK( IU ), LDWRKU, U,
-     $                            LDU )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IU)
-*                    (Workspace: need M*M+4*M-1,
-*                                prefer M*M+3*M+(M-1)*NB)
-*
-                     CALL SORGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in U
-*                    (Workspace: need M*M+4*M, prefer M*M+3*M+M*NB)
-*
-                     CALL SORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of L in U and computing right
-*                    singular vectors of L in WORK(IU)
-*                    (Workspace: need M*M+BDSPAC)
-*
-                     CALL SBDSQR( 'U', M, M, M, 0, S, WORK( IE ),
-     $                            WORK( IU ), LDWRKU, U, LDU, DUM, 1,
-     $                            WORK( IWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IU) by
-*                    Q in A, storing result in VT
-*                    (Workspace: need M*M)
-*
-                     CALL SGEMM( 'N', 'N', M, N, M, ONE, WORK( IU ),
-     $                           LDWRKU, A, LDA, ZERO, VT, LDVT )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL SORGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to U, zeroing out above it
-*
-                     CALL SLACPY( 'L', M, M, A, LDA, U, LDU )
-                     CALL SLASET( 'U', M-1, M-1, ZERO, ZERO, U( 1, 2 ),
-     $                            LDU )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in U
-*                    (Workspace: need 4*M, prefer 3*M+2*M*NB)
-*
-                     CALL SGEBRD( M, M, U, LDU, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right bidiagonalizing vectors in U by Q
-*                    in VT
-*                    (Workspace: need 3*M+N, prefer 3*M+N*NB)
-*
-                     CALL SORMBR( 'P', 'L', 'T', M, N, M, U, LDU,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in U
-*                    (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-                     CALL SORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in VT
-*                    (Workspace: need BDSPAC)
-*
-                     CALL SBDSQR( 'U', M, N, M, 0, S, WORK( IE ), VT,
-     $                            LDVT, U, LDU, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               END IF
-*
-            ELSE IF( WNTVA ) THEN
-*
-               IF( WNTUN ) THEN
-*
-*                 Path 7t(N much larger than M, JOBU='N', JOBVT='A')
-*                 N right singular vectors to be computed in VT and
-*                 no left singular vectors to be computed
-*
-                  IF( LWORK.GE.M*M+MAX( N+M, 4*M, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IR = 1
-                     IF( LWORK.GE.WRKBL+LDA*M ) THEN
-*
-*                       WORK(IR) is LDA by M
-*
-                        LDWRKR = LDA
-                     ELSE
-*
-*                       WORK(IR) is M by M
-*
-                        LDWRKR = M
-                     END IF
-                     ITAU = IR + LDWRKR*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                     CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Copy L to WORK(IR), zeroing out above it
-*
-                     CALL SLACPY( 'L', M, M, A, LDA, WORK( IR ),
-     $                            LDWRKR )
-                     CALL SLASET( 'U', M-1, M-1, ZERO, ZERO,
-     $                            WORK( IR+LDWRKR ), LDWRKR )
-*
-*                    Generate Q in VT
-*                    (Workspace: need M*M+M+N, prefer M*M+M+N*NB)
-*
-                     CALL SORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IR)
-*                    (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB)
-*
-                     CALL SGEBRD( M, M, WORK( IR ), LDWRKR, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IR)
-*                    (Workspace: need M*M+4*M-1,
-*                                prefer M*M+3*M+(M-1)*NB)
-*
-                     CALL SORGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing right
-*                    singular vectors of L in WORK(IR)
-*                    (Workspace: need M*M+BDSPAC)
-*
-                     CALL SBDSQR( 'U', M, M, 0, 0, S, WORK( IE ),
-     $                            WORK( IR ), LDWRKR, DUM, 1, DUM, 1,
-     $                            WORK( IWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IR) by
-*                    Q in VT, storing result in A
-*                    (Workspace: need M*M)
-*
-                     CALL SGEMM( 'N', 'N', M, N, M, ONE, WORK( IR ),
-     $                           LDWRKR, VT, LDVT, ZERO, A, LDA )
-*
-*                    Copy right singular vectors of A from A to VT
-*
-                     CALL SLACPY( 'F', M, N, A, LDA, VT, LDVT )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (Workspace: need M+N, prefer M+N*NB)
-*
-                     CALL SORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Zero out above L in A
-*
-                     CALL SLASET( 'U', M-1, M-1, ZERO, ZERO, A( 1, 2 ),
-     $                            LDA )
-*
-*                    Bidiagonalize L in A
-*                    (Workspace: need 4*M, prefer 3*M+2*M*NB)
-*
-                     CALL SGEBRD( M, M, A, LDA, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right bidiagonalizing vectors in A by Q
-*                    in VT
-*                    (Workspace: need 3*M+N, prefer 3*M+N*NB)
-*
-                     CALL SORMBR( 'P', 'L', 'T', M, N, M, A, LDA,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing right
-*                    singular vectors of A in VT
-*                    (Workspace: need BDSPAC)
-*
-                     CALL SBDSQR( 'U', M, N, 0, 0, S, WORK( IE ), VT,
-     $                            LDVT, DUM, 1, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTUO ) THEN
-*
-*                 Path 8t(N much larger than M, JOBU='O', JOBVT='A')
-*                 N right singular vectors to be computed in VT and
-*                 M left singular vectors to be overwritten on A
-*
-                  IF( LWORK.GE.2*M*M+MAX( N+M, 4*M, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+2*LDA*M ) THEN
-*
-*                       WORK(IU) is LDA by M and WORK(IR) is LDA by M
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*M
-                        LDWRKR = LDA
-                     ELSE IF( LWORK.GE.WRKBL+( LDA+M )*M ) THEN
-*
-*                       WORK(IU) is LDA by M and WORK(IR) is M by M
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*M
-                        LDWRKR = M
-                     ELSE
-*
-*                       WORK(IU) is M by M and WORK(IR) is M by M
-*
-                        LDWRKU = M
-                        IR = IU + LDWRKU*M
-                        LDWRKR = M
-                     END IF
-                     ITAU = IR + LDWRKR*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (Workspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB)
-*
-                     CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (Workspace: need 2*M*M+M+N, prefer 2*M*M+M+N*NB)
-*
-                     CALL SORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IU), zeroing out above it
-*
-                     CALL SLACPY( 'L', M, M, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL SLASET( 'U', M-1, M-1, ZERO, ZERO,
-     $                            WORK( IU+LDWRKU ), LDWRKU )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IU), copying result to
-*                    WORK(IR)
-*                    (Workspace: need 2*M*M+4*M,
-*                                prefer 2*M*M+3*M+2*M*NB)
-*
-                     CALL SGEBRD( M, M, WORK( IU ), LDWRKU, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'L', M, M, WORK( IU ), LDWRKU,
-     $                            WORK( IR ), LDWRKR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IU)
-*                    (Workspace: need 2*M*M+4*M-1,
-*                                prefer 2*M*M+3*M+(M-1)*NB)
-*
-                     CALL SORGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IR)
-*                    (Workspace: need 2*M*M+4*M, prefer 2*M*M+3*M+M*NB)
-*
-                     CALL SORGBR( 'Q', M, M, M, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of L in WORK(IR) and computing
-*                    right singular vectors of L in WORK(IU)
-*                    (Workspace: need 2*M*M+BDSPAC)
-*
-                     CALL SBDSQR( 'U', M, M, M, 0, S, WORK( IE ),
-     $                            WORK( IU ), LDWRKU, WORK( IR ),
-     $                            LDWRKR, DUM, 1, WORK( IWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IU) by
-*                    Q in VT, storing result in A
-*                    (Workspace: need M*M)
-*
-                     CALL SGEMM( 'N', 'N', M, N, M, ONE, WORK( IU ),
-     $                           LDWRKU, VT, LDVT, ZERO, A, LDA )
-*
-*                    Copy right singular vectors of A from A to VT
-*
-                     CALL SLACPY( 'F', M, N, A, LDA, VT, LDVT )
-*
-*                    Copy left singular vectors of A from WORK(IR) to A
-*
-                     CALL SLACPY( 'F', M, M, WORK( IR ), LDWRKR, A,
-     $                            LDA )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (Workspace: need M+N, prefer M+N*NB)
-*
-                     CALL SORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Zero out above L in A
-*
-                     CALL SLASET( 'U', M-1, M-1, ZERO, ZERO, A( 1, 2 ),
-     $                            LDA )
-*
-*                    Bidiagonalize L in A
-*                    (Workspace: need 4*M, prefer 3*M+2*M*NB)
-*
-                     CALL SGEBRD( M, M, A, LDA, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right bidiagonalizing vectors in A by Q
-*                    in VT
-*                    (Workspace: need 3*M+N, prefer 3*M+N*NB)
-*
-                     CALL SORMBR( 'P', 'L', 'T', M, N, M, A, LDA,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in A
-*                    (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-                     CALL SORGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in A and computing right
-*                    singular vectors of A in VT
-*                    (Workspace: need BDSPAC)
-*
-                     CALL SBDSQR( 'U', M, N, M, 0, S, WORK( IE ), VT,
-     $                            LDVT, A, LDA, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTUAS ) THEN
-*
-*                 Path 9t(N much larger than M, JOBU='S' or 'A',
-*                         JOBVT='A')
-*                 N right singular vectors to be computed in VT and
-*                 M left singular vectors to be computed in U
-*
-                  IF( LWORK.GE.M*M+MAX( N+M, 4*M, BDSPAC ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+LDA*M ) THEN
-*
-*                       WORK(IU) is LDA by M
-*
-                        LDWRKU = LDA
-                     ELSE
-*
-*                       WORK(IU) is M by M
-*
-                        LDWRKU = M
-                     END IF
-                     ITAU = IU + LDWRKU*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (Workspace: need M*M+2*M, prefer M*M+M+M*NB)
-*
-                     CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (Workspace: need M*M+M+N, prefer M*M+M+N*NB)
-*
-                     CALL SORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IU), zeroing out above it
-*
-                     CALL SLACPY( 'L', M, M, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL SLASET( 'U', M-1, M-1, ZERO, ZERO,
-     $                            WORK( IU+LDWRKU ), LDWRKU )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IU), copying result to U
-*                    (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB)
-*
-                     CALL SGEBRD( M, M, WORK( IU ), LDWRKU, S,
-     $                            WORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'L', M, M, WORK( IU ), LDWRKU, U,
-     $                            LDU )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IU)
-*                    (Workspace: need M*M+4*M, prefer M*M+3*M+(M-1)*NB)
-*
-                     CALL SORGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in U
-*                    (Workspace: need M*M+4*M, prefer M*M+3*M+M*NB)
-*
-                     CALL SORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of L in U and computing right
-*                    singular vectors of L in WORK(IU)
-*                    (Workspace: need M*M+BDSPAC)
-*
-                     CALL SBDSQR( 'U', M, M, M, 0, S, WORK( IE ),
-     $                            WORK( IU ), LDWRKU, U, LDU, DUM, 1,
-     $                            WORK( IWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IU) by
-*                    Q in VT, storing result in A
-*                    (Workspace: need M*M)
-*
-                     CALL SGEMM( 'N', 'N', M, N, M, ONE, WORK( IU ),
-     $                           LDWRKU, VT, LDVT, ZERO, A, LDA )
-*
-*                    Copy right singular vectors of A from A to VT
-*
-                     CALL SLACPY( 'F', M, N, A, LDA, VT, LDVT )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (Workspace: need 2*M, prefer M+M*NB)
-*
-                     CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL SLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (Workspace: need M+N, prefer M+N*NB)
-*
-                     CALL SORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to U, zeroing out above it
-*
-                     CALL SLACPY( 'L', M, M, A, LDA, U, LDU )
-                     CALL SLASET( 'U', M-1, M-1, ZERO, ZERO, U( 1, 2 ),
-     $                            LDU )
-                     IE = ITAU
-                     ITAUQ = IE + M
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in U
-*                    (Workspace: need 4*M, prefer 3*M+2*M*NB)
-*
-                     CALL SGEBRD( M, M, U, LDU, S, WORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right bidiagonalizing vectors in U by Q
-*                    in VT
-*                    (Workspace: need 3*M+N, prefer 3*M+N*NB)
-*
-                     CALL SORMBR( 'P', 'L', 'T', M, N, M, U, LDU,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in U
-*                    (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-                     CALL SORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in VT
-*                    (Workspace: need BDSPAC)
-*
-                     CALL SBDSQR( 'U', M, N, M, 0, S, WORK( IE ), VT,
-     $                            LDVT, U, LDU, DUM, 1, WORK( IWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               END IF
-*
-            END IF
-*
-         ELSE
-*
-*           N .LT. MNTHR
-*
-*           Path 10t(N greater than M, but not much larger)
-*           Reduce to bidiagonal form without LQ decomposition
-*
-            IE = 1
-            ITAUQ = IE + M
-            ITAUP = ITAUQ + M
-            IWORK = ITAUP + M
-*
-*           Bidiagonalize A
-*           (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB)
-*
-            CALL SGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
-     $                   WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                   IERR )
-            IF( WNTUAS ) THEN
-*
-*              If left singular vectors desired in U, copy result to U
-*              and generate left bidiagonalizing vectors in U
-*              (Workspace: need 4*M-1, prefer 3*M+(M-1)*NB)
-*
-               CALL SLACPY( 'L', M, M, A, LDA, U, LDU )
-               CALL SORGBR( 'Q', M, M, N, U, LDU, WORK( ITAUQ ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTVAS ) THEN
-*
-*              If right singular vectors desired in VT, copy result to
-*              VT and generate right bidiagonalizing vectors in VT
-*              (Workspace: need 3*M+NRVT, prefer 3*M+NRVT*NB)
-*
-               CALL SLACPY( 'U', M, N, A, LDA, VT, LDVT )
-               IF( WNTVA )
-     $            NRVT = N
-               IF( WNTVS )
-     $            NRVT = M
-               CALL SORGBR( 'P', NRVT, N, M, VT, LDVT, WORK( ITAUP ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTUO ) THEN
-*
-*              If left singular vectors desired in A, generate left
-*              bidiagonalizing vectors in A
-*              (Workspace: need 4*M-1, prefer 3*M+(M-1)*NB)
-*
-               CALL SORGBR( 'Q', M, M, N, A, LDA, WORK( ITAUQ ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTVO ) THEN
-*
-*              If right singular vectors desired in A, generate right
-*              bidiagonalizing vectors in A
-*              (Workspace: need 4*M, prefer 3*M+M*NB)
-*
-               CALL SORGBR( 'P', M, N, M, A, LDA, WORK( ITAUP ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IWORK = IE + M
-            IF( WNTUAS .OR. WNTUO )
-     $         NRU = M
-            IF( WNTUN )
-     $         NRU = 0
-            IF( WNTVAS .OR. WNTVO )
-     $         NCVT = N
-            IF( WNTVN )
-     $         NCVT = 0
-            IF( ( .NOT.WNTUO ) .AND. ( .NOT.WNTVO ) ) THEN
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in U and computing right singular
-*              vectors in VT
-*              (Workspace: need BDSPAC)
-*
-               CALL SBDSQR( 'L', M, NCVT, NRU, 0, S, WORK( IE ), VT,
-     $                      LDVT, U, LDU, DUM, 1, WORK( IWORK ), INFO )
-            ELSE IF( ( .NOT.WNTUO ) .AND. WNTVO ) THEN
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in U and computing right singular
-*              vectors in A
-*              (Workspace: need BDSPAC)
-*
-               CALL SBDSQR( 'L', M, NCVT, NRU, 0, S, WORK( IE ), A, LDA,
-     $                      U, LDU, DUM, 1, WORK( IWORK ), INFO )
-            ELSE
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in A and computing right singular
-*              vectors in VT
-*              (Workspace: need BDSPAC)
-*
-               CALL SBDSQR( 'L', M, NCVT, NRU, 0, S, WORK( IE ), VT,
-     $                      LDVT, A, LDA, DUM, 1, WORK( IWORK ), INFO )
-            END IF
-*
-         END IF
-*
-      END IF
-*
-*     If SBDSQR failed to converge, copy unconverged superdiagonals
-*     to WORK( 2:MINMN )
-*
-      IF( INFO.NE.0 ) THEN
-         IF( IE.GT.2 ) THEN
-            DO 50 I = 1, MINMN - 1
-               WORK( I+1 ) = WORK( I+IE-1 )
-   50       CONTINUE
-         END IF
-         IF( IE.LT.2 ) THEN
-            DO 60 I = MINMN - 1, 1, -1
-               WORK( I+1 ) = WORK( I+IE-1 )
-   60       CONTINUE
-         END IF
-      END IF
-*
-*     Undo scaling if necessary
-*
-      IF( ISCL.EQ.1 ) THEN
-         IF( ANRM.GT.BIGNUM )
-     $      CALL SLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
-     $                   IERR )
-         IF( INFO.NE.0 .AND. ANRM.GT.BIGNUM )
-     $      CALL SLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN-1, 1, WORK( 2 ),
-     $                   MINMN, IERR )
-         IF( ANRM.LT.SMLNUM )
-     $      CALL SLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
-     $                   IERR )
-         IF( INFO.NE.0 .AND. ANRM.LT.SMLNUM )
-     $      CALL SLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN-1, 1, WORK( 2 ),
-     $                   MINMN, IERR )
-      END IF
-*
-*     Return optimal workspace in WORK(1)
-*
-      WORK( 1 ) = MAXWRK
-*
-      RETURN
-*
-*     End of SGESVD
-*
-      END
--- a/libcruft/lapack/sgetf2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-      SUBROUTINE SGETF2( M, N, A, LDA, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      REAL               A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGETF2 computes an LU factorization of a general m-by-n matrix A
-*  using partial pivoting with row interchanges.
-*
-*  The factorization has the form
-*     A = P * L * U
-*  where P is a permutation matrix, L is lower triangular with unit
-*  diagonal elements (lower trapezoidal if m > n), and U is upper
-*  triangular (upper trapezoidal if m < n).
-*
-*  This is the right-looking Level 2 BLAS version of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the m by n matrix to be factored.
-*          On exit, the factors L and U from the factorization
-*          A = P*L*U; the unit diagonal elements of L are not stored.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  IPIV    (output) INTEGER array, dimension (min(M,N))
-*          The pivot indices; for 1 <= i <= min(M,N), row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*          > 0: if INFO = k, U(k,k) is exactly zero. The factorization
-*               has been completed, but the factor U is exactly
-*               singular, and division by zero will occur if it is used
-*               to solve a system of equations.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      REAL               SFMIN
-      INTEGER            I, J, JP
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      INTEGER            ISAMAX
-      EXTERNAL           SLAMCH, ISAMAX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGER, SSCAL, SSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGETF2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Compute machine safe minimum 
-* 
-      SFMIN = SLAMCH('S')
-*
-      DO 10 J = 1, MIN( M, N )
-*
-*        Find pivot and test for singularity.
-*
-         JP = J - 1 + ISAMAX( M-J+1, A( J, J ), 1 )
-         IPIV( J ) = JP
-         IF( A( JP, J ).NE.ZERO ) THEN
-*
-*           Apply the interchange to columns 1:N.
-*
-            IF( JP.NE.J )
-     $         CALL SSWAP( N, A( J, 1 ), LDA, A( JP, 1 ), LDA )
-*
-*           Compute elements J+1:M of J-th column.
-*
-            IF( J.LT.M ) THEN 
-               IF( ABS(A( J, J )) .GE. SFMIN ) THEN 
-                  CALL SSCAL( M-J, ONE / A( J, J ), A( J+1, J ), 1 ) 
-               ELSE 
-                 DO 20 I = 1, M-J 
-                    A( J+I, J ) = A( J+I, J ) / A( J, J ) 
-   20            CONTINUE 
-               END IF 
-            END IF 
-*
-         ELSE IF( INFO.EQ.0 ) THEN
-*
-            INFO = J
-         END IF
-*
-         IF( J.LT.MIN( M, N ) ) THEN
-*
-*           Update trailing submatrix.
-*
-            CALL SGER( M-J, N-J, -ONE, A( J+1, J ), 1, A( J, J+1 ), LDA,
-     $                 A( J+1, J+1 ), LDA )
-         END IF
-   10 CONTINUE
-      RETURN
-*
-*     End of SGETF2
-*
-      END
--- a/libcruft/lapack/sgetrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,159 +0,0 @@
-      SUBROUTINE SGETRF( M, N, A, LDA, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      REAL               A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGETRF computes an LU factorization of a general M-by-N matrix A
-*  using partial pivoting with row interchanges.
-*
-*  The factorization has the form
-*     A = P * L * U
-*  where P is a permutation matrix, L is lower triangular with unit
-*  diagonal elements (lower trapezoidal if m > n), and U is upper
-*  triangular (upper trapezoidal if m < n).
-*
-*  This is the right-looking Level 3 BLAS version of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the M-by-N matrix to be factored.
-*          On exit, the factors L and U from the factorization
-*          A = P*L*U; the unit diagonal elements of L are not stored.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  IPIV    (output) INTEGER array, dimension (min(M,N))
-*          The pivot indices; for 1 <= i <= min(M,N), row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, U(i,i) is exactly zero. The factorization
-*                has been completed, but the factor U is exactly
-*                singular, and division by zero will occur if it is used
-*                to solve a system of equations.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, IINFO, J, JB, NB
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEMM, SGETF2, SLASWP, STRSM, XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGETRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'SGETRF', ' ', M, N, -1, -1 )
-      IF( NB.LE.1 .OR. NB.GE.MIN( M, N ) ) THEN
-*
-*        Use unblocked code.
-*
-         CALL SGETF2( M, N, A, LDA, IPIV, INFO )
-      ELSE
-*
-*        Use blocked code.
-*
-         DO 20 J = 1, MIN( M, N ), NB
-            JB = MIN( MIN( M, N )-J+1, NB )
-*
-*           Factor diagonal and subdiagonal blocks and test for exact
-*           singularity.
-*
-            CALL SGETF2( M-J+1, JB, A( J, J ), LDA, IPIV( J ), IINFO )
-*
-*           Adjust INFO and the pivot indices.
-*
-            IF( INFO.EQ.0 .AND. IINFO.GT.0 )
-     $         INFO = IINFO + J - 1
-            DO 10 I = J, MIN( M, J+JB-1 )
-               IPIV( I ) = J - 1 + IPIV( I )
-   10       CONTINUE
-*
-*           Apply interchanges to columns 1:J-1.
-*
-            CALL SLASWP( J-1, A, LDA, J, J+JB-1, IPIV, 1 )
-*
-            IF( J+JB.LE.N ) THEN
-*
-*              Apply interchanges to columns J+JB:N.
-*
-               CALL SLASWP( N-J-JB+1, A( 1, J+JB ), LDA, J, J+JB-1,
-     $                      IPIV, 1 )
-*
-*              Compute block row of U.
-*
-               CALL STRSM( 'Left', 'Lower', 'No transpose', 'Unit', JB,
-     $                     N-J-JB+1, ONE, A( J, J ), LDA, A( J, J+JB ),
-     $                     LDA )
-               IF( J+JB.LE.M ) THEN
-*
-*                 Update trailing submatrix.
-*
-                  CALL SGEMM( 'No transpose', 'No transpose', M-J-JB+1,
-     $                        N-J-JB+1, JB, -ONE, A( J+JB, J ), LDA,
-     $                        A( J, J+JB ), LDA, ONE, A( J+JB, J+JB ),
-     $                        LDA )
-               END IF
-            END IF
-   20    CONTINUE
-      END IF
-      RETURN
-*
-*     End of SGETRF
-*
-      END
--- a/libcruft/lapack/sgetri.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,192 +0,0 @@
-      SUBROUTINE SGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      REAL               A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGETRI computes the inverse of a matrix using the LU factorization
-*  computed by SGETRF.
-*
-*  This method inverts U and then computes inv(A) by solving the system
-*  inv(A)*L = inv(U) for inv(A).
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the factors L and U from the factorization
-*          A = P*L*U as computed by SGETRF.
-*          On exit, if INFO = 0, the inverse of the original matrix A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices from SGETRF; for 1<=i<=N, row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO=0, then WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,N).
-*          For optimal performance LWORK >= N*NB, where NB is
-*          the optimal blocksize returned by ILAENV.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, U(i,i) is exactly zero; the matrix is
-*                singular and its inverse could not be computed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IWS, J, JB, JJ, JP, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEMM, SGEMV, SSWAP, STRSM, STRTRI, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      NB = ILAENV( 1, 'SGETRI', ' ', N, -1, -1, -1 )
-      LWKOPT = N*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -3
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGETRI', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Form inv(U).  If INFO > 0 from STRTRI, then U is singular,
-*     and the inverse is not computed.
-*
-      CALL STRTRI( 'Upper', 'Non-unit', N, A, LDA, INFO )
-      IF( INFO.GT.0 )
-     $   RETURN
-*
-      NBMIN = 2
-      LDWORK = N
-      IF( NB.GT.1 .AND. NB.LT.N ) THEN
-         IWS = MAX( LDWORK*NB, 1 )
-         IF( LWORK.LT.IWS ) THEN
-            NB = LWORK / LDWORK
-            NBMIN = MAX( 2, ILAENV( 2, 'SGETRI', ' ', N, -1, -1, -1 ) )
-         END IF
-      ELSE
-         IWS = N
-      END IF
-*
-*     Solve the equation inv(A)*L = inv(U) for inv(A).
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code.
-*
-         DO 20 J = N, 1, -1
-*
-*           Copy current column of L to WORK and replace with zeros.
-*
-            DO 10 I = J + 1, N
-               WORK( I ) = A( I, J )
-               A( I, J ) = ZERO
-   10       CONTINUE
-*
-*           Compute current column of inv(A).
-*
-            IF( J.LT.N )
-     $         CALL SGEMV( 'No transpose', N, N-J, -ONE, A( 1, J+1 ),
-     $                     LDA, WORK( J+1 ), 1, ONE, A( 1, J ), 1 )
-   20    CONTINUE
-      ELSE
-*
-*        Use blocked code.
-*
-         NN = ( ( N-1 ) / NB )*NB + 1
-         DO 50 J = NN, 1, -NB
-            JB = MIN( NB, N-J+1 )
-*
-*           Copy current block column of L to WORK and replace with
-*           zeros.
-*
-            DO 40 JJ = J, J + JB - 1
-               DO 30 I = JJ + 1, N
-                  WORK( I+( JJ-J )*LDWORK ) = A( I, JJ )
-                  A( I, JJ ) = ZERO
-   30          CONTINUE
-   40       CONTINUE
-*
-*           Compute current block column of inv(A).
-*
-            IF( J+JB.LE.N )
-     $         CALL SGEMM( 'No transpose', 'No transpose', N, JB,
-     $                     N-J-JB+1, -ONE, A( 1, J+JB ), LDA,
-     $                     WORK( J+JB ), LDWORK, ONE, A( 1, J ), LDA )
-            CALL STRSM( 'Right', 'Lower', 'No transpose', 'Unit', N, JB,
-     $                  ONE, WORK( J ), LDWORK, A( 1, J ), LDA )
-   50    CONTINUE
-      END IF
-*
-*     Apply column interchanges.
-*
-      DO 60 J = N - 1, 1, -1
-         JP = IPIV( J )
-         IF( JP.NE.J )
-     $      CALL SSWAP( N, A( 1, J ), 1, A( 1, JP ), 1 )
-   60 CONTINUE
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of SGETRI
-*
-      END
--- a/libcruft/lapack/sgetrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-      SUBROUTINE SGETRS( TRANS, N, NRHS, A, LDA, IPIV, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TRANS
-      INTEGER            INFO, LDA, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      REAL               A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGETRS solves a system of linear equations
-*     A * X = B  or  A' * X = B
-*  with a general N-by-N matrix A using the LU factorization computed
-*  by SGETRF.
-*
-*  Arguments
-*  =========
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the form of the system of equations:
-*          = 'N':  A * X = B  (No transpose)
-*          = 'T':  A'* X = B  (Transpose)
-*          = 'C':  A'* X = B  (Conjugate transpose = Transpose)
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  A       (input) REAL array, dimension (LDA,N)
-*          The factors L and U from the factorization A = P*L*U
-*          as computed by SGETRF.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices from SGETRF; for 1<=i<=N, row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  B       (input/output) REAL array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOTRAN
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLASWP, STRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      NOTRAN = LSAME( TRANS, 'N' )
-      IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
-     $    LSAME( TRANS, 'C' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGETRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      IF( NOTRAN ) THEN
-*
-*        Solve A * X = B.
-*
-*        Apply row interchanges to the right hand sides.
-*
-         CALL SLASWP( NRHS, B, LDB, 1, N, IPIV, 1 )
-*
-*        Solve L*X = B, overwriting B with X.
-*
-         CALL STRSM( 'Left', 'Lower', 'No transpose', 'Unit', N, NRHS,
-     $               ONE, A, LDA, B, LDB )
-*
-*        Solve U*X = B, overwriting B with X.
-*
-         CALL STRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N,
-     $               NRHS, ONE, A, LDA, B, LDB )
-      ELSE
-*
-*        Solve A' * X = B.
-*
-*        Solve U'*X = B, overwriting B with X.
-*
-         CALL STRSM( 'Left', 'Upper', 'Transpose', 'Non-unit', N, NRHS,
-     $               ONE, A, LDA, B, LDB )
-*
-*        Solve L'*X = B, overwriting B with X.
-*
-         CALL STRSM( 'Left', 'Lower', 'Transpose', 'Unit', N, NRHS, ONE,
-     $               A, LDA, B, LDB )
-*
-*        Apply row interchanges to the solution vectors.
-*
-         CALL SLASWP( NRHS, B, LDB, 1, N, IPIV, -1 )
-      END IF
-*
-      RETURN
-*
-*     End of SGETRS
-*
-      END
--- a/libcruft/lapack/sggbak.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,220 +0,0 @@
-      SUBROUTINE SGGBAK( JOB, SIDE, N, ILO, IHI, LSCALE, RSCALE, M, V,
-     $                   LDV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOB, SIDE
-      INTEGER            IHI, ILO, INFO, LDV, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               LSCALE( * ), RSCALE( * ), V( LDV, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGGBAK forms the right or left eigenvectors of a real generalized
-*  eigenvalue problem A*x = lambda*B*x, by backward transformation on
-*  the computed eigenvectors of the balanced pair of matrices output by
-*  SGGBAL.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies the type of backward transformation required:
-*          = 'N':  do nothing, return immediately;
-*          = 'P':  do backward transformation for permutation only;
-*          = 'S':  do backward transformation for scaling only;
-*          = 'B':  do backward transformations for both permutation and
-*                  scaling.
-*          JOB must be the same as the argument JOB supplied to SGGBAL.
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'R':  V contains right eigenvectors;
-*          = 'L':  V contains left eigenvectors.
-*
-*  N       (input) INTEGER
-*          The number of rows of the matrix V.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          The integers ILO and IHI determined by SGGBAL.
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  LSCALE  (input) REAL array, dimension (N)
-*          Details of the permutations and/or scaling factors applied
-*          to the left side of A and B, as returned by SGGBAL.
-*
-*  RSCALE  (input) REAL array, dimension (N)
-*          Details of the permutations and/or scaling factors applied
-*          to the right side of A and B, as returned by SGGBAL.
-*
-*  M       (input) INTEGER
-*          The number of columns of the matrix V.  M >= 0.
-*
-*  V       (input/output) REAL array, dimension (LDV,M)
-*          On entry, the matrix of right or left eigenvectors to be
-*          transformed, as returned by STGEVC.
-*          On exit, V is overwritten by the transformed eigenvectors.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the matrix V. LDV >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  See R.C. Ward, Balancing the generalized eigenvalue problem,
-*                 SIAM J. Sci. Stat. Comp. 2 (1981), 141-152.
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            LEFTV, RIGHTV
-      INTEGER            I, K
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SSCAL, SSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      RIGHTV = LSAME( SIDE, 'R' )
-      LEFTV = LSAME( SIDE, 'L' )
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
-     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ILO.LT.1 ) THEN
-         INFO = -4
-      ELSE IF( N.EQ.0 .AND. IHI.EQ.0 .AND. ILO.NE.1 ) THEN
-         INFO = -4
-      ELSE IF( N.GT.0 .AND. ( IHI.LT.ILO .OR. IHI.GT.MAX( 1, N ) ) )
-     $   THEN
-         INFO = -5
-      ELSE IF( N.EQ.0 .AND. ILO.EQ.1 .AND. IHI.NE.0 ) THEN
-         INFO = -5
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -8
-      ELSE IF( LDV.LT.MAX( 1, N ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGGBAK', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-      IF( M.EQ.0 )
-     $   RETURN
-      IF( LSAME( JOB, 'N' ) )
-     $   RETURN
-*
-      IF( ILO.EQ.IHI )
-     $   GO TO 30
-*
-*     Backward balance
-*
-      IF( LSAME( JOB, 'S' ) .OR. LSAME( JOB, 'B' ) ) THEN
-*
-*        Backward transformation on right eigenvectors
-*
-         IF( RIGHTV ) THEN
-            DO 10 I = ILO, IHI
-               CALL SSCAL( M, RSCALE( I ), V( I, 1 ), LDV )
-   10       CONTINUE
-         END IF
-*
-*        Backward transformation on left eigenvectors
-*
-         IF( LEFTV ) THEN
-            DO 20 I = ILO, IHI
-               CALL SSCAL( M, LSCALE( I ), V( I, 1 ), LDV )
-   20       CONTINUE
-         END IF
-      END IF
-*
-*     Backward permutation
-*
-   30 CONTINUE
-      IF( LSAME( JOB, 'P' ) .OR. LSAME( JOB, 'B' ) ) THEN
-*
-*        Backward permutation on right eigenvectors
-*
-         IF( RIGHTV ) THEN
-            IF( ILO.EQ.1 )
-     $         GO TO 50
-*
-            DO 40 I = ILO - 1, 1, -1
-               K = RSCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 40
-               CALL SSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   40       CONTINUE
-*
-   50       CONTINUE
-            IF( IHI.EQ.N )
-     $         GO TO 70
-            DO 60 I = IHI + 1, N
-               K = RSCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 60
-               CALL SSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   60       CONTINUE
-         END IF
-*
-*        Backward permutation on left eigenvectors
-*
-   70    CONTINUE
-         IF( LEFTV ) THEN
-            IF( ILO.EQ.1 )
-     $         GO TO 90
-            DO 80 I = ILO - 1, 1, -1
-               K = LSCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 80
-               CALL SSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   80       CONTINUE
-*
-   90       CONTINUE
-            IF( IHI.EQ.N )
-     $         GO TO 110
-            DO 100 I = IHI + 1, N
-               K = LSCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 100
-               CALL SSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-  100       CONTINUE
-         END IF
-      END IF
-*
-  110 CONTINUE
-*
-      RETURN
-*
-*     End of SGGBAK
-*
-      END
--- a/libcruft/lapack/sggbal.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,469 +0,0 @@
-      SUBROUTINE SGGBAL( JOB, N, A, LDA, B, LDB, ILO, IHI, LSCALE,
-     $                   RSCALE, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOB
-      INTEGER            IHI, ILO, INFO, LDA, LDB, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), B( LDB, * ), LSCALE( * ),
-     $                   RSCALE( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGGBAL balances a pair of general real matrices (A,B).  This
-*  involves, first, permuting A and B by similarity transformations to
-*  isolate eigenvalues in the first 1 to ILO$-$1 and last IHI+1 to N
-*  elements on the diagonal; and second, applying a diagonal similarity
-*  transformation to rows and columns ILO to IHI to make the rows
-*  and columns as close in norm as possible. Both steps are optional.
-*
-*  Balancing may reduce the 1-norm of the matrices, and improve the
-*  accuracy of the computed eigenvalues and/or eigenvectors in the
-*  generalized eigenvalue problem A*x = lambda*B*x.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies the operations to be performed on A and B:
-*          = 'N':  none:  simply set ILO = 1, IHI = N, LSCALE(I) = 1.0
-*                  and RSCALE(I) = 1.0 for i = 1,...,N.
-*          = 'P':  permute only;
-*          = 'S':  scale only;
-*          = 'B':  both permute and scale.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the input matrix A.
-*          On exit,  A is overwritten by the balanced matrix.
-*          If JOB = 'N', A is not referenced.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,N).
-*
-*  B       (input/output) REAL array, dimension (LDB,N)
-*          On entry, the input matrix B.
-*          On exit,  B is overwritten by the balanced matrix.
-*          If JOB = 'N', B is not referenced.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B. LDB >= max(1,N).
-*
-*  ILO     (output) INTEGER
-*  IHI     (output) INTEGER
-*          ILO and IHI are set to integers such that on exit
-*          A(i,j) = 0 and B(i,j) = 0 if i > j and
-*          j = 1,...,ILO-1 or i = IHI+1,...,N.
-*          If JOB = 'N' or 'S', ILO = 1 and IHI = N.
-*
-*  LSCALE  (output) REAL array, dimension (N)
-*          Details of the permutations and scaling factors applied
-*          to the left side of A and B.  If P(j) is the index of the
-*          row interchanged with row j, and D(j)
-*          is the scaling factor applied to row j, then
-*            LSCALE(j) = P(j)    for J = 1,...,ILO-1
-*                      = D(j)    for J = ILO,...,IHI
-*                      = P(j)    for J = IHI+1,...,N.
-*          The order in which the interchanges are made is N to IHI+1,
-*          then 1 to ILO-1.
-*
-*  RSCALE  (output) REAL array, dimension (N)
-*          Details of the permutations and scaling factors applied
-*          to the right side of A and B.  If P(j) is the index of the
-*          column interchanged with column j, and D(j)
-*          is the scaling factor applied to column j, then
-*            LSCALE(j) = P(j)    for J = 1,...,ILO-1
-*                      = D(j)    for J = ILO,...,IHI
-*                      = P(j)    for J = IHI+1,...,N.
-*          The order in which the interchanges are made is N to IHI+1,
-*          then 1 to ILO-1.
-*
-*  WORK    (workspace) REAL array, dimension (lwork)
-*          lwork must be at least max(1,6*N) when JOB = 'S' or 'B', and
-*          at least 1 when JOB = 'N' or 'P'.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  See R.C. WARD, Balancing the generalized eigenvalue problem,
-*                 SIAM J. Sci. Stat. Comp. 2 (1981), 141-152.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, HALF, ONE
-      PARAMETER          ( ZERO = 0.0E+0, HALF = 0.5E+0, ONE = 1.0E+0 )
-      REAL               THREE, SCLFAC
-      PARAMETER          ( THREE = 3.0E+0, SCLFAC = 1.0E+1 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ICAB, IFLOW, IP1, IR, IRAB, IT, J, JC, JP1,
-     $                   K, KOUNT, L, LCAB, LM1, LRAB, LSFMAX, LSFMIN,
-     $                   M, NR, NRP2
-      REAL               ALPHA, BASL, BETA, CAB, CMAX, COEF, COEF2,
-     $                   COEF5, COR, EW, EWC, GAMMA, PGAMMA, RAB, SFMAX,
-     $                   SFMIN, SUM, T, TA, TB, TC
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ISAMAX
-      REAL               SDOT, SLAMCH
-      EXTERNAL           LSAME, ISAMAX, SDOT, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SAXPY, SSCAL, SSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, INT, LOG10, MAX, MIN, REAL, SIGN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
-     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGGBAL', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         ILO = 1
-         IHI = N
-         RETURN
-      END IF
-*
-      IF( N.EQ.1 ) THEN
-         ILO = 1
-         IHI = N
-         LSCALE( 1 ) = ONE
-         RSCALE( 1 ) = ONE
-         RETURN
-      END IF
-*
-      IF( LSAME( JOB, 'N' ) ) THEN
-         ILO = 1
-         IHI = N
-         DO 10 I = 1, N
-            LSCALE( I ) = ONE
-            RSCALE( I ) = ONE
-   10    CONTINUE
-         RETURN
-      END IF
-*
-      K = 1
-      L = N
-      IF( LSAME( JOB, 'S' ) )
-     $   GO TO 190
-*
-      GO TO 30
-*
-*     Permute the matrices A and B to isolate the eigenvalues.
-*
-*     Find row with one nonzero in columns 1 through L
-*
-   20 CONTINUE
-      L = LM1
-      IF( L.NE.1 )
-     $   GO TO 30
-*
-      RSCALE( 1 ) = ONE
-      LSCALE( 1 ) = ONE
-      GO TO 190
-*
-   30 CONTINUE
-      LM1 = L - 1
-      DO 80 I = L, 1, -1
-         DO 40 J = 1, LM1
-            JP1 = J + 1
-            IF( A( I, J ).NE.ZERO .OR. B( I, J ).NE.ZERO )
-     $         GO TO 50
-   40    CONTINUE
-         J = L
-         GO TO 70
-*
-   50    CONTINUE
-         DO 60 J = JP1, L
-            IF( A( I, J ).NE.ZERO .OR. B( I, J ).NE.ZERO )
-     $         GO TO 80
-   60    CONTINUE
-         J = JP1 - 1
-*
-   70    CONTINUE
-         M = L
-         IFLOW = 1
-         GO TO 160
-   80 CONTINUE
-      GO TO 100
-*
-*     Find column with one nonzero in rows K through N
-*
-   90 CONTINUE
-      K = K + 1
-*
-  100 CONTINUE
-      DO 150 J = K, L
-         DO 110 I = K, LM1
-            IP1 = I + 1
-            IF( A( I, J ).NE.ZERO .OR. B( I, J ).NE.ZERO )
-     $         GO TO 120
-  110    CONTINUE
-         I = L
-         GO TO 140
-  120    CONTINUE
-         DO 130 I = IP1, L
-            IF( A( I, J ).NE.ZERO .OR. B( I, J ).NE.ZERO )
-     $         GO TO 150
-  130    CONTINUE
-         I = IP1 - 1
-  140    CONTINUE
-         M = K
-         IFLOW = 2
-         GO TO 160
-  150 CONTINUE
-      GO TO 190
-*
-*     Permute rows M and I
-*
-  160 CONTINUE
-      LSCALE( M ) = I
-      IF( I.EQ.M )
-     $   GO TO 170
-      CALL SSWAP( N-K+1, A( I, K ), LDA, A( M, K ), LDA )
-      CALL SSWAP( N-K+1, B( I, K ), LDB, B( M, K ), LDB )
-*
-*     Permute columns M and J
-*
-  170 CONTINUE
-      RSCALE( M ) = J
-      IF( J.EQ.M )
-     $   GO TO 180
-      CALL SSWAP( L, A( 1, J ), 1, A( 1, M ), 1 )
-      CALL SSWAP( L, B( 1, J ), 1, B( 1, M ), 1 )
-*
-  180 CONTINUE
-      GO TO ( 20, 90 )IFLOW
-*
-  190 CONTINUE
-      ILO = K
-      IHI = L
-*
-      IF( LSAME( JOB, 'P' ) ) THEN
-         DO 195 I = ILO, IHI
-            LSCALE( I ) = ONE
-            RSCALE( I ) = ONE
-  195    CONTINUE
-         RETURN
-      END IF
-*
-      IF( ILO.EQ.IHI )
-     $   RETURN
-*
-*     Balance the submatrix in rows ILO to IHI.
-*
-      NR = IHI - ILO + 1
-      DO 200 I = ILO, IHI
-         RSCALE( I ) = ZERO
-         LSCALE( I ) = ZERO
-*
-         WORK( I ) = ZERO
-         WORK( I+N ) = ZERO
-         WORK( I+2*N ) = ZERO
-         WORK( I+3*N ) = ZERO
-         WORK( I+4*N ) = ZERO
-         WORK( I+5*N ) = ZERO
-  200 CONTINUE
-*
-*     Compute right side vector in resulting linear equations
-*
-      BASL = LOG10( SCLFAC )
-      DO 240 I = ILO, IHI
-         DO 230 J = ILO, IHI
-            TB = B( I, J )
-            TA = A( I, J )
-            IF( TA.EQ.ZERO )
-     $         GO TO 210
-            TA = LOG10( ABS( TA ) ) / BASL
-  210       CONTINUE
-            IF( TB.EQ.ZERO )
-     $         GO TO 220
-            TB = LOG10( ABS( TB ) ) / BASL
-  220       CONTINUE
-            WORK( I+4*N ) = WORK( I+4*N ) - TA - TB
-            WORK( J+5*N ) = WORK( J+5*N ) - TA - TB
-  230    CONTINUE
-  240 CONTINUE
-*
-      COEF = ONE / REAL( 2*NR )
-      COEF2 = COEF*COEF
-      COEF5 = HALF*COEF2
-      NRP2 = NR + 2
-      BETA = ZERO
-      IT = 1
-*
-*     Start generalized conjugate gradient iteration
-*
-  250 CONTINUE
-*
-      GAMMA = SDOT( NR, WORK( ILO+4*N ), 1, WORK( ILO+4*N ), 1 ) +
-     $        SDOT( NR, WORK( ILO+5*N ), 1, WORK( ILO+5*N ), 1 )
-*
-      EW = ZERO
-      EWC = ZERO
-      DO 260 I = ILO, IHI
-         EW = EW + WORK( I+4*N )
-         EWC = EWC + WORK( I+5*N )
-  260 CONTINUE
-*
-      GAMMA = COEF*GAMMA - COEF2*( EW**2+EWC**2 ) - COEF5*( EW-EWC )**2
-      IF( GAMMA.EQ.ZERO )
-     $   GO TO 350
-      IF( IT.NE.1 )
-     $   BETA = GAMMA / PGAMMA
-      T = COEF5*( EWC-THREE*EW )
-      TC = COEF5*( EW-THREE*EWC )
-*
-      CALL SSCAL( NR, BETA, WORK( ILO ), 1 )
-      CALL SSCAL( NR, BETA, WORK( ILO+N ), 1 )
-*
-      CALL SAXPY( NR, COEF, WORK( ILO+4*N ), 1, WORK( ILO+N ), 1 )
-      CALL SAXPY( NR, COEF, WORK( ILO+5*N ), 1, WORK( ILO ), 1 )
-*
-      DO 270 I = ILO, IHI
-         WORK( I ) = WORK( I ) + TC
-         WORK( I+N ) = WORK( I+N ) + T
-  270 CONTINUE
-*
-*     Apply matrix to vector
-*
-      DO 300 I = ILO, IHI
-         KOUNT = 0
-         SUM = ZERO
-         DO 290 J = ILO, IHI
-            IF( A( I, J ).EQ.ZERO )
-     $         GO TO 280
-            KOUNT = KOUNT + 1
-            SUM = SUM + WORK( J )
-  280       CONTINUE
-            IF( B( I, J ).EQ.ZERO )
-     $         GO TO 290
-            KOUNT = KOUNT + 1
-            SUM = SUM + WORK( J )
-  290    CONTINUE
-         WORK( I+2*N ) = REAL( KOUNT )*WORK( I+N ) + SUM
-  300 CONTINUE
-*
-      DO 330 J = ILO, IHI
-         KOUNT = 0
-         SUM = ZERO
-         DO 320 I = ILO, IHI
-            IF( A( I, J ).EQ.ZERO )
-     $         GO TO 310
-            KOUNT = KOUNT + 1
-            SUM = SUM + WORK( I+N )
-  310       CONTINUE
-            IF( B( I, J ).EQ.ZERO )
-     $         GO TO 320
-            KOUNT = KOUNT + 1
-            SUM = SUM + WORK( I+N )
-  320    CONTINUE
-         WORK( J+3*N ) = REAL( KOUNT )*WORK( J ) + SUM
-  330 CONTINUE
-*
-      SUM = SDOT( NR, WORK( ILO+N ), 1, WORK( ILO+2*N ), 1 ) +
-     $      SDOT( NR, WORK( ILO ), 1, WORK( ILO+3*N ), 1 )
-      ALPHA = GAMMA / SUM
-*
-*     Determine correction to current iteration
-*
-      CMAX = ZERO
-      DO 340 I = ILO, IHI
-         COR = ALPHA*WORK( I+N )
-         IF( ABS( COR ).GT.CMAX )
-     $      CMAX = ABS( COR )
-         LSCALE( I ) = LSCALE( I ) + COR
-         COR = ALPHA*WORK( I )
-         IF( ABS( COR ).GT.CMAX )
-     $      CMAX = ABS( COR )
-         RSCALE( I ) = RSCALE( I ) + COR
-  340 CONTINUE
-      IF( CMAX.LT.HALF )
-     $   GO TO 350
-*
-      CALL SAXPY( NR, -ALPHA, WORK( ILO+2*N ), 1, WORK( ILO+4*N ), 1 )
-      CALL SAXPY( NR, -ALPHA, WORK( ILO+3*N ), 1, WORK( ILO+5*N ), 1 )
-*
-      PGAMMA = GAMMA
-      IT = IT + 1
-      IF( IT.LE.NRP2 )
-     $   GO TO 250
-*
-*     End generalized conjugate gradient iteration
-*
-  350 CONTINUE
-      SFMIN = SLAMCH( 'S' )
-      SFMAX = ONE / SFMIN
-      LSFMIN = INT( LOG10( SFMIN ) / BASL+ONE )
-      LSFMAX = INT( LOG10( SFMAX ) / BASL )
-      DO 360 I = ILO, IHI
-         IRAB = ISAMAX( N-ILO+1, A( I, ILO ), LDA )
-         RAB = ABS( A( I, IRAB+ILO-1 ) )
-         IRAB = ISAMAX( N-ILO+1, B( I, ILO ), LDB )
-         RAB = MAX( RAB, ABS( B( I, IRAB+ILO-1 ) ) )
-         LRAB = INT( LOG10( RAB+SFMIN ) / BASL+ONE )
-         IR = LSCALE( I ) + SIGN( HALF, LSCALE( I ) )
-         IR = MIN( MAX( IR, LSFMIN ), LSFMAX, LSFMAX-LRAB )
-         LSCALE( I ) = SCLFAC**IR
-         ICAB = ISAMAX( IHI, A( 1, I ), 1 )
-         CAB = ABS( A( ICAB, I ) )
-         ICAB = ISAMAX( IHI, B( 1, I ), 1 )
-         CAB = MAX( CAB, ABS( B( ICAB, I ) ) )
-         LCAB = INT( LOG10( CAB+SFMIN ) / BASL+ONE )
-         JC = RSCALE( I ) + SIGN( HALF, RSCALE( I ) )
-         JC = MIN( MAX( JC, LSFMIN ), LSFMAX, LSFMAX-LCAB )
-         RSCALE( I ) = SCLFAC**JC
-  360 CONTINUE
-*
-*     Row scaling of matrices A and B
-*
-      DO 370 I = ILO, IHI
-         CALL SSCAL( N-ILO+1, LSCALE( I ), A( I, ILO ), LDA )
-         CALL SSCAL( N-ILO+1, LSCALE( I ), B( I, ILO ), LDB )
-  370 CONTINUE
-*
-*     Column scaling of matrices A and B
-*
-      DO 380 J = ILO, IHI
-         CALL SSCAL( IHI, RSCALE( J ), A( 1, J ), 1 )
-         CALL SSCAL( IHI, RSCALE( J ), B( 1, J ), 1 )
-  380 CONTINUE
-*
-      RETURN
-*
-*     End of SGGBAL
-*
-      END
--- a/libcruft/lapack/sggev.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,489 +0,0 @@
-      SUBROUTINE SGGEV( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR, ALPHAI,
-     $                  BETA, VL, LDVL, VR, LDVR, WORK, LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBVL, JOBVR
-      INTEGER            INFO, LDA, LDB, LDVL, LDVR, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), ALPHAI( * ), ALPHAR( * ),
-     $                   B( LDB, * ), BETA( * ), VL( LDVL, * ),
-     $                   VR( LDVR, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGGEV computes for a pair of N-by-N real nonsymmetric matrices (A,B)
-*  the generalized eigenvalues, and optionally, the left and/or right
-*  generalized eigenvectors.
-*
-*  A generalized eigenvalue for a pair of matrices (A,B) is a scalar
-*  lambda or a ratio alpha/beta = lambda, such that A - lambda*B is
-*  singular. It is usually represented as the pair (alpha,beta), as
-*  there is a reasonable interpretation for beta=0, and even for both
-*  being zero.
-*
-*  The right eigenvector v(j) corresponding to the eigenvalue lambda(j)
-*  of (A,B) satisfies
-*
-*                   A * v(j) = lambda(j) * B * v(j).
-*
-*  The left eigenvector u(j) corresponding to the eigenvalue lambda(j)
-*  of (A,B) satisfies
-*
-*                   u(j)**H * A  = lambda(j) * u(j)**H * B .
-*
-*  where u(j)**H is the conjugate-transpose of u(j).
-*
-*
-*  Arguments
-*  =========
-*
-*  JOBVL   (input) CHARACTER*1
-*          = 'N':  do not compute the left generalized eigenvectors;
-*          = 'V':  compute the left generalized eigenvectors.
-*
-*  JOBVR   (input) CHARACTER*1
-*          = 'N':  do not compute the right generalized eigenvectors;
-*          = 'V':  compute the right generalized eigenvectors.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A, B, VL, and VR.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA, N)
-*          On entry, the matrix A in the pair (A,B).
-*          On exit, A has been overwritten.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of A.  LDA >= max(1,N).
-*
-*  B       (input/output) REAL array, dimension (LDB, N)
-*          On entry, the matrix B in the pair (A,B).
-*          On exit, B has been overwritten.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of B.  LDB >= max(1,N).
-*
-*  ALPHAR  (output) REAL array, dimension (N)
-*  ALPHAI  (output) REAL array, dimension (N)
-*  BETA    (output) REAL array, dimension (N)
-*          On exit, (ALPHAR(j) + ALPHAI(j)*i)/BETA(j), j=1,...,N, will
-*          be the generalized eigenvalues.  If ALPHAI(j) is zero, then
-*          the j-th eigenvalue is real; if positive, then the j-th and
-*          (j+1)-st eigenvalues are a complex conjugate pair, with
-*          ALPHAI(j+1) negative.
-*
-*          Note: the quotients ALPHAR(j)/BETA(j) and ALPHAI(j)/BETA(j)
-*          may easily over- or underflow, and BETA(j) may even be zero.
-*          Thus, the user should avoid naively computing the ratio
-*          alpha/beta.  However, ALPHAR and ALPHAI will be always less
-*          than and usually comparable with norm(A) in magnitude, and
-*          BETA always less than and usually comparable with norm(B).
-*
-*  VL      (output) REAL array, dimension (LDVL,N)
-*          If JOBVL = 'V', the left eigenvectors u(j) are stored one
-*          after another in the columns of VL, in the same order as
-*          their eigenvalues. If the j-th eigenvalue is real, then
-*          u(j) = VL(:,j), the j-th column of VL. If the j-th and
-*          (j+1)-th eigenvalues form a complex conjugate pair, then
-*          u(j) = VL(:,j)+i*VL(:,j+1) and u(j+1) = VL(:,j)-i*VL(:,j+1).
-*          Each eigenvector is scaled so the largest component has
-*          abs(real part)+abs(imag. part)=1.
-*          Not referenced if JOBVL = 'N'.
-*
-*  LDVL    (input) INTEGER
-*          The leading dimension of the matrix VL. LDVL >= 1, and
-*          if JOBVL = 'V', LDVL >= N.
-*
-*  VR      (output) REAL array, dimension (LDVR,N)
-*          If JOBVR = 'V', the right eigenvectors v(j) are stored one
-*          after another in the columns of VR, in the same order as
-*          their eigenvalues. If the j-th eigenvalue is real, then
-*          v(j) = VR(:,j), the j-th column of VR. If the j-th and
-*          (j+1)-th eigenvalues form a complex conjugate pair, then
-*          v(j) = VR(:,j)+i*VR(:,j+1) and v(j+1) = VR(:,j)-i*VR(:,j+1).
-*          Each eigenvector is scaled so the largest component has
-*          abs(real part)+abs(imag. part)=1.
-*          Not referenced if JOBVR = 'N'.
-*
-*  LDVR    (input) INTEGER
-*          The leading dimension of the matrix VR. LDVR >= 1, and
-*          if JOBVR = 'V', LDVR >= N.
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,8*N).
-*          For good performance, LWORK must generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          = 1,...,N:
-*                The QZ iteration failed.  No eigenvectors have been
-*                calculated, but ALPHAR(j), ALPHAI(j), and BETA(j)
-*                should be correct for j=INFO+1,...,N.
-*          > N:  =N+1: other than QZ iteration failed in SHGEQZ.
-*                =N+2: error return from STGEVC.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY
-      CHARACTER          CHTEMP
-      INTEGER            ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT, ILO,
-     $                   IN, IRIGHT, IROWS, ITAU, IWRK, JC, JR, MAXWRK,
-     $                   MINWRK
-      REAL               ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
-     $                   SMLNUM, TEMP
-*     ..
-*     .. Local Arrays ..
-      LOGICAL            LDUMMA( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEQRF, SGGBAK, SGGBAL, SGGHRD, SHGEQZ, SLABAD,
-     $                   SLACPY, SLASCL, SLASET, SORGQR, SORMQR, STGEVC,
-     $                   XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      REAL               SLAMCH, SLANGE
-      EXTERNAL           LSAME, ILAENV, SLAMCH, SLANGE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode the input arguments
-*
-      IF( LSAME( JOBVL, 'N' ) ) THEN
-         IJOBVL = 1
-         ILVL = .FALSE.
-      ELSE IF( LSAME( JOBVL, 'V' ) ) THEN
-         IJOBVL = 2
-         ILVL = .TRUE.
-      ELSE
-         IJOBVL = -1
-         ILVL = .FALSE.
-      END IF
-*
-      IF( LSAME( JOBVR, 'N' ) ) THEN
-         IJOBVR = 1
-         ILVR = .FALSE.
-      ELSE IF( LSAME( JOBVR, 'V' ) ) THEN
-         IJOBVR = 2
-         ILVR = .TRUE.
-      ELSE
-         IJOBVR = -1
-         ILVR = .FALSE.
-      END IF
-      ILV = ILVL .OR. ILVR
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( IJOBVL.LE.0 ) THEN
-         INFO = -1
-      ELSE IF( IJOBVR.LE.0 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDVL.LT.1 .OR. ( ILVL .AND. LDVL.LT.N ) ) THEN
-         INFO = -12
-      ELSE IF( LDVR.LT.1 .OR. ( ILVR .AND. LDVR.LT.N ) ) THEN
-         INFO = -14
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of workspace needed at that point in the code,
-*       as well as the preferred amount for good performance.
-*       NB refers to the optimal block size for the immediately
-*       following subroutine, as returned by ILAENV. The workspace is
-*       computed assuming ILO = 1 and IHI = N, the worst case.)
-*
-      IF( INFO.EQ.0 ) THEN
-         MINWRK = MAX( 1, 8*N )
-         MAXWRK = MAX( 1, N*( 7 +
-     $                 ILAENV( 1, 'SGEQRF', ' ', N, 1, N, 0 ) ) )
-         MAXWRK = MAX( MAXWRK, N*( 7 +
-     $                 ILAENV( 1, 'SORMQR', ' ', N, 1, N, 0 ) ) )
-         IF( ILVL ) THEN
-            MAXWRK = MAX( MAXWRK, N*( 7 +
-     $                 ILAENV( 1, 'SORGQR', ' ', N, 1, N, -1 ) ) )
-         END IF
-         WORK( 1 ) = MAXWRK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY )
-     $      INFO = -16
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGGEV ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Get machine constants
-*
-      EPS = SLAMCH( 'P' )
-      SMLNUM = SLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SQRT( SMLNUM ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = SLANGE( 'M', N, N, A, LDA, WORK )
-      ILASCL = .FALSE.
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-         ANRMTO = SMLNUM
-         ILASCL = .TRUE.
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-         ANRMTO = BIGNUM
-         ILASCL = .TRUE.
-      END IF
-      IF( ILASCL )
-     $   CALL SLASCL( 'G', 0, 0, ANRM, ANRMTO, N, N, A, LDA, IERR )
-*
-*     Scale B if max element outside range [SMLNUM,BIGNUM]
-*
-      BNRM = SLANGE( 'M', N, N, B, LDB, WORK )
-      ILBSCL = .FALSE.
-      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
-         BNRMTO = SMLNUM
-         ILBSCL = .TRUE.
-      ELSE IF( BNRM.GT.BIGNUM ) THEN
-         BNRMTO = BIGNUM
-         ILBSCL = .TRUE.
-      END IF
-      IF( ILBSCL )
-     $   CALL SLASCL( 'G', 0, 0, BNRM, BNRMTO, N, N, B, LDB, IERR )
-*
-*     Permute the matrices A, B to isolate eigenvalues if possible
-*     (Workspace: need 6*N)
-*
-      ILEFT = 1
-      IRIGHT = N + 1
-      IWRK = IRIGHT + N
-      CALL SGGBAL( 'P', N, A, LDA, B, LDB, ILO, IHI, WORK( ILEFT ),
-     $             WORK( IRIGHT ), WORK( IWRK ), IERR )
-*
-*     Reduce B to triangular form (QR decomposition of B)
-*     (Workspace: need N, prefer N*NB)
-*
-      IROWS = IHI + 1 - ILO
-      IF( ILV ) THEN
-         ICOLS = N + 1 - ILO
-      ELSE
-         ICOLS = IROWS
-      END IF
-      ITAU = IWRK
-      IWRK = ITAU + IROWS
-      CALL SGEQRF( IROWS, ICOLS, B( ILO, ILO ), LDB, WORK( ITAU ),
-     $             WORK( IWRK ), LWORK+1-IWRK, IERR )
-*
-*     Apply the orthogonal transformation to matrix A
-*     (Workspace: need N, prefer N*NB)
-*
-      CALL SORMQR( 'L', 'T', IROWS, ICOLS, IROWS, B( ILO, ILO ), LDB,
-     $             WORK( ITAU ), A( ILO, ILO ), LDA, WORK( IWRK ),
-     $             LWORK+1-IWRK, IERR )
-*
-*     Initialize VL
-*     (Workspace: need N, prefer N*NB)
-*
-      IF( ILVL ) THEN
-         CALL SLASET( 'Full', N, N, ZERO, ONE, VL, LDVL )
-         IF( IROWS.GT.1 ) THEN
-            CALL SLACPY( 'L', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
-     $                   VL( ILO+1, ILO ), LDVL )
-         END IF
-         CALL SORGQR( IROWS, IROWS, IROWS, VL( ILO, ILO ), LDVL,
-     $                WORK( ITAU ), WORK( IWRK ), LWORK+1-IWRK, IERR )
-      END IF
-*
-*     Initialize VR
-*
-      IF( ILVR )
-     $   CALL SLASET( 'Full', N, N, ZERO, ONE, VR, LDVR )
-*
-*     Reduce to generalized Hessenberg form
-*     (Workspace: none needed)
-*
-      IF( ILV ) THEN
-*
-*        Eigenvectors requested -- work on whole matrix.
-*
-         CALL SGGHRD( JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB, VL,
-     $                LDVL, VR, LDVR, IERR )
-      ELSE
-         CALL SGGHRD( 'N', 'N', IROWS, 1, IROWS, A( ILO, ILO ), LDA,
-     $                B( ILO, ILO ), LDB, VL, LDVL, VR, LDVR, IERR )
-      END IF
-*
-*     Perform QZ algorithm (Compute eigenvalues, and optionally, the
-*     Schur forms and Schur vectors)
-*     (Workspace: need N)
-*
-      IWRK = ITAU
-      IF( ILV ) THEN
-         CHTEMP = 'S'
-      ELSE
-         CHTEMP = 'E'
-      END IF
-      CALL SHGEQZ( CHTEMP, JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB,
-     $             ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR,
-     $             WORK( IWRK ), LWORK+1-IWRK, IERR )
-      IF( IERR.NE.0 ) THEN
-         IF( IERR.GT.0 .AND. IERR.LE.N ) THEN
-            INFO = IERR
-         ELSE IF( IERR.GT.N .AND. IERR.LE.2*N ) THEN
-            INFO = IERR - N
-         ELSE
-            INFO = N + 1
-         END IF
-         GO TO 110
-      END IF
-*
-*     Compute Eigenvectors
-*     (Workspace: need 6*N)
-*
-      IF( ILV ) THEN
-         IF( ILVL ) THEN
-            IF( ILVR ) THEN
-               CHTEMP = 'B'
-            ELSE
-               CHTEMP = 'L'
-            END IF
-         ELSE
-            CHTEMP = 'R'
-         END IF
-         CALL STGEVC( CHTEMP, 'B', LDUMMA, N, A, LDA, B, LDB, VL, LDVL,
-     $                VR, LDVR, N, IN, WORK( IWRK ), IERR )
-         IF( IERR.NE.0 ) THEN
-            INFO = N + 2
-            GO TO 110
-         END IF
-*
-*        Undo balancing on VL and VR and normalization
-*        (Workspace: none needed)
-*
-         IF( ILVL ) THEN
-            CALL SGGBAK( 'P', 'L', N, ILO, IHI, WORK( ILEFT ),
-     $                   WORK( IRIGHT ), N, VL, LDVL, IERR )
-            DO 50 JC = 1, N
-               IF( ALPHAI( JC ).LT.ZERO )
-     $            GO TO 50
-               TEMP = ZERO
-               IF( ALPHAI( JC ).EQ.ZERO ) THEN
-                  DO 10 JR = 1, N
-                     TEMP = MAX( TEMP, ABS( VL( JR, JC ) ) )
-   10             CONTINUE
-               ELSE
-                  DO 20 JR = 1, N
-                     TEMP = MAX( TEMP, ABS( VL( JR, JC ) )+
-     $                      ABS( VL( JR, JC+1 ) ) )
-   20             CONTINUE
-               END IF
-               IF( TEMP.LT.SMLNUM )
-     $            GO TO 50
-               TEMP = ONE / TEMP
-               IF( ALPHAI( JC ).EQ.ZERO ) THEN
-                  DO 30 JR = 1, N
-                     VL( JR, JC ) = VL( JR, JC )*TEMP
-   30             CONTINUE
-               ELSE
-                  DO 40 JR = 1, N
-                     VL( JR, JC ) = VL( JR, JC )*TEMP
-                     VL( JR, JC+1 ) = VL( JR, JC+1 )*TEMP
-   40             CONTINUE
-               END IF
-   50       CONTINUE
-         END IF
-         IF( ILVR ) THEN
-            CALL SGGBAK( 'P', 'R', N, ILO, IHI, WORK( ILEFT ),
-     $                   WORK( IRIGHT ), N, VR, LDVR, IERR )
-            DO 100 JC = 1, N
-               IF( ALPHAI( JC ).LT.ZERO )
-     $            GO TO 100
-               TEMP = ZERO
-               IF( ALPHAI( JC ).EQ.ZERO ) THEN
-                  DO 60 JR = 1, N
-                     TEMP = MAX( TEMP, ABS( VR( JR, JC ) ) )
-   60             CONTINUE
-               ELSE
-                  DO 70 JR = 1, N
-                     TEMP = MAX( TEMP, ABS( VR( JR, JC ) )+
-     $                      ABS( VR( JR, JC+1 ) ) )
-   70             CONTINUE
-               END IF
-               IF( TEMP.LT.SMLNUM )
-     $            GO TO 100
-               TEMP = ONE / TEMP
-               IF( ALPHAI( JC ).EQ.ZERO ) THEN
-                  DO 80 JR = 1, N
-                     VR( JR, JC ) = VR( JR, JC )*TEMP
-   80             CONTINUE
-               ELSE
-                  DO 90 JR = 1, N
-                     VR( JR, JC ) = VR( JR, JC )*TEMP
-                     VR( JR, JC+1 ) = VR( JR, JC+1 )*TEMP
-   90             CONTINUE
-               END IF
-  100       CONTINUE
-         END IF
-*
-*        End of eigenvector calculation
-*
-      END IF
-*
-*     Undo scaling if necessary
-*
-      IF( ILASCL ) THEN
-         CALL SLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHAR, N, IERR )
-         CALL SLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHAI, N, IERR )
-      END IF
-*
-      IF( ILBSCL ) THEN
-         CALL SLASCL( 'G', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
-      END IF
-*
-  110 CONTINUE
-*
-      WORK( 1 ) = MAXWRK
-*
-      RETURN
-*
-*     End of SGGEV
-*
-      END
--- a/libcruft/lapack/sgghrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,264 +0,0 @@
-      SUBROUTINE SGGHRD( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
-     $                   LDQ, Z, LDZ, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPQ, COMPZ
-      INTEGER            IHI, ILO, INFO, LDA, LDB, LDQ, LDZ, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
-     $                   Z( LDZ, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGGHRD reduces a pair of real matrices (A,B) to generalized upper
-*  Hessenberg form using orthogonal transformations, where A is a
-*  general matrix and B is upper triangular.  The form of the
-*  generalized eigenvalue problem is
-*     A*x = lambda*B*x,
-*  and B is typically made upper triangular by computing its QR
-*  factorization and moving the orthogonal matrix Q to the left side
-*  of the equation.
-*
-*  This subroutine simultaneously reduces A to a Hessenberg matrix H:
-*     Q**T*A*Z = H
-*  and transforms B to another upper triangular matrix T:
-*     Q**T*B*Z = T
-*  in order to reduce the problem to its standard form
-*     H*y = lambda*T*y
-*  where y = Z**T*x.
-*
-*  The orthogonal matrices Q and Z are determined as products of Givens
-*  rotations.  They may either be formed explicitly, or they may be
-*  postmultiplied into input matrices Q1 and Z1, so that
-*
-*       Q1 * A * Z1**T = (Q1*Q) * H * (Z1*Z)**T
-*
-*       Q1 * B * Z1**T = (Q1*Q) * T * (Z1*Z)**T
-*
-*  If Q1 is the orthogonal matrix from the QR factorization of B in the
-*  original equation A*x = lambda*B*x, then SGGHRD reduces the original
-*  problem to generalized Hessenberg form.
-*
-*  Arguments
-*  =========
-*
-*  COMPQ   (input) CHARACTER*1
-*          = 'N': do not compute Q;
-*          = 'I': Q is initialized to the unit matrix, and the
-*                 orthogonal matrix Q is returned;
-*          = 'V': Q must contain an orthogonal matrix Q1 on entry,
-*                 and the product Q1*Q is returned.
-*
-*  COMPZ   (input) CHARACTER*1
-*          = 'N': do not compute Z;
-*          = 'I': Z is initialized to the unit matrix, and the
-*                 orthogonal matrix Z is returned;
-*          = 'V': Z must contain an orthogonal matrix Z1 on entry,
-*                 and the product Z1*Z is returned.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          ILO and IHI mark the rows and columns of A which are to be
-*          reduced.  It is assumed that A is already upper triangular
-*          in rows and columns 1:ILO-1 and IHI+1:N.  ILO and IHI are
-*          normally set by a previous call to SGGBAL; otherwise they
-*          should be set to 1 and N respectively.
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  A       (input/output) REAL array, dimension (LDA, N)
-*          On entry, the N-by-N general matrix to be reduced.
-*          On exit, the upper triangle and the first subdiagonal of A
-*          are overwritten with the upper Hessenberg matrix H, and the
-*          rest is set to zero.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input/output) REAL array, dimension (LDB, N)
-*          On entry, the N-by-N upper triangular matrix B.
-*          On exit, the upper triangular matrix T = Q**T B Z.  The
-*          elements below the diagonal are set to zero.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  Q       (input/output) REAL array, dimension (LDQ, N)
-*          On entry, if COMPQ = 'V', the orthogonal matrix Q1,
-*          typically from the QR factorization of B.
-*          On exit, if COMPQ='I', the orthogonal matrix Q, and if
-*          COMPQ = 'V', the product Q1*Q.
-*          Not referenced if COMPQ='N'.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.
-*          LDQ >= N if COMPQ='V' or 'I'; LDQ >= 1 otherwise.
-*
-*  Z       (input/output) REAL array, dimension (LDZ, N)
-*          On entry, if COMPZ = 'V', the orthogonal matrix Z1.
-*          On exit, if COMPZ='I', the orthogonal matrix Z, and if
-*          COMPZ = 'V', the product Z1*Z.
-*          Not referenced if COMPZ='N'.
-*
-*  LDZ     (input) INTEGER
-*          The leading dimension of the array Z.
-*          LDZ >= N if COMPZ='V' or 'I'; LDZ >= 1 otherwise.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  This routine reduces A to Hessenberg and B to triangular form by
-*  an unblocked reduction, as described in _Matrix_Computations_,
-*  by Golub and Van Loan (Johns Hopkins Press.)
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ILQ, ILZ
-      INTEGER            ICOMPQ, ICOMPZ, JCOL, JROW
-      REAL               C, S, TEMP
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARTG, SLASET, SROT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode COMPQ
-*
-      IF( LSAME( COMPQ, 'N' ) ) THEN
-         ILQ = .FALSE.
-         ICOMPQ = 1
-      ELSE IF( LSAME( COMPQ, 'V' ) ) THEN
-         ILQ = .TRUE.
-         ICOMPQ = 2
-      ELSE IF( LSAME( COMPQ, 'I' ) ) THEN
-         ILQ = .TRUE.
-         ICOMPQ = 3
-      ELSE
-         ICOMPQ = 0
-      END IF
-*
-*     Decode COMPZ
-*
-      IF( LSAME( COMPZ, 'N' ) ) THEN
-         ILZ = .FALSE.
-         ICOMPZ = 1
-      ELSE IF( LSAME( COMPZ, 'V' ) ) THEN
-         ILZ = .TRUE.
-         ICOMPZ = 2
-      ELSE IF( LSAME( COMPZ, 'I' ) ) THEN
-         ILZ = .TRUE.
-         ICOMPZ = 3
-      ELSE
-         ICOMPZ = 0
-      END IF
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( ICOMPQ.LE.0 ) THEN
-         INFO = -1
-      ELSE IF( ICOMPZ.LE.0 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ILO.LT.1 ) THEN
-         INFO = -4
-      ELSE IF( IHI.GT.N .OR. IHI.LT.ILO-1 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -9
-      ELSE IF( ( ILQ .AND. LDQ.LT.N ) .OR. LDQ.LT.1 ) THEN
-         INFO = -11
-      ELSE IF( ( ILZ .AND. LDZ.LT.N ) .OR. LDZ.LT.1 ) THEN
-         INFO = -13
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGGHRD', -INFO )
-         RETURN
-      END IF
-*
-*     Initialize Q and Z if desired.
-*
-      IF( ICOMPQ.EQ.3 )
-     $   CALL SLASET( 'Full', N, N, ZERO, ONE, Q, LDQ )
-      IF( ICOMPZ.EQ.3 )
-     $   CALL SLASET( 'Full', N, N, ZERO, ONE, Z, LDZ )
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 )
-     $   RETURN
-*
-*     Zero out lower triangle of B
-*
-      DO 20 JCOL = 1, N - 1
-         DO 10 JROW = JCOL + 1, N
-            B( JROW, JCOL ) = ZERO
-   10    CONTINUE
-   20 CONTINUE
-*
-*     Reduce A and B
-*
-      DO 40 JCOL = ILO, IHI - 2
-*
-         DO 30 JROW = IHI, JCOL + 2, -1
-*
-*           Step 1: rotate rows JROW-1, JROW to kill A(JROW,JCOL)
-*
-            TEMP = A( JROW-1, JCOL )
-            CALL SLARTG( TEMP, A( JROW, JCOL ), C, S,
-     $                   A( JROW-1, JCOL ) )
-            A( JROW, JCOL ) = ZERO
-            CALL SROT( N-JCOL, A( JROW-1, JCOL+1 ), LDA,
-     $                 A( JROW, JCOL+1 ), LDA, C, S )
-            CALL SROT( N+2-JROW, B( JROW-1, JROW-1 ), LDB,
-     $                 B( JROW, JROW-1 ), LDB, C, S )
-            IF( ILQ )
-     $         CALL SROT( N, Q( 1, JROW-1 ), 1, Q( 1, JROW ), 1, C, S )
-*
-*           Step 2: rotate columns JROW, JROW-1 to kill B(JROW,JROW-1)
-*
-            TEMP = B( JROW, JROW )
-            CALL SLARTG( TEMP, B( JROW, JROW-1 ), C, S,
-     $                   B( JROW, JROW ) )
-            B( JROW, JROW-1 ) = ZERO
-            CALL SROT( IHI, A( 1, JROW ), 1, A( 1, JROW-1 ), 1, C, S )
-            CALL SROT( JROW-1, B( 1, JROW ), 1, B( 1, JROW-1 ), 1, C,
-     $                 S )
-            IF( ILZ )
-     $         CALL SROT( N, Z( 1, JROW ), 1, Z( 1, JROW-1 ), 1, C, S )
-   30    CONTINUE
-   40 CONTINUE
-*
-      RETURN
-*
-*     End of SGGHRD
-*
-      END
--- a/libcruft/lapack/sgtsv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,262 +0,0 @@
-      SUBROUTINE SGTSV( N, NRHS, DL, D, DU, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      REAL               B( LDB, * ), D( * ), DL( * ), DU( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGTSV  solves the equation
-*
-*     A*X = B,
-*
-*  where A is an n by n tridiagonal matrix, by Gaussian elimination with
-*  partial pivoting.
-*
-*  Note that the equation  A'*X = B  may be solved by interchanging the
-*  order of the arguments DU and DL.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  DL      (input/output) REAL array, dimension (N-1)
-*          On entry, DL must contain the (n-1) sub-diagonal elements of
-*          A.
-*
-*          On exit, DL is overwritten by the (n-2) elements of the
-*          second super-diagonal of the upper triangular matrix U from
-*          the LU factorization of A, in DL(1), ..., DL(n-2).
-*
-*  D       (input/output) REAL array, dimension (N)
-*          On entry, D must contain the diagonal elements of A.
-*
-*          On exit, D is overwritten by the n diagonal elements of U.
-*
-*  DU      (input/output) REAL array, dimension (N-1)
-*          On entry, DU must contain the (n-1) super-diagonal elements
-*          of A.
-*
-*          On exit, DU is overwritten by the (n-1) elements of the first
-*          super-diagonal of U.
-*
-*  B       (input/output) REAL array, dimension (LDB,NRHS)
-*          On entry, the N by NRHS matrix of right hand side matrix B.
-*          On exit, if INFO = 0, the N by NRHS solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = i, U(i,i) is exactly zero, and the solution
-*               has not been computed.  The factorization has not been
-*               completed unless i = N.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      REAL               FACT, TEMP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGTSV ', -INFO )
-         RETURN
-      END IF
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( NRHS.EQ.1 ) THEN
-         DO 10 I = 1, N - 2
-            IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
-*
-*              No row interchange required
-*
-               IF( D( I ).NE.ZERO ) THEN
-                  FACT = DL( I ) / D( I )
-                  D( I+1 ) = D( I+1 ) - FACT*DU( I )
-                  B( I+1, 1 ) = B( I+1, 1 ) - FACT*B( I, 1 )
-               ELSE
-                  INFO = I
-                  RETURN
-               END IF
-               DL( I ) = ZERO
-            ELSE
-*
-*              Interchange rows I and I+1
-*
-               FACT = D( I ) / DL( I )
-               D( I ) = DL( I )
-               TEMP = D( I+1 )
-               D( I+1 ) = DU( I ) - FACT*TEMP
-               DL( I ) = DU( I+1 )
-               DU( I+1 ) = -FACT*DL( I )
-               DU( I ) = TEMP
-               TEMP = B( I, 1 )
-               B( I, 1 ) = B( I+1, 1 )
-               B( I+1, 1 ) = TEMP - FACT*B( I+1, 1 )
-            END IF
-   10    CONTINUE
-         IF( N.GT.1 ) THEN
-            I = N - 1
-            IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
-               IF( D( I ).NE.ZERO ) THEN
-                  FACT = DL( I ) / D( I )
-                  D( I+1 ) = D( I+1 ) - FACT*DU( I )
-                  B( I+1, 1 ) = B( I+1, 1 ) - FACT*B( I, 1 )
-               ELSE
-                  INFO = I
-                  RETURN
-               END IF
-            ELSE
-               FACT = D( I ) / DL( I )
-               D( I ) = DL( I )
-               TEMP = D( I+1 )
-               D( I+1 ) = DU( I ) - FACT*TEMP
-               DU( I ) = TEMP
-               TEMP = B( I, 1 )
-               B( I, 1 ) = B( I+1, 1 )
-               B( I+1, 1 ) = TEMP - FACT*B( I+1, 1 )
-            END IF
-         END IF
-         IF( D( N ).EQ.ZERO ) THEN
-            INFO = N
-            RETURN
-         END IF
-      ELSE
-         DO 40 I = 1, N - 2
-            IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
-*
-*              No row interchange required
-*
-               IF( D( I ).NE.ZERO ) THEN
-                  FACT = DL( I ) / D( I )
-                  D( I+1 ) = D( I+1 ) - FACT*DU( I )
-                  DO 20 J = 1, NRHS
-                     B( I+1, J ) = B( I+1, J ) - FACT*B( I, J )
-   20             CONTINUE
-               ELSE
-                  INFO = I
-                  RETURN
-               END IF
-               DL( I ) = ZERO
-            ELSE
-*
-*              Interchange rows I and I+1
-*
-               FACT = D( I ) / DL( I )
-               D( I ) = DL( I )
-               TEMP = D( I+1 )
-               D( I+1 ) = DU( I ) - FACT*TEMP
-               DL( I ) = DU( I+1 )
-               DU( I+1 ) = -FACT*DL( I )
-               DU( I ) = TEMP
-               DO 30 J = 1, NRHS
-                  TEMP = B( I, J )
-                  B( I, J ) = B( I+1, J )
-                  B( I+1, J ) = TEMP - FACT*B( I+1, J )
-   30          CONTINUE
-            END IF
-   40    CONTINUE
-         IF( N.GT.1 ) THEN
-            I = N - 1
-            IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
-               IF( D( I ).NE.ZERO ) THEN
-                  FACT = DL( I ) / D( I )
-                  D( I+1 ) = D( I+1 ) - FACT*DU( I )
-                  DO 50 J = 1, NRHS
-                     B( I+1, J ) = B( I+1, J ) - FACT*B( I, J )
-   50             CONTINUE
-               ELSE
-                  INFO = I
-                  RETURN
-               END IF
-            ELSE
-               FACT = D( I ) / DL( I )
-               D( I ) = DL( I )
-               TEMP = D( I+1 )
-               D( I+1 ) = DU( I ) - FACT*TEMP
-               DU( I ) = TEMP
-               DO 60 J = 1, NRHS
-                  TEMP = B( I, J )
-                  B( I, J ) = B( I+1, J )
-                  B( I+1, J ) = TEMP - FACT*B( I+1, J )
-   60          CONTINUE
-            END IF
-         END IF
-         IF( D( N ).EQ.ZERO ) THEN
-            INFO = N
-            RETURN
-         END IF
-      END IF
-*
-*     Back solve with the matrix U from the factorization.
-*
-      IF( NRHS.LE.2 ) THEN
-         J = 1
-   70    CONTINUE
-         B( N, J ) = B( N, J ) / D( N )
-         IF( N.GT.1 )
-     $      B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / D( N-1 )
-         DO 80 I = N - 2, 1, -1
-            B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DL( I )*
-     $                  B( I+2, J ) ) / D( I )
-   80    CONTINUE
-         IF( J.LT.NRHS ) THEN
-            J = J + 1
-            GO TO 70
-         END IF
-      ELSE
-         DO 100 J = 1, NRHS
-            B( N, J ) = B( N, J ) / D( N )
-            IF( N.GT.1 )
-     $         B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) /
-     $                       D( N-1 )
-            DO 90 I = N - 2, 1, -1
-               B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DL( I )*
-     $                     B( I+2, J ) ) / D( I )
-   90       CONTINUE
-  100    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of SGTSV
-*
-      END
--- a/libcruft/lapack/sgttrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,168 +0,0 @@
-      SUBROUTINE SGTTRF( N, DL, D, DU, DU2, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      REAL               D( * ), DL( * ), DU( * ), DU2( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGTTRF computes an LU factorization of a real tridiagonal matrix A
-*  using elimination with partial pivoting and row interchanges.
-*
-*  The factorization has the form
-*     A = L * U
-*  where L is a product of permutation and unit lower bidiagonal
-*  matrices and U is upper triangular with nonzeros in only the main
-*  diagonal and first two superdiagonals.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  DL      (input/output) REAL array, dimension (N-1)
-*          On entry, DL must contain the (n-1) sub-diagonal elements of
-*          A.
-*
-*          On exit, DL is overwritten by the (n-1) multipliers that
-*          define the matrix L from the LU factorization of A.
-*
-*  D       (input/output) REAL array, dimension (N)
-*          On entry, D must contain the diagonal elements of A.
-*
-*          On exit, D is overwritten by the n diagonal elements of the
-*          upper triangular matrix U from the LU factorization of A.
-*
-*  DU      (input/output) REAL array, dimension (N-1)
-*          On entry, DU must contain the (n-1) super-diagonal elements
-*          of A.
-*
-*          On exit, DU is overwritten by the (n-1) elements of the first
-*          super-diagonal of U.
-*
-*  DU2     (output) REAL array, dimension (N-2)
-*          On exit, DU2 is overwritten by the (n-2) elements of the
-*          second super-diagonal of U.
-*
-*  IPIV    (output) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= n, row i of the matrix was
-*          interchanged with row IPIV(i).  IPIV(i) will always be either
-*          i or i+1; IPIV(i) = i indicates a row interchange was not
-*          required.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -k, the k-th argument had an illegal value
-*          > 0:  if INFO = k, U(k,k) is exactly zero. The factorization
-*                has been completed, but the factor U is exactly
-*                singular, and division by zero will occur if it is used
-*                to solve a system of equations.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      REAL               FACT, TEMP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-         CALL XERBLA( 'SGTTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Initialize IPIV(i) = i and DU2(I) = 0
-*
-      DO 10 I = 1, N
-         IPIV( I ) = I
-   10 CONTINUE
-      DO 20 I = 1, N - 2
-         DU2( I ) = ZERO
-   20 CONTINUE
-*
-      DO 30 I = 1, N - 2
-         IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
-*
-*           No row interchange required, eliminate DL(I)
-*
-            IF( D( I ).NE.ZERO ) THEN
-               FACT = DL( I ) / D( I )
-               DL( I ) = FACT
-               D( I+1 ) = D( I+1 ) - FACT*DU( I )
-            END IF
-         ELSE
-*
-*           Interchange rows I and I+1, eliminate DL(I)
-*
-            FACT = D( I ) / DL( I )
-            D( I ) = DL( I )
-            DL( I ) = FACT
-            TEMP = DU( I )
-            DU( I ) = D( I+1 )
-            D( I+1 ) = TEMP - FACT*D( I+1 )
-            DU2( I ) = DU( I+1 )
-            DU( I+1 ) = -FACT*DU( I+1 )
-            IPIV( I ) = I + 1
-         END IF
-   30 CONTINUE
-      IF( N.GT.1 ) THEN
-         I = N - 1
-         IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
-            IF( D( I ).NE.ZERO ) THEN
-               FACT = DL( I ) / D( I )
-               DL( I ) = FACT
-               D( I+1 ) = D( I+1 ) - FACT*DU( I )
-            END IF
-         ELSE
-            FACT = D( I ) / DL( I )
-            D( I ) = DL( I )
-            DL( I ) = FACT
-            TEMP = DU( I )
-            DU( I ) = D( I+1 )
-            D( I+1 ) = TEMP - FACT*D( I+1 )
-            IPIV( I ) = I + 1
-         END IF
-      END IF
-*
-*     Check for a zero on the diagonal of U.
-*
-      DO 40 I = 1, N
-         IF( D( I ).EQ.ZERO ) THEN
-            INFO = I
-            GO TO 50
-         END IF
-   40 CONTINUE
-   50 CONTINUE
-*
-      RETURN
-*
-*     End of SGTTRF
-*
-      END
--- a/libcruft/lapack/sgttrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,140 +0,0 @@
-      SUBROUTINE SGTTRS( TRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TRANS
-      INTEGER            INFO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      REAL               B( LDB, * ), D( * ), DL( * ), DU( * ), DU2( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGTTRS solves one of the systems of equations
-*     A*X = B  or  A'*X = B,
-*  with a tridiagonal matrix A using the LU factorization computed
-*  by SGTTRF.
-*
-*  Arguments
-*  =========
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the form of the system of equations.
-*          = 'N':  A * X = B  (No transpose)
-*          = 'T':  A'* X = B  (Transpose)
-*          = 'C':  A'* X = B  (Conjugate transpose = Transpose)
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  DL      (input) REAL array, dimension (N-1)
-*          The (n-1) multipliers that define the matrix L from the
-*          LU factorization of A.
-*
-*  D       (input) REAL array, dimension (N)
-*          The n diagonal elements of the upper triangular matrix U from
-*          the LU factorization of A.
-*
-*  DU      (input) REAL array, dimension (N-1)
-*          The (n-1) elements of the first super-diagonal of U.
-*
-*  DU2     (input) REAL array, dimension (N-2)
-*          The (n-2) elements of the second super-diagonal of U.
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= n, row i of the matrix was
-*          interchanged with row IPIV(i).  IPIV(i) will always be either
-*          i or i+1; IPIV(i) = i indicates a row interchange was not
-*          required.
-*
-*  B       (input/output) REAL array, dimension (LDB,NRHS)
-*          On entry, the matrix of right hand side vectors B.
-*          On exit, B is overwritten by the solution vectors X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            NOTRAN
-      INTEGER            ITRANS, J, JB, NB
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGTTS2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      NOTRAN = ( TRANS.EQ.'N' .OR. TRANS.EQ.'n' )
-      IF( .NOT.NOTRAN .AND. .NOT.( TRANS.EQ.'T' .OR. TRANS.EQ.
-     $    't' ) .AND. .NOT.( TRANS.EQ.'C' .OR. TRANS.EQ.'c' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDB.LT.MAX( N, 1 ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SGTTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-*     Decode TRANS
-*
-      IF( NOTRAN ) THEN
-         ITRANS = 0
-      ELSE
-         ITRANS = 1
-      END IF
-*
-*     Determine the number of right-hand sides to solve at a time.
-*
-      IF( NRHS.EQ.1 ) THEN
-         NB = 1
-      ELSE
-         NB = MAX( 1, ILAENV( 1, 'SGTTRS', TRANS, N, NRHS, -1, -1 ) )
-      END IF
-*
-      IF( NB.GE.NRHS ) THEN
-         CALL SGTTS2( ITRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB )
-      ELSE
-         DO 10 J = 1, NRHS, NB
-            JB = MIN( NRHS-J+1, NB )
-            CALL SGTTS2( ITRANS, N, JB, DL, D, DU, DU2, IPIV, B( 1, J ),
-     $                   LDB )
-   10    CONTINUE
-      END IF
-*
-*     End of SGTTRS
-*
-      END
--- a/libcruft/lapack/sgtts2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,196 +0,0 @@
-      SUBROUTINE SGTTS2( ITRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            ITRANS, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      REAL               B( LDB, * ), D( * ), DL( * ), DU( * ), DU2( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SGTTS2 solves one of the systems of equations
-*     A*X = B  or  A'*X = B,
-*  with a tridiagonal matrix A using the LU factorization computed
-*  by SGTTRF.
-*
-*  Arguments
-*  =========
-*
-*  ITRANS  (input) INTEGER
-*          Specifies the form of the system of equations.
-*          = 0:  A * X = B  (No transpose)
-*          = 1:  A'* X = B  (Transpose)
-*          = 2:  A'* X = B  (Conjugate transpose = Transpose)
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  DL      (input) REAL array, dimension (N-1)
-*          The (n-1) multipliers that define the matrix L from the
-*          LU factorization of A.
-*
-*  D       (input) REAL array, dimension (N)
-*          The n diagonal elements of the upper triangular matrix U from
-*          the LU factorization of A.
-*
-*  DU      (input) REAL array, dimension (N-1)
-*          The (n-1) elements of the first super-diagonal of U.
-*
-*  DU2     (input) REAL array, dimension (N-2)
-*          The (n-2) elements of the second super-diagonal of U.
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= n, row i of the matrix was
-*          interchanged with row IPIV(i).  IPIV(i) will always be either
-*          i or i+1; IPIV(i) = i indicates a row interchange was not
-*          required.
-*
-*  B       (input/output) REAL array, dimension (LDB,NRHS)
-*          On entry, the matrix of right hand side vectors B.
-*          On exit, B is overwritten by the solution vectors X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, IP, J
-      REAL               TEMP
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      IF( ITRANS.EQ.0 ) THEN
-*
-*        Solve A*X = B using the LU factorization of A,
-*        overwriting each right hand side vector with its solution.
-*
-         IF( NRHS.LE.1 ) THEN
-            J = 1
-   10       CONTINUE
-*
-*           Solve L*x = b.
-*
-            DO 20 I = 1, N - 1
-               IP = IPIV( I )
-               TEMP = B( I+1-IP+I, J ) - DL( I )*B( IP, J )
-               B( I, J ) = B( IP, J )
-               B( I+1, J ) = TEMP
-   20       CONTINUE
-*
-*           Solve U*x = b.
-*
-            B( N, J ) = B( N, J ) / D( N )
-            IF( N.GT.1 )
-     $         B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) /
-     $                       D( N-1 )
-            DO 30 I = N - 2, 1, -1
-               B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DU2( I )*
-     $                     B( I+2, J ) ) / D( I )
-   30       CONTINUE
-            IF( J.LT.NRHS ) THEN
-               J = J + 1
-               GO TO 10
-            END IF
-         ELSE
-            DO 60 J = 1, NRHS
-*
-*              Solve L*x = b.
-*
-               DO 40 I = 1, N - 1
-                  IF( IPIV( I ).EQ.I ) THEN
-                     B( I+1, J ) = B( I+1, J ) - DL( I )*B( I, J )
-                  ELSE
-                     TEMP = B( I, J )
-                     B( I, J ) = B( I+1, J )
-                     B( I+1, J ) = TEMP - DL( I )*B( I, J )
-                  END IF
-   40          CONTINUE
-*
-*              Solve U*x = b.
-*
-               B( N, J ) = B( N, J ) / D( N )
-               IF( N.GT.1 )
-     $            B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) /
-     $                          D( N-1 )
-               DO 50 I = N - 2, 1, -1
-                  B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DU2( I )*
-     $                        B( I+2, J ) ) / D( I )
-   50          CONTINUE
-   60       CONTINUE
-         END IF
-      ELSE
-*
-*        Solve A' * X = B.
-*
-         IF( NRHS.LE.1 ) THEN
-*
-*           Solve U'*x = b.
-*
-            J = 1
-   70       CONTINUE
-            B( 1, J ) = B( 1, J ) / D( 1 )
-            IF( N.GT.1 )
-     $         B( 2, J ) = ( B( 2, J )-DU( 1 )*B( 1, J ) ) / D( 2 )
-            DO 80 I = 3, N
-               B( I, J ) = ( B( I, J )-DU( I-1 )*B( I-1, J )-DU2( I-2 )*
-     $                     B( I-2, J ) ) / D( I )
-   80       CONTINUE
-*
-*           Solve L'*x = b.
-*
-            DO 90 I = N - 1, 1, -1
-               IP = IPIV( I )
-               TEMP = B( I, J ) - DL( I )*B( I+1, J )
-               B( I, J ) = B( IP, J )
-               B( IP, J ) = TEMP
-   90       CONTINUE
-            IF( J.LT.NRHS ) THEN
-               J = J + 1
-               GO TO 70
-            END IF
-*
-         ELSE
-            DO 120 J = 1, NRHS
-*
-*              Solve U'*x = b.
-*
-               B( 1, J ) = B( 1, J ) / D( 1 )
-               IF( N.GT.1 )
-     $            B( 2, J ) = ( B( 2, J )-DU( 1 )*B( 1, J ) ) / D( 2 )
-               DO 100 I = 3, N
-                  B( I, J ) = ( B( I, J )-DU( I-1 )*B( I-1, J )-
-     $                        DU2( I-2 )*B( I-2, J ) ) / D( I )
-  100          CONTINUE
-               DO 110 I = N - 1, 1, -1
-                  IF( IPIV( I ).EQ.I ) THEN
-                     B( I, J ) = B( I, J ) - DL( I )*B( I+1, J )
-                  ELSE
-                     TEMP = B( I+1, J )
-                     B( I+1, J ) = B( I, J ) - DL( I )*TEMP
-                     B( I, J ) = TEMP
-                  END IF
-  110          CONTINUE
-  120       CONTINUE
-         END IF
-      END IF
-*
-*     End of SGTTS2
-*
-      END
--- a/libcruft/lapack/shgeqz.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1243 +0,0 @@
-      SUBROUTINE SHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT,
-     $                   ALPHAR, ALPHAI, BETA, Q, LDQ, Z, LDZ, WORK,
-     $                   LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPQ, COMPZ, JOB
-      INTEGER            IHI, ILO, INFO, LDH, LDQ, LDT, LDZ, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      REAL               ALPHAI( * ), ALPHAR( * ), BETA( * ),
-     $                   H( LDH, * ), Q( LDQ, * ), T( LDT, * ),
-     $                   WORK( * ), Z( LDZ, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SHGEQZ computes the eigenvalues of a real matrix pair (H,T),
-*  where H is an upper Hessenberg matrix and T is upper triangular,
-*  using the double-shift QZ method.
-*  Matrix pairs of this type are produced by the reduction to
-*  generalized upper Hessenberg form of a real matrix pair (A,B):
-*
-*     A = Q1*H*Z1**T,  B = Q1*T*Z1**T,
-*
-*  as computed by SGGHRD.
-*
-*  If JOB='S', then the Hessenberg-triangular pair (H,T) is
-*  also reduced to generalized Schur form,
-*  
-*     H = Q*S*Z**T,  T = Q*P*Z**T,
-*  
-*  where Q and Z are orthogonal matrices, P is an upper triangular
-*  matrix, and S is a quasi-triangular matrix with 1-by-1 and 2-by-2
-*  diagonal blocks.
-*
-*  The 1-by-1 blocks correspond to real eigenvalues of the matrix pair
-*  (H,T) and the 2-by-2 blocks correspond to complex conjugate pairs of
-*  eigenvalues.
-*
-*  Additionally, the 2-by-2 upper triangular diagonal blocks of P
-*  corresponding to 2-by-2 blocks of S are reduced to positive diagonal
-*  form, i.e., if S(j+1,j) is non-zero, then P(j+1,j) = P(j,j+1) = 0,
-*  P(j,j) > 0, and P(j+1,j+1) > 0.
-*
-*  Optionally, the orthogonal matrix Q from the generalized Schur
-*  factorization may be postmultiplied into an input matrix Q1, and the
-*  orthogonal matrix Z may be postmultiplied into an input matrix Z1.
-*  If Q1 and Z1 are the orthogonal matrices from SGGHRD that reduced
-*  the matrix pair (A,B) to generalized upper Hessenberg form, then the
-*  output matrices Q1*Q and Z1*Z are the orthogonal factors from the
-*  generalized Schur factorization of (A,B):
-*
-*     A = (Q1*Q)*S*(Z1*Z)**T,  B = (Q1*Q)*P*(Z1*Z)**T.
-*  
-*  To avoid overflow, eigenvalues of the matrix pair (H,T) (equivalently,
-*  of (A,B)) are computed as a pair of values (alpha,beta), where alpha is
-*  complex and beta real.
-*  If beta is nonzero, lambda = alpha / beta is an eigenvalue of the
-*  generalized nonsymmetric eigenvalue problem (GNEP)
-*     A*x = lambda*B*x
-*  and if alpha is nonzero, mu = beta / alpha is an eigenvalue of the
-*  alternate form of the GNEP
-*     mu*A*y = B*y.
-*  Real eigenvalues can be read directly from the generalized Schur
-*  form: 
-*    alpha = S(i,i), beta = P(i,i).
-*
-*  Ref: C.B. Moler & G.W. Stewart, "An Algorithm for Generalized Matrix
-*       Eigenvalue Problems", SIAM J. Numer. Anal., 10(1973),
-*       pp. 241--256.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          = 'E': Compute eigenvalues only;
-*          = 'S': Compute eigenvalues and the Schur form. 
-*
-*  COMPQ   (input) CHARACTER*1
-*          = 'N': Left Schur vectors (Q) are not computed;
-*          = 'I': Q is initialized to the unit matrix and the matrix Q
-*                 of left Schur vectors of (H,T) is returned;
-*          = 'V': Q must contain an orthogonal matrix Q1 on entry and
-*                 the product Q1*Q is returned.
-*
-*  COMPZ   (input) CHARACTER*1
-*          = 'N': Right Schur vectors (Z) are not computed;
-*          = 'I': Z is initialized to the unit matrix and the matrix Z
-*                 of right Schur vectors of (H,T) is returned;
-*          = 'V': Z must contain an orthogonal matrix Z1 on entry and
-*                 the product Z1*Z is returned.
-*
-*  N       (input) INTEGER
-*          The order of the matrices H, T, Q, and Z.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          ILO and IHI mark the rows and columns of H which are in
-*          Hessenberg form.  It is assumed that A is already upper
-*          triangular in rows and columns 1:ILO-1 and IHI+1:N.
-*          If N > 0, 1 <= ILO <= IHI <= N; if N = 0, ILO=1 and IHI=0.
-*
-*  H       (input/output) REAL array, dimension (LDH, N)
-*          On entry, the N-by-N upper Hessenberg matrix H.
-*          On exit, if JOB = 'S', H contains the upper quasi-triangular
-*          matrix S from the generalized Schur factorization;
-*          2-by-2 diagonal blocks (corresponding to complex conjugate
-*          pairs of eigenvalues) are returned in standard form, with
-*          H(i,i) = H(i+1,i+1) and H(i+1,i)*H(i,i+1) < 0.
-*          If JOB = 'E', the diagonal blocks of H match those of S, but
-*          the rest of H is unspecified.
-*
-*  LDH     (input) INTEGER
-*          The leading dimension of the array H.  LDH >= max( 1, N ).
-*
-*  T       (input/output) REAL array, dimension (LDT, N)
-*          On entry, the N-by-N upper triangular matrix T.
-*          On exit, if JOB = 'S', T contains the upper triangular
-*          matrix P from the generalized Schur factorization;
-*          2-by-2 diagonal blocks of P corresponding to 2-by-2 blocks of S
-*          are reduced to positive diagonal form, i.e., if H(j+1,j) is
-*          non-zero, then T(j+1,j) = T(j,j+1) = 0, T(j,j) > 0, and
-*          T(j+1,j+1) > 0.
-*          If JOB = 'E', the diagonal blocks of T match those of P, but
-*          the rest of T is unspecified.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T.  LDT >= max( 1, N ).
-*
-*  ALPHAR  (output) REAL array, dimension (N)
-*          The real parts of each scalar alpha defining an eigenvalue
-*          of GNEP.
-*
-*  ALPHAI  (output) REAL array, dimension (N)
-*          The imaginary parts of each scalar alpha defining an
-*          eigenvalue of GNEP.
-*          If ALPHAI(j) is zero, then the j-th eigenvalue is real; if
-*          positive, then the j-th and (j+1)-st eigenvalues are a
-*          complex conjugate pair, with ALPHAI(j+1) = -ALPHAI(j).
-*
-*  BETA    (output) REAL array, dimension (N)
-*          The scalars beta that define the eigenvalues of GNEP.
-*          Together, the quantities alpha = (ALPHAR(j),ALPHAI(j)) and
-*          beta = BETA(j) represent the j-th eigenvalue of the matrix
-*          pair (A,B), in one of the forms lambda = alpha/beta or
-*          mu = beta/alpha.  Since either lambda or mu may overflow,
-*          they should not, in general, be computed.
-*
-*  Q       (input/output) REAL array, dimension (LDQ, N)
-*          On entry, if COMPZ = 'V', the orthogonal matrix Q1 used in
-*          the reduction of (A,B) to generalized Hessenberg form.
-*          On exit, if COMPZ = 'I', the orthogonal matrix of left Schur
-*          vectors of (H,T), and if COMPZ = 'V', the orthogonal matrix
-*          of left Schur vectors of (A,B).
-*          Not referenced if COMPZ = 'N'.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.  LDQ >= 1.
-*          If COMPQ='V' or 'I', then LDQ >= N.
-*
-*  Z       (input/output) REAL array, dimension (LDZ, N)
-*          On entry, if COMPZ = 'V', the orthogonal matrix Z1 used in
-*          the reduction of (A,B) to generalized Hessenberg form.
-*          On exit, if COMPZ = 'I', the orthogonal matrix of
-*          right Schur vectors of (H,T), and if COMPZ = 'V', the
-*          orthogonal matrix of right Schur vectors of (A,B).
-*          Not referenced if COMPZ = 'N'.
-*
-*  LDZ     (input) INTEGER
-*          The leading dimension of the array Z.  LDZ >= 1.
-*          If COMPZ='V' or 'I', then LDZ >= N.
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO >= 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,N).
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          = 1,...,N: the QZ iteration did not converge.  (H,T) is not
-*                     in Schur form, but ALPHAR(i), ALPHAI(i), and
-*                     BETA(i), i=INFO+1,...,N should be correct.
-*          = N+1,...,2*N: the shift calculation failed.  (H,T) is not
-*                     in Schur form, but ALPHAR(i), ALPHAI(i), and
-*                     BETA(i), i=INFO-N+1,...,N should be correct.
-*
-*  Further Details
-*  ===============
-*
-*  Iteration counters:
-*
-*  JITER  -- counts iterations.
-*  IITER  -- counts iterations run since ILAST was last
-*            changed.  This is therefore reset only when a 1-by-1 or
-*            2-by-2 block deflates off the bottom.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-*    $                     SAFETY = 1.0E+0 )
-      REAL               HALF, ZERO, ONE, SAFETY
-      PARAMETER          ( HALF = 0.5E+0, ZERO = 0.0E+0, ONE = 1.0E+0,
-     $                   SAFETY = 1.0E+2 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ILAZR2, ILAZRO, ILPIVT, ILQ, ILSCHR, ILZ,
-     $                   LQUERY
-      INTEGER            ICOMPQ, ICOMPZ, IFIRST, IFRSTM, IITER, ILAST,
-     $                   ILASTM, IN, ISCHUR, ISTART, J, JC, JCH, JITER,
-     $                   JR, MAXIT
-      REAL               A11, A12, A1I, A1R, A21, A22, A2I, A2R, AD11,
-     $                   AD11L, AD12, AD12L, AD21, AD21L, AD22, AD22L,
-     $                   AD32L, AN, ANORM, ASCALE, ATOL, B11, B1A, B1I,
-     $                   B1R, B22, B2A, B2I, B2R, BN, BNORM, BSCALE,
-     $                   BTOL, C, C11I, C11R, C12, C21, C22I, C22R, CL,
-     $                   CQ, CR, CZ, ESHIFT, S, S1, S1INV, S2, SAFMAX,
-     $                   SAFMIN, SCALE, SL, SQI, SQR, SR, SZI, SZR, T1,
-     $                   TAU, TEMP, TEMP2, TEMPI, TEMPR, U1, U12, U12L,
-     $                   U2, ULP, VS, W11, W12, W21, W22, WABS, WI, WR,
-     $                   WR2
-*     ..
-*     .. Local Arrays ..
-      REAL               V( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               SLAMCH, SLANHS, SLAPY2, SLAPY3
-      EXTERNAL           LSAME, SLAMCH, SLANHS, SLAPY2, SLAPY3
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLAG2, SLARFG, SLARTG, SLASET, SLASV2, SROT,
-     $                   XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, REAL, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode JOB, COMPQ, COMPZ
-*
-      IF( LSAME( JOB, 'E' ) ) THEN
-         ILSCHR = .FALSE.
-         ISCHUR = 1
-      ELSE IF( LSAME( JOB, 'S' ) ) THEN
-         ILSCHR = .TRUE.
-         ISCHUR = 2
-      ELSE
-         ISCHUR = 0
-      END IF
-*
-      IF( LSAME( COMPQ, 'N' ) ) THEN
-         ILQ = .FALSE.
-         ICOMPQ = 1
-      ELSE IF( LSAME( COMPQ, 'V' ) ) THEN
-         ILQ = .TRUE.
-         ICOMPQ = 2
-      ELSE IF( LSAME( COMPQ, 'I' ) ) THEN
-         ILQ = .TRUE.
-         ICOMPQ = 3
-      ELSE
-         ICOMPQ = 0
-      END IF
-*
-      IF( LSAME( COMPZ, 'N' ) ) THEN
-         ILZ = .FALSE.
-         ICOMPZ = 1
-      ELSE IF( LSAME( COMPZ, 'V' ) ) THEN
-         ILZ = .TRUE.
-         ICOMPZ = 2
-      ELSE IF( LSAME( COMPZ, 'I' ) ) THEN
-         ILZ = .TRUE.
-         ICOMPZ = 3
-      ELSE
-         ICOMPZ = 0
-      END IF
-*
-*     Check Argument Values
-*
-      INFO = 0
-      WORK( 1 ) = MAX( 1, N )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( ISCHUR.EQ.0 ) THEN
-         INFO = -1
-      ELSE IF( ICOMPQ.EQ.0 ) THEN
-         INFO = -2
-      ELSE IF( ICOMPZ.EQ.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( ILO.LT.1 ) THEN
-         INFO = -5
-      ELSE IF( IHI.GT.N .OR. IHI.LT.ILO-1 ) THEN
-         INFO = -6
-      ELSE IF( LDH.LT.N ) THEN
-         INFO = -8
-      ELSE IF( LDT.LT.N ) THEN
-         INFO = -10
-      ELSE IF( LDQ.LT.1 .OR. ( ILQ .AND. LDQ.LT.N ) ) THEN
-         INFO = -15
-      ELSE IF( LDZ.LT.1 .OR. ( ILZ .AND. LDZ.LT.N ) ) THEN
-         INFO = -17
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -19
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SHGEQZ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 ) THEN
-         WORK( 1 ) = REAL( 1 )
-         RETURN
-      END IF
-*
-*     Initialize Q and Z
-*
-      IF( ICOMPQ.EQ.3 )
-     $   CALL SLASET( 'Full', N, N, ZERO, ONE, Q, LDQ )
-      IF( ICOMPZ.EQ.3 )
-     $   CALL SLASET( 'Full', N, N, ZERO, ONE, Z, LDZ )
-*
-*     Machine Constants
-*
-      IN = IHI + 1 - ILO
-      SAFMIN = SLAMCH( 'S' )
-      SAFMAX = ONE / SAFMIN
-      ULP = SLAMCH( 'E' )*SLAMCH( 'B' )
-      ANORM = SLANHS( 'F', IN, H( ILO, ILO ), LDH, WORK )
-      BNORM = SLANHS( 'F', IN, T( ILO, ILO ), LDT, WORK )
-      ATOL = MAX( SAFMIN, ULP*ANORM )
-      BTOL = MAX( SAFMIN, ULP*BNORM )
-      ASCALE = ONE / MAX( SAFMIN, ANORM )
-      BSCALE = ONE / MAX( SAFMIN, BNORM )
-*
-*     Set Eigenvalues IHI+1:N
-*
-      DO 30 J = IHI + 1, N
-         IF( T( J, J ).LT.ZERO ) THEN
-            IF( ILSCHR ) THEN
-               DO 10 JR = 1, J
-                  H( JR, J ) = -H( JR, J )
-                  T( JR, J ) = -T( JR, J )
-   10          CONTINUE
-            ELSE
-               H( J, J ) = -H( J, J )
-               T( J, J ) = -T( J, J )
-            END IF
-            IF( ILZ ) THEN
-               DO 20 JR = 1, N
-                  Z( JR, J ) = -Z( JR, J )
-   20          CONTINUE
-            END IF
-         END IF
-         ALPHAR( J ) = H( J, J )
-         ALPHAI( J ) = ZERO
-         BETA( J ) = T( J, J )
-   30 CONTINUE
-*
-*     If IHI < ILO, skip QZ steps
-*
-      IF( IHI.LT.ILO )
-     $   GO TO 380
-*
-*     MAIN QZ ITERATION LOOP
-*
-*     Initialize dynamic indices
-*
-*     Eigenvalues ILAST+1:N have been found.
-*        Column operations modify rows IFRSTM:whatever.
-*        Row operations modify columns whatever:ILASTM.
-*
-*     If only eigenvalues are being computed, then
-*        IFRSTM is the row of the last splitting row above row ILAST;
-*        this is always at least ILO.
-*     IITER counts iterations since the last eigenvalue was found,
-*        to tell when to use an extraordinary shift.
-*     MAXIT is the maximum number of QZ sweeps allowed.
-*
-      ILAST = IHI
-      IF( ILSCHR ) THEN
-         IFRSTM = 1
-         ILASTM = N
-      ELSE
-         IFRSTM = ILO
-         ILASTM = IHI
-      END IF
-      IITER = 0
-      ESHIFT = ZERO
-      MAXIT = 30*( IHI-ILO+1 )
-*
-      DO 360 JITER = 1, MAXIT
-*
-*        Split the matrix if possible.
-*
-*        Two tests:
-*           1: H(j,j-1)=0  or  j=ILO
-*           2: T(j,j)=0
-*
-         IF( ILAST.EQ.ILO ) THEN
-*
-*           Special case: j=ILAST
-*
-            GO TO 80
-         ELSE
-            IF( ABS( H( ILAST, ILAST-1 ) ).LE.ATOL ) THEN
-               H( ILAST, ILAST-1 ) = ZERO
-               GO TO 80
-            END IF
-         END IF
-*
-         IF( ABS( T( ILAST, ILAST ) ).LE.BTOL ) THEN
-            T( ILAST, ILAST ) = ZERO
-            GO TO 70
-         END IF
-*
-*        General case: j<ILAST
-*
-         DO 60 J = ILAST - 1, ILO, -1
-*
-*           Test 1: for H(j,j-1)=0 or j=ILO
-*
-            IF( J.EQ.ILO ) THEN
-               ILAZRO = .TRUE.
-            ELSE
-               IF( ABS( H( J, J-1 ) ).LE.ATOL ) THEN
-                  H( J, J-1 ) = ZERO
-                  ILAZRO = .TRUE.
-               ELSE
-                  ILAZRO = .FALSE.
-               END IF
-            END IF
-*
-*           Test 2: for T(j,j)=0
-*
-            IF( ABS( T( J, J ) ).LT.BTOL ) THEN
-               T( J, J ) = ZERO
-*
-*              Test 1a: Check for 2 consecutive small subdiagonals in A
-*
-               ILAZR2 = .FALSE.
-               IF( .NOT.ILAZRO ) THEN
-                  TEMP = ABS( H( J, J-1 ) )
-                  TEMP2 = ABS( H( J, J ) )
-                  TEMPR = MAX( TEMP, TEMP2 )
-                  IF( TEMPR.LT.ONE .AND. TEMPR.NE.ZERO ) THEN
-                     TEMP = TEMP / TEMPR
-                     TEMP2 = TEMP2 / TEMPR
-                  END IF
-                  IF( TEMP*( ASCALE*ABS( H( J+1, J ) ) ).LE.TEMP2*
-     $                ( ASCALE*ATOL ) )ILAZR2 = .TRUE.
-               END IF
-*
-*              If both tests pass (1 & 2), i.e., the leading diagonal
-*              element of B in the block is zero, split a 1x1 block off
-*              at the top. (I.e., at the J-th row/column) The leading
-*              diagonal element of the remainder can also be zero, so
-*              this may have to be done repeatedly.
-*
-               IF( ILAZRO .OR. ILAZR2 ) THEN
-                  DO 40 JCH = J, ILAST - 1
-                     TEMP = H( JCH, JCH )
-                     CALL SLARTG( TEMP, H( JCH+1, JCH ), C, S,
-     $                            H( JCH, JCH ) )
-                     H( JCH+1, JCH ) = ZERO
-                     CALL SROT( ILASTM-JCH, H( JCH, JCH+1 ), LDH,
-     $                          H( JCH+1, JCH+1 ), LDH, C, S )
-                     CALL SROT( ILASTM-JCH, T( JCH, JCH+1 ), LDT,
-     $                          T( JCH+1, JCH+1 ), LDT, C, S )
-                     IF( ILQ )
-     $                  CALL SROT( N, Q( 1, JCH ), 1, Q( 1, JCH+1 ), 1,
-     $                             C, S )
-                     IF( ILAZR2 )
-     $                  H( JCH, JCH-1 ) = H( JCH, JCH-1 )*C
-                     ILAZR2 = .FALSE.
-                     IF( ABS( T( JCH+1, JCH+1 ) ).GE.BTOL ) THEN
-                        IF( JCH+1.GE.ILAST ) THEN
-                           GO TO 80
-                        ELSE
-                           IFIRST = JCH + 1
-                           GO TO 110
-                        END IF
-                     END IF
-                     T( JCH+1, JCH+1 ) = ZERO
-   40             CONTINUE
-                  GO TO 70
-               ELSE
-*
-*                 Only test 2 passed -- chase the zero to T(ILAST,ILAST)
-*                 Then process as in the case T(ILAST,ILAST)=0
-*
-                  DO 50 JCH = J, ILAST - 1
-                     TEMP = T( JCH, JCH+1 )
-                     CALL SLARTG( TEMP, T( JCH+1, JCH+1 ), C, S,
-     $                            T( JCH, JCH+1 ) )
-                     T( JCH+1, JCH+1 ) = ZERO
-                     IF( JCH.LT.ILASTM-1 )
-     $                  CALL SROT( ILASTM-JCH-1, T( JCH, JCH+2 ), LDT,
-     $                             T( JCH+1, JCH+2 ), LDT, C, S )
-                     CALL SROT( ILASTM-JCH+2, H( JCH, JCH-1 ), LDH,
-     $                          H( JCH+1, JCH-1 ), LDH, C, S )
-                     IF( ILQ )
-     $                  CALL SROT( N, Q( 1, JCH ), 1, Q( 1, JCH+1 ), 1,
-     $                             C, S )
-                     TEMP = H( JCH+1, JCH )
-                     CALL SLARTG( TEMP, H( JCH+1, JCH-1 ), C, S,
-     $                            H( JCH+1, JCH ) )
-                     H( JCH+1, JCH-1 ) = ZERO
-                     CALL SROT( JCH+1-IFRSTM, H( IFRSTM, JCH ), 1,
-     $                          H( IFRSTM, JCH-1 ), 1, C, S )
-                     CALL SROT( JCH-IFRSTM, T( IFRSTM, JCH ), 1,
-     $                          T( IFRSTM, JCH-1 ), 1, C, S )
-                     IF( ILZ )
-     $                  CALL SROT( N, Z( 1, JCH ), 1, Z( 1, JCH-1 ), 1,
-     $                             C, S )
-   50             CONTINUE
-                  GO TO 70
-               END IF
-            ELSE IF( ILAZRO ) THEN
-*
-*              Only test 1 passed -- work on J:ILAST
-*
-               IFIRST = J
-               GO TO 110
-            END IF
-*
-*           Neither test passed -- try next J
-*
-   60    CONTINUE
-*
-*        (Drop-through is "impossible")
-*
-         INFO = N + 1
-         GO TO 420
-*
-*        T(ILAST,ILAST)=0 -- clear H(ILAST,ILAST-1) to split off a
-*        1x1 block.
-*
-   70    CONTINUE
-         TEMP = H( ILAST, ILAST )
-         CALL SLARTG( TEMP, H( ILAST, ILAST-1 ), C, S,
-     $                H( ILAST, ILAST ) )
-         H( ILAST, ILAST-1 ) = ZERO
-         CALL SROT( ILAST-IFRSTM, H( IFRSTM, ILAST ), 1,
-     $              H( IFRSTM, ILAST-1 ), 1, C, S )
-         CALL SROT( ILAST-IFRSTM, T( IFRSTM, ILAST ), 1,
-     $              T( IFRSTM, ILAST-1 ), 1, C, S )
-         IF( ILZ )
-     $      CALL SROT( N, Z( 1, ILAST ), 1, Z( 1, ILAST-1 ), 1, C, S )
-*
-*        H(ILAST,ILAST-1)=0 -- Standardize B, set ALPHAR, ALPHAI,
-*                              and BETA
-*
-   80    CONTINUE
-         IF( T( ILAST, ILAST ).LT.ZERO ) THEN
-            IF( ILSCHR ) THEN
-               DO 90 J = IFRSTM, ILAST
-                  H( J, ILAST ) = -H( J, ILAST )
-                  T( J, ILAST ) = -T( J, ILAST )
-   90          CONTINUE
-            ELSE
-               H( ILAST, ILAST ) = -H( ILAST, ILAST )
-               T( ILAST, ILAST ) = -T( ILAST, ILAST )
-            END IF
-            IF( ILZ ) THEN
-               DO 100 J = 1, N
-                  Z( J, ILAST ) = -Z( J, ILAST )
-  100          CONTINUE
-            END IF
-         END IF
-         ALPHAR( ILAST ) = H( ILAST, ILAST )
-         ALPHAI( ILAST ) = ZERO
-         BETA( ILAST ) = T( ILAST, ILAST )
-*
-*        Go to next block -- exit if finished.
-*
-         ILAST = ILAST - 1
-         IF( ILAST.LT.ILO )
-     $      GO TO 380
-*
-*        Reset counters
-*
-         IITER = 0
-         ESHIFT = ZERO
-         IF( .NOT.ILSCHR ) THEN
-            ILASTM = ILAST
-            IF( IFRSTM.GT.ILAST )
-     $         IFRSTM = ILO
-         END IF
-         GO TO 350
-*
-*        QZ step
-*
-*        This iteration only involves rows/columns IFIRST:ILAST. We
-*        assume IFIRST < ILAST, and that the diagonal of B is non-zero.
-*
-  110    CONTINUE
-         IITER = IITER + 1
-         IF( .NOT.ILSCHR ) THEN
-            IFRSTM = IFIRST
-         END IF
-*
-*        Compute single shifts.
-*
-*        At this point, IFIRST < ILAST, and the diagonal elements of
-*        T(IFIRST:ILAST,IFIRST,ILAST) are larger than BTOL (in
-*        magnitude)
-*
-         IF( ( IITER / 10 )*10.EQ.IITER ) THEN
-*
-*           Exceptional shift.  Chosen for no particularly good reason.
-*           (Single shift only.)
-*
-            IF( ( REAL( MAXIT )*SAFMIN )*ABS( H( ILAST-1, ILAST ) ).LT.
-     $          ABS( T( ILAST-1, ILAST-1 ) ) ) THEN
-               ESHIFT = ESHIFT + H( ILAST-1, ILAST ) /
-     $                  T( ILAST-1, ILAST-1 )
-            ELSE
-               ESHIFT = ESHIFT + ONE / ( SAFMIN*REAL( MAXIT ) )
-            END IF
-            S1 = ONE
-            WR = ESHIFT
-*
-         ELSE
-*
-*           Shifts based on the generalized eigenvalues of the
-*           bottom-right 2x2 block of A and B. The first eigenvalue
-*           returned by SLAG2 is the Wilkinson shift (AEP p.512),
-*
-            CALL SLAG2( H( ILAST-1, ILAST-1 ), LDH,
-     $                  T( ILAST-1, ILAST-1 ), LDT, SAFMIN*SAFETY, S1,
-     $                  S2, WR, WR2, WI )
-*
-            TEMP = MAX( S1, SAFMIN*MAX( ONE, ABS( WR ), ABS( WI ) ) )
-            IF( WI.NE.ZERO )
-     $         GO TO 200
-         END IF
-*
-*        Fiddle with shift to avoid overflow
-*
-         TEMP = MIN( ASCALE, ONE )*( HALF*SAFMAX )
-         IF( S1.GT.TEMP ) THEN
-            SCALE = TEMP / S1
-         ELSE
-            SCALE = ONE
-         END IF
-*
-         TEMP = MIN( BSCALE, ONE )*( HALF*SAFMAX )
-         IF( ABS( WR ).GT.TEMP )
-     $      SCALE = MIN( SCALE, TEMP / ABS( WR ) )
-         S1 = SCALE*S1
-         WR = SCALE*WR
-*
-*        Now check for two consecutive small subdiagonals.
-*
-         DO 120 J = ILAST - 1, IFIRST + 1, -1
-            ISTART = J
-            TEMP = ABS( S1*H( J, J-1 ) )
-            TEMP2 = ABS( S1*H( J, J )-WR*T( J, J ) )
-            TEMPR = MAX( TEMP, TEMP2 )
-            IF( TEMPR.LT.ONE .AND. TEMPR.NE.ZERO ) THEN
-               TEMP = TEMP / TEMPR
-               TEMP2 = TEMP2 / TEMPR
-            END IF
-            IF( ABS( ( ASCALE*H( J+1, J ) )*TEMP ).LE.( ASCALE*ATOL )*
-     $          TEMP2 )GO TO 130
-  120    CONTINUE
-*
-         ISTART = IFIRST
-  130    CONTINUE
-*
-*        Do an implicit single-shift QZ sweep.
-*
-*        Initial Q
-*
-         TEMP = S1*H( ISTART, ISTART ) - WR*T( ISTART, ISTART )
-         TEMP2 = S1*H( ISTART+1, ISTART )
-         CALL SLARTG( TEMP, TEMP2, C, S, TEMPR )
-*
-*        Sweep
-*
-         DO 190 J = ISTART, ILAST - 1
-            IF( J.GT.ISTART ) THEN
-               TEMP = H( J, J-1 )
-               CALL SLARTG( TEMP, H( J+1, J-1 ), C, S, H( J, J-1 ) )
-               H( J+1, J-1 ) = ZERO
-            END IF
-*
-            DO 140 JC = J, ILASTM
-               TEMP = C*H( J, JC ) + S*H( J+1, JC )
-               H( J+1, JC ) = -S*H( J, JC ) + C*H( J+1, JC )
-               H( J, JC ) = TEMP
-               TEMP2 = C*T( J, JC ) + S*T( J+1, JC )
-               T( J+1, JC ) = -S*T( J, JC ) + C*T( J+1, JC )
-               T( J, JC ) = TEMP2
-  140       CONTINUE
-            IF( ILQ ) THEN
-               DO 150 JR = 1, N
-                  TEMP = C*Q( JR, J ) + S*Q( JR, J+1 )
-                  Q( JR, J+1 ) = -S*Q( JR, J ) + C*Q( JR, J+1 )
-                  Q( JR, J ) = TEMP
-  150          CONTINUE
-            END IF
-*
-            TEMP = T( J+1, J+1 )
-            CALL SLARTG( TEMP, T( J+1, J ), C, S, T( J+1, J+1 ) )
-            T( J+1, J ) = ZERO
-*
-            DO 160 JR = IFRSTM, MIN( J+2, ILAST )
-               TEMP = C*H( JR, J+1 ) + S*H( JR, J )
-               H( JR, J ) = -S*H( JR, J+1 ) + C*H( JR, J )
-               H( JR, J+1 ) = TEMP
-  160       CONTINUE
-            DO 170 JR = IFRSTM, J
-               TEMP = C*T( JR, J+1 ) + S*T( JR, J )
-               T( JR, J ) = -S*T( JR, J+1 ) + C*T( JR, J )
-               T( JR, J+1 ) = TEMP
-  170       CONTINUE
-            IF( ILZ ) THEN
-               DO 180 JR = 1, N
-                  TEMP = C*Z( JR, J+1 ) + S*Z( JR, J )
-                  Z( JR, J ) = -S*Z( JR, J+1 ) + C*Z( JR, J )
-                  Z( JR, J+1 ) = TEMP
-  180          CONTINUE
-            END IF
-  190    CONTINUE
-*
-         GO TO 350
-*
-*        Use Francis double-shift
-*
-*        Note: the Francis double-shift should work with real shifts,
-*              but only if the block is at least 3x3.
-*              This code may break if this point is reached with
-*              a 2x2 block with real eigenvalues.
-*
-  200    CONTINUE
-         IF( IFIRST+1.EQ.ILAST ) THEN
-*
-*           Special case -- 2x2 block with complex eigenvectors
-*
-*           Step 1: Standardize, that is, rotate so that
-*
-*                       ( B11  0  )
-*                   B = (         )  with B11 non-negative.
-*                       (  0  B22 )
-*
-            CALL SLASV2( T( ILAST-1, ILAST-1 ), T( ILAST-1, ILAST ),
-     $                   T( ILAST, ILAST ), B22, B11, SR, CR, SL, CL )
-*
-            IF( B11.LT.ZERO ) THEN
-               CR = -CR
-               SR = -SR
-               B11 = -B11
-               B22 = -B22
-            END IF
-*
-            CALL SROT( ILASTM+1-IFIRST, H( ILAST-1, ILAST-1 ), LDH,
-     $                 H( ILAST, ILAST-1 ), LDH, CL, SL )
-            CALL SROT( ILAST+1-IFRSTM, H( IFRSTM, ILAST-1 ), 1,
-     $                 H( IFRSTM, ILAST ), 1, CR, SR )
-*
-            IF( ILAST.LT.ILASTM )
-     $         CALL SROT( ILASTM-ILAST, T( ILAST-1, ILAST+1 ), LDT,
-     $                    T( ILAST, ILAST+1 ), LDH, CL, SL )
-            IF( IFRSTM.LT.ILAST-1 )
-     $         CALL SROT( IFIRST-IFRSTM, T( IFRSTM, ILAST-1 ), 1,
-     $                    T( IFRSTM, ILAST ), 1, CR, SR )
-*
-            IF( ILQ )
-     $         CALL SROT( N, Q( 1, ILAST-1 ), 1, Q( 1, ILAST ), 1, CL,
-     $                    SL )
-            IF( ILZ )
-     $         CALL SROT( N, Z( 1, ILAST-1 ), 1, Z( 1, ILAST ), 1, CR,
-     $                    SR )
-*
-            T( ILAST-1, ILAST-1 ) = B11
-            T( ILAST-1, ILAST ) = ZERO
-            T( ILAST, ILAST-1 ) = ZERO
-            T( ILAST, ILAST ) = B22
-*
-*           If B22 is negative, negate column ILAST
-*
-            IF( B22.LT.ZERO ) THEN
-               DO 210 J = IFRSTM, ILAST
-                  H( J, ILAST ) = -H( J, ILAST )
-                  T( J, ILAST ) = -T( J, ILAST )
-  210          CONTINUE
-*
-               IF( ILZ ) THEN
-                  DO 220 J = 1, N
-                     Z( J, ILAST ) = -Z( J, ILAST )
-  220             CONTINUE
-               END IF
-            END IF
-*
-*           Step 2: Compute ALPHAR, ALPHAI, and BETA (see refs.)
-*
-*           Recompute shift
-*
-            CALL SLAG2( H( ILAST-1, ILAST-1 ), LDH,
-     $                  T( ILAST-1, ILAST-1 ), LDT, SAFMIN*SAFETY, S1,
-     $                  TEMP, WR, TEMP2, WI )
-*
-*           If standardization has perturbed the shift onto real line,
-*           do another (real single-shift) QR step.
-*
-            IF( WI.EQ.ZERO )
-     $         GO TO 350
-            S1INV = ONE / S1
-*
-*           Do EISPACK (QZVAL) computation of alpha and beta
-*
-            A11 = H( ILAST-1, ILAST-1 )
-            A21 = H( ILAST, ILAST-1 )
-            A12 = H( ILAST-1, ILAST )
-            A22 = H( ILAST, ILAST )
-*
-*           Compute complex Givens rotation on right
-*           (Assume some element of C = (sA - wB) > unfl )
-*                            __
-*           (sA - wB) ( CZ   -SZ )
-*                     ( SZ    CZ )
-*
-            C11R = S1*A11 - WR*B11
-            C11I = -WI*B11
-            C12 = S1*A12
-            C21 = S1*A21
-            C22R = S1*A22 - WR*B22
-            C22I = -WI*B22
-*
-            IF( ABS( C11R )+ABS( C11I )+ABS( C12 ).GT.ABS( C21 )+
-     $          ABS( C22R )+ABS( C22I ) ) THEN
-               T1 = SLAPY3( C12, C11R, C11I )
-               CZ = C12 / T1
-               SZR = -C11R / T1
-               SZI = -C11I / T1
-            ELSE
-               CZ = SLAPY2( C22R, C22I )
-               IF( CZ.LE.SAFMIN ) THEN
-                  CZ = ZERO
-                  SZR = ONE
-                  SZI = ZERO
-               ELSE
-                  TEMPR = C22R / CZ
-                  TEMPI = C22I / CZ
-                  T1 = SLAPY2( CZ, C21 )
-                  CZ = CZ / T1
-                  SZR = -C21*TEMPR / T1
-                  SZI = C21*TEMPI / T1
-               END IF
-            END IF
-*
-*           Compute Givens rotation on left
-*
-*           (  CQ   SQ )
-*           (  __      )  A or B
-*           ( -SQ   CQ )
-*
-            AN = ABS( A11 ) + ABS( A12 ) + ABS( A21 ) + ABS( A22 )
-            BN = ABS( B11 ) + ABS( B22 )
-            WABS = ABS( WR ) + ABS( WI )
-            IF( S1*AN.GT.WABS*BN ) THEN
-               CQ = CZ*B11
-               SQR = SZR*B22
-               SQI = -SZI*B22
-            ELSE
-               A1R = CZ*A11 + SZR*A12
-               A1I = SZI*A12
-               A2R = CZ*A21 + SZR*A22
-               A2I = SZI*A22
-               CQ = SLAPY2( A1R, A1I )
-               IF( CQ.LE.SAFMIN ) THEN
-                  CQ = ZERO
-                  SQR = ONE
-                  SQI = ZERO
-               ELSE
-                  TEMPR = A1R / CQ
-                  TEMPI = A1I / CQ
-                  SQR = TEMPR*A2R + TEMPI*A2I
-                  SQI = TEMPI*A2R - TEMPR*A2I
-               END IF
-            END IF
-            T1 = SLAPY3( CQ, SQR, SQI )
-            CQ = CQ / T1
-            SQR = SQR / T1
-            SQI = SQI / T1
-*
-*           Compute diagonal elements of QBZ
-*
-            TEMPR = SQR*SZR - SQI*SZI
-            TEMPI = SQR*SZI + SQI*SZR
-            B1R = CQ*CZ*B11 + TEMPR*B22
-            B1I = TEMPI*B22
-            B1A = SLAPY2( B1R, B1I )
-            B2R = CQ*CZ*B22 + TEMPR*B11
-            B2I = -TEMPI*B11
-            B2A = SLAPY2( B2R, B2I )
-*
-*           Normalize so beta > 0, and Im( alpha1 ) > 0
-*
-            BETA( ILAST-1 ) = B1A
-            BETA( ILAST ) = B2A
-            ALPHAR( ILAST-1 ) = ( WR*B1A )*S1INV
-            ALPHAI( ILAST-1 ) = ( WI*B1A )*S1INV
-            ALPHAR( ILAST ) = ( WR*B2A )*S1INV
-            ALPHAI( ILAST ) = -( WI*B2A )*S1INV
-*
-*           Step 3: Go to next block -- exit if finished.
-*
-            ILAST = IFIRST - 1
-            IF( ILAST.LT.ILO )
-     $         GO TO 380
-*
-*           Reset counters
-*
-            IITER = 0
-            ESHIFT = ZERO
-            IF( .NOT.ILSCHR ) THEN
-               ILASTM = ILAST
-               IF( IFRSTM.GT.ILAST )
-     $            IFRSTM = ILO
-            END IF
-            GO TO 350
-         ELSE
-*
-*           Usual case: 3x3 or larger block, using Francis implicit
-*                       double-shift
-*
-*                                    2
-*           Eigenvalue equation is  w  - c w + d = 0,
-*
-*                                         -1 2        -1
-*           so compute 1st column of  (A B  )  - c A B   + d
-*           using the formula in QZIT (from EISPACK)
-*
-*           We assume that the block is at least 3x3
-*
-            AD11 = ( ASCALE*H( ILAST-1, ILAST-1 ) ) /
-     $             ( BSCALE*T( ILAST-1, ILAST-1 ) )
-            AD21 = ( ASCALE*H( ILAST, ILAST-1 ) ) /
-     $             ( BSCALE*T( ILAST-1, ILAST-1 ) )
-            AD12 = ( ASCALE*H( ILAST-1, ILAST ) ) /
-     $             ( BSCALE*T( ILAST, ILAST ) )
-            AD22 = ( ASCALE*H( ILAST, ILAST ) ) /
-     $             ( BSCALE*T( ILAST, ILAST ) )
-            U12 = T( ILAST-1, ILAST ) / T( ILAST, ILAST )
-            AD11L = ( ASCALE*H( IFIRST, IFIRST ) ) /
-     $              ( BSCALE*T( IFIRST, IFIRST ) )
-            AD21L = ( ASCALE*H( IFIRST+1, IFIRST ) ) /
-     $              ( BSCALE*T( IFIRST, IFIRST ) )
-            AD12L = ( ASCALE*H( IFIRST, IFIRST+1 ) ) /
-     $              ( BSCALE*T( IFIRST+1, IFIRST+1 ) )
-            AD22L = ( ASCALE*H( IFIRST+1, IFIRST+1 ) ) /
-     $              ( BSCALE*T( IFIRST+1, IFIRST+1 ) )
-            AD32L = ( ASCALE*H( IFIRST+2, IFIRST+1 ) ) /
-     $              ( BSCALE*T( IFIRST+1, IFIRST+1 ) )
-            U12L = T( IFIRST, IFIRST+1 ) / T( IFIRST+1, IFIRST+1 )
-*
-            V( 1 ) = ( AD11-AD11L )*( AD22-AD11L ) - AD12*AD21 +
-     $               AD21*U12*AD11L + ( AD12L-AD11L*U12L )*AD21L
-            V( 2 ) = ( ( AD22L-AD11L )-AD21L*U12L-( AD11-AD11L )-
-     $               ( AD22-AD11L )+AD21*U12 )*AD21L
-            V( 3 ) = AD32L*AD21L
-*
-            ISTART = IFIRST
-*
-            CALL SLARFG( 3, V( 1 ), V( 2 ), 1, TAU )
-            V( 1 ) = ONE
-*
-*           Sweep
-*
-            DO 290 J = ISTART, ILAST - 2
-*
-*              All but last elements: use 3x3 Householder transforms.
-*
-*              Zero (j-1)st column of A
-*
-               IF( J.GT.ISTART ) THEN
-                  V( 1 ) = H( J, J-1 )
-                  V( 2 ) = H( J+1, J-1 )
-                  V( 3 ) = H( J+2, J-1 )
-*
-                  CALL SLARFG( 3, H( J, J-1 ), V( 2 ), 1, TAU )
-                  V( 1 ) = ONE
-                  H( J+1, J-1 ) = ZERO
-                  H( J+2, J-1 ) = ZERO
-               END IF
-*
-               DO 230 JC = J, ILASTM
-                  TEMP = TAU*( H( J, JC )+V( 2 )*H( J+1, JC )+V( 3 )*
-     $                   H( J+2, JC ) )
-                  H( J, JC ) = H( J, JC ) - TEMP
-                  H( J+1, JC ) = H( J+1, JC ) - TEMP*V( 2 )
-                  H( J+2, JC ) = H( J+2, JC ) - TEMP*V( 3 )
-                  TEMP2 = TAU*( T( J, JC )+V( 2 )*T( J+1, JC )+V( 3 )*
-     $                    T( J+2, JC ) )
-                  T( J, JC ) = T( J, JC ) - TEMP2
-                  T( J+1, JC ) = T( J+1, JC ) - TEMP2*V( 2 )
-                  T( J+2, JC ) = T( J+2, JC ) - TEMP2*V( 3 )
-  230          CONTINUE
-               IF( ILQ ) THEN
-                  DO 240 JR = 1, N
-                     TEMP = TAU*( Q( JR, J )+V( 2 )*Q( JR, J+1 )+V( 3 )*
-     $                      Q( JR, J+2 ) )
-                     Q( JR, J ) = Q( JR, J ) - TEMP
-                     Q( JR, J+1 ) = Q( JR, J+1 ) - TEMP*V( 2 )
-                     Q( JR, J+2 ) = Q( JR, J+2 ) - TEMP*V( 3 )
-  240             CONTINUE
-               END IF
-*
-*              Zero j-th column of B (see SLAGBC for details)
-*
-*              Swap rows to pivot
-*
-               ILPIVT = .FALSE.
-               TEMP = MAX( ABS( T( J+1, J+1 ) ), ABS( T( J+1, J+2 ) ) )
-               TEMP2 = MAX( ABS( T( J+2, J+1 ) ), ABS( T( J+2, J+2 ) ) )
-               IF( MAX( TEMP, TEMP2 ).LT.SAFMIN ) THEN
-                  SCALE = ZERO
-                  U1 = ONE
-                  U2 = ZERO
-                  GO TO 250
-               ELSE IF( TEMP.GE.TEMP2 ) THEN
-                  W11 = T( J+1, J+1 )
-                  W21 = T( J+2, J+1 )
-                  W12 = T( J+1, J+2 )
-                  W22 = T( J+2, J+2 )
-                  U1 = T( J+1, J )
-                  U2 = T( J+2, J )
-               ELSE
-                  W21 = T( J+1, J+1 )
-                  W11 = T( J+2, J+1 )
-                  W22 = T( J+1, J+2 )
-                  W12 = T( J+2, J+2 )
-                  U2 = T( J+1, J )
-                  U1 = T( J+2, J )
-               END IF
-*
-*              Swap columns if nec.
-*
-               IF( ABS( W12 ).GT.ABS( W11 ) ) THEN
-                  ILPIVT = .TRUE.
-                  TEMP = W12
-                  TEMP2 = W22
-                  W12 = W11
-                  W22 = W21
-                  W11 = TEMP
-                  W21 = TEMP2
-               END IF
-*
-*              LU-factor
-*
-               TEMP = W21 / W11
-               U2 = U2 - TEMP*U1
-               W22 = W22 - TEMP*W12
-               W21 = ZERO
-*
-*              Compute SCALE
-*
-               SCALE = ONE
-               IF( ABS( W22 ).LT.SAFMIN ) THEN
-                  SCALE = ZERO
-                  U2 = ONE
-                  U1 = -W12 / W11
-                  GO TO 250
-               END IF
-               IF( ABS( W22 ).LT.ABS( U2 ) )
-     $            SCALE = ABS( W22 / U2 )
-               IF( ABS( W11 ).LT.ABS( U1 ) )
-     $            SCALE = MIN( SCALE, ABS( W11 / U1 ) )
-*
-*              Solve
-*
-               U2 = ( SCALE*U2 ) / W22
-               U1 = ( SCALE*U1-W12*U2 ) / W11
-*
-  250          CONTINUE
-               IF( ILPIVT ) THEN
-                  TEMP = U2
-                  U2 = U1
-                  U1 = TEMP
-               END IF
-*
-*              Compute Householder Vector
-*
-               T1 = SQRT( SCALE**2+U1**2+U2**2 )
-               TAU = ONE + SCALE / T1
-               VS = -ONE / ( SCALE+T1 )
-               V( 1 ) = ONE
-               V( 2 ) = VS*U1
-               V( 3 ) = VS*U2
-*
-*              Apply transformations from the right.
-*
-               DO 260 JR = IFRSTM, MIN( J+3, ILAST )
-                  TEMP = TAU*( H( JR, J )+V( 2 )*H( JR, J+1 )+V( 3 )*
-     $                   H( JR, J+2 ) )
-                  H( JR, J ) = H( JR, J ) - TEMP
-                  H( JR, J+1 ) = H( JR, J+1 ) - TEMP*V( 2 )
-                  H( JR, J+2 ) = H( JR, J+2 ) - TEMP*V( 3 )
-  260          CONTINUE
-               DO 270 JR = IFRSTM, J + 2
-                  TEMP = TAU*( T( JR, J )+V( 2 )*T( JR, J+1 )+V( 3 )*
-     $                   T( JR, J+2 ) )
-                  T( JR, J ) = T( JR, J ) - TEMP
-                  T( JR, J+1 ) = T( JR, J+1 ) - TEMP*V( 2 )
-                  T( JR, J+2 ) = T( JR, J+2 ) - TEMP*V( 3 )
-  270          CONTINUE
-               IF( ILZ ) THEN
-                  DO 280 JR = 1, N
-                     TEMP = TAU*( Z( JR, J )+V( 2 )*Z( JR, J+1 )+V( 3 )*
-     $                      Z( JR, J+2 ) )
-                     Z( JR, J ) = Z( JR, J ) - TEMP
-                     Z( JR, J+1 ) = Z( JR, J+1 ) - TEMP*V( 2 )
-                     Z( JR, J+2 ) = Z( JR, J+2 ) - TEMP*V( 3 )
-  280             CONTINUE
-               END IF
-               T( J+1, J ) = ZERO
-               T( J+2, J ) = ZERO
-  290       CONTINUE
-*
-*           Last elements: Use Givens rotations
-*
-*           Rotations from the left
-*
-            J = ILAST - 1
-            TEMP = H( J, J-1 )
-            CALL SLARTG( TEMP, H( J+1, J-1 ), C, S, H( J, J-1 ) )
-            H( J+1, J-1 ) = ZERO
-*
-            DO 300 JC = J, ILASTM
-               TEMP = C*H( J, JC ) + S*H( J+1, JC )
-               H( J+1, JC ) = -S*H( J, JC ) + C*H( J+1, JC )
-               H( J, JC ) = TEMP
-               TEMP2 = C*T( J, JC ) + S*T( J+1, JC )
-               T( J+1, JC ) = -S*T( J, JC ) + C*T( J+1, JC )
-               T( J, JC ) = TEMP2
-  300       CONTINUE
-            IF( ILQ ) THEN
-               DO 310 JR = 1, N
-                  TEMP = C*Q( JR, J ) + S*Q( JR, J+1 )
-                  Q( JR, J+1 ) = -S*Q( JR, J ) + C*Q( JR, J+1 )
-                  Q( JR, J ) = TEMP
-  310          CONTINUE
-            END IF
-*
-*           Rotations from the right.
-*
-            TEMP = T( J+1, J+1 )
-            CALL SLARTG( TEMP, T( J+1, J ), C, S, T( J+1, J+1 ) )
-            T( J+1, J ) = ZERO
-*
-            DO 320 JR = IFRSTM, ILAST
-               TEMP = C*H( JR, J+1 ) + S*H( JR, J )
-               H( JR, J ) = -S*H( JR, J+1 ) + C*H( JR, J )
-               H( JR, J+1 ) = TEMP
-  320       CONTINUE
-            DO 330 JR = IFRSTM, ILAST - 1
-               TEMP = C*T( JR, J+1 ) + S*T( JR, J )
-               T( JR, J ) = -S*T( JR, J+1 ) + C*T( JR, J )
-               T( JR, J+1 ) = TEMP
-  330       CONTINUE
-            IF( ILZ ) THEN
-               DO 340 JR = 1, N
-                  TEMP = C*Z( JR, J+1 ) + S*Z( JR, J )
-                  Z( JR, J ) = -S*Z( JR, J+1 ) + C*Z( JR, J )
-                  Z( JR, J+1 ) = TEMP
-  340          CONTINUE
-            END IF
-*
-*           End of Double-Shift code
-*
-         END IF
-*
-         GO TO 350
-*
-*        End of iteration loop
-*
-  350    CONTINUE
-  360 CONTINUE
-*
-*     Drop-through = non-convergence
-*
-      INFO = ILAST
-      GO TO 420
-*
-*     Successful completion of all QZ steps
-*
-  380 CONTINUE
-*
-*     Set Eigenvalues 1:ILO-1
-*
-      DO 410 J = 1, ILO - 1
-         IF( T( J, J ).LT.ZERO ) THEN
-            IF( ILSCHR ) THEN
-               DO 390 JR = 1, J
-                  H( JR, J ) = -H( JR, J )
-                  T( JR, J ) = -T( JR, J )
-  390          CONTINUE
-            ELSE
-               H( J, J ) = -H( J, J )
-               T( J, J ) = -T( J, J )
-            END IF
-            IF( ILZ ) THEN
-               DO 400 JR = 1, N
-                  Z( JR, J ) = -Z( JR, J )
-  400          CONTINUE
-            END IF
-         END IF
-         ALPHAR( J ) = H( J, J )
-         ALPHAI( J ) = ZERO
-         BETA( J ) = T( J, J )
-  410 CONTINUE
-*
-*     Normal Termination
-*
-      INFO = 0
-*
-*     Exit (other than argument error) -- return optimal workspace size
-*
-  420 CONTINUE
-      WORK( 1 ) = REAL( N )
-      RETURN
-*
-*     End of SHGEQZ
-*
-      END
--- a/libcruft/lapack/shseqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,407 +0,0 @@
-      SUBROUTINE SHSEQR( JOB, COMPZ, N, ILO, IHI, H, LDH, WR, WI, Z,
-     $                   LDZ, WORK, LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, ILO, INFO, LDH, LDZ, LWORK, N
-      CHARACTER          COMPZ, JOB
-*     ..
-*     .. Array Arguments ..
-      REAL               H( LDH, * ), WI( * ), WORK( * ), WR( * ),
-     $                   Z( LDZ, * )
-*     ..
-*     Purpose
-*     =======
-*
-*     SHSEQR computes the eigenvalues of a Hessenberg matrix H
-*     and, optionally, the matrices T and Z from the Schur decomposition
-*     H = Z T Z**T, where T is an upper quasi-triangular matrix (the
-*     Schur form), and Z is the orthogonal matrix of Schur vectors.
-*
-*     Optionally Z may be postmultiplied into an input orthogonal
-*     matrix Q so that this routine can give the Schur factorization
-*     of a matrix A which has been reduced to the Hessenberg form H
-*     by the orthogonal matrix Q:  A = Q*H*Q**T = (QZ)*T*(QZ)**T.
-*
-*     Arguments
-*     =========
-*
-*     JOB   (input) CHARACTER*1
-*           = 'E':  compute eigenvalues only;
-*           = 'S':  compute eigenvalues and the Schur form T.
-*
-*     COMPZ (input) CHARACTER*1
-*           = 'N':  no Schur vectors are computed;
-*           = 'I':  Z is initialized to the unit matrix and the matrix Z
-*                   of Schur vectors of H is returned;
-*           = 'V':  Z must contain an orthogonal matrix Q on entry, and
-*                   the product Q*Z is returned.
-*
-*     N     (input) INTEGER
-*           The order of the matrix H.  N .GE. 0.
-*
-*     ILO   (input) INTEGER
-*     IHI   (input) INTEGER
-*           It is assumed that H is already upper triangular in rows
-*           and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally
-*           set by a previous call to SGEBAL, and then passed to SGEHRD
-*           when the matrix output by SGEBAL is reduced to Hessenberg
-*           form. Otherwise ILO and IHI should be set to 1 and N
-*           respectively.  If N.GT.0, then 1.LE.ILO.LE.IHI.LE.N.
-*           If N = 0, then ILO = 1 and IHI = 0.
-*
-*     H     (input/output) REAL array, dimension (LDH,N)
-*           On entry, the upper Hessenberg matrix H.
-*           On exit, if INFO = 0 and JOB = 'S', then H contains the
-*           upper quasi-triangular matrix T from the Schur decomposition
-*           (the Schur form); 2-by-2 diagonal blocks (corresponding to
-*           complex conjugate pairs of eigenvalues) are returned in
-*           standard form, with H(i,i) = H(i+1,i+1) and
-*           H(i+1,i)*H(i,i+1).LT.0. If INFO = 0 and JOB = 'E', the
-*           contents of H are unspecified on exit.  (The output value of
-*           H when INFO.GT.0 is given under the description of INFO
-*           below.)
-*
-*           Unlike earlier versions of SHSEQR, this subroutine may
-*           explicitly H(i,j) = 0 for i.GT.j and j = 1, 2, ... ILO-1
-*           or j = IHI+1, IHI+2, ... N.
-*
-*     LDH   (input) INTEGER
-*           The leading dimension of the array H. LDH .GE. max(1,N).
-*
-*     WR    (output) REAL array, dimension (N)
-*     WI    (output) REAL array, dimension (N)
-*           The real and imaginary parts, respectively, of the computed
-*           eigenvalues. If two eigenvalues are computed as a complex
-*           conjugate pair, they are stored in consecutive elements of
-*           WR and WI, say the i-th and (i+1)th, with WI(i) .GT. 0 and
-*           WI(i+1) .LT. 0. If JOB = 'S', the eigenvalues are stored in
-*           the same order as on the diagonal of the Schur form returned
-*           in H, with WR(i) = H(i,i) and, if H(i:i+1,i:i+1) is a 2-by-2
-*           diagonal block, WI(i) = sqrt(-H(i+1,i)*H(i,i+1)) and
-*           WI(i+1) = -WI(i).
-*
-*     Z     (input/output) REAL array, dimension (LDZ,N)
-*           If COMPZ = 'N', Z is not referenced.
-*           If COMPZ = 'I', on entry Z need not be set and on exit,
-*           if INFO = 0, Z contains the orthogonal matrix Z of the Schur
-*           vectors of H.  If COMPZ = 'V', on entry Z must contain an
-*           N-by-N matrix Q, which is assumed to be equal to the unit
-*           matrix except for the submatrix Z(ILO:IHI,ILO:IHI). On exit,
-*           if INFO = 0, Z contains Q*Z.
-*           Normally Q is the orthogonal matrix generated by SORGHR
-*           after the call to SGEHRD which formed the Hessenberg matrix
-*           H. (The output value of Z when INFO.GT.0 is given under
-*           the description of INFO below.)
-*
-*     LDZ   (input) INTEGER
-*           The leading dimension of the array Z.  if COMPZ = 'I' or
-*           COMPZ = 'V', then LDZ.GE.MAX(1,N).  Otherwize, LDZ.GE.1.
-*
-*     WORK  (workspace/output) REAL array, dimension (LWORK)
-*           On exit, if INFO = 0, WORK(1) returns an estimate of
-*           the optimal value for LWORK.
-*
-*     LWORK (input) INTEGER
-*           The dimension of the array WORK.  LWORK .GE. max(1,N)
-*           is sufficient, but LWORK typically as large as 6*N may
-*           be required for optimal performance.  A workspace query
-*           to determine the optimal workspace size is recommended.
-*
-*           If LWORK = -1, then SHSEQR does a workspace query.
-*           In this case, SHSEQR checks the input parameters and
-*           estimates the optimal workspace size for the given
-*           values of N, ILO and IHI.  The estimate is returned
-*           in WORK(1).  No error message related to LWORK is
-*           issued by XERBLA.  Neither H nor Z are accessed.
-*
-*
-*     INFO  (output) INTEGER
-*             =  0:  successful exit
-*           .LT. 0:  if INFO = -i, the i-th argument had an illegal
-*                    value
-*           .GT. 0:  if INFO = i, SHSEQR failed to compute all of
-*                the eigenvalues.  Elements 1:ilo-1 and i+1:n of WR
-*                and WI contain those eigenvalues which have been
-*                successfully computed.  (Failures are rare.)
-*
-*                If INFO .GT. 0 and JOB = 'E', then on exit, the
-*                remaining unconverged eigenvalues are the eigen-
-*                values of the upper Hessenberg matrix rows and
-*                columns ILO through INFO of the final, output
-*                value of H.
-*
-*                If INFO .GT. 0 and JOB   = 'S', then on exit
-*
-*           (*)  (initial value of H)*U  = U*(final value of H)
-*
-*                where U is an orthogonal matrix.  The final
-*                value of H is upper Hessenberg and quasi-triangular
-*                in rows and columns INFO+1 through IHI.
-*
-*                If INFO .GT. 0 and COMPZ = 'V', then on exit
-*
-*                  (final value of Z)  =  (initial value of Z)*U
-*
-*                where U is the orthogonal matrix in (*) (regard-
-*                less of the value of JOB.)
-*
-*                If INFO .GT. 0 and COMPZ = 'I', then on exit
-*                      (final value of Z)  = U
-*                where U is the orthogonal matrix in (*) (regard-
-*                less of the value of JOB.)
-*
-*                If INFO .GT. 0 and COMPZ = 'N', then Z is not
-*                accessed.
-*
-*     ================================================================
-*             Default values supplied by
-*             ILAENV(ISPEC,'SHSEQR',JOB(:1)//COMPZ(:1),N,ILO,IHI,LWORK).
-*             It is suggested that these defaults be adjusted in order
-*             to attain best performance in each particular
-*             computational environment.
-*
-*            ISPEC=1:  The SLAHQR vs SLAQR0 crossover point.
-*                      Default: 75. (Must be at least 11.)
-*
-*            ISPEC=2:  Recommended deflation window size.
-*                      This depends on ILO, IHI and NS.  NS is the
-*                      number of simultaneous shifts returned
-*                      by ILAENV(ISPEC=4).  (See ISPEC=4 below.)
-*                      The default for (IHI-ILO+1).LE.500 is NS.
-*                      The default for (IHI-ILO+1).GT.500 is 3*NS/2.
-*
-*            ISPEC=3:  Nibble crossover point. (See ILAENV for
-*                      details.)  Default: 14% of deflation window
-*                      size.
-*
-*            ISPEC=4:  Number of simultaneous shifts, NS, in
-*                      a multi-shift QR iteration.
-*
-*                      If IHI-ILO+1 is ...
-*
-*                      greater than      ...but less    ... the
-*                      or equal to ...      than        default is
-*
-*                           1               30          NS -   2(+)
-*                          30               60          NS -   4(+)
-*                          60              150          NS =  10(+)
-*                         150              590          NS =  **
-*                         590             3000          NS =  64
-*                        3000             6000          NS = 128
-*                        6000             infinity      NS = 256
-*
-*                  (+)  By default some or all matrices of this order 
-*                       are passed to the implicit double shift routine
-*                       SLAHQR and NS is ignored.  See ISPEC=1 above 
-*                       and comments in IPARM for details.
-*
-*                       The asterisks (**) indicate an ad-hoc
-*                       function of N increasing from 10 to 64.
-*
-*            ISPEC=5:  Select structured matrix multiply.
-*                      (See ILAENV for details.) Default: 3.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ================================================================
-*     References:
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
-*       Performance, SIAM Journal of Matrix Analysis, volume 23, pages
-*       929--947, 2002.
-*
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part II: Aggressive Early Deflation, SIAM Journal
-*       of Matrix Analysis, volume 23, pages 948--973, 2002.
-*
-*     ================================================================
-*     .. Parameters ..
-*
-*     ==== Matrices of order NTINY or smaller must be processed by
-*     .    SLAHQR because of insufficient subdiagonal scratch space.
-*     .    (This is a hard limit.) ====
-*
-*     ==== NL allocates some local workspace to help small matrices
-*     .    through a rare SLAHQR failure.  NL .GT. NTINY = 11 is
-*     .    required and NL .LE. NMIN = ILAENV(ISPEC=1,...) is recom-
-*     .    mended.  (The default value of NMIN is 75.)  Using NL = 49
-*     .    allows up to six simultaneous shifts and a 16-by-16
-*     .    deflation window.  ====
-*
-      INTEGER            NTINY
-      PARAMETER          ( NTINY = 11 )
-      INTEGER            NL
-      PARAMETER          ( NL = 49 )
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0e0, ONE = 1.0e0 )
-*     ..
-*     .. Local Arrays ..
-      REAL               HL( NL, NL ), WORKL( NL )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, KBOT, NMIN
-      LOGICAL            INITZ, LQUERY, WANTT, WANTZ
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      LOGICAL            LSAME
-      EXTERNAL           ILAENV, LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLACPY, SLAHQR, SLAQR0, SLASET, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN, REAL
-*     ..
-*     .. Executable Statements ..
-*
-*     ==== Decode and check the input parameters. ====
-*
-      WANTT = LSAME( JOB, 'S' )
-      INITZ = LSAME( COMPZ, 'I' )
-      WANTZ = INITZ .OR. LSAME( COMPZ, 'V' )
-      WORK( 1 ) = REAL( MAX( 1, N ) )
-      LQUERY = LWORK.EQ.-1
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'E' ) .AND. .NOT.WANTT ) THEN
-         INFO = -1
-      ELSE IF( .NOT.LSAME( COMPZ, 'N' ) .AND. .NOT.WANTZ ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -5
-      ELSE IF( LDH.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDZ.LT.1 .OR. ( WANTZ .AND. LDZ.LT.MAX( 1, N ) ) ) THEN
-         INFO = -11
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -13
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-*
-*        ==== Quick return in case of invalid argument. ====
-*
-         CALL XERBLA( 'SHSEQR', -INFO )
-         RETURN
-*
-      ELSE IF( N.EQ.0 ) THEN
-*
-*        ==== Quick return in case N = 0; nothing to do. ====
-*
-         RETURN
-*
-      ELSE IF( LQUERY ) THEN
-*
-*        ==== Quick return in case of a workspace query ====
-*
-         CALL SLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI, ILO,
-     $                IHI, Z, LDZ, WORK, LWORK, INFO )
-*        ==== Ensure reported workspace size is backward-compatible with
-*        .    previous LAPACK versions. ====
-         WORK( 1 ) = MAX( REAL( MAX( 1, N ) ), WORK( 1 ) )
-         RETURN
-*
-      ELSE
-*
-*        ==== copy eigenvalues isolated by SGEBAL ====
-*
-         DO 10 I = 1, ILO - 1
-            WR( I ) = H( I, I )
-            WI( I ) = ZERO
-   10    CONTINUE
-         DO 20 I = IHI + 1, N
-            WR( I ) = H( I, I )
-            WI( I ) = ZERO
-   20    CONTINUE
-*
-*        ==== Initialize Z, if requested ====
-*
-         IF( INITZ )
-     $      CALL SLASET( 'A', N, N, ZERO, ONE, Z, LDZ )
-*
-*        ==== Quick return if possible ====
-*
-         IF( ILO.EQ.IHI ) THEN
-            WR( ILO ) = H( ILO, ILO )
-            WI( ILO ) = ZERO
-            RETURN
-         END IF
-*
-*        ==== SLAHQR/SLAQR0 crossover point ====
-*
-         NMIN = ILAENV( 1, 'SHSEQR', JOB( : 1 ) // COMPZ( : 1 ), N, ILO,
-     $          IHI, LWORK )
-         NMIN = MAX( NTINY, NMIN )
-*
-*        ==== SLAQR0 for big matrices; SLAHQR for small ones ====
-*
-         IF( N.GT.NMIN ) THEN
-            CALL SLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI, ILO,
-     $                   IHI, Z, LDZ, WORK, LWORK, INFO )
-         ELSE
-*
-*           ==== Small matrix ====
-*
-            CALL SLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI, ILO,
-     $                   IHI, Z, LDZ, INFO )
-*
-            IF( INFO.GT.0 ) THEN
-*
-*              ==== A rare SLAHQR failure!  SLAQR0 sometimes succeeds
-*              .    when SLAHQR fails. ====
-*
-               KBOT = INFO
-*
-               IF( N.GE.NL ) THEN
-*
-*                 ==== Larger matrices have enough subdiagonal scratch
-*                 .    space to call SLAQR0 directly. ====
-*
-                  CALL SLAQR0( WANTT, WANTZ, N, ILO, KBOT, H, LDH, WR,
-     $                         WI, ILO, IHI, Z, LDZ, WORK, LWORK, INFO )
-*
-               ELSE
-*
-*                 ==== Tiny matrices don't have enough subdiagonal
-*                 .    scratch space to benefit from SLAQR0.  Hence,
-*                 .    tiny matrices must be copied into a larger
-*                 .    array before calling SLAQR0. ====
-*
-                  CALL SLACPY( 'A', N, N, H, LDH, HL, NL )
-                  HL( N+1, N ) = ZERO
-                  CALL SLASET( 'A', NL, NL-N, ZERO, ZERO, HL( 1, N+1 ),
-     $                         NL )
-                  CALL SLAQR0( WANTT, WANTZ, NL, ILO, KBOT, HL, NL, WR,
-     $                         WI, ILO, IHI, Z, LDZ, WORKL, NL, INFO )
-                  IF( WANTT .OR. INFO.NE.0 )
-     $               CALL SLACPY( 'A', N, N, HL, NL, H, LDH )
-               END IF
-            END IF
-         END IF
-*
-*        ==== Clear out the trash, if necessary. ====
-*
-         IF( ( WANTT .OR. INFO.NE.0 ) .AND. N.GT.2 )
-     $      CALL SLASET( 'L', N-2, N-2, ZERO, ZERO, H( 3, 1 ), LDH )
-*
-*        ==== Ensure reported workspace size is backward-compatible with
-*        .    previous LAPACK versions. ====
-*
-         WORK( 1 ) = MAX( REAL( MAX( 1, N ) ), WORK( 1 ) )
-      END IF
-*
-*     ==== End of SHSEQR ====
-*
-      END
--- a/libcruft/lapack/slabad.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-      SUBROUTINE SLABAD( SMALL, LARGE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      REAL               LARGE, SMALL
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLABAD takes as input the values computed by SLAMCH for underflow and
-*  overflow, and returns the square root of each of these values if the
-*  log of LARGE is sufficiently large.  This subroutine is intended to
-*  identify machines with a large exponent range, such as the Crays, and
-*  redefine the underflow and overflow limits to be the square roots of
-*  the values computed by SLAMCH.  This subroutine is needed because
-*  SLAMCH does not compensate for poor arithmetic in the upper half of
-*  the exponent range, as is found on a Cray.
-*
-*  Arguments
-*  =========
-*
-*  SMALL   (input/output) REAL
-*          On entry, the underflow threshold as computed by SLAMCH.
-*          On exit, if LOG10(LARGE) is sufficiently large, the square
-*          root of SMALL, otherwise unchanged.
-*
-*  LARGE   (input/output) REAL
-*          On entry, the overflow threshold as computed by SLAMCH.
-*          On exit, if LOG10(LARGE) is sufficiently large, the square
-*          root of LARGE, otherwise unchanged.
-*
-*  =====================================================================
-*
-*     .. Intrinsic Functions ..
-      INTRINSIC          LOG10, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     If it looks like we're on a Cray, take the square root of
-*     SMALL and LARGE to avoid overflow and underflow problems.
-*
-      IF( LOG10( LARGE ).GT.2000. ) THEN
-         SMALL = SQRT( SMALL )
-         LARGE = SQRT( LARGE )
-      END IF
-*
-      RETURN
-*
-*     End of SLABAD
-*
-      END
--- a/libcruft/lapack/slabrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,290 +0,0 @@
-      SUBROUTINE SLABRD( M, N, NB, A, LDA, D, E, TAUQ, TAUP, X, LDX, Y,
-     $                   LDY )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            LDA, LDX, LDY, M, N, NB
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), D( * ), E( * ), TAUP( * ),
-     $                   TAUQ( * ), X( LDX, * ), Y( LDY, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLABRD reduces the first NB rows and columns of a real general
-*  m by n matrix A to upper or lower bidiagonal form by an orthogonal
-*  transformation Q' * A * P, and returns the matrices X and Y which
-*  are needed to apply the transformation to the unreduced part of A.
-*
-*  If m >= n, A is reduced to upper bidiagonal form; if m < n, to lower
-*  bidiagonal form.
-*
-*  This is an auxiliary routine called by SGEBRD
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows in the matrix A.
-*
-*  N       (input) INTEGER
-*          The number of columns in the matrix A.
-*
-*  NB      (input) INTEGER
-*          The number of leading rows and columns of A to be reduced.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the m by n general matrix to be reduced.
-*          On exit, the first NB rows and columns of the matrix are
-*          overwritten; the rest of the array is unchanged.
-*          If m >= n, elements on and below the diagonal in the first NB
-*            columns, with the array TAUQ, represent the orthogonal
-*            matrix Q as a product of elementary reflectors; and
-*            elements above the diagonal in the first NB rows, with the
-*            array TAUP, represent the orthogonal matrix P as a product
-*            of elementary reflectors.
-*          If m < n, elements below the diagonal in the first NB
-*            columns, with the array TAUQ, represent the orthogonal
-*            matrix Q as a product of elementary reflectors, and
-*            elements on and above the diagonal in the first NB rows,
-*            with the array TAUP, represent the orthogonal matrix P as
-*            a product of elementary reflectors.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  D       (output) REAL array, dimension (NB)
-*          The diagonal elements of the first NB rows and columns of
-*          the reduced matrix.  D(i) = A(i,i).
-*
-*  E       (output) REAL array, dimension (NB)
-*          The off-diagonal elements of the first NB rows and columns of
-*          the reduced matrix.
-*
-*  TAUQ    (output) REAL array dimension (NB)
-*          The scalar factors of the elementary reflectors which
-*          represent the orthogonal matrix Q. See Further Details.
-*
-*  TAUP    (output) REAL array, dimension (NB)
-*          The scalar factors of the elementary reflectors which
-*          represent the orthogonal matrix P. See Further Details.
-*
-*  X       (output) REAL array, dimension (LDX,NB)
-*          The m-by-nb matrix X required to update the unreduced part
-*          of A.
-*
-*  LDX     (input) INTEGER
-*          The leading dimension of the array X. LDX >= M.
-*
-*  Y       (output) REAL array, dimension (LDY,NB)
-*          The n-by-nb matrix Y required to update the unreduced part
-*          of A.
-*
-*  LDY     (input) INTEGER
-*          The leading dimension of the array Y. LDY >= N.
-*
-*  Further Details
-*  ===============
-*
-*  The matrices Q and P are represented as products of elementary
-*  reflectors:
-*
-*     Q = H(1) H(2) . . . H(nb)  and  P = G(1) G(2) . . . G(nb)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are real scalars, and v and u are real vectors.
-*
-*  If m >= n, v(1:i-1) = 0, v(i) = 1, and v(i:m) is stored on exit in
-*  A(i:m,i); u(1:i) = 0, u(i+1) = 1, and u(i+1:n) is stored on exit in
-*  A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  If m < n, v(1:i) = 0, v(i+1) = 1, and v(i+1:m) is stored on exit in
-*  A(i+2:m,i); u(1:i-1) = 0, u(i) = 1, and u(i:n) is stored on exit in
-*  A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  The elements of the vectors v and u together form the m-by-nb matrix
-*  V and the nb-by-n matrix U' which are needed, with X and Y, to apply
-*  the transformation to the unreduced part of the matrix, using a block
-*  update of the form:  A := A - V*Y' - X*U'.
-*
-*  The contents of A on exit are illustrated by the following examples
-*  with nb = 2:
-*
-*  m = 6 and n = 5 (m > n):          m = 5 and n = 6 (m < n):
-*
-*    (  1   1   u1  u1  u1 )           (  1   u1  u1  u1  u1  u1 )
-*    (  v1  1   1   u2  u2 )           (  1   1   u2  u2  u2  u2 )
-*    (  v1  v2  a   a   a  )           (  v1  1   a   a   a   a  )
-*    (  v1  v2  a   a   a  )           (  v1  v2  a   a   a   a  )
-*    (  v1  v2  a   a   a  )           (  v1  v2  a   a   a   a  )
-*    (  v1  v2  a   a   a  )
-*
-*  where a denotes an element of the original matrix which is unchanged,
-*  vi denotes an element of the vector defining H(i), and ui an element
-*  of the vector defining G(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEMV, SLARFG, SSCAL
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 .OR. N.LE.0 )
-     $   RETURN
-*
-      IF( M.GE.N ) THEN
-*
-*        Reduce to upper bidiagonal form
-*
-         DO 10 I = 1, NB
-*
-*           Update A(i:m,i)
-*
-            CALL SGEMV( 'No transpose', M-I+1, I-1, -ONE, A( I, 1 ),
-     $                  LDA, Y( I, 1 ), LDY, ONE, A( I, I ), 1 )
-            CALL SGEMV( 'No transpose', M-I+1, I-1, -ONE, X( I, 1 ),
-     $                  LDX, A( 1, I ), 1, ONE, A( I, I ), 1 )
-*
-*           Generate reflection Q(i) to annihilate A(i+1:m,i)
-*
-            CALL SLARFG( M-I+1, A( I, I ), A( MIN( I+1, M ), I ), 1,
-     $                   TAUQ( I ) )
-            D( I ) = A( I, I )
-            IF( I.LT.N ) THEN
-               A( I, I ) = ONE
-*
-*              Compute Y(i+1:n,i)
-*
-               CALL SGEMV( 'Transpose', M-I+1, N-I, ONE, A( I, I+1 ),
-     $                     LDA, A( I, I ), 1, ZERO, Y( I+1, I ), 1 )
-               CALL SGEMV( 'Transpose', M-I+1, I-1, ONE, A( I, 1 ), LDA,
-     $                     A( I, I ), 1, ZERO, Y( 1, I ), 1 )
-               CALL SGEMV( 'No transpose', N-I, I-1, -ONE, Y( I+1, 1 ),
-     $                     LDY, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
-               CALL SGEMV( 'Transpose', M-I+1, I-1, ONE, X( I, 1 ), LDX,
-     $                     A( I, I ), 1, ZERO, Y( 1, I ), 1 )
-               CALL SGEMV( 'Transpose', I-1, N-I, -ONE, A( 1, I+1 ),
-     $                     LDA, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
-               CALL SSCAL( N-I, TAUQ( I ), Y( I+1, I ), 1 )
-*
-*              Update A(i,i+1:n)
-*
-               CALL SGEMV( 'No transpose', N-I, I, -ONE, Y( I+1, 1 ),
-     $                     LDY, A( I, 1 ), LDA, ONE, A( I, I+1 ), LDA )
-               CALL SGEMV( 'Transpose', I-1, N-I, -ONE, A( 1, I+1 ),
-     $                     LDA, X( I, 1 ), LDX, ONE, A( I, I+1 ), LDA )
-*
-*              Generate reflection P(i) to annihilate A(i,i+2:n)
-*
-               CALL SLARFG( N-I, A( I, I+1 ), A( I, MIN( I+2, N ) ),
-     $                      LDA, TAUP( I ) )
-               E( I ) = A( I, I+1 )
-               A( I, I+1 ) = ONE
-*
-*              Compute X(i+1:m,i)
-*
-               CALL SGEMV( 'No transpose', M-I, N-I, ONE, A( I+1, I+1 ),
-     $                     LDA, A( I, I+1 ), LDA, ZERO, X( I+1, I ), 1 )
-               CALL SGEMV( 'Transpose', N-I, I, ONE, Y( I+1, 1 ), LDY,
-     $                     A( I, I+1 ), LDA, ZERO, X( 1, I ), 1 )
-               CALL SGEMV( 'No transpose', M-I, I, -ONE, A( I+1, 1 ),
-     $                     LDA, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
-               CALL SGEMV( 'No transpose', I-1, N-I, ONE, A( 1, I+1 ),
-     $                     LDA, A( I, I+1 ), LDA, ZERO, X( 1, I ), 1 )
-               CALL SGEMV( 'No transpose', M-I, I-1, -ONE, X( I+1, 1 ),
-     $                     LDX, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
-               CALL SSCAL( M-I, TAUP( I ), X( I+1, I ), 1 )
-            END IF
-   10    CONTINUE
-      ELSE
-*
-*        Reduce to lower bidiagonal form
-*
-         DO 20 I = 1, NB
-*
-*           Update A(i,i:n)
-*
-            CALL SGEMV( 'No transpose', N-I+1, I-1, -ONE, Y( I, 1 ),
-     $                  LDY, A( I, 1 ), LDA, ONE, A( I, I ), LDA )
-            CALL SGEMV( 'Transpose', I-1, N-I+1, -ONE, A( 1, I ), LDA,
-     $                  X( I, 1 ), LDX, ONE, A( I, I ), LDA )
-*
-*           Generate reflection P(i) to annihilate A(i,i+1:n)
-*
-            CALL SLARFG( N-I+1, A( I, I ), A( I, MIN( I+1, N ) ), LDA,
-     $                   TAUP( I ) )
-            D( I ) = A( I, I )
-            IF( I.LT.M ) THEN
-               A( I, I ) = ONE
-*
-*              Compute X(i+1:m,i)
-*
-               CALL SGEMV( 'No transpose', M-I, N-I+1, ONE, A( I+1, I ),
-     $                     LDA, A( I, I ), LDA, ZERO, X( I+1, I ), 1 )
-               CALL SGEMV( 'Transpose', N-I+1, I-1, ONE, Y( I, 1 ), LDY,
-     $                     A( I, I ), LDA, ZERO, X( 1, I ), 1 )
-               CALL SGEMV( 'No transpose', M-I, I-1, -ONE, A( I+1, 1 ),
-     $                     LDA, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
-               CALL SGEMV( 'No transpose', I-1, N-I+1, ONE, A( 1, I ),
-     $                     LDA, A( I, I ), LDA, ZERO, X( 1, I ), 1 )
-               CALL SGEMV( 'No transpose', M-I, I-1, -ONE, X( I+1, 1 ),
-     $                     LDX, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
-               CALL SSCAL( M-I, TAUP( I ), X( I+1, I ), 1 )
-*
-*              Update A(i+1:m,i)
-*
-               CALL SGEMV( 'No transpose', M-I, I-1, -ONE, A( I+1, 1 ),
-     $                     LDA, Y( I, 1 ), LDY, ONE, A( I+1, I ), 1 )
-               CALL SGEMV( 'No transpose', M-I, I, -ONE, X( I+1, 1 ),
-     $                     LDX, A( 1, I ), 1, ONE, A( I+1, I ), 1 )
-*
-*              Generate reflection Q(i) to annihilate A(i+2:m,i)
-*
-               CALL SLARFG( M-I, A( I+1, I ), A( MIN( I+2, M ), I ), 1,
-     $                      TAUQ( I ) )
-               E( I ) = A( I+1, I )
-               A( I+1, I ) = ONE
-*
-*              Compute Y(i+1:n,i)
-*
-               CALL SGEMV( 'Transpose', M-I, N-I, ONE, A( I+1, I+1 ),
-     $                     LDA, A( I+1, I ), 1, ZERO, Y( I+1, I ), 1 )
-               CALL SGEMV( 'Transpose', M-I, I-1, ONE, A( I+1, 1 ), LDA,
-     $                     A( I+1, I ), 1, ZERO, Y( 1, I ), 1 )
-               CALL SGEMV( 'No transpose', N-I, I-1, -ONE, Y( I+1, 1 ),
-     $                     LDY, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
-               CALL SGEMV( 'Transpose', M-I, I, ONE, X( I+1, 1 ), LDX,
-     $                     A( I+1, I ), 1, ZERO, Y( 1, I ), 1 )
-               CALL SGEMV( 'Transpose', I, N-I, -ONE, A( 1, I+1 ), LDA,
-     $                     Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
-               CALL SSCAL( N-I, TAUQ( I ), Y( I+1, I ), 1 )
-            END IF
-   20    CONTINUE
-      END IF
-      RETURN
-*
-*     End of SLABRD
-*
-      END
--- a/libcruft/lapack/slacn2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,214 +0,0 @@
-      SUBROUTINE SLACN2( N, V, X, ISGN, EST, KASE, ISAVE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            KASE, N
-      REAL               EST
-*     ..
-*     .. Array Arguments ..
-      INTEGER            ISGN( * ), ISAVE( 3 )
-      REAL               V( * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLACN2 estimates the 1-norm of a square, real matrix A.
-*  Reverse communication is used for evaluating matrix-vector products.
-*
-*  Arguments
-*  =========
-*
-*  N      (input) INTEGER
-*         The order of the matrix.  N >= 1.
-*
-*  V      (workspace) REAL array, dimension (N)
-*         On the final return, V = A*W,  where  EST = norm(V)/norm(W)
-*         (W is not returned).
-*
-*  X      (input/output) REAL array, dimension (N)
-*         On an intermediate return, X should be overwritten by
-*               A * X,   if KASE=1,
-*               A' * X,  if KASE=2,
-*         and SLACN2 must be re-called with all the other parameters
-*         unchanged.
-*
-*  ISGN   (workspace) INTEGER array, dimension (N)
-*
-*  EST    (input/output) REAL
-*         On entry with KASE = 1 or 2 and ISAVE(1) = 3, EST should be
-*         unchanged from the previous call to SLACN2.
-*         On exit, EST is an estimate (a lower bound) for norm(A). 
-*
-*  KASE   (input/output) INTEGER
-*         On the initial call to SLACN2, KASE should be 0.
-*         On an intermediate return, KASE will be 1 or 2, indicating
-*         whether X should be overwritten by A * X  or A' * X.
-*         On the final return from SLACN2, KASE will again be 0.
-*
-*  ISAVE  (input/output) INTEGER array, dimension (3)
-*         ISAVE is used to save variables between calls to SLACN2
-*
-*  Further Details
-*  ======= =======
-*
-*  Contributed by Nick Higham, University of Manchester.
-*  Originally named SONEST, dated March 16, 1988.
-*
-*  Reference: N.J. Higham, "FORTRAN codes for estimating the one-norm of
-*  a real or complex matrix, with applications to condition estimation",
-*  ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988.
-*
-*  This is a thread safe version of SLACON, which uses the array ISAVE
-*  in place of a SAVE statement, as follows:
-*
-*     SLACON     SLACN2
-*      JUMP     ISAVE(1)
-*      J        ISAVE(2)
-*      ITER     ISAVE(3)
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            ITMAX
-      PARAMETER          ( ITMAX = 5 )
-      REAL               ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0, TWO = 2.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, JLAST
-      REAL               ALTSGN, ESTOLD, TEMP
-*     ..
-*     .. External Functions ..
-      INTEGER            ISAMAX
-      REAL               SASUM
-      EXTERNAL           ISAMAX, SASUM
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, NINT, REAL, SIGN
-*     ..
-*     .. Executable Statements ..
-*
-      IF( KASE.EQ.0 ) THEN
-         DO 10 I = 1, N
-            X( I ) = ONE / REAL( N )
-   10    CONTINUE
-         KASE = 1
-         ISAVE( 1 ) = 1
-         RETURN
-      END IF
-*
-      GO TO ( 20, 40, 70, 110, 140 )ISAVE( 1 )
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 1)
-*     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY A*X.
-*
-   20 CONTINUE
-      IF( N.EQ.1 ) THEN
-         V( 1 ) = X( 1 )
-         EST = ABS( V( 1 ) )
-*        ... QUIT
-         GO TO 150
-      END IF
-      EST = SASUM( N, X, 1 )
-*
-      DO 30 I = 1, N
-         X( I ) = SIGN( ONE, X( I ) )
-         ISGN( I ) = NINT( X( I ) )
-   30 CONTINUE
-      KASE = 2
-      ISAVE( 1 ) = 2
-      RETURN
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 2)
-*     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X.
-*
-   40 CONTINUE
-      ISAVE( 2 ) = ISAMAX( N, X, 1 )
-      ISAVE( 3 ) = 2
-*
-*     MAIN LOOP - ITERATIONS 2,3,...,ITMAX.
-*
-   50 CONTINUE
-      DO 60 I = 1, N
-         X( I ) = ZERO
-   60 CONTINUE
-      X( ISAVE( 2 ) ) = ONE
-      KASE = 1
-      ISAVE( 1 ) = 3
-      RETURN
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 3)
-*     X HAS BEEN OVERWRITTEN BY A*X.
-*
-   70 CONTINUE
-      CALL SCOPY( N, X, 1, V, 1 )
-      ESTOLD = EST
-      EST = SASUM( N, V, 1 )
-      DO 80 I = 1, N
-         IF( NINT( SIGN( ONE, X( I ) ) ).NE.ISGN( I ) )
-     $      GO TO 90
-   80 CONTINUE
-*     REPEATED SIGN VECTOR DETECTED, HENCE ALGORITHM HAS CONVERGED.
-      GO TO 120
-*
-   90 CONTINUE
-*     TEST FOR CYCLING.
-      IF( EST.LE.ESTOLD )
-     $   GO TO 120
-*
-      DO 100 I = 1, N
-         X( I ) = SIGN( ONE, X( I ) )
-         ISGN( I ) = NINT( X( I ) )
-  100 CONTINUE
-      KASE = 2
-      ISAVE( 1 ) = 4
-      RETURN
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 4)
-*     X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X.
-*
-  110 CONTINUE
-      JLAST = ISAVE( 2 )
-      ISAVE( 2 ) = ISAMAX( N, X, 1 )
-      IF( ( X( JLAST ).NE.ABS( X( ISAVE( 2 ) ) ) ) .AND.
-     $    ( ISAVE( 3 ).LT.ITMAX ) ) THEN
-         ISAVE( 3 ) = ISAVE( 3 ) + 1
-         GO TO 50
-      END IF
-*
-*     ITERATION COMPLETE.  FINAL STAGE.
-*
-  120 CONTINUE
-      ALTSGN = ONE
-      DO 130 I = 1, N
-         X( I ) = ALTSGN*( ONE+REAL( I-1 ) / REAL( N-1 ) )
-         ALTSGN = -ALTSGN
-  130 CONTINUE
-      KASE = 1
-      ISAVE( 1 ) = 5
-      RETURN
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 5)
-*     X HAS BEEN OVERWRITTEN BY A*X.
-*
-  140 CONTINUE
-      TEMP = TWO*( SASUM( N, X, 1 ) / REAL( 3*N ) )
-      IF( TEMP.GT.EST ) THEN
-         CALL SCOPY( N, X, 1, V, 1 )
-         EST = TEMP
-      END IF
-*
-  150 CONTINUE
-      KASE = 0
-      RETURN
-*
-*     End of SLACN2
-*
-      END
--- a/libcruft/lapack/slacon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,205 +0,0 @@
-      SUBROUTINE SLACON( N, V, X, ISGN, EST, KASE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            KASE, N
-      REAL               EST
-*     ..
-*     .. Array Arguments ..
-      INTEGER            ISGN( * )
-      REAL               V( * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLACON estimates the 1-norm of a square, real matrix A.
-*  Reverse communication is used for evaluating matrix-vector products.
-*
-*  Arguments
-*  =========
-*
-*  N      (input) INTEGER
-*         The order of the matrix.  N >= 1.
-*
-*  V      (workspace) REAL array, dimension (N)
-*         On the final return, V = A*W,  where  EST = norm(V)/norm(W)
-*         (W is not returned).
-*
-*  X      (input/output) REAL array, dimension (N)
-*         On an intermediate return, X should be overwritten by
-*               A * X,   if KASE=1,
-*               A' * X,  if KASE=2,
-*         and SLACON must be re-called with all the other parameters
-*         unchanged.
-*
-*  ISGN   (workspace) INTEGER array, dimension (N)
-*
-*  EST    (input/output) REAL
-*         On entry with KASE = 1 or 2 and JUMP = 3, EST should be
-*         unchanged from the previous call to SLACON.
-*         On exit, EST is an estimate (a lower bound) for norm(A). 
-*
-*  KASE   (input/output) INTEGER
-*         On the initial call to SLACON, KASE should be 0.
-*         On an intermediate return, KASE will be 1 or 2, indicating
-*         whether X should be overwritten by A * X  or A' * X.
-*         On the final return from SLACON, KASE will again be 0.
-*
-*  Further Details
-*  ======= =======
-*
-*  Contributed by Nick Higham, University of Manchester.
-*  Originally named SONEST, dated March 16, 1988.
-*
-*  Reference: N.J. Higham, "FORTRAN codes for estimating the one-norm of
-*  a real or complex matrix, with applications to condition estimation",
-*  ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            ITMAX
-      PARAMETER          ( ITMAX = 5 )
-      REAL               ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0, TWO = 2.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ITER, J, JLAST, JUMP
-      REAL               ALTSGN, ESTOLD, TEMP
-*     ..
-*     .. External Functions ..
-      INTEGER            ISAMAX
-      REAL               SASUM
-      EXTERNAL           ISAMAX, SASUM
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, NINT, REAL, SIGN
-*     ..
-*     .. Save statement ..
-      SAVE
-*     ..
-*     .. Executable Statements ..
-*
-      IF( KASE.EQ.0 ) THEN
-         DO 10 I = 1, N
-            X( I ) = ONE / REAL( N )
-   10    CONTINUE
-         KASE = 1
-         JUMP = 1
-         RETURN
-      END IF
-*
-      GO TO ( 20, 40, 70, 110, 140 )JUMP
-*
-*     ................ ENTRY   (JUMP = 1)
-*     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY A*X.
-*
-   20 CONTINUE
-      IF( N.EQ.1 ) THEN
-         V( 1 ) = X( 1 )
-         EST = ABS( V( 1 ) )
-*        ... QUIT
-         GO TO 150
-      END IF
-      EST = SASUM( N, X, 1 )
-*
-      DO 30 I = 1, N
-         X( I ) = SIGN( ONE, X( I ) )
-         ISGN( I ) = NINT( X( I ) )
-   30 CONTINUE
-      KASE = 2
-      JUMP = 2
-      RETURN
-*
-*     ................ ENTRY   (JUMP = 2)
-*     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X.
-*
-   40 CONTINUE
-      J = ISAMAX( N, X, 1 )
-      ITER = 2
-*
-*     MAIN LOOP - ITERATIONS 2,3,...,ITMAX.
-*
-   50 CONTINUE
-      DO 60 I = 1, N
-         X( I ) = ZERO
-   60 CONTINUE
-      X( J ) = ONE
-      KASE = 1
-      JUMP = 3
-      RETURN
-*
-*     ................ ENTRY   (JUMP = 3)
-*     X HAS BEEN OVERWRITTEN BY A*X.
-*
-   70 CONTINUE
-      CALL SCOPY( N, X, 1, V, 1 )
-      ESTOLD = EST
-      EST = SASUM( N, V, 1 )
-      DO 80 I = 1, N
-         IF( NINT( SIGN( ONE, X( I ) ) ).NE.ISGN( I ) )
-     $      GO TO 90
-   80 CONTINUE
-*     REPEATED SIGN VECTOR DETECTED, HENCE ALGORITHM HAS CONVERGED.
-      GO TO 120
-*
-   90 CONTINUE
-*     TEST FOR CYCLING.
-      IF( EST.LE.ESTOLD )
-     $   GO TO 120
-*
-      DO 100 I = 1, N
-         X( I ) = SIGN( ONE, X( I ) )
-         ISGN( I ) = NINT( X( I ) )
-  100 CONTINUE
-      KASE = 2
-      JUMP = 4
-      RETURN
-*
-*     ................ ENTRY   (JUMP = 4)
-*     X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X.
-*
-  110 CONTINUE
-      JLAST = J
-      J = ISAMAX( N, X, 1 )
-      IF( ( X( JLAST ).NE.ABS( X( J ) ) ) .AND. ( ITER.LT.ITMAX ) ) THEN
-         ITER = ITER + 1
-         GO TO 50
-      END IF
-*
-*     ITERATION COMPLETE.  FINAL STAGE.
-*
-  120 CONTINUE
-      ALTSGN = ONE
-      DO 130 I = 1, N
-         X( I ) = ALTSGN*( ONE+REAL( I-1 ) / REAL( N-1 ) )
-         ALTSGN = -ALTSGN
-  130 CONTINUE
-      KASE = 1
-      JUMP = 5
-      RETURN
-*
-*     ................ ENTRY   (JUMP = 5)
-*     X HAS BEEN OVERWRITTEN BY A*X.
-*
-  140 CONTINUE
-      TEMP = TWO*( SASUM( N, X, 1 ) / REAL( 3*N ) )
-      IF( TEMP.GT.EST ) THEN
-         CALL SCOPY( N, X, 1, V, 1 )
-         EST = TEMP
-      END IF
-*
-  150 CONTINUE
-      KASE = 0
-      RETURN
-*
-*     End of SLACON
-*
-      END
--- a/libcruft/lapack/slacpy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-      SUBROUTINE SLACPY( UPLO, M, N, A, LDA, B, LDB )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            LDA, LDB, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLACPY copies all or part of a two-dimensional matrix A to another
-*  matrix B.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies the part of the matrix A to be copied to B.
-*          = 'U':      Upper triangular part
-*          = 'L':      Lower triangular part
-*          Otherwise:  All of the matrix A
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input) REAL array, dimension (LDA,N)
-*          The m by n matrix A.  If UPLO = 'U', only the upper triangle
-*          or trapezoid is accessed; if UPLO = 'L', only the lower
-*          triangle or trapezoid is accessed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  B       (output) REAL array, dimension (LDB,N)
-*          On exit, B = A in the locations specified by UPLO.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,M).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-      IF( LSAME( UPLO, 'U' ) ) THEN
-         DO 20 J = 1, N
-            DO 10 I = 1, MIN( J, M )
-               B( I, J ) = A( I, J )
-   10       CONTINUE
-   20    CONTINUE
-      ELSE IF( LSAME( UPLO, 'L' ) ) THEN
-         DO 40 J = 1, N
-            DO 30 I = J, M
-               B( I, J ) = A( I, J )
-   30       CONTINUE
-   40    CONTINUE
-      ELSE
-         DO 60 J = 1, N
-            DO 50 I = 1, M
-               B( I, J ) = A( I, J )
-   50       CONTINUE
-   60    CONTINUE
-      END IF
-      RETURN
-*
-*     End of SLACPY
-*
-      END
--- a/libcruft/lapack/sladiv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-      SUBROUTINE SLADIV( A, B, C, D, P, Q )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      REAL               A, B, C, D, P, Q
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLADIV performs complex division in  real arithmetic
-*
-*                        a + i*b
-*             p + i*q = ---------
-*                        c + i*d
-*
-*  The algorithm is due to Robert L. Smith and can be found
-*  in D. Knuth, The art of Computer Programming, Vol.2, p.195
-*
-*  Arguments
-*  =========
-*
-*  A       (input) REAL
-*  B       (input) REAL
-*  C       (input) REAL
-*  D       (input) REAL
-*          The scalars a, b, c, and d in the above expression.
-*
-*  P       (output) REAL
-*  Q       (output) REAL
-*          The scalars p and q in the above expression.
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      REAL               E, F
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. Executable Statements ..
-*
-      IF( ABS( D ).LT.ABS( C ) ) THEN
-         E = D / C
-         F = C + D*E
-         P = ( A+B*E ) / F
-         Q = ( B-A*E ) / F
-      ELSE
-         E = C / D
-         F = D + C*E
-         P = ( B+A*E ) / F
-         Q = ( -A+B*E ) / F
-      END IF
-*
-      RETURN
-*
-*     End of SLADIV
-*
-      END
--- a/libcruft/lapack/slae2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,123 +0,0 @@
-      SUBROUTINE SLAE2( A, B, C, RT1, RT2 )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      REAL               A, B, C, RT1, RT2
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAE2  computes the eigenvalues of a 2-by-2 symmetric matrix
-*     [  A   B  ]
-*     [  B   C  ].
-*  On return, RT1 is the eigenvalue of larger absolute value, and RT2
-*  is the eigenvalue of smaller absolute value.
-*
-*  Arguments
-*  =========
-*
-*  A       (input) REAL
-*          The (1,1) element of the 2-by-2 matrix.
-*
-*  B       (input) REAL
-*          The (1,2) and (2,1) elements of the 2-by-2 matrix.
-*
-*  C       (input) REAL
-*          The (2,2) element of the 2-by-2 matrix.
-*
-*  RT1     (output) REAL
-*          The eigenvalue of larger absolute value.
-*
-*  RT2     (output) REAL
-*          The eigenvalue of smaller absolute value.
-*
-*  Further Details
-*  ===============
-*
-*  RT1 is accurate to a few ulps barring over/underflow.
-*
-*  RT2 may be inaccurate if there is massive cancellation in the
-*  determinant A*C-B*B; higher precision or correctly rounded or
-*  correctly truncated arithmetic would be needed to compute RT2
-*  accurately in all cases.
-*
-*  Overflow is possible only if RT1 is within a factor of 5 of overflow.
-*  Underflow is harmless if the input data is 0 or exceeds
-*     underflow_threshold / macheps.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E0 )
-      REAL               TWO
-      PARAMETER          ( TWO = 2.0E0 )
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E0 )
-      REAL               HALF
-      PARAMETER          ( HALF = 0.5E0 )
-*     ..
-*     .. Local Scalars ..
-      REAL               AB, ACMN, ACMX, ADF, DF, RT, SM, TB
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Compute the eigenvalues
-*
-      SM = A + C
-      DF = A - C
-      ADF = ABS( DF )
-      TB = B + B
-      AB = ABS( TB )
-      IF( ABS( A ).GT.ABS( C ) ) THEN
-         ACMX = A
-         ACMN = C
-      ELSE
-         ACMX = C
-         ACMN = A
-      END IF
-      IF( ADF.GT.AB ) THEN
-         RT = ADF*SQRT( ONE+( AB / ADF )**2 )
-      ELSE IF( ADF.LT.AB ) THEN
-         RT = AB*SQRT( ONE+( ADF / AB )**2 )
-      ELSE
-*
-*        Includes case AB=ADF=0
-*
-         RT = AB*SQRT( TWO )
-      END IF
-      IF( SM.LT.ZERO ) THEN
-         RT1 = HALF*( SM-RT )
-*
-*        Order of execution important.
-*        To get fully accurate smaller eigenvalue,
-*        next line needs to be executed in higher precision.
-*
-         RT2 = ( ACMX / RT1 )*ACMN - ( B / RT1 )*B
-      ELSE IF( SM.GT.ZERO ) THEN
-         RT1 = HALF*( SM+RT )
-*
-*        Order of execution important.
-*        To get fully accurate smaller eigenvalue,
-*        next line needs to be executed in higher precision.
-*
-         RT2 = ( ACMX / RT1 )*ACMN - ( B / RT1 )*B
-      ELSE
-*
-*        Includes case RT1 = RT2 = 0
-*
-         RT1 = HALF*RT
-         RT2 = -HALF*RT
-      END IF
-      RETURN
-*
-*     End of SLAE2
-*
-      END
--- a/libcruft/lapack/slaed6.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,327 +0,0 @@
-      SUBROUTINE SLAED6( KNITER, ORGATI, RHO, D, Z, FINIT, TAU, INFO )
-*
-*  -- LAPACK routine (version 3.1.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     February 2007
-*
-*     .. Scalar Arguments ..
-      LOGICAL            ORGATI
-      INTEGER            INFO, KNITER
-      REAL               FINIT, RHO, TAU
-*     ..
-*     .. Array Arguments ..
-      REAL               D( 3 ), Z( 3 )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAED6 computes the positive or negative root (closest to the origin)
-*  of
-*                   z(1)        z(2)        z(3)
-*  f(x) =   rho + --------- + ---------- + ---------
-*                  d(1)-x      d(2)-x      d(3)-x
-*
-*  It is assumed that
-*
-*        if ORGATI = .true. the root is between d(2) and d(3);
-*        otherwise it is between d(1) and d(2)
-*
-*  This routine will be called by SLAED4 when necessary. In most cases,
-*  the root sought is the smallest in magnitude, though it might not be
-*  in some extremely rare situations.
-*
-*  Arguments
-*  =========
-*
-*  KNITER       (input) INTEGER
-*               Refer to SLAED4 for its significance.
-*
-*  ORGATI       (input) LOGICAL
-*               If ORGATI is true, the needed root is between d(2) and
-*               d(3); otherwise it is between d(1) and d(2).  See
-*               SLAED4 for further details.
-*
-*  RHO          (input) REAL            
-*               Refer to the equation f(x) above.
-*
-*  D            (input) REAL array, dimension (3)
-*               D satisfies d(1) < d(2) < d(3).
-*
-*  Z            (input) REAL array, dimension (3)
-*               Each of the elements in z must be positive.
-*
-*  FINIT        (input) REAL            
-*               The value of f at 0. It is more accurate than the one
-*               evaluated inside this routine (if someone wants to do
-*               so).
-*
-*  TAU          (output) REAL            
-*               The root of the equation f(x).
-*
-*  INFO         (output) INTEGER
-*               = 0: successful exit
-*               > 0: if INFO = 1, failure to converge
-*
-*  Further Details
-*  ===============
-*
-*  30/06/99: Based on contributions by
-*     Ren-Cang Li, Computer Science Division, University of California
-*     at Berkeley, USA
-*
-*  10/02/03: This version has a few statements commented out for thread safety
-*     (machine parameters are computed on each entry). SJH.
-*
-*  05/10/06: Modified from a new version of Ren-Cang Li, use
-*     Gragg-Thornton-Warner cubic convergent scheme for better stability.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            MAXIT
-      PARAMETER          ( MAXIT = 40 )
-      REAL               ZERO, ONE, TWO, THREE, FOUR, EIGHT
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0,
-     $                   THREE = 3.0E0, FOUR = 4.0E0, EIGHT = 8.0E0 )
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      EXTERNAL           SLAMCH
-*     ..
-*     .. Local Arrays ..
-      REAL               DSCALE( 3 ), ZSCALE( 3 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            SCALE
-      INTEGER            I, ITER, NITER
-      REAL               A, B, BASE, C, DDF, DF, EPS, ERRETM, ETA, F,
-     $                   FC, SCLFAC, SCLINV, SMALL1, SMALL2, SMINV1,
-     $                   SMINV2, TEMP, TEMP1, TEMP2, TEMP3, TEMP4, 
-     $                   LBD, UBD
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, INT, LOG, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-*
-      IF( ORGATI ) THEN
-         LBD = D(2)
-         UBD = D(3)
-      ELSE
-         LBD = D(1)
-         UBD = D(2)
-      END IF
-      IF( FINIT .LT. ZERO )THEN
-         LBD = ZERO
-      ELSE
-         UBD = ZERO 
-      END IF
-*
-      NITER = 1
-      TAU = ZERO
-      IF( KNITER.EQ.2 ) THEN
-         IF( ORGATI ) THEN
-            TEMP = ( D( 3 )-D( 2 ) ) / TWO
-            C = RHO + Z( 1 ) / ( ( D( 1 )-D( 2 ) )-TEMP )
-            A = C*( D( 2 )+D( 3 ) ) + Z( 2 ) + Z( 3 )
-            B = C*D( 2 )*D( 3 ) + Z( 2 )*D( 3 ) + Z( 3 )*D( 2 )
-         ELSE
-            TEMP = ( D( 1 )-D( 2 ) ) / TWO
-            C = RHO + Z( 3 ) / ( ( D( 3 )-D( 2 ) )-TEMP )
-            A = C*( D( 1 )+D( 2 ) ) + Z( 1 ) + Z( 2 )
-            B = C*D( 1 )*D( 2 ) + Z( 1 )*D( 2 ) + Z( 2 )*D( 1 )
-         END IF
-         TEMP = MAX( ABS( A ), ABS( B ), ABS( C ) )
-         A = A / TEMP
-         B = B / TEMP
-         C = C / TEMP
-         IF( C.EQ.ZERO ) THEN
-            TAU = B / A
-         ELSE IF( A.LE.ZERO ) THEN
-            TAU = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
-         ELSE
-            TAU = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) )
-         END IF
-         IF( TAU .LT. LBD .OR. TAU .GT. UBD )
-     $      TAU = ( LBD+UBD )/TWO
-         IF( D(1).EQ.TAU .OR. D(2).EQ.TAU .OR. D(3).EQ.TAU ) THEN
-            TAU = ZERO
-         ELSE
-            TEMP = FINIT + TAU*Z(1)/( D(1)*( D( 1 )-TAU ) ) +
-     $                     TAU*Z(2)/( D(2)*( D( 2 )-TAU ) ) +
-     $                     TAU*Z(3)/( D(3)*( D( 3 )-TAU ) )
-            IF( TEMP .LE. ZERO )THEN
-               LBD = TAU
-            ELSE
-               UBD = TAU
-            END IF
-            IF( ABS( FINIT ).LE.ABS( TEMP ) )
-     $         TAU = ZERO
-         END IF
-      END IF
-*
-*     get machine parameters for possible scaling to avoid overflow
-*
-*     modified by Sven: parameters SMALL1, SMINV1, SMALL2,
-*     SMINV2, EPS are not SAVEd anymore between one call to the
-*     others but recomputed at each call
-*
-      EPS = SLAMCH( 'Epsilon' )
-      BASE = SLAMCH( 'Base' )
-      SMALL1 = BASE**( INT( LOG( SLAMCH( 'SafMin' ) ) / LOG( BASE ) /
-     $         THREE ) )
-      SMINV1 = ONE / SMALL1
-      SMALL2 = SMALL1*SMALL1
-      SMINV2 = SMINV1*SMINV1
-*
-*     Determine if scaling of inputs necessary to avoid overflow
-*     when computing 1/TEMP**3
-*
-      IF( ORGATI ) THEN
-         TEMP = MIN( ABS( D( 2 )-TAU ), ABS( D( 3 )-TAU ) )
-      ELSE
-         TEMP = MIN( ABS( D( 1 )-TAU ), ABS( D( 2 )-TAU ) )
-      END IF
-      SCALE = .FALSE.
-      IF( TEMP.LE.SMALL1 ) THEN
-         SCALE = .TRUE.
-         IF( TEMP.LE.SMALL2 ) THEN
-*
-*        Scale up by power of radix nearest 1/SAFMIN**(2/3)
-*
-            SCLFAC = SMINV2
-            SCLINV = SMALL2
-         ELSE
-*
-*        Scale up by power of radix nearest 1/SAFMIN**(1/3)
-*
-            SCLFAC = SMINV1
-            SCLINV = SMALL1
-         END IF
-*
-*        Scaling up safe because D, Z, TAU scaled elsewhere to be O(1)
-*
-         DO 10 I = 1, 3
-            DSCALE( I ) = D( I )*SCLFAC
-            ZSCALE( I ) = Z( I )*SCLFAC
-   10    CONTINUE
-         TAU = TAU*SCLFAC
-         LBD = LBD*SCLFAC
-         UBD = UBD*SCLFAC
-      ELSE
-*
-*        Copy D and Z to DSCALE and ZSCALE
-*
-         DO 20 I = 1, 3
-            DSCALE( I ) = D( I )
-            ZSCALE( I ) = Z( I )
-   20    CONTINUE
-      END IF
-*
-      FC = ZERO
-      DF = ZERO
-      DDF = ZERO
-      DO 30 I = 1, 3
-         TEMP = ONE / ( DSCALE( I )-TAU )
-         TEMP1 = ZSCALE( I )*TEMP
-         TEMP2 = TEMP1*TEMP
-         TEMP3 = TEMP2*TEMP
-         FC = FC + TEMP1 / DSCALE( I )
-         DF = DF + TEMP2
-         DDF = DDF + TEMP3
-   30 CONTINUE
-      F = FINIT + TAU*FC
-*
-      IF( ABS( F ).LE.ZERO )
-     $   GO TO 60
-      IF( F .LE. ZERO )THEN
-         LBD = TAU
-      ELSE
-         UBD = TAU
-      END IF
-*
-*        Iteration begins -- Use Gragg-Thornton-Warner cubic convergent
-*                            scheme
-*
-*     It is not hard to see that
-*
-*           1) Iterations will go up monotonically
-*              if FINIT < 0;
-*
-*           2) Iterations will go down monotonically
-*              if FINIT > 0.
-*
-      ITER = NITER + 1
-*
-      DO 50 NITER = ITER, MAXIT
-*
-         IF( ORGATI ) THEN
-            TEMP1 = DSCALE( 2 ) - TAU
-            TEMP2 = DSCALE( 3 ) - TAU
-         ELSE
-            TEMP1 = DSCALE( 1 ) - TAU
-            TEMP2 = DSCALE( 2 ) - TAU
-         END IF
-         A = ( TEMP1+TEMP2 )*F - TEMP1*TEMP2*DF
-         B = TEMP1*TEMP2*F
-         C = F - ( TEMP1+TEMP2 )*DF + TEMP1*TEMP2*DDF
-         TEMP = MAX( ABS( A ), ABS( B ), ABS( C ) )
-         A = A / TEMP
-         B = B / TEMP
-         C = C / TEMP
-         IF( C.EQ.ZERO ) THEN
-            ETA = B / A
-         ELSE IF( A.LE.ZERO ) THEN
-            ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
-         ELSE
-            ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) )
-         END IF
-         IF( F*ETA.GE.ZERO ) THEN
-            ETA = -F / DF
-         END IF
-*
-         TAU = TAU + ETA
-         IF( TAU .LT. LBD .OR. TAU .GT. UBD )
-     $      TAU = ( LBD + UBD )/TWO 
-*
-         FC = ZERO
-         ERRETM = ZERO
-         DF = ZERO
-         DDF = ZERO
-         DO 40 I = 1, 3
-            TEMP = ONE / ( DSCALE( I )-TAU )
-            TEMP1 = ZSCALE( I )*TEMP
-            TEMP2 = TEMP1*TEMP
-            TEMP3 = TEMP2*TEMP
-            TEMP4 = TEMP1 / DSCALE( I )
-            FC = FC + TEMP4
-            ERRETM = ERRETM + ABS( TEMP4 )
-            DF = DF + TEMP2
-            DDF = DDF + TEMP3
-   40    CONTINUE
-         F = FINIT + TAU*FC
-         ERRETM = EIGHT*( ABS( FINIT )+ABS( TAU )*ERRETM ) +
-     $            ABS( TAU )*DF
-         IF( ABS( F ).LE.EPS*ERRETM )
-     $      GO TO 60
-         IF( F .LE. ZERO )THEN
-            LBD = TAU
-         ELSE
-            UBD = TAU
-         END IF
-   50 CONTINUE
-      INFO = 1
-   60 CONTINUE
-*
-*     Undo scaling
-*
-      IF( SCALE )
-     $   TAU = TAU*SCLINV
-      RETURN
-*
-*     End of SLAED6
-*
-      END
--- a/libcruft/lapack/slaev2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,169 +0,0 @@
-      SUBROUTINE SLAEV2( A, B, C, RT1, RT2, CS1, SN1 )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      REAL               A, B, C, CS1, RT1, RT2, SN1
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAEV2 computes the eigendecomposition of a 2-by-2 symmetric matrix
-*     [  A   B  ]
-*     [  B   C  ].
-*  On return, RT1 is the eigenvalue of larger absolute value, RT2 is the
-*  eigenvalue of smaller absolute value, and (CS1,SN1) is the unit right
-*  eigenvector for RT1, giving the decomposition
-*
-*     [ CS1  SN1 ] [  A   B  ] [ CS1 -SN1 ]  =  [ RT1  0  ]
-*     [-SN1  CS1 ] [  B   C  ] [ SN1  CS1 ]     [  0  RT2 ].
-*
-*  Arguments
-*  =========
-*
-*  A       (input) REAL
-*          The (1,1) element of the 2-by-2 matrix.
-*
-*  B       (input) REAL
-*          The (1,2) element and the conjugate of the (2,1) element of
-*          the 2-by-2 matrix.
-*
-*  C       (input) REAL
-*          The (2,2) element of the 2-by-2 matrix.
-*
-*  RT1     (output) REAL
-*          The eigenvalue of larger absolute value.
-*
-*  RT2     (output) REAL
-*          The eigenvalue of smaller absolute value.
-*
-*  CS1     (output) REAL
-*  SN1     (output) REAL
-*          The vector (CS1, SN1) is a unit right eigenvector for RT1.
-*
-*  Further Details
-*  ===============
-*
-*  RT1 is accurate to a few ulps barring over/underflow.
-*
-*  RT2 may be inaccurate if there is massive cancellation in the
-*  determinant A*C-B*B; higher precision or correctly rounded or
-*  correctly truncated arithmetic would be needed to compute RT2
-*  accurately in all cases.
-*
-*  CS1 and SN1 are accurate to a few ulps barring over/underflow.
-*
-*  Overflow is possible only if RT1 is within a factor of 5 of overflow.
-*  Underflow is harmless if the input data is 0 or exceeds
-*     underflow_threshold / macheps.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E0 )
-      REAL               TWO
-      PARAMETER          ( TWO = 2.0E0 )
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E0 )
-      REAL               HALF
-      PARAMETER          ( HALF = 0.5E0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            SGN1, SGN2
-      REAL               AB, ACMN, ACMX, ACS, ADF, CS, CT, DF, RT, SM,
-     $                   TB, TN
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Compute the eigenvalues
-*
-      SM = A + C
-      DF = A - C
-      ADF = ABS( DF )
-      TB = B + B
-      AB = ABS( TB )
-      IF( ABS( A ).GT.ABS( C ) ) THEN
-         ACMX = A
-         ACMN = C
-      ELSE
-         ACMX = C
-         ACMN = A
-      END IF
-      IF( ADF.GT.AB ) THEN
-         RT = ADF*SQRT( ONE+( AB / ADF )**2 )
-      ELSE IF( ADF.LT.AB ) THEN
-         RT = AB*SQRT( ONE+( ADF / AB )**2 )
-      ELSE
-*
-*        Includes case AB=ADF=0
-*
-         RT = AB*SQRT( TWO )
-      END IF
-      IF( SM.LT.ZERO ) THEN
-         RT1 = HALF*( SM-RT )
-         SGN1 = -1
-*
-*        Order of execution important.
-*        To get fully accurate smaller eigenvalue,
-*        next line needs to be executed in higher precision.
-*
-         RT2 = ( ACMX / RT1 )*ACMN - ( B / RT1 )*B
-      ELSE IF( SM.GT.ZERO ) THEN
-         RT1 = HALF*( SM+RT )
-         SGN1 = 1
-*
-*        Order of execution important.
-*        To get fully accurate smaller eigenvalue,
-*        next line needs to be executed in higher precision.
-*
-         RT2 = ( ACMX / RT1 )*ACMN - ( B / RT1 )*B
-      ELSE
-*
-*        Includes case RT1 = RT2 = 0
-*
-         RT1 = HALF*RT
-         RT2 = -HALF*RT
-         SGN1 = 1
-      END IF
-*
-*     Compute the eigenvector
-*
-      IF( DF.GE.ZERO ) THEN
-         CS = DF + RT
-         SGN2 = 1
-      ELSE
-         CS = DF - RT
-         SGN2 = -1
-      END IF
-      ACS = ABS( CS )
-      IF( ACS.GT.AB ) THEN
-         CT = -TB / CS
-         SN1 = ONE / SQRT( ONE+CT*CT )
-         CS1 = CT*SN1
-      ELSE
-         IF( AB.EQ.ZERO ) THEN
-            CS1 = ONE
-            SN1 = ZERO
-         ELSE
-            TN = -CS / TB
-            CS1 = ONE / SQRT( ONE+TN*TN )
-            SN1 = TN*CS1
-         END IF
-      END IF
-      IF( SGN1.EQ.SGN2 ) THEN
-         TN = CS1
-         CS1 = -SN1
-         SN1 = TN
-      END IF
-      RETURN
-*
-*     End of SLAEV2
-*
-      END
--- a/libcruft/lapack/slaexc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,353 +0,0 @@
-      SUBROUTINE SLAEXC( WANTQ, N, T, LDT, Q, LDQ, J1, N1, N2, WORK,
-     $                   INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            WANTQ
-      INTEGER            INFO, J1, LDQ, LDT, N, N1, N2
-*     ..
-*     .. Array Arguments ..
-      REAL               Q( LDQ, * ), T( LDT, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAEXC swaps adjacent diagonal blocks T11 and T22 of order 1 or 2 in
-*  an upper quasi-triangular matrix T by an orthogonal similarity
-*  transformation.
-*
-*  T must be in Schur canonical form, that is, block upper triangular
-*  with 1-by-1 and 2-by-2 diagonal blocks; each 2-by-2 diagonal block
-*  has its diagonal elemnts equal and its off-diagonal elements of
-*  opposite sign.
-*
-*  Arguments
-*  =========
-*
-*  WANTQ   (input) LOGICAL
-*          = .TRUE. : accumulate the transformation in the matrix Q;
-*          = .FALSE.: do not accumulate the transformation.
-*
-*  N       (input) INTEGER
-*          The order of the matrix T. N >= 0.
-*
-*  T       (input/output) REAL array, dimension (LDT,N)
-*          On entry, the upper quasi-triangular matrix T, in Schur
-*          canonical form.
-*          On exit, the updated matrix T, again in Schur canonical form.
-*
-*  LDT     (input)  INTEGER
-*          The leading dimension of the array T. LDT >= max(1,N).
-*
-*  Q       (input/output) REAL array, dimension (LDQ,N)
-*          On entry, if WANTQ is .TRUE., the orthogonal matrix Q.
-*          On exit, if WANTQ is .TRUE., the updated matrix Q.
-*          If WANTQ is .FALSE., Q is not referenced.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.
-*          LDQ >= 1; and if WANTQ is .TRUE., LDQ >= N.
-*
-*  J1      (input) INTEGER
-*          The index of the first row of the first block T11.
-*
-*  N1      (input) INTEGER
-*          The order of the first block T11. N1 = 0, 1 or 2.
-*
-*  N2      (input) INTEGER
-*          The order of the second block T22. N2 = 0, 1 or 2.
-*
-*  WORK    (workspace) REAL array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          = 1: the transformed matrix T would be too far from Schur
-*               form; the blocks are not swapped and T and Q are
-*               unchanged.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-      REAL               TEN
-      PARAMETER          ( TEN = 1.0E+1 )
-      INTEGER            LDD, LDX
-      PARAMETER          ( LDD = 4, LDX = 2 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            IERR, J2, J3, J4, K, ND
-      REAL               CS, DNORM, EPS, SCALE, SMLNUM, SN, T11, T22,
-     $                   T33, TAU, TAU1, TAU2, TEMP, THRESH, WI1, WI2,
-     $                   WR1, WR2, XNORM
-*     ..
-*     .. Local Arrays ..
-      REAL               D( LDD, 4 ), U( 3 ), U1( 3 ), U2( 3 ),
-     $                   X( LDX, 2 )
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH, SLANGE
-      EXTERNAL           SLAMCH, SLANGE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLACPY, SLANV2, SLARFG, SLARFX, SLARTG, SLASY2,
-     $                   SROT
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. N1.EQ.0 .OR. N2.EQ.0 )
-     $   RETURN
-      IF( J1+N1.GT.N )
-     $   RETURN
-*
-      J2 = J1 + 1
-      J3 = J1 + 2
-      J4 = J1 + 3
-*
-      IF( N1.EQ.1 .AND. N2.EQ.1 ) THEN
-*
-*        Swap two 1-by-1 blocks.
-*
-         T11 = T( J1, J1 )
-         T22 = T( J2, J2 )
-*
-*        Determine the transformation to perform the interchange.
-*
-         CALL SLARTG( T( J1, J2 ), T22-T11, CS, SN, TEMP )
-*
-*        Apply transformation to the matrix T.
-*
-         IF( J3.LE.N )
-     $      CALL SROT( N-J1-1, T( J1, J3 ), LDT, T( J2, J3 ), LDT, CS,
-     $                 SN )
-         CALL SROT( J1-1, T( 1, J1 ), 1, T( 1, J2 ), 1, CS, SN )
-*
-         T( J1, J1 ) = T22
-         T( J2, J2 ) = T11
-*
-         IF( WANTQ ) THEN
-*
-*           Accumulate transformation in the matrix Q.
-*
-            CALL SROT( N, Q( 1, J1 ), 1, Q( 1, J2 ), 1, CS, SN )
-         END IF
-*
-      ELSE
-*
-*        Swapping involves at least one 2-by-2 block.
-*
-*        Copy the diagonal block of order N1+N2 to the local array D
-*        and compute its norm.
-*
-         ND = N1 + N2
-         CALL SLACPY( 'Full', ND, ND, T( J1, J1 ), LDT, D, LDD )
-         DNORM = SLANGE( 'Max', ND, ND, D, LDD, WORK )
-*
-*        Compute machine-dependent threshold for test for accepting
-*        swap.
-*
-         EPS = SLAMCH( 'P' )
-         SMLNUM = SLAMCH( 'S' ) / EPS
-         THRESH = MAX( TEN*EPS*DNORM, SMLNUM )
-*
-*        Solve T11*X - X*T22 = scale*T12 for X.
-*
-         CALL SLASY2( .FALSE., .FALSE., -1, N1, N2, D, LDD,
-     $                D( N1+1, N1+1 ), LDD, D( 1, N1+1 ), LDD, SCALE, X,
-     $                LDX, XNORM, IERR )
-*
-*        Swap the adjacent diagonal blocks.
-*
-         K = N1 + N1 + N2 - 3
-         GO TO ( 10, 20, 30 )K
-*
-   10    CONTINUE
-*
-*        N1 = 1, N2 = 2: generate elementary reflector H so that:
-*
-*        ( scale, X11, X12 ) H = ( 0, 0, * )
-*
-         U( 1 ) = SCALE
-         U( 2 ) = X( 1, 1 )
-         U( 3 ) = X( 1, 2 )
-         CALL SLARFG( 3, U( 3 ), U, 1, TAU )
-         U( 3 ) = ONE
-         T11 = T( J1, J1 )
-*
-*        Perform swap provisionally on diagonal block in D.
-*
-         CALL SLARFX( 'L', 3, 3, U, TAU, D, LDD, WORK )
-         CALL SLARFX( 'R', 3, 3, U, TAU, D, LDD, WORK )
-*
-*        Test whether to reject swap.
-*
-         IF( MAX( ABS( D( 3, 1 ) ), ABS( D( 3, 2 ) ), ABS( D( 3,
-     $       3 )-T11 ) ).GT.THRESH )GO TO 50
-*
-*        Accept swap: apply transformation to the entire matrix T.
-*
-         CALL SLARFX( 'L', 3, N-J1+1, U, TAU, T( J1, J1 ), LDT, WORK )
-         CALL SLARFX( 'R', J2, 3, U, TAU, T( 1, J1 ), LDT, WORK )
-*
-         T( J3, J1 ) = ZERO
-         T( J3, J2 ) = ZERO
-         T( J3, J3 ) = T11
-*
-         IF( WANTQ ) THEN
-*
-*           Accumulate transformation in the matrix Q.
-*
-            CALL SLARFX( 'R', N, 3, U, TAU, Q( 1, J1 ), LDQ, WORK )
-         END IF
-         GO TO 40
-*
-   20    CONTINUE
-*
-*        N1 = 2, N2 = 1: generate elementary reflector H so that:
-*
-*        H (  -X11 ) = ( * )
-*          (  -X21 ) = ( 0 )
-*          ( scale ) = ( 0 )
-*
-         U( 1 ) = -X( 1, 1 )
-         U( 2 ) = -X( 2, 1 )
-         U( 3 ) = SCALE
-         CALL SLARFG( 3, U( 1 ), U( 2 ), 1, TAU )
-         U( 1 ) = ONE
-         T33 = T( J3, J3 )
-*
-*        Perform swap provisionally on diagonal block in D.
-*
-         CALL SLARFX( 'L', 3, 3, U, TAU, D, LDD, WORK )
-         CALL SLARFX( 'R', 3, 3, U, TAU, D, LDD, WORK )
-*
-*        Test whether to reject swap.
-*
-         IF( MAX( ABS( D( 2, 1 ) ), ABS( D( 3, 1 ) ), ABS( D( 1,
-     $       1 )-T33 ) ).GT.THRESH )GO TO 50
-*
-*        Accept swap: apply transformation to the entire matrix T.
-*
-         CALL SLARFX( 'R', J3, 3, U, TAU, T( 1, J1 ), LDT, WORK )
-         CALL SLARFX( 'L', 3, N-J1, U, TAU, T( J1, J2 ), LDT, WORK )
-*
-         T( J1, J1 ) = T33
-         T( J2, J1 ) = ZERO
-         T( J3, J1 ) = ZERO
-*
-         IF( WANTQ ) THEN
-*
-*           Accumulate transformation in the matrix Q.
-*
-            CALL SLARFX( 'R', N, 3, U, TAU, Q( 1, J1 ), LDQ, WORK )
-         END IF
-         GO TO 40
-*
-   30    CONTINUE
-*
-*        N1 = 2, N2 = 2: generate elementary reflectors H(1) and H(2) so
-*        that:
-*
-*        H(2) H(1) (  -X11  -X12 ) = (  *  * )
-*                  (  -X21  -X22 )   (  0  * )
-*                  ( scale    0  )   (  0  0 )
-*                  (    0  scale )   (  0  0 )
-*
-         U1( 1 ) = -X( 1, 1 )
-         U1( 2 ) = -X( 2, 1 )
-         U1( 3 ) = SCALE
-         CALL SLARFG( 3, U1( 1 ), U1( 2 ), 1, TAU1 )
-         U1( 1 ) = ONE
-*
-         TEMP = -TAU1*( X( 1, 2 )+U1( 2 )*X( 2, 2 ) )
-         U2( 1 ) = -TEMP*U1( 2 ) - X( 2, 2 )
-         U2( 2 ) = -TEMP*U1( 3 )
-         U2( 3 ) = SCALE
-         CALL SLARFG( 3, U2( 1 ), U2( 2 ), 1, TAU2 )
-         U2( 1 ) = ONE
-*
-*        Perform swap provisionally on diagonal block in D.
-*
-         CALL SLARFX( 'L', 3, 4, U1, TAU1, D, LDD, WORK )
-         CALL SLARFX( 'R', 4, 3, U1, TAU1, D, LDD, WORK )
-         CALL SLARFX( 'L', 3, 4, U2, TAU2, D( 2, 1 ), LDD, WORK )
-         CALL SLARFX( 'R', 4, 3, U2, TAU2, D( 1, 2 ), LDD, WORK )
-*
-*        Test whether to reject swap.
-*
-         IF( MAX( ABS( D( 3, 1 ) ), ABS( D( 3, 2 ) ), ABS( D( 4, 1 ) ),
-     $       ABS( D( 4, 2 ) ) ).GT.THRESH )GO TO 50
-*
-*        Accept swap: apply transformation to the entire matrix T.
-*
-         CALL SLARFX( 'L', 3, N-J1+1, U1, TAU1, T( J1, J1 ), LDT, WORK )
-         CALL SLARFX( 'R', J4, 3, U1, TAU1, T( 1, J1 ), LDT, WORK )
-         CALL SLARFX( 'L', 3, N-J1+1, U2, TAU2, T( J2, J1 ), LDT, WORK )
-         CALL SLARFX( 'R', J4, 3, U2, TAU2, T( 1, J2 ), LDT, WORK )
-*
-         T( J3, J1 ) = ZERO
-         T( J3, J2 ) = ZERO
-         T( J4, J1 ) = ZERO
-         T( J4, J2 ) = ZERO
-*
-         IF( WANTQ ) THEN
-*
-*           Accumulate transformation in the matrix Q.
-*
-            CALL SLARFX( 'R', N, 3, U1, TAU1, Q( 1, J1 ), LDQ, WORK )
-            CALL SLARFX( 'R', N, 3, U2, TAU2, Q( 1, J2 ), LDQ, WORK )
-         END IF
-*
-   40    CONTINUE
-*
-         IF( N2.EQ.2 ) THEN
-*
-*           Standardize new 2-by-2 block T11
-*
-            CALL SLANV2( T( J1, J1 ), T( J1, J2 ), T( J2, J1 ),
-     $                   T( J2, J2 ), WR1, WI1, WR2, WI2, CS, SN )
-            CALL SROT( N-J1-1, T( J1, J1+2 ), LDT, T( J2, J1+2 ), LDT,
-     $                 CS, SN )
-            CALL SROT( J1-1, T( 1, J1 ), 1, T( 1, J2 ), 1, CS, SN )
-            IF( WANTQ )
-     $         CALL SROT( N, Q( 1, J1 ), 1, Q( 1, J2 ), 1, CS, SN )
-         END IF
-*
-         IF( N1.EQ.2 ) THEN
-*
-*           Standardize new 2-by-2 block T22
-*
-            J3 = J1 + N2
-            J4 = J3 + 1
-            CALL SLANV2( T( J3, J3 ), T( J3, J4 ), T( J4, J3 ),
-     $                   T( J4, J4 ), WR1, WI1, WR2, WI2, CS, SN )
-            IF( J3+2.LE.N )
-     $         CALL SROT( N-J3-1, T( J3, J3+2 ), LDT, T( J4, J3+2 ),
-     $                    LDT, CS, SN )
-            CALL SROT( J3-1, T( 1, J3 ), 1, T( 1, J4 ), 1, CS, SN )
-            IF( WANTQ )
-     $         CALL SROT( N, Q( 1, J3 ), 1, Q( 1, J4 ), 1, CS, SN )
-         END IF
-*
-      END IF
-      RETURN
-*
-*     Exit with INFO = 1 if swap was rejected.
-*
-   50 INFO = 1
-      RETURN
-*
-*     End of SLAEXC
-*
-      END
--- a/libcruft/lapack/slag2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,300 +0,0 @@
-      SUBROUTINE SLAG2( A, LDA, B, LDB, SAFMIN, SCALE1, SCALE2, WR1,
-     $                  WR2, WI )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            LDA, LDB
-      REAL               SAFMIN, SCALE1, SCALE2, WI, WR1, WR2
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAG2 computes the eigenvalues of a 2 x 2 generalized eigenvalue
-*  problem  A - w B, with scaling as necessary to avoid over-/underflow.
-*
-*  The scaling factor "s" results in a modified eigenvalue equation
-*
-*      s A - w B
-*
-*  where  s  is a non-negative scaling factor chosen so that  w,  w B,
-*  and  s A  do not overflow and, if possible, do not underflow, either.
-*
-*  Arguments
-*  =========
-*
-*  A       (input) REAL array, dimension (LDA, 2)
-*          On entry, the 2 x 2 matrix A.  It is assumed that its 1-norm
-*          is less than 1/SAFMIN.  Entries less than
-*          sqrt(SAFMIN)*norm(A) are subject to being treated as zero.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= 2.
-*
-*  B       (input) REAL array, dimension (LDB, 2)
-*          On entry, the 2 x 2 upper triangular matrix B.  It is
-*          assumed that the one-norm of B is less than 1/SAFMIN.  The
-*          diagonals should be at least sqrt(SAFMIN) times the largest
-*          element of B (in absolute value); if a diagonal is smaller
-*          than that, then  +/- sqrt(SAFMIN) will be used instead of
-*          that diagonal.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= 2.
-*
-*  SAFMIN  (input) REAL
-*          The smallest positive number s.t. 1/SAFMIN does not
-*          overflow.  (This should always be SLAMCH('S') -- it is an
-*          argument in order to avoid having to call SLAMCH frequently.)
-*
-*  SCALE1  (output) REAL
-*          A scaling factor used to avoid over-/underflow in the
-*          eigenvalue equation which defines the first eigenvalue.  If
-*          the eigenvalues are complex, then the eigenvalues are
-*          ( WR1  +/-  WI i ) / SCALE1  (which may lie outside the
-*          exponent range of the machine), SCALE1=SCALE2, and SCALE1
-*          will always be positive.  If the eigenvalues are real, then
-*          the first (real) eigenvalue is  WR1 / SCALE1 , but this may
-*          overflow or underflow, and in fact, SCALE1 may be zero or
-*          less than the underflow threshhold if the exact eigenvalue
-*          is sufficiently large.
-*
-*  SCALE2  (output) REAL
-*          A scaling factor used to avoid over-/underflow in the
-*          eigenvalue equation which defines the second eigenvalue.  If
-*          the eigenvalues are complex, then SCALE2=SCALE1.  If the
-*          eigenvalues are real, then the second (real) eigenvalue is
-*          WR2 / SCALE2 , but this may overflow or underflow, and in
-*          fact, SCALE2 may be zero or less than the underflow
-*          threshhold if the exact eigenvalue is sufficiently large.
-*
-*  WR1     (output) REAL
-*          If the eigenvalue is real, then WR1 is SCALE1 times the
-*          eigenvalue closest to the (2,2) element of A B**(-1).  If the
-*          eigenvalue is complex, then WR1=WR2 is SCALE1 times the real
-*          part of the eigenvalues.
-*
-*  WR2     (output) REAL
-*          If the eigenvalue is real, then WR2 is SCALE2 times the
-*          other eigenvalue.  If the eigenvalue is complex, then
-*          WR1=WR2 is SCALE1 times the real part of the eigenvalues.
-*
-*  WI      (output) REAL
-*          If the eigenvalue is real, then WI is zero.  If the
-*          eigenvalue is complex, then WI is SCALE1 times the imaginary
-*          part of the eigenvalues.  WI will always be non-negative.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0, TWO = 2.0E+0 )
-      REAL               HALF
-      PARAMETER          ( HALF = ONE / TWO )
-      REAL               FUZZY1
-      PARAMETER          ( FUZZY1 = ONE+1.0E-5 )
-*     ..
-*     .. Local Scalars ..
-      REAL               A11, A12, A21, A22, ABI22, ANORM, AS11, AS12,
-     $                   AS22, ASCALE, B11, B12, B22, BINV11, BINV22,
-     $                   BMIN, BNORM, BSCALE, BSIZE, C1, C2, C3, C4, C5,
-     $                   DIFF, DISCR, PP, QQ, R, RTMAX, RTMIN, S1, S2,
-     $                   SAFMAX, SHIFT, SS, SUM, WABS, WBIG, WDET,
-     $                   WSCALE, WSIZE, WSMALL
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      RTMIN = SQRT( SAFMIN )
-      RTMAX = ONE / RTMIN
-      SAFMAX = ONE / SAFMIN
-*
-*     Scale A
-*
-      ANORM = MAX( ABS( A( 1, 1 ) )+ABS( A( 2, 1 ) ),
-     $        ABS( A( 1, 2 ) )+ABS( A( 2, 2 ) ), SAFMIN )
-      ASCALE = ONE / ANORM
-      A11 = ASCALE*A( 1, 1 )
-      A21 = ASCALE*A( 2, 1 )
-      A12 = ASCALE*A( 1, 2 )
-      A22 = ASCALE*A( 2, 2 )
-*
-*     Perturb B if necessary to insure non-singularity
-*
-      B11 = B( 1, 1 )
-      B12 = B( 1, 2 )
-      B22 = B( 2, 2 )
-      BMIN = RTMIN*MAX( ABS( B11 ), ABS( B12 ), ABS( B22 ), RTMIN )
-      IF( ABS( B11 ).LT.BMIN )
-     $   B11 = SIGN( BMIN, B11 )
-      IF( ABS( B22 ).LT.BMIN )
-     $   B22 = SIGN( BMIN, B22 )
-*
-*     Scale B
-*
-      BNORM = MAX( ABS( B11 ), ABS( B12 )+ABS( B22 ), SAFMIN )
-      BSIZE = MAX( ABS( B11 ), ABS( B22 ) )
-      BSCALE = ONE / BSIZE
-      B11 = B11*BSCALE
-      B12 = B12*BSCALE
-      B22 = B22*BSCALE
-*
-*     Compute larger eigenvalue by method described by C. van Loan
-*
-*     ( AS is A shifted by -SHIFT*B )
-*
-      BINV11 = ONE / B11
-      BINV22 = ONE / B22
-      S1 = A11*BINV11
-      S2 = A22*BINV22
-      IF( ABS( S1 ).LE.ABS( S2 ) ) THEN
-         AS12 = A12 - S1*B12
-         AS22 = A22 - S1*B22
-         SS = A21*( BINV11*BINV22 )
-         ABI22 = AS22*BINV22 - SS*B12
-         PP = HALF*ABI22
-         SHIFT = S1
-      ELSE
-         AS12 = A12 - S2*B12
-         AS11 = A11 - S2*B11
-         SS = A21*( BINV11*BINV22 )
-         ABI22 = -SS*B12
-         PP = HALF*( AS11*BINV11+ABI22 )
-         SHIFT = S2
-      END IF
-      QQ = SS*AS12
-      IF( ABS( PP*RTMIN ).GE.ONE ) THEN
-         DISCR = ( RTMIN*PP )**2 + QQ*SAFMIN
-         R = SQRT( ABS( DISCR ) )*RTMAX
-      ELSE
-         IF( PP**2+ABS( QQ ).LE.SAFMIN ) THEN
-            DISCR = ( RTMAX*PP )**2 + QQ*SAFMAX
-            R = SQRT( ABS( DISCR ) )*RTMIN
-         ELSE
-            DISCR = PP**2 + QQ
-            R = SQRT( ABS( DISCR ) )
-         END IF
-      END IF
-*
-*     Note: the test of R in the following IF is to cover the case when
-*           DISCR is small and negative and is flushed to zero during
-*           the calculation of R.  On machines which have a consistent
-*           flush-to-zero threshhold and handle numbers above that
-*           threshhold correctly, it would not be necessary.
-*
-      IF( DISCR.GE.ZERO .OR. R.EQ.ZERO ) THEN
-         SUM = PP + SIGN( R, PP )
-         DIFF = PP - SIGN( R, PP )
-         WBIG = SHIFT + SUM
-*
-*        Compute smaller eigenvalue
-*
-         WSMALL = SHIFT + DIFF
-         IF( HALF*ABS( WBIG ).GT.MAX( ABS( WSMALL ), SAFMIN ) ) THEN
-            WDET = ( A11*A22-A12*A21 )*( BINV11*BINV22 )
-            WSMALL = WDET / WBIG
-         END IF
-*
-*        Choose (real) eigenvalue closest to 2,2 element of A*B**(-1)
-*        for WR1.
-*
-         IF( PP.GT.ABI22 ) THEN
-            WR1 = MIN( WBIG, WSMALL )
-            WR2 = MAX( WBIG, WSMALL )
-         ELSE
-            WR1 = MAX( WBIG, WSMALL )
-            WR2 = MIN( WBIG, WSMALL )
-         END IF
-         WI = ZERO
-      ELSE
-*
-*        Complex eigenvalues
-*
-         WR1 = SHIFT + PP
-         WR2 = WR1
-         WI = R
-      END IF
-*
-*     Further scaling to avoid underflow and overflow in computing
-*     SCALE1 and overflow in computing w*B.
-*
-*     This scale factor (WSCALE) is bounded from above using C1 and C2,
-*     and from below using C3 and C4.
-*        C1 implements the condition  s A  must never overflow.
-*        C2 implements the condition  w B  must never overflow.
-*        C3, with C2,
-*           implement the condition that s A - w B must never overflow.
-*        C4 implements the condition  s    should not underflow.
-*        C5 implements the condition  max(s,|w|) should be at least 2.
-*
-      C1 = BSIZE*( SAFMIN*MAX( ONE, ASCALE ) )
-      C2 = SAFMIN*MAX( ONE, BNORM )
-      C3 = BSIZE*SAFMIN
-      IF( ASCALE.LE.ONE .AND. BSIZE.LE.ONE ) THEN
-         C4 = MIN( ONE, ( ASCALE / SAFMIN )*BSIZE )
-      ELSE
-         C4 = ONE
-      END IF
-      IF( ASCALE.LE.ONE .OR. BSIZE.LE.ONE ) THEN
-         C5 = MIN( ONE, ASCALE*BSIZE )
-      ELSE
-         C5 = ONE
-      END IF
-*
-*     Scale first eigenvalue
-*
-      WABS = ABS( WR1 ) + ABS( WI )
-      WSIZE = MAX( SAFMIN, C1, FUZZY1*( WABS*C2+C3 ),
-     $        MIN( C4, HALF*MAX( WABS, C5 ) ) )
-      IF( WSIZE.NE.ONE ) THEN
-         WSCALE = ONE / WSIZE
-         IF( WSIZE.GT.ONE ) THEN
-            SCALE1 = ( MAX( ASCALE, BSIZE )*WSCALE )*
-     $               MIN( ASCALE, BSIZE )
-         ELSE
-            SCALE1 = ( MIN( ASCALE, BSIZE )*WSCALE )*
-     $               MAX( ASCALE, BSIZE )
-         END IF
-         WR1 = WR1*WSCALE
-         IF( WI.NE.ZERO ) THEN
-            WI = WI*WSCALE
-            WR2 = WR1
-            SCALE2 = SCALE1
-         END IF
-      ELSE
-         SCALE1 = ASCALE*BSIZE
-         SCALE2 = SCALE1
-      END IF
-*
-*     Scale second eigenvalue (if real)
-*
-      IF( WI.EQ.ZERO ) THEN
-         WSIZE = MAX( SAFMIN, C1, FUZZY1*( ABS( WR2 )*C2+C3 ),
-     $           MIN( C4, HALF*MAX( ABS( WR2 ), C5 ) ) )
-         IF( WSIZE.NE.ONE ) THEN
-            WSCALE = ONE / WSIZE
-            IF( WSIZE.GT.ONE ) THEN
-               SCALE2 = ( MAX( ASCALE, BSIZE )*WSCALE )*
-     $                  MIN( ASCALE, BSIZE )
-            ELSE
-               SCALE2 = ( MIN( ASCALE, BSIZE )*WSCALE )*
-     $                  MAX( ASCALE, BSIZE )
-            END IF
-            WR2 = WR2*WSCALE
-         ELSE
-            SCALE2 = ASCALE*BSIZE
-         END IF
-      END IF
-*
-*     End of SLAG2
-*
-      RETURN
-      END
--- a/libcruft/lapack/slahqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,501 +0,0 @@
-      SUBROUTINE SLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI,
-     $                   ILOZ, IHIZ, Z, LDZ, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, N
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      REAL               H( LDH, * ), WI( * ), WR( * ), Z( LDZ, * )
-*     ..
-*
-*     Purpose
-*     =======
-*
-*     SLAHQR is an auxiliary routine called by SHSEQR to update the
-*     eigenvalues and Schur decomposition already computed by SHSEQR, by
-*     dealing with the Hessenberg submatrix in rows and columns ILO to
-*     IHI.
-*
-*     Arguments
-*     =========
-*
-*     WANTT   (input) LOGICAL
-*          = .TRUE. : the full Schur form T is required;
-*          = .FALSE.: only eigenvalues are required.
-*
-*     WANTZ   (input) LOGICAL
-*          = .TRUE. : the matrix of Schur vectors Z is required;
-*          = .FALSE.: Schur vectors are not required.
-*
-*     N       (input) INTEGER
-*          The order of the matrix H.  N >= 0.
-*
-*     ILO     (input) INTEGER
-*     IHI     (input) INTEGER
-*          It is assumed that H is already upper quasi-triangular in
-*          rows and columns IHI+1:N, and that H(ILO,ILO-1) = 0 (unless
-*          ILO = 1). SLAHQR works primarily with the Hessenberg
-*          submatrix in rows and columns ILO to IHI, but applies
-*          transformations to all of H if WANTT is .TRUE..
-*          1 <= ILO <= max(1,IHI); IHI <= N.
-*
-*     H       (input/output) REAL array, dimension (LDH,N)
-*          On entry, the upper Hessenberg matrix H.
-*          On exit, if INFO is zero and if WANTT is .TRUE., H is upper
-*          quasi-triangular in rows and columns ILO:IHI, with any
-*          2-by-2 diagonal blocks in standard form. If INFO is zero
-*          and WANTT is .FALSE., the contents of H are unspecified on
-*          exit.  The output state of H if INFO is nonzero is given
-*          below under the description of INFO.
-*
-*     LDH     (input) INTEGER
-*          The leading dimension of the array H. LDH >= max(1,N).
-*
-*     WR      (output) REAL array, dimension (N)
-*     WI      (output) REAL array, dimension (N)
-*          The real and imaginary parts, respectively, of the computed
-*          eigenvalues ILO to IHI are stored in the corresponding
-*          elements of WR and WI. If two eigenvalues are computed as a
-*          complex conjugate pair, they are stored in consecutive
-*          elements of WR and WI, say the i-th and (i+1)th, with
-*          WI(i) > 0 and WI(i+1) < 0. If WANTT is .TRUE., the
-*          eigenvalues are stored in the same order as on the diagonal
-*          of the Schur form returned in H, with WR(i) = H(i,i), and, if
-*          H(i:i+1,i:i+1) is a 2-by-2 diagonal block,
-*          WI(i) = sqrt(H(i+1,i)*H(i,i+1)) and WI(i+1) = -WI(i).
-*
-*     ILOZ    (input) INTEGER
-*     IHIZ    (input) INTEGER
-*          Specify the rows of Z to which transformations must be
-*          applied if WANTZ is .TRUE..
-*          1 <= ILOZ <= ILO; IHI <= IHIZ <= N.
-*
-*     Z       (input/output) REAL array, dimension (LDZ,N)
-*          If WANTZ is .TRUE., on entry Z must contain the current
-*          matrix Z of transformations accumulated by SHSEQR, and on
-*          exit Z has been updated; transformations are applied only to
-*          the submatrix Z(ILOZ:IHIZ,ILO:IHI).
-*          If WANTZ is .FALSE., Z is not referenced.
-*
-*     LDZ     (input) INTEGER
-*          The leading dimension of the array Z. LDZ >= max(1,N).
-*
-*     INFO    (output) INTEGER
-*           =   0: successful exit
-*          .GT. 0: If INFO = i, SLAHQR failed to compute all the
-*                  eigenvalues ILO to IHI in a total of 30 iterations
-*                  per eigenvalue; elements i+1:ihi of WR and WI
-*                  contain those eigenvalues which have been
-*                  successfully computed.
-*
-*                  If INFO .GT. 0 and WANTT is .FALSE., then on exit,
-*                  the remaining unconverged eigenvalues are the
-*                  eigenvalues of the upper Hessenberg matrix rows
-*                  and columns ILO thorugh INFO of the final, output
-*                  value of H.
-*
-*                  If INFO .GT. 0 and WANTT is .TRUE., then on exit
-*          (*)       (initial value of H)*U  = U*(final value of H)
-*                  where U is an orthognal matrix.    The final
-*                  value of H is upper Hessenberg and triangular in
-*                  rows and columns INFO+1 through IHI.
-*
-*                  If INFO .GT. 0 and WANTZ is .TRUE., then on exit
-*                      (final value of Z)  = (initial value of Z)*U
-*                  where U is the orthogonal matrix in (*)
-*                  (regardless of the value of WANTT.)
-*
-*     Further Details
-*     ===============
-*
-*     02-96 Based on modifications by
-*     David Day, Sandia National Laboratory, USA
-*
-*     12-04 Further modifications by
-*     Ralph Byers, University of Kansas, USA
-*
-*       This is a modified version of SLAHQR from LAPACK version 3.0.
-*       It is (1) more robust against overflow and underflow and
-*       (2) adopts the more conservative Ahues & Tisseur stopping
-*       criterion (LAWN 122, 1997).
-*
-*     =========================================================
-*
-*     .. Parameters ..
-      INTEGER            ITMAX
-      PARAMETER          ( ITMAX = 30 )
-      REAL               ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0e0, ONE = 1.0e0, TWO = 2.0e0 )
-      REAL               DAT1, DAT2
-      PARAMETER          ( DAT1 = 3.0e0 / 4.0e0, DAT2 = -0.4375e0 )
-*     ..
-*     .. Local Scalars ..
-      REAL               AA, AB, BA, BB, CS, DET, H11, H12, H21, H21S,
-     $                   H22, RT1I, RT1R, RT2I, RT2R, RTDISC, S, SAFMAX,
-     $                   SAFMIN, SMLNUM, SN, SUM, T1, T2, T3, TR, TST,
-     $                   ULP, V2, V3
-      INTEGER            I, I1, I2, ITS, J, K, L, M, NH, NR, NZ
-*     ..
-*     .. Local Arrays ..
-      REAL               V( 3 )
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      EXTERNAL           SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SLABAD, SLANV2, SLARFG, SROT
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, REAL, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-      IF( ILO.EQ.IHI ) THEN
-         WR( ILO ) = H( ILO, ILO )
-         WI( ILO ) = ZERO
-         RETURN
-      END IF
-*
-*     ==== clear out the trash ====
-      DO 10 J = ILO, IHI - 3
-         H( J+2, J ) = ZERO
-         H( J+3, J ) = ZERO
-   10 CONTINUE
-      IF( ILO.LE.IHI-2 )
-     $   H( IHI, IHI-2 ) = ZERO
-*
-      NH = IHI - ILO + 1
-      NZ = IHIZ - ILOZ + 1
-*
-*     Set machine-dependent constants for the stopping criterion.
-*
-      SAFMIN = SLAMCH( 'SAFE MINIMUM' )
-      SAFMAX = ONE / SAFMIN
-      CALL SLABAD( SAFMIN, SAFMAX )
-      ULP = SLAMCH( 'PRECISION' )
-      SMLNUM = SAFMIN*( REAL( NH ) / ULP )
-*
-*     I1 and I2 are the indices of the first row and last column of H
-*     to which transformations must be applied. If eigenvalues only are
-*     being computed, I1 and I2 are set inside the main loop.
-*
-      IF( WANTT ) THEN
-         I1 = 1
-         I2 = N
-      END IF
-*
-*     The main loop begins here. I is the loop index and decreases from
-*     IHI to ILO in steps of 1 or 2. Each iteration of the loop works
-*     with the active submatrix in rows and columns L to I.
-*     Eigenvalues I+1 to IHI have already converged. Either L = ILO or
-*     H(L,L-1) is negligible so that the matrix splits.
-*
-      I = IHI
-   20 CONTINUE
-      L = ILO
-      IF( I.LT.ILO )
-     $   GO TO 160
-*
-*     Perform QR iterations on rows and columns ILO to I until a
-*     submatrix of order 1 or 2 splits off at the bottom because a
-*     subdiagonal element has become negligible.
-*
-      DO 140 ITS = 0, ITMAX
-*
-*        Look for a single small subdiagonal element.
-*
-         DO 30 K = I, L + 1, -1
-            IF( ABS( H( K, K-1 ) ).LE.SMLNUM )
-     $         GO TO 40
-            TST = ABS( H( K-1, K-1 ) ) + ABS( H( K, K ) )
-            IF( TST.EQ.ZERO ) THEN
-               IF( K-2.GE.ILO )
-     $            TST = TST + ABS( H( K-1, K-2 ) )
-               IF( K+1.LE.IHI )
-     $            TST = TST + ABS( H( K+1, K ) )
-            END IF
-*           ==== The following is a conservative small subdiagonal
-*           .    deflation  criterion due to Ahues & Tisseur (LAWN 122,
-*           .    1997). It has better mathematical foundation and
-*           .    improves accuracy in some cases.  ====
-            IF( ABS( H( K, K-1 ) ).LE.ULP*TST ) THEN
-               AB = MAX( ABS( H( K, K-1 ) ), ABS( H( K-1, K ) ) )
-               BA = MIN( ABS( H( K, K-1 ) ), ABS( H( K-1, K ) ) )
-               AA = MAX( ABS( H( K, K ) ),
-     $              ABS( H( K-1, K-1 )-H( K, K ) ) )
-               BB = MIN( ABS( H( K, K ) ),
-     $              ABS( H( K-1, K-1 )-H( K, K ) ) )
-               S = AA + AB
-               IF( BA*( AB / S ).LE.MAX( SMLNUM,
-     $             ULP*( BB*( AA / S ) ) ) )GO TO 40
-            END IF
-   30    CONTINUE
-   40    CONTINUE
-         L = K
-         IF( L.GT.ILO ) THEN
-*
-*           H(L,L-1) is negligible
-*
-            H( L, L-1 ) = ZERO
-         END IF
-*
-*        Exit from loop if a submatrix of order 1 or 2 has split off.
-*
-         IF( L.GE.I-1 )
-     $      GO TO 150
-*
-*        Now the active submatrix is in rows and columns L to I. If
-*        eigenvalues only are being computed, only the active submatrix
-*        need be transformed.
-*
-         IF( .NOT.WANTT ) THEN
-            I1 = L
-            I2 = I
-         END IF
-*
-         IF( ITS.EQ.10 .OR. ITS.EQ.20 ) THEN
-*
-*           Exceptional shift.
-*
-            H11 = DAT1*S + H( I, I )
-            H12 = DAT2*S
-            H21 = S
-            H22 = H11
-         ELSE
-*
-*           Prepare to use Francis' double shift
-*           (i.e. 2nd degree generalized Rayleigh quotient)
-*
-            H11 = H( I-1, I-1 )
-            H21 = H( I, I-1 )
-            H12 = H( I-1, I )
-            H22 = H( I, I )
-         END IF
-         S = ABS( H11 ) + ABS( H12 ) + ABS( H21 ) + ABS( H22 )
-         IF( S.EQ.ZERO ) THEN
-            RT1R = ZERO
-            RT1I = ZERO
-            RT2R = ZERO
-            RT2I = ZERO
-         ELSE
-            H11 = H11 / S
-            H21 = H21 / S
-            H12 = H12 / S
-            H22 = H22 / S
-            TR = ( H11+H22 ) / TWO
-            DET = ( H11-TR )*( H22-TR ) - H12*H21
-            RTDISC = SQRT( ABS( DET ) )
-            IF( DET.GE.ZERO ) THEN
-*
-*              ==== complex conjugate shifts ====
-*
-               RT1R = TR*S
-               RT2R = RT1R
-               RT1I = RTDISC*S
-               RT2I = -RT1I
-            ELSE
-*
-*              ==== real shifts (use only one of them)  ====
-*
-               RT1R = TR + RTDISC
-               RT2R = TR - RTDISC
-               IF( ABS( RT1R-H22 ).LE.ABS( RT2R-H22 ) ) THEN
-                  RT1R = RT1R*S
-                  RT2R = RT1R
-               ELSE
-                  RT2R = RT2R*S
-                  RT1R = RT2R
-               END IF
-               RT1I = ZERO
-               RT2I = ZERO
-            END IF
-         END IF
-*
-*        Look for two consecutive small subdiagonal elements.
-*
-         DO 50 M = I - 2, L, -1
-*           Determine the effect of starting the double-shift QR
-*           iteration at row M, and see if this would make H(M,M-1)
-*           negligible.  (The following uses scaling to avoid
-*           overflows and most underflows.)
-*
-            H21S = H( M+1, M )
-            S = ABS( H( M, M )-RT2R ) + ABS( RT2I ) + ABS( H21S )
-            H21S = H( M+1, M ) / S
-            V( 1 ) = H21S*H( M, M+1 ) + ( H( M, M )-RT1R )*
-     $               ( ( H( M, M )-RT2R ) / S ) - RT1I*( RT2I / S )
-            V( 2 ) = H21S*( H( M, M )+H( M+1, M+1 )-RT1R-RT2R )
-            V( 3 ) = H21S*H( M+2, M+1 )
-            S = ABS( V( 1 ) ) + ABS( V( 2 ) ) + ABS( V( 3 ) )
-            V( 1 ) = V( 1 ) / S
-            V( 2 ) = V( 2 ) / S
-            V( 3 ) = V( 3 ) / S
-            IF( M.EQ.L )
-     $         GO TO 60
-            IF( ABS( H( M, M-1 ) )*( ABS( V( 2 ) )+ABS( V( 3 ) ) ).LE.
-     $          ULP*ABS( V( 1 ) )*( ABS( H( M-1, M-1 ) )+ABS( H( M,
-     $          M ) )+ABS( H( M+1, M+1 ) ) ) )GO TO 60
-   50    CONTINUE
-   60    CONTINUE
-*
-*        Double-shift QR step
-*
-         DO 130 K = M, I - 1
-*
-*           The first iteration of this loop determines a reflection G
-*           from the vector V and applies it from left and right to H,
-*           thus creating a nonzero bulge below the subdiagonal.
-*
-*           Each subsequent iteration determines a reflection G to
-*           restore the Hessenberg form in the (K-1)th column, and thus
-*           chases the bulge one step toward the bottom of the active
-*           submatrix. NR is the order of G.
-*
-            NR = MIN( 3, I-K+1 )
-            IF( K.GT.M )
-     $         CALL SCOPY( NR, H( K, K-1 ), 1, V, 1 )
-            CALL SLARFG( NR, V( 1 ), V( 2 ), 1, T1 )
-            IF( K.GT.M ) THEN
-               H( K, K-1 ) = V( 1 )
-               H( K+1, K-1 ) = ZERO
-               IF( K.LT.I-1 )
-     $            H( K+2, K-1 ) = ZERO
-            ELSE IF( M.GT.L ) THEN
-               H( K, K-1 ) = -H( K, K-1 )
-            END IF
-            V2 = V( 2 )
-            T2 = T1*V2
-            IF( NR.EQ.3 ) THEN
-               V3 = V( 3 )
-               T3 = T1*V3
-*
-*              Apply G from the left to transform the rows of the matrix
-*              in columns K to I2.
-*
-               DO 70 J = K, I2
-                  SUM = H( K, J ) + V2*H( K+1, J ) + V3*H( K+2, J )
-                  H( K, J ) = H( K, J ) - SUM*T1
-                  H( K+1, J ) = H( K+1, J ) - SUM*T2
-                  H( K+2, J ) = H( K+2, J ) - SUM*T3
-   70          CONTINUE
-*
-*              Apply G from the right to transform the columns of the
-*              matrix in rows I1 to min(K+3,I).
-*
-               DO 80 J = I1, MIN( K+3, I )
-                  SUM = H( J, K ) + V2*H( J, K+1 ) + V3*H( J, K+2 )
-                  H( J, K ) = H( J, K ) - SUM*T1
-                  H( J, K+1 ) = H( J, K+1 ) - SUM*T2
-                  H( J, K+2 ) = H( J, K+2 ) - SUM*T3
-   80          CONTINUE
-*
-               IF( WANTZ ) THEN
-*
-*                 Accumulate transformations in the matrix Z
-*
-                  DO 90 J = ILOZ, IHIZ
-                     SUM = Z( J, K ) + V2*Z( J, K+1 ) + V3*Z( J, K+2 )
-                     Z( J, K ) = Z( J, K ) - SUM*T1
-                     Z( J, K+1 ) = Z( J, K+1 ) - SUM*T2
-                     Z( J, K+2 ) = Z( J, K+2 ) - SUM*T3
-   90             CONTINUE
-               END IF
-            ELSE IF( NR.EQ.2 ) THEN
-*
-*              Apply G from the left to transform the rows of the matrix
-*              in columns K to I2.
-*
-               DO 100 J = K, I2
-                  SUM = H( K, J ) + V2*H( K+1, J )
-                  H( K, J ) = H( K, J ) - SUM*T1
-                  H( K+1, J ) = H( K+1, J ) - SUM*T2
-  100          CONTINUE
-*
-*              Apply G from the right to transform the columns of the
-*              matrix in rows I1 to min(K+3,I).
-*
-               DO 110 J = I1, I
-                  SUM = H( J, K ) + V2*H( J, K+1 )
-                  H( J, K ) = H( J, K ) - SUM*T1
-                  H( J, K+1 ) = H( J, K+1 ) - SUM*T2
-  110          CONTINUE
-*
-               IF( WANTZ ) THEN
-*
-*                 Accumulate transformations in the matrix Z
-*
-                  DO 120 J = ILOZ, IHIZ
-                     SUM = Z( J, K ) + V2*Z( J, K+1 )
-                     Z( J, K ) = Z( J, K ) - SUM*T1
-                     Z( J, K+1 ) = Z( J, K+1 ) - SUM*T2
-  120             CONTINUE
-               END IF
-            END IF
-  130    CONTINUE
-*
-  140 CONTINUE
-*
-*     Failure to converge in remaining number of iterations
-*
-      INFO = I
-      RETURN
-*
-  150 CONTINUE
-*
-      IF( L.EQ.I ) THEN
-*
-*        H(I,I-1) is negligible: one eigenvalue has converged.
-*
-         WR( I ) = H( I, I )
-         WI( I ) = ZERO
-      ELSE IF( L.EQ.I-1 ) THEN
-*
-*        H(I-1,I-2) is negligible: a pair of eigenvalues have converged.
-*
-*        Transform the 2-by-2 submatrix to standard Schur form,
-*        and compute and store the eigenvalues.
-*
-         CALL SLANV2( H( I-1, I-1 ), H( I-1, I ), H( I, I-1 ),
-     $                H( I, I ), WR( I-1 ), WI( I-1 ), WR( I ), WI( I ),
-     $                CS, SN )
-*
-         IF( WANTT ) THEN
-*
-*           Apply the transformation to the rest of H.
-*
-            IF( I2.GT.I )
-     $         CALL SROT( I2-I, H( I-1, I+1 ), LDH, H( I, I+1 ), LDH,
-     $                    CS, SN )
-            CALL SROT( I-I1-1, H( I1, I-1 ), 1, H( I1, I ), 1, CS, SN )
-         END IF
-         IF( WANTZ ) THEN
-*
-*           Apply the transformation to Z.
-*
-            CALL SROT( NZ, Z( ILOZ, I-1 ), 1, Z( ILOZ, I ), 1, CS, SN )
-         END IF
-      END IF
-*
-*     return to start of the main loop with new value of I.
-*
-      I = L - 1
-      GO TO 20
-*
-  160 CONTINUE
-      RETURN
-*
-*     End of SLAHQR
-*
-      END
--- a/libcruft/lapack/slahr2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,238 +0,0 @@
-      SUBROUTINE SLAHR2( N, K, NB, A, LDA, TAU, T, LDT, Y, LDY )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            K, LDA, LDT, LDY, N, NB
-*     ..
-*     .. Array Arguments ..
-      REAL              A( LDA, * ), T( LDT, NB ), TAU( NB ),
-     $                   Y( LDY, NB )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAHR2 reduces the first NB columns of A real general n-BY-(n-k+1)
-*  matrix A so that elements below the k-th subdiagonal are zero. The
-*  reduction is performed by an orthogonal similarity transformation
-*  Q' * A * Q. The routine returns the matrices V and T which determine
-*  Q as a block reflector I - V*T*V', and also the matrix Y = A * V * T.
-*
-*  This is an auxiliary routine called by SGEHRD.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  K       (input) INTEGER
-*          The offset for the reduction. Elements below the k-th
-*          subdiagonal in the first NB columns are reduced to zero.
-*          K < N.
-*
-*  NB      (input) INTEGER
-*          The number of columns to be reduced.
-*
-*  A       (input/output) REAL array, dimension (LDA,N-K+1)
-*          On entry, the n-by-(n-k+1) general matrix A.
-*          On exit, the elements on and above the k-th subdiagonal in
-*          the first NB columns are overwritten with the corresponding
-*          elements of the reduced matrix; the elements below the k-th
-*          subdiagonal, with the array TAU, represent the matrix Q as a
-*          product of elementary reflectors. The other columns of A are
-*          unchanged. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  TAU     (output) REAL array, dimension (NB)
-*          The scalar factors of the elementary reflectors. See Further
-*          Details.
-*
-*  T       (output) REAL array, dimension (LDT,NB)
-*          The upper triangular matrix T.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T.  LDT >= NB.
-*
-*  Y       (output) REAL array, dimension (LDY,NB)
-*          The n-by-nb matrix Y.
-*
-*  LDY     (input) INTEGER
-*          The leading dimension of the array Y. LDY >= N.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of nb elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(nb).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i+k-1) = 0, v(i+k) = 1; v(i+k+1:n) is stored on exit in
-*  A(i+k+1:n,i), and tau in TAU(i).
-*
-*  The elements of the vectors v together form the (n-k+1)-by-nb matrix
-*  V which is needed, with T and Y, to apply the transformation to the
-*  unreduced part of the matrix, using an update of the form:
-*  A := (I - V*T*V') * (A - Y*V').
-*
-*  The contents of A on exit are illustrated by the following example
-*  with n = 7, k = 3 and nb = 2:
-*
-*     ( a   a   a   a   a )
-*     ( a   a   a   a   a )
-*     ( a   a   a   a   a )
-*     ( h   h   a   a   a )
-*     ( v1  h   a   a   a )
-*     ( v1  v2  a   a   a )
-*     ( v1  v2  a   a   a )
-*
-*  where a denotes an element of the original matrix A, h denotes a
-*  modified element of the upper Hessenberg matrix H, and vi denotes an
-*  element of the vector defining H(i).
-*
-*  This file is a slight modification of LAPACK-3.0's SLAHRD
-*  incorporating improvements proposed by Quintana-Orti and Van de
-*  Gejin. Note that the entries of A(1:K,2:NB) differ from those
-*  returned by the original LAPACK routine. This function is
-*  not backward compatible with LAPACK3.0.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL              ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, 
-     $                     ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      REAL              EI
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SAXPY, SCOPY, SGEMM, SGEMV, SLACPY,
-     $                   SLARFG, SSCAL, STRMM, STRMV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 )
-     $   RETURN
-*
-      DO 10 I = 1, NB
-         IF( I.GT.1 ) THEN
-*
-*           Update A(K+1:N,I)
-*
-*           Update I-th column of A - Y * V'
-*
-            CALL SGEMV( 'NO TRANSPOSE', N-K, I-1, -ONE, Y(K+1,1), LDY,
-     $                  A( K+I-1, 1 ), LDA, ONE, A( K+1, I ), 1 )
-*
-*           Apply I - V * T' * V' to this column (call it b) from the
-*           left, using the last column of T as workspace
-*
-*           Let  V = ( V1 )   and   b = ( b1 )   (first I-1 rows)
-*                    ( V2 )             ( b2 )
-*
-*           where V1 is unit lower triangular
-*
-*           w := V1' * b1
-*
-            CALL SCOPY( I-1, A( K+1, I ), 1, T( 1, NB ), 1 )
-            CALL STRMV( 'Lower', 'Transpose', 'UNIT', 
-     $                  I-1, A( K+1, 1 ),
-     $                  LDA, T( 1, NB ), 1 )
-*
-*           w := w + V2'*b2
-*
-            CALL SGEMV( 'Transpose', N-K-I+1, I-1, 
-     $                  ONE, A( K+I, 1 ),
-     $                  LDA, A( K+I, I ), 1, ONE, T( 1, NB ), 1 )
-*
-*           w := T'*w
-*
-            CALL STRMV( 'Upper', 'Transpose', 'NON-UNIT', 
-     $                  I-1, T, LDT,
-     $                  T( 1, NB ), 1 )
-*
-*           b2 := b2 - V2*w
-*
-            CALL SGEMV( 'NO TRANSPOSE', N-K-I+1, I-1, -ONE, 
-     $                  A( K+I, 1 ),
-     $                  LDA, T( 1, NB ), 1, ONE, A( K+I, I ), 1 )
-*
-*           b1 := b1 - V1*w
-*
-            CALL STRMV( 'Lower', 'NO TRANSPOSE', 
-     $                  'UNIT', I-1,
-     $                  A( K+1, 1 ), LDA, T( 1, NB ), 1 )
-            CALL SAXPY( I-1, -ONE, T( 1, NB ), 1, A( K+1, I ), 1 )
-*
-            A( K+I-1, I-1 ) = EI
-         END IF
-*
-*        Generate the elementary reflector H(I) to annihilate
-*        A(K+I+1:N,I)
-*
-         CALL SLARFG( N-K-I+1, A( K+I, I ), A( MIN( K+I+1, N ), I ), 1,
-     $                TAU( I ) )
-         EI = A( K+I, I )
-         A( K+I, I ) = ONE
-*
-*        Compute  Y(K+1:N,I)
-*
-         CALL SGEMV( 'NO TRANSPOSE', N-K, N-K-I+1, 
-     $               ONE, A( K+1, I+1 ),
-     $               LDA, A( K+I, I ), 1, ZERO, Y( K+1, I ), 1 )
-         CALL SGEMV( 'Transpose', N-K-I+1, I-1, 
-     $               ONE, A( K+I, 1 ), LDA,
-     $               A( K+I, I ), 1, ZERO, T( 1, I ), 1 )
-         CALL SGEMV( 'NO TRANSPOSE', N-K, I-1, -ONE, 
-     $               Y( K+1, 1 ), LDY,
-     $               T( 1, I ), 1, ONE, Y( K+1, I ), 1 )
-         CALL SSCAL( N-K, TAU( I ), Y( K+1, I ), 1 )
-*
-*        Compute T(1:I,I)
-*
-         CALL SSCAL( I-1, -TAU( I ), T( 1, I ), 1 )
-         CALL STRMV( 'Upper', 'No Transpose', 'NON-UNIT', 
-     $               I-1, T, LDT,
-     $               T( 1, I ), 1 )
-         T( I, I ) = TAU( I )
-*
-   10 CONTINUE
-      A( K+NB, NB ) = EI
-*
-*     Compute Y(1:K,1:NB)
-*
-      CALL SLACPY( 'ALL', K, NB, A( 1, 2 ), LDA, Y, LDY )
-      CALL STRMM( 'RIGHT', 'Lower', 'NO TRANSPOSE', 
-     $            'UNIT', K, NB,
-     $            ONE, A( K+1, 1 ), LDA, Y, LDY )
-      IF( N.GT.K+NB )
-     $   CALL SGEMM( 'NO TRANSPOSE', 'NO TRANSPOSE', K, 
-     $               NB, N-K-NB, ONE,
-     $               A( 1, 2+NB ), LDA, A( K+1+NB, 1 ), LDA, ONE, Y,
-     $               LDY )
-      CALL STRMM( 'RIGHT', 'Upper', 'NO TRANSPOSE', 
-     $            'NON-UNIT', K, NB,
-     $            ONE, T, LDT, Y, LDY )
-*
-      RETURN
-*
-*     End of SLAHR2
-*
-      END
--- a/libcruft/lapack/slahrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,207 +0,0 @@
-      SUBROUTINE SLAHRD( N, K, NB, A, LDA, TAU, T, LDT, Y, LDY )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            K, LDA, LDT, LDY, N, NB
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), T( LDT, NB ), TAU( NB ),
-     $                   Y( LDY, NB )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAHRD reduces the first NB columns of a real general n-by-(n-k+1)
-*  matrix A so that elements below the k-th subdiagonal are zero. The
-*  reduction is performed by an orthogonal similarity transformation
-*  Q' * A * Q. The routine returns the matrices V and T which determine
-*  Q as a block reflector I - V*T*V', and also the matrix Y = A * V * T.
-*
-*  This is an OBSOLETE auxiliary routine. 
-*  This routine will be 'deprecated' in a  future release.
-*  Please use the new routine SLAHR2 instead.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  K       (input) INTEGER
-*          The offset for the reduction. Elements below the k-th
-*          subdiagonal in the first NB columns are reduced to zero.
-*
-*  NB      (input) INTEGER
-*          The number of columns to be reduced.
-*
-*  A       (input/output) REAL array, dimension (LDA,N-K+1)
-*          On entry, the n-by-(n-k+1) general matrix A.
-*          On exit, the elements on and above the k-th subdiagonal in
-*          the first NB columns are overwritten with the corresponding
-*          elements of the reduced matrix; the elements below the k-th
-*          subdiagonal, with the array TAU, represent the matrix Q as a
-*          product of elementary reflectors. The other columns of A are
-*          unchanged. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  TAU     (output) REAL array, dimension (NB)
-*          The scalar factors of the elementary reflectors. See Further
-*          Details.
-*
-*  T       (output) REAL array, dimension (LDT,NB)
-*          The upper triangular matrix T.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T.  LDT >= NB.
-*
-*  Y       (output) REAL array, dimension (LDY,NB)
-*          The n-by-nb matrix Y.
-*
-*  LDY     (input) INTEGER
-*          The leading dimension of the array Y. LDY >= N.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of nb elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(nb).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i+k-1) = 0, v(i+k) = 1; v(i+k+1:n) is stored on exit in
-*  A(i+k+1:n,i), and tau in TAU(i).
-*
-*  The elements of the vectors v together form the (n-k+1)-by-nb matrix
-*  V which is needed, with T and Y, to apply the transformation to the
-*  unreduced part of the matrix, using an update of the form:
-*  A := (I - V*T*V') * (A - Y*V').
-*
-*  The contents of A on exit are illustrated by the following example
-*  with n = 7, k = 3 and nb = 2:
-*
-*     ( a   h   a   a   a )
-*     ( a   h   a   a   a )
-*     ( a   h   a   a   a )
-*     ( h   h   a   a   a )
-*     ( v1  h   a   a   a )
-*     ( v1  v2  a   a   a )
-*     ( v1  v2  a   a   a )
-*
-*  where a denotes an element of the original matrix A, h denotes a
-*  modified element of the upper Hessenberg matrix H, and vi denotes an
-*  element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      REAL               EI
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SAXPY, SCOPY, SGEMV, SLARFG, SSCAL, STRMV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 )
-     $   RETURN
-*
-      DO 10 I = 1, NB
-         IF( I.GT.1 ) THEN
-*
-*           Update A(1:n,i)
-*
-*           Compute i-th column of A - Y * V'
-*
-            CALL SGEMV( 'No transpose', N, I-1, -ONE, Y, LDY,
-     $                  A( K+I-1, 1 ), LDA, ONE, A( 1, I ), 1 )
-*
-*           Apply I - V * T' * V' to this column (call it b) from the
-*           left, using the last column of T as workspace
-*
-*           Let  V = ( V1 )   and   b = ( b1 )   (first I-1 rows)
-*                    ( V2 )             ( b2 )
-*
-*           where V1 is unit lower triangular
-*
-*           w := V1' * b1
-*
-            CALL SCOPY( I-1, A( K+1, I ), 1, T( 1, NB ), 1 )
-            CALL STRMV( 'Lower', 'Transpose', 'Unit', I-1, A( K+1, 1 ),
-     $                  LDA, T( 1, NB ), 1 )
-*
-*           w := w + V2'*b2
-*
-            CALL SGEMV( 'Transpose', N-K-I+1, I-1, ONE, A( K+I, 1 ),
-     $                  LDA, A( K+I, I ), 1, ONE, T( 1, NB ), 1 )
-*
-*           w := T'*w
-*
-            CALL STRMV( 'Upper', 'Transpose', 'Non-unit', I-1, T, LDT,
-     $                  T( 1, NB ), 1 )
-*
-*           b2 := b2 - V2*w
-*
-            CALL SGEMV( 'No transpose', N-K-I+1, I-1, -ONE, A( K+I, 1 ),
-     $                  LDA, T( 1, NB ), 1, ONE, A( K+I, I ), 1 )
-*
-*           b1 := b1 - V1*w
-*
-            CALL STRMV( 'Lower', 'No transpose', 'Unit', I-1,
-     $                  A( K+1, 1 ), LDA, T( 1, NB ), 1 )
-            CALL SAXPY( I-1, -ONE, T( 1, NB ), 1, A( K+1, I ), 1 )
-*
-            A( K+I-1, I-1 ) = EI
-         END IF
-*
-*        Generate the elementary reflector H(i) to annihilate
-*        A(k+i+1:n,i)
-*
-         CALL SLARFG( N-K-I+1, A( K+I, I ), A( MIN( K+I+1, N ), I ), 1,
-     $                TAU( I ) )
-         EI = A( K+I, I )
-         A( K+I, I ) = ONE
-*
-*        Compute  Y(1:n,i)
-*
-         CALL SGEMV( 'No transpose', N, N-K-I+1, ONE, A( 1, I+1 ), LDA,
-     $               A( K+I, I ), 1, ZERO, Y( 1, I ), 1 )
-         CALL SGEMV( 'Transpose', N-K-I+1, I-1, ONE, A( K+I, 1 ), LDA,
-     $               A( K+I, I ), 1, ZERO, T( 1, I ), 1 )
-         CALL SGEMV( 'No transpose', N, I-1, -ONE, Y, LDY, T( 1, I ), 1,
-     $               ONE, Y( 1, I ), 1 )
-         CALL SSCAL( N, TAU( I ), Y( 1, I ), 1 )
-*
-*        Compute T(1:i,i)
-*
-         CALL SSCAL( I-1, -TAU( I ), T( 1, I ), 1 )
-         CALL STRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, LDT,
-     $               T( 1, I ), 1 )
-         T( I, I ) = TAU( I )
-*
-   10 CONTINUE
-      A( K+NB, NB ) = EI
-*
-      RETURN
-*
-*     End of SLAHRD
-*
-      END
--- a/libcruft/lapack/slaic1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,292 +0,0 @@
-      SUBROUTINE SLAIC1( JOB, J, X, SEST, W, GAMMA, SESTPR, S, C )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            J, JOB
-      REAL               C, GAMMA, S, SEST, SESTPR
-*     ..
-*     .. Array Arguments ..
-      REAL               W( J ), X( J )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAIC1 applies one step of incremental condition estimation in
-*  its simplest version:
-*
-*  Let x, twonorm(x) = 1, be an approximate singular vector of an j-by-j
-*  lower triangular matrix L, such that
-*           twonorm(L*x) = sest
-*  Then SLAIC1 computes sestpr, s, c such that
-*  the vector
-*                  [ s*x ]
-*           xhat = [  c  ]
-*  is an approximate singular vector of
-*                  [ L     0  ]
-*           Lhat = [ w' gamma ]
-*  in the sense that
-*           twonorm(Lhat*xhat) = sestpr.
-*
-*  Depending on JOB, an estimate for the largest or smallest singular
-*  value is computed.
-*
-*  Note that [s c]' and sestpr**2 is an eigenpair of the system
-*
-*      diag(sest*sest, 0) + [alpha  gamma] * [ alpha ]
-*                                            [ gamma ]
-*
-*  where  alpha =  x'*w.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) INTEGER
-*          = 1: an estimate for the largest singular value is computed.
-*          = 2: an estimate for the smallest singular value is computed.
-*
-*  J       (input) INTEGER
-*          Length of X and W
-*
-*  X       (input) REAL array, dimension (J)
-*          The j-vector x.
-*
-*  SEST    (input) REAL
-*          Estimated singular value of j by j matrix L
-*
-*  W       (input) REAL array, dimension (J)
-*          The j-vector w.
-*
-*  GAMMA   (input) REAL
-*          The diagonal element gamma.
-*
-*  SESTPR  (output) REAL
-*          Estimated singular value of (j+1) by (j+1) matrix Lhat.
-*
-*  S       (output) REAL
-*          Sine needed in forming xhat.
-*
-*  C       (output) REAL
-*          Cosine needed in forming xhat.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0 )
-      REAL               HALF, FOUR
-      PARAMETER          ( HALF = 0.5E0, FOUR = 4.0E0 )
-*     ..
-*     .. Local Scalars ..
-      REAL               ABSALP, ABSEST, ABSGAM, ALPHA, B, COSINE, EPS,
-     $                   NORMA, S1, S2, SINE, T, TEST, TMP, ZETA1, ZETA2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SIGN, SQRT
-*     ..
-*     .. External Functions ..
-      REAL               SDOT, SLAMCH
-      EXTERNAL           SDOT, SLAMCH
-*     ..
-*     .. Executable Statements ..
-*
-      EPS = SLAMCH( 'Epsilon' )
-      ALPHA = SDOT( J, X, 1, W, 1 )
-*
-      ABSALP = ABS( ALPHA )
-      ABSGAM = ABS( GAMMA )
-      ABSEST = ABS( SEST )
-*
-      IF( JOB.EQ.1 ) THEN
-*
-*        Estimating largest singular value
-*
-*        special cases
-*
-         IF( SEST.EQ.ZERO ) THEN
-            S1 = MAX( ABSGAM, ABSALP )
-            IF( S1.EQ.ZERO ) THEN
-               S = ZERO
-               C = ONE
-               SESTPR = ZERO
-            ELSE
-               S = ALPHA / S1
-               C = GAMMA / S1
-               TMP = SQRT( S*S+C*C )
-               S = S / TMP
-               C = C / TMP
-               SESTPR = S1*TMP
-            END IF
-            RETURN
-         ELSE IF( ABSGAM.LE.EPS*ABSEST ) THEN
-            S = ONE
-            C = ZERO
-            TMP = MAX( ABSEST, ABSALP )
-            S1 = ABSEST / TMP
-            S2 = ABSALP / TMP
-            SESTPR = TMP*SQRT( S1*S1+S2*S2 )
-            RETURN
-         ELSE IF( ABSALP.LE.EPS*ABSEST ) THEN
-            S1 = ABSGAM
-            S2 = ABSEST
-            IF( S1.LE.S2 ) THEN
-               S = ONE
-               C = ZERO
-               SESTPR = S2
-            ELSE
-               S = ZERO
-               C = ONE
-               SESTPR = S1
-            END IF
-            RETURN
-         ELSE IF( ABSEST.LE.EPS*ABSALP .OR. ABSEST.LE.EPS*ABSGAM ) THEN
-            S1 = ABSGAM
-            S2 = ABSALP
-            IF( S1.LE.S2 ) THEN
-               TMP = S1 / S2
-               S = SQRT( ONE+TMP*TMP )
-               SESTPR = S2*S
-               C = ( GAMMA / S2 ) / S
-               S = SIGN( ONE, ALPHA ) / S
-            ELSE
-               TMP = S2 / S1
-               C = SQRT( ONE+TMP*TMP )
-               SESTPR = S1*C
-               S = ( ALPHA / S1 ) / C
-               C = SIGN( ONE, GAMMA ) / C
-            END IF
-            RETURN
-         ELSE
-*
-*           normal case
-*
-            ZETA1 = ALPHA / ABSEST
-            ZETA2 = GAMMA / ABSEST
-*
-            B = ( ONE-ZETA1*ZETA1-ZETA2*ZETA2 )*HALF
-            C = ZETA1*ZETA1
-            IF( B.GT.ZERO ) THEN
-               T = C / ( B+SQRT( B*B+C ) )
-            ELSE
-               T = SQRT( B*B+C ) - B
-            END IF
-*
-            SINE = -ZETA1 / T
-            COSINE = -ZETA2 / ( ONE+T )
-            TMP = SQRT( SINE*SINE+COSINE*COSINE )
-            S = SINE / TMP
-            C = COSINE / TMP
-            SESTPR = SQRT( T+ONE )*ABSEST
-            RETURN
-         END IF
-*
-      ELSE IF( JOB.EQ.2 ) THEN
-*
-*        Estimating smallest singular value
-*
-*        special cases
-*
-         IF( SEST.EQ.ZERO ) THEN
-            SESTPR = ZERO
-            IF( MAX( ABSGAM, ABSALP ).EQ.ZERO ) THEN
-               SINE = ONE
-               COSINE = ZERO
-            ELSE
-               SINE = -GAMMA
-               COSINE = ALPHA
-            END IF
-            S1 = MAX( ABS( SINE ), ABS( COSINE ) )
-            S = SINE / S1
-            C = COSINE / S1
-            TMP = SQRT( S*S+C*C )
-            S = S / TMP
-            C = C / TMP
-            RETURN
-         ELSE IF( ABSGAM.LE.EPS*ABSEST ) THEN
-            S = ZERO
-            C = ONE
-            SESTPR = ABSGAM
-            RETURN
-         ELSE IF( ABSALP.LE.EPS*ABSEST ) THEN
-            S1 = ABSGAM
-            S2 = ABSEST
-            IF( S1.LE.S2 ) THEN
-               S = ZERO
-               C = ONE
-               SESTPR = S1
-            ELSE
-               S = ONE
-               C = ZERO
-               SESTPR = S2
-            END IF
-            RETURN
-         ELSE IF( ABSEST.LE.EPS*ABSALP .OR. ABSEST.LE.EPS*ABSGAM ) THEN
-            S1 = ABSGAM
-            S2 = ABSALP
-            IF( S1.LE.S2 ) THEN
-               TMP = S1 / S2
-               C = SQRT( ONE+TMP*TMP )
-               SESTPR = ABSEST*( TMP / C )
-               S = -( GAMMA / S2 ) / C
-               C = SIGN( ONE, ALPHA ) / C
-            ELSE
-               TMP = S2 / S1
-               S = SQRT( ONE+TMP*TMP )
-               SESTPR = ABSEST / S
-               C = ( ALPHA / S1 ) / S
-               S = -SIGN( ONE, GAMMA ) / S
-            END IF
-            RETURN
-         ELSE
-*
-*           normal case
-*
-            ZETA1 = ALPHA / ABSEST
-            ZETA2 = GAMMA / ABSEST
-*
-            NORMA = MAX( ONE+ZETA1*ZETA1+ABS( ZETA1*ZETA2 ),
-     $              ABS( ZETA1*ZETA2 )+ZETA2*ZETA2 )
-*
-*           See if root is closer to zero or to ONE
-*
-            TEST = ONE + TWO*( ZETA1-ZETA2 )*( ZETA1+ZETA2 )
-            IF( TEST.GE.ZERO ) THEN
-*
-*              root is close to zero, compute directly
-*
-               B = ( ZETA1*ZETA1+ZETA2*ZETA2+ONE )*HALF
-               C = ZETA2*ZETA2
-               T = C / ( B+SQRT( ABS( B*B-C ) ) )
-               SINE = ZETA1 / ( ONE-T )
-               COSINE = -ZETA2 / T
-               SESTPR = SQRT( T+FOUR*EPS*EPS*NORMA )*ABSEST
-            ELSE
-*
-*              root is closer to ONE, shift by that amount
-*
-               B = ( ZETA2*ZETA2+ZETA1*ZETA1-ONE )*HALF
-               C = ZETA1*ZETA1
-               IF( B.GE.ZERO ) THEN
-                  T = -C / ( B+SQRT( B*B+C ) )
-               ELSE
-                  T = B - SQRT( B*B+C )
-               END IF
-               SINE = -ZETA1 / T
-               COSINE = -ZETA2 / ( ONE+T )
-               SESTPR = SQRT( ONE+T+FOUR*EPS*EPS*NORMA )*ABSEST
-            END IF
-            TMP = SQRT( SINE*SINE+COSINE*COSINE )
-            S = SINE / TMP
-            C = COSINE / TMP
-            RETURN
-*
-         END IF
-      END IF
-      RETURN
-*
-*     End of SLAIC1
-*
-      END
--- a/libcruft/lapack/slaln2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,507 +0,0 @@
-      SUBROUTINE SLALN2( LTRANS, NA, NW, SMIN, CA, A, LDA, D1, D2, B,
-     $                   LDB, WR, WI, X, LDX, SCALE, XNORM, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            LTRANS
-      INTEGER            INFO, LDA, LDB, LDX, NA, NW
-      REAL               CA, D1, D2, SCALE, SMIN, WI, WR, XNORM
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), B( LDB, * ), X( LDX, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLALN2 solves a system of the form  (ca A - w D ) X = s B
-*  or (ca A' - w D) X = s B   with possible scaling ("s") and
-*  perturbation of A.  (A' means A-transpose.)
-*
-*  A is an NA x NA real matrix, ca is a real scalar, D is an NA x NA
-*  real diagonal matrix, w is a real or complex value, and X and B are
-*  NA x 1 matrices -- real if w is real, complex if w is complex.  NA
-*  may be 1 or 2.
-*
-*  If w is complex, X and B are represented as NA x 2 matrices,
-*  the first column of each being the real part and the second
-*  being the imaginary part.
-*
-*  "s" is a scaling factor (.LE. 1), computed by SLALN2, which is
-*  so chosen that X can be computed without overflow.  X is further
-*  scaled if necessary to assure that norm(ca A - w D)*norm(X) is less
-*  than overflow.
-*
-*  If both singular values of (ca A - w D) are less than SMIN,
-*  SMIN*identity will be used instead of (ca A - w D).  If only one
-*  singular value is less than SMIN, one element of (ca A - w D) will be
-*  perturbed enough to make the smallest singular value roughly SMIN.
-*  If both singular values are at least SMIN, (ca A - w D) will not be
-*  perturbed.  In any case, the perturbation will be at most some small
-*  multiple of max( SMIN, ulp*norm(ca A - w D) ).  The singular values
-*  are computed by infinity-norm approximations, and thus will only be
-*  correct to a factor of 2 or so.
-*
-*  Note: all input quantities are assumed to be smaller than overflow
-*  by a reasonable factor.  (See BIGNUM.)
-*
-*  Arguments
-*  ==========
-*
-*  LTRANS  (input) LOGICAL
-*          =.TRUE.:  A-transpose will be used.
-*          =.FALSE.: A will be used (not transposed.)
-*
-*  NA      (input) INTEGER
-*          The size of the matrix A.  It may (only) be 1 or 2.
-*
-*  NW      (input) INTEGER
-*          1 if "w" is real, 2 if "w" is complex.  It may only be 1
-*          or 2.
-*
-*  SMIN    (input) REAL
-*          The desired lower bound on the singular values of A.  This
-*          should be a safe distance away from underflow or overflow,
-*          say, between (underflow/machine precision) and  (machine
-*          precision * overflow ).  (See BIGNUM and ULP.)
-*
-*  CA      (input) REAL
-*          The coefficient c, which A is multiplied by.
-*
-*  A       (input) REAL array, dimension (LDA,NA)
-*          The NA x NA matrix A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of A.  It must be at least NA.
-*
-*  D1      (input) REAL
-*          The 1,1 element in the diagonal matrix D.
-*
-*  D2      (input) REAL
-*          The 2,2 element in the diagonal matrix D.  Not used if NW=1.
-*
-*  B       (input) REAL array, dimension (LDB,NW)
-*          The NA x NW matrix B (right-hand side).  If NW=2 ("w" is
-*          complex), column 1 contains the real part of B and column 2
-*          contains the imaginary part.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of B.  It must be at least NA.
-*
-*  WR      (input) REAL
-*          The real part of the scalar "w".
-*
-*  WI      (input) REAL
-*          The imaginary part of the scalar "w".  Not used if NW=1.
-*
-*  X       (output) REAL array, dimension (LDX,NW)
-*          The NA x NW matrix X (unknowns), as computed by SLALN2.
-*          If NW=2 ("w" is complex), on exit, column 1 will contain
-*          the real part of X and column 2 will contain the imaginary
-*          part.
-*
-*  LDX     (input) INTEGER
-*          The leading dimension of X.  It must be at least NA.
-*
-*  SCALE   (output) REAL
-*          The scale factor that B must be multiplied by to insure
-*          that overflow does not occur when computing X.  Thus,
-*          (ca A - w D) X  will be SCALE*B, not B (ignoring
-*          perturbations of A.)  It will be at most 1.
-*
-*  XNORM   (output) REAL
-*          The infinity-norm of X, when X is regarded as an NA x NW
-*          real matrix.
-*
-*  INFO    (output) INTEGER
-*          An error flag.  It will be set to zero if no error occurs,
-*          a negative number if an argument is in error, or a positive
-*          number if  ca A - w D  had to be perturbed.
-*          The possible values are:
-*          = 0: No error occurred, and (ca A - w D) did not have to be
-*                 perturbed.
-*          = 1: (ca A - w D) had to be perturbed to make its smallest
-*               (or only) singular value greater than SMIN.
-*          NOTE: In the interests of speed, this routine does not
-*                check the inputs for errors.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
-      REAL               TWO
-      PARAMETER          ( TWO = 2.0E0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            ICMAX, J
-      REAL               BBND, BI1, BI2, BIGNUM, BNORM, BR1, BR2, CI21,
-     $                   CI22, CMAX, CNORM, CR21, CR22, CSI, CSR, LI21,
-     $                   LR21, SMINI, SMLNUM, TEMP, U22ABS, UI11, UI11R,
-     $                   UI12, UI12S, UI22, UR11, UR11R, UR12, UR12S,
-     $                   UR22, XI1, XI2, XR1, XR2
-*     ..
-*     .. Local Arrays ..
-      LOGICAL            CSWAP( 4 ), RSWAP( 4 )
-      INTEGER            IPIVOT( 4, 4 )
-      REAL               CI( 2, 2 ), CIV( 4 ), CR( 2, 2 ), CRV( 4 )
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      EXTERNAL           SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLADIV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Equivalences ..
-      EQUIVALENCE        ( CI( 1, 1 ), CIV( 1 ) ),
-     $                   ( CR( 1, 1 ), CRV( 1 ) )
-*     ..
-*     .. Data statements ..
-      DATA               CSWAP / .FALSE., .FALSE., .TRUE., .TRUE. /
-      DATA               RSWAP / .FALSE., .TRUE., .FALSE., .TRUE. /
-      DATA               IPIVOT / 1, 2, 3, 4, 2, 1, 4, 3, 3, 4, 1, 2, 4,
-     $                   3, 2, 1 /
-*     ..
-*     .. Executable Statements ..
-*
-*     Compute BIGNUM
-*
-      SMLNUM = TWO*SLAMCH( 'Safe minimum' )
-      BIGNUM = ONE / SMLNUM
-      SMINI = MAX( SMIN, SMLNUM )
-*
-*     Don't check for input errors
-*
-      INFO = 0
-*
-*     Standard Initializations
-*
-      SCALE = ONE
-*
-      IF( NA.EQ.1 ) THEN
-*
-*        1 x 1  (i.e., scalar) system   C X = B
-*
-         IF( NW.EQ.1 ) THEN
-*
-*           Real 1x1 system.
-*
-*           C = ca A - w D
-*
-            CSR = CA*A( 1, 1 ) - WR*D1
-            CNORM = ABS( CSR )
-*
-*           If | C | < SMINI, use C = SMINI
-*
-            IF( CNORM.LT.SMINI ) THEN
-               CSR = SMINI
-               CNORM = SMINI
-               INFO = 1
-            END IF
-*
-*           Check scaling for  X = B / C
-*
-            BNORM = ABS( B( 1, 1 ) )
-            IF( CNORM.LT.ONE .AND. BNORM.GT.ONE ) THEN
-               IF( BNORM.GT.BIGNUM*CNORM )
-     $            SCALE = ONE / BNORM
-            END IF
-*
-*           Compute X
-*
-            X( 1, 1 ) = ( B( 1, 1 )*SCALE ) / CSR
-            XNORM = ABS( X( 1, 1 ) )
-         ELSE
-*
-*           Complex 1x1 system (w is complex)
-*
-*           C = ca A - w D
-*
-            CSR = CA*A( 1, 1 ) - WR*D1
-            CSI = -WI*D1
-            CNORM = ABS( CSR ) + ABS( CSI )
-*
-*           If | C | < SMINI, use C = SMINI
-*
-            IF( CNORM.LT.SMINI ) THEN
-               CSR = SMINI
-               CSI = ZERO
-               CNORM = SMINI
-               INFO = 1
-            END IF
-*
-*           Check scaling for  X = B / C
-*
-            BNORM = ABS( B( 1, 1 ) ) + ABS( B( 1, 2 ) )
-            IF( CNORM.LT.ONE .AND. BNORM.GT.ONE ) THEN
-               IF( BNORM.GT.BIGNUM*CNORM )
-     $            SCALE = ONE / BNORM
-            END IF
-*
-*           Compute X
-*
-            CALL SLADIV( SCALE*B( 1, 1 ), SCALE*B( 1, 2 ), CSR, CSI,
-     $                   X( 1, 1 ), X( 1, 2 ) )
-            XNORM = ABS( X( 1, 1 ) ) + ABS( X( 1, 2 ) )
-         END IF
-*
-      ELSE
-*
-*        2x2 System
-*
-*        Compute the real part of  C = ca A - w D  (or  ca A' - w D )
-*
-         CR( 1, 1 ) = CA*A( 1, 1 ) - WR*D1
-         CR( 2, 2 ) = CA*A( 2, 2 ) - WR*D2
-         IF( LTRANS ) THEN
-            CR( 1, 2 ) = CA*A( 2, 1 )
-            CR( 2, 1 ) = CA*A( 1, 2 )
-         ELSE
-            CR( 2, 1 ) = CA*A( 2, 1 )
-            CR( 1, 2 ) = CA*A( 1, 2 )
-         END IF
-*
-         IF( NW.EQ.1 ) THEN
-*
-*           Real 2x2 system  (w is real)
-*
-*           Find the largest element in C
-*
-            CMAX = ZERO
-            ICMAX = 0
-*
-            DO 10 J = 1, 4
-               IF( ABS( CRV( J ) ).GT.CMAX ) THEN
-                  CMAX = ABS( CRV( J ) )
-                  ICMAX = J
-               END IF
-   10       CONTINUE
-*
-*           If norm(C) < SMINI, use SMINI*identity.
-*
-            IF( CMAX.LT.SMINI ) THEN
-               BNORM = MAX( ABS( B( 1, 1 ) ), ABS( B( 2, 1 ) ) )
-               IF( SMINI.LT.ONE .AND. BNORM.GT.ONE ) THEN
-                  IF( BNORM.GT.BIGNUM*SMINI )
-     $               SCALE = ONE / BNORM
-               END IF
-               TEMP = SCALE / SMINI
-               X( 1, 1 ) = TEMP*B( 1, 1 )
-               X( 2, 1 ) = TEMP*B( 2, 1 )
-               XNORM = TEMP*BNORM
-               INFO = 1
-               RETURN
-            END IF
-*
-*           Gaussian elimination with complete pivoting.
-*
-            UR11 = CRV( ICMAX )
-            CR21 = CRV( IPIVOT( 2, ICMAX ) )
-            UR12 = CRV( IPIVOT( 3, ICMAX ) )
-            CR22 = CRV( IPIVOT( 4, ICMAX ) )
-            UR11R = ONE / UR11
-            LR21 = UR11R*CR21
-            UR22 = CR22 - UR12*LR21
-*
-*           If smaller pivot < SMINI, use SMINI
-*
-            IF( ABS( UR22 ).LT.SMINI ) THEN
-               UR22 = SMINI
-               INFO = 1
-            END IF
-            IF( RSWAP( ICMAX ) ) THEN
-               BR1 = B( 2, 1 )
-               BR2 = B( 1, 1 )
-            ELSE
-               BR1 = B( 1, 1 )
-               BR2 = B( 2, 1 )
-            END IF
-            BR2 = BR2 - LR21*BR1
-            BBND = MAX( ABS( BR1*( UR22*UR11R ) ), ABS( BR2 ) )
-            IF( BBND.GT.ONE .AND. ABS( UR22 ).LT.ONE ) THEN
-               IF( BBND.GE.BIGNUM*ABS( UR22 ) )
-     $            SCALE = ONE / BBND
-            END IF
-*
-            XR2 = ( BR2*SCALE ) / UR22
-            XR1 = ( SCALE*BR1 )*UR11R - XR2*( UR11R*UR12 )
-            IF( CSWAP( ICMAX ) ) THEN
-               X( 1, 1 ) = XR2
-               X( 2, 1 ) = XR1
-            ELSE
-               X( 1, 1 ) = XR1
-               X( 2, 1 ) = XR2
-            END IF
-            XNORM = MAX( ABS( XR1 ), ABS( XR2 ) )
-*
-*           Further scaling if  norm(A) norm(X) > overflow
-*
-            IF( XNORM.GT.ONE .AND. CMAX.GT.ONE ) THEN
-               IF( XNORM.GT.BIGNUM / CMAX ) THEN
-                  TEMP = CMAX / BIGNUM
-                  X( 1, 1 ) = TEMP*X( 1, 1 )
-                  X( 2, 1 ) = TEMP*X( 2, 1 )
-                  XNORM = TEMP*XNORM
-                  SCALE = TEMP*SCALE
-               END IF
-            END IF
-         ELSE
-*
-*           Complex 2x2 system  (w is complex)
-*
-*           Find the largest element in C
-*
-            CI( 1, 1 ) = -WI*D1
-            CI( 2, 1 ) = ZERO
-            CI( 1, 2 ) = ZERO
-            CI( 2, 2 ) = -WI*D2
-            CMAX = ZERO
-            ICMAX = 0
-*
-            DO 20 J = 1, 4
-               IF( ABS( CRV( J ) )+ABS( CIV( J ) ).GT.CMAX ) THEN
-                  CMAX = ABS( CRV( J ) ) + ABS( CIV( J ) )
-                  ICMAX = J
-               END IF
-   20       CONTINUE
-*
-*           If norm(C) < SMINI, use SMINI*identity.
-*
-            IF( CMAX.LT.SMINI ) THEN
-               BNORM = MAX( ABS( B( 1, 1 ) )+ABS( B( 1, 2 ) ),
-     $                 ABS( B( 2, 1 ) )+ABS( B( 2, 2 ) ) )
-               IF( SMINI.LT.ONE .AND. BNORM.GT.ONE ) THEN
-                  IF( BNORM.GT.BIGNUM*SMINI )
-     $               SCALE = ONE / BNORM
-               END IF
-               TEMP = SCALE / SMINI
-               X( 1, 1 ) = TEMP*B( 1, 1 )
-               X( 2, 1 ) = TEMP*B( 2, 1 )
-               X( 1, 2 ) = TEMP*B( 1, 2 )
-               X( 2, 2 ) = TEMP*B( 2, 2 )
-               XNORM = TEMP*BNORM
-               INFO = 1
-               RETURN
-            END IF
-*
-*           Gaussian elimination with complete pivoting.
-*
-            UR11 = CRV( ICMAX )
-            UI11 = CIV( ICMAX )
-            CR21 = CRV( IPIVOT( 2, ICMAX ) )
-            CI21 = CIV( IPIVOT( 2, ICMAX ) )
-            UR12 = CRV( IPIVOT( 3, ICMAX ) )
-            UI12 = CIV( IPIVOT( 3, ICMAX ) )
-            CR22 = CRV( IPIVOT( 4, ICMAX ) )
-            CI22 = CIV( IPIVOT( 4, ICMAX ) )
-            IF( ICMAX.EQ.1 .OR. ICMAX.EQ.4 ) THEN
-*
-*              Code when off-diagonals of pivoted C are real
-*
-               IF( ABS( UR11 ).GT.ABS( UI11 ) ) THEN
-                  TEMP = UI11 / UR11
-                  UR11R = ONE / ( UR11*( ONE+TEMP**2 ) )
-                  UI11R = -TEMP*UR11R
-               ELSE
-                  TEMP = UR11 / UI11
-                  UI11R = -ONE / ( UI11*( ONE+TEMP**2 ) )
-                  UR11R = -TEMP*UI11R
-               END IF
-               LR21 = CR21*UR11R
-               LI21 = CR21*UI11R
-               UR12S = UR12*UR11R
-               UI12S = UR12*UI11R
-               UR22 = CR22 - UR12*LR21
-               UI22 = CI22 - UR12*LI21
-            ELSE
-*
-*              Code when diagonals of pivoted C are real
-*
-               UR11R = ONE / UR11
-               UI11R = ZERO
-               LR21 = CR21*UR11R
-               LI21 = CI21*UR11R
-               UR12S = UR12*UR11R
-               UI12S = UI12*UR11R
-               UR22 = CR22 - UR12*LR21 + UI12*LI21
-               UI22 = -UR12*LI21 - UI12*LR21
-            END IF
-            U22ABS = ABS( UR22 ) + ABS( UI22 )
-*
-*           If smaller pivot < SMINI, use SMINI
-*
-            IF( U22ABS.LT.SMINI ) THEN
-               UR22 = SMINI
-               UI22 = ZERO
-               INFO = 1
-            END IF
-            IF( RSWAP( ICMAX ) ) THEN
-               BR2 = B( 1, 1 )
-               BR1 = B( 2, 1 )
-               BI2 = B( 1, 2 )
-               BI1 = B( 2, 2 )
-            ELSE
-               BR1 = B( 1, 1 )
-               BR2 = B( 2, 1 )
-               BI1 = B( 1, 2 )
-               BI2 = B( 2, 2 )
-            END IF
-            BR2 = BR2 - LR21*BR1 + LI21*BI1
-            BI2 = BI2 - LI21*BR1 - LR21*BI1
-            BBND = MAX( ( ABS( BR1 )+ABS( BI1 ) )*
-     $             ( U22ABS*( ABS( UR11R )+ABS( UI11R ) ) ),
-     $             ABS( BR2 )+ABS( BI2 ) )
-            IF( BBND.GT.ONE .AND. U22ABS.LT.ONE ) THEN
-               IF( BBND.GE.BIGNUM*U22ABS ) THEN
-                  SCALE = ONE / BBND
-                  BR1 = SCALE*BR1
-                  BI1 = SCALE*BI1
-                  BR2 = SCALE*BR2
-                  BI2 = SCALE*BI2
-               END IF
-            END IF
-*
-            CALL SLADIV( BR2, BI2, UR22, UI22, XR2, XI2 )
-            XR1 = UR11R*BR1 - UI11R*BI1 - UR12S*XR2 + UI12S*XI2
-            XI1 = UI11R*BR1 + UR11R*BI1 - UI12S*XR2 - UR12S*XI2
-            IF( CSWAP( ICMAX ) ) THEN
-               X( 1, 1 ) = XR2
-               X( 2, 1 ) = XR1
-               X( 1, 2 ) = XI2
-               X( 2, 2 ) = XI1
-            ELSE
-               X( 1, 1 ) = XR1
-               X( 2, 1 ) = XR2
-               X( 1, 2 ) = XI1
-               X( 2, 2 ) = XI2
-            END IF
-            XNORM = MAX( ABS( XR1 )+ABS( XI1 ), ABS( XR2 )+ABS( XI2 ) )
-*
-*           Further scaling if  norm(A) norm(X) > overflow
-*
-            IF( XNORM.GT.ONE .AND. CMAX.GT.ONE ) THEN
-               IF( XNORM.GT.BIGNUM / CMAX ) THEN
-                  TEMP = CMAX / BIGNUM
-                  X( 1, 1 ) = TEMP*X( 1, 1 )
-                  X( 2, 1 ) = TEMP*X( 2, 1 )
-                  X( 1, 2 ) = TEMP*X( 1, 2 )
-                  X( 2, 2 ) = TEMP*X( 2, 2 )
-                  XNORM = TEMP*XNORM
-                  SCALE = TEMP*SCALE
-               END IF
-            END IF
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of SLALN2
-*
-      END
--- a/libcruft/lapack/slals0.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,377 +0,0 @@
-      SUBROUTINE SLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B, LDB, BX, LDBX,
-     $                   PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM,
-     $                   POLES, DIFL, DIFR, Z, K, C, S, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            GIVPTR, ICOMPQ, INFO, K, LDB, LDBX, LDGCOL,
-     $                   LDGNUM, NL, NR, NRHS, SQRE
-      REAL               C, S
-*     ..
-*     .. Array Arguments ..
-      INTEGER            GIVCOL( LDGCOL, * ), PERM( * )
-      REAL               B( LDB, * ), BX( LDBX, * ), DIFL( * ),
-     $                   DIFR( LDGNUM, * ), GIVNUM( LDGNUM, * ),
-     $                   POLES( LDGNUM, * ), WORK( * ), Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLALS0 applies back the multiplying factors of either the left or the
-*  right singular vector matrix of a diagonal matrix appended by a row
-*  to the right hand side matrix B in solving the least squares problem
-*  using the divide-and-conquer SVD approach.
-*
-*  For the left singular vector matrix, three types of orthogonal
-*  matrices are involved:
-*
-*  (1L) Givens rotations: the number of such rotations is GIVPTR; the
-*       pairs of columns/rows they were applied to are stored in GIVCOL;
-*       and the C- and S-values of these rotations are stored in GIVNUM.
-*
-*  (2L) Permutation. The (NL+1)-st row of B is to be moved to the first
-*       row, and for J=2:N, PERM(J)-th row of B is to be moved to the
-*       J-th row.
-*
-*  (3L) The left singular vector matrix of the remaining matrix.
-*
-*  For the right singular vector matrix, four types of orthogonal
-*  matrices are involved:
-*
-*  (1R) The right singular vector matrix of the remaining matrix.
-*
-*  (2R) If SQRE = 1, one extra Givens rotation to generate the right
-*       null space.
-*
-*  (3R) The inverse transformation of (2L).
-*
-*  (4R) The inverse transformation of (1L).
-*
-*  Arguments
-*  =========
-*
-*  ICOMPQ (input) INTEGER
-*         Specifies whether singular vectors are to be computed in
-*         factored form:
-*         = 0: Left singular vector matrix.
-*         = 1: Right singular vector matrix.
-*
-*  NL     (input) INTEGER
-*         The row dimension of the upper block. NL >= 1.
-*
-*  NR     (input) INTEGER
-*         The row dimension of the lower block. NR >= 1.
-*
-*  SQRE   (input) INTEGER
-*         = 0: the lower block is an NR-by-NR square matrix.
-*         = 1: the lower block is an NR-by-(NR+1) rectangular matrix.
-*
-*         The bidiagonal matrix has row dimension N = NL + NR + 1,
-*         and column dimension M = N + SQRE.
-*
-*  NRHS   (input) INTEGER
-*         The number of columns of B and BX. NRHS must be at least 1.
-*
-*  B      (input/output) REAL array, dimension ( LDB, NRHS )
-*         On input, B contains the right hand sides of the least
-*         squares problem in rows 1 through M. On output, B contains
-*         the solution X in rows 1 through N.
-*
-*  LDB    (input) INTEGER
-*         The leading dimension of B. LDB must be at least
-*         max(1,MAX( M, N ) ).
-*
-*  BX     (workspace) REAL array, dimension ( LDBX, NRHS )
-*
-*  LDBX   (input) INTEGER
-*         The leading dimension of BX.
-*
-*  PERM   (input) INTEGER array, dimension ( N )
-*         The permutations (from deflation and sorting) applied
-*         to the two blocks.
-*
-*  GIVPTR (input) INTEGER
-*         The number of Givens rotations which took place in this
-*         subproblem.
-*
-*  GIVCOL (input) INTEGER array, dimension ( LDGCOL, 2 )
-*         Each pair of numbers indicates a pair of rows/columns
-*         involved in a Givens rotation.
-*
-*  LDGCOL (input) INTEGER
-*         The leading dimension of GIVCOL, must be at least N.
-*
-*  GIVNUM (input) REAL array, dimension ( LDGNUM, 2 )
-*         Each number indicates the C or S value used in the
-*         corresponding Givens rotation.
-*
-*  LDGNUM (input) INTEGER
-*         The leading dimension of arrays DIFR, POLES and
-*         GIVNUM, must be at least K.
-*
-*  POLES  (input) REAL array, dimension ( LDGNUM, 2 )
-*         On entry, POLES(1:K, 1) contains the new singular
-*         values obtained from solving the secular equation, and
-*         POLES(1:K, 2) is an array containing the poles in the secular
-*         equation.
-*
-*  DIFL   (input) REAL array, dimension ( K ).
-*         On entry, DIFL(I) is the distance between I-th updated
-*         (undeflated) singular value and the I-th (undeflated) old
-*         singular value.
-*
-*  DIFR   (input) REAL array, dimension ( LDGNUM, 2 ).
-*         On entry, DIFR(I, 1) contains the distances between I-th
-*         updated (undeflated) singular value and the I+1-th
-*         (undeflated) old singular value. And DIFR(I, 2) is the
-*         normalizing factor for the I-th right singular vector.
-*
-*  Z      (input) REAL array, dimension ( K )
-*         Contain the components of the deflation-adjusted updating row
-*         vector.
-*
-*  K      (input) INTEGER
-*         Contains the dimension of the non-deflated matrix,
-*         This is the order of the related secular equation. 1 <= K <=N.
-*
-*  C      (input) REAL
-*         C contains garbage if SQRE =0 and the C-value of a Givens
-*         rotation related to the right null space if SQRE = 1.
-*
-*  S      (input) REAL
-*         S contains garbage if SQRE =0 and the S-value of a Givens
-*         rotation related to the right null space if SQRE = 1.
-*
-*  WORK   (workspace) REAL array, dimension ( K )
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Ren-Cang Li, Computer Science Division, University of
-*       California at Berkeley, USA
-*     Osni Marques, LBNL/NERSC, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO, NEGONE
-      PARAMETER          ( ONE = 1.0E0, ZERO = 0.0E0, NEGONE = -1.0E0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J, M, N, NLP1
-      REAL               DIFLJ, DIFRJ, DJ, DSIGJ, DSIGJP, TEMP
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SGEMV, SLACPY, SLASCL, SROT, SSCAL,
-     $                   XERBLA
-*     ..
-*     .. External Functions ..
-      REAL               SLAMC3, SNRM2
-      EXTERNAL           SLAMC3, SNRM2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN
-         INFO = -1
-      ELSE IF( NL.LT.1 ) THEN
-         INFO = -2
-      ELSE IF( NR.LT.1 ) THEN
-         INFO = -3
-      ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN
-         INFO = -4
-      END IF
-*
-      N = NL + NR + 1
-*
-      IF( NRHS.LT.1 ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.N ) THEN
-         INFO = -7
-      ELSE IF( LDBX.LT.N ) THEN
-         INFO = -9
-      ELSE IF( GIVPTR.LT.0 ) THEN
-         INFO = -11
-      ELSE IF( LDGCOL.LT.N ) THEN
-         INFO = -13
-      ELSE IF( LDGNUM.LT.N ) THEN
-         INFO = -15
-      ELSE IF( K.LT.1 ) THEN
-         INFO = -20
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLALS0', -INFO )
-         RETURN
-      END IF
-*
-      M = N + SQRE
-      NLP1 = NL + 1
-*
-      IF( ICOMPQ.EQ.0 ) THEN
-*
-*        Apply back orthogonal transformations from the left.
-*
-*        Step (1L): apply back the Givens rotations performed.
-*
-         DO 10 I = 1, GIVPTR
-            CALL SROT( NRHS, B( GIVCOL( I, 2 ), 1 ), LDB,
-     $                 B( GIVCOL( I, 1 ), 1 ), LDB, GIVNUM( I, 2 ),
-     $                 GIVNUM( I, 1 ) )
-   10    CONTINUE
-*
-*        Step (2L): permute rows of B.
-*
-         CALL SCOPY( NRHS, B( NLP1, 1 ), LDB, BX( 1, 1 ), LDBX )
-         DO 20 I = 2, N
-            CALL SCOPY( NRHS, B( PERM( I ), 1 ), LDB, BX( I, 1 ), LDBX )
-   20    CONTINUE
-*
-*        Step (3L): apply the inverse of the left singular vector
-*        matrix to BX.
-*
-         IF( K.EQ.1 ) THEN
-            CALL SCOPY( NRHS, BX, LDBX, B, LDB )
-            IF( Z( 1 ).LT.ZERO ) THEN
-               CALL SSCAL( NRHS, NEGONE, B, LDB )
-            END IF
-         ELSE
-            DO 50 J = 1, K
-               DIFLJ = DIFL( J )
-               DJ = POLES( J, 1 )
-               DSIGJ = -POLES( J, 2 )
-               IF( J.LT.K ) THEN
-                  DIFRJ = -DIFR( J, 1 )
-                  DSIGJP = -POLES( J+1, 2 )
-               END IF
-               IF( ( Z( J ).EQ.ZERO ) .OR. ( POLES( J, 2 ).EQ.ZERO ) )
-     $              THEN
-                  WORK( J ) = ZERO
-               ELSE
-                  WORK( J ) = -POLES( J, 2 )*Z( J ) / DIFLJ /
-     $                        ( POLES( J, 2 )+DJ )
-               END IF
-               DO 30 I = 1, J - 1
-                  IF( ( Z( I ).EQ.ZERO ) .OR.
-     $                ( POLES( I, 2 ).EQ.ZERO ) ) THEN
-                     WORK( I ) = ZERO
-                  ELSE
-                     WORK( I ) = POLES( I, 2 )*Z( I ) /
-     $                           ( SLAMC3( POLES( I, 2 ), DSIGJ )-
-     $                           DIFLJ ) / ( POLES( I, 2 )+DJ )
-                  END IF
-   30          CONTINUE
-               DO 40 I = J + 1, K
-                  IF( ( Z( I ).EQ.ZERO ) .OR.
-     $                ( POLES( I, 2 ).EQ.ZERO ) ) THEN
-                     WORK( I ) = ZERO
-                  ELSE
-                     WORK( I ) = POLES( I, 2 )*Z( I ) /
-     $                           ( SLAMC3( POLES( I, 2 ), DSIGJP )+
-     $                           DIFRJ ) / ( POLES( I, 2 )+DJ )
-                  END IF
-   40          CONTINUE
-               WORK( 1 ) = NEGONE
-               TEMP = SNRM2( K, WORK, 1 )
-               CALL SGEMV( 'T', K, NRHS, ONE, BX, LDBX, WORK, 1, ZERO,
-     $                     B( J, 1 ), LDB )
-               CALL SLASCL( 'G', 0, 0, TEMP, ONE, 1, NRHS, B( J, 1 ),
-     $                      LDB, INFO )
-   50       CONTINUE
-         END IF
-*
-*        Move the deflated rows of BX to B also.
-*
-         IF( K.LT.MAX( M, N ) )
-     $      CALL SLACPY( 'A', N-K, NRHS, BX( K+1, 1 ), LDBX,
-     $                   B( K+1, 1 ), LDB )
-      ELSE
-*
-*        Apply back the right orthogonal transformations.
-*
-*        Step (1R): apply back the new right singular vector matrix
-*        to B.
-*
-         IF( K.EQ.1 ) THEN
-            CALL SCOPY( NRHS, B, LDB, BX, LDBX )
-         ELSE
-            DO 80 J = 1, K
-               DSIGJ = POLES( J, 2 )
-               IF( Z( J ).EQ.ZERO ) THEN
-                  WORK( J ) = ZERO
-               ELSE
-                  WORK( J ) = -Z( J ) / DIFL( J ) /
-     $                        ( DSIGJ+POLES( J, 1 ) ) / DIFR( J, 2 )
-               END IF
-               DO 60 I = 1, J - 1
-                  IF( Z( J ).EQ.ZERO ) THEN
-                     WORK( I ) = ZERO
-                  ELSE
-                     WORK( I ) = Z( J ) / ( SLAMC3( DSIGJ, -POLES( I+1,
-     $                           2 ) )-DIFR( I, 1 ) ) /
-     $                           ( DSIGJ+POLES( I, 1 ) ) / DIFR( I, 2 )
-                  END IF
-   60          CONTINUE
-               DO 70 I = J + 1, K
-                  IF( Z( J ).EQ.ZERO ) THEN
-                     WORK( I ) = ZERO
-                  ELSE
-                     WORK( I ) = Z( J ) / ( SLAMC3( DSIGJ, -POLES( I,
-     $                           2 ) )-DIFL( I ) ) /
-     $                           ( DSIGJ+POLES( I, 1 ) ) / DIFR( I, 2 )
-                  END IF
-   70          CONTINUE
-               CALL SGEMV( 'T', K, NRHS, ONE, B, LDB, WORK, 1, ZERO,
-     $                     BX( J, 1 ), LDBX )
-   80       CONTINUE
-         END IF
-*
-*        Step (2R): if SQRE = 1, apply back the rotation that is
-*        related to the right null space of the subproblem.
-*
-         IF( SQRE.EQ.1 ) THEN
-            CALL SCOPY( NRHS, B( M, 1 ), LDB, BX( M, 1 ), LDBX )
-            CALL SROT( NRHS, BX( 1, 1 ), LDBX, BX( M, 1 ), LDBX, C, S )
-         END IF
-         IF( K.LT.MAX( M, N ) )
-     $      CALL SLACPY( 'A', N-K, NRHS, B( K+1, 1 ), LDB, BX( K+1, 1 ),
-     $                   LDBX )
-*
-*        Step (3R): permute rows of B.
-*
-         CALL SCOPY( NRHS, BX( 1, 1 ), LDBX, B( NLP1, 1 ), LDB )
-         IF( SQRE.EQ.1 ) THEN
-            CALL SCOPY( NRHS, BX( M, 1 ), LDBX, B( M, 1 ), LDB )
-         END IF
-         DO 90 I = 2, N
-            CALL SCOPY( NRHS, BX( I, 1 ), LDBX, B( PERM( I ), 1 ), LDB )
-   90    CONTINUE
-*
-*        Step (4R): apply back the Givens rotations performed.
-*
-         DO 100 I = GIVPTR, 1, -1
-            CALL SROT( NRHS, B( GIVCOL( I, 2 ), 1 ), LDB,
-     $                 B( GIVCOL( I, 1 ), 1 ), LDB, GIVNUM( I, 2 ),
-     $                 -GIVNUM( I, 1 ) )
-  100    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of SLALS0
-*
-      END
--- a/libcruft/lapack/slalsa.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,362 +0,0 @@
-      SUBROUTINE SLALSA( ICOMPQ, SMLSIZ, N, NRHS, B, LDB, BX, LDBX, U,
-     $                   LDU, VT, K, DIFL, DIFR, Z, POLES, GIVPTR,
-     $                   GIVCOL, LDGCOL, PERM, GIVNUM, C, S, WORK,
-     $                   IWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            ICOMPQ, INFO, LDB, LDBX, LDGCOL, LDU, N, NRHS,
-     $                   SMLSIZ
-*     ..
-*     .. Array Arguments ..
-      INTEGER            GIVCOL( LDGCOL, * ), GIVPTR( * ), IWORK( * ),
-     $                   K( * ), PERM( LDGCOL, * )
-      REAL               B( LDB, * ), BX( LDBX, * ), C( * ),
-     $                   DIFL( LDU, * ), DIFR( LDU, * ),
-     $                   GIVNUM( LDU, * ), POLES( LDU, * ), S( * ),
-     $                   U( LDU, * ), VT( LDU, * ), WORK( * ),
-     $                   Z( LDU, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLALSA is an itermediate step in solving the least squares problem
-*  by computing the SVD of the coefficient matrix in compact form (The
-*  singular vectors are computed as products of simple orthorgonal
-*  matrices.).
-*
-*  If ICOMPQ = 0, SLALSA applies the inverse of the left singular vector
-*  matrix of an upper bidiagonal matrix to the right hand side; and if
-*  ICOMPQ = 1, SLALSA applies the right singular vector matrix to the
-*  right hand side. The singular vector matrices were generated in
-*  compact form by SLALSA.
-*
-*  Arguments
-*  =========
-*
-*
-*  ICOMPQ (input) INTEGER
-*         Specifies whether the left or the right singular vector
-*         matrix is involved.
-*         = 0: Left singular vector matrix
-*         = 1: Right singular vector matrix
-*
-*  SMLSIZ (input) INTEGER
-*         The maximum size of the subproblems at the bottom of the
-*         computation tree.
-*
-*  N      (input) INTEGER
-*         The row and column dimensions of the upper bidiagonal matrix.
-*
-*  NRHS   (input) INTEGER
-*         The number of columns of B and BX. NRHS must be at least 1.
-*
-*  B      (input/output) REAL array, dimension ( LDB, NRHS )
-*         On input, B contains the right hand sides of the least
-*         squares problem in rows 1 through M.
-*         On output, B contains the solution X in rows 1 through N.
-*
-*  LDB    (input) INTEGER
-*         The leading dimension of B in the calling subprogram.
-*         LDB must be at least max(1,MAX( M, N ) ).
-*
-*  BX     (output) REAL array, dimension ( LDBX, NRHS )
-*         On exit, the result of applying the left or right singular
-*         vector matrix to B.
-*
-*  LDBX   (input) INTEGER
-*         The leading dimension of BX.
-*
-*  U      (input) REAL array, dimension ( LDU, SMLSIZ ).
-*         On entry, U contains the left singular vector matrices of all
-*         subproblems at the bottom level.
-*
-*  LDU    (input) INTEGER, LDU = > N.
-*         The leading dimension of arrays U, VT, DIFL, DIFR,
-*         POLES, GIVNUM, and Z.
-*
-*  VT     (input) REAL array, dimension ( LDU, SMLSIZ+1 ).
-*         On entry, VT' contains the right singular vector matrices of
-*         all subproblems at the bottom level.
-*
-*  K      (input) INTEGER array, dimension ( N ).
-*
-*  DIFL   (input) REAL array, dimension ( LDU, NLVL ).
-*         where NLVL = INT(log_2 (N/(SMLSIZ+1))) + 1.
-*
-*  DIFR   (input) REAL array, dimension ( LDU, 2 * NLVL ).
-*         On entry, DIFL(*, I) and DIFR(*, 2 * I -1) record
-*         distances between singular values on the I-th level and
-*         singular values on the (I -1)-th level, and DIFR(*, 2 * I)
-*         record the normalizing factors of the right singular vectors
-*         matrices of subproblems on I-th level.
-*
-*  Z      (input) REAL array, dimension ( LDU, NLVL ).
-*         On entry, Z(1, I) contains the components of the deflation-
-*         adjusted updating row vector for subproblems on the I-th
-*         level.
-*
-*  POLES  (input) REAL array, dimension ( LDU, 2 * NLVL ).
-*         On entry, POLES(*, 2 * I -1: 2 * I) contains the new and old
-*         singular values involved in the secular equations on the I-th
-*         level.
-*
-*  GIVPTR (input) INTEGER array, dimension ( N ).
-*         On entry, GIVPTR( I ) records the number of Givens
-*         rotations performed on the I-th problem on the computation
-*         tree.
-*
-*  GIVCOL (input) INTEGER array, dimension ( LDGCOL, 2 * NLVL ).
-*         On entry, for each I, GIVCOL(*, 2 * I - 1: 2 * I) records the
-*         locations of Givens rotations performed on the I-th level on
-*         the computation tree.
-*
-*  LDGCOL (input) INTEGER, LDGCOL = > N.
-*         The leading dimension of arrays GIVCOL and PERM.
-*
-*  PERM   (input) INTEGER array, dimension ( LDGCOL, NLVL ).
-*         On entry, PERM(*, I) records permutations done on the I-th
-*         level of the computation tree.
-*
-*  GIVNUM (input) REAL array, dimension ( LDU, 2 * NLVL ).
-*         On entry, GIVNUM(*, 2 *I -1 : 2 * I) records the C- and S-
-*         values of Givens rotations performed on the I-th level on the
-*         computation tree.
-*
-*  C      (input) REAL array, dimension ( N ).
-*         On entry, if the I-th subproblem is not square,
-*         C( I ) contains the C-value of a Givens rotation related to
-*         the right null space of the I-th subproblem.
-*
-*  S      (input) REAL array, dimension ( N ).
-*         On entry, if the I-th subproblem is not square,
-*         S( I ) contains the S-value of a Givens rotation related to
-*         the right null space of the I-th subproblem.
-*
-*  WORK   (workspace) REAL array.
-*         The dimension must be at least N.
-*
-*  IWORK  (workspace) INTEGER array.
-*         The dimension must be at least 3 * N
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Ren-Cang Li, Computer Science Division, University of
-*       California at Berkeley, USA
-*     Osni Marques, LBNL/NERSC, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I1, IC, IM1, INODE, J, LF, LL, LVL, LVL2,
-     $                   ND, NDB1, NDIML, NDIMR, NL, NLF, NLP1, NLVL,
-     $                   NR, NRF, NRP1, SQRE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SGEMM, SLALS0, SLASDT, XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN
-         INFO = -1
-      ELSE IF( SMLSIZ.LT.3 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.SMLSIZ ) THEN
-         INFO = -3
-      ELSE IF( NRHS.LT.1 ) THEN
-         INFO = -4
-      ELSE IF( LDB.LT.N ) THEN
-         INFO = -6
-      ELSE IF( LDBX.LT.N ) THEN
-         INFO = -8
-      ELSE IF( LDU.LT.N ) THEN
-         INFO = -10
-      ELSE IF( LDGCOL.LT.N ) THEN
-         INFO = -19
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLALSA', -INFO )
-         RETURN
-      END IF
-*
-*     Book-keeping and  setting up the computation tree.
-*
-      INODE = 1
-      NDIML = INODE + N
-      NDIMR = NDIML + N
-*
-      CALL SLASDT( N, NLVL, ND, IWORK( INODE ), IWORK( NDIML ),
-     $             IWORK( NDIMR ), SMLSIZ )
-*
-*     The following code applies back the left singular vector factors.
-*     For applying back the right singular vector factors, go to 50.
-*
-      IF( ICOMPQ.EQ.1 ) THEN
-         GO TO 50
-      END IF
-*
-*     The nodes on the bottom level of the tree were solved
-*     by SLASDQ. The corresponding left and right singular vector
-*     matrices are in explicit form. First apply back the left
-*     singular vector matrices.
-*
-      NDB1 = ( ND+1 ) / 2
-      DO 10 I = NDB1, ND
-*
-*        IC : center row of each node
-*        NL : number of rows of left  subproblem
-*        NR : number of rows of right subproblem
-*        NLF: starting row of the left   subproblem
-*        NRF: starting row of the right  subproblem
-*
-         I1 = I - 1
-         IC = IWORK( INODE+I1 )
-         NL = IWORK( NDIML+I1 )
-         NR = IWORK( NDIMR+I1 )
-         NLF = IC - NL
-         NRF = IC + 1
-         CALL SGEMM( 'T', 'N', NL, NRHS, NL, ONE, U( NLF, 1 ), LDU,
-     $               B( NLF, 1 ), LDB, ZERO, BX( NLF, 1 ), LDBX )
-         CALL SGEMM( 'T', 'N', NR, NRHS, NR, ONE, U( NRF, 1 ), LDU,
-     $               B( NRF, 1 ), LDB, ZERO, BX( NRF, 1 ), LDBX )
-   10 CONTINUE
-*
-*     Next copy the rows of B that correspond to unchanged rows
-*     in the bidiagonal matrix to BX.
-*
-      DO 20 I = 1, ND
-         IC = IWORK( INODE+I-1 )
-         CALL SCOPY( NRHS, B( IC, 1 ), LDB, BX( IC, 1 ), LDBX )
-   20 CONTINUE
-*
-*     Finally go through the left singular vector matrices of all
-*     the other subproblems bottom-up on the tree.
-*
-      J = 2**NLVL
-      SQRE = 0
-*
-      DO 40 LVL = NLVL, 1, -1
-         LVL2 = 2*LVL - 1
-*
-*        find the first node LF and last node LL on
-*        the current level LVL
-*
-         IF( LVL.EQ.1 ) THEN
-            LF = 1
-            LL = 1
-         ELSE
-            LF = 2**( LVL-1 )
-            LL = 2*LF - 1
-         END IF
-         DO 30 I = LF, LL
-            IM1 = I - 1
-            IC = IWORK( INODE+IM1 )
-            NL = IWORK( NDIML+IM1 )
-            NR = IWORK( NDIMR+IM1 )
-            NLF = IC - NL
-            NRF = IC + 1
-            J = J - 1
-            CALL SLALS0( ICOMPQ, NL, NR, SQRE, NRHS, BX( NLF, 1 ), LDBX,
-     $                   B( NLF, 1 ), LDB, PERM( NLF, LVL ),
-     $                   GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL,
-     $                   GIVNUM( NLF, LVL2 ), LDU, POLES( NLF, LVL2 ),
-     $                   DIFL( NLF, LVL ), DIFR( NLF, LVL2 ),
-     $                   Z( NLF, LVL ), K( J ), C( J ), S( J ), WORK,
-     $                   INFO )
-   30    CONTINUE
-   40 CONTINUE
-      GO TO 90
-*
-*     ICOMPQ = 1: applying back the right singular vector factors.
-*
-   50 CONTINUE
-*
-*     First now go through the right singular vector matrices of all
-*     the tree nodes top-down.
-*
-      J = 0
-      DO 70 LVL = 1, NLVL
-         LVL2 = 2*LVL - 1
-*
-*        Find the first node LF and last node LL on
-*        the current level LVL.
-*
-         IF( LVL.EQ.1 ) THEN
-            LF = 1
-            LL = 1
-         ELSE
-            LF = 2**( LVL-1 )
-            LL = 2*LF - 1
-         END IF
-         DO 60 I = LL, LF, -1
-            IM1 = I - 1
-            IC = IWORK( INODE+IM1 )
-            NL = IWORK( NDIML+IM1 )
-            NR = IWORK( NDIMR+IM1 )
-            NLF = IC - NL
-            NRF = IC + 1
-            IF( I.EQ.LL ) THEN
-               SQRE = 0
-            ELSE
-               SQRE = 1
-            END IF
-            J = J + 1
-            CALL SLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B( NLF, 1 ), LDB,
-     $                   BX( NLF, 1 ), LDBX, PERM( NLF, LVL ),
-     $                   GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL,
-     $                   GIVNUM( NLF, LVL2 ), LDU, POLES( NLF, LVL2 ),
-     $                   DIFL( NLF, LVL ), DIFR( NLF, LVL2 ),
-     $                   Z( NLF, LVL ), K( J ), C( J ), S( J ), WORK,
-     $                   INFO )
-   60    CONTINUE
-   70 CONTINUE
-*
-*     The nodes on the bottom level of the tree were solved
-*     by SLASDQ. The corresponding right singular vector
-*     matrices are in explicit form. Apply them back.
-*
-      NDB1 = ( ND+1 ) / 2
-      DO 80 I = NDB1, ND
-         I1 = I - 1
-         IC = IWORK( INODE+I1 )
-         NL = IWORK( NDIML+I1 )
-         NR = IWORK( NDIMR+I1 )
-         NLP1 = NL + 1
-         IF( I.EQ.ND ) THEN
-            NRP1 = NR
-         ELSE
-            NRP1 = NR + 1
-         END IF
-         NLF = IC - NL
-         NRF = IC + 1
-         CALL SGEMM( 'T', 'N', NLP1, NRHS, NLP1, ONE, VT( NLF, 1 ), LDU,
-     $               B( NLF, 1 ), LDB, ZERO, BX( NLF, 1 ), LDBX )
-         CALL SGEMM( 'T', 'N', NRP1, NRHS, NRP1, ONE, VT( NRF, 1 ), LDU,
-     $               B( NRF, 1 ), LDB, ZERO, BX( NRF, 1 ), LDBX )
-   80 CONTINUE
-*
-   90 CONTINUE
-*
-      RETURN
-*
-*     End of SLALSA
-*
-      END
--- a/libcruft/lapack/slalsd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,434 +0,0 @@
-      SUBROUTINE SLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND,
-     $                   RANK, WORK, IWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDB, N, NRHS, RANK, SMLSIZ
-      REAL               RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      REAL               B( LDB, * ), D( * ), E( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLALSD uses the singular value decomposition of A to solve the least
-*  squares problem of finding X to minimize the Euclidean norm of each
-*  column of A*X-B, where A is N-by-N upper bidiagonal, and X and B
-*  are N-by-NRHS. The solution X overwrites B.
-*
-*  The singular values of A smaller than RCOND times the largest
-*  singular value are treated as zero in solving the least squares
-*  problem; in this case a minimum norm solution is returned.
-*  The actual singular values are returned in D in ascending order.
-*
-*  This code makes very mild assumptions about floating point
-*  arithmetic. It will work on machines with a guard digit in
-*  add/subtract, or on those binary machines without guard digits
-*  which subtract like the Cray XMP, Cray YMP, Cray C 90, or Cray 2.
-*  It could conceivably fail on hexadecimal or decimal machines
-*  without guard digits, but we know of none.
-*
-*  Arguments
-*  =========
-*
-*  UPLO   (input) CHARACTER*1
-*         = 'U': D and E define an upper bidiagonal matrix.
-*         = 'L': D and E define a  lower bidiagonal matrix.
-*
-*  SMLSIZ (input) INTEGER
-*         The maximum size of the subproblems at the bottom of the
-*         computation tree.
-*
-*  N      (input) INTEGER
-*         The dimension of the  bidiagonal matrix.  N >= 0.
-*
-*  NRHS   (input) INTEGER
-*         The number of columns of B. NRHS must be at least 1.
-*
-*  D      (input/output) REAL array, dimension (N)
-*         On entry D contains the main diagonal of the bidiagonal
-*         matrix. On exit, if INFO = 0, D contains its singular values.
-*
-*  E      (input/output) REAL array, dimension (N-1)
-*         Contains the super-diagonal entries of the bidiagonal matrix.
-*         On exit, E has been destroyed.
-*
-*  B      (input/output) REAL array, dimension (LDB,NRHS)
-*         On input, B contains the right hand sides of the least
-*         squares problem. On output, B contains the solution X.
-*
-*  LDB    (input) INTEGER
-*         The leading dimension of B in the calling subprogram.
-*         LDB must be at least max(1,N).
-*
-*  RCOND  (input) REAL
-*         The singular values of A less than or equal to RCOND times
-*         the largest singular value are treated as zero in solving
-*         the least squares problem. If RCOND is negative,
-*         machine precision is used instead.
-*         For example, if diag(S)*X=B were the least squares problem,
-*         where diag(S) is a diagonal matrix of singular values, the
-*         solution would be X(i) = B(i) / S(i) if S(i) is greater than
-*         RCOND*max(S), and X(i) = 0 if S(i) is less than or equal to
-*         RCOND*max(S).
-*
-*  RANK   (output) INTEGER
-*         The number of singular values of A greater than RCOND times
-*         the largest singular value.
-*
-*  WORK   (workspace) REAL array, dimension at least
-*         (9*N + 2*N*SMLSIZ + 8*N*NLVL + N*NRHS + (SMLSIZ+1)**2),
-*         where NLVL = max(0, INT(log_2 (N/(SMLSIZ+1))) + 1).
-*
-*  IWORK  (workspace) INTEGER array, dimension at least
-*         (3*N*NLVL + 11*N)
-*
-*  INFO   (output) INTEGER
-*         = 0:  successful exit.
-*         < 0:  if INFO = -i, the i-th argument had an illegal value.
-*         > 0:  The algorithm failed to compute an singular value while
-*               working on the submatrix lying in rows and columns
-*               INFO/(N+1) through MOD(INFO,N+1).
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Ren-Cang Li, Computer Science Division, University of
-*       California at Berkeley, USA
-*     Osni Marques, LBNL/NERSC, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            BX, BXST, C, DIFL, DIFR, GIVCOL, GIVNUM,
-     $                   GIVPTR, I, ICMPQ1, ICMPQ2, IWK, J, K, NLVL,
-     $                   NM1, NSIZE, NSUB, NWORK, PERM, POLES, S, SIZEI,
-     $                   SMLSZP, SQRE, ST, ST1, U, VT, Z
-      REAL               CS, EPS, ORGNRM, R, RCND, SN, TOL
-*     ..
-*     .. External Functions ..
-      INTEGER            ISAMAX
-      REAL               SLAMCH, SLANST
-      EXTERNAL           ISAMAX, SLAMCH, SLANST
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SGEMM, SLACPY, SLALSA, SLARTG, SLASCL,
-     $                   SLASDA, SLASDQ, SLASET, SLASRT, SROT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, INT, LOG, REAL, SIGN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( NRHS.LT.1 ) THEN
-         INFO = -4
-      ELSE IF( ( LDB.LT.1 ) .OR. ( LDB.LT.N ) ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLALSD', -INFO )
-         RETURN
-      END IF
-*
-      EPS = SLAMCH( 'Epsilon' )
-*
-*     Set up the tolerance.
-*
-      IF( ( RCOND.LE.ZERO ) .OR. ( RCOND.GE.ONE ) ) THEN
-         RCND = EPS
-      ELSE
-         RCND = RCOND
-      END IF
-*
-      RANK = 0
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 ) THEN
-         RETURN
-      ELSE IF( N.EQ.1 ) THEN
-         IF( D( 1 ).EQ.ZERO ) THEN
-            CALL SLASET( 'A', 1, NRHS, ZERO, ZERO, B, LDB )
-         ELSE
-            RANK = 1
-            CALL SLASCL( 'G', 0, 0, D( 1 ), ONE, 1, NRHS, B, LDB, INFO )
-            D( 1 ) = ABS( D( 1 ) )
-         END IF
-         RETURN
-      END IF
-*
-*     Rotate the matrix if it is lower bidiagonal.
-*
-      IF( UPLO.EQ.'L' ) THEN
-         DO 10 I = 1, N - 1
-            CALL SLARTG( D( I ), E( I ), CS, SN, R )
-            D( I ) = R
-            E( I ) = SN*D( I+1 )
-            D( I+1 ) = CS*D( I+1 )
-            IF( NRHS.EQ.1 ) THEN
-               CALL SROT( 1, B( I, 1 ), 1, B( I+1, 1 ), 1, CS, SN )
-            ELSE
-               WORK( I*2-1 ) = CS
-               WORK( I*2 ) = SN
-            END IF
-   10    CONTINUE
-         IF( NRHS.GT.1 ) THEN
-            DO 30 I = 1, NRHS
-               DO 20 J = 1, N - 1
-                  CS = WORK( J*2-1 )
-                  SN = WORK( J*2 )
-                  CALL SROT( 1, B( J, I ), 1, B( J+1, I ), 1, CS, SN )
-   20          CONTINUE
-   30       CONTINUE
-         END IF
-      END IF
-*
-*     Scale.
-*
-      NM1 = N - 1
-      ORGNRM = SLANST( 'M', N, D, E )
-      IF( ORGNRM.EQ.ZERO ) THEN
-         CALL SLASET( 'A', N, NRHS, ZERO, ZERO, B, LDB )
-         RETURN
-      END IF
-*
-      CALL SLASCL( 'G', 0, 0, ORGNRM, ONE, N, 1, D, N, INFO )
-      CALL SLASCL( 'G', 0, 0, ORGNRM, ONE, NM1, 1, E, NM1, INFO )
-*
-*     If N is smaller than the minimum divide size SMLSIZ, then solve
-*     the problem with another solver.
-*
-      IF( N.LE.SMLSIZ ) THEN
-         NWORK = 1 + N*N
-         CALL SLASET( 'A', N, N, ZERO, ONE, WORK, N )
-         CALL SLASDQ( 'U', 0, N, N, 0, NRHS, D, E, WORK, N, WORK, N, B,
-     $                LDB, WORK( NWORK ), INFO )
-         IF( INFO.NE.0 ) THEN
-            RETURN
-         END IF
-         TOL = RCND*ABS( D( ISAMAX( N, D, 1 ) ) )
-         DO 40 I = 1, N
-            IF( D( I ).LE.TOL ) THEN
-               CALL SLASET( 'A', 1, NRHS, ZERO, ZERO, B( I, 1 ), LDB )
-            ELSE
-               CALL SLASCL( 'G', 0, 0, D( I ), ONE, 1, NRHS, B( I, 1 ),
-     $                      LDB, INFO )
-               RANK = RANK + 1
-            END IF
-   40    CONTINUE
-         CALL SGEMM( 'T', 'N', N, NRHS, N, ONE, WORK, N, B, LDB, ZERO,
-     $               WORK( NWORK ), N )
-         CALL SLACPY( 'A', N, NRHS, WORK( NWORK ), N, B, LDB )
-*
-*        Unscale.
-*
-         CALL SLASCL( 'G', 0, 0, ONE, ORGNRM, N, 1, D, N, INFO )
-         CALL SLASRT( 'D', N, D, INFO )
-         CALL SLASCL( 'G', 0, 0, ORGNRM, ONE, N, NRHS, B, LDB, INFO )
-*
-         RETURN
-      END IF
-*
-*     Book-keeping and setting up some constants.
-*
-      NLVL = INT( LOG( REAL( N ) / REAL( SMLSIZ+1 ) ) / LOG( TWO ) ) + 1
-*
-      SMLSZP = SMLSIZ + 1
-*
-      U = 1
-      VT = 1 + SMLSIZ*N
-      DIFL = VT + SMLSZP*N
-      DIFR = DIFL + NLVL*N
-      Z = DIFR + NLVL*N*2
-      C = Z + NLVL*N
-      S = C + N
-      POLES = S + N
-      GIVNUM = POLES + 2*NLVL*N
-      BX = GIVNUM + 2*NLVL*N
-      NWORK = BX + N*NRHS
-*
-      SIZEI = 1 + N
-      K = SIZEI + N
-      GIVPTR = K + N
-      PERM = GIVPTR + N
-      GIVCOL = PERM + NLVL*N
-      IWK = GIVCOL + NLVL*N*2
-*
-      ST = 1
-      SQRE = 0
-      ICMPQ1 = 1
-      ICMPQ2 = 0
-      NSUB = 0
-*
-      DO 50 I = 1, N
-         IF( ABS( D( I ) ).LT.EPS ) THEN
-            D( I ) = SIGN( EPS, D( I ) )
-         END IF
-   50 CONTINUE
-*
-      DO 60 I = 1, NM1
-         IF( ( ABS( E( I ) ).LT.EPS ) .OR. ( I.EQ.NM1 ) ) THEN
-            NSUB = NSUB + 1
-            IWORK( NSUB ) = ST
-*
-*           Subproblem found. First determine its size and then
-*           apply divide and conquer on it.
-*
-            IF( I.LT.NM1 ) THEN
-*
-*              A subproblem with E(I) small for I < NM1.
-*
-               NSIZE = I - ST + 1
-               IWORK( SIZEI+NSUB-1 ) = NSIZE
-            ELSE IF( ABS( E( I ) ).GE.EPS ) THEN
-*
-*              A subproblem with E(NM1) not too small but I = NM1.
-*
-               NSIZE = N - ST + 1
-               IWORK( SIZEI+NSUB-1 ) = NSIZE
-            ELSE
-*
-*              A subproblem with E(NM1) small. This implies an
-*              1-by-1 subproblem at D(N), which is not solved
-*              explicitly.
-*
-               NSIZE = I - ST + 1
-               IWORK( SIZEI+NSUB-1 ) = NSIZE
-               NSUB = NSUB + 1
-               IWORK( NSUB ) = N
-               IWORK( SIZEI+NSUB-1 ) = 1
-               CALL SCOPY( NRHS, B( N, 1 ), LDB, WORK( BX+NM1 ), N )
-            END IF
-            ST1 = ST - 1
-            IF( NSIZE.EQ.1 ) THEN
-*
-*              This is a 1-by-1 subproblem and is not solved
-*              explicitly.
-*
-               CALL SCOPY( NRHS, B( ST, 1 ), LDB, WORK( BX+ST1 ), N )
-            ELSE IF( NSIZE.LE.SMLSIZ ) THEN
-*
-*              This is a small subproblem and is solved by SLASDQ.
-*
-               CALL SLASET( 'A', NSIZE, NSIZE, ZERO, ONE,
-     $                      WORK( VT+ST1 ), N )
-               CALL SLASDQ( 'U', 0, NSIZE, NSIZE, 0, NRHS, D( ST ),
-     $                      E( ST ), WORK( VT+ST1 ), N, WORK( NWORK ),
-     $                      N, B( ST, 1 ), LDB, WORK( NWORK ), INFO )
-               IF( INFO.NE.0 ) THEN
-                  RETURN
-               END IF
-               CALL SLACPY( 'A', NSIZE, NRHS, B( ST, 1 ), LDB,
-     $                      WORK( BX+ST1 ), N )
-            ELSE
-*
-*              A large problem. Solve it using divide and conquer.
-*
-               CALL SLASDA( ICMPQ1, SMLSIZ, NSIZE, SQRE, D( ST ),
-     $                      E( ST ), WORK( U+ST1 ), N, WORK( VT+ST1 ),
-     $                      IWORK( K+ST1 ), WORK( DIFL+ST1 ),
-     $                      WORK( DIFR+ST1 ), WORK( Z+ST1 ),
-     $                      WORK( POLES+ST1 ), IWORK( GIVPTR+ST1 ),
-     $                      IWORK( GIVCOL+ST1 ), N, IWORK( PERM+ST1 ),
-     $                      WORK( GIVNUM+ST1 ), WORK( C+ST1 ),
-     $                      WORK( S+ST1 ), WORK( NWORK ), IWORK( IWK ),
-     $                      INFO )
-               IF( INFO.NE.0 ) THEN
-                  RETURN
-               END IF
-               BXST = BX + ST1
-               CALL SLALSA( ICMPQ2, SMLSIZ, NSIZE, NRHS, B( ST, 1 ),
-     $                      LDB, WORK( BXST ), N, WORK( U+ST1 ), N,
-     $                      WORK( VT+ST1 ), IWORK( K+ST1 ),
-     $                      WORK( DIFL+ST1 ), WORK( DIFR+ST1 ),
-     $                      WORK( Z+ST1 ), WORK( POLES+ST1 ),
-     $                      IWORK( GIVPTR+ST1 ), IWORK( GIVCOL+ST1 ), N,
-     $                      IWORK( PERM+ST1 ), WORK( GIVNUM+ST1 ),
-     $                      WORK( C+ST1 ), WORK( S+ST1 ), WORK( NWORK ),
-     $                      IWORK( IWK ), INFO )
-               IF( INFO.NE.0 ) THEN
-                  RETURN
-               END IF
-            END IF
-            ST = I + 1
-         END IF
-   60 CONTINUE
-*
-*     Apply the singular values and treat the tiny ones as zero.
-*
-      TOL = RCND*ABS( D( ISAMAX( N, D, 1 ) ) )
-*
-      DO 70 I = 1, N
-*
-*        Some of the elements in D can be negative because 1-by-1
-*        subproblems were not solved explicitly.
-*
-         IF( ABS( D( I ) ).LE.TOL ) THEN
-            CALL SLASET( 'A', 1, NRHS, ZERO, ZERO, WORK( BX+I-1 ), N )
-         ELSE
-            RANK = RANK + 1
-            CALL SLASCL( 'G', 0, 0, D( I ), ONE, 1, NRHS,
-     $                   WORK( BX+I-1 ), N, INFO )
-         END IF
-         D( I ) = ABS( D( I ) )
-   70 CONTINUE
-*
-*     Now apply back the right singular vectors.
-*
-      ICMPQ2 = 1
-      DO 80 I = 1, NSUB
-         ST = IWORK( I )
-         ST1 = ST - 1
-         NSIZE = IWORK( SIZEI+I-1 )
-         BXST = BX + ST1
-         IF( NSIZE.EQ.1 ) THEN
-            CALL SCOPY( NRHS, WORK( BXST ), N, B( ST, 1 ), LDB )
-         ELSE IF( NSIZE.LE.SMLSIZ ) THEN
-            CALL SGEMM( 'T', 'N', NSIZE, NRHS, NSIZE, ONE,
-     $                  WORK( VT+ST1 ), N, WORK( BXST ), N, ZERO,
-     $                  B( ST, 1 ), LDB )
-         ELSE
-            CALL SLALSA( ICMPQ2, SMLSIZ, NSIZE, NRHS, WORK( BXST ), N,
-     $                   B( ST, 1 ), LDB, WORK( U+ST1 ), N,
-     $                   WORK( VT+ST1 ), IWORK( K+ST1 ),
-     $                   WORK( DIFL+ST1 ), WORK( DIFR+ST1 ),
-     $                   WORK( Z+ST1 ), WORK( POLES+ST1 ),
-     $                   IWORK( GIVPTR+ST1 ), IWORK( GIVCOL+ST1 ), N,
-     $                   IWORK( PERM+ST1 ), WORK( GIVNUM+ST1 ),
-     $                   WORK( C+ST1 ), WORK( S+ST1 ), WORK( NWORK ),
-     $                   IWORK( IWK ), INFO )
-            IF( INFO.NE.0 ) THEN
-               RETURN
-            END IF
-         END IF
-   80 CONTINUE
-*
-*     Unscale and sort the singular values.
-*
-      CALL SLASCL( 'G', 0, 0, ONE, ORGNRM, N, 1, D, N, INFO )
-      CALL SLASRT( 'D', N, D, INFO )
-      CALL SLASCL( 'G', 0, 0, ORGNRM, ONE, N, NRHS, B, LDB, INFO )
-*
-      RETURN
-*
-*     End of SLALSD
-*
-      END
--- a/libcruft/lapack/slamc1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,183 +0,0 @@
-      SUBROUTINE SLAMC1( BETA, T, RND, IEEE1 )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            IEEE1, RND
-      INTEGER            BETA, T
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAMC1 determines the machine parameters given by BETA, T, RND, and
-*  IEEE1.
-*
-*  Arguments
-*  =========
-*
-*  BETA    (output) INTEGER
-*          The base of the machine.
-*
-*  T       (output) INTEGER
-*          The number of ( BETA ) digits in the mantissa.
-*
-*  RND     (output) LOGICAL
-*          Specifies whether proper rounding  ( RND = .TRUE. )  or
-*          chopping  ( RND = .FALSE. )  occurs in addition. This may not
-*          be a reliable guide to the way in which the machine performs
-*          its arithmetic.
-*
-*  IEEE1   (output) LOGICAL
-*          Specifies whether rounding appears to be done in the IEEE
-*          'round to nearest' style.
-*
-*  Further Details
-*  ===============
-*
-*  The routine is based on the routine  ENVRON  by Malcolm and
-*  incorporates suggestions by Gentleman and Marovich. See
-*
-*     Malcolm M. A. (1972) Algorithms to reveal properties of
-*        floating-point arithmetic. Comms. of the ACM, 15, 949-951.
-*
-*     Gentleman W. M. and Marovich S. B. (1974) More on algorithms
-*        that reveal properties of floating point arithmetic units.
-*        Comms. of the ACM, 17, 276-277.
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            FIRST, LIEEE1, LRND
-      INTEGER            LBETA, LT
-      REAL               A, B, C, F, ONE, QTR, SAVEC, T1, T2
-*     ..
-*     .. External Functions ..
-      REAL               SLAMC3
-      EXTERNAL           SLAMC3
-*     ..
-*     .. Save statement ..
-      SAVE               FIRST, LIEEE1, LBETA, LRND, LT
-*     ..
-*     .. Data statements ..
-      DATA               FIRST / .TRUE. /
-*     ..
-*     .. Executable Statements ..
-*
-      IF( FIRST ) THEN
-         ONE = 1
-*
-*        LBETA,  LIEEE1,  LT and  LRND  are the  local values  of  BETA,
-*        IEEE1, T and RND.
-*
-*        Throughout this routine  we use the function  SLAMC3  to ensure
-*        that relevant values are  stored and not held in registers,  or
-*        are not affected by optimizers.
-*
-*        Compute  a = 2.0**m  with the  smallest positive integer m such
-*        that
-*
-*           fl( a + 1.0 ) = a.
-*
-         A = 1
-         C = 1
-*
-*+       WHILE( C.EQ.ONE )LOOP
-   10    CONTINUE
-         IF( C.EQ.ONE ) THEN
-            A = 2*A
-            C = SLAMC3( A, ONE )
-            C = SLAMC3( C, -A )
-            GO TO 10
-         END IF
-*+       END WHILE
-*
-*        Now compute  b = 2.0**m  with the smallest positive integer m
-*        such that
-*
-*           fl( a + b ) .gt. a.
-*
-         B = 1
-         C = SLAMC3( A, B )
-*
-*+       WHILE( C.EQ.A )LOOP
-   20    CONTINUE
-         IF( C.EQ.A ) THEN
-            B = 2*B
-            C = SLAMC3( A, B )
-            GO TO 20
-         END IF
-*+       END WHILE
-*
-*        Now compute the base.  a and c  are neighbouring floating point
-*        numbers  in the  interval  ( beta**t, beta**( t + 1 ) )  and so
-*        their difference is beta. Adding 0.25 to c is to ensure that it
-*        is truncated to beta and not ( beta - 1 ).
-*
-         QTR = ONE / 4
-         SAVEC = C
-         C = SLAMC3( C, -A )
-         LBETA = C + QTR
-*
-*        Now determine whether rounding or chopping occurs,  by adding a
-*        bit  less  than  beta/2  and a  bit  more  than  beta/2  to  a.
-*
-         B = LBETA
-         F = SLAMC3( B / 2, -B / 100 )
-         C = SLAMC3( F, A )
-         IF( C.EQ.A ) THEN
-            LRND = .TRUE.
-         ELSE
-            LRND = .FALSE.
-         END IF
-         F = SLAMC3( B / 2, B / 100 )
-         C = SLAMC3( F, A )
-         IF( ( LRND ) .AND. ( C.EQ.A ) )
-     $      LRND = .FALSE.
-*
-*        Try and decide whether rounding is done in the  IEEE  'round to
-*        nearest' style. B/2 is half a unit in the last place of the two
-*        numbers A and SAVEC. Furthermore, A is even, i.e. has last  bit
-*        zero, and SAVEC is odd. Thus adding B/2 to A should not  change
-*        A, but adding B/2 to SAVEC should change SAVEC.
-*
-         T1 = SLAMC3( B / 2, A )
-         T2 = SLAMC3( B / 2, SAVEC )
-         LIEEE1 = ( T1.EQ.A ) .AND. ( T2.GT.SAVEC ) .AND. LRND
-*
-*        Now find  the  mantissa, t.  It should  be the  integer part of
-*        log to the base beta of a,  however it is safer to determine  t
-*        by powering.  So we find t as the smallest positive integer for
-*        which
-*
-*           fl( beta**t + 1.0 ) = 1.0.
-*
-         LT = 0
-         A = 1
-         C = 1
-*
-*+       WHILE( C.EQ.ONE )LOOP
-   30    CONTINUE
-         IF( C.EQ.ONE ) THEN
-            LT = LT + 1
-            A = A*LBETA
-            C = SLAMC3( A, ONE )
-            C = SLAMC3( C, -A )
-            GO TO 30
-         END IF
-*+       END WHILE
-*
-      END IF
-*
-      BETA = LBETA
-      T = LT
-      RND = LRND
-      IEEE1 = LIEEE1
-      FIRST = .FALSE.
-      RETURN
-*
-*     End of SLAMC1
-*
-      END
--- a/libcruft/lapack/slamc2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,255 +0,0 @@
-      SUBROUTINE SLAMC2( BETA, T, RND, EPS, EMIN, RMIN, EMAX, RMAX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            RND
-      INTEGER            BETA, EMAX, EMIN, T
-      REAL               EPS, RMAX, RMIN
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAMC2 determines the machine parameters specified in its argument
-*  list.
-*
-*  Arguments
-*  =========
-*
-*  BETA    (output) INTEGER
-*          The base of the machine.
-*
-*  T       (output) INTEGER
-*          The number of ( BETA ) digits in the mantissa.
-*
-*  RND     (output) LOGICAL
-*          Specifies whether proper rounding  ( RND = .TRUE. )  or
-*          chopping  ( RND = .FALSE. )  occurs in addition. This may not
-*          be a reliable guide to the way in which the machine performs
-*          its arithmetic.
-*
-*  EPS     (output) REAL
-*          The smallest positive number such that
-*
-*             fl( 1.0 - EPS ) .LT. 1.0,
-*
-*          where fl denotes the computed value.
-*
-*  EMIN    (output) INTEGER
-*          The minimum exponent before (gradual) underflow occurs.
-*
-*  RMIN    (output) REAL
-*          The smallest normalized number for the machine, given by
-*          BASE**( EMIN - 1 ), where  BASE  is the floating point value
-*          of BETA.
-*
-*  EMAX    (output) INTEGER
-*          The maximum exponent before overflow occurs.
-*
-*  RMAX    (output) REAL
-*          The largest positive number for the machine, given by
-*          BASE**EMAX * ( 1 - EPS ), where  BASE  is the floating point
-*          value of BETA.
-*
-*  Further Details
-*  ===============
-*
-*  The computation of  EPS  is based on a routine PARANOIA by
-*  W. Kahan of the University of California at Berkeley.
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            FIRST, IEEE, IWARN, LIEEE1, LRND
-      INTEGER            GNMIN, GPMIN, I, LBETA, LEMAX, LEMIN, LT,
-     $                   NGNMIN, NGPMIN
-      REAL               A, B, C, HALF, LEPS, LRMAX, LRMIN, ONE, RBASE,
-     $                   SIXTH, SMALL, THIRD, TWO, ZERO
-*     ..
-*     .. External Functions ..
-      REAL               SLAMC3
-      EXTERNAL           SLAMC3
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLAMC1, SLAMC4, SLAMC5
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN
-*     ..
-*     .. Save statement ..
-      SAVE               FIRST, IWARN, LBETA, LEMAX, LEMIN, LEPS, LRMAX,
-     $                   LRMIN, LT
-*     ..
-*     .. Data statements ..
-      DATA               FIRST / .TRUE. / , IWARN / .FALSE. /
-*     ..
-*     .. Executable Statements ..
-*
-      IF( FIRST ) THEN
-         ZERO = 0
-         ONE = 1
-         TWO = 2
-*
-*        LBETA, LT, LRND, LEPS, LEMIN and LRMIN  are the local values of
-*        BETA, T, RND, EPS, EMIN and RMIN.
-*
-*        Throughout this routine  we use the function  SLAMC3  to ensure
-*        that relevant values are stored  and not held in registers,  or
-*        are not affected by optimizers.
-*
-*        SLAMC1 returns the parameters  LBETA, LT, LRND and LIEEE1.
-*
-         CALL SLAMC1( LBETA, LT, LRND, LIEEE1 )
-*
-*        Start to find EPS.
-*
-         B = LBETA
-         A = B**( -LT )
-         LEPS = A
-*
-*        Try some tricks to see whether or not this is the correct  EPS.
-*
-         B = TWO / 3
-         HALF = ONE / 2
-         SIXTH = SLAMC3( B, -HALF )
-         THIRD = SLAMC3( SIXTH, SIXTH )
-         B = SLAMC3( THIRD, -HALF )
-         B = SLAMC3( B, SIXTH )
-         B = ABS( B )
-         IF( B.LT.LEPS )
-     $      B = LEPS
-*
-         LEPS = 1
-*
-*+       WHILE( ( LEPS.GT.B ).AND.( B.GT.ZERO ) )LOOP
-   10    CONTINUE
-         IF( ( LEPS.GT.B ) .AND. ( B.GT.ZERO ) ) THEN
-            LEPS = B
-            C = SLAMC3( HALF*LEPS, ( TWO**5 )*( LEPS**2 ) )
-            C = SLAMC3( HALF, -C )
-            B = SLAMC3( HALF, C )
-            C = SLAMC3( HALF, -B )
-            B = SLAMC3( HALF, C )
-            GO TO 10
-         END IF
-*+       END WHILE
-*
-         IF( A.LT.LEPS )
-     $      LEPS = A
-*
-*        Computation of EPS complete.
-*
-*        Now find  EMIN.  Let A = + or - 1, and + or - (1 + BASE**(-3)).
-*        Keep dividing  A by BETA until (gradual) underflow occurs. This
-*        is detected when we cannot recover the previous A.
-*
-         RBASE = ONE / LBETA
-         SMALL = ONE
-         DO 20 I = 1, 3
-            SMALL = SLAMC3( SMALL*RBASE, ZERO )
-   20    CONTINUE
-         A = SLAMC3( ONE, SMALL )
-         CALL SLAMC4( NGPMIN, ONE, LBETA )
-         CALL SLAMC4( NGNMIN, -ONE, LBETA )
-         CALL SLAMC4( GPMIN, A, LBETA )
-         CALL SLAMC4( GNMIN, -A, LBETA )
-         IEEE = .FALSE.
-*
-         IF( ( NGPMIN.EQ.NGNMIN ) .AND. ( GPMIN.EQ.GNMIN ) ) THEN
-            IF( NGPMIN.EQ.GPMIN ) THEN
-               LEMIN = NGPMIN
-*            ( Non twos-complement machines, no gradual underflow;
-*              e.g.,  VAX )
-            ELSE IF( ( GPMIN-NGPMIN ).EQ.3 ) THEN
-               LEMIN = NGPMIN - 1 + LT
-               IEEE = .TRUE.
-*            ( Non twos-complement machines, with gradual underflow;
-*              e.g., IEEE standard followers )
-            ELSE
-               LEMIN = MIN( NGPMIN, GPMIN )
-*            ( A guess; no known machine )
-               IWARN = .TRUE.
-            END IF
-*
-         ELSE IF( ( NGPMIN.EQ.GPMIN ) .AND. ( NGNMIN.EQ.GNMIN ) ) THEN
-            IF( ABS( NGPMIN-NGNMIN ).EQ.1 ) THEN
-               LEMIN = MAX( NGPMIN, NGNMIN )
-*            ( Twos-complement machines, no gradual underflow;
-*              e.g., CYBER 205 )
-            ELSE
-               LEMIN = MIN( NGPMIN, NGNMIN )
-*            ( A guess; no known machine )
-               IWARN = .TRUE.
-            END IF
-*
-         ELSE IF( ( ABS( NGPMIN-NGNMIN ).EQ.1 ) .AND.
-     $            ( GPMIN.EQ.GNMIN ) ) THEN
-            IF( ( GPMIN-MIN( NGPMIN, NGNMIN ) ).EQ.3 ) THEN
-               LEMIN = MAX( NGPMIN, NGNMIN ) - 1 + LT
-*            ( Twos-complement machines with gradual underflow;
-*              no known machine )
-            ELSE
-               LEMIN = MIN( NGPMIN, NGNMIN )
-*            ( A guess; no known machine )
-               IWARN = .TRUE.
-            END IF
-*
-         ELSE
-            LEMIN = MIN( NGPMIN, NGNMIN, GPMIN, GNMIN )
-*         ( A guess; no known machine )
-            IWARN = .TRUE.
-         END IF
-         FIRST = .FALSE.
-***
-* Comment out this if block if EMIN is ok
-         IF( IWARN ) THEN
-            FIRST = .TRUE.
-            WRITE( 6, FMT = 9999 )LEMIN
-         END IF
-***
-*
-*        Assume IEEE arithmetic if we found denormalised  numbers above,
-*        or if arithmetic seems to round in the  IEEE style,  determined
-*        in routine SLAMC1. A true IEEE machine should have both  things
-*        true; however, faulty machines may have one or the other.
-*
-         IEEE = IEEE .OR. LIEEE1
-*
-*        Compute  RMIN by successive division by  BETA. We could compute
-*        RMIN as BASE**( EMIN - 1 ),  but some machines underflow during
-*        this computation.
-*
-         LRMIN = 1
-         DO 30 I = 1, 1 - LEMIN
-            LRMIN = SLAMC3( LRMIN*RBASE, ZERO )
-   30    CONTINUE
-*
-*        Finally, call SLAMC5 to compute EMAX and RMAX.
-*
-         CALL SLAMC5( LBETA, LT, LEMIN, IEEE, LEMAX, LRMAX )
-      END IF
-*
-      BETA = LBETA
-      T = LT
-      RND = LRND
-      EPS = LEPS
-      EMIN = LEMIN
-      RMIN = LRMIN
-      EMAX = LEMAX
-      RMAX = LRMAX
-*
-      RETURN
-*
- 9999 FORMAT( / / ' WARNING. The value EMIN may be incorrect:-',
-     $      '  EMIN = ', I8, /
-     $      ' If, after inspection, the value EMIN looks',
-     $      ' acceptable please comment out ',
-     $      / ' the IF block as marked within the code of routine',
-     $      ' SLAMC2,', / ' otherwise supply EMIN explicitly.', / )
-*
-*     End of SLAMC2
-*
-      END
--- a/libcruft/lapack/slamc3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-      REAL             FUNCTION SLAMC3( A, B )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      REAL               A, B
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAMC3  is intended to force  A  and  B  to be stored prior to doing
-*  the addition of  A  and  B ,  for use in situations where optimizers
-*  might hold one of these in a register.
-*
-*  Arguments
-*  =========
-*
-*  A       (input) REAL
-*  B       (input) REAL
-*          The values A and B.
-*
-* =====================================================================
-*
-*     .. Executable Statements ..
-*
-      SLAMC3 = A + B
-*
-      RETURN
-*
-*     End of SLAMC3
-*
-      END
--- a/libcruft/lapack/slamc4.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-      SUBROUTINE SLAMC4( EMIN, START, BASE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            BASE
-      INTEGER            EMIN
-      REAL               START
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAMC4 is a service routine for SLAMC2.
-*
-*  Arguments
-*  =========
-*
-*  EMIN    (output) INTEGER 
-*          The minimum exponent before (gradual) underflow, computed by
-*          setting A = START and dividing by BASE until the previous A
-*          can not be recovered.
-*
-*  START   (input) REAL
-*          The starting point for determining EMIN.
-*
-*  BASE    (input) INTEGER
-*          The base of the machine.
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I
-      REAL               A, B1, B2, C1, C2, D1, D2, ONE, RBASE, ZERO
-*     ..
-*     .. External Functions ..
-      REAL               SLAMC3
-      EXTERNAL           SLAMC3
-*     ..
-*     .. Executable Statements ..
-*
-      A = START
-      ONE = 1
-      RBASE = ONE / BASE
-      ZERO = 0
-      EMIN = 1
-      B1 = SLAMC3( A*RBASE, ZERO )
-      C1 = A
-      C2 = A
-      D1 = A
-      D2 = A
-*+    WHILE( ( C1.EQ.A ).AND.( C2.EQ.A ).AND.
-*    $       ( D1.EQ.A ).AND.( D2.EQ.A )      )LOOP
-   10 CONTINUE
-      IF( ( C1.EQ.A ) .AND. ( C2.EQ.A ) .AND. ( D1.EQ.A ) .AND.
-     $    ( D2.EQ.A ) ) THEN
-         EMIN = EMIN - 1
-         A = B1
-         B1 = SLAMC3( A / BASE, ZERO )
-         C1 = SLAMC3( B1*BASE, ZERO )
-         D1 = ZERO
-         DO 20 I = 1, BASE
-            D1 = D1 + B1
-   20    CONTINUE
-         B2 = SLAMC3( A*RBASE, ZERO )
-         C2 = SLAMC3( B2 / RBASE, ZERO )
-         D2 = ZERO
-         DO 30 I = 1, BASE
-            D2 = D2 + B2
-   30    CONTINUE
-         GO TO 10
-      END IF
-*+    END WHILE
-*
-      RETURN
-*
-*     End of SLAMC4
-*
-      END
--- a/libcruft/lapack/slamc5.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,158 +0,0 @@
-      SUBROUTINE SLAMC5( BETA, P, EMIN, IEEE, EMAX, RMAX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            IEEE
-      INTEGER            BETA, EMAX, EMIN, P
-      REAL               RMAX
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAMC5 attempts to compute RMAX, the largest machine floating-point
-*  number, without overflow.  It assumes that EMAX + abs(EMIN) sum
-*  approximately to a power of 2.  It will fail on machines where this
-*  assumption does not hold, for example, the Cyber 205 (EMIN = -28625,
-*  EMAX = 28718).  It will also fail if the value supplied for EMIN is
-*  too large (i.e. too close to zero), probably with overflow.
-*
-*  Arguments
-*  =========
-*
-*  BETA    (input) INTEGER
-*          The base of floating-point arithmetic.
-*
-*  P       (input) INTEGER
-*          The number of base BETA digits in the mantissa of a
-*          floating-point value.
-*
-*  EMIN    (input) INTEGER
-*          The minimum exponent before (gradual) underflow.
-*
-*  IEEE    (input) LOGICAL
-*          A logical flag specifying whether or not the arithmetic
-*          system is thought to comply with the IEEE standard.
-*
-*  EMAX    (output) INTEGER
-*          The largest exponent before overflow
-*
-*  RMAX    (output) REAL
-*          The largest machine floating-point number.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            EXBITS, EXPSUM, I, LEXP, NBITS, TRY, UEXP
-      REAL               OLDY, RECBAS, Y, Z
-*     ..
-*     .. External Functions ..
-      REAL               SLAMC3
-      EXTERNAL           SLAMC3
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MOD
-*     ..
-*     .. Executable Statements ..
-*
-*     First compute LEXP and UEXP, two powers of 2 that bound
-*     abs(EMIN). We then assume that EMAX + abs(EMIN) will sum
-*     approximately to the bound that is closest to abs(EMIN).
-*     (EMAX is the exponent of the required number RMAX).
-*
-      LEXP = 1
-      EXBITS = 1
-   10 CONTINUE
-      TRY = LEXP*2
-      IF( TRY.LE.( -EMIN ) ) THEN
-         LEXP = TRY
-         EXBITS = EXBITS + 1
-         GO TO 10
-      END IF
-      IF( LEXP.EQ.-EMIN ) THEN
-         UEXP = LEXP
-      ELSE
-         UEXP = TRY
-         EXBITS = EXBITS + 1
-      END IF
-*
-*     Now -LEXP is less than or equal to EMIN, and -UEXP is greater
-*     than or equal to EMIN. EXBITS is the number of bits needed to
-*     store the exponent.
-*
-      IF( ( UEXP+EMIN ).GT.( -LEXP-EMIN ) ) THEN
-         EXPSUM = 2*LEXP
-      ELSE
-         EXPSUM = 2*UEXP
-      END IF
-*
-*     EXPSUM is the exponent range, approximately equal to
-*     EMAX - EMIN + 1 .
-*
-      EMAX = EXPSUM + EMIN - 1
-      NBITS = 1 + EXBITS + P
-*
-*     NBITS is the total number of bits needed to store a
-*     floating-point number.
-*
-      IF( ( MOD( NBITS, 2 ).EQ.1 ) .AND. ( BETA.EQ.2 ) ) THEN
-*
-*        Either there are an odd number of bits used to store a
-*        floating-point number, which is unlikely, or some bits are
-*        not used in the representation of numbers, which is possible,
-*        (e.g. Cray machines) or the mantissa has an implicit bit,
-*        (e.g. IEEE machines, Dec Vax machines), which is perhaps the
-*        most likely. We have to assume the last alternative.
-*        If this is true, then we need to reduce EMAX by one because
-*        there must be some way of representing zero in an implicit-bit
-*        system. On machines like Cray, we are reducing EMAX by one
-*        unnecessarily.
-*
-         EMAX = EMAX - 1
-      END IF
-*
-      IF( IEEE ) THEN
-*
-*        Assume we are on an IEEE machine which reserves one exponent
-*        for infinity and NaN.
-*
-         EMAX = EMAX - 1
-      END IF
-*
-*     Now create RMAX, the largest machine number, which should
-*     be equal to (1.0 - BETA**(-P)) * BETA**EMAX .
-*
-*     First compute 1.0 - BETA**(-P), being careful that the
-*     result is less than 1.0 .
-*
-      RECBAS = ONE / BETA
-      Z = BETA - ONE
-      Y = ZERO
-      DO 20 I = 1, P
-         Z = Z*RECBAS
-         IF( Y.LT.ONE )
-     $      OLDY = Y
-         Y = SLAMC3( Y, Z )
-   20 CONTINUE
-      IF( Y.GE.ONE )
-     $   Y = OLDY
-*
-*     Now multiply by BETA**EMAX to get RMAX.
-*
-      DO 30 I = 1, EMAX
-         Y = SLAMC3( Y*BETA, ZERO )
-   30 CONTINUE
-*
-      RMAX = Y
-      RETURN
-*
-*     End of SLAMC5
-*
-      END
--- a/libcruft/lapack/slamch.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,126 +0,0 @@
-      REAL             FUNCTION SLAMCH( CMACH )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          CMACH
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAMCH determines single precision machine parameters.
-*
-*  Arguments
-*  =========
-*
-*  CMACH   (input) CHARACTER*1
-*          Specifies the value to be returned by SLAMCH:
-*          = 'E' or 'e',   SLAMCH := eps
-*          = 'S' or 's ,   SLAMCH := sfmin
-*          = 'B' or 'b',   SLAMCH := base
-*          = 'P' or 'p',   SLAMCH := eps*base
-*          = 'N' or 'n',   SLAMCH := t
-*          = 'R' or 'r',   SLAMCH := rnd
-*          = 'M' or 'm',   SLAMCH := emin
-*          = 'U' or 'u',   SLAMCH := rmin
-*          = 'L' or 'l',   SLAMCH := emax
-*          = 'O' or 'o',   SLAMCH := rmax
-*
-*          where
-*
-*          eps   = relative machine precision
-*          sfmin = safe minimum, such that 1/sfmin does not overflow
-*          base  = base of the machine
-*          prec  = eps*base
-*          t     = number of (base) digits in the mantissa
-*          rnd   = 1.0 when rounding occurs in addition, 0.0 otherwise
-*          emin  = minimum exponent before (gradual) underflow
-*          rmin  = underflow threshold - base**(emin-1)
-*          emax  = largest exponent before overflow
-*          rmax  = overflow threshold  - (base**emax)*(1-eps)
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            FIRST, LRND
-      INTEGER            BETA, IMAX, IMIN, IT
-      REAL               BASE, EMAX, EMIN, EPS, PREC, RMACH, RMAX, RMIN,
-     $                   RND, SFMIN, SMALL, T
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLAMC2
-*     ..
-*     .. Save statement ..
-      SAVE               FIRST, EPS, SFMIN, BASE, T, RND, EMIN, RMIN,
-     $                   EMAX, RMAX, PREC
-*     ..
-*     .. Data statements ..
-      DATA               FIRST / .TRUE. /
-*     ..
-*     .. Executable Statements ..
-*
-      IF( FIRST ) THEN
-         CALL SLAMC2( BETA, IT, LRND, EPS, IMIN, RMIN, IMAX, RMAX )
-         BASE = BETA
-         T = IT
-         IF( LRND ) THEN
-            RND = ONE
-            EPS = ( BASE**( 1-IT ) ) / 2
-         ELSE
-            RND = ZERO
-            EPS = BASE**( 1-IT )
-         END IF
-         PREC = EPS*BASE
-         EMIN = IMIN
-         EMAX = IMAX
-         SFMIN = RMIN
-         SMALL = ONE / RMAX
-         IF( SMALL.GE.SFMIN ) THEN
-*
-*           Use SMALL plus a bit, to avoid the possibility of rounding
-*           causing overflow when computing  1/sfmin.
-*
-            SFMIN = SMALL*( ONE+EPS )
-         END IF
-      END IF
-*
-      IF( LSAME( CMACH, 'E' ) ) THEN
-         RMACH = EPS
-      ELSE IF( LSAME( CMACH, 'S' ) ) THEN
-         RMACH = SFMIN
-      ELSE IF( LSAME( CMACH, 'B' ) ) THEN
-         RMACH = BASE
-      ELSE IF( LSAME( CMACH, 'P' ) ) THEN
-         RMACH = PREC
-      ELSE IF( LSAME( CMACH, 'N' ) ) THEN
-         RMACH = T
-      ELSE IF( LSAME( CMACH, 'R' ) ) THEN
-         RMACH = RND
-      ELSE IF( LSAME( CMACH, 'M' ) ) THEN
-         RMACH = EMIN
-      ELSE IF( LSAME( CMACH, 'U' ) ) THEN
-         RMACH = RMIN
-      ELSE IF( LSAME( CMACH, 'L' ) ) THEN
-         RMACH = EMAX
-      ELSE IF( LSAME( CMACH, 'O' ) ) THEN
-         RMACH = RMAX
-      END IF
-*
-      SLAMCH = RMACH
-      FIRST  = .FALSE.
-      RETURN
-*
-*     End of SLAMCH
-*
-      END
--- a/libcruft/lapack/slamrg.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,103 +0,0 @@
-      SUBROUTINE SLAMRG( N1, N2, A, STRD1, STRD2, INDEX )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            N1, N2, STRD1, STRD2
-*     ..
-*     .. Array Arguments ..
-      INTEGER            INDEX( * )
-      REAL               A( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAMRG will create a permutation list which will merge the elements
-*  of A (which is composed of two independently sorted sets) into a
-*  single set which is sorted in ascending order.
-*
-*  Arguments
-*  =========
-*
-*  N1     (input) INTEGER
-*  N2     (input) INTEGER
-*         These arguements contain the respective lengths of the two
-*         sorted lists to be merged.
-*
-*  A      (input) REAL array, dimension (N1+N2)
-*         The first N1 elements of A contain a list of numbers which
-*         are sorted in either ascending or descending order.  Likewise
-*         for the final N2 elements.
-*
-*  STRD1  (input) INTEGER
-*  STRD2  (input) INTEGER
-*         These are the strides to be taken through the array A.
-*         Allowable strides are 1 and -1.  They indicate whether a
-*         subset of A is sorted in ascending (STRDx = 1) or descending
-*         (STRDx = -1) order.
-*
-*  INDEX  (output) INTEGER array, dimension (N1+N2)
-*         On exit this array will contain a permutation such that
-*         if B( I ) = A( INDEX( I ) ) for I=1,N1+N2, then B will be
-*         sorted in ascending order.
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, IND1, IND2, N1SV, N2SV
-*     ..
-*     .. Executable Statements ..
-*
-      N1SV = N1
-      N2SV = N2
-      IF( STRD1.GT.0 ) THEN
-         IND1 = 1
-      ELSE
-         IND1 = N1
-      END IF
-      IF( STRD2.GT.0 ) THEN
-         IND2 = 1 + N1
-      ELSE
-         IND2 = N1 + N2
-      END IF
-      I = 1
-*     while ( (N1SV > 0) & (N2SV > 0) )
-   10 CONTINUE
-      IF( N1SV.GT.0 .AND. N2SV.GT.0 ) THEN
-         IF( A( IND1 ).LE.A( IND2 ) ) THEN
-            INDEX( I ) = IND1
-            I = I + 1
-            IND1 = IND1 + STRD1
-            N1SV = N1SV - 1
-         ELSE
-            INDEX( I ) = IND2
-            I = I + 1
-            IND2 = IND2 + STRD2
-            N2SV = N2SV - 1
-         END IF
-         GO TO 10
-      END IF
-*     end while
-      IF( N1SV.EQ.0 ) THEN
-         DO 20 N1SV = 1, N2SV
-            INDEX( I ) = IND2
-            I = I + 1
-            IND2 = IND2 + STRD2
-   20    CONTINUE
-      ELSE
-*     N2SV .EQ. 0
-         DO 30 N2SV = 1, N1SV
-            INDEX( I ) = IND1
-            I = I + 1
-            IND1 = IND1 + STRD1
-   30    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of SLAMRG
-*
-      END
--- a/libcruft/lapack/slange.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-      REAL             FUNCTION SLANGE( NORM, M, N, A, LDA, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLANGE  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  real matrix A.
-*
-*  Description
-*  ===========
-*
-*  SLANGE returns the value
-*
-*     SLANGE = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in SLANGE as described
-*          above.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.  When M = 0,
-*          SLANGE is set to zero.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.  When N = 0,
-*          SLANGE is set to zero.
-*
-*  A       (input) REAL array, dimension (LDA,N)
-*          The m by n matrix A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(M,1).
-*
-*  WORK    (workspace) REAL array, dimension (MAX(1,LWORK)),
-*          where LWORK >= M when NORM = 'I'; otherwise, WORK is not
-*          referenced.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      REAL               SCALE, SUM, VALUE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLASSQ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( MIN( M, N ).EQ.0 ) THEN
-         VALUE = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         VALUE = ZERO
-         DO 20 J = 1, N
-            DO 10 I = 1, M
-               VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   10       CONTINUE
-   20    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN
-*
-*        Find norm1(A).
-*
-         VALUE = ZERO
-         DO 40 J = 1, N
-            SUM = ZERO
-            DO 30 I = 1, M
-               SUM = SUM + ABS( A( I, J ) )
-   30       CONTINUE
-            VALUE = MAX( VALUE, SUM )
-   40    CONTINUE
-      ELSE IF( LSAME( NORM, 'I' ) ) THEN
-*
-*        Find normI(A).
-*
-         DO 50 I = 1, M
-            WORK( I ) = ZERO
-   50    CONTINUE
-         DO 70 J = 1, N
-            DO 60 I = 1, M
-               WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-   60       CONTINUE
-   70    CONTINUE
-         VALUE = ZERO
-         DO 80 I = 1, M
-            VALUE = MAX( VALUE, WORK( I ) )
-   80    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         SCALE = ZERO
-         SUM = ONE
-         DO 90 J = 1, N
-            CALL SLASSQ( M, A( 1, J ), 1, SCALE, SUM )
-   90    CONTINUE
-         VALUE = SCALE*SQRT( SUM )
-      END IF
-*
-      SLANGE = VALUE
-      RETURN
-*
-*     End of SLANGE
-*
-      END
--- a/libcruft/lapack/slanhs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,141 +0,0 @@
-      REAL             FUNCTION SLANHS( NORM, N, A, LDA, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            LDA, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLANHS  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  Hessenberg matrix A.
-*
-*  Description
-*  ===========
-*
-*  SLANHS returns the value
-*
-*     SLANHS = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in SLANHS as described
-*          above.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.  When N = 0, SLANHS is
-*          set to zero.
-*
-*  A       (input) REAL array, dimension (LDA,N)
-*          The n by n upper Hessenberg matrix A; the part of A below the
-*          first sub-diagonal is not referenced.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(N,1).
-*
-*  WORK    (workspace) REAL array, dimension (MAX(1,LWORK)),
-*          where LWORK >= N when NORM = 'I'; otherwise, WORK is not
-*          referenced.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      REAL               SCALE, SUM, VALUE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLASSQ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.EQ.0 ) THEN
-         VALUE = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         VALUE = ZERO
-         DO 20 J = 1, N
-            DO 10 I = 1, MIN( N, J+1 )
-               VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   10       CONTINUE
-   20    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN
-*
-*        Find norm1(A).
-*
-         VALUE = ZERO
-         DO 40 J = 1, N
-            SUM = ZERO
-            DO 30 I = 1, MIN( N, J+1 )
-               SUM = SUM + ABS( A( I, J ) )
-   30       CONTINUE
-            VALUE = MAX( VALUE, SUM )
-   40    CONTINUE
-      ELSE IF( LSAME( NORM, 'I' ) ) THEN
-*
-*        Find normI(A).
-*
-         DO 50 I = 1, N
-            WORK( I ) = ZERO
-   50    CONTINUE
-         DO 70 J = 1, N
-            DO 60 I = 1, MIN( N, J+1 )
-               WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-   60       CONTINUE
-   70    CONTINUE
-         VALUE = ZERO
-         DO 80 I = 1, N
-            VALUE = MAX( VALUE, WORK( I ) )
-   80    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         SCALE = ZERO
-         SUM = ONE
-         DO 90 J = 1, N
-            CALL SLASSQ( MIN( N, J+1 ), A( 1, J ), 1, SCALE, SUM )
-   90    CONTINUE
-         VALUE = SCALE*SQRT( SUM )
-      END IF
-*
-      SLANHS = VALUE
-      RETURN
-*
-*     End of SLANHS
-*
-      END
--- a/libcruft/lapack/slanst.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,124 +0,0 @@
-      REAL             FUNCTION SLANST( NORM, N, D, E )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            N
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLANST  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  real symmetric tridiagonal matrix A.
-*
-*  Description
-*  ===========
-*
-*  SLANST returns the value
-*
-*     SLANST = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in SLANST as described
-*          above.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.  When N = 0, SLANST is
-*          set to zero.
-*
-*  D       (input) REAL array, dimension (N)
-*          The diagonal elements of A.
-*
-*  E       (input) REAL array, dimension (N-1)
-*          The (n-1) sub-diagonal or super-diagonal elements of A.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      REAL               ANORM, SCALE, SUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLASSQ
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.LE.0 ) THEN
-         ANORM = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         ANORM = ABS( D( N ) )
-         DO 10 I = 1, N - 1
-            ANORM = MAX( ANORM, ABS( D( I ) ) )
-            ANORM = MAX( ANORM, ABS( E( I ) ) )
-   10    CONTINUE
-      ELSE IF( LSAME( NORM, 'O' ) .OR. NORM.EQ.'1' .OR.
-     $         LSAME( NORM, 'I' ) ) THEN
-*
-*        Find norm1(A).
-*
-         IF( N.EQ.1 ) THEN
-            ANORM = ABS( D( 1 ) )
-         ELSE
-            ANORM = MAX( ABS( D( 1 ) )+ABS( E( 1 ) ),
-     $              ABS( E( N-1 ) )+ABS( D( N ) ) )
-            DO 20 I = 2, N - 1
-               ANORM = MAX( ANORM, ABS( D( I ) )+ABS( E( I ) )+
-     $                 ABS( E( I-1 ) ) )
-   20       CONTINUE
-         END IF
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         SCALE = ZERO
-         SUM = ONE
-         IF( N.GT.1 ) THEN
-            CALL SLASSQ( N-1, E, 1, SCALE, SUM )
-            SUM = 2*SUM
-         END IF
-         CALL SLASSQ( N, D, 1, SCALE, SUM )
-         ANORM = SCALE*SQRT( SUM )
-      END IF
-*
-      SLANST = ANORM
-      RETURN
-*
-*     End of SLANST
-*
-      END
--- a/libcruft/lapack/slansy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,173 +0,0 @@
-      REAL             FUNCTION SLANSY( NORM, UPLO, N, A, LDA, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM, UPLO
-      INTEGER            LDA, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLANSY  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  real symmetric matrix A.
-*
-*  Description
-*  ===========
-*
-*  SLANSY returns the value
-*
-*     SLANSY = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in SLANSY as described
-*          above.
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          symmetric matrix A is to be referenced.
-*          = 'U':  Upper triangular part of A is referenced
-*          = 'L':  Lower triangular part of A is referenced
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.  When N = 0, SLANSY is
-*          set to zero.
-*
-*  A       (input) REAL array, dimension (LDA,N)
-*          The symmetric matrix A.  If UPLO = 'U', the leading n by n
-*          upper triangular part of A contains the upper triangular part
-*          of the matrix A, and the strictly lower triangular part of A
-*          is not referenced.  If UPLO = 'L', the leading n by n lower
-*          triangular part of A contains the lower triangular part of
-*          the matrix A, and the strictly upper triangular part of A is
-*          not referenced.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(N,1).
-*
-*  WORK    (workspace) REAL array, dimension (MAX(1,LWORK)),
-*          where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise,
-*          WORK is not referenced.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      REAL               ABSA, SCALE, SUM, VALUE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLASSQ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.EQ.0 ) THEN
-         VALUE = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         VALUE = ZERO
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            DO 20 J = 1, N
-               DO 10 I = 1, J
-                  VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   10          CONTINUE
-   20       CONTINUE
-         ELSE
-            DO 40 J = 1, N
-               DO 30 I = J, N
-                  VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   30          CONTINUE
-   40       CONTINUE
-         END IF
-      ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR.
-     $         ( NORM.EQ.'1' ) ) THEN
-*
-*        Find normI(A) ( = norm1(A), since A is symmetric).
-*
-         VALUE = ZERO
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            DO 60 J = 1, N
-               SUM = ZERO
-               DO 50 I = 1, J - 1
-                  ABSA = ABS( A( I, J ) )
-                  SUM = SUM + ABSA
-                  WORK( I ) = WORK( I ) + ABSA
-   50          CONTINUE
-               WORK( J ) = SUM + ABS( A( J, J ) )
-   60       CONTINUE
-            DO 70 I = 1, N
-               VALUE = MAX( VALUE, WORK( I ) )
-   70       CONTINUE
-         ELSE
-            DO 80 I = 1, N
-               WORK( I ) = ZERO
-   80       CONTINUE
-            DO 100 J = 1, N
-               SUM = WORK( J ) + ABS( A( J, J ) )
-               DO 90 I = J + 1, N
-                  ABSA = ABS( A( I, J ) )
-                  SUM = SUM + ABSA
-                  WORK( I ) = WORK( I ) + ABSA
-   90          CONTINUE
-               VALUE = MAX( VALUE, SUM )
-  100       CONTINUE
-         END IF
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         SCALE = ZERO
-         SUM = ONE
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            DO 110 J = 2, N
-               CALL SLASSQ( J-1, A( 1, J ), 1, SCALE, SUM )
-  110       CONTINUE
-         ELSE
-            DO 120 J = 1, N - 1
-               CALL SLASSQ( N-J, A( J+1, J ), 1, SCALE, SUM )
-  120       CONTINUE
-         END IF
-         SUM = 2*SUM
-         CALL SLASSQ( N, A, LDA+1, SCALE, SUM )
-         VALUE = SCALE*SQRT( SUM )
-      END IF
-*
-      SLANSY = VALUE
-      RETURN
-*
-*     End of SLANSY
-*
-      END
--- a/libcruft/lapack/slantr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,276 +0,0 @@
-      REAL             FUNCTION SLANTR( NORM, UPLO, DIAG, M, N, A, LDA,
-     $                 WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, NORM, UPLO
-      INTEGER            LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLANTR  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  trapezoidal or triangular matrix A.
-*
-*  Description
-*  ===========
-*
-*  SLANTR returns the value
-*
-*     SLANTR = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in SLANTR as described
-*          above.
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the matrix A is upper or lower trapezoidal.
-*          = 'U':  Upper trapezoidal
-*          = 'L':  Lower trapezoidal
-*          Note that A is triangular instead of trapezoidal if M = N.
-*
-*  DIAG    (input) CHARACTER*1
-*          Specifies whether or not the matrix A has unit diagonal.
-*          = 'N':  Non-unit diagonal
-*          = 'U':  Unit diagonal
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0, and if
-*          UPLO = 'U', M <= N.  When M = 0, SLANTR is set to zero.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0, and if
-*          UPLO = 'L', N <= M.  When N = 0, SLANTR is set to zero.
-*
-*  A       (input) REAL array, dimension (LDA,N)
-*          The trapezoidal matrix A (A is triangular if M = N).
-*          If UPLO = 'U', the leading m by n upper trapezoidal part of
-*          the array A contains the upper trapezoidal matrix, and the
-*          strictly lower triangular part of A is not referenced.
-*          If UPLO = 'L', the leading m by n lower trapezoidal part of
-*          the array A contains the lower trapezoidal matrix, and the
-*          strictly upper triangular part of A is not referenced.  Note
-*          that when DIAG = 'U', the diagonal elements of A are not
-*          referenced and are assumed to be one.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(M,1).
-*
-*  WORK    (workspace) REAL array, dimension (MAX(1,LWORK)),
-*          where LWORK >= M when NORM = 'I'; otherwise, WORK is not
-*          referenced.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UDIAG
-      INTEGER            I, J
-      REAL               SCALE, SUM, VALUE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLASSQ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( MIN( M, N ).EQ.0 ) THEN
-         VALUE = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         IF( LSAME( DIAG, 'U' ) ) THEN
-            VALUE = ONE
-            IF( LSAME( UPLO, 'U' ) ) THEN
-               DO 20 J = 1, N
-                  DO 10 I = 1, MIN( M, J-1 )
-                     VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   10             CONTINUE
-   20          CONTINUE
-            ELSE
-               DO 40 J = 1, N
-                  DO 30 I = J + 1, M
-                     VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   30             CONTINUE
-   40          CONTINUE
-            END IF
-         ELSE
-            VALUE = ZERO
-            IF( LSAME( UPLO, 'U' ) ) THEN
-               DO 60 J = 1, N
-                  DO 50 I = 1, MIN( M, J )
-                     VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   50             CONTINUE
-   60          CONTINUE
-            ELSE
-               DO 80 J = 1, N
-                  DO 70 I = J, M
-                     VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   70             CONTINUE
-   80          CONTINUE
-            END IF
-         END IF
-      ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN
-*
-*        Find norm1(A).
-*
-         VALUE = ZERO
-         UDIAG = LSAME( DIAG, 'U' )
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            DO 110 J = 1, N
-               IF( ( UDIAG ) .AND. ( J.LE.M ) ) THEN
-                  SUM = ONE
-                  DO 90 I = 1, J - 1
-                     SUM = SUM + ABS( A( I, J ) )
-   90             CONTINUE
-               ELSE
-                  SUM = ZERO
-                  DO 100 I = 1, MIN( M, J )
-                     SUM = SUM + ABS( A( I, J ) )
-  100             CONTINUE
-               END IF
-               VALUE = MAX( VALUE, SUM )
-  110       CONTINUE
-         ELSE
-            DO 140 J = 1, N
-               IF( UDIAG ) THEN
-                  SUM = ONE
-                  DO 120 I = J + 1, M
-                     SUM = SUM + ABS( A( I, J ) )
-  120             CONTINUE
-               ELSE
-                  SUM = ZERO
-                  DO 130 I = J, M
-                     SUM = SUM + ABS( A( I, J ) )
-  130             CONTINUE
-               END IF
-               VALUE = MAX( VALUE, SUM )
-  140       CONTINUE
-         END IF
-      ELSE IF( LSAME( NORM, 'I' ) ) THEN
-*
-*        Find normI(A).
-*
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            IF( LSAME( DIAG, 'U' ) ) THEN
-               DO 150 I = 1, M
-                  WORK( I ) = ONE
-  150          CONTINUE
-               DO 170 J = 1, N
-                  DO 160 I = 1, MIN( M, J-1 )
-                     WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-  160             CONTINUE
-  170          CONTINUE
-            ELSE
-               DO 180 I = 1, M
-                  WORK( I ) = ZERO
-  180          CONTINUE
-               DO 200 J = 1, N
-                  DO 190 I = 1, MIN( M, J )
-                     WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-  190             CONTINUE
-  200          CONTINUE
-            END IF
-         ELSE
-            IF( LSAME( DIAG, 'U' ) ) THEN
-               DO 210 I = 1, N
-                  WORK( I ) = ONE
-  210          CONTINUE
-               DO 220 I = N + 1, M
-                  WORK( I ) = ZERO
-  220          CONTINUE
-               DO 240 J = 1, N
-                  DO 230 I = J + 1, M
-                     WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-  230             CONTINUE
-  240          CONTINUE
-            ELSE
-               DO 250 I = 1, M
-                  WORK( I ) = ZERO
-  250          CONTINUE
-               DO 270 J = 1, N
-                  DO 260 I = J, M
-                     WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-  260             CONTINUE
-  270          CONTINUE
-            END IF
-         END IF
-         VALUE = ZERO
-         DO 280 I = 1, M
-            VALUE = MAX( VALUE, WORK( I ) )
-  280    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            IF( LSAME( DIAG, 'U' ) ) THEN
-               SCALE = ONE
-               SUM = MIN( M, N )
-               DO 290 J = 2, N
-                  CALL SLASSQ( MIN( M, J-1 ), A( 1, J ), 1, SCALE, SUM )
-  290          CONTINUE
-            ELSE
-               SCALE = ZERO
-               SUM = ONE
-               DO 300 J = 1, N
-                  CALL SLASSQ( MIN( M, J ), A( 1, J ), 1, SCALE, SUM )
-  300          CONTINUE
-            END IF
-         ELSE
-            IF( LSAME( DIAG, 'U' ) ) THEN
-               SCALE = ONE
-               SUM = MIN( M, N )
-               DO 310 J = 1, N
-                  CALL SLASSQ( M-J, A( MIN( M, J+1 ), J ), 1, SCALE,
-     $                         SUM )
-  310          CONTINUE
-            ELSE
-               SCALE = ZERO
-               SUM = ONE
-               DO 320 J = 1, N
-                  CALL SLASSQ( M-J+1, A( J, J ), 1, SCALE, SUM )
-  320          CONTINUE
-            END IF
-         END IF
-         VALUE = SCALE*SQRT( SUM )
-      END IF
-*
-      SLANTR = VALUE
-      RETURN
-*
-*     End of SLANTR
-*
-      END
--- a/libcruft/lapack/slanv2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,205 +0,0 @@
-      SUBROUTINE SLANV2( A, B, C, D, RT1R, RT1I, RT2R, RT2I, CS, SN )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      REAL               A, B, C, CS, D, RT1I, RT1R, RT2I, RT2R, SN
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLANV2 computes the Schur factorization of a real 2-by-2 nonsymmetric
-*  matrix in standard form:
-*
-*       [ A  B ] = [ CS -SN ] [ AA  BB ] [ CS  SN ]
-*       [ C  D ]   [ SN  CS ] [ CC  DD ] [-SN  CS ]
-*
-*  where either
-*  1) CC = 0 so that AA and DD are real eigenvalues of the matrix, or
-*  2) AA = DD and BB*CC < 0, so that AA + or - sqrt(BB*CC) are complex
-*  conjugate eigenvalues.
-*
-*  Arguments
-*  =========
-*
-*  A       (input/output) REAL            
-*  B       (input/output) REAL            
-*  C       (input/output) REAL            
-*  D       (input/output) REAL            
-*          On entry, the elements of the input matrix.
-*          On exit, they are overwritten by the elements of the
-*          standardised Schur form.
-*
-*  RT1R    (output) REAL 
-*  RT1I    (output) REAL            
-*  RT2R    (output) REAL            
-*  RT2I    (output) REAL            
-*          The real and imaginary parts of the eigenvalues. If the
-*          eigenvalues are a complex conjugate pair, RT1I > 0.
-*
-*  CS      (output) REAL            
-*  SN      (output) REAL            
-*          Parameters of the rotation matrix.
-*
-*  Further Details
-*  ===============
-*
-*  Modified by V. Sima, Research Institute for Informatics, Bucharest,
-*  Romania, to reduce the risk of cancellation errors,
-*  when computing real eigenvalues, and to ensure, if possible, that
-*  abs(RT1R) >= abs(RT2R).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, HALF, ONE
-      PARAMETER          ( ZERO = 0.0E+0, HALF = 0.5E+0, ONE = 1.0E+0 )
-      REAL               MULTPL
-      PARAMETER          ( MULTPL = 4.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      REAL               AA, BB, BCMAX, BCMIS, CC, CS1, DD, EPS, P, SAB,
-     $                   SAC, SCALE, SIGMA, SN1, TAU, TEMP, Z
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH, SLAPY2
-      EXTERNAL           SLAMCH, SLAPY2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      EPS = SLAMCH( 'P' )
-      IF( C.EQ.ZERO ) THEN
-         CS = ONE
-         SN = ZERO
-         GO TO 10
-*
-      ELSE IF( B.EQ.ZERO ) THEN
-*
-*        Swap rows and columns
-*
-         CS = ZERO
-         SN = ONE
-         TEMP = D
-         D = A
-         A = TEMP
-         B = -C
-         C = ZERO
-         GO TO 10
-      ELSE IF( (A-D).EQ.ZERO .AND. SIGN( ONE, B ).NE.
-     $   SIGN( ONE, C ) ) THEN
-         CS = ONE
-         SN = ZERO
-         GO TO 10
-      ELSE
-*
-         TEMP = A - D
-         P = HALF*TEMP
-         BCMAX = MAX( ABS( B ), ABS( C ) )
-         BCMIS = MIN( ABS( B ), ABS( C ) )*SIGN( ONE, B )*SIGN( ONE, C )
-         SCALE = MAX( ABS( P ), BCMAX )
-         Z = ( P / SCALE )*P + ( BCMAX / SCALE )*BCMIS
-*
-*        If Z is of the order of the machine accuracy, postpone the
-*        decision on the nature of eigenvalues
-*
-         IF( Z.GE.MULTPL*EPS ) THEN
-*
-*           Real eigenvalues. Compute A and D.
-*
-            Z = P + SIGN( SQRT( SCALE )*SQRT( Z ), P )
-            A = D + Z
-            D = D - ( BCMAX / Z )*BCMIS
-*
-*           Compute B and the rotation matrix
-*
-            TAU = SLAPY2( C, Z )
-            CS = Z / TAU
-            SN = C / TAU
-            B = B - C
-            C = ZERO
-         ELSE
-*
-*           Complex eigenvalues, or real (almost) equal eigenvalues.
-*           Make diagonal elements equal.
-*
-            SIGMA = B + C
-            TAU = SLAPY2( SIGMA, TEMP )
-            CS = SQRT( HALF*( ONE+ABS( SIGMA ) / TAU ) )
-            SN = -( P / ( TAU*CS ) )*SIGN( ONE, SIGMA )
-*
-*           Compute [ AA  BB ] = [ A  B ] [ CS -SN ]
-*                   [ CC  DD ]   [ C  D ] [ SN  CS ]
-*
-            AA = A*CS + B*SN
-            BB = -A*SN + B*CS
-            CC = C*CS + D*SN
-            DD = -C*SN + D*CS
-*
-*           Compute [ A  B ] = [ CS  SN ] [ AA  BB ]
-*                   [ C  D ]   [-SN  CS ] [ CC  DD ]
-*
-            A = AA*CS + CC*SN
-            B = BB*CS + DD*SN
-            C = -AA*SN + CC*CS
-            D = -BB*SN + DD*CS
-*
-            TEMP = HALF*( A+D )
-            A = TEMP
-            D = TEMP
-*
-            IF( C.NE.ZERO ) THEN
-               IF( B.NE.ZERO ) THEN
-                  IF( SIGN( ONE, B ).EQ.SIGN( ONE, C ) ) THEN
-*
-*                    Real eigenvalues: reduce to upper triangular form
-*
-                     SAB = SQRT( ABS( B ) )
-                     SAC = SQRT( ABS( C ) )
-                     P = SIGN( SAB*SAC, C )
-                     TAU = ONE / SQRT( ABS( B+C ) )
-                     A = TEMP + P
-                     D = TEMP - P
-                     B = B - C
-                     C = ZERO
-                     CS1 = SAB*TAU
-                     SN1 = SAC*TAU
-                     TEMP = CS*CS1 - SN*SN1
-                     SN = CS*SN1 + SN*CS1
-                     CS = TEMP
-                  END IF
-               ELSE
-                  B = -C
-                  C = ZERO
-                  TEMP = CS
-                  CS = -SN
-                  SN = TEMP
-               END IF
-            END IF
-         END IF
-*
-      END IF
-*
-   10 CONTINUE
-*
-*     Store eigenvalues in (RT1R,RT1I) and (RT2R,RT2I).
-*
-      RT1R = A
-      RT2R = D
-      IF( C.EQ.ZERO ) THEN
-         RT1I = ZERO
-         RT2I = ZERO
-      ELSE
-         RT1I = SQRT( ABS( B ) )*SQRT( ABS( C ) )
-         RT2I = -RT1I
-      END IF
-      RETURN
-*
-*     End of SLANV2
-*
-      END
--- a/libcruft/lapack/slapy2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-      REAL             FUNCTION SLAPY2( X, Y )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      REAL               X, Y
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAPY2 returns sqrt(x**2+y**2), taking care not to cause unnecessary
-*  overflow.
-*
-*  Arguments
-*  =========
-*
-*  X       (input) REAL
-*  Y       (input) REAL
-*          X and Y specify the values x and y.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E0 )
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E0 )
-*     ..
-*     .. Local Scalars ..
-      REAL               W, XABS, YABS, Z
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      XABS = ABS( X )
-      YABS = ABS( Y )
-      W = MAX( XABS, YABS )
-      Z = MIN( XABS, YABS )
-      IF( Z.EQ.ZERO ) THEN
-         SLAPY2 = W
-      ELSE
-         SLAPY2 = W*SQRT( ONE+( Z / W )**2 )
-      END IF
-      RETURN
-*
-*     End of SLAPY2
-*
-      END
--- a/libcruft/lapack/slapy3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-      REAL             FUNCTION SLAPY3( X, Y, Z )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      REAL               X, Y, Z
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAPY3 returns sqrt(x**2+y**2+z**2), taking care not to cause
-*  unnecessary overflow.
-*
-*  Arguments
-*  =========
-*
-*  X       (input) REAL
-*  Y       (input) REAL
-*  Z       (input) REAL
-*          X, Y and Z specify the values x, y and z.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E0 )
-*     ..
-*     .. Local Scalars ..
-      REAL               W, XABS, YABS, ZABS
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      XABS = ABS( X )
-      YABS = ABS( Y )
-      ZABS = ABS( Z )
-      W = MAX( XABS, YABS, ZABS )
-      IF( W.EQ.ZERO ) THEN
-*     W can be zero for max(0,nan,0)
-*     adding all three entries together will make sure
-*     NaN will not disappear.
-         SLAPY3 =  XABS + YABS + ZABS
-      ELSE
-         SLAPY3 = W*SQRT( ( XABS / W )**2+( YABS / W )**2+
-     $            ( ZABS / W )**2 )
-      END IF
-      RETURN
-*
-*     End of SLAPY3
-*
-      END
--- a/libcruft/lapack/slaqp2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,175 +0,0 @@
-      SUBROUTINE SLAQP2( M, N, OFFSET, A, LDA, JPVT, TAU, VN1, VN2,
-     $                   WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            LDA, M, N, OFFSET
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      REAL               A( LDA, * ), TAU( * ), VN1( * ), VN2( * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAQP2 computes a QR factorization with column pivoting of
-*  the block A(OFFSET+1:M,1:N).
-*  The block A(1:OFFSET,1:N) is accordingly pivoted, but not factorized.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0.
-*
-*  OFFSET  (input) INTEGER
-*          The number of rows of the matrix A that must be pivoted
-*          but no factorized. OFFSET >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the upper triangle of block A(OFFSET+1:M,1:N) is 
-*          the triangular factor obtained; the elements in block 
-*          A(OFFSET+1:M,1:N) below the diagonal, together with the 
-*          array TAU, represent the orthogonal matrix Q as a product of
-*          elementary reflectors. Block A(1:OFFSET,1:N) has been
-*          accordingly pivoted, but no factorized.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          On entry, if JPVT(i) .ne. 0, the i-th column of A is permuted
-*          to the front of A*P (a leading column); if JPVT(i) = 0,
-*          the i-th column of A is a free column.
-*          On exit, if JPVT(i) = k, then the i-th column of A*P
-*          was the k-th column of A.
-*
-*  TAU     (output) REAL array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors.
-*
-*  VN1     (input/output) REAL array, dimension (N)
-*          The vector with the partial column norms.
-*
-*  VN2     (input/output) REAL array, dimension (N)
-*          The vector with the exact column norms.
-*
-*  WORK    (workspace) REAL array, dimension (N)
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*    X. Sun, Computer Science Dept., Duke University, USA
-*
-*  Partial column norm updating strategy modified by
-*    Z. Drmac and Z. Bujanovic, Dept. of Mathematics,
-*    University of Zagreb, Croatia.
-*    June 2006.
-*  For more details see LAPACK Working Note 176.
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ITEMP, J, MN, OFFPI, PVT
-      REAL               AII, TEMP, TEMP2, TOL3Z
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARF, SLARFG, SSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. External Functions ..
-      INTEGER            ISAMAX
-      REAL               SLAMCH, SNRM2
-      EXTERNAL           ISAMAX, SLAMCH, SNRM2
-*     ..
-*     .. Executable Statements ..
-*
-      MN = MIN( M-OFFSET, N )
-      TOL3Z = SQRT(SLAMCH('Epsilon'))
-*
-*     Compute factorization.
-*
-      DO 20 I = 1, MN
-*
-         OFFPI = OFFSET + I
-*
-*        Determine ith pivot column and swap if necessary.
-*
-         PVT = ( I-1 ) + ISAMAX( N-I+1, VN1( I ), 1 )
-*
-         IF( PVT.NE.I ) THEN
-            CALL SSWAP( M, A( 1, PVT ), 1, A( 1, I ), 1 )
-            ITEMP = JPVT( PVT )
-            JPVT( PVT ) = JPVT( I )
-            JPVT( I ) = ITEMP
-            VN1( PVT ) = VN1( I )
-            VN2( PVT ) = VN2( I )
-         END IF
-*
-*        Generate elementary reflector H(i).
-*
-         IF( OFFPI.LT.M ) THEN
-            CALL SLARFG( M-OFFPI+1, A( OFFPI, I ), A( OFFPI+1, I ), 1,
-     $                   TAU( I ) )
-         ELSE
-            CALL SLARFG( 1, A( M, I ), A( M, I ), 1, TAU( I ) )
-         END IF
-*
-         IF( I.LT.N ) THEN
-*
-*           Apply H(i)' to A(offset+i:m,i+1:n) from the left.
-*
-            AII = A( OFFPI, I )
-            A( OFFPI, I ) = ONE
-            CALL SLARF( 'Left', M-OFFPI+1, N-I, A( OFFPI, I ), 1,
-     $                  TAU( I ), A( OFFPI, I+1 ), LDA, WORK( 1 ) )
-            A( OFFPI, I ) = AII
-         END IF
-*
-*        Update partial column norms.
-*
-         DO 10 J = I + 1, N
-            IF( VN1( J ).NE.ZERO ) THEN
-*
-*              NOTE: The following 4 lines follow from the analysis in
-*              Lapack Working Note 176.
-*
-               TEMP = ONE - ( ABS( A( OFFPI, J ) ) / VN1( J ) )**2
-               TEMP = MAX( TEMP, ZERO )
-               TEMP2 = TEMP*( VN1( J ) / VN2( J ) )**2
-               IF( TEMP2 .LE. TOL3Z ) THEN
-                  IF( OFFPI.LT.M ) THEN
-                     VN1( J ) = SNRM2( M-OFFPI, A( OFFPI+1, J ), 1 )
-                     VN2( J ) = VN1( J )
-                  ELSE
-                     VN1( J ) = ZERO
-                     VN2( J ) = ZERO
-                  END IF
-               ELSE
-                  VN1( J ) = VN1( J )*SQRT( TEMP )
-               END IF
-            END IF
-   10    CONTINUE
-*
-   20 CONTINUE
-*
-      RETURN
-*
-*     End of SLAQP2
-*
-      END
--- a/libcruft/lapack/slaqps.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,259 +0,0 @@
-      SUBROUTINE SLAQPS( M, N, OFFSET, NB, KB, A, LDA, JPVT, TAU, VN1,
-     $                   VN2, AUXV, F, LDF )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            KB, LDA, LDF, M, N, NB, OFFSET
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      REAL               A( LDA, * ), AUXV( * ), F( LDF, * ), TAU( * ),
-     $                   VN1( * ), VN2( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAQPS computes a step of QR factorization with column pivoting
-*  of a real M-by-N matrix A by using Blas-3.  It tries to factorize
-*  NB columns from A starting from the row OFFSET+1, and updates all
-*  of the matrix with Blas-3 xGEMM.
-*
-*  In some cases, due to catastrophic cancellations, it cannot
-*  factorize NB columns.  Hence, the actual number of factorized
-*  columns is returned in KB.
-*
-*  Block A(1:OFFSET,1:N) is accordingly pivoted, but not factorized.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0
-*
-*  OFFSET  (input) INTEGER
-*          The number of rows of A that have been factorized in
-*          previous steps.
-*
-*  NB      (input) INTEGER
-*          The number of columns to factorize.
-*
-*  KB      (output) INTEGER
-*          The number of columns actually factorized.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, block A(OFFSET+1:M,1:KB) is the triangular
-*          factor obtained and block A(1:OFFSET,1:N) has been
-*          accordingly pivoted, but no factorized.
-*          The rest of the matrix, block A(OFFSET+1:M,KB+1:N) has
-*          been updated.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          JPVT(I) = K <==> Column K of the full matrix A has been
-*          permuted into position I in AP.
-*
-*  TAU     (output) REAL array, dimension (KB)
-*          The scalar factors of the elementary reflectors.
-*
-*  VN1     (input/output) REAL array, dimension (N)
-*          The vector with the partial column norms.
-*
-*  VN2     (input/output) REAL array, dimension (N)
-*          The vector with the exact column norms.
-*
-*  AUXV    (input/output) REAL array, dimension (NB)
-*          Auxiliar vector.
-*
-*  F       (input/output) REAL array, dimension (LDF,NB)
-*          Matrix F' = L*Y'*A.
-*
-*  LDF     (input) INTEGER
-*          The leading dimension of the array F. LDF >= max(1,N).
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*    X. Sun, Computer Science Dept., Duke University, USA
-*
-*  Partial column norm updating strategy modified by
-*    Z. Drmac and Z. Bujanovic, Dept. of Mathematics,
-*    University of Zagreb, Croatia.
-*    June 2006.
-*  For more details see LAPACK Working Note 176.
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            ITEMP, J, K, LASTRK, LSTICC, PVT, RK
-      REAL               AKK, TEMP, TEMP2, TOL3Z
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEMM, SGEMV, SLARFG, SSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, NINT, REAL, SQRT
-*     ..
-*     .. External Functions ..
-      INTEGER            ISAMAX
-      REAL               SLAMCH, SNRM2
-      EXTERNAL           ISAMAX, SLAMCH, SNRM2
-*     ..
-*     .. Executable Statements ..
-*
-      LASTRK = MIN( M, N+OFFSET )
-      LSTICC = 0
-      K = 0
-      TOL3Z = SQRT(SLAMCH('Epsilon'))
-*
-*     Beginning of while loop.
-*
-   10 CONTINUE
-      IF( ( K.LT.NB ) .AND. ( LSTICC.EQ.0 ) ) THEN
-         K = K + 1
-         RK = OFFSET + K
-*
-*        Determine ith pivot column and swap if necessary
-*
-         PVT = ( K-1 ) + ISAMAX( N-K+1, VN1( K ), 1 )
-         IF( PVT.NE.K ) THEN
-            CALL SSWAP( M, A( 1, PVT ), 1, A( 1, K ), 1 )
-            CALL SSWAP( K-1, F( PVT, 1 ), LDF, F( K, 1 ), LDF )
-            ITEMP = JPVT( PVT )
-            JPVT( PVT ) = JPVT( K )
-            JPVT( K ) = ITEMP
-            VN1( PVT ) = VN1( K )
-            VN2( PVT ) = VN2( K )
-         END IF
-*
-*        Apply previous Householder reflectors to column K:
-*        A(RK:M,K) := A(RK:M,K) - A(RK:M,1:K-1)*F(K,1:K-1)'.
-*
-         IF( K.GT.1 ) THEN
-            CALL SGEMV( 'No transpose', M-RK+1, K-1, -ONE, A( RK, 1 ),
-     $                  LDA, F( K, 1 ), LDF, ONE, A( RK, K ), 1 )
-         END IF
-*
-*        Generate elementary reflector H(k).
-*
-         IF( RK.LT.M ) THEN
-            CALL SLARFG( M-RK+1, A( RK, K ), A( RK+1, K ), 1, TAU( K ) )
-         ELSE
-            CALL SLARFG( 1, A( RK, K ), A( RK, K ), 1, TAU( K ) )
-         END IF
-*
-         AKK = A( RK, K )
-         A( RK, K ) = ONE
-*
-*        Compute Kth column of F:
-*
-*        Compute  F(K+1:N,K) := tau(K)*A(RK:M,K+1:N)'*A(RK:M,K).
-*
-         IF( K.LT.N ) THEN
-            CALL SGEMV( 'Transpose', M-RK+1, N-K, TAU( K ),
-     $                  A( RK, K+1 ), LDA, A( RK, K ), 1, ZERO,
-     $                  F( K+1, K ), 1 )
-         END IF
-*
-*        Padding F(1:K,K) with zeros.
-*
-         DO 20 J = 1, K
-            F( J, K ) = ZERO
-   20    CONTINUE
-*
-*        Incremental updating of F:
-*        F(1:N,K) := F(1:N,K) - tau(K)*F(1:N,1:K-1)*A(RK:M,1:K-1)'
-*                    *A(RK:M,K).
-*
-         IF( K.GT.1 ) THEN
-            CALL SGEMV( 'Transpose', M-RK+1, K-1, -TAU( K ), A( RK, 1 ),
-     $                  LDA, A( RK, K ), 1, ZERO, AUXV( 1 ), 1 )
-*
-            CALL SGEMV( 'No transpose', N, K-1, ONE, F( 1, 1 ), LDF,
-     $                  AUXV( 1 ), 1, ONE, F( 1, K ), 1 )
-         END IF
-*
-*        Update the current row of A:
-*        A(RK,K+1:N) := A(RK,K+1:N) - A(RK,1:K)*F(K+1:N,1:K)'.
-*
-         IF( K.LT.N ) THEN
-            CALL SGEMV( 'No transpose', N-K, K, -ONE, F( K+1, 1 ), LDF,
-     $                  A( RK, 1 ), LDA, ONE, A( RK, K+1 ), LDA )
-         END IF
-*
-*        Update partial column norms.
-*
-         IF( RK.LT.LASTRK ) THEN
-            DO 30 J = K + 1, N
-               IF( VN1( J ).NE.ZERO ) THEN
-*
-*                 NOTE: The following 4 lines follow from the analysis in
-*                 Lapack Working Note 176.
-*
-                  TEMP = ABS( A( RK, J ) ) / VN1( J )
-                  TEMP = MAX( ZERO, ( ONE+TEMP )*( ONE-TEMP ) )
-                  TEMP2 = TEMP*( VN1( J ) / VN2( J ) )**2
-                  IF( TEMP2 .LE. TOL3Z ) THEN
-                     VN2( J ) = REAL( LSTICC )
-                     LSTICC = J
-                  ELSE
-                     VN1( J ) = VN1( J )*SQRT( TEMP )
-                  END IF
-               END IF
-   30       CONTINUE
-         END IF
-*
-         A( RK, K ) = AKK
-*
-*        End of while loop.
-*
-         GO TO 10
-      END IF
-      KB = K
-      RK = OFFSET + KB
-*
-*     Apply the block reflector to the rest of the matrix:
-*     A(OFFSET+KB+1:M,KB+1:N) := A(OFFSET+KB+1:M,KB+1:N) -
-*                         A(OFFSET+KB+1:M,1:KB)*F(KB+1:N,1:KB)'.
-*
-      IF( KB.LT.MIN( N, M-OFFSET ) ) THEN
-         CALL SGEMM( 'No transpose', 'Transpose', M-RK, N-KB, KB, -ONE,
-     $               A( RK+1, 1 ), LDA, F( KB+1, 1 ), LDF, ONE,
-     $               A( RK+1, KB+1 ), LDA )
-      END IF
-*
-*     Recomputation of difficult columns.
-*
-   40 CONTINUE
-      IF( LSTICC.GT.0 ) THEN
-         ITEMP = NINT( VN2( LSTICC ) )
-         VN1( LSTICC ) = SNRM2( M-RK, A( RK+1, LSTICC ), 1 )
-*
-*        NOTE: The computation of VN1( LSTICC ) relies on the fact that 
-*        SNRM2 does not fail on vectors with norm below the value of
-*        SQRT(DLAMCH('S')) 
-*
-         VN2( LSTICC ) = VN1( LSTICC )
-         LSTICC = ITEMP
-         GO TO 40
-      END IF
-*
-      RETURN
-*
-*     End of SLAQPS
-*
-      END
--- a/libcruft/lapack/slaqr0.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,640 +0,0 @@
-      SUBROUTINE SLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI,
-     $                   ILOZ, IHIZ, Z, LDZ, WORK, LWORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, LWORK, N
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      REAL               H( LDH, * ), WI( * ), WORK( * ), WR( * ),
-     $                   Z( LDZ, * )
-*     ..
-*
-*     Purpose
-*     =======
-*
-*     SLAQR0 computes the eigenvalues of a Hessenberg matrix H
-*     and, optionally, the matrices T and Z from the Schur decomposition
-*     H = Z T Z**T, where T is an upper quasi-triangular matrix (the
-*     Schur form), and Z is the orthogonal matrix of Schur vectors.
-*
-*     Optionally Z may be postmultiplied into an input orthogonal
-*     matrix Q so that this routine can give the Schur factorization
-*     of a matrix A which has been reduced to the Hessenberg form H
-*     by the orthogonal matrix Q:  A = Q*H*Q**T = (QZ)*T*(QZ)**T.
-*
-*     Arguments
-*     =========
-*
-*     WANTT   (input) LOGICAL
-*          = .TRUE. : the full Schur form T is required;
-*          = .FALSE.: only eigenvalues are required.
-*
-*     WANTZ   (input) LOGICAL
-*          = .TRUE. : the matrix of Schur vectors Z is required;
-*          = .FALSE.: Schur vectors are not required.
-*
-*     N     (input) INTEGER
-*           The order of the matrix H.  N .GE. 0.
-*
-*     ILO   (input) INTEGER
-*     IHI   (input) INTEGER
-*           It is assumed that H is already upper triangular in rows
-*           and columns 1:ILO-1 and IHI+1:N and, if ILO.GT.1,
-*           H(ILO,ILO-1) is zero. ILO and IHI are normally set by a
-*           previous call to SGEBAL, and then passed to SGEHRD when the
-*           matrix output by SGEBAL is reduced to Hessenberg form.
-*           Otherwise, ILO and IHI should be set to 1 and N,
-*           respectively.  If N.GT.0, then 1.LE.ILO.LE.IHI.LE.N.
-*           If N = 0, then ILO = 1 and IHI = 0.
-*
-*     H     (input/output) REAL array, dimension (LDH,N)
-*           On entry, the upper Hessenberg matrix H.
-*           On exit, if INFO = 0 and WANTT is .TRUE., then H contains
-*           the upper quasi-triangular matrix T from the Schur
-*           decomposition (the Schur form); 2-by-2 diagonal blocks
-*           (corresponding to complex conjugate pairs of eigenvalues)
-*           are returned in standard form, with H(i,i) = H(i+1,i+1)
-*           and H(i+1,i)*H(i,i+1).LT.0. If INFO = 0 and WANTT is
-*           .FALSE., then the contents of H are unspecified on exit.
-*           (The output value of H when INFO.GT.0 is given under the
-*           description of INFO below.)
-*
-*           This subroutine may explicitly set H(i,j) = 0 for i.GT.j and
-*           j = 1, 2, ... ILO-1 or j = IHI+1, IHI+2, ... N.
-*
-*     LDH   (input) INTEGER
-*           The leading dimension of the array H. LDH .GE. max(1,N).
-*
-*     WR    (output) REAL array, dimension (IHI)
-*     WI    (output) REAL array, dimension (IHI)
-*           The real and imaginary parts, respectively, of the computed
-*           eigenvalues of H(ILO:IHI,ILO:IHI) are stored WR(ILO:IHI)
-*           and WI(ILO:IHI). If two eigenvalues are computed as a
-*           complex conjugate pair, they are stored in consecutive
-*           elements of WR and WI, say the i-th and (i+1)th, with
-*           WI(i) .GT. 0 and WI(i+1) .LT. 0. If WANTT is .TRUE., then
-*           the eigenvalues are stored in the same order as on the
-*           diagonal of the Schur form returned in H, with
-*           WR(i) = H(i,i) and, if H(i:i+1,i:i+1) is a 2-by-2 diagonal
-*           block, WI(i) = sqrt(-H(i+1,i)*H(i,i+1)) and
-*           WI(i+1) = -WI(i).
-*
-*     ILOZ     (input) INTEGER
-*     IHIZ     (input) INTEGER
-*           Specify the rows of Z to which transformations must be
-*           applied if WANTZ is .TRUE..
-*           1 .LE. ILOZ .LE. ILO; IHI .LE. IHIZ .LE. N.
-*
-*     Z     (input/output) REAL array, dimension (LDZ,IHI)
-*           If WANTZ is .FALSE., then Z is not referenced.
-*           If WANTZ is .TRUE., then Z(ILO:IHI,ILOZ:IHIZ) is
-*           replaced by Z(ILO:IHI,ILOZ:IHIZ)*U where U is the
-*           orthogonal Schur factor of H(ILO:IHI,ILO:IHI).
-*           (The output value of Z when INFO.GT.0 is given under
-*           the description of INFO below.)
-*
-*     LDZ   (input) INTEGER
-*           The leading dimension of the array Z.  if WANTZ is .TRUE.
-*           then LDZ.GE.MAX(1,IHIZ).  Otherwize, LDZ.GE.1.
-*
-*     WORK  (workspace/output) REAL array, dimension LWORK
-*           On exit, if LWORK = -1, WORK(1) returns an estimate of
-*           the optimal value for LWORK.
-*
-*     LWORK (input) INTEGER
-*           The dimension of the array WORK.  LWORK .GE. max(1,N)
-*           is sufficient, but LWORK typically as large as 6*N may
-*           be required for optimal performance.  A workspace query
-*           to determine the optimal workspace size is recommended.
-*
-*           If LWORK = -1, then SLAQR0 does a workspace query.
-*           In this case, SLAQR0 checks the input parameters and
-*           estimates the optimal workspace size for the given
-*           values of N, ILO and IHI.  The estimate is returned
-*           in WORK(1).  No error message related to LWORK is
-*           issued by XERBLA.  Neither H nor Z are accessed.
-*
-*
-*     INFO  (output) INTEGER
-*             =  0:  successful exit
-*           .GT. 0:  if INFO = i, SLAQR0 failed to compute all of
-*                the eigenvalues.  Elements 1:ilo-1 and i+1:n of WR
-*                and WI contain those eigenvalues which have been
-*                successfully computed.  (Failures are rare.)
-*
-*                If INFO .GT. 0 and WANT is .FALSE., then on exit,
-*                the remaining unconverged eigenvalues are the eigen-
-*                values of the upper Hessenberg matrix rows and
-*                columns ILO through INFO of the final, output
-*                value of H.
-*
-*                If INFO .GT. 0 and WANTT is .TRUE., then on exit
-*
-*           (*)  (initial value of H)*U  = U*(final value of H)
-*
-*                where U is an orthogonal matrix.  The final
-*                value of H is upper Hessenberg and quasi-triangular
-*                in rows and columns INFO+1 through IHI.
-*
-*                If INFO .GT. 0 and WANTZ is .TRUE., then on exit
-*
-*                  (final value of Z(ILO:IHI,ILOZ:IHIZ)
-*                   =  (initial value of Z(ILO:IHI,ILOZ:IHIZ)*U
-*
-*                where U is the orthogonal matrix in (*) (regard-
-*                less of the value of WANTT.)
-*
-*                If INFO .GT. 0 and WANTZ is .FALSE., then Z is not
-*                accessed.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ================================================================
-*     References:
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
-*       Performance, SIAM Journal of Matrix Analysis, volume 23, pages
-*       929--947, 2002.
-*
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part II: Aggressive Early Deflation, SIAM Journal
-*       of Matrix Analysis, volume 23, pages 948--973, 2002.
-*
-*     ================================================================
-*     .. Parameters ..
-*
-*     ==== Matrices of order NTINY or smaller must be processed by
-*     .    SLAHQR because of insufficient subdiagonal scratch space.
-*     .    (This is a hard limit.) ====
-*
-*     ==== Exceptional deflation windows:  try to cure rare
-*     .    slow convergence by increasing the size of the
-*     .    deflation window after KEXNW iterations. =====
-*
-*     ==== Exceptional shifts: try to cure rare slow convergence
-*     .    with ad-hoc exceptional shifts every KEXSH iterations.
-*     .    The constants WILK1 and WILK2 are used to form the
-*     .    exceptional shifts. ====
-*
-      INTEGER            NTINY
-      PARAMETER          ( NTINY = 11 )
-      INTEGER            KEXNW, KEXSH
-      PARAMETER          ( KEXNW = 5, KEXSH = 6 )
-      REAL               WILK1, WILK2
-      PARAMETER          ( WILK1 = 0.75e0, WILK2 = -0.4375e0 )
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0e0, ONE = 1.0e0 )
-*     ..
-*     .. Local Scalars ..
-      REAL               AA, BB, CC, CS, DD, SN, SS, SWAP
-      INTEGER            I, INF, IT, ITMAX, K, KACC22, KBOT, KDU, KS,
-     $                   KT, KTOP, KU, KV, KWH, KWTOP, KWV, LD, LS,
-     $                   LWKOPT, NDFL, NH, NHO, NIBBLE, NMIN, NS, NSMAX,
-     $                   NSR, NVE, NW, NWMAX, NWR
-      LOGICAL            NWINC, SORTED
-      CHARACTER          JBCMPZ*2
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Local Arrays ..
-      REAL               ZDUM( 1, 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLACPY, SLAHQR, SLANV2, SLAQR3, SLAQR4, SLAQR5
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, INT, MAX, MIN, MOD, REAL
-*     ..
-*     .. Executable Statements ..
-      INFO = 0
-*
-*     ==== Quick return for N = 0: nothing to do. ====
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = ONE
-         RETURN
-      END IF
-*
-*     ==== Set up job flags for ILAENV. ====
-*
-      IF( WANTT ) THEN
-         JBCMPZ( 1: 1 ) = 'S'
-      ELSE
-         JBCMPZ( 1: 1 ) = 'E'
-      END IF
-      IF( WANTZ ) THEN
-         JBCMPZ( 2: 2 ) = 'V'
-      ELSE
-         JBCMPZ( 2: 2 ) = 'N'
-      END IF
-*
-*     ==== Tiny matrices must use SLAHQR. ====
-*
-      IF( N.LE.NTINY ) THEN
-*
-*        ==== Estimate optimal workspace. ====
-*
-         LWKOPT = 1
-         IF( LWORK.NE.-1 )
-     $      CALL SLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI,
-     $                   ILOZ, IHIZ, Z, LDZ, INFO )
-      ELSE
-*
-*        ==== Use small bulge multi-shift QR with aggressive early
-*        .    deflation on larger-than-tiny matrices. ====
-*
-*        ==== Hope for the best. ====
-*
-         INFO = 0
-*
-*        ==== NWR = recommended deflation window size.  At this
-*        .    point,  N .GT. NTINY = 11, so there is enough
-*        .    subdiagonal workspace for NWR.GE.2 as required.
-*        .    (In fact, there is enough subdiagonal space for
-*        .    NWR.GE.3.) ====
-*
-         NWR = ILAENV( 13, 'SLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         NWR = MAX( 2, NWR )
-         NWR = MIN( IHI-ILO+1, ( N-1 ) / 3, NWR )
-         NW = NWR
-*
-*        ==== NSR = recommended number of simultaneous shifts.
-*        .    At this point N .GT. NTINY = 11, so there is at
-*        .    enough subdiagonal workspace for NSR to be even
-*        .    and greater than or equal to two as required. ====
-*
-         NSR = ILAENV( 15, 'SLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         NSR = MIN( NSR, ( N+6 ) / 9, IHI-ILO )
-         NSR = MAX( 2, NSR-MOD( NSR, 2 ) )
-*
-*        ==== Estimate optimal workspace ====
-*
-*        ==== Workspace query call to SLAQR3 ====
-*
-         CALL SLAQR3( WANTT, WANTZ, N, ILO, IHI, NWR+1, H, LDH, ILOZ,
-     $                IHIZ, Z, LDZ, LS, LD, WR, WI, H, LDH, N, H, LDH,
-     $                N, H, LDH, WORK, -1 )
-*
-*        ==== Optimal workspace = MAX(SLAQR5, SLAQR3) ====
-*
-         LWKOPT = MAX( 3*NSR / 2, INT( WORK( 1 ) ) )
-*
-*        ==== Quick return in case of workspace query. ====
-*
-         IF( LWORK.EQ.-1 ) THEN
-            WORK( 1 ) = REAL( LWKOPT )
-            RETURN
-         END IF
-*
-*        ==== SLAHQR/SLAQR0 crossover point ====
-*
-         NMIN = ILAENV( 12, 'SLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         NMIN = MAX( NTINY, NMIN )
-*
-*        ==== Nibble crossover point ====
-*
-         NIBBLE = ILAENV( 14, 'SLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         NIBBLE = MAX( 0, NIBBLE )
-*
-*        ==== Accumulate reflections during ttswp?  Use block
-*        .    2-by-2 structure during matrix-matrix multiply? ====
-*
-         KACC22 = ILAENV( 16, 'SLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         KACC22 = MAX( 0, KACC22 )
-         KACC22 = MIN( 2, KACC22 )
-*
-*        ==== NWMAX = the largest possible deflation window for
-*        .    which there is sufficient workspace. ====
-*
-         NWMAX = MIN( ( N-1 ) / 3, LWORK / 2 )
-*
-*        ==== NSMAX = the Largest number of simultaneous shifts
-*        .    for which there is sufficient workspace. ====
-*
-         NSMAX = MIN( ( N+6 ) / 9, 2*LWORK / 3 )
-         NSMAX = NSMAX - MOD( NSMAX, 2 )
-*
-*        ==== NDFL: an iteration count restarted at deflation. ====
-*
-         NDFL = 1
-*
-*        ==== ITMAX = iteration limit ====
-*
-         ITMAX = MAX( 30, 2*KEXSH )*MAX( 10, ( IHI-ILO+1 ) )
-*
-*        ==== Last row and column in the active block ====
-*
-         KBOT = IHI
-*
-*        ==== Main Loop ====
-*
-         DO 80 IT = 1, ITMAX
-*
-*           ==== Done when KBOT falls below ILO ====
-*
-            IF( KBOT.LT.ILO )
-     $         GO TO 90
-*
-*           ==== Locate active block ====
-*
-            DO 10 K = KBOT, ILO + 1, -1
-               IF( H( K, K-1 ).EQ.ZERO )
-     $            GO TO 20
-   10       CONTINUE
-            K = ILO
-   20       CONTINUE
-            KTOP = K
-*
-*           ==== Select deflation window size ====
-*
-            NH = KBOT - KTOP + 1
-            IF( NDFL.LT.KEXNW .OR. NH.LT.NW ) THEN
-*
-*              ==== Typical deflation window.  If possible and
-*              .    advisable, nibble the entire active block.
-*              .    If not, use size NWR or NWR+1 depending upon
-*              .    which has the smaller corresponding subdiagonal
-*              .    entry (a heuristic). ====
-*
-               NWINC = .TRUE.
-               IF( NH.LE.MIN( NMIN, NWMAX ) ) THEN
-                  NW = NH
-               ELSE
-                  NW = MIN( NWR, NH, NWMAX )
-                  IF( NW.LT.NWMAX ) THEN
-                     IF( NW.GE.NH-1 ) THEN
-                        NW = NH
-                     ELSE
-                        KWTOP = KBOT - NW + 1
-                        IF( ABS( H( KWTOP, KWTOP-1 ) ).GT.
-     $                      ABS( H( KWTOP-1, KWTOP-2 ) ) )NW = NW + 1
-                     END IF
-                  END IF
-               END IF
-            ELSE
-*
-*              ==== Exceptional deflation window.  If there have
-*              .    been no deflations in KEXNW or more iterations,
-*              .    then vary the deflation window size.   At first,
-*              .    because, larger windows are, in general, more
-*              .    powerful than smaller ones, rapidly increase the
-*              .    window up to the maximum reasonable and possible.
-*              .    Then maybe try a slightly smaller window.  ====
-*
-               IF( NWINC .AND. NW.LT.MIN( NWMAX, NH ) ) THEN
-                  NW = MIN( NWMAX, NH, 2*NW )
-               ELSE
-                  NWINC = .FALSE.
-                  IF( NW.EQ.NH .AND. NH.GT.2 )
-     $               NW = NH - 1
-               END IF
-            END IF
-*
-*           ==== Aggressive early deflation:
-*           .    split workspace under the subdiagonal into
-*           .      - an nw-by-nw work array V in the lower
-*           .        left-hand-corner,
-*           .      - an NW-by-at-least-NW-but-more-is-better
-*           .        (NW-by-NHO) horizontal work array along
-*           .        the bottom edge,
-*           .      - an at-least-NW-but-more-is-better (NHV-by-NW)
-*           .        vertical work array along the left-hand-edge.
-*           .        ====
-*
-            KV = N - NW + 1
-            KT = NW + 1
-            NHO = ( N-NW-1 ) - KT + 1
-            KWV = NW + 2
-            NVE = ( N-NW ) - KWV + 1
-*
-*           ==== Aggressive early deflation ====
-*
-            CALL SLAQR3( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
-     $                   IHIZ, Z, LDZ, LS, LD, WR, WI, H( KV, 1 ), LDH,
-     $                   NHO, H( KV, KT ), LDH, NVE, H( KWV, 1 ), LDH,
-     $                   WORK, LWORK )
-*
-*           ==== Adjust KBOT accounting for new deflations. ====
-*
-            KBOT = KBOT - LD
-*
-*           ==== KS points to the shifts. ====
-*
-            KS = KBOT - LS + 1
-*
-*           ==== Skip an expensive QR sweep if there is a (partly
-*           .    heuristic) reason to expect that many eigenvalues
-*           .    will deflate without it.  Here, the QR sweep is
-*           .    skipped if many eigenvalues have just been deflated
-*           .    or if the remaining active block is small.
-*
-            IF( ( LD.EQ.0 ) .OR. ( ( 100*LD.LE.NW*NIBBLE ) .AND. ( KBOT-
-     $          KTOP+1.GT.MIN( NMIN, NWMAX ) ) ) ) THEN
-*
-*              ==== NS = nominal number of simultaneous shifts.
-*              .    This may be lowered (slightly) if SLAQR3
-*              .    did not provide that many shifts. ====
-*
-               NS = MIN( NSMAX, NSR, MAX( 2, KBOT-KTOP ) )
-               NS = NS - MOD( NS, 2 )
-*
-*              ==== If there have been no deflations
-*              .    in a multiple of KEXSH iterations,
-*              .    then try exceptional shifts.
-*              .    Otherwise use shifts provided by
-*              .    SLAQR3 above or from the eigenvalues
-*              .    of a trailing principal submatrix. ====
-*
-               IF( MOD( NDFL, KEXSH ).EQ.0 ) THEN
-                  KS = KBOT - NS + 1
-                  DO 30 I = KBOT, MAX( KS+1, KTOP+2 ), -2
-                     SS = ABS( H( I, I-1 ) ) + ABS( H( I-1, I-2 ) )
-                     AA = WILK1*SS + H( I, I )
-                     BB = SS
-                     CC = WILK2*SS
-                     DD = AA
-                     CALL SLANV2( AA, BB, CC, DD, WR( I-1 ), WI( I-1 ),
-     $                            WR( I ), WI( I ), CS, SN )
-   30             CONTINUE
-                  IF( KS.EQ.KTOP ) THEN
-                     WR( KS+1 ) = H( KS+1, KS+1 )
-                     WI( KS+1 ) = ZERO
-                     WR( KS ) = WR( KS+1 )
-                     WI( KS ) = WI( KS+1 )
-                  END IF
-               ELSE
-*
-*                 ==== Got NS/2 or fewer shifts? Use SLAQR4 or
-*                 .    SLAHQR on a trailing principal submatrix to
-*                 .    get more. (Since NS.LE.NSMAX.LE.(N+6)/9,
-*                 .    there is enough space below the subdiagonal
-*                 .    to fit an NS-by-NS scratch array.) ====
-*
-                  IF( KBOT-KS+1.LE.NS / 2 ) THEN
-                     KS = KBOT - NS + 1
-                     KT = N - NS + 1
-                     CALL SLACPY( 'A', NS, NS, H( KS, KS ), LDH,
-     $                            H( KT, 1 ), LDH )
-                     IF( NS.GT.NMIN ) THEN
-                        CALL SLAQR4( .false., .false., NS, 1, NS,
-     $                               H( KT, 1 ), LDH, WR( KS ),
-     $                               WI( KS ), 1, 1, ZDUM, 1, WORK,
-     $                               LWORK, INF )
-                     ELSE
-                        CALL SLAHQR( .false., .false., NS, 1, NS,
-     $                               H( KT, 1 ), LDH, WR( KS ),
-     $                               WI( KS ), 1, 1, ZDUM, 1, INF )
-                     END IF
-                     KS = KS + INF
-*
-*                    ==== In case of a rare QR failure use
-*                    .    eigenvalues of the trailing 2-by-2
-*                    .    principal submatrix.  ====
-*
-                     IF( KS.GE.KBOT ) THEN
-                        AA = H( KBOT-1, KBOT-1 )
-                        CC = H( KBOT, KBOT-1 )
-                        BB = H( KBOT-1, KBOT )
-                        DD = H( KBOT, KBOT )
-                        CALL SLANV2( AA, BB, CC, DD, WR( KBOT-1 ),
-     $                               WI( KBOT-1 ), WR( KBOT ),
-     $                               WI( KBOT ), CS, SN )
-                        KS = KBOT - 1
-                     END IF
-                  END IF
-*
-                  IF( KBOT-KS+1.GT.NS ) THEN
-*
-*                    ==== Sort the shifts (Helps a little)
-*                    .    Bubble sort keeps complex conjugate
-*                    .    pairs together. ====
-*
-                     SORTED = .false.
-                     DO 50 K = KBOT, KS + 1, -1
-                        IF( SORTED )
-     $                     GO TO 60
-                        SORTED = .true.
-                        DO 40 I = KS, K - 1
-                           IF( ABS( WR( I ) )+ABS( WI( I ) ).LT.
-     $                         ABS( WR( I+1 ) )+ABS( WI( I+1 ) ) ) THEN
-                              SORTED = .false.
-*
-                              SWAP = WR( I )
-                              WR( I ) = WR( I+1 )
-                              WR( I+1 ) = SWAP
-*
-                              SWAP = WI( I )
-                              WI( I ) = WI( I+1 )
-                              WI( I+1 ) = SWAP
-                           END IF
-   40                   CONTINUE
-   50                CONTINUE
-   60                CONTINUE
-                  END IF
-*
-*                 ==== Shuffle shifts into pairs of real shifts
-*                 .    and pairs of complex conjugate shifts
-*                 .    assuming complex conjugate shifts are
-*                 .    already adjacent to one another. (Yes,
-*                 .    they are.)  ====
-*
-                  DO 70 I = KBOT, KS + 2, -2
-                     IF( WI( I ).NE.-WI( I-1 ) ) THEN
-*
-                        SWAP = WR( I )
-                        WR( I ) = WR( I-1 )
-                        WR( I-1 ) = WR( I-2 )
-                        WR( I-2 ) = SWAP
-*
-                        SWAP = WI( I )
-                        WI( I ) = WI( I-1 )
-                        WI( I-1 ) = WI( I-2 )
-                        WI( I-2 ) = SWAP
-                     END IF
-   70             CONTINUE
-               END IF
-*
-*              ==== If there are only two shifts and both are
-*              .    real, then use only one.  ====
-*
-               IF( KBOT-KS+1.EQ.2 ) THEN
-                  IF( WI( KBOT ).EQ.ZERO ) THEN
-                     IF( ABS( WR( KBOT )-H( KBOT, KBOT ) ).LT.
-     $                   ABS( WR( KBOT-1 )-H( KBOT, KBOT ) ) ) THEN
-                        WR( KBOT-1 ) = WR( KBOT )
-                     ELSE
-                        WR( KBOT ) = WR( KBOT-1 )
-                     END IF
-                  END IF
-               END IF
-*
-*              ==== Use up to NS of the the smallest magnatiude
-*              .    shifts.  If there aren't NS shifts available,
-*              .    then use them all, possibly dropping one to
-*              .    make the number of shifts even. ====
-*
-               NS = MIN( NS, KBOT-KS+1 )
-               NS = NS - MOD( NS, 2 )
-               KS = KBOT - NS + 1
-*
-*              ==== Small-bulge multi-shift QR sweep:
-*              .    split workspace under the subdiagonal into
-*              .    - a KDU-by-KDU work array U in the lower
-*              .      left-hand-corner,
-*              .    - a KDU-by-at-least-KDU-but-more-is-better
-*              .      (KDU-by-NHo) horizontal work array WH along
-*              .      the bottom edge,
-*              .    - and an at-least-KDU-but-more-is-better-by-KDU
-*              .      (NVE-by-KDU) vertical work WV arrow along
-*              .      the left-hand-edge. ====
-*
-               KDU = 3*NS - 3
-               KU = N - KDU + 1
-               KWH = KDU + 1
-               NHO = ( N-KDU+1-4 ) - ( KDU+1 ) + 1
-               KWV = KDU + 4
-               NVE = N - KDU - KWV + 1
-*
-*              ==== Small-bulge multi-shift QR sweep ====
-*
-               CALL SLAQR5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NS,
-     $                      WR( KS ), WI( KS ), H, LDH, ILOZ, IHIZ, Z,
-     $                      LDZ, WORK, 3, H( KU, 1 ), LDH, NVE,
-     $                      H( KWV, 1 ), LDH, NHO, H( KU, KWH ), LDH )
-            END IF
-*
-*           ==== Note progress (or the lack of it). ====
-*
-            IF( LD.GT.0 ) THEN
-               NDFL = 1
-            ELSE
-               NDFL = NDFL + 1
-            END IF
-*
-*           ==== End of main loop ====
-   80    CONTINUE
-*
-*        ==== Iteration limit exceeded.  Set INFO to show where
-*        .    the problem occurred and exit. ====
-*
-         INFO = KBOT
-   90    CONTINUE
-      END IF
-*
-*     ==== Return the optimal value of LWORK. ====
-*
-      WORK( 1 ) = REAL( LWKOPT )
-*
-*     ==== End of SLAQR0 ====
-*
-      END
--- a/libcruft/lapack/slaqr1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-      SUBROUTINE SLAQR1( N, H, LDH, SR1, SI1, SR2, SI2, V )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      REAL               SI1, SI2, SR1, SR2
-      INTEGER            LDH, N
-*     ..
-*     .. Array Arguments ..
-      REAL               H( LDH, * ), V( * )
-*     ..
-*
-*       Given a 2-by-2 or 3-by-3 matrix H, SLAQR1 sets v to a
-*       scalar multiple of the first column of the product
-*
-*       (*)  K = (H - (sr1 + i*si1)*I)*(H - (sr2 + i*si2)*I)
-*
-*       scaling to avoid overflows and most underflows. It
-*       is assumed that either
-*
-*               1) sr1 = sr2 and si1 = -si2
-*           or
-*               2) si1 = si2 = 0.
-*
-*       This is useful for starting double implicit shift bulges
-*       in the QR algorithm.
-*
-*
-*       N      (input) integer
-*              Order of the matrix H. N must be either 2 or 3.
-*
-*       H      (input) REAL array of dimension (LDH,N)
-*              The 2-by-2 or 3-by-3 matrix H in (*).
-*
-*       LDH    (input) integer
-*              The leading dimension of H as declared in
-*              the calling procedure.  LDH.GE.N
-*
-*       SR1    (input) REAL
-*       SI1    The shifts in (*).
-*       SR2
-*       SI2
-*
-*       V      (output) REAL array of dimension N
-*              A scalar multiple of the first column of the
-*              matrix K in (*).
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0e0 )
-*     ..
-*     .. Local Scalars ..
-      REAL               H21S, H31S, S
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. Executable Statements ..
-      IF( N.EQ.2 ) THEN
-         S = ABS( H( 1, 1 )-SR2 ) + ABS( SI2 ) + ABS( H( 2, 1 ) )
-         IF( S.EQ.ZERO ) THEN
-            V( 1 ) = ZERO
-            V( 2 ) = ZERO
-         ELSE
-            H21S = H( 2, 1 ) / S
-            V( 1 ) = H21S*H( 1, 2 ) + ( H( 1, 1 )-SR1 )*
-     $               ( ( H( 1, 1 )-SR2 ) / S ) - SI1*( SI2 / S )
-            V( 2 ) = H21S*( H( 1, 1 )+H( 2, 2 )-SR1-SR2 )
-         END IF
-      ELSE
-         S = ABS( H( 1, 1 )-SR2 ) + ABS( SI2 ) + ABS( H( 2, 1 ) ) +
-     $       ABS( H( 3, 1 ) )
-         IF( S.EQ.ZERO ) THEN
-            V( 1 ) = ZERO
-            V( 2 ) = ZERO
-            V( 3 ) = ZERO
-         ELSE
-            H21S = H( 2, 1 ) / S
-            H31S = H( 3, 1 ) / S
-            V( 1 ) = ( H( 1, 1 )-SR1 )*( ( H( 1, 1 )-SR2 ) / S ) -
-     $               SI1*( SI2 / S ) + H( 1, 2 )*H21S + H( 1, 3 )*H31S
-            V( 2 ) = H21S*( H( 1, 1 )+H( 2, 2 )-SR1-SR2 ) +
-     $               H( 2, 3 )*H31S
-            V( 3 ) = H31S*( H( 1, 1 )+H( 3, 3 )-SR1-SR2 ) +
-     $               H21S*H( 3, 2 )
-         END IF
-      END IF
-      END
--- a/libcruft/lapack/slaqr2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,551 +0,0 @@
-      SUBROUTINE SLAQR2( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
-     $                   IHIZ, Z, LDZ, NS, ND, SR, SI, V, LDV, NH, T,
-     $                   LDT, NV, WV, LDWV, WORK, LWORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHIZ, ILOZ, KBOT, KTOP, LDH, LDT, LDV, LDWV,
-     $                   LDZ, LWORK, N, ND, NH, NS, NV, NW
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      REAL               H( LDH, * ), SI( * ), SR( * ), T( LDT, * ),
-     $                   V( LDV, * ), WORK( * ), WV( LDWV, * ),
-     $                   Z( LDZ, * )
-*     ..
-*
-*     This subroutine is identical to SLAQR3 except that it avoids
-*     recursion by calling SLAHQR instead of SLAQR4.
-*
-*
-*     ******************************************************************
-*     Aggressive early deflation:
-*
-*     This subroutine accepts as input an upper Hessenberg matrix
-*     H and performs an orthogonal similarity transformation
-*     designed to detect and deflate fully converged eigenvalues from
-*     a trailing principal submatrix.  On output H has been over-
-*     written by a new Hessenberg matrix that is a perturbation of
-*     an orthogonal similarity transformation of H.  It is to be
-*     hoped that the final version of H has many zero subdiagonal
-*     entries.
-*
-*     ******************************************************************
-*     WANTT   (input) LOGICAL
-*          If .TRUE., then the Hessenberg matrix H is fully updated
-*          so that the quasi-triangular Schur factor may be
-*          computed (in cooperation with the calling subroutine).
-*          If .FALSE., then only enough of H is updated to preserve
-*          the eigenvalues.
-*
-*     WANTZ   (input) LOGICAL
-*          If .TRUE., then the orthogonal matrix Z is updated so
-*          so that the orthogonal Schur factor may be computed
-*          (in cooperation with the calling subroutine).
-*          If .FALSE., then Z is not referenced.
-*
-*     N       (input) INTEGER
-*          The order of the matrix H and (if WANTZ is .TRUE.) the
-*          order of the orthogonal matrix Z.
-*
-*     KTOP    (input) INTEGER
-*          It is assumed that either KTOP = 1 or H(KTOP,KTOP-1)=0.
-*          KBOT and KTOP together determine an isolated block
-*          along the diagonal of the Hessenberg matrix.
-*
-*     KBOT    (input) INTEGER
-*          It is assumed without a check that either
-*          KBOT = N or H(KBOT+1,KBOT)=0.  KBOT and KTOP together
-*          determine an isolated block along the diagonal of the
-*          Hessenberg matrix.
-*
-*     NW      (input) INTEGER
-*          Deflation window size.  1 .LE. NW .LE. (KBOT-KTOP+1).
-*
-*     H       (input/output) REAL array, dimension (LDH,N)
-*          On input the initial N-by-N section of H stores the
-*          Hessenberg matrix undergoing aggressive early deflation.
-*          On output H has been transformed by an orthogonal
-*          similarity transformation, perturbed, and the returned
-*          to Hessenberg form that (it is to be hoped) has some
-*          zero subdiagonal entries.
-*
-*     LDH     (input) integer
-*          Leading dimension of H just as declared in the calling
-*          subroutine.  N .LE. LDH
-*
-*     ILOZ    (input) INTEGER
-*     IHIZ    (input) INTEGER
-*          Specify the rows of Z to which transformations must be
-*          applied if WANTZ is .TRUE.. 1 .LE. ILOZ .LE. IHIZ .LE. N.
-*
-*     Z       (input/output) REAL array, dimension (LDZ,IHI)
-*          IF WANTZ is .TRUE., then on output, the orthogonal
-*          similarity transformation mentioned above has been
-*          accumulated into Z(ILOZ:IHIZ,ILO:IHI) from the right.
-*          If WANTZ is .FALSE., then Z is unreferenced.
-*
-*     LDZ     (input) integer
-*          The leading dimension of Z just as declared in the
-*          calling subroutine.  1 .LE. LDZ.
-*
-*     NS      (output) integer
-*          The number of unconverged (ie approximate) eigenvalues
-*          returned in SR and SI that may be used as shifts by the
-*          calling subroutine.
-*
-*     ND      (output) integer
-*          The number of converged eigenvalues uncovered by this
-*          subroutine.
-*
-*     SR      (output) REAL array, dimension KBOT
-*     SI      (output) REAL array, dimension KBOT
-*          On output, the real and imaginary parts of approximate
-*          eigenvalues that may be used for shifts are stored in
-*          SR(KBOT-ND-NS+1) through SR(KBOT-ND) and
-*          SI(KBOT-ND-NS+1) through SI(KBOT-ND), respectively.
-*          The real and imaginary parts of converged eigenvalues
-*          are stored in SR(KBOT-ND+1) through SR(KBOT) and
-*          SI(KBOT-ND+1) through SI(KBOT), respectively.
-*
-*     V       (workspace) REAL array, dimension (LDV,NW)
-*          An NW-by-NW work array.
-*
-*     LDV     (input) integer scalar
-*          The leading dimension of V just as declared in the
-*          calling subroutine.  NW .LE. LDV
-*
-*     NH      (input) integer scalar
-*          The number of columns of T.  NH.GE.NW.
-*
-*     T       (workspace) REAL array, dimension (LDT,NW)
-*
-*     LDT     (input) integer
-*          The leading dimension of T just as declared in the
-*          calling subroutine.  NW .LE. LDT
-*
-*     NV      (input) integer
-*          The number of rows of work array WV available for
-*          workspace.  NV.GE.NW.
-*
-*     WV      (workspace) REAL array, dimension (LDWV,NW)
-*
-*     LDWV    (input) integer
-*          The leading dimension of W just as declared in the
-*          calling subroutine.  NW .LE. LDV
-*
-*     WORK    (workspace) REAL array, dimension LWORK.
-*          On exit, WORK(1) is set to an estimate of the optimal value
-*          of LWORK for the given values of N, NW, KTOP and KBOT.
-*
-*     LWORK   (input) integer
-*          The dimension of the work array WORK.  LWORK = 2*NW
-*          suffices, but greater efficiency may result from larger
-*          values of LWORK.
-*
-*          If LWORK = -1, then a workspace query is assumed; SLAQR2
-*          only estimates the optimal workspace size for the given
-*          values of N, NW, KTOP and KBOT.  The estimate is returned
-*          in WORK(1).  No error message related to LWORK is issued
-*          by XERBLA.  Neither H nor Z are accessed.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ==================================================================
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0e0, ONE = 1.0e0 )
-*     ..
-*     .. Local Scalars ..
-      REAL               AA, BB, BETA, CC, CS, DD, EVI, EVK, FOO, S,
-     $                   SAFMAX, SAFMIN, SMLNUM, SN, TAU, ULP
-      INTEGER            I, IFST, ILST, INFO, INFQR, J, JW, K, KCOL,
-     $                   KEND, KLN, KROW, KWTOP, LTOP, LWK1, LWK2,
-     $                   LWKOPT
-      LOGICAL            BULGE, SORTED
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      EXTERNAL           SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SGEHRD, SGEMM, SLABAD, SLACPY, SLAHQR,
-     $                   SLANV2, SLARF, SLARFG, SLASET, SORGHR, STREXC
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, INT, MAX, MIN, REAL, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     ==== Estimate optimal workspace. ====
-*
-      JW = MIN( NW, KBOT-KTOP+1 )
-      IF( JW.LE.2 ) THEN
-         LWKOPT = 1
-      ELSE
-*
-*        ==== Workspace query call to SGEHRD ====
-*
-         CALL SGEHRD( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
-         LWK1 = INT( WORK( 1 ) )
-*
-*        ==== Workspace query call to SORGHR ====
-*
-         CALL SORGHR( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
-         LWK2 = INT( WORK( 1 ) )
-*
-*        ==== Optimal workspace ====
-*
-         LWKOPT = JW + MAX( LWK1, LWK2 )
-      END IF
-*
-*     ==== Quick return in case of workspace query. ====
-*
-      IF( LWORK.EQ.-1 ) THEN
-         WORK( 1 ) = REAL( LWKOPT )
-         RETURN
-      END IF
-*
-*     ==== Nothing to do ...
-*     ... for an empty active block ... ====
-      NS = 0
-      ND = 0
-      IF( KTOP.GT.KBOT )
-     $   RETURN
-*     ... nor for an empty deflation window. ====
-      IF( NW.LT.1 )
-     $   RETURN
-*
-*     ==== Machine constants ====
-*
-      SAFMIN = SLAMCH( 'SAFE MINIMUM' )
-      SAFMAX = ONE / SAFMIN
-      CALL SLABAD( SAFMIN, SAFMAX )
-      ULP = SLAMCH( 'PRECISION' )
-      SMLNUM = SAFMIN*( REAL( N ) / ULP )
-*
-*     ==== Setup deflation window ====
-*
-      JW = MIN( NW, KBOT-KTOP+1 )
-      KWTOP = KBOT - JW + 1
-      IF( KWTOP.EQ.KTOP ) THEN
-         S = ZERO
-      ELSE
-         S = H( KWTOP, KWTOP-1 )
-      END IF
-*
-      IF( KBOT.EQ.KWTOP ) THEN
-*
-*        ==== 1-by-1 deflation window: not much to do ====
-*
-         SR( KWTOP ) = H( KWTOP, KWTOP )
-         SI( KWTOP ) = ZERO
-         NS = 1
-         ND = 0
-         IF( ABS( S ).LE.MAX( SMLNUM, ULP*ABS( H( KWTOP, KWTOP ) ) ) )
-     $        THEN
-            NS = 0
-            ND = 1
-            IF( KWTOP.GT.KTOP )
-     $         H( KWTOP, KWTOP-1 ) = ZERO
-         END IF
-         RETURN
-      END IF
-*
-*     ==== Convert to spike-triangular form.  (In case of a
-*     .    rare QR failure, this routine continues to do
-*     .    aggressive early deflation using that part of
-*     .    the deflation window that converged using INFQR
-*     .    here and there to keep track.) ====
-*
-      CALL SLACPY( 'U', JW, JW, H( KWTOP, KWTOP ), LDH, T, LDT )
-      CALL SCOPY( JW-1, H( KWTOP+1, KWTOP ), LDH+1, T( 2, 1 ), LDT+1 )
-*
-      CALL SLASET( 'A', JW, JW, ZERO, ONE, V, LDV )
-      CALL SLAHQR( .true., .true., JW, 1, JW, T, LDT, SR( KWTOP ),
-     $             SI( KWTOP ), 1, JW, V, LDV, INFQR )
-*
-*     ==== STREXC needs a clean margin near the diagonal ====
-*
-      DO 10 J = 1, JW - 3
-         T( J+2, J ) = ZERO
-         T( J+3, J ) = ZERO
-   10 CONTINUE
-      IF( JW.GT.2 )
-     $   T( JW, JW-2 ) = ZERO
-*
-*     ==== Deflation detection loop ====
-*
-      NS = JW
-      ILST = INFQR + 1
-   20 CONTINUE
-      IF( ILST.LE.NS ) THEN
-         IF( NS.EQ.1 ) THEN
-            BULGE = .FALSE.
-         ELSE
-            BULGE = T( NS, NS-1 ).NE.ZERO
-         END IF
-*
-*        ==== Small spike tip test for deflation ====
-*
-         IF( .NOT.BULGE ) THEN
-*
-*           ==== Real eigenvalue ====
-*
-            FOO = ABS( T( NS, NS ) )
-            IF( FOO.EQ.ZERO )
-     $         FOO = ABS( S )
-            IF( ABS( S*V( 1, NS ) ).LE.MAX( SMLNUM, ULP*FOO ) ) THEN
-*
-*              ==== Deflatable ====
-*
-               NS = NS - 1
-            ELSE
-*
-*              ==== Undeflatable.   Move it up out of the way.
-*              .    (STREXC can not fail in this case.) ====
-*
-               IFST = NS
-               CALL STREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, WORK,
-     $                      INFO )
-               ILST = ILST + 1
-            END IF
-         ELSE
-*
-*           ==== Complex conjugate pair ====
-*
-            FOO = ABS( T( NS, NS ) ) + SQRT( ABS( T( NS, NS-1 ) ) )*
-     $            SQRT( ABS( T( NS-1, NS ) ) )
-            IF( FOO.EQ.ZERO )
-     $         FOO = ABS( S )
-            IF( MAX( ABS( S*V( 1, NS ) ), ABS( S*V( 1, NS-1 ) ) ).LE.
-     $          MAX( SMLNUM, ULP*FOO ) ) THEN
-*
-*              ==== Deflatable ====
-*
-               NS = NS - 2
-            ELSE
-*
-*              ==== Undflatable. Move them up out of the way.
-*              .    Fortunately, STREXC does the right thing with
-*              .    ILST in case of a rare exchange failure. ====
-*
-               IFST = NS
-               CALL STREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, WORK,
-     $                      INFO )
-               ILST = ILST + 2
-            END IF
-         END IF
-*
-*        ==== End deflation detection loop ====
-*
-         GO TO 20
-      END IF
-*
-*        ==== Return to Hessenberg form ====
-*
-      IF( NS.EQ.0 )
-     $   S = ZERO
-*
-      IF( NS.LT.JW ) THEN
-*
-*        ==== sorting diagonal blocks of T improves accuracy for
-*        .    graded matrices.  Bubble sort deals well with
-*        .    exchange failures. ====
-*
-         SORTED = .false.
-         I = NS + 1
-   30    CONTINUE
-         IF( SORTED )
-     $      GO TO 50
-         SORTED = .true.
-*
-         KEND = I - 1
-         I = INFQR + 1
-         IF( I.EQ.NS ) THEN
-            K = I + 1
-         ELSE IF( T( I+1, I ).EQ.ZERO ) THEN
-            K = I + 1
-         ELSE
-            K = I + 2
-         END IF
-   40    CONTINUE
-         IF( K.LE.KEND ) THEN
-            IF( K.EQ.I+1 ) THEN
-               EVI = ABS( T( I, I ) )
-            ELSE
-               EVI = ABS( T( I, I ) ) + SQRT( ABS( T( I+1, I ) ) )*
-     $               SQRT( ABS( T( I, I+1 ) ) )
-            END IF
-*
-            IF( K.EQ.KEND ) THEN
-               EVK = ABS( T( K, K ) )
-            ELSE IF( T( K+1, K ).EQ.ZERO ) THEN
-               EVK = ABS( T( K, K ) )
-            ELSE
-               EVK = ABS( T( K, K ) ) + SQRT( ABS( T( K+1, K ) ) )*
-     $               SQRT( ABS( T( K, K+1 ) ) )
-            END IF
-*
-            IF( EVI.GE.EVK ) THEN
-               I = K
-            ELSE
-               SORTED = .false.
-               IFST = I
-               ILST = K
-               CALL STREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, WORK,
-     $                      INFO )
-               IF( INFO.EQ.0 ) THEN
-                  I = ILST
-               ELSE
-                  I = K
-               END IF
-            END IF
-            IF( I.EQ.KEND ) THEN
-               K = I + 1
-            ELSE IF( T( I+1, I ).EQ.ZERO ) THEN
-               K = I + 1
-            ELSE
-               K = I + 2
-            END IF
-            GO TO 40
-         END IF
-         GO TO 30
-   50    CONTINUE
-      END IF
-*
-*     ==== Restore shift/eigenvalue array from T ====
-*
-      I = JW
-   60 CONTINUE
-      IF( I.GE.INFQR+1 ) THEN
-         IF( I.EQ.INFQR+1 ) THEN
-            SR( KWTOP+I-1 ) = T( I, I )
-            SI( KWTOP+I-1 ) = ZERO
-            I = I - 1
-         ELSE IF( T( I, I-1 ).EQ.ZERO ) THEN
-            SR( KWTOP+I-1 ) = T( I, I )
-            SI( KWTOP+I-1 ) = ZERO
-            I = I - 1
-         ELSE
-            AA = T( I-1, I-1 )
-            CC = T( I, I-1 )
-            BB = T( I-1, I )
-            DD = T( I, I )
-            CALL SLANV2( AA, BB, CC, DD, SR( KWTOP+I-2 ),
-     $                   SI( KWTOP+I-2 ), SR( KWTOP+I-1 ),
-     $                   SI( KWTOP+I-1 ), CS, SN )
-            I = I - 2
-         END IF
-         GO TO 60
-      END IF
-*
-      IF( NS.LT.JW .OR. S.EQ.ZERO ) THEN
-         IF( NS.GT.1 .AND. S.NE.ZERO ) THEN
-*
-*           ==== Reflect spike back into lower triangle ====
-*
-            CALL SCOPY( NS, V, LDV, WORK, 1 )
-            BETA = WORK( 1 )
-            CALL SLARFG( NS, BETA, WORK( 2 ), 1, TAU )
-            WORK( 1 ) = ONE
-*
-            CALL SLASET( 'L', JW-2, JW-2, ZERO, ZERO, T( 3, 1 ), LDT )
-*
-            CALL SLARF( 'L', NS, JW, WORK, 1, TAU, T, LDT,
-     $                  WORK( JW+1 ) )
-            CALL SLARF( 'R', NS, NS, WORK, 1, TAU, T, LDT,
-     $                  WORK( JW+1 ) )
-            CALL SLARF( 'R', JW, NS, WORK, 1, TAU, V, LDV,
-     $                  WORK( JW+1 ) )
-*
-            CALL SGEHRD( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
-     $                   LWORK-JW, INFO )
-         END IF
-*
-*        ==== Copy updated reduced window into place ====
-*
-         IF( KWTOP.GT.1 )
-     $      H( KWTOP, KWTOP-1 ) = S*V( 1, 1 )
-         CALL SLACPY( 'U', JW, JW, T, LDT, H( KWTOP, KWTOP ), LDH )
-         CALL SCOPY( JW-1, T( 2, 1 ), LDT+1, H( KWTOP+1, KWTOP ),
-     $               LDH+1 )
-*
-*        ==== Accumulate orthogonal matrix in order update
-*        .    H and Z, if requested.  (A modified version
-*        .    of  SORGHR that accumulates block Householder
-*        .    transformations into V directly might be
-*        .    marginally more efficient than the following.) ====
-*
-         IF( NS.GT.1 .AND. S.NE.ZERO ) THEN
-            CALL SORGHR( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
-     $                   LWORK-JW, INFO )
-            CALL SGEMM( 'N', 'N', JW, NS, NS, ONE, V, LDV, T, LDT, ZERO,
-     $                  WV, LDWV )
-            CALL SLACPY( 'A', JW, NS, WV, LDWV, V, LDV )
-         END IF
-*
-*        ==== Update vertical slab in H ====
-*
-         IF( WANTT ) THEN
-            LTOP = 1
-         ELSE
-            LTOP = KTOP
-         END IF
-         DO 70 KROW = LTOP, KWTOP - 1, NV
-            KLN = MIN( NV, KWTOP-KROW )
-            CALL SGEMM( 'N', 'N', KLN, JW, JW, ONE, H( KROW, KWTOP ),
-     $                  LDH, V, LDV, ZERO, WV, LDWV )
-            CALL SLACPY( 'A', KLN, JW, WV, LDWV, H( KROW, KWTOP ), LDH )
-   70    CONTINUE
-*
-*        ==== Update horizontal slab in H ====
-*
-         IF( WANTT ) THEN
-            DO 80 KCOL = KBOT + 1, N, NH
-               KLN = MIN( NH, N-KCOL+1 )
-               CALL SGEMM( 'C', 'N', JW, KLN, JW, ONE, V, LDV,
-     $                     H( KWTOP, KCOL ), LDH, ZERO, T, LDT )
-               CALL SLACPY( 'A', JW, KLN, T, LDT, H( KWTOP, KCOL ),
-     $                      LDH )
-   80       CONTINUE
-         END IF
-*
-*        ==== Update vertical slab in Z ====
-*
-         IF( WANTZ ) THEN
-            DO 90 KROW = ILOZ, IHIZ, NV
-               KLN = MIN( NV, IHIZ-KROW+1 )
-               CALL SGEMM( 'N', 'N', KLN, JW, JW, ONE, Z( KROW, KWTOP ),
-     $                     LDZ, V, LDV, ZERO, WV, LDWV )
-               CALL SLACPY( 'A', KLN, JW, WV, LDWV, Z( KROW, KWTOP ),
-     $                      LDZ )
-   90       CONTINUE
-         END IF
-      END IF
-*
-*     ==== Return the number of deflations ... ====
-*
-      ND = JW - NS
-*
-*     ==== ... and the number of shifts. (Subtracting
-*     .    INFQR from the spike length takes care
-*     .    of the case of a rare QR failure while
-*     .    calculating eigenvalues of the deflation
-*     .    window.)  ====
-*
-      NS = NS - INFQR
-*
-*      ==== Return optimal workspace. ====
-*
-      WORK( 1 ) = REAL( LWKOPT )
-*
-*     ==== End of SLAQR2 ====
-*
-      END
--- a/libcruft/lapack/slaqr3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,561 +0,0 @@
-      SUBROUTINE SLAQR3( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
-     $                   IHIZ, Z, LDZ, NS, ND, SR, SI, V, LDV, NH, T,
-     $                   LDT, NV, WV, LDWV, WORK, LWORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHIZ, ILOZ, KBOT, KTOP, LDH, LDT, LDV, LDWV,
-     $                   LDZ, LWORK, N, ND, NH, NS, NV, NW
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      REAL               H( LDH, * ), SI( * ), SR( * ), T( LDT, * ),
-     $                   V( LDV, * ), WORK( * ), WV( LDWV, * ),
-     $                   Z( LDZ, * )
-*     ..
-*
-*     ******************************************************************
-*     Aggressive early deflation:
-*
-*     This subroutine accepts as input an upper Hessenberg matrix
-*     H and performs an orthogonal similarity transformation
-*     designed to detect and deflate fully converged eigenvalues from
-*     a trailing principal submatrix.  On output H has been over-
-*     written by a new Hessenberg matrix that is a perturbation of
-*     an orthogonal similarity transformation of H.  It is to be
-*     hoped that the final version of H has many zero subdiagonal
-*     entries.
-*
-*     ******************************************************************
-*     WANTT   (input) LOGICAL
-*          If .TRUE., then the Hessenberg matrix H is fully updated
-*          so that the quasi-triangular Schur factor may be
-*          computed (in cooperation with the calling subroutine).
-*          If .FALSE., then only enough of H is updated to preserve
-*          the eigenvalues.
-*
-*     WANTZ   (input) LOGICAL
-*          If .TRUE., then the orthogonal matrix Z is updated so
-*          so that the orthogonal Schur factor may be computed
-*          (in cooperation with the calling subroutine).
-*          If .FALSE., then Z is not referenced.
-*
-*     N       (input) INTEGER
-*          The order of the matrix H and (if WANTZ is .TRUE.) the
-*          order of the orthogonal matrix Z.
-*
-*     KTOP    (input) INTEGER
-*          It is assumed that either KTOP = 1 or H(KTOP,KTOP-1)=0.
-*          KBOT and KTOP together determine an isolated block
-*          along the diagonal of the Hessenberg matrix.
-*
-*     KBOT    (input) INTEGER
-*          It is assumed without a check that either
-*          KBOT = N or H(KBOT+1,KBOT)=0.  KBOT and KTOP together
-*          determine an isolated block along the diagonal of the
-*          Hessenberg matrix.
-*
-*     NW      (input) INTEGER
-*          Deflation window size.  1 .LE. NW .LE. (KBOT-KTOP+1).
-*
-*     H       (input/output) REAL array, dimension (LDH,N)
-*          On input the initial N-by-N section of H stores the
-*          Hessenberg matrix undergoing aggressive early deflation.
-*          On output H has been transformed by an orthogonal
-*          similarity transformation, perturbed, and the returned
-*          to Hessenberg form that (it is to be hoped) has some
-*          zero subdiagonal entries.
-*
-*     LDH     (input) integer
-*          Leading dimension of H just as declared in the calling
-*          subroutine.  N .LE. LDH
-*
-*     ILOZ    (input) INTEGER
-*     IHIZ    (input) INTEGER
-*          Specify the rows of Z to which transformations must be
-*          applied if WANTZ is .TRUE.. 1 .LE. ILOZ .LE. IHIZ .LE. N.
-*
-*     Z       (input/output) REAL array, dimension (LDZ,IHI)
-*          IF WANTZ is .TRUE., then on output, the orthogonal
-*          similarity transformation mentioned above has been
-*          accumulated into Z(ILOZ:IHIZ,ILO:IHI) from the right.
-*          If WANTZ is .FALSE., then Z is unreferenced.
-*
-*     LDZ     (input) integer
-*          The leading dimension of Z just as declared in the
-*          calling subroutine.  1 .LE. LDZ.
-*
-*     NS      (output) integer
-*          The number of unconverged (ie approximate) eigenvalues
-*          returned in SR and SI that may be used as shifts by the
-*          calling subroutine.
-*
-*     ND      (output) integer
-*          The number of converged eigenvalues uncovered by this
-*          subroutine.
-*
-*     SR      (output) REAL array, dimension KBOT
-*     SI      (output) REAL array, dimension KBOT
-*          On output, the real and imaginary parts of approximate
-*          eigenvalues that may be used for shifts are stored in
-*          SR(KBOT-ND-NS+1) through SR(KBOT-ND) and
-*          SI(KBOT-ND-NS+1) through SI(KBOT-ND), respectively.
-*          The real and imaginary parts of converged eigenvalues
-*          are stored in SR(KBOT-ND+1) through SR(KBOT) and
-*          SI(KBOT-ND+1) through SI(KBOT), respectively.
-*
-*     V       (workspace) REAL array, dimension (LDV,NW)
-*          An NW-by-NW work array.
-*
-*     LDV     (input) integer scalar
-*          The leading dimension of V just as declared in the
-*          calling subroutine.  NW .LE. LDV
-*
-*     NH      (input) integer scalar
-*          The number of columns of T.  NH.GE.NW.
-*
-*     T       (workspace) REAL array, dimension (LDT,NW)
-*
-*     LDT     (input) integer
-*          The leading dimension of T just as declared in the
-*          calling subroutine.  NW .LE. LDT
-*
-*     NV      (input) integer
-*          The number of rows of work array WV available for
-*          workspace.  NV.GE.NW.
-*
-*     WV      (workspace) REAL array, dimension (LDWV,NW)
-*
-*     LDWV    (input) integer
-*          The leading dimension of W just as declared in the
-*          calling subroutine.  NW .LE. LDV
-*
-*     WORK    (workspace) REAL array, dimension LWORK.
-*          On exit, WORK(1) is set to an estimate of the optimal value
-*          of LWORK for the given values of N, NW, KTOP and KBOT.
-*
-*     LWORK   (input) integer
-*          The dimension of the work array WORK.  LWORK = 2*NW
-*          suffices, but greater efficiency may result from larger
-*          values of LWORK.
-*
-*          If LWORK = -1, then a workspace query is assumed; SLAQR3
-*          only estimates the optimal workspace size for the given
-*          values of N, NW, KTOP and KBOT.  The estimate is returned
-*          in WORK(1).  No error message related to LWORK is issued
-*          by XERBLA.  Neither H nor Z are accessed.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ==================================================================
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0e0, ONE = 1.0e0 )
-*     ..
-*     .. Local Scalars ..
-      REAL               AA, BB, BETA, CC, CS, DD, EVI, EVK, FOO, S,
-     $                   SAFMAX, SAFMIN, SMLNUM, SN, TAU, ULP
-      INTEGER            I, IFST, ILST, INFO, INFQR, J, JW, K, KCOL,
-     $                   KEND, KLN, KROW, KWTOP, LTOP, LWK1, LWK2, LWK3,
-     $                   LWKOPT, NMIN
-      LOGICAL            BULGE, SORTED
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      INTEGER            ILAENV
-      EXTERNAL           SLAMCH, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SGEHRD, SGEMM, SLABAD, SLACPY, SLAHQR,
-     $                   SLANV2, SLAQR4, SLARF, SLARFG, SLASET, SORGHR,
-     $                   STREXC
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, INT, MAX, MIN, REAL, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     ==== Estimate optimal workspace. ====
-*
-      JW = MIN( NW, KBOT-KTOP+1 )
-      IF( JW.LE.2 ) THEN
-         LWKOPT = 1
-      ELSE
-*
-*        ==== Workspace query call to SGEHRD ====
-*
-         CALL SGEHRD( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
-         LWK1 = INT( WORK( 1 ) )
-*
-*        ==== Workspace query call to SORGHR ====
-*
-         CALL SORGHR( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
-         LWK2 = INT( WORK( 1 ) )
-*
-*        ==== Workspace query call to SLAQR4 ====
-*
-         CALL SLAQR4( .true., .true., JW, 1, JW, T, LDT, SR, SI, 1, JW,
-     $                V, LDV, WORK, -1, INFQR )
-         LWK3 = INT( WORK( 1 ) )
-*
-*        ==== Optimal workspace ====
-*
-         LWKOPT = MAX( JW+MAX( LWK1, LWK2 ), LWK3 )
-      END IF
-*
-*     ==== Quick return in case of workspace query. ====
-*
-      IF( LWORK.EQ.-1 ) THEN
-         WORK( 1 ) = REAL( LWKOPT )
-         RETURN
-      END IF
-*
-*     ==== Nothing to do ...
-*     ... for an empty active block ... ====
-      NS = 0
-      ND = 0
-      IF( KTOP.GT.KBOT )
-     $   RETURN
-*     ... nor for an empty deflation window. ====
-      IF( NW.LT.1 )
-     $   RETURN
-*
-*     ==== Machine constants ====
-*
-      SAFMIN = SLAMCH( 'SAFE MINIMUM' )
-      SAFMAX = ONE / SAFMIN
-      CALL SLABAD( SAFMIN, SAFMAX )
-      ULP = SLAMCH( 'PRECISION' )
-      SMLNUM = SAFMIN*( REAL( N ) / ULP )
-*
-*     ==== Setup deflation window ====
-*
-      JW = MIN( NW, KBOT-KTOP+1 )
-      KWTOP = KBOT - JW + 1
-      IF( KWTOP.EQ.KTOP ) THEN
-         S = ZERO
-      ELSE
-         S = H( KWTOP, KWTOP-1 )
-      END IF
-*
-      IF( KBOT.EQ.KWTOP ) THEN
-*
-*        ==== 1-by-1 deflation window: not much to do ====
-*
-         SR( KWTOP ) = H( KWTOP, KWTOP )
-         SI( KWTOP ) = ZERO
-         NS = 1
-         ND = 0
-         IF( ABS( S ).LE.MAX( SMLNUM, ULP*ABS( H( KWTOP, KWTOP ) ) ) )
-     $        THEN
-            NS = 0
-            ND = 1
-            IF( KWTOP.GT.KTOP )
-     $         H( KWTOP, KWTOP-1 ) = ZERO
-         END IF
-         RETURN
-      END IF
-*
-*     ==== Convert to spike-triangular form.  (In case of a
-*     .    rare QR failure, this routine continues to do
-*     .    aggressive early deflation using that part of
-*     .    the deflation window that converged using INFQR
-*     .    here and there to keep track.) ====
-*
-      CALL SLACPY( 'U', JW, JW, H( KWTOP, KWTOP ), LDH, T, LDT )
-      CALL SCOPY( JW-1, H( KWTOP+1, KWTOP ), LDH+1, T( 2, 1 ), LDT+1 )
-*
-      CALL SLASET( 'A', JW, JW, ZERO, ONE, V, LDV )
-      NMIN = ILAENV( 12, 'SLAQR3', 'SV', JW, 1, JW, LWORK )
-      IF( JW.GT.NMIN ) THEN
-         CALL SLAQR4( .true., .true., JW, 1, JW, T, LDT, SR( KWTOP ),
-     $                SI( KWTOP ), 1, JW, V, LDV, WORK, LWORK, INFQR )
-      ELSE
-         CALL SLAHQR( .true., .true., JW, 1, JW, T, LDT, SR( KWTOP ),
-     $                SI( KWTOP ), 1, JW, V, LDV, INFQR )
-      END IF
-*
-*     ==== STREXC needs a clean margin near the diagonal ====
-*
-      DO 10 J = 1, JW - 3
-         T( J+2, J ) = ZERO
-         T( J+3, J ) = ZERO
-   10 CONTINUE
-      IF( JW.GT.2 )
-     $   T( JW, JW-2 ) = ZERO
-*
-*     ==== Deflation detection loop ====
-*
-      NS = JW
-      ILST = INFQR + 1
-   20 CONTINUE
-      IF( ILST.LE.NS ) THEN
-         IF( NS.EQ.1 ) THEN
-            BULGE = .FALSE.
-         ELSE
-            BULGE = T( NS, NS-1 ).NE.ZERO
-         END IF
-*
-*        ==== Small spike tip test for deflation ====
-*
-         IF( .NOT.BULGE ) THEN
-*
-*           ==== Real eigenvalue ====
-*
-            FOO = ABS( T( NS, NS ) )
-            IF( FOO.EQ.ZERO )
-     $         FOO = ABS( S )
-            IF( ABS( S*V( 1, NS ) ).LE.MAX( SMLNUM, ULP*FOO ) ) THEN
-*
-*              ==== Deflatable ====
-*
-               NS = NS - 1
-            ELSE
-*
-*              ==== Undeflatable.   Move it up out of the way.
-*              .    (STREXC can not fail in this case.) ====
-*
-               IFST = NS
-               CALL STREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, WORK,
-     $                      INFO )
-               ILST = ILST + 1
-            END IF
-         ELSE
-*
-*           ==== Complex conjugate pair ====
-*
-            FOO = ABS( T( NS, NS ) ) + SQRT( ABS( T( NS, NS-1 ) ) )*
-     $            SQRT( ABS( T( NS-1, NS ) ) )
-            IF( FOO.EQ.ZERO )
-     $         FOO = ABS( S )
-            IF( MAX( ABS( S*V( 1, NS ) ), ABS( S*V( 1, NS-1 ) ) ).LE.
-     $          MAX( SMLNUM, ULP*FOO ) ) THEN
-*
-*              ==== Deflatable ====
-*
-               NS = NS - 2
-            ELSE
-*
-*              ==== Undflatable. Move them up out of the way.
-*              .    Fortunately, STREXC does the right thing with
-*              .    ILST in case of a rare exchange failure. ====
-*
-               IFST = NS
-               CALL STREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, WORK,
-     $                      INFO )
-               ILST = ILST + 2
-            END IF
-         END IF
-*
-*        ==== End deflation detection loop ====
-*
-         GO TO 20
-      END IF
-*
-*        ==== Return to Hessenberg form ====
-*
-      IF( NS.EQ.0 )
-     $   S = ZERO
-*
-      IF( NS.LT.JW ) THEN
-*
-*        ==== sorting diagonal blocks of T improves accuracy for
-*        .    graded matrices.  Bubble sort deals well with
-*        .    exchange failures. ====
-*
-         SORTED = .false.
-         I = NS + 1
-   30    CONTINUE
-         IF( SORTED )
-     $      GO TO 50
-         SORTED = .true.
-*
-         KEND = I - 1
-         I = INFQR + 1
-         IF( I.EQ.NS ) THEN
-            K = I + 1
-         ELSE IF( T( I+1, I ).EQ.ZERO ) THEN
-            K = I + 1
-         ELSE
-            K = I + 2
-         END IF
-   40    CONTINUE
-         IF( K.LE.KEND ) THEN
-            IF( K.EQ.I+1 ) THEN
-               EVI = ABS( T( I, I ) )
-            ELSE
-               EVI = ABS( T( I, I ) ) + SQRT( ABS( T( I+1, I ) ) )*
-     $               SQRT( ABS( T( I, I+1 ) ) )
-            END IF
-*
-            IF( K.EQ.KEND ) THEN
-               EVK = ABS( T( K, K ) )
-            ELSE IF( T( K+1, K ).EQ.ZERO ) THEN
-               EVK = ABS( T( K, K ) )
-            ELSE
-               EVK = ABS( T( K, K ) ) + SQRT( ABS( T( K+1, K ) ) )*
-     $               SQRT( ABS( T( K, K+1 ) ) )
-            END IF
-*
-            IF( EVI.GE.EVK ) THEN
-               I = K
-            ELSE
-               SORTED = .false.
-               IFST = I
-               ILST = K
-               CALL STREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, WORK,
-     $                      INFO )
-               IF( INFO.EQ.0 ) THEN
-                  I = ILST
-               ELSE
-                  I = K
-               END IF
-            END IF
-            IF( I.EQ.KEND ) THEN
-               K = I + 1
-            ELSE IF( T( I+1, I ).EQ.ZERO ) THEN
-               K = I + 1
-            ELSE
-               K = I + 2
-            END IF
-            GO TO 40
-         END IF
-         GO TO 30
-   50    CONTINUE
-      END IF
-*
-*     ==== Restore shift/eigenvalue array from T ====
-*
-      I = JW
-   60 CONTINUE
-      IF( I.GE.INFQR+1 ) THEN
-         IF( I.EQ.INFQR+1 ) THEN
-            SR( KWTOP+I-1 ) = T( I, I )
-            SI( KWTOP+I-1 ) = ZERO
-            I = I - 1
-         ELSE IF( T( I, I-1 ).EQ.ZERO ) THEN
-            SR( KWTOP+I-1 ) = T( I, I )
-            SI( KWTOP+I-1 ) = ZERO
-            I = I - 1
-         ELSE
-            AA = T( I-1, I-1 )
-            CC = T( I, I-1 )
-            BB = T( I-1, I )
-            DD = T( I, I )
-            CALL SLANV2( AA, BB, CC, DD, SR( KWTOP+I-2 ),
-     $                   SI( KWTOP+I-2 ), SR( KWTOP+I-1 ),
-     $                   SI( KWTOP+I-1 ), CS, SN )
-            I = I - 2
-         END IF
-         GO TO 60
-      END IF
-*
-      IF( NS.LT.JW .OR. S.EQ.ZERO ) THEN
-         IF( NS.GT.1 .AND. S.NE.ZERO ) THEN
-*
-*           ==== Reflect spike back into lower triangle ====
-*
-            CALL SCOPY( NS, V, LDV, WORK, 1 )
-            BETA = WORK( 1 )
-            CALL SLARFG( NS, BETA, WORK( 2 ), 1, TAU )
-            WORK( 1 ) = ONE
-*
-            CALL SLASET( 'L', JW-2, JW-2, ZERO, ZERO, T( 3, 1 ), LDT )
-*
-            CALL SLARF( 'L', NS, JW, WORK, 1, TAU, T, LDT,
-     $                  WORK( JW+1 ) )
-            CALL SLARF( 'R', NS, NS, WORK, 1, TAU, T, LDT,
-     $                  WORK( JW+1 ) )
-            CALL SLARF( 'R', JW, NS, WORK, 1, TAU, V, LDV,
-     $                  WORK( JW+1 ) )
-*
-            CALL SGEHRD( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
-     $                   LWORK-JW, INFO )
-         END IF
-*
-*        ==== Copy updated reduced window into place ====
-*
-         IF( KWTOP.GT.1 )
-     $      H( KWTOP, KWTOP-1 ) = S*V( 1, 1 )
-         CALL SLACPY( 'U', JW, JW, T, LDT, H( KWTOP, KWTOP ), LDH )
-         CALL SCOPY( JW-1, T( 2, 1 ), LDT+1, H( KWTOP+1, KWTOP ),
-     $               LDH+1 )
-*
-*        ==== Accumulate orthogonal matrix in order update
-*        .    H and Z, if requested.  (A modified version
-*        .    of  SORGHR that accumulates block Householder
-*        .    transformations into V directly might be
-*        .    marginally more efficient than the following.) ====
-*
-         IF( NS.GT.1 .AND. S.NE.ZERO ) THEN
-            CALL SORGHR( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
-     $                   LWORK-JW, INFO )
-            CALL SGEMM( 'N', 'N', JW, NS, NS, ONE, V, LDV, T, LDT, ZERO,
-     $                  WV, LDWV )
-            CALL SLACPY( 'A', JW, NS, WV, LDWV, V, LDV )
-         END IF
-*
-*        ==== Update vertical slab in H ====
-*
-         IF( WANTT ) THEN
-            LTOP = 1
-         ELSE
-            LTOP = KTOP
-         END IF
-         DO 70 KROW = LTOP, KWTOP - 1, NV
-            KLN = MIN( NV, KWTOP-KROW )
-            CALL SGEMM( 'N', 'N', KLN, JW, JW, ONE, H( KROW, KWTOP ),
-     $                  LDH, V, LDV, ZERO, WV, LDWV )
-            CALL SLACPY( 'A', KLN, JW, WV, LDWV, H( KROW, KWTOP ), LDH )
-   70    CONTINUE
-*
-*        ==== Update horizontal slab in H ====
-*
-         IF( WANTT ) THEN
-            DO 80 KCOL = KBOT + 1, N, NH
-               KLN = MIN( NH, N-KCOL+1 )
-               CALL SGEMM( 'C', 'N', JW, KLN, JW, ONE, V, LDV,
-     $                     H( KWTOP, KCOL ), LDH, ZERO, T, LDT )
-               CALL SLACPY( 'A', JW, KLN, T, LDT, H( KWTOP, KCOL ),
-     $                      LDH )
-   80       CONTINUE
-         END IF
-*
-*        ==== Update vertical slab in Z ====
-*
-         IF( WANTZ ) THEN
-            DO 90 KROW = ILOZ, IHIZ, NV
-               KLN = MIN( NV, IHIZ-KROW+1 )
-               CALL SGEMM( 'N', 'N', KLN, JW, JW, ONE, Z( KROW, KWTOP ),
-     $                     LDZ, V, LDV, ZERO, WV, LDWV )
-               CALL SLACPY( 'A', KLN, JW, WV, LDWV, Z( KROW, KWTOP ),
-     $                      LDZ )
-   90       CONTINUE
-         END IF
-      END IF
-*
-*     ==== Return the number of deflations ... ====
-*
-      ND = JW - NS
-*
-*     ==== ... and the number of shifts. (Subtracting
-*     .    INFQR from the spike length takes care
-*     .    of the case of a rare QR failure while
-*     .    calculating eigenvalues of the deflation
-*     .    window.)  ====
-*
-      NS = NS - INFQR
-*
-*      ==== Return optimal workspace. ====
-*
-      WORK( 1 ) = REAL( LWKOPT )
-*
-*     ==== End of SLAQR3 ====
-*
-      END
--- a/libcruft/lapack/slaqr4.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,640 +0,0 @@
-      SUBROUTINE SLAQR4( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI,
-     $                   ILOZ, IHIZ, Z, LDZ, WORK, LWORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, LWORK, N
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      REAL               H( LDH, * ), WI( * ), WORK( * ), WR( * ),
-     $                   Z( LDZ, * )
-*     ..
-*
-*     This subroutine implements one level of recursion for SLAQR0.
-*     It is a complete implementation of the small bulge multi-shift
-*     QR algorithm.  It may be called by SLAQR0 and, for large enough
-*     deflation window size, it may be called by SLAQR3.  This
-*     subroutine is identical to SLAQR0 except that it calls SLAQR2
-*     instead of SLAQR3.
-*
-*     Purpose
-*     =======
-*
-*     SLAQR4 computes the eigenvalues of a Hessenberg matrix H
-*     and, optionally, the matrices T and Z from the Schur decomposition
-*     H = Z T Z**T, where T is an upper quasi-triangular matrix (the
-*     Schur form), and Z is the orthogonal matrix of Schur vectors.
-*
-*     Optionally Z may be postmultiplied into an input orthogonal
-*     matrix Q so that this routine can give the Schur factorization
-*     of a matrix A which has been reduced to the Hessenberg form H
-*     by the orthogonal matrix Q:  A = Q*H*Q**T = (QZ)*T*(QZ)**T.
-*
-*     Arguments
-*     =========
-*
-*     WANTT   (input) LOGICAL
-*          = .TRUE. : the full Schur form T is required;
-*          = .FALSE.: only eigenvalues are required.
-*
-*     WANTZ   (input) LOGICAL
-*          = .TRUE. : the matrix of Schur vectors Z is required;
-*          = .FALSE.: Schur vectors are not required.
-*
-*     N     (input) INTEGER
-*           The order of the matrix H.  N .GE. 0.
-*
-*     ILO   (input) INTEGER
-*     IHI   (input) INTEGER
-*           It is assumed that H is already upper triangular in rows
-*           and columns 1:ILO-1 and IHI+1:N and, if ILO.GT.1,
-*           H(ILO,ILO-1) is zero. ILO and IHI are normally set by a
-*           previous call to SGEBAL, and then passed to SGEHRD when the
-*           matrix output by SGEBAL is reduced to Hessenberg form.
-*           Otherwise, ILO and IHI should be set to 1 and N,
-*           respectively.  If N.GT.0, then 1.LE.ILO.LE.IHI.LE.N.
-*           If N = 0, then ILO = 1 and IHI = 0.
-*
-*     H     (input/output) REAL array, dimension (LDH,N)
-*           On entry, the upper Hessenberg matrix H.
-*           On exit, if INFO = 0 and WANTT is .TRUE., then H contains
-*           the upper quasi-triangular matrix T from the Schur
-*           decomposition (the Schur form); 2-by-2 diagonal blocks
-*           (corresponding to complex conjugate pairs of eigenvalues)
-*           are returned in standard form, with H(i,i) = H(i+1,i+1)
-*           and H(i+1,i)*H(i,i+1).LT.0. If INFO = 0 and WANTT is
-*           .FALSE., then the contents of H are unspecified on exit.
-*           (The output value of H when INFO.GT.0 is given under the
-*           description of INFO below.)
-*
-*           This subroutine may explicitly set H(i,j) = 0 for i.GT.j and
-*           j = 1, 2, ... ILO-1 or j = IHI+1, IHI+2, ... N.
-*
-*     LDH   (input) INTEGER
-*           The leading dimension of the array H. LDH .GE. max(1,N).
-*
-*     WR    (output) REAL array, dimension (IHI)
-*     WI    (output) REAL array, dimension (IHI)
-*           The real and imaginary parts, respectively, of the computed
-*           eigenvalues of H(ILO:IHI,ILO:IHI) are stored WR(ILO:IHI)
-*           and WI(ILO:IHI). If two eigenvalues are computed as a
-*           complex conjugate pair, they are stored in consecutive
-*           elements of WR and WI, say the i-th and (i+1)th, with
-*           WI(i) .GT. 0 and WI(i+1) .LT. 0. If WANTT is .TRUE., then
-*           the eigenvalues are stored in the same order as on the
-*           diagonal of the Schur form returned in H, with
-*           WR(i) = H(i,i) and, if H(i:i+1,i:i+1) is a 2-by-2 diagonal
-*           block, WI(i) = sqrt(-H(i+1,i)*H(i,i+1)) and
-*           WI(i+1) = -WI(i).
-*
-*     ILOZ     (input) INTEGER
-*     IHIZ     (input) INTEGER
-*           Specify the rows of Z to which transformations must be
-*           applied if WANTZ is .TRUE..
-*           1 .LE. ILOZ .LE. ILO; IHI .LE. IHIZ .LE. N.
-*
-*     Z     (input/output) REAL array, dimension (LDZ,IHI)
-*           If WANTZ is .FALSE., then Z is not referenced.
-*           If WANTZ is .TRUE., then Z(ILO:IHI,ILOZ:IHIZ) is
-*           replaced by Z(ILO:IHI,ILOZ:IHIZ)*U where U is the
-*           orthogonal Schur factor of H(ILO:IHI,ILO:IHI).
-*           (The output value of Z when INFO.GT.0 is given under
-*           the description of INFO below.)
-*
-*     LDZ   (input) INTEGER
-*           The leading dimension of the array Z.  if WANTZ is .TRUE.
-*           then LDZ.GE.MAX(1,IHIZ).  Otherwize, LDZ.GE.1.
-*
-*     WORK  (workspace/output) REAL array, dimension LWORK
-*           On exit, if LWORK = -1, WORK(1) returns an estimate of
-*           the optimal value for LWORK.
-*
-*     LWORK (input) INTEGER
-*           The dimension of the array WORK.  LWORK .GE. max(1,N)
-*           is sufficient, but LWORK typically as large as 6*N may
-*           be required for optimal performance.  A workspace query
-*           to determine the optimal workspace size is recommended.
-*
-*           If LWORK = -1, then SLAQR4 does a workspace query.
-*           In this case, SLAQR4 checks the input parameters and
-*           estimates the optimal workspace size for the given
-*           values of N, ILO and IHI.  The estimate is returned
-*           in WORK(1).  No error message related to LWORK is
-*           issued by XERBLA.  Neither H nor Z are accessed.
-*
-*
-*     INFO  (output) INTEGER
-*             =  0:  successful exit
-*           .GT. 0:  if INFO = i, SLAQR4 failed to compute all of
-*                the eigenvalues.  Elements 1:ilo-1 and i+1:n of WR
-*                and WI contain those eigenvalues which have been
-*                successfully computed.  (Failures are rare.)
-*
-*                If INFO .GT. 0 and WANT is .FALSE., then on exit,
-*                the remaining unconverged eigenvalues are the eigen-
-*                values of the upper Hessenberg matrix rows and
-*                columns ILO through INFO of the final, output
-*                value of H.
-*
-*                If INFO .GT. 0 and WANTT is .TRUE., then on exit
-*
-*           (*)  (initial value of H)*U  = U*(final value of H)
-*
-*                where U is an orthogonal matrix.  The final
-*                value of H is upper Hessenberg and quasi-triangular
-*                in rows and columns INFO+1 through IHI.
-*
-*                If INFO .GT. 0 and WANTZ is .TRUE., then on exit
-*
-*                  (final value of Z(ILO:IHI,ILOZ:IHIZ)
-*                   =  (initial value of Z(ILO:IHI,ILOZ:IHIZ)*U
-*
-*                where U is the orthogonal matrix in (*) (regard-
-*                less of the value of WANTT.)
-*
-*                If INFO .GT. 0 and WANTZ is .FALSE., then Z is not
-*                accessed.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ================================================================
-*     References:
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
-*       Performance, SIAM Journal of Matrix Analysis, volume 23, pages
-*       929--947, 2002.
-*
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part II: Aggressive Early Deflation, SIAM Journal
-*       of Matrix Analysis, volume 23, pages 948--973, 2002.
-*
-*     ================================================================
-*     .. Parameters ..
-*
-*     ==== Matrices of order NTINY or smaller must be processed by
-*     .    SLAHQR because of insufficient subdiagonal scratch space.
-*     .    (This is a hard limit.) ====
-*
-*     ==== Exceptional deflation windows:  try to cure rare
-*     .    slow convergence by increasing the size of the
-*     .    deflation window after KEXNW iterations. =====
-*
-*     ==== Exceptional shifts: try to cure rare slow convergence
-*     .    with ad-hoc exceptional shifts every KEXSH iterations.
-*     .    The constants WILK1 and WILK2 are used to form the
-*     .    exceptional shifts. ====
-*
-      INTEGER            NTINY
-      PARAMETER          ( NTINY = 11 )
-      INTEGER            KEXNW, KEXSH
-      PARAMETER          ( KEXNW = 5, KEXSH = 6 )
-      REAL               WILK1, WILK2
-      PARAMETER          ( WILK1 = 0.75e0, WILK2 = -0.4375e0 )
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0e0, ONE = 1.0e0 )
-*     ..
-*     .. Local Scalars ..
-      REAL               AA, BB, CC, CS, DD, SN, SS, SWAP
-      INTEGER            I, INF, IT, ITMAX, K, KACC22, KBOT, KDU, KS,
-     $                   KT, KTOP, KU, KV, KWH, KWTOP, KWV, LD, LS,
-     $                   LWKOPT, NDFL, NH, NHO, NIBBLE, NMIN, NS, NSMAX,
-     $                   NSR, NVE, NW, NWMAX, NWR
-      LOGICAL            NWINC, SORTED
-      CHARACTER          JBCMPZ*2
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Local Arrays ..
-      REAL               ZDUM( 1, 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLACPY, SLAHQR, SLANV2, SLAQR2, SLAQR5
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, INT, MAX, MIN, MOD, REAL
-*     ..
-*     .. Executable Statements ..
-      INFO = 0
-*
-*     ==== Quick return for N = 0: nothing to do. ====
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = ONE
-         RETURN
-      END IF
-*
-*     ==== Set up job flags for ILAENV. ====
-*
-      IF( WANTT ) THEN
-         JBCMPZ( 1: 1 ) = 'S'
-      ELSE
-         JBCMPZ( 1: 1 ) = 'E'
-      END IF
-      IF( WANTZ ) THEN
-         JBCMPZ( 2: 2 ) = 'V'
-      ELSE
-         JBCMPZ( 2: 2 ) = 'N'
-      END IF
-*
-*     ==== Tiny matrices must use SLAHQR. ====
-*
-      IF( N.LE.NTINY ) THEN
-*
-*        ==== Estimate optimal workspace. ====
-*
-         LWKOPT = 1
-         IF( LWORK.NE.-1 )
-     $      CALL SLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI,
-     $                   ILOZ, IHIZ, Z, LDZ, INFO )
-      ELSE
-*
-*        ==== Use small bulge multi-shift QR with aggressive early
-*        .    deflation on larger-than-tiny matrices. ====
-*
-*        ==== Hope for the best. ====
-*
-         INFO = 0
-*
-*        ==== NWR = recommended deflation window size.  At this
-*        .    point,  N .GT. NTINY = 11, so there is enough
-*        .    subdiagonal workspace for NWR.GE.2 as required.
-*        .    (In fact, there is enough subdiagonal space for
-*        .    NWR.GE.3.) ====
-*
-         NWR = ILAENV( 13, 'SLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         NWR = MAX( 2, NWR )
-         NWR = MIN( IHI-ILO+1, ( N-1 ) / 3, NWR )
-         NW = NWR
-*
-*        ==== NSR = recommended number of simultaneous shifts.
-*        .    At this point N .GT. NTINY = 11, so there is at
-*        .    enough subdiagonal workspace for NSR to be even
-*        .    and greater than or equal to two as required. ====
-*
-         NSR = ILAENV( 15, 'SLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         NSR = MIN( NSR, ( N+6 ) / 9, IHI-ILO )
-         NSR = MAX( 2, NSR-MOD( NSR, 2 ) )
-*
-*        ==== Estimate optimal workspace ====
-*
-*        ==== Workspace query call to SLAQR2 ====
-*
-         CALL SLAQR2( WANTT, WANTZ, N, ILO, IHI, NWR+1, H, LDH, ILOZ,
-     $                IHIZ, Z, LDZ, LS, LD, WR, WI, H, LDH, N, H, LDH,
-     $                N, H, LDH, WORK, -1 )
-*
-*        ==== Optimal workspace = MAX(SLAQR5, SLAQR2) ====
-*
-         LWKOPT = MAX( 3*NSR / 2, INT( WORK( 1 ) ) )
-*
-*        ==== Quick return in case of workspace query. ====
-*
-         IF( LWORK.EQ.-1 ) THEN
-            WORK( 1 ) = REAL( LWKOPT )
-            RETURN
-         END IF
-*
-*        ==== SLAHQR/SLAQR0 crossover point ====
-*
-         NMIN = ILAENV( 12, 'SLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         NMIN = MAX( NTINY, NMIN )
-*
-*        ==== Nibble crossover point ====
-*
-         NIBBLE = ILAENV( 14, 'SLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         NIBBLE = MAX( 0, NIBBLE )
-*
-*        ==== Accumulate reflections during ttswp?  Use block
-*        .    2-by-2 structure during matrix-matrix multiply? ====
-*
-         KACC22 = ILAENV( 16, 'SLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         KACC22 = MAX( 0, KACC22 )
-         KACC22 = MIN( 2, KACC22 )
-*
-*        ==== NWMAX = the largest possible deflation window for
-*        .    which there is sufficient workspace. ====
-*
-         NWMAX = MIN( ( N-1 ) / 3, LWORK / 2 )
-*
-*        ==== NSMAX = the Largest number of simultaneous shifts
-*        .    for which there is sufficient workspace. ====
-*
-         NSMAX = MIN( ( N+6 ) / 9, 2*LWORK / 3 )
-         NSMAX = NSMAX - MOD( NSMAX, 2 )
-*
-*        ==== NDFL: an iteration count restarted at deflation. ====
-*
-         NDFL = 1
-*
-*        ==== ITMAX = iteration limit ====
-*
-         ITMAX = MAX( 30, 2*KEXSH )*MAX( 10, ( IHI-ILO+1 ) )
-*
-*        ==== Last row and column in the active block ====
-*
-         KBOT = IHI
-*
-*        ==== Main Loop ====
-*
-         DO 80 IT = 1, ITMAX
-*
-*           ==== Done when KBOT falls below ILO ====
-*
-            IF( KBOT.LT.ILO )
-     $         GO TO 90
-*
-*           ==== Locate active block ====
-*
-            DO 10 K = KBOT, ILO + 1, -1
-               IF( H( K, K-1 ).EQ.ZERO )
-     $            GO TO 20
-   10       CONTINUE
-            K = ILO
-   20       CONTINUE
-            KTOP = K
-*
-*           ==== Select deflation window size ====
-*
-            NH = KBOT - KTOP + 1
-            IF( NDFL.LT.KEXNW .OR. NH.LT.NW ) THEN
-*
-*              ==== Typical deflation window.  If possible and
-*              .    advisable, nibble the entire active block.
-*              .    If not, use size NWR or NWR+1 depending upon
-*              .    which has the smaller corresponding subdiagonal
-*              .    entry (a heuristic). ====
-*
-               NWINC = .TRUE.
-               IF( NH.LE.MIN( NMIN, NWMAX ) ) THEN
-                  NW = NH
-               ELSE
-                  NW = MIN( NWR, NH, NWMAX )
-                  IF( NW.LT.NWMAX ) THEN
-                     IF( NW.GE.NH-1 ) THEN
-                        NW = NH
-                     ELSE
-                        KWTOP = KBOT - NW + 1
-                        IF( ABS( H( KWTOP, KWTOP-1 ) ).GT.
-     $                      ABS( H( KWTOP-1, KWTOP-2 ) ) )NW = NW + 1
-                     END IF
-                  END IF
-               END IF
-            ELSE
-*
-*              ==== Exceptional deflation window.  If there have
-*              .    been no deflations in KEXNW or more iterations,
-*              .    then vary the deflation window size.   At first,
-*              .    because, larger windows are, in general, more
-*              .    powerful than smaller ones, rapidly increase the
-*              .    window up to the maximum reasonable and possible.
-*              .    Then maybe try a slightly smaller window.  ====
-*
-               IF( NWINC .AND. NW.LT.MIN( NWMAX, NH ) ) THEN
-                  NW = MIN( NWMAX, NH, 2*NW )
-               ELSE
-                  NWINC = .FALSE.
-                  IF( NW.EQ.NH .AND. NH.GT.2 )
-     $               NW = NH - 1
-               END IF
-            END IF
-*
-*           ==== Aggressive early deflation:
-*           .    split workspace under the subdiagonal into
-*           .      - an nw-by-nw work array V in the lower
-*           .        left-hand-corner,
-*           .      - an NW-by-at-least-NW-but-more-is-better
-*           .        (NW-by-NHO) horizontal work array along
-*           .        the bottom edge,
-*           .      - an at-least-NW-but-more-is-better (NHV-by-NW)
-*           .        vertical work array along the left-hand-edge.
-*           .        ====
-*
-            KV = N - NW + 1
-            KT = NW + 1
-            NHO = ( N-NW-1 ) - KT + 1
-            KWV = NW + 2
-            NVE = ( N-NW ) - KWV + 1
-*
-*           ==== Aggressive early deflation ====
-*
-            CALL SLAQR2( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
-     $                   IHIZ, Z, LDZ, LS, LD, WR, WI, H( KV, 1 ), LDH,
-     $                   NHO, H( KV, KT ), LDH, NVE, H( KWV, 1 ), LDH,
-     $                   WORK, LWORK )
-*
-*           ==== Adjust KBOT accounting for new deflations. ====
-*
-            KBOT = KBOT - LD
-*
-*           ==== KS points to the shifts. ====
-*
-            KS = KBOT - LS + 1
-*
-*           ==== Skip an expensive QR sweep if there is a (partly
-*           .    heuristic) reason to expect that many eigenvalues
-*           .    will deflate without it.  Here, the QR sweep is
-*           .    skipped if many eigenvalues have just been deflated
-*           .    or if the remaining active block is small.
-*
-            IF( ( LD.EQ.0 ) .OR. ( ( 100*LD.LE.NW*NIBBLE ) .AND. ( KBOT-
-     $          KTOP+1.GT.MIN( NMIN, NWMAX ) ) ) ) THEN
-*
-*              ==== NS = nominal number of simultaneous shifts.
-*              .    This may be lowered (slightly) if SLAQR2
-*              .    did not provide that many shifts. ====
-*
-               NS = MIN( NSMAX, NSR, MAX( 2, KBOT-KTOP ) )
-               NS = NS - MOD( NS, 2 )
-*
-*              ==== If there have been no deflations
-*              .    in a multiple of KEXSH iterations,
-*              .    then try exceptional shifts.
-*              .    Otherwise use shifts provided by
-*              .    SLAQR2 above or from the eigenvalues
-*              .    of a trailing principal submatrix. ====
-*
-               IF( MOD( NDFL, KEXSH ).EQ.0 ) THEN
-                  KS = KBOT - NS + 1
-                  DO 30 I = KBOT, MAX( KS+1, KTOP+2 ), -2
-                     SS = ABS( H( I, I-1 ) ) + ABS( H( I-1, I-2 ) )
-                     AA = WILK1*SS + H( I, I )
-                     BB = SS
-                     CC = WILK2*SS
-                     DD = AA
-                     CALL SLANV2( AA, BB, CC, DD, WR( I-1 ), WI( I-1 ),
-     $                            WR( I ), WI( I ), CS, SN )
-   30             CONTINUE
-                  IF( KS.EQ.KTOP ) THEN
-                     WR( KS+1 ) = H( KS+1, KS+1 )
-                     WI( KS+1 ) = ZERO
-                     WR( KS ) = WR( KS+1 )
-                     WI( KS ) = WI( KS+1 )
-                  END IF
-               ELSE
-*
-*                 ==== Got NS/2 or fewer shifts? Use SLAHQR
-*                 .    on a trailing principal submatrix to
-*                 .    get more. (Since NS.LE.NSMAX.LE.(N+6)/9,
-*                 .    there is enough space below the subdiagonal
-*                 .    to fit an NS-by-NS scratch array.) ====
-*
-                  IF( KBOT-KS+1.LE.NS / 2 ) THEN
-                     KS = KBOT - NS + 1
-                     KT = N - NS + 1
-                     CALL SLACPY( 'A', NS, NS, H( KS, KS ), LDH,
-     $                            H( KT, 1 ), LDH )
-                     CALL SLAHQR( .false., .false., NS, 1, NS,
-     $                            H( KT, 1 ), LDH, WR( KS ), WI( KS ),
-     $                            1, 1, ZDUM, 1, INF )
-                     KS = KS + INF
-*
-*                    ==== In case of a rare QR failure use
-*                    .    eigenvalues of the trailing 2-by-2
-*                    .    principal submatrix.  ====
-*
-                     IF( KS.GE.KBOT ) THEN
-                        AA = H( KBOT-1, KBOT-1 )
-                        CC = H( KBOT, KBOT-1 )
-                        BB = H( KBOT-1, KBOT )
-                        DD = H( KBOT, KBOT )
-                        CALL SLANV2( AA, BB, CC, DD, WR( KBOT-1 ),
-     $                               WI( KBOT-1 ), WR( KBOT ),
-     $                               WI( KBOT ), CS, SN )
-                        KS = KBOT - 1
-                     END IF
-                  END IF
-*
-                  IF( KBOT-KS+1.GT.NS ) THEN
-*
-*                    ==== Sort the shifts (Helps a little)
-*                    .    Bubble sort keeps complex conjugate
-*                    .    pairs together. ====
-*
-                     SORTED = .false.
-                     DO 50 K = KBOT, KS + 1, -1
-                        IF( SORTED )
-     $                     GO TO 60
-                        SORTED = .true.
-                        DO 40 I = KS, K - 1
-                           IF( ABS( WR( I ) )+ABS( WI( I ) ).LT.
-     $                         ABS( WR( I+1 ) )+ABS( WI( I+1 ) ) ) THEN
-                              SORTED = .false.
-*
-                              SWAP = WR( I )
-                              WR( I ) = WR( I+1 )
-                              WR( I+1 ) = SWAP
-*
-                              SWAP = WI( I )
-                              WI( I ) = WI( I+1 )
-                              WI( I+1 ) = SWAP
-                           END IF
-   40                   CONTINUE
-   50                CONTINUE
-   60                CONTINUE
-                  END IF
-*
-*                 ==== Shuffle shifts into pairs of real shifts
-*                 .    and pairs of complex conjugate shifts
-*                 .    assuming complex conjugate shifts are
-*                 .    already adjacent to one another. (Yes,
-*                 .    they are.)  ====
-*
-                  DO 70 I = KBOT, KS + 2, -2
-                     IF( WI( I ).NE.-WI( I-1 ) ) THEN
-*
-                        SWAP = WR( I )
-                        WR( I ) = WR( I-1 )
-                        WR( I-1 ) = WR( I-2 )
-                        WR( I-2 ) = SWAP
-*
-                        SWAP = WI( I )
-                        WI( I ) = WI( I-1 )
-                        WI( I-1 ) = WI( I-2 )
-                        WI( I-2 ) = SWAP
-                     END IF
-   70             CONTINUE
-               END IF
-*
-*              ==== If there are only two shifts and both are
-*              .    real, then use only one.  ====
-*
-               IF( KBOT-KS+1.EQ.2 ) THEN
-                  IF( WI( KBOT ).EQ.ZERO ) THEN
-                     IF( ABS( WR( KBOT )-H( KBOT, KBOT ) ).LT.
-     $                   ABS( WR( KBOT-1 )-H( KBOT, KBOT ) ) ) THEN
-                        WR( KBOT-1 ) = WR( KBOT )
-                     ELSE
-                        WR( KBOT ) = WR( KBOT-1 )
-                     END IF
-                  END IF
-               END IF
-*
-*              ==== Use up to NS of the the smallest magnatiude
-*              .    shifts.  If there aren't NS shifts available,
-*              .    then use them all, possibly dropping one to
-*              .    make the number of shifts even. ====
-*
-               NS = MIN( NS, KBOT-KS+1 )
-               NS = NS - MOD( NS, 2 )
-               KS = KBOT - NS + 1
-*
-*              ==== Small-bulge multi-shift QR sweep:
-*              .    split workspace under the subdiagonal into
-*              .    - a KDU-by-KDU work array U in the lower
-*              .      left-hand-corner,
-*              .    - a KDU-by-at-least-KDU-but-more-is-better
-*              .      (KDU-by-NHo) horizontal work array WH along
-*              .      the bottom edge,
-*              .    - and an at-least-KDU-but-more-is-better-by-KDU
-*              .      (NVE-by-KDU) vertical work WV arrow along
-*              .      the left-hand-edge. ====
-*
-               KDU = 3*NS - 3
-               KU = N - KDU + 1
-               KWH = KDU + 1
-               NHO = ( N-KDU+1-4 ) - ( KDU+1 ) + 1
-               KWV = KDU + 4
-               NVE = N - KDU - KWV + 1
-*
-*              ==== Small-bulge multi-shift QR sweep ====
-*
-               CALL SLAQR5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NS,
-     $                      WR( KS ), WI( KS ), H, LDH, ILOZ, IHIZ, Z,
-     $                      LDZ, WORK, 3, H( KU, 1 ), LDH, NVE,
-     $                      H( KWV, 1 ), LDH, NHO, H( KU, KWH ), LDH )
-            END IF
-*
-*           ==== Note progress (or the lack of it). ====
-*
-            IF( LD.GT.0 ) THEN
-               NDFL = 1
-            ELSE
-               NDFL = NDFL + 1
-            END IF
-*
-*           ==== End of main loop ====
-   80    CONTINUE
-*
-*        ==== Iteration limit exceeded.  Set INFO to show where
-*        .    the problem occurred and exit. ====
-*
-         INFO = KBOT
-   90    CONTINUE
-      END IF
-*
-*     ==== Return the optimal value of LWORK. ====
-*
-      WORK( 1 ) = REAL( LWKOPT )
-*
-*     ==== End of SLAQR4 ====
-*
-      END
--- a/libcruft/lapack/slaqr5.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,812 +0,0 @@
-      SUBROUTINE SLAQR5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NSHFTS,
-     $                   SR, SI, H, LDH, ILOZ, IHIZ, Z, LDZ, V, LDV, U,
-     $                   LDU, NV, WV, LDWV, NH, WH, LDWH )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHIZ, ILOZ, KACC22, KBOT, KTOP, LDH, LDU, LDV,
-     $                   LDWH, LDWV, LDZ, N, NH, NSHFTS, NV
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      REAL               H( LDH, * ), SI( * ), SR( * ), U( LDU, * ),
-     $                   V( LDV, * ), WH( LDWH, * ), WV( LDWV, * ),
-     $                   Z( LDZ, * )
-*     ..
-*
-*     This auxiliary subroutine called by SLAQR0 performs a
-*     single small-bulge multi-shift QR sweep.
-*
-*      WANTT  (input) logical scalar
-*             WANTT = .true. if the quasi-triangular Schur factor
-*             is being computed.  WANTT is set to .false. otherwise.
-*
-*      WANTZ  (input) logical scalar
-*             WANTZ = .true. if the orthogonal Schur factor is being
-*             computed.  WANTZ is set to .false. otherwise.
-*
-*      KACC22 (input) integer with value 0, 1, or 2.
-*             Specifies the computation mode of far-from-diagonal
-*             orthogonal updates.
-*        = 0: SLAQR5 does not accumulate reflections and does not
-*             use matrix-matrix multiply to update far-from-diagonal
-*             matrix entries.
-*        = 1: SLAQR5 accumulates reflections and uses matrix-matrix
-*             multiply to update the far-from-diagonal matrix entries.
-*        = 2: SLAQR5 accumulates reflections, uses matrix-matrix
-*             multiply to update the far-from-diagonal matrix entries,
-*             and takes advantage of 2-by-2 block structure during
-*             matrix multiplies.
-*
-*      N      (input) integer scalar
-*             N is the order of the Hessenberg matrix H upon which this
-*             subroutine operates.
-*
-*      KTOP   (input) integer scalar
-*      KBOT   (input) integer scalar
-*             These are the first and last rows and columns of an
-*             isolated diagonal block upon which the QR sweep is to be
-*             applied. It is assumed without a check that
-*                       either KTOP = 1  or   H(KTOP,KTOP-1) = 0
-*             and
-*                       either KBOT = N  or   H(KBOT+1,KBOT) = 0.
-*
-*      NSHFTS (input) integer scalar
-*             NSHFTS gives the number of simultaneous shifts.  NSHFTS
-*             must be positive and even.
-*
-*      SR     (input) REAL array of size (NSHFTS)
-*      SI     (input) REAL array of size (NSHFTS)
-*             SR contains the real parts and SI contains the imaginary
-*             parts of the NSHFTS shifts of origin that define the
-*             multi-shift QR sweep.
-*
-*      H      (input/output) REAL array of size (LDH,N)
-*             On input H contains a Hessenberg matrix.  On output a
-*             multi-shift QR sweep with shifts SR(J)+i*SI(J) is applied
-*             to the isolated diagonal block in rows and columns KTOP
-*             through KBOT.
-*
-*      LDH    (input) integer scalar
-*             LDH is the leading dimension of H just as declared in the
-*             calling procedure.  LDH.GE.MAX(1,N).
-*
-*      ILOZ   (input) INTEGER
-*      IHIZ   (input) INTEGER
-*             Specify the rows of Z to which transformations must be
-*             applied if WANTZ is .TRUE.. 1 .LE. ILOZ .LE. IHIZ .LE. N
-*
-*      Z      (input/output) REAL array of size (LDZ,IHI)
-*             If WANTZ = .TRUE., then the QR Sweep orthogonal
-*             similarity transformation is accumulated into
-*             Z(ILOZ:IHIZ,ILO:IHI) from the right.
-*             If WANTZ = .FALSE., then Z is unreferenced.
-*
-*      LDZ    (input) integer scalar
-*             LDA is the leading dimension of Z just as declared in
-*             the calling procedure. LDZ.GE.N.
-*
-*      V      (workspace) REAL array of size (LDV,NSHFTS/2)
-*
-*      LDV    (input) integer scalar
-*             LDV is the leading dimension of V as declared in the
-*             calling procedure.  LDV.GE.3.
-*
-*      U      (workspace) REAL array of size
-*             (LDU,3*NSHFTS-3)
-*
-*      LDU    (input) integer scalar
-*             LDU is the leading dimension of U just as declared in the
-*             in the calling subroutine.  LDU.GE.3*NSHFTS-3.
-*
-*      NH     (input) integer scalar
-*             NH is the number of columns in array WH available for
-*             workspace. NH.GE.1.
-*
-*      WH     (workspace) REAL array of size (LDWH,NH)
-*
-*      LDWH   (input) integer scalar
-*             Leading dimension of WH just as declared in the
-*             calling procedure.  LDWH.GE.3*NSHFTS-3.
-*
-*      NV     (input) integer scalar
-*             NV is the number of rows in WV agailable for workspace.
-*             NV.GE.1.
-*
-*      WV     (workspace) REAL array of size
-*             (LDWV,3*NSHFTS-3)
-*
-*      LDWV   (input) integer scalar
-*             LDWV is the leading dimension of WV as declared in the
-*             in the calling subroutine.  LDWV.GE.NV.
-*
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ============================================================
-*     Reference:
-*
-*     K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*     Algorithm Part I: Maintaining Well Focused Shifts, and
-*     Level 3 Performance, SIAM Journal of Matrix Analysis,
-*     volume 23, pages 929--947, 2002.
-*
-*     ============================================================
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0e0, ONE = 1.0e0 )
-*     ..
-*     .. Local Scalars ..
-      REAL               ALPHA, BETA, H11, H12, H21, H22, REFSUM,
-     $                   SAFMAX, SAFMIN, SCL, SMLNUM, SWAP, TST1, TST2,
-     $                   ULP
-      INTEGER            I, I2, I4, INCOL, J, J2, J4, JBOT, JCOL, JLEN,
-     $                   JROW, JTOP, K, K1, KDU, KMS, KNZ, KRCOL, KZS,
-     $                   M, M22, MBOT, MEND, MSTART, MTOP, NBMPS, NDCOL,
-     $                   NS, NU
-      LOGICAL            ACCUM, BLK22, BMP22
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      EXTERNAL           SLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-*
-      INTRINSIC          ABS, MAX, MIN, MOD, REAL
-*     ..
-*     .. Local Arrays ..
-      REAL               VT( 3 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEMM, SLABAD, SLACPY, SLAQR1, SLARFG, SLASET,
-     $                   STRMM
-*     ..
-*     .. Executable Statements ..
-*
-*     ==== If there are no shifts, then there is nothing to do. ====
-*
-      IF( NSHFTS.LT.2 )
-     $   RETURN
-*
-*     ==== If the active block is empty or 1-by-1, then there
-*     .    is nothing to do. ====
-*
-      IF( KTOP.GE.KBOT )
-     $   RETURN
-*
-*     ==== Shuffle shifts into pairs of real shifts and pairs
-*     .    of complex conjugate shifts assuming complex
-*     .    conjugate shifts are already adjacent to one
-*     .    another. ====
-*
-      DO 10 I = 1, NSHFTS - 2, 2
-         IF( SI( I ).NE.-SI( I+1 ) ) THEN
-*
-            SWAP = SR( I )
-            SR( I ) = SR( I+1 )
-            SR( I+1 ) = SR( I+2 )
-            SR( I+2 ) = SWAP
-*
-            SWAP = SI( I )
-            SI( I ) = SI( I+1 )
-            SI( I+1 ) = SI( I+2 )
-            SI( I+2 ) = SWAP
-         END IF
-   10 CONTINUE
-*
-*     ==== NSHFTS is supposed to be even, but if is odd,
-*     .    then simply reduce it by one.  The shuffle above
-*     .    ensures that the dropped shift is real and that
-*     .    the remaining shifts are paired. ====
-*
-      NS = NSHFTS - MOD( NSHFTS, 2 )
-*
-*     ==== Machine constants for deflation ====
-*
-      SAFMIN = SLAMCH( 'SAFE MINIMUM' )
-      SAFMAX = ONE / SAFMIN
-      CALL SLABAD( SAFMIN, SAFMAX )
-      ULP = SLAMCH( 'PRECISION' )
-      SMLNUM = SAFMIN*( REAL( N ) / ULP )
-*
-*     ==== Use accumulated reflections to update far-from-diagonal
-*     .    entries ? ====
-*
-      ACCUM = ( KACC22.EQ.1 ) .OR. ( KACC22.EQ.2 )
-*
-*     ==== If so, exploit the 2-by-2 block structure? ====
-*
-      BLK22 = ( NS.GT.2 ) .AND. ( KACC22.EQ.2 )
-*
-*     ==== clear trash ====
-*
-      IF( KTOP+2.LE.KBOT )
-     $   H( KTOP+2, KTOP ) = ZERO
-*
-*     ==== NBMPS = number of 2-shift bulges in the chain ====
-*
-      NBMPS = NS / 2
-*
-*     ==== KDU = width of slab ====
-*
-      KDU = 6*NBMPS - 3
-*
-*     ==== Create and chase chains of NBMPS bulges ====
-*
-      DO 220 INCOL = 3*( 1-NBMPS ) + KTOP - 1, KBOT - 2, 3*NBMPS - 2
-         NDCOL = INCOL + KDU
-         IF( ACCUM )
-     $      CALL SLASET( 'ALL', KDU, KDU, ZERO, ONE, U, LDU )
-*
-*        ==== Near-the-diagonal bulge chase.  The following loop
-*        .    performs the near-the-diagonal part of a small bulge
-*        .    multi-shift QR sweep.  Each 6*NBMPS-2 column diagonal
-*        .    chunk extends from column INCOL to column NDCOL
-*        .    (including both column INCOL and column NDCOL). The
-*        .    following loop chases a 3*NBMPS column long chain of
-*        .    NBMPS bulges 3*NBMPS-2 columns to the right.  (INCOL
-*        .    may be less than KTOP and and NDCOL may be greater than
-*        .    KBOT indicating phantom columns from which to chase
-*        .    bulges before they are actually introduced or to which
-*        .    to chase bulges beyond column KBOT.)  ====
-*
-         DO 150 KRCOL = INCOL, MIN( INCOL+3*NBMPS-3, KBOT-2 )
-*
-*           ==== Bulges number MTOP to MBOT are active double implicit
-*           .    shift bulges.  There may or may not also be small
-*           .    2-by-2 bulge, if there is room.  The inactive bulges
-*           .    (if any) must wait until the active bulges have moved
-*           .    down the diagonal to make room.  The phantom matrix
-*           .    paradigm described above helps keep track.  ====
-*
-            MTOP = MAX( 1, ( ( KTOP-1 )-KRCOL+2 ) / 3+1 )
-            MBOT = MIN( NBMPS, ( KBOT-KRCOL ) / 3 )
-            M22 = MBOT + 1
-            BMP22 = ( MBOT.LT.NBMPS ) .AND. ( KRCOL+3*( M22-1 ) ).EQ.
-     $              ( KBOT-2 )
-*
-*           ==== Generate reflections to chase the chain right
-*           .    one column.  (The minimum value of K is KTOP-1.) ====
-*
-            DO 20 M = MTOP, MBOT
-               K = KRCOL + 3*( M-1 )
-               IF( K.EQ.KTOP-1 ) THEN
-                  CALL SLAQR1( 3, H( KTOP, KTOP ), LDH, SR( 2*M-1 ),
-     $                         SI( 2*M-1 ), SR( 2*M ), SI( 2*M ),
-     $                         V( 1, M ) )
-                  ALPHA = V( 1, M )
-                  CALL SLARFG( 3, ALPHA, V( 2, M ), 1, V( 1, M ) )
-               ELSE
-                  BETA = H( K+1, K )
-                  V( 2, M ) = H( K+2, K )
-                  V( 3, M ) = H( K+3, K )
-                  CALL SLARFG( 3, BETA, V( 2, M ), 1, V( 1, M ) )
-*
-*                 ==== A Bulge may collapse because of vigilant
-*                 .    deflation or destructive underflow.  (The
-*                 .    initial bulge is always collapsed.) Use
-*                 .    the two-small-subdiagonals trick to try
-*                 .    to get it started again. If V(2,M).NE.0 and
-*                 .    V(3,M) = H(K+3,K+1) = H(K+3,K+2) = 0, then
-*                 .    this bulge is collapsing into a zero
-*                 .    subdiagonal.  It will be restarted next
-*                 .    trip through the loop.)
-*
-                  IF( V( 1, M ).NE.ZERO .AND.
-     $                ( V( 3, M ).NE.ZERO .OR. ( H( K+3,
-     $                K+1 ).EQ.ZERO .AND. H( K+3, K+2 ).EQ.ZERO ) ) )
-     $                 THEN
-*
-*                    ==== Typical case: not collapsed (yet). ====
-*
-                     H( K+1, K ) = BETA
-                     H( K+2, K ) = ZERO
-                     H( K+3, K ) = ZERO
-                  ELSE
-*
-*                    ==== Atypical case: collapsed.  Attempt to
-*                    .    reintroduce ignoring H(K+1,K).  If the
-*                    .    fill resulting from the new reflector
-*                    .    is too large, then abandon it.
-*                    .    Otherwise, use the new one. ====
-*
-                     CALL SLAQR1( 3, H( K+1, K+1 ), LDH, SR( 2*M-1 ),
-     $                            SI( 2*M-1 ), SR( 2*M ), SI( 2*M ),
-     $                            VT )
-                     SCL = ABS( VT( 1 ) ) + ABS( VT( 2 ) ) +
-     $                     ABS( VT( 3 ) )
-                     IF( SCL.NE.ZERO ) THEN
-                        VT( 1 ) = VT( 1 ) / SCL
-                        VT( 2 ) = VT( 2 ) / SCL
-                        VT( 3 ) = VT( 3 ) / SCL
-                     END IF
-*
-*                    ==== The following is the traditional and
-*                    .    conservative two-small-subdiagonals
-*                    .    test.  ====
-*                    .
-                     IF( ABS( H( K+1, K ) )*( ABS( VT( 2 ) )+
-     $                   ABS( VT( 3 ) ) ).GT.ULP*ABS( VT( 1 ) )*
-     $                   ( ABS( H( K, K ) )+ABS( H( K+1,
-     $                   K+1 ) )+ABS( H( K+2, K+2 ) ) ) ) THEN
-*
-*                       ==== Starting a new bulge here would
-*                       .    create non-negligible fill.   If
-*                       .    the old reflector is diagonal (only
-*                       .    possible with underflows), then
-*                       .    change it to I.  Otherwise, use
-*                       .    it with trepidation. ====
-*
-                        IF( V( 2, M ).EQ.ZERO .AND. V( 3, M ).EQ.ZERO )
-     $                       THEN
-                           V( 1, M ) = ZERO
-                        ELSE
-                           H( K+1, K ) = BETA
-                           H( K+2, K ) = ZERO
-                           H( K+3, K ) = ZERO
-                        END IF
-                     ELSE
-*
-*                       ==== Stating a new bulge here would
-*                       .    create only negligible fill.
-*                       .    Replace the old reflector with
-*                       .    the new one. ====
-*
-                        ALPHA = VT( 1 )
-                        CALL SLARFG( 3, ALPHA, VT( 2 ), 1, VT( 1 ) )
-                        REFSUM = H( K+1, K ) + H( K+2, K )*VT( 2 ) +
-     $                           H( K+3, K )*VT( 3 )
-                        H( K+1, K ) = H( K+1, K ) - VT( 1 )*REFSUM
-                        H( K+2, K ) = ZERO
-                        H( K+3, K ) = ZERO
-                        V( 1, M ) = VT( 1 )
-                        V( 2, M ) = VT( 2 )
-                        V( 3, M ) = VT( 3 )
-                     END IF
-                  END IF
-               END IF
-   20       CONTINUE
-*
-*           ==== Generate a 2-by-2 reflection, if needed. ====
-*
-            K = KRCOL + 3*( M22-1 )
-            IF( BMP22 ) THEN
-               IF( K.EQ.KTOP-1 ) THEN
-                  CALL SLAQR1( 2, H( K+1, K+1 ), LDH, SR( 2*M22-1 ),
-     $                         SI( 2*M22-1 ), SR( 2*M22 ), SI( 2*M22 ),
-     $                         V( 1, M22 ) )
-                  BETA = V( 1, M22 )
-                  CALL SLARFG( 2, BETA, V( 2, M22 ), 1, V( 1, M22 ) )
-               ELSE
-                  BETA = H( K+1, K )
-                  V( 2, M22 ) = H( K+2, K )
-                  CALL SLARFG( 2, BETA, V( 2, M22 ), 1, V( 1, M22 ) )
-                  H( K+1, K ) = BETA
-                  H( K+2, K ) = ZERO
-               END IF
-            ELSE
-*
-*              ==== Initialize V(1,M22) here to avoid possible undefined
-*              .    variable problems later. ====
-*
-               V( 1, M22 ) = ZERO
-            END IF
-*
-*           ==== Multiply H by reflections from the left ====
-*
-            IF( ACCUM ) THEN
-               JBOT = MIN( NDCOL, KBOT )
-            ELSE IF( WANTT ) THEN
-               JBOT = N
-            ELSE
-               JBOT = KBOT
-            END IF
-            DO 40 J = MAX( KTOP, KRCOL ), JBOT
-               MEND = MIN( MBOT, ( J-KRCOL+2 ) / 3 )
-               DO 30 M = MTOP, MEND
-                  K = KRCOL + 3*( M-1 )
-                  REFSUM = V( 1, M )*( H( K+1, J )+V( 2, M )*
-     $                     H( K+2, J )+V( 3, M )*H( K+3, J ) )
-                  H( K+1, J ) = H( K+1, J ) - REFSUM
-                  H( K+2, J ) = H( K+2, J ) - REFSUM*V( 2, M )
-                  H( K+3, J ) = H( K+3, J ) - REFSUM*V( 3, M )
-   30          CONTINUE
-   40       CONTINUE
-            IF( BMP22 ) THEN
-               K = KRCOL + 3*( M22-1 )
-               DO 50 J = MAX( K+1, KTOP ), JBOT
-                  REFSUM = V( 1, M22 )*( H( K+1, J )+V( 2, M22 )*
-     $                     H( K+2, J ) )
-                  H( K+1, J ) = H( K+1, J ) - REFSUM
-                  H( K+2, J ) = H( K+2, J ) - REFSUM*V( 2, M22 )
-   50          CONTINUE
-            END IF
-*
-*           ==== Multiply H by reflections from the right.
-*           .    Delay filling in the last row until the
-*           .    vigilant deflation check is complete. ====
-*
-            IF( ACCUM ) THEN
-               JTOP = MAX( KTOP, INCOL )
-            ELSE IF( WANTT ) THEN
-               JTOP = 1
-            ELSE
-               JTOP = KTOP
-            END IF
-            DO 90 M = MTOP, MBOT
-               IF( V( 1, M ).NE.ZERO ) THEN
-                  K = KRCOL + 3*( M-1 )
-                  DO 60 J = JTOP, MIN( KBOT, K+3 )
-                     REFSUM = V( 1, M )*( H( J, K+1 )+V( 2, M )*
-     $                        H( J, K+2 )+V( 3, M )*H( J, K+3 ) )
-                     H( J, K+1 ) = H( J, K+1 ) - REFSUM
-                     H( J, K+2 ) = H( J, K+2 ) - REFSUM*V( 2, M )
-                     H( J, K+3 ) = H( J, K+3 ) - REFSUM*V( 3, M )
-   60             CONTINUE
-*
-                  IF( ACCUM ) THEN
-*
-*                    ==== Accumulate U. (If necessary, update Z later
-*                    .    with with an efficient matrix-matrix
-*                    .    multiply.) ====
-*
-                     KMS = K - INCOL
-                     DO 70 J = MAX( 1, KTOP-INCOL ), KDU
-                        REFSUM = V( 1, M )*( U( J, KMS+1 )+V( 2, M )*
-     $                           U( J, KMS+2 )+V( 3, M )*U( J, KMS+3 ) )
-                        U( J, KMS+1 ) = U( J, KMS+1 ) - REFSUM
-                        U( J, KMS+2 ) = U( J, KMS+2 ) - REFSUM*V( 2, M )
-                        U( J, KMS+3 ) = U( J, KMS+3 ) - REFSUM*V( 3, M )
-   70                CONTINUE
-                  ELSE IF( WANTZ ) THEN
-*
-*                    ==== U is not accumulated, so update Z
-*                    .    now by multiplying by reflections
-*                    .    from the right. ====
-*
-                     DO 80 J = ILOZ, IHIZ
-                        REFSUM = V( 1, M )*( Z( J, K+1 )+V( 2, M )*
-     $                           Z( J, K+2 )+V( 3, M )*Z( J, K+3 ) )
-                        Z( J, K+1 ) = Z( J, K+1 ) - REFSUM
-                        Z( J, K+2 ) = Z( J, K+2 ) - REFSUM*V( 2, M )
-                        Z( J, K+3 ) = Z( J, K+3 ) - REFSUM*V( 3, M )
-   80                CONTINUE
-                  END IF
-               END IF
-   90       CONTINUE
-*
-*           ==== Special case: 2-by-2 reflection (if needed) ====
-*
-            K = KRCOL + 3*( M22-1 )
-            IF( BMP22 .AND. ( V( 1, M22 ).NE.ZERO ) ) THEN
-               DO 100 J = JTOP, MIN( KBOT, K+3 )
-                  REFSUM = V( 1, M22 )*( H( J, K+1 )+V( 2, M22 )*
-     $                     H( J, K+2 ) )
-                  H( J, K+1 ) = H( J, K+1 ) - REFSUM
-                  H( J, K+2 ) = H( J, K+2 ) - REFSUM*V( 2, M22 )
-  100          CONTINUE
-*
-               IF( ACCUM ) THEN
-                  KMS = K - INCOL
-                  DO 110 J = MAX( 1, KTOP-INCOL ), KDU
-                     REFSUM = V( 1, M22 )*( U( J, KMS+1 )+V( 2, M22 )*
-     $                        U( J, KMS+2 ) )
-                     U( J, KMS+1 ) = U( J, KMS+1 ) - REFSUM
-                     U( J, KMS+2 ) = U( J, KMS+2 ) - REFSUM*V( 2, M22 )
-  110             CONTINUE
-               ELSE IF( WANTZ ) THEN
-                  DO 120 J = ILOZ, IHIZ
-                     REFSUM = V( 1, M22 )*( Z( J, K+1 )+V( 2, M22 )*
-     $                        Z( J, K+2 ) )
-                     Z( J, K+1 ) = Z( J, K+1 ) - REFSUM
-                     Z( J, K+2 ) = Z( J, K+2 ) - REFSUM*V( 2, M22 )
-  120             CONTINUE
-               END IF
-            END IF
-*
-*           ==== Vigilant deflation check ====
-*
-            MSTART = MTOP
-            IF( KRCOL+3*( MSTART-1 ).LT.KTOP )
-     $         MSTART = MSTART + 1
-            MEND = MBOT
-            IF( BMP22 )
-     $         MEND = MEND + 1
-            IF( KRCOL.EQ.KBOT-2 )
-     $         MEND = MEND + 1
-            DO 130 M = MSTART, MEND
-               K = MIN( KBOT-1, KRCOL+3*( M-1 ) )
-*
-*              ==== The following convergence test requires that
-*              .    the tradition small-compared-to-nearby-diagonals
-*              .    criterion and the Ahues & Tisseur (LAWN 122, 1997)
-*              .    criteria both be satisfied.  The latter improves
-*              .    accuracy in some examples. Falling back on an
-*              .    alternate convergence criterion when TST1 or TST2
-*              .    is zero (as done here) is traditional but probably 
-*              .    unnecessary. ====
-*
-               IF( H( K+1, K ).NE.ZERO ) THEN
-                  TST1 = ABS( H( K, K ) ) + ABS( H( K+1, K+1 ) )
-                  IF( TST1.EQ.ZERO ) THEN
-                     IF( K.GE.KTOP+1 )
-     $                  TST1 = TST1 + ABS( H( K, K-1 ) )
-                     IF( K.GE.KTOP+2 )
-     $                  TST1 = TST1 + ABS( H( K, K-2 ) )
-                     IF( K.GE.KTOP+3 )
-     $                  TST1 = TST1 + ABS( H( K, K-3 ) )
-                     IF( K.LE.KBOT-2 )
-     $                  TST1 = TST1 + ABS( H( K+2, K+1 ) )
-                     IF( K.LE.KBOT-3 )
-     $                  TST1 = TST1 + ABS( H( K+3, K+1 ) )
-                     IF( K.LE.KBOT-4 )
-     $                  TST1 = TST1 + ABS( H( K+4, K+1 ) )
-                  END IF
-                  IF( ABS( H( K+1, K ) ).LE.MAX( SMLNUM, ULP*TST1 ) )
-     $                 THEN
-                     H12 = MAX( ABS( H( K+1, K ) ), ABS( H( K, K+1 ) ) )
-                     H21 = MIN( ABS( H( K+1, K ) ), ABS( H( K, K+1 ) ) )
-                     H11 = MAX( ABS( H( K+1, K+1 ) ),
-     $                     ABS( H( K, K )-H( K+1, K+1 ) ) )
-                     H22 = MIN( ABS( H( K+1, K+1 ) ),
-     $                     ABS( H( K, K )-H( K+1, K+1 ) ) )
-                     SCL = H11 + H12
-                     TST2 = H22*( H11 / SCL )
-*
-                     IF( TST2.EQ.ZERO .OR. H21*( H12 / SCL ).LE.
-     $                   MAX( SMLNUM, ULP*TST2 ) )H( K+1, K ) = ZERO
-                  END IF
-               END IF
-  130       CONTINUE
-*
-*           ==== Fill in the last row of each bulge. ====
-*
-            MEND = MIN( NBMPS, ( KBOT-KRCOL-1 ) / 3 )
-            DO 140 M = MTOP, MEND
-               K = KRCOL + 3*( M-1 )
-               REFSUM = V( 1, M )*V( 3, M )*H( K+4, K+3 )
-               H( K+4, K+1 ) = -REFSUM
-               H( K+4, K+2 ) = -REFSUM*V( 2, M )
-               H( K+4, K+3 ) = H( K+4, K+3 ) - REFSUM*V( 3, M )
-  140       CONTINUE
-*
-*           ==== End of near-the-diagonal bulge chase. ====
-*
-  150    CONTINUE
-*
-*        ==== Use U (if accumulated) to update far-from-diagonal
-*        .    entries in H.  If required, use U to update Z as
-*        .    well. ====
-*
-         IF( ACCUM ) THEN
-            IF( WANTT ) THEN
-               JTOP = 1
-               JBOT = N
-            ELSE
-               JTOP = KTOP
-               JBOT = KBOT
-            END IF
-            IF( ( .NOT.BLK22 ) .OR. ( INCOL.LT.KTOP ) .OR.
-     $          ( NDCOL.GT.KBOT ) .OR. ( NS.LE.2 ) ) THEN
-*
-*              ==== Updates not exploiting the 2-by-2 block
-*              .    structure of U.  K1 and NU keep track of
-*              .    the location and size of U in the special
-*              .    cases of introducing bulges and chasing
-*              .    bulges off the bottom.  In these special
-*              .    cases and in case the number of shifts
-*              .    is NS = 2, there is no 2-by-2 block
-*              .    structure to exploit.  ====
-*
-               K1 = MAX( 1, KTOP-INCOL )
-               NU = ( KDU-MAX( 0, NDCOL-KBOT ) ) - K1 + 1
-*
-*              ==== Horizontal Multiply ====
-*
-               DO 160 JCOL = MIN( NDCOL, KBOT ) + 1, JBOT, NH
-                  JLEN = MIN( NH, JBOT-JCOL+1 )
-                  CALL SGEMM( 'C', 'N', NU, JLEN, NU, ONE, U( K1, K1 ),
-     $                        LDU, H( INCOL+K1, JCOL ), LDH, ZERO, WH,
-     $                        LDWH )
-                  CALL SLACPY( 'ALL', NU, JLEN, WH, LDWH,
-     $                         H( INCOL+K1, JCOL ), LDH )
-  160          CONTINUE
-*
-*              ==== Vertical multiply ====
-*
-               DO 170 JROW = JTOP, MAX( KTOP, INCOL ) - 1, NV
-                  JLEN = MIN( NV, MAX( KTOP, INCOL )-JROW )
-                  CALL SGEMM( 'N', 'N', JLEN, NU, NU, ONE,
-     $                        H( JROW, INCOL+K1 ), LDH, U( K1, K1 ),
-     $                        LDU, ZERO, WV, LDWV )
-                  CALL SLACPY( 'ALL', JLEN, NU, WV, LDWV,
-     $                         H( JROW, INCOL+K1 ), LDH )
-  170          CONTINUE
-*
-*              ==== Z multiply (also vertical) ====
-*
-               IF( WANTZ ) THEN
-                  DO 180 JROW = ILOZ, IHIZ, NV
-                     JLEN = MIN( NV, IHIZ-JROW+1 )
-                     CALL SGEMM( 'N', 'N', JLEN, NU, NU, ONE,
-     $                           Z( JROW, INCOL+K1 ), LDZ, U( K1, K1 ),
-     $                           LDU, ZERO, WV, LDWV )
-                     CALL SLACPY( 'ALL', JLEN, NU, WV, LDWV,
-     $                            Z( JROW, INCOL+K1 ), LDZ )
-  180             CONTINUE
-               END IF
-            ELSE
-*
-*              ==== Updates exploiting U's 2-by-2 block structure.
-*              .    (I2, I4, J2, J4 are the last rows and columns
-*              .    of the blocks.) ====
-*
-               I2 = ( KDU+1 ) / 2
-               I4 = KDU
-               J2 = I4 - I2
-               J4 = KDU
-*
-*              ==== KZS and KNZ deal with the band of zeros
-*              .    along the diagonal of one of the triangular
-*              .    blocks. ====
-*
-               KZS = ( J4-J2 ) - ( NS+1 )
-               KNZ = NS + 1
-*
-*              ==== Horizontal multiply ====
-*
-               DO 190 JCOL = MIN( NDCOL, KBOT ) + 1, JBOT, NH
-                  JLEN = MIN( NH, JBOT-JCOL+1 )
-*
-*                 ==== Copy bottom of H to top+KZS of scratch ====
-*                  (The first KZS rows get multiplied by zero.) ====
-*
-                  CALL SLACPY( 'ALL', KNZ, JLEN, H( INCOL+1+J2, JCOL ),
-     $                         LDH, WH( KZS+1, 1 ), LDWH )
-*
-*                 ==== Multiply by U21' ====
-*
-                  CALL SLASET( 'ALL', KZS, JLEN, ZERO, ZERO, WH, LDWH )
-                  CALL STRMM( 'L', 'U', 'C', 'N', KNZ, JLEN, ONE,
-     $                        U( J2+1, 1+KZS ), LDU, WH( KZS+1, 1 ),
-     $                        LDWH )
-*
-*                 ==== Multiply top of H by U11' ====
-*
-                  CALL SGEMM( 'C', 'N', I2, JLEN, J2, ONE, U, LDU,
-     $                        H( INCOL+1, JCOL ), LDH, ONE, WH, LDWH )
-*
-*                 ==== Copy top of H bottom of WH ====
-*
-                  CALL SLACPY( 'ALL', J2, JLEN, H( INCOL+1, JCOL ), LDH,
-     $                         WH( I2+1, 1 ), LDWH )
-*
-*                 ==== Multiply by U21' ====
-*
-                  CALL STRMM( 'L', 'L', 'C', 'N', J2, JLEN, ONE,
-     $                        U( 1, I2+1 ), LDU, WH( I2+1, 1 ), LDWH )
-*
-*                 ==== Multiply by U22 ====
-*
-                  CALL SGEMM( 'C', 'N', I4-I2, JLEN, J4-J2, ONE,
-     $                        U( J2+1, I2+1 ), LDU,
-     $                        H( INCOL+1+J2, JCOL ), LDH, ONE,
-     $                        WH( I2+1, 1 ), LDWH )
-*
-*                 ==== Copy it back ====
-*
-                  CALL SLACPY( 'ALL', KDU, JLEN, WH, LDWH,
-     $                         H( INCOL+1, JCOL ), LDH )
-  190          CONTINUE
-*
-*              ==== Vertical multiply ====
-*
-               DO 200 JROW = JTOP, MAX( INCOL, KTOP ) - 1, NV
-                  JLEN = MIN( NV, MAX( INCOL, KTOP )-JROW )
-*
-*                 ==== Copy right of H to scratch (the first KZS
-*                 .    columns get multiplied by zero) ====
-*
-                  CALL SLACPY( 'ALL', JLEN, KNZ, H( JROW, INCOL+1+J2 ),
-     $                         LDH, WV( 1, 1+KZS ), LDWV )
-*
-*                 ==== Multiply by U21 ====
-*
-                  CALL SLASET( 'ALL', JLEN, KZS, ZERO, ZERO, WV, LDWV )
-                  CALL STRMM( 'R', 'U', 'N', 'N', JLEN, KNZ, ONE,
-     $                        U( J2+1, 1+KZS ), LDU, WV( 1, 1+KZS ),
-     $                        LDWV )
-*
-*                 ==== Multiply by U11 ====
-*
-                  CALL SGEMM( 'N', 'N', JLEN, I2, J2, ONE,
-     $                        H( JROW, INCOL+1 ), LDH, U, LDU, ONE, WV,
-     $                        LDWV )
-*
-*                 ==== Copy left of H to right of scratch ====
-*
-                  CALL SLACPY( 'ALL', JLEN, J2, H( JROW, INCOL+1 ), LDH,
-     $                         WV( 1, 1+I2 ), LDWV )
-*
-*                 ==== Multiply by U21 ====
-*
-                  CALL STRMM( 'R', 'L', 'N', 'N', JLEN, I4-I2, ONE,
-     $                        U( 1, I2+1 ), LDU, WV( 1, 1+I2 ), LDWV )
-*
-*                 ==== Multiply by U22 ====
-*
-                  CALL SGEMM( 'N', 'N', JLEN, I4-I2, J4-J2, ONE,
-     $                        H( JROW, INCOL+1+J2 ), LDH,
-     $                        U( J2+1, I2+1 ), LDU, ONE, WV( 1, 1+I2 ),
-     $                        LDWV )
-*
-*                 ==== Copy it back ====
-*
-                  CALL SLACPY( 'ALL', JLEN, KDU, WV, LDWV,
-     $                         H( JROW, INCOL+1 ), LDH )
-  200          CONTINUE
-*
-*              ==== Multiply Z (also vertical) ====
-*
-               IF( WANTZ ) THEN
-                  DO 210 JROW = ILOZ, IHIZ, NV
-                     JLEN = MIN( NV, IHIZ-JROW+1 )
-*
-*                    ==== Copy right of Z to left of scratch (first
-*                    .     KZS columns get multiplied by zero) ====
-*
-                     CALL SLACPY( 'ALL', JLEN, KNZ,
-     $                            Z( JROW, INCOL+1+J2 ), LDZ,
-     $                            WV( 1, 1+KZS ), LDWV )
-*
-*                    ==== Multiply by U12 ====
-*
-                     CALL SLASET( 'ALL', JLEN, KZS, ZERO, ZERO, WV,
-     $                            LDWV )
-                     CALL STRMM( 'R', 'U', 'N', 'N', JLEN, KNZ, ONE,
-     $                           U( J2+1, 1+KZS ), LDU, WV( 1, 1+KZS ),
-     $                           LDWV )
-*
-*                    ==== Multiply by U11 ====
-*
-                     CALL SGEMM( 'N', 'N', JLEN, I2, J2, ONE,
-     $                           Z( JROW, INCOL+1 ), LDZ, U, LDU, ONE,
-     $                           WV, LDWV )
-*
-*                    ==== Copy left of Z to right of scratch ====
-*
-                     CALL SLACPY( 'ALL', JLEN, J2, Z( JROW, INCOL+1 ),
-     $                            LDZ, WV( 1, 1+I2 ), LDWV )
-*
-*                    ==== Multiply by U21 ====
-*
-                     CALL STRMM( 'R', 'L', 'N', 'N', JLEN, I4-I2, ONE,
-     $                           U( 1, I2+1 ), LDU, WV( 1, 1+I2 ),
-     $                           LDWV )
-*
-*                    ==== Multiply by U22 ====
-*
-                     CALL SGEMM( 'N', 'N', JLEN, I4-I2, J4-J2, ONE,
-     $                           Z( JROW, INCOL+1+J2 ), LDZ,
-     $                           U( J2+1, I2+1 ), LDU, ONE,
-     $                           WV( 1, 1+I2 ), LDWV )
-*
-*                    ==== Copy the result back to Z ====
-*
-                     CALL SLACPY( 'ALL', JLEN, KDU, WV, LDWV,
-     $                            Z( JROW, INCOL+1 ), LDZ )
-  210             CONTINUE
-               END IF
-            END IF
-         END IF
-  220 CONTINUE
-*
-*     ==== End of SLAQR5 ====
-*
-      END
--- a/libcruft/lapack/slarf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,115 +0,0 @@
-      SUBROUTINE SLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE
-      INTEGER            INCV, LDC, M, N
-      REAL               TAU
-*     ..
-*     .. Array Arguments ..
-      REAL               C( LDC, * ), V( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLARF applies a real elementary reflector H to a real m by n matrix
-*  C, from either the left or the right. H is represented in the form
-*
-*        H = I - tau * v * v'
-*
-*  where tau is a real scalar and v is a real vector.
-*
-*  If tau = 0, then H is taken to be the unit matrix.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': form  H * C
-*          = 'R': form  C * H
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  V       (input) REAL array, dimension
-*                     (1 + (M-1)*abs(INCV)) if SIDE = 'L'
-*                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R'
-*          The vector v in the representation of H. V is not used if
-*          TAU = 0.
-*
-*  INCV    (input) INTEGER
-*          The increment between elements of v. INCV <> 0.
-*
-*  TAU     (input) REAL
-*          The value tau in the representation of H.
-*
-*  C       (input/output) REAL array, dimension (LDC,N)
-*          On entry, the m by n matrix C.
-*          On exit, C is overwritten by the matrix H * C if SIDE = 'L',
-*          or C * H if SIDE = 'R'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) REAL array, dimension
-*                         (N) if SIDE = 'L'
-*                      or (M) if SIDE = 'R'
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEMV, SGER
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  H * C
-*
-         IF( TAU.NE.ZERO ) THEN
-*
-*           w := C' * v
-*
-            CALL SGEMV( 'Transpose', M, N, ONE, C, LDC, V, INCV, ZERO,
-     $                  WORK, 1 )
-*
-*           C := C - v * w'
-*
-            CALL SGER( M, N, -TAU, V, INCV, WORK, 1, C, LDC )
-         END IF
-      ELSE
-*
-*        Form  C * H
-*
-         IF( TAU.NE.ZERO ) THEN
-*
-*           w := C * v
-*
-            CALL SGEMV( 'No transpose', M, N, ONE, C, LDC, V, INCV,
-     $                  ZERO, WORK, 1 )
-*
-*           C := C - w * v'
-*
-            CALL SGER( M, N, -TAU, WORK, 1, V, INCV, C, LDC )
-         END IF
-      END IF
-      RETURN
-*
-*     End of SLARF
-*
-      END
--- a/libcruft/lapack/slarfb.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,587 +0,0 @@
-      SUBROUTINE SLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,
-     $                   T, LDT, C, LDC, WORK, LDWORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, SIDE, STOREV, TRANS
-      INTEGER            K, LDC, LDT, LDV, LDWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               C( LDC, * ), T( LDT, * ), V( LDV, * ),
-     $                   WORK( LDWORK, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLARFB applies a real block reflector H or its transpose H' to a
-*  real m by n matrix C, from either the left or the right.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply H or H' from the Left
-*          = 'R': apply H or H' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply H (No transpose)
-*          = 'T': apply H' (Transpose)
-*
-*  DIRECT  (input) CHARACTER*1
-*          Indicates how H is formed from a product of elementary
-*          reflectors
-*          = 'F': H = H(1) H(2) . . . H(k) (Forward)
-*          = 'B': H = H(k) . . . H(2) H(1) (Backward)
-*
-*  STOREV  (input) CHARACTER*1
-*          Indicates how the vectors which define the elementary
-*          reflectors are stored:
-*          = 'C': Columnwise
-*          = 'R': Rowwise
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  K       (input) INTEGER
-*          The order of the matrix T (= the number of elementary
-*          reflectors whose product defines the block reflector).
-*
-*  V       (input) REAL array, dimension
-*                                (LDV,K) if STOREV = 'C'
-*                                (LDV,M) if STOREV = 'R' and SIDE = 'L'
-*                                (LDV,N) if STOREV = 'R' and SIDE = 'R'
-*          The matrix V. See further details.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V.
-*          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M);
-*          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N);
-*          if STOREV = 'R', LDV >= K.
-*
-*  T       (input) REAL array, dimension (LDT,K)
-*          The triangular k by k matrix T in the representation of the
-*          block reflector.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= K.
-*
-*  C       (input/output) REAL array, dimension (LDC,N)
-*          On entry, the m by n matrix C.
-*          On exit, C is overwritten by H*C or H'*C or C*H or C*H'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDA >= max(1,M).
-*
-*  WORK    (workspace) REAL array, dimension (LDWORK,K)
-*
-*  LDWORK  (input) INTEGER
-*          The leading dimension of the array WORK.
-*          If SIDE = 'L', LDWORK >= max(1,N);
-*          if SIDE = 'R', LDWORK >= max(1,M).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      CHARACTER          TRANST
-      INTEGER            I, J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SGEMM, STRMM
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 .OR. N.LE.0 )
-     $   RETURN
-*
-      IF( LSAME( TRANS, 'N' ) ) THEN
-         TRANST = 'T'
-      ELSE
-         TRANST = 'N'
-      END IF
-*
-      IF( LSAME( STOREV, 'C' ) ) THEN
-*
-         IF( LSAME( DIRECT, 'F' ) ) THEN
-*
-*           Let  V =  ( V1 )    (first K rows)
-*                     ( V2 )
-*           where  V1  is unit lower triangular.
-*
-            IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*              Form  H * C  or  H' * C  where  C = ( C1 )
-*                                                  ( C2 )
-*
-*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK)
-*
-*              W := C1'
-*
-               DO 10 J = 1, K
-                  CALL SCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 )
-   10          CONTINUE
-*
-*              W := W * V1
-*
-               CALL STRMM( 'Right', 'Lower', 'No transpose', 'Unit', N,
-     $                     K, ONE, V, LDV, WORK, LDWORK )
-               IF( M.GT.K ) THEN
-*
-*                 W := W + C2'*V2
-*
-                  CALL SGEMM( 'Transpose', 'No transpose', N, K, M-K,
-     $                        ONE, C( K+1, 1 ), LDC, V( K+1, 1 ), LDV,
-     $                        ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T'  or  W * T
-*
-               CALL STRMM( 'Right', 'Upper', TRANST, 'Non-unit', N, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - V * W'
-*
-               IF( M.GT.K ) THEN
-*
-*                 C2 := C2 - V2 * W'
-*
-                  CALL SGEMM( 'No transpose', 'Transpose', M-K, N, K,
-     $                        -ONE, V( K+1, 1 ), LDV, WORK, LDWORK, ONE,
-     $                        C( K+1, 1 ), LDC )
-               END IF
-*
-*              W := W * V1'
-*
-               CALL STRMM( 'Right', 'Lower', 'Transpose', 'Unit', N, K,
-     $                     ONE, V, LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W'
-*
-               DO 30 J = 1, K
-                  DO 20 I = 1, N
-                     C( J, I ) = C( J, I ) - WORK( I, J )
-   20             CONTINUE
-   30          CONTINUE
-*
-            ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*              Form  C * H  or  C * H'  where  C = ( C1  C2 )
-*
-*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)
-*
-*              W := C1
-*
-               DO 40 J = 1, K
-                  CALL SCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 )
-   40          CONTINUE
-*
-*              W := W * V1
-*
-               CALL STRMM( 'Right', 'Lower', 'No transpose', 'Unit', M,
-     $                     K, ONE, V, LDV, WORK, LDWORK )
-               IF( N.GT.K ) THEN
-*
-*                 W := W + C2 * V2
-*
-                  CALL SGEMM( 'No transpose', 'No transpose', M, K, N-K,
-     $                        ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV,
-     $                        ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T  or  W * T'
-*
-               CALL STRMM( 'Right', 'Upper', TRANS, 'Non-unit', M, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - W * V'
-*
-               IF( N.GT.K ) THEN
-*
-*                 C2 := C2 - W * V2'
-*
-                  CALL SGEMM( 'No transpose', 'Transpose', M, N-K, K,
-     $                        -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, ONE,
-     $                        C( 1, K+1 ), LDC )
-               END IF
-*
-*              W := W * V1'
-*
-               CALL STRMM( 'Right', 'Lower', 'Transpose', 'Unit', M, K,
-     $                     ONE, V, LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W
-*
-               DO 60 J = 1, K
-                  DO 50 I = 1, M
-                     C( I, J ) = C( I, J ) - WORK( I, J )
-   50             CONTINUE
-   60          CONTINUE
-            END IF
-*
-         ELSE
-*
-*           Let  V =  ( V1 )
-*                     ( V2 )    (last K rows)
-*           where  V2  is unit upper triangular.
-*
-            IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*              Form  H * C  or  H' * C  where  C = ( C1 )
-*                                                  ( C2 )
-*
-*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK)
-*
-*              W := C2'
-*
-               DO 70 J = 1, K
-                  CALL SCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ), 1 )
-   70          CONTINUE
-*
-*              W := W * V2
-*
-               CALL STRMM( 'Right', 'Upper', 'No transpose', 'Unit', N,
-     $                     K, ONE, V( M-K+1, 1 ), LDV, WORK, LDWORK )
-               IF( M.GT.K ) THEN
-*
-*                 W := W + C1'*V1
-*
-                  CALL SGEMM( 'Transpose', 'No transpose', N, K, M-K,
-     $                        ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T'  or  W * T
-*
-               CALL STRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - V * W'
-*
-               IF( M.GT.K ) THEN
-*
-*                 C1 := C1 - V1 * W'
-*
-                  CALL SGEMM( 'No transpose', 'Transpose', M-K, N, K,
-     $                        -ONE, V, LDV, WORK, LDWORK, ONE, C, LDC )
-               END IF
-*
-*              W := W * V2'
-*
-               CALL STRMM( 'Right', 'Upper', 'Transpose', 'Unit', N, K,
-     $                     ONE, V( M-K+1, 1 ), LDV, WORK, LDWORK )
-*
-*              C2 := C2 - W'
-*
-               DO 90 J = 1, K
-                  DO 80 I = 1, N
-                     C( M-K+J, I ) = C( M-K+J, I ) - WORK( I, J )
-   80             CONTINUE
-   90          CONTINUE
-*
-            ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*              Form  C * H  or  C * H'  where  C = ( C1  C2 )
-*
-*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)
-*
-*              W := C2
-*
-               DO 100 J = 1, K
-                  CALL SCOPY( M, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )
-  100          CONTINUE
-*
-*              W := W * V2
-*
-               CALL STRMM( 'Right', 'Upper', 'No transpose', 'Unit', M,
-     $                     K, ONE, V( N-K+1, 1 ), LDV, WORK, LDWORK )
-               IF( N.GT.K ) THEN
-*
-*                 W := W + C1 * V1
-*
-                  CALL SGEMM( 'No transpose', 'No transpose', M, K, N-K,
-     $                        ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T  or  W * T'
-*
-               CALL STRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - W * V'
-*
-               IF( N.GT.K ) THEN
-*
-*                 C1 := C1 - W * V1'
-*
-                  CALL SGEMM( 'No transpose', 'Transpose', M, N-K, K,
-     $                        -ONE, WORK, LDWORK, V, LDV, ONE, C, LDC )
-               END IF
-*
-*              W := W * V2'
-*
-               CALL STRMM( 'Right', 'Upper', 'Transpose', 'Unit', M, K,
-     $                     ONE, V( N-K+1, 1 ), LDV, WORK, LDWORK )
-*
-*              C2 := C2 - W
-*
-               DO 120 J = 1, K
-                  DO 110 I = 1, M
-                     C( I, N-K+J ) = C( I, N-K+J ) - WORK( I, J )
-  110             CONTINUE
-  120          CONTINUE
-            END IF
-         END IF
-*
-      ELSE IF( LSAME( STOREV, 'R' ) ) THEN
-*
-         IF( LSAME( DIRECT, 'F' ) ) THEN
-*
-*           Let  V =  ( V1  V2 )    (V1: first K columns)
-*           where  V1  is unit upper triangular.
-*
-            IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*              Form  H * C  or  H' * C  where  C = ( C1 )
-*                                                  ( C2 )
-*
-*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK)
-*
-*              W := C1'
-*
-               DO 130 J = 1, K
-                  CALL SCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 )
-  130          CONTINUE
-*
-*              W := W * V1'
-*
-               CALL STRMM( 'Right', 'Upper', 'Transpose', 'Unit', N, K,
-     $                     ONE, V, LDV, WORK, LDWORK )
-               IF( M.GT.K ) THEN
-*
-*                 W := W + C2'*V2'
-*
-                  CALL SGEMM( 'Transpose', 'Transpose', N, K, M-K, ONE,
-     $                        C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, ONE,
-     $                        WORK, LDWORK )
-               END IF
-*
-*              W := W * T'  or  W * T
-*
-               CALL STRMM( 'Right', 'Upper', TRANST, 'Non-unit', N, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - V' * W'
-*
-               IF( M.GT.K ) THEN
-*
-*                 C2 := C2 - V2' * W'
-*
-                  CALL SGEMM( 'Transpose', 'Transpose', M-K, N, K, -ONE,
-     $                        V( 1, K+1 ), LDV, WORK, LDWORK, ONE,
-     $                        C( K+1, 1 ), LDC )
-               END IF
-*
-*              W := W * V1
-*
-               CALL STRMM( 'Right', 'Upper', 'No transpose', 'Unit', N,
-     $                     K, ONE, V, LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W'
-*
-               DO 150 J = 1, K
-                  DO 140 I = 1, N
-                     C( J, I ) = C( J, I ) - WORK( I, J )
-  140             CONTINUE
-  150          CONTINUE
-*
-            ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*              Form  C * H  or  C * H'  where  C = ( C1  C2 )
-*
-*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK)
-*
-*              W := C1
-*
-               DO 160 J = 1, K
-                  CALL SCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 )
-  160          CONTINUE
-*
-*              W := W * V1'
-*
-               CALL STRMM( 'Right', 'Upper', 'Transpose', 'Unit', M, K,
-     $                     ONE, V, LDV, WORK, LDWORK )
-               IF( N.GT.K ) THEN
-*
-*                 W := W + C2 * V2'
-*
-                  CALL SGEMM( 'No transpose', 'Transpose', M, K, N-K,
-     $                        ONE, C( 1, K+1 ), LDC, V( 1, K+1 ), LDV,
-     $                        ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T  or  W * T'
-*
-               CALL STRMM( 'Right', 'Upper', TRANS, 'Non-unit', M, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - W * V
-*
-               IF( N.GT.K ) THEN
-*
-*                 C2 := C2 - W * V2
-*
-                  CALL SGEMM( 'No transpose', 'No transpose', M, N-K, K,
-     $                        -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, ONE,
-     $                        C( 1, K+1 ), LDC )
-               END IF
-*
-*              W := W * V1
-*
-               CALL STRMM( 'Right', 'Upper', 'No transpose', 'Unit', M,
-     $                     K, ONE, V, LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W
-*
-               DO 180 J = 1, K
-                  DO 170 I = 1, M
-                     C( I, J ) = C( I, J ) - WORK( I, J )
-  170             CONTINUE
-  180          CONTINUE
-*
-            END IF
-*
-         ELSE
-*
-*           Let  V =  ( V1  V2 )    (V2: last K columns)
-*           where  V2  is unit lower triangular.
-*
-            IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*              Form  H * C  or  H' * C  where  C = ( C1 )
-*                                                  ( C2 )
-*
-*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK)
-*
-*              W := C2'
-*
-               DO 190 J = 1, K
-                  CALL SCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ), 1 )
-  190          CONTINUE
-*
-*              W := W * V2'
-*
-               CALL STRMM( 'Right', 'Lower', 'Transpose', 'Unit', N, K,
-     $                     ONE, V( 1, M-K+1 ), LDV, WORK, LDWORK )
-               IF( M.GT.K ) THEN
-*
-*                 W := W + C1'*V1'
-*
-                  CALL SGEMM( 'Transpose', 'Transpose', N, K, M-K, ONE,
-     $                        C, LDC, V, LDV, ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T'  or  W * T
-*
-               CALL STRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - V' * W'
-*
-               IF( M.GT.K ) THEN
-*
-*                 C1 := C1 - V1' * W'
-*
-                  CALL SGEMM( 'Transpose', 'Transpose', M-K, N, K, -ONE,
-     $                        V, LDV, WORK, LDWORK, ONE, C, LDC )
-               END IF
-*
-*              W := W * V2
-*
-               CALL STRMM( 'Right', 'Lower', 'No transpose', 'Unit', N,
-     $                     K, ONE, V( 1, M-K+1 ), LDV, WORK, LDWORK )
-*
-*              C2 := C2 - W'
-*
-               DO 210 J = 1, K
-                  DO 200 I = 1, N
-                     C( M-K+J, I ) = C( M-K+J, I ) - WORK( I, J )
-  200             CONTINUE
-  210          CONTINUE
-*
-            ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*              Form  C * H  or  C * H'  where  C = ( C1  C2 )
-*
-*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK)
-*
-*              W := C2
-*
-               DO 220 J = 1, K
-                  CALL SCOPY( M, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )
-  220          CONTINUE
-*
-*              W := W * V2'
-*
-               CALL STRMM( 'Right', 'Lower', 'Transpose', 'Unit', M, K,
-     $                     ONE, V( 1, N-K+1 ), LDV, WORK, LDWORK )
-               IF( N.GT.K ) THEN
-*
-*                 W := W + C1 * V1'
-*
-                  CALL SGEMM( 'No transpose', 'Transpose', M, K, N-K,
-     $                        ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T  or  W * T'
-*
-               CALL STRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - W * V
-*
-               IF( N.GT.K ) THEN
-*
-*                 C1 := C1 - W * V1
-*
-                  CALL SGEMM( 'No transpose', 'No transpose', M, N-K, K,
-     $                        -ONE, WORK, LDWORK, V, LDV, ONE, C, LDC )
-               END IF
-*
-*              W := W * V2
-*
-               CALL STRMM( 'Right', 'Lower', 'No transpose', 'Unit', M,
-     $                     K, ONE, V( 1, N-K+1 ), LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W
-*
-               DO 240 J = 1, K
-                  DO 230 I = 1, M
-                     C( I, N-K+J ) = C( I, N-K+J ) - WORK( I, J )
-  230             CONTINUE
-  240          CONTINUE
-*
-            END IF
-*
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of SLARFB
-*
-      END
--- a/libcruft/lapack/slarfg.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,137 +0,0 @@
-      SUBROUTINE SLARFG( N, ALPHA, X, INCX, TAU )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-      REAL               ALPHA, TAU
-*     ..
-*     .. Array Arguments ..
-      REAL               X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLARFG generates a real elementary reflector H of order n, such
-*  that
-*
-*        H * ( alpha ) = ( beta ),   H' * H = I.
-*            (   x   )   (   0  )
-*
-*  where alpha and beta are scalars, and x is an (n-1)-element real
-*  vector. H is represented in the form
-*
-*        H = I - tau * ( 1 ) * ( 1 v' ) ,
-*                      ( v )
-*
-*  where tau is a real scalar and v is a real (n-1)-element
-*  vector.
-*
-*  If the elements of x are all zero, then tau = 0 and H is taken to be
-*  the unit matrix.
-*
-*  Otherwise  1 <= tau <= 2.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the elementary reflector.
-*
-*  ALPHA   (input/output) REAL
-*          On entry, the value alpha.
-*          On exit, it is overwritten with the value beta.
-*
-*  X       (input/output) REAL array, dimension
-*                         (1+(N-2)*abs(INCX))
-*          On entry, the vector x.
-*          On exit, it is overwritten with the vector v.
-*
-*  INCX    (input) INTEGER
-*          The increment between elements of X. INCX > 0.
-*
-*  TAU     (output) REAL
-*          The value tau.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            J, KNT
-      REAL               BETA, RSAFMN, SAFMIN, XNORM
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH, SLAPY2, SNRM2
-      EXTERNAL           SLAMCH, SLAPY2, SNRM2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, SIGN
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SSCAL
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.LE.1 ) THEN
-         TAU = ZERO
-         RETURN
-      END IF
-*
-      XNORM = SNRM2( N-1, X, INCX )
-*
-      IF( XNORM.EQ.ZERO ) THEN
-*
-*        H  =  I
-*
-         TAU = ZERO
-      ELSE
-*
-*        general case
-*
-         BETA = -SIGN( SLAPY2( ALPHA, XNORM ), ALPHA )
-         SAFMIN = SLAMCH( 'S' ) / SLAMCH( 'E' )
-         IF( ABS( BETA ).LT.SAFMIN ) THEN
-*
-*           XNORM, BETA may be inaccurate; scale X and recompute them
-*
-            RSAFMN = ONE / SAFMIN
-            KNT = 0
-   10       CONTINUE
-            KNT = KNT + 1
-            CALL SSCAL( N-1, RSAFMN, X, INCX )
-            BETA = BETA*RSAFMN
-            ALPHA = ALPHA*RSAFMN
-            IF( ABS( BETA ).LT.SAFMIN )
-     $         GO TO 10
-*
-*           New BETA is at most 1, at least SAFMIN
-*
-            XNORM = SNRM2( N-1, X, INCX )
-            BETA = -SIGN( SLAPY2( ALPHA, XNORM ), ALPHA )
-            TAU = ( BETA-ALPHA ) / BETA
-            CALL SSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX )
-*
-*           If ALPHA is subnormal, it may lose relative accuracy
-*
-            ALPHA = BETA
-            DO 20 J = 1, KNT
-               ALPHA = ALPHA*SAFMIN
-   20       CONTINUE
-         ELSE
-            TAU = ( BETA-ALPHA ) / BETA
-            CALL SSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX )
-            ALPHA = BETA
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of SLARFG
-*
-      END
--- a/libcruft/lapack/slarft.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,217 +0,0 @@
-      SUBROUTINE SLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, STOREV
-      INTEGER            K, LDT, LDV, N
-*     ..
-*     .. Array Arguments ..
-      REAL               T( LDT, * ), TAU( * ), V( LDV, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLARFT forms the triangular factor T of a real block reflector H
-*  of order n, which is defined as a product of k elementary reflectors.
-*
-*  If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular;
-*
-*  If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular.
-*
-*  If STOREV = 'C', the vector which defines the elementary reflector
-*  H(i) is stored in the i-th column of the array V, and
-*
-*     H  =  I - V * T * V'
-*
-*  If STOREV = 'R', the vector which defines the elementary reflector
-*  H(i) is stored in the i-th row of the array V, and
-*
-*     H  =  I - V' * T * V
-*
-*  Arguments
-*  =========
-*
-*  DIRECT  (input) CHARACTER*1
-*          Specifies the order in which the elementary reflectors are
-*          multiplied to form the block reflector:
-*          = 'F': H = H(1) H(2) . . . H(k) (Forward)
-*          = 'B': H = H(k) . . . H(2) H(1) (Backward)
-*
-*  STOREV  (input) CHARACTER*1
-*          Specifies how the vectors which define the elementary
-*          reflectors are stored (see also Further Details):
-*          = 'C': columnwise
-*          = 'R': rowwise
-*
-*  N       (input) INTEGER
-*          The order of the block reflector H. N >= 0.
-*
-*  K       (input) INTEGER
-*          The order of the triangular factor T (= the number of
-*          elementary reflectors). K >= 1.
-*
-*  V       (input/output) REAL array, dimension
-*                               (LDV,K) if STOREV = 'C'
-*                               (LDV,N) if STOREV = 'R'
-*          The matrix V. See further details.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V.
-*          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K.
-*
-*  TAU     (input) REAL array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i).
-*
-*  T       (output) REAL array, dimension (LDT,K)
-*          The k by k triangular factor T of the block reflector.
-*          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is
-*          lower triangular. The rest of the array is not used.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= K.
-*
-*  Further Details
-*  ===============
-*
-*  The shape of the matrix V and the storage of the vectors which define
-*  the H(i) is best illustrated by the following example with n = 5 and
-*  k = 3. The elements equal to 1 are not stored; the corresponding
-*  array elements are modified but restored on exit. The rest of the
-*  array is not used.
-*
-*  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':
-*
-*               V = (  1       )                 V = (  1 v1 v1 v1 v1 )
-*                   ( v1  1    )                     (     1 v2 v2 v2 )
-*                   ( v1 v2  1 )                     (        1 v3 v3 )
-*                   ( v1 v2 v3 )
-*                   ( v1 v2 v3 )
-*
-*  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R':
-*
-*               V = ( v1 v2 v3 )                 V = ( v1 v1  1       )
-*                   ( v1 v2 v3 )                     ( v2 v2 v2  1    )
-*                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 )
-*                   (     1 v3 )
-*                   (        1 )
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      REAL               VII
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEMV, STRMV
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( LSAME( DIRECT, 'F' ) ) THEN
-         DO 20 I = 1, K
-            IF( TAU( I ).EQ.ZERO ) THEN
-*
-*              H(i)  =  I
-*
-               DO 10 J = 1, I
-                  T( J, I ) = ZERO
-   10          CONTINUE
-            ELSE
-*
-*              general case
-*
-               VII = V( I, I )
-               V( I, I ) = ONE
-               IF( LSAME( STOREV, 'C' ) ) THEN
-*
-*                 T(1:i-1,i) := - tau(i) * V(i:n,1:i-1)' * V(i:n,i)
-*
-                  CALL SGEMV( 'Transpose', N-I+1, I-1, -TAU( I ),
-     $                        V( I, 1 ), LDV, V( I, I ), 1, ZERO,
-     $                        T( 1, I ), 1 )
-               ELSE
-*
-*                 T(1:i-1,i) := - tau(i) * V(1:i-1,i:n) * V(i,i:n)'
-*
-                  CALL SGEMV( 'No transpose', I-1, N-I+1, -TAU( I ),
-     $                        V( 1, I ), LDV, V( I, I ), LDV, ZERO,
-     $                        T( 1, I ), 1 )
-               END IF
-               V( I, I ) = VII
-*
-*              T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i)
-*
-               CALL STRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T,
-     $                     LDT, T( 1, I ), 1 )
-               T( I, I ) = TAU( I )
-            END IF
-   20    CONTINUE
-      ELSE
-         DO 40 I = K, 1, -1
-            IF( TAU( I ).EQ.ZERO ) THEN
-*
-*              H(i)  =  I
-*
-               DO 30 J = I, K
-                  T( J, I ) = ZERO
-   30          CONTINUE
-            ELSE
-*
-*              general case
-*
-               IF( I.LT.K ) THEN
-                  IF( LSAME( STOREV, 'C' ) ) THEN
-                     VII = V( N-K+I, I )
-                     V( N-K+I, I ) = ONE
-*
-*                    T(i+1:k,i) :=
-*                            - tau(i) * V(1:n-k+i,i+1:k)' * V(1:n-k+i,i)
-*
-                     CALL SGEMV( 'Transpose', N-K+I, K-I, -TAU( I ),
-     $                           V( 1, I+1 ), LDV, V( 1, I ), 1, ZERO,
-     $                           T( I+1, I ), 1 )
-                     V( N-K+I, I ) = VII
-                  ELSE
-                     VII = V( I, N-K+I )
-                     V( I, N-K+I ) = ONE
-*
-*                    T(i+1:k,i) :=
-*                            - tau(i) * V(i+1:k,1:n-k+i) * V(i,1:n-k+i)'
-*
-                     CALL SGEMV( 'No transpose', K-I, N-K+I, -TAU( I ),
-     $                           V( I+1, 1 ), LDV, V( I, 1 ), LDV, ZERO,
-     $                           T( I+1, I ), 1 )
-                     V( I, N-K+I ) = VII
-                  END IF
-*
-*                 T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i)
-*
-                  CALL STRMV( 'Lower', 'No transpose', 'Non-unit', K-I,
-     $                        T( I+1, I+1 ), LDT, T( I+1, I ), 1 )
-               END IF
-               T( I, I ) = TAU( I )
-            END IF
-   40    CONTINUE
-      END IF
-      RETURN
-*
-*     End of SLARFT
-*
-      END
--- a/libcruft/lapack/slarfx.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,637 +0,0 @@
-      SUBROUTINE SLARFX( SIDE, M, N, V, TAU, C, LDC, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE
-      INTEGER            LDC, M, N
-      REAL               TAU
-*     ..
-*     .. Array Arguments ..
-      REAL               C( LDC, * ), V( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLARFX applies a real elementary reflector H to a real m by n
-*  matrix C, from either the left or the right. H is represented in the
-*  form
-*
-*        H = I - tau * v * v'
-*
-*  where tau is a real scalar and v is a real vector.
-*
-*  If tau = 0, then H is taken to be the unit matrix
-*
-*  This version uses inline code if H has order < 11.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': form  H * C
-*          = 'R': form  C * H
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  V       (input) REAL array, dimension (M) if SIDE = 'L'
-*                                     or (N) if SIDE = 'R'
-*          The vector v in the representation of H.
-*
-*  TAU     (input) REAL
-*          The value tau in the representation of H.
-*
-*  C       (input/output) REAL array, dimension (LDC,N)
-*          On entry, the m by n matrix C.
-*          On exit, C is overwritten by the matrix H * C if SIDE = 'L',
-*          or C * H if SIDE = 'R'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDA >= (1,M).
-*
-*  WORK    (workspace) REAL array, dimension
-*                      (N) if SIDE = 'L'
-*                      or (M) if SIDE = 'R'
-*          WORK is not referenced if H has order < 11.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            J
-      REAL               SUM, T1, T10, T2, T3, T4, T5, T6, T7, T8, T9,
-     $                   V1, V10, V2, V3, V4, V5, V6, V7, V8, V9
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEMV, SGER
-*     ..
-*     .. Executable Statements ..
-*
-      IF( TAU.EQ.ZERO )
-     $   RETURN
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  H * C, where H has order m.
-*
-         GO TO ( 10, 30, 50, 70, 90, 110, 130, 150,
-     $           170, 190 )M
-*
-*        Code for general M
-*
-*        w := C'*v
-*
-         CALL SGEMV( 'Transpose', M, N, ONE, C, LDC, V, 1, ZERO, WORK,
-     $               1 )
-*
-*        C := C - tau * v * w'
-*
-         CALL SGER( M, N, -TAU, V, 1, WORK, 1, C, LDC )
-         GO TO 410
-   10    CONTINUE
-*
-*        Special code for 1 x 1 Householder
-*
-         T1 = ONE - TAU*V( 1 )*V( 1 )
-         DO 20 J = 1, N
-            C( 1, J ) = T1*C( 1, J )
-   20    CONTINUE
-         GO TO 410
-   30    CONTINUE
-*
-*        Special code for 2 x 2 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         DO 40 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-   40    CONTINUE
-         GO TO 410
-   50    CONTINUE
-*
-*        Special code for 3 x 3 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         DO 60 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-   60    CONTINUE
-         GO TO 410
-   70    CONTINUE
-*
-*        Special code for 4 x 4 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         DO 80 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-   80    CONTINUE
-         GO TO 410
-   90    CONTINUE
-*
-*        Special code for 5 x 5 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         DO 100 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-  100    CONTINUE
-         GO TO 410
-  110    CONTINUE
-*
-*        Special code for 6 x 6 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         DO 120 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-  120    CONTINUE
-         GO TO 410
-  130    CONTINUE
-*
-*        Special code for 7 x 7 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         V7 = V( 7 )
-         T7 = TAU*V7
-         DO 140 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J ) +
-     $            V7*C( 7, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-            C( 7, J ) = C( 7, J ) - SUM*T7
-  140    CONTINUE
-         GO TO 410
-  150    CONTINUE
-*
-*        Special code for 8 x 8 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         V7 = V( 7 )
-         T7 = TAU*V7
-         V8 = V( 8 )
-         T8 = TAU*V8
-         DO 160 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J ) +
-     $            V7*C( 7, J ) + V8*C( 8, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-            C( 7, J ) = C( 7, J ) - SUM*T7
-            C( 8, J ) = C( 8, J ) - SUM*T8
-  160    CONTINUE
-         GO TO 410
-  170    CONTINUE
-*
-*        Special code for 9 x 9 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         V7 = V( 7 )
-         T7 = TAU*V7
-         V8 = V( 8 )
-         T8 = TAU*V8
-         V9 = V( 9 )
-         T9 = TAU*V9
-         DO 180 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J ) +
-     $            V7*C( 7, J ) + V8*C( 8, J ) + V9*C( 9, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-            C( 7, J ) = C( 7, J ) - SUM*T7
-            C( 8, J ) = C( 8, J ) - SUM*T8
-            C( 9, J ) = C( 9, J ) - SUM*T9
-  180    CONTINUE
-         GO TO 410
-  190    CONTINUE
-*
-*        Special code for 10 x 10 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         V7 = V( 7 )
-         T7 = TAU*V7
-         V8 = V( 8 )
-         T8 = TAU*V8
-         V9 = V( 9 )
-         T9 = TAU*V9
-         V10 = V( 10 )
-         T10 = TAU*V10
-         DO 200 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J ) +
-     $            V7*C( 7, J ) + V8*C( 8, J ) + V9*C( 9, J ) +
-     $            V10*C( 10, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-            C( 7, J ) = C( 7, J ) - SUM*T7
-            C( 8, J ) = C( 8, J ) - SUM*T8
-            C( 9, J ) = C( 9, J ) - SUM*T9
-            C( 10, J ) = C( 10, J ) - SUM*T10
-  200    CONTINUE
-         GO TO 410
-      ELSE
-*
-*        Form  C * H, where H has order n.
-*
-         GO TO ( 210, 230, 250, 270, 290, 310, 330, 350,
-     $           370, 390 )N
-*
-*        Code for general N
-*
-*        w := C * v
-*
-         CALL SGEMV( 'No transpose', M, N, ONE, C, LDC, V, 1, ZERO,
-     $               WORK, 1 )
-*
-*        C := C - tau * w * v'
-*
-         CALL SGER( M, N, -TAU, WORK, 1, V, 1, C, LDC )
-         GO TO 410
-  210    CONTINUE
-*
-*        Special code for 1 x 1 Householder
-*
-         T1 = ONE - TAU*V( 1 )*V( 1 )
-         DO 220 J = 1, M
-            C( J, 1 ) = T1*C( J, 1 )
-  220    CONTINUE
-         GO TO 410
-  230    CONTINUE
-*
-*        Special code for 2 x 2 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         DO 240 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-  240    CONTINUE
-         GO TO 410
-  250    CONTINUE
-*
-*        Special code for 3 x 3 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         DO 260 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-  260    CONTINUE
-         GO TO 410
-  270    CONTINUE
-*
-*        Special code for 4 x 4 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         DO 280 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-  280    CONTINUE
-         GO TO 410
-  290    CONTINUE
-*
-*        Special code for 5 x 5 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         DO 300 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-  300    CONTINUE
-         GO TO 410
-  310    CONTINUE
-*
-*        Special code for 6 x 6 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         DO 320 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-  320    CONTINUE
-         GO TO 410
-  330    CONTINUE
-*
-*        Special code for 7 x 7 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         V7 = V( 7 )
-         T7 = TAU*V7
-         DO 340 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 ) +
-     $            V7*C( J, 7 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-            C( J, 7 ) = C( J, 7 ) - SUM*T7
-  340    CONTINUE
-         GO TO 410
-  350    CONTINUE
-*
-*        Special code for 8 x 8 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         V7 = V( 7 )
-         T7 = TAU*V7
-         V8 = V( 8 )
-         T8 = TAU*V8
-         DO 360 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 ) +
-     $            V7*C( J, 7 ) + V8*C( J, 8 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-            C( J, 7 ) = C( J, 7 ) - SUM*T7
-            C( J, 8 ) = C( J, 8 ) - SUM*T8
-  360    CONTINUE
-         GO TO 410
-  370    CONTINUE
-*
-*        Special code for 9 x 9 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         V7 = V( 7 )
-         T7 = TAU*V7
-         V8 = V( 8 )
-         T8 = TAU*V8
-         V9 = V( 9 )
-         T9 = TAU*V9
-         DO 380 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 ) +
-     $            V7*C( J, 7 ) + V8*C( J, 8 ) + V9*C( J, 9 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-            C( J, 7 ) = C( J, 7 ) - SUM*T7
-            C( J, 8 ) = C( J, 8 ) - SUM*T8
-            C( J, 9 ) = C( J, 9 ) - SUM*T9
-  380    CONTINUE
-         GO TO 410
-  390    CONTINUE
-*
-*        Special code for 10 x 10 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*V1
-         V2 = V( 2 )
-         T2 = TAU*V2
-         V3 = V( 3 )
-         T3 = TAU*V3
-         V4 = V( 4 )
-         T4 = TAU*V4
-         V5 = V( 5 )
-         T5 = TAU*V5
-         V6 = V( 6 )
-         T6 = TAU*V6
-         V7 = V( 7 )
-         T7 = TAU*V7
-         V8 = V( 8 )
-         T8 = TAU*V8
-         V9 = V( 9 )
-         T9 = TAU*V9
-         V10 = V( 10 )
-         T10 = TAU*V10
-         DO 400 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 ) +
-     $            V7*C( J, 7 ) + V8*C( J, 8 ) + V9*C( J, 9 ) +
-     $            V10*C( J, 10 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-            C( J, 7 ) = C( J, 7 ) - SUM*T7
-            C( J, 8 ) = C( J, 8 ) - SUM*T8
-            C( J, 9 ) = C( J, 9 ) - SUM*T9
-            C( J, 10 ) = C( J, 10 ) - SUM*T10
-  400    CONTINUE
-         GO TO 410
-      END IF
-  410 RETURN
-*
-*     End of SLARFX
-*
-      END
--- a/libcruft/lapack/slartg.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-      SUBROUTINE SLARTG( F, G, CS, SN, R )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      REAL               CS, F, G, R, SN
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLARTG generate a plane rotation so that
-*
-*     [  CS  SN  ]  .  [ F ]  =  [ R ]   where CS**2 + SN**2 = 1.
-*     [ -SN  CS  ]     [ G ]     [ 0 ]
-*
-*  This is a slower, more accurate version of the BLAS1 routine SROTG,
-*  with the following other differences:
-*     F and G are unchanged on return.
-*     If G=0, then CS=1 and SN=0.
-*     If F=0 and (G .ne. 0), then CS=0 and SN=1 without doing any
-*        floating point operations (saves work in SBDSQR when
-*        there are zeros on the diagonal).
-*
-*  If F exceeds G in magnitude, CS will be positive.
-*
-*  Arguments
-*  =========
-*
-*  F       (input) REAL
-*          The first component of vector to be rotated.
-*
-*  G       (input) REAL
-*          The second component of vector to be rotated.
-*
-*  CS      (output) REAL
-*          The cosine of the rotation.
-*
-*  SN      (output) REAL
-*          The sine of the rotation.
-*
-*  R       (output) REAL
-*          The nonzero component of the rotated vector.
-*
-*  This version has a few statements commented out for thread safety
-*  (machine parameters are computed on each entry). 10 feb 03, SJH.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E0 )
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E0 )
-      REAL               TWO
-      PARAMETER          ( TWO = 2.0E0 )
-*     ..
-*     .. Local Scalars ..
-*     LOGICAL            FIRST
-      INTEGER            COUNT, I
-      REAL               EPS, F1, G1, SAFMIN, SAFMN2, SAFMX2, SCALE
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      EXTERNAL           SLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, INT, LOG, MAX, SQRT
-*     ..
-*     .. Save statement ..
-*     SAVE               FIRST, SAFMX2, SAFMIN, SAFMN2
-*     ..
-*     .. Data statements ..
-*     DATA               FIRST / .TRUE. /
-*     ..
-*     .. Executable Statements ..
-*
-*     IF( FIRST ) THEN
-         SAFMIN = SLAMCH( 'S' )
-         EPS = SLAMCH( 'E' )
-         SAFMN2 = SLAMCH( 'B' )**INT( LOG( SAFMIN / EPS ) /
-     $            LOG( SLAMCH( 'B' ) ) / TWO )
-         SAFMX2 = ONE / SAFMN2
-*        FIRST = .FALSE.
-*     END IF
-      IF( G.EQ.ZERO ) THEN
-         CS = ONE
-         SN = ZERO
-         R = F
-      ELSE IF( F.EQ.ZERO ) THEN
-         CS = ZERO
-         SN = ONE
-         R = G
-      ELSE
-         F1 = F
-         G1 = G
-         SCALE = MAX( ABS( F1 ), ABS( G1 ) )
-         IF( SCALE.GE.SAFMX2 ) THEN
-            COUNT = 0
-   10       CONTINUE
-            COUNT = COUNT + 1
-            F1 = F1*SAFMN2
-            G1 = G1*SAFMN2
-            SCALE = MAX( ABS( F1 ), ABS( G1 ) )
-            IF( SCALE.GE.SAFMX2 )
-     $         GO TO 10
-            R = SQRT( F1**2+G1**2 )
-            CS = F1 / R
-            SN = G1 / R
-            DO 20 I = 1, COUNT
-               R = R*SAFMX2
-   20       CONTINUE
-         ELSE IF( SCALE.LE.SAFMN2 ) THEN
-            COUNT = 0
-   30       CONTINUE
-            COUNT = COUNT + 1
-            F1 = F1*SAFMX2
-            G1 = G1*SAFMX2
-            SCALE = MAX( ABS( F1 ), ABS( G1 ) )
-            IF( SCALE.LE.SAFMN2 )
-     $         GO TO 30
-            R = SQRT( F1**2+G1**2 )
-            CS = F1 / R
-            SN = G1 / R
-            DO 40 I = 1, COUNT
-               R = R*SAFMN2
-   40       CONTINUE
-         ELSE
-            R = SQRT( F1**2+G1**2 )
-            CS = F1 / R
-            SN = G1 / R
-         END IF
-         IF( ABS( F ).GT.ABS( G ) .AND. CS.LT.ZERO ) THEN
-            CS = -CS
-            SN = -SN
-            R = -R
-         END IF
-      END IF
-      RETURN
-*
-*     End of SLARTG
-*
-      END
--- a/libcruft/lapack/slarz.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,152 +0,0 @@
-      SUBROUTINE SLARZ( SIDE, M, N, L, V, INCV, TAU, C, LDC, WORK )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE
-      INTEGER            INCV, L, LDC, M, N
-      REAL               TAU
-*     ..
-*     .. Array Arguments ..
-      REAL               C( LDC, * ), V( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLARZ applies a real elementary reflector H to a real M-by-N
-*  matrix C, from either the left or the right. H is represented in the
-*  form
-*
-*        H = I - tau * v * v'
-*
-*  where tau is a real scalar and v is a real vector.
-*
-*  If tau = 0, then H is taken to be the unit matrix.
-*
-*
-*  H is a product of k elementary reflectors as returned by STZRZF.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': form  H * C
-*          = 'R': form  C * H
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  L       (input) INTEGER
-*          The number of entries of the vector V containing
-*          the meaningful part of the Householder vectors.
-*          If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
-*
-*  V       (input) REAL array, dimension (1+(L-1)*abs(INCV))
-*          The vector v in the representation of H as returned by
-*          STZRZF. V is not used if TAU = 0.
-*
-*  INCV    (input) INTEGER
-*          The increment between elements of v. INCV <> 0.
-*
-*  TAU     (input) REAL
-*          The value tau in the representation of H.
-*
-*  C       (input/output) REAL array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by the matrix H * C if SIDE = 'L',
-*          or C * H if SIDE = 'R'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) REAL array, dimension
-*                         (N) if SIDE = 'L'
-*                      or (M) if SIDE = 'R'
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SAXPY, SCOPY, SGEMV, SGER
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  H * C
-*
-         IF( TAU.NE.ZERO ) THEN
-*
-*           w( 1:n ) = C( 1, 1:n )
-*
-            CALL SCOPY( N, C, LDC, WORK, 1 )
-*
-*           w( 1:n ) = w( 1:n ) + C( m-l+1:m, 1:n )' * v( 1:l )
-*
-            CALL SGEMV( 'Transpose', L, N, ONE, C( M-L+1, 1 ), LDC, V,
-     $                  INCV, ONE, WORK, 1 )
-*
-*           C( 1, 1:n ) = C( 1, 1:n ) - tau * w( 1:n )
-*
-            CALL SAXPY( N, -TAU, WORK, 1, C, LDC )
-*
-*           C( m-l+1:m, 1:n ) = C( m-l+1:m, 1:n ) - ...
-*                               tau * v( 1:l ) * w( 1:n )'
-*
-            CALL SGER( L, N, -TAU, V, INCV, WORK, 1, C( M-L+1, 1 ),
-     $                 LDC )
-         END IF
-*
-      ELSE
-*
-*        Form  C * H
-*
-         IF( TAU.NE.ZERO ) THEN
-*
-*           w( 1:m ) = C( 1:m, 1 )
-*
-            CALL SCOPY( M, C, 1, WORK, 1 )
-*
-*           w( 1:m ) = w( 1:m ) + C( 1:m, n-l+1:n, 1:n ) * v( 1:l )
-*
-            CALL SGEMV( 'No transpose', M, L, ONE, C( 1, N-L+1 ), LDC,
-     $                  V, INCV, ONE, WORK, 1 )
-*
-*           C( 1:m, 1 ) = C( 1:m, 1 ) - tau * w( 1:m )
-*
-            CALL SAXPY( M, -TAU, WORK, 1, C, 1 )
-*
-*           C( 1:m, n-l+1:n ) = C( 1:m, n-l+1:n ) - ...
-*                               tau * w( 1:m ) * v( 1:l )'
-*
-            CALL SGER( M, L, -TAU, WORK, 1, V, INCV, C( 1, N-L+1 ),
-     $                 LDC )
-*
-         END IF
-*
-      END IF
-*
-      RETURN
-*
-*     End of SLARZ
-*
-      END
--- a/libcruft/lapack/slarzb.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,220 +0,0 @@
-      SUBROUTINE SLARZB( SIDE, TRANS, DIRECT, STOREV, M, N, K, L, V,
-     $                   LDV, T, LDT, C, LDC, WORK, LDWORK )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, SIDE, STOREV, TRANS
-      INTEGER            K, L, LDC, LDT, LDV, LDWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               C( LDC, * ), T( LDT, * ), V( LDV, * ),
-     $                   WORK( LDWORK, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLARZB applies a real block reflector H or its transpose H**T to
-*  a real distributed M-by-N  C from the left or the right.
-*
-*  Currently, only STOREV = 'R' and DIRECT = 'B' are supported.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply H or H' from the Left
-*          = 'R': apply H or H' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply H (No transpose)
-*          = 'C': apply H' (Transpose)
-*
-*  DIRECT  (input) CHARACTER*1
-*          Indicates how H is formed from a product of elementary
-*          reflectors
-*          = 'F': H = H(1) H(2) . . . H(k) (Forward, not supported yet)
-*          = 'B': H = H(k) . . . H(2) H(1) (Backward)
-*
-*  STOREV  (input) CHARACTER*1
-*          Indicates how the vectors which define the elementary
-*          reflectors are stored:
-*          = 'C': Columnwise                        (not supported yet)
-*          = 'R': Rowwise
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  K       (input) INTEGER
-*          The order of the matrix T (= the number of elementary
-*          reflectors whose product defines the block reflector).
-*
-*  L       (input) INTEGER
-*          The number of columns of the matrix V containing the
-*          meaningful part of the Householder reflectors.
-*          If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
-*
-*  V       (input) REAL array, dimension (LDV,NV).
-*          If STOREV = 'C', NV = K; if STOREV = 'R', NV = L.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V.
-*          If STOREV = 'C', LDV >= L; if STOREV = 'R', LDV >= K.
-*
-*  T       (input) REAL array, dimension (LDT,K)
-*          The triangular K-by-K matrix T in the representation of the
-*          block reflector.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= K.
-*
-*  C       (input/output) REAL array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by H*C or H'*C or C*H or C*H'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) REAL array, dimension (LDWORK,K)
-*
-*  LDWORK  (input) INTEGER
-*          The leading dimension of the array WORK.
-*          If SIDE = 'L', LDWORK >= max(1,N);
-*          if SIDE = 'R', LDWORK >= max(1,M).
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      CHARACTER          TRANST
-      INTEGER            I, INFO, J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SGEMM, STRMM, XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 .OR. N.LE.0 )
-     $   RETURN
-*
-*     Check for currently supported options
-*
-      INFO = 0
-      IF( .NOT.LSAME( DIRECT, 'B' ) ) THEN
-         INFO = -3
-      ELSE IF( .NOT.LSAME( STOREV, 'R' ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLARZB', -INFO )
-         RETURN
-      END IF
-*
-      IF( LSAME( TRANS, 'N' ) ) THEN
-         TRANST = 'T'
-      ELSE
-         TRANST = 'N'
-      END IF
-*
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  H * C  or  H' * C
-*
-*        W( 1:n, 1:k ) = C( 1:k, 1:n )'
-*
-         DO 10 J = 1, K
-            CALL SCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 )
-   10    CONTINUE
-*
-*        W( 1:n, 1:k ) = W( 1:n, 1:k ) + ...
-*                        C( m-l+1:m, 1:n )' * V( 1:k, 1:l )'
-*
-         IF( L.GT.0 )
-     $      CALL SGEMM( 'Transpose', 'Transpose', N, K, L, ONE,
-     $                  C( M-L+1, 1 ), LDC, V, LDV, ONE, WORK, LDWORK )
-*
-*        W( 1:n, 1:k ) = W( 1:n, 1:k ) * T'  or  W( 1:m, 1:k ) * T
-*
-         CALL STRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K, ONE, T,
-     $               LDT, WORK, LDWORK )
-*
-*        C( 1:k, 1:n ) = C( 1:k, 1:n ) - W( 1:n, 1:k )'
-*
-         DO 30 J = 1, N
-            DO 20 I = 1, K
-               C( I, J ) = C( I, J ) - WORK( J, I )
-   20       CONTINUE
-   30    CONTINUE
-*
-*        C( m-l+1:m, 1:n ) = C( m-l+1:m, 1:n ) - ...
-*                            V( 1:k, 1:l )' * W( 1:n, 1:k )'
-*
-         IF( L.GT.0 )
-     $      CALL SGEMM( 'Transpose', 'Transpose', L, N, K, -ONE, V, LDV,
-     $                  WORK, LDWORK, ONE, C( M-L+1, 1 ), LDC )
-*
-      ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*        Form  C * H  or  C * H'
-*
-*        W( 1:m, 1:k ) = C( 1:m, 1:k )
-*
-         DO 40 J = 1, K
-            CALL SCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 )
-   40    CONTINUE
-*
-*        W( 1:m, 1:k ) = W( 1:m, 1:k ) + ...
-*                        C( 1:m, n-l+1:n ) * V( 1:k, 1:l )'
-*
-         IF( L.GT.0 )
-     $      CALL SGEMM( 'No transpose', 'Transpose', M, K, L, ONE,
-     $                  C( 1, N-L+1 ), LDC, V, LDV, ONE, WORK, LDWORK )
-*
-*        W( 1:m, 1:k ) = W( 1:m, 1:k ) * T  or  W( 1:m, 1:k ) * T'
-*
-         CALL STRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K, ONE, T,
-     $               LDT, WORK, LDWORK )
-*
-*        C( 1:m, 1:k ) = C( 1:m, 1:k ) - W( 1:m, 1:k )
-*
-         DO 60 J = 1, K
-            DO 50 I = 1, M
-               C( I, J ) = C( I, J ) - WORK( I, J )
-   50       CONTINUE
-   60    CONTINUE
-*
-*        C( 1:m, n-l+1:n ) = C( 1:m, n-l+1:n ) - ...
-*                            W( 1:m, 1:k ) * V( 1:k, 1:l )
-*
-         IF( L.GT.0 )
-     $      CALL SGEMM( 'No transpose', 'No transpose', M, L, K, -ONE,
-     $                  WORK, LDWORK, V, LDV, ONE, C( 1, N-L+1 ), LDC )
-*
-      END IF
-*
-      RETURN
-*
-*     End of SLARZB
-*
-      END
--- a/libcruft/lapack/slarzt.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,184 +0,0 @@
-      SUBROUTINE SLARZT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, STOREV
-      INTEGER            K, LDT, LDV, N
-*     ..
-*     .. Array Arguments ..
-      REAL               T( LDT, * ), TAU( * ), V( LDV, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLARZT forms the triangular factor T of a real block reflector
-*  H of order > n, which is defined as a product of k elementary
-*  reflectors.
-*
-*  If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular;
-*
-*  If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular.
-*
-*  If STOREV = 'C', the vector which defines the elementary reflector
-*  H(i) is stored in the i-th column of the array V, and
-*
-*     H  =  I - V * T * V'
-*
-*  If STOREV = 'R', the vector which defines the elementary reflector
-*  H(i) is stored in the i-th row of the array V, and
-*
-*     H  =  I - V' * T * V
-*
-*  Currently, only STOREV = 'R' and DIRECT = 'B' are supported.
-*
-*  Arguments
-*  =========
-*
-*  DIRECT  (input) CHARACTER*1
-*          Specifies the order in which the elementary reflectors are
-*          multiplied to form the block reflector:
-*          = 'F': H = H(1) H(2) . . . H(k) (Forward, not supported yet)
-*          = 'B': H = H(k) . . . H(2) H(1) (Backward)
-*
-*  STOREV  (input) CHARACTER*1
-*          Specifies how the vectors which define the elementary
-*          reflectors are stored (see also Further Details):
-*          = 'C': columnwise                        (not supported yet)
-*          = 'R': rowwise
-*
-*  N       (input) INTEGER
-*          The order of the block reflector H. N >= 0.
-*
-*  K       (input) INTEGER
-*          The order of the triangular factor T (= the number of
-*          elementary reflectors). K >= 1.
-*
-*  V       (input/output) REAL array, dimension
-*                               (LDV,K) if STOREV = 'C'
-*                               (LDV,N) if STOREV = 'R'
-*          The matrix V. See further details.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V.
-*          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K.
-*
-*  TAU     (input) REAL array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i).
-*
-*  T       (output) REAL array, dimension (LDT,K)
-*          The k by k triangular factor T of the block reflector.
-*          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is
-*          lower triangular. The rest of the array is not used.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= K.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  The shape of the matrix V and the storage of the vectors which define
-*  the H(i) is best illustrated by the following example with n = 5 and
-*  k = 3. The elements equal to 1 are not stored; the corresponding
-*  array elements are modified but restored on exit. The rest of the
-*  array is not used.
-*
-*  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':
-*
-*                                              ______V_____
-*         ( v1 v2 v3 )                        /            \
-*         ( v1 v2 v3 )                      ( v1 v1 v1 v1 v1 . . . . 1 )
-*     V = ( v1 v2 v3 )                      ( v2 v2 v2 v2 v2 . . . 1   )
-*         ( v1 v2 v3 )                      ( v3 v3 v3 v3 v3 . . 1     )
-*         ( v1 v2 v3 )
-*            .  .  .
-*            .  .  .
-*            1  .  .
-*               1  .
-*                  1
-*
-*  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R':
-*
-*                                                        ______V_____
-*            1                                          /            \
-*            .  1                           ( 1 . . . . v1 v1 v1 v1 v1 )
-*            .  .  1                        ( . 1 . . . v2 v2 v2 v2 v2 )
-*            .  .  .                        ( . . 1 . . v3 v3 v3 v3 v3 )
-*            .  .  .
-*         ( v1 v2 v3 )
-*         ( v1 v2 v3 )
-*     V = ( v1 v2 v3 )
-*         ( v1 v2 v3 )
-*         ( v1 v2 v3 )
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, INFO, J
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEMV, STRMV, XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-*     Check for currently supported options
-*
-      INFO = 0
-      IF( .NOT.LSAME( DIRECT, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.LSAME( STOREV, 'R' ) ) THEN
-         INFO = -2
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLARZT', -INFO )
-         RETURN
-      END IF
-*
-      DO 20 I = K, 1, -1
-         IF( TAU( I ).EQ.ZERO ) THEN
-*
-*           H(i)  =  I
-*
-            DO 10 J = I, K
-               T( J, I ) = ZERO
-   10       CONTINUE
-         ELSE
-*
-*           general case
-*
-            IF( I.LT.K ) THEN
-*
-*              T(i+1:k,i) = - tau(i) * V(i+1:k,1:n) * V(i,1:n)'
-*
-               CALL SGEMV( 'No transpose', K-I, N, -TAU( I ),
-     $                     V( I+1, 1 ), LDV, V( I, 1 ), LDV, ZERO,
-     $                     T( I+1, I ), 1 )
-*
-*              T(i+1:k,i) = T(i+1:k,i+1:k) * T(i+1:k,i)
-*
-               CALL STRMV( 'Lower', 'No transpose', 'Non-unit', K-I,
-     $                     T( I+1, I+1 ), LDT, T( I+1, I ), 1 )
-            END IF
-            T( I, I ) = TAU( I )
-         END IF
-   20 CONTINUE
-      RETURN
-*
-*     End of SLARZT
-*
-      END
--- a/libcruft/lapack/slas2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,121 +0,0 @@
-      SUBROUTINE SLAS2( F, G, H, SSMIN, SSMAX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      REAL               F, G, H, SSMAX, SSMIN
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAS2  computes the singular values of the 2-by-2 matrix
-*     [  F   G  ]
-*     [  0   H  ].
-*  On return, SSMIN is the smaller singular value and SSMAX is the
-*  larger singular value.
-*
-*  Arguments
-*  =========
-*
-*  F       (input) REAL
-*          The (1,1) element of the 2-by-2 matrix.
-*
-*  G       (input) REAL
-*          The (1,2) element of the 2-by-2 matrix.
-*
-*  H       (input) REAL
-*          The (2,2) element of the 2-by-2 matrix.
-*
-*  SSMIN   (output) REAL
-*          The smaller singular value.
-*
-*  SSMAX   (output) REAL
-*          The larger singular value.
-*
-*  Further Details
-*  ===============
-*
-*  Barring over/underflow, all output quantities are correct to within
-*  a few units in the last place (ulps), even in the absence of a guard
-*  digit in addition/subtraction.
-*
-*  In IEEE arithmetic, the code works correctly if one matrix element is
-*  infinite.
-*
-*  Overflow will not occur unless the largest singular value itself
-*  overflows, or is within a few ulps of overflow. (On machines with
-*  partial overflow, like the Cray, overflow may occur if the largest
-*  singular value is within a factor of 2 of overflow.)
-*
-*  Underflow is harmless if underflow is gradual. Otherwise, results
-*  may correspond to a matrix modified by perturbations of size near
-*  the underflow threshold.
-*
-*  ====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E0 )
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E0 )
-      REAL               TWO
-      PARAMETER          ( TWO = 2.0E0 )
-*     ..
-*     .. Local Scalars ..
-      REAL               AS, AT, AU, C, FA, FHMN, FHMX, GA, HA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      FA = ABS( F )
-      GA = ABS( G )
-      HA = ABS( H )
-      FHMN = MIN( FA, HA )
-      FHMX = MAX( FA, HA )
-      IF( FHMN.EQ.ZERO ) THEN
-         SSMIN = ZERO
-         IF( FHMX.EQ.ZERO ) THEN
-            SSMAX = GA
-         ELSE
-            SSMAX = MAX( FHMX, GA )*SQRT( ONE+
-     $              ( MIN( FHMX, GA ) / MAX( FHMX, GA ) )**2 )
-         END IF
-      ELSE
-         IF( GA.LT.FHMX ) THEN
-            AS = ONE + FHMN / FHMX
-            AT = ( FHMX-FHMN ) / FHMX
-            AU = ( GA / FHMX )**2
-            C = TWO / ( SQRT( AS*AS+AU )+SQRT( AT*AT+AU ) )
-            SSMIN = FHMN*C
-            SSMAX = FHMX / C
-         ELSE
-            AU = FHMX / GA
-            IF( AU.EQ.ZERO ) THEN
-*
-*              Avoid possible harmful underflow if exponent range
-*              asymmetric (true SSMIN may not underflow even if
-*              AU underflows)
-*
-               SSMIN = ( FHMN*FHMX ) / GA
-               SSMAX = GA
-            ELSE
-               AS = ONE + FHMN / FHMX
-               AT = ( FHMX-FHMN ) / FHMX
-               C = ONE / ( SQRT( ONE+( AS*AU )**2 )+
-     $             SQRT( ONE+( AT*AU )**2 ) )
-               SSMIN = ( FHMN*C )*AU
-               SSMIN = SSMIN + SSMIN
-               SSMAX = GA / ( C+C )
-            END IF
-         END IF
-      END IF
-      RETURN
-*
-*     End of SLAS2
-*
-      END
--- a/libcruft/lapack/slascl.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,267 +0,0 @@
-      SUBROUTINE SLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TYPE
-      INTEGER            INFO, KL, KU, LDA, M, N
-      REAL               CFROM, CTO
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASCL multiplies the M by N real matrix A by the real scalar
-*  CTO/CFROM.  This is done without over/underflow as long as the final
-*  result CTO*A(I,J)/CFROM does not over/underflow. TYPE specifies that
-*  A may be full, upper triangular, lower triangular, upper Hessenberg,
-*  or banded.
-*
-*  Arguments
-*  =========
-*
-*  TYPE    (input) CHARACTER*1
-*          TYPE indices the storage type of the input matrix.
-*          = 'G':  A is a full matrix.
-*          = 'L':  A is a lower triangular matrix.
-*          = 'U':  A is an upper triangular matrix.
-*          = 'H':  A is an upper Hessenberg matrix.
-*          = 'B':  A is a symmetric band matrix with lower bandwidth KL
-*                  and upper bandwidth KU and with the only the lower
-*                  half stored.
-*          = 'Q':  A is a symmetric band matrix with lower bandwidth KL
-*                  and upper bandwidth KU and with the only the upper
-*                  half stored.
-*          = 'Z':  A is a band matrix with lower bandwidth KL and upper
-*                  bandwidth KU.
-*
-*  KL      (input) INTEGER
-*          The lower bandwidth of A.  Referenced only if TYPE = 'B',
-*          'Q' or 'Z'.
-*
-*  KU      (input) INTEGER
-*          The upper bandwidth of A.  Referenced only if TYPE = 'B',
-*          'Q' or 'Z'.
-*
-*  CFROM   (input) REAL
-*  CTO     (input) REAL
-*          The matrix A is multiplied by CTO/CFROM. A(I,J) is computed
-*          without over/underflow if the final result CTO*A(I,J)/CFROM
-*          can be represented without over/underflow.  CFROM must be
-*          nonzero.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          The matrix to be multiplied by CTO/CFROM.  See TYPE for the
-*          storage type.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  INFO    (output) INTEGER
-*          0  - successful exit
-*          <0 - if INFO = -i, the i-th argument had an illegal value.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            DONE
-      INTEGER            I, ITYPE, J, K1, K2, K3, K4
-      REAL               BIGNUM, CFROM1, CFROMC, CTO1, CTOC, MUL, SMLNUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               SLAMCH
-      EXTERNAL           LSAME, SLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-*
-      IF( LSAME( TYPE, 'G' ) ) THEN
-         ITYPE = 0
-      ELSE IF( LSAME( TYPE, 'L' ) ) THEN
-         ITYPE = 1
-      ELSE IF( LSAME( TYPE, 'U' ) ) THEN
-         ITYPE = 2
-      ELSE IF( LSAME( TYPE, 'H' ) ) THEN
-         ITYPE = 3
-      ELSE IF( LSAME( TYPE, 'B' ) ) THEN
-         ITYPE = 4
-      ELSE IF( LSAME( TYPE, 'Q' ) ) THEN
-         ITYPE = 5
-      ELSE IF( LSAME( TYPE, 'Z' ) ) THEN
-         ITYPE = 6
-      ELSE
-         ITYPE = -1
-      END IF
-*
-      IF( ITYPE.EQ.-1 ) THEN
-         INFO = -1
-      ELSE IF( CFROM.EQ.ZERO ) THEN
-         INFO = -4
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -6
-      ELSE IF( N.LT.0 .OR. ( ITYPE.EQ.4 .AND. N.NE.M ) .OR.
-     $         ( ITYPE.EQ.5 .AND. N.NE.M ) ) THEN
-         INFO = -7
-      ELSE IF( ITYPE.LE.3 .AND. LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -9
-      ELSE IF( ITYPE.GE.4 ) THEN
-         IF( KL.LT.0 .OR. KL.GT.MAX( M-1, 0 ) ) THEN
-            INFO = -2
-         ELSE IF( KU.LT.0 .OR. KU.GT.MAX( N-1, 0 ) .OR.
-     $            ( ( ITYPE.EQ.4 .OR. ITYPE.EQ.5 ) .AND. KL.NE.KU ) )
-     $             THEN
-            INFO = -3
-         ELSE IF( ( ITYPE.EQ.4 .AND. LDA.LT.KL+1 ) .OR.
-     $            ( ITYPE.EQ.5 .AND. LDA.LT.KU+1 ) .OR.
-     $            ( ITYPE.EQ.6 .AND. LDA.LT.2*KL+KU+1 ) ) THEN
-            INFO = -9
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLASCL', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. M.EQ.0 )
-     $   RETURN
-*
-*     Get machine parameters
-*
-      SMLNUM = SLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-*
-      CFROMC = CFROM
-      CTOC = CTO
-*
-   10 CONTINUE
-      CFROM1 = CFROMC*SMLNUM
-      CTO1 = CTOC / BIGNUM
-      IF( ABS( CFROM1 ).GT.ABS( CTOC ) .AND. CTOC.NE.ZERO ) THEN
-         MUL = SMLNUM
-         DONE = .FALSE.
-         CFROMC = CFROM1
-      ELSE IF( ABS( CTO1 ).GT.ABS( CFROMC ) ) THEN
-         MUL = BIGNUM
-         DONE = .FALSE.
-         CTOC = CTO1
-      ELSE
-         MUL = CTOC / CFROMC
-         DONE = .TRUE.
-      END IF
-*
-      IF( ITYPE.EQ.0 ) THEN
-*
-*        Full matrix
-*
-         DO 30 J = 1, N
-            DO 20 I = 1, M
-               A( I, J ) = A( I, J )*MUL
-   20       CONTINUE
-   30    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.1 ) THEN
-*
-*        Lower triangular matrix
-*
-         DO 50 J = 1, N
-            DO 40 I = J, M
-               A( I, J ) = A( I, J )*MUL
-   40       CONTINUE
-   50    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.2 ) THEN
-*
-*        Upper triangular matrix
-*
-         DO 70 J = 1, N
-            DO 60 I = 1, MIN( J, M )
-               A( I, J ) = A( I, J )*MUL
-   60       CONTINUE
-   70    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.3 ) THEN
-*
-*        Upper Hessenberg matrix
-*
-         DO 90 J = 1, N
-            DO 80 I = 1, MIN( J+1, M )
-               A( I, J ) = A( I, J )*MUL
-   80       CONTINUE
-   90    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.4 ) THEN
-*
-*        Lower half of a symmetric band matrix
-*
-         K3 = KL + 1
-         K4 = N + 1
-         DO 110 J = 1, N
-            DO 100 I = 1, MIN( K3, K4-J )
-               A( I, J ) = A( I, J )*MUL
-  100       CONTINUE
-  110    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.5 ) THEN
-*
-*        Upper half of a symmetric band matrix
-*
-         K1 = KU + 2
-         K3 = KU + 1
-         DO 130 J = 1, N
-            DO 120 I = MAX( K1-J, 1 ), K3
-               A( I, J ) = A( I, J )*MUL
-  120       CONTINUE
-  130    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.6 ) THEN
-*
-*        Band matrix
-*
-         K1 = KL + KU + 2
-         K2 = KL + 1
-         K3 = 2*KL + KU + 1
-         K4 = KL + KU + 1 + M
-         DO 150 J = 1, N
-            DO 140 I = MAX( K1-J, K2 ), MIN( K3, K4-J )
-               A( I, J ) = A( I, J )*MUL
-  140       CONTINUE
-  150    CONTINUE
-*
-      END IF
-*
-      IF( .NOT.DONE )
-     $   GO TO 10
-*
-      RETURN
-*
-*     End of SLASCL
-*
-      END
--- a/libcruft/lapack/slasd0.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,228 +0,0 @@
-      SUBROUTINE SLASD0( N, SQRE, D, E, U, LDU, VT, LDVT, SMLSIZ, IWORK,
-     $                   WORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDU, LDVT, N, SMLSIZ, SQRE
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      REAL               D( * ), E( * ), U( LDU, * ), VT( LDVT, * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  Using a divide and conquer approach, SLASD0 computes the singular
-*  value decomposition (SVD) of a real upper bidiagonal N-by-M
-*  matrix B with diagonal D and offdiagonal E, where M = N + SQRE.
-*  The algorithm computes orthogonal matrices U and VT such that
-*  B = U * S * VT. The singular values S are overwritten on D.
-*
-*  A related subroutine, SLASDA, computes only the singular values,
-*  and optionally, the singular vectors in compact form.
-*
-*  Arguments
-*  =========
-*
-*  N      (input) INTEGER
-*         On entry, the row dimension of the upper bidiagonal matrix.
-*         This is also the dimension of the main diagonal array D.
-*
-*  SQRE   (input) INTEGER
-*         Specifies the column dimension of the bidiagonal matrix.
-*         = 0: The bidiagonal matrix has column dimension M = N;
-*         = 1: The bidiagonal matrix has column dimension M = N+1;
-*
-*  D      (input/output) REAL array, dimension (N)
-*         On entry D contains the main diagonal of the bidiagonal
-*         matrix.
-*         On exit D, if INFO = 0, contains its singular values.
-*
-*  E      (input) REAL array, dimension (M-1)
-*         Contains the subdiagonal entries of the bidiagonal matrix.
-*         On exit, E has been destroyed.
-*
-*  U      (output) REAL array, dimension at least (LDQ, N)
-*         On exit, U contains the left singular vectors.
-*
-*  LDU    (input) INTEGER
-*         On entry, leading dimension of U.
-*
-*  VT     (output) REAL array, dimension at least (LDVT, M)
-*         On exit, VT' contains the right singular vectors.
-*
-*  LDVT   (input) INTEGER
-*         On entry, leading dimension of VT.
-*
-*  SMLSIZ (input) INTEGER
-*         On entry, maximum size of the subproblems at the
-*         bottom of the computation tree.
-*
-*  IWORK  (workspace) INTEGER array, dimension (8*N)
-*
-*  WORK   (workspace) REAL array, dimension (3*M**2+2*M)
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if INFO = 1, an singular value did not converge
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, I1, IC, IDXQ, IDXQC, IM1, INODE, ITEMP, IWK,
-     $                   J, LF, LL, LVL, M, NCC, ND, NDB1, NDIML, NDIMR,
-     $                   NL, NLF, NLP1, NLVL, NR, NRF, NRP1, SQREI
-      REAL               ALPHA, BETA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLASD1, SLASDQ, SLASDT, XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN
-         INFO = -2
-      END IF
-*
-      M = N + SQRE
-*
-      IF( LDU.LT.N ) THEN
-         INFO = -6
-      ELSE IF( LDVT.LT.M ) THEN
-         INFO = -8
-      ELSE IF( SMLSIZ.LT.3 ) THEN
-         INFO = -9
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLASD0', -INFO )
-         RETURN
-      END IF
-*
-*     If the input matrix is too small, call SLASDQ to find the SVD.
-*
-      IF( N.LE.SMLSIZ ) THEN
-         CALL SLASDQ( 'U', SQRE, N, M, N, 0, D, E, VT, LDVT, U, LDU, U,
-     $                LDU, WORK, INFO )
-         RETURN
-      END IF
-*
-*     Set up the computation tree.
-*
-      INODE = 1
-      NDIML = INODE + N
-      NDIMR = NDIML + N
-      IDXQ = NDIMR + N
-      IWK = IDXQ + N
-      CALL SLASDT( N, NLVL, ND, IWORK( INODE ), IWORK( NDIML ),
-     $             IWORK( NDIMR ), SMLSIZ )
-*
-*     For the nodes on bottom level of the tree, solve
-*     their subproblems by SLASDQ.
-*
-      NDB1 = ( ND+1 ) / 2
-      NCC = 0
-      DO 30 I = NDB1, ND
-*
-*     IC : center row of each node
-*     NL : number of rows of left  subproblem
-*     NR : number of rows of right subproblem
-*     NLF: starting row of the left   subproblem
-*     NRF: starting row of the right  subproblem
-*
-         I1 = I - 1
-         IC = IWORK( INODE+I1 )
-         NL = IWORK( NDIML+I1 )
-         NLP1 = NL + 1
-         NR = IWORK( NDIMR+I1 )
-         NRP1 = NR + 1
-         NLF = IC - NL
-         NRF = IC + 1
-         SQREI = 1
-         CALL SLASDQ( 'U', SQREI, NL, NLP1, NL, NCC, D( NLF ), E( NLF ),
-     $                VT( NLF, NLF ), LDVT, U( NLF, NLF ), LDU,
-     $                U( NLF, NLF ), LDU, WORK, INFO )
-         IF( INFO.NE.0 ) THEN
-            RETURN
-         END IF
-         ITEMP = IDXQ + NLF - 2
-         DO 10 J = 1, NL
-            IWORK( ITEMP+J ) = J
-   10    CONTINUE
-         IF( I.EQ.ND ) THEN
-            SQREI = SQRE
-         ELSE
-            SQREI = 1
-         END IF
-         NRP1 = NR + SQREI
-         CALL SLASDQ( 'U', SQREI, NR, NRP1, NR, NCC, D( NRF ), E( NRF ),
-     $                VT( NRF, NRF ), LDVT, U( NRF, NRF ), LDU,
-     $                U( NRF, NRF ), LDU, WORK, INFO )
-         IF( INFO.NE.0 ) THEN
-            RETURN
-         END IF
-         ITEMP = IDXQ + IC
-         DO 20 J = 1, NR
-            IWORK( ITEMP+J-1 ) = J
-   20    CONTINUE
-   30 CONTINUE
-*
-*     Now conquer each subproblem bottom-up.
-*
-      DO 50 LVL = NLVL, 1, -1
-*
-*        Find the first node LF and last node LL on the
-*        current level LVL.
-*
-         IF( LVL.EQ.1 ) THEN
-            LF = 1
-            LL = 1
-         ELSE
-            LF = 2**( LVL-1 )
-            LL = 2*LF - 1
-         END IF
-         DO 40 I = LF, LL
-            IM1 = I - 1
-            IC = IWORK( INODE+IM1 )
-            NL = IWORK( NDIML+IM1 )
-            NR = IWORK( NDIMR+IM1 )
-            NLF = IC - NL
-            IF( ( SQRE.EQ.0 ) .AND. ( I.EQ.LL ) ) THEN
-               SQREI = SQRE
-            ELSE
-               SQREI = 1
-            END IF
-            IDXQC = IDXQ + NLF - 1
-            ALPHA = D( IC )
-            BETA = E( IC )
-            CALL SLASD1( NL, NR, SQREI, D( NLF ), ALPHA, BETA,
-     $                   U( NLF, NLF ), LDU, VT( NLF, NLF ), LDVT,
-     $                   IWORK( IDXQC ), IWORK( IWK ), WORK, INFO )
-            IF( INFO.NE.0 ) THEN
-               RETURN
-            END IF
-   40    CONTINUE
-   50 CONTINUE
-*
-      RETURN
-*
-*     End of SLASD0
-*
-      END
--- a/libcruft/lapack/slasd1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,232 +0,0 @@
-      SUBROUTINE SLASD1( NL, NR, SQRE, D, ALPHA, BETA, U, LDU, VT, LDVT,
-     $                   IDXQ, IWORK, WORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDU, LDVT, NL, NR, SQRE
-      REAL               ALPHA, BETA
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IDXQ( * ), IWORK( * )
-      REAL               D( * ), U( LDU, * ), VT( LDVT, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASD1 computes the SVD of an upper bidiagonal N-by-M matrix B,
-*  where N = NL + NR + 1 and M = N + SQRE. SLASD1 is called from SLASD0.
-*
-*  A related subroutine SLASD7 handles the case in which the singular
-*  values (and the singular vectors in factored form) are desired.
-*
-*  SLASD1 computes the SVD as follows:
-*
-*                ( D1(in)  0    0     0 )
-*    B = U(in) * (   Z1'   a   Z2'    b ) * VT(in)
-*                (   0     0   D2(in) 0 )
-*
-*      = U(out) * ( D(out) 0) * VT(out)
-*
-*  where Z' = (Z1' a Z2' b) = u' VT', and u is a vector of dimension M
-*  with ALPHA and BETA in the NL+1 and NL+2 th entries and zeros
-*  elsewhere; and the entry b is empty if SQRE = 0.
-*
-*  The left singular vectors of the original matrix are stored in U, and
-*  the transpose of the right singular vectors are stored in VT, and the
-*  singular values are in D.  The algorithm consists of three stages:
-*
-*     The first stage consists of deflating the size of the problem
-*     when there are multiple singular values or when there are zeros in
-*     the Z vector.  For each such occurence the dimension of the
-*     secular equation problem is reduced by one.  This stage is
-*     performed by the routine SLASD2.
-*
-*     The second stage consists of calculating the updated
-*     singular values. This is done by finding the square roots of the
-*     roots of the secular equation via the routine SLASD4 (as called
-*     by SLASD3). This routine also calculates the singular vectors of
-*     the current problem.
-*
-*     The final stage consists of computing the updated singular vectors
-*     directly using the updated singular values.  The singular vectors
-*     for the current problem are multiplied with the singular vectors
-*     from the overall problem.
-*
-*  Arguments
-*  =========
-*
-*  NL     (input) INTEGER
-*         The row dimension of the upper block.  NL >= 1.
-*
-*  NR     (input) INTEGER
-*         The row dimension of the lower block.  NR >= 1.
-*
-*  SQRE   (input) INTEGER
-*         = 0: the lower block is an NR-by-NR square matrix.
-*         = 1: the lower block is an NR-by-(NR+1) rectangular matrix.
-*
-*         The bidiagonal matrix has row dimension N = NL + NR + 1,
-*         and column dimension M = N + SQRE.
-*
-*  D      (input/output) REAL array, dimension (NL+NR+1).
-*         N = NL+NR+1
-*         On entry D(1:NL,1:NL) contains the singular values of the
-*         upper block; and D(NL+2:N) contains the singular values of
-*         the lower block. On exit D(1:N) contains the singular values
-*         of the modified matrix.
-*
-*  ALPHA  (input/output) REAL
-*         Contains the diagonal element associated with the added row.
-*
-*  BETA   (input/output) REAL
-*         Contains the off-diagonal element associated with the added
-*         row.
-*
-*  U      (input/output) REAL array, dimension (LDU,N)
-*         On entry U(1:NL, 1:NL) contains the left singular vectors of
-*         the upper block; U(NL+2:N, NL+2:N) contains the left singular
-*         vectors of the lower block. On exit U contains the left
-*         singular vectors of the bidiagonal matrix.
-*
-*  LDU    (input) INTEGER
-*         The leading dimension of the array U.  LDU >= max( 1, N ).
-*
-*  VT     (input/output) REAL array, dimension (LDVT,M)
-*         where M = N + SQRE.
-*         On entry VT(1:NL+1, 1:NL+1)' contains the right singular
-*         vectors of the upper block; VT(NL+2:M, NL+2:M)' contains
-*         the right singular vectors of the lower block. On exit
-*         VT' contains the right singular vectors of the
-*         bidiagonal matrix.
-*
-*  LDVT   (input) INTEGER
-*         The leading dimension of the array VT.  LDVT >= max( 1, M ).
-*
-*  IDXQ  (output) INTEGER array, dimension (N)
-*         This contains the permutation which will reintegrate the
-*         subproblem just solved back into sorted order, i.e.
-*         D( IDXQ( I = 1, N ) ) will be in ascending order.
-*
-*  IWORK  (workspace) INTEGER array, dimension (4*N)
-*
-*  WORK   (workspace) REAL array, dimension (3*M**2+2*M)
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if INFO = 1, an singular value did not converge
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-*
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            COLTYP, I, IDX, IDXC, IDXP, IQ, ISIGMA, IU2,
-     $                   IVT2, IZ, K, LDQ, LDU2, LDVT2, M, N, N1, N2
-      REAL               ORGNRM
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLAMRG, SLASCL, SLASD2, SLASD3, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( NL.LT.1 ) THEN
-         INFO = -1
-      ELSE IF( NR.LT.1 ) THEN
-         INFO = -2
-      ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN
-         INFO = -3
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLASD1', -INFO )
-         RETURN
-      END IF
-*
-      N = NL + NR + 1
-      M = N + SQRE
-*
-*     The following values are for bookkeeping purposes only.  They are
-*     integer pointers which indicate the portion of the workspace
-*     used by a particular array in SLASD2 and SLASD3.
-*
-      LDU2 = N
-      LDVT2 = M
-*
-      IZ = 1
-      ISIGMA = IZ + M
-      IU2 = ISIGMA + N
-      IVT2 = IU2 + LDU2*N
-      IQ = IVT2 + LDVT2*M
-*
-      IDX = 1
-      IDXC = IDX + N
-      COLTYP = IDXC + N
-      IDXP = COLTYP + N
-*
-*     Scale.
-*
-      ORGNRM = MAX( ABS( ALPHA ), ABS( BETA ) )
-      D( NL+1 ) = ZERO
-      DO 10 I = 1, N
-         IF( ABS( D( I ) ).GT.ORGNRM ) THEN
-            ORGNRM = ABS( D( I ) )
-         END IF
-   10 CONTINUE
-      CALL SLASCL( 'G', 0, 0, ORGNRM, ONE, N, 1, D, N, INFO )
-      ALPHA = ALPHA / ORGNRM
-      BETA = BETA / ORGNRM
-*
-*     Deflate singular values.
-*
-      CALL SLASD2( NL, NR, SQRE, K, D, WORK( IZ ), ALPHA, BETA, U, LDU,
-     $             VT, LDVT, WORK( ISIGMA ), WORK( IU2 ), LDU2,
-     $             WORK( IVT2 ), LDVT2, IWORK( IDXP ), IWORK( IDX ),
-     $             IWORK( IDXC ), IDXQ, IWORK( COLTYP ), INFO )
-*
-*     Solve Secular Equation and update singular vectors.
-*
-      LDQ = K
-      CALL SLASD3( NL, NR, SQRE, K, D, WORK( IQ ), LDQ, WORK( ISIGMA ),
-     $             U, LDU, WORK( IU2 ), LDU2, VT, LDVT, WORK( IVT2 ),
-     $             LDVT2, IWORK( IDXC ), IWORK( COLTYP ), WORK( IZ ),
-     $             INFO )
-      IF( INFO.NE.0 ) THEN
-         RETURN
-      END IF
-*
-*     Unscale.
-*
-      CALL SLASCL( 'G', 0, 0, ONE, ORGNRM, N, 1, D, N, INFO )
-*
-*     Prepare the IDXQ sorting permutation.
-*
-      N1 = K
-      N2 = N - K
-      CALL SLAMRG( N1, N2, D, 1, -1, IDXQ )
-*
-      RETURN
-*
-*     End of SLASD1
-*
-      END
--- a/libcruft/lapack/slasd2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,512 +0,0 @@
-      SUBROUTINE SLASD2( NL, NR, SQRE, K, D, Z, ALPHA, BETA, U, LDU, VT,
-     $                   LDVT, DSIGMA, U2, LDU2, VT2, LDVT2, IDXP, IDX,
-     $                   IDXC, IDXQ, COLTYP, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDU, LDU2, LDVT, LDVT2, NL, NR, SQRE
-      REAL               ALPHA, BETA
-*     ..
-*     .. Array Arguments ..
-      INTEGER            COLTYP( * ), IDX( * ), IDXC( * ), IDXP( * ),
-     $                   IDXQ( * )
-      REAL               D( * ), DSIGMA( * ), U( LDU, * ),
-     $                   U2( LDU2, * ), VT( LDVT, * ), VT2( LDVT2, * ),
-     $                   Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASD2 merges the two sets of singular values together into a single
-*  sorted set.  Then it tries to deflate the size of the problem.
-*  There are two ways in which deflation can occur:  when two or more
-*  singular values are close together or if there is a tiny entry in the
-*  Z vector.  For each such occurrence the order of the related secular
-*  equation problem is reduced by one.
-*
-*  SLASD2 is called from SLASD1.
-*
-*  Arguments
-*  =========
-*
-*  NL     (input) INTEGER
-*         The row dimension of the upper block.  NL >= 1.
-*
-*  NR     (input) INTEGER
-*         The row dimension of the lower block.  NR >= 1.
-*
-*  SQRE   (input) INTEGER
-*         = 0: the lower block is an NR-by-NR square matrix.
-*         = 1: the lower block is an NR-by-(NR+1) rectangular matrix.
-*
-*         The bidiagonal matrix has N = NL + NR + 1 rows and
-*         M = N + SQRE >= N columns.
-*
-*  K      (output) INTEGER
-*         Contains the dimension of the non-deflated matrix,
-*         This is the order of the related secular equation. 1 <= K <=N.
-*
-*  D      (input/output) REAL array, dimension (N)
-*         On entry D contains the singular values of the two submatrices
-*         to be combined.  On exit D contains the trailing (N-K) updated
-*         singular values (those which were deflated) sorted into
-*         increasing order.
-*
-*  Z      (output) REAL array, dimension (N)
-*         On exit Z contains the updating row vector in the secular
-*         equation.
-*
-*  ALPHA  (input) REAL
-*         Contains the diagonal element associated with the added row.
-*
-*  BETA   (input) REAL
-*         Contains the off-diagonal element associated with the added
-*         row.
-*
-*  U      (input/output) REAL array, dimension (LDU,N)
-*         On entry U contains the left singular vectors of two
-*         submatrices in the two square blocks with corners at (1,1),
-*         (NL, NL), and (NL+2, NL+2), (N,N).
-*         On exit U contains the trailing (N-K) updated left singular
-*         vectors (those which were deflated) in its last N-K columns.
-*
-*  LDU    (input) INTEGER
-*         The leading dimension of the array U.  LDU >= N.
-*
-*  VT     (input/output) REAL array, dimension (LDVT,M)
-*         On entry VT' contains the right singular vectors of two
-*         submatrices in the two square blocks with corners at (1,1),
-*         (NL+1, NL+1), and (NL+2, NL+2), (M,M).
-*         On exit VT' contains the trailing (N-K) updated right singular
-*         vectors (those which were deflated) in its last N-K columns.
-*         In case SQRE =1, the last row of VT spans the right null
-*         space.
-*
-*  LDVT   (input) INTEGER
-*         The leading dimension of the array VT.  LDVT >= M.
-*
-*  DSIGMA (output) REAL array, dimension (N)
-*         Contains a copy of the diagonal elements (K-1 singular values
-*         and one zero) in the secular equation.
-*
-*  U2     (output) REAL array, dimension (LDU2,N)
-*         Contains a copy of the first K-1 left singular vectors which
-*         will be used by SLASD3 in a matrix multiply (SGEMM) to solve
-*         for the new left singular vectors. U2 is arranged into four
-*         blocks. The first block contains a column with 1 at NL+1 and
-*         zero everywhere else; the second block contains non-zero
-*         entries only at and above NL; the third contains non-zero
-*         entries only below NL+1; and the fourth is dense.
-*
-*  LDU2   (input) INTEGER
-*         The leading dimension of the array U2.  LDU2 >= N.
-*
-*  VT2    (output) REAL array, dimension (LDVT2,N)
-*         VT2' contains a copy of the first K right singular vectors
-*         which will be used by SLASD3 in a matrix multiply (SGEMM) to
-*         solve for the new right singular vectors. VT2 is arranged into
-*         three blocks. The first block contains a row that corresponds
-*         to the special 0 diagonal element in SIGMA; the second block
-*         contains non-zeros only at and before NL +1; the third block
-*         contains non-zeros only at and after  NL +2.
-*
-*  LDVT2  (input) INTEGER
-*         The leading dimension of the array VT2.  LDVT2 >= M.
-*
-*  IDXP   (workspace) INTEGER array, dimension (N)
-*         This will contain the permutation used to place deflated
-*         values of D at the end of the array. On output IDXP(2:K)
-*         points to the nondeflated D-values and IDXP(K+1:N)
-*         points to the deflated singular values.
-*
-*  IDX    (workspace) INTEGER array, dimension (N)
-*         This will contain the permutation used to sort the contents of
-*         D into ascending order.
-*
-*  IDXC   (output) INTEGER array, dimension (N)
-*         This will contain the permutation used to arrange the columns
-*         of the deflated U matrix into three groups:  the first group
-*         contains non-zero entries only at and above NL, the second
-*         contains non-zero entries only below NL+2, and the third is
-*         dense.
-*
-*  IDXQ   (input/output) INTEGER array, dimension (N)
-*         This contains the permutation which separately sorts the two
-*         sub-problems in D into ascending order.  Note that entries in
-*         the first hlaf of this permutation must first be moved one
-*         position backward; and entries in the second half
-*         must first have NL+1 added to their values.
-*
-*  COLTYP (workspace/output) INTEGER array, dimension (N)
-*         As workspace, this will contain a label which will indicate
-*         which of the following types a column in the U2 matrix or a
-*         row in the VT2 matrix is:
-*         1 : non-zero in the upper half only
-*         2 : non-zero in the lower half only
-*         3 : dense
-*         4 : deflated
-*
-*         On exit, it is an array of dimension 4, with COLTYP(I) being
-*         the dimension of the I-th type columns.
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE, TWO, EIGHT
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0, TWO = 2.0E+0,
-     $                   EIGHT = 8.0E+0 )
-*     ..
-*     .. Local Arrays ..
-      INTEGER            CTOT( 4 ), PSM( 4 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            CT, I, IDXI, IDXJ, IDXJP, J, JP, JPREV, K2, M,
-     $                   N, NLP1, NLP2
-      REAL               C, EPS, HLFTOL, S, TAU, TOL, Z1
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH, SLAPY2
-      EXTERNAL           SLAMCH, SLAPY2
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SLACPY, SLAMRG, SLASET, SROT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( NL.LT.1 ) THEN
-         INFO = -1
-      ELSE IF( NR.LT.1 ) THEN
-         INFO = -2
-      ELSE IF( ( SQRE.NE.1 ) .AND. ( SQRE.NE.0 ) ) THEN
-         INFO = -3
-      END IF
-*
-      N = NL + NR + 1
-      M = N + SQRE
-*
-      IF( LDU.LT.N ) THEN
-         INFO = -10
-      ELSE IF( LDVT.LT.M ) THEN
-         INFO = -12
-      ELSE IF( LDU2.LT.N ) THEN
-         INFO = -15
-      ELSE IF( LDVT2.LT.M ) THEN
-         INFO = -17
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLASD2', -INFO )
-         RETURN
-      END IF
-*
-      NLP1 = NL + 1
-      NLP2 = NL + 2
-*
-*     Generate the first part of the vector Z; and move the singular
-*     values in the first part of D one position backward.
-*
-      Z1 = ALPHA*VT( NLP1, NLP1 )
-      Z( 1 ) = Z1
-      DO 10 I = NL, 1, -1
-         Z( I+1 ) = ALPHA*VT( I, NLP1 )
-         D( I+1 ) = D( I )
-         IDXQ( I+1 ) = IDXQ( I ) + 1
-   10 CONTINUE
-*
-*     Generate the second part of the vector Z.
-*
-      DO 20 I = NLP2, M
-         Z( I ) = BETA*VT( I, NLP2 )
-   20 CONTINUE
-*
-*     Initialize some reference arrays.
-*
-      DO 30 I = 2, NLP1
-         COLTYP( I ) = 1
-   30 CONTINUE
-      DO 40 I = NLP2, N
-         COLTYP( I ) = 2
-   40 CONTINUE
-*
-*     Sort the singular values into increasing order
-*
-      DO 50 I = NLP2, N
-         IDXQ( I ) = IDXQ( I ) + NLP1
-   50 CONTINUE
-*
-*     DSIGMA, IDXC, IDXC, and the first column of U2
-*     are used as storage space.
-*
-      DO 60 I = 2, N
-         DSIGMA( I ) = D( IDXQ( I ) )
-         U2( I, 1 ) = Z( IDXQ( I ) )
-         IDXC( I ) = COLTYP( IDXQ( I ) )
-   60 CONTINUE
-*
-      CALL SLAMRG( NL, NR, DSIGMA( 2 ), 1, 1, IDX( 2 ) )
-*
-      DO 70 I = 2, N
-         IDXI = 1 + IDX( I )
-         D( I ) = DSIGMA( IDXI )
-         Z( I ) = U2( IDXI, 1 )
-         COLTYP( I ) = IDXC( IDXI )
-   70 CONTINUE
-*
-*     Calculate the allowable deflation tolerance
-*
-      EPS = SLAMCH( 'Epsilon' )
-      TOL = MAX( ABS( ALPHA ), ABS( BETA ) )
-      TOL = EIGHT*EPS*MAX( ABS( D( N ) ), TOL )
-*
-*     There are 2 kinds of deflation -- first a value in the z-vector
-*     is small, second two (or more) singular values are very close
-*     together (their difference is small).
-*
-*     If the value in the z-vector is small, we simply permute the
-*     array so that the corresponding singular value is moved to the
-*     end.
-*
-*     If two values in the D-vector are close, we perform a two-sided
-*     rotation designed to make one of the corresponding z-vector
-*     entries zero, and then permute the array so that the deflated
-*     singular value is moved to the end.
-*
-*     If there are multiple singular values then the problem deflates.
-*     Here the number of equal singular values are found.  As each equal
-*     singular value is found, an elementary reflector is computed to
-*     rotate the corresponding singular subspace so that the
-*     corresponding components of Z are zero in this new basis.
-*
-      K = 1
-      K2 = N + 1
-      DO 80 J = 2, N
-         IF( ABS( Z( J ) ).LE.TOL ) THEN
-*
-*           Deflate due to small z component.
-*
-            K2 = K2 - 1
-            IDXP( K2 ) = J
-            COLTYP( J ) = 4
-            IF( J.EQ.N )
-     $         GO TO 120
-         ELSE
-            JPREV = J
-            GO TO 90
-         END IF
-   80 CONTINUE
-   90 CONTINUE
-      J = JPREV
-  100 CONTINUE
-      J = J + 1
-      IF( J.GT.N )
-     $   GO TO 110
-      IF( ABS( Z( J ) ).LE.TOL ) THEN
-*
-*        Deflate due to small z component.
-*
-         K2 = K2 - 1
-         IDXP( K2 ) = J
-         COLTYP( J ) = 4
-      ELSE
-*
-*        Check if singular values are close enough to allow deflation.
-*
-         IF( ABS( D( J )-D( JPREV ) ).LE.TOL ) THEN
-*
-*           Deflation is possible.
-*
-            S = Z( JPREV )
-            C = Z( J )
-*
-*           Find sqrt(a**2+b**2) without overflow or
-*           destructive underflow.
-*
-            TAU = SLAPY2( C, S )
-            C = C / TAU
-            S = -S / TAU
-            Z( J ) = TAU
-            Z( JPREV ) = ZERO
-*
-*           Apply back the Givens rotation to the left and right
-*           singular vector matrices.
-*
-            IDXJP = IDXQ( IDX( JPREV )+1 )
-            IDXJ = IDXQ( IDX( J )+1 )
-            IF( IDXJP.LE.NLP1 ) THEN
-               IDXJP = IDXJP - 1
-            END IF
-            IF( IDXJ.LE.NLP1 ) THEN
-               IDXJ = IDXJ - 1
-            END IF
-            CALL SROT( N, U( 1, IDXJP ), 1, U( 1, IDXJ ), 1, C, S )
-            CALL SROT( M, VT( IDXJP, 1 ), LDVT, VT( IDXJ, 1 ), LDVT, C,
-     $                 S )
-            IF( COLTYP( J ).NE.COLTYP( JPREV ) ) THEN
-               COLTYP( J ) = 3
-            END IF
-            COLTYP( JPREV ) = 4
-            K2 = K2 - 1
-            IDXP( K2 ) = JPREV
-            JPREV = J
-         ELSE
-            K = K + 1
-            U2( K, 1 ) = Z( JPREV )
-            DSIGMA( K ) = D( JPREV )
-            IDXP( K ) = JPREV
-            JPREV = J
-         END IF
-      END IF
-      GO TO 100
-  110 CONTINUE
-*
-*     Record the last singular value.
-*
-      K = K + 1
-      U2( K, 1 ) = Z( JPREV )
-      DSIGMA( K ) = D( JPREV )
-      IDXP( K ) = JPREV
-*
-  120 CONTINUE
-*
-*     Count up the total number of the various types of columns, then
-*     form a permutation which positions the four column types into
-*     four groups of uniform structure (although one or more of these
-*     groups may be empty).
-*
-      DO 130 J = 1, 4
-         CTOT( J ) = 0
-  130 CONTINUE
-      DO 140 J = 2, N
-         CT = COLTYP( J )
-         CTOT( CT ) = CTOT( CT ) + 1
-  140 CONTINUE
-*
-*     PSM(*) = Position in SubMatrix (of types 1 through 4)
-*
-      PSM( 1 ) = 2
-      PSM( 2 ) = 2 + CTOT( 1 )
-      PSM( 3 ) = PSM( 2 ) + CTOT( 2 )
-      PSM( 4 ) = PSM( 3 ) + CTOT( 3 )
-*
-*     Fill out the IDXC array so that the permutation which it induces
-*     will place all type-1 columns first, all type-2 columns next,
-*     then all type-3's, and finally all type-4's, starting from the
-*     second column. This applies similarly to the rows of VT.
-*
-      DO 150 J = 2, N
-         JP = IDXP( J )
-         CT = COLTYP( JP )
-         IDXC( PSM( CT ) ) = J
-         PSM( CT ) = PSM( CT ) + 1
-  150 CONTINUE
-*
-*     Sort the singular values and corresponding singular vectors into
-*     DSIGMA, U2, and VT2 respectively.  The singular values/vectors
-*     which were not deflated go into the first K slots of DSIGMA, U2,
-*     and VT2 respectively, while those which were deflated go into the
-*     last N - K slots, except that the first column/row will be treated
-*     separately.
-*
-      DO 160 J = 2, N
-         JP = IDXP( J )
-         DSIGMA( J ) = D( JP )
-         IDXJ = IDXQ( IDX( IDXP( IDXC( J ) ) )+1 )
-         IF( IDXJ.LE.NLP1 ) THEN
-            IDXJ = IDXJ - 1
-         END IF
-         CALL SCOPY( N, U( 1, IDXJ ), 1, U2( 1, J ), 1 )
-         CALL SCOPY( M, VT( IDXJ, 1 ), LDVT, VT2( J, 1 ), LDVT2 )
-  160 CONTINUE
-*
-*     Determine DSIGMA(1), DSIGMA(2) and Z(1)
-*
-      DSIGMA( 1 ) = ZERO
-      HLFTOL = TOL / TWO
-      IF( ABS( DSIGMA( 2 ) ).LE.HLFTOL )
-     $   DSIGMA( 2 ) = HLFTOL
-      IF( M.GT.N ) THEN
-         Z( 1 ) = SLAPY2( Z1, Z( M ) )
-         IF( Z( 1 ).LE.TOL ) THEN
-            C = ONE
-            S = ZERO
-            Z( 1 ) = TOL
-         ELSE
-            C = Z1 / Z( 1 )
-            S = Z( M ) / Z( 1 )
-         END IF
-      ELSE
-         IF( ABS( Z1 ).LE.TOL ) THEN
-            Z( 1 ) = TOL
-         ELSE
-            Z( 1 ) = Z1
-         END IF
-      END IF
-*
-*     Move the rest of the updating row to Z.
-*
-      CALL SCOPY( K-1, U2( 2, 1 ), 1, Z( 2 ), 1 )
-*
-*     Determine the first column of U2, the first row of VT2 and the
-*     last row of VT.
-*
-      CALL SLASET( 'A', N, 1, ZERO, ZERO, U2, LDU2 )
-      U2( NLP1, 1 ) = ONE
-      IF( M.GT.N ) THEN
-         DO 170 I = 1, NLP1
-            VT( M, I ) = -S*VT( NLP1, I )
-            VT2( 1, I ) = C*VT( NLP1, I )
-  170    CONTINUE
-         DO 180 I = NLP2, M
-            VT2( 1, I ) = S*VT( M, I )
-            VT( M, I ) = C*VT( M, I )
-  180    CONTINUE
-      ELSE
-         CALL SCOPY( M, VT( NLP1, 1 ), LDVT, VT2( 1, 1 ), LDVT2 )
-      END IF
-      IF( M.GT.N ) THEN
-         CALL SCOPY( M, VT( M, 1 ), LDVT, VT2( M, 1 ), LDVT2 )
-      END IF
-*
-*     The deflated singular values and their corresponding vectors go
-*     into the back of D, U, and V respectively.
-*
-      IF( N.GT.K ) THEN
-         CALL SCOPY( N-K, DSIGMA( K+1 ), 1, D( K+1 ), 1 )
-         CALL SLACPY( 'A', N, N-K, U2( 1, K+1 ), LDU2, U( 1, K+1 ),
-     $                LDU )
-         CALL SLACPY( 'A', N-K, M, VT2( K+1, 1 ), LDVT2, VT( K+1, 1 ),
-     $                LDVT )
-      END IF
-*
-*     Copy CTOT into COLTYP for referencing in SLASD3.
-*
-      DO 190 J = 1, 4
-         COLTYP( J ) = CTOT( J )
-  190 CONTINUE
-*
-      RETURN
-*
-*     End of SLASD2
-*
-      END
--- a/libcruft/lapack/slasd3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,358 +0,0 @@
-      SUBROUTINE SLASD3( NL, NR, SQRE, K, D, Q, LDQ, DSIGMA, U, LDU, U2,
-     $                   LDU2, VT, LDVT, VT2, LDVT2, IDXC, CTOT, Z,
-     $                   INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDQ, LDU, LDU2, LDVT, LDVT2, NL, NR,
-     $                   SQRE
-*     ..
-*     .. Array Arguments ..
-      INTEGER            CTOT( * ), IDXC( * )
-      REAL               D( * ), DSIGMA( * ), Q( LDQ, * ), U( LDU, * ),
-     $                   U2( LDU2, * ), VT( LDVT, * ), VT2( LDVT2, * ),
-     $                   Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASD3 finds all the square roots of the roots of the secular
-*  equation, as defined by the values in D and Z.  It makes the
-*  appropriate calls to SLASD4 and then updates the singular
-*  vectors by matrix multiplication.
-*
-*  This code makes very mild assumptions about floating point
-*  arithmetic. It will work on machines with a guard digit in
-*  add/subtract, or on those binary machines without guard digits
-*  which subtract like the Cray XMP, Cray YMP, Cray C 90, or Cray 2.
-*  It could conceivably fail on hexadecimal or decimal machines
-*  without guard digits, but we know of none.
-*
-*  SLASD3 is called from SLASD1.
-*
-*  Arguments
-*  =========
-*
-*  NL     (input) INTEGER
-*         The row dimension of the upper block.  NL >= 1.
-*
-*  NR     (input) INTEGER
-*         The row dimension of the lower block.  NR >= 1.
-*
-*  SQRE   (input) INTEGER
-*         = 0: the lower block is an NR-by-NR square matrix.
-*         = 1: the lower block is an NR-by-(NR+1) rectangular matrix.
-*
-*         The bidiagonal matrix has N = NL + NR + 1 rows and
-*         M = N + SQRE >= N columns.
-*
-*  K      (input) INTEGER
-*         The size of the secular equation, 1 =< K = < N.
-*
-*  D      (output) REAL array, dimension(K)
-*         On exit the square roots of the roots of the secular equation,
-*         in ascending order.
-*
-*  Q      (workspace) REAL array,
-*                     dimension at least (LDQ,K).
-*
-*  LDQ    (input) INTEGER
-*         The leading dimension of the array Q.  LDQ >= K.
-*
-*  DSIGMA (input/output) REAL array, dimension(K)
-*         The first K elements of this array contain the old roots
-*         of the deflated updating problem.  These are the poles
-*         of the secular equation.
-*
-*  U      (output) REAL array, dimension (LDU, N)
-*         The last N - K columns of this matrix contain the deflated
-*         left singular vectors.
-*
-*  LDU    (input) INTEGER
-*         The leading dimension of the array U.  LDU >= N.
-*
-*  U2     (input) REAL array, dimension (LDU2, N)
-*         The first K columns of this matrix contain the non-deflated
-*         left singular vectors for the split problem.
-*
-*  LDU2   (input) INTEGER
-*         The leading dimension of the array U2.  LDU2 >= N.
-*
-*  VT     (output) REAL array, dimension (LDVT, M)
-*         The last M - K columns of VT' contain the deflated
-*         right singular vectors.
-*
-*  LDVT   (input) INTEGER
-*         The leading dimension of the array VT.  LDVT >= N.
-*
-*  VT2    (input/output) REAL array, dimension (LDVT2, N)
-*         The first K columns of VT2' contain the non-deflated
-*         right singular vectors for the split problem.
-*
-*  LDVT2  (input) INTEGER
-*         The leading dimension of the array VT2.  LDVT2 >= N.
-*
-*  IDXC   (input) INTEGER array, dimension (N)
-*         The permutation used to arrange the columns of U (and rows of
-*         VT) into three groups:  the first group contains non-zero
-*         entries only at and above (or before) NL +1; the second
-*         contains non-zero entries only at and below (or after) NL+2;
-*         and the third is dense. The first column of U and the row of
-*         VT are treated separately, however.
-*
-*         The rows of the singular vectors found by SLASD4
-*         must be likewise permuted before the matrix multiplies can
-*         take place.
-*
-*  CTOT   (input) INTEGER array, dimension (4)
-*         A count of the total number of the various types of columns
-*         in U (or rows in VT), as described in IDXC. The fourth column
-*         type is any column which has been deflated.
-*
-*  Z      (input/output) REAL array, dimension (K)
-*         The first K elements of this array contain the components
-*         of the deflation-adjusted updating row vector.
-*
-*  INFO   (output) INTEGER
-*         = 0:  successful exit.
-*         < 0:  if INFO = -i, the i-th argument had an illegal value.
-*         > 0:  if INFO = 1, an singular value did not converge
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO, NEGONE
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0,
-     $                     NEGONE = -1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            CTEMP, I, J, JC, KTEMP, M, N, NLP1, NLP2, NRP1
-      REAL               RHO, TEMP
-*     ..
-*     .. External Functions ..
-      REAL               SLAMC3, SNRM2
-      EXTERNAL           SLAMC3, SNRM2
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SGEMM, SLACPY, SLASCL, SLASD4, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( NL.LT.1 ) THEN
-         INFO = -1
-      ELSE IF( NR.LT.1 ) THEN
-         INFO = -2
-      ELSE IF( ( SQRE.NE.1 ) .AND. ( SQRE.NE.0 ) ) THEN
-         INFO = -3
-      END IF
-*
-      N = NL + NR + 1
-      M = N + SQRE
-      NLP1 = NL + 1
-      NLP2 = NL + 2
-*
-      IF( ( K.LT.1 ) .OR. ( K.GT.N ) ) THEN
-         INFO = -4
-      ELSE IF( LDQ.LT.K ) THEN
-         INFO = -7
-      ELSE IF( LDU.LT.N ) THEN
-         INFO = -10
-      ELSE IF( LDU2.LT.N ) THEN
-         INFO = -12
-      ELSE IF( LDVT.LT.M ) THEN
-         INFO = -14
-      ELSE IF( LDVT2.LT.M ) THEN
-         INFO = -16
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLASD3', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( K.EQ.1 ) THEN
-         D( 1 ) = ABS( Z( 1 ) )
-         CALL SCOPY( M, VT2( 1, 1 ), LDVT2, VT( 1, 1 ), LDVT )
-         IF( Z( 1 ).GT.ZERO ) THEN
-            CALL SCOPY( N, U2( 1, 1 ), 1, U( 1, 1 ), 1 )
-         ELSE
-            DO 10 I = 1, N
-               U( I, 1 ) = -U2( I, 1 )
-   10       CONTINUE
-         END IF
-         RETURN
-      END IF
-*
-*     Modify values DSIGMA(i) to make sure all DSIGMA(i)-DSIGMA(j) can
-*     be computed with high relative accuracy (barring over/underflow).
-*     This is a problem on machines without a guard digit in
-*     add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2).
-*     The following code replaces DSIGMA(I) by 2*DSIGMA(I)-DSIGMA(I),
-*     which on any of these machines zeros out the bottommost
-*     bit of DSIGMA(I) if it is 1; this makes the subsequent
-*     subtractions DSIGMA(I)-DSIGMA(J) unproblematic when cancellation
-*     occurs. On binary machines with a guard digit (almost all
-*     machines) it does not change DSIGMA(I) at all. On hexadecimal
-*     and decimal machines with a guard digit, it slightly
-*     changes the bottommost bits of DSIGMA(I). It does not account
-*     for hexadecimal or decimal machines without guard digits
-*     (we know of none). We use a subroutine call to compute
-*     2*DSIGMA(I) to prevent optimizing compilers from eliminating
-*     this code.
-*
-      DO 20 I = 1, K
-         DSIGMA( I ) = SLAMC3( DSIGMA( I ), DSIGMA( I ) ) - DSIGMA( I )
-   20 CONTINUE
-*
-*     Keep a copy of Z.
-*
-      CALL SCOPY( K, Z, 1, Q, 1 )
-*
-*     Normalize Z.
-*
-      RHO = SNRM2( K, Z, 1 )
-      CALL SLASCL( 'G', 0, 0, RHO, ONE, K, 1, Z, K, INFO )
-      RHO = RHO*RHO
-*
-*     Find the new singular values.
-*
-      DO 30 J = 1, K
-         CALL SLASD4( K, J, DSIGMA, Z, U( 1, J ), RHO, D( J ),
-     $                VT( 1, J ), INFO )
-*
-*        If the zero finder fails, the computation is terminated.
-*
-         IF( INFO.NE.0 ) THEN
-            RETURN
-         END IF
-   30 CONTINUE
-*
-*     Compute updated Z.
-*
-      DO 60 I = 1, K
-         Z( I ) = U( I, K )*VT( I, K )
-         DO 40 J = 1, I - 1
-            Z( I ) = Z( I )*( U( I, J )*VT( I, J ) /
-     $               ( DSIGMA( I )-DSIGMA( J ) ) /
-     $               ( DSIGMA( I )+DSIGMA( J ) ) )
-   40    CONTINUE
-         DO 50 J = I, K - 1
-            Z( I ) = Z( I )*( U( I, J )*VT( I, J ) /
-     $               ( DSIGMA( I )-DSIGMA( J+1 ) ) /
-     $               ( DSIGMA( I )+DSIGMA( J+1 ) ) )
-   50    CONTINUE
-         Z( I ) = SIGN( SQRT( ABS( Z( I ) ) ), Q( I, 1 ) )
-   60 CONTINUE
-*
-*     Compute left singular vectors of the modified diagonal matrix,
-*     and store related information for the right singular vectors.
-*
-      DO 90 I = 1, K
-         VT( 1, I ) = Z( 1 ) / U( 1, I ) / VT( 1, I )
-         U( 1, I ) = NEGONE
-         DO 70 J = 2, K
-            VT( J, I ) = Z( J ) / U( J, I ) / VT( J, I )
-            U( J, I ) = DSIGMA( J )*VT( J, I )
-   70    CONTINUE
-         TEMP = SNRM2( K, U( 1, I ), 1 )
-         Q( 1, I ) = U( 1, I ) / TEMP
-         DO 80 J = 2, K
-            JC = IDXC( J )
-            Q( J, I ) = U( JC, I ) / TEMP
-   80    CONTINUE
-   90 CONTINUE
-*
-*     Update the left singular vector matrix.
-*
-      IF( K.EQ.2 ) THEN
-         CALL SGEMM( 'N', 'N', N, K, K, ONE, U2, LDU2, Q, LDQ, ZERO, U,
-     $               LDU )
-         GO TO 100
-      END IF
-      IF( CTOT( 1 ).GT.0 ) THEN
-         CALL SGEMM( 'N', 'N', NL, K, CTOT( 1 ), ONE, U2( 1, 2 ), LDU2,
-     $               Q( 2, 1 ), LDQ, ZERO, U( 1, 1 ), LDU )
-         IF( CTOT( 3 ).GT.0 ) THEN
-            KTEMP = 2 + CTOT( 1 ) + CTOT( 2 )
-            CALL SGEMM( 'N', 'N', NL, K, CTOT( 3 ), ONE, U2( 1, KTEMP ),
-     $                  LDU2, Q( KTEMP, 1 ), LDQ, ONE, U( 1, 1 ), LDU )
-         END IF
-      ELSE IF( CTOT( 3 ).GT.0 ) THEN
-         KTEMP = 2 + CTOT( 1 ) + CTOT( 2 )
-         CALL SGEMM( 'N', 'N', NL, K, CTOT( 3 ), ONE, U2( 1, KTEMP ),
-     $               LDU2, Q( KTEMP, 1 ), LDQ, ZERO, U( 1, 1 ), LDU )
-      ELSE
-         CALL SLACPY( 'F', NL, K, U2, LDU2, U, LDU )
-      END IF
-      CALL SCOPY( K, Q( 1, 1 ), LDQ, U( NLP1, 1 ), LDU )
-      KTEMP = 2 + CTOT( 1 )
-      CTEMP = CTOT( 2 ) + CTOT( 3 )
-      CALL SGEMM( 'N', 'N', NR, K, CTEMP, ONE, U2( NLP2, KTEMP ), LDU2,
-     $            Q( KTEMP, 1 ), LDQ, ZERO, U( NLP2, 1 ), LDU )
-*
-*     Generate the right singular vectors.
-*
-  100 CONTINUE
-      DO 120 I = 1, K
-         TEMP = SNRM2( K, VT( 1, I ), 1 )
-         Q( I, 1 ) = VT( 1, I ) / TEMP
-         DO 110 J = 2, K
-            JC = IDXC( J )
-            Q( I, J ) = VT( JC, I ) / TEMP
-  110    CONTINUE
-  120 CONTINUE
-*
-*     Update the right singular vector matrix.
-*
-      IF( K.EQ.2 ) THEN
-         CALL SGEMM( 'N', 'N', K, M, K, ONE, Q, LDQ, VT2, LDVT2, ZERO,
-     $               VT, LDVT )
-         RETURN
-      END IF
-      KTEMP = 1 + CTOT( 1 )
-      CALL SGEMM( 'N', 'N', K, NLP1, KTEMP, ONE, Q( 1, 1 ), LDQ,
-     $            VT2( 1, 1 ), LDVT2, ZERO, VT( 1, 1 ), LDVT )
-      KTEMP = 2 + CTOT( 1 ) + CTOT( 2 )
-      IF( KTEMP.LE.LDVT2 )
-     $   CALL SGEMM( 'N', 'N', K, NLP1, CTOT( 3 ), ONE, Q( 1, KTEMP ),
-     $               LDQ, VT2( KTEMP, 1 ), LDVT2, ONE, VT( 1, 1 ),
-     $               LDVT )
-*
-      KTEMP = CTOT( 1 ) + 1
-      NRP1 = NR + SQRE
-      IF( KTEMP.GT.1 ) THEN
-         DO 130 I = 1, K
-            Q( I, KTEMP ) = Q( I, 1 )
-  130    CONTINUE
-         DO 140 I = NLP2, M
-            VT2( KTEMP, I ) = VT2( 1, I )
-  140    CONTINUE
-      END IF
-      CTEMP = 1 + CTOT( 2 ) + CTOT( 3 )
-      CALL SGEMM( 'N', 'N', K, NRP1, CTEMP, ONE, Q( 1, KTEMP ), LDQ,
-     $            VT2( KTEMP, NLP2 ), LDVT2, ZERO, VT( 1, NLP2 ), LDVT )
-*
-      RETURN
-*
-*     End of SLASD3
-*
-      END
--- a/libcruft/lapack/slasd4.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,890 +0,0 @@
-      SUBROUTINE SLASD4( N, I, D, Z, DELTA, RHO, SIGMA, WORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            I, INFO, N
-      REAL               RHO, SIGMA
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * ), DELTA( * ), WORK( * ), Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  This subroutine computes the square root of the I-th updated
-*  eigenvalue of a positive symmetric rank-one modification to
-*  a positive diagonal matrix whose entries are given as the squares
-*  of the corresponding entries in the array d, and that
-*
-*         0 <= D(i) < D(j)  for  i < j
-*
-*  and that RHO > 0. This is arranged by the calling routine, and is
-*  no loss in generality.  The rank-one modified system is thus
-*
-*         diag( D ) * diag( D ) +  RHO *  Z * Z_transpose.
-*
-*  where we assume the Euclidean norm of Z is 1.
-*
-*  The method consists of approximating the rational functions in the
-*  secular equation by simpler interpolating rational functions.
-*
-*  Arguments
-*  =========
-*
-*  N      (input) INTEGER
-*         The length of all arrays.
-*
-*  I      (input) INTEGER
-*         The index of the eigenvalue to be computed.  1 <= I <= N.
-*
-*  D      (input) REAL array, dimension ( N )
-*         The original eigenvalues.  It is assumed that they are in
-*         order, 0 <= D(I) < D(J)  for I < J.
-*
-*  Z      (input) REAL array, dimension (N)
-*         The components of the updating vector.
-*
-*  DELTA  (output) REAL array, dimension (N)
-*         If N .ne. 1, DELTA contains (D(j) - sigma_I) in its  j-th
-*         component.  If N = 1, then DELTA(1) = 1.  The vector DELTA
-*         contains the information necessary to construct the
-*         (singular) eigenvectors.
-*
-*  RHO    (input) REAL
-*         The scalar in the symmetric updating formula.
-*
-*  SIGMA  (output) REAL
-*         The computed sigma_I, the I-th updated eigenvalue.
-*
-*  WORK   (workspace) REAL array, dimension (N)
-*         If N .ne. 1, WORK contains (D(j) + sigma_I) in its  j-th
-*         component.  If N = 1, then WORK( 1 ) = 1.
-*
-*  INFO   (output) INTEGER
-*         = 0:  successful exit
-*         > 0:  if INFO = 1, the updating process failed.
-*
-*  Internal Parameters
-*  ===================
-*
-*  Logical variable ORGATI (origin-at-i?) is used for distinguishing
-*  whether D(i) or D(i+1) is treated as the origin.
-*
-*            ORGATI = .true.    origin at i
-*            ORGATI = .false.   origin at i+1
-*
-*  Logical variable SWTCH3 (switch-for-3-poles?) is for noting
-*  if we are working with THREE poles!
-*
-*  MAXIT is the maximum number of iterations allowed for each
-*  eigenvalue.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ren-Cang Li, Computer Science Division, University of California
-*     at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            MAXIT
-      PARAMETER          ( MAXIT = 20 )
-      REAL               ZERO, ONE, TWO, THREE, FOUR, EIGHT, TEN
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0, TWO = 2.0E+0,
-     $                   THREE = 3.0E+0, FOUR = 4.0E+0, EIGHT = 8.0E+0,
-     $                   TEN = 10.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ORGATI, SWTCH, SWTCH3
-      INTEGER            II, IIM1, IIP1, IP1, ITER, J, NITER
-      REAL               A, B, C, DELSQ, DELSQ2, DPHI, DPSI, DTIIM,
-     $                   DTIIP, DTIPSQ, DTISQ, DTNSQ, DTNSQ1, DW, EPS,
-     $                   ERRETM, ETA, PHI, PREW, PSI, RHOINV, SG2LB,
-     $                   SG2UB, TAU, TEMP, TEMP1, TEMP2, W
-*     ..
-*     .. Local Arrays ..
-      REAL               DD( 3 ), ZZ( 3 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLAED6, SLASD5
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      EXTERNAL           SLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Since this routine is called in an inner loop, we do no argument
-*     checking.
-*
-*     Quick return for N=1 and 2.
-*
-      INFO = 0
-      IF( N.EQ.1 ) THEN
-*
-*        Presumably, I=1 upon entry
-*
-         SIGMA = SQRT( D( 1 )*D( 1 )+RHO*Z( 1 )*Z( 1 ) )
-         DELTA( 1 ) = ONE
-         WORK( 1 ) = ONE
-         RETURN
-      END IF
-      IF( N.EQ.2 ) THEN
-         CALL SLASD5( I, D, Z, DELTA, RHO, SIGMA, WORK )
-         RETURN
-      END IF
-*
-*     Compute machine epsilon
-*
-      EPS = SLAMCH( 'Epsilon' )
-      RHOINV = ONE / RHO
-*
-*     The case I = N
-*
-      IF( I.EQ.N ) THEN
-*
-*        Initialize some basic variables
-*
-         II = N - 1
-         NITER = 1
-*
-*        Calculate initial guess
-*
-         TEMP = RHO / TWO
-*
-*        If ||Z||_2 is not one, then TEMP should be set to
-*        RHO * ||Z||_2^2 / TWO
-*
-         TEMP1 = TEMP / ( D( N )+SQRT( D( N )*D( N )+TEMP ) )
-         DO 10 J = 1, N
-            WORK( J ) = D( J ) + D( N ) + TEMP1
-            DELTA( J ) = ( D( J )-D( N ) ) - TEMP1
-   10    CONTINUE
-*
-         PSI = ZERO
-         DO 20 J = 1, N - 2
-            PSI = PSI + Z( J )*Z( J ) / ( DELTA( J )*WORK( J ) )
-   20    CONTINUE
-*
-         C = RHOINV + PSI
-         W = C + Z( II )*Z( II ) / ( DELTA( II )*WORK( II ) ) +
-     $       Z( N )*Z( N ) / ( DELTA( N )*WORK( N ) )
-*
-         IF( W.LE.ZERO ) THEN
-            TEMP1 = SQRT( D( N )*D( N )+RHO )
-            TEMP = Z( N-1 )*Z( N-1 ) / ( ( D( N-1 )+TEMP1 )*
-     $             ( D( N )-D( N-1 )+RHO / ( D( N )+TEMP1 ) ) ) +
-     $             Z( N )*Z( N ) / RHO
-*
-*           The following TAU is to approximate
-*           SIGMA_n^2 - D( N )*D( N )
-*
-            IF( C.LE.TEMP ) THEN
-               TAU = RHO
-            ELSE
-               DELSQ = ( D( N )-D( N-1 ) )*( D( N )+D( N-1 ) )
-               A = -C*DELSQ + Z( N-1 )*Z( N-1 ) + Z( N )*Z( N )
-               B = Z( N )*Z( N )*DELSQ
-               IF( A.LT.ZERO ) THEN
-                  TAU = TWO*B / ( SQRT( A*A+FOUR*B*C )-A )
-               ELSE
-                  TAU = ( A+SQRT( A*A+FOUR*B*C ) ) / ( TWO*C )
-               END IF
-            END IF
-*
-*           It can be proved that
-*               D(N)^2+RHO/2 <= SIGMA_n^2 < D(N)^2+TAU <= D(N)^2+RHO
-*
-         ELSE
-            DELSQ = ( D( N )-D( N-1 ) )*( D( N )+D( N-1 ) )
-            A = -C*DELSQ + Z( N-1 )*Z( N-1 ) + Z( N )*Z( N )
-            B = Z( N )*Z( N )*DELSQ
-*
-*           The following TAU is to approximate
-*           SIGMA_n^2 - D( N )*D( N )
-*
-            IF( A.LT.ZERO ) THEN
-               TAU = TWO*B / ( SQRT( A*A+FOUR*B*C )-A )
-            ELSE
-               TAU = ( A+SQRT( A*A+FOUR*B*C ) ) / ( TWO*C )
-            END IF
-*
-*           It can be proved that
-*           D(N)^2 < D(N)^2+TAU < SIGMA(N)^2 < D(N)^2+RHO/2
-*
-         END IF
-*
-*        The following ETA is to approximate SIGMA_n - D( N )
-*
-         ETA = TAU / ( D( N )+SQRT( D( N )*D( N )+TAU ) )
-*
-         SIGMA = D( N ) + ETA
-         DO 30 J = 1, N
-            DELTA( J ) = ( D( J )-D( I ) ) - ETA
-            WORK( J ) = D( J ) + D( I ) + ETA
-   30    CONTINUE
-*
-*        Evaluate PSI and the derivative DPSI
-*
-         DPSI = ZERO
-         PSI = ZERO
-         ERRETM = ZERO
-         DO 40 J = 1, II
-            TEMP = Z( J ) / ( DELTA( J )*WORK( J ) )
-            PSI = PSI + Z( J )*TEMP
-            DPSI = DPSI + TEMP*TEMP
-            ERRETM = ERRETM + PSI
-   40    CONTINUE
-         ERRETM = ABS( ERRETM )
-*
-*        Evaluate PHI and the derivative DPHI
-*
-         TEMP = Z( N ) / ( DELTA( N )*WORK( N ) )
-         PHI = Z( N )*TEMP
-         DPHI = TEMP*TEMP
-         ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV +
-     $            ABS( TAU )*( DPSI+DPHI )
-*
-         W = RHOINV + PHI + PSI
-*
-*        Test for convergence
-*
-         IF( ABS( W ).LE.EPS*ERRETM ) THEN
-            GO TO 240
-         END IF
-*
-*        Calculate the new step
-*
-         NITER = NITER + 1
-         DTNSQ1 = WORK( N-1 )*DELTA( N-1 )
-         DTNSQ = WORK( N )*DELTA( N )
-         C = W - DTNSQ1*DPSI - DTNSQ*DPHI
-         A = ( DTNSQ+DTNSQ1 )*W - DTNSQ*DTNSQ1*( DPSI+DPHI )
-         B = DTNSQ*DTNSQ1*W
-         IF( C.LT.ZERO )
-     $      C = ABS( C )
-         IF( C.EQ.ZERO ) THEN
-            ETA = RHO - SIGMA*SIGMA
-         ELSE IF( A.GE.ZERO ) THEN
-            ETA = ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
-         ELSE
-            ETA = TWO*B / ( A-SQRT( ABS( A*A-FOUR*B*C ) ) )
-         END IF
-*
-*        Note, eta should be positive if w is negative, and
-*        eta should be negative otherwise. However,
-*        if for some reason caused by roundoff, eta*w > 0,
-*        we simply use one Newton step instead. This way
-*        will guarantee eta*w < 0.
-*
-         IF( W*ETA.GT.ZERO )
-     $      ETA = -W / ( DPSI+DPHI )
-         TEMP = ETA - DTNSQ
-         IF( TEMP.GT.RHO )
-     $      ETA = RHO + DTNSQ
-*
-         TAU = TAU + ETA
-         ETA = ETA / ( SIGMA+SQRT( ETA+SIGMA*SIGMA ) )
-         DO 50 J = 1, N
-            DELTA( J ) = DELTA( J ) - ETA
-            WORK( J ) = WORK( J ) + ETA
-   50    CONTINUE
-*
-         SIGMA = SIGMA + ETA
-*
-*        Evaluate PSI and the derivative DPSI
-*
-         DPSI = ZERO
-         PSI = ZERO
-         ERRETM = ZERO
-         DO 60 J = 1, II
-            TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
-            PSI = PSI + Z( J )*TEMP
-            DPSI = DPSI + TEMP*TEMP
-            ERRETM = ERRETM + PSI
-   60    CONTINUE
-         ERRETM = ABS( ERRETM )
-*
-*        Evaluate PHI and the derivative DPHI
-*
-         TEMP = Z( N ) / ( WORK( N )*DELTA( N ) )
-         PHI = Z( N )*TEMP
-         DPHI = TEMP*TEMP
-         ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV +
-     $            ABS( TAU )*( DPSI+DPHI )
-*
-         W = RHOINV + PHI + PSI
-*
-*        Main loop to update the values of the array   DELTA
-*
-         ITER = NITER + 1
-*
-         DO 90 NITER = ITER, MAXIT
-*
-*           Test for convergence
-*
-            IF( ABS( W ).LE.EPS*ERRETM ) THEN
-               GO TO 240
-            END IF
-*
-*           Calculate the new step
-*
-            DTNSQ1 = WORK( N-1 )*DELTA( N-1 )
-            DTNSQ = WORK( N )*DELTA( N )
-            C = W - DTNSQ1*DPSI - DTNSQ*DPHI
-            A = ( DTNSQ+DTNSQ1 )*W - DTNSQ1*DTNSQ*( DPSI+DPHI )
-            B = DTNSQ1*DTNSQ*W
-            IF( A.GE.ZERO ) THEN
-               ETA = ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
-            ELSE
-               ETA = TWO*B / ( A-SQRT( ABS( A*A-FOUR*B*C ) ) )
-            END IF
-*
-*           Note, eta should be positive if w is negative, and
-*           eta should be negative otherwise. However,
-*           if for some reason caused by roundoff, eta*w > 0,
-*           we simply use one Newton step instead. This way
-*           will guarantee eta*w < 0.
-*
-            IF( W*ETA.GT.ZERO )
-     $         ETA = -W / ( DPSI+DPHI )
-            TEMP = ETA - DTNSQ
-            IF( TEMP.LE.ZERO )
-     $         ETA = ETA / TWO
-*
-            TAU = TAU + ETA
-            ETA = ETA / ( SIGMA+SQRT( ETA+SIGMA*SIGMA ) )
-            DO 70 J = 1, N
-               DELTA( J ) = DELTA( J ) - ETA
-               WORK( J ) = WORK( J ) + ETA
-   70       CONTINUE
-*
-            SIGMA = SIGMA + ETA
-*
-*           Evaluate PSI and the derivative DPSI
-*
-            DPSI = ZERO
-            PSI = ZERO
-            ERRETM = ZERO
-            DO 80 J = 1, II
-               TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
-               PSI = PSI + Z( J )*TEMP
-               DPSI = DPSI + TEMP*TEMP
-               ERRETM = ERRETM + PSI
-   80       CONTINUE
-            ERRETM = ABS( ERRETM )
-*
-*           Evaluate PHI and the derivative DPHI
-*
-            TEMP = Z( N ) / ( WORK( N )*DELTA( N ) )
-            PHI = Z( N )*TEMP
-            DPHI = TEMP*TEMP
-            ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV +
-     $               ABS( TAU )*( DPSI+DPHI )
-*
-            W = RHOINV + PHI + PSI
-   90    CONTINUE
-*
-*        Return with INFO = 1, NITER = MAXIT and not converged
-*
-         INFO = 1
-         GO TO 240
-*
-*        End for the case I = N
-*
-      ELSE
-*
-*        The case for I < N
-*
-         NITER = 1
-         IP1 = I + 1
-*
-*        Calculate initial guess
-*
-         DELSQ = ( D( IP1 )-D( I ) )*( D( IP1 )+D( I ) )
-         DELSQ2 = DELSQ / TWO
-         TEMP = DELSQ2 / ( D( I )+SQRT( D( I )*D( I )+DELSQ2 ) )
-         DO 100 J = 1, N
-            WORK( J ) = D( J ) + D( I ) + TEMP
-            DELTA( J ) = ( D( J )-D( I ) ) - TEMP
-  100    CONTINUE
-*
-         PSI = ZERO
-         DO 110 J = 1, I - 1
-            PSI = PSI + Z( J )*Z( J ) / ( WORK( J )*DELTA( J ) )
-  110    CONTINUE
-*
-         PHI = ZERO
-         DO 120 J = N, I + 2, -1
-            PHI = PHI + Z( J )*Z( J ) / ( WORK( J )*DELTA( J ) )
-  120    CONTINUE
-         C = RHOINV + PSI + PHI
-         W = C + Z( I )*Z( I ) / ( WORK( I )*DELTA( I ) ) +
-     $       Z( IP1 )*Z( IP1 ) / ( WORK( IP1 )*DELTA( IP1 ) )
-*
-         IF( W.GT.ZERO ) THEN
-*
-*           d(i)^2 < the ith sigma^2 < (d(i)^2+d(i+1)^2)/2
-*
-*           We choose d(i) as origin.
-*
-            ORGATI = .TRUE.
-            SG2LB = ZERO
-            SG2UB = DELSQ2
-            A = C*DELSQ + Z( I )*Z( I ) + Z( IP1 )*Z( IP1 )
-            B = Z( I )*Z( I )*DELSQ
-            IF( A.GT.ZERO ) THEN
-               TAU = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) )
-            ELSE
-               TAU = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
-            END IF
-*
-*           TAU now is an estimation of SIGMA^2 - D( I )^2. The
-*           following, however, is the corresponding estimation of
-*           SIGMA - D( I ).
-*
-            ETA = TAU / ( D( I )+SQRT( D( I )*D( I )+TAU ) )
-         ELSE
-*
-*           (d(i)^2+d(i+1)^2)/2 <= the ith sigma^2 < d(i+1)^2/2
-*
-*           We choose d(i+1) as origin.
-*
-            ORGATI = .FALSE.
-            SG2LB = -DELSQ2
-            SG2UB = ZERO
-            A = C*DELSQ - Z( I )*Z( I ) - Z( IP1 )*Z( IP1 )
-            B = Z( IP1 )*Z( IP1 )*DELSQ
-            IF( A.LT.ZERO ) THEN
-               TAU = TWO*B / ( A-SQRT( ABS( A*A+FOUR*B*C ) ) )
-            ELSE
-               TAU = -( A+SQRT( ABS( A*A+FOUR*B*C ) ) ) / ( TWO*C )
-            END IF
-*
-*           TAU now is an estimation of SIGMA^2 - D( IP1 )^2. The
-*           following, however, is the corresponding estimation of
-*           SIGMA - D( IP1 ).
-*
-            ETA = TAU / ( D( IP1 )+SQRT( ABS( D( IP1 )*D( IP1 )+
-     $            TAU ) ) )
-         END IF
-*
-         IF( ORGATI ) THEN
-            II = I
-            SIGMA = D( I ) + ETA
-            DO 130 J = 1, N
-               WORK( J ) = D( J ) + D( I ) + ETA
-               DELTA( J ) = ( D( J )-D( I ) ) - ETA
-  130       CONTINUE
-         ELSE
-            II = I + 1
-            SIGMA = D( IP1 ) + ETA
-            DO 140 J = 1, N
-               WORK( J ) = D( J ) + D( IP1 ) + ETA
-               DELTA( J ) = ( D( J )-D( IP1 ) ) - ETA
-  140       CONTINUE
-         END IF
-         IIM1 = II - 1
-         IIP1 = II + 1
-*
-*        Evaluate PSI and the derivative DPSI
-*
-         DPSI = ZERO
-         PSI = ZERO
-         ERRETM = ZERO
-         DO 150 J = 1, IIM1
-            TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
-            PSI = PSI + Z( J )*TEMP
-            DPSI = DPSI + TEMP*TEMP
-            ERRETM = ERRETM + PSI
-  150    CONTINUE
-         ERRETM = ABS( ERRETM )
-*
-*        Evaluate PHI and the derivative DPHI
-*
-         DPHI = ZERO
-         PHI = ZERO
-         DO 160 J = N, IIP1, -1
-            TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
-            PHI = PHI + Z( J )*TEMP
-            DPHI = DPHI + TEMP*TEMP
-            ERRETM = ERRETM + PHI
-  160    CONTINUE
-*
-         W = RHOINV + PHI + PSI
-*
-*        W is the value of the secular function with
-*        its ii-th element removed.
-*
-         SWTCH3 = .FALSE.
-         IF( ORGATI ) THEN
-            IF( W.LT.ZERO )
-     $         SWTCH3 = .TRUE.
-         ELSE
-            IF( W.GT.ZERO )
-     $         SWTCH3 = .TRUE.
-         END IF
-         IF( II.EQ.1 .OR. II.EQ.N )
-     $      SWTCH3 = .FALSE.
-*
-         TEMP = Z( II ) / ( WORK( II )*DELTA( II ) )
-         DW = DPSI + DPHI + TEMP*TEMP
-         TEMP = Z( II )*TEMP
-         W = W + TEMP
-         ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV +
-     $            THREE*ABS( TEMP ) + ABS( TAU )*DW
-*
-*        Test for convergence
-*
-         IF( ABS( W ).LE.EPS*ERRETM ) THEN
-            GO TO 240
-         END IF
-*
-         IF( W.LE.ZERO ) THEN
-            SG2LB = MAX( SG2LB, TAU )
-         ELSE
-            SG2UB = MIN( SG2UB, TAU )
-         END IF
-*
-*        Calculate the new step
-*
-         NITER = NITER + 1
-         IF( .NOT.SWTCH3 ) THEN
-            DTIPSQ = WORK( IP1 )*DELTA( IP1 )
-            DTISQ = WORK( I )*DELTA( I )
-            IF( ORGATI ) THEN
-               C = W - DTIPSQ*DW + DELSQ*( Z( I ) / DTISQ )**2
-            ELSE
-               C = W - DTISQ*DW - DELSQ*( Z( IP1 ) / DTIPSQ )**2
-            END IF
-            A = ( DTIPSQ+DTISQ )*W - DTIPSQ*DTISQ*DW
-            B = DTIPSQ*DTISQ*W
-            IF( C.EQ.ZERO ) THEN
-               IF( A.EQ.ZERO ) THEN
-                  IF( ORGATI ) THEN
-                     A = Z( I )*Z( I ) + DTIPSQ*DTIPSQ*( DPSI+DPHI )
-                  ELSE
-                     A = Z( IP1 )*Z( IP1 ) + DTISQ*DTISQ*( DPSI+DPHI )
-                  END IF
-               END IF
-               ETA = B / A
-            ELSE IF( A.LE.ZERO ) THEN
-               ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
-            ELSE
-               ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) )
-            END IF
-         ELSE
-*
-*           Interpolation using THREE most relevant poles
-*
-            DTIIM = WORK( IIM1 )*DELTA( IIM1 )
-            DTIIP = WORK( IIP1 )*DELTA( IIP1 )
-            TEMP = RHOINV + PSI + PHI
-            IF( ORGATI ) THEN
-               TEMP1 = Z( IIM1 ) / DTIIM
-               TEMP1 = TEMP1*TEMP1
-               C = ( TEMP - DTIIP*( DPSI+DPHI ) ) -
-     $             ( D( IIM1 )-D( IIP1 ) )*( D( IIM1 )+D( IIP1 ) )*TEMP1
-               ZZ( 1 ) = Z( IIM1 )*Z( IIM1 )
-               IF( DPSI.LT.TEMP1 ) THEN
-                  ZZ( 3 ) = DTIIP*DTIIP*DPHI
-               ELSE
-                  ZZ( 3 ) = DTIIP*DTIIP*( ( DPSI-TEMP1 )+DPHI )
-               END IF
-            ELSE
-               TEMP1 = Z( IIP1 ) / DTIIP
-               TEMP1 = TEMP1*TEMP1
-               C = ( TEMP - DTIIM*( DPSI+DPHI ) ) -
-     $             ( D( IIP1 )-D( IIM1 ) )*( D( IIM1 )+D( IIP1 ) )*TEMP1
-               IF( DPHI.LT.TEMP1 ) THEN
-                  ZZ( 1 ) = DTIIM*DTIIM*DPSI
-               ELSE
-                  ZZ( 1 ) = DTIIM*DTIIM*( DPSI+( DPHI-TEMP1 ) )
-               END IF
-               ZZ( 3 ) = Z( IIP1 )*Z( IIP1 )
-            END IF
-            ZZ( 2 ) = Z( II )*Z( II )
-            DD( 1 ) = DTIIM
-            DD( 2 ) = DELTA( II )*WORK( II )
-            DD( 3 ) = DTIIP
-            CALL SLAED6( NITER, ORGATI, C, DD, ZZ, W, ETA, INFO )
-            IF( INFO.NE.0 )
-     $         GO TO 240
-         END IF
-*
-*        Note, eta should be positive if w is negative, and
-*        eta should be negative otherwise. However,
-*        if for some reason caused by roundoff, eta*w > 0,
-*        we simply use one Newton step instead. This way
-*        will guarantee eta*w < 0.
-*
-         IF( W*ETA.GE.ZERO )
-     $      ETA = -W / DW
-         IF( ORGATI ) THEN
-            TEMP1 = WORK( I )*DELTA( I )
-            TEMP = ETA - TEMP1
-         ELSE
-            TEMP1 = WORK( IP1 )*DELTA( IP1 )
-            TEMP = ETA - TEMP1
-         END IF
-         IF( TEMP.GT.SG2UB .OR. TEMP.LT.SG2LB ) THEN
-            IF( W.LT.ZERO ) THEN
-               ETA = ( SG2UB-TAU ) / TWO
-            ELSE
-               ETA = ( SG2LB-TAU ) / TWO
-            END IF
-         END IF
-*
-         TAU = TAU + ETA
-         ETA = ETA / ( SIGMA+SQRT( SIGMA*SIGMA+ETA ) )
-*
-         PREW = W
-*
-         SIGMA = SIGMA + ETA
-         DO 170 J = 1, N
-            WORK( J ) = WORK( J ) + ETA
-            DELTA( J ) = DELTA( J ) - ETA
-  170    CONTINUE
-*
-*        Evaluate PSI and the derivative DPSI
-*
-         DPSI = ZERO
-         PSI = ZERO
-         ERRETM = ZERO
-         DO 180 J = 1, IIM1
-            TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
-            PSI = PSI + Z( J )*TEMP
-            DPSI = DPSI + TEMP*TEMP
-            ERRETM = ERRETM + PSI
-  180    CONTINUE
-         ERRETM = ABS( ERRETM )
-*
-*        Evaluate PHI and the derivative DPHI
-*
-         DPHI = ZERO
-         PHI = ZERO
-         DO 190 J = N, IIP1, -1
-            TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
-            PHI = PHI + Z( J )*TEMP
-            DPHI = DPHI + TEMP*TEMP
-            ERRETM = ERRETM + PHI
-  190    CONTINUE
-*
-         TEMP = Z( II ) / ( WORK( II )*DELTA( II ) )
-         DW = DPSI + DPHI + TEMP*TEMP
-         TEMP = Z( II )*TEMP
-         W = RHOINV + PHI + PSI + TEMP
-         ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV +
-     $            THREE*ABS( TEMP ) + ABS( TAU )*DW
-*
-         IF( W.LE.ZERO ) THEN
-            SG2LB = MAX( SG2LB, TAU )
-         ELSE
-            SG2UB = MIN( SG2UB, TAU )
-         END IF
-*
-         SWTCH = .FALSE.
-         IF( ORGATI ) THEN
-            IF( -W.GT.ABS( PREW ) / TEN )
-     $         SWTCH = .TRUE.
-         ELSE
-            IF( W.GT.ABS( PREW ) / TEN )
-     $         SWTCH = .TRUE.
-         END IF
-*
-*        Main loop to update the values of the array   DELTA and WORK
-*
-         ITER = NITER + 1
-*
-         DO 230 NITER = ITER, MAXIT
-*
-*           Test for convergence
-*
-            IF( ABS( W ).LE.EPS*ERRETM ) THEN
-               GO TO 240
-            END IF
-*
-*           Calculate the new step
-*
-            IF( .NOT.SWTCH3 ) THEN
-               DTIPSQ = WORK( IP1 )*DELTA( IP1 )
-               DTISQ = WORK( I )*DELTA( I )
-               IF( .NOT.SWTCH ) THEN
-                  IF( ORGATI ) THEN
-                     C = W - DTIPSQ*DW + DELSQ*( Z( I ) / DTISQ )**2
-                  ELSE
-                     C = W - DTISQ*DW - DELSQ*( Z( IP1 ) / DTIPSQ )**2
-                  END IF
-               ELSE
-                  TEMP = Z( II ) / ( WORK( II )*DELTA( II ) )
-                  IF( ORGATI ) THEN
-                     DPSI = DPSI + TEMP*TEMP
-                  ELSE
-                     DPHI = DPHI + TEMP*TEMP
-                  END IF
-                  C = W - DTISQ*DPSI - DTIPSQ*DPHI
-               END IF
-               A = ( DTIPSQ+DTISQ )*W - DTIPSQ*DTISQ*DW
-               B = DTIPSQ*DTISQ*W
-               IF( C.EQ.ZERO ) THEN
-                  IF( A.EQ.ZERO ) THEN
-                     IF( .NOT.SWTCH ) THEN
-                        IF( ORGATI ) THEN
-                           A = Z( I )*Z( I ) + DTIPSQ*DTIPSQ*
-     $                         ( DPSI+DPHI )
-                        ELSE
-                           A = Z( IP1 )*Z( IP1 ) +
-     $                         DTISQ*DTISQ*( DPSI+DPHI )
-                        END IF
-                     ELSE
-                        A = DTISQ*DTISQ*DPSI + DTIPSQ*DTIPSQ*DPHI
-                     END IF
-                  END IF
-                  ETA = B / A
-               ELSE IF( A.LE.ZERO ) THEN
-                  ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C )
-               ELSE
-                  ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) )
-               END IF
-            ELSE
-*
-*              Interpolation using THREE most relevant poles
-*
-               DTIIM = WORK( IIM1 )*DELTA( IIM1 )
-               DTIIP = WORK( IIP1 )*DELTA( IIP1 )
-               TEMP = RHOINV + PSI + PHI
-               IF( SWTCH ) THEN
-                  C = TEMP - DTIIM*DPSI - DTIIP*DPHI
-                  ZZ( 1 ) = DTIIM*DTIIM*DPSI
-                  ZZ( 3 ) = DTIIP*DTIIP*DPHI
-               ELSE
-                  IF( ORGATI ) THEN
-                     TEMP1 = Z( IIM1 ) / DTIIM
-                     TEMP1 = TEMP1*TEMP1
-                     TEMP2 = ( D( IIM1 )-D( IIP1 ) )*
-     $                       ( D( IIM1 )+D( IIP1 ) )*TEMP1
-                     C = TEMP - DTIIP*( DPSI+DPHI ) - TEMP2
-                     ZZ( 1 ) = Z( IIM1 )*Z( IIM1 )
-                     IF( DPSI.LT.TEMP1 ) THEN
-                        ZZ( 3 ) = DTIIP*DTIIP*DPHI
-                     ELSE
-                        ZZ( 3 ) = DTIIP*DTIIP*( ( DPSI-TEMP1 )+DPHI )
-                     END IF
-                  ELSE
-                     TEMP1 = Z( IIP1 ) / DTIIP
-                     TEMP1 = TEMP1*TEMP1
-                     TEMP2 = ( D( IIP1 )-D( IIM1 ) )*
-     $                       ( D( IIM1 )+D( IIP1 ) )*TEMP1
-                     C = TEMP - DTIIM*( DPSI+DPHI ) - TEMP2
-                     IF( DPHI.LT.TEMP1 ) THEN
-                        ZZ( 1 ) = DTIIM*DTIIM*DPSI
-                     ELSE
-                        ZZ( 1 ) = DTIIM*DTIIM*( DPSI+( DPHI-TEMP1 ) )
-                     END IF
-                     ZZ( 3 ) = Z( IIP1 )*Z( IIP1 )
-                  END IF
-               END IF
-               DD( 1 ) = DTIIM
-               DD( 2 ) = DELTA( II )*WORK( II )
-               DD( 3 ) = DTIIP
-               CALL SLAED6( NITER, ORGATI, C, DD, ZZ, W, ETA, INFO )
-               IF( INFO.NE.0 )
-     $            GO TO 240
-            END IF
-*
-*           Note, eta should be positive if w is negative, and
-*           eta should be negative otherwise. However,
-*           if for some reason caused by roundoff, eta*w > 0,
-*           we simply use one Newton step instead. This way
-*           will guarantee eta*w < 0.
-*
-            IF( W*ETA.GE.ZERO )
-     $         ETA = -W / DW
-            IF( ORGATI ) THEN
-               TEMP1 = WORK( I )*DELTA( I )
-               TEMP = ETA - TEMP1
-            ELSE
-               TEMP1 = WORK( IP1 )*DELTA( IP1 )
-               TEMP = ETA - TEMP1
-            END IF
-            IF( TEMP.GT.SG2UB .OR. TEMP.LT.SG2LB ) THEN
-               IF( W.LT.ZERO ) THEN
-                  ETA = ( SG2UB-TAU ) / TWO
-               ELSE
-                  ETA = ( SG2LB-TAU ) / TWO
-               END IF
-            END IF
-*
-            TAU = TAU + ETA
-            ETA = ETA / ( SIGMA+SQRT( SIGMA*SIGMA+ETA ) )
-*
-            SIGMA = SIGMA + ETA
-            DO 200 J = 1, N
-               WORK( J ) = WORK( J ) + ETA
-               DELTA( J ) = DELTA( J ) - ETA
-  200       CONTINUE
-*
-            PREW = W
-*
-*           Evaluate PSI and the derivative DPSI
-*
-            DPSI = ZERO
-            PSI = ZERO
-            ERRETM = ZERO
-            DO 210 J = 1, IIM1
-               TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
-               PSI = PSI + Z( J )*TEMP
-               DPSI = DPSI + TEMP*TEMP
-               ERRETM = ERRETM + PSI
-  210       CONTINUE
-            ERRETM = ABS( ERRETM )
-*
-*           Evaluate PHI and the derivative DPHI
-*
-            DPHI = ZERO
-            PHI = ZERO
-            DO 220 J = N, IIP1, -1
-               TEMP = Z( J ) / ( WORK( J )*DELTA( J ) )
-               PHI = PHI + Z( J )*TEMP
-               DPHI = DPHI + TEMP*TEMP
-               ERRETM = ERRETM + PHI
-  220       CONTINUE
-*
-            TEMP = Z( II ) / ( WORK( II )*DELTA( II ) )
-            DW = DPSI + DPHI + TEMP*TEMP
-            TEMP = Z( II )*TEMP
-            W = RHOINV + PHI + PSI + TEMP
-            ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV +
-     $               THREE*ABS( TEMP ) + ABS( TAU )*DW
-            IF( W*PREW.GT.ZERO .AND. ABS( W ).GT.ABS( PREW ) / TEN )
-     $         SWTCH = .NOT.SWTCH
-*
-            IF( W.LE.ZERO ) THEN
-               SG2LB = MAX( SG2LB, TAU )
-            ELSE
-               SG2UB = MIN( SG2UB, TAU )
-            END IF
-*
-  230    CONTINUE
-*
-*        Return with INFO = 1, NITER = MAXIT and not converged
-*
-         INFO = 1
-*
-      END IF
-*
-  240 CONTINUE
-      RETURN
-*
-*     End of SLASD4
-*
-      END
--- a/libcruft/lapack/slasd5.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,163 +0,0 @@
-      SUBROUTINE SLASD5( I, D, Z, DELTA, RHO, DSIGMA, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            I
-      REAL               DSIGMA, RHO
-*     ..
-*     .. Array Arguments ..
-      REAL               D( 2 ), DELTA( 2 ), WORK( 2 ), Z( 2 )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  This subroutine computes the square root of the I-th eigenvalue
-*  of a positive symmetric rank-one modification of a 2-by-2 diagonal
-*  matrix
-*
-*             diag( D ) * diag( D ) +  RHO *  Z * transpose(Z) .
-*
-*  The diagonal entries in the array D are assumed to satisfy
-*
-*             0 <= D(i) < D(j)  for  i < j .
-*
-*  We also assume RHO > 0 and that the Euclidean norm of the vector
-*  Z is one.
-*
-*  Arguments
-*  =========
-*
-*  I      (input) INTEGER
-*         The index of the eigenvalue to be computed.  I = 1 or I = 2.
-*
-*  D      (input) REAL array, dimension (2)
-*         The original eigenvalues.  We assume 0 <= D(1) < D(2).
-*
-*  Z      (input) REAL array, dimension (2)
-*         The components of the updating vector.
-*
-*  DELTA  (output) REAL array, dimension (2)
-*         Contains (D(j) - sigma_I) in its  j-th component.
-*         The vector DELTA contains the information necessary
-*         to construct the eigenvectors.
-*
-*  RHO    (input) REAL
-*         The scalar in the symmetric updating formula.
-*
-*  DSIGMA (output) REAL
-*         The computed sigma_I, the I-th updated eigenvalue.
-*
-*  WORK   (workspace) REAL array, dimension (2)
-*         WORK contains (D(j) + sigma_I) in its  j-th component.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ren-Cang Li, Computer Science Division, University of California
-*     at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE, TWO, THREE, FOUR
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0, TWO = 2.0E+0,
-     $                   THREE = 3.0E+0, FOUR = 4.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      REAL               B, C, DEL, DELSQ, TAU, W
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      DEL = D( 2 ) - D( 1 )
-      DELSQ = DEL*( D( 2 )+D( 1 ) )
-      IF( I.EQ.1 ) THEN
-         W = ONE + FOUR*RHO*( Z( 2 )*Z( 2 ) / ( D( 1 )+THREE*D( 2 ) )-
-     $       Z( 1 )*Z( 1 ) / ( THREE*D( 1 )+D( 2 ) ) ) / DEL
-         IF( W.GT.ZERO ) THEN
-            B = DELSQ + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) )
-            C = RHO*Z( 1 )*Z( 1 )*DELSQ
-*
-*           B > ZERO, always
-*
-*           The following TAU is DSIGMA * DSIGMA - D( 1 ) * D( 1 )
-*
-            TAU = TWO*C / ( B+SQRT( ABS( B*B-FOUR*C ) ) )
-*
-*           The following TAU is DSIGMA - D( 1 )
-*
-            TAU = TAU / ( D( 1 )+SQRT( D( 1 )*D( 1 )+TAU ) )
-            DSIGMA = D( 1 ) + TAU
-            DELTA( 1 ) = -TAU
-            DELTA( 2 ) = DEL - TAU
-            WORK( 1 ) = TWO*D( 1 ) + TAU
-            WORK( 2 ) = ( D( 1 )+TAU ) + D( 2 )
-*           DELTA( 1 ) = -Z( 1 ) / TAU
-*           DELTA( 2 ) = Z( 2 ) / ( DEL-TAU )
-         ELSE
-            B = -DELSQ + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) )
-            C = RHO*Z( 2 )*Z( 2 )*DELSQ
-*
-*           The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 )
-*
-            IF( B.GT.ZERO ) THEN
-               TAU = -TWO*C / ( B+SQRT( B*B+FOUR*C ) )
-            ELSE
-               TAU = ( B-SQRT( B*B+FOUR*C ) ) / TWO
-            END IF
-*
-*           The following TAU is DSIGMA - D( 2 )
-*
-            TAU = TAU / ( D( 2 )+SQRT( ABS( D( 2 )*D( 2 )+TAU ) ) )
-            DSIGMA = D( 2 ) + TAU
-            DELTA( 1 ) = -( DEL+TAU )
-            DELTA( 2 ) = -TAU
-            WORK( 1 ) = D( 1 ) + TAU + D( 2 )
-            WORK( 2 ) = TWO*D( 2 ) + TAU
-*           DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU )
-*           DELTA( 2 ) = -Z( 2 ) / TAU
-         END IF
-*        TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) )
-*        DELTA( 1 ) = DELTA( 1 ) / TEMP
-*        DELTA( 2 ) = DELTA( 2 ) / TEMP
-      ELSE
-*
-*        Now I=2
-*
-         B = -DELSQ + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) )
-         C = RHO*Z( 2 )*Z( 2 )*DELSQ
-*
-*        The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 )
-*
-         IF( B.GT.ZERO ) THEN
-            TAU = ( B+SQRT( B*B+FOUR*C ) ) / TWO
-         ELSE
-            TAU = TWO*C / ( -B+SQRT( B*B+FOUR*C ) )
-         END IF
-*
-*        The following TAU is DSIGMA - D( 2 )
-*
-         TAU = TAU / ( D( 2 )+SQRT( D( 2 )*D( 2 )+TAU ) )
-         DSIGMA = D( 2 ) + TAU
-         DELTA( 1 ) = -( DEL+TAU )
-         DELTA( 2 ) = -TAU
-         WORK( 1 ) = D( 1 ) + TAU + D( 2 )
-         WORK( 2 ) = TWO*D( 2 ) + TAU
-*        DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU )
-*        DELTA( 2 ) = -Z( 2 ) / TAU
-*        TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) )
-*        DELTA( 1 ) = DELTA( 1 ) / TEMP
-*        DELTA( 2 ) = DELTA( 2 ) / TEMP
-      END IF
-      RETURN
-*
-*     End of SLASD5
-*
-      END
--- a/libcruft/lapack/slasd6.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,305 +0,0 @@
-      SUBROUTINE SLASD6( ICOMPQ, NL, NR, SQRE, D, VF, VL, ALPHA, BETA,
-     $                   IDXQ, PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM,
-     $                   LDGNUM, POLES, DIFL, DIFR, Z, K, C, S, WORK,
-     $                   IWORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            GIVPTR, ICOMPQ, INFO, K, LDGCOL, LDGNUM, NL,
-     $                   NR, SQRE
-      REAL               ALPHA, BETA, C, S
-*     ..
-*     .. Array Arguments ..
-      INTEGER            GIVCOL( LDGCOL, * ), IDXQ( * ), IWORK( * ),
-     $                   PERM( * )
-      REAL               D( * ), DIFL( * ), DIFR( * ),
-     $                   GIVNUM( LDGNUM, * ), POLES( LDGNUM, * ),
-     $                   VF( * ), VL( * ), WORK( * ), Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASD6 computes the SVD of an updated upper bidiagonal matrix B
-*  obtained by merging two smaller ones by appending a row. This
-*  routine is used only for the problem which requires all singular
-*  values and optionally singular vector matrices in factored form.
-*  B is an N-by-M matrix with N = NL + NR + 1 and M = N + SQRE.
-*  A related subroutine, SLASD1, handles the case in which all singular
-*  values and singular vectors of the bidiagonal matrix are desired.
-*
-*  SLASD6 computes the SVD as follows:
-*
-*                ( D1(in)  0    0     0 )
-*    B = U(in) * (   Z1'   a   Z2'    b ) * VT(in)
-*                (   0     0   D2(in) 0 )
-*
-*      = U(out) * ( D(out) 0) * VT(out)
-*
-*  where Z' = (Z1' a Z2' b) = u' VT', and u is a vector of dimension M
-*  with ALPHA and BETA in the NL+1 and NL+2 th entries and zeros
-*  elsewhere; and the entry b is empty if SQRE = 0.
-*
-*  The singular values of B can be computed using D1, D2, the first
-*  components of all the right singular vectors of the lower block, and
-*  the last components of all the right singular vectors of the upper
-*  block. These components are stored and updated in VF and VL,
-*  respectively, in SLASD6. Hence U and VT are not explicitly
-*  referenced.
-*
-*  The singular values are stored in D. The algorithm consists of two
-*  stages:
-*
-*        The first stage consists of deflating the size of the problem
-*        when there are multiple singular values or if there is a zero
-*        in the Z vector. For each such occurence the dimension of the
-*        secular equation problem is reduced by one. This stage is
-*        performed by the routine SLASD7.
-*
-*        The second stage consists of calculating the updated
-*        singular values. This is done by finding the roots of the
-*        secular equation via the routine SLASD4 (as called by SLASD8).
-*        This routine also updates VF and VL and computes the distances
-*        between the updated singular values and the old singular
-*        values.
-*
-*  SLASD6 is called from SLASDA.
-*
-*  Arguments
-*  =========
-*
-*  ICOMPQ (input) INTEGER
-*         Specifies whether singular vectors are to be computed in
-*         factored form:
-*         = 0: Compute singular values only.
-*         = 1: Compute singular vectors in factored form as well.
-*
-*  NL     (input) INTEGER
-*         The row dimension of the upper block.  NL >= 1.
-*
-*  NR     (input) INTEGER
-*         The row dimension of the lower block.  NR >= 1.
-*
-*  SQRE   (input) INTEGER
-*         = 0: the lower block is an NR-by-NR square matrix.
-*         = 1: the lower block is an NR-by-(NR+1) rectangular matrix.
-*
-*         The bidiagonal matrix has row dimension N = NL + NR + 1,
-*         and column dimension M = N + SQRE.
-*
-*  D      (input/output) REAL array, dimension (NL+NR+1).
-*         On entry D(1:NL,1:NL) contains the singular values of the
-*         upper block, and D(NL+2:N) contains the singular values
-*         of the lower block. On exit D(1:N) contains the singular
-*         values of the modified matrix.
-*
-*  VF     (input/output) REAL array, dimension (M)
-*         On entry, VF(1:NL+1) contains the first components of all
-*         right singular vectors of the upper block; and VF(NL+2:M)
-*         contains the first components of all right singular vectors
-*         of the lower block. On exit, VF contains the first components
-*         of all right singular vectors of the bidiagonal matrix.
-*
-*  VL     (input/output) REAL array, dimension (M)
-*         On entry, VL(1:NL+1) contains the  last components of all
-*         right singular vectors of the upper block; and VL(NL+2:M)
-*         contains the last components of all right singular vectors of
-*         the lower block. On exit, VL contains the last components of
-*         all right singular vectors of the bidiagonal matrix.
-*
-*  ALPHA  (input/output) REAL
-*         Contains the diagonal element associated with the added row.
-*
-*  BETA   (input/output) REAL
-*         Contains the off-diagonal element associated with the added
-*         row.
-*
-*  IDXQ   (output) INTEGER array, dimension (N)
-*         This contains the permutation which will reintegrate the
-*         subproblem just solved back into sorted order, i.e.
-*         D( IDXQ( I = 1, N ) ) will be in ascending order.
-*
-*  PERM   (output) INTEGER array, dimension ( N )
-*         The permutations (from deflation and sorting) to be applied
-*         to each block. Not referenced if ICOMPQ = 0.
-*
-*  GIVPTR (output) INTEGER
-*         The number of Givens rotations which took place in this
-*         subproblem. Not referenced if ICOMPQ = 0.
-*
-*  GIVCOL (output) INTEGER array, dimension ( LDGCOL, 2 )
-*         Each pair of numbers indicates a pair of columns to take place
-*         in a Givens rotation. Not referenced if ICOMPQ = 0.
-*
-*  LDGCOL (input) INTEGER
-*         leading dimension of GIVCOL, must be at least N.
-*
-*  GIVNUM (output) REAL array, dimension ( LDGNUM, 2 )
-*         Each number indicates the C or S value to be used in the
-*         corresponding Givens rotation. Not referenced if ICOMPQ = 0.
-*
-*  LDGNUM (input) INTEGER
-*         The leading dimension of GIVNUM and POLES, must be at least N.
-*
-*  POLES  (output) REAL array, dimension ( LDGNUM, 2 )
-*         On exit, POLES(1,*) is an array containing the new singular
-*         values obtained from solving the secular equation, and
-*         POLES(2,*) is an array containing the poles in the secular
-*         equation. Not referenced if ICOMPQ = 0.
-*
-*  DIFL   (output) REAL array, dimension ( N )
-*         On exit, DIFL(I) is the distance between I-th updated
-*         (undeflated) singular value and the I-th (undeflated) old
-*         singular value.
-*
-*  DIFR   (output) REAL array,
-*                  dimension ( LDGNUM, 2 ) if ICOMPQ = 1 and
-*                  dimension ( N ) if ICOMPQ = 0.
-*         On exit, DIFR(I, 1) is the distance between I-th updated
-*         (undeflated) singular value and the I+1-th (undeflated) old
-*         singular value.
-*
-*         If ICOMPQ = 1, DIFR(1:K,2) is an array containing the
-*         normalizing factors for the right singular vector matrix.
-*
-*         See SLASD8 for details on DIFL and DIFR.
-*
-*  Z      (output) REAL array, dimension ( M )
-*         The first elements of this array contain the components
-*         of the deflation-adjusted updating row vector.
-*
-*  K      (output) INTEGER
-*         Contains the dimension of the non-deflated matrix,
-*         This is the order of the related secular equation. 1 <= K <=N.
-*
-*  C      (output) REAL
-*         C contains garbage if SQRE =0 and the C-value of a Givens
-*         rotation related to the right null space if SQRE = 1.
-*
-*  S      (output) REAL
-*         S contains garbage if SQRE =0 and the S-value of a Givens
-*         rotation related to the right null space if SQRE = 1.
-*
-*  WORK   (workspace) REAL array, dimension ( 4 * M )
-*
-*  IWORK  (workspace) INTEGER array, dimension ( 3 * N )
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if INFO = 1, an singular value did not converge
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, IDX, IDXC, IDXP, ISIGMA, IVFW, IVLW, IW, M,
-     $                   N, N1, N2
-      REAL               ORGNRM
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SLAMRG, SLASCL, SLASD7, SLASD8, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      N = NL + NR + 1
-      M = N + SQRE
-*
-      IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN
-         INFO = -1
-      ELSE IF( NL.LT.1 ) THEN
-         INFO = -2
-      ELSE IF( NR.LT.1 ) THEN
-         INFO = -3
-      ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN
-         INFO = -4
-      ELSE IF( LDGCOL.LT.N ) THEN
-         INFO = -14
-      ELSE IF( LDGNUM.LT.N ) THEN
-         INFO = -16
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLASD6', -INFO )
-         RETURN
-      END IF
-*
-*     The following values are for bookkeeping purposes only.  They are
-*     integer pointers which indicate the portion of the workspace
-*     used by a particular array in SLASD7 and SLASD8.
-*
-      ISIGMA = 1
-      IW = ISIGMA + N
-      IVFW = IW + M
-      IVLW = IVFW + M
-*
-      IDX = 1
-      IDXC = IDX + N
-      IDXP = IDXC + N
-*
-*     Scale.
-*
-      ORGNRM = MAX( ABS( ALPHA ), ABS( BETA ) )
-      D( NL+1 ) = ZERO
-      DO 10 I = 1, N
-         IF( ABS( D( I ) ).GT.ORGNRM ) THEN
-            ORGNRM = ABS( D( I ) )
-         END IF
-   10 CONTINUE
-      CALL SLASCL( 'G', 0, 0, ORGNRM, ONE, N, 1, D, N, INFO )
-      ALPHA = ALPHA / ORGNRM
-      BETA = BETA / ORGNRM
-*
-*     Sort and Deflate singular values.
-*
-      CALL SLASD7( ICOMPQ, NL, NR, SQRE, K, D, Z, WORK( IW ), VF,
-     $             WORK( IVFW ), VL, WORK( IVLW ), ALPHA, BETA,
-     $             WORK( ISIGMA ), IWORK( IDX ), IWORK( IDXP ), IDXQ,
-     $             PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM, C, S,
-     $             INFO )
-*
-*     Solve Secular Equation, compute DIFL, DIFR, and update VF, VL.
-*
-      CALL SLASD8( ICOMPQ, K, D, Z, VF, VL, DIFL, DIFR, LDGNUM,
-     $             WORK( ISIGMA ), WORK( IW ), INFO )
-*
-*     Save the poles if ICOMPQ = 1.
-*
-      IF( ICOMPQ.EQ.1 ) THEN
-         CALL SCOPY( K, D, 1, POLES( 1, 1 ), 1 )
-         CALL SCOPY( K, WORK( ISIGMA ), 1, POLES( 1, 2 ), 1 )
-      END IF
-*
-*     Unscale.
-*
-      CALL SLASCL( 'G', 0, 0, ONE, ORGNRM, N, 1, D, N, INFO )
-*
-*     Prepare the IDXQ sorting permutation.
-*
-      N1 = K
-      N2 = N - K
-      CALL SLAMRG( N1, N2, D, 1, -1, IDXQ )
-*
-      RETURN
-*
-*     End of SLASD6
-*
-      END
--- a/libcruft/lapack/slasd7.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,444 +0,0 @@
-      SUBROUTINE SLASD7( ICOMPQ, NL, NR, SQRE, K, D, Z, ZW, VF, VFW, VL,
-     $                   VLW, ALPHA, BETA, DSIGMA, IDX, IDXP, IDXQ,
-     $                   PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM,
-     $                   C, S, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            GIVPTR, ICOMPQ, INFO, K, LDGCOL, LDGNUM, NL,
-     $                   NR, SQRE
-      REAL               ALPHA, BETA, C, S
-*     ..
-*     .. Array Arguments ..
-      INTEGER            GIVCOL( LDGCOL, * ), IDX( * ), IDXP( * ),
-     $                   IDXQ( * ), PERM( * )
-      REAL               D( * ), DSIGMA( * ), GIVNUM( LDGNUM, * ),
-     $                   VF( * ), VFW( * ), VL( * ), VLW( * ), Z( * ),
-     $                   ZW( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASD7 merges the two sets of singular values together into a single
-*  sorted set. Then it tries to deflate the size of the problem. There
-*  are two ways in which deflation can occur:  when two or more singular
-*  values are close together or if there is a tiny entry in the Z
-*  vector. For each such occurrence the order of the related
-*  secular equation problem is reduced by one.
-*
-*  SLASD7 is called from SLASD6.
-*
-*  Arguments
-*  =========
-*
-*  ICOMPQ  (input) INTEGER
-*          Specifies whether singular vectors are to be computed
-*          in compact form, as follows:
-*          = 0: Compute singular values only.
-*          = 1: Compute singular vectors of upper
-*               bidiagonal matrix in compact form.
-*
-*  NL     (input) INTEGER
-*         The row dimension of the upper block. NL >= 1.
-*
-*  NR     (input) INTEGER
-*         The row dimension of the lower block. NR >= 1.
-*
-*  SQRE   (input) INTEGER
-*         = 0: the lower block is an NR-by-NR square matrix.
-*         = 1: the lower block is an NR-by-(NR+1) rectangular matrix.
-*
-*         The bidiagonal matrix has
-*         N = NL + NR + 1 rows and
-*         M = N + SQRE >= N columns.
-*
-*  K      (output) INTEGER
-*         Contains the dimension of the non-deflated matrix, this is
-*         the order of the related secular equation. 1 <= K <=N.
-*
-*  D      (input/output) REAL array, dimension ( N )
-*         On entry D contains the singular values of the two submatrices
-*         to be combined. On exit D contains the trailing (N-K) updated
-*         singular values (those which were deflated) sorted into
-*         increasing order.
-*
-*  Z      (output) REAL array, dimension ( M )
-*         On exit Z contains the updating row vector in the secular
-*         equation.
-*
-*  ZW     (workspace) REAL array, dimension ( M )
-*         Workspace for Z.
-*
-*  VF     (input/output) REAL array, dimension ( M )
-*         On entry, VF(1:NL+1) contains the first components of all
-*         right singular vectors of the upper block; and VF(NL+2:M)
-*         contains the first components of all right singular vectors
-*         of the lower block. On exit, VF contains the first components
-*         of all right singular vectors of the bidiagonal matrix.
-*
-*  VFW    (workspace) REAL array, dimension ( M )
-*         Workspace for VF.
-*
-*  VL     (input/output) REAL array, dimension ( M )
-*         On entry, VL(1:NL+1) contains the  last components of all
-*         right singular vectors of the upper block; and VL(NL+2:M)
-*         contains the last components of all right singular vectors
-*         of the lower block. On exit, VL contains the last components
-*         of all right singular vectors of the bidiagonal matrix.
-*
-*  VLW    (workspace) REAL array, dimension ( M )
-*         Workspace for VL.
-*
-*  ALPHA  (input) REAL
-*         Contains the diagonal element associated with the added row.
-*
-*  BETA   (input) REAL
-*         Contains the off-diagonal element associated with the added
-*         row.
-*
-*  DSIGMA (output) REAL array, dimension ( N )
-*         Contains a copy of the diagonal elements (K-1 singular values
-*         and one zero) in the secular equation.
-*
-*  IDX    (workspace) INTEGER array, dimension ( N )
-*         This will contain the permutation used to sort the contents of
-*         D into ascending order.
-*
-*  IDXP   (workspace) INTEGER array, dimension ( N )
-*         This will contain the permutation used to place deflated
-*         values of D at the end of the array. On output IDXP(2:K)
-*         points to the nondeflated D-values and IDXP(K+1:N)
-*         points to the deflated singular values.
-*
-*  IDXQ   (input) INTEGER array, dimension ( N )
-*         This contains the permutation which separately sorts the two
-*         sub-problems in D into ascending order.  Note that entries in
-*         the first half of this permutation must first be moved one
-*         position backward; and entries in the second half
-*         must first have NL+1 added to their values.
-*
-*  PERM   (output) INTEGER array, dimension ( N )
-*         The permutations (from deflation and sorting) to be applied
-*         to each singular block. Not referenced if ICOMPQ = 0.
-*
-*  GIVPTR (output) INTEGER
-*         The number of Givens rotations which took place in this
-*         subproblem. Not referenced if ICOMPQ = 0.
-*
-*  GIVCOL (output) INTEGER array, dimension ( LDGCOL, 2 )
-*         Each pair of numbers indicates a pair of columns to take place
-*         in a Givens rotation. Not referenced if ICOMPQ = 0.
-*
-*  LDGCOL (input) INTEGER
-*         The leading dimension of GIVCOL, must be at least N.
-*
-*  GIVNUM (output) REAL array, dimension ( LDGNUM, 2 )
-*         Each number indicates the C or S value to be used in the
-*         corresponding Givens rotation. Not referenced if ICOMPQ = 0.
-*
-*  LDGNUM (input) INTEGER
-*         The leading dimension of GIVNUM, must be at least N.
-*
-*  C      (output) REAL
-*         C contains garbage if SQRE =0 and the C-value of a Givens
-*         rotation related to the right null space if SQRE = 1.
-*
-*  S      (output) REAL
-*         S contains garbage if SQRE =0 and the S-value of a Givens
-*         rotation related to the right null space if SQRE = 1.
-*
-*  INFO   (output) INTEGER
-*         = 0:  successful exit.
-*         < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE, TWO, EIGHT
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0, TWO = 2.0E+0,
-     $                   EIGHT = 8.0E+0 )
-*     ..
-*     .. Local Scalars ..
-*
-      INTEGER            I, IDXI, IDXJ, IDXJP, J, JP, JPREV, K2, M, N,
-     $                   NLP1, NLP2
-      REAL               EPS, HLFTOL, TAU, TOL, Z1
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SLAMRG, SROT, XERBLA
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH, SLAPY2
-      EXTERNAL           SLAMCH, SLAPY2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      N = NL + NR + 1
-      M = N + SQRE
-*
-      IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN
-         INFO = -1
-      ELSE IF( NL.LT.1 ) THEN
-         INFO = -2
-      ELSE IF( NR.LT.1 ) THEN
-         INFO = -3
-      ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN
-         INFO = -4
-      ELSE IF( LDGCOL.LT.N ) THEN
-         INFO = -22
-      ELSE IF( LDGNUM.LT.N ) THEN
-         INFO = -24
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLASD7', -INFO )
-         RETURN
-      END IF
-*
-      NLP1 = NL + 1
-      NLP2 = NL + 2
-      IF( ICOMPQ.EQ.1 ) THEN
-         GIVPTR = 0
-      END IF
-*
-*     Generate the first part of the vector Z and move the singular
-*     values in the first part of D one position backward.
-*
-      Z1 = ALPHA*VL( NLP1 )
-      VL( NLP1 ) = ZERO
-      TAU = VF( NLP1 )
-      DO 10 I = NL, 1, -1
-         Z( I+1 ) = ALPHA*VL( I )
-         VL( I ) = ZERO
-         VF( I+1 ) = VF( I )
-         D( I+1 ) = D( I )
-         IDXQ( I+1 ) = IDXQ( I ) + 1
-   10 CONTINUE
-      VF( 1 ) = TAU
-*
-*     Generate the second part of the vector Z.
-*
-      DO 20 I = NLP2, M
-         Z( I ) = BETA*VF( I )
-         VF( I ) = ZERO
-   20 CONTINUE
-*
-*     Sort the singular values into increasing order
-*
-      DO 30 I = NLP2, N
-         IDXQ( I ) = IDXQ( I ) + NLP1
-   30 CONTINUE
-*
-*     DSIGMA, IDXC, IDXC, and ZW are used as storage space.
-*
-      DO 40 I = 2, N
-         DSIGMA( I ) = D( IDXQ( I ) )
-         ZW( I ) = Z( IDXQ( I ) )
-         VFW( I ) = VF( IDXQ( I ) )
-         VLW( I ) = VL( IDXQ( I ) )
-   40 CONTINUE
-*
-      CALL SLAMRG( NL, NR, DSIGMA( 2 ), 1, 1, IDX( 2 ) )
-*
-      DO 50 I = 2, N
-         IDXI = 1 + IDX( I )
-         D( I ) = DSIGMA( IDXI )
-         Z( I ) = ZW( IDXI )
-         VF( I ) = VFW( IDXI )
-         VL( I ) = VLW( IDXI )
-   50 CONTINUE
-*
-*     Calculate the allowable deflation tolerence
-*
-      EPS = SLAMCH( 'Epsilon' )
-      TOL = MAX( ABS( ALPHA ), ABS( BETA ) )
-      TOL = EIGHT*EIGHT*EPS*MAX( ABS( D( N ) ), TOL )
-*
-*     There are 2 kinds of deflation -- first a value in the z-vector
-*     is small, second two (or more) singular values are very close
-*     together (their difference is small).
-*
-*     If the value in the z-vector is small, we simply permute the
-*     array so that the corresponding singular value is moved to the
-*     end.
-*
-*     If two values in the D-vector are close, we perform a two-sided
-*     rotation designed to make one of the corresponding z-vector
-*     entries zero, and then permute the array so that the deflated
-*     singular value is moved to the end.
-*
-*     If there are multiple singular values then the problem deflates.
-*     Here the number of equal singular values are found.  As each equal
-*     singular value is found, an elementary reflector is computed to
-*     rotate the corresponding singular subspace so that the
-*     corresponding components of Z are zero in this new basis.
-*
-      K = 1
-      K2 = N + 1
-      DO 60 J = 2, N
-         IF( ABS( Z( J ) ).LE.TOL ) THEN
-*
-*           Deflate due to small z component.
-*
-            K2 = K2 - 1
-            IDXP( K2 ) = J
-            IF( J.EQ.N )
-     $         GO TO 100
-         ELSE
-            JPREV = J
-            GO TO 70
-         END IF
-   60 CONTINUE
-   70 CONTINUE
-      J = JPREV
-   80 CONTINUE
-      J = J + 1
-      IF( J.GT.N )
-     $   GO TO 90
-      IF( ABS( Z( J ) ).LE.TOL ) THEN
-*
-*        Deflate due to small z component.
-*
-         K2 = K2 - 1
-         IDXP( K2 ) = J
-      ELSE
-*
-*        Check if singular values are close enough to allow deflation.
-*
-         IF( ABS( D( J )-D( JPREV ) ).LE.TOL ) THEN
-*
-*           Deflation is possible.
-*
-            S = Z( JPREV )
-            C = Z( J )
-*
-*           Find sqrt(a**2+b**2) without overflow or
-*           destructive underflow.
-*
-            TAU = SLAPY2( C, S )
-            Z( J ) = TAU
-            Z( JPREV ) = ZERO
-            C = C / TAU
-            S = -S / TAU
-*
-*           Record the appropriate Givens rotation
-*
-            IF( ICOMPQ.EQ.1 ) THEN
-               GIVPTR = GIVPTR + 1
-               IDXJP = IDXQ( IDX( JPREV )+1 )
-               IDXJ = IDXQ( IDX( J )+1 )
-               IF( IDXJP.LE.NLP1 ) THEN
-                  IDXJP = IDXJP - 1
-               END IF
-               IF( IDXJ.LE.NLP1 ) THEN
-                  IDXJ = IDXJ - 1
-               END IF
-               GIVCOL( GIVPTR, 2 ) = IDXJP
-               GIVCOL( GIVPTR, 1 ) = IDXJ
-               GIVNUM( GIVPTR, 2 ) = C
-               GIVNUM( GIVPTR, 1 ) = S
-            END IF
-            CALL SROT( 1, VF( JPREV ), 1, VF( J ), 1, C, S )
-            CALL SROT( 1, VL( JPREV ), 1, VL( J ), 1, C, S )
-            K2 = K2 - 1
-            IDXP( K2 ) = JPREV
-            JPREV = J
-         ELSE
-            K = K + 1
-            ZW( K ) = Z( JPREV )
-            DSIGMA( K ) = D( JPREV )
-            IDXP( K ) = JPREV
-            JPREV = J
-         END IF
-      END IF
-      GO TO 80
-   90 CONTINUE
-*
-*     Record the last singular value.
-*
-      K = K + 1
-      ZW( K ) = Z( JPREV )
-      DSIGMA( K ) = D( JPREV )
-      IDXP( K ) = JPREV
-*
-  100 CONTINUE
-*
-*     Sort the singular values into DSIGMA. The singular values which
-*     were not deflated go into the first K slots of DSIGMA, except
-*     that DSIGMA(1) is treated separately.
-*
-      DO 110 J = 2, N
-         JP = IDXP( J )
-         DSIGMA( J ) = D( JP )
-         VFW( J ) = VF( JP )
-         VLW( J ) = VL( JP )
-  110 CONTINUE
-      IF( ICOMPQ.EQ.1 ) THEN
-         DO 120 J = 2, N
-            JP = IDXP( J )
-            PERM( J ) = IDXQ( IDX( JP )+1 )
-            IF( PERM( J ).LE.NLP1 ) THEN
-               PERM( J ) = PERM( J ) - 1
-            END IF
-  120    CONTINUE
-      END IF
-*
-*     The deflated singular values go back into the last N - K slots of
-*     D.
-*
-      CALL SCOPY( N-K, DSIGMA( K+1 ), 1, D( K+1 ), 1 )
-*
-*     Determine DSIGMA(1), DSIGMA(2), Z(1), VF(1), VL(1), VF(M), and
-*     VL(M).
-*
-      DSIGMA( 1 ) = ZERO
-      HLFTOL = TOL / TWO
-      IF( ABS( DSIGMA( 2 ) ).LE.HLFTOL )
-     $   DSIGMA( 2 ) = HLFTOL
-      IF( M.GT.N ) THEN
-         Z( 1 ) = SLAPY2( Z1, Z( M ) )
-         IF( Z( 1 ).LE.TOL ) THEN
-            C = ONE
-            S = ZERO
-            Z( 1 ) = TOL
-         ELSE
-            C = Z1 / Z( 1 )
-            S = -Z( M ) / Z( 1 )
-         END IF
-         CALL SROT( 1, VF( M ), 1, VF( 1 ), 1, C, S )
-         CALL SROT( 1, VL( M ), 1, VL( 1 ), 1, C, S )
-      ELSE
-         IF( ABS( Z1 ).LE.TOL ) THEN
-            Z( 1 ) = TOL
-         ELSE
-            Z( 1 ) = Z1
-         END IF
-      END IF
-*
-*     Restore Z, VF, and VL.
-*
-      CALL SCOPY( K-1, ZW( 2 ), 1, Z( 2 ), 1 )
-      CALL SCOPY( N-1, VFW( 2 ), 1, VF( 2 ), 1 )
-      CALL SCOPY( N-1, VLW( 2 ), 1, VL( 2 ), 1 )
-*
-      RETURN
-*
-*     End of SLASD7
-*
-      END
--- a/libcruft/lapack/slasd8.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,253 +0,0 @@
-      SUBROUTINE SLASD8( ICOMPQ, K, D, Z, VF, VL, DIFL, DIFR, LDDIFR,
-     $                   DSIGMA, WORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            ICOMPQ, INFO, K, LDDIFR
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * ), DIFL( * ), DIFR( LDDIFR, * ),
-     $                   DSIGMA( * ), VF( * ), VL( * ), WORK( * ),
-     $                   Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASD8 finds the square roots of the roots of the secular equation,
-*  as defined by the values in DSIGMA and Z. It makes the appropriate
-*  calls to SLASD4, and stores, for each  element in D, the distance
-*  to its two nearest poles (elements in DSIGMA). It also updates
-*  the arrays VF and VL, the first and last components of all the
-*  right singular vectors of the original bidiagonal matrix.
-*
-*  SLASD8 is called from SLASD6.
-*
-*  Arguments
-*  =========
-*
-*  ICOMPQ  (input) INTEGER
-*          Specifies whether singular vectors are to be computed in
-*          factored form in the calling routine:
-*          = 0: Compute singular values only.
-*          = 1: Compute singular vectors in factored form as well.
-*
-*  K       (input) INTEGER
-*          The number of terms in the rational function to be solved
-*          by SLASD4.  K >= 1.
-*
-*  D       (output) REAL array, dimension ( K )
-*          On output, D contains the updated singular values.
-*
-*  Z       (input) REAL array, dimension ( K )
-*          The first K elements of this array contain the components
-*          of the deflation-adjusted updating row vector.
-*
-*  VF      (input/output) REAL array, dimension ( K )
-*          On entry, VF contains  information passed through DBEDE8.
-*          On exit, VF contains the first K components of the first
-*          components of all right singular vectors of the bidiagonal
-*          matrix.
-*
-*  VL      (input/output) REAL array, dimension ( K )
-*          On entry, VL contains  information passed through DBEDE8.
-*          On exit, VL contains the first K components of the last
-*          components of all right singular vectors of the bidiagonal
-*          matrix.
-*
-*  DIFL    (output) REAL array, dimension ( K )
-*          On exit, DIFL(I) = D(I) - DSIGMA(I).
-*
-*  DIFR    (output) REAL array,
-*                   dimension ( LDDIFR, 2 ) if ICOMPQ = 1 and
-*                   dimension ( K ) if ICOMPQ = 0.
-*          On exit, DIFR(I,1) = D(I) - DSIGMA(I+1), DIFR(K,1) is not
-*          defined and will not be referenced.
-*
-*          If ICOMPQ = 1, DIFR(1:K,2) is an array containing the
-*          normalizing factors for the right singular vector matrix.
-*
-*  LDDIFR  (input) INTEGER
-*          The leading dimension of DIFR, must be at least K.
-*
-*  DSIGMA  (input) REAL array, dimension ( K )
-*          The first K elements of this array contain the old roots
-*          of the deflated updating problem.  These are the poles
-*          of the secular equation.
-*
-*  WORK    (workspace) REAL array, dimension at least 3 * K
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if INFO = 1, an singular value did not converge
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, IWK1, IWK2, IWK2I, IWK3, IWK3I, J
-      REAL               DIFLJ, DIFRJ, DJ, DSIGJ, DSIGJP, RHO, TEMP
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SLASCL, SLASD4, SLASET, XERBLA
-*     ..
-*     .. External Functions ..
-      REAL               SDOT, SLAMC3, SNRM2
-      EXTERNAL           SDOT, SLAMC3, SNRM2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN
-         INFO = -1
-      ELSE IF( K.LT.1 ) THEN
-         INFO = -2
-      ELSE IF( LDDIFR.LT.K ) THEN
-         INFO = -9
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLASD8', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( K.EQ.1 ) THEN
-         D( 1 ) = ABS( Z( 1 ) )
-         DIFL( 1 ) = D( 1 )
-         IF( ICOMPQ.EQ.1 ) THEN
-            DIFL( 2 ) = ONE
-            DIFR( 1, 2 ) = ONE
-         END IF
-         RETURN
-      END IF
-*
-*     Modify values DSIGMA(i) to make sure all DSIGMA(i)-DSIGMA(j) can
-*     be computed with high relative accuracy (barring over/underflow).
-*     This is a problem on machines without a guard digit in
-*     add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2).
-*     The following code replaces DSIGMA(I) by 2*DSIGMA(I)-DSIGMA(I),
-*     which on any of these machines zeros out the bottommost
-*     bit of DSIGMA(I) if it is 1; this makes the subsequent
-*     subtractions DSIGMA(I)-DSIGMA(J) unproblematic when cancellation
-*     occurs. On binary machines with a guard digit (almost all
-*     machines) it does not change DSIGMA(I) at all. On hexadecimal
-*     and decimal machines with a guard digit, it slightly
-*     changes the bottommost bits of DSIGMA(I). It does not account
-*     for hexadecimal or decimal machines without guard digits
-*     (we know of none). We use a subroutine call to compute
-*     2*DSIGMA(I) to prevent optimizing compilers from eliminating
-*     this code.
-*
-      DO 10 I = 1, K
-         DSIGMA( I ) = SLAMC3( DSIGMA( I ), DSIGMA( I ) ) - DSIGMA( I )
-   10 CONTINUE
-*
-*     Book keeping.
-*
-      IWK1 = 1
-      IWK2 = IWK1 + K
-      IWK3 = IWK2 + K
-      IWK2I = IWK2 - 1
-      IWK3I = IWK3 - 1
-*
-*     Normalize Z.
-*
-      RHO = SNRM2( K, Z, 1 )
-      CALL SLASCL( 'G', 0, 0, RHO, ONE, K, 1, Z, K, INFO )
-      RHO = RHO*RHO
-*
-*     Initialize WORK(IWK3).
-*
-      CALL SLASET( 'A', K, 1, ONE, ONE, WORK( IWK3 ), K )
-*
-*     Compute the updated singular values, the arrays DIFL, DIFR,
-*     and the updated Z.
-*
-      DO 40 J = 1, K
-         CALL SLASD4( K, J, DSIGMA, Z, WORK( IWK1 ), RHO, D( J ),
-     $                WORK( IWK2 ), INFO )
-*
-*        If the root finder fails, the computation is terminated.
-*
-         IF( INFO.NE.0 ) THEN
-            RETURN
-         END IF
-         WORK( IWK3I+J ) = WORK( IWK3I+J )*WORK( J )*WORK( IWK2I+J )
-         DIFL( J ) = -WORK( J )
-         DIFR( J, 1 ) = -WORK( J+1 )
-         DO 20 I = 1, J - 1
-            WORK( IWK3I+I ) = WORK( IWK3I+I )*WORK( I )*
-     $                        WORK( IWK2I+I ) / ( DSIGMA( I )-
-     $                        DSIGMA( J ) ) / ( DSIGMA( I )+
-     $                        DSIGMA( J ) )
-   20    CONTINUE
-         DO 30 I = J + 1, K
-            WORK( IWK3I+I ) = WORK( IWK3I+I )*WORK( I )*
-     $                        WORK( IWK2I+I ) / ( DSIGMA( I )-
-     $                        DSIGMA( J ) ) / ( DSIGMA( I )+
-     $                        DSIGMA( J ) )
-   30    CONTINUE
-   40 CONTINUE
-*
-*     Compute updated Z.
-*
-      DO 50 I = 1, K
-         Z( I ) = SIGN( SQRT( ABS( WORK( IWK3I+I ) ) ), Z( I ) )
-   50 CONTINUE
-*
-*     Update VF and VL.
-*
-      DO 80 J = 1, K
-         DIFLJ = DIFL( J )
-         DJ = D( J )
-         DSIGJ = -DSIGMA( J )
-         IF( J.LT.K ) THEN
-            DIFRJ = -DIFR( J, 1 )
-            DSIGJP = -DSIGMA( J+1 )
-         END IF
-         WORK( J ) = -Z( J ) / DIFLJ / ( DSIGMA( J )+DJ )
-         DO 60 I = 1, J - 1
-            WORK( I ) = Z( I ) / ( SLAMC3( DSIGMA( I ), DSIGJ )-DIFLJ )
-     $                   / ( DSIGMA( I )+DJ )
-   60    CONTINUE
-         DO 70 I = J + 1, K
-            WORK( I ) = Z( I ) / ( SLAMC3( DSIGMA( I ), DSIGJP )+DIFRJ )
-     $                   / ( DSIGMA( I )+DJ )
-   70    CONTINUE
-         TEMP = SNRM2( K, WORK, 1 )
-         WORK( IWK2I+J ) = SDOT( K, WORK, 1, VF, 1 ) / TEMP
-         WORK( IWK3I+J ) = SDOT( K, WORK, 1, VL, 1 ) / TEMP
-         IF( ICOMPQ.EQ.1 ) THEN
-            DIFR( J, 2 ) = TEMP
-         END IF
-   80 CONTINUE
-*
-      CALL SCOPY( K, WORK( IWK2 ), 1, VF, 1 )
-      CALL SCOPY( K, WORK( IWK3 ), 1, VL, 1 )
-*
-      RETURN
-*
-*     End of SLASD8
-*
-      END
--- a/libcruft/lapack/slasda.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,389 +0,0 @@
-      SUBROUTINE SLASDA( ICOMPQ, SMLSIZ, N, SQRE, D, E, U, LDU, VT, K,
-     $                   DIFL, DIFR, Z, POLES, GIVPTR, GIVCOL, LDGCOL,
-     $                   PERM, GIVNUM, C, S, WORK, IWORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            ICOMPQ, INFO, LDGCOL, LDU, N, SMLSIZ, SQRE
-*     ..
-*     .. Array Arguments ..
-      INTEGER            GIVCOL( LDGCOL, * ), GIVPTR( * ), IWORK( * ),
-     $                   K( * ), PERM( LDGCOL, * )
-      REAL               C( * ), D( * ), DIFL( LDU, * ), DIFR( LDU, * ),
-     $                   E( * ), GIVNUM( LDU, * ), POLES( LDU, * ),
-     $                   S( * ), U( LDU, * ), VT( LDU, * ), WORK( * ),
-     $                   Z( LDU, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  Using a divide and conquer approach, SLASDA computes the singular
-*  value decomposition (SVD) of a real upper bidiagonal N-by-M matrix
-*  B with diagonal D and offdiagonal E, where M = N + SQRE. The
-*  algorithm computes the singular values in the SVD B = U * S * VT.
-*  The orthogonal matrices U and VT are optionally computed in
-*  compact form.
-*
-*  A related subroutine, SLASD0, computes the singular values and
-*  the singular vectors in explicit form.
-*
-*  Arguments
-*  =========
-*
-*  ICOMPQ (input) INTEGER
-*         Specifies whether singular vectors are to be computed
-*         in compact form, as follows
-*         = 0: Compute singular values only.
-*         = 1: Compute singular vectors of upper bidiagonal
-*              matrix in compact form.
-*
-*  SMLSIZ (input) INTEGER
-*         The maximum size of the subproblems at the bottom of the
-*         computation tree.
-*
-*  N      (input) INTEGER
-*         The row dimension of the upper bidiagonal matrix. This is
-*         also the dimension of the main diagonal array D.
-*
-*  SQRE   (input) INTEGER
-*         Specifies the column dimension of the bidiagonal matrix.
-*         = 0: The bidiagonal matrix has column dimension M = N;
-*         = 1: The bidiagonal matrix has column dimension M = N + 1.
-*
-*  D      (input/output) REAL array, dimension ( N )
-*         On entry D contains the main diagonal of the bidiagonal
-*         matrix. On exit D, if INFO = 0, contains its singular values.
-*
-*  E      (input) REAL array, dimension ( M-1 )
-*         Contains the subdiagonal entries of the bidiagonal matrix.
-*         On exit, E has been destroyed.
-*
-*  U      (output) REAL array,
-*         dimension ( LDU, SMLSIZ ) if ICOMPQ = 1, and not referenced
-*         if ICOMPQ = 0. If ICOMPQ = 1, on exit, U contains the left
-*         singular vector matrices of all subproblems at the bottom
-*         level.
-*
-*  LDU    (input) INTEGER, LDU = > N.
-*         The leading dimension of arrays U, VT, DIFL, DIFR, POLES,
-*         GIVNUM, and Z.
-*
-*  VT     (output) REAL array,
-*         dimension ( LDU, SMLSIZ+1 ) if ICOMPQ = 1, and not referenced
-*         if ICOMPQ = 0. If ICOMPQ = 1, on exit, VT' contains the right
-*         singular vector matrices of all subproblems at the bottom
-*         level.
-*
-*  K      (output) INTEGER array, dimension ( N ) 
-*         if ICOMPQ = 1 and dimension 1 if ICOMPQ = 0.
-*         If ICOMPQ = 1, on exit, K(I) is the dimension of the I-th
-*         secular equation on the computation tree.
-*
-*  DIFL   (output) REAL array, dimension ( LDU, NLVL ),
-*         where NLVL = floor(log_2 (N/SMLSIZ))).
-*
-*  DIFR   (output) REAL array,
-*                  dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1 and
-*                  dimension ( N ) if ICOMPQ = 0.
-*         If ICOMPQ = 1, on exit, DIFL(1:N, I) and DIFR(1:N, 2 * I - 1)
-*         record distances between singular values on the I-th
-*         level and singular values on the (I -1)-th level, and
-*         DIFR(1:N, 2 * I ) contains the normalizing factors for
-*         the right singular vector matrix. See SLASD8 for details.
-*
-*  Z      (output) REAL array,
-*                  dimension ( LDU, NLVL ) if ICOMPQ = 1 and
-*                  dimension ( N ) if ICOMPQ = 0.
-*         The first K elements of Z(1, I) contain the components of
-*         the deflation-adjusted updating row vector for subproblems
-*         on the I-th level.
-*
-*  POLES  (output) REAL array,
-*         dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1, and not referenced
-*         if ICOMPQ = 0. If ICOMPQ = 1, on exit, POLES(1, 2*I - 1) and
-*         POLES(1, 2*I) contain  the new and old singular values
-*         involved in the secular equations on the I-th level.
-*
-*  GIVPTR (output) INTEGER array,
-*         dimension ( N ) if ICOMPQ = 1, and not referenced if
-*         ICOMPQ = 0. If ICOMPQ = 1, on exit, GIVPTR( I ) records
-*         the number of Givens rotations performed on the I-th
-*         problem on the computation tree.
-*
-*  GIVCOL (output) INTEGER array,
-*         dimension ( LDGCOL, 2 * NLVL ) if ICOMPQ = 1, and not
-*         referenced if ICOMPQ = 0. If ICOMPQ = 1, on exit, for each I,
-*         GIVCOL(1, 2 *I - 1) and GIVCOL(1, 2 *I) record the locations
-*         of Givens rotations performed on the I-th level on the
-*         computation tree.
-*
-*  LDGCOL (input) INTEGER, LDGCOL = > N.
-*         The leading dimension of arrays GIVCOL and PERM.
-*
-*  PERM   (output) INTEGER array, dimension ( LDGCOL, NLVL ) 
-*         if ICOMPQ = 1, and not referenced
-*         if ICOMPQ = 0. If ICOMPQ = 1, on exit, PERM(1, I) records
-*         permutations done on the I-th level of the computation tree.
-*
-*  GIVNUM (output) REAL array,
-*         dimension ( LDU,  2 * NLVL ) if ICOMPQ = 1, and not
-*         referenced if ICOMPQ = 0. If ICOMPQ = 1, on exit, for each I,
-*         GIVNUM(1, 2 *I - 1) and GIVNUM(1, 2 *I) record the C- and S-
-*         values of Givens rotations performed on the I-th level on
-*         the computation tree.
-*
-*  C      (output) REAL array,
-*         dimension ( N ) if ICOMPQ = 1, and dimension 1 if ICOMPQ = 0.
-*         If ICOMPQ = 1 and the I-th subproblem is not square, on exit,
-*         C( I ) contains the C-value of a Givens rotation related to
-*         the right null space of the I-th subproblem.
-*
-*  S      (output) REAL array, dimension ( N ) if
-*         ICOMPQ = 1, and dimension 1 if ICOMPQ = 0. If ICOMPQ = 1
-*         and the I-th subproblem is not square, on exit, S( I )
-*         contains the S-value of a Givens rotation related to
-*         the right null space of the I-th subproblem.
-*
-*  WORK   (workspace) REAL array, dimension
-*         (6 * N + (SMLSIZ + 1)*(SMLSIZ + 1)).
-*
-*  IWORK  (workspace) INTEGER array, dimension (7*N).
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if INFO = 1, an singular value did not converge
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I1, IC, IDXQ, IDXQI, IM1, INODE, ITEMP, IWK,
-     $                   J, LF, LL, LVL, LVL2, M, NCC, ND, NDB1, NDIML,
-     $                   NDIMR, NL, NLF, NLP1, NLVL, NR, NRF, NRP1, NRU,
-     $                   NWORK1, NWORK2, SMLSZP, SQREI, VF, VFI, VL, VLI
-      REAL               ALPHA, BETA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SLASD6, SLASDQ, SLASDT, SLASET, XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN
-         INFO = -1
-      ELSE IF( SMLSIZ.LT.3 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN
-         INFO = -4
-      ELSE IF( LDU.LT.( N+SQRE ) ) THEN
-         INFO = -8
-      ELSE IF( LDGCOL.LT.N ) THEN
-         INFO = -17
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLASDA', -INFO )
-         RETURN
-      END IF
-*
-      M = N + SQRE
-*
-*     If the input matrix is too small, call SLASDQ to find the SVD.
-*
-      IF( N.LE.SMLSIZ ) THEN
-         IF( ICOMPQ.EQ.0 ) THEN
-            CALL SLASDQ( 'U', SQRE, N, 0, 0, 0, D, E, VT, LDU, U, LDU,
-     $                   U, LDU, WORK, INFO )
-         ELSE
-            CALL SLASDQ( 'U', SQRE, N, M, N, 0, D, E, VT, LDU, U, LDU,
-     $                   U, LDU, WORK, INFO )
-         END IF
-         RETURN
-      END IF
-*
-*     Book-keeping and  set up the computation tree.
-*
-      INODE = 1
-      NDIML = INODE + N
-      NDIMR = NDIML + N
-      IDXQ = NDIMR + N
-      IWK = IDXQ + N
-*
-      NCC = 0
-      NRU = 0
-*
-      SMLSZP = SMLSIZ + 1
-      VF = 1
-      VL = VF + M
-      NWORK1 = VL + M
-      NWORK2 = NWORK1 + SMLSZP*SMLSZP
-*
-      CALL SLASDT( N, NLVL, ND, IWORK( INODE ), IWORK( NDIML ),
-     $             IWORK( NDIMR ), SMLSIZ )
-*
-*     for the nodes on bottom level of the tree, solve
-*     their subproblems by SLASDQ.
-*
-      NDB1 = ( ND+1 ) / 2
-      DO 30 I = NDB1, ND
-*
-*        IC : center row of each node
-*        NL : number of rows of left  subproblem
-*        NR : number of rows of right subproblem
-*        NLF: starting row of the left   subproblem
-*        NRF: starting row of the right  subproblem
-*
-         I1 = I - 1
-         IC = IWORK( INODE+I1 )
-         NL = IWORK( NDIML+I1 )
-         NLP1 = NL + 1
-         NR = IWORK( NDIMR+I1 )
-         NLF = IC - NL
-         NRF = IC + 1
-         IDXQI = IDXQ + NLF - 2
-         VFI = VF + NLF - 1
-         VLI = VL + NLF - 1
-         SQREI = 1
-         IF( ICOMPQ.EQ.0 ) THEN
-            CALL SLASET( 'A', NLP1, NLP1, ZERO, ONE, WORK( NWORK1 ),
-     $                   SMLSZP )
-            CALL SLASDQ( 'U', SQREI, NL, NLP1, NRU, NCC, D( NLF ),
-     $                   E( NLF ), WORK( NWORK1 ), SMLSZP,
-     $                   WORK( NWORK2 ), NL, WORK( NWORK2 ), NL,
-     $                   WORK( NWORK2 ), INFO )
-            ITEMP = NWORK1 + NL*SMLSZP
-            CALL SCOPY( NLP1, WORK( NWORK1 ), 1, WORK( VFI ), 1 )
-            CALL SCOPY( NLP1, WORK( ITEMP ), 1, WORK( VLI ), 1 )
-         ELSE
-            CALL SLASET( 'A', NL, NL, ZERO, ONE, U( NLF, 1 ), LDU )
-            CALL SLASET( 'A', NLP1, NLP1, ZERO, ONE, VT( NLF, 1 ), LDU )
-            CALL SLASDQ( 'U', SQREI, NL, NLP1, NL, NCC, D( NLF ),
-     $                   E( NLF ), VT( NLF, 1 ), LDU, U( NLF, 1 ), LDU,
-     $                   U( NLF, 1 ), LDU, WORK( NWORK1 ), INFO )
-            CALL SCOPY( NLP1, VT( NLF, 1 ), 1, WORK( VFI ), 1 )
-            CALL SCOPY( NLP1, VT( NLF, NLP1 ), 1, WORK( VLI ), 1 )
-         END IF
-         IF( INFO.NE.0 ) THEN
-            RETURN
-         END IF
-         DO 10 J = 1, NL
-            IWORK( IDXQI+J ) = J
-   10    CONTINUE
-         IF( ( I.EQ.ND ) .AND. ( SQRE.EQ.0 ) ) THEN
-            SQREI = 0
-         ELSE
-            SQREI = 1
-         END IF
-         IDXQI = IDXQI + NLP1
-         VFI = VFI + NLP1
-         VLI = VLI + NLP1
-         NRP1 = NR + SQREI
-         IF( ICOMPQ.EQ.0 ) THEN
-            CALL SLASET( 'A', NRP1, NRP1, ZERO, ONE, WORK( NWORK1 ),
-     $                   SMLSZP )
-            CALL SLASDQ( 'U', SQREI, NR, NRP1, NRU, NCC, D( NRF ),
-     $                   E( NRF ), WORK( NWORK1 ), SMLSZP,
-     $                   WORK( NWORK2 ), NR, WORK( NWORK2 ), NR,
-     $                   WORK( NWORK2 ), INFO )
-            ITEMP = NWORK1 + ( NRP1-1 )*SMLSZP
-            CALL SCOPY( NRP1, WORK( NWORK1 ), 1, WORK( VFI ), 1 )
-            CALL SCOPY( NRP1, WORK( ITEMP ), 1, WORK( VLI ), 1 )
-         ELSE
-            CALL SLASET( 'A', NR, NR, ZERO, ONE, U( NRF, 1 ), LDU )
-            CALL SLASET( 'A', NRP1, NRP1, ZERO, ONE, VT( NRF, 1 ), LDU )
-            CALL SLASDQ( 'U', SQREI, NR, NRP1, NR, NCC, D( NRF ),
-     $                   E( NRF ), VT( NRF, 1 ), LDU, U( NRF, 1 ), LDU,
-     $                   U( NRF, 1 ), LDU, WORK( NWORK1 ), INFO )
-            CALL SCOPY( NRP1, VT( NRF, 1 ), 1, WORK( VFI ), 1 )
-            CALL SCOPY( NRP1, VT( NRF, NRP1 ), 1, WORK( VLI ), 1 )
-         END IF
-         IF( INFO.NE.0 ) THEN
-            RETURN
-         END IF
-         DO 20 J = 1, NR
-            IWORK( IDXQI+J ) = J
-   20    CONTINUE
-   30 CONTINUE
-*
-*     Now conquer each subproblem bottom-up.
-*
-      J = 2**NLVL
-      DO 50 LVL = NLVL, 1, -1
-         LVL2 = LVL*2 - 1
-*
-*        Find the first node LF and last node LL on
-*        the current level LVL.
-*
-         IF( LVL.EQ.1 ) THEN
-            LF = 1
-            LL = 1
-         ELSE
-            LF = 2**( LVL-1 )
-            LL = 2*LF - 1
-         END IF
-         DO 40 I = LF, LL
-            IM1 = I - 1
-            IC = IWORK( INODE+IM1 )
-            NL = IWORK( NDIML+IM1 )
-            NR = IWORK( NDIMR+IM1 )
-            NLF = IC - NL
-            NRF = IC + 1
-            IF( I.EQ.LL ) THEN
-               SQREI = SQRE
-            ELSE
-               SQREI = 1
-            END IF
-            VFI = VF + NLF - 1
-            VLI = VL + NLF - 1
-            IDXQI = IDXQ + NLF - 1
-            ALPHA = D( IC )
-            BETA = E( IC )
-            IF( ICOMPQ.EQ.0 ) THEN
-               CALL SLASD6( ICOMPQ, NL, NR, SQREI, D( NLF ),
-     $                      WORK( VFI ), WORK( VLI ), ALPHA, BETA,
-     $                      IWORK( IDXQI ), PERM, GIVPTR( 1 ), GIVCOL,
-     $                      LDGCOL, GIVNUM, LDU, POLES, DIFL, DIFR, Z,
-     $                      K( 1 ), C( 1 ), S( 1 ), WORK( NWORK1 ),
-     $                      IWORK( IWK ), INFO )
-            ELSE
-               J = J - 1
-               CALL SLASD6( ICOMPQ, NL, NR, SQREI, D( NLF ),
-     $                      WORK( VFI ), WORK( VLI ), ALPHA, BETA,
-     $                      IWORK( IDXQI ), PERM( NLF, LVL ),
-     $                      GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL,
-     $                      GIVNUM( NLF, LVL2 ), LDU,
-     $                      POLES( NLF, LVL2 ), DIFL( NLF, LVL ),
-     $                      DIFR( NLF, LVL2 ), Z( NLF, LVL ), K( J ),
-     $                      C( J ), S( J ), WORK( NWORK1 ),
-     $                      IWORK( IWK ), INFO )
-            END IF
-            IF( INFO.NE.0 ) THEN
-               RETURN
-            END IF
-   40    CONTINUE
-   50 CONTINUE
-*
-      RETURN
-*
-*     End of SLASDA
-*
-      END
--- a/libcruft/lapack/slasdq.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,316 +0,0 @@
-      SUBROUTINE SLASDQ( UPLO, SQRE, N, NCVT, NRU, NCC, D, E, VT, LDVT,
-     $                   U, LDU, C, LDC, WORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU, SQRE
-*     ..
-*     .. Array Arguments ..
-      REAL               C( LDC, * ), D( * ), E( * ), U( LDU, * ),
-     $                   VT( LDVT, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASDQ computes the singular value decomposition (SVD) of a real
-*  (upper or lower) bidiagonal matrix with diagonal D and offdiagonal
-*  E, accumulating the transformations if desired. Letting B denote
-*  the input bidiagonal matrix, the algorithm computes orthogonal
-*  matrices Q and P such that B = Q * S * P' (P' denotes the transpose
-*  of P). The singular values S are overwritten on D.
-*
-*  The input matrix U  is changed to U  * Q  if desired.
-*  The input matrix VT is changed to P' * VT if desired.
-*  The input matrix C  is changed to Q' * C  if desired.
-*
-*  See "Computing  Small Singular Values of Bidiagonal Matrices With
-*  Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan,
-*  LAPACK Working Note #3, for a detailed description of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  UPLO  (input) CHARACTER*1
-*        On entry, UPLO specifies whether the input bidiagonal matrix
-*        is upper or lower bidiagonal, and wether it is square are
-*        not.
-*           UPLO = 'U' or 'u'   B is upper bidiagonal.
-*           UPLO = 'L' or 'l'   B is lower bidiagonal.
-*
-*  SQRE  (input) INTEGER
-*        = 0: then the input matrix is N-by-N.
-*        = 1: then the input matrix is N-by-(N+1) if UPLU = 'U' and
-*             (N+1)-by-N if UPLU = 'L'.
-*
-*        The bidiagonal matrix has
-*        N = NL + NR + 1 rows and
-*        M = N + SQRE >= N columns.
-*
-*  N     (input) INTEGER
-*        On entry, N specifies the number of rows and columns
-*        in the matrix. N must be at least 0.
-*
-*  NCVT  (input) INTEGER
-*        On entry, NCVT specifies the number of columns of
-*        the matrix VT. NCVT must be at least 0.
-*
-*  NRU   (input) INTEGER
-*        On entry, NRU specifies the number of rows of
-*        the matrix U. NRU must be at least 0.
-*
-*  NCC   (input) INTEGER
-*        On entry, NCC specifies the number of columns of
-*        the matrix C. NCC must be at least 0.
-*
-*  D     (input/output) REAL array, dimension (N)
-*        On entry, D contains the diagonal entries of the
-*        bidiagonal matrix whose SVD is desired. On normal exit,
-*        D contains the singular values in ascending order.
-*
-*  E     (input/output) REAL array.
-*        dimension is (N-1) if SQRE = 0 and N if SQRE = 1.
-*        On entry, the entries of E contain the offdiagonal entries
-*        of the bidiagonal matrix whose SVD is desired. On normal
-*        exit, E will contain 0. If the algorithm does not converge,
-*        D and E will contain the diagonal and superdiagonal entries
-*        of a bidiagonal matrix orthogonally equivalent to the one
-*        given as input.
-*
-*  VT    (input/output) REAL array, dimension (LDVT, NCVT)
-*        On entry, contains a matrix which on exit has been
-*        premultiplied by P', dimension N-by-NCVT if SQRE = 0
-*        and (N+1)-by-NCVT if SQRE = 1 (not referenced if NCVT=0).
-*
-*  LDVT  (input) INTEGER
-*        On entry, LDVT specifies the leading dimension of VT as
-*        declared in the calling (sub) program. LDVT must be at
-*        least 1. If NCVT is nonzero LDVT must also be at least N.
-*
-*  U     (input/output) REAL array, dimension (LDU, N)
-*        On entry, contains a  matrix which on exit has been
-*        postmultiplied by Q, dimension NRU-by-N if SQRE = 0
-*        and NRU-by-(N+1) if SQRE = 1 (not referenced if NRU=0).
-*
-*  LDU   (input) INTEGER
-*        On entry, LDU  specifies the leading dimension of U as
-*        declared in the calling (sub) program. LDU must be at
-*        least max( 1, NRU ) .
-*
-*  C     (input/output) REAL array, dimension (LDC, NCC)
-*        On entry, contains an N-by-NCC matrix which on exit
-*        has been premultiplied by Q'  dimension N-by-NCC if SQRE = 0
-*        and (N+1)-by-NCC if SQRE = 1 (not referenced if NCC=0).
-*
-*  LDC   (input) INTEGER
-*        On entry, LDC  specifies the leading dimension of C as
-*        declared in the calling (sub) program. LDC must be at
-*        least 1. If NCC is nonzero, LDC must also be at least N.
-*
-*  WORK  (workspace) REAL array, dimension (4*N)
-*        Workspace. Only referenced if one of NCVT, NRU, or NCC is
-*        nonzero, and if N is at least 2.
-*
-*  INFO  (output) INTEGER
-*        On exit, a value of 0 indicates a successful exit.
-*        If INFO < 0, argument number -INFO is illegal.
-*        If INFO > 0, the algorithm did not converge, and INFO
-*        specifies how many superdiagonals did not converge.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ROTATE
-      INTEGER            I, ISUB, IUPLO, J, NP1, SQRE1
-      REAL               CS, R, SMIN, SN
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SBDSQR, SLARTG, SLASR, SSWAP, XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IUPLO = 0
-      IF( LSAME( UPLO, 'U' ) )
-     $   IUPLO = 1
-      IF( LSAME( UPLO, 'L' ) )
-     $   IUPLO = 2
-      IF( IUPLO.EQ.0 ) THEN
-         INFO = -1
-      ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( NCVT.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( NRU.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( NCC.LT.0 ) THEN
-         INFO = -6
-      ELSE IF( ( NCVT.EQ.0 .AND. LDVT.LT.1 ) .OR.
-     $         ( NCVT.GT.0 .AND. LDVT.LT.MAX( 1, N ) ) ) THEN
-         INFO = -10
-      ELSE IF( LDU.LT.MAX( 1, NRU ) ) THEN
-         INFO = -12
-      ELSE IF( ( NCC.EQ.0 .AND. LDC.LT.1 ) .OR.
-     $         ( NCC.GT.0 .AND. LDC.LT.MAX( 1, N ) ) ) THEN
-         INFO = -14
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLASDQ', -INFO )
-         RETURN
-      END IF
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     ROTATE is true if any singular vectors desired, false otherwise
-*
-      ROTATE = ( NCVT.GT.0 ) .OR. ( NRU.GT.0 ) .OR. ( NCC.GT.0 )
-      NP1 = N + 1
-      SQRE1 = SQRE
-*
-*     If matrix non-square upper bidiagonal, rotate to be lower
-*     bidiagonal.  The rotations are on the right.
-*
-      IF( ( IUPLO.EQ.1 ) .AND. ( SQRE1.EQ.1 ) ) THEN
-         DO 10 I = 1, N - 1
-            CALL SLARTG( D( I ), E( I ), CS, SN, R )
-            D( I ) = R
-            E( I ) = SN*D( I+1 )
-            D( I+1 ) = CS*D( I+1 )
-            IF( ROTATE ) THEN
-               WORK( I ) = CS
-               WORK( N+I ) = SN
-            END IF
-   10    CONTINUE
-         CALL SLARTG( D( N ), E( N ), CS, SN, R )
-         D( N ) = R
-         E( N ) = ZERO
-         IF( ROTATE ) THEN
-            WORK( N ) = CS
-            WORK( N+N ) = SN
-         END IF
-         IUPLO = 2
-         SQRE1 = 0
-*
-*        Update singular vectors if desired.
-*
-         IF( NCVT.GT.0 )
-     $      CALL SLASR( 'L', 'V', 'F', NP1, NCVT, WORK( 1 ),
-     $                  WORK( NP1 ), VT, LDVT )
-      END IF
-*
-*     If matrix lower bidiagonal, rotate to be upper bidiagonal
-*     by applying Givens rotations on the left.
-*
-      IF( IUPLO.EQ.2 ) THEN
-         DO 20 I = 1, N - 1
-            CALL SLARTG( D( I ), E( I ), CS, SN, R )
-            D( I ) = R
-            E( I ) = SN*D( I+1 )
-            D( I+1 ) = CS*D( I+1 )
-            IF( ROTATE ) THEN
-               WORK( I ) = CS
-               WORK( N+I ) = SN
-            END IF
-   20    CONTINUE
-*
-*        If matrix (N+1)-by-N lower bidiagonal, one additional
-*        rotation is needed.
-*
-         IF( SQRE1.EQ.1 ) THEN
-            CALL SLARTG( D( N ), E( N ), CS, SN, R )
-            D( N ) = R
-            IF( ROTATE ) THEN
-               WORK( N ) = CS
-               WORK( N+N ) = SN
-            END IF
-         END IF
-*
-*        Update singular vectors if desired.
-*
-         IF( NRU.GT.0 ) THEN
-            IF( SQRE1.EQ.0 ) THEN
-               CALL SLASR( 'R', 'V', 'F', NRU, N, WORK( 1 ),
-     $                     WORK( NP1 ), U, LDU )
-            ELSE
-               CALL SLASR( 'R', 'V', 'F', NRU, NP1, WORK( 1 ),
-     $                     WORK( NP1 ), U, LDU )
-            END IF
-         END IF
-         IF( NCC.GT.0 ) THEN
-            IF( SQRE1.EQ.0 ) THEN
-               CALL SLASR( 'L', 'V', 'F', N, NCC, WORK( 1 ),
-     $                     WORK( NP1 ), C, LDC )
-            ELSE
-               CALL SLASR( 'L', 'V', 'F', NP1, NCC, WORK( 1 ),
-     $                     WORK( NP1 ), C, LDC )
-            END IF
-         END IF
-      END IF
-*
-*     Call SBDSQR to compute the SVD of the reduced real
-*     N-by-N upper bidiagonal matrix.
-*
-      CALL SBDSQR( 'U', N, NCVT, NRU, NCC, D, E, VT, LDVT, U, LDU, C,
-     $             LDC, WORK, INFO )
-*
-*     Sort the singular values into ascending order (insertion sort on
-*     singular values, but only one transposition per singular vector)
-*
-      DO 40 I = 1, N
-*
-*        Scan for smallest D(I).
-*
-         ISUB = I
-         SMIN = D( I )
-         DO 30 J = I + 1, N
-            IF( D( J ).LT.SMIN ) THEN
-               ISUB = J
-               SMIN = D( J )
-            END IF
-   30    CONTINUE
-         IF( ISUB.NE.I ) THEN
-*
-*           Swap singular values and vectors.
-*
-            D( ISUB ) = D( I )
-            D( I ) = SMIN
-            IF( NCVT.GT.0 )
-     $         CALL SSWAP( NCVT, VT( ISUB, 1 ), LDVT, VT( I, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL SSWAP( NRU, U( 1, ISUB ), 1, U( 1, I ), 1 )
-            IF( NCC.GT.0 )
-     $         CALL SSWAP( NCC, C( ISUB, 1 ), LDC, C( I, 1 ), LDC )
-         END IF
-   40 CONTINUE
-*
-      RETURN
-*
-*     End of SLASDQ
-*
-      END
--- a/libcruft/lapack/slasdt.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-      SUBROUTINE SLASDT( N, LVL, ND, INODE, NDIML, NDIMR, MSUB )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            LVL, MSUB, N, ND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            INODE( * ), NDIML( * ), NDIMR( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASDT creates a tree of subproblems for bidiagonal divide and
-*  conquer.
-*
-*  Arguments
-*  =========
-*
-*   N      (input) INTEGER
-*          On entry, the number of diagonal elements of the
-*          bidiagonal matrix.
-*
-*   LVL    (output) INTEGER
-*          On exit, the number of levels on the computation tree.
-*
-*   ND     (output) INTEGER
-*          On exit, the number of nodes on the tree.
-*
-*   INODE  (output) INTEGER array, dimension ( N )
-*          On exit, centers of subproblems.
-*
-*   NDIML  (output) INTEGER array, dimension ( N )
-*          On exit, row dimensions of left children.
-*
-*   NDIMR  (output) INTEGER array, dimension ( N )
-*          On exit, row dimensions of right children.
-*
-*   MSUB   (input) INTEGER.
-*          On entry, the maximum row dimension each subproblem at the
-*          bottom of the tree can be of.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Huan Ren, Computer Science Division, University of
-*     California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               TWO
-      PARAMETER          ( TWO = 2.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, IL, IR, LLST, MAXN, NCRNT, NLVL
-      REAL               TEMP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          INT, LOG, MAX, REAL
-*     ..
-*     .. Executable Statements ..
-*
-*     Find the number of levels on the tree.
-*
-      MAXN = MAX( 1, N )
-      TEMP = LOG( REAL( MAXN ) / REAL( MSUB+1 ) ) / LOG( TWO )
-      LVL = INT( TEMP ) + 1
-*
-      I = N / 2
-      INODE( 1 ) = I + 1
-      NDIML( 1 ) = I
-      NDIMR( 1 ) = N - I - 1
-      IL = 0
-      IR = 1
-      LLST = 1
-      DO 20 NLVL = 1, LVL - 1
-*
-*        Constructing the tree at (NLVL+1)-st level. The number of
-*        nodes created on this level is LLST * 2.
-*
-         DO 10 I = 0, LLST - 1
-            IL = IL + 2
-            IR = IR + 2
-            NCRNT = LLST + I
-            NDIML( IL ) = NDIML( NCRNT ) / 2
-            NDIMR( IL ) = NDIML( NCRNT ) - NDIML( IL ) - 1
-            INODE( IL ) = INODE( NCRNT ) - NDIMR( IL ) - 1
-            NDIML( IR ) = NDIMR( NCRNT ) / 2
-            NDIMR( IR ) = NDIMR( NCRNT ) - NDIML( IR ) - 1
-            INODE( IR ) = INODE( NCRNT ) + NDIML( IR ) + 1
-   10    CONTINUE
-         LLST = LLST*2
-   20 CONTINUE
-      ND = LLST*2 - 1
-*
-      RETURN
-*
-*     End of SLASDT
-*
-      END
--- a/libcruft/lapack/slaset.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-      SUBROUTINE SLASET( UPLO, M, N, ALPHA, BETA, A, LDA )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            LDA, M, N
-      REAL               ALPHA, BETA
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASET initializes an m-by-n matrix A to BETA on the diagonal and
-*  ALPHA on the offdiagonals.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies the part of the matrix A to be set.
-*          = 'U':      Upper triangular part is set; the strictly lower
-*                      triangular part of A is not changed.
-*          = 'L':      Lower triangular part is set; the strictly upper
-*                      triangular part of A is not changed.
-*          Otherwise:  All of the matrix A is set.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  ALPHA   (input) REAL
-*          The constant to which the offdiagonal elements are to be set.
-*
-*  BETA    (input) REAL
-*          The constant to which the diagonal elements are to be set.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On exit, the leading m-by-n submatrix of A is set as follows:
-*
-*          if UPLO = 'U', A(i,j) = ALPHA, 1<=i<=j-1, 1<=j<=n,
-*          if UPLO = 'L', A(i,j) = ALPHA, j+1<=i<=m, 1<=j<=n,
-*          otherwise,     A(i,j) = ALPHA, 1<=i<=m, 1<=j<=n, i.ne.j,
-*
-*          and, for all UPLO, A(i,i) = BETA, 1<=i<=min(m,n).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-      IF( LSAME( UPLO, 'U' ) ) THEN
-*
-*        Set the strictly upper triangular or trapezoidal part of the
-*        array to ALPHA.
-*
-         DO 20 J = 2, N
-            DO 10 I = 1, MIN( J-1, M )
-               A( I, J ) = ALPHA
-   10       CONTINUE
-   20    CONTINUE
-*
-      ELSE IF( LSAME( UPLO, 'L' ) ) THEN
-*
-*        Set the strictly lower triangular or trapezoidal part of the
-*        array to ALPHA.
-*
-         DO 40 J = 1, MIN( M, N )
-            DO 30 I = J + 1, M
-               A( I, J ) = ALPHA
-   30       CONTINUE
-   40    CONTINUE
-*
-      ELSE
-*
-*        Set the leading m-by-n submatrix to ALPHA.
-*
-         DO 60 J = 1, N
-            DO 50 I = 1, M
-               A( I, J ) = ALPHA
-   50       CONTINUE
-   60    CONTINUE
-      END IF
-*
-*     Set the first min(M,N) diagonal elements to BETA.
-*
-      DO 70 I = 1, MIN( M, N )
-         A( I, I ) = BETA
-   70 CONTINUE
-*
-      RETURN
-*
-*     End of SLASET
-*
-      END
--- a/libcruft/lapack/slasq1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-      SUBROUTINE SLASQ1( N, D, E, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, N
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * ), E( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASQ1 computes the singular values of a real N-by-N bidiagonal
-*  matrix with diagonal D and off-diagonal E. The singular values
-*  are computed to high relative accuracy, in the absence of
-*  denormalization, underflow and overflow. The algorithm was first
-*  presented in
-*
-*  "Accurate singular values and differential qd algorithms" by K. V.
-*  Fernando and B. N. Parlett, Numer. Math., Vol-67, No. 2, pp. 191-230,
-*  1994,
-*
-*  and the present implementation is described in "An implementation of
-*  the dqds Algorithm (Positive Case)", LAPACK Working Note.
-*
-*  Arguments
-*  =========
-*
-*  N     (input) INTEGER
-*        The number of rows and columns in the matrix. N >= 0.
-*
-*  D     (input/output) REAL array, dimension (N)
-*        On entry, D contains the diagonal elements of the
-*        bidiagonal matrix whose SVD is desired. On normal exit,
-*        D contains the singular values in decreasing order.
-*
-*  E     (input/output) REAL array, dimension (N)
-*        On entry, elements E(1:N-1) contain the off-diagonal elements
-*        of the bidiagonal matrix whose SVD is desired.
-*        On exit, E is overwritten.
-*
-*  WORK  (workspace) REAL array, dimension (4*N)
-*
-*  INFO  (output) INTEGER
-*        = 0: successful exit
-*        < 0: if INFO = -i, the i-th argument had an illegal value
-*        > 0: the algorithm failed
-*             = 1, a split was marked by a positive value in E
-*             = 2, current block of Z not diagonalized after 30*N
-*                  iterations (in inner while loop)
-*             = 3, termination criterion of outer while loop not met 
-*                  (program created more than N unreduced blocks)
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, IINFO
-      REAL               EPS, SCALE, SAFMIN, SIGMN, SIGMX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SLAS2, SLASCL, SLASQ2, SLASRT, XERBLA
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      EXTERNAL           SLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -2
-         CALL XERBLA( 'SLASQ1', -INFO )
-         RETURN
-      ELSE IF( N.EQ.0 ) THEN
-         RETURN
-      ELSE IF( N.EQ.1 ) THEN
-         D( 1 ) = ABS( D( 1 ) )
-         RETURN
-      ELSE IF( N.EQ.2 ) THEN
-         CALL SLAS2( D( 1 ), E( 1 ), D( 2 ), SIGMN, SIGMX )
-         D( 1 ) = SIGMX
-         D( 2 ) = SIGMN
-         RETURN
-      END IF
-*
-*     Estimate the largest singular value.
-*
-      SIGMX = ZERO
-      DO 10 I = 1, N - 1
-         D( I ) = ABS( D( I ) )
-         SIGMX = MAX( SIGMX, ABS( E( I ) ) )
-   10 CONTINUE
-      D( N ) = ABS( D( N ) )
-*
-*     Early return if SIGMX is zero (matrix is already diagonal).
-*
-      IF( SIGMX.EQ.ZERO ) THEN
-         CALL SLASRT( 'D', N, D, IINFO )
-         RETURN
-      END IF
-*
-      DO 20 I = 1, N
-         SIGMX = MAX( SIGMX, D( I ) )
-   20 CONTINUE
-*
-*     Copy D and E into WORK (in the Z format) and scale (squaring the
-*     input data makes scaling by a power of the radix pointless).
-*
-      EPS = SLAMCH( 'Precision' )
-      SAFMIN = SLAMCH( 'Safe minimum' )
-      SCALE = SQRT( EPS / SAFMIN )
-      CALL SCOPY( N, D, 1, WORK( 1 ), 2 )
-      CALL SCOPY( N-1, E, 1, WORK( 2 ), 2 )
-      CALL SLASCL( 'G', 0, 0, SIGMX, SCALE, 2*N-1, 1, WORK, 2*N-1,
-     $             IINFO )
-*         
-*     Compute the q's and e's.
-*
-      DO 30 I = 1, 2*N - 1
-         WORK( I ) = WORK( I )**2
-   30 CONTINUE
-      WORK( 2*N ) = ZERO
-*
-      CALL SLASQ2( N, WORK, INFO )
-*
-      IF( INFO.EQ.0 ) THEN
-         DO 40 I = 1, N
-            D( I ) = SQRT( WORK( I ) )
-   40    CONTINUE
-         CALL SLASCL( 'G', 0, 0, SCALE, SIGMX, N, 1, D, N, IINFO )
-      END IF
-*
-      RETURN
-*
-*     End of SLASQ1
-*
-      END
--- a/libcruft/lapack/slasq2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,448 +0,0 @@
-      SUBROUTINE SLASQ2( N, Z, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call SLAZQ3 in place of SLASQ3, 13 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, N
-*     ..
-*     .. Array Arguments ..
-      REAL               Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASQ2 computes all the eigenvalues of the symmetric positive 
-*  definite tridiagonal matrix associated with the qd array Z to high
-*  relative accuracy are computed to high relative accuracy, in the
-*  absence of denormalization, underflow and overflow.
-*
-*  To see the relation of Z to the tridiagonal matrix, let L be a
-*  unit lower bidiagonal matrix with subdiagonals Z(2,4,6,,..) and
-*  let U be an upper bidiagonal matrix with 1's above and diagonal
-*  Z(1,3,5,,..). The tridiagonal is L*U or, if you prefer, the
-*  symmetric tridiagonal to which it is similar.
-*
-*  Note : SLASQ2 defines a logical variable, IEEE, which is true
-*  on machines which follow ieee-754 floating-point standard in their
-*  handling of infinities and NaNs, and false otherwise. This variable
-*  is passed to SLAZQ3.
-*
-*  Arguments
-*  =========
-*
-*  N     (input) INTEGER
-*        The number of rows and columns in the matrix. N >= 0.
-*
-*  Z     (workspace) REAL array, dimension (4*N)
-*        On entry Z holds the qd array. On exit, entries 1 to N hold
-*        the eigenvalues in decreasing order, Z( 2*N+1 ) holds the
-*        trace, and Z( 2*N+2 ) holds the sum of the eigenvalues. If
-*        N > 2, then Z( 2*N+3 ) holds the iteration count, Z( 2*N+4 )
-*        holds NDIVS/NIN^2, and Z( 2*N+5 ) holds the percentage of
-*        shifts that failed.
-*
-*  INFO  (output) INTEGER
-*        = 0: successful exit
-*        < 0: if the i-th argument is a scalar and had an illegal
-*             value, then INFO = -i, if the i-th argument is an
-*             array and the j-entry had an illegal value, then
-*             INFO = -(i*100+j)
-*        > 0: the algorithm failed
-*              = 1, a split was marked by a positive value in E
-*              = 2, current block of Z not diagonalized after 30*N
-*                   iterations (in inner while loop)
-*              = 3, termination criterion of outer while loop not met 
-*                   (program created more than N unreduced blocks)
-*
-*  Further Details
-*  ===============
-*  Local Variables: I0:N0 defines a current unreduced segment of Z.
-*  The shifts are accumulated in SIGMA. Iteration count is in ITER.
-*  Ping-pong is controlled by PP (alternates between 0 and 1).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               CBIAS
-      PARAMETER          ( CBIAS = 1.50E0 )
-      REAL               ZERO, HALF, ONE, TWO, FOUR, HUNDRD
-      PARAMETER          ( ZERO = 0.0E0, HALF = 0.5E0, ONE = 1.0E0,
-     $                     TWO = 2.0E0, FOUR = 4.0E0, HUNDRD = 100.0E0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            IEEE
-      INTEGER            I0, I4, IINFO, IPN4, ITER, IWHILA, IWHILB, K, 
-     $                   N0, NBIG, NDIV, NFAIL, PP, SPLT, TTYPE
-      REAL               D, DESIG, DMIN, DMIN1, DMIN2, DN, DN1, DN2, E,
-     $                   EMAX, EMIN, EPS, OLDEMN, QMAX, QMIN, S, SAFMIN,
-     $                   SIGMA, T, TAU, TEMP, TOL, TOL2, TRACE, ZMAX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLAZQ3, SLASRT, XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      REAL               SLAMCH
-      EXTERNAL           ILAENV, SLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, REAL, SQRT
-*     ..
-*     .. Executable Statements ..
-*      
-*     Test the input arguments.
-*     (in case SLASQ2 is not called by SLASQ1)
-*
-      INFO = 0
-      EPS = SLAMCH( 'Precision' )
-      SAFMIN = SLAMCH( 'Safe minimum' )
-      TOL = EPS*HUNDRD
-      TOL2 = TOL**2
-*
-      IF( N.LT.0 ) THEN
-         INFO = -1
-         CALL XERBLA( 'SLASQ2', 1 )
-         RETURN
-      ELSE IF( N.EQ.0 ) THEN
-         RETURN
-      ELSE IF( N.EQ.1 ) THEN
-*
-*        1-by-1 case.
-*
-         IF( Z( 1 ).LT.ZERO ) THEN
-            INFO = -201
-            CALL XERBLA( 'SLASQ2', 2 )
-         END IF
-         RETURN
-      ELSE IF( N.EQ.2 ) THEN
-*
-*        2-by-2 case.
-*
-         IF( Z( 2 ).LT.ZERO .OR. Z( 3 ).LT.ZERO ) THEN
-            INFO = -2
-            CALL XERBLA( 'SLASQ2', 2 )
-            RETURN
-         ELSE IF( Z( 3 ).GT.Z( 1 ) ) THEN
-            D = Z( 3 )
-            Z( 3 ) = Z( 1 )
-            Z( 1 ) = D
-         END IF
-         Z( 5 ) = Z( 1 ) + Z( 2 ) + Z( 3 )
-         IF( Z( 2 ).GT.Z( 3 )*TOL2 ) THEN
-            T = HALF*( ( Z( 1 )-Z( 3 ) )+Z( 2 ) ) 
-            S = Z( 3 )*( Z( 2 ) / T )
-            IF( S.LE.T ) THEN
-               S = Z( 3 )*( Z( 2 ) / ( T*( ONE+SQRT( ONE+S / T ) ) ) )
-            ELSE
-               S = Z( 3 )*( Z( 2 ) / ( T+SQRT( T )*SQRT( T+S ) ) )
-            END IF
-            T = Z( 1 ) + ( S+Z( 2 ) )
-            Z( 3 ) = Z( 3 )*( Z( 1 ) / T )
-            Z( 1 ) = T
-         END IF
-         Z( 2 ) = Z( 3 )
-         Z( 6 ) = Z( 2 ) + Z( 1 )
-         RETURN
-      END IF
-*
-*     Check for negative data and compute sums of q's and e's.
-*
-      Z( 2*N ) = ZERO
-      EMIN = Z( 2 )
-      QMAX = ZERO
-      ZMAX = ZERO
-      D = ZERO
-      E = ZERO
-*
-      DO 10 K = 1, 2*( N-1 ), 2
-         IF( Z( K ).LT.ZERO ) THEN
-            INFO = -( 200+K )
-            CALL XERBLA( 'SLASQ2', 2 )
-            RETURN
-         ELSE IF( Z( K+1 ).LT.ZERO ) THEN
-            INFO = -( 200+K+1 )
-            CALL XERBLA( 'SLASQ2', 2 )
-            RETURN
-         END IF
-         D = D + Z( K )
-         E = E + Z( K+1 )
-         QMAX = MAX( QMAX, Z( K ) )
-         EMIN = MIN( EMIN, Z( K+1 ) )
-         ZMAX = MAX( QMAX, ZMAX, Z( K+1 ) )
-   10 CONTINUE
-      IF( Z( 2*N-1 ).LT.ZERO ) THEN
-         INFO = -( 200+2*N-1 )
-         CALL XERBLA( 'SLASQ2', 2 )
-         RETURN
-      END IF
-      D = D + Z( 2*N-1 )
-      QMAX = MAX( QMAX, Z( 2*N-1 ) )
-      ZMAX = MAX( QMAX, ZMAX )
-*
-*     Check for diagonality.
-*
-      IF( E.EQ.ZERO ) THEN
-         DO 20 K = 2, N
-            Z( K ) = Z( 2*K-1 )
-   20    CONTINUE
-         CALL SLASRT( 'D', N, Z, IINFO )
-         Z( 2*N-1 ) = D
-         RETURN
-      END IF
-*
-      TRACE = D + E
-*
-*     Check for zero data.
-*
-      IF( TRACE.EQ.ZERO ) THEN
-         Z( 2*N-1 ) = ZERO
-         RETURN
-      END IF
-*         
-*     Check whether the machine is IEEE conformable.
-*         
-      IEEE = ILAENV( 10, 'SLASQ2', 'N', 1, 2, 3, 4 ).EQ.1 .AND.
-     $       ILAENV( 11, 'SLASQ2', 'N', 1, 2, 3, 4 ).EQ.1      
-*         
-*     Rearrange data for locality: Z=(q1,qq1,e1,ee1,q2,qq2,e2,ee2,...).
-*
-      DO 30 K = 2*N, 2, -2
-         Z( 2*K ) = ZERO 
-         Z( 2*K-1 ) = Z( K ) 
-         Z( 2*K-2 ) = ZERO 
-         Z( 2*K-3 ) = Z( K-1 ) 
-   30 CONTINUE
-*
-      I0 = 1
-      N0 = N
-*
-*     Reverse the qd-array, if warranted.
-*
-      IF( CBIAS*Z( 4*I0-3 ).LT.Z( 4*N0-3 ) ) THEN
-         IPN4 = 4*( I0+N0 )
-         DO 40 I4 = 4*I0, 2*( I0+N0-1 ), 4
-            TEMP = Z( I4-3 )
-            Z( I4-3 ) = Z( IPN4-I4-3 )
-            Z( IPN4-I4-3 ) = TEMP
-            TEMP = Z( I4-1 )
-            Z( I4-1 ) = Z( IPN4-I4-5 )
-            Z( IPN4-I4-5 ) = TEMP
-   40    CONTINUE
-      END IF
-*
-*     Initial split checking via dqd and Li's test.
-*
-      PP = 0
-*
-      DO 80 K = 1, 2
-*
-         D = Z( 4*N0+PP-3 )
-         DO 50 I4 = 4*( N0-1 ) + PP, 4*I0 + PP, -4
-            IF( Z( I4-1 ).LE.TOL2*D ) THEN
-               Z( I4-1 ) = -ZERO
-               D = Z( I4-3 )
-            ELSE
-               D = Z( I4-3 )*( D / ( D+Z( I4-1 ) ) )
-            END IF
-   50    CONTINUE
-*
-*        dqd maps Z to ZZ plus Li's test.
-*
-         EMIN = Z( 4*I0+PP+1 )
-         D = Z( 4*I0+PP-3 )
-         DO 60 I4 = 4*I0 + PP, 4*( N0-1 ) + PP, 4
-            Z( I4-2*PP-2 ) = D + Z( I4-1 )
-            IF( Z( I4-1 ).LE.TOL2*D ) THEN
-               Z( I4-1 ) = -ZERO
-               Z( I4-2*PP-2 ) = D
-               Z( I4-2*PP ) = ZERO
-               D = Z( I4+1 )
-            ELSE IF( SAFMIN*Z( I4+1 ).LT.Z( I4-2*PP-2 ) .AND.
-     $               SAFMIN*Z( I4-2*PP-2 ).LT.Z( I4+1 ) ) THEN
-               TEMP = Z( I4+1 ) / Z( I4-2*PP-2 )
-               Z( I4-2*PP ) = Z( I4-1 )*TEMP
-               D = D*TEMP
-            ELSE
-               Z( I4-2*PP ) = Z( I4+1 )*( Z( I4-1 ) / Z( I4-2*PP-2 ) )
-               D = Z( I4+1 )*( D / Z( I4-2*PP-2 ) )
-            END IF
-            EMIN = MIN( EMIN, Z( I4-2*PP ) )
-   60    CONTINUE 
-         Z( 4*N0-PP-2 ) = D
-*
-*        Now find qmax.
-*
-         QMAX = Z( 4*I0-PP-2 )
-         DO 70 I4 = 4*I0 - PP + 2, 4*N0 - PP - 2, 4
-            QMAX = MAX( QMAX, Z( I4 ) )
-   70    CONTINUE
-*
-*        Prepare for the next iteration on K.
-*
-         PP = 1 - PP
-   80 CONTINUE
-*
-*     Initialise variables to pass to SLAZQ3
-*
-      TTYPE = 0
-      DMIN1 = ZERO
-      DMIN2 = ZERO
-      DN    = ZERO
-      DN1   = ZERO
-      DN2   = ZERO
-      TAU   = ZERO
-*
-      ITER = 2
-      NFAIL = 0
-      NDIV = 2*( N0-I0 )
-*
-      DO 140 IWHILA = 1, N + 1
-         IF( N0.LT.1 ) 
-     $      GO TO 150
-*
-*        While array unfinished do 
-*
-*        E(N0) holds the value of SIGMA when submatrix in I0:N0
-*        splits from the rest of the array, but is negated.
-*      
-         DESIG = ZERO
-         IF( N0.EQ.N ) THEN
-            SIGMA = ZERO
-         ELSE
-            SIGMA = -Z( 4*N0-1 )
-         END IF
-         IF( SIGMA.LT.ZERO ) THEN
-            INFO = 1
-            RETURN
-         END IF
-*
-*        Find last unreduced submatrix's top index I0, find QMAX and
-*        EMIN. Find Gershgorin-type bound if Q's much greater than E's.
-*
-         EMAX = ZERO 
-         IF( N0.GT.I0 ) THEN
-            EMIN = ABS( Z( 4*N0-5 ) )
-         ELSE
-            EMIN = ZERO
-         END IF
-         QMIN = Z( 4*N0-3 )
-         QMAX = QMIN
-         DO 90 I4 = 4*N0, 8, -4
-            IF( Z( I4-5 ).LE.ZERO )
-     $         GO TO 100
-            IF( QMIN.GE.FOUR*EMAX ) THEN
-               QMIN = MIN( QMIN, Z( I4-3 ) )
-               EMAX = MAX( EMAX, Z( I4-5 ) )
-            END IF
-            QMAX = MAX( QMAX, Z( I4-7 )+Z( I4-5 ) )
-            EMIN = MIN( EMIN, Z( I4-5 ) )
-   90    CONTINUE
-         I4 = 4 
-*
-  100    CONTINUE
-         I0 = I4 / 4
-*
-*        Store EMIN for passing to SLAZQ3.
-*
-         Z( 4*N0-1 ) = EMIN
-*
-*        Put -(initial shift) into DMIN.
-*
-         DMIN = -MAX( ZERO, QMIN-TWO*SQRT( QMIN )*SQRT( EMAX ) )
-*
-*        Now I0:N0 is unreduced. PP = 0 for ping, PP = 1 for pong.
-*
-         PP = 0 
-*
-         NBIG = 30*( N0-I0+1 )
-         DO 120 IWHILB = 1, NBIG
-            IF( I0.GT.N0 ) 
-     $         GO TO 130
-*
-*           While submatrix unfinished take a good dqds step.
-*
-            CALL SLAZQ3( I0, N0, Z, PP, DMIN, SIGMA, DESIG, QMAX, NFAIL,
-     $                   ITER, NDIV, IEEE, TTYPE, DMIN1, DMIN2, DN, DN1,
-     $                   DN2, TAU )
-*
-            PP = 1 - PP
-*
-*           When EMIN is very small check for splits.
-*
-            IF( PP.EQ.0 .AND. N0-I0.GE.3 ) THEN
-               IF( Z( 4*N0 ).LE.TOL2*QMAX .OR.
-     $             Z( 4*N0-1 ).LE.TOL2*SIGMA ) THEN
-                  SPLT = I0 - 1
-                  QMAX = Z( 4*I0-3 )
-                  EMIN = Z( 4*I0-1 )
-                  OLDEMN = Z( 4*I0 )
-                  DO 110 I4 = 4*I0, 4*( N0-3 ), 4
-                     IF( Z( I4 ).LE.TOL2*Z( I4-3 ) .OR.
-     $                   Z( I4-1 ).LE.TOL2*SIGMA ) THEN
-                        Z( I4-1 ) = -SIGMA
-                        SPLT = I4 / 4
-                        QMAX = ZERO
-                        EMIN = Z( I4+3 )
-                        OLDEMN = Z( I4+4 )
-                     ELSE
-                        QMAX = MAX( QMAX, Z( I4+1 ) )
-                        EMIN = MIN( EMIN, Z( I4-1 ) )
-                        OLDEMN = MIN( OLDEMN, Z( I4 ) )
-                     END IF
-  110             CONTINUE
-                  Z( 4*N0-1 ) = EMIN
-                  Z( 4*N0 ) = OLDEMN
-                  I0 = SPLT + 1
-               END IF
-            END IF
-*
-  120    CONTINUE
-*
-         INFO = 2
-         RETURN
-*
-*        end IWHILB
-*
-  130    CONTINUE
-*
-  140 CONTINUE
-*
-      INFO = 3
-      RETURN
-*
-*     end IWHILA   
-*
-  150 CONTINUE
-*      
-*     Move q's to the front.
-*      
-      DO 160 K = 2, N
-         Z( K ) = Z( 4*K-3 )
-  160 CONTINUE
-*      
-*     Sort and compute sum of eigenvalues.
-*
-      CALL SLASRT( 'D', N, Z, IINFO )
-*
-      E = ZERO
-      DO 170 K = N, 1, -1
-         E = E + Z( K )
-  170 CONTINUE
-*
-*     Store trace, sum(eigenvalues) and information on performance.
-*
-      Z( 2*N+1 ) = TRACE 
-      Z( 2*N+2 ) = E
-      Z( 2*N+3 ) = REAL( ITER )
-      Z( 2*N+4 ) = REAL( NDIV ) / REAL( N**2 )
-      Z( 2*N+5 ) = HUNDRD*NFAIL / REAL( ITER )
-      RETURN
-*
-*     End of SLASQ2
-*
-      END
--- a/libcruft/lapack/slasq3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,295 +0,0 @@
-      SUBROUTINE SLASQ3( I0, N0, Z, PP, DMIN, SIGMA, DESIG, QMAX, NFAIL,
-     $                   ITER, NDIV, IEEE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            IEEE
-      INTEGER            I0, ITER, N0, NDIV, NFAIL, PP
-      REAL               DESIG, DMIN, QMAX, SIGMA
-*     ..
-*     .. Array Arguments ..
-      REAL               Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASQ3 checks for deflation, computes a shift (TAU) and calls dqds.
-*  In case of failure it changes shifts, and tries again until output
-*  is positive.
-*
-*  Arguments
-*  =========
-*
-*  I0     (input) INTEGER
-*         First index.
-*
-*  N0     (input) INTEGER
-*         Last index.
-*
-*  Z      (input) REAL array, dimension ( 4*N )
-*         Z holds the qd array.
-*
-*  PP     (input) INTEGER
-*         PP=0 for ping, PP=1 for pong.
-*
-*  DMIN   (output) REAL
-*         Minimum value of d.
-*
-*  SIGMA  (output) REAL
-*         Sum of shifts used in current segment.
-*
-*  DESIG  (input/output) REAL
-*         Lower order part of SIGMA
-*
-*  QMAX   (input) REAL
-*         Maximum value of q.
-*
-*  NFAIL  (output) INTEGER
-*         Number of times shift was too big.
-*
-*  ITER   (output) INTEGER
-*         Number of iterations.
-*
-*  NDIV   (output) INTEGER
-*         Number of divisions.
-*
-*  TTYPE  (output) INTEGER
-*         Shift type.
-*
-*  IEEE   (input) LOGICAL
-*         Flag for IEEE or non IEEE arithmetic (passed to SLASQ5).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               CBIAS
-      PARAMETER          ( CBIAS = 1.50E0 )
-      REAL               ZERO, QURTR, HALF, ONE, TWO, HUNDRD
-      PARAMETER          ( ZERO = 0.0E0, QURTR = 0.250E0, HALF = 0.5E0,
-     $                     ONE = 1.0E0, TWO = 2.0E0, HUNDRD = 100.0E0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            IPN4, J4, N0IN, NN, TTYPE
-      REAL               DMIN1, DMIN2, DN, DN1, DN2, EPS, S, SAFMIN, T,
-     $                   TAU, TEMP, TOL, TOL2
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLASQ4, SLASQ5, SLASQ6
-*     ..
-*     .. External Function ..
-      REAL               SLAMCH
-      EXTERNAL           SLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Save statement ..
-      SAVE               TTYPE
-      SAVE               DMIN1, DMIN2, DN, DN1, DN2, TAU
-*     ..
-*     .. Data statement ..
-      DATA               TTYPE / 0 /
-      DATA               DMIN1 / ZERO /, DMIN2 / ZERO /, DN / ZERO /,
-     $                   DN1 / ZERO /, DN2 / ZERO /, TAU / ZERO /
-*     ..
-*     .. Executable Statements ..
-*
-      N0IN = N0
-      EPS = SLAMCH( 'Precision' )
-      SAFMIN = SLAMCH( 'Safe minimum' )
-      TOL = EPS*HUNDRD
-      TOL2 = TOL**2
-*
-*     Check for deflation.
-*
-   10 CONTINUE
-*
-      IF( N0.LT.I0 )
-     $   RETURN
-      IF( N0.EQ.I0 )
-     $   GO TO 20
-      NN = 4*N0 + PP
-      IF( N0.EQ.( I0+1 ) )
-     $   GO TO 40
-*
-*     Check whether E(N0-1) is negligible, 1 eigenvalue.
-*
-      IF( Z( NN-5 ).GT.TOL2*( SIGMA+Z( NN-3 ) ) .AND.
-     $    Z( NN-2*PP-4 ).GT.TOL2*Z( NN-7 ) )
-     $   GO TO 30
-*
-   20 CONTINUE
-*
-      Z( 4*N0-3 ) = Z( 4*N0+PP-3 ) + SIGMA
-      N0 = N0 - 1
-      GO TO 10
-*
-*     Check  whether E(N0-2) is negligible, 2 eigenvalues.
-*
-   30 CONTINUE
-*
-      IF( Z( NN-9 ).GT.TOL2*SIGMA .AND.
-     $    Z( NN-2*PP-8 ).GT.TOL2*Z( NN-11 ) )
-     $   GO TO 50
-*
-   40 CONTINUE
-*
-      IF( Z( NN-3 ).GT.Z( NN-7 ) ) THEN
-         S = Z( NN-3 )
-         Z( NN-3 ) = Z( NN-7 )
-         Z( NN-7 ) = S
-      END IF
-      IF( Z( NN-5 ).GT.Z( NN-3 )*TOL2 ) THEN
-         T = HALF*( ( Z( NN-7 )-Z( NN-3 ) )+Z( NN-5 ) )
-         S = Z( NN-3 )*( Z( NN-5 ) / T )
-         IF( S.LE.T ) THEN
-            S = Z( NN-3 )*( Z( NN-5 ) /
-     $          ( T*( ONE+SQRT( ONE+S / T ) ) ) )
-         ELSE
-            S = Z( NN-3 )*( Z( NN-5 ) / ( T+SQRT( T )*SQRT( T+S ) ) )
-         END IF
-         T = Z( NN-7 ) + ( S+Z( NN-5 ) )
-         Z( NN-3 ) = Z( NN-3 )*( Z( NN-7 ) / T )
-         Z( NN-7 ) = T
-      END IF
-      Z( 4*N0-7 ) = Z( NN-7 ) + SIGMA
-      Z( 4*N0-3 ) = Z( NN-3 ) + SIGMA
-      N0 = N0 - 2
-      GO TO 10
-*
-   50 CONTINUE
-*
-*     Reverse the qd-array, if warranted.
-*
-      IF( DMIN.LE.ZERO .OR. N0.LT.N0IN ) THEN
-         IF( CBIAS*Z( 4*I0+PP-3 ).LT.Z( 4*N0+PP-3 ) ) THEN
-            IPN4 = 4*( I0+N0 )
-            DO 60 J4 = 4*I0, 2*( I0+N0-1 ), 4
-               TEMP = Z( J4-3 )
-               Z( J4-3 ) = Z( IPN4-J4-3 )
-               Z( IPN4-J4-3 ) = TEMP
-               TEMP = Z( J4-2 )
-               Z( J4-2 ) = Z( IPN4-J4-2 )
-               Z( IPN4-J4-2 ) = TEMP
-               TEMP = Z( J4-1 )
-               Z( J4-1 ) = Z( IPN4-J4-5 )
-               Z( IPN4-J4-5 ) = TEMP
-               TEMP = Z( J4 )
-               Z( J4 ) = Z( IPN4-J4-4 )
-               Z( IPN4-J4-4 ) = TEMP
-   60       CONTINUE
-            IF( N0-I0.LE.4 ) THEN
-               Z( 4*N0+PP-1 ) = Z( 4*I0+PP-1 )
-               Z( 4*N0-PP ) = Z( 4*I0-PP )
-            END IF
-            DMIN2 = MIN( DMIN2, Z( 4*N0+PP-1 ) )
-            Z( 4*N0+PP-1 ) = MIN( Z( 4*N0+PP-1 ), Z( 4*I0+PP-1 ),
-     $                            Z( 4*I0+PP+3 ) )
-            Z( 4*N0-PP ) = MIN( Z( 4*N0-PP ), Z( 4*I0-PP ),
-     $                          Z( 4*I0-PP+4 ) )
-            QMAX = MAX( QMAX, Z( 4*I0+PP-3 ), Z( 4*I0+PP+1 ) )
-            DMIN = -ZERO
-         END IF
-      END IF
-*
-      IF( DMIN.LT.ZERO .OR. SAFMIN*QMAX.LT.MIN( Z( 4*N0+PP-1 ),
-     $    Z( 4*N0+PP-9 ), DMIN2+Z( 4*N0-PP ) ) ) THEN
-*
-*        Choose a shift.
-*
-         CALL SLASQ4( I0, N0, Z, PP, N0IN, DMIN, DMIN1, DMIN2, DN, DN1,
-     $                DN2, TAU, TTYPE )
-*
-*        Call dqds until DMIN > 0.
-*
-   80    CONTINUE
-*
-         CALL SLASQ5( I0, N0, Z, PP, TAU, DMIN, DMIN1, DMIN2, DN,
-     $                DN1, DN2, IEEE )
-*
-         NDIV = NDIV + ( N0-I0+2 )
-         ITER = ITER + 1
-*
-*        Check status.
-*
-         IF( DMIN.GE.ZERO .AND. DMIN1.GT.ZERO ) THEN
-*
-*           Success.
-*
-            GO TO 100
-*
-         ELSE IF( DMIN.LT.ZERO .AND. DMIN1.GT.ZERO .AND.
-     $            Z( 4*( N0-1 )-PP ).LT.TOL*( SIGMA+DN1 ) .AND.
-     $            ABS( DN ).LT.TOL*SIGMA ) THEN
-*
-*           Convergence hidden by negative DN.
-*
-            Z( 4*( N0-1 )-PP+2 ) = ZERO
-            DMIN = ZERO
-            GO TO 100
-         ELSE IF( DMIN.LT.ZERO ) THEN
-*
-*           TAU too big. Select new TAU and try again.
-*
-            NFAIL = NFAIL + 1
-            IF( TTYPE.LT.-22 ) THEN
-*
-*              Failed twice. Play it safe.
-*
-               TAU = ZERO
-            ELSE IF( DMIN1.GT.ZERO ) THEN
-*
-*              Late failure. Gives excellent shift.
-*
-               TAU = ( TAU+DMIN )*( ONE-TWO*EPS )
-               TTYPE = TTYPE - 11
-            ELSE
-*
-*              Early failure. Divide by 4.
-*
-               TAU = QURTR*TAU
-               TTYPE = TTYPE - 12
-            END IF
-            GO TO 80
-         ELSE IF( DMIN.NE.DMIN ) THEN
-*
-*           NaN.
-*
-            TAU = ZERO
-            GO TO 80
-         ELSE
-*
-*           Possible underflow. Play it safe.
-*
-            GO TO 90
-         END IF
-      END IF
-*
-*     Risk of underflow.
-*
-   90 CONTINUE
-      CALL SLASQ6( I0, N0, Z, PP, DMIN, DMIN1, DMIN2, DN, DN1, DN2 )
-      NDIV = NDIV + ( N0-I0+2 )
-      ITER = ITER + 1
-      TAU = ZERO
-*
-  100 CONTINUE
-      IF( TAU.LT.SIGMA ) THEN
-         DESIG = DESIG + TAU
-         T = SIGMA + DESIG
-         DESIG = DESIG - ( T-SIGMA )
-      ELSE
-         T = SIGMA + TAU
-         DESIG = SIGMA - ( T-TAU ) + DESIG
-      END IF
-      SIGMA = T
-*
-      RETURN
-*
-*     End of SLASQ3
-*
-      END
--- a/libcruft/lapack/slasq4.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,329 +0,0 @@
-      SUBROUTINE SLASQ4( I0, N0, Z, PP, N0IN, DMIN, DMIN1, DMIN2, DN,
-     $                   DN1, DN2, TAU, TTYPE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            I0, N0, N0IN, PP, TTYPE
-      REAL               DMIN, DMIN1, DMIN2, DN, DN1, DN2, TAU
-*     ..
-*     .. Array Arguments ..
-      REAL               Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASQ4 computes an approximation TAU to the smallest eigenvalue 
-*  using values of d from the previous transform.
-*
-*  I0    (input) INTEGER
-*        First index.
-*
-*  N0    (input) INTEGER
-*        Last index.
-*
-*  Z     (input) REAL array, dimension ( 4*N )
-*        Z holds the qd array.
-*
-*  PP    (input) INTEGER
-*        PP=0 for ping, PP=1 for pong.
-*
-*  N0IN  (input) INTEGER
-*        The value of N0 at start of EIGTEST.
-*
-*  DMIN  (input) REAL
-*        Minimum value of d.
-*
-*  DMIN1 (input) REAL
-*        Minimum value of d, excluding D( N0 ).
-*
-*  DMIN2 (input) REAL
-*        Minimum value of d, excluding D( N0 ) and D( N0-1 ).
-*
-*  DN    (input) REAL
-*        d(N)
-*
-*  DN1   (input) REAL
-*        d(N-1)
-*
-*  DN2   (input) REAL
-*        d(N-2)
-*
-*  TAU   (output) REAL
-*        This is the shift.
-*
-*  TTYPE (output) INTEGER
-*        Shift type.
-*
-*  Further Details
-*  ===============
-*  CNST1 = 9/16
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               CNST1, CNST2, CNST3
-      PARAMETER          ( CNST1 = 0.5630E0, CNST2 = 1.010E0,
-     $                   CNST3 = 1.050E0 )
-      REAL               QURTR, THIRD, HALF, ZERO, ONE, TWO, HUNDRD
-      PARAMETER          ( QURTR = 0.250E0, THIRD = 0.3330E0,
-     $                   HALF = 0.50E0, ZERO = 0.0E0, ONE = 1.0E0,
-     $                   TWO = 2.0E0, HUNDRD = 100.0E0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I4, NN, NP
-      REAL               A2, B1, B2, G, GAM, GAP1, GAP2, S
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN, SQRT
-*     ..
-*     .. Save statement ..
-      SAVE               G
-*     ..
-*     .. Data statement ..
-      DATA               G / ZERO /
-*     ..
-*     .. Executable Statements ..
-*
-*     A negative DMIN forces the shift to take that absolute value
-*     TTYPE records the type of shift.
-*
-      IF( DMIN.LE.ZERO ) THEN
-         TAU = -DMIN
-         TTYPE = -1
-         RETURN
-      END IF
-*       
-      NN = 4*N0 + PP
-      IF( N0IN.EQ.N0 ) THEN
-*
-*        No eigenvalues deflated.
-*
-         IF( DMIN.EQ.DN .OR. DMIN.EQ.DN1 ) THEN
-*
-            B1 = SQRT( Z( NN-3 ) )*SQRT( Z( NN-5 ) )
-            B2 = SQRT( Z( NN-7 ) )*SQRT( Z( NN-9 ) )
-            A2 = Z( NN-7 ) + Z( NN-5 )
-*
-*           Cases 2 and 3.
-*
-            IF( DMIN.EQ.DN .AND. DMIN1.EQ.DN1 ) THEN
-               GAP2 = DMIN2 - A2 - DMIN2*QURTR
-               IF( GAP2.GT.ZERO .AND. GAP2.GT.B2 ) THEN
-                  GAP1 = A2 - DN - ( B2 / GAP2 )*B2
-               ELSE
-                  GAP1 = A2 - DN - ( B1+B2 )
-               END IF
-               IF( GAP1.GT.ZERO .AND. GAP1.GT.B1 ) THEN
-                  S = MAX( DN-( B1 / GAP1 )*B1, HALF*DMIN )
-                  TTYPE = -2
-               ELSE
-                  S = ZERO
-                  IF( DN.GT.B1 )
-     $               S = DN - B1
-                  IF( A2.GT.( B1+B2 ) )
-     $               S = MIN( S, A2-( B1+B2 ) )
-                  S = MAX( S, THIRD*DMIN )
-                  TTYPE = -3
-               END IF
-            ELSE
-*
-*              Case 4.
-*
-               TTYPE = -4
-               S = QURTR*DMIN
-               IF( DMIN.EQ.DN ) THEN
-                  GAM = DN
-                  A2 = ZERO
-                  IF( Z( NN-5 ) .GT. Z( NN-7 ) )
-     $               RETURN
-                  B2 = Z( NN-5 ) / Z( NN-7 )
-                  NP = NN - 9
-               ELSE
-                  NP = NN - 2*PP
-                  B2 = Z( NP-2 )
-                  GAM = DN1
-                  IF( Z( NP-4 ) .GT. Z( NP-2 ) )
-     $               RETURN
-                  A2 = Z( NP-4 ) / Z( NP-2 )
-                  IF( Z( NN-9 ) .GT. Z( NN-11 ) )
-     $               RETURN
-                  B2 = Z( NN-9 ) / Z( NN-11 )
-                  NP = NN - 13
-               END IF
-*
-*              Approximate contribution to norm squared from I < NN-1.
-*
-               A2 = A2 + B2
-               DO 10 I4 = NP, 4*I0 - 1 + PP, -4
-                  IF( B2.EQ.ZERO )
-     $               GO TO 20
-                  B1 = B2
-                  IF( Z( I4 ) .GT. Z( I4-2 ) )
-     $               RETURN
-                  B2 = B2*( Z( I4 ) / Z( I4-2 ) )
-                  A2 = A2 + B2
-                  IF( HUNDRD*MAX( B2, B1 ).LT.A2 .OR. CNST1.LT.A2 ) 
-     $               GO TO 20
-   10          CONTINUE
-   20          CONTINUE
-               A2 = CNST3*A2
-*
-*              Rayleigh quotient residual bound.
-*
-               IF( A2.LT.CNST1 )
-     $            S = GAM*( ONE-SQRT( A2 ) ) / ( ONE+A2 )
-            END IF
-         ELSE IF( DMIN.EQ.DN2 ) THEN
-*
-*           Case 5.
-*
-            TTYPE = -5
-            S = QURTR*DMIN
-*
-*           Compute contribution to norm squared from I > NN-2.
-*
-            NP = NN - 2*PP
-            B1 = Z( NP-2 )
-            B2 = Z( NP-6 )
-            GAM = DN2
-            IF( Z( NP-8 ).GT.B2 .OR. Z( NP-4 ).GT.B1 )
-     $         RETURN
-            A2 = ( Z( NP-8 ) / B2 )*( ONE+Z( NP-4 ) / B1 )
-*
-*           Approximate contribution to norm squared from I < NN-2.
-*
-            IF( N0-I0.GT.2 ) THEN
-               B2 = Z( NN-13 ) / Z( NN-15 )
-               A2 = A2 + B2
-               DO 30 I4 = NN - 17, 4*I0 - 1 + PP, -4
-                  IF( B2.EQ.ZERO )
-     $               GO TO 40
-                  B1 = B2
-                  IF( Z( I4 ) .GT. Z( I4-2 ) )
-     $               RETURN
-                  B2 = B2*( Z( I4 ) / Z( I4-2 ) )
-                  A2 = A2 + B2
-                  IF( HUNDRD*MAX( B2, B1 ).LT.A2 .OR. CNST1.LT.A2 ) 
-     $               GO TO 40
-   30          CONTINUE
-   40          CONTINUE
-               A2 = CNST3*A2
-            END IF
-*
-            IF( A2.LT.CNST1 )
-     $         S = GAM*( ONE-SQRT( A2 ) ) / ( ONE+A2 )
-         ELSE
-*
-*           Case 6, no information to guide us.
-*
-            IF( TTYPE.EQ.-6 ) THEN
-               G = G + THIRD*( ONE-G )
-            ELSE IF( TTYPE.EQ.-18 ) THEN
-               G = QURTR*THIRD
-            ELSE
-               G = QURTR
-            END IF
-            S = G*DMIN
-            TTYPE = -6
-         END IF
-*
-      ELSE IF( N0IN.EQ.( N0+1 ) ) THEN
-*
-*        One eigenvalue just deflated. Use DMIN1, DN1 for DMIN and DN.
-*
-         IF( DMIN1.EQ.DN1 .AND. DMIN2.EQ.DN2 ) THEN 
-*
-*           Cases 7 and 8.
-*
-            TTYPE = -7
-            S = THIRD*DMIN1
-            IF( Z( NN-5 ).GT.Z( NN-7 ) )
-     $         RETURN
-            B1 = Z( NN-5 ) / Z( NN-7 )
-            B2 = B1
-            IF( B2.EQ.ZERO )
-     $         GO TO 60
-            DO 50 I4 = 4*N0 - 9 + PP, 4*I0 - 1 + PP, -4
-               A2 = B1
-               IF( Z( I4 ).GT.Z( I4-2 ) )
-     $            RETURN
-               B1 = B1*( Z( I4 ) / Z( I4-2 ) )
-               B2 = B2 + B1
-               IF( HUNDRD*MAX( B1, A2 ).LT.B2 ) 
-     $            GO TO 60
-   50       CONTINUE
-   60       CONTINUE
-            B2 = SQRT( CNST3*B2 )
-            A2 = DMIN1 / ( ONE+B2**2 )
-            GAP2 = HALF*DMIN2 - A2
-            IF( GAP2.GT.ZERO .AND. GAP2.GT.B2*A2 ) THEN
-               S = MAX( S, A2*( ONE-CNST2*A2*( B2 / GAP2 )*B2 ) )
-            ELSE 
-               S = MAX( S, A2*( ONE-CNST2*B2 ) )
-               TTYPE = -8
-            END IF
-         ELSE
-*
-*           Case 9.
-*
-            S = QURTR*DMIN1
-            IF( DMIN1.EQ.DN1 )
-     $         S = HALF*DMIN1
-            TTYPE = -9
-         END IF
-*
-      ELSE IF( N0IN.EQ.( N0+2 ) ) THEN
-*
-*        Two eigenvalues deflated. Use DMIN2, DN2 for DMIN and DN.
-*
-*        Cases 10 and 11.
-*
-         IF( DMIN2.EQ.DN2 .AND. TWO*Z( NN-5 ).LT.Z( NN-7 ) ) THEN 
-            TTYPE = -10
-            S = THIRD*DMIN2
-            IF( Z( NN-5 ).GT.Z( NN-7 ) )
-     $         RETURN
-            B1 = Z( NN-5 ) / Z( NN-7 )
-            B2 = B1
-            IF( B2.EQ.ZERO )
-     $         GO TO 80
-            DO 70 I4 = 4*N0 - 9 + PP, 4*I0 - 1 + PP, -4
-               IF( Z( I4 ).GT.Z( I4-2 ) )
-     $            RETURN
-               B1 = B1*( Z( I4 ) / Z( I4-2 ) )
-               B2 = B2 + B1
-               IF( HUNDRD*B1.LT.B2 )
-     $            GO TO 80
-   70       CONTINUE
-   80       CONTINUE
-            B2 = SQRT( CNST3*B2 )
-            A2 = DMIN2 / ( ONE+B2**2 )
-            GAP2 = Z( NN-7 ) + Z( NN-9 ) -
-     $             SQRT( Z( NN-11 ) )*SQRT( Z( NN-9 ) ) - A2
-            IF( GAP2.GT.ZERO .AND. GAP2.GT.B2*A2 ) THEN
-               S = MAX( S, A2*( ONE-CNST2*A2*( B2 / GAP2 )*B2 ) )
-            ELSE 
-               S = MAX( S, A2*( ONE-CNST2*B2 ) )
-            END IF
-         ELSE
-            S = QURTR*DMIN2
-            TTYPE = -11
-         END IF
-      ELSE IF( N0IN.GT.( N0+2 ) ) THEN
-*
-*        Case 12, more than two eigenvalues deflated. No information.
-*
-         S = ZERO 
-         TTYPE = -12
-      END IF
-*
-      TAU = S
-      RETURN
-*
-*     End of SLASQ4
-*
-      END
--- a/libcruft/lapack/slasq5.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,195 +0,0 @@
-      SUBROUTINE SLASQ5( I0, N0, Z, PP, TAU, DMIN, DMIN1, DMIN2, DN,
-     $                   DNM1, DNM2, IEEE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            IEEE
-      INTEGER            I0, N0, PP
-      REAL               DMIN, DMIN1, DMIN2, DN, DNM1, DNM2, TAU
-*     ..
-*     .. Array Arguments ..
-      REAL               Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASQ5 computes one dqds transform in ping-pong form, one
-*  version for IEEE machines another for non IEEE machines.
-*
-*  Arguments
-*  =========
-*
-*  I0    (input) INTEGER
-*        First index.
-*
-*  N0    (input) INTEGER
-*        Last index.
-*
-*  Z     (input) REAL array, dimension ( 4*N )
-*        Z holds the qd array. EMIN is stored in Z(4*N0) to avoid
-*        an extra argument.
-*
-*  PP    (input) INTEGER
-*        PP=0 for ping, PP=1 for pong.
-*
-*  TAU   (input) REAL
-*        This is the shift.
-*
-*  DMIN  (output) REAL
-*        Minimum value of d.
-*
-*  DMIN1 (output) REAL
-*        Minimum value of d, excluding D( N0 ).
-*
-*  DMIN2 (output) REAL
-*        Minimum value of d, excluding D( N0 ) and D( N0-1 ).
-*
-*  DN    (output) REAL
-*        d(N0), the last value of d.
-*
-*  DNM1  (output) REAL
-*        d(N0-1).
-*
-*  DNM2  (output) REAL
-*        d(N0-2).
-*
-*  IEEE  (input) LOGICAL
-*        Flag for IEEE or non IEEE arithmetic.
-*
-*  =====================================================================
-*
-*     .. Parameter ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            J4, J4P2
-      REAL               D, EMIN, TEMP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-      IF( ( N0-I0-1 ).LE.0 )
-     $   RETURN
-*
-      J4 = 4*I0 + PP - 3
-      EMIN = Z( J4+4 )
-      D = Z( J4 ) - TAU
-      DMIN = D
-      DMIN1 = -Z( J4 )
-*
-      IF( IEEE ) THEN
-*
-*        Code for IEEE arithmetic.
-*
-         IF( PP.EQ.0 ) THEN
-            DO 10 J4 = 4*I0, 4*( N0-3 ), 4
-               Z( J4-2 ) = D + Z( J4-1 )
-               TEMP = Z( J4+1 ) / Z( J4-2 )
-               D = D*TEMP - TAU
-               DMIN = MIN( DMIN, D )
-               Z( J4 ) = Z( J4-1 )*TEMP
-               EMIN = MIN( Z( J4 ), EMIN )
-   10       CONTINUE
-         ELSE
-            DO 20 J4 = 4*I0, 4*( N0-3 ), 4
-               Z( J4-3 ) = D + Z( J4 )
-               TEMP = Z( J4+2 ) / Z( J4-3 )
-               D = D*TEMP - TAU
-               DMIN = MIN( DMIN, D )
-               Z( J4-1 ) = Z( J4 )*TEMP
-               EMIN = MIN( Z( J4-1 ), EMIN )
-   20       CONTINUE
-         END IF
-*
-*        Unroll last two steps.
-*
-         DNM2 = D
-         DMIN2 = DMIN
-         J4 = 4*( N0-2 ) - PP
-         J4P2 = J4 + 2*PP - 1
-         Z( J4-2 ) = DNM2 + Z( J4P2 )
-         Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
-         DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
-         DMIN = MIN( DMIN, DNM1 )
-*
-         DMIN1 = DMIN
-         J4 = J4 + 4
-         J4P2 = J4 + 2*PP - 1
-         Z( J4-2 ) = DNM1 + Z( J4P2 )
-         Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
-         DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
-         DMIN = MIN( DMIN, DN )
-*
-      ELSE
-*
-*        Code for non IEEE arithmetic.
-*
-         IF( PP.EQ.0 ) THEN
-            DO 30 J4 = 4*I0, 4*( N0-3 ), 4
-               Z( J4-2 ) = D + Z( J4-1 )
-               IF( D.LT.ZERO ) THEN
-                  RETURN
-               ELSE
-                  Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) )
-                  D = Z( J4+1 )*( D / Z( J4-2 ) ) - TAU
-               END IF
-               DMIN = MIN( DMIN, D )
-               EMIN = MIN( EMIN, Z( J4 ) )
-   30       CONTINUE
-         ELSE
-            DO 40 J4 = 4*I0, 4*( N0-3 ), 4
-               Z( J4-3 ) = D + Z( J4 )
-               IF( D.LT.ZERO ) THEN
-                  RETURN
-               ELSE
-                  Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) )
-                  D = Z( J4+2 )*( D / Z( J4-3 ) ) - TAU
-               END IF
-               DMIN = MIN( DMIN, D )
-               EMIN = MIN( EMIN, Z( J4-1 ) )
-   40       CONTINUE
-         END IF
-*
-*        Unroll last two steps.
-*
-         DNM2 = D
-         DMIN2 = DMIN
-         J4 = 4*( N0-2 ) - PP
-         J4P2 = J4 + 2*PP - 1
-         Z( J4-2 ) = DNM2 + Z( J4P2 )
-         IF( DNM2.LT.ZERO ) THEN
-            RETURN
-         ELSE
-            Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
-            DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
-         END IF
-         DMIN = MIN( DMIN, DNM1 )
-*
-         DMIN1 = DMIN
-         J4 = J4 + 4
-         J4P2 = J4 + 2*PP - 1
-         Z( J4-2 ) = DNM1 + Z( J4P2 )
-         IF( DNM1.LT.ZERO ) THEN
-            RETURN
-         ELSE
-            Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
-            DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
-         END IF
-         DMIN = MIN( DMIN, DN )
-*
-      END IF
-*
-      Z( J4+2 ) = DN
-      Z( 4*N0-PP ) = EMIN
-      RETURN
-*
-*     End of SLASQ5
-*
-      END
--- a/libcruft/lapack/slasq6.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,175 +0,0 @@
-      SUBROUTINE SLASQ6( I0, N0, Z, PP, DMIN, DMIN1, DMIN2, DN,
-     $                   DNM1, DNM2 )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            I0, N0, PP
-      REAL               DMIN, DMIN1, DMIN2, DN, DNM1, DNM2
-*     ..
-*     .. Array Arguments ..
-      REAL               Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASQ6 computes one dqd (shift equal to zero) transform in
-*  ping-pong form, with protection against underflow and overflow.
-*
-*  Arguments
-*  =========
-*
-*  I0    (input) INTEGER
-*        First index.
-*
-*  N0    (input) INTEGER
-*        Last index.
-*
-*  Z     (input) REAL array, dimension ( 4*N )
-*        Z holds the qd array. EMIN is stored in Z(4*N0) to avoid
-*        an extra argument.
-*
-*  PP    (input) INTEGER
-*        PP=0 for ping, PP=1 for pong.
-*
-*  DMIN  (output) REAL
-*        Minimum value of d.
-*
-*  DMIN1 (output) REAL
-*        Minimum value of d, excluding D( N0 ).
-*
-*  DMIN2 (output) REAL
-*        Minimum value of d, excluding D( N0 ) and D( N0-1 ).
-*
-*  DN    (output) REAL
-*        d(N0), the last value of d.
-*
-*  DNM1  (output) REAL
-*        d(N0-1).
-*
-*  DNM2  (output) REAL
-*        d(N0-2).
-*
-*  =====================================================================
-*
-*     .. Parameter ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            J4, J4P2
-      REAL               D, EMIN, SAFMIN, TEMP
-*     ..
-*     .. External Function ..
-      REAL               SLAMCH
-      EXTERNAL           SLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-      IF( ( N0-I0-1 ).LE.0 )
-     $   RETURN
-*
-      SAFMIN = SLAMCH( 'Safe minimum' )
-      J4 = 4*I0 + PP - 3
-      EMIN = Z( J4+4 ) 
-      D = Z( J4 )
-      DMIN = D
-*
-      IF( PP.EQ.0 ) THEN
-         DO 10 J4 = 4*I0, 4*( N0-3 ), 4
-            Z( J4-2 ) = D + Z( J4-1 ) 
-            IF( Z( J4-2 ).EQ.ZERO ) THEN
-               Z( J4 ) = ZERO
-               D = Z( J4+1 )
-               DMIN = D
-               EMIN = ZERO
-            ELSE IF( SAFMIN*Z( J4+1 ).LT.Z( J4-2 ) .AND.
-     $               SAFMIN*Z( J4-2 ).LT.Z( J4+1 ) ) THEN
-               TEMP = Z( J4+1 ) / Z( J4-2 )
-               Z( J4 ) = Z( J4-1 )*TEMP
-               D = D*TEMP
-            ELSE 
-               Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) )
-               D = Z( J4+1 )*( D / Z( J4-2 ) )
-            END IF
-            DMIN = MIN( DMIN, D )
-            EMIN = MIN( EMIN, Z( J4 ) )
-   10    CONTINUE
-      ELSE
-         DO 20 J4 = 4*I0, 4*( N0-3 ), 4
-            Z( J4-3 ) = D + Z( J4 ) 
-            IF( Z( J4-3 ).EQ.ZERO ) THEN
-               Z( J4-1 ) = ZERO
-               D = Z( J4+2 )
-               DMIN = D
-               EMIN = ZERO
-            ELSE IF( SAFMIN*Z( J4+2 ).LT.Z( J4-3 ) .AND.
-     $               SAFMIN*Z( J4-3 ).LT.Z( J4+2 ) ) THEN
-               TEMP = Z( J4+2 ) / Z( J4-3 )
-               Z( J4-1 ) = Z( J4 )*TEMP
-               D = D*TEMP
-            ELSE 
-               Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) )
-               D = Z( J4+2 )*( D / Z( J4-3 ) )
-            END IF
-            DMIN = MIN( DMIN, D )
-            EMIN = MIN( EMIN, Z( J4-1 ) )
-   20    CONTINUE
-      END IF
-*
-*     Unroll last two steps. 
-*
-      DNM2 = D
-      DMIN2 = DMIN
-      J4 = 4*( N0-2 ) - PP
-      J4P2 = J4 + 2*PP - 1
-      Z( J4-2 ) = DNM2 + Z( J4P2 )
-      IF( Z( J4-2 ).EQ.ZERO ) THEN
-         Z( J4 ) = ZERO
-         DNM1 = Z( J4P2+2 )
-         DMIN = DNM1
-         EMIN = ZERO
-      ELSE IF( SAFMIN*Z( J4P2+2 ).LT.Z( J4-2 ) .AND.
-     $         SAFMIN*Z( J4-2 ).LT.Z( J4P2+2 ) ) THEN
-         TEMP = Z( J4P2+2 ) / Z( J4-2 )
-         Z( J4 ) = Z( J4P2 )*TEMP
-         DNM1 = DNM2*TEMP
-      ELSE
-         Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
-         DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) )
-      END IF
-      DMIN = MIN( DMIN, DNM1 )
-*
-      DMIN1 = DMIN
-      J4 = J4 + 4
-      J4P2 = J4 + 2*PP - 1
-      Z( J4-2 ) = DNM1 + Z( J4P2 )
-      IF( Z( J4-2 ).EQ.ZERO ) THEN
-         Z( J4 ) = ZERO
-         DN = Z( J4P2+2 )
-         DMIN = DN
-         EMIN = ZERO
-      ELSE IF( SAFMIN*Z( J4P2+2 ).LT.Z( J4-2 ) .AND.
-     $         SAFMIN*Z( J4-2 ).LT.Z( J4P2+2 ) ) THEN
-         TEMP = Z( J4P2+2 ) / Z( J4-2 )
-         Z( J4 ) = Z( J4P2 )*TEMP
-         DN = DNM1*TEMP
-      ELSE
-         Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
-         DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) )
-      END IF
-      DMIN = MIN( DMIN, DN )
-*
-      Z( J4+2 ) = DN
-      Z( 4*N0-PP ) = EMIN
-      RETURN
-*
-*     End of SLASQ6
-*
-      END
--- a/libcruft/lapack/slasr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,361 +0,0 @@
-      SUBROUTINE SLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, PIVOT, SIDE
-      INTEGER            LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), C( * ), S( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASR applies a sequence of plane rotations to a real matrix A,
-*  from either the left or the right.
-*  
-*  When SIDE = 'L', the transformation takes the form
-*  
-*     A := P*A
-*  
-*  and when SIDE = 'R', the transformation takes the form
-*  
-*     A := A*P**T
-*  
-*  where P is an orthogonal matrix consisting of a sequence of z plane
-*  rotations, with z = M when SIDE = 'L' and z = N when SIDE = 'R',
-*  and P**T is the transpose of P.
-*  
-*  When DIRECT = 'F' (Forward sequence), then
-*  
-*     P = P(z-1) * ... * P(2) * P(1)
-*  
-*  and when DIRECT = 'B' (Backward sequence), then
-*  
-*     P = P(1) * P(2) * ... * P(z-1)
-*  
-*  where P(k) is a plane rotation matrix defined by the 2-by-2 rotation
-*  
-*     R(k) = (  c(k)  s(k) )
-*          = ( -s(k)  c(k) ).
-*  
-*  When PIVOT = 'V' (Variable pivot), the rotation is performed
-*  for the plane (k,k+1), i.e., P(k) has the form
-*  
-*     P(k) = (  1                                            )
-*            (       ...                                     )
-*            (              1                                )
-*            (                   c(k)  s(k)                  )
-*            (                  -s(k)  c(k)                  )
-*            (                                1              )
-*            (                                     ...       )
-*            (                                            1  )
-*  
-*  where R(k) appears as a rank-2 modification to the identity matrix in
-*  rows and columns k and k+1.
-*  
-*  When PIVOT = 'T' (Top pivot), the rotation is performed for the
-*  plane (1,k+1), so P(k) has the form
-*  
-*     P(k) = (  c(k)                    s(k)                 )
-*            (         1                                     )
-*            (              ...                              )
-*            (                     1                         )
-*            ( -s(k)                    c(k)                 )
-*            (                                 1             )
-*            (                                      ...      )
-*            (                                             1 )
-*  
-*  where R(k) appears in rows and columns 1 and k+1.
-*  
-*  Similarly, when PIVOT = 'B' (Bottom pivot), the rotation is
-*  performed for the plane (k,z), giving P(k) the form
-*  
-*     P(k) = ( 1                                             )
-*            (      ...                                      )
-*            (             1                                 )
-*            (                  c(k)                    s(k) )
-*            (                         1                     )
-*            (                              ...              )
-*            (                                     1         )
-*            (                 -s(k)                    c(k) )
-*  
-*  where R(k) appears in rows and columns k and z.  The rotations are
-*  performed without ever forming P(k) explicitly.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          Specifies whether the plane rotation matrix P is applied to
-*          A on the left or the right.
-*          = 'L':  Left, compute A := P*A
-*          = 'R':  Right, compute A:= A*P**T
-*
-*  PIVOT   (input) CHARACTER*1
-*          Specifies the plane for which P(k) is a plane rotation
-*          matrix.
-*          = 'V':  Variable pivot, the plane (k,k+1)
-*          = 'T':  Top pivot, the plane (1,k+1)
-*          = 'B':  Bottom pivot, the plane (k,z)
-*
-*  DIRECT  (input) CHARACTER*1
-*          Specifies whether P is a forward or backward sequence of
-*          plane rotations.
-*          = 'F':  Forward, P = P(z-1)*...*P(2)*P(1)
-*          = 'B':  Backward, P = P(1)*P(2)*...*P(z-1)
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  If m <= 1, an immediate
-*          return is effected.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  If n <= 1, an
-*          immediate return is effected.
-*
-*  C       (input) REAL array, dimension
-*                  (M-1) if SIDE = 'L'
-*                  (N-1) if SIDE = 'R'
-*          The cosines c(k) of the plane rotations.
-*
-*  S       (input) REAL array, dimension
-*                  (M-1) if SIDE = 'L'
-*                  (N-1) if SIDE = 'R'
-*          The sines s(k) of the plane rotations.  The 2-by-2 plane
-*          rotation part of the matrix P(k), R(k), has the form
-*          R(k) = (  c(k)  s(k) )
-*                 ( -s(k)  c(k) ).
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          The M-by-N matrix A.  On exit, A is overwritten by P*A if
-*          SIDE = 'R' or by A*P**T if SIDE = 'L'.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, INFO, J
-      REAL               CTEMP, STEMP, TEMP
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( .NOT.( LSAME( SIDE, 'L' ) .OR. LSAME( SIDE, 'R' ) ) ) THEN
-         INFO = 1
-      ELSE IF( .NOT.( LSAME( PIVOT, 'V' ) .OR. LSAME( PIVOT,
-     $         'T' ) .OR. LSAME( PIVOT, 'B' ) ) ) THEN
-         INFO = 2
-      ELSE IF( .NOT.( LSAME( DIRECT, 'F' ) .OR. LSAME( DIRECT, 'B' ) ) )
-     $          THEN
-         INFO = 3
-      ELSE IF( M.LT.0 ) THEN
-         INFO = 4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = 5
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = 9
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLASR ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( ( M.EQ.0 ) .OR. ( N.EQ.0 ) )
-     $   RETURN
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  P * A
-*
-         IF( LSAME( PIVOT, 'V' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 20 J = 1, M - 1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 10 I = 1, N
-                        TEMP = A( J+1, I )
-                        A( J+1, I ) = CTEMP*TEMP - STEMP*A( J, I )
-                        A( J, I ) = STEMP*TEMP + CTEMP*A( J, I )
-   10                CONTINUE
-                  END IF
-   20          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 40 J = M - 1, 1, -1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 30 I = 1, N
-                        TEMP = A( J+1, I )
-                        A( J+1, I ) = CTEMP*TEMP - STEMP*A( J, I )
-                        A( J, I ) = STEMP*TEMP + CTEMP*A( J, I )
-   30                CONTINUE
-                  END IF
-   40          CONTINUE
-            END IF
-         ELSE IF( LSAME( PIVOT, 'T' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 60 J = 2, M
-                  CTEMP = C( J-1 )
-                  STEMP = S( J-1 )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 50 I = 1, N
-                        TEMP = A( J, I )
-                        A( J, I ) = CTEMP*TEMP - STEMP*A( 1, I )
-                        A( 1, I ) = STEMP*TEMP + CTEMP*A( 1, I )
-   50                CONTINUE
-                  END IF
-   60          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 80 J = M, 2, -1
-                  CTEMP = C( J-1 )
-                  STEMP = S( J-1 )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 70 I = 1, N
-                        TEMP = A( J, I )
-                        A( J, I ) = CTEMP*TEMP - STEMP*A( 1, I )
-                        A( 1, I ) = STEMP*TEMP + CTEMP*A( 1, I )
-   70                CONTINUE
-                  END IF
-   80          CONTINUE
-            END IF
-         ELSE IF( LSAME( PIVOT, 'B' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 100 J = 1, M - 1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 90 I = 1, N
-                        TEMP = A( J, I )
-                        A( J, I ) = STEMP*A( M, I ) + CTEMP*TEMP
-                        A( M, I ) = CTEMP*A( M, I ) - STEMP*TEMP
-   90                CONTINUE
-                  END IF
-  100          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 120 J = M - 1, 1, -1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 110 I = 1, N
-                        TEMP = A( J, I )
-                        A( J, I ) = STEMP*A( M, I ) + CTEMP*TEMP
-                        A( M, I ) = CTEMP*A( M, I ) - STEMP*TEMP
-  110                CONTINUE
-                  END IF
-  120          CONTINUE
-            END IF
-         END IF
-      ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*        Form A * P'
-*
-         IF( LSAME( PIVOT, 'V' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 140 J = 1, N - 1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 130 I = 1, M
-                        TEMP = A( I, J+1 )
-                        A( I, J+1 ) = CTEMP*TEMP - STEMP*A( I, J )
-                        A( I, J ) = STEMP*TEMP + CTEMP*A( I, J )
-  130                CONTINUE
-                  END IF
-  140          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 160 J = N - 1, 1, -1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 150 I = 1, M
-                        TEMP = A( I, J+1 )
-                        A( I, J+1 ) = CTEMP*TEMP - STEMP*A( I, J )
-                        A( I, J ) = STEMP*TEMP + CTEMP*A( I, J )
-  150                CONTINUE
-                  END IF
-  160          CONTINUE
-            END IF
-         ELSE IF( LSAME( PIVOT, 'T' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 180 J = 2, N
-                  CTEMP = C( J-1 )
-                  STEMP = S( J-1 )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 170 I = 1, M
-                        TEMP = A( I, J )
-                        A( I, J ) = CTEMP*TEMP - STEMP*A( I, 1 )
-                        A( I, 1 ) = STEMP*TEMP + CTEMP*A( I, 1 )
-  170                CONTINUE
-                  END IF
-  180          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 200 J = N, 2, -1
-                  CTEMP = C( J-1 )
-                  STEMP = S( J-1 )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 190 I = 1, M
-                        TEMP = A( I, J )
-                        A( I, J ) = CTEMP*TEMP - STEMP*A( I, 1 )
-                        A( I, 1 ) = STEMP*TEMP + CTEMP*A( I, 1 )
-  190                CONTINUE
-                  END IF
-  200          CONTINUE
-            END IF
-         ELSE IF( LSAME( PIVOT, 'B' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 220 J = 1, N - 1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 210 I = 1, M
-                        TEMP = A( I, J )
-                        A( I, J ) = STEMP*A( I, N ) + CTEMP*TEMP
-                        A( I, N ) = CTEMP*A( I, N ) - STEMP*TEMP
-  210                CONTINUE
-                  END IF
-  220          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 240 J = N - 1, 1, -1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 230 I = 1, M
-                        TEMP = A( I, J )
-                        A( I, J ) = STEMP*A( I, N ) + CTEMP*TEMP
-                        A( I, N ) = CTEMP*A( I, N ) - STEMP*TEMP
-  230                CONTINUE
-                  END IF
-  240          CONTINUE
-            END IF
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of SLASR
-*
-      END
--- a/libcruft/lapack/slasrt.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,243 +0,0 @@
-      SUBROUTINE SLASRT( ID, N, D, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          ID
-      INTEGER            INFO, N
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  Sort the numbers in D in increasing order (if ID = 'I') or
-*  in decreasing order (if ID = 'D' ).
-*
-*  Use Quick Sort, reverting to Insertion sort on arrays of
-*  size <= 20. Dimension of STACK limits N to about 2**32.
-*
-*  Arguments
-*  =========
-*
-*  ID      (input) CHARACTER*1
-*          = 'I': sort D in increasing order;
-*          = 'D': sort D in decreasing order.
-*
-*  N       (input) INTEGER
-*          The length of the array D.
-*
-*  D       (input/output) REAL array, dimension (N)
-*          On entry, the array to be sorted.
-*          On exit, D has been sorted into increasing order
-*          (D(1) <= ... <= D(N) ) or into decreasing order
-*          (D(1) >= ... >= D(N) ), depending on ID.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            SELECT
-      PARAMETER          ( SELECT = 20 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            DIR, ENDD, I, J, START, STKPNT
-      REAL               D1, D2, D3, DMNMX, TMP
-*     ..
-*     .. Local Arrays ..
-      INTEGER            STACK( 2, 32 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input paramters.
-*
-      INFO = 0
-      DIR = -1
-      IF( LSAME( ID, 'D' ) ) THEN
-         DIR = 0
-      ELSE IF( LSAME( ID, 'I' ) ) THEN
-         DIR = 1
-      END IF
-      IF( DIR.EQ.-1 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLASRT', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 )
-     $   RETURN
-*
-      STKPNT = 1
-      STACK( 1, 1 ) = 1
-      STACK( 2, 1 ) = N
-   10 CONTINUE
-      START = STACK( 1, STKPNT )
-      ENDD = STACK( 2, STKPNT )
-      STKPNT = STKPNT - 1
-      IF( ENDD-START.LE.SELECT .AND. ENDD-START.GT.0 ) THEN
-*
-*        Do Insertion sort on D( START:ENDD )
-*
-         IF( DIR.EQ.0 ) THEN
-*
-*           Sort into decreasing order
-*
-            DO 30 I = START + 1, ENDD
-               DO 20 J = I, START + 1, -1
-                  IF( D( J ).GT.D( J-1 ) ) THEN
-                     DMNMX = D( J )
-                     D( J ) = D( J-1 )
-                     D( J-1 ) = DMNMX
-                  ELSE
-                     GO TO 30
-                  END IF
-   20          CONTINUE
-   30       CONTINUE
-*
-         ELSE
-*
-*           Sort into increasing order
-*
-            DO 50 I = START + 1, ENDD
-               DO 40 J = I, START + 1, -1
-                  IF( D( J ).LT.D( J-1 ) ) THEN
-                     DMNMX = D( J )
-                     D( J ) = D( J-1 )
-                     D( J-1 ) = DMNMX
-                  ELSE
-                     GO TO 50
-                  END IF
-   40          CONTINUE
-   50       CONTINUE
-*
-         END IF
-*
-      ELSE IF( ENDD-START.GT.SELECT ) THEN
-*
-*        Partition D( START:ENDD ) and stack parts, largest one first
-*
-*        Choose partition entry as median of 3
-*
-         D1 = D( START )
-         D2 = D( ENDD )
-         I = ( START+ENDD ) / 2
-         D3 = D( I )
-         IF( D1.LT.D2 ) THEN
-            IF( D3.LT.D1 ) THEN
-               DMNMX = D1
-            ELSE IF( D3.LT.D2 ) THEN
-               DMNMX = D3
-            ELSE
-               DMNMX = D2
-            END IF
-         ELSE
-            IF( D3.LT.D2 ) THEN
-               DMNMX = D2
-            ELSE IF( D3.LT.D1 ) THEN
-               DMNMX = D3
-            ELSE
-               DMNMX = D1
-            END IF
-         END IF
-*
-         IF( DIR.EQ.0 ) THEN
-*
-*           Sort into decreasing order
-*
-            I = START - 1
-            J = ENDD + 1
-   60       CONTINUE
-   70       CONTINUE
-            J = J - 1
-            IF( D( J ).LT.DMNMX )
-     $         GO TO 70
-   80       CONTINUE
-            I = I + 1
-            IF( D( I ).GT.DMNMX )
-     $         GO TO 80
-            IF( I.LT.J ) THEN
-               TMP = D( I )
-               D( I ) = D( J )
-               D( J ) = TMP
-               GO TO 60
-            END IF
-            IF( J-START.GT.ENDD-J-1 ) THEN
-               STKPNT = STKPNT + 1
-               STACK( 1, STKPNT ) = START
-               STACK( 2, STKPNT ) = J
-               STKPNT = STKPNT + 1
-               STACK( 1, STKPNT ) = J + 1
-               STACK( 2, STKPNT ) = ENDD
-            ELSE
-               STKPNT = STKPNT + 1
-               STACK( 1, STKPNT ) = J + 1
-               STACK( 2, STKPNT ) = ENDD
-               STKPNT = STKPNT + 1
-               STACK( 1, STKPNT ) = START
-               STACK( 2, STKPNT ) = J
-            END IF
-         ELSE
-*
-*           Sort into increasing order
-*
-            I = START - 1
-            J = ENDD + 1
-   90       CONTINUE
-  100       CONTINUE
-            J = J - 1
-            IF( D( J ).GT.DMNMX )
-     $         GO TO 100
-  110       CONTINUE
-            I = I + 1
-            IF( D( I ).LT.DMNMX )
-     $         GO TO 110
-            IF( I.LT.J ) THEN
-               TMP = D( I )
-               D( I ) = D( J )
-               D( J ) = TMP
-               GO TO 90
-            END IF
-            IF( J-START.GT.ENDD-J-1 ) THEN
-               STKPNT = STKPNT + 1
-               STACK( 1, STKPNT ) = START
-               STACK( 2, STKPNT ) = J
-               STKPNT = STKPNT + 1
-               STACK( 1, STKPNT ) = J + 1
-               STACK( 2, STKPNT ) = ENDD
-            ELSE
-               STKPNT = STKPNT + 1
-               STACK( 1, STKPNT ) = J + 1
-               STACK( 2, STKPNT ) = ENDD
-               STKPNT = STKPNT + 1
-               STACK( 1, STKPNT ) = START
-               STACK( 2, STKPNT ) = J
-            END IF
-         END IF
-      END IF
-      IF( STKPNT.GT.0 )
-     $   GO TO 10
-      RETURN
-*
-*     End of SLASRT
-*
-      END
--- a/libcruft/lapack/slassq.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-      SUBROUTINE SLASSQ( N, X, INCX, SCALE, SUMSQ )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-      REAL               SCALE, SUMSQ
-*     ..
-*     .. Array Arguments ..
-      REAL               X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASSQ  returns the values  scl  and  smsq  such that
-*
-*     ( scl**2 )*smsq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq,
-*
-*  where  x( i ) = X( 1 + ( i - 1 )*INCX ). The value of  sumsq  is
-*  assumed to be non-negative and  scl  returns the value
-*
-*     scl = max( scale, abs( x( i ) ) ).
-*
-*  scale and sumsq must be supplied in SCALE and SUMSQ and
-*  scl and smsq are overwritten on SCALE and SUMSQ respectively.
-*
-*  The routine makes only one pass through the vector x.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of elements to be used from the vector X.
-*
-*  X       (input) REAL array, dimension (N)
-*          The vector for which a scaled sum of squares is computed.
-*             x( i )  = X( 1 + ( i - 1 )*INCX ), 1 <= i <= n.
-*
-*  INCX    (input) INTEGER
-*          The increment between successive values of the vector X.
-*          INCX > 0.
-*
-*  SCALE   (input/output) REAL
-*          On entry, the value  scale  in the equation above.
-*          On exit, SCALE is overwritten with  scl , the scaling factor
-*          for the sum of squares.
-*
-*  SUMSQ   (input/output) REAL
-*          On entry, the value  sumsq  in the equation above.
-*          On exit, SUMSQ is overwritten with  smsq , the basic sum of
-*          squares from which  scl  has been factored out.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            IX
-      REAL               ABSXI
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.GT.0 ) THEN
-         DO 10 IX = 1, 1 + ( N-1 )*INCX, INCX
-            IF( X( IX ).NE.ZERO ) THEN
-               ABSXI = ABS( X( IX ) )
-               IF( SCALE.LT.ABSXI ) THEN
-                  SUMSQ = 1 + SUMSQ*( SCALE / ABSXI )**2
-                  SCALE = ABSXI
-               ELSE
-                  SUMSQ = SUMSQ + ( ABSXI / SCALE )**2
-               END IF
-            END IF
-   10    CONTINUE
-      END IF
-      RETURN
-*
-*     End of SLASSQ
-*
-      END
--- a/libcruft/lapack/slasv2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,249 +0,0 @@
-      SUBROUTINE SLASV2( F, G, H, SSMIN, SSMAX, SNR, CSR, SNL, CSL )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      REAL               CSL, CSR, F, G, H, SNL, SNR, SSMAX, SSMIN
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASV2 computes the singular value decomposition of a 2-by-2
-*  triangular matrix
-*     [  F   G  ]
-*     [  0   H  ].
-*  On return, abs(SSMAX) is the larger singular value, abs(SSMIN) is the
-*  smaller singular value, and (CSL,SNL) and (CSR,SNR) are the left and
-*  right singular vectors for abs(SSMAX), giving the decomposition
-*
-*     [ CSL  SNL ] [  F   G  ] [ CSR -SNR ]  =  [ SSMAX   0   ]
-*     [-SNL  CSL ] [  0   H  ] [ SNR  CSR ]     [  0    SSMIN ].
-*
-*  Arguments
-*  =========
-*
-*  F       (input) REAL
-*          The (1,1) element of the 2-by-2 matrix.
-*
-*  G       (input) REAL
-*          The (1,2) element of the 2-by-2 matrix.
-*
-*  H       (input) REAL
-*          The (2,2) element of the 2-by-2 matrix.
-*
-*  SSMIN   (output) REAL
-*          abs(SSMIN) is the smaller singular value.
-*
-*  SSMAX   (output) REAL
-*          abs(SSMAX) is the larger singular value.
-*
-*  SNL     (output) REAL
-*  CSL     (output) REAL
-*          The vector (CSL, SNL) is a unit left singular vector for the
-*          singular value abs(SSMAX).
-*
-*  SNR     (output) REAL
-*  CSR     (output) REAL
-*          The vector (CSR, SNR) is a unit right singular vector for the
-*          singular value abs(SSMAX).
-*
-*  Further Details
-*  ===============
-*
-*  Any input parameter may be aliased with any output parameter.
-*
-*  Barring over/underflow and assuming a guard digit in subtraction, all
-*  output quantities are correct to within a few units in the last
-*  place (ulps).
-*
-*  In IEEE arithmetic, the code works correctly if one matrix element is
-*  infinite.
-*
-*  Overflow will not occur unless the largest singular value itself
-*  overflows or is within a few ulps of overflow. (On machines with
-*  partial overflow, like the Cray, overflow may occur if the largest
-*  singular value is within a factor of 2 of overflow.)
-*
-*  Underflow is harmless if underflow is gradual. Otherwise, results
-*  may correspond to a matrix modified by perturbations of size near
-*  the underflow threshold.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E0 )
-      REAL               HALF
-      PARAMETER          ( HALF = 0.5E0 )
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E0 )
-      REAL               TWO
-      PARAMETER          ( TWO = 2.0E0 )
-      REAL               FOUR
-      PARAMETER          ( FOUR = 4.0E0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            GASMAL, SWAP
-      INTEGER            PMAX
-      REAL               A, CLT, CRT, D, FA, FT, GA, GT, HA, HT, L, M,
-     $                   MM, R, S, SLT, SRT, T, TEMP, TSIGN, TT
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, SIGN, SQRT
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      EXTERNAL           SLAMCH
-*     ..
-*     .. Executable Statements ..
-*
-      FT = F
-      FA = ABS( FT )
-      HT = H
-      HA = ABS( H )
-*
-*     PMAX points to the maximum absolute element of matrix
-*       PMAX = 1 if F largest in absolute values
-*       PMAX = 2 if G largest in absolute values
-*       PMAX = 3 if H largest in absolute values
-*
-      PMAX = 1
-      SWAP = ( HA.GT.FA )
-      IF( SWAP ) THEN
-         PMAX = 3
-         TEMP = FT
-         FT = HT
-         HT = TEMP
-         TEMP = FA
-         FA = HA
-         HA = TEMP
-*
-*        Now FA .ge. HA
-*
-      END IF
-      GT = G
-      GA = ABS( GT )
-      IF( GA.EQ.ZERO ) THEN
-*
-*        Diagonal matrix
-*
-         SSMIN = HA
-         SSMAX = FA
-         CLT = ONE
-         CRT = ONE
-         SLT = ZERO
-         SRT = ZERO
-      ELSE
-         GASMAL = .TRUE.
-         IF( GA.GT.FA ) THEN
-            PMAX = 2
-            IF( ( FA / GA ).LT.SLAMCH( 'EPS' ) ) THEN
-*
-*              Case of very large GA
-*
-               GASMAL = .FALSE.
-               SSMAX = GA
-               IF( HA.GT.ONE ) THEN
-                  SSMIN = FA / ( GA / HA )
-               ELSE
-                  SSMIN = ( FA / GA )*HA
-               END IF
-               CLT = ONE
-               SLT = HT / GT
-               SRT = ONE
-               CRT = FT / GT
-            END IF
-         END IF
-         IF( GASMAL ) THEN
-*
-*           Normal case
-*
-            D = FA - HA
-            IF( D.EQ.FA ) THEN
-*
-*              Copes with infinite F or H
-*
-               L = ONE
-            ELSE
-               L = D / FA
-            END IF
-*
-*           Note that 0 .le. L .le. 1
-*
-            M = GT / FT
-*
-*           Note that abs(M) .le. 1/macheps
-*
-            T = TWO - L
-*
-*           Note that T .ge. 1
-*
-            MM = M*M
-            TT = T*T
-            S = SQRT( TT+MM )
-*
-*           Note that 1 .le. S .le. 1 + 1/macheps
-*
-            IF( L.EQ.ZERO ) THEN
-               R = ABS( M )
-            ELSE
-               R = SQRT( L*L+MM )
-            END IF
-*
-*           Note that 0 .le. R .le. 1 + 1/macheps
-*
-            A = HALF*( S+R )
-*
-*           Note that 1 .le. A .le. 1 + abs(M)
-*
-            SSMIN = HA / A
-            SSMAX = FA*A
-            IF( MM.EQ.ZERO ) THEN
-*
-*              Note that M is very tiny
-*
-               IF( L.EQ.ZERO ) THEN
-                  T = SIGN( TWO, FT )*SIGN( ONE, GT )
-               ELSE
-                  T = GT / SIGN( D, FT ) + M / T
-               END IF
-            ELSE
-               T = ( M / ( S+T )+M / ( R+L ) )*( ONE+A )
-            END IF
-            L = SQRT( T*T+FOUR )
-            CRT = TWO / L
-            SRT = T / L
-            CLT = ( CRT+SRT*M ) / A
-            SLT = ( HT / FT )*SRT / A
-         END IF
-      END IF
-      IF( SWAP ) THEN
-         CSL = SRT
-         SNL = CRT
-         CSR = SLT
-         SNR = CLT
-      ELSE
-         CSL = CLT
-         SNL = SLT
-         CSR = CRT
-         SNR = SRT
-      END IF
-*
-*     Correct signs of SSMAX and SSMIN
-*
-      IF( PMAX.EQ.1 )
-     $   TSIGN = SIGN( ONE, CSR )*SIGN( ONE, CSL )*SIGN( ONE, F )
-      IF( PMAX.EQ.2 )
-     $   TSIGN = SIGN( ONE, SNR )*SIGN( ONE, CSL )*SIGN( ONE, G )
-      IF( PMAX.EQ.3 )
-     $   TSIGN = SIGN( ONE, SNR )*SIGN( ONE, SNL )*SIGN( ONE, H )
-      SSMAX = SIGN( SSMAX, TSIGN )
-      SSMIN = SIGN( SSMIN, TSIGN*SIGN( ONE, F )*SIGN( ONE, H ) )
-      RETURN
-*
-*     End of SLASV2
-*
-      END
--- a/libcruft/lapack/slaswp.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,119 +0,0 @@
-      SUBROUTINE SLASWP( N, A, LDA, K1, K2, IPIV, INCX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, K1, K2, LDA, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      REAL               A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASWP performs a series of row interchanges on the matrix A.
-*  One row interchange is initiated for each of rows K1 through K2 of A.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the matrix of column dimension N to which the row
-*          interchanges will be applied.
-*          On exit, the permuted matrix.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.
-*
-*  K1      (input) INTEGER
-*          The first element of IPIV for which a row interchange will
-*          be done.
-*
-*  K2      (input) INTEGER
-*          The last element of IPIV for which a row interchange will
-*          be done.
-*
-*  IPIV    (input) INTEGER array, dimension (K2*abs(INCX))
-*          The vector of pivot indices.  Only the elements in positions
-*          K1 through K2 of IPIV are accessed.
-*          IPIV(K) = L implies rows K and L are to be interchanged.
-*
-*  INCX    (input) INTEGER
-*          The increment between successive values of IPIV.  If IPIV
-*          is negative, the pivots are applied in reverse order.
-*
-*  Further Details
-*  ===============
-*
-*  Modified by
-*   R. C. Whaley, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, I1, I2, INC, IP, IX, IX0, J, K, N32
-      REAL               TEMP
-*     ..
-*     .. Executable Statements ..
-*
-*     Interchange row I with row IPIV(I) for each of rows K1 through K2.
-*
-      IF( INCX.GT.0 ) THEN
-         IX0 = K1
-         I1 = K1
-         I2 = K2
-         INC = 1
-      ELSE IF( INCX.LT.0 ) THEN
-         IX0 = 1 + ( 1-K2 )*INCX
-         I1 = K2
-         I2 = K1
-         INC = -1
-      ELSE
-         RETURN
-      END IF
-*
-      N32 = ( N / 32 )*32
-      IF( N32.NE.0 ) THEN
-         DO 30 J = 1, N32, 32
-            IX = IX0
-            DO 20 I = I1, I2, INC
-               IP = IPIV( IX )
-               IF( IP.NE.I ) THEN
-                  DO 10 K = J, J + 31
-                     TEMP = A( I, K )
-                     A( I, K ) = A( IP, K )
-                     A( IP, K ) = TEMP
-   10             CONTINUE
-               END IF
-               IX = IX + INCX
-   20       CONTINUE
-   30    CONTINUE
-      END IF
-      IF( N32.NE.N ) THEN
-         N32 = N32 + 1
-         IX = IX0
-         DO 50 I = I1, I2, INC
-            IP = IPIV( IX )
-            IF( IP.NE.I ) THEN
-               DO 40 K = N32, N
-                  TEMP = A( I, K )
-                  A( I, K ) = A( IP, K )
-                  A( IP, K ) = TEMP
-   40          CONTINUE
-            END IF
-            IX = IX + INCX
-   50    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of SLASWP
-*
-      END
--- a/libcruft/lapack/slasy2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,381 +0,0 @@
-      SUBROUTINE SLASY2( LTRANL, LTRANR, ISGN, N1, N2, TL, LDTL, TR,
-     $                   LDTR, B, LDB, SCALE, X, LDX, XNORM, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            LTRANL, LTRANR
-      INTEGER            INFO, ISGN, LDB, LDTL, LDTR, LDX, N1, N2
-      REAL               SCALE, XNORM
-*     ..
-*     .. Array Arguments ..
-      REAL               B( LDB, * ), TL( LDTL, * ), TR( LDTR, * ),
-     $                   X( LDX, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLASY2 solves for the N1 by N2 matrix X, 1 <= N1,N2 <= 2, in
-*
-*         op(TL)*X + ISGN*X*op(TR) = SCALE*B,
-*
-*  where TL is N1 by N1, TR is N2 by N2, B is N1 by N2, and ISGN = 1 or
-*  -1.  op(T) = T or T', where T' denotes the transpose of T.
-*
-*  Arguments
-*  =========
-*
-*  LTRANL  (input) LOGICAL
-*          On entry, LTRANL specifies the op(TL):
-*             = .FALSE., op(TL) = TL,
-*             = .TRUE., op(TL) = TL'.
-*
-*  LTRANR  (input) LOGICAL
-*          On entry, LTRANR specifies the op(TR):
-*            = .FALSE., op(TR) = TR,
-*            = .TRUE., op(TR) = TR'.
-*
-*  ISGN    (input) INTEGER
-*          On entry, ISGN specifies the sign of the equation
-*          as described before. ISGN may only be 1 or -1.
-*
-*  N1      (input) INTEGER
-*          On entry, N1 specifies the order of matrix TL.
-*          N1 may only be 0, 1 or 2.
-*
-*  N2      (input) INTEGER
-*          On entry, N2 specifies the order of matrix TR.
-*          N2 may only be 0, 1 or 2.
-*
-*  TL      (input) REAL array, dimension (LDTL,2)
-*          On entry, TL contains an N1 by N1 matrix.
-*
-*  LDTL    (input) INTEGER
-*          The leading dimension of the matrix TL. LDTL >= max(1,N1).
-*
-*  TR      (input) REAL array, dimension (LDTR,2)
-*          On entry, TR contains an N2 by N2 matrix.
-*
-*  LDTR    (input) INTEGER
-*          The leading dimension of the matrix TR. LDTR >= max(1,N2).
-*
-*  B       (input) REAL array, dimension (LDB,2)
-*          On entry, the N1 by N2 matrix B contains the right-hand
-*          side of the equation.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the matrix B. LDB >= max(1,N1).
-*
-*  SCALE   (output) REAL
-*          On exit, SCALE contains the scale factor. SCALE is chosen
-*          less than or equal to 1 to prevent the solution overflowing.
-*
-*  X       (output) REAL array, dimension (LDX,2)
-*          On exit, X contains the N1 by N2 solution.
-*
-*  LDX     (input) INTEGER
-*          The leading dimension of the matrix X. LDX >= max(1,N1).
-*
-*  XNORM   (output) REAL
-*          On exit, XNORM is the infinity-norm of the solution.
-*
-*  INFO    (output) INTEGER
-*          On exit, INFO is set to
-*             0: successful exit.
-*             1: TL and TR have too close eigenvalues, so TL or
-*                TR is perturbed to get a nonsingular equation.
-*          NOTE: In the interests of speed, this routine does not
-*                check the inputs for errors.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-      REAL               TWO, HALF, EIGHT
-      PARAMETER          ( TWO = 2.0E+0, HALF = 0.5E+0, EIGHT = 8.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            BSWAP, XSWAP
-      INTEGER            I, IP, IPIV, IPSV, J, JP, JPSV, K
-      REAL               BET, EPS, GAM, L21, SGN, SMIN, SMLNUM, TAU1,
-     $                   TEMP, U11, U12, U22, XMAX
-*     ..
-*     .. Local Arrays ..
-      LOGICAL            BSWPIV( 4 ), XSWPIV( 4 )
-      INTEGER            JPIV( 4 ), LOCL21( 4 ), LOCU12( 4 ),
-     $                   LOCU22( 4 )
-      REAL               BTMP( 4 ), T16( 4, 4 ), TMP( 4 ), X2( 2 )
-*     ..
-*     .. External Functions ..
-      INTEGER            ISAMAX
-      REAL               SLAMCH
-      EXTERNAL           ISAMAX, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SCOPY, SSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Data statements ..
-      DATA               LOCU12 / 3, 4, 1, 2 / , LOCL21 / 2, 1, 4, 3 / ,
-     $                   LOCU22 / 4, 3, 2, 1 /
-      DATA               XSWPIV / .FALSE., .FALSE., .TRUE., .TRUE. /
-      DATA               BSWPIV / .FALSE., .TRUE., .FALSE., .TRUE. /
-*     ..
-*     .. Executable Statements ..
-*
-*     Do not check the input parameters for errors
-*
-      INFO = 0
-*
-*     Quick return if possible
-*
-      IF( N1.EQ.0 .OR. N2.EQ.0 )
-     $   RETURN
-*
-*     Set constants to control overflow
-*
-      EPS = SLAMCH( 'P' )
-      SMLNUM = SLAMCH( 'S' ) / EPS
-      SGN = ISGN
-*
-      K = N1 + N1 + N2 - 2
-      GO TO ( 10, 20, 30, 50 )K
-*
-*     1 by 1: TL11*X + SGN*X*TR11 = B11
-*
-   10 CONTINUE
-      TAU1 = TL( 1, 1 ) + SGN*TR( 1, 1 )
-      BET = ABS( TAU1 )
-      IF( BET.LE.SMLNUM ) THEN
-         TAU1 = SMLNUM
-         BET = SMLNUM
-         INFO = 1
-      END IF
-*
-      SCALE = ONE
-      GAM = ABS( B( 1, 1 ) )
-      IF( SMLNUM*GAM.GT.BET )
-     $   SCALE = ONE / GAM
-*
-      X( 1, 1 ) = ( B( 1, 1 )*SCALE ) / TAU1
-      XNORM = ABS( X( 1, 1 ) )
-      RETURN
-*
-*     1 by 2:
-*     TL11*[X11 X12] + ISGN*[X11 X12]*op[TR11 TR12]  = [B11 B12]
-*                                       [TR21 TR22]
-*
-   20 CONTINUE
-*
-      SMIN = MAX( EPS*MAX( ABS( TL( 1, 1 ) ), ABS( TR( 1, 1 ) ),
-     $       ABS( TR( 1, 2 ) ), ABS( TR( 2, 1 ) ), ABS( TR( 2, 2 ) ) ),
-     $       SMLNUM )
-      TMP( 1 ) = TL( 1, 1 ) + SGN*TR( 1, 1 )
-      TMP( 4 ) = TL( 1, 1 ) + SGN*TR( 2, 2 )
-      IF( LTRANR ) THEN
-         TMP( 2 ) = SGN*TR( 2, 1 )
-         TMP( 3 ) = SGN*TR( 1, 2 )
-      ELSE
-         TMP( 2 ) = SGN*TR( 1, 2 )
-         TMP( 3 ) = SGN*TR( 2, 1 )
-      END IF
-      BTMP( 1 ) = B( 1, 1 )
-      BTMP( 2 ) = B( 1, 2 )
-      GO TO 40
-*
-*     2 by 1:
-*          op[TL11 TL12]*[X11] + ISGN* [X11]*TR11  = [B11]
-*            [TL21 TL22] [X21]         [X21]         [B21]
-*
-   30 CONTINUE
-      SMIN = MAX( EPS*MAX( ABS( TR( 1, 1 ) ), ABS( TL( 1, 1 ) ),
-     $       ABS( TL( 1, 2 ) ), ABS( TL( 2, 1 ) ), ABS( TL( 2, 2 ) ) ),
-     $       SMLNUM )
-      TMP( 1 ) = TL( 1, 1 ) + SGN*TR( 1, 1 )
-      TMP( 4 ) = TL( 2, 2 ) + SGN*TR( 1, 1 )
-      IF( LTRANL ) THEN
-         TMP( 2 ) = TL( 1, 2 )
-         TMP( 3 ) = TL( 2, 1 )
-      ELSE
-         TMP( 2 ) = TL( 2, 1 )
-         TMP( 3 ) = TL( 1, 2 )
-      END IF
-      BTMP( 1 ) = B( 1, 1 )
-      BTMP( 2 ) = B( 2, 1 )
-   40 CONTINUE
-*
-*     Solve 2 by 2 system using complete pivoting.
-*     Set pivots less than SMIN to SMIN.
-*
-      IPIV = ISAMAX( 4, TMP, 1 )
-      U11 = TMP( IPIV )
-      IF( ABS( U11 ).LE.SMIN ) THEN
-         INFO = 1
-         U11 = SMIN
-      END IF
-      U12 = TMP( LOCU12( IPIV ) )
-      L21 = TMP( LOCL21( IPIV ) ) / U11
-      U22 = TMP( LOCU22( IPIV ) ) - U12*L21
-      XSWAP = XSWPIV( IPIV )
-      BSWAP = BSWPIV( IPIV )
-      IF( ABS( U22 ).LE.SMIN ) THEN
-         INFO = 1
-         U22 = SMIN
-      END IF
-      IF( BSWAP ) THEN
-         TEMP = BTMP( 2 )
-         BTMP( 2 ) = BTMP( 1 ) - L21*TEMP
-         BTMP( 1 ) = TEMP
-      ELSE
-         BTMP( 2 ) = BTMP( 2 ) - L21*BTMP( 1 )
-      END IF
-      SCALE = ONE
-      IF( ( TWO*SMLNUM )*ABS( BTMP( 2 ) ).GT.ABS( U22 ) .OR.
-     $    ( TWO*SMLNUM )*ABS( BTMP( 1 ) ).GT.ABS( U11 ) ) THEN
-         SCALE = HALF / MAX( ABS( BTMP( 1 ) ), ABS( BTMP( 2 ) ) )
-         BTMP( 1 ) = BTMP( 1 )*SCALE
-         BTMP( 2 ) = BTMP( 2 )*SCALE
-      END IF
-      X2( 2 ) = BTMP( 2 ) / U22
-      X2( 1 ) = BTMP( 1 ) / U11 - ( U12 / U11 )*X2( 2 )
-      IF( XSWAP ) THEN
-         TEMP = X2( 2 )
-         X2( 2 ) = X2( 1 )
-         X2( 1 ) = TEMP
-      END IF
-      X( 1, 1 ) = X2( 1 )
-      IF( N1.EQ.1 ) THEN
-         X( 1, 2 ) = X2( 2 )
-         XNORM = ABS( X( 1, 1 ) ) + ABS( X( 1, 2 ) )
-      ELSE
-         X( 2, 1 ) = X2( 2 )
-         XNORM = MAX( ABS( X( 1, 1 ) ), ABS( X( 2, 1 ) ) )
-      END IF
-      RETURN
-*
-*     2 by 2:
-*     op[TL11 TL12]*[X11 X12] +ISGN* [X11 X12]*op[TR11 TR12] = [B11 B12]
-*       [TL21 TL22] [X21 X22]        [X21 X22]   [TR21 TR22]   [B21 B22]
-*
-*     Solve equivalent 4 by 4 system using complete pivoting.
-*     Set pivots less than SMIN to SMIN.
-*
-   50 CONTINUE
-      SMIN = MAX( ABS( TR( 1, 1 ) ), ABS( TR( 1, 2 ) ),
-     $       ABS( TR( 2, 1 ) ), ABS( TR( 2, 2 ) ) )
-      SMIN = MAX( SMIN, ABS( TL( 1, 1 ) ), ABS( TL( 1, 2 ) ),
-     $       ABS( TL( 2, 1 ) ), ABS( TL( 2, 2 ) ) )
-      SMIN = MAX( EPS*SMIN, SMLNUM )
-      BTMP( 1 ) = ZERO
-      CALL SCOPY( 16, BTMP, 0, T16, 1 )
-      T16( 1, 1 ) = TL( 1, 1 ) + SGN*TR( 1, 1 )
-      T16( 2, 2 ) = TL( 2, 2 ) + SGN*TR( 1, 1 )
-      T16( 3, 3 ) = TL( 1, 1 ) + SGN*TR( 2, 2 )
-      T16( 4, 4 ) = TL( 2, 2 ) + SGN*TR( 2, 2 )
-      IF( LTRANL ) THEN
-         T16( 1, 2 ) = TL( 2, 1 )
-         T16( 2, 1 ) = TL( 1, 2 )
-         T16( 3, 4 ) = TL( 2, 1 )
-         T16( 4, 3 ) = TL( 1, 2 )
-      ELSE
-         T16( 1, 2 ) = TL( 1, 2 )
-         T16( 2, 1 ) = TL( 2, 1 )
-         T16( 3, 4 ) = TL( 1, 2 )
-         T16( 4, 3 ) = TL( 2, 1 )
-      END IF
-      IF( LTRANR ) THEN
-         T16( 1, 3 ) = SGN*TR( 1, 2 )
-         T16( 2, 4 ) = SGN*TR( 1, 2 )
-         T16( 3, 1 ) = SGN*TR( 2, 1 )
-         T16( 4, 2 ) = SGN*TR( 2, 1 )
-      ELSE
-         T16( 1, 3 ) = SGN*TR( 2, 1 )
-         T16( 2, 4 ) = SGN*TR( 2, 1 )
-         T16( 3, 1 ) = SGN*TR( 1, 2 )
-         T16( 4, 2 ) = SGN*TR( 1, 2 )
-      END IF
-      BTMP( 1 ) = B( 1, 1 )
-      BTMP( 2 ) = B( 2, 1 )
-      BTMP( 3 ) = B( 1, 2 )
-      BTMP( 4 ) = B( 2, 2 )
-*
-*     Perform elimination
-*
-      DO 100 I = 1, 3
-         XMAX = ZERO
-         DO 70 IP = I, 4
-            DO 60 JP = I, 4
-               IF( ABS( T16( IP, JP ) ).GE.XMAX ) THEN
-                  XMAX = ABS( T16( IP, JP ) )
-                  IPSV = IP
-                  JPSV = JP
-               END IF
-   60       CONTINUE
-   70    CONTINUE
-         IF( IPSV.NE.I ) THEN
-            CALL SSWAP( 4, T16( IPSV, 1 ), 4, T16( I, 1 ), 4 )
-            TEMP = BTMP( I )
-            BTMP( I ) = BTMP( IPSV )
-            BTMP( IPSV ) = TEMP
-         END IF
-         IF( JPSV.NE.I )
-     $      CALL SSWAP( 4, T16( 1, JPSV ), 1, T16( 1, I ), 1 )
-         JPIV( I ) = JPSV
-         IF( ABS( T16( I, I ) ).LT.SMIN ) THEN
-            INFO = 1
-            T16( I, I ) = SMIN
-         END IF
-         DO 90 J = I + 1, 4
-            T16( J, I ) = T16( J, I ) / T16( I, I )
-            BTMP( J ) = BTMP( J ) - T16( J, I )*BTMP( I )
-            DO 80 K = I + 1, 4
-               T16( J, K ) = T16( J, K ) - T16( J, I )*T16( I, K )
-   80       CONTINUE
-   90    CONTINUE
-  100 CONTINUE
-      IF( ABS( T16( 4, 4 ) ).LT.SMIN )
-     $   T16( 4, 4 ) = SMIN
-      SCALE = ONE
-      IF( ( EIGHT*SMLNUM )*ABS( BTMP( 1 ) ).GT.ABS( T16( 1, 1 ) ) .OR.
-     $    ( EIGHT*SMLNUM )*ABS( BTMP( 2 ) ).GT.ABS( T16( 2, 2 ) ) .OR.
-     $    ( EIGHT*SMLNUM )*ABS( BTMP( 3 ) ).GT.ABS( T16( 3, 3 ) ) .OR.
-     $    ( EIGHT*SMLNUM )*ABS( BTMP( 4 ) ).GT.ABS( T16( 4, 4 ) ) ) THEN
-         SCALE = ( ONE / EIGHT ) / MAX( ABS( BTMP( 1 ) ),
-     $           ABS( BTMP( 2 ) ), ABS( BTMP( 3 ) ), ABS( BTMP( 4 ) ) )
-         BTMP( 1 ) = BTMP( 1 )*SCALE
-         BTMP( 2 ) = BTMP( 2 )*SCALE
-         BTMP( 3 ) = BTMP( 3 )*SCALE
-         BTMP( 4 ) = BTMP( 4 )*SCALE
-      END IF
-      DO 120 I = 1, 4
-         K = 5 - I
-         TEMP = ONE / T16( K, K )
-         TMP( K ) = BTMP( K )*TEMP
-         DO 110 J = K + 1, 4
-            TMP( K ) = TMP( K ) - ( TEMP*T16( K, J ) )*TMP( J )
-  110    CONTINUE
-  120 CONTINUE
-      DO 130 I = 1, 3
-         IF( JPIV( 4-I ).NE.4-I ) THEN
-            TEMP = TMP( 4-I )
-            TMP( 4-I ) = TMP( JPIV( 4-I ) )
-            TMP( JPIV( 4-I ) ) = TEMP
-         END IF
-  130 CONTINUE
-      X( 1, 1 ) = TMP( 1 )
-      X( 2, 1 ) = TMP( 2 )
-      X( 1, 2 ) = TMP( 3 )
-      X( 2, 2 ) = TMP( 4 )
-      XNORM = MAX( ABS( TMP( 1 ) )+ABS( TMP( 3 ) ),
-     $        ABS( TMP( 2 ) )+ABS( TMP( 4 ) ) )
-      RETURN
-*
-*     End of SLASY2
-*
-      END
--- a/libcruft/lapack/slatbs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,723 +0,0 @@
-      SUBROUTINE SLATBS( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X,
-     $                   SCALE, CNORM, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, NORMIN, TRANS, UPLO
-      INTEGER            INFO, KD, LDAB, N
-      REAL               SCALE
-*     ..
-*     .. Array Arguments ..
-      REAL               AB( LDAB, * ), CNORM( * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLATBS solves one of the triangular systems
-*
-*     A *x = s*b  or  A'*x = s*b
-*
-*  with scaling to prevent overflow, where A is an upper or lower
-*  triangular band matrix.  Here A' denotes the transpose of A, x and b
-*  are n-element vectors, and s is a scaling factor, usually less than
-*  or equal to 1, chosen so that the components of x will be less than
-*  the overflow threshold.  If the unscaled problem will not cause
-*  overflow, the Level 2 BLAS routine STBSV is called.  If the matrix A
-*  is singular (A(j,j) = 0 for some j), then s is set to 0 and a
-*  non-trivial solution to A*x = 0 is returned.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the matrix A is upper or lower triangular.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the operation applied to A.
-*          = 'N':  Solve A * x = s*b  (No transpose)
-*          = 'T':  Solve A'* x = s*b  (Transpose)
-*          = 'C':  Solve A'* x = s*b  (Conjugate transpose = Transpose)
-*
-*  DIAG    (input) CHARACTER*1
-*          Specifies whether or not the matrix A is unit triangular.
-*          = 'N':  Non-unit triangular
-*          = 'U':  Unit triangular
-*
-*  NORMIN  (input) CHARACTER*1
-*          Specifies whether CNORM has been set or not.
-*          = 'Y':  CNORM contains the column norms on entry
-*          = 'N':  CNORM is not set on entry.  On exit, the norms will
-*                  be computed and stored in CNORM.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of subdiagonals or superdiagonals in the
-*          triangular matrix A.  KD >= 0.
-*
-*  AB      (input) REAL array, dimension (LDAB,N)
-*          The upper or lower triangular band matrix A, stored in the
-*          first KD+1 rows of the array. The j-th column of A is stored
-*          in the j-th column of the array AB as follows:
-*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  X       (input/output) REAL array, dimension (N)
-*          On entry, the right hand side b of the triangular system.
-*          On exit, X is overwritten by the solution vector x.
-*
-*  SCALE   (output) REAL
-*          The scaling factor s for the triangular system
-*             A * x = s*b  or  A'* x = s*b.
-*          If SCALE = 0, the matrix A is singular or badly scaled, and
-*          the vector x is an exact or approximate solution to A*x = 0.
-*
-*  CNORM   (input or output) REAL array, dimension (N)
-*
-*          If NORMIN = 'Y', CNORM is an input argument and CNORM(j)
-*          contains the norm of the off-diagonal part of the j-th column
-*          of A.  If TRANS = 'N', CNORM(j) must be greater than or equal
-*          to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j)
-*          must be greater than or equal to the 1-norm.
-*
-*          If NORMIN = 'N', CNORM is an output argument and CNORM(j)
-*          returns the 1-norm of the offdiagonal part of the j-th column
-*          of A.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -k, the k-th argument had an illegal value
-*
-*  Further Details
-*  ======= =======
-*
-*  A rough bound on x is computed; if that is less than overflow, STBSV
-*  is called, otherwise, specific code is used which checks for possible
-*  overflow or divide-by-zero at every operation.
-*
-*  A columnwise scheme is used for solving A*x = b.  The basic algorithm
-*  if A is lower triangular is
-*
-*       x[1:n] := b[1:n]
-*       for j = 1, ..., n
-*            x(j) := x(j) / A(j,j)
-*            x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j]
-*       end
-*
-*  Define bounds on the components of x after j iterations of the loop:
-*     M(j) = bound on x[1:j]
-*     G(j) = bound on x[j+1:n]
-*  Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}.
-*
-*  Then for iteration j+1 we have
-*     M(j+1) <= G(j) / | A(j+1,j+1) |
-*     G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] |
-*            <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | )
-*
-*  where CNORM(j+1) is greater than or equal to the infinity-norm of
-*  column j+1 of A, not counting the diagonal.  Hence
-*
-*     G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | )
-*                  1<=i<=j
-*  and
-*
-*     |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| )
-*                                   1<=i< j
-*
-*  Since |x(j)| <= M(j), we use the Level 2 BLAS routine STBSV if the
-*  reciprocal of the largest M(j), j=1,..,n, is larger than
-*  max(underflow, 1/overflow).
-*
-*  The bound on x(j) is also used to determine when a step in the
-*  columnwise method can be performed without fear of overflow.  If
-*  the computed bound is greater than a large constant, x is scaled to
-*  prevent overflow, but if the bound overflows, x is set to 0, x(j) to
-*  1, and scale to 0, and a non-trivial solution to A*x = 0 is found.
-*
-*  Similarly, a row-wise scheme is used to solve A'*x = b.  The basic
-*  algorithm for A upper triangular is
-*
-*       for j = 1, ..., n
-*            x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j)
-*       end
-*
-*  We simultaneously compute two bounds
-*       G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j
-*       M(j) = bound on x(i), 1<=i<=j
-*
-*  The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we
-*  add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1.
-*  Then the bound on x(j) is
-*
-*       M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) |
-*
-*            <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| )
-*                      1<=i<=j
-*
-*  and we can safely call STBSV if 1/M(n) and 1/G(n) are both greater
-*  than max(underflow, 1/overflow).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, HALF, ONE
-      PARAMETER          ( ZERO = 0.0E+0, HALF = 0.5E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOTRAN, NOUNIT, UPPER
-      INTEGER            I, IMAX, J, JFIRST, JINC, JLAST, JLEN, MAIND
-      REAL               BIGNUM, GROW, REC, SMLNUM, SUMJ, TJJ, TJJS,
-     $                   TMAX, TSCAL, USCAL, XBND, XJ, XMAX
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ISAMAX
-      REAL               SASUM, SDOT, SLAMCH
-      EXTERNAL           LSAME, ISAMAX, SASUM, SDOT, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SAXPY, SSCAL, STBSV, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      NOUNIT = LSAME( DIAG, 'N' )
-*
-*     Test the input parameters.
-*
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
-     $         LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -3
-      ELSE IF( .NOT.LSAME( NORMIN, 'Y' ) .AND. .NOT.
-     $         LSAME( NORMIN, 'N' ) ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -6
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLATBS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine machine dependent parameters to control overflow.
-*
-      SMLNUM = SLAMCH( 'Safe minimum' ) / SLAMCH( 'Precision' )
-      BIGNUM = ONE / SMLNUM
-      SCALE = ONE
-*
-      IF( LSAME( NORMIN, 'N' ) ) THEN
-*
-*        Compute the 1-norm of each column, not including the diagonal.
-*
-         IF( UPPER ) THEN
-*
-*           A is upper triangular.
-*
-            DO 10 J = 1, N
-               JLEN = MIN( KD, J-1 )
-               CNORM( J ) = SASUM( JLEN, AB( KD+1-JLEN, J ), 1 )
-   10       CONTINUE
-         ELSE
-*
-*           A is lower triangular.
-*
-            DO 20 J = 1, N
-               JLEN = MIN( KD, N-J )
-               IF( JLEN.GT.0 ) THEN
-                  CNORM( J ) = SASUM( JLEN, AB( 2, J ), 1 )
-               ELSE
-                  CNORM( J ) = ZERO
-               END IF
-   20       CONTINUE
-         END IF
-      END IF
-*
-*     Scale the column norms by TSCAL if the maximum element in CNORM is
-*     greater than BIGNUM.
-*
-      IMAX = ISAMAX( N, CNORM, 1 )
-      TMAX = CNORM( IMAX )
-      IF( TMAX.LE.BIGNUM ) THEN
-         TSCAL = ONE
-      ELSE
-         TSCAL = ONE / ( SMLNUM*TMAX )
-         CALL SSCAL( N, TSCAL, CNORM, 1 )
-      END IF
-*
-*     Compute a bound on the computed solution vector to see if the
-*     Level 2 BLAS routine STBSV can be used.
-*
-      J = ISAMAX( N, X, 1 )
-      XMAX = ABS( X( J ) )
-      XBND = XMAX
-      IF( NOTRAN ) THEN
-*
-*        Compute the growth in A * x = b.
-*
-         IF( UPPER ) THEN
-            JFIRST = N
-            JLAST = 1
-            JINC = -1
-            MAIND = KD + 1
-         ELSE
-            JFIRST = 1
-            JLAST = N
-            JINC = 1
-            MAIND = 1
-         END IF
-*
-         IF( TSCAL.NE.ONE ) THEN
-            GROW = ZERO
-            GO TO 50
-         END IF
-*
-         IF( NOUNIT ) THEN
-*
-*           A is non-unit triangular.
-*
-*           Compute GROW = 1/G(j) and XBND = 1/M(j).
-*           Initially, G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = ONE / MAX( XBND, SMLNUM )
-            XBND = GROW
-            DO 30 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 50
-*
-*              M(j) = G(j-1) / abs(A(j,j))
-*
-               TJJ = ABS( AB( MAIND, J ) )
-               XBND = MIN( XBND, MIN( ONE, TJJ )*GROW )
-               IF( TJJ+CNORM( J ).GE.SMLNUM ) THEN
-*
-*                 G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) )
-*
-                  GROW = GROW*( TJJ / ( TJJ+CNORM( J ) ) )
-               ELSE
-*
-*                 G(j) could overflow, set GROW to 0.
-*
-                  GROW = ZERO
-               END IF
-   30       CONTINUE
-            GROW = XBND
-         ELSE
-*
-*           A is unit triangular.
-*
-*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) )
-            DO 40 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 50
-*
-*              G(j) = G(j-1)*( 1 + CNORM(j) )
-*
-               GROW = GROW*( ONE / ( ONE+CNORM( J ) ) )
-   40       CONTINUE
-         END IF
-   50    CONTINUE
-*
-      ELSE
-*
-*        Compute the growth in A' * x = b.
-*
-         IF( UPPER ) THEN
-            JFIRST = 1
-            JLAST = N
-            JINC = 1
-            MAIND = KD + 1
-         ELSE
-            JFIRST = N
-            JLAST = 1
-            JINC = -1
-            MAIND = 1
-         END IF
-*
-         IF( TSCAL.NE.ONE ) THEN
-            GROW = ZERO
-            GO TO 80
-         END IF
-*
-         IF( NOUNIT ) THEN
-*
-*           A is non-unit triangular.
-*
-*           Compute GROW = 1/G(j) and XBND = 1/M(j).
-*           Initially, M(0) = max{x(i), i=1,...,n}.
-*
-            GROW = ONE / MAX( XBND, SMLNUM )
-            XBND = GROW
-            DO 60 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 80
-*
-*              G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) )
-*
-               XJ = ONE + CNORM( J )
-               GROW = MIN( GROW, XBND / XJ )
-*
-*              M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j))
-*
-               TJJ = ABS( AB( MAIND, J ) )
-               IF( XJ.GT.TJJ )
-     $            XBND = XBND*( TJJ / XJ )
-   60       CONTINUE
-            GROW = MIN( GROW, XBND )
-         ELSE
-*
-*           A is unit triangular.
-*
-*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) )
-            DO 70 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 80
-*
-*              G(j) = ( 1 + CNORM(j) )*G(j-1)
-*
-               XJ = ONE + CNORM( J )
-               GROW = GROW / XJ
-   70       CONTINUE
-         END IF
-   80    CONTINUE
-      END IF
-*
-      IF( ( GROW*TSCAL ).GT.SMLNUM ) THEN
-*
-*        Use the Level 2 BLAS solve if the reciprocal of the bound on
-*        elements of X is not too small.
-*
-         CALL STBSV( UPLO, TRANS, DIAG, N, KD, AB, LDAB, X, 1 )
-      ELSE
-*
-*        Use a Level 1 BLAS solve, scaling intermediate results.
-*
-         IF( XMAX.GT.BIGNUM ) THEN
-*
-*           Scale X so that its components are less than or equal to
-*           BIGNUM in absolute value.
-*
-            SCALE = BIGNUM / XMAX
-            CALL SSCAL( N, SCALE, X, 1 )
-            XMAX = BIGNUM
-         END IF
-*
-         IF( NOTRAN ) THEN
-*
-*           Solve A * x = b
-*
-            DO 100 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) / A(j,j), scaling x if necessary.
-*
-               XJ = ABS( X( J ) )
-               IF( NOUNIT ) THEN
-                  TJJS = AB( MAIND, J )*TSCAL
-               ELSE
-                  TJJS = TSCAL
-                  IF( TSCAL.EQ.ONE )
-     $               GO TO 95
-               END IF
-                  TJJ = ABS( TJJS )
-                  IF( TJJ.GT.SMLNUM ) THEN
-*
-*                    abs(A(j,j)) > SMLNUM:
-*
-                     IF( TJJ.LT.ONE ) THEN
-                        IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by 1/b(j).
-*
-                           REC = ONE / XJ
-                           CALL SSCAL( N, REC, X, 1 )
-                           SCALE = SCALE*REC
-                           XMAX = XMAX*REC
-                        END IF
-                     END IF
-                     X( J ) = X( J ) / TJJS
-                     XJ = ABS( X( J ) )
-                  ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                    0 < abs(A(j,j)) <= SMLNUM:
-*
-                     IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                       Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM
-*                       to avoid overflow when dividing by A(j,j).
-*
-                        REC = ( TJJ*BIGNUM ) / XJ
-                        IF( CNORM( J ).GT.ONE ) THEN
-*
-*                          Scale by 1/CNORM(j) to avoid overflow when
-*                          multiplying x(j) times column j.
-*
-                           REC = REC / CNORM( J )
-                        END IF
-                        CALL SSCAL( N, REC, X, 1 )
-                        SCALE = SCALE*REC
-                        XMAX = XMAX*REC
-                     END IF
-                     X( J ) = X( J ) / TJJS
-                     XJ = ABS( X( J ) )
-                  ELSE
-*
-*                    A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                    scale = 0, and compute a solution to A*x = 0.
-*
-                     DO 90 I = 1, N
-                        X( I ) = ZERO
-   90                CONTINUE
-                     X( J ) = ONE
-                     XJ = ONE
-                     SCALE = ZERO
-                     XMAX = ZERO
-                  END IF
-   95          CONTINUE
-*
-*              Scale x if necessary to avoid overflow when adding a
-*              multiple of column j of A.
-*
-               IF( XJ.GT.ONE ) THEN
-                  REC = ONE / XJ
-                  IF( CNORM( J ).GT.( BIGNUM-XMAX )*REC ) THEN
-*
-*                    Scale x by 1/(2*abs(x(j))).
-*
-                     REC = REC*HALF
-                     CALL SSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                  END IF
-               ELSE IF( XJ*CNORM( J ).GT.( BIGNUM-XMAX ) ) THEN
-*
-*                 Scale x by 1/2.
-*
-                  CALL SSCAL( N, HALF, X, 1 )
-                  SCALE = SCALE*HALF
-               END IF
-*
-               IF( UPPER ) THEN
-                  IF( J.GT.1 ) THEN
-*
-*                    Compute the update
-*                       x(max(1,j-kd):j-1) := x(max(1,j-kd):j-1) -
-*                                             x(j)* A(max(1,j-kd):j-1,j)
-*
-                     JLEN = MIN( KD, J-1 )
-                     CALL SAXPY( JLEN, -X( J )*TSCAL,
-     $                           AB( KD+1-JLEN, J ), 1, X( J-JLEN ), 1 )
-                     I = ISAMAX( J-1, X, 1 )
-                     XMAX = ABS( X( I ) )
-                  END IF
-               ELSE IF( J.LT.N ) THEN
-*
-*                 Compute the update
-*                    x(j+1:min(j+kd,n)) := x(j+1:min(j+kd,n)) -
-*                                          x(j) * A(j+1:min(j+kd,n),j)
-*
-                  JLEN = MIN( KD, N-J )
-                  IF( JLEN.GT.0 )
-     $               CALL SAXPY( JLEN, -X( J )*TSCAL, AB( 2, J ), 1,
-     $                           X( J+1 ), 1 )
-                  I = J + ISAMAX( N-J, X( J+1 ), 1 )
-                  XMAX = ABS( X( I ) )
-               END IF
-  100       CONTINUE
-*
-         ELSE
-*
-*           Solve A' * x = b
-*
-            DO 140 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) - sum A(k,j)*x(k).
-*                                    k<>j
-*
-               XJ = ABS( X( J ) )
-               USCAL = TSCAL
-               REC = ONE / MAX( XMAX, ONE )
-               IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN
-*
-*                 If x(j) could overflow, scale x by 1/(2*XMAX).
-*
-                  REC = REC*HALF
-                  IF( NOUNIT ) THEN
-                     TJJS = AB( MAIND, J )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                  END IF
-                     TJJ = ABS( TJJS )
-                     IF( TJJ.GT.ONE ) THEN
-*
-*                       Divide by A(j,j) when scaling x if A(j,j) > 1.
-*
-                        REC = MIN( ONE, REC*TJJ )
-                        USCAL = USCAL / TJJS
-                     END IF
-                  IF( REC.LT.ONE ) THEN
-                     CALL SSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                     XMAX = XMAX*REC
-                  END IF
-               END IF
-*
-               SUMJ = ZERO
-               IF( USCAL.EQ.ONE ) THEN
-*
-*                 If the scaling needed for A in the dot product is 1,
-*                 call SDOT to perform the dot product.
-*
-                  IF( UPPER ) THEN
-                     JLEN = MIN( KD, J-1 )
-                     SUMJ = SDOT( JLEN, AB( KD+1-JLEN, J ), 1,
-     $                      X( J-JLEN ), 1 )
-                  ELSE
-                     JLEN = MIN( KD, N-J )
-                     IF( JLEN.GT.0 )
-     $                  SUMJ = SDOT( JLEN, AB( 2, J ), 1, X( J+1 ), 1 )
-                  END IF
-               ELSE
-*
-*                 Otherwise, use in-line code for the dot product.
-*
-                  IF( UPPER ) THEN
-                     JLEN = MIN( KD, J-1 )
-                     DO 110 I = 1, JLEN
-                        SUMJ = SUMJ + ( AB( KD+I-JLEN, J )*USCAL )*
-     $                         X( J-JLEN-1+I )
-  110                CONTINUE
-                  ELSE
-                     JLEN = MIN( KD, N-J )
-                     DO 120 I = 1, JLEN
-                        SUMJ = SUMJ + ( AB( I+1, J )*USCAL )*X( J+I )
-  120                CONTINUE
-                  END IF
-               END IF
-*
-               IF( USCAL.EQ.TSCAL ) THEN
-*
-*                 Compute x(j) := ( x(j) - sumj ) / A(j,j) if 1/A(j,j)
-*                 was not used to scale the dotproduct.
-*
-                  X( J ) = X( J ) - SUMJ
-                  XJ = ABS( X( J ) )
-                  IF( NOUNIT ) THEN
-*
-*                    Compute x(j) = x(j) / A(j,j), scaling if necessary.
-*
-                     TJJS = AB( MAIND, J )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                     IF( TSCAL.EQ.ONE )
-     $                  GO TO 135
-                  END IF
-                     TJJ = ABS( TJJS )
-                     IF( TJJ.GT.SMLNUM ) THEN
-*
-*                       abs(A(j,j)) > SMLNUM:
-*
-                        IF( TJJ.LT.ONE ) THEN
-                           IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                             Scale X by 1/abs(x(j)).
-*
-                              REC = ONE / XJ
-                              CALL SSCAL( N, REC, X, 1 )
-                              SCALE = SCALE*REC
-                              XMAX = XMAX*REC
-                           END IF
-                        END IF
-                        X( J ) = X( J ) / TJJS
-                     ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                       0 < abs(A(j,j)) <= SMLNUM:
-*
-                        IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM.
-*
-                           REC = ( TJJ*BIGNUM ) / XJ
-                           CALL SSCAL( N, REC, X, 1 )
-                           SCALE = SCALE*REC
-                           XMAX = XMAX*REC
-                        END IF
-                        X( J ) = X( J ) / TJJS
-                     ELSE
-*
-*                       A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                       scale = 0, and compute a solution to A'*x = 0.
-*
-                        DO 130 I = 1, N
-                           X( I ) = ZERO
-  130                   CONTINUE
-                        X( J ) = ONE
-                        SCALE = ZERO
-                        XMAX = ZERO
-                     END IF
-  135             CONTINUE
-               ELSE
-*
-*                 Compute x(j) := x(j) / A(j,j) - sumj if the dot
-*                 product has already been divided by 1/A(j,j).
-*
-                  X( J ) = X( J ) / TJJS - SUMJ
-               END IF
-               XMAX = MAX( XMAX, ABS( X( J ) ) )
-  140       CONTINUE
-         END IF
-         SCALE = SCALE / TSCAL
-      END IF
-*
-*     Scale the column norms by 1/TSCAL for return.
-*
-      IF( TSCAL.NE.ONE ) THEN
-         CALL SSCAL( N, ONE / TSCAL, CNORM, 1 )
-      END IF
-*
-      RETURN
-*
-*     End of SLATBS
-*
-      END
--- a/libcruft/lapack/slatrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,258 +0,0 @@
-      SUBROUTINE SLATRD( UPLO, N, NB, A, LDA, E, TAU, W, LDW )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            LDA, LDW, N, NB
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), E( * ), TAU( * ), W( LDW, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLATRD reduces NB rows and columns of a real symmetric matrix A to
-*  symmetric tridiagonal form by an orthogonal similarity
-*  transformation Q' * A * Q, and returns the matrices V and W which are
-*  needed to apply the transformation to the unreduced part of A.
-*
-*  If UPLO = 'U', SLATRD reduces the last NB rows and columns of a
-*  matrix, of which the upper triangle is supplied;
-*  if UPLO = 'L', SLATRD reduces the first NB rows and columns of a
-*  matrix, of which the lower triangle is supplied.
-*
-*  This is an auxiliary routine called by SSYTRD.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          symmetric matrix A is stored:
-*          = 'U': Upper triangular
-*          = 'L': Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  NB      (input) INTEGER
-*          The number of rows and columns to be reduced.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the leading
-*          n-by-n upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n-by-n lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*          On exit:
-*          if UPLO = 'U', the last NB columns have been reduced to
-*            tridiagonal form, with the diagonal elements overwriting
-*            the diagonal elements of A; the elements above the diagonal
-*            with the array TAU, represent the orthogonal matrix Q as a
-*            product of elementary reflectors;
-*          if UPLO = 'L', the first NB columns have been reduced to
-*            tridiagonal form, with the diagonal elements overwriting
-*            the diagonal elements of A; the elements below the diagonal
-*            with the array TAU, represent the  orthogonal matrix Q as a
-*            product of elementary reflectors.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= (1,N).
-*
-*  E       (output) REAL array, dimension (N-1)
-*          If UPLO = 'U', E(n-nb:n-1) contains the superdiagonal
-*          elements of the last NB columns of the reduced matrix;
-*          if UPLO = 'L', E(1:nb) contains the subdiagonal elements of
-*          the first NB columns of the reduced matrix.
-*
-*  TAU     (output) REAL array, dimension (N-1)
-*          The scalar factors of the elementary reflectors, stored in
-*          TAU(n-nb:n-1) if UPLO = 'U', and in TAU(1:nb) if UPLO = 'L'.
-*          See Further Details.
-*
-*  W       (output) REAL array, dimension (LDW,NB)
-*          The n-by-nb matrix W required to update the unreduced part
-*          of A.
-*
-*  LDW     (input) INTEGER
-*          The leading dimension of the array W. LDW >= max(1,N).
-*
-*  Further Details
-*  ===============
-*
-*  If UPLO = 'U', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(n) H(n-1) . . . H(n-nb+1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i),
-*  and tau in TAU(i-1).
-*
-*  If UPLO = 'L', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(1) H(2) . . . H(nb).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i),
-*  and tau in TAU(i).
-*
-*  The elements of the vectors v together form the n-by-nb matrix V
-*  which is needed, with W, to apply the transformation to the unreduced
-*  part of the matrix, using a symmetric rank-2k update of the form:
-*  A := A - V*W' - W*V'.
-*
-*  The contents of A on exit are illustrated by the following examples
-*  with n = 5 and nb = 2:
-*
-*  if UPLO = 'U':                       if UPLO = 'L':
-*
-*    (  a   a   a   v4  v5 )              (  d                  )
-*    (      a   a   v4  v5 )              (  1   d              )
-*    (          a   1   v5 )              (  v1  1   a          )
-*    (              d   1  )              (  v1  v2  a   a      )
-*    (                  d  )              (  v1  v2  a   a   a  )
-*
-*  where d denotes a diagonal element of the reduced matrix, a denotes
-*  an element of the original matrix that is unchanged, and vi denotes
-*  an element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE, HALF
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0, HALF = 0.5E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, IW
-      REAL               ALPHA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SAXPY, SGEMV, SLARFG, SSCAL, SSYMV
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               SDOT
-      EXTERNAL           LSAME, SDOT
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-      IF( LSAME( UPLO, 'U' ) ) THEN
-*
-*        Reduce last NB columns of upper triangle
-*
-         DO 10 I = N, N - NB + 1, -1
-            IW = I - N + NB
-            IF( I.LT.N ) THEN
-*
-*              Update A(1:i,i)
-*
-               CALL SGEMV( 'No transpose', I, N-I, -ONE, A( 1, I+1 ),
-     $                     LDA, W( I, IW+1 ), LDW, ONE, A( 1, I ), 1 )
-               CALL SGEMV( 'No transpose', I, N-I, -ONE, W( 1, IW+1 ),
-     $                     LDW, A( I, I+1 ), LDA, ONE, A( 1, I ), 1 )
-            END IF
-            IF( I.GT.1 ) THEN
-*
-*              Generate elementary reflector H(i) to annihilate
-*              A(1:i-2,i)
-*
-               CALL SLARFG( I-1, A( I-1, I ), A( 1, I ), 1, TAU( I-1 ) )
-               E( I-1 ) = A( I-1, I )
-               A( I-1, I ) = ONE
-*
-*              Compute W(1:i-1,i)
-*
-               CALL SSYMV( 'Upper', I-1, ONE, A, LDA, A( 1, I ), 1,
-     $                     ZERO, W( 1, IW ), 1 )
-               IF( I.LT.N ) THEN
-                  CALL SGEMV( 'Transpose', I-1, N-I, ONE, W( 1, IW+1 ),
-     $                        LDW, A( 1, I ), 1, ZERO, W( I+1, IW ), 1 )
-                  CALL SGEMV( 'No transpose', I-1, N-I, -ONE,
-     $                        A( 1, I+1 ), LDA, W( I+1, IW ), 1, ONE,
-     $                        W( 1, IW ), 1 )
-                  CALL SGEMV( 'Transpose', I-1, N-I, ONE, A( 1, I+1 ),
-     $                        LDA, A( 1, I ), 1, ZERO, W( I+1, IW ), 1 )
-                  CALL SGEMV( 'No transpose', I-1, N-I, -ONE,
-     $                        W( 1, IW+1 ), LDW, W( I+1, IW ), 1, ONE,
-     $                        W( 1, IW ), 1 )
-               END IF
-               CALL SSCAL( I-1, TAU( I-1 ), W( 1, IW ), 1 )
-               ALPHA = -HALF*TAU( I-1 )*SDOT( I-1, W( 1, IW ), 1,
-     $                 A( 1, I ), 1 )
-               CALL SAXPY( I-1, ALPHA, A( 1, I ), 1, W( 1, IW ), 1 )
-            END IF
-*
-   10    CONTINUE
-      ELSE
-*
-*        Reduce first NB columns of lower triangle
-*
-         DO 20 I = 1, NB
-*
-*           Update A(i:n,i)
-*
-            CALL SGEMV( 'No transpose', N-I+1, I-1, -ONE, A( I, 1 ),
-     $                  LDA, W( I, 1 ), LDW, ONE, A( I, I ), 1 )
-            CALL SGEMV( 'No transpose', N-I+1, I-1, -ONE, W( I, 1 ),
-     $                  LDW, A( I, 1 ), LDA, ONE, A( I, I ), 1 )
-            IF( I.LT.N ) THEN
-*
-*              Generate elementary reflector H(i) to annihilate
-*              A(i+2:n,i)
-*
-               CALL SLARFG( N-I, A( I+1, I ), A( MIN( I+2, N ), I ), 1,
-     $                      TAU( I ) )
-               E( I ) = A( I+1, I )
-               A( I+1, I ) = ONE
-*
-*              Compute W(i+1:n,i)
-*
-               CALL SSYMV( 'Lower', N-I, ONE, A( I+1, I+1 ), LDA,
-     $                     A( I+1, I ), 1, ZERO, W( I+1, I ), 1 )
-               CALL SGEMV( 'Transpose', N-I, I-1, ONE, W( I+1, 1 ), LDW,
-     $                     A( I+1, I ), 1, ZERO, W( 1, I ), 1 )
-               CALL SGEMV( 'No transpose', N-I, I-1, -ONE, A( I+1, 1 ),
-     $                     LDA, W( 1, I ), 1, ONE, W( I+1, I ), 1 )
-               CALL SGEMV( 'Transpose', N-I, I-1, ONE, A( I+1, 1 ), LDA,
-     $                     A( I+1, I ), 1, ZERO, W( 1, I ), 1 )
-               CALL SGEMV( 'No transpose', N-I, I-1, -ONE, W( I+1, 1 ),
-     $                     LDW, W( 1, I ), 1, ONE, W( I+1, I ), 1 )
-               CALL SSCAL( N-I, TAU( I ), W( I+1, I ), 1 )
-               ALPHA = -HALF*TAU( I )*SDOT( N-I, W( I+1, I ), 1,
-     $                 A( I+1, I ), 1 )
-               CALL SAXPY( N-I, ALPHA, A( I+1, I ), 1, W( I+1, I ), 1 )
-            END IF
-*
-   20    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of SLATRD
-*
-      END
--- a/libcruft/lapack/slatrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,701 +0,0 @@
-      SUBROUTINE SLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
-     $                   CNORM, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, NORMIN, TRANS, UPLO
-      INTEGER            INFO, LDA, N
-      REAL               SCALE
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), CNORM( * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLATRS solves one of the triangular systems
-*
-*     A *x = s*b  or  A'*x = s*b
-*
-*  with scaling to prevent overflow.  Here A is an upper or lower
-*  triangular matrix, A' denotes the transpose of A, x and b are
-*  n-element vectors, and s is a scaling factor, usually less than
-*  or equal to 1, chosen so that the components of x will be less than
-*  the overflow threshold.  If the unscaled problem will not cause
-*  overflow, the Level 2 BLAS routine STRSV is called.  If the matrix A
-*  is singular (A(j,j) = 0 for some j), then s is set to 0 and a
-*  non-trivial solution to A*x = 0 is returned.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the matrix A is upper or lower triangular.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the operation applied to A.
-*          = 'N':  Solve A * x = s*b  (No transpose)
-*          = 'T':  Solve A'* x = s*b  (Transpose)
-*          = 'C':  Solve A'* x = s*b  (Conjugate transpose = Transpose)
-*
-*  DIAG    (input) CHARACTER*1
-*          Specifies whether or not the matrix A is unit triangular.
-*          = 'N':  Non-unit triangular
-*          = 'U':  Unit triangular
-*
-*  NORMIN  (input) CHARACTER*1
-*          Specifies whether CNORM has been set or not.
-*          = 'Y':  CNORM contains the column norms on entry
-*          = 'N':  CNORM is not set on entry.  On exit, the norms will
-*                  be computed and stored in CNORM.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input) REAL array, dimension (LDA,N)
-*          The triangular matrix A.  If UPLO = 'U', the leading n by n
-*          upper triangular part of the array A contains the upper
-*          triangular matrix, and the strictly lower triangular part of
-*          A is not referenced.  If UPLO = 'L', the leading n by n lower
-*          triangular part of the array A contains the lower triangular
-*          matrix, and the strictly upper triangular part of A is not
-*          referenced.  If DIAG = 'U', the diagonal elements of A are
-*          also not referenced and are assumed to be 1.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max (1,N).
-*
-*  X       (input/output) REAL array, dimension (N)
-*          On entry, the right hand side b of the triangular system.
-*          On exit, X is overwritten by the solution vector x.
-*
-*  SCALE   (output) REAL
-*          The scaling factor s for the triangular system
-*             A * x = s*b  or  A'* x = s*b.
-*          If SCALE = 0, the matrix A is singular or badly scaled, and
-*          the vector x is an exact or approximate solution to A*x = 0.
-*
-*  CNORM   (input or output) REAL array, dimension (N)
-*
-*          If NORMIN = 'Y', CNORM is an input argument and CNORM(j)
-*          contains the norm of the off-diagonal part of the j-th column
-*          of A.  If TRANS = 'N', CNORM(j) must be greater than or equal
-*          to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j)
-*          must be greater than or equal to the 1-norm.
-*
-*          If NORMIN = 'N', CNORM is an output argument and CNORM(j)
-*          returns the 1-norm of the offdiagonal part of the j-th column
-*          of A.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -k, the k-th argument had an illegal value
-*
-*  Further Details
-*  ======= =======
-*
-*  A rough bound on x is computed; if that is less than overflow, STRSV
-*  is called, otherwise, specific code is used which checks for possible
-*  overflow or divide-by-zero at every operation.
-*
-*  A columnwise scheme is used for solving A*x = b.  The basic algorithm
-*  if A is lower triangular is
-*
-*       x[1:n] := b[1:n]
-*       for j = 1, ..., n
-*            x(j) := x(j) / A(j,j)
-*            x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j]
-*       end
-*
-*  Define bounds on the components of x after j iterations of the loop:
-*     M(j) = bound on x[1:j]
-*     G(j) = bound on x[j+1:n]
-*  Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}.
-*
-*  Then for iteration j+1 we have
-*     M(j+1) <= G(j) / | A(j+1,j+1) |
-*     G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] |
-*            <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | )
-*
-*  where CNORM(j+1) is greater than or equal to the infinity-norm of
-*  column j+1 of A, not counting the diagonal.  Hence
-*
-*     G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | )
-*                  1<=i<=j
-*  and
-*
-*     |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| )
-*                                   1<=i< j
-*
-*  Since |x(j)| <= M(j), we use the Level 2 BLAS routine STRSV if the
-*  reciprocal of the largest M(j), j=1,..,n, is larger than
-*  max(underflow, 1/overflow).
-*
-*  The bound on x(j) is also used to determine when a step in the
-*  columnwise method can be performed without fear of overflow.  If
-*  the computed bound is greater than a large constant, x is scaled to
-*  prevent overflow, but if the bound overflows, x is set to 0, x(j) to
-*  1, and scale to 0, and a non-trivial solution to A*x = 0 is found.
-*
-*  Similarly, a row-wise scheme is used to solve A'*x = b.  The basic
-*  algorithm for A upper triangular is
-*
-*       for j = 1, ..., n
-*            x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j)
-*       end
-*
-*  We simultaneously compute two bounds
-*       G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j
-*       M(j) = bound on x(i), 1<=i<=j
-*
-*  The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we
-*  add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1.
-*  Then the bound on x(j) is
-*
-*       M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) |
-*
-*            <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| )
-*                      1<=i<=j
-*
-*  and we can safely call STRSV if 1/M(n) and 1/G(n) are both greater
-*  than max(underflow, 1/overflow).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, HALF, ONE
-      PARAMETER          ( ZERO = 0.0E+0, HALF = 0.5E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOTRAN, NOUNIT, UPPER
-      INTEGER            I, IMAX, J, JFIRST, JINC, JLAST
-      REAL               BIGNUM, GROW, REC, SMLNUM, SUMJ, TJJ, TJJS,
-     $                   TMAX, TSCAL, USCAL, XBND, XJ, XMAX
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ISAMAX
-      REAL               SASUM, SDOT, SLAMCH
-      EXTERNAL           LSAME, ISAMAX, SASUM, SDOT, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SAXPY, SSCAL, STRSV, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      NOUNIT = LSAME( DIAG, 'N' )
-*
-*     Test the input parameters.
-*
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
-     $         LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -3
-      ELSE IF( .NOT.LSAME( NORMIN, 'Y' ) .AND. .NOT.
-     $         LSAME( NORMIN, 'N' ) ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLATRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine machine dependent parameters to control overflow.
-*
-      SMLNUM = SLAMCH( 'Safe minimum' ) / SLAMCH( 'Precision' )
-      BIGNUM = ONE / SMLNUM
-      SCALE = ONE
-*
-      IF( LSAME( NORMIN, 'N' ) ) THEN
-*
-*        Compute the 1-norm of each column, not including the diagonal.
-*
-         IF( UPPER ) THEN
-*
-*           A is upper triangular.
-*
-            DO 10 J = 1, N
-               CNORM( J ) = SASUM( J-1, A( 1, J ), 1 )
-   10       CONTINUE
-         ELSE
-*
-*           A is lower triangular.
-*
-            DO 20 J = 1, N - 1
-               CNORM( J ) = SASUM( N-J, A( J+1, J ), 1 )
-   20       CONTINUE
-            CNORM( N ) = ZERO
-         END IF
-      END IF
-*
-*     Scale the column norms by TSCAL if the maximum element in CNORM is
-*     greater than BIGNUM.
-*
-      IMAX = ISAMAX( N, CNORM, 1 )
-      TMAX = CNORM( IMAX )
-      IF( TMAX.LE.BIGNUM ) THEN
-         TSCAL = ONE
-      ELSE
-         TSCAL = ONE / ( SMLNUM*TMAX )
-         CALL SSCAL( N, TSCAL, CNORM, 1 )
-      END IF
-*
-*     Compute a bound on the computed solution vector to see if the
-*     Level 2 BLAS routine STRSV can be used.
-*
-      J = ISAMAX( N, X, 1 )
-      XMAX = ABS( X( J ) )
-      XBND = XMAX
-      IF( NOTRAN ) THEN
-*
-*        Compute the growth in A * x = b.
-*
-         IF( UPPER ) THEN
-            JFIRST = N
-            JLAST = 1
-            JINC = -1
-         ELSE
-            JFIRST = 1
-            JLAST = N
-            JINC = 1
-         END IF
-*
-         IF( TSCAL.NE.ONE ) THEN
-            GROW = ZERO
-            GO TO 50
-         END IF
-*
-         IF( NOUNIT ) THEN
-*
-*           A is non-unit triangular.
-*
-*           Compute GROW = 1/G(j) and XBND = 1/M(j).
-*           Initially, G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = ONE / MAX( XBND, SMLNUM )
-            XBND = GROW
-            DO 30 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 50
-*
-*              M(j) = G(j-1) / abs(A(j,j))
-*
-               TJJ = ABS( A( J, J ) )
-               XBND = MIN( XBND, MIN( ONE, TJJ )*GROW )
-               IF( TJJ+CNORM( J ).GE.SMLNUM ) THEN
-*
-*                 G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) )
-*
-                  GROW = GROW*( TJJ / ( TJJ+CNORM( J ) ) )
-               ELSE
-*
-*                 G(j) could overflow, set GROW to 0.
-*
-                  GROW = ZERO
-               END IF
-   30       CONTINUE
-            GROW = XBND
-         ELSE
-*
-*           A is unit triangular.
-*
-*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) )
-            DO 40 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 50
-*
-*              G(j) = G(j-1)*( 1 + CNORM(j) )
-*
-               GROW = GROW*( ONE / ( ONE+CNORM( J ) ) )
-   40       CONTINUE
-         END IF
-   50    CONTINUE
-*
-      ELSE
-*
-*        Compute the growth in A' * x = b.
-*
-         IF( UPPER ) THEN
-            JFIRST = 1
-            JLAST = N
-            JINC = 1
-         ELSE
-            JFIRST = N
-            JLAST = 1
-            JINC = -1
-         END IF
-*
-         IF( TSCAL.NE.ONE ) THEN
-            GROW = ZERO
-            GO TO 80
-         END IF
-*
-         IF( NOUNIT ) THEN
-*
-*           A is non-unit triangular.
-*
-*           Compute GROW = 1/G(j) and XBND = 1/M(j).
-*           Initially, M(0) = max{x(i), i=1,...,n}.
-*
-            GROW = ONE / MAX( XBND, SMLNUM )
-            XBND = GROW
-            DO 60 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 80
-*
-*              G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) )
-*
-               XJ = ONE + CNORM( J )
-               GROW = MIN( GROW, XBND / XJ )
-*
-*              M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j))
-*
-               TJJ = ABS( A( J, J ) )
-               IF( XJ.GT.TJJ )
-     $            XBND = XBND*( TJJ / XJ )
-   60       CONTINUE
-            GROW = MIN( GROW, XBND )
-         ELSE
-*
-*           A is unit triangular.
-*
-*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) )
-            DO 70 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 80
-*
-*              G(j) = ( 1 + CNORM(j) )*G(j-1)
-*
-               XJ = ONE + CNORM( J )
-               GROW = GROW / XJ
-   70       CONTINUE
-         END IF
-   80    CONTINUE
-      END IF
-*
-      IF( ( GROW*TSCAL ).GT.SMLNUM ) THEN
-*
-*        Use the Level 2 BLAS solve if the reciprocal of the bound on
-*        elements of X is not too small.
-*
-         CALL STRSV( UPLO, TRANS, DIAG, N, A, LDA, X, 1 )
-      ELSE
-*
-*        Use a Level 1 BLAS solve, scaling intermediate results.
-*
-         IF( XMAX.GT.BIGNUM ) THEN
-*
-*           Scale X so that its components are less than or equal to
-*           BIGNUM in absolute value.
-*
-            SCALE = BIGNUM / XMAX
-            CALL SSCAL( N, SCALE, X, 1 )
-            XMAX = BIGNUM
-         END IF
-*
-         IF( NOTRAN ) THEN
-*
-*           Solve A * x = b
-*
-            DO 100 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) / A(j,j), scaling x if necessary.
-*
-               XJ = ABS( X( J ) )
-               IF( NOUNIT ) THEN
-                  TJJS = A( J, J )*TSCAL
-               ELSE
-                  TJJS = TSCAL
-                  IF( TSCAL.EQ.ONE )
-     $               GO TO 95
-               END IF
-                  TJJ = ABS( TJJS )
-                  IF( TJJ.GT.SMLNUM ) THEN
-*
-*                    abs(A(j,j)) > SMLNUM:
-*
-                     IF( TJJ.LT.ONE ) THEN
-                        IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by 1/b(j).
-*
-                           REC = ONE / XJ
-                           CALL SSCAL( N, REC, X, 1 )
-                           SCALE = SCALE*REC
-                           XMAX = XMAX*REC
-                        END IF
-                     END IF
-                     X( J ) = X( J ) / TJJS
-                     XJ = ABS( X( J ) )
-                  ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                    0 < abs(A(j,j)) <= SMLNUM:
-*
-                     IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                       Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM
-*                       to avoid overflow when dividing by A(j,j).
-*
-                        REC = ( TJJ*BIGNUM ) / XJ
-                        IF( CNORM( J ).GT.ONE ) THEN
-*
-*                          Scale by 1/CNORM(j) to avoid overflow when
-*                          multiplying x(j) times column j.
-*
-                           REC = REC / CNORM( J )
-                        END IF
-                        CALL SSCAL( N, REC, X, 1 )
-                        SCALE = SCALE*REC
-                        XMAX = XMAX*REC
-                     END IF
-                     X( J ) = X( J ) / TJJS
-                     XJ = ABS( X( J ) )
-                  ELSE
-*
-*                    A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                    scale = 0, and compute a solution to A*x = 0.
-*
-                     DO 90 I = 1, N
-                        X( I ) = ZERO
-   90                CONTINUE
-                     X( J ) = ONE
-                     XJ = ONE
-                     SCALE = ZERO
-                     XMAX = ZERO
-                  END IF
-   95          CONTINUE
-*
-*              Scale x if necessary to avoid overflow when adding a
-*              multiple of column j of A.
-*
-               IF( XJ.GT.ONE ) THEN
-                  REC = ONE / XJ
-                  IF( CNORM( J ).GT.( BIGNUM-XMAX )*REC ) THEN
-*
-*                    Scale x by 1/(2*abs(x(j))).
-*
-                     REC = REC*HALF
-                     CALL SSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                  END IF
-               ELSE IF( XJ*CNORM( J ).GT.( BIGNUM-XMAX ) ) THEN
-*
-*                 Scale x by 1/2.
-*
-                  CALL SSCAL( N, HALF, X, 1 )
-                  SCALE = SCALE*HALF
-               END IF
-*
-               IF( UPPER ) THEN
-                  IF( J.GT.1 ) THEN
-*
-*                    Compute the update
-*                       x(1:j-1) := x(1:j-1) - x(j) * A(1:j-1,j)
-*
-                     CALL SAXPY( J-1, -X( J )*TSCAL, A( 1, J ), 1, X,
-     $                           1 )
-                     I = ISAMAX( J-1, X, 1 )
-                     XMAX = ABS( X( I ) )
-                  END IF
-               ELSE
-                  IF( J.LT.N ) THEN
-*
-*                    Compute the update
-*                       x(j+1:n) := x(j+1:n) - x(j) * A(j+1:n,j)
-*
-                     CALL SAXPY( N-J, -X( J )*TSCAL, A( J+1, J ), 1,
-     $                           X( J+1 ), 1 )
-                     I = J + ISAMAX( N-J, X( J+1 ), 1 )
-                     XMAX = ABS( X( I ) )
-                  END IF
-               END IF
-  100       CONTINUE
-*
-         ELSE
-*
-*           Solve A' * x = b
-*
-            DO 140 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) - sum A(k,j)*x(k).
-*                                    k<>j
-*
-               XJ = ABS( X( J ) )
-               USCAL = TSCAL
-               REC = ONE / MAX( XMAX, ONE )
-               IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN
-*
-*                 If x(j) could overflow, scale x by 1/(2*XMAX).
-*
-                  REC = REC*HALF
-                  IF( NOUNIT ) THEN
-                     TJJS = A( J, J )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                  END IF
-                     TJJ = ABS( TJJS )
-                     IF( TJJ.GT.ONE ) THEN
-*
-*                       Divide by A(j,j) when scaling x if A(j,j) > 1.
-*
-                        REC = MIN( ONE, REC*TJJ )
-                        USCAL = USCAL / TJJS
-                     END IF
-                  IF( REC.LT.ONE ) THEN
-                     CALL SSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                     XMAX = XMAX*REC
-                  END IF
-               END IF
-*
-               SUMJ = ZERO
-               IF( USCAL.EQ.ONE ) THEN
-*
-*                 If the scaling needed for A in the dot product is 1,
-*                 call SDOT to perform the dot product.
-*
-                  IF( UPPER ) THEN
-                     SUMJ = SDOT( J-1, A( 1, J ), 1, X, 1 )
-                  ELSE IF( J.LT.N ) THEN
-                     SUMJ = SDOT( N-J, A( J+1, J ), 1, X( J+1 ), 1 )
-                  END IF
-               ELSE
-*
-*                 Otherwise, use in-line code for the dot product.
-*
-                  IF( UPPER ) THEN
-                     DO 110 I = 1, J - 1
-                        SUMJ = SUMJ + ( A( I, J )*USCAL )*X( I )
-  110                CONTINUE
-                  ELSE IF( J.LT.N ) THEN
-                     DO 120 I = J + 1, N
-                        SUMJ = SUMJ + ( A( I, J )*USCAL )*X( I )
-  120                CONTINUE
-                  END IF
-               END IF
-*
-               IF( USCAL.EQ.TSCAL ) THEN
-*
-*                 Compute x(j) := ( x(j) - sumj ) / A(j,j) if 1/A(j,j)
-*                 was not used to scale the dotproduct.
-*
-                  X( J ) = X( J ) - SUMJ
-                  XJ = ABS( X( J ) )
-                  IF( NOUNIT ) THEN
-                     TJJS = A( J, J )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                     IF( TSCAL.EQ.ONE )
-     $                  GO TO 135
-                  END IF
-*
-*                    Compute x(j) = x(j) / A(j,j), scaling if necessary.
-*
-                     TJJ = ABS( TJJS )
-                     IF( TJJ.GT.SMLNUM ) THEN
-*
-*                       abs(A(j,j)) > SMLNUM:
-*
-                        IF( TJJ.LT.ONE ) THEN
-                           IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                             Scale X by 1/abs(x(j)).
-*
-                              REC = ONE / XJ
-                              CALL SSCAL( N, REC, X, 1 )
-                              SCALE = SCALE*REC
-                              XMAX = XMAX*REC
-                           END IF
-                        END IF
-                        X( J ) = X( J ) / TJJS
-                     ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                       0 < abs(A(j,j)) <= SMLNUM:
-*
-                        IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM.
-*
-                           REC = ( TJJ*BIGNUM ) / XJ
-                           CALL SSCAL( N, REC, X, 1 )
-                           SCALE = SCALE*REC
-                           XMAX = XMAX*REC
-                        END IF
-                        X( J ) = X( J ) / TJJS
-                     ELSE
-*
-*                       A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                       scale = 0, and compute a solution to A'*x = 0.
-*
-                        DO 130 I = 1, N
-                           X( I ) = ZERO
-  130                   CONTINUE
-                        X( J ) = ONE
-                        SCALE = ZERO
-                        XMAX = ZERO
-                     END IF
-  135             CONTINUE
-               ELSE
-*
-*                 Compute x(j) := x(j) / A(j,j)  - sumj if the dot
-*                 product has already been divided by 1/A(j,j).
-*
-                  X( J ) = X( J ) / TJJS - SUMJ
-               END IF
-               XMAX = MAX( XMAX, ABS( X( J ) ) )
-  140       CONTINUE
-         END IF
-         SCALE = SCALE / TSCAL
-      END IF
-*
-*     Scale the column norms by 1/TSCAL for return.
-*
-      IF( TSCAL.NE.ONE ) THEN
-         CALL SSCAL( N, ONE / TSCAL, CNORM, 1 )
-      END IF
-*
-      RETURN
-*
-*     End of SLATRS
-*
-      END
--- a/libcruft/lapack/slatrz.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,127 +0,0 @@
-      SUBROUTINE SLATRZ( M, N, L, A, LDA, TAU, WORK )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            L, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLATRZ factors the M-by-(M+L) real upper trapezoidal matrix
-*  [ A1 A2 ] = [ A(1:M,1:M) A(1:M,N-L+1:N) ] as ( R  0 ) * Z, by means
-*  of orthogonal transformations.  Z is an (M+L)-by-(M+L) orthogonal
-*  matrix and, R and A1 are M-by-M upper triangular matrices.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  L       (input) INTEGER
-*          The number of columns of the matrix A containing the
-*          meaningful part of the Householder vectors. N-M >= L >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the leading M-by-N upper trapezoidal part of the
-*          array A must contain the matrix to be factorized.
-*          On exit, the leading M-by-M upper triangular part of A
-*          contains the upper triangular matrix R, and elements N-L+1 to
-*          N of the first M rows of A, with the array TAU, represent the
-*          orthogonal matrix Z as a product of M elementary reflectors.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) REAL array, dimension (M)
-*          The scalar factors of the elementary reflectors.
-*
-*  WORK    (workspace) REAL array, dimension (M)
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  The factorization is obtained by Householder's method.  The kth
-*  transformation matrix, Z( k ), which is used to introduce zeros into
-*  the ( m - k + 1 )th row of A, is given in the form
-*
-*     Z( k ) = ( I     0   ),
-*              ( 0  T( k ) )
-*
-*  where
-*
-*     T( k ) = I - tau*u( k )*u( k )',   u( k ) = (   1    ),
-*                                                 (   0    )
-*                                                 ( z( k ) )
-*
-*  tau is a scalar and z( k ) is an l element vector. tau and z( k )
-*  are chosen to annihilate the elements of the kth row of A2.
-*
-*  The scalar tau is returned in the kth element of TAU and the vector
-*  u( k ) in the kth row of A2, such that the elements of z( k ) are
-*  in  a( k, l + 1 ), ..., a( k, n ). The elements of R are returned in
-*  the upper triangular part of A1.
-*
-*  Z is given by
-*
-*     Z =  Z( 1 ) * Z( 2 ) * ... * Z( m ).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARFG, SLARZ
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 ) THEN
-         RETURN
-      ELSE IF( M.EQ.N ) THEN
-         DO 10 I = 1, N
-            TAU( I ) = ZERO
-   10    CONTINUE
-         RETURN
-      END IF
-*
-      DO 20 I = M, 1, -1
-*
-*        Generate elementary reflector H(i) to annihilate
-*        [ A(i,i) A(i,n-l+1:n) ]
-*
-         CALL SLARFG( L+1, A( I, I ), A( I, N-L+1 ), LDA, TAU( I ) )
-*
-*        Apply H(i) to A(1:i-1,i:n) from the right
-*
-         CALL SLARZ( 'Right', I-1, N-I+1, L, A( I, N-L+1 ), LDA,
-     $               TAU( I ), A( 1, I ), LDA, WORK )
-*
-   20 CONTINUE
-*
-      RETURN
-*
-*     End of SLATRZ
-*
-      END
--- a/libcruft/lapack/slauu2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,135 +0,0 @@
-      SUBROUTINE SLAUU2( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAUU2 computes the product U * U' or L' * L, where the triangular
-*  factor U or L is stored in the upper or lower triangular part of
-*  the array A.
-*
-*  If UPLO = 'U' or 'u' then the upper triangle of the result is stored,
-*  overwriting the factor U in A.
-*  If UPLO = 'L' or 'l' then the lower triangle of the result is stored,
-*  overwriting the factor L in A.
-*
-*  This is the unblocked form of the algorithm, calling Level 2 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the triangular factor stored in the array A
-*          is upper or lower triangular:
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the triangular factor U or L.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the triangular factor U or L.
-*          On exit, if UPLO = 'U', the upper triangle of A is
-*          overwritten with the upper triangle of the product U * U';
-*          if UPLO = 'L', the lower triangle of A is overwritten with
-*          the lower triangle of the product L' * L.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            I
-      REAL               AII
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               SDOT
-      EXTERNAL           LSAME, SDOT
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEMV, SSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLAUU2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Compute the product U * U'.
-*
-         DO 10 I = 1, N
-            AII = A( I, I )
-            IF( I.LT.N ) THEN
-               A( I, I ) = SDOT( N-I+1, A( I, I ), LDA, A( I, I ), LDA )
-               CALL SGEMV( 'No transpose', I-1, N-I, ONE, A( 1, I+1 ),
-     $                     LDA, A( I, I+1 ), LDA, AII, A( 1, I ), 1 )
-            ELSE
-               CALL SSCAL( I, AII, A( 1, I ), 1 )
-            END IF
-   10    CONTINUE
-*
-      ELSE
-*
-*        Compute the product L' * L.
-*
-         DO 20 I = 1, N
-            AII = A( I, I )
-            IF( I.LT.N ) THEN
-               A( I, I ) = SDOT( N-I+1, A( I, I ), 1, A( I, I ), 1 )
-               CALL SGEMV( 'Transpose', N-I, I-1, ONE, A( I+1, 1 ), LDA,
-     $                     A( I+1, I ), 1, AII, A( I, 1 ), LDA )
-            ELSE
-               CALL SSCAL( I, AII, A( I, 1 ), LDA )
-            END IF
-   20    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of SLAUU2
-*
-      END
--- a/libcruft/lapack/slauum.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,155 +0,0 @@
-      SUBROUTINE SLAUUM( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAUUM computes the product U * U' or L' * L, where the triangular
-*  factor U or L is stored in the upper or lower triangular part of
-*  the array A.
-*
-*  If UPLO = 'U' or 'u' then the upper triangle of the result is stored,
-*  overwriting the factor U in A.
-*  If UPLO = 'L' or 'l' then the lower triangle of the result is stored,
-*  overwriting the factor L in A.
-*
-*  This is the blocked form of the algorithm, calling Level 3 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the triangular factor stored in the array A
-*          is upper or lower triangular:
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the triangular factor U or L.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the triangular factor U or L.
-*          On exit, if UPLO = 'U', the upper triangle of A is
-*          overwritten with the upper triangle of the product U * U';
-*          if UPLO = 'L', the lower triangle of A is overwritten with
-*          the lower triangle of the product L' * L.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            I, IB, NB
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEMM, SLAUU2, SSYRK, STRMM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SLAUUM', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'SLAUUM', UPLO, N, -1, -1, -1 )
-*
-      IF( NB.LE.1 .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code
-*
-         CALL SLAUU2( UPLO, N, A, LDA, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( UPPER ) THEN
-*
-*           Compute the product U * U'.
-*
-            DO 10 I = 1, N, NB
-               IB = MIN( NB, N-I+1 )
-               CALL STRMM( 'Right', 'Upper', 'Transpose', 'Non-unit',
-     $                     I-1, IB, ONE, A( I, I ), LDA, A( 1, I ),
-     $                     LDA )
-               CALL SLAUU2( 'Upper', IB, A( I, I ), LDA, INFO )
-               IF( I+IB.LE.N ) THEN
-                  CALL SGEMM( 'No transpose', 'Transpose', I-1, IB,
-     $                        N-I-IB+1, ONE, A( 1, I+IB ), LDA,
-     $                        A( I, I+IB ), LDA, ONE, A( 1, I ), LDA )
-                  CALL SSYRK( 'Upper', 'No transpose', IB, N-I-IB+1,
-     $                        ONE, A( I, I+IB ), LDA, ONE, A( I, I ),
-     $                        LDA )
-               END IF
-   10       CONTINUE
-         ELSE
-*
-*           Compute the product L' * L.
-*
-            DO 20 I = 1, N, NB
-               IB = MIN( NB, N-I+1 )
-               CALL STRMM( 'Left', 'Lower', 'Transpose', 'Non-unit', IB,
-     $                     I-1, ONE, A( I, I ), LDA, A( I, 1 ), LDA )
-               CALL SLAUU2( 'Lower', IB, A( I, I ), LDA, INFO )
-               IF( I+IB.LE.N ) THEN
-                  CALL SGEMM( 'Transpose', 'No transpose', IB, I-1,
-     $                        N-I-IB+1, ONE, A( I+IB, I ), LDA,
-     $                        A( I+IB, 1 ), LDA, ONE, A( I, 1 ), LDA )
-                  CALL SSYRK( 'Lower', 'Transpose', IB, N-I-IB+1, ONE,
-     $                        A( I+IB, I ), LDA, ONE, A( I, I ), LDA )
-               END IF
-   20       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of SLAUUM
-*
-      END
--- a/libcruft/lapack/slazq3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,302 +0,0 @@
-      SUBROUTINE SLAZQ3( I0, N0, Z, PP, DMIN, SIGMA, DESIG, QMAX, NFAIL,
-     $                   ITER, NDIV, IEEE, TTYPE, DMIN1, DMIN2, DN, DN1,
-     $                   DN2, TAU )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      LOGICAL            IEEE
-      INTEGER            I0, ITER, N0, NDIV, NFAIL, PP, TTYPE
-      REAL               DESIG, DMIN, DMIN1, DMIN2, DN, DN1, DN2, QMAX,
-     $                   SIGMA, TAU
-*     ..
-*     .. Array Arguments ..
-      REAL               Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAZQ3 checks for deflation, computes a shift (TAU) and calls dqds.
-*  In case of failure it changes shifts, and tries again until output
-*  is positive.
-*
-*  Arguments
-*  =========
-*
-*  I0     (input) INTEGER
-*         First index.
-*
-*  N0     (input) INTEGER
-*         Last index.
-*
-*  Z      (input) REAL array, dimension ( 4*N )
-*         Z holds the qd array.
-*
-*  PP     (input) INTEGER
-*         PP=0 for ping, PP=1 for pong.
-*
-*  DMIN   (output) REAL
-*         Minimum value of d.
-*
-*  SIGMA  (output) REAL
-*         Sum of shifts used in current segment.
-*
-*  DESIG  (input/output) REAL
-*         Lower order part of SIGMA
-*
-*  QMAX   (input) REAL
-*         Maximum value of q.
-*
-*  NFAIL  (output) INTEGER
-*         Number of times shift was too big.
-*
-*  ITER   (output) INTEGER
-*         Number of iterations.
-*
-*  NDIV   (output) INTEGER
-*         Number of divisions.
-*
-*  IEEE   (input) LOGICAL
-*         Flag for IEEE or non IEEE arithmetic (passed to SLASQ5).
-*
-*  TTYPE  (input/output) INTEGER
-*         Shift type.  TTYPE is passed as an argument in order to save
-*         its value between calls to SLAZQ3
-*
-*  DMIN1  (input/output) REAL
-*  DMIN2  (input/output) REAL
-*  DN     (input/output) REAL
-*  DN1    (input/output) REAL
-*  DN2    (input/output) REAL
-*  TAU    (input/output) REAL
-*         These are passed as arguments in order to save their values
-*         between calls to SLAZQ3
-*
-*  This is a thread safe version of SLASQ3, which passes TTYPE, DMIN1,
-*  DMIN2, DN, DN1. DN2 and TAU through the argument list in place of
-*  declaring them in a SAVE statment.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               CBIAS
-      PARAMETER          ( CBIAS = 1.50E0 )
-      REAL               ZERO, QURTR, HALF, ONE, TWO, HUNDRD
-      PARAMETER          ( ZERO = 0.0E0, QURTR = 0.250E0, HALF = 0.5E0,
-     $                     ONE = 1.0E0, TWO = 2.0E0, HUNDRD = 100.0E0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            IPN4, J4, N0IN, NN
-      REAL               EPS, G, S, SAFMIN, T, TEMP, TOL, TOL2
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLASQ5, SLASQ6, SLAZQ4
-*     ..
-*     .. External Function ..
-      REAL               SLAMCH
-      EXTERNAL           SLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      N0IN   = N0
-      EPS    = SLAMCH( 'Precision' )
-      SAFMIN = SLAMCH( 'Safe minimum' )
-      TOL    = EPS*HUNDRD
-      TOL2   = TOL**2
-      G      = ZERO
-*
-*     Check for deflation.
-*
-   10 CONTINUE
-*
-      IF( N0.LT.I0 )
-     $   RETURN
-      IF( N0.EQ.I0 )
-     $   GO TO 20
-      NN = 4*N0 + PP
-      IF( N0.EQ.( I0+1 ) )
-     $   GO TO 40
-*
-*     Check whether E(N0-1) is negligible, 1 eigenvalue.
-*
-      IF( Z( NN-5 ).GT.TOL2*( SIGMA+Z( NN-3 ) ) .AND.
-     $    Z( NN-2*PP-4 ).GT.TOL2*Z( NN-7 ) )
-     $   GO TO 30
-*
-   20 CONTINUE
-*
-      Z( 4*N0-3 ) = Z( 4*N0+PP-3 ) + SIGMA
-      N0 = N0 - 1
-      GO TO 10
-*
-*     Check  whether E(N0-2) is negligible, 2 eigenvalues.
-*
-   30 CONTINUE
-*
-      IF( Z( NN-9 ).GT.TOL2*SIGMA .AND.
-     $    Z( NN-2*PP-8 ).GT.TOL2*Z( NN-11 ) )
-     $   GO TO 50
-*
-   40 CONTINUE
-*
-      IF( Z( NN-3 ).GT.Z( NN-7 ) ) THEN
-         S = Z( NN-3 )
-         Z( NN-3 ) = Z( NN-7 )
-         Z( NN-7 ) = S
-      END IF
-      IF( Z( NN-5 ).GT.Z( NN-3 )*TOL2 ) THEN
-         T = HALF*( ( Z( NN-7 )-Z( NN-3 ) )+Z( NN-5 ) )
-         S = Z( NN-3 )*( Z( NN-5 ) / T )
-         IF( S.LE.T ) THEN
-            S = Z( NN-3 )*( Z( NN-5 ) /
-     $          ( T*( ONE+SQRT( ONE+S / T ) ) ) )
-         ELSE
-            S = Z( NN-3 )*( Z( NN-5 ) / ( T+SQRT( T )*SQRT( T+S ) ) )
-         END IF
-         T = Z( NN-7 ) + ( S+Z( NN-5 ) )
-         Z( NN-3 ) = Z( NN-3 )*( Z( NN-7 ) / T )
-         Z( NN-7 ) = T
-      END IF
-      Z( 4*N0-7 ) = Z( NN-7 ) + SIGMA
-      Z( 4*N0-3 ) = Z( NN-3 ) + SIGMA
-      N0 = N0 - 2
-      GO TO 10
-*
-   50 CONTINUE
-*
-*     Reverse the qd-array, if warranted.
-*
-      IF( DMIN.LE.ZERO .OR. N0.LT.N0IN ) THEN
-         IF( CBIAS*Z( 4*I0+PP-3 ).LT.Z( 4*N0+PP-3 ) ) THEN
-            IPN4 = 4*( I0+N0 )
-            DO 60 J4 = 4*I0, 2*( I0+N0-1 ), 4
-               TEMP = Z( J4-3 )
-               Z( J4-3 ) = Z( IPN4-J4-3 )
-               Z( IPN4-J4-3 ) = TEMP
-               TEMP = Z( J4-2 )
-               Z( J4-2 ) = Z( IPN4-J4-2 )
-               Z( IPN4-J4-2 ) = TEMP
-               TEMP = Z( J4-1 )
-               Z( J4-1 ) = Z( IPN4-J4-5 )
-               Z( IPN4-J4-5 ) = TEMP
-               TEMP = Z( J4 )
-               Z( J4 ) = Z( IPN4-J4-4 )
-               Z( IPN4-J4-4 ) = TEMP
-   60       CONTINUE
-            IF( N0-I0.LE.4 ) THEN
-               Z( 4*N0+PP-1 ) = Z( 4*I0+PP-1 )
-               Z( 4*N0-PP ) = Z( 4*I0-PP )
-            END IF
-            DMIN2 = MIN( DMIN2, Z( 4*N0+PP-1 ) )
-            Z( 4*N0+PP-1 ) = MIN( Z( 4*N0+PP-1 ), Z( 4*I0+PP-1 ),
-     $                            Z( 4*I0+PP+3 ) )
-            Z( 4*N0-PP ) = MIN( Z( 4*N0-PP ), Z( 4*I0-PP ),
-     $                          Z( 4*I0-PP+4 ) )
-            QMAX = MAX( QMAX, Z( 4*I0+PP-3 ), Z( 4*I0+PP+1 ) )
-            DMIN = -ZERO
-         END IF
-      END IF
-*
-      IF( DMIN.LT.ZERO .OR. SAFMIN*QMAX.LT.MIN( Z( 4*N0+PP-1 ),
-     $    Z( 4*N0+PP-9 ), DMIN2+Z( 4*N0-PP ) ) ) THEN
-*
-*        Choose a shift.
-*
-         CALL SLAZQ4( I0, N0, Z, PP, N0IN, DMIN, DMIN1, DMIN2, DN, DN1,
-     $                DN2, TAU, TTYPE, G )
-*
-*        Call dqds until DMIN > 0.
-*
-   80    CONTINUE
-*
-         CALL SLASQ5( I0, N0, Z, PP, TAU, DMIN, DMIN1, DMIN2, DN,
-     $                DN1, DN2, IEEE )
-*
-         NDIV = NDIV + ( N0-I0+2 )
-         ITER = ITER + 1
-*
-*        Check status.
-*
-         IF( DMIN.GE.ZERO .AND. DMIN1.GT.ZERO ) THEN
-*
-*           Success.
-*
-            GO TO 100
-*
-         ELSE IF( DMIN.LT.ZERO .AND. DMIN1.GT.ZERO .AND.
-     $            Z( 4*( N0-1 )-PP ).LT.TOL*( SIGMA+DN1 ) .AND.
-     $            ABS( DN ).LT.TOL*SIGMA ) THEN
-*
-*           Convergence hidden by negative DN.
-*
-            Z( 4*( N0-1 )-PP+2 ) = ZERO
-            DMIN = ZERO
-            GO TO 100
-         ELSE IF( DMIN.LT.ZERO ) THEN
-*
-*           TAU too big. Select new TAU and try again.
-*
-            NFAIL = NFAIL + 1
-            IF( TTYPE.LT.-22 ) THEN
-*
-*              Failed twice. Play it safe.
-*
-               TAU = ZERO
-            ELSE IF( DMIN1.GT.ZERO ) THEN
-*
-*              Late failure. Gives excellent shift.
-*
-               TAU = ( TAU+DMIN )*( ONE-TWO*EPS )
-               TTYPE = TTYPE - 11
-            ELSE
-*
-*              Early failure. Divide by 4.
-*
-               TAU = QURTR*TAU
-               TTYPE = TTYPE - 12
-            END IF
-            GO TO 80
-         ELSE IF( DMIN.NE.DMIN ) THEN
-*
-*           NaN.
-*
-            TAU = ZERO
-            GO TO 80
-         ELSE
-*
-*           Possible underflow. Play it safe.
-*
-            GO TO 90
-         END IF
-      END IF
-*
-*     Risk of underflow.
-*
-   90 CONTINUE
-      CALL SLASQ6( I0, N0, Z, PP, DMIN, DMIN1, DMIN2, DN, DN1, DN2 )
-      NDIV = NDIV + ( N0-I0+2 )
-      ITER = ITER + 1
-      TAU = ZERO
-*
-  100 CONTINUE
-      IF( TAU.LT.SIGMA ) THEN
-         DESIG = DESIG + TAU
-         T = SIGMA + DESIG
-         DESIG = DESIG - ( T-SIGMA )
-      ELSE
-         T = SIGMA + TAU
-         DESIG = SIGMA - ( T-TAU ) + DESIG
-      END IF
-      SIGMA = T
-*
-      RETURN
-*
-*     End of SLAZQ3
-*
-      END
--- a/libcruft/lapack/slazq4.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,330 +0,0 @@
-      SUBROUTINE SLAZQ4( I0, N0, Z, PP, N0IN, DMIN, DMIN1, DMIN2, DN,
-     $                   DN1, DN2, TAU, TTYPE, G )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            I0, N0, N0IN, PP, TTYPE
-      REAL               DMIN, DMIN1, DMIN2, DN, DN1, DN2, G, TAU
-*     ..
-*     .. Array Arguments ..
-      REAL               Z( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SLAZQ4 computes an approximation TAU to the smallest eigenvalue 
-*  using values of d from the previous transform.
-*
-*  I0    (input) INTEGER
-*        First index.
-*
-*  N0    (input) INTEGER
-*        Last index.
-*
-*  Z     (input) REAL array, dimension ( 4*N )
-*        Z holds the qd array.
-*
-*  PP    (input) INTEGER
-*        PP=0 for ping, PP=1 for pong.
-*
-*  N0IN  (input) INTEGER
-*        The value of N0 at start of EIGTEST.
-*
-*  DMIN  (input) REAL
-*        Minimum value of d.
-*
-*  DMIN1 (input) REAL
-*        Minimum value of d, excluding D( N0 ).
-*
-*  DMIN2 (input) REAL
-*        Minimum value of d, excluding D( N0 ) and D( N0-1 ).
-*
-*  DN    (input) REAL
-*        d(N)
-*
-*  DN1   (input) REAL
-*        d(N-1)
-*
-*  DN2   (input) REAL
-*        d(N-2)
-*
-*  TAU   (output) REAL
-*        This is the shift.
-*
-*  TTYPE (output) INTEGER
-*        Shift type.
-*
-*  G     (input/output) REAL
-*        G is passed as an argument in order to save its value between
-*        calls to SLAZQ4
-*
-*  Further Details
-*  ===============
-*  CNST1 = 9/16
-*
-*  This is a thread safe version of SLASQ4, which passes G through the
-*  argument list in place of declaring G in a SAVE statment.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               CNST1, CNST2, CNST3
-      PARAMETER          ( CNST1 = 0.5630E0, CNST2 = 1.010E0,
-     $                   CNST3 = 1.050E0 )
-      REAL               QURTR, THIRD, HALF, ZERO, ONE, TWO, HUNDRD
-      PARAMETER          ( QURTR = 0.250E0, THIRD = 0.3330E0,
-     $                   HALF = 0.50E0, ZERO = 0.0E0, ONE = 1.0E0,
-     $                   TWO = 2.0E0, HUNDRD = 100.0E0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I4, NN, NP
-      REAL               A2, B1, B2, GAM, GAP1, GAP2, S
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     A negative DMIN forces the shift to take that absolute value
-*     TTYPE records the type of shift.
-*
-      IF( DMIN.LE.ZERO ) THEN
-         TAU = -DMIN
-         TTYPE = -1
-         RETURN
-      END IF
-*       
-      NN = 4*N0 + PP
-      IF( N0IN.EQ.N0 ) THEN
-*
-*        No eigenvalues deflated.
-*
-         IF( DMIN.EQ.DN .OR. DMIN.EQ.DN1 ) THEN
-*
-            B1 = SQRT( Z( NN-3 ) )*SQRT( Z( NN-5 ) )
-            B2 = SQRT( Z( NN-7 ) )*SQRT( Z( NN-9 ) )
-            A2 = Z( NN-7 ) + Z( NN-5 )
-*
-*           Cases 2 and 3.
-*
-            IF( DMIN.EQ.DN .AND. DMIN1.EQ.DN1 ) THEN
-               GAP2 = DMIN2 - A2 - DMIN2*QURTR
-               IF( GAP2.GT.ZERO .AND. GAP2.GT.B2 ) THEN
-                  GAP1 = A2 - DN - ( B2 / GAP2 )*B2
-               ELSE
-                  GAP1 = A2 - DN - ( B1+B2 )
-               END IF
-               IF( GAP1.GT.ZERO .AND. GAP1.GT.B1 ) THEN
-                  S = MAX( DN-( B1 / GAP1 )*B1, HALF*DMIN )
-                  TTYPE = -2
-               ELSE
-                  S = ZERO
-                  IF( DN.GT.B1 )
-     $               S = DN - B1
-                  IF( A2.GT.( B1+B2 ) )
-     $               S = MIN( S, A2-( B1+B2 ) )
-                  S = MAX( S, THIRD*DMIN )
-                  TTYPE = -3
-               END IF
-            ELSE
-*
-*              Case 4.
-*
-               TTYPE = -4
-               S = QURTR*DMIN
-               IF( DMIN.EQ.DN ) THEN
-                  GAM = DN
-                  A2 = ZERO
-                  IF( Z( NN-5 ) .GT. Z( NN-7 ) )
-     $               RETURN
-                  B2 = Z( NN-5 ) / Z( NN-7 )
-                  NP = NN - 9
-               ELSE
-                  NP = NN - 2*PP
-                  B2 = Z( NP-2 )
-                  GAM = DN1
-                  IF( Z( NP-4 ) .GT. Z( NP-2 ) )
-     $               RETURN
-                  A2 = Z( NP-4 ) / Z( NP-2 )
-                  IF( Z( NN-9 ) .GT. Z( NN-11 ) )
-     $               RETURN
-                  B2 = Z( NN-9 ) / Z( NN-11 )
-                  NP = NN - 13
-               END IF
-*
-*              Approximate contribution to norm squared from I < NN-1.
-*
-               A2 = A2 + B2
-               DO 10 I4 = NP, 4*I0 - 1 + PP, -4
-                  IF( B2.EQ.ZERO )
-     $               GO TO 20
-                  B1 = B2
-                  IF( Z( I4 ) .GT. Z( I4-2 ) )
-     $               RETURN
-                  B2 = B2*( Z( I4 ) / Z( I4-2 ) )
-                  A2 = A2 + B2
-                  IF( HUNDRD*MAX( B2, B1 ).LT.A2 .OR. CNST1.LT.A2 ) 
-     $               GO TO 20
-   10          CONTINUE
-   20          CONTINUE
-               A2 = CNST3*A2
-*
-*              Rayleigh quotient residual bound.
-*
-               IF( A2.LT.CNST1 )
-     $            S = GAM*( ONE-SQRT( A2 ) ) / ( ONE+A2 )
-            END IF
-         ELSE IF( DMIN.EQ.DN2 ) THEN
-*
-*           Case 5.
-*
-            TTYPE = -5
-            S = QURTR*DMIN
-*
-*           Compute contribution to norm squared from I > NN-2.
-*
-            NP = NN - 2*PP
-            B1 = Z( NP-2 )
-            B2 = Z( NP-6 )
-            GAM = DN2
-            IF( Z( NP-8 ).GT.B2 .OR. Z( NP-4 ).GT.B1 )
-     $         RETURN
-            A2 = ( Z( NP-8 ) / B2 )*( ONE+Z( NP-4 ) / B1 )
-*
-*           Approximate contribution to norm squared from I < NN-2.
-*
-            IF( N0-I0.GT.2 ) THEN
-               B2 = Z( NN-13 ) / Z( NN-15 )
-               A2 = A2 + B2
-               DO 30 I4 = NN - 17, 4*I0 - 1 + PP, -4
-                  IF( B2.EQ.ZERO )
-     $               GO TO 40
-                  B1 = B2
-                  IF( Z( I4 ) .GT. Z( I4-2 ) )
-     $               RETURN
-                  B2 = B2*( Z( I4 ) / Z( I4-2 ) )
-                  A2 = A2 + B2
-                  IF( HUNDRD*MAX( B2, B1 ).LT.A2 .OR. CNST1.LT.A2 ) 
-     $               GO TO 40
-   30          CONTINUE
-   40          CONTINUE
-               A2 = CNST3*A2
-            END IF
-*
-            IF( A2.LT.CNST1 )
-     $         S = GAM*( ONE-SQRT( A2 ) ) / ( ONE+A2 )
-         ELSE
-*
-*           Case 6, no information to guide us.
-*
-            IF( TTYPE.EQ.-6 ) THEN
-               G = G + THIRD*( ONE-G )
-            ELSE IF( TTYPE.EQ.-18 ) THEN
-               G = QURTR*THIRD
-            ELSE
-               G = QURTR
-            END IF
-            S = G*DMIN
-            TTYPE = -6
-         END IF
-*
-      ELSE IF( N0IN.EQ.( N0+1 ) ) THEN
-*
-*        One eigenvalue just deflated. Use DMIN1, DN1 for DMIN and DN.
-*
-         IF( DMIN1.EQ.DN1 .AND. DMIN2.EQ.DN2 ) THEN 
-*
-*           Cases 7 and 8.
-*
-            TTYPE = -7
-            S = THIRD*DMIN1
-            IF( Z( NN-5 ).GT.Z( NN-7 ) )
-     $         RETURN
-            B1 = Z( NN-5 ) / Z( NN-7 )
-            B2 = B1
-            IF( B2.EQ.ZERO )
-     $         GO TO 60
-            DO 50 I4 = 4*N0 - 9 + PP, 4*I0 - 1 + PP, -4
-               A2 = B1
-               IF( Z( I4 ).GT.Z( I4-2 ) )
-     $            RETURN
-               B1 = B1*( Z( I4 ) / Z( I4-2 ) )
-               B2 = B2 + B1
-               IF( HUNDRD*MAX( B1, A2 ).LT.B2 ) 
-     $            GO TO 60
-   50       CONTINUE
-   60       CONTINUE
-            B2 = SQRT( CNST3*B2 )
-            A2 = DMIN1 / ( ONE+B2**2 )
-            GAP2 = HALF*DMIN2 - A2
-            IF( GAP2.GT.ZERO .AND. GAP2.GT.B2*A2 ) THEN
-               S = MAX( S, A2*( ONE-CNST2*A2*( B2 / GAP2 )*B2 ) )
-            ELSE 
-               S = MAX( S, A2*( ONE-CNST2*B2 ) )
-               TTYPE = -8
-            END IF
-         ELSE
-*
-*           Case 9.
-*
-            S = QURTR*DMIN1
-            IF( DMIN1.EQ.DN1 )
-     $         S = HALF*DMIN1
-            TTYPE = -9
-         END IF
-*
-      ELSE IF( N0IN.EQ.( N0+2 ) ) THEN
-*
-*        Two eigenvalues deflated. Use DMIN2, DN2 for DMIN and DN.
-*
-*        Cases 10 and 11.
-*
-         IF( DMIN2.EQ.DN2 .AND. TWO*Z( NN-5 ).LT.Z( NN-7 ) ) THEN 
-            TTYPE = -10
-            S = THIRD*DMIN2
-            IF( Z( NN-5 ).GT.Z( NN-7 ) )
-     $         RETURN
-            B1 = Z( NN-5 ) / Z( NN-7 )
-            B2 = B1
-            IF( B2.EQ.ZERO )
-     $         GO TO 80
-            DO 70 I4 = 4*N0 - 9 + PP, 4*I0 - 1 + PP, -4
-               IF( Z( I4 ).GT.Z( I4-2 ) )
-     $            RETURN
-               B1 = B1*( Z( I4 ) / Z( I4-2 ) )
-               B2 = B2 + B1
-               IF( HUNDRD*B1.LT.B2 )
-     $            GO TO 80
-   70       CONTINUE
-   80       CONTINUE
-            B2 = SQRT( CNST3*B2 )
-            A2 = DMIN2 / ( ONE+B2**2 )
-            GAP2 = Z( NN-7 ) + Z( NN-9 ) -
-     $             SQRT( Z( NN-11 ) )*SQRT( Z( NN-9 ) ) - A2
-            IF( GAP2.GT.ZERO .AND. GAP2.GT.B2*A2 ) THEN
-               S = MAX( S, A2*( ONE-CNST2*A2*( B2 / GAP2 )*B2 ) )
-            ELSE 
-               S = MAX( S, A2*( ONE-CNST2*B2 ) )
-            END IF
-         ELSE
-            S = QURTR*DMIN2
-            TTYPE = -11
-         END IF
-      ELSE IF( N0IN.GT.( N0+2 ) ) THEN
-*
-*        Case 12, more than two eigenvalues deflated. No information.
-*
-         S = ZERO 
-         TTYPE = -12
-      END IF
-*
-      TAU = S
-      RETURN
-*
-*     End of SLAZQ4
-*
-      END
--- a/libcruft/lapack/sorg2l.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,127 +0,0 @@
-      SUBROUTINE SORG2L( M, N, K, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SORG2L generates an m by n real matrix Q with orthonormal columns,
-*  which is defined as the last n columns of a product of k elementary
-*  reflectors of order m
-*
-*        Q  =  H(k) . . . H(2) H(1)
-*
-*  as returned by SGEQLF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. M >= N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. N >= K >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the (n-k+i)-th column must contain the vector which
-*          defines the elementary reflector H(i), for i = 1,2,...,k, as
-*          returned by SGEQLF in the last k columns of its array
-*          argument A.
-*          On exit, the m by n matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) REAL array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by SGEQLF.
-*
-*  WORK    (workspace) REAL array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, II, J, L
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARF, SSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SORG2L', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-*     Initialise columns 1:n-k to columns of the unit matrix
-*
-      DO 20 J = 1, N - K
-         DO 10 L = 1, M
-            A( L, J ) = ZERO
-   10    CONTINUE
-         A( M-N+J, J ) = ONE
-   20 CONTINUE
-*
-      DO 40 I = 1, K
-         II = N - K + I
-*
-*        Apply H(i) to A(1:m-k+i,1:n-k+i) from the left
-*
-         A( M-N+II, II ) = ONE
-         CALL SLARF( 'Left', M-N+II, II-1, A( 1, II ), 1, TAU( I ), A,
-     $               LDA, WORK )
-         CALL SSCAL( M-N+II-1, -TAU( I ), A( 1, II ), 1 )
-         A( M-N+II, II ) = ONE - TAU( I )
-*
-*        Set A(m-k+i+1:m,n-k+i) to zero
-*
-         DO 30 L = M - N + II + 1, M
-            A( L, II ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-      RETURN
-*
-*     End of SORG2L
-*
-      END
--- a/libcruft/lapack/sorg2r.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,129 +0,0 @@
-      SUBROUTINE SORG2R( M, N, K, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SORG2R generates an m by n real matrix Q with orthonormal columns,
-*  which is defined as the first n columns of a product of k elementary
-*  reflectors of order m
-*
-*        Q  =  H(1) H(2) . . . H(k)
-*
-*  as returned by SGEQRF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. M >= N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. N >= K >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the i-th column must contain the vector which
-*          defines the elementary reflector H(i), for i = 1,2,...,k, as
-*          returned by SGEQRF in the first k columns of its array
-*          argument A.
-*          On exit, the m-by-n matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) REAL array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by SGEQRF.
-*
-*  WORK    (workspace) REAL array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J, L
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARF, SSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SORG2R', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-*     Initialise columns k+1:n to columns of the unit matrix
-*
-      DO 20 J = K + 1, N
-         DO 10 L = 1, M
-            A( L, J ) = ZERO
-   10    CONTINUE
-         A( J, J ) = ONE
-   20 CONTINUE
-*
-      DO 40 I = K, 1, -1
-*
-*        Apply H(i) to A(i:m,i:n) from the left
-*
-         IF( I.LT.N ) THEN
-            A( I, I ) = ONE
-            CALL SLARF( 'Left', M-I+1, N-I, A( I, I ), 1, TAU( I ),
-     $                  A( I, I+1 ), LDA, WORK )
-         END IF
-         IF( I.LT.M )
-     $      CALL SSCAL( M-I, -TAU( I ), A( I+1, I ), 1 )
-         A( I, I ) = ONE - TAU( I )
-*
-*        Set A(1:i-1,i) to zero
-*
-         DO 30 L = 1, I - 1
-            A( L, I ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-      RETURN
-*
-*     End of SORG2R
-*
-      END
--- a/libcruft/lapack/sorgbr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,244 +0,0 @@
-      SUBROUTINE SORGBR( VECT, M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          VECT
-      INTEGER            INFO, K, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SORGBR generates one of the real orthogonal matrices Q or P**T
-*  determined by SGEBRD when reducing a real matrix A to bidiagonal
-*  form: A = Q * B * P**T.  Q and P**T are defined as products of
-*  elementary reflectors H(i) or G(i) respectively.
-*
-*  If VECT = 'Q', A is assumed to have been an M-by-K matrix, and Q
-*  is of order M:
-*  if m >= k, Q = H(1) H(2) . . . H(k) and SORGBR returns the first n
-*  columns of Q, where m >= n >= k;
-*  if m < k, Q = H(1) H(2) . . . H(m-1) and SORGBR returns Q as an
-*  M-by-M matrix.
-*
-*  If VECT = 'P', A is assumed to have been a K-by-N matrix, and P**T
-*  is of order N:
-*  if k < n, P**T = G(k) . . . G(2) G(1) and SORGBR returns the first m
-*  rows of P**T, where n >= m >= k;
-*  if k >= n, P**T = G(n-1) . . . G(2) G(1) and SORGBR returns P**T as
-*  an N-by-N matrix.
-*
-*  Arguments
-*  =========
-*
-*  VECT    (input) CHARACTER*1
-*          Specifies whether the matrix Q or the matrix P**T is
-*          required, as defined in the transformation applied by SGEBRD:
-*          = 'Q':  generate Q;
-*          = 'P':  generate P**T.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q or P**T to be returned.
-*          M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q or P**T to be returned.
-*          N >= 0.
-*          If VECT = 'Q', M >= N >= min(M,K);
-*          if VECT = 'P', N >= M >= min(N,K).
-*
-*  K       (input) INTEGER
-*          If VECT = 'Q', the number of columns in the original M-by-K
-*          matrix reduced by SGEBRD.
-*          If VECT = 'P', the number of rows in the original K-by-N
-*          matrix reduced by SGEBRD.
-*          K >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the vectors which define the elementary reflectors,
-*          as returned by SGEBRD.
-*          On exit, the M-by-N matrix Q or P**T.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) REAL array, dimension
-*                                (min(M,K)) if VECT = 'Q'
-*                                (min(N,K)) if VECT = 'P'
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i) or G(i), which determines Q or P**T, as
-*          returned by SGEBRD in its array argument TAUQ or TAUP.
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,min(M,N)).
-*          For optimum performance LWORK >= min(M,N)*NB, where NB
-*          is the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, WANTQ
-      INTEGER            I, IINFO, J, LWKOPT, MN, NB
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV, LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SORGLQ, SORGQR, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      WANTQ = LSAME( VECT, 'Q' )
-      MN = MIN( M, N )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( .NOT.WANTQ .AND. .NOT.LSAME( VECT, 'P' ) ) THEN
-         INFO = -1
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 .OR. ( WANTQ .AND. ( N.GT.M .OR. N.LT.MIN( M,
-     $         K ) ) ) .OR. ( .NOT.WANTQ .AND. ( M.GT.N .OR. M.LT.
-     $         MIN( N, K ) ) ) ) THEN
-         INFO = -3
-      ELSE IF( K.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -6
-      ELSE IF( LWORK.LT.MAX( 1, MN ) .AND. .NOT.LQUERY ) THEN
-         INFO = -9
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( WANTQ ) THEN
-            NB = ILAENV( 1, 'SORGQR', ' ', M, N, K, -1 )
-         ELSE
-            NB = ILAENV( 1, 'SORGLQ', ' ', M, N, K, -1 )
-         END IF
-         LWKOPT = MAX( 1, MN )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SORGBR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      IF( WANTQ ) THEN
-*
-*        Form Q, determined by a call to SGEBRD to reduce an m-by-k
-*        matrix
-*
-         IF( M.GE.K ) THEN
-*
-*           If m >= k, assume m >= n >= k
-*
-            CALL SORGQR( M, N, K, A, LDA, TAU, WORK, LWORK, IINFO )
-*
-         ELSE
-*
-*           If m < k, assume m = n
-*
-*           Shift the vectors which define the elementary reflectors one
-*           column to the right, and set the first row and column of Q
-*           to those of the unit matrix
-*
-            DO 20 J = M, 2, -1
-               A( 1, J ) = ZERO
-               DO 10 I = J + 1, M
-                  A( I, J ) = A( I, J-1 )
-   10          CONTINUE
-   20       CONTINUE
-            A( 1, 1 ) = ONE
-            DO 30 I = 2, M
-               A( I, 1 ) = ZERO
-   30       CONTINUE
-            IF( M.GT.1 ) THEN
-*
-*              Form Q(2:m,2:m)
-*
-               CALL SORGQR( M-1, M-1, M-1, A( 2, 2 ), LDA, TAU, WORK,
-     $                      LWORK, IINFO )
-            END IF
-         END IF
-      ELSE
-*
-*        Form P', determined by a call to SGEBRD to reduce a k-by-n
-*        matrix
-*
-         IF( K.LT.N ) THEN
-*
-*           If k < n, assume k <= m <= n
-*
-            CALL SORGLQ( M, N, K, A, LDA, TAU, WORK, LWORK, IINFO )
-*
-         ELSE
-*
-*           If k >= n, assume m = n
-*
-*           Shift the vectors which define the elementary reflectors one
-*           row downward, and set the first row and column of P' to
-*           those of the unit matrix
-*
-            A( 1, 1 ) = ONE
-            DO 40 I = 2, N
-               A( I, 1 ) = ZERO
-   40       CONTINUE
-            DO 60 J = 2, N
-               DO 50 I = J - 1, 2, -1
-                  A( I, J ) = A( I-1, J )
-   50          CONTINUE
-               A( 1, J ) = ZERO
-   60       CONTINUE
-            IF( N.GT.1 ) THEN
-*
-*              Form P'(2:n,2:n)
-*
-               CALL SORGLQ( N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK,
-     $                      LWORK, IINFO )
-            END IF
-         END IF
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of SORGBR
-*
-      END
--- a/libcruft/lapack/sorghr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,164 +0,0 @@
-      SUBROUTINE SORGHR( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, ILO, INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SORGHR generates a real orthogonal matrix Q which is defined as the
-*  product of IHI-ILO elementary reflectors of order N, as returned by
-*  SGEHRD:
-*
-*  Q = H(ilo) H(ilo+1) . . . H(ihi-1).
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix Q. N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          ILO and IHI must have the same values as in the previous call
-*          of SGEHRD. Q is equal to the unit matrix except in the
-*          submatrix Q(ilo+1:ihi,ilo+1:ihi).
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the vectors which define the elementary reflectors,
-*          as returned by SGEHRD.
-*          On exit, the N-by-N orthogonal matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,N).
-*
-*  TAU     (input) REAL array, dimension (N-1)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by SGEHRD.
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= IHI-ILO.
-*          For optimum performance LWORK >= (IHI-ILO)*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IINFO, J, LWKOPT, NB, NH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SORGQR, XERBLA
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV 
-      EXTERNAL           ILAENV 
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NH = IHI - ILO
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -2
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LWORK.LT.MAX( 1, NH ) .AND. .NOT.LQUERY ) THEN
-         INFO = -8
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         NB = ILAENV( 1, 'SORGQR', ' ', NH, NH, NH, -1 )
-         LWKOPT = MAX( 1, NH )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SORGHR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-*     Shift the vectors which define the elementary reflectors one
-*     column to the right, and set the first ilo and the last n-ihi
-*     rows and columns to those of the unit matrix
-*
-      DO 40 J = IHI, ILO + 1, -1
-         DO 10 I = 1, J - 1
-            A( I, J ) = ZERO
-   10    CONTINUE
-         DO 20 I = J + 1, IHI
-            A( I, J ) = A( I, J-1 )
-   20    CONTINUE
-         DO 30 I = IHI + 1, N
-            A( I, J ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-      DO 60 J = 1, ILO
-         DO 50 I = 1, N
-            A( I, J ) = ZERO
-   50    CONTINUE
-         A( J, J ) = ONE
-   60 CONTINUE
-      DO 80 J = IHI + 1, N
-         DO 70 I = 1, N
-            A( I, J ) = ZERO
-   70    CONTINUE
-         A( J, J ) = ONE
-   80 CONTINUE
-*
-      IF( NH.GT.0 ) THEN
-*
-*        Generate Q(ilo+1:ihi,ilo+1:ihi)
-*
-         CALL SORGQR( NH, NH, NH, A( ILO+1, ILO+1 ), LDA, TAU( ILO ),
-     $                WORK, LWORK, IINFO )
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of SORGHR
-*
-      END
--- a/libcruft/lapack/sorgl2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,133 +0,0 @@
-      SUBROUTINE SORGL2( M, N, K, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SORGL2 generates an m by n real matrix Q with orthonormal rows,
-*  which is defined as the first m rows of a product of k elementary
-*  reflectors of order n
-*
-*        Q  =  H(k) . . . H(2) H(1)
-*
-*  as returned by SGELQF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. N >= M.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. M >= K >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the i-th row must contain the vector which defines
-*          the elementary reflector H(i), for i = 1,2,...,k, as returned
-*          by SGELQF in the first k rows of its array argument A.
-*          On exit, the m-by-n matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) REAL array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by SGELQF.
-*
-*  WORK    (workspace) REAL array, dimension (M)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J, L
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARF, SSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.M ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SORGL2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 )
-     $   RETURN
-*
-      IF( K.LT.M ) THEN
-*
-*        Initialise rows k+1:m to rows of the unit matrix
-*
-         DO 20 J = 1, N
-            DO 10 L = K + 1, M
-               A( L, J ) = ZERO
-   10       CONTINUE
-            IF( J.GT.K .AND. J.LE.M )
-     $         A( J, J ) = ONE
-   20    CONTINUE
-      END IF
-*
-      DO 40 I = K, 1, -1
-*
-*        Apply H(i) to A(i:m,i:n) from the right
-*
-         IF( I.LT.N ) THEN
-            IF( I.LT.M ) THEN
-               A( I, I ) = ONE
-               CALL SLARF( 'Right', M-I, N-I+1, A( I, I ), LDA,
-     $                     TAU( I ), A( I+1, I ), LDA, WORK )
-            END IF
-            CALL SSCAL( N-I, -TAU( I ), A( I, I+1 ), LDA )
-         END IF
-         A( I, I ) = ONE - TAU( I )
-*
-*        Set A(i,1:i-1) to zero
-*
-         DO 30 L = 1, I - 1
-            A( I, L ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-      RETURN
-*
-*     End of SORGL2
-*
-      END
--- a/libcruft/lapack/sorglq.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,215 +0,0 @@
-      SUBROUTINE SORGLQ( M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SORGLQ generates an M-by-N real matrix Q with orthonormal rows,
-*  which is defined as the first M rows of a product of K elementary
-*  reflectors of order N
-*
-*        Q  =  H(k) . . . H(2) H(1)
-*
-*  as returned by SGELQF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. N >= M.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. M >= K >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the i-th row must contain the vector which defines
-*          the elementary reflector H(i), for i = 1,2,...,k, as returned
-*          by SGELQF in the first k rows of its array argument A.
-*          On exit, the M-by-N matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) REAL array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by SGELQF.
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,M).
-*          For optimum performance LWORK >= M*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, J, KI, KK, L, LDWORK,
-     $                   LWKOPT, NB, NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARFB, SLARFT, SORGL2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NB = ILAENV( 1, 'SORGLQ', ' ', M, N, K, -1 )
-      LWKOPT = MAX( 1, M )*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.M ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SORGLQ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = M
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'SORGLQ', ' ', M, N, K, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = M
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'SORGLQ', ' ', M, N, K, -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code after the last block.
-*        The first kk rows are handled by the block method.
-*
-         KI = ( ( K-NX-1 ) / NB )*NB
-         KK = MIN( K, KI+NB )
-*
-*        Set A(kk+1:m,1:kk) to zero.
-*
-         DO 20 J = 1, KK
-            DO 10 I = KK + 1, M
-               A( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-      ELSE
-         KK = 0
-      END IF
-*
-*     Use unblocked code for the last or only block.
-*
-      IF( KK.LT.M )
-     $   CALL SORGL2( M-KK, N-KK, K-KK, A( KK+1, KK+1 ), LDA,
-     $                TAU( KK+1 ), WORK, IINFO )
-*
-      IF( KK.GT.0 ) THEN
-*
-*        Use blocked code
-*
-         DO 50 I = KI + 1, 1, -NB
-            IB = MIN( NB, K-I+1 )
-            IF( I+IB.LE.M ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i) H(i+1) . . . H(i+ib-1)
-*
-               CALL SLARFT( 'Forward', 'Rowwise', N-I+1, IB, A( I, I ),
-     $                      LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H' to A(i+ib:m,i:n) from the right
-*
-               CALL SLARFB( 'Right', 'Transpose', 'Forward', 'Rowwise',
-     $                      M-I-IB+1, N-I+1, IB, A( I, I ), LDA, WORK,
-     $                      LDWORK, A( I+IB, I ), LDA, WORK( IB+1 ),
-     $                      LDWORK )
-            END IF
-*
-*           Apply H' to columns i:n of current block
-*
-            CALL SORGL2( IB, N-I+1, IB, A( I, I ), LDA, TAU( I ), WORK,
-     $                   IINFO )
-*
-*           Set columns 1:i-1 of current block to zero
-*
-            DO 40 J = 1, I - 1
-               DO 30 L = I, I + IB - 1
-                  A( L, J ) = ZERO
-   30          CONTINUE
-   40       CONTINUE
-   50    CONTINUE
-      END IF
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of SORGLQ
-*
-      END
--- a/libcruft/lapack/sorgql.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,222 +0,0 @@
-      SUBROUTINE SORGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SORGQL generates an M-by-N real matrix Q with orthonormal columns,
-*  which is defined as the last N columns of a product of K elementary
-*  reflectors of order M
-*
-*        Q  =  H(k) . . . H(2) H(1)
-*
-*  as returned by SGEQLF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. M >= N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. N >= K >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the (n-k+i)-th column must contain the vector which
-*          defines the elementary reflector H(i), for i = 1,2,...,k, as
-*          returned by SGEQLF in the last k columns of its array
-*          argument A.
-*          On exit, the M-by-N matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) REAL array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by SGEQLF.
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,N).
-*          For optimum performance LWORK >= N*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, J, KK, L, LDWORK, LWKOPT,
-     $                   NB, NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARFB, SLARFT, SORG2L, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( N.EQ.0 ) THEN
-            LWKOPT = 1
-         ELSE
-            NB = ILAENV( 1, 'SORGQL', ' ', M, N, K, -1 )
-            LWKOPT = N*NB
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-            INFO = -8
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SORGQL', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 ) THEN
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = N
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'SORGQL', ' ', M, N, K, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = N
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'SORGQL', ' ', M, N, K, -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code after the first block.
-*        The last kk columns are handled by the block method.
-*
-         KK = MIN( K, ( ( K-NX+NB-1 ) / NB )*NB )
-*
-*        Set A(m-kk+1:m,1:n-kk) to zero.
-*
-         DO 20 J = 1, N - KK
-            DO 10 I = M - KK + 1, M
-               A( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-      ELSE
-         KK = 0
-      END IF
-*
-*     Use unblocked code for the first or only block.
-*
-      CALL SORG2L( M-KK, N-KK, K-KK, A, LDA, TAU, WORK, IINFO )
-*
-      IF( KK.GT.0 ) THEN
-*
-*        Use blocked code
-*
-         DO 50 I = K - KK + 1, K, NB
-            IB = MIN( NB, K-I+1 )
-            IF( N-K+I.GT.1 ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i+ib-1) . . . H(i+1) H(i)
-*
-               CALL SLARFT( 'Backward', 'Columnwise', M-K+I+IB-1, IB,
-     $                      A( 1, N-K+I ), LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H to A(1:m-k+i+ib-1,1:n-k+i-1) from the left
-*
-               CALL SLARFB( 'Left', 'No transpose', 'Backward',
-     $                      'Columnwise', M-K+I+IB-1, N-K+I-1, IB,
-     $                      A( 1, N-K+I ), LDA, WORK, LDWORK, A, LDA,
-     $                      WORK( IB+1 ), LDWORK )
-            END IF
-*
-*           Apply H to rows 1:m-k+i+ib-1 of current block
-*
-            CALL SORG2L( M-K+I+IB-1, IB, IB, A( 1, N-K+I ), LDA,
-     $                   TAU( I ), WORK, IINFO )
-*
-*           Set rows m-k+i+ib:m of current block to zero
-*
-            DO 40 J = N - K + I, N - K + I + IB - 1
-               DO 30 L = M - K + I + IB, M
-                  A( L, J ) = ZERO
-   30          CONTINUE
-   40       CONTINUE
-   50    CONTINUE
-      END IF
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of SORGQL
-*
-      END
--- a/libcruft/lapack/sorgqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,216 +0,0 @@
-      SUBROUTINE SORGQR( M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SORGQR generates an M-by-N real matrix Q with orthonormal columns,
-*  which is defined as the first N columns of a product of K elementary
-*  reflectors of order M
-*
-*        Q  =  H(1) H(2) . . . H(k)
-*
-*  as returned by SGEQRF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. M >= N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. N >= K >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the i-th column must contain the vector which
-*          defines the elementary reflector H(i), for i = 1,2,...,k, as
-*          returned by SGEQRF in the first k columns of its array
-*          argument A.
-*          On exit, the M-by-N matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) REAL array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by SGEQRF.
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,N).
-*          For optimum performance LWORK >= N*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, J, KI, KK, L, LDWORK,
-     $                   LWKOPT, NB, NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARFB, SLARFT, SORG2R, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NB = ILAENV( 1, 'SORGQR', ' ', M, N, K, -1 )
-      LWKOPT = MAX( 1, N )*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SORGQR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = N
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'SORGQR', ' ', M, N, K, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = N
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'SORGQR', ' ', M, N, K, -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code after the last block.
-*        The first kk columns are handled by the block method.
-*
-         KI = ( ( K-NX-1 ) / NB )*NB
-         KK = MIN( K, KI+NB )
-*
-*        Set A(1:kk,kk+1:n) to zero.
-*
-         DO 20 J = KK + 1, N
-            DO 10 I = 1, KK
-               A( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-      ELSE
-         KK = 0
-      END IF
-*
-*     Use unblocked code for the last or only block.
-*
-      IF( KK.LT.N )
-     $   CALL SORG2R( M-KK, N-KK, K-KK, A( KK+1, KK+1 ), LDA,
-     $                TAU( KK+1 ), WORK, IINFO )
-*
-      IF( KK.GT.0 ) THEN
-*
-*        Use blocked code
-*
-         DO 50 I = KI + 1, 1, -NB
-            IB = MIN( NB, K-I+1 )
-            IF( I+IB.LE.N ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i) H(i+1) . . . H(i+ib-1)
-*
-               CALL SLARFT( 'Forward', 'Columnwise', M-I+1, IB,
-     $                      A( I, I ), LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H to A(i:m,i+ib:n) from the left
-*
-               CALL SLARFB( 'Left', 'No transpose', 'Forward',
-     $                      'Columnwise', M-I+1, N-I-IB+1, IB,
-     $                      A( I, I ), LDA, WORK, LDWORK, A( I, I+IB ),
-     $                      LDA, WORK( IB+1 ), LDWORK )
-            END IF
-*
-*           Apply H to rows i:m of current block
-*
-            CALL SORG2R( M-I+1, IB, IB, A( I, I ), LDA, TAU( I ), WORK,
-     $                   IINFO )
-*
-*           Set rows 1:i-1 of current block to zero
-*
-            DO 40 J = I, I + IB - 1
-               DO 30 L = 1, I - 1
-                  A( L, J ) = ZERO
-   30          CONTINUE
-   40       CONTINUE
-   50    CONTINUE
-      END IF
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of SORGQR
-*
-      END
--- a/libcruft/lapack/sorgtr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,183 +0,0 @@
-      SUBROUTINE SORGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SORGTR generates a real orthogonal matrix Q which is defined as the
-*  product of n-1 elementary reflectors of order N, as returned by
-*  SSYTRD:
-*
-*  if UPLO = 'U', Q = H(n-1) . . . H(2) H(1),
-*
-*  if UPLO = 'L', Q = H(1) H(2) . . . H(n-1).
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U': Upper triangle of A contains elementary reflectors
-*                 from SSYTRD;
-*          = 'L': Lower triangle of A contains elementary reflectors
-*                 from SSYTRD.
-*
-*  N       (input) INTEGER
-*          The order of the matrix Q. N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the vectors which define the elementary reflectors,
-*          as returned by SSYTRD.
-*          On exit, the N-by-N orthogonal matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,N).
-*
-*  TAU     (input) REAL array, dimension (N-1)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by SSYTRD.
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,N-1).
-*          For optimum performance LWORK >= (N-1)*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, UPPER
-      INTEGER            I, IINFO, J, LWKOPT, NB
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV, LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SORGQL, SORGQR, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.MAX( 1, N-1 ) .AND. .NOT.LQUERY ) THEN
-         INFO = -7
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF ( UPPER ) THEN
-           NB = ILAENV( 1, 'SORGQL', ' ', N-1, N-1, N-1, -1 )
-         ELSE
-           NB = ILAENV( 1, 'SORGQR', ' ', N-1, N-1, N-1, -1 )
-         END IF
-         LWKOPT = MAX( 1, N-1 )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*    
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SORGTR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      IF( UPPER ) THEN
-*
-*        Q was determined by a call to SSYTRD with UPLO = 'U'
-*
-*        Shift the vectors which define the elementary reflectors one
-*        column to the left, and set the last row and column of Q to
-*        those of the unit matrix
-*
-         DO 20 J = 1, N - 1
-            DO 10 I = 1, J - 1
-               A( I, J ) = A( I, J+1 )
-   10       CONTINUE
-            A( N, J ) = ZERO
-   20    CONTINUE
-         DO 30 I = 1, N - 1
-            A( I, N ) = ZERO
-   30    CONTINUE
-         A( N, N ) = ONE
-*
-*        Generate Q(1:n-1,1:n-1)
-*
-         CALL SORGQL( N-1, N-1, N-1, A, LDA, TAU, WORK, LWORK, IINFO )
-*
-      ELSE
-*
-*        Q was determined by a call to SSYTRD with UPLO = 'L'.
-*
-*        Shift the vectors which define the elementary reflectors one
-*        column to the right, and set the first row and column of Q to
-*        those of the unit matrix
-*
-         DO 50 J = N, 2, -1
-            A( 1, J ) = ZERO
-            DO 40 I = J + 1, N
-               A( I, J ) = A( I, J-1 )
-   40       CONTINUE
-   50    CONTINUE
-         A( 1, 1 ) = ONE
-         DO 60 I = 2, N
-            A( I, 1 ) = ZERO
-   60    CONTINUE
-         IF( N.GT.1 ) THEN
-*
-*           Generate Q(2:n,2:n)
-*
-            CALL SORGQR( N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK,
-     $                   LWORK, IINFO )
-         END IF
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of SORGTR
-*
-      END
--- a/libcruft/lapack/sorm2r.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,197 +0,0 @@
-      SUBROUTINE SORM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, LDA, LDC, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SORM2R overwrites the general real m by n matrix C with
-*
-*        Q * C  if SIDE = 'L' and TRANS = 'N', or
-*
-*        Q'* C  if SIDE = 'L' and TRANS = 'T', or
-*
-*        C * Q  if SIDE = 'R' and TRANS = 'N', or
-*
-*        C * Q' if SIDE = 'R' and TRANS = 'T',
-*
-*  where Q is a real orthogonal matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(1) H(2) . . . H(k)
-*
-*  as returned by SGEQRF. Q is of order m if SIDE = 'L' and of order n
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q' from the Left
-*          = 'R': apply Q or Q' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply Q  (No transpose)
-*          = 'T': apply Q' (Transpose)
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  A       (input) REAL array, dimension (LDA,K)
-*          The i-th column must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          SGEQRF in the first k columns of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.
-*          If SIDE = 'L', LDA >= max(1,M);
-*          if SIDE = 'R', LDA >= max(1,N).
-*
-*  TAU     (input) REAL array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by SGEQRF.
-*
-*  C       (input/output) REAL array, dimension (LDC,N)
-*          On entry, the m by n matrix C.
-*          On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) REAL array, dimension
-*                                   (N) if SIDE = 'L',
-*                                   (M) if SIDE = 'R'
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, NOTRAN
-      INTEGER            I, I1, I2, I3, IC, JC, MI, NI, NQ
-      REAL               AII
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARF, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-*
-*     NQ is the order of Q
-*
-      IF( LEFT ) THEN
-         NQ = M
-      ELSE
-         NQ = N
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN
-         INFO = -7
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SORM2R', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 )
-     $   RETURN
-*
-      IF( ( LEFT .AND. .NOT.NOTRAN ) .OR. ( .NOT.LEFT .AND. NOTRAN ) )
-     $     THEN
-         I1 = 1
-         I2 = K
-         I3 = 1
-      ELSE
-         I1 = K
-         I2 = 1
-         I3 = -1
-      END IF
-*
-      IF( LEFT ) THEN
-         NI = N
-         JC = 1
-      ELSE
-         MI = M
-         IC = 1
-      END IF
-*
-      DO 10 I = I1, I2, I3
-         IF( LEFT ) THEN
-*
-*           H(i) is applied to C(i:m,1:n)
-*
-            MI = M - I + 1
-            IC = I
-         ELSE
-*
-*           H(i) is applied to C(1:m,i:n)
-*
-            NI = N - I + 1
-            JC = I
-         END IF
-*
-*        Apply H(i)
-*
-         AII = A( I, I )
-         A( I, I ) = ONE
-         CALL SLARF( SIDE, MI, NI, A( I, I ), 1, TAU( I ), C( IC, JC ),
-     $               LDC, WORK )
-         A( I, I ) = AII
-   10 CONTINUE
-      RETURN
-*
-*     End of SORM2R
-*
-      END
--- a/libcruft/lapack/sormbr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,282 +0,0 @@
-      SUBROUTINE SORMBR( VECT, SIDE, TRANS, M, N, K, A, LDA, TAU, C,
-     $                   LDC, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS, VECT
-      INTEGER            INFO, K, LDA, LDC, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), C( LDC, * ), TAU( * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  If VECT = 'Q', SORMBR overwrites the general real M-by-N matrix C
-*  with
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      Q * C          C * Q
-*  TRANS = 'T':      Q**T * C       C * Q**T
-*
-*  If VECT = 'P', SORMBR overwrites the general real M-by-N matrix C
-*  with
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      P * C          C * P
-*  TRANS = 'T':      P**T * C       C * P**T
-*
-*  Here Q and P**T are the orthogonal matrices determined by SGEBRD when
-*  reducing a real matrix A to bidiagonal form: A = Q * B * P**T. Q and
-*  P**T are defined as products of elementary reflectors H(i) and G(i)
-*  respectively.
-*
-*  Let nq = m if SIDE = 'L' and nq = n if SIDE = 'R'. Thus nq is the
-*  order of the orthogonal matrix Q or P**T that is applied.
-*
-*  If VECT = 'Q', A is assumed to have been an NQ-by-K matrix:
-*  if nq >= k, Q = H(1) H(2) . . . H(k);
-*  if nq < k, Q = H(1) H(2) . . . H(nq-1).
-*
-*  If VECT = 'P', A is assumed to have been a K-by-NQ matrix:
-*  if k < nq, P = G(1) G(2) . . . G(k);
-*  if k >= nq, P = G(1) G(2) . . . G(nq-1).
-*
-*  Arguments
-*  =========
-*
-*  VECT    (input) CHARACTER*1
-*          = 'Q': apply Q or Q**T;
-*          = 'P': apply P or P**T.
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q, Q**T, P or P**T from the Left;
-*          = 'R': apply Q, Q**T, P or P**T from the Right.
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N':  No transpose, apply Q  or P;
-*          = 'T':  Transpose, apply Q**T or P**T.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          If VECT = 'Q', the number of columns in the original
-*          matrix reduced by SGEBRD.
-*          If VECT = 'P', the number of rows in the original
-*          matrix reduced by SGEBRD.
-*          K >= 0.
-*
-*  A       (input) REAL array, dimension
-*                                (LDA,min(nq,K)) if VECT = 'Q'
-*                                (LDA,nq)        if VECT = 'P'
-*          The vectors which define the elementary reflectors H(i) and
-*          G(i), whose products determine the matrices Q and P, as
-*          returned by SGEBRD.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.
-*          If VECT = 'Q', LDA >= max(1,nq);
-*          if VECT = 'P', LDA >= max(1,min(nq,K)).
-*
-*  TAU     (input) REAL array, dimension (min(nq,K))
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i) or G(i) which determines Q or P, as returned
-*          by SGEBRD in the array argument TAUQ or TAUP.
-*
-*  C       (input/output) REAL array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q
-*          or P*C or P**T*C or C*P or C*P**T.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If SIDE = 'L', LWORK >= max(1,N);
-*          if SIDE = 'R', LWORK >= max(1,M).
-*          For optimum performance LWORK >= N*NB if SIDE = 'L', and
-*          LWORK >= M*NB if SIDE = 'R', where NB is the optimal
-*          blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            APPLYQ, LEFT, LQUERY, NOTRAN
-      CHARACTER          TRANST
-      INTEGER            I1, I2, IINFO, LWKOPT, MI, NB, NI, NQ, NW
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV, LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SORMLQ, SORMQR, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      APPLYQ = LSAME( VECT, 'Q' )
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-*     NQ is the order of Q or P and NW is the minimum dimension of WORK
-*
-      IF( LEFT ) THEN
-         NQ = M
-         NW = N
-      ELSE
-         NQ = N
-         NW = M
-      END IF
-      IF( .NOT.APPLYQ .AND. .NOT.LSAME( VECT, 'P' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN
-         INFO = -3
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( K.LT.0 ) THEN
-         INFO = -6
-      ELSE IF( ( APPLYQ .AND. LDA.LT.MAX( 1, NQ ) ) .OR.
-     $         ( .NOT.APPLYQ .AND. LDA.LT.MAX( 1, MIN( NQ, K ) ) ) )
-     $          THEN
-         INFO = -8
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -11
-      ELSE IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
-         INFO = -13
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( APPLYQ ) THEN
-            IF( LEFT ) THEN
-               NB = ILAENV( 1, 'SORMQR', SIDE // TRANS, M-1, N, M-1,
-     $                      -1 )
-            ELSE
-               NB = ILAENV( 1, 'SORMQR', SIDE // TRANS, M, N-1, N-1,
-     $                      -1 )
-            END IF   
-         ELSE
-            IF( LEFT ) THEN
-               NB = ILAENV( 1, 'SORMLQ', SIDE // TRANS, M-1, N, M-1,
-     $                      -1 ) 
-            ELSE
-               NB = ILAENV( 1, 'SORMLQ', SIDE // TRANS, M, N-1, N-1,
-     $                      -1 )
-            END IF
-         END IF
-         LWKOPT = MAX( 1, NW )*NB
-         WORK( 1 ) = LWKOPT 
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SORMBR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      WORK( 1 ) = 1
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-      IF( APPLYQ ) THEN
-*
-*        Apply Q
-*
-         IF( NQ.GE.K ) THEN
-*
-*           Q was determined by a call to SGEBRD with nq >= k
-*
-            CALL SORMQR( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, IINFO )
-         ELSE IF( NQ.GT.1 ) THEN
-*
-*           Q was determined by a call to SGEBRD with nq < k
-*
-            IF( LEFT ) THEN
-               MI = M - 1
-               NI = N
-               I1 = 2
-               I2 = 1
-            ELSE
-               MI = M
-               NI = N - 1
-               I1 = 1
-               I2 = 2
-            END IF
-            CALL SORMQR( SIDE, TRANS, MI, NI, NQ-1, A( 2, 1 ), LDA, TAU,
-     $                   C( I1, I2 ), LDC, WORK, LWORK, IINFO )
-         END IF
-      ELSE
-*
-*        Apply P
-*
-         IF( NOTRAN ) THEN
-            TRANST = 'T'
-         ELSE
-            TRANST = 'N'
-         END IF
-         IF( NQ.GT.K ) THEN
-*
-*           P was determined by a call to SGEBRD with nq > k
-*
-            CALL SORMLQ( SIDE, TRANST, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, IINFO )
-         ELSE IF( NQ.GT.1 ) THEN
-*
-*           P was determined by a call to SGEBRD with nq <= k
-*
-            IF( LEFT ) THEN
-               MI = M - 1
-               NI = N
-               I1 = 2
-               I2 = 1
-            ELSE
-               MI = M
-               NI = N - 1
-               I1 = 1
-               I2 = 2
-            END IF
-            CALL SORMLQ( SIDE, TRANST, MI, NI, NQ-1, A( 1, 2 ), LDA,
-     $                   TAU, C( I1, I2 ), LDC, WORK, LWORK, IINFO )
-         END IF
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of SORMBR
-*
-      END
--- a/libcruft/lapack/sorml2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,197 +0,0 @@
-      SUBROUTINE SORML2( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, LDA, LDC, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SORML2 overwrites the general real m by n matrix C with
-*
-*        Q * C  if SIDE = 'L' and TRANS = 'N', or
-*
-*        Q'* C  if SIDE = 'L' and TRANS = 'T', or
-*
-*        C * Q  if SIDE = 'R' and TRANS = 'N', or
-*
-*        C * Q' if SIDE = 'R' and TRANS = 'T',
-*
-*  where Q is a real orthogonal matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(k) . . . H(2) H(1)
-*
-*  as returned by SGELQF. Q is of order m if SIDE = 'L' and of order n
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q' from the Left
-*          = 'R': apply Q or Q' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply Q  (No transpose)
-*          = 'T': apply Q' (Transpose)
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  A       (input) REAL array, dimension
-*                               (LDA,M) if SIDE = 'L',
-*                               (LDA,N) if SIDE = 'R'
-*          The i-th row must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          SGELQF in the first k rows of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,K).
-*
-*  TAU     (input) REAL array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by SGELQF.
-*
-*  C       (input/output) REAL array, dimension (LDC,N)
-*          On entry, the m by n matrix C.
-*          On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) REAL array, dimension
-*                                   (N) if SIDE = 'L',
-*                                   (M) if SIDE = 'R'
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, NOTRAN
-      INTEGER            I, I1, I2, I3, IC, JC, MI, NI, NQ
-      REAL               AII
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARF, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-*
-*     NQ is the order of Q
-*
-      IF( LEFT ) THEN
-         NQ = M
-      ELSE
-         NQ = N
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
-         INFO = -7
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SORML2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 )
-     $   RETURN
-*
-      IF( ( LEFT .AND. NOTRAN ) .OR. ( .NOT.LEFT .AND. .NOT.NOTRAN ) )
-     $     THEN
-         I1 = 1
-         I2 = K
-         I3 = 1
-      ELSE
-         I1 = K
-         I2 = 1
-         I3 = -1
-      END IF
-*
-      IF( LEFT ) THEN
-         NI = N
-         JC = 1
-      ELSE
-         MI = M
-         IC = 1
-      END IF
-*
-      DO 10 I = I1, I2, I3
-         IF( LEFT ) THEN
-*
-*           H(i) is applied to C(i:m,1:n)
-*
-            MI = M - I + 1
-            IC = I
-         ELSE
-*
-*           H(i) is applied to C(1:m,i:n)
-*
-            NI = N - I + 1
-            JC = I
-         END IF
-*
-*        Apply H(i)
-*
-         AII = A( I, I )
-         A( I, I ) = ONE
-         CALL SLARF( SIDE, MI, NI, A( I, I ), LDA, TAU( I ),
-     $               C( IC, JC ), LDC, WORK )
-         A( I, I ) = AII
-   10 CONTINUE
-      RETURN
-*
-*     End of SORML2
-*
-      END
--- a/libcruft/lapack/sormlq.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,268 +0,0 @@
-      SUBROUTINE SORMLQ( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, LDA, LDC, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), C( LDC, * ), TAU( * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SORMLQ overwrites the general real M-by-N matrix C with
-*
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      Q * C          C * Q
-*  TRANS = 'T':      Q**T * C       C * Q**T
-*
-*  where Q is a real orthogonal matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(k) . . . H(2) H(1)
-*
-*  as returned by SGELQF. Q is of order M if SIDE = 'L' and of order N
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q**T from the Left;
-*          = 'R': apply Q or Q**T from the Right.
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N':  No transpose, apply Q;
-*          = 'T':  Transpose, apply Q**T.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  A       (input) REAL array, dimension
-*                               (LDA,M) if SIDE = 'L',
-*                               (LDA,N) if SIDE = 'R'
-*          The i-th row must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          SGELQF in the first k rows of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,K).
-*
-*  TAU     (input) REAL array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by SGELQF.
-*
-*  C       (input/output) REAL array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If SIDE = 'L', LWORK >= max(1,N);
-*          if SIDE = 'R', LWORK >= max(1,M).
-*          For optimum performance LWORK >= N*NB if SIDE = 'L', and
-*          LWORK >= M*NB if SIDE = 'R', where NB is the optimal
-*          blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            NBMAX, LDT
-      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, LQUERY, NOTRAN
-      CHARACTER          TRANST
-      INTEGER            I, I1, I2, I3, IB, IC, IINFO, IWS, JC, LDWORK,
-     $                   LWKOPT, MI, NB, NBMIN, NI, NQ, NW
-*     ..
-*     .. Local Arrays ..
-      REAL               T( LDT, NBMAX )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARFB, SLARFT, SORML2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-*     NQ is the order of Q and NW is the minimum dimension of WORK
-*
-      IF( LEFT ) THEN
-         NQ = M
-         NW = N
-      ELSE
-         NQ = N
-         NW = M
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
-         INFO = -7
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -10
-      ELSE IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
-         INFO = -12
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-*
-*        Determine the block size.  NB may be at most NBMAX, where NBMAX
-*        is used to define the local array T.
-*
-         NB = MIN( NBMAX, ILAENV( 1, 'SORMLQ', SIDE // TRANS, M, N, K,
-     $             -1 ) )
-         LWKOPT = MAX( 1, NW )*NB
-         WORK( 1 ) = LWKOPT
-      END IF 
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SORMLQ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      LDWORK = NW
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-         IWS = NW*NB
-         IF( LWORK.LT.IWS ) THEN
-            NB = LWORK / LDWORK
-            NBMIN = MAX( 2, ILAENV( 2, 'SORMLQ', SIDE // TRANS, M, N, K,
-     $              -1 ) )
-         END IF
-      ELSE
-         IWS = NW
-      END IF
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
-*
-*        Use unblocked code
-*
-         CALL SORML2( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK,
-     $                IINFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( ( LEFT .AND. NOTRAN ) .OR.
-     $       ( .NOT.LEFT .AND. .NOT.NOTRAN ) ) THEN
-            I1 = 1
-            I2 = K
-            I3 = NB
-         ELSE
-            I1 = ( ( K-1 ) / NB )*NB + 1
-            I2 = 1
-            I3 = -NB
-         END IF
-*
-         IF( LEFT ) THEN
-            NI = N
-            JC = 1
-         ELSE
-            MI = M
-            IC = 1
-         END IF
-*
-         IF( NOTRAN ) THEN
-            TRANST = 'T'
-         ELSE
-            TRANST = 'N'
-         END IF
-*
-         DO 10 I = I1, I2, I3
-            IB = MIN( NB, K-I+1 )
-*
-*           Form the triangular factor of the block reflector
-*           H = H(i) H(i+1) . . . H(i+ib-1)
-*
-            CALL SLARFT( 'Forward', 'Rowwise', NQ-I+1, IB, A( I, I ),
-     $                   LDA, TAU( I ), T, LDT )
-            IF( LEFT ) THEN
-*
-*              H or H' is applied to C(i:m,1:n)
-*
-               MI = M - I + 1
-               IC = I
-            ELSE
-*
-*              H or H' is applied to C(1:m,i:n)
-*
-               NI = N - I + 1
-               JC = I
-            END IF
-*
-*           Apply H or H'
-*
-            CALL SLARFB( SIDE, TRANST, 'Forward', 'Rowwise', MI, NI, IB,
-     $                   A( I, I ), LDA, T, LDT, C( IC, JC ), LDC, WORK,
-     $                   LDWORK )
-   10    CONTINUE
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of SORMLQ
-*
-      END
--- a/libcruft/lapack/sormqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,261 +0,0 @@
-      SUBROUTINE SORMQR( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, LDA, LDC, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), C( LDC, * ), TAU( * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SORMQR overwrites the general real M-by-N matrix C with
-*
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      Q * C          C * Q
-*  TRANS = 'T':      Q**T * C       C * Q**T
-*
-*  where Q is a real orthogonal matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(1) H(2) . . . H(k)
-*
-*  as returned by SGEQRF. Q is of order M if SIDE = 'L' and of order N
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q**T from the Left;
-*          = 'R': apply Q or Q**T from the Right.
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N':  No transpose, apply Q;
-*          = 'T':  Transpose, apply Q**T.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  A       (input) REAL array, dimension (LDA,K)
-*          The i-th column must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          SGEQRF in the first k columns of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.
-*          If SIDE = 'L', LDA >= max(1,M);
-*          if SIDE = 'R', LDA >= max(1,N).
-*
-*  TAU     (input) REAL array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by SGEQRF.
-*
-*  C       (input/output) REAL array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If SIDE = 'L', LWORK >= max(1,N);
-*          if SIDE = 'R', LWORK >= max(1,M).
-*          For optimum performance LWORK >= N*NB if SIDE = 'L', and
-*          LWORK >= M*NB if SIDE = 'R', where NB is the optimal
-*          blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            NBMAX, LDT
-      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, LQUERY, NOTRAN
-      INTEGER            I, I1, I2, I3, IB, IC, IINFO, IWS, JC, LDWORK,
-     $                   LWKOPT, MI, NB, NBMIN, NI, NQ, NW
-*     ..
-*     .. Local Arrays ..
-      REAL               T( LDT, NBMAX )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARFB, SLARFT, SORM2R, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-*     NQ is the order of Q and NW is the minimum dimension of WORK
-*
-      IF( LEFT ) THEN
-         NQ = M
-         NW = N
-      ELSE
-         NQ = N
-         NW = M
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN
-         INFO = -7
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -10
-      ELSE IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
-         INFO = -12
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-*
-*        Determine the block size.  NB may be at most NBMAX, where NBMAX
-*        is used to define the local array T.
-*
-         NB = MIN( NBMAX, ILAENV( 1, 'SORMQR', SIDE // TRANS, M, N, K,
-     $        -1 ) )
-         LWKOPT = MAX( 1, NW )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SORMQR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      LDWORK = NW
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-         IWS = NW*NB
-         IF( LWORK.LT.IWS ) THEN
-            NB = LWORK / LDWORK
-            NBMIN = MAX( 2, ILAENV( 2, 'SORMQR', SIDE // TRANS, M, N, K,
-     $              -1 ) )
-         END IF
-      ELSE
-         IWS = NW
-      END IF
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
-*
-*        Use unblocked code
-*
-         CALL SORM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK,
-     $                IINFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( ( LEFT .AND. .NOT.NOTRAN ) .OR.
-     $       ( .NOT.LEFT .AND. NOTRAN ) ) THEN
-            I1 = 1
-            I2 = K
-            I3 = NB
-         ELSE
-            I1 = ( ( K-1 ) / NB )*NB + 1
-            I2 = 1
-            I3 = -NB
-         END IF
-*
-         IF( LEFT ) THEN
-            NI = N
-            JC = 1
-         ELSE
-            MI = M
-            IC = 1
-         END IF
-*
-         DO 10 I = I1, I2, I3
-            IB = MIN( NB, K-I+1 )
-*
-*           Form the triangular factor of the block reflector
-*           H = H(i) H(i+1) . . . H(i+ib-1)
-*
-            CALL SLARFT( 'Forward', 'Columnwise', NQ-I+1, IB, A( I, I ),
-     $                   LDA, TAU( I ), T, LDT )
-            IF( LEFT ) THEN
-*
-*              H or H' is applied to C(i:m,1:n)
-*
-               MI = M - I + 1
-               IC = I
-            ELSE
-*
-*              H or H' is applied to C(1:m,i:n)
-*
-               NI = N - I + 1
-               JC = I
-            END IF
-*
-*           Apply H or H'
-*
-            CALL SLARFB( SIDE, TRANS, 'Forward', 'Columnwise', MI, NI,
-     $                   IB, A( I, I ), LDA, T, LDT, C( IC, JC ), LDC,
-     $                   WORK, LDWORK )
-   10    CONTINUE
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of SORMQR
-*
-      END
--- a/libcruft/lapack/sormr3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,206 +0,0 @@
-      SUBROUTINE SORMR3( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC,
-     $                   WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, L, LDA, LDC, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SORMR3 overwrites the general real m by n matrix C with
-*
-*        Q * C  if SIDE = 'L' and TRANS = 'N', or
-*
-*        Q'* C  if SIDE = 'L' and TRANS = 'T', or
-*
-*        C * Q  if SIDE = 'R' and TRANS = 'N', or
-*
-*        C * Q' if SIDE = 'R' and TRANS = 'T',
-*
-*  where Q is a real orthogonal matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(1) H(2) . . . H(k)
-*
-*  as returned by STZRZF. Q is of order m if SIDE = 'L' and of order n
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q' from the Left
-*          = 'R': apply Q or Q' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply Q  (No transpose)
-*          = 'T': apply Q' (Transpose)
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  L       (input) INTEGER
-*          The number of columns of the matrix A containing
-*          the meaningful part of the Householder reflectors.
-*          If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
-*
-*  A       (input) REAL array, dimension
-*                               (LDA,M) if SIDE = 'L',
-*                               (LDA,N) if SIDE = 'R'
-*          The i-th row must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          STZRZF in the last k rows of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,K).
-*
-*  TAU     (input) REAL array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by STZRZF.
-*
-*  C       (input/output) REAL array, dimension (LDC,N)
-*          On entry, the m-by-n matrix C.
-*          On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) REAL array, dimension
-*                                   (N) if SIDE = 'L',
-*                                   (M) if SIDE = 'R'
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            LEFT, NOTRAN
-      INTEGER            I, I1, I2, I3, IC, JA, JC, MI, NI, NQ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARZ, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-*
-*     NQ is the order of Q
-*
-      IF( LEFT ) THEN
-         NQ = M
-      ELSE
-         NQ = N
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( L.LT.0 .OR. ( LEFT .AND. ( L.GT.M ) ) .OR.
-     $         ( .NOT.LEFT .AND. ( L.GT.N ) ) ) THEN
-         INFO = -6
-      ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
-         INFO = -8
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -11
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SORMR3', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 )
-     $   RETURN
-*
-      IF( ( LEFT .AND. .NOT.NOTRAN .OR. .NOT.LEFT .AND. NOTRAN ) ) THEN
-         I1 = 1
-         I2 = K
-         I3 = 1
-      ELSE
-         I1 = K
-         I2 = 1
-         I3 = -1
-      END IF
-*
-      IF( LEFT ) THEN
-         NI = N
-         JA = M - L + 1
-         JC = 1
-      ELSE
-         MI = M
-         JA = N - L + 1
-         IC = 1
-      END IF
-*
-      DO 10 I = I1, I2, I3
-         IF( LEFT ) THEN
-*
-*           H(i) or H(i)' is applied to C(i:m,1:n)
-*
-            MI = M - I + 1
-            IC = I
-         ELSE
-*
-*           H(i) or H(i)' is applied to C(1:m,i:n)
-*
-            NI = N - I + 1
-            JC = I
-         END IF
-*
-*        Apply H(i) or H(i)'
-*
-         CALL SLARZ( SIDE, MI, NI, L, A( I, JA ), LDA, TAU( I ),
-     $               C( IC, JC ), LDC, WORK )
-*
-   10 CONTINUE
-*
-      RETURN
-*
-*     End of SORMR3
-*
-      END
--- a/libcruft/lapack/sormrz.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,292 +0,0 @@
-      SUBROUTINE SORMRZ( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     January 2007
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, L, LDA, LDC, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SORMRZ overwrites the general real M-by-N matrix C with
-*
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      Q * C          C * Q
-*  TRANS = 'T':      Q**T * C       C * Q**T
-*
-*  where Q is a real orthogonal matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(1) H(2) . . . H(k)
-*
-*  as returned by STZRZF. Q is of order M if SIDE = 'L' and of order N
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q**T from the Left;
-*          = 'R': apply Q or Q**T from the Right.
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N':  No transpose, apply Q;
-*          = 'T':  Transpose, apply Q**T.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  L       (input) INTEGER
-*          The number of columns of the matrix A containing
-*          the meaningful part of the Householder reflectors.
-*          If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
-*
-*  A       (input) REAL array, dimension
-*                               (LDA,M) if SIDE = 'L',
-*                               (LDA,N) if SIDE = 'R'
-*          The i-th row must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          STZRZF in the last k rows of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,K).
-*
-*  TAU     (input) REAL array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by STZRZF.
-*
-*  C       (input/output) REAL array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If SIDE = 'L', LWORK >= max(1,N);
-*          if SIDE = 'R', LWORK >= max(1,M).
-*          For optimum performance LWORK >= N*NB if SIDE = 'L', and
-*          LWORK >= M*NB if SIDE = 'R', where NB is the optimal
-*          blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            NBMAX, LDT
-      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, LQUERY, NOTRAN
-      CHARACTER          TRANST
-      INTEGER            I, I1, I2, I3, IB, IC, IINFO, IWS, JA, JC,
-     $                   LDWORK, LWKOPT, MI, NB, NBMIN, NI, NQ, NW
-*     ..
-*     .. Local Arrays ..
-      REAL               T( LDT, NBMAX )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARZB, SLARZT, SORMR3, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-*     NQ is the order of Q and NW is the minimum dimension of WORK
-*
-      IF( LEFT ) THEN
-         NQ = M
-         NW = MAX( 1, N )
-      ELSE
-         NQ = N
-         NW = MAX( 1, M )
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( L.LT.0 .OR. ( LEFT .AND. ( L.GT.M ) ) .OR.
-     $         ( .NOT.LEFT .AND. ( L.GT.N ) ) ) THEN
-         INFO = -6
-      ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
-         INFO = -8
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -11
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-            LWKOPT = 1
-         ELSE
-*
-*           Determine the block size.  NB may be at most NBMAX, where
-*           NBMAX is used to define the local array T.
-*
-            NB = MIN( NBMAX, ILAENV( 1, 'SORMRQ', SIDE // TRANS, M, N,
-     $                               K, -1 ) )
-            LWKOPT = NW*NB
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
-            INFO = -13
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SORMRZ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      LDWORK = NW
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-         IWS = NW*NB
-         IF( LWORK.LT.IWS ) THEN
-            NB = LWORK / LDWORK
-            NBMIN = MAX( 2, ILAENV( 2, 'SORMRQ', SIDE // TRANS, M, N, K,
-     $              -1 ) )
-         END IF
-      ELSE
-         IWS = NW
-      END IF
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
-*
-*        Use unblocked code
-*
-         CALL SORMR3( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC,
-     $                WORK, IINFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( ( LEFT .AND. .NOT.NOTRAN ) .OR.
-     $       ( .NOT.LEFT .AND. NOTRAN ) ) THEN
-            I1 = 1
-            I2 = K
-            I3 = NB
-         ELSE
-            I1 = ( ( K-1 ) / NB )*NB + 1
-            I2 = 1
-            I3 = -NB
-         END IF
-*
-         IF( LEFT ) THEN
-            NI = N
-            JC = 1
-            JA = M - L + 1
-         ELSE
-            MI = M
-            IC = 1
-            JA = N - L + 1
-         END IF
-*
-         IF( NOTRAN ) THEN
-            TRANST = 'T'
-         ELSE
-            TRANST = 'N'
-         END IF
-*
-         DO 10 I = I1, I2, I3
-            IB = MIN( NB, K-I+1 )
-*
-*           Form the triangular factor of the block reflector
-*           H = H(i+ib-1) . . . H(i+1) H(i)
-*
-            CALL SLARZT( 'Backward', 'Rowwise', L, IB, A( I, JA ), LDA,
-     $                   TAU( I ), T, LDT )
-*
-            IF( LEFT ) THEN
-*
-*              H or H' is applied to C(i:m,1:n)
-*
-               MI = M - I + 1
-               IC = I
-            ELSE
-*
-*              H or H' is applied to C(1:m,i:n)
-*
-               NI = N - I + 1
-               JC = I
-            END IF
-*
-*           Apply H or H'
-*
-            CALL SLARZB( SIDE, TRANST, 'Backward', 'Rowwise', MI, NI,
-     $                   IB, L, A( I, JA ), LDA, T, LDT, C( IC, JC ),
-     $                   LDC, WORK, LDWORK )
-   10    CONTINUE
-*
-      END IF
-*
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of SORMRZ
-*
-      END
--- a/libcruft/lapack/spbcon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,192 +0,0 @@
-      SUBROUTINE SPBCON( UPLO, N, KD, AB, LDAB, ANORM, RCOND, WORK,
-     $                   IWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call SLACN2 in place of SLACON, 7 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, KD, LDAB, N
-      REAL               ANORM, RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      REAL               AB( LDAB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SPBCON estimates the reciprocal of the condition number (in the
-*  1-norm) of a real symmetric positive definite band matrix using the
-*  Cholesky factorization A = U**T*U or A = L*L**T computed by SPBTRF.
-*
-*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
-*  condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))).
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangular factor stored in AB;
-*          = 'L':  Lower triangular factor stored in AB.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of superdiagonals of the matrix A if UPLO = 'U',
-*          or the number of subdiagonals if UPLO = 'L'.  KD >= 0.
-*
-*  AB      (input) REAL array, dimension (LDAB,N)
-*          The triangular factor U or L from the Cholesky factorization
-*          A = U**T*U or A = L*L**T of the band matrix A, stored in the
-*          first KD+1 rows of the array.  The j-th column of U or L is
-*          stored in the j-th column of the array AB as follows:
-*          if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO ='L', AB(1+i-j,j)    = L(i,j) for j<=i<=min(n,j+kd).
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  ANORM   (input) REAL
-*          The 1-norm (or infinity-norm) of the symmetric band matrix A.
-*
-*  RCOND   (output) REAL
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an
-*          estimate of the 1-norm of inv(A) computed in this routine.
-*
-*  WORK    (workspace) REAL array, dimension (3*N)
-*
-*  IWORK   (workspace) INTEGER array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      CHARACTER          NORMIN
-      INTEGER            IX, KASE
-      REAL               AINVNM, SCALE, SCALEL, SCALEU, SMLNUM
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ISAMAX
-      REAL               SLAMCH
-      EXTERNAL           LSAME, ISAMAX, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLACN2, SLATBS, SRSCL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -5
-      ELSE IF( ANORM.LT.ZERO ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SPBCON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      RCOND = ZERO
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      ELSE IF( ANORM.EQ.ZERO ) THEN
-         RETURN
-      END IF
-*
-      SMLNUM = SLAMCH( 'Safe minimum' )
-*
-*     Estimate the 1-norm of the inverse.
-*
-      KASE = 0
-      NORMIN = 'N'
-   10 CONTINUE
-      CALL SLACN2( N, WORK( N+1 ), WORK, IWORK, AINVNM, KASE, ISAVE )
-      IF( KASE.NE.0 ) THEN
-         IF( UPPER ) THEN
-*
-*           Multiply by inv(U').
-*
-            CALL SLATBS( 'Upper', 'Transpose', 'Non-unit', NORMIN, N,
-     $                   KD, AB, LDAB, WORK, SCALEL, WORK( 2*N+1 ),
-     $                   INFO )
-            NORMIN = 'Y'
-*
-*           Multiply by inv(U).
-*
-            CALL SLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   KD, AB, LDAB, WORK, SCALEU, WORK( 2*N+1 ),
-     $                   INFO )
-         ELSE
-*
-*           Multiply by inv(L).
-*
-            CALL SLATBS( 'Lower', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   KD, AB, LDAB, WORK, SCALEL, WORK( 2*N+1 ),
-     $                   INFO )
-            NORMIN = 'Y'
-*
-*           Multiply by inv(L').
-*
-            CALL SLATBS( 'Lower', 'Transpose', 'Non-unit', NORMIN, N,
-     $                   KD, AB, LDAB, WORK, SCALEU, WORK( 2*N+1 ),
-     $                   INFO )
-         END IF
-*
-*        Multiply by 1/SCALE if doing so will not cause overflow.
-*
-         SCALE = SCALEL*SCALEU
-         IF( SCALE.NE.ONE ) THEN
-            IX = ISAMAX( N, WORK, 1 )
-            IF( SCALE.LT.ABS( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
-     $         GO TO 20
-            CALL SRSCL( N, SCALE, WORK, 1 )
-         END IF
-         GO TO 10
-      END IF
-*
-*     Compute the estimate of the reciprocal condition number.
-*
-      IF( AINVNM.NE.ZERO )
-     $   RCOND = ( ONE / AINVNM ) / ANORM
-*
-   20 CONTINUE
-*
-      RETURN
-*
-*     End of SPBCON
-*
-      END
--- a/libcruft/lapack/spbtf2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,194 +0,0 @@
-      SUBROUTINE SPBTF2( UPLO, N, KD, AB, LDAB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, KD, LDAB, N
-*     ..
-*     .. Array Arguments ..
-      REAL               AB( LDAB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SPBTF2 computes the Cholesky factorization of a real symmetric
-*  positive definite band matrix A.
-*
-*  The factorization has the form
-*     A = U' * U ,  if UPLO = 'U', or
-*     A = L  * L',  if UPLO = 'L',
-*  where U is an upper triangular matrix, U' is the transpose of U, and
-*  L is lower triangular.
-*
-*  This is the unblocked version of the algorithm, calling Level 2 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          symmetric matrix A is stored:
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of super-diagonals of the matrix A if UPLO = 'U',
-*          or the number of sub-diagonals if UPLO = 'L'.  KD >= 0.
-*
-*  AB      (input/output) REAL array, dimension (LDAB,N)
-*          On entry, the upper or lower triangle of the symmetric band
-*          matrix A, stored in the first KD+1 rows of the array.  The
-*          j-th column of A is stored in the j-th column of the array AB
-*          as follows:
-*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
-*
-*          On exit, if INFO = 0, the triangular factor U or L from the
-*          Cholesky factorization A = U'*U or A = L*L' of the band
-*          matrix A, in the same storage format as A.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*          > 0: if INFO = k, the leading minor of order k is not
-*               positive definite, and the factorization could not be
-*               completed.
-*
-*  Further Details
-*  ===============
-*
-*  The band storage scheme is illustrated by the following example, when
-*  N = 6, KD = 2, and UPLO = 'U':
-*
-*  On entry:                       On exit:
-*
-*      *    *   a13  a24  a35  a46      *    *   u13  u24  u35  u46
-*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
-*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
-*
-*  Similarly, if UPLO = 'L' the format of A is as follows:
-*
-*  On entry:                       On exit:
-*
-*     a11  a22  a33  a44  a55  a66     l11  l22  l33  l44  l55  l66
-*     a21  a32  a43  a54  a65   *      l21  l32  l43  l54  l65   *
-*     a31  a42  a53  a64   *    *      l31  l42  l53  l64   *    *
-*
-*  Array elements marked * are not used by the routine.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            J, KLD, KN
-      REAL               AJJ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SSCAL, SSYR, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SPBTF2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      KLD = MAX( 1, LDAB-1 )
-*
-      IF( UPPER ) THEN
-*
-*        Compute the Cholesky factorization A = U'*U.
-*
-         DO 10 J = 1, N
-*
-*           Compute U(J,J) and test for non-positive-definiteness.
-*
-            AJJ = AB( KD+1, J )
-            IF( AJJ.LE.ZERO )
-     $         GO TO 30
-            AJJ = SQRT( AJJ )
-            AB( KD+1, J ) = AJJ
-*
-*           Compute elements J+1:J+KN of row J and update the
-*           trailing submatrix within the band.
-*
-            KN = MIN( KD, N-J )
-            IF( KN.GT.0 ) THEN
-               CALL SSCAL( KN, ONE / AJJ, AB( KD, J+1 ), KLD )
-               CALL SSYR( 'Upper', KN, -ONE, AB( KD, J+1 ), KLD,
-     $                    AB( KD+1, J+1 ), KLD )
-            END IF
-   10    CONTINUE
-      ELSE
-*
-*        Compute the Cholesky factorization A = L*L'.
-*
-         DO 20 J = 1, N
-*
-*           Compute L(J,J) and test for non-positive-definiteness.
-*
-            AJJ = AB( 1, J )
-            IF( AJJ.LE.ZERO )
-     $         GO TO 30
-            AJJ = SQRT( AJJ )
-            AB( 1, J ) = AJJ
-*
-*           Compute elements J+1:J+KN of column J and update the
-*           trailing submatrix within the band.
-*
-            KN = MIN( KD, N-J )
-            IF( KN.GT.0 ) THEN
-               CALL SSCAL( KN, ONE / AJJ, AB( 2, J ), 1 )
-               CALL SSYR( 'Lower', KN, -ONE, AB( 2, J ), 1,
-     $                    AB( 1, J+1 ), KLD )
-            END IF
-   20    CONTINUE
-      END IF
-      RETURN
-*
-   30 CONTINUE
-      INFO = J
-      RETURN
-*
-*     End of SPBTF2
-*
-      END
--- a/libcruft/lapack/spbtrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,364 +0,0 @@
-      SUBROUTINE SPBTRF( UPLO, N, KD, AB, LDAB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, KD, LDAB, N
-*     ..
-*     .. Array Arguments ..
-      REAL               AB( LDAB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SPBTRF computes the Cholesky factorization of a real symmetric
-*  positive definite band matrix A.
-*
-*  The factorization has the form
-*     A = U**T * U,  if UPLO = 'U', or
-*     A = L  * L**T,  if UPLO = 'L',
-*  where U is an upper triangular matrix and L is lower triangular.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of superdiagonals of the matrix A if UPLO = 'U',
-*          or the number of subdiagonals if UPLO = 'L'.  KD >= 0.
-*
-*  AB      (input/output) REAL array, dimension (LDAB,N)
-*          On entry, the upper or lower triangle of the symmetric band
-*          matrix A, stored in the first KD+1 rows of the array.  The
-*          j-th column of A is stored in the j-th column of the array AB
-*          as follows:
-*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
-*
-*          On exit, if INFO = 0, the triangular factor U or L from the
-*          Cholesky factorization A = U**T*U or A = L*L**T of the band
-*          matrix A, in the same storage format as A.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the leading minor of order i is not
-*                positive definite, and the factorization could not be
-*                completed.
-*
-*  Further Details
-*  ===============
-*
-*  The band storage scheme is illustrated by the following example, when
-*  N = 6, KD = 2, and UPLO = 'U':
-*
-*  On entry:                       On exit:
-*
-*      *    *   a13  a24  a35  a46      *    *   u13  u24  u35  u46
-*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
-*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
-*
-*  Similarly, if UPLO = 'L' the format of A is as follows:
-*
-*  On entry:                       On exit:
-*
-*     a11  a22  a33  a44  a55  a66     l11  l22  l33  l44  l55  l66
-*     a21  a32  a43  a54  a65   *      l21  l32  l43  l54  l65   *
-*     a31  a42  a53  a64   *    *      l31  l42  l53  l64   *    *
-*
-*  Array elements marked * are not used by the routine.
-*
-*  Contributed by
-*  Peter Mayes and Giuseppe Radicati, IBM ECSEC, Rome, March 23, 1989
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-      INTEGER            NBMAX, LDWORK
-      PARAMETER          ( NBMAX = 32, LDWORK = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I2, I3, IB, II, J, JJ, NB
-*     ..
-*     .. Local Arrays ..
-      REAL               WORK( LDWORK, NBMAX )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEMM, SPBTF2, SPOTF2, SSYRK, STRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( ( .NOT.LSAME( UPLO, 'U' ) ) .AND.
-     $    ( .NOT.LSAME( UPLO, 'L' ) ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SPBTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment
-*
-      NB = ILAENV( 1, 'SPBTRF', UPLO, N, KD, -1, -1 )
-*
-*     The block size must not exceed the semi-bandwidth KD, and must not
-*     exceed the limit set by the size of the local array WORK.
-*
-      NB = MIN( NB, NBMAX )
-*
-      IF( NB.LE.1 .OR. NB.GT.KD ) THEN
-*
-*        Use unblocked code
-*
-         CALL SPBTF2( UPLO, N, KD, AB, LDAB, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( LSAME( UPLO, 'U' ) ) THEN
-*
-*           Compute the Cholesky factorization of a symmetric band
-*           matrix, given the upper triangle of the matrix in band
-*           storage.
-*
-*           Zero the upper triangle of the work array.
-*
-            DO 20 J = 1, NB
-               DO 10 I = 1, J - 1
-                  WORK( I, J ) = ZERO
-   10          CONTINUE
-   20       CONTINUE
-*
-*           Process the band matrix one diagonal block at a time.
-*
-            DO 70 I = 1, N, NB
-               IB = MIN( NB, N-I+1 )
-*
-*              Factorize the diagonal block
-*
-               CALL SPOTF2( UPLO, IB, AB( KD+1, I ), LDAB-1, II )
-               IF( II.NE.0 ) THEN
-                  INFO = I + II - 1
-                  GO TO 150
-               END IF
-               IF( I+IB.LE.N ) THEN
-*
-*                 Update the relevant part of the trailing submatrix.
-*                 If A11 denotes the diagonal block which has just been
-*                 factorized, then we need to update the remaining
-*                 blocks in the diagram:
-*
-*                    A11   A12   A13
-*                          A22   A23
-*                                A33
-*
-*                 The numbers of rows and columns in the partitioning
-*                 are IB, I2, I3 respectively. The blocks A12, A22 and
-*                 A23 are empty if IB = KD. The upper triangle of A13
-*                 lies outside the band.
-*
-                  I2 = MIN( KD-IB, N-I-IB+1 )
-                  I3 = MIN( IB, N-I-KD+1 )
-*
-                  IF( I2.GT.0 ) THEN
-*
-*                    Update A12
-*
-                     CALL STRSM( 'Left', 'Upper', 'Transpose',
-     $                           'Non-unit', IB, I2, ONE, AB( KD+1, I ),
-     $                           LDAB-1, AB( KD+1-IB, I+IB ), LDAB-1 )
-*
-*                    Update A22
-*
-                     CALL SSYRK( 'Upper', 'Transpose', I2, IB, -ONE,
-     $                           AB( KD+1-IB, I+IB ), LDAB-1, ONE,
-     $                           AB( KD+1, I+IB ), LDAB-1 )
-                  END IF
-*
-                  IF( I3.GT.0 ) THEN
-*
-*                    Copy the lower triangle of A13 into the work array.
-*
-                     DO 40 JJ = 1, I3
-                        DO 30 II = JJ, IB
-                           WORK( II, JJ ) = AB( II-JJ+1, JJ+I+KD-1 )
-   30                   CONTINUE
-   40                CONTINUE
-*
-*                    Update A13 (in the work array).
-*
-                     CALL STRSM( 'Left', 'Upper', 'Transpose',
-     $                           'Non-unit', IB, I3, ONE, AB( KD+1, I ),
-     $                           LDAB-1, WORK, LDWORK )
-*
-*                    Update A23
-*
-                     IF( I2.GT.0 )
-     $                  CALL SGEMM( 'Transpose', 'No Transpose', I2, I3,
-     $                              IB, -ONE, AB( KD+1-IB, I+IB ),
-     $                              LDAB-1, WORK, LDWORK, ONE,
-     $                              AB( 1+IB, I+KD ), LDAB-1 )
-*
-*                    Update A33
-*
-                     CALL SSYRK( 'Upper', 'Transpose', I3, IB, -ONE,
-     $                           WORK, LDWORK, ONE, AB( KD+1, I+KD ),
-     $                           LDAB-1 )
-*
-*                    Copy the lower triangle of A13 back into place.
-*
-                     DO 60 JJ = 1, I3
-                        DO 50 II = JJ, IB
-                           AB( II-JJ+1, JJ+I+KD-1 ) = WORK( II, JJ )
-   50                   CONTINUE
-   60                CONTINUE
-                  END IF
-               END IF
-   70       CONTINUE
-         ELSE
-*
-*           Compute the Cholesky factorization of a symmetric band
-*           matrix, given the lower triangle of the matrix in band
-*           storage.
-*
-*           Zero the lower triangle of the work array.
-*
-            DO 90 J = 1, NB
-               DO 80 I = J + 1, NB
-                  WORK( I, J ) = ZERO
-   80          CONTINUE
-   90       CONTINUE
-*
-*           Process the band matrix one diagonal block at a time.
-*
-            DO 140 I = 1, N, NB
-               IB = MIN( NB, N-I+1 )
-*
-*              Factorize the diagonal block
-*
-               CALL SPOTF2( UPLO, IB, AB( 1, I ), LDAB-1, II )
-               IF( II.NE.0 ) THEN
-                  INFO = I + II - 1
-                  GO TO 150
-               END IF
-               IF( I+IB.LE.N ) THEN
-*
-*                 Update the relevant part of the trailing submatrix.
-*                 If A11 denotes the diagonal block which has just been
-*                 factorized, then we need to update the remaining
-*                 blocks in the diagram:
-*
-*                    A11
-*                    A21   A22
-*                    A31   A32   A33
-*
-*                 The numbers of rows and columns in the partitioning
-*                 are IB, I2, I3 respectively. The blocks A21, A22 and
-*                 A32 are empty if IB = KD. The lower triangle of A31
-*                 lies outside the band.
-*
-                  I2 = MIN( KD-IB, N-I-IB+1 )
-                  I3 = MIN( IB, N-I-KD+1 )
-*
-                  IF( I2.GT.0 ) THEN
-*
-*                    Update A21
-*
-                     CALL STRSM( 'Right', 'Lower', 'Transpose',
-     $                           'Non-unit', I2, IB, ONE, AB( 1, I ),
-     $                           LDAB-1, AB( 1+IB, I ), LDAB-1 )
-*
-*                    Update A22
-*
-                     CALL SSYRK( 'Lower', 'No Transpose', I2, IB, -ONE,
-     $                           AB( 1+IB, I ), LDAB-1, ONE,
-     $                           AB( 1, I+IB ), LDAB-1 )
-                  END IF
-*
-                  IF( I3.GT.0 ) THEN
-*
-*                    Copy the upper triangle of A31 into the work array.
-*
-                     DO 110 JJ = 1, IB
-                        DO 100 II = 1, MIN( JJ, I3 )
-                           WORK( II, JJ ) = AB( KD+1-JJ+II, JJ+I-1 )
-  100                   CONTINUE
-  110                CONTINUE
-*
-*                    Update A31 (in the work array).
-*
-                     CALL STRSM( 'Right', 'Lower', 'Transpose',
-     $                           'Non-unit', I3, IB, ONE, AB( 1, I ),
-     $                           LDAB-1, WORK, LDWORK )
-*
-*                    Update A32
-*
-                     IF( I2.GT.0 )
-     $                  CALL SGEMM( 'No transpose', 'Transpose', I3, I2,
-     $                              IB, -ONE, WORK, LDWORK,
-     $                              AB( 1+IB, I ), LDAB-1, ONE,
-     $                              AB( 1+KD-IB, I+IB ), LDAB-1 )
-*
-*                    Update A33
-*
-                     CALL SSYRK( 'Lower', 'No Transpose', I3, IB, -ONE,
-     $                           WORK, LDWORK, ONE, AB( 1, I+KD ),
-     $                           LDAB-1 )
-*
-*                    Copy the upper triangle of A31 back into place.
-*
-                     DO 130 JJ = 1, IB
-                        DO 120 II = 1, MIN( JJ, I3 )
-                           AB( KD+1-JJ+II, JJ+I-1 ) = WORK( II, JJ )
-  120                   CONTINUE
-  130                CONTINUE
-                  END IF
-               END IF
-  140       CONTINUE
-         END IF
-      END IF
-      RETURN
-*
-  150 CONTINUE
-      RETURN
-*
-*     End of SPBTRF
-*
-      END
--- a/libcruft/lapack/spbtrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-      SUBROUTINE SPBTRS( UPLO, N, KD, NRHS, AB, LDAB, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, KD, LDAB, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      REAL               AB( LDAB, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SPBTRS solves a system of linear equations A*X = B with a symmetric
-*  positive definite band matrix A using the Cholesky factorization
-*  A = U**T*U or A = L*L**T computed by SPBTRF.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangular factor stored in AB;
-*          = 'L':  Lower triangular factor stored in AB.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of superdiagonals of the matrix A if UPLO = 'U',
-*          or the number of subdiagonals if UPLO = 'L'.  KD >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  AB      (input) REAL array, dimension (LDAB,N)
-*          The triangular factor U or L from the Cholesky factorization
-*          A = U**T*U or A = L*L**T of the band matrix A, stored in the
-*          first KD+1 rows of the array.  The j-th column of U or L is
-*          stored in the j-th column of the array AB as follows:
-*          if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO ='L', AB(1+i-j,j)    = L(i,j) for j<=i<=min(n,j+kd).
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  B       (input/output) REAL array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           STBSV, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -6
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SPBTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Solve A*X = B where A = U'*U.
-*
-         DO 10 J = 1, NRHS
-*
-*           Solve U'*X = B, overwriting B with X.
-*
-            CALL STBSV( 'Upper', 'Transpose', 'Non-unit', N, KD, AB,
-     $                  LDAB, B( 1, J ), 1 )
-*
-*           Solve U*X = B, overwriting B with X.
-*
-            CALL STBSV( 'Upper', 'No transpose', 'Non-unit', N, KD, AB,
-     $                  LDAB, B( 1, J ), 1 )
-   10    CONTINUE
-      ELSE
-*
-*        Solve A*X = B where A = L*L'.
-*
-         DO 20 J = 1, NRHS
-*
-*           Solve L*X = B, overwriting B with X.
-*
-            CALL STBSV( 'Lower', 'No transpose', 'Non-unit', N, KD, AB,
-     $                  LDAB, B( 1, J ), 1 )
-*
-*           Solve L'*X = B, overwriting B with X.
-*
-            CALL STBSV( 'Lower', 'Transpose', 'Non-unit', N, KD, AB,
-     $                  LDAB, B( 1, J ), 1 )
-   20    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of SPBTRS
-*
-      END
--- a/libcruft/lapack/spocon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,177 +0,0 @@
-      SUBROUTINE SPOCON( UPLO, N, A, LDA, ANORM, RCOND, WORK, IWORK,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call SLACN2 in place of SLACON, 7 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-      REAL               ANORM, RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      REAL               A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SPOCON estimates the reciprocal of the condition number (in the 
-*  1-norm) of a real symmetric positive definite matrix using the
-*  Cholesky factorization A = U**T*U or A = L*L**T computed by SPOTRF.
-*
-*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
-*  condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))).
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input) REAL array, dimension (LDA,N)
-*          The triangular factor U or L from the Cholesky factorization
-*          A = U**T*U or A = L*L**T, as computed by SPOTRF.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  ANORM   (input) REAL
-*          The 1-norm (or infinity-norm) of the symmetric matrix A.
-*
-*  RCOND   (output) REAL
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an
-*          estimate of the 1-norm of inv(A) computed in this routine.
-*
-*  WORK    (workspace) REAL array, dimension (3*N)
-*
-*  IWORK   (workspace) INTEGER array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      CHARACTER          NORMIN
-      INTEGER            IX, KASE
-      REAL               AINVNM, SCALE, SCALEL, SCALEU, SMLNUM
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ISAMAX
-      REAL               SLAMCH
-      EXTERNAL           LSAME, ISAMAX, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLACN2, SLATRS, SRSCL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( ANORM.LT.ZERO ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SPOCON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      RCOND = ZERO
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      ELSE IF( ANORM.EQ.ZERO ) THEN
-         RETURN
-      END IF
-*
-      SMLNUM = SLAMCH( 'Safe minimum' )
-*
-*     Estimate the 1-norm of inv(A).
-*
-      KASE = 0
-      NORMIN = 'N'
-   10 CONTINUE
-      CALL SLACN2( N, WORK( N+1 ), WORK, IWORK, AINVNM, KASE, ISAVE )
-      IF( KASE.NE.0 ) THEN
-         IF( UPPER ) THEN
-*
-*           Multiply by inv(U').
-*
-            CALL SLATRS( 'Upper', 'Transpose', 'Non-unit', NORMIN, N, A,
-     $                   LDA, WORK, SCALEL, WORK( 2*N+1 ), INFO )
-            NORMIN = 'Y'
-*
-*           Multiply by inv(U).
-*
-            CALL SLATRS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   A, LDA, WORK, SCALEU, WORK( 2*N+1 ), INFO )
-         ELSE
-*
-*           Multiply by inv(L).
-*
-            CALL SLATRS( 'Lower', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   A, LDA, WORK, SCALEL, WORK( 2*N+1 ), INFO )
-            NORMIN = 'Y'
-*
-*           Multiply by inv(L').
-*
-            CALL SLATRS( 'Lower', 'Transpose', 'Non-unit', NORMIN, N, A,
-     $                   LDA, WORK, SCALEU, WORK( 2*N+1 ), INFO )
-         END IF
-*
-*        Multiply by 1/SCALE if doing so will not cause overflow.
-*
-         SCALE = SCALEL*SCALEU
-         IF( SCALE.NE.ONE ) THEN
-            IX = ISAMAX( N, WORK, 1 )
-            IF( SCALE.LT.ABS( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
-     $         GO TO 20
-            CALL SRSCL( N, SCALE, WORK, 1 )
-         END IF
-         GO TO 10
-      END IF
-*
-*     Compute the estimate of the reciprocal condition number.
-*
-      IF( AINVNM.NE.ZERO )
-     $   RCOND = ( ONE / AINVNM ) / ANORM
-*
-   20 CONTINUE
-      RETURN
-*
-*     End of SPOCON
-*
-      END
--- a/libcruft/lapack/spotf2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,167 +0,0 @@
-      SUBROUTINE SPOTF2( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SPOTF2 computes the Cholesky factorization of a real symmetric
-*  positive definite matrix A.
-*
-*  The factorization has the form
-*     A = U' * U ,  if UPLO = 'U', or
-*     A = L  * L',  if UPLO = 'L',
-*  where U is an upper triangular matrix and L is lower triangular.
-*
-*  This is the unblocked version of the algorithm, calling Level 2 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          symmetric matrix A is stored.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the leading
-*          n by n upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n by n lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*
-*          On exit, if INFO = 0, the factor U or L from the Cholesky
-*          factorization A = U'*U  or A = L*L'.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*          > 0: if INFO = k, the leading minor of order k is not
-*               positive definite, and the factorization could not be
-*               completed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            J
-      REAL               AJJ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               SDOT
-      EXTERNAL           LSAME, SDOT
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEMV, SSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SPOTF2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Compute the Cholesky factorization A = U'*U.
-*
-         DO 10 J = 1, N
-*
-*           Compute U(J,J) and test for non-positive-definiteness.
-*
-            AJJ = A( J, J ) - SDOT( J-1, A( 1, J ), 1, A( 1, J ), 1 )
-            IF( AJJ.LE.ZERO ) THEN
-               A( J, J ) = AJJ
-               GO TO 30
-            END IF
-            AJJ = SQRT( AJJ )
-            A( J, J ) = AJJ
-*
-*           Compute elements J+1:N of row J.
-*
-            IF( J.LT.N ) THEN
-               CALL SGEMV( 'Transpose', J-1, N-J, -ONE, A( 1, J+1 ),
-     $                     LDA, A( 1, J ), 1, ONE, A( J, J+1 ), LDA )
-               CALL SSCAL( N-J, ONE / AJJ, A( J, J+1 ), LDA )
-            END IF
-   10    CONTINUE
-      ELSE
-*
-*        Compute the Cholesky factorization A = L*L'.
-*
-         DO 20 J = 1, N
-*
-*           Compute L(J,J) and test for non-positive-definiteness.
-*
-            AJJ = A( J, J ) - SDOT( J-1, A( J, 1 ), LDA, A( J, 1 ),
-     $            LDA )
-            IF( AJJ.LE.ZERO ) THEN
-               A( J, J ) = AJJ
-               GO TO 30
-            END IF
-            AJJ = SQRT( AJJ )
-            A( J, J ) = AJJ
-*
-*           Compute elements J+1:N of column J.
-*
-            IF( J.LT.N ) THEN
-               CALL SGEMV( 'No transpose', N-J, J-1, -ONE, A( J+1, 1 ),
-     $                     LDA, A( J, 1 ), LDA, ONE, A( J+1, J ), 1 )
-               CALL SSCAL( N-J, ONE / AJJ, A( J+1, J ), 1 )
-            END IF
-   20    CONTINUE
-      END IF
-      GO TO 40
-*
-   30 CONTINUE
-      INFO = J
-*
-   40 CONTINUE
-      RETURN
-*
-*     End of SPOTF2
-*
-      END
--- a/libcruft/lapack/spotrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,183 +0,0 @@
-      SUBROUTINE SPOTRF( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SPOTRF computes the Cholesky factorization of a real symmetric
-*  positive definite matrix A.
-*
-*  The factorization has the form
-*     A = U**T * U,  if UPLO = 'U', or
-*     A = L  * L**T,  if UPLO = 'L',
-*  where U is an upper triangular matrix and L is lower triangular.
-*
-*  This is the block version of the algorithm, calling Level 3 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the leading
-*          N-by-N upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading N-by-N lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*
-*          On exit, if INFO = 0, the factor U or L from the Cholesky
-*          factorization A = U**T*U or A = L*L**T.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the leading minor of order i is not
-*                positive definite, and the factorization could not be
-*                completed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            J, JB, NB
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEMM, SPOTF2, SSYRK, STRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SPOTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'SPOTRF', UPLO, N, -1, -1, -1 )
-      IF( NB.LE.1 .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code.
-*
-         CALL SPOTF2( UPLO, N, A, LDA, INFO )
-      ELSE
-*
-*        Use blocked code.
-*
-         IF( UPPER ) THEN
-*
-*           Compute the Cholesky factorization A = U'*U.
-*
-            DO 10 J = 1, N, NB
-*
-*              Update and factorize the current diagonal block and test
-*              for non-positive-definiteness.
-*
-               JB = MIN( NB, N-J+1 )
-               CALL SSYRK( 'Upper', 'Transpose', JB, J-1, -ONE,
-     $                     A( 1, J ), LDA, ONE, A( J, J ), LDA )
-               CALL SPOTF2( 'Upper', JB, A( J, J ), LDA, INFO )
-               IF( INFO.NE.0 )
-     $            GO TO 30
-               IF( J+JB.LE.N ) THEN
-*
-*                 Compute the current block row.
-*
-                  CALL SGEMM( 'Transpose', 'No transpose', JB, N-J-JB+1,
-     $                        J-1, -ONE, A( 1, J ), LDA, A( 1, J+JB ),
-     $                        LDA, ONE, A( J, J+JB ), LDA )
-                  CALL STRSM( 'Left', 'Upper', 'Transpose', 'Non-unit',
-     $                        JB, N-J-JB+1, ONE, A( J, J ), LDA,
-     $                        A( J, J+JB ), LDA )
-               END IF
-   10       CONTINUE
-*
-         ELSE
-*
-*           Compute the Cholesky factorization A = L*L'.
-*
-            DO 20 J = 1, N, NB
-*
-*              Update and factorize the current diagonal block and test
-*              for non-positive-definiteness.
-*
-               JB = MIN( NB, N-J+1 )
-               CALL SSYRK( 'Lower', 'No transpose', JB, J-1, -ONE,
-     $                     A( J, 1 ), LDA, ONE, A( J, J ), LDA )
-               CALL SPOTF2( 'Lower', JB, A( J, J ), LDA, INFO )
-               IF( INFO.NE.0 )
-     $            GO TO 30
-               IF( J+JB.LE.N ) THEN
-*
-*                 Compute the current block column.
-*
-                  CALL SGEMM( 'No transpose', 'Transpose', N-J-JB+1, JB,
-     $                        J-1, -ONE, A( J+JB, 1 ), LDA, A( J, 1 ),
-     $                        LDA, ONE, A( J+JB, J ), LDA )
-                  CALL STRSM( 'Right', 'Lower', 'Transpose', 'Non-unit',
-     $                        N-J-JB+1, JB, ONE, A( J, J ), LDA,
-     $                        A( J+JB, J ), LDA )
-               END IF
-   20       CONTINUE
-         END IF
-      END IF
-      GO TO 40
-*
-   30 CONTINUE
-      INFO = INFO + J - 1
-*
-   40 CONTINUE
-      RETURN
-*
-*     End of SPOTRF
-*
-      END
--- a/libcruft/lapack/spotri.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-      SUBROUTINE SPOTRI( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SPOTRI computes the inverse of a real symmetric positive definite
-*  matrix A using the Cholesky factorization A = U**T*U or A = L*L**T
-*  computed by SPOTRF.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the triangular factor U or L from the Cholesky
-*          factorization A = U**T*U or A = L*L**T, as computed by
-*          SPOTRF.
-*          On exit, the upper or lower triangle of the (symmetric)
-*          inverse of A, overwriting the input factor U or L.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the (i,i) element of the factor U or L is
-*                zero, and the inverse could not be computed.
-*
-*  =====================================================================
-*
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLAUUM, STRTRI, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SPOTRI', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Invert the triangular Cholesky factor U or L.
-*
-      CALL STRTRI( UPLO, 'Non-unit', N, A, LDA, INFO )
-      IF( INFO.GT.0 )
-     $   RETURN
-*
-*     Form inv(U)*inv(U)' or inv(L)'*inv(L).
-*
-      CALL SLAUUM( UPLO, N, A, LDA, INFO )
-*
-      RETURN
-*
-*     End of SPOTRI
-*
-      END
--- a/libcruft/lapack/spotrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-      SUBROUTINE SPOTRS( UPLO, N, NRHS, A, LDA, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SPOTRS solves a system of linear equations A*X = B with a symmetric
-*  positive definite matrix A using the Cholesky factorization
-*  A = U**T*U or A = L*L**T computed by SPOTRF.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  A       (input) REAL array, dimension (LDA,N)
-*          The triangular factor U or L from the Cholesky factorization
-*          A = U**T*U or A = L*L**T, as computed by SPOTRF.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input/output) REAL array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           STRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SPOTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Solve A*X = B where A = U'*U.
-*
-*        Solve U'*X = B, overwriting B with X.
-*
-         CALL STRSM( 'Left', 'Upper', 'Transpose', 'Non-unit', N, NRHS,
-     $               ONE, A, LDA, B, LDB )
-*
-*        Solve U*X = B, overwriting B with X.
-*
-         CALL STRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N,
-     $               NRHS, ONE, A, LDA, B, LDB )
-      ELSE
-*
-*        Solve A*X = B where A = L*L'.
-*
-*        Solve L*X = B, overwriting B with X.
-*
-         CALL STRSM( 'Left', 'Lower', 'No transpose', 'Non-unit', N,
-     $               NRHS, ONE, A, LDA, B, LDB )
-*
-*        Solve L'*X = B, overwriting B with X.
-*
-         CALL STRSM( 'Left', 'Lower', 'Transpose', 'Non-unit', N, NRHS,
-     $               ONE, A, LDA, B, LDB )
-      END IF
-*
-      RETURN
-*
-*     End of SPOTRS
-*
-      END
--- a/libcruft/lapack/sptsv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-      SUBROUTINE SPTSV( N, NRHS, D, E, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      REAL               B( LDB, * ), D( * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SPTSV computes the solution to a real system of linear equations
-*  A*X = B, where A is an N-by-N symmetric positive definite tridiagonal
-*  matrix, and X and B are N-by-NRHS matrices.
-*
-*  A is factored as A = L*D*L**T, and the factored form of A is then
-*  used to solve the system of equations.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  D       (input/output) REAL array, dimension (N)
-*          On entry, the n diagonal elements of the tridiagonal matrix
-*          A.  On exit, the n diagonal elements of the diagonal matrix
-*          D from the factorization A = L*D*L**T.
-*
-*  E       (input/output) REAL array, dimension (N-1)
-*          On entry, the (n-1) subdiagonal elements of the tridiagonal
-*          matrix A.  On exit, the (n-1) subdiagonal elements of the
-*          unit bidiagonal factor L from the L*D*L**T factorization of
-*          A.  (E can also be regarded as the superdiagonal of the unit
-*          bidiagonal factor U from the U**T*D*U factorization of A.)
-*
-*  B       (input/output) REAL array, dimension (LDB,NRHS)
-*          On entry, the N-by-NRHS right hand side matrix B.
-*          On exit, if INFO = 0, the N-by-NRHS solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the leading minor of order i is not
-*                positive definite, and the solution has not been
-*                computed.  The factorization has not been completed
-*                unless i = N.
-*
-*  =====================================================================
-*
-*     .. External Subroutines ..
-      EXTERNAL           SPTTRF, SPTTRS, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SPTSV ', -INFO )
-         RETURN
-      END IF
-*
-*     Compute the L*D*L' (or U'*D*U) factorization of A.
-*
-      CALL SPTTRF( N, D, E, INFO )
-      IF( INFO.EQ.0 ) THEN
-*
-*        Solve the system A*X = B, overwriting B with X.
-*
-         CALL SPTTRS( N, NRHS, D, E, B, LDB, INFO )
-      END IF
-      RETURN
-*
-*     End of SPTSV
-*
-      END
--- a/libcruft/lapack/spttrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,152 +0,0 @@
-      SUBROUTINE SPTTRF( N, D, E, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, N
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SPTTRF computes the L*D*L' factorization of a real symmetric
-*  positive definite tridiagonal matrix A.  The factorization may also
-*  be regarded as having the form A = U'*D*U.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  D       (input/output) REAL array, dimension (N)
-*          On entry, the n diagonal elements of the tridiagonal matrix
-*          A.  On exit, the n diagonal elements of the diagonal matrix
-*          D from the L*D*L' factorization of A.
-*
-*  E       (input/output) REAL array, dimension (N-1)
-*          On entry, the (n-1) subdiagonal elements of the tridiagonal
-*          matrix A.  On exit, the (n-1) subdiagonal elements of the
-*          unit bidiagonal factor L from the L*D*L' factorization of A.
-*          E can also be regarded as the superdiagonal of the unit
-*          bidiagonal factor U from the U'*D*U factorization of A.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*          > 0: if INFO = k, the leading minor of order k is not
-*               positive definite; if k < N, the factorization could not
-*               be completed, while if k = N, the factorization was
-*               completed, but D(N) <= 0.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I4
-      REAL               EI
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MOD
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-         CALL XERBLA( 'SPTTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Compute the L*D*L' (or U'*D*U) factorization of A.
-*
-      I4 = MOD( N-1, 4 )
-      DO 10 I = 1, I4
-         IF( D( I ).LE.ZERO ) THEN
-            INFO = I
-            GO TO 30
-         END IF
-         EI = E( I )
-         E( I ) = EI / D( I )
-         D( I+1 ) = D( I+1 ) - E( I )*EI
-   10 CONTINUE
-*
-      DO 20 I = I4 + 1, N - 4, 4
-*
-*        Drop out of the loop if d(i) <= 0: the matrix is not positive
-*        definite.
-*
-         IF( D( I ).LE.ZERO ) THEN
-            INFO = I
-            GO TO 30
-         END IF
-*
-*        Solve for e(i) and d(i+1).
-*
-         EI = E( I )
-         E( I ) = EI / D( I )
-         D( I+1 ) = D( I+1 ) - E( I )*EI
-*
-         IF( D( I+1 ).LE.ZERO ) THEN
-            INFO = I + 1
-            GO TO 30
-         END IF
-*
-*        Solve for e(i+1) and d(i+2).
-*
-         EI = E( I+1 )
-         E( I+1 ) = EI / D( I+1 )
-         D( I+2 ) = D( I+2 ) - E( I+1 )*EI
-*
-         IF( D( I+2 ).LE.ZERO ) THEN
-            INFO = I + 2
-            GO TO 30
-         END IF
-*
-*        Solve for e(i+2) and d(i+3).
-*
-         EI = E( I+2 )
-         E( I+2 ) = EI / D( I+2 )
-         D( I+3 ) = D( I+3 ) - E( I+2 )*EI
-*
-         IF( D( I+3 ).LE.ZERO ) THEN
-            INFO = I + 3
-            GO TO 30
-         END IF
-*
-*        Solve for e(i+3) and d(i+4).
-*
-         EI = E( I+3 )
-         E( I+3 ) = EI / D( I+3 )
-         D( I+4 ) = D( I+4 ) - E( I+3 )*EI
-   20 CONTINUE
-*
-*     Check d(n) for positive definiteness.
-*
-      IF( D( N ).LE.ZERO )
-     $   INFO = N
-*
-   30 CONTINUE
-      RETURN
-*
-*     End of SPTTRF
-*
-      END
--- a/libcruft/lapack/spttrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-      SUBROUTINE SPTTRS( N, NRHS, D, E, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      REAL               B( LDB, * ), D( * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SPTTRS solves a tridiagonal system of the form
-*     A * X = B
-*  using the L*D*L' factorization of A computed by SPTTRF.  D is a
-*  diagonal matrix specified in the vector D, L is a unit bidiagonal
-*  matrix whose subdiagonal is specified in the vector E, and X and B
-*  are N by NRHS matrices.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the tridiagonal matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  D       (input) REAL array, dimension (N)
-*          The n diagonal elements of the diagonal matrix D from the
-*          L*D*L' factorization of A.
-*
-*  E       (input) REAL array, dimension (N-1)
-*          The (n-1) subdiagonal elements of the unit bidiagonal factor
-*          L from the L*D*L' factorization of A.  E can also be regarded
-*          as the superdiagonal of the unit bidiagonal factor U from the
-*          factorization A = U'*D*U.
-*
-*  B       (input/output) REAL array, dimension (LDB,NRHS)
-*          On entry, the right hand side vectors B for the system of
-*          linear equations.
-*          On exit, the solution vectors, X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            J, JB, NB
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SPTTS2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments.
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SPTTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-*     Determine the number of right-hand sides to solve at a time.
-*
-      IF( NRHS.EQ.1 ) THEN
-         NB = 1
-      ELSE
-         NB = MAX( 1, ILAENV( 1, 'SPTTRS', ' ', N, NRHS, -1, -1 ) )
-      END IF
-*
-      IF( NB.GE.NRHS ) THEN
-         CALL SPTTS2( N, NRHS, D, E, B, LDB )
-      ELSE
-         DO 10 J = 1, NRHS, NB
-            JB = MIN( NRHS-J+1, NB )
-            CALL SPTTS2( N, JB, D, E, B( 1, J ), LDB )
-   10    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of SPTTRS
-*
-      END
--- a/libcruft/lapack/sptts2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-      SUBROUTINE SPTTS2( N, NRHS, D, E, B, LDB )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      REAL               B( LDB, * ), D( * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SPTTS2 solves a tridiagonal system of the form
-*     A * X = B
-*  using the L*D*L' factorization of A computed by SPTTRF.  D is a
-*  diagonal matrix specified in the vector D, L is a unit bidiagonal
-*  matrix whose subdiagonal is specified in the vector E, and X and B
-*  are N by NRHS matrices.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the tridiagonal matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  D       (input) REAL array, dimension (N)
-*          The n diagonal elements of the diagonal matrix D from the
-*          L*D*L' factorization of A.
-*
-*  E       (input) REAL array, dimension (N-1)
-*          The (n-1) subdiagonal elements of the unit bidiagonal factor
-*          L from the L*D*L' factorization of A.  E can also be regarded
-*          as the superdiagonal of the unit bidiagonal factor U from the
-*          factorization A = U'*D*U.
-*
-*  B       (input/output) REAL array, dimension (LDB,NRHS)
-*          On entry, the right hand side vectors B for the system of
-*          linear equations.
-*          On exit, the solution vectors, X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, J
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SSCAL
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 ) THEN
-         IF( N.EQ.1 )
-     $      CALL SSCAL( NRHS, 1. / D( 1 ), B, LDB )
-         RETURN
-      END IF
-*
-*     Solve A * X = B using the factorization A = L*D*L',
-*     overwriting each right hand side vector with its solution.
-*
-      DO 30 J = 1, NRHS
-*
-*           Solve L * x = b.
-*
-         DO 10 I = 2, N
-            B( I, J ) = B( I, J ) - B( I-1, J )*E( I-1 )
-   10    CONTINUE
-*
-*           Solve D * L' * x = b.
-*
-         B( N, J ) = B( N, J ) / D( N )
-         DO 20 I = N - 1, 1, -1
-            B( I, J ) = B( I, J ) / D( I ) - B( I+1, J )*E( I )
-   20    CONTINUE
-   30 CONTINUE
-*
-      RETURN
-*
-*     End of SPTTS2
-*
-      END
--- a/libcruft/lapack/srscl.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-      SUBROUTINE SRSCL( N, SA, SX, INCX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-      REAL               SA
-*     ..
-*     .. Array Arguments ..
-      REAL               SX( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SRSCL multiplies an n-element real vector x by the real scalar 1/a.
-*  This is done without overflow or underflow as long as
-*  the final result x/a does not overflow or underflow.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of components of the vector x.
-*
-*  SA      (input) REAL
-*          The scalar a which is used to divide each component of x.
-*          SA must be >= 0, or the subroutine will divide by zero.
-*
-*  SX      (input/output) REAL array, dimension
-*                         (1+(N-1)*abs(INCX))
-*          The n-element vector x.
-*
-*  INCX    (input) INTEGER
-*          The increment between successive values of the vector SX.
-*          > 0:  SX(1) = X(1) and SX(1+(i-1)*INCX) = x(i),     1< i<= n
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            DONE
-      REAL               BIGNUM, CDEN, CDEN1, CNUM, CNUM1, MUL, SMLNUM
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH
-      EXTERNAL           SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLABAD, SSCAL
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-*     Get machine parameters
-*
-      SMLNUM = SLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-*
-*     Initialize the denominator to SA and the numerator to 1.
-*
-      CDEN = SA
-      CNUM = ONE
-*
-   10 CONTINUE
-      CDEN1 = CDEN*SMLNUM
-      CNUM1 = CNUM / BIGNUM
-      IF( ABS( CDEN1 ).GT.ABS( CNUM ) .AND. CNUM.NE.ZERO ) THEN
-*
-*        Pre-multiply X by SMLNUM if CDEN is large compared to CNUM.
-*
-         MUL = SMLNUM
-         DONE = .FALSE.
-         CDEN = CDEN1
-      ELSE IF( ABS( CNUM1 ).GT.ABS( CDEN ) ) THEN
-*
-*        Pre-multiply X by BIGNUM if CDEN is small compared to CNUM.
-*
-         MUL = BIGNUM
-         DONE = .FALSE.
-         CNUM = CNUM1
-      ELSE
-*
-*        Multiply X by CNUM / CDEN and return.
-*
-         MUL = CNUM / CDEN
-         DONE = .TRUE.
-      END IF
-*
-*     Scale the vector X by MUL
-*
-      CALL SSCAL( N, MUL, SX, INCX )
-*
-      IF( .NOT.DONE )
-     $   GO TO 10
-*
-      RETURN
-*
-*     End of SRSCL
-*
-      END
--- a/libcruft/lapack/ssteqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,500 +0,0 @@
-      SUBROUTINE SSTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPZ
-      INTEGER            INFO, LDZ, N
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * ), E( * ), WORK( * ), Z( LDZ, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SSTEQR computes all eigenvalues and, optionally, eigenvectors of a
-*  symmetric tridiagonal matrix using the implicit QL or QR method.
-*  The eigenvectors of a full or band symmetric matrix can also be found
-*  if SSYTRD or SSPTRD or SSBTRD has been used to reduce this matrix to
-*  tridiagonal form.
-*
-*  Arguments
-*  =========
-*
-*  COMPZ   (input) CHARACTER*1
-*          = 'N':  Compute eigenvalues only.
-*          = 'V':  Compute eigenvalues and eigenvectors of the original
-*                  symmetric matrix.  On entry, Z must contain the
-*                  orthogonal matrix used to reduce the original matrix
-*                  to tridiagonal form.
-*          = 'I':  Compute eigenvalues and eigenvectors of the
-*                  tridiagonal matrix.  Z is initialized to the identity
-*                  matrix.
-*
-*  N       (input) INTEGER
-*          The order of the matrix.  N >= 0.
-*
-*  D       (input/output) REAL array, dimension (N)
-*          On entry, the diagonal elements of the tridiagonal matrix.
-*          On exit, if INFO = 0, the eigenvalues in ascending order.
-*
-*  E       (input/output) REAL array, dimension (N-1)
-*          On entry, the (n-1) subdiagonal elements of the tridiagonal
-*          matrix.
-*          On exit, E has been destroyed.
-*
-*  Z       (input/output) REAL array, dimension (LDZ, N)
-*          On entry, if  COMPZ = 'V', then Z contains the orthogonal
-*          matrix used in the reduction to tridiagonal form.
-*          On exit, if INFO = 0, then if  COMPZ = 'V', Z contains the
-*          orthonormal eigenvectors of the original symmetric matrix,
-*          and if COMPZ = 'I', Z contains the orthonormal eigenvectors
-*          of the symmetric tridiagonal matrix.
-*          If COMPZ = 'N', then Z is not referenced.
-*
-*  LDZ     (input) INTEGER
-*          The leading dimension of the array Z.  LDZ >= 1, and if
-*          eigenvectors are desired, then  LDZ >= max(1,N).
-*
-*  WORK    (workspace) REAL array, dimension (max(1,2*N-2))
-*          If COMPZ = 'N', then WORK is not referenced.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  the algorithm has failed to find all the eigenvalues in
-*                a total of 30*N iterations; if INFO = i, then i
-*                elements of E have not converged to zero; on exit, D
-*                and E contain the elements of a symmetric tridiagonal
-*                matrix which is orthogonally similar to the original
-*                matrix.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE, TWO, THREE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0,
-     $                   THREE = 3.0E0 )
-      INTEGER            MAXIT
-      PARAMETER          ( MAXIT = 30 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ICOMPZ, II, ISCALE, J, JTOT, K, L, L1, LEND,
-     $                   LENDM1, LENDP1, LENDSV, LM1, LSV, M, MM, MM1,
-     $                   NM1, NMAXIT
-      REAL               ANORM, B, C, EPS, EPS2, F, G, P, R, RT1, RT2,
-     $                   S, SAFMAX, SAFMIN, SSFMAX, SSFMIN, TST
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               SLAMCH, SLANST, SLAPY2
-      EXTERNAL           LSAME, SLAMCH, SLANST, SLAPY2
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLAE2, SLAEV2, SLARTG, SLASCL, SLASET, SLASR,
-     $                   SLASRT, SSWAP, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( LSAME( COMPZ, 'N' ) ) THEN
-         ICOMPZ = 0
-      ELSE IF( LSAME( COMPZ, 'V' ) ) THEN
-         ICOMPZ = 1
-      ELSE IF( LSAME( COMPZ, 'I' ) ) THEN
-         ICOMPZ = 2
-      ELSE
-         ICOMPZ = -1
-      END IF
-      IF( ICOMPZ.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( ( LDZ.LT.1 ) .OR. ( ICOMPZ.GT.0 .AND. LDZ.LT.MAX( 1,
-     $         N ) ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SSTEQR', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( N.EQ.1 ) THEN
-         IF( ICOMPZ.EQ.2 )
-     $      Z( 1, 1 ) = ONE
-         RETURN
-      END IF
-*
-*     Determine the unit roundoff and over/underflow thresholds.
-*
-      EPS = SLAMCH( 'E' )
-      EPS2 = EPS**2
-      SAFMIN = SLAMCH( 'S' )
-      SAFMAX = ONE / SAFMIN
-      SSFMAX = SQRT( SAFMAX ) / THREE
-      SSFMIN = SQRT( SAFMIN ) / EPS2
-*
-*     Compute the eigenvalues and eigenvectors of the tridiagonal
-*     matrix.
-*
-      IF( ICOMPZ.EQ.2 )
-     $   CALL SLASET( 'Full', N, N, ZERO, ONE, Z, LDZ )
-*
-      NMAXIT = N*MAXIT
-      JTOT = 0
-*
-*     Determine where the matrix splits and choose QL or QR iteration
-*     for each block, according to whether top or bottom diagonal
-*     element is smaller.
-*
-      L1 = 1
-      NM1 = N - 1
-*
-   10 CONTINUE
-      IF( L1.GT.N )
-     $   GO TO 160
-      IF( L1.GT.1 )
-     $   E( L1-1 ) = ZERO
-      IF( L1.LE.NM1 ) THEN
-         DO 20 M = L1, NM1
-            TST = ABS( E( M ) )
-            IF( TST.EQ.ZERO )
-     $         GO TO 30
-            IF( TST.LE.( SQRT( ABS( D( M ) ) )*SQRT( ABS( D( M+
-     $          1 ) ) ) )*EPS ) THEN
-               E( M ) = ZERO
-               GO TO 30
-            END IF
-   20    CONTINUE
-      END IF
-      M = N
-*
-   30 CONTINUE
-      L = L1
-      LSV = L
-      LEND = M
-      LENDSV = LEND
-      L1 = M + 1
-      IF( LEND.EQ.L )
-     $   GO TO 10
-*
-*     Scale submatrix in rows and columns L to LEND
-*
-      ANORM = SLANST( 'I', LEND-L+1, D( L ), E( L ) )
-      ISCALE = 0
-      IF( ANORM.EQ.ZERO )
-     $   GO TO 10
-      IF( ANORM.GT.SSFMAX ) THEN
-         ISCALE = 1
-         CALL SLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L+1, 1, D( L ), N,
-     $                INFO )
-         CALL SLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L, 1, E( L ), N,
-     $                INFO )
-      ELSE IF( ANORM.LT.SSFMIN ) THEN
-         ISCALE = 2
-         CALL SLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L+1, 1, D( L ), N,
-     $                INFO )
-         CALL SLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L, 1, E( L ), N,
-     $                INFO )
-      END IF
-*
-*     Choose between QL and QR iteration
-*
-      IF( ABS( D( LEND ) ).LT.ABS( D( L ) ) ) THEN
-         LEND = LSV
-         L = LENDSV
-      END IF
-*
-      IF( LEND.GT.L ) THEN
-*
-*        QL Iteration
-*
-*        Look for small subdiagonal element.
-*
-   40    CONTINUE
-         IF( L.NE.LEND ) THEN
-            LENDM1 = LEND - 1
-            DO 50 M = L, LENDM1
-               TST = ABS( E( M ) )**2
-               IF( TST.LE.( EPS2*ABS( D( M ) ) )*ABS( D( M+1 ) )+
-     $             SAFMIN )GO TO 60
-   50       CONTINUE
-         END IF
-*
-         M = LEND
-*
-   60    CONTINUE
-         IF( M.LT.LEND )
-     $      E( M ) = ZERO
-         P = D( L )
-         IF( M.EQ.L )
-     $      GO TO 80
-*
-*        If remaining matrix is 2-by-2, use SLAE2 or SLAEV2
-*        to compute its eigensystem.
-*
-         IF( M.EQ.L+1 ) THEN
-            IF( ICOMPZ.GT.0 ) THEN
-               CALL SLAEV2( D( L ), E( L ), D( L+1 ), RT1, RT2, C, S )
-               WORK( L ) = C
-               WORK( N-1+L ) = S
-               CALL SLASR( 'R', 'V', 'B', N, 2, WORK( L ),
-     $                     WORK( N-1+L ), Z( 1, L ), LDZ )
-            ELSE
-               CALL SLAE2( D( L ), E( L ), D( L+1 ), RT1, RT2 )
-            END IF
-            D( L ) = RT1
-            D( L+1 ) = RT2
-            E( L ) = ZERO
-            L = L + 2
-            IF( L.LE.LEND )
-     $         GO TO 40
-            GO TO 140
-         END IF
-*
-         IF( JTOT.EQ.NMAXIT )
-     $      GO TO 140
-         JTOT = JTOT + 1
-*
-*        Form shift.
-*
-         G = ( D( L+1 )-P ) / ( TWO*E( L ) )
-         R = SLAPY2( G, ONE )
-         G = D( M ) - P + ( E( L ) / ( G+SIGN( R, G ) ) )
-*
-         S = ONE
-         C = ONE
-         P = ZERO
-*
-*        Inner loop
-*
-         MM1 = M - 1
-         DO 70 I = MM1, L, -1
-            F = S*E( I )
-            B = C*E( I )
-            CALL SLARTG( G, F, C, S, R )
-            IF( I.NE.M-1 )
-     $         E( I+1 ) = R
-            G = D( I+1 ) - P
-            R = ( D( I )-G )*S + TWO*C*B
-            P = S*R
-            D( I+1 ) = G + P
-            G = C*R - B
-*
-*           If eigenvectors are desired, then save rotations.
-*
-            IF( ICOMPZ.GT.0 ) THEN
-               WORK( I ) = C
-               WORK( N-1+I ) = -S
-            END IF
-*
-   70    CONTINUE
-*
-*        If eigenvectors are desired, then apply saved rotations.
-*
-         IF( ICOMPZ.GT.0 ) THEN
-            MM = M - L + 1
-            CALL SLASR( 'R', 'V', 'B', N, MM, WORK( L ), WORK( N-1+L ),
-     $                  Z( 1, L ), LDZ )
-         END IF
-*
-         D( L ) = D( L ) - P
-         E( L ) = G
-         GO TO 40
-*
-*        Eigenvalue found.
-*
-   80    CONTINUE
-         D( L ) = P
-*
-         L = L + 1
-         IF( L.LE.LEND )
-     $      GO TO 40
-         GO TO 140
-*
-      ELSE
-*
-*        QR Iteration
-*
-*        Look for small superdiagonal element.
-*
-   90    CONTINUE
-         IF( L.NE.LEND ) THEN
-            LENDP1 = LEND + 1
-            DO 100 M = L, LENDP1, -1
-               TST = ABS( E( M-1 ) )**2
-               IF( TST.LE.( EPS2*ABS( D( M ) ) )*ABS( D( M-1 ) )+
-     $             SAFMIN )GO TO 110
-  100       CONTINUE
-         END IF
-*
-         M = LEND
-*
-  110    CONTINUE
-         IF( M.GT.LEND )
-     $      E( M-1 ) = ZERO
-         P = D( L )
-         IF( M.EQ.L )
-     $      GO TO 130
-*
-*        If remaining matrix is 2-by-2, use SLAE2 or SLAEV2
-*        to compute its eigensystem.
-*
-         IF( M.EQ.L-1 ) THEN
-            IF( ICOMPZ.GT.0 ) THEN
-               CALL SLAEV2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2, C, S )
-               WORK( M ) = C
-               WORK( N-1+M ) = S
-               CALL SLASR( 'R', 'V', 'F', N, 2, WORK( M ),
-     $                     WORK( N-1+M ), Z( 1, L-1 ), LDZ )
-            ELSE
-               CALL SLAE2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2 )
-            END IF
-            D( L-1 ) = RT1
-            D( L ) = RT2
-            E( L-1 ) = ZERO
-            L = L - 2
-            IF( L.GE.LEND )
-     $         GO TO 90
-            GO TO 140
-         END IF
-*
-         IF( JTOT.EQ.NMAXIT )
-     $      GO TO 140
-         JTOT = JTOT + 1
-*
-*        Form shift.
-*
-         G = ( D( L-1 )-P ) / ( TWO*E( L-1 ) )
-         R = SLAPY2( G, ONE )
-         G = D( M ) - P + ( E( L-1 ) / ( G+SIGN( R, G ) ) )
-*
-         S = ONE
-         C = ONE
-         P = ZERO
-*
-*        Inner loop
-*
-         LM1 = L - 1
-         DO 120 I = M, LM1
-            F = S*E( I )
-            B = C*E( I )
-            CALL SLARTG( G, F, C, S, R )
-            IF( I.NE.M )
-     $         E( I-1 ) = R
-            G = D( I ) - P
-            R = ( D( I+1 )-G )*S + TWO*C*B
-            P = S*R
-            D( I ) = G + P
-            G = C*R - B
-*
-*           If eigenvectors are desired, then save rotations.
-*
-            IF( ICOMPZ.GT.0 ) THEN
-               WORK( I ) = C
-               WORK( N-1+I ) = S
-            END IF
-*
-  120    CONTINUE
-*
-*        If eigenvectors are desired, then apply saved rotations.
-*
-         IF( ICOMPZ.GT.0 ) THEN
-            MM = L - M + 1
-            CALL SLASR( 'R', 'V', 'F', N, MM, WORK( M ), WORK( N-1+M ),
-     $                  Z( 1, M ), LDZ )
-         END IF
-*
-         D( L ) = D( L ) - P
-         E( LM1 ) = G
-         GO TO 90
-*
-*        Eigenvalue found.
-*
-  130    CONTINUE
-         D( L ) = P
-*
-         L = L - 1
-         IF( L.GE.LEND )
-     $      GO TO 90
-         GO TO 140
-*
-      END IF
-*
-*     Undo scaling if necessary
-*
-  140 CONTINUE
-      IF( ISCALE.EQ.1 ) THEN
-         CALL SLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV+1, 1,
-     $                D( LSV ), N, INFO )
-         CALL SLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV, 1, E( LSV ),
-     $                N, INFO )
-      ELSE IF( ISCALE.EQ.2 ) THEN
-         CALL SLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV+1, 1,
-     $                D( LSV ), N, INFO )
-         CALL SLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV, 1, E( LSV ),
-     $                N, INFO )
-      END IF
-*
-*     Check for no convergence to an eigenvalue after a total
-*     of N*MAXIT iterations.
-*
-      IF( JTOT.LT.NMAXIT )
-     $   GO TO 10
-      DO 150 I = 1, N - 1
-         IF( E( I ).NE.ZERO )
-     $      INFO = INFO + 1
-  150 CONTINUE
-      GO TO 190
-*
-*     Order eigenvalues and eigenvectors.
-*
-  160 CONTINUE
-      IF( ICOMPZ.EQ.0 ) THEN
-*
-*        Use Quick Sort
-*
-         CALL SLASRT( 'I', N, D, INFO )
-*
-      ELSE
-*
-*        Use Selection Sort to minimize swaps of eigenvectors
-*
-         DO 180 II = 2, N
-            I = II - 1
-            K = I
-            P = D( I )
-            DO 170 J = II, N
-               IF( D( J ).LT.P ) THEN
-                  K = J
-                  P = D( J )
-               END IF
-  170       CONTINUE
-            IF( K.NE.I ) THEN
-               D( K ) = D( I )
-               D( I ) = P
-               CALL SSWAP( N, Z( 1, I ), 1, Z( 1, K ), 1 )
-            END IF
-  180    CONTINUE
-      END IF
-*
-  190 CONTINUE
-      RETURN
-*
-*     End of SSTEQR
-*
-      END
--- a/libcruft/lapack/ssterf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,364 +0,0 @@
-      SUBROUTINE SSTERF( N, D, E, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, N
-*     ..
-*     .. Array Arguments ..
-      REAL               D( * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SSTERF computes all eigenvalues of a symmetric tridiagonal matrix
-*  using the Pal-Walker-Kahan variant of the QL or QR algorithm.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix.  N >= 0.
-*
-*  D       (input/output) REAL array, dimension (N)
-*          On entry, the n diagonal elements of the tridiagonal matrix.
-*          On exit, if INFO = 0, the eigenvalues in ascending order.
-*
-*  E       (input/output) REAL array, dimension (N-1)
-*          On entry, the (n-1) subdiagonal elements of the tridiagonal
-*          matrix.
-*          On exit, E has been destroyed.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  the algorithm failed to find all of the eigenvalues in
-*                a total of 30*N iterations; if INFO = i, then i
-*                elements of E have not converged to zero.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE, TWO, THREE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0,
-     $                   THREE = 3.0E0 )
-      INTEGER            MAXIT
-      PARAMETER          ( MAXIT = 30 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ISCALE, JTOT, L, L1, LEND, LENDSV, LSV, M,
-     $                   NMAXIT
-      REAL               ALPHA, ANORM, BB, C, EPS, EPS2, GAMMA, OLDC,
-     $                   OLDGAM, P, R, RT1, RT2, RTE, S, SAFMAX, SAFMIN,
-     $                   SIGMA, SSFMAX, SSFMIN
-*     ..
-*     .. External Functions ..
-      REAL               SLAMCH, SLANST, SLAPY2
-      EXTERNAL           SLAMCH, SLANST, SLAPY2
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLAE2, SLASCL, SLASRT, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-*     Quick return if possible
-*
-      IF( N.LT.0 ) THEN
-         INFO = -1
-         CALL XERBLA( 'SSTERF', -INFO )
-         RETURN
-      END IF
-      IF( N.LE.1 )
-     $   RETURN
-*
-*     Determine the unit roundoff for this environment.
-*
-      EPS = SLAMCH( 'E' )
-      EPS2 = EPS**2
-      SAFMIN = SLAMCH( 'S' )
-      SAFMAX = ONE / SAFMIN
-      SSFMAX = SQRT( SAFMAX ) / THREE
-      SSFMIN = SQRT( SAFMIN ) / EPS2
-*
-*     Compute the eigenvalues of the tridiagonal matrix.
-*
-      NMAXIT = N*MAXIT
-      SIGMA = ZERO
-      JTOT = 0
-*
-*     Determine where the matrix splits and choose QL or QR iteration
-*     for each block, according to whether top or bottom diagonal
-*     element is smaller.
-*
-      L1 = 1
-*
-   10 CONTINUE
-      IF( L1.GT.N )
-     $   GO TO 170
-      IF( L1.GT.1 )
-     $   E( L1-1 ) = ZERO
-      DO 20 M = L1, N - 1
-         IF( ABS( E( M ) ).LE.( SQRT( ABS( D( M ) ) )*
-     $       SQRT( ABS( D( M+1 ) ) ) )*EPS ) THEN
-            E( M ) = ZERO
-            GO TO 30
-         END IF
-   20 CONTINUE
-      M = N
-*
-   30 CONTINUE
-      L = L1
-      LSV = L
-      LEND = M
-      LENDSV = LEND
-      L1 = M + 1
-      IF( LEND.EQ.L )
-     $   GO TO 10
-*
-*     Scale submatrix in rows and columns L to LEND
-*
-      ANORM = SLANST( 'I', LEND-L+1, D( L ), E( L ) )
-      ISCALE = 0
-      IF( ANORM.GT.SSFMAX ) THEN
-         ISCALE = 1
-         CALL SLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L+1, 1, D( L ), N,
-     $                INFO )
-         CALL SLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L, 1, E( L ), N,
-     $                INFO )
-      ELSE IF( ANORM.LT.SSFMIN ) THEN
-         ISCALE = 2
-         CALL SLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L+1, 1, D( L ), N,
-     $                INFO )
-         CALL SLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L, 1, E( L ), N,
-     $                INFO )
-      END IF
-*
-      DO 40 I = L, LEND - 1
-         E( I ) = E( I )**2
-   40 CONTINUE
-*
-*     Choose between QL and QR iteration
-*
-      IF( ABS( D( LEND ) ).LT.ABS( D( L ) ) ) THEN
-         LEND = LSV
-         L = LENDSV
-      END IF
-*
-      IF( LEND.GE.L ) THEN
-*
-*        QL Iteration
-*
-*        Look for small subdiagonal element.
-*
-   50    CONTINUE
-         IF( L.NE.LEND ) THEN
-            DO 60 M = L, LEND - 1
-               IF( ABS( E( M ) ).LE.EPS2*ABS( D( M )*D( M+1 ) ) )
-     $            GO TO 70
-   60       CONTINUE
-         END IF
-         M = LEND
-*
-   70    CONTINUE
-         IF( M.LT.LEND )
-     $      E( M ) = ZERO
-         P = D( L )
-         IF( M.EQ.L )
-     $      GO TO 90
-*
-*        If remaining matrix is 2 by 2, use SLAE2 to compute its
-*        eigenvalues.
-*
-         IF( M.EQ.L+1 ) THEN
-            RTE = SQRT( E( L ) )
-            CALL SLAE2( D( L ), RTE, D( L+1 ), RT1, RT2 )
-            D( L ) = RT1
-            D( L+1 ) = RT2
-            E( L ) = ZERO
-            L = L + 2
-            IF( L.LE.LEND )
-     $         GO TO 50
-            GO TO 150
-         END IF
-*
-         IF( JTOT.EQ.NMAXIT )
-     $      GO TO 150
-         JTOT = JTOT + 1
-*
-*        Form shift.
-*
-         RTE = SQRT( E( L ) )
-         SIGMA = ( D( L+1 )-P ) / ( TWO*RTE )
-         R = SLAPY2( SIGMA, ONE )
-         SIGMA = P - ( RTE / ( SIGMA+SIGN( R, SIGMA ) ) )
-*
-         C = ONE
-         S = ZERO
-         GAMMA = D( M ) - SIGMA
-         P = GAMMA*GAMMA
-*
-*        Inner loop
-*
-         DO 80 I = M - 1, L, -1
-            BB = E( I )
-            R = P + BB
-            IF( I.NE.M-1 )
-     $         E( I+1 ) = S*R
-            OLDC = C
-            C = P / R
-            S = BB / R
-            OLDGAM = GAMMA
-            ALPHA = D( I )
-            GAMMA = C*( ALPHA-SIGMA ) - S*OLDGAM
-            D( I+1 ) = OLDGAM + ( ALPHA-GAMMA )
-            IF( C.NE.ZERO ) THEN
-               P = ( GAMMA*GAMMA ) / C
-            ELSE
-               P = OLDC*BB
-            END IF
-   80    CONTINUE
-*
-         E( L ) = S*P
-         D( L ) = SIGMA + GAMMA
-         GO TO 50
-*
-*        Eigenvalue found.
-*
-   90    CONTINUE
-         D( L ) = P
-*
-         L = L + 1
-         IF( L.LE.LEND )
-     $      GO TO 50
-         GO TO 150
-*
-      ELSE
-*
-*        QR Iteration
-*
-*        Look for small superdiagonal element.
-*
-  100    CONTINUE
-         DO 110 M = L, LEND + 1, -1
-            IF( ABS( E( M-1 ) ).LE.EPS2*ABS( D( M )*D( M-1 ) ) )
-     $         GO TO 120
-  110    CONTINUE
-         M = LEND
-*
-  120    CONTINUE
-         IF( M.GT.LEND )
-     $      E( M-1 ) = ZERO
-         P = D( L )
-         IF( M.EQ.L )
-     $      GO TO 140
-*
-*        If remaining matrix is 2 by 2, use SLAE2 to compute its
-*        eigenvalues.
-*
-         IF( M.EQ.L-1 ) THEN
-            RTE = SQRT( E( L-1 ) )
-            CALL SLAE2( D( L ), RTE, D( L-1 ), RT1, RT2 )
-            D( L ) = RT1
-            D( L-1 ) = RT2
-            E( L-1 ) = ZERO
-            L = L - 2
-            IF( L.GE.LEND )
-     $         GO TO 100
-            GO TO 150
-         END IF
-*
-         IF( JTOT.EQ.NMAXIT )
-     $      GO TO 150
-         JTOT = JTOT + 1
-*
-*        Form shift.
-*
-         RTE = SQRT( E( L-1 ) )
-         SIGMA = ( D( L-1 )-P ) / ( TWO*RTE )
-         R = SLAPY2( SIGMA, ONE )
-         SIGMA = P - ( RTE / ( SIGMA+SIGN( R, SIGMA ) ) )
-*
-         C = ONE
-         S = ZERO
-         GAMMA = D( M ) - SIGMA
-         P = GAMMA*GAMMA
-*
-*        Inner loop
-*
-         DO 130 I = M, L - 1
-            BB = E( I )
-            R = P + BB
-            IF( I.NE.M )
-     $         E( I-1 ) = S*R
-            OLDC = C
-            C = P / R
-            S = BB / R
-            OLDGAM = GAMMA
-            ALPHA = D( I+1 )
-            GAMMA = C*( ALPHA-SIGMA ) - S*OLDGAM
-            D( I ) = OLDGAM + ( ALPHA-GAMMA )
-            IF( C.NE.ZERO ) THEN
-               P = ( GAMMA*GAMMA ) / C
-            ELSE
-               P = OLDC*BB
-            END IF
-  130    CONTINUE
-*
-         E( L-1 ) = S*P
-         D( L ) = SIGMA + GAMMA
-         GO TO 100
-*
-*        Eigenvalue found.
-*
-  140    CONTINUE
-         D( L ) = P
-*
-         L = L - 1
-         IF( L.GE.LEND )
-     $      GO TO 100
-         GO TO 150
-*
-      END IF
-*
-*     Undo scaling if necessary
-*
-  150 CONTINUE
-      IF( ISCALE.EQ.1 )
-     $   CALL SLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV+1, 1,
-     $                D( LSV ), N, INFO )
-      IF( ISCALE.EQ.2 )
-     $   CALL SLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV+1, 1,
-     $                D( LSV ), N, INFO )
-*
-*     Check for no convergence to an eigenvalue after a total
-*     of N*MAXIT iterations.
-*
-      IF( JTOT.LT.NMAXIT )
-     $   GO TO 10
-      DO 160 I = 1, N - 1
-         IF( E( I ).NE.ZERO )
-     $      INFO = INFO + 1
-  160 CONTINUE
-      GO TO 180
-*
-*     Sort eigenvalues in increasing order.
-*
-  170 CONTINUE
-      CALL SLASRT( 'I', N, D, INFO )
-*
-  180 CONTINUE
-      RETURN
-*
-*     End of SSTERF
-*
-      END
--- a/libcruft/lapack/ssyev.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,211 +0,0 @@
-      SUBROUTINE SSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBZ, UPLO
-      INTEGER            INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), W( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SSYEV computes all eigenvalues and, optionally, eigenvectors of a
-*  real symmetric matrix A.
-*
-*  Arguments
-*  =========
-*
-*  JOBZ    (input) CHARACTER*1
-*          = 'N':  Compute eigenvalues only;
-*          = 'V':  Compute eigenvalues and eigenvectors.
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA, N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the
-*          leading N-by-N upper triangular part of A contains the
-*          upper triangular part of the matrix A.  If UPLO = 'L',
-*          the leading N-by-N lower triangular part of A contains
-*          the lower triangular part of the matrix A.
-*          On exit, if JOBZ = 'V', then if INFO = 0, A contains the
-*          orthonormal eigenvectors of the matrix A.
-*          If JOBZ = 'N', then on exit the lower triangle (if UPLO='L')
-*          or the upper triangle (if UPLO='U') of A, including the
-*          diagonal, is destroyed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  W       (output) REAL array, dimension (N)
-*          If INFO = 0, the eigenvalues in ascending order.
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The length of the array WORK.  LWORK >= max(1,3*N-1).
-*          For optimal efficiency, LWORK >= (NB+2)*N,
-*          where NB is the blocksize for SSYTRD returned by ILAENV.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the algorithm failed to converge; i
-*                off-diagonal elements of an intermediate tridiagonal
-*                form did not converge to zero.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LOWER, LQUERY, WANTZ
-      INTEGER            IINFO, IMAX, INDE, INDTAU, INDWRK, ISCALE,
-     $                   LLWORK, LWKOPT, NB
-      REAL               ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
-     $                   SMLNUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      REAL               SLAMCH, SLANSY
-      EXTERNAL           ILAENV, LSAME, SLAMCH, SLANSY
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLASCL, SORGTR, SSCAL, SSTEQR, SSTERF, SSYTRD,
-     $                   XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      WANTZ = LSAME( JOBZ, 'V' )
-      LOWER = LSAME( UPLO, 'L' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-      INFO = 0
-      IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.( LOWER .OR. LSAME( UPLO, 'U' ) ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         NB = ILAENV( 1, 'SSYTRD', UPLO, N, -1, -1, -1 )
-         LWKOPT = MAX( 1, ( NB+2 )*N )
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, 3*N-1 ) .AND. .NOT.LQUERY )
-     $      INFO = -8
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SSYEV ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         RETURN
-      END IF
-*
-      IF( N.EQ.1 ) THEN
-         W( 1 ) = A( 1, 1 )
-         WORK( 1 ) = 2
-         IF( WANTZ )
-     $      A( 1, 1 ) = ONE
-         RETURN
-      END IF
-*
-*     Get machine constants.
-*
-      SAFMIN = SLAMCH( 'Safe minimum' )
-      EPS = SLAMCH( 'Precision' )
-      SMLNUM = SAFMIN / EPS
-      BIGNUM = ONE / SMLNUM
-      RMIN = SQRT( SMLNUM )
-      RMAX = SQRT( BIGNUM )
-*
-*     Scale matrix to allowable range, if necessary.
-*
-      ANRM = SLANSY( 'M', UPLO, N, A, LDA, WORK )
-      ISCALE = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.RMIN ) THEN
-         ISCALE = 1
-         SIGMA = RMIN / ANRM
-      ELSE IF( ANRM.GT.RMAX ) THEN
-         ISCALE = 1
-         SIGMA = RMAX / ANRM
-      END IF
-      IF( ISCALE.EQ.1 )
-     $   CALL SLASCL( UPLO, 0, 0, ONE, SIGMA, N, N, A, LDA, INFO )
-*
-*     Call SSYTRD to reduce symmetric matrix to tridiagonal form.
-*
-      INDE = 1
-      INDTAU = INDE + N
-      INDWRK = INDTAU + N
-      LLWORK = LWORK - INDWRK + 1
-      CALL SSYTRD( UPLO, N, A, LDA, W, WORK( INDE ), WORK( INDTAU ),
-     $             WORK( INDWRK ), LLWORK, IINFO )
-*
-*     For eigenvalues only, call SSTERF.  For eigenvectors, first call
-*     SORGTR to generate the orthogonal matrix, then call SSTEQR.
-*
-      IF( .NOT.WANTZ ) THEN
-         CALL SSTERF( N, W, WORK( INDE ), INFO )
-      ELSE
-         CALL SORGTR( UPLO, N, A, LDA, WORK( INDTAU ), WORK( INDWRK ),
-     $                LLWORK, IINFO )
-         CALL SSTEQR( JOBZ, N, W, WORK( INDE ), A, LDA, WORK( INDTAU ),
-     $                INFO )
-      END IF
-*
-*     If matrix was scaled, then rescale eigenvalues appropriately.
-*
-      IF( ISCALE.EQ.1 ) THEN
-         IF( INFO.EQ.0 ) THEN
-            IMAX = N
-         ELSE
-            IMAX = INFO - 1
-         END IF
-         CALL SSCAL( IMAX, ONE / SIGMA, W, 1 )
-      END IF
-*
-*     Set WORK(1) to optimal workspace size.
-*
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of SSYEV
-*
-      END
--- a/libcruft/lapack/ssygs2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,211 +0,0 @@
-      SUBROUTINE SSYGS2( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, ITYPE, LDA, LDB, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SSYGS2 reduces a real symmetric-definite generalized eigenproblem
-*  to standard form.
-*
-*  If ITYPE = 1, the problem is A*x = lambda*B*x,
-*  and A is overwritten by inv(U')*A*inv(U) or inv(L)*A*inv(L')
-*
-*  If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or
-*  B*A*x = lambda*x, and A is overwritten by U*A*U` or L'*A*L.
-*
-*  B must have been previously factorized as U'*U or L*L' by SPOTRF.
-*
-*  Arguments
-*  =========
-*
-*  ITYPE   (input) INTEGER
-*          = 1: compute inv(U')*A*inv(U) or inv(L)*A*inv(L');
-*          = 2 or 3: compute U*A*U' or L'*A*L.
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          symmetric matrix A is stored, and how B has been factorized.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the leading
-*          n by n upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n by n lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*
-*          On exit, if INFO = 0, the transformed matrix, stored in the
-*          same format as A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input) REAL array, dimension (LDB,N)
-*          The triangular factor from the Cholesky factorization of B,
-*          as returned by SPOTRF.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, HALF
-      PARAMETER          ( ONE = 1.0, HALF = 0.5 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            K
-      REAL               AKK, BKK, CT
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SAXPY, SSCAL, SSYR2, STRMV, STRSV, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN
-         INFO = -1
-      ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SSYGS2', -INFO )
-         RETURN
-      END IF
-*
-      IF( ITYPE.EQ.1 ) THEN
-         IF( UPPER ) THEN
-*
-*           Compute inv(U')*A*inv(U)
-*
-            DO 10 K = 1, N
-*
-*              Update the upper triangle of A(k:n,k:n)
-*
-               AKK = A( K, K )
-               BKK = B( K, K )
-               AKK = AKK / BKK**2
-               A( K, K ) = AKK
-               IF( K.LT.N ) THEN
-                  CALL SSCAL( N-K, ONE / BKK, A( K, K+1 ), LDA )
-                  CT = -HALF*AKK
-                  CALL SAXPY( N-K, CT, B( K, K+1 ), LDB, A( K, K+1 ),
-     $                        LDA )
-                  CALL SSYR2( UPLO, N-K, -ONE, A( K, K+1 ), LDA,
-     $                        B( K, K+1 ), LDB, A( K+1, K+1 ), LDA )
-                  CALL SAXPY( N-K, CT, B( K, K+1 ), LDB, A( K, K+1 ),
-     $                        LDA )
-                  CALL STRSV( UPLO, 'Transpose', 'Non-unit', N-K,
-     $                        B( K+1, K+1 ), LDB, A( K, K+1 ), LDA )
-               END IF
-   10       CONTINUE
-         ELSE
-*
-*           Compute inv(L)*A*inv(L')
-*
-            DO 20 K = 1, N
-*
-*              Update the lower triangle of A(k:n,k:n)
-*
-               AKK = A( K, K )
-               BKK = B( K, K )
-               AKK = AKK / BKK**2
-               A( K, K ) = AKK
-               IF( K.LT.N ) THEN
-                  CALL SSCAL( N-K, ONE / BKK, A( K+1, K ), 1 )
-                  CT = -HALF*AKK
-                  CALL SAXPY( N-K, CT, B( K+1, K ), 1, A( K+1, K ), 1 )
-                  CALL SSYR2( UPLO, N-K, -ONE, A( K+1, K ), 1,
-     $                        B( K+1, K ), 1, A( K+1, K+1 ), LDA )
-                  CALL SAXPY( N-K, CT, B( K+1, K ), 1, A( K+1, K ), 1 )
-                  CALL STRSV( UPLO, 'No transpose', 'Non-unit', N-K,
-     $                        B( K+1, K+1 ), LDB, A( K+1, K ), 1 )
-               END IF
-   20       CONTINUE
-         END IF
-      ELSE
-         IF( UPPER ) THEN
-*
-*           Compute U*A*U'
-*
-            DO 30 K = 1, N
-*
-*              Update the upper triangle of A(1:k,1:k)
-*
-               AKK = A( K, K )
-               BKK = B( K, K )
-               CALL STRMV( UPLO, 'No transpose', 'Non-unit', K-1, B,
-     $                     LDB, A( 1, K ), 1 )
-               CT = HALF*AKK
-               CALL SAXPY( K-1, CT, B( 1, K ), 1, A( 1, K ), 1 )
-               CALL SSYR2( UPLO, K-1, ONE, A( 1, K ), 1, B( 1, K ), 1,
-     $                     A, LDA )
-               CALL SAXPY( K-1, CT, B( 1, K ), 1, A( 1, K ), 1 )
-               CALL SSCAL( K-1, BKK, A( 1, K ), 1 )
-               A( K, K ) = AKK*BKK**2
-   30       CONTINUE
-         ELSE
-*
-*           Compute L'*A*L
-*
-            DO 40 K = 1, N
-*
-*              Update the lower triangle of A(1:k,1:k)
-*
-               AKK = A( K, K )
-               BKK = B( K, K )
-               CALL STRMV( UPLO, 'Transpose', 'Non-unit', K-1, B, LDB,
-     $                     A( K, 1 ), LDA )
-               CT = HALF*AKK
-               CALL SAXPY( K-1, CT, B( K, 1 ), LDB, A( K, 1 ), LDA )
-               CALL SSYR2( UPLO, K-1, ONE, A( K, 1 ), LDA, B( K, 1 ),
-     $                     LDB, A, LDA )
-               CALL SAXPY( K-1, CT, B( K, 1 ), LDB, A( K, 1 ), LDA )
-               CALL SSCAL( K-1, BKK, A( K, 1 ), LDA )
-               A( K, K ) = AKK*BKK**2
-   40       CONTINUE
-         END IF
-      END IF
-      RETURN
-*
-*     End of SSYGS2
-*
-      END
--- a/libcruft/lapack/ssygst.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,249 +0,0 @@
-      SUBROUTINE SSYGST( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, ITYPE, LDA, LDB, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SSYGST reduces a real symmetric-definite generalized eigenproblem
-*  to standard form.
-*
-*  If ITYPE = 1, the problem is A*x = lambda*B*x,
-*  and A is overwritten by inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T)
-*
-*  If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or
-*  B*A*x = lambda*x, and A is overwritten by U*A*U**T or L**T*A*L.
-*
-*  B must have been previously factorized as U**T*U or L*L**T by SPOTRF.
-*
-*  Arguments
-*  =========
-*
-*  ITYPE   (input) INTEGER
-*          = 1: compute inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T);
-*          = 2 or 3: compute U*A*U**T or L**T*A*L.
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored and B is factored as
-*                  U**T*U;
-*          = 'L':  Lower triangle of A is stored and B is factored as
-*                  L*L**T.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the leading
-*          N-by-N upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading N-by-N lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*
-*          On exit, if INFO = 0, the transformed matrix, stored in the
-*          same format as A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input) REAL array, dimension (LDB,N)
-*          The triangular factor from the Cholesky factorization of B,
-*          as returned by SPOTRF.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, HALF
-      PARAMETER          ( ONE = 1.0, HALF = 0.5 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            K, KB, NB
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SSYGS2, SSYMM, SSYR2K, STRMM, STRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN
-         INFO = -1
-      ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SSYGST', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'SSYGST', UPLO, N, -1, -1, -1 )
-*
-      IF( NB.LE.1 .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code
-*
-         CALL SSYGS2( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( ITYPE.EQ.1 ) THEN
-            IF( UPPER ) THEN
-*
-*              Compute inv(U')*A*inv(U)
-*
-               DO 10 K = 1, N, NB
-                  KB = MIN( N-K+1, NB )
-*
-*                 Update the upper triangle of A(k:n,k:n)
-*
-                  CALL SSYGS2( ITYPE, UPLO, KB, A( K, K ), LDA,
-     $                         B( K, K ), LDB, INFO )
-                  IF( K+KB.LE.N ) THEN
-                     CALL STRSM( 'Left', UPLO, 'Transpose', 'Non-unit',
-     $                           KB, N-K-KB+1, ONE, B( K, K ), LDB,
-     $                           A( K, K+KB ), LDA )
-                     CALL SSYMM( 'Left', UPLO, KB, N-K-KB+1, -HALF,
-     $                           A( K, K ), LDA, B( K, K+KB ), LDB, ONE,
-     $                           A( K, K+KB ), LDA )
-                     CALL SSYR2K( UPLO, 'Transpose', N-K-KB+1, KB, -ONE,
-     $                            A( K, K+KB ), LDA, B( K, K+KB ), LDB,
-     $                            ONE, A( K+KB, K+KB ), LDA )
-                     CALL SSYMM( 'Left', UPLO, KB, N-K-KB+1, -HALF,
-     $                           A( K, K ), LDA, B( K, K+KB ), LDB, ONE,
-     $                           A( K, K+KB ), LDA )
-                     CALL STRSM( 'Right', UPLO, 'No transpose',
-     $                           'Non-unit', KB, N-K-KB+1, ONE,
-     $                           B( K+KB, K+KB ), LDB, A( K, K+KB ),
-     $                           LDA )
-                  END IF
-   10          CONTINUE
-            ELSE
-*
-*              Compute inv(L)*A*inv(L')
-*
-               DO 20 K = 1, N, NB
-                  KB = MIN( N-K+1, NB )
-*
-*                 Update the lower triangle of A(k:n,k:n)
-*
-                  CALL SSYGS2( ITYPE, UPLO, KB, A( K, K ), LDA,
-     $                         B( K, K ), LDB, INFO )
-                  IF( K+KB.LE.N ) THEN
-                     CALL STRSM( 'Right', UPLO, 'Transpose', 'Non-unit',
-     $                           N-K-KB+1, KB, ONE, B( K, K ), LDB,
-     $                           A( K+KB, K ), LDA )
-                     CALL SSYMM( 'Right', UPLO, N-K-KB+1, KB, -HALF,
-     $                           A( K, K ), LDA, B( K+KB, K ), LDB, ONE,
-     $                           A( K+KB, K ), LDA )
-                     CALL SSYR2K( UPLO, 'No transpose', N-K-KB+1, KB,
-     $                            -ONE, A( K+KB, K ), LDA, B( K+KB, K ),
-     $                            LDB, ONE, A( K+KB, K+KB ), LDA )
-                     CALL SSYMM( 'Right', UPLO, N-K-KB+1, KB, -HALF,
-     $                           A( K, K ), LDA, B( K+KB, K ), LDB, ONE,
-     $                           A( K+KB, K ), LDA )
-                     CALL STRSM( 'Left', UPLO, 'No transpose',
-     $                           'Non-unit', N-K-KB+1, KB, ONE,
-     $                           B( K+KB, K+KB ), LDB, A( K+KB, K ),
-     $                           LDA )
-                  END IF
-   20          CONTINUE
-            END IF
-         ELSE
-            IF( UPPER ) THEN
-*
-*              Compute U*A*U'
-*
-               DO 30 K = 1, N, NB
-                  KB = MIN( N-K+1, NB )
-*
-*                 Update the upper triangle of A(1:k+kb-1,1:k+kb-1)
-*
-                  CALL STRMM( 'Left', UPLO, 'No transpose', 'Non-unit',
-     $                        K-1, KB, ONE, B, LDB, A( 1, K ), LDA )
-                  CALL SSYMM( 'Right', UPLO, K-1, KB, HALF, A( K, K ),
-     $                        LDA, B( 1, K ), LDB, ONE, A( 1, K ), LDA )
-                  CALL SSYR2K( UPLO, 'No transpose', K-1, KB, ONE,
-     $                         A( 1, K ), LDA, B( 1, K ), LDB, ONE, A,
-     $                         LDA )
-                  CALL SSYMM( 'Right', UPLO, K-1, KB, HALF, A( K, K ),
-     $                        LDA, B( 1, K ), LDB, ONE, A( 1, K ), LDA )
-                  CALL STRMM( 'Right', UPLO, 'Transpose', 'Non-unit',
-     $                        K-1, KB, ONE, B( K, K ), LDB, A( 1, K ),
-     $                        LDA )
-                  CALL SSYGS2( ITYPE, UPLO, KB, A( K, K ), LDA,
-     $                         B( K, K ), LDB, INFO )
-   30          CONTINUE
-            ELSE
-*
-*              Compute L'*A*L
-*
-               DO 40 K = 1, N, NB
-                  KB = MIN( N-K+1, NB )
-*
-*                 Update the lower triangle of A(1:k+kb-1,1:k+kb-1)
-*
-                  CALL STRMM( 'Right', UPLO, 'No transpose', 'Non-unit',
-     $                        KB, K-1, ONE, B, LDB, A( K, 1 ), LDA )
-                  CALL SSYMM( 'Left', UPLO, KB, K-1, HALF, A( K, K ),
-     $                        LDA, B( K, 1 ), LDB, ONE, A( K, 1 ), LDA )
-                  CALL SSYR2K( UPLO, 'Transpose', K-1, KB, ONE,
-     $                         A( K, 1 ), LDA, B( K, 1 ), LDB, ONE, A,
-     $                         LDA )
-                  CALL SSYMM( 'Left', UPLO, KB, K-1, HALF, A( K, K ),
-     $                        LDA, B( K, 1 ), LDB, ONE, A( K, 1 ), LDA )
-                  CALL STRMM( 'Left', UPLO, 'Transpose', 'Non-unit', KB,
-     $                        K-1, ONE, B( K, K ), LDB, A( K, 1 ), LDA )
-                  CALL SSYGS2( ITYPE, UPLO, KB, A( K, K ), LDA,
-     $                         B( K, K ), LDB, INFO )
-   40          CONTINUE
-            END IF
-         END IF
-      END IF
-      RETURN
-*
-*     End of SSYGST
-*
-      END
--- a/libcruft/lapack/ssygv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,229 +0,0 @@
-      SUBROUTINE SSYGV( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK,
-     $                  LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBZ, UPLO
-      INTEGER            INFO, ITYPE, LDA, LDB, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), B( LDB, * ), W( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SSYGV computes all the eigenvalues, and optionally, the eigenvectors
-*  of a real generalized symmetric-definite eigenproblem, of the form
-*  A*x=(lambda)*B*x,  A*Bx=(lambda)*x,  or B*A*x=(lambda)*x.
-*  Here A and B are assumed to be symmetric and B is also
-*  positive definite.
-*
-*  Arguments
-*  =========
-*
-*  ITYPE   (input) INTEGER
-*          Specifies the problem type to be solved:
-*          = 1:  A*x = (lambda)*B*x
-*          = 2:  A*B*x = (lambda)*x
-*          = 3:  B*A*x = (lambda)*x
-*
-*  JOBZ    (input) CHARACTER*1
-*          = 'N':  Compute eigenvalues only;
-*          = 'V':  Compute eigenvalues and eigenvectors.
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangles of A and B are stored;
-*          = 'L':  Lower triangles of A and B are stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA, N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the
-*          leading N-by-N upper triangular part of A contains the
-*          upper triangular part of the matrix A.  If UPLO = 'L',
-*          the leading N-by-N lower triangular part of A contains
-*          the lower triangular part of the matrix A.
-*
-*          On exit, if JOBZ = 'V', then if INFO = 0, A contains the
-*          matrix Z of eigenvectors.  The eigenvectors are normalized
-*          as follows:
-*          if ITYPE = 1 or 2, Z**T*B*Z = I;
-*          if ITYPE = 3, Z**T*inv(B)*Z = I.
-*          If JOBZ = 'N', then on exit the upper triangle (if UPLO='U')
-*          or the lower triangle (if UPLO='L') of A, including the
-*          diagonal, is destroyed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input/output) REAL array, dimension (LDB, N)
-*          On entry, the symmetric positive definite matrix B.
-*          If UPLO = 'U', the leading N-by-N upper triangular part of B
-*          contains the upper triangular part of the matrix B.
-*          If UPLO = 'L', the leading N-by-N lower triangular part of B
-*          contains the lower triangular part of the matrix B.
-*
-*          On exit, if INFO <= N, the part of B containing the matrix is
-*          overwritten by the triangular factor U or L from the Cholesky
-*          factorization B = U**T*U or B = L*L**T.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  W       (output) REAL array, dimension (N)
-*          If INFO = 0, the eigenvalues in ascending order.
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The length of the array WORK.  LWORK >= max(1,3*N-1).
-*          For optimal efficiency, LWORK >= (NB+2)*N,
-*          where NB is the blocksize for SSYTRD returned by ILAENV.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  SPOTRF or SSYEV returned an error code:
-*             <= N:  if INFO = i, SSYEV failed to converge;
-*                    i off-diagonal elements of an intermediate
-*                    tridiagonal form did not converge to zero;
-*             > N:   if INFO = N + i, for 1 <= i <= N, then the leading
-*                    minor of order i of B is not positive definite.
-*                    The factorization of B could not be completed and
-*                    no eigenvalues or eigenvectors were computed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, UPPER, WANTZ
-      CHARACTER          TRANS
-      INTEGER            LWKMIN, LWKOPT, NB, NEIG
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV, LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SPOTRF, SSYEV, SSYGST, STRMM, STRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      WANTZ = LSAME( JOBZ, 'V' )
-      UPPER = LSAME( UPLO, 'U' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-      INFO = 0
-      IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN
-         INFO = -1
-      ELSE IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.( UPPER .OR. LSAME( UPLO, 'L' ) ) ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -8
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         LWKMIN = MAX( 1, 3*N - 1 )
-         NB = ILAENV( 1, 'SSYTRD', UPLO, N, -1, -1, -1 )
-         LWKOPT = MAX( LWKMIN, ( NB + 2 )*N )
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
-            INFO = -11
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SSYGV ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Form a Cholesky factorization of B.
-*
-      CALL SPOTRF( UPLO, N, B, LDB, INFO )
-      IF( INFO.NE.0 ) THEN
-         INFO = N + INFO
-         RETURN
-      END IF
-*
-*     Transform problem to standard eigenvalue problem and solve.
-*
-      CALL SSYGST( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
-      CALL SSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO )
-*
-      IF( WANTZ ) THEN
-*
-*        Backtransform eigenvectors to the original problem.
-*
-         NEIG = N
-         IF( INFO.GT.0 )
-     $      NEIG = INFO - 1
-         IF( ITYPE.EQ.1 .OR. ITYPE.EQ.2 ) THEN
-*
-*           For A*x=(lambda)*B*x and A*B*x=(lambda)*x;
-*           backtransform eigenvectors: x = inv(L)'*y or inv(U)*y
-*
-            IF( UPPER ) THEN
-               TRANS = 'N'
-            ELSE
-               TRANS = 'T'
-            END IF
-*
-            CALL STRSM( 'Left', UPLO, TRANS, 'Non-unit', N, NEIG, ONE,
-     $                  B, LDB, A, LDA )
-*
-         ELSE IF( ITYPE.EQ.3 ) THEN
-*
-*           For B*A*x=(lambda)*x;
-*           backtransform eigenvectors: x = L*y or U'*y
-*
-            IF( UPPER ) THEN
-               TRANS = 'T'
-            ELSE
-               TRANS = 'N'
-            END IF
-*
-            CALL STRMM( 'Left', UPLO, TRANS, 'Non-unit', N, NEIG, ONE,
-     $                  B, LDB, A, LDA )
-         END IF
-      END IF
-*
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of SSYGV
-*
-      END
--- a/libcruft/lapack/ssytd2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,247 +0,0 @@
-      SUBROUTINE SSYTD2( UPLO, N, A, LDA, D, E, TAU, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), D( * ), E( * ), TAU( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SSYTD2 reduces a real symmetric matrix A to symmetric tridiagonal
-*  form T by an orthogonal similarity transformation: Q' * A * Q = T.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          symmetric matrix A is stored:
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the leading
-*          n-by-n upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n-by-n lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*          On exit, if UPLO = 'U', the diagonal and first superdiagonal
-*          of A are overwritten by the corresponding elements of the
-*          tridiagonal matrix T, and the elements above the first
-*          superdiagonal, with the array TAU, represent the orthogonal
-*          matrix Q as a product of elementary reflectors; if UPLO
-*          = 'L', the diagonal and first subdiagonal of A are over-
-*          written by the corresponding elements of the tridiagonal
-*          matrix T, and the elements below the first subdiagonal, with
-*          the array TAU, represent the orthogonal matrix Q as a product
-*          of elementary reflectors. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  D       (output) REAL array, dimension (N)
-*          The diagonal elements of the tridiagonal matrix T:
-*          D(i) = A(i,i).
-*
-*  E       (output) REAL array, dimension (N-1)
-*          The off-diagonal elements of the tridiagonal matrix T:
-*          E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'.
-*
-*  TAU     (output) REAL array, dimension (N-1)
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  If UPLO = 'U', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(n-1) . . . H(2) H(1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in
-*  A(1:i-1,i+1), and tau in TAU(i).
-*
-*  If UPLO = 'L', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(1) H(2) . . . H(n-1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i),
-*  and tau in TAU(i).
-*
-*  The contents of A on exit are illustrated by the following examples
-*  with n = 5:
-*
-*  if UPLO = 'U':                       if UPLO = 'L':
-*
-*    (  d   e   v2  v3  v4 )              (  d                  )
-*    (      d   e   v3  v4 )              (  e   d              )
-*    (          d   e   v4 )              (  v1  e   d          )
-*    (              d   e  )              (  v1  v2  e   d      )
-*    (                  d  )              (  v1  v2  v3  e   d  )
-*
-*  where d and e denote diagonal and off-diagonal elements of T, and vi
-*  denotes an element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO, HALF
-      PARAMETER          ( ONE = 1.0, ZERO = 0.0, HALF = 1.0 / 2.0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            I
-      REAL               ALPHA, TAUI
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SAXPY, SLARFG, SSYMV, SSYR2, XERBLA
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               SDOT
-      EXTERNAL           LSAME, SDOT
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SSYTD2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Reduce the upper triangle of A
-*
-         DO 10 I = N - 1, 1, -1
-*
-*           Generate elementary reflector H(i) = I - tau * v * v'
-*           to annihilate A(1:i-1,i+1)
-*
-            CALL SLARFG( I, A( I, I+1 ), A( 1, I+1 ), 1, TAUI )
-            E( I ) = A( I, I+1 )
-*
-            IF( TAUI.NE.ZERO ) THEN
-*
-*              Apply H(i) from both sides to A(1:i,1:i)
-*
-               A( I, I+1 ) = ONE
-*
-*              Compute  x := tau * A * v  storing x in TAU(1:i)
-*
-               CALL SSYMV( UPLO, I, TAUI, A, LDA, A( 1, I+1 ), 1, ZERO,
-     $                     TAU, 1 )
-*
-*              Compute  w := x - 1/2 * tau * (x'*v) * v
-*
-               ALPHA = -HALF*TAUI*SDOT( I, TAU, 1, A( 1, I+1 ), 1 )
-               CALL SAXPY( I, ALPHA, A( 1, I+1 ), 1, TAU, 1 )
-*
-*              Apply the transformation as a rank-2 update:
-*                 A := A - v * w' - w * v'
-*
-               CALL SSYR2( UPLO, I, -ONE, A( 1, I+1 ), 1, TAU, 1, A,
-     $                     LDA )
-*
-               A( I, I+1 ) = E( I )
-            END IF
-            D( I+1 ) = A( I+1, I+1 )
-            TAU( I ) = TAUI
-   10    CONTINUE
-         D( 1 ) = A( 1, 1 )
-      ELSE
-*
-*        Reduce the lower triangle of A
-*
-         DO 20 I = 1, N - 1
-*
-*           Generate elementary reflector H(i) = I - tau * v * v'
-*           to annihilate A(i+2:n,i)
-*
-            CALL SLARFG( N-I, A( I+1, I ), A( MIN( I+2, N ), I ), 1,
-     $                   TAUI )
-            E( I ) = A( I+1, I )
-*
-            IF( TAUI.NE.ZERO ) THEN
-*
-*              Apply H(i) from both sides to A(i+1:n,i+1:n)
-*
-               A( I+1, I ) = ONE
-*
-*              Compute  x := tau * A * v  storing y in TAU(i:n-1)
-*
-               CALL SSYMV( UPLO, N-I, TAUI, A( I+1, I+1 ), LDA,
-     $                     A( I+1, I ), 1, ZERO, TAU( I ), 1 )
-*
-*              Compute  w := x - 1/2 * tau * (x'*v) * v
-*
-               ALPHA = -HALF*TAUI*SDOT( N-I, TAU( I ), 1, A( I+1, I ),
-     $                 1 )
-               CALL SAXPY( N-I, ALPHA, A( I+1, I ), 1, TAU( I ), 1 )
-*
-*              Apply the transformation as a rank-2 update:
-*                 A := A - v * w' - w * v'
-*
-               CALL SSYR2( UPLO, N-I, -ONE, A( I+1, I ), 1, TAU( I ), 1,
-     $                     A( I+1, I+1 ), LDA )
-*
-               A( I+1, I ) = E( I )
-            END IF
-            D( I ) = A( I, I )
-            TAU( I ) = TAUI
-   20    CONTINUE
-         D( N ) = A( N, N )
-      END IF
-*
-      RETURN
-*
-*     End of SSYTD2
-*
-      END
--- a/libcruft/lapack/ssytrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,294 +0,0 @@
-      SUBROUTINE SSYTRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), D( * ), E( * ), TAU( * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  SSYTRD reduces a real symmetric matrix A to real symmetric
-*  tridiagonal form T by an orthogonal similarity transformation:
-*  Q**T * A * Q = T.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the symmetric matrix A.  If UPLO = 'U', the leading
-*          N-by-N upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading N-by-N lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*          On exit, if UPLO = 'U', the diagonal and first superdiagonal
-*          of A are overwritten by the corresponding elements of the
-*          tridiagonal matrix T, and the elements above the first
-*          superdiagonal, with the array TAU, represent the orthogonal
-*          matrix Q as a product of elementary reflectors; if UPLO
-*          = 'L', the diagonal and first subdiagonal of A are over-
-*          written by the corresponding elements of the tridiagonal
-*          matrix T, and the elements below the first subdiagonal, with
-*          the array TAU, represent the orthogonal matrix Q as a product
-*          of elementary reflectors. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  D       (output) REAL array, dimension (N)
-*          The diagonal elements of the tridiagonal matrix T:
-*          D(i) = A(i,i).
-*
-*  E       (output) REAL array, dimension (N-1)
-*          The off-diagonal elements of the tridiagonal matrix T:
-*          E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'.
-*
-*  TAU     (output) REAL array, dimension (N-1)
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= 1.
-*          For optimum performance LWORK >= N*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  If UPLO = 'U', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(n-1) . . . H(2) H(1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in
-*  A(1:i-1,i+1), and tau in TAU(i).
-*
-*  If UPLO = 'L', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(1) H(2) . . . H(n-1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real scalar, and v is a real vector with
-*  v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i),
-*  and tau in TAU(i).
-*
-*  The contents of A on exit are illustrated by the following examples
-*  with n = 5:
-*
-*  if UPLO = 'U':                       if UPLO = 'L':
-*
-*    (  d   e   v2  v3  v4 )              (  d                  )
-*    (      d   e   v3  v4 )              (  e   d              )
-*    (          d   e   v4 )              (  v1  e   d          )
-*    (              d   e  )              (  v1  v2  e   d      )
-*    (                  d  )              (  v1  v2  v3  e   d  )
-*
-*  where d and e denote diagonal and off-diagonal elements of T, and vi
-*  denotes an element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, UPPER
-      INTEGER            I, IINFO, IWS, J, KK, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLATRD, SSYR2K, SSYTD2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.1 .AND. .NOT.LQUERY ) THEN
-         INFO = -9
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-*
-*        Determine the block size.
-*
-         NB = ILAENV( 1, 'SSYTRD', UPLO, N, -1, -1, -1 )
-         LWKOPT = N*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'SSYTRD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NX = N
-      IWS = 1
-      IF( NB.GT.1 .AND. NB.LT.N ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code
-*        (last block is always handled by unblocked code).
-*
-         NX = MAX( NB, ILAENV( 3, 'SSYTRD', UPLO, N, -1, -1, -1 ) )
-         IF( NX.LT.N ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = N
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  determine the
-*              minimum value of NB, and reduce NB or force use of
-*              unblocked code by setting NX = N.
-*
-               NB = MAX( LWORK / LDWORK, 1 )
-               NBMIN = ILAENV( 2, 'SSYTRD', UPLO, N, -1, -1, -1 )
-               IF( NB.LT.NBMIN )
-     $            NX = N
-            END IF
-         ELSE
-            NX = N
-         END IF
-      ELSE
-         NB = 1
-      END IF
-*
-      IF( UPPER ) THEN
-*
-*        Reduce the upper triangle of A.
-*        Columns 1:kk are handled by the unblocked method.
-*
-         KK = N - ( ( N-NX+NB-1 ) / NB )*NB
-         DO 20 I = N - NB + 1, KK + 1, -NB
-*
-*           Reduce columns i:i+nb-1 to tridiagonal form and form the
-*           matrix W which is needed to update the unreduced part of
-*           the matrix
-*
-            CALL SLATRD( UPLO, I+NB-1, NB, A, LDA, E, TAU, WORK,
-     $                   LDWORK )
-*
-*           Update the unreduced submatrix A(1:i-1,1:i-1), using an
-*           update of the form:  A := A - V*W' - W*V'
-*
-            CALL SSYR2K( UPLO, 'No transpose', I-1, NB, -ONE, A( 1, I ),
-     $                   LDA, WORK, LDWORK, ONE, A, LDA )
-*
-*           Copy superdiagonal elements back into A, and diagonal
-*           elements into D
-*
-            DO 10 J = I, I + NB - 1
-               A( J-1, J ) = E( J-1 )
-               D( J ) = A( J, J )
-   10       CONTINUE
-   20    CONTINUE
-*
-*        Use unblocked code to reduce the last or only block
-*
-         CALL SSYTD2( UPLO, KK, A, LDA, D, E, TAU, IINFO )
-      ELSE
-*
-*        Reduce the lower triangle of A
-*
-         DO 40 I = 1, N - NX, NB
-*
-*           Reduce columns i:i+nb-1 to tridiagonal form and form the
-*           matrix W which is needed to update the unreduced part of
-*           the matrix
-*
-            CALL SLATRD( UPLO, N-I+1, NB, A( I, I ), LDA, E( I ),
-     $                   TAU( I ), WORK, LDWORK )
-*
-*           Update the unreduced submatrix A(i+ib:n,i+ib:n), using
-*           an update of the form:  A := A - V*W' - W*V'
-*
-            CALL SSYR2K( UPLO, 'No transpose', N-I-NB+1, NB, -ONE,
-     $                   A( I+NB, I ), LDA, WORK( NB+1 ), LDWORK, ONE,
-     $                   A( I+NB, I+NB ), LDA )
-*
-*           Copy subdiagonal elements back into A, and diagonal
-*           elements into D
-*
-            DO 30 J = I, I + NB - 1
-               A( J+1, J ) = E( J )
-               D( J ) = A( J, J )
-   30       CONTINUE
-   40    CONTINUE
-*
-*        Use unblocked code to reduce the last or only block
-*
-         CALL SSYTD2( UPLO, N-I+1, A( I, I ), LDA, D( I ), E( I ),
-     $                TAU( I ), IINFO )
-      END IF
-*
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of SSYTRD
-*
-      END
--- a/libcruft/lapack/stgevc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1147 +0,0 @@
-      SUBROUTINE STGEVC( SIDE, HOWMNY, SELECT, N, S, LDS, P, LDP, VL,
-     $                   LDVL, VR, LDVR, MM, M, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          HOWMNY, SIDE
-      INTEGER            INFO, LDP, LDS, LDVL, LDVR, M, MM, N
-*     ..
-*     .. Array Arguments ..
-      LOGICAL            SELECT( * )
-      REAL               P( LDP, * ), S( LDS, * ), VL( LDVL, * ),
-     $                   VR( LDVR, * ), WORK( * )
-*     ..
-*
-*
-*  Purpose
-*  =======
-*
-*  STGEVC computes some or all of the right and/or left eigenvectors of
-*  a pair of real matrices (S,P), where S is a quasi-triangular matrix
-*  and P is upper triangular.  Matrix pairs of this type are produced by
-*  the generalized Schur factorization of a matrix pair (A,B):
-*
-*     A = Q*S*Z**T,  B = Q*P*Z**T
-*
-*  as computed by SGGHRD + SHGEQZ.
-*
-*  The right eigenvector x and the left eigenvector y of (S,P)
-*  corresponding to an eigenvalue w are defined by:
-*  
-*     S*x = w*P*x,  (y**H)*S = w*(y**H)*P,
-*  
-*  where y**H denotes the conjugate tranpose of y.
-*  The eigenvalues are not input to this routine, but are computed
-*  directly from the diagonal blocks of S and P.
-*  
-*  This routine returns the matrices X and/or Y of right and left
-*  eigenvectors of (S,P), or the products Z*X and/or Q*Y,
-*  where Z and Q are input matrices.
-*  If Q and Z are the orthogonal factors from the generalized Schur
-*  factorization of a matrix pair (A,B), then Z*X and Q*Y
-*  are the matrices of right and left eigenvectors of (A,B).
-* 
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'R': compute right eigenvectors only;
-*          = 'L': compute left eigenvectors only;
-*          = 'B': compute both right and left eigenvectors.
-*
-*  HOWMNY  (input) CHARACTER*1
-*          = 'A': compute all right and/or left eigenvectors;
-*          = 'B': compute all right and/or left eigenvectors,
-*                 backtransformed by the matrices in VR and/or VL;
-*          = 'S': compute selected right and/or left eigenvectors,
-*                 specified by the logical array SELECT.
-*
-*  SELECT  (input) LOGICAL array, dimension (N)
-*          If HOWMNY='S', SELECT specifies the eigenvectors to be
-*          computed.  If w(j) is a real eigenvalue, the corresponding
-*          real eigenvector is computed if SELECT(j) is .TRUE..
-*          If w(j) and w(j+1) are the real and imaginary parts of a
-*          complex eigenvalue, the corresponding complex eigenvector
-*          is computed if either SELECT(j) or SELECT(j+1) is .TRUE.,
-*          and on exit SELECT(j) is set to .TRUE. and SELECT(j+1) is
-*          set to .FALSE..
-*          Not referenced if HOWMNY = 'A' or 'B'.
-*
-*  N       (input) INTEGER
-*          The order of the matrices S and P.  N >= 0.
-*
-*  S       (input) REAL array, dimension (LDS,N)
-*          The upper quasi-triangular matrix S from a generalized Schur
-*          factorization, as computed by SHGEQZ.
-*
-*  LDS     (input) INTEGER
-*          The leading dimension of array S.  LDS >= max(1,N).
-*
-*  P       (input) REAL array, dimension (LDP,N)
-*          The upper triangular matrix P from a generalized Schur
-*          factorization, as computed by SHGEQZ.
-*          2-by-2 diagonal blocks of P corresponding to 2-by-2 blocks
-*          of S must be in positive diagonal form.
-*
-*  LDP     (input) INTEGER
-*          The leading dimension of array P.  LDP >= max(1,N).
-*
-*  VL      (input/output) REAL array, dimension (LDVL,MM)
-*          On entry, if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must
-*          contain an N-by-N matrix Q (usually the orthogonal matrix Q
-*          of left Schur vectors returned by SHGEQZ).
-*          On exit, if SIDE = 'L' or 'B', VL contains:
-*          if HOWMNY = 'A', the matrix Y of left eigenvectors of (S,P);
-*          if HOWMNY = 'B', the matrix Q*Y;
-*          if HOWMNY = 'S', the left eigenvectors of (S,P) specified by
-*                      SELECT, stored consecutively in the columns of
-*                      VL, in the same order as their eigenvalues.
-*
-*          A complex eigenvector corresponding to a complex eigenvalue
-*          is stored in two consecutive columns, the first holding the
-*          real part, and the second the imaginary part.
-*
-*          Not referenced if SIDE = 'R'.
-*
-*  LDVL    (input) INTEGER
-*          The leading dimension of array VL.  LDVL >= 1, and if
-*          SIDE = 'L' or 'B', LDVL >= N.
-*
-*  VR      (input/output) REAL array, dimension (LDVR,MM)
-*          On entry, if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must
-*          contain an N-by-N matrix Z (usually the orthogonal matrix Z
-*          of right Schur vectors returned by SHGEQZ).
-*
-*          On exit, if SIDE = 'R' or 'B', VR contains:
-*          if HOWMNY = 'A', the matrix X of right eigenvectors of (S,P);
-*          if HOWMNY = 'B' or 'b', the matrix Z*X;
-*          if HOWMNY = 'S' or 's', the right eigenvectors of (S,P)
-*                      specified by SELECT, stored consecutively in the
-*                      columns of VR, in the same order as their
-*                      eigenvalues.
-*
-*          A complex eigenvector corresponding to a complex eigenvalue
-*          is stored in two consecutive columns, the first holding the
-*          real part and the second the imaginary part.
-*          
-*          Not referenced if SIDE = 'L'.
-*
-*  LDVR    (input) INTEGER
-*          The leading dimension of the array VR.  LDVR >= 1, and if
-*          SIDE = 'R' or 'B', LDVR >= N.
-*
-*  MM      (input) INTEGER
-*          The number of columns in the arrays VL and/or VR. MM >= M.
-*
-*  M       (output) INTEGER
-*          The number of columns in the arrays VL and/or VR actually
-*          used to store the eigenvectors.  If HOWMNY = 'A' or 'B', M
-*          is set to N.  Each selected real eigenvector occupies one
-*          column and each selected complex eigenvector occupies two
-*          columns.
-*
-*  WORK    (workspace) REAL array, dimension (6*N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  the 2-by-2 block (INFO:INFO+1) does not have a complex
-*                eigenvalue.
-*
-*  Further Details
-*  ===============
-*
-*  Allocation of workspace:
-*  ---------- -- ---------
-*
-*     WORK( j ) = 1-norm of j-th column of A, above the diagonal
-*     WORK( N+j ) = 1-norm of j-th column of B, above the diagonal
-*     WORK( 2*N+1:3*N ) = real part of eigenvector
-*     WORK( 3*N+1:4*N ) = imaginary part of eigenvector
-*     WORK( 4*N+1:5*N ) = real part of back-transformed eigenvector
-*     WORK( 5*N+1:6*N ) = imaginary part of back-transformed eigenvector
-*
-*  Rowwise vs. columnwise solution methods:
-*  ------- --  ---------- -------- -------
-*
-*  Finding a generalized eigenvector consists basically of solving the
-*  singular triangular system
-*
-*   (A - w B) x = 0     (for right) or:   (A - w B)**H y = 0  (for left)
-*
-*  Consider finding the i-th right eigenvector (assume all eigenvalues
-*  are real). The equation to be solved is:
-*       n                   i
-*  0 = sum  C(j,k) v(k)  = sum  C(j,k) v(k)     for j = i,. . .,1
-*      k=j                 k=j
-*
-*  where  C = (A - w B)  (The components v(i+1:n) are 0.)
-*
-*  The "rowwise" method is:
-*
-*  (1)  v(i) := 1
-*  for j = i-1,. . .,1:
-*                          i
-*      (2) compute  s = - sum C(j,k) v(k)   and
-*                        k=j+1
-*
-*      (3) v(j) := s / C(j,j)
-*
-*  Step 2 is sometimes called the "dot product" step, since it is an
-*  inner product between the j-th row and the portion of the eigenvector
-*  that has been computed so far.
-*
-*  The "columnwise" method consists basically in doing the sums
-*  for all the rows in parallel.  As each v(j) is computed, the
-*  contribution of v(j) times the j-th column of C is added to the
-*  partial sums.  Since FORTRAN arrays are stored columnwise, this has
-*  the advantage that at each step, the elements of C that are accessed
-*  are adjacent to one another, whereas with the rowwise method, the
-*  elements accessed at a step are spaced LDS (and LDP) words apart.
-*
-*  When finding left eigenvectors, the matrix in question is the
-*  transpose of the one in storage, so the rowwise method then
-*  actually accesses columns of A and B at each step, and so is the
-*  preferred method.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE, SAFETY
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0,
-     $                   SAFETY = 1.0E+2 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            COMPL, COMPR, IL2BY2, ILABAD, ILALL, ILBACK,
-     $                   ILBBAD, ILCOMP, ILCPLX, LSA, LSB
-      INTEGER            I, IBEG, IEIG, IEND, IHWMNY, IINFO, IM, ISIDE,
-     $                   J, JA, JC, JE, JR, JW, NA, NW
-      REAL               ACOEF, ACOEFA, ANORM, ASCALE, BCOEFA, BCOEFI,
-     $                   BCOEFR, BIG, BIGNUM, BNORM, BSCALE, CIM2A,
-     $                   CIM2B, CIMAGA, CIMAGB, CRE2A, CRE2B, CREALA,
-     $                   CREALB, DMIN, SAFMIN, SALFAR, SBETA, SCALE,
-     $                   SMALL, TEMP, TEMP2, TEMP2I, TEMP2R, ULP, XMAX,
-     $                   XSCALE
-*     ..
-*     .. Local Arrays ..
-      REAL               BDIAG( 2 ), SUM( 2, 2 ), SUMS( 2, 2 ),
-     $                   SUMP( 2, 2 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               SLAMCH
-      EXTERNAL           LSAME, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SGEMV, SLABAD, SLACPY, SLAG2, SLALN2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and Test the input parameters
-*
-      IF( LSAME( HOWMNY, 'A' ) ) THEN
-         IHWMNY = 1
-         ILALL = .TRUE.
-         ILBACK = .FALSE.
-      ELSE IF( LSAME( HOWMNY, 'S' ) ) THEN
-         IHWMNY = 2
-         ILALL = .FALSE.
-         ILBACK = .FALSE.
-      ELSE IF( LSAME( HOWMNY, 'B' ) ) THEN
-         IHWMNY = 3
-         ILALL = .TRUE.
-         ILBACK = .TRUE.
-      ELSE
-         IHWMNY = -1
-         ILALL = .TRUE.
-      END IF
-*
-      IF( LSAME( SIDE, 'R' ) ) THEN
-         ISIDE = 1
-         COMPL = .FALSE.
-         COMPR = .TRUE.
-      ELSE IF( LSAME( SIDE, 'L' ) ) THEN
-         ISIDE = 2
-         COMPL = .TRUE.
-         COMPR = .FALSE.
-      ELSE IF( LSAME( SIDE, 'B' ) ) THEN
-         ISIDE = 3
-         COMPL = .TRUE.
-         COMPR = .TRUE.
-      ELSE
-         ISIDE = -1
-      END IF
-*
-      INFO = 0
-      IF( ISIDE.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( IHWMNY.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDS.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      ELSE IF( LDP.LT.MAX( 1, N ) ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'STGEVC', -INFO )
-         RETURN
-      END IF
-*
-*     Count the number of eigenvectors to be computed
-*
-      IF( .NOT.ILALL ) THEN
-         IM = 0
-         ILCPLX = .FALSE.
-         DO 10 J = 1, N
-            IF( ILCPLX ) THEN
-               ILCPLX = .FALSE.
-               GO TO 10
-            END IF
-            IF( J.LT.N ) THEN
-               IF( S( J+1, J ).NE.ZERO )
-     $            ILCPLX = .TRUE.
-            END IF
-            IF( ILCPLX ) THEN
-               IF( SELECT( J ) .OR. SELECT( J+1 ) )
-     $            IM = IM + 2
-            ELSE
-               IF( SELECT( J ) )
-     $            IM = IM + 1
-            END IF
-   10    CONTINUE
-      ELSE
-         IM = N
-      END IF
-*
-*     Check 2-by-2 diagonal blocks of A, B
-*
-      ILABAD = .FALSE.
-      ILBBAD = .FALSE.
-      DO 20 J = 1, N - 1
-         IF( S( J+1, J ).NE.ZERO ) THEN
-            IF( P( J, J ).EQ.ZERO .OR. P( J+1, J+1 ).EQ.ZERO .OR.
-     $          P( J, J+1 ).NE.ZERO )ILBBAD = .TRUE.
-            IF( J.LT.N-1 ) THEN
-               IF( S( J+2, J+1 ).NE.ZERO )
-     $            ILABAD = .TRUE.
-            END IF
-         END IF
-   20 CONTINUE
-*
-      IF( ILABAD ) THEN
-         INFO = -5
-      ELSE IF( ILBBAD ) THEN
-         INFO = -7
-      ELSE IF( COMPL .AND. LDVL.LT.N .OR. LDVL.LT.1 ) THEN
-         INFO = -10
-      ELSE IF( COMPR .AND. LDVR.LT.N .OR. LDVR.LT.1 ) THEN
-         INFO = -12
-      ELSE IF( MM.LT.IM ) THEN
-         INFO = -13
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'STGEVC', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      M = IM
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Machine Constants
-*
-      SAFMIN = SLAMCH( 'Safe minimum' )
-      BIG = ONE / SAFMIN
-      CALL SLABAD( SAFMIN, BIG )
-      ULP = SLAMCH( 'Epsilon' )*SLAMCH( 'Base' )
-      SMALL = SAFMIN*N / ULP
-      BIG = ONE / SMALL
-      BIGNUM = ONE / ( SAFMIN*N )
-*
-*     Compute the 1-norm of each column of the strictly upper triangular
-*     part (i.e., excluding all elements belonging to the diagonal
-*     blocks) of A and B to check for possible overflow in the
-*     triangular solver.
-*
-      ANORM = ABS( S( 1, 1 ) )
-      IF( N.GT.1 )
-     $   ANORM = ANORM + ABS( S( 2, 1 ) )
-      BNORM = ABS( P( 1, 1 ) )
-      WORK( 1 ) = ZERO
-      WORK( N+1 ) = ZERO
-*
-      DO 50 J = 2, N
-         TEMP = ZERO
-         TEMP2 = ZERO
-         IF( S( J, J-1 ).EQ.ZERO ) THEN
-            IEND = J - 1
-         ELSE
-            IEND = J - 2
-         END IF
-         DO 30 I = 1, IEND
-            TEMP = TEMP + ABS( S( I, J ) )
-            TEMP2 = TEMP2 + ABS( P( I, J ) )
-   30    CONTINUE
-         WORK( J ) = TEMP
-         WORK( N+J ) = TEMP2
-         DO 40 I = IEND + 1, MIN( J+1, N )
-            TEMP = TEMP + ABS( S( I, J ) )
-            TEMP2 = TEMP2 + ABS( P( I, J ) )
-   40    CONTINUE
-         ANORM = MAX( ANORM, TEMP )
-         BNORM = MAX( BNORM, TEMP2 )
-   50 CONTINUE
-*
-      ASCALE = ONE / MAX( ANORM, SAFMIN )
-      BSCALE = ONE / MAX( BNORM, SAFMIN )
-*
-*     Left eigenvectors
-*
-      IF( COMPL ) THEN
-         IEIG = 0
-*
-*        Main loop over eigenvalues
-*
-         ILCPLX = .FALSE.
-         DO 220 JE = 1, N
-*
-*           Skip this iteration if (a) HOWMNY='S' and SELECT=.FALSE., or
-*           (b) this would be the second of a complex pair.
-*           Check for complex eigenvalue, so as to be sure of which
-*           entry(-ies) of SELECT to look at.
-*
-            IF( ILCPLX ) THEN
-               ILCPLX = .FALSE.
-               GO TO 220
-            END IF
-            NW = 1
-            IF( JE.LT.N ) THEN
-               IF( S( JE+1, JE ).NE.ZERO ) THEN
-                  ILCPLX = .TRUE.
-                  NW = 2
-               END IF
-            END IF
-            IF( ILALL ) THEN
-               ILCOMP = .TRUE.
-            ELSE IF( ILCPLX ) THEN
-               ILCOMP = SELECT( JE ) .OR. SELECT( JE+1 )
-            ELSE
-               ILCOMP = SELECT( JE )
-            END IF
-            IF( .NOT.ILCOMP )
-     $         GO TO 220
-*
-*           Decide if (a) singular pencil, (b) real eigenvalue, or
-*           (c) complex eigenvalue.
-*
-            IF( .NOT.ILCPLX ) THEN
-               IF( ABS( S( JE, JE ) ).LE.SAFMIN .AND.
-     $             ABS( P( JE, JE ) ).LE.SAFMIN ) THEN
-*
-*                 Singular matrix pencil -- return unit eigenvector
-*
-                  IEIG = IEIG + 1
-                  DO 60 JR = 1, N
-                     VL( JR, IEIG ) = ZERO
-   60             CONTINUE
-                  VL( IEIG, IEIG ) = ONE
-                  GO TO 220
-               END IF
-            END IF
-*
-*           Clear vector
-*
-            DO 70 JR = 1, NW*N
-               WORK( 2*N+JR ) = ZERO
-   70       CONTINUE
-*                                                 T
-*           Compute coefficients in  ( a A - b B )  y = 0
-*              a  is  ACOEF
-*              b  is  BCOEFR + i*BCOEFI
-*
-            IF( .NOT.ILCPLX ) THEN
-*
-*              Real eigenvalue
-*
-               TEMP = ONE / MAX( ABS( S( JE, JE ) )*ASCALE,
-     $                ABS( P( JE, JE ) )*BSCALE, SAFMIN )
-               SALFAR = ( TEMP*S( JE, JE ) )*ASCALE
-               SBETA = ( TEMP*P( JE, JE ) )*BSCALE
-               ACOEF = SBETA*ASCALE
-               BCOEFR = SALFAR*BSCALE
-               BCOEFI = ZERO
-*
-*              Scale to avoid underflow
-*
-               SCALE = ONE
-               LSA = ABS( SBETA ).GE.SAFMIN .AND. ABS( ACOEF ).LT.SMALL
-               LSB = ABS( SALFAR ).GE.SAFMIN .AND. ABS( BCOEFR ).LT.
-     $               SMALL
-               IF( LSA )
-     $            SCALE = ( SMALL / ABS( SBETA ) )*MIN( ANORM, BIG )
-               IF( LSB )
-     $            SCALE = MAX( SCALE, ( SMALL / ABS( SALFAR ) )*
-     $                    MIN( BNORM, BIG ) )
-               IF( LSA .OR. LSB ) THEN
-                  SCALE = MIN( SCALE, ONE /
-     $                    ( SAFMIN*MAX( ONE, ABS( ACOEF ),
-     $                    ABS( BCOEFR ) ) ) )
-                  IF( LSA ) THEN
-                     ACOEF = ASCALE*( SCALE*SBETA )
-                  ELSE
-                     ACOEF = SCALE*ACOEF
-                  END IF
-                  IF( LSB ) THEN
-                     BCOEFR = BSCALE*( SCALE*SALFAR )
-                  ELSE
-                     BCOEFR = SCALE*BCOEFR
-                  END IF
-               END IF
-               ACOEFA = ABS( ACOEF )
-               BCOEFA = ABS( BCOEFR )
-*
-*              First component is 1
-*
-               WORK( 2*N+JE ) = ONE
-               XMAX = ONE
-            ELSE
-*
-*              Complex eigenvalue
-*
-               CALL SLAG2( S( JE, JE ), LDS, P( JE, JE ), LDP,
-     $                     SAFMIN*SAFETY, ACOEF, TEMP, BCOEFR, TEMP2,
-     $                     BCOEFI )
-               BCOEFI = -BCOEFI
-               IF( BCOEFI.EQ.ZERO ) THEN
-                  INFO = JE
-                  RETURN
-               END IF
-*
-*              Scale to avoid over/underflow
-*
-               ACOEFA = ABS( ACOEF )
-               BCOEFA = ABS( BCOEFR ) + ABS( BCOEFI )
-               SCALE = ONE
-               IF( ACOEFA*ULP.LT.SAFMIN .AND. ACOEFA.GE.SAFMIN )
-     $            SCALE = ( SAFMIN / ULP ) / ACOEFA
-               IF( BCOEFA*ULP.LT.SAFMIN .AND. BCOEFA.GE.SAFMIN )
-     $            SCALE = MAX( SCALE, ( SAFMIN / ULP ) / BCOEFA )
-               IF( SAFMIN*ACOEFA.GT.ASCALE )
-     $            SCALE = ASCALE / ( SAFMIN*ACOEFA )
-               IF( SAFMIN*BCOEFA.GT.BSCALE )
-     $            SCALE = MIN( SCALE, BSCALE / ( SAFMIN*BCOEFA ) )
-               IF( SCALE.NE.ONE ) THEN
-                  ACOEF = SCALE*ACOEF
-                  ACOEFA = ABS( ACOEF )
-                  BCOEFR = SCALE*BCOEFR
-                  BCOEFI = SCALE*BCOEFI
-                  BCOEFA = ABS( BCOEFR ) + ABS( BCOEFI )
-               END IF
-*
-*              Compute first two components of eigenvector
-*
-               TEMP = ACOEF*S( JE+1, JE )
-               TEMP2R = ACOEF*S( JE, JE ) - BCOEFR*P( JE, JE )
-               TEMP2I = -BCOEFI*P( JE, JE )
-               IF( ABS( TEMP ).GT.ABS( TEMP2R )+ABS( TEMP2I ) ) THEN
-                  WORK( 2*N+JE ) = ONE
-                  WORK( 3*N+JE ) = ZERO
-                  WORK( 2*N+JE+1 ) = -TEMP2R / TEMP
-                  WORK( 3*N+JE+1 ) = -TEMP2I / TEMP
-               ELSE
-                  WORK( 2*N+JE+1 ) = ONE
-                  WORK( 3*N+JE+1 ) = ZERO
-                  TEMP = ACOEF*S( JE, JE+1 )
-                  WORK( 2*N+JE ) = ( BCOEFR*P( JE+1, JE+1 )-ACOEF*
-     $                             S( JE+1, JE+1 ) ) / TEMP
-                  WORK( 3*N+JE ) = BCOEFI*P( JE+1, JE+1 ) / TEMP
-               END IF
-               XMAX = MAX( ABS( WORK( 2*N+JE ) )+ABS( WORK( 3*N+JE ) ),
-     $                ABS( WORK( 2*N+JE+1 ) )+ABS( WORK( 3*N+JE+1 ) ) )
-            END IF
-*
-            DMIN = MAX( ULP*ACOEFA*ANORM, ULP*BCOEFA*BNORM, SAFMIN )
-*
-*                                           T
-*           Triangular solve of  (a A - b B)  y = 0
-*
-*                                   T
-*           (rowwise in  (a A - b B) , or columnwise in (a A - b B) )
-*
-            IL2BY2 = .FALSE.
-*
-            DO 160 J = JE + NW, N
-               IF( IL2BY2 ) THEN
-                  IL2BY2 = .FALSE.
-                  GO TO 160
-               END IF
-*
-               NA = 1
-               BDIAG( 1 ) = P( J, J )
-               IF( J.LT.N ) THEN
-                  IF( S( J+1, J ).NE.ZERO ) THEN
-                     IL2BY2 = .TRUE.
-                     BDIAG( 2 ) = P( J+1, J+1 )
-                     NA = 2
-                  END IF
-               END IF
-*
-*              Check whether scaling is necessary for dot products
-*
-               XSCALE = ONE / MAX( ONE, XMAX )
-               TEMP = MAX( WORK( J ), WORK( N+J ),
-     $                ACOEFA*WORK( J )+BCOEFA*WORK( N+J ) )
-               IF( IL2BY2 )
-     $            TEMP = MAX( TEMP, WORK( J+1 ), WORK( N+J+1 ),
-     $                   ACOEFA*WORK( J+1 )+BCOEFA*WORK( N+J+1 ) )
-               IF( TEMP.GT.BIGNUM*XSCALE ) THEN
-                  DO 90 JW = 0, NW - 1
-                     DO 80 JR = JE, J - 1
-                        WORK( ( JW+2 )*N+JR ) = XSCALE*
-     $                     WORK( ( JW+2 )*N+JR )
-   80                CONTINUE
-   90             CONTINUE
-                  XMAX = XMAX*XSCALE
-               END IF
-*
-*              Compute dot products
-*
-*                    j-1
-*              SUM = sum  conjg( a*S(k,j) - b*P(k,j) )*x(k)
-*                    k=je
-*
-*              To reduce the op count, this is done as
-*
-*              _        j-1                  _        j-1
-*              a*conjg( sum  S(k,j)*x(k) ) - b*conjg( sum  P(k,j)*x(k) )
-*                       k=je                          k=je
-*
-*              which may cause underflow problems if A or B are close
-*              to underflow.  (E.g., less than SMALL.)
-*
-*
-*              A series of compiler directives to defeat vectorization
-*              for the next loop
-*
-*$PL$ CMCHAR=' '
-CDIR$          NEXTSCALAR
-C$DIR          SCALAR
-CDIR$          NEXT SCALAR
-CVD$L          NOVECTOR
-CDEC$          NOVECTOR
-CVD$           NOVECTOR
-*VDIR          NOVECTOR
-*VOCL          LOOP,SCALAR
-CIBM           PREFER SCALAR
-*$PL$ CMCHAR='*'
-*
-               DO 120 JW = 1, NW
-*
-*$PL$ CMCHAR=' '
-CDIR$             NEXTSCALAR
-C$DIR             SCALAR
-CDIR$             NEXT SCALAR
-CVD$L             NOVECTOR
-CDEC$             NOVECTOR
-CVD$              NOVECTOR
-*VDIR             NOVECTOR
-*VOCL             LOOP,SCALAR
-CIBM              PREFER SCALAR
-*$PL$ CMCHAR='*'
-*
-                  DO 110 JA = 1, NA
-                     SUMS( JA, JW ) = ZERO
-                     SUMP( JA, JW ) = ZERO
-*
-                     DO 100 JR = JE, J - 1
-                        SUMS( JA, JW ) = SUMS( JA, JW ) +
-     $                                   S( JR, J+JA-1 )*
-     $                                   WORK( ( JW+1 )*N+JR )
-                        SUMP( JA, JW ) = SUMP( JA, JW ) +
-     $                                   P( JR, J+JA-1 )*
-     $                                   WORK( ( JW+1 )*N+JR )
-  100                CONTINUE
-  110             CONTINUE
-  120          CONTINUE
-*
-*$PL$ CMCHAR=' '
-CDIR$          NEXTSCALAR
-C$DIR          SCALAR
-CDIR$          NEXT SCALAR
-CVD$L          NOVECTOR
-CDEC$          NOVECTOR
-CVD$           NOVECTOR
-*VDIR          NOVECTOR
-*VOCL          LOOP,SCALAR
-CIBM           PREFER SCALAR
-*$PL$ CMCHAR='*'
-*
-               DO 130 JA = 1, NA
-                  IF( ILCPLX ) THEN
-                     SUM( JA, 1 ) = -ACOEF*SUMS( JA, 1 ) +
-     $                              BCOEFR*SUMP( JA, 1 ) -
-     $                              BCOEFI*SUMP( JA, 2 )
-                     SUM( JA, 2 ) = -ACOEF*SUMS( JA, 2 ) +
-     $                              BCOEFR*SUMP( JA, 2 ) +
-     $                              BCOEFI*SUMP( JA, 1 )
-                  ELSE
-                     SUM( JA, 1 ) = -ACOEF*SUMS( JA, 1 ) +
-     $                              BCOEFR*SUMP( JA, 1 )
-                  END IF
-  130          CONTINUE
-*
-*                                  T
-*              Solve  ( a A - b B )  y = SUM(,)
-*              with scaling and perturbation of the denominator
-*
-               CALL SLALN2( .TRUE., NA, NW, DMIN, ACOEF, S( J, J ), LDS,
-     $                      BDIAG( 1 ), BDIAG( 2 ), SUM, 2, BCOEFR,
-     $                      BCOEFI, WORK( 2*N+J ), N, SCALE, TEMP,
-     $                      IINFO )
-               IF( SCALE.LT.ONE ) THEN
-                  DO 150 JW = 0, NW - 1
-                     DO 140 JR = JE, J - 1
-                        WORK( ( JW+2 )*N+JR ) = SCALE*
-     $                     WORK( ( JW+2 )*N+JR )
-  140                CONTINUE
-  150             CONTINUE
-                  XMAX = SCALE*XMAX
-               END IF
-               XMAX = MAX( XMAX, TEMP )
-  160       CONTINUE
-*
-*           Copy eigenvector to VL, back transforming if
-*           HOWMNY='B'.
-*
-            IEIG = IEIG + 1
-            IF( ILBACK ) THEN
-               DO 170 JW = 0, NW - 1
-                  CALL SGEMV( 'N', N, N+1-JE, ONE, VL( 1, JE ), LDVL,
-     $                        WORK( ( JW+2 )*N+JE ), 1, ZERO,
-     $                        WORK( ( JW+4 )*N+1 ), 1 )
-  170          CONTINUE
-               CALL SLACPY( ' ', N, NW, WORK( 4*N+1 ), N, VL( 1, JE ),
-     $                      LDVL )
-               IBEG = 1
-            ELSE
-               CALL SLACPY( ' ', N, NW, WORK( 2*N+1 ), N, VL( 1, IEIG ),
-     $                      LDVL )
-               IBEG = JE
-            END IF
-*
-*           Scale eigenvector
-*
-            XMAX = ZERO
-            IF( ILCPLX ) THEN
-               DO 180 J = IBEG, N
-                  XMAX = MAX( XMAX, ABS( VL( J, IEIG ) )+
-     $                   ABS( VL( J, IEIG+1 ) ) )
-  180          CONTINUE
-            ELSE
-               DO 190 J = IBEG, N
-                  XMAX = MAX( XMAX, ABS( VL( J, IEIG ) ) )
-  190          CONTINUE
-            END IF
-*
-            IF( XMAX.GT.SAFMIN ) THEN
-               XSCALE = ONE / XMAX
-*
-               DO 210 JW = 0, NW - 1
-                  DO 200 JR = IBEG, N
-                     VL( JR, IEIG+JW ) = XSCALE*VL( JR, IEIG+JW )
-  200             CONTINUE
-  210          CONTINUE
-            END IF
-            IEIG = IEIG + NW - 1
-*
-  220    CONTINUE
-      END IF
-*
-*     Right eigenvectors
-*
-      IF( COMPR ) THEN
-         IEIG = IM + 1
-*
-*        Main loop over eigenvalues
-*
-         ILCPLX = .FALSE.
-         DO 500 JE = N, 1, -1
-*
-*           Skip this iteration if (a) HOWMNY='S' and SELECT=.FALSE., or
-*           (b) this would be the second of a complex pair.
-*           Check for complex eigenvalue, so as to be sure of which
-*           entry(-ies) of SELECT to look at -- if complex, SELECT(JE)
-*           or SELECT(JE-1).
-*           If this is a complex pair, the 2-by-2 diagonal block
-*           corresponding to the eigenvalue is in rows/columns JE-1:JE
-*
-            IF( ILCPLX ) THEN
-               ILCPLX = .FALSE.
-               GO TO 500
-            END IF
-            NW = 1
-            IF( JE.GT.1 ) THEN
-               IF( S( JE, JE-1 ).NE.ZERO ) THEN
-                  ILCPLX = .TRUE.
-                  NW = 2
-               END IF
-            END IF
-            IF( ILALL ) THEN
-               ILCOMP = .TRUE.
-            ELSE IF( ILCPLX ) THEN
-               ILCOMP = SELECT( JE ) .OR. SELECT( JE-1 )
-            ELSE
-               ILCOMP = SELECT( JE )
-            END IF
-            IF( .NOT.ILCOMP )
-     $         GO TO 500
-*
-*           Decide if (a) singular pencil, (b) real eigenvalue, or
-*           (c) complex eigenvalue.
-*
-            IF( .NOT.ILCPLX ) THEN
-               IF( ABS( S( JE, JE ) ).LE.SAFMIN .AND.
-     $             ABS( P( JE, JE ) ).LE.SAFMIN ) THEN
-*
-*                 Singular matrix pencil -- unit eigenvector
-*
-                  IEIG = IEIG - 1
-                  DO 230 JR = 1, N
-                     VR( JR, IEIG ) = ZERO
-  230             CONTINUE
-                  VR( IEIG, IEIG ) = ONE
-                  GO TO 500
-               END IF
-            END IF
-*
-*           Clear vector
-*
-            DO 250 JW = 0, NW - 1
-               DO 240 JR = 1, N
-                  WORK( ( JW+2 )*N+JR ) = ZERO
-  240          CONTINUE
-  250       CONTINUE
-*
-*           Compute coefficients in  ( a A - b B ) x = 0
-*              a  is  ACOEF
-*              b  is  BCOEFR + i*BCOEFI
-*
-            IF( .NOT.ILCPLX ) THEN
-*
-*              Real eigenvalue
-*
-               TEMP = ONE / MAX( ABS( S( JE, JE ) )*ASCALE,
-     $                ABS( P( JE, JE ) )*BSCALE, SAFMIN )
-               SALFAR = ( TEMP*S( JE, JE ) )*ASCALE
-               SBETA = ( TEMP*P( JE, JE ) )*BSCALE
-               ACOEF = SBETA*ASCALE
-               BCOEFR = SALFAR*BSCALE
-               BCOEFI = ZERO
-*
-*              Scale to avoid underflow
-*
-               SCALE = ONE
-               LSA = ABS( SBETA ).GE.SAFMIN .AND. ABS( ACOEF ).LT.SMALL
-               LSB = ABS( SALFAR ).GE.SAFMIN .AND. ABS( BCOEFR ).LT.
-     $               SMALL
-               IF( LSA )
-     $            SCALE = ( SMALL / ABS( SBETA ) )*MIN( ANORM, BIG )
-               IF( LSB )
-     $            SCALE = MAX( SCALE, ( SMALL / ABS( SALFAR ) )*
-     $                    MIN( BNORM, BIG ) )
-               IF( LSA .OR. LSB ) THEN
-                  SCALE = MIN( SCALE, ONE /
-     $                    ( SAFMIN*MAX( ONE, ABS( ACOEF ),
-     $                    ABS( BCOEFR ) ) ) )
-                  IF( LSA ) THEN
-                     ACOEF = ASCALE*( SCALE*SBETA )
-                  ELSE
-                     ACOEF = SCALE*ACOEF
-                  END IF
-                  IF( LSB ) THEN
-                     BCOEFR = BSCALE*( SCALE*SALFAR )
-                  ELSE
-                     BCOEFR = SCALE*BCOEFR
-                  END IF
-               END IF
-               ACOEFA = ABS( ACOEF )
-               BCOEFA = ABS( BCOEFR )
-*
-*              First component is 1
-*
-               WORK( 2*N+JE ) = ONE
-               XMAX = ONE
-*
-*              Compute contribution from column JE of A and B to sum
-*              (See "Further Details", above.)
-*
-               DO 260 JR = 1, JE - 1
-                  WORK( 2*N+JR ) = BCOEFR*P( JR, JE ) -
-     $                             ACOEF*S( JR, JE )
-  260          CONTINUE
-            ELSE
-*
-*              Complex eigenvalue
-*
-               CALL SLAG2( S( JE-1, JE-1 ), LDS, P( JE-1, JE-1 ), LDP,
-     $                     SAFMIN*SAFETY, ACOEF, TEMP, BCOEFR, TEMP2,
-     $                     BCOEFI )
-               IF( BCOEFI.EQ.ZERO ) THEN
-                  INFO = JE - 1
-                  RETURN
-               END IF
-*
-*              Scale to avoid over/underflow
-*
-               ACOEFA = ABS( ACOEF )
-               BCOEFA = ABS( BCOEFR ) + ABS( BCOEFI )
-               SCALE = ONE
-               IF( ACOEFA*ULP.LT.SAFMIN .AND. ACOEFA.GE.SAFMIN )
-     $            SCALE = ( SAFMIN / ULP ) / ACOEFA
-               IF( BCOEFA*ULP.LT.SAFMIN .AND. BCOEFA.GE.SAFMIN )
-     $            SCALE = MAX( SCALE, ( SAFMIN / ULP ) / BCOEFA )
-               IF( SAFMIN*ACOEFA.GT.ASCALE )
-     $            SCALE = ASCALE / ( SAFMIN*ACOEFA )
-               IF( SAFMIN*BCOEFA.GT.BSCALE )
-     $            SCALE = MIN( SCALE, BSCALE / ( SAFMIN*BCOEFA ) )
-               IF( SCALE.NE.ONE ) THEN
-                  ACOEF = SCALE*ACOEF
-                  ACOEFA = ABS( ACOEF )
-                  BCOEFR = SCALE*BCOEFR
-                  BCOEFI = SCALE*BCOEFI
-                  BCOEFA = ABS( BCOEFR ) + ABS( BCOEFI )
-               END IF
-*
-*              Compute first two components of eigenvector
-*              and contribution to sums
-*
-               TEMP = ACOEF*S( JE, JE-1 )
-               TEMP2R = ACOEF*S( JE, JE ) - BCOEFR*P( JE, JE )
-               TEMP2I = -BCOEFI*P( JE, JE )
-               IF( ABS( TEMP ).GE.ABS( TEMP2R )+ABS( TEMP2I ) ) THEN
-                  WORK( 2*N+JE ) = ONE
-                  WORK( 3*N+JE ) = ZERO
-                  WORK( 2*N+JE-1 ) = -TEMP2R / TEMP
-                  WORK( 3*N+JE-1 ) = -TEMP2I / TEMP
-               ELSE
-                  WORK( 2*N+JE-1 ) = ONE
-                  WORK( 3*N+JE-1 ) = ZERO
-                  TEMP = ACOEF*S( JE-1, JE )
-                  WORK( 2*N+JE ) = ( BCOEFR*P( JE-1, JE-1 )-ACOEF*
-     $                             S( JE-1, JE-1 ) ) / TEMP
-                  WORK( 3*N+JE ) = BCOEFI*P( JE-1, JE-1 ) / TEMP
-               END IF
-*
-               XMAX = MAX( ABS( WORK( 2*N+JE ) )+ABS( WORK( 3*N+JE ) ),
-     $                ABS( WORK( 2*N+JE-1 ) )+ABS( WORK( 3*N+JE-1 ) ) )
-*
-*              Compute contribution from columns JE and JE-1
-*              of A and B to the sums.
-*
-               CREALA = ACOEF*WORK( 2*N+JE-1 )
-               CIMAGA = ACOEF*WORK( 3*N+JE-1 )
-               CREALB = BCOEFR*WORK( 2*N+JE-1 ) -
-     $                  BCOEFI*WORK( 3*N+JE-1 )
-               CIMAGB = BCOEFI*WORK( 2*N+JE-1 ) +
-     $                  BCOEFR*WORK( 3*N+JE-1 )
-               CRE2A = ACOEF*WORK( 2*N+JE )
-               CIM2A = ACOEF*WORK( 3*N+JE )
-               CRE2B = BCOEFR*WORK( 2*N+JE ) - BCOEFI*WORK( 3*N+JE )
-               CIM2B = BCOEFI*WORK( 2*N+JE ) + BCOEFR*WORK( 3*N+JE )
-               DO 270 JR = 1, JE - 2
-                  WORK( 2*N+JR ) = -CREALA*S( JR, JE-1 ) +
-     $                             CREALB*P( JR, JE-1 ) -
-     $                             CRE2A*S( JR, JE ) + CRE2B*P( JR, JE )
-                  WORK( 3*N+JR ) = -CIMAGA*S( JR, JE-1 ) +
-     $                             CIMAGB*P( JR, JE-1 ) -
-     $                             CIM2A*S( JR, JE ) + CIM2B*P( JR, JE )
-  270          CONTINUE
-            END IF
-*
-            DMIN = MAX( ULP*ACOEFA*ANORM, ULP*BCOEFA*BNORM, SAFMIN )
-*
-*           Columnwise triangular solve of  (a A - b B)  x = 0
-*
-            IL2BY2 = .FALSE.
-            DO 370 J = JE - NW, 1, -1
-*
-*              If a 2-by-2 block, is in position j-1:j, wait until
-*              next iteration to process it (when it will be j:j+1)
-*
-               IF( .NOT.IL2BY2 .AND. J.GT.1 ) THEN
-                  IF( S( J, J-1 ).NE.ZERO ) THEN
-                     IL2BY2 = .TRUE.
-                     GO TO 370
-                  END IF
-               END IF
-               BDIAG( 1 ) = P( J, J )
-               IF( IL2BY2 ) THEN
-                  NA = 2
-                  BDIAG( 2 ) = P( J+1, J+1 )
-               ELSE
-                  NA = 1
-               END IF
-*
-*              Compute x(j) (and x(j+1), if 2-by-2 block)
-*
-               CALL SLALN2( .FALSE., NA, NW, DMIN, ACOEF, S( J, J ),
-     $                      LDS, BDIAG( 1 ), BDIAG( 2 ), WORK( 2*N+J ),
-     $                      N, BCOEFR, BCOEFI, SUM, 2, SCALE, TEMP,
-     $                      IINFO )
-               IF( SCALE.LT.ONE ) THEN
-*
-                  DO 290 JW = 0, NW - 1
-                     DO 280 JR = 1, JE
-                        WORK( ( JW+2 )*N+JR ) = SCALE*
-     $                     WORK( ( JW+2 )*N+JR )
-  280                CONTINUE
-  290             CONTINUE
-               END IF
-               XMAX = MAX( SCALE*XMAX, TEMP )
-*
-               DO 310 JW = 1, NW
-                  DO 300 JA = 1, NA
-                     WORK( ( JW+1 )*N+J+JA-1 ) = SUM( JA, JW )
-  300             CONTINUE
-  310          CONTINUE
-*
-*              w = w + x(j)*(a S(*,j) - b P(*,j) ) with scaling
-*
-               IF( J.GT.1 ) THEN
-*
-*                 Check whether scaling is necessary for sum.
-*
-                  XSCALE = ONE / MAX( ONE, XMAX )
-                  TEMP = ACOEFA*WORK( J ) + BCOEFA*WORK( N+J )
-                  IF( IL2BY2 )
-     $               TEMP = MAX( TEMP, ACOEFA*WORK( J+1 )+BCOEFA*
-     $                      WORK( N+J+1 ) )
-                  TEMP = MAX( TEMP, ACOEFA, BCOEFA )
-                  IF( TEMP.GT.BIGNUM*XSCALE ) THEN
-*
-                     DO 330 JW = 0, NW - 1
-                        DO 320 JR = 1, JE
-                           WORK( ( JW+2 )*N+JR ) = XSCALE*
-     $                        WORK( ( JW+2 )*N+JR )
-  320                   CONTINUE
-  330                CONTINUE
-                     XMAX = XMAX*XSCALE
-                  END IF
-*
-*                 Compute the contributions of the off-diagonals of
-*                 column j (and j+1, if 2-by-2 block) of A and B to the
-*                 sums.
-*
-*
-                  DO 360 JA = 1, NA
-                     IF( ILCPLX ) THEN
-                        CREALA = ACOEF*WORK( 2*N+J+JA-1 )
-                        CIMAGA = ACOEF*WORK( 3*N+J+JA-1 )
-                        CREALB = BCOEFR*WORK( 2*N+J+JA-1 ) -
-     $                           BCOEFI*WORK( 3*N+J+JA-1 )
-                        CIMAGB = BCOEFI*WORK( 2*N+J+JA-1 ) +
-     $                           BCOEFR*WORK( 3*N+J+JA-1 )
-                        DO 340 JR = 1, J - 1
-                           WORK( 2*N+JR ) = WORK( 2*N+JR ) -
-     $                                      CREALA*S( JR, J+JA-1 ) +
-     $                                      CREALB*P( JR, J+JA-1 )
-                           WORK( 3*N+JR ) = WORK( 3*N+JR ) -
-     $                                      CIMAGA*S( JR, J+JA-1 ) +
-     $                                      CIMAGB*P( JR, J+JA-1 )
-  340                   CONTINUE
-                     ELSE
-                        CREALA = ACOEF*WORK( 2*N+J+JA-1 )
-                        CREALB = BCOEFR*WORK( 2*N+J+JA-1 )
-                        DO 350 JR = 1, J - 1
-                           WORK( 2*N+JR ) = WORK( 2*N+JR ) -
-     $                                      CREALA*S( JR, J+JA-1 ) +
-     $                                      CREALB*P( JR, J+JA-1 )
-  350                   CONTINUE
-                     END IF
-  360             CONTINUE
-               END IF
-*
-               IL2BY2 = .FALSE.
-  370       CONTINUE
-*
-*           Copy eigenvector to VR, back transforming if
-*           HOWMNY='B'.
-*
-            IEIG = IEIG - NW
-            IF( ILBACK ) THEN
-*
-               DO 410 JW = 0, NW - 1
-                  DO 380 JR = 1, N
-                     WORK( ( JW+4 )*N+JR ) = WORK( ( JW+2 )*N+1 )*
-     $                                       VR( JR, 1 )
-  380             CONTINUE
-*
-*                 A series of compiler directives to defeat
-*                 vectorization for the next loop
-*
-*
-                  DO 400 JC = 2, JE
-                     DO 390 JR = 1, N
-                        WORK( ( JW+4 )*N+JR ) = WORK( ( JW+4 )*N+JR ) +
-     $                     WORK( ( JW+2 )*N+JC )*VR( JR, JC )
-  390                CONTINUE
-  400             CONTINUE
-  410          CONTINUE
-*
-               DO 430 JW = 0, NW - 1
-                  DO 420 JR = 1, N
-                     VR( JR, IEIG+JW ) = WORK( ( JW+4 )*N+JR )
-  420             CONTINUE
-  430          CONTINUE
-*
-               IEND = N
-            ELSE
-               DO 450 JW = 0, NW - 1
-                  DO 440 JR = 1, N
-                     VR( JR, IEIG+JW ) = WORK( ( JW+2 )*N+JR )
-  440             CONTINUE
-  450          CONTINUE
-*
-               IEND = JE
-            END IF
-*
-*           Scale eigenvector
-*
-            XMAX = ZERO
-            IF( ILCPLX ) THEN
-               DO 460 J = 1, IEND
-                  XMAX = MAX( XMAX, ABS( VR( J, IEIG ) )+
-     $                   ABS( VR( J, IEIG+1 ) ) )
-  460          CONTINUE
-            ELSE
-               DO 470 J = 1, IEND
-                  XMAX = MAX( XMAX, ABS( VR( J, IEIG ) ) )
-  470          CONTINUE
-            END IF
-*
-            IF( XMAX.GT.SAFMIN ) THEN
-               XSCALE = ONE / XMAX
-               DO 490 JW = 0, NW - 1
-                  DO 480 JR = 1, IEND
-                     VR( JR, IEIG+JW ) = XSCALE*VR( JR, IEIG+JW )
-  480             CONTINUE
-  490          CONTINUE
-            END IF
-  500    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of STGEVC
-*
-      END
--- a/libcruft/lapack/strcon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,197 +0,0 @@
-      SUBROUTINE STRCON( NORM, UPLO, DIAG, N, A, LDA, RCOND, WORK,
-     $                   IWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call SLACN2 in place of SLACON, 7 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, NORM, UPLO
-      INTEGER            INFO, LDA, N
-      REAL               RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      REAL               A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  STRCON estimates the reciprocal of the condition number of a
-*  triangular matrix A, in either the 1-norm or the infinity-norm.
-*
-*  The norm of A is computed and an estimate is obtained for
-*  norm(inv(A)), then the reciprocal of the condition number is
-*  computed as
-*     RCOND = 1 / ( norm(A) * norm(inv(A)) ).
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies whether the 1-norm condition number or the
-*          infinity-norm condition number is required:
-*          = '1' or 'O':  1-norm;
-*          = 'I':         Infinity-norm.
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  A is upper triangular;
-*          = 'L':  A is lower triangular.
-*
-*  DIAG    (input) CHARACTER*1
-*          = 'N':  A is non-unit triangular;
-*          = 'U':  A is unit triangular.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input) REAL array, dimension (LDA,N)
-*          The triangular matrix A.  If UPLO = 'U', the leading N-by-N
-*          upper triangular part of the array A contains the upper
-*          triangular matrix, and the strictly lower triangular part of
-*          A is not referenced.  If UPLO = 'L', the leading N-by-N lower
-*          triangular part of the array A contains the lower triangular
-*          matrix, and the strictly upper triangular part of A is not
-*          referenced.  If DIAG = 'U', the diagonal elements of A are
-*          also not referenced and are assumed to be 1.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  RCOND   (output) REAL
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(norm(A) * norm(inv(A))).
-*
-*  WORK    (workspace) REAL array, dimension (3*N)
-*
-*  IWORK   (workspace) INTEGER array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOUNIT, ONENRM, UPPER
-      CHARACTER          NORMIN
-      INTEGER            IX, KASE, KASE1
-      REAL               AINVNM, ANORM, SCALE, SMLNUM, XNORM
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ISAMAX
-      REAL               SLAMCH, SLANTR
-      EXTERNAL           LSAME, ISAMAX, SLAMCH, SLANTR
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLACN2, SLATRS, SRSCL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, REAL
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' )
-      NOUNIT = LSAME( DIAG, 'N' )
-*
-      IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'STRCON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      END IF
-*
-      RCOND = ZERO
-      SMLNUM = SLAMCH( 'Safe minimum' )*REAL( MAX( 1, N ) )
-*
-*     Compute the norm of the triangular matrix A.
-*
-      ANORM = SLANTR( NORM, UPLO, DIAG, N, N, A, LDA, WORK )
-*
-*     Continue only if ANORM > 0.
-*
-      IF( ANORM.GT.ZERO ) THEN
-*
-*        Estimate the norm of the inverse of A.
-*
-         AINVNM = ZERO
-         NORMIN = 'N'
-         IF( ONENRM ) THEN
-            KASE1 = 1
-         ELSE
-            KASE1 = 2
-         END IF
-         KASE = 0
-   10    CONTINUE
-         CALL SLACN2( N, WORK( N+1 ), WORK, IWORK, AINVNM, KASE, ISAVE )
-         IF( KASE.NE.0 ) THEN
-            IF( KASE.EQ.KASE1 ) THEN
-*
-*              Multiply by inv(A).
-*
-               CALL SLATRS( UPLO, 'No transpose', DIAG, NORMIN, N, A,
-     $                      LDA, WORK, SCALE, WORK( 2*N+1 ), INFO )
-            ELSE
-*
-*              Multiply by inv(A').
-*
-               CALL SLATRS( UPLO, 'Transpose', DIAG, NORMIN, N, A, LDA,
-     $                      WORK, SCALE, WORK( 2*N+1 ), INFO )
-            END IF
-            NORMIN = 'Y'
-*
-*           Multiply by 1/SCALE if doing so will not cause overflow.
-*
-            IF( SCALE.NE.ONE ) THEN
-               IX = ISAMAX( N, WORK, 1 )
-               XNORM = ABS( WORK( IX ) )
-               IF( SCALE.LT.XNORM*SMLNUM .OR. SCALE.EQ.ZERO )
-     $            GO TO 20
-               CALL SRSCL( N, SCALE, WORK, 1 )
-            END IF
-            GO TO 10
-         END IF
-*
-*        Compute the estimate of the reciprocal condition number.
-*
-         IF( AINVNM.NE.ZERO )
-     $      RCOND = ( ONE / ANORM ) / AINVNM
-      END IF
-*
-   20 CONTINUE
-      RETURN
-*
-*     End of STRCON
-*
-      END
--- a/libcruft/lapack/strevc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,981 +0,0 @@
-      SUBROUTINE STREVC( SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR,
-     $                   LDVR, MM, M, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          HOWMNY, SIDE
-      INTEGER            INFO, LDT, LDVL, LDVR, M, MM, N
-*     ..
-*     .. Array Arguments ..
-      LOGICAL            SELECT( * )
-      REAL               T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  STREVC computes some or all of the right and/or left eigenvectors of
-*  a real upper quasi-triangular matrix T.
-*  Matrices of this type are produced by the Schur factorization of
-*  a real general matrix:  A = Q*T*Q**T, as computed by SHSEQR.
-*  
-*  The right eigenvector x and the left eigenvector y of T corresponding
-*  to an eigenvalue w are defined by:
-*  
-*     T*x = w*x,     (y**H)*T = w*(y**H)
-*  
-*  where y**H denotes the conjugate transpose of y.
-*  The eigenvalues are not input to this routine, but are read directly
-*  from the diagonal blocks of T.
-*  
-*  This routine returns the matrices X and/or Y of right and left
-*  eigenvectors of T, or the products Q*X and/or Q*Y, where Q is an
-*  input matrix.  If Q is the orthogonal factor that reduces a matrix
-*  A to Schur form T, then Q*X and Q*Y are the matrices of right and
-*  left eigenvectors of A.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'R':  compute right eigenvectors only;
-*          = 'L':  compute left eigenvectors only;
-*          = 'B':  compute both right and left eigenvectors.
-*
-*  HOWMNY  (input) CHARACTER*1
-*          = 'A':  compute all right and/or left eigenvectors;
-*          = 'B':  compute all right and/or left eigenvectors,
-*                  backtransformed by the matrices in VR and/or VL;
-*          = 'S':  compute selected right and/or left eigenvectors,
-*                  as indicated by the logical array SELECT.
-*
-*  SELECT  (input/output) LOGICAL array, dimension (N)
-*          If HOWMNY = 'S', SELECT specifies the eigenvectors to be
-*          computed.
-*          If w(j) is a real eigenvalue, the corresponding real
-*          eigenvector is computed if SELECT(j) is .TRUE..
-*          If w(j) and w(j+1) are the real and imaginary parts of a
-*          complex eigenvalue, the corresponding complex eigenvector is
-*          computed if either SELECT(j) or SELECT(j+1) is .TRUE., and
-*          on exit SELECT(j) is set to .TRUE. and SELECT(j+1) is set to
-*          .FALSE..
-*          Not referenced if HOWMNY = 'A' or 'B'.
-*
-*  N       (input) INTEGER
-*          The order of the matrix T. N >= 0.
-*
-*  T       (input) REAL array, dimension (LDT,N)
-*          The upper quasi-triangular matrix T in Schur canonical form.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= max(1,N).
-*
-*  VL      (input/output) REAL array, dimension (LDVL,MM)
-*          On entry, if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must
-*          contain an N-by-N matrix Q (usually the orthogonal matrix Q
-*          of Schur vectors returned by SHSEQR).
-*          On exit, if SIDE = 'L' or 'B', VL contains:
-*          if HOWMNY = 'A', the matrix Y of left eigenvectors of T;
-*          if HOWMNY = 'B', the matrix Q*Y;
-*          if HOWMNY = 'S', the left eigenvectors of T specified by
-*                           SELECT, stored consecutively in the columns
-*                           of VL, in the same order as their
-*                           eigenvalues.
-*          A complex eigenvector corresponding to a complex eigenvalue
-*          is stored in two consecutive columns, the first holding the
-*          real part, and the second the imaginary part.
-*          Not referenced if SIDE = 'R'.
-*
-*  LDVL    (input) INTEGER
-*          The leading dimension of the array VL.  LDVL >= 1, and if
-*          SIDE = 'L' or 'B', LDVL >= N.
-*
-*  VR      (input/output) REAL array, dimension (LDVR,MM)
-*          On entry, if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must
-*          contain an N-by-N matrix Q (usually the orthogonal matrix Q
-*          of Schur vectors returned by SHSEQR).
-*          On exit, if SIDE = 'R' or 'B', VR contains:
-*          if HOWMNY = 'A', the matrix X of right eigenvectors of T;
-*          if HOWMNY = 'B', the matrix Q*X;
-*          if HOWMNY = 'S', the right eigenvectors of T specified by
-*                           SELECT, stored consecutively in the columns
-*                           of VR, in the same order as their
-*                           eigenvalues.
-*          A complex eigenvector corresponding to a complex eigenvalue
-*          is stored in two consecutive columns, the first holding the
-*          real part and the second the imaginary part.
-*          Not referenced if SIDE = 'L'.
-*
-*  LDVR    (input) INTEGER
-*          The leading dimension of the array VR.  LDVR >= 1, and if
-*          SIDE = 'R' or 'B', LDVR >= N.
-*
-*  MM      (input) INTEGER
-*          The number of columns in the arrays VL and/or VR. MM >= M.
-*
-*  M       (output) INTEGER
-*          The number of columns in the arrays VL and/or VR actually
-*          used to store the eigenvectors.
-*          If HOWMNY = 'A' or 'B', M is set to N.
-*          Each selected real eigenvector occupies one column and each
-*          selected complex eigenvector occupies two columns.
-*
-*  WORK    (workspace) REAL array, dimension (3*N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The algorithm used in this program is basically backward (forward)
-*  substitution, with scaling to make the the code robust against
-*  possible overflow.
-*
-*  Each eigenvector is normalized so that the element of largest
-*  magnitude has magnitude 1; here the magnitude of a complex number
-*  (x,y) is taken to be |x| + |y|.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ALLV, BOTHV, LEFTV, OVER, PAIR, RIGHTV, SOMEV
-      INTEGER            I, IERR, II, IP, IS, J, J1, J2, JNXT, K, KI, N2
-      REAL               BETA, BIGNUM, EMAX, OVFL, REC, REMAX, SCALE,
-     $                   SMIN, SMLNUM, ULP, UNFL, VCRIT, VMAX, WI, WR,
-     $                   XNORM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ISAMAX
-      REAL               SDOT, SLAMCH
-      EXTERNAL           LSAME, ISAMAX, SDOT, SLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SAXPY, SCOPY, SGEMV, SLABAD, SLALN2, SSCAL,
-     $                   XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SQRT
-*     ..
-*     .. Local Arrays ..
-      REAL               X( 2, 2 )
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and test the input parameters
-*
-      BOTHV = LSAME( SIDE, 'B' )
-      RIGHTV = LSAME( SIDE, 'R' ) .OR. BOTHV
-      LEFTV = LSAME( SIDE, 'L' ) .OR. BOTHV
-*
-      ALLV = LSAME( HOWMNY, 'A' )
-      OVER = LSAME( HOWMNY, 'B' )
-      SOMEV = LSAME( HOWMNY, 'S' )
-*
-      INFO = 0
-      IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
-         INFO = -1
-      ELSE IF( .NOT.ALLV .AND. .NOT.OVER .AND. .NOT.SOMEV ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDT.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      ELSE IF( LDVL.LT.1 .OR. ( LEFTV .AND. LDVL.LT.N ) ) THEN
-         INFO = -8
-      ELSE IF( LDVR.LT.1 .OR. ( RIGHTV .AND. LDVR.LT.N ) ) THEN
-         INFO = -10
-      ELSE
-*
-*        Set M to the number of columns required to store the selected
-*        eigenvectors, standardize the array SELECT if necessary, and
-*        test MM.
-*
-         IF( SOMEV ) THEN
-            M = 0
-            PAIR = .FALSE.
-            DO 10 J = 1, N
-               IF( PAIR ) THEN
-                  PAIR = .FALSE.
-                  SELECT( J ) = .FALSE.
-               ELSE
-                  IF( J.LT.N ) THEN
-                     IF( T( J+1, J ).EQ.ZERO ) THEN
-                        IF( SELECT( J ) )
-     $                     M = M + 1
-                     ELSE
-                        PAIR = .TRUE.
-                        IF( SELECT( J ) .OR. SELECT( J+1 ) ) THEN
-                           SELECT( J ) = .TRUE.
-                           M = M + 2
-                        END IF
-                     END IF
-                  ELSE
-                     IF( SELECT( N ) )
-     $                  M = M + 1
-                  END IF
-               END IF
-   10       CONTINUE
-         ELSE
-            M = N
-         END IF
-*
-         IF( MM.LT.M ) THEN
-            INFO = -11
-         END IF
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'STREVC', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Set the constants to control overflow.
-*
-      UNFL = SLAMCH( 'Safe minimum' )
-      OVFL = ONE / UNFL
-      CALL SLABAD( UNFL, OVFL )
-      ULP = SLAMCH( 'Precision' )
-      SMLNUM = UNFL*( N / ULP )
-      BIGNUM = ( ONE-ULP ) / SMLNUM
-*
-*     Compute 1-norm of each column of strictly upper triangular
-*     part of T to control overflow in triangular solver.
-*
-      WORK( 1 ) = ZERO
-      DO 30 J = 2, N
-         WORK( J ) = ZERO
-         DO 20 I = 1, J - 1
-            WORK( J ) = WORK( J ) + ABS( T( I, J ) )
-   20    CONTINUE
-   30 CONTINUE
-*
-*     Index IP is used to specify the real or complex eigenvalue:
-*       IP = 0, real eigenvalue,
-*            1, first of conjugate complex pair: (wr,wi)
-*           -1, second of conjugate complex pair: (wr,wi)
-*
-      N2 = 2*N
-*
-      IF( RIGHTV ) THEN
-*
-*        Compute right eigenvectors.
-*
-         IP = 0
-         IS = M
-         DO 140 KI = N, 1, -1
-*
-            IF( IP.EQ.1 )
-     $         GO TO 130
-            IF( KI.EQ.1 )
-     $         GO TO 40
-            IF( T( KI, KI-1 ).EQ.ZERO )
-     $         GO TO 40
-            IP = -1
-*
-   40       CONTINUE
-            IF( SOMEV ) THEN
-               IF( IP.EQ.0 ) THEN
-                  IF( .NOT.SELECT( KI ) )
-     $               GO TO 130
-               ELSE
-                  IF( .NOT.SELECT( KI-1 ) )
-     $               GO TO 130
-               END IF
-            END IF
-*
-*           Compute the KI-th eigenvalue (WR,WI).
-*
-            WR = T( KI, KI )
-            WI = ZERO
-            IF( IP.NE.0 )
-     $         WI = SQRT( ABS( T( KI, KI-1 ) ) )*
-     $              SQRT( ABS( T( KI-1, KI ) ) )
-            SMIN = MAX( ULP*( ABS( WR )+ABS( WI ) ), SMLNUM )
-*
-            IF( IP.EQ.0 ) THEN
-*
-*              Real right eigenvector
-*
-               WORK( KI+N ) = ONE
-*
-*              Form right-hand side
-*
-               DO 50 K = 1, KI - 1
-                  WORK( K+N ) = -T( K, KI )
-   50          CONTINUE
-*
-*              Solve the upper quasi-triangular system:
-*                 (T(1:KI-1,1:KI-1) - WR)*X = SCALE*WORK.
-*
-               JNXT = KI - 1
-               DO 60 J = KI - 1, 1, -1
-                  IF( J.GT.JNXT )
-     $               GO TO 60
-                  J1 = J
-                  J2 = J
-                  JNXT = J - 1
-                  IF( J.GT.1 ) THEN
-                     IF( T( J, J-1 ).NE.ZERO ) THEN
-                        J1 = J - 1
-                        JNXT = J - 2
-                     END IF
-                  END IF
-*
-                  IF( J1.EQ.J2 ) THEN
-*
-*                    1-by-1 diagonal block
-*
-                     CALL SLALN2( .FALSE., 1, 1, SMIN, ONE, T( J, J ),
-     $                            LDT, ONE, ONE, WORK( J+N ), N, WR,
-     $                            ZERO, X, 2, SCALE, XNORM, IERR )
-*
-*                    Scale X(1,1) to avoid overflow when updating
-*                    the right-hand side.
-*
-                     IF( XNORM.GT.ONE ) THEN
-                        IF( WORK( J ).GT.BIGNUM / XNORM ) THEN
-                           X( 1, 1 ) = X( 1, 1 ) / XNORM
-                           SCALE = SCALE / XNORM
-                        END IF
-                     END IF
-*
-*                    Scale if necessary
-*
-                     IF( SCALE.NE.ONE )
-     $                  CALL SSCAL( KI, SCALE, WORK( 1+N ), 1 )
-                     WORK( J+N ) = X( 1, 1 )
-*
-*                    Update right-hand side
-*
-                     CALL SAXPY( J-1, -X( 1, 1 ), T( 1, J ), 1,
-     $                           WORK( 1+N ), 1 )
-*
-                  ELSE
-*
-*                    2-by-2 diagonal block
-*
-                     CALL SLALN2( .FALSE., 2, 1, SMIN, ONE,
-     $                            T( J-1, J-1 ), LDT, ONE, ONE,
-     $                            WORK( J-1+N ), N, WR, ZERO, X, 2,
-     $                            SCALE, XNORM, IERR )
-*
-*                    Scale X(1,1) and X(2,1) to avoid overflow when
-*                    updating the right-hand side.
-*
-                     IF( XNORM.GT.ONE ) THEN
-                        BETA = MAX( WORK( J-1 ), WORK( J ) )
-                        IF( BETA.GT.BIGNUM / XNORM ) THEN
-                           X( 1, 1 ) = X( 1, 1 ) / XNORM
-                           X( 2, 1 ) = X( 2, 1 ) / XNORM
-                           SCALE = SCALE / XNORM
-                        END IF
-                     END IF
-*
-*                    Scale if necessary
-*
-                     IF( SCALE.NE.ONE )
-     $                  CALL SSCAL( KI, SCALE, WORK( 1+N ), 1 )
-                     WORK( J-1+N ) = X( 1, 1 )
-                     WORK( J+N ) = X( 2, 1 )
-*
-*                    Update right-hand side
-*
-                     CALL SAXPY( J-2, -X( 1, 1 ), T( 1, J-1 ), 1,
-     $                           WORK( 1+N ), 1 )
-                     CALL SAXPY( J-2, -X( 2, 1 ), T( 1, J ), 1,
-     $                           WORK( 1+N ), 1 )
-                  END IF
-   60          CONTINUE
-*
-*              Copy the vector x or Q*x to VR and normalize.
-*
-               IF( .NOT.OVER ) THEN
-                  CALL SCOPY( KI, WORK( 1+N ), 1, VR( 1, IS ), 1 )
-*
-                  II = ISAMAX( KI, VR( 1, IS ), 1 )
-                  REMAX = ONE / ABS( VR( II, IS ) )
-                  CALL SSCAL( KI, REMAX, VR( 1, IS ), 1 )
-*
-                  DO 70 K = KI + 1, N
-                     VR( K, IS ) = ZERO
-   70             CONTINUE
-               ELSE
-                  IF( KI.GT.1 )
-     $               CALL SGEMV( 'N', N, KI-1, ONE, VR, LDVR,
-     $                           WORK( 1+N ), 1, WORK( KI+N ),
-     $                           VR( 1, KI ), 1 )
-*
-                  II = ISAMAX( N, VR( 1, KI ), 1 )
-                  REMAX = ONE / ABS( VR( II, KI ) )
-                  CALL SSCAL( N, REMAX, VR( 1, KI ), 1 )
-               END IF
-*
-            ELSE
-*
-*              Complex right eigenvector.
-*
-*              Initial solve
-*                [ (T(KI-1,KI-1) T(KI-1,KI) ) - (WR + I* WI)]*X = 0.
-*                [ (T(KI,KI-1)   T(KI,KI)   )               ]
-*
-               IF( ABS( T( KI-1, KI ) ).GE.ABS( T( KI, KI-1 ) ) ) THEN
-                  WORK( KI-1+N ) = ONE
-                  WORK( KI+N2 ) = WI / T( KI-1, KI )
-               ELSE
-                  WORK( KI-1+N ) = -WI / T( KI, KI-1 )
-                  WORK( KI+N2 ) = ONE
-               END IF
-               WORK( KI+N ) = ZERO
-               WORK( KI-1+N2 ) = ZERO
-*
-*              Form right-hand side
-*
-               DO 80 K = 1, KI - 2
-                  WORK( K+N ) = -WORK( KI-1+N )*T( K, KI-1 )
-                  WORK( K+N2 ) = -WORK( KI+N2 )*T( K, KI )
-   80          CONTINUE
-*
-*              Solve upper quasi-triangular system:
-*              (T(1:KI-2,1:KI-2) - (WR+i*WI))*X = SCALE*(WORK+i*WORK2)
-*
-               JNXT = KI - 2
-               DO 90 J = KI - 2, 1, -1
-                  IF( J.GT.JNXT )
-     $               GO TO 90
-                  J1 = J
-                  J2 = J
-                  JNXT = J - 1
-                  IF( J.GT.1 ) THEN
-                     IF( T( J, J-1 ).NE.ZERO ) THEN
-                        J1 = J - 1
-                        JNXT = J - 2
-                     END IF
-                  END IF
-*
-                  IF( J1.EQ.J2 ) THEN
-*
-*                    1-by-1 diagonal block
-*
-                     CALL SLALN2( .FALSE., 1, 2, SMIN, ONE, T( J, J ),
-     $                            LDT, ONE, ONE, WORK( J+N ), N, WR, WI,
-     $                            X, 2, SCALE, XNORM, IERR )
-*
-*                    Scale X(1,1) and X(1,2) to avoid overflow when
-*                    updating the right-hand side.
-*
-                     IF( XNORM.GT.ONE ) THEN
-                        IF( WORK( J ).GT.BIGNUM / XNORM ) THEN
-                           X( 1, 1 ) = X( 1, 1 ) / XNORM
-                           X( 1, 2 ) = X( 1, 2 ) / XNORM
-                           SCALE = SCALE / XNORM
-                        END IF
-                     END IF
-*
-*                    Scale if necessary
-*
-                     IF( SCALE.NE.ONE ) THEN
-                        CALL SSCAL( KI, SCALE, WORK( 1+N ), 1 )
-                        CALL SSCAL( KI, SCALE, WORK( 1+N2 ), 1 )
-                     END IF
-                     WORK( J+N ) = X( 1, 1 )
-                     WORK( J+N2 ) = X( 1, 2 )
-*
-*                    Update the right-hand side
-*
-                     CALL SAXPY( J-1, -X( 1, 1 ), T( 1, J ), 1,
-     $                           WORK( 1+N ), 1 )
-                     CALL SAXPY( J-1, -X( 1, 2 ), T( 1, J ), 1,
-     $                           WORK( 1+N2 ), 1 )
-*
-                  ELSE
-*
-*                    2-by-2 diagonal block
-*
-                     CALL SLALN2( .FALSE., 2, 2, SMIN, ONE,
-     $                            T( J-1, J-1 ), LDT, ONE, ONE,
-     $                            WORK( J-1+N ), N, WR, WI, X, 2, SCALE,
-     $                            XNORM, IERR )
-*
-*                    Scale X to avoid overflow when updating
-*                    the right-hand side.
-*
-                     IF( XNORM.GT.ONE ) THEN
-                        BETA = MAX( WORK( J-1 ), WORK( J ) )
-                        IF( BETA.GT.BIGNUM / XNORM ) THEN
-                           REC = ONE / XNORM
-                           X( 1, 1 ) = X( 1, 1 )*REC
-                           X( 1, 2 ) = X( 1, 2 )*REC
-                           X( 2, 1 ) = X( 2, 1 )*REC
-                           X( 2, 2 ) = X( 2, 2 )*REC
-                           SCALE = SCALE*REC
-                        END IF
-                     END IF
-*
-*                    Scale if necessary
-*
-                     IF( SCALE.NE.ONE ) THEN
-                        CALL SSCAL( KI, SCALE, WORK( 1+N ), 1 )
-                        CALL SSCAL( KI, SCALE, WORK( 1+N2 ), 1 )
-                     END IF
-                     WORK( J-1+N ) = X( 1, 1 )
-                     WORK( J+N ) = X( 2, 1 )
-                     WORK( J-1+N2 ) = X( 1, 2 )
-                     WORK( J+N2 ) = X( 2, 2 )
-*
-*                    Update the right-hand side
-*
-                     CALL SAXPY( J-2, -X( 1, 1 ), T( 1, J-1 ), 1,
-     $                           WORK( 1+N ), 1 )
-                     CALL SAXPY( J-2, -X( 2, 1 ), T( 1, J ), 1,
-     $                           WORK( 1+N ), 1 )
-                     CALL SAXPY( J-2, -X( 1, 2 ), T( 1, J-1 ), 1,
-     $                           WORK( 1+N2 ), 1 )
-                     CALL SAXPY( J-2, -X( 2, 2 ), T( 1, J ), 1,
-     $                           WORK( 1+N2 ), 1 )
-                  END IF
-   90          CONTINUE
-*
-*              Copy the vector x or Q*x to VR and normalize.
-*
-               IF( .NOT.OVER ) THEN
-                  CALL SCOPY( KI, WORK( 1+N ), 1, VR( 1, IS-1 ), 1 )
-                  CALL SCOPY( KI, WORK( 1+N2 ), 1, VR( 1, IS ), 1 )
-*
-                  EMAX = ZERO
-                  DO 100 K = 1, KI
-                     EMAX = MAX( EMAX, ABS( VR( K, IS-1 ) )+
-     $                      ABS( VR( K, IS ) ) )
-  100             CONTINUE
-*
-                  REMAX = ONE / EMAX
-                  CALL SSCAL( KI, REMAX, VR( 1, IS-1 ), 1 )
-                  CALL SSCAL( KI, REMAX, VR( 1, IS ), 1 )
-*
-                  DO 110 K = KI + 1, N
-                     VR( K, IS-1 ) = ZERO
-                     VR( K, IS ) = ZERO
-  110             CONTINUE
-*
-               ELSE
-*
-                  IF( KI.GT.2 ) THEN
-                     CALL SGEMV( 'N', N, KI-2, ONE, VR, LDVR,
-     $                           WORK( 1+N ), 1, WORK( KI-1+N ),
-     $                           VR( 1, KI-1 ), 1 )
-                     CALL SGEMV( 'N', N, KI-2, ONE, VR, LDVR,
-     $                           WORK( 1+N2 ), 1, WORK( KI+N2 ),
-     $                           VR( 1, KI ), 1 )
-                  ELSE
-                     CALL SSCAL( N, WORK( KI-1+N ), VR( 1, KI-1 ), 1 )
-                     CALL SSCAL( N, WORK( KI+N2 ), VR( 1, KI ), 1 )
-                  END IF
-*
-                  EMAX = ZERO
-                  DO 120 K = 1, N
-                     EMAX = MAX( EMAX, ABS( VR( K, KI-1 ) )+
-     $                      ABS( VR( K, KI ) ) )
-  120             CONTINUE
-                  REMAX = ONE / EMAX
-                  CALL SSCAL( N, REMAX, VR( 1, KI-1 ), 1 )
-                  CALL SSCAL( N, REMAX, VR( 1, KI ), 1 )
-               END IF
-            END IF
-*
-            IS = IS - 1
-            IF( IP.NE.0 )
-     $         IS = IS - 1
-  130       CONTINUE
-            IF( IP.EQ.1 )
-     $         IP = 0
-            IF( IP.EQ.-1 )
-     $         IP = 1
-  140    CONTINUE
-      END IF
-*
-      IF( LEFTV ) THEN
-*
-*        Compute left eigenvectors.
-*
-         IP = 0
-         IS = 1
-         DO 260 KI = 1, N
-*
-            IF( IP.EQ.-1 )
-     $         GO TO 250
-            IF( KI.EQ.N )
-     $         GO TO 150
-            IF( T( KI+1, KI ).EQ.ZERO )
-     $         GO TO 150
-            IP = 1
-*
-  150       CONTINUE
-            IF( SOMEV ) THEN
-               IF( .NOT.SELECT( KI ) )
-     $            GO TO 250
-            END IF
-*
-*           Compute the KI-th eigenvalue (WR,WI).
-*
-            WR = T( KI, KI )
-            WI = ZERO
-            IF( IP.NE.0 )
-     $         WI = SQRT( ABS( T( KI, KI+1 ) ) )*
-     $              SQRT( ABS( T( KI+1, KI ) ) )
-            SMIN = MAX( ULP*( ABS( WR )+ABS( WI ) ), SMLNUM )
-*
-            IF( IP.EQ.0 ) THEN
-*
-*              Real left eigenvector.
-*
-               WORK( KI+N ) = ONE
-*
-*              Form right-hand side
-*
-               DO 160 K = KI + 1, N
-                  WORK( K+N ) = -T( KI, K )
-  160          CONTINUE
-*
-*              Solve the quasi-triangular system:
-*                 (T(KI+1:N,KI+1:N) - WR)'*X = SCALE*WORK
-*
-               VMAX = ONE
-               VCRIT = BIGNUM
-*
-               JNXT = KI + 1
-               DO 170 J = KI + 1, N
-                  IF( J.LT.JNXT )
-     $               GO TO 170
-                  J1 = J
-                  J2 = J
-                  JNXT = J + 1
-                  IF( J.LT.N ) THEN
-                     IF( T( J+1, J ).NE.ZERO ) THEN
-                        J2 = J + 1
-                        JNXT = J + 2
-                     END IF
-                  END IF
-*
-                  IF( J1.EQ.J2 ) THEN
-*
-*                    1-by-1 diagonal block
-*
-*                    Scale if necessary to avoid overflow when forming
-*                    the right-hand side.
-*
-                     IF( WORK( J ).GT.VCRIT ) THEN
-                        REC = ONE / VMAX
-                        CALL SSCAL( N-KI+1, REC, WORK( KI+N ), 1 )
-                        VMAX = ONE
-                        VCRIT = BIGNUM
-                     END IF
-*
-                     WORK( J+N ) = WORK( J+N ) -
-     $                             SDOT( J-KI-1, T( KI+1, J ), 1,
-     $                             WORK( KI+1+N ), 1 )
-*
-*                    Solve (T(J,J)-WR)'*X = WORK
-*
-                     CALL SLALN2( .FALSE., 1, 1, SMIN, ONE, T( J, J ),
-     $                            LDT, ONE, ONE, WORK( J+N ), N, WR,
-     $                            ZERO, X, 2, SCALE, XNORM, IERR )
-*
-*                    Scale if necessary
-*
-                     IF( SCALE.NE.ONE )
-     $                  CALL SSCAL( N-KI+1, SCALE, WORK( KI+N ), 1 )
-                     WORK( J+N ) = X( 1, 1 )
-                     VMAX = MAX( ABS( WORK( J+N ) ), VMAX )
-                     VCRIT = BIGNUM / VMAX
-*
-                  ELSE
-*
-*                    2-by-2 diagonal block
-*
-*                    Scale if necessary to avoid overflow when forming
-*                    the right-hand side.
-*
-                     BETA = MAX( WORK( J ), WORK( J+1 ) )
-                     IF( BETA.GT.VCRIT ) THEN
-                        REC = ONE / VMAX
-                        CALL SSCAL( N-KI+1, REC, WORK( KI+N ), 1 )
-                        VMAX = ONE
-                        VCRIT = BIGNUM
-                     END IF
-*
-                     WORK( J+N ) = WORK( J+N ) -
-     $                             SDOT( J-KI-1, T( KI+1, J ), 1,
-     $                             WORK( KI+1+N ), 1 )
-*
-                     WORK( J+1+N ) = WORK( J+1+N ) -
-     $                               SDOT( J-KI-1, T( KI+1, J+1 ), 1,
-     $                               WORK( KI+1+N ), 1 )
-*
-*                    Solve
-*                      [T(J,J)-WR   T(J,J+1)     ]'* X = SCALE*( WORK1 )
-*                      [T(J+1,J)    T(J+1,J+1)-WR]             ( WORK2 )
-*
-                     CALL SLALN2( .TRUE., 2, 1, SMIN, ONE, T( J, J ),
-     $                            LDT, ONE, ONE, WORK( J+N ), N, WR,
-     $                            ZERO, X, 2, SCALE, XNORM, IERR )
-*
-*                    Scale if necessary
-*
-                     IF( SCALE.NE.ONE )
-     $                  CALL SSCAL( N-KI+1, SCALE, WORK( KI+N ), 1 )
-                     WORK( J+N ) = X( 1, 1 )
-                     WORK( J+1+N ) = X( 2, 1 )
-*
-                     VMAX = MAX( ABS( WORK( J+N ) ),
-     $                      ABS( WORK( J+1+N ) ), VMAX )
-                     VCRIT = BIGNUM / VMAX
-*
-                  END IF
-  170          CONTINUE
-*
-*              Copy the vector x or Q*x to VL and normalize.
-*
-               IF( .NOT.OVER ) THEN
-                  CALL SCOPY( N-KI+1, WORK( KI+N ), 1, VL( KI, IS ), 1 )
-*
-                  II = ISAMAX( N-KI+1, VL( KI, IS ), 1 ) + KI - 1
-                  REMAX = ONE / ABS( VL( II, IS ) )
-                  CALL SSCAL( N-KI+1, REMAX, VL( KI, IS ), 1 )
-*
-                  DO 180 K = 1, KI - 1
-                     VL( K, IS ) = ZERO
-  180             CONTINUE
-*
-               ELSE
-*
-                  IF( KI.LT.N )
-     $               CALL SGEMV( 'N', N, N-KI, ONE, VL( 1, KI+1 ), LDVL,
-     $                           WORK( KI+1+N ), 1, WORK( KI+N ),
-     $                           VL( 1, KI ), 1 )
-*
-                  II = ISAMAX( N, VL( 1, KI ), 1 )
-                  REMAX = ONE / ABS( VL( II, KI ) )
-                  CALL SSCAL( N, REMAX, VL( 1, KI ), 1 )
-*
-               END IF
-*
-            ELSE
-*
-*              Complex left eigenvector.
-*
-*               Initial solve:
-*                 ((T(KI,KI)    T(KI,KI+1) )' - (WR - I* WI))*X = 0.
-*                 ((T(KI+1,KI) T(KI+1,KI+1))                )
-*
-               IF( ABS( T( KI, KI+1 ) ).GE.ABS( T( KI+1, KI ) ) ) THEN
-                  WORK( KI+N ) = WI / T( KI, KI+1 )
-                  WORK( KI+1+N2 ) = ONE
-               ELSE
-                  WORK( KI+N ) = ONE
-                  WORK( KI+1+N2 ) = -WI / T( KI+1, KI )
-               END IF
-               WORK( KI+1+N ) = ZERO
-               WORK( KI+N2 ) = ZERO
-*
-*              Form right-hand side
-*
-               DO 190 K = KI + 2, N
-                  WORK( K+N ) = -WORK( KI+N )*T( KI, K )
-                  WORK( K+N2 ) = -WORK( KI+1+N2 )*T( KI+1, K )
-  190          CONTINUE
-*
-*              Solve complex quasi-triangular system:
-*              ( T(KI+2,N:KI+2,N) - (WR-i*WI) )*X = WORK1+i*WORK2
-*
-               VMAX = ONE
-               VCRIT = BIGNUM
-*
-               JNXT = KI + 2
-               DO 200 J = KI + 2, N
-                  IF( J.LT.JNXT )
-     $               GO TO 200
-                  J1 = J
-                  J2 = J
-                  JNXT = J + 1
-                  IF( J.LT.N ) THEN
-                     IF( T( J+1, J ).NE.ZERO ) THEN
-                        J2 = J + 1
-                        JNXT = J + 2
-                     END IF
-                  END IF
-*
-                  IF( J1.EQ.J2 ) THEN
-*
-*                    1-by-1 diagonal block
-*
-*                    Scale if necessary to avoid overflow when
-*                    forming the right-hand side elements.
-*
-                     IF( WORK( J ).GT.VCRIT ) THEN
-                        REC = ONE / VMAX
-                        CALL SSCAL( N-KI+1, REC, WORK( KI+N ), 1 )
-                        CALL SSCAL( N-KI+1, REC, WORK( KI+N2 ), 1 )
-                        VMAX = ONE
-                        VCRIT = BIGNUM
-                     END IF
-*
-                     WORK( J+N ) = WORK( J+N ) -
-     $                             SDOT( J-KI-2, T( KI+2, J ), 1,
-     $                             WORK( KI+2+N ), 1 )
-                     WORK( J+N2 ) = WORK( J+N2 ) -
-     $                              SDOT( J-KI-2, T( KI+2, J ), 1,
-     $                              WORK( KI+2+N2 ), 1 )
-*
-*                    Solve (T(J,J)-(WR-i*WI))*(X11+i*X12)= WK+I*WK2
-*
-                     CALL SLALN2( .FALSE., 1, 2, SMIN, ONE, T( J, J ),
-     $                            LDT, ONE, ONE, WORK( J+N ), N, WR,
-     $                            -WI, X, 2, SCALE, XNORM, IERR )
-*
-*                    Scale if necessary
-*
-                     IF( SCALE.NE.ONE ) THEN
-                        CALL SSCAL( N-KI+1, SCALE, WORK( KI+N ), 1 )
-                        CALL SSCAL( N-KI+1, SCALE, WORK( KI+N2 ), 1 )
-                     END IF
-                     WORK( J+N ) = X( 1, 1 )
-                     WORK( J+N2 ) = X( 1, 2 )
-                     VMAX = MAX( ABS( WORK( J+N ) ),
-     $                      ABS( WORK( J+N2 ) ), VMAX )
-                     VCRIT = BIGNUM / VMAX
-*
-                  ELSE
-*
-*                    2-by-2 diagonal block
-*
-*                    Scale if necessary to avoid overflow when forming
-*                    the right-hand side elements.
-*
-                     BETA = MAX( WORK( J ), WORK( J+1 ) )
-                     IF( BETA.GT.VCRIT ) THEN
-                        REC = ONE / VMAX
-                        CALL SSCAL( N-KI+1, REC, WORK( KI+N ), 1 )
-                        CALL SSCAL( N-KI+1, REC, WORK( KI+N2 ), 1 )
-                        VMAX = ONE
-                        VCRIT = BIGNUM
-                     END IF
-*
-                     WORK( J+N ) = WORK( J+N ) -
-     $                             SDOT( J-KI-2, T( KI+2, J ), 1,
-     $                             WORK( KI+2+N ), 1 )
-*
-                     WORK( J+N2 ) = WORK( J+N2 ) -
-     $                              SDOT( J-KI-2, T( KI+2, J ), 1,
-     $                              WORK( KI+2+N2 ), 1 )
-*
-                     WORK( J+1+N ) = WORK( J+1+N ) -
-     $                               SDOT( J-KI-2, T( KI+2, J+1 ), 1,
-     $                               WORK( KI+2+N ), 1 )
-*
-                     WORK( J+1+N2 ) = WORK( J+1+N2 ) -
-     $                                SDOT( J-KI-2, T( KI+2, J+1 ), 1,
-     $                                WORK( KI+2+N2 ), 1 )
-*
-*                    Solve 2-by-2 complex linear equation
-*                      ([T(j,j)   T(j,j+1)  ]'-(wr-i*wi)*I)*X = SCALE*B
-*                      ([T(j+1,j) T(j+1,j+1)]             )
-*
-                     CALL SLALN2( .TRUE., 2, 2, SMIN, ONE, T( J, J ),
-     $                            LDT, ONE, ONE, WORK( J+N ), N, WR,
-     $                            -WI, X, 2, SCALE, XNORM, IERR )
-*
-*                    Scale if necessary
-*
-                     IF( SCALE.NE.ONE ) THEN
-                        CALL SSCAL( N-KI+1, SCALE, WORK( KI+N ), 1 )
-                        CALL SSCAL( N-KI+1, SCALE, WORK( KI+N2 ), 1 )
-                     END IF
-                     WORK( J+N ) = X( 1, 1 )
-                     WORK( J+N2 ) = X( 1, 2 )
-                     WORK( J+1+N ) = X( 2, 1 )
-                     WORK( J+1+N2 ) = X( 2, 2 )
-                     VMAX = MAX( ABS( X( 1, 1 ) ), ABS( X( 1, 2 ) ),
-     $                      ABS( X( 2, 1 ) ), ABS( X( 2, 2 ) ), VMAX )
-                     VCRIT = BIGNUM / VMAX
-*
-                  END IF
-  200          CONTINUE
-*
-*              Copy the vector x or Q*x to VL and normalize.
-*
-               IF( .NOT.OVER ) THEN
-                  CALL SCOPY( N-KI+1, WORK( KI+N ), 1, VL( KI, IS ), 1 )
-                  CALL SCOPY( N-KI+1, WORK( KI+N2 ), 1, VL( KI, IS+1 ),
-     $                        1 )
-*
-                  EMAX = ZERO
-                  DO 220 K = KI, N
-                     EMAX = MAX( EMAX, ABS( VL( K, IS ) )+
-     $                      ABS( VL( K, IS+1 ) ) )
-  220             CONTINUE
-                  REMAX = ONE / EMAX
-                  CALL SSCAL( N-KI+1, REMAX, VL( KI, IS ), 1 )
-                  CALL SSCAL( N-KI+1, REMAX, VL( KI, IS+1 ), 1 )
-*
-                  DO 230 K = 1, KI - 1
-                     VL( K, IS ) = ZERO
-                     VL( K, IS+1 ) = ZERO
-  230             CONTINUE
-               ELSE
-                  IF( KI.LT.N-1 ) THEN
-                     CALL SGEMV( 'N', N, N-KI-1, ONE, VL( 1, KI+2 ),
-     $                           LDVL, WORK( KI+2+N ), 1, WORK( KI+N ),
-     $                           VL( 1, KI ), 1 )
-                     CALL SGEMV( 'N', N, N-KI-1, ONE, VL( 1, KI+2 ),
-     $                           LDVL, WORK( KI+2+N2 ), 1,
-     $                           WORK( KI+1+N2 ), VL( 1, KI+1 ), 1 )
-                  ELSE
-                     CALL SSCAL( N, WORK( KI+N ), VL( 1, KI ), 1 )
-                     CALL SSCAL( N, WORK( KI+1+N2 ), VL( 1, KI+1 ), 1 )
-                  END IF
-*
-                  EMAX = ZERO
-                  DO 240 K = 1, N
-                     EMAX = MAX( EMAX, ABS( VL( K, KI ) )+
-     $                      ABS( VL( K, KI+1 ) ) )
-  240             CONTINUE
-                  REMAX = ONE / EMAX
-                  CALL SSCAL( N, REMAX, VL( 1, KI ), 1 )
-                  CALL SSCAL( N, REMAX, VL( 1, KI+1 ), 1 )
-*
-               END IF
-*
-            END IF
-*
-            IS = IS + 1
-            IF( IP.NE.0 )
-     $         IS = IS + 1
-  250       CONTINUE
-            IF( IP.EQ.-1 )
-     $         IP = 0
-            IF( IP.EQ.1 )
-     $         IP = -1
-*
-  260    CONTINUE
-*
-      END IF
-*
-      RETURN
-*
-*     End of STREVC
-*
-      END
--- a/libcruft/lapack/strexc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,345 +0,0 @@
-      SUBROUTINE STREXC( COMPQ, N, T, LDT, Q, LDQ, IFST, ILST, WORK,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPQ
-      INTEGER            IFST, ILST, INFO, LDQ, LDT, N
-*     ..
-*     .. Array Arguments ..
-      REAL               Q( LDQ, * ), T( LDT, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  STREXC reorders the real Schur factorization of a real matrix
-*  A = Q*T*Q**T, so that the diagonal block of T with row index IFST is
-*  moved to row ILST.
-*
-*  The real Schur form T is reordered by an orthogonal similarity
-*  transformation Z**T*T*Z, and optionally the matrix Q of Schur vectors
-*  is updated by postmultiplying it with Z.
-*
-*  T must be in Schur canonical form (as returned by SHSEQR), that is,
-*  block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; each
-*  2-by-2 diagonal block has its diagonal elements equal and its
-*  off-diagonal elements of opposite sign.
-*
-*  Arguments
-*  =========
-*
-*  COMPQ   (input) CHARACTER*1
-*          = 'V':  update the matrix Q of Schur vectors;
-*          = 'N':  do not update Q.
-*
-*  N       (input) INTEGER
-*          The order of the matrix T. N >= 0.
-*
-*  T       (input/output) REAL array, dimension (LDT,N)
-*          On entry, the upper quasi-triangular matrix T, in Schur
-*          Schur canonical form.
-*          On exit, the reordered upper quasi-triangular matrix, again
-*          in Schur canonical form.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= max(1,N).
-*
-*  Q       (input/output) REAL array, dimension (LDQ,N)
-*          On entry, if COMPQ = 'V', the matrix Q of Schur vectors.
-*          On exit, if COMPQ = 'V', Q has been postmultiplied by the
-*          orthogonal transformation matrix Z which reorders T.
-*          If COMPQ = 'N', Q is not referenced.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.  LDQ >= max(1,N).
-*
-*  IFST    (input/output) INTEGER
-*  ILST    (input/output) INTEGER
-*          Specify the reordering of the diagonal blocks of T.
-*          The block with row index IFST is moved to row ILST, by a
-*          sequence of transpositions between adjacent blocks.
-*          On exit, if IFST pointed on entry to the second row of a
-*          2-by-2 block, it is changed to point to the first row; ILST
-*          always points to the first row of the block in its final
-*          position (which may differ from its input value by +1 or -1).
-*          1 <= IFST <= N; 1 <= ILST <= N.
-*
-*  WORK    (workspace) REAL array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          = 1:  two adjacent blocks were too close to swap (the problem
-*                is very ill-conditioned); T may have been partially
-*                reordered, and ILST points to the first row of the
-*                current position of the block being moved.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            WANTQ
-      INTEGER            HERE, NBF, NBL, NBNEXT
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLAEXC, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and test the input arguments.
-*
-      INFO = 0
-      WANTQ = LSAME( COMPQ, 'V' )
-      IF( .NOT.WANTQ .AND. .NOT.LSAME( COMPQ, 'N' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDT.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LDQ.LT.1 .OR. ( WANTQ .AND. LDQ.LT.MAX( 1, N ) ) ) THEN
-         INFO = -6
-      ELSE IF( IFST.LT.1 .OR. IFST.GT.N ) THEN
-         INFO = -7
-      ELSE IF( ILST.LT.1 .OR. ILST.GT.N ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'STREXC', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 )
-     $   RETURN
-*
-*     Determine the first row of specified block
-*     and find out it is 1 by 1 or 2 by 2.
-*
-      IF( IFST.GT.1 ) THEN
-         IF( T( IFST, IFST-1 ).NE.ZERO )
-     $      IFST = IFST - 1
-      END IF
-      NBF = 1
-      IF( IFST.LT.N ) THEN
-         IF( T( IFST+1, IFST ).NE.ZERO )
-     $      NBF = 2
-      END IF
-*
-*     Determine the first row of the final block
-*     and find out it is 1 by 1 or 2 by 2.
-*
-      IF( ILST.GT.1 ) THEN
-         IF( T( ILST, ILST-1 ).NE.ZERO )
-     $      ILST = ILST - 1
-      END IF
-      NBL = 1
-      IF( ILST.LT.N ) THEN
-         IF( T( ILST+1, ILST ).NE.ZERO )
-     $      NBL = 2
-      END IF
-*
-      IF( IFST.EQ.ILST )
-     $   RETURN
-*
-      IF( IFST.LT.ILST ) THEN
-*
-*        Update ILST
-*
-         IF( NBF.EQ.2 .AND. NBL.EQ.1 )
-     $      ILST = ILST - 1
-         IF( NBF.EQ.1 .AND. NBL.EQ.2 )
-     $      ILST = ILST + 1
-*
-         HERE = IFST
-*
-   10    CONTINUE
-*
-*        Swap block with next one below
-*
-         IF( NBF.EQ.1 .OR. NBF.EQ.2 ) THEN
-*
-*           Current block either 1 by 1 or 2 by 2
-*
-            NBNEXT = 1
-            IF( HERE+NBF+1.LE.N ) THEN
-               IF( T( HERE+NBF+1, HERE+NBF ).NE.ZERO )
-     $            NBNEXT = 2
-            END IF
-            CALL SLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE, NBF, NBNEXT,
-     $                   WORK, INFO )
-            IF( INFO.NE.0 ) THEN
-               ILST = HERE
-               RETURN
-            END IF
-            HERE = HERE + NBNEXT
-*
-*           Test if 2 by 2 block breaks into two 1 by 1 blocks
-*
-            IF( NBF.EQ.2 ) THEN
-               IF( T( HERE+1, HERE ).EQ.ZERO )
-     $            NBF = 3
-            END IF
-*
-         ELSE
-*
-*           Current block consists of two 1 by 1 blocks each of which
-*           must be swapped individually
-*
-            NBNEXT = 1
-            IF( HERE+3.LE.N ) THEN
-               IF( T( HERE+3, HERE+2 ).NE.ZERO )
-     $            NBNEXT = 2
-            END IF
-            CALL SLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE+1, 1, NBNEXT,
-     $                   WORK, INFO )
-            IF( INFO.NE.0 ) THEN
-               ILST = HERE
-               RETURN
-            END IF
-            IF( NBNEXT.EQ.1 ) THEN
-*
-*              Swap two 1 by 1 blocks, no problems possible
-*
-               CALL SLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE, 1, NBNEXT,
-     $                      WORK, INFO )
-               HERE = HERE + 1
-            ELSE
-*
-*              Recompute NBNEXT in case 2 by 2 split
-*
-               IF( T( HERE+2, HERE+1 ).EQ.ZERO )
-     $            NBNEXT = 1
-               IF( NBNEXT.EQ.2 ) THEN
-*
-*                 2 by 2 Block did not split
-*
-                  CALL SLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE, 1,
-     $                         NBNEXT, WORK, INFO )
-                  IF( INFO.NE.0 ) THEN
-                     ILST = HERE
-                     RETURN
-                  END IF
-                  HERE = HERE + 2
-               ELSE
-*
-*                 2 by 2 Block did split
-*
-                  CALL SLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE, 1, 1,
-     $                         WORK, INFO )
-                  CALL SLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE+1, 1, 1,
-     $                         WORK, INFO )
-                  HERE = HERE + 2
-               END IF
-            END IF
-         END IF
-         IF( HERE.LT.ILST )
-     $      GO TO 10
-*
-      ELSE
-*
-         HERE = IFST
-   20    CONTINUE
-*
-*        Swap block with next one above
-*
-         IF( NBF.EQ.1 .OR. NBF.EQ.2 ) THEN
-*
-*           Current block either 1 by 1 or 2 by 2
-*
-            NBNEXT = 1
-            IF( HERE.GE.3 ) THEN
-               IF( T( HERE-1, HERE-2 ).NE.ZERO )
-     $            NBNEXT = 2
-            END IF
-            CALL SLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE-NBNEXT, NBNEXT,
-     $                   NBF, WORK, INFO )
-            IF( INFO.NE.0 ) THEN
-               ILST = HERE
-               RETURN
-            END IF
-            HERE = HERE - NBNEXT
-*
-*           Test if 2 by 2 block breaks into two 1 by 1 blocks
-*
-            IF( NBF.EQ.2 ) THEN
-               IF( T( HERE+1, HERE ).EQ.ZERO )
-     $            NBF = 3
-            END IF
-*
-         ELSE
-*
-*           Current block consists of two 1 by 1 blocks each of which
-*           must be swapped individually
-*
-            NBNEXT = 1
-            IF( HERE.GE.3 ) THEN
-               IF( T( HERE-1, HERE-2 ).NE.ZERO )
-     $            NBNEXT = 2
-            END IF
-            CALL SLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE-NBNEXT, NBNEXT,
-     $                   1, WORK, INFO )
-            IF( INFO.NE.0 ) THEN
-               ILST = HERE
-               RETURN
-            END IF
-            IF( NBNEXT.EQ.1 ) THEN
-*
-*              Swap two 1 by 1 blocks, no problems possible
-*
-               CALL SLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE, NBNEXT, 1,
-     $                      WORK, INFO )
-               HERE = HERE - 1
-            ELSE
-*
-*              Recompute NBNEXT in case 2 by 2 split
-*
-               IF( T( HERE, HERE-1 ).EQ.ZERO )
-     $            NBNEXT = 1
-               IF( NBNEXT.EQ.2 ) THEN
-*
-*                 2 by 2 Block did not split
-*
-                  CALL SLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE-1, 2, 1,
-     $                         WORK, INFO )
-                  IF( INFO.NE.0 ) THEN
-                     ILST = HERE
-                     RETURN
-                  END IF
-                  HERE = HERE - 2
-               ELSE
-*
-*                 2 by 2 Block did split
-*
-                  CALL SLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE, 1, 1,
-     $                         WORK, INFO )
-                  CALL SLAEXC( WANTQ, N, T, LDT, Q, LDQ, HERE-1, 1, 1,
-     $                         WORK, INFO )
-                  HERE = HERE - 2
-               END IF
-            END IF
-         END IF
-         IF( HERE.GT.ILST )
-     $      GO TO 20
-      END IF
-      ILST = HERE
-*
-      RETURN
-*
-*     End of STREXC
-*
-      END
--- a/libcruft/lapack/strsen.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,461 +0,0 @@
-      SUBROUTINE STRSEN( JOB, COMPQ, SELECT, N, T, LDT, Q, LDQ, WR, WI,
-     $                   M, S, SEP, WORK, LWORK, IWORK, LIWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call SLACN2 in place of SLACON, 7 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPQ, JOB
-      INTEGER            INFO, LDQ, LDT, LIWORK, LWORK, M, N
-      REAL               S, SEP
-*     ..
-*     .. Array Arguments ..
-      LOGICAL            SELECT( * )
-      INTEGER            IWORK( * )
-      REAL               Q( LDQ, * ), T( LDT, * ), WI( * ), WORK( * ),
-     $                   WR( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  STRSEN reorders the real Schur factorization of a real matrix
-*  A = Q*T*Q**T, so that a selected cluster of eigenvalues appears in
-*  the leading diagonal blocks of the upper quasi-triangular matrix T,
-*  and the leading columns of Q form an orthonormal basis of the
-*  corresponding right invariant subspace.
-*
-*  Optionally the routine computes the reciprocal condition numbers of
-*  the cluster of eigenvalues and/or the invariant subspace.
-*
-*  T must be in Schur canonical form (as returned by SHSEQR), that is,
-*  block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; each
-*  2-by-2 diagonal block has its diagonal elemnts equal and its
-*  off-diagonal elements of opposite sign.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies whether condition numbers are required for the
-*          cluster of eigenvalues (S) or the invariant subspace (SEP):
-*          = 'N': none;
-*          = 'E': for eigenvalues only (S);
-*          = 'V': for invariant subspace only (SEP);
-*          = 'B': for both eigenvalues and invariant subspace (S and
-*                 SEP).
-*
-*  COMPQ   (input) CHARACTER*1
-*          = 'V': update the matrix Q of Schur vectors;
-*          = 'N': do not update Q.
-*
-*  SELECT  (input) LOGICAL array, dimension (N)
-*          SELECT specifies the eigenvalues in the selected cluster. To
-*          select a real eigenvalue w(j), SELECT(j) must be set to
-*          .TRUE.. To select a complex conjugate pair of eigenvalues
-*          w(j) and w(j+1), corresponding to a 2-by-2 diagonal block,
-*          either SELECT(j) or SELECT(j+1) or both must be set to
-*          .TRUE.; a complex conjugate pair of eigenvalues must be
-*          either both included in the cluster or both excluded.
-*
-*  N       (input) INTEGER
-*          The order of the matrix T. N >= 0.
-*
-*  T       (input/output) REAL array, dimension (LDT,N)
-*          On entry, the upper quasi-triangular matrix T, in Schur
-*          canonical form.
-*          On exit, T is overwritten by the reordered matrix T, again in
-*          Schur canonical form, with the selected eigenvalues in the
-*          leading diagonal blocks.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= max(1,N).
-*
-*  Q       (input/output) REAL array, dimension (LDQ,N)
-*          On entry, if COMPQ = 'V', the matrix Q of Schur vectors.
-*          On exit, if COMPQ = 'V', Q has been postmultiplied by the
-*          orthogonal transformation matrix which reorders T; the
-*          leading M columns of Q form an orthonormal basis for the
-*          specified invariant subspace.
-*          If COMPQ = 'N', Q is not referenced.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.
-*          LDQ >= 1; and if COMPQ = 'V', LDQ >= N.
-*
-*  WR      (output) REAL array, dimension (N)
-*  WI      (output) REAL array, dimension (N)
-*          The real and imaginary parts, respectively, of the reordered
-*          eigenvalues of T. The eigenvalues are stored in the same
-*          order as on the diagonal of T, with WR(i) = T(i,i) and, if
-*          T(i:i+1,i:i+1) is a 2-by-2 diagonal block, WI(i) > 0 and
-*          WI(i+1) = -WI(i). Note that if a complex eigenvalue is
-*          sufficiently ill-conditioned, then its value may differ
-*          significantly from its value before reordering.
-*
-*  M       (output) INTEGER
-*          The dimension of the specified invariant subspace.
-*          0 < = M <= N.
-*
-*  S       (output) REAL
-*          If JOB = 'E' or 'B', S is a lower bound on the reciprocal
-*          condition number for the selected cluster of eigenvalues.
-*          S cannot underestimate the true reciprocal condition number
-*          by more than a factor of sqrt(N). If M = 0 or N, S = 1.
-*          If JOB = 'N' or 'V', S is not referenced.
-*
-*  SEP     (output) REAL
-*          If JOB = 'V' or 'B', SEP is the estimated reciprocal
-*          condition number of the specified invariant subspace. If
-*          M = 0 or N, SEP = norm(T).
-*          If JOB = 'N' or 'E', SEP is not referenced.
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If JOB = 'N', LWORK >= max(1,N);
-*          if JOB = 'E', LWORK >= max(1,M*(N-M));
-*          if JOB = 'V' or 'B', LWORK >= max(1,2*M*(N-M)).
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  IWORK   (workspace) INTEGER array, dimension (MAX(1,LIWORK))
-*          On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK.
-*
-*  LIWORK  (input) INTEGER
-*          The dimension of the array IWORK.
-*          If JOB = 'N' or 'E', LIWORK >= 1;
-*          if JOB = 'V' or 'B', LIWORK >= max(1,M*(N-M)).
-*
-*          If LIWORK = -1, then a workspace query is assumed; the
-*          routine only calculates the optimal size of the IWORK array,
-*          returns this value as the first entry of the IWORK array, and
-*          no error message related to LIWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          = 1: reordering of T failed because some eigenvalues are too
-*               close to separate (the problem is very ill-conditioned);
-*               T may have been partially reordered, and WR and WI
-*               contain the eigenvalues in the same order as in T; S and
-*               SEP (if requested) are set to zero.
-*
-*  Further Details
-*  ===============
-*
-*  STRSEN first collects the selected eigenvalues by computing an
-*  orthogonal transformation Z to move them to the top left corner of T.
-*  In other words, the selected eigenvalues are the eigenvalues of T11
-*  in:
-*
-*                Z'*T*Z = ( T11 T12 ) n1
-*                         (  0  T22 ) n2
-*                            n1  n2
-*
-*  where N = n1+n2 and Z' means the transpose of Z. The first n1 columns
-*  of Z span the specified invariant subspace of T.
-*
-*  If T has been obtained from the real Schur factorization of a matrix
-*  A = Q*T*Q', then the reordered real Schur factorization of A is given
-*  by A = (Q*Z)*(Z'*T*Z)*(Q*Z)', and the first n1 columns of Q*Z span
-*  the corresponding invariant subspace of A.
-*
-*  The reciprocal condition number of the average of the eigenvalues of
-*  T11 may be returned in S. S lies between 0 (very badly conditioned)
-*  and 1 (very well conditioned). It is computed as follows. First we
-*  compute R so that
-*
-*                         P = ( I  R ) n1
-*                             ( 0  0 ) n2
-*                               n1 n2
-*
-*  is the projector on the invariant subspace associated with T11.
-*  R is the solution of the Sylvester equation:
-*
-*                        T11*R - R*T22 = T12.
-*
-*  Let F-norm(M) denote the Frobenius-norm of M and 2-norm(M) denote
-*  the two-norm of M. Then S is computed as the lower bound
-*
-*                      (1 + F-norm(R)**2)**(-1/2)
-*
-*  on the reciprocal of 2-norm(P), the true reciprocal condition number.
-*  S cannot underestimate 1 / 2-norm(P) by more than a factor of
-*  sqrt(N).
-*
-*  An approximate error bound for the computed average of the
-*  eigenvalues of T11 is
-*
-*                         EPS * norm(T) / S
-*
-*  where EPS is the machine precision.
-*
-*  The reciprocal condition number of the right invariant subspace
-*  spanned by the first n1 columns of Z (or of Q*Z) is returned in SEP.
-*  SEP is defined as the separation of T11 and T22:
-*
-*                     sep( T11, T22 ) = sigma-min( C )
-*
-*  where sigma-min(C) is the smallest singular value of the
-*  n1*n2-by-n1*n2 matrix
-*
-*     C  = kprod( I(n2), T11 ) - kprod( transpose(T22), I(n1) )
-*
-*  I(m) is an m by m identity matrix, and kprod denotes the Kronecker
-*  product. We estimate sigma-min(C) by the reciprocal of an estimate of
-*  the 1-norm of inverse(C). The true reciprocal 1-norm of inverse(C)
-*  cannot differ from sigma-min(C) by more than a factor of sqrt(n1*n2).
-*
-*  When SEP is small, small changes in T can cause large changes in
-*  the invariant subspace. An approximate bound on the maximum angular
-*  error in the computed right invariant subspace is
-*
-*                      EPS * norm(T) / SEP
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, PAIR, SWAP, WANTBH, WANTQ, WANTS,
-     $                    WANTSP
-      INTEGER            IERR, K, KASE, KK, KS, LIWMIN, LWMIN, N1, N2,
-     $                   NN
-      REAL               EST, RNORM, SCALE
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               SLANGE
-      EXTERNAL           LSAME, SLANGE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLACN2, SLACPY, STREXC, STRSYL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and test the input parameters
-*
-      WANTBH = LSAME( JOB, 'B' )
-      WANTS = LSAME( JOB, 'E' ) .OR. WANTBH
-      WANTSP = LSAME( JOB, 'V' ) .OR. WANTBH
-      WANTQ = LSAME( COMPQ, 'V' )
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.WANTS .AND. .NOT.WANTSP )
-     $     THEN
-         INFO = -1
-      ELSE IF( .NOT.LSAME( COMPQ, 'N' ) .AND. .NOT.WANTQ ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDT.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      ELSE IF( LDQ.LT.1 .OR. ( WANTQ .AND. LDQ.LT.N ) ) THEN
-         INFO = -8
-      ELSE
-*
-*        Set M to the dimension of the specified invariant subspace,
-*        and test LWORK and LIWORK.
-*
-         M = 0
-         PAIR = .FALSE.
-         DO 10 K = 1, N
-            IF( PAIR ) THEN
-               PAIR = .FALSE.
-            ELSE
-               IF( K.LT.N ) THEN
-                  IF( T( K+1, K ).EQ.ZERO ) THEN
-                     IF( SELECT( K ) )
-     $                  M = M + 1
-                  ELSE
-                     PAIR = .TRUE.
-                     IF( SELECT( K ) .OR. SELECT( K+1 ) )
-     $                  M = M + 2
-                  END IF
-               ELSE
-                  IF( SELECT( N ) )
-     $               M = M + 1
-               END IF
-            END IF
-   10    CONTINUE
-*
-         N1 = M
-         N2 = N - M
-         NN = N1*N2
-*
-         IF(  WANTSP ) THEN
-            LWMIN = MAX( 1, 2*NN )
-            LIWMIN = MAX( 1, NN )
-         ELSE IF( LSAME( JOB, 'N' ) ) THEN
-            LWMIN = MAX( 1, N )
-            LIWMIN = 1
-         ELSE IF( LSAME( JOB, 'E' ) ) THEN
-            LWMIN = MAX( 1, NN )
-            LIWMIN = 1
-         END IF
-*
-         IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
-            INFO = -15
-         ELSE IF( LIWORK.LT.LIWMIN .AND. .NOT.LQUERY ) THEN
-            INFO = -17
-         END IF
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         WORK( 1 ) = LWMIN
-         IWORK( 1 ) = LIWMIN
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'STRSEN', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( M.EQ.N .OR. M.EQ.0 ) THEN
-         IF( WANTS )
-     $      S = ONE
-         IF( WANTSP )
-     $      SEP = SLANGE( '1', N, N, T, LDT, WORK )
-         GO TO 40
-      END IF
-*
-*     Collect the selected blocks at the top-left corner of T.
-*
-      KS = 0
-      PAIR = .FALSE.
-      DO 20 K = 1, N
-         IF( PAIR ) THEN
-            PAIR = .FALSE.
-         ELSE
-            SWAP = SELECT( K )
-            IF( K.LT.N ) THEN
-               IF( T( K+1, K ).NE.ZERO ) THEN
-                  PAIR = .TRUE.
-                  SWAP = SWAP .OR. SELECT( K+1 )
-               END IF
-            END IF
-            IF( SWAP ) THEN
-               KS = KS + 1
-*
-*              Swap the K-th block to position KS.
-*
-               IERR = 0
-               KK = K
-               IF( K.NE.KS )
-     $            CALL STREXC( COMPQ, N, T, LDT, Q, LDQ, KK, KS, WORK,
-     $                         IERR )
-               IF( IERR.EQ.1 .OR. IERR.EQ.2 ) THEN
-*
-*                 Blocks too close to swap: exit.
-*
-                  INFO = 1
-                  IF( WANTS )
-     $               S = ZERO
-                  IF( WANTSP )
-     $               SEP = ZERO
-                  GO TO 40
-               END IF
-               IF( PAIR )
-     $            KS = KS + 1
-            END IF
-         END IF
-   20 CONTINUE
-*
-      IF( WANTS ) THEN
-*
-*        Solve Sylvester equation for R:
-*
-*           T11*R - R*T22 = scale*T12
-*
-         CALL SLACPY( 'F', N1, N2, T( 1, N1+1 ), LDT, WORK, N1 )
-         CALL STRSYL( 'N', 'N', -1, N1, N2, T, LDT, T( N1+1, N1+1 ),
-     $                LDT, WORK, N1, SCALE, IERR )
-*
-*        Estimate the reciprocal of the condition number of the cluster
-*        of eigenvalues.
-*
-         RNORM = SLANGE( 'F', N1, N2, WORK, N1, WORK )
-         IF( RNORM.EQ.ZERO ) THEN
-            S = ONE
-         ELSE
-            S = SCALE / ( SQRT( SCALE*SCALE / RNORM+RNORM )*
-     $          SQRT( RNORM ) )
-         END IF
-      END IF
-*
-      IF( WANTSP ) THEN
-*
-*        Estimate sep(T11,T22).
-*
-         EST = ZERO
-         KASE = 0
-   30    CONTINUE
-         CALL SLACN2( NN, WORK( NN+1 ), WORK, IWORK, EST, KASE, ISAVE )
-         IF( KASE.NE.0 ) THEN
-            IF( KASE.EQ.1 ) THEN
-*
-*              Solve  T11*R - R*T22 = scale*X.
-*
-               CALL STRSYL( 'N', 'N', -1, N1, N2, T, LDT,
-     $                      T( N1+1, N1+1 ), LDT, WORK, N1, SCALE,
-     $                      IERR )
-            ELSE
-*
-*              Solve  T11'*R - R*T22' = scale*X.
-*
-               CALL STRSYL( 'T', 'T', -1, N1, N2, T, LDT,
-     $                      T( N1+1, N1+1 ), LDT, WORK, N1, SCALE,
-     $                      IERR )
-            END IF
-            GO TO 30
-         END IF
-*
-         SEP = SCALE / EST
-      END IF
-*
-   40 CONTINUE
-*
-*     Store the output eigenvalues in WR and WI.
-*
-      DO 50 K = 1, N
-         WR( K ) = T( K, K )
-         WI( K ) = ZERO
-   50 CONTINUE
-      DO 60 K = 1, N - 1
-         IF( T( K+1, K ).NE.ZERO ) THEN
-            WI( K ) = SQRT( ABS( T( K, K+1 ) ) )*
-     $                SQRT( ABS( T( K+1, K ) ) )
-            WI( K+1 ) = -WI( K )
-         END IF
-   60 CONTINUE
-*
-      WORK( 1 ) = LWMIN
-      IWORK( 1 ) = LIWMIN
-*
-      RETURN
-*
-*     End of STRSEN
-*
-      END
--- a/libcruft/lapack/strsyl.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,913 +0,0 @@
-      SUBROUTINE STRSYL( TRANA, TRANB, ISGN, M, N, A, LDA, B, LDB, C,
-     $                   LDC, SCALE, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TRANA, TRANB
-      INTEGER            INFO, ISGN, LDA, LDB, LDC, M, N
-      REAL               SCALE
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), B( LDB, * ), C( LDC, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  STRSYL solves the real Sylvester matrix equation:
-*
-*     op(A)*X + X*op(B) = scale*C or
-*     op(A)*X - X*op(B) = scale*C,
-*
-*  where op(A) = A or A**T, and  A and B are both upper quasi-
-*  triangular. A is M-by-M and B is N-by-N; the right hand side C and
-*  the solution X are M-by-N; and scale is an output scale factor, set
-*  <= 1 to avoid overflow in X.
-*
-*  A and B must be in Schur canonical form (as returned by SHSEQR), that
-*  is, block upper triangular with 1-by-1 and 2-by-2 diagonal blocks;
-*  each 2-by-2 diagonal block has its diagonal elements equal and its
-*  off-diagonal elements of opposite sign.
-*
-*  Arguments
-*  =========
-*
-*  TRANA   (input) CHARACTER*1
-*          Specifies the option op(A):
-*          = 'N': op(A) = A    (No transpose)
-*          = 'T': op(A) = A**T (Transpose)
-*          = 'C': op(A) = A**H (Conjugate transpose = Transpose)
-*
-*  TRANB   (input) CHARACTER*1
-*          Specifies the option op(B):
-*          = 'N': op(B) = B    (No transpose)
-*          = 'T': op(B) = B**T (Transpose)
-*          = 'C': op(B) = B**H (Conjugate transpose = Transpose)
-*
-*  ISGN    (input) INTEGER
-*          Specifies the sign in the equation:
-*          = +1: solve op(A)*X + X*op(B) = scale*C
-*          = -1: solve op(A)*X - X*op(B) = scale*C
-*
-*  M       (input) INTEGER
-*          The order of the matrix A, and the number of rows in the
-*          matrices X and C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The order of the matrix B, and the number of columns in the
-*          matrices X and C. N >= 0.
-*
-*  A       (input) REAL array, dimension (LDA,M)
-*          The upper quasi-triangular matrix A, in Schur canonical form.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  B       (input) REAL array, dimension (LDB,N)
-*          The upper quasi-triangular matrix B, in Schur canonical form.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B. LDB >= max(1,N).
-*
-*  C       (input/output) REAL array, dimension (LDC,N)
-*          On entry, the M-by-N right hand side matrix C.
-*          On exit, C is overwritten by the solution matrix X.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M)
-*
-*  SCALE   (output) REAL
-*          The scale factor, scale, set <= 1 to avoid overflow in X.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          = 1: A and B have common or very close eigenvalues; perturbed
-*               values were used to solve the equation (but the matrices
-*               A and B are unchanged).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOTRNA, NOTRNB
-      INTEGER            IERR, J, K, K1, K2, KNEXT, L, L1, L2, LNEXT
-      REAL               A11, BIGNUM, DA11, DB, EPS, SCALOC, SGN, SMIN,
-     $                   SMLNUM, SUML, SUMR, XNORM
-*     ..
-*     .. Local Arrays ..
-      REAL               DUM( 1 ), VEC( 2, 2 ), X( 2, 2 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      REAL               SDOT, SLAMCH, SLANGE
-      EXTERNAL           LSAME, SDOT, SLAMCH, SLANGE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLABAD, SLALN2, SLASY2, SSCAL, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, REAL
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and Test input parameters
-*
-      NOTRNA = LSAME( TRANA, 'N' )
-      NOTRNB = LSAME( TRANB, 'N' )
-*
-      INFO = 0
-      IF( .NOT.NOTRNA .AND. .NOT.LSAME( TRANA, 'T' ) .AND. .NOT.
-     $    LSAME( TRANA, 'C' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRNB .AND. .NOT.LSAME( TRANB, 'T' ) .AND. .NOT.
-     $         LSAME( TRANB, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( ISGN.NE.1 .AND. ISGN.NE.-1 ) THEN
-         INFO = -3
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -7
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -9
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -11
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'STRSYL', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Set constants to control overflow
-*
-      EPS = SLAMCH( 'P' )
-      SMLNUM = SLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL SLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SMLNUM*REAL( M*N ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-      SMIN = MAX( SMLNUM, EPS*SLANGE( 'M', M, M, A, LDA, DUM ),
-     $       EPS*SLANGE( 'M', N, N, B, LDB, DUM ) )
-*
-      SCALE = ONE
-      SGN = ISGN
-*
-      IF( NOTRNA .AND. NOTRNB ) THEN
-*
-*        Solve    A*X + ISGN*X*B = scale*C.
-*
-*        The (K,L)th block of X is determined starting from
-*        bottom-left corner column by column by
-*
-*         A(K,K)*X(K,L) + ISGN*X(K,L)*B(L,L) = C(K,L) - R(K,L)
-*
-*        Where
-*                  M                         L-1
-*        R(K,L) = SUM [A(K,I)*X(I,L)] + ISGN*SUM [X(K,J)*B(J,L)].
-*                I=K+1                       J=1
-*
-*        Start column loop (index = L)
-*        L1 (L2) : column index of the first (first) row of X(K,L).
-*
-         LNEXT = 1
-         DO 70 L = 1, N
-            IF( L.LT.LNEXT )
-     $         GO TO 70
-            IF( L.EQ.N ) THEN
-               L1 = L
-               L2 = L
-            ELSE
-               IF( B( L+1, L ).NE.ZERO ) THEN
-                  L1 = L
-                  L2 = L + 1
-                  LNEXT = L + 2
-               ELSE
-                  L1 = L
-                  L2 = L
-                  LNEXT = L + 1
-               END IF
-            END IF
-*
-*           Start row loop (index = K)
-*           K1 (K2): row index of the first (last) row of X(K,L).
-*
-            KNEXT = M
-            DO 60 K = M, 1, -1
-               IF( K.GT.KNEXT )
-     $            GO TO 60
-               IF( K.EQ.1 ) THEN
-                  K1 = K
-                  K2 = K
-               ELSE
-                  IF( A( K, K-1 ).NE.ZERO ) THEN
-                     K1 = K - 1
-                     K2 = K
-                     KNEXT = K - 2
-                  ELSE
-                     K1 = K
-                     K2 = K
-                     KNEXT = K - 1
-                  END IF
-               END IF
-*
-               IF( L1.EQ.L2 .AND. K1.EQ.K2 ) THEN
-                  SUML = SDOT( M-K1, A( K1, MIN( K1+1, M ) ), LDA,
-     $                         C( MIN( K1+1, M ), L1 ), 1 )
-                  SUMR = SDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-                  SCALOC = ONE
-*
-                  A11 = A( K1, K1 ) + SGN*B( L1, L1 )
-                  DA11 = ABS( A11 )
-                  IF( DA11.LE.SMIN ) THEN
-                     A11 = SMIN
-                     DA11 = SMIN
-                     INFO = 1
-                  END IF
-                  DB = ABS( VEC( 1, 1 ) )
-                  IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
-                     IF( DB.GT.BIGNUM*DA11 )
-     $                  SCALOC = ONE / DB
-                  END IF
-                  X( 1, 1 ) = ( VEC( 1, 1 )*SCALOC ) / A11
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 10 J = 1, N
-                        CALL SSCAL( M, SCALOC, C( 1, J ), 1 )
-   10                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-*
-               ELSE IF( L1.EQ.L2 .AND. K1.NE.K2 ) THEN
-*
-                  SUML = SDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
-     $                         C( MIN( K2+1, M ), L1 ), 1 )
-                  SUMR = SDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = SDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
-     $                         C( MIN( K2+1, M ), L1 ), 1 )
-                  SUMR = SDOT( L1-1, C( K2, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
-*
-                  CALL SLALN2( .FALSE., 2, 1, SMIN, ONE, A( K1, K1 ),
-     $                         LDA, ONE, ONE, VEC, 2, -SGN*B( L1, L1 ),
-     $                         ZERO, X, 2, SCALOC, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 20 J = 1, N
-                        CALL SSCAL( M, SCALOC, C( 1, J ), 1 )
-   20                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K2, L1 ) = X( 2, 1 )
-*
-               ELSE IF( L1.NE.L2 .AND. K1.EQ.K2 ) THEN
-*
-                  SUML = SDOT( M-K1, A( K1, MIN( K1+1, M ) ), LDA,
-     $                         C( MIN( K1+1, M ), L1 ), 1 )
-                  SUMR = SDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 1, 1 ) = SGN*( C( K1, L1 )-( SUML+SGN*SUMR ) )
-*
-                  SUML = SDOT( M-K1, A( K1, MIN( K1+1, M ) ), LDA,
-     $                         C( MIN( K1+1, M ), L2 ), 1 )
-                  SUMR = SDOT( L1-1, C( K1, 1 ), LDC, B( 1, L2 ), 1 )
-                  VEC( 2, 1 ) = SGN*( C( K1, L2 )-( SUML+SGN*SUMR ) )
-*
-                  CALL SLALN2( .TRUE., 2, 1, SMIN, ONE, B( L1, L1 ),
-     $                         LDB, ONE, ONE, VEC, 2, -SGN*A( K1, K1 ),
-     $                         ZERO, X, 2, SCALOC, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 40 J = 1, N
-                        CALL SSCAL( M, SCALOC, C( 1, J ), 1 )
-   40                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K1, L2 ) = X( 2, 1 )
-*
-               ELSE IF( L1.NE.L2 .AND. K1.NE.K2 ) THEN
-*
-                  SUML = SDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
-     $                         C( MIN( K2+1, M ), L1 ), 1 )
-                  SUMR = SDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = SDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
-     $                         C( MIN( K2+1, M ), L2 ), 1 )
-                  SUMR = SDOT( L1-1, C( K1, 1 ), LDC, B( 1, L2 ), 1 )
-                  VEC( 1, 2 ) = C( K1, L2 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = SDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
-     $                         C( MIN( K2+1, M ), L1 ), 1 )
-                  SUMR = SDOT( L1-1, C( K2, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = SDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
-     $                         C( MIN( K2+1, M ), L2 ), 1 )
-                  SUMR = SDOT( L1-1, C( K2, 1 ), LDC, B( 1, L2 ), 1 )
-                  VEC( 2, 2 ) = C( K2, L2 ) - ( SUML+SGN*SUMR )
-*
-                  CALL SLASY2( .FALSE., .FALSE., ISGN, 2, 2,
-     $                         A( K1, K1 ), LDA, B( L1, L1 ), LDB, VEC,
-     $                         2, SCALOC, X, 2, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 50 J = 1, N
-                        CALL SSCAL( M, SCALOC, C( 1, J ), 1 )
-   50                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K1, L2 ) = X( 1, 2 )
-                  C( K2, L1 ) = X( 2, 1 )
-                  C( K2, L2 ) = X( 2, 2 )
-               END IF
-*
-   60       CONTINUE
-*
-   70    CONTINUE
-*
-      ELSE IF( .NOT.NOTRNA .AND. NOTRNB ) THEN
-*
-*        Solve    A' *X + ISGN*X*B = scale*C.
-*
-*        The (K,L)th block of X is determined starting from
-*        upper-left corner column by column by
-*
-*          A(K,K)'*X(K,L) + ISGN*X(K,L)*B(L,L) = C(K,L) - R(K,L)
-*
-*        Where
-*                   K-1                        L-1
-*          R(K,L) = SUM [A(I,K)'*X(I,L)] +ISGN*SUM [X(K,J)*B(J,L)]
-*                   I=1                        J=1
-*
-*        Start column loop (index = L)
-*        L1 (L2): column index of the first (last) row of X(K,L)
-*
-         LNEXT = 1
-         DO 130 L = 1, N
-            IF( L.LT.LNEXT )
-     $         GO TO 130
-            IF( L.EQ.N ) THEN
-               L1 = L
-               L2 = L
-            ELSE
-               IF( B( L+1, L ).NE.ZERO ) THEN
-                  L1 = L
-                  L2 = L + 1
-                  LNEXT = L + 2
-               ELSE
-                  L1 = L
-                  L2 = L
-                  LNEXT = L + 1
-               END IF
-            END IF
-*
-*           Start row loop (index = K)
-*           K1 (K2): row index of the first (last) row of X(K,L)
-*
-            KNEXT = 1
-            DO 120 K = 1, M
-               IF( K.LT.KNEXT )
-     $            GO TO 120
-               IF( K.EQ.M ) THEN
-                  K1 = K
-                  K2 = K
-               ELSE
-                  IF( A( K+1, K ).NE.ZERO ) THEN
-                     K1 = K
-                     K2 = K + 1
-                     KNEXT = K + 2
-                  ELSE
-                     K1 = K
-                     K2 = K
-                     KNEXT = K + 1
-                  END IF
-               END IF
-*
-               IF( L1.EQ.L2 .AND. K1.EQ.K2 ) THEN
-                  SUML = SDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
-                  SUMR = SDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-                  SCALOC = ONE
-*
-                  A11 = A( K1, K1 ) + SGN*B( L1, L1 )
-                  DA11 = ABS( A11 )
-                  IF( DA11.LE.SMIN ) THEN
-                     A11 = SMIN
-                     DA11 = SMIN
-                     INFO = 1
-                  END IF
-                  DB = ABS( VEC( 1, 1 ) )
-                  IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
-                     IF( DB.GT.BIGNUM*DA11 )
-     $                  SCALOC = ONE / DB
-                  END IF
-                  X( 1, 1 ) = ( VEC( 1, 1 )*SCALOC ) / A11
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 80 J = 1, N
-                        CALL SSCAL( M, SCALOC, C( 1, J ), 1 )
-   80                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-*
-               ELSE IF( L1.EQ.L2 .AND. K1.NE.K2 ) THEN
-*
-                  SUML = SDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
-                  SUMR = SDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = SDOT( K1-1, A( 1, K2 ), 1, C( 1, L1 ), 1 )
-                  SUMR = SDOT( L1-1, C( K2, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
-*
-                  CALL SLALN2( .TRUE., 2, 1, SMIN, ONE, A( K1, K1 ),
-     $                         LDA, ONE, ONE, VEC, 2, -SGN*B( L1, L1 ),
-     $                         ZERO, X, 2, SCALOC, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 90 J = 1, N
-                        CALL SSCAL( M, SCALOC, C( 1, J ), 1 )
-   90                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K2, L1 ) = X( 2, 1 )
-*
-               ELSE IF( L1.NE.L2 .AND. K1.EQ.K2 ) THEN
-*
-                  SUML = SDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
-                  SUMR = SDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 1, 1 ) = SGN*( C( K1, L1 )-( SUML+SGN*SUMR ) )
-*
-                  SUML = SDOT( K1-1, A( 1, K1 ), 1, C( 1, L2 ), 1 )
-                  SUMR = SDOT( L1-1, C( K1, 1 ), LDC, B( 1, L2 ), 1 )
-                  VEC( 2, 1 ) = SGN*( C( K1, L2 )-( SUML+SGN*SUMR ) )
-*
-                  CALL SLALN2( .TRUE., 2, 1, SMIN, ONE, B( L1, L1 ),
-     $                         LDB, ONE, ONE, VEC, 2, -SGN*A( K1, K1 ),
-     $                         ZERO, X, 2, SCALOC, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 100 J = 1, N
-                        CALL SSCAL( M, SCALOC, C( 1, J ), 1 )
-  100                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K1, L2 ) = X( 2, 1 )
-*
-               ELSE IF( L1.NE.L2 .AND. K1.NE.K2 ) THEN
-*
-                  SUML = SDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
-                  SUMR = SDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = SDOT( K1-1, A( 1, K1 ), 1, C( 1, L2 ), 1 )
-                  SUMR = SDOT( L1-1, C( K1, 1 ), LDC, B( 1, L2 ), 1 )
-                  VEC( 1, 2 ) = C( K1, L2 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = SDOT( K1-1, A( 1, K2 ), 1, C( 1, L1 ), 1 )
-                  SUMR = SDOT( L1-1, C( K2, 1 ), LDC, B( 1, L1 ), 1 )
-                  VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = SDOT( K1-1, A( 1, K2 ), 1, C( 1, L2 ), 1 )
-                  SUMR = SDOT( L1-1, C( K2, 1 ), LDC, B( 1, L2 ), 1 )
-                  VEC( 2, 2 ) = C( K2, L2 ) - ( SUML+SGN*SUMR )
-*
-                  CALL SLASY2( .TRUE., .FALSE., ISGN, 2, 2, A( K1, K1 ),
-     $                         LDA, B( L1, L1 ), LDB, VEC, 2, SCALOC, X,
-     $                         2, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 110 J = 1, N
-                        CALL SSCAL( M, SCALOC, C( 1, J ), 1 )
-  110                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K1, L2 ) = X( 1, 2 )
-                  C( K2, L1 ) = X( 2, 1 )
-                  C( K2, L2 ) = X( 2, 2 )
-               END IF
-*
-  120       CONTINUE
-  130    CONTINUE
-*
-      ELSE IF( .NOT.NOTRNA .AND. .NOT.NOTRNB ) THEN
-*
-*        Solve    A'*X + ISGN*X*B' = scale*C.
-*
-*        The (K,L)th block of X is determined starting from
-*        top-right corner column by column by
-*
-*           A(K,K)'*X(K,L) + ISGN*X(K,L)*B(L,L)' = C(K,L) - R(K,L)
-*
-*        Where
-*                     K-1                          N
-*            R(K,L) = SUM [A(I,K)'*X(I,L)] + ISGN*SUM [X(K,J)*B(L,J)'].
-*                     I=1                        J=L+1
-*
-*        Start column loop (index = L)
-*        L1 (L2): column index of the first (last) row of X(K,L)
-*
-         LNEXT = N
-         DO 190 L = N, 1, -1
-            IF( L.GT.LNEXT )
-     $         GO TO 190
-            IF( L.EQ.1 ) THEN
-               L1 = L
-               L2 = L
-            ELSE
-               IF( B( L, L-1 ).NE.ZERO ) THEN
-                  L1 = L - 1
-                  L2 = L
-                  LNEXT = L - 2
-               ELSE
-                  L1 = L
-                  L2 = L
-                  LNEXT = L - 1
-               END IF
-            END IF
-*
-*           Start row loop (index = K)
-*           K1 (K2): row index of the first (last) row of X(K,L)
-*
-            KNEXT = 1
-            DO 180 K = 1, M
-               IF( K.LT.KNEXT )
-     $            GO TO 180
-               IF( K.EQ.M ) THEN
-                  K1 = K
-                  K2 = K
-               ELSE
-                  IF( A( K+1, K ).NE.ZERO ) THEN
-                     K1 = K
-                     K2 = K + 1
-                     KNEXT = K + 2
-                  ELSE
-                     K1 = K
-                     K2 = K
-                     KNEXT = K + 1
-                  END IF
-               END IF
-*
-               IF( L1.EQ.L2 .AND. K1.EQ.K2 ) THEN
-                  SUML = SDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
-                  SUMR = SDOT( N-L1, C( K1, MIN( L1+1, N ) ), LDC,
-     $                         B( L1, MIN( L1+1, N ) ), LDB )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-                  SCALOC = ONE
-*
-                  A11 = A( K1, K1 ) + SGN*B( L1, L1 )
-                  DA11 = ABS( A11 )
-                  IF( DA11.LE.SMIN ) THEN
-                     A11 = SMIN
-                     DA11 = SMIN
-                     INFO = 1
-                  END IF
-                  DB = ABS( VEC( 1, 1 ) )
-                  IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
-                     IF( DB.GT.BIGNUM*DA11 )
-     $                  SCALOC = ONE / DB
-                  END IF
-                  X( 1, 1 ) = ( VEC( 1, 1 )*SCALOC ) / A11
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 140 J = 1, N
-                        CALL SSCAL( M, SCALOC, C( 1, J ), 1 )
-  140                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-*
-               ELSE IF( L1.EQ.L2 .AND. K1.NE.K2 ) THEN
-*
-                  SUML = SDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
-                  SUMR = SDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                         B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = SDOT( K1-1, A( 1, K2 ), 1, C( 1, L1 ), 1 )
-                  SUMR = SDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
-     $                         B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
-*
-                  CALL SLALN2( .TRUE., 2, 1, SMIN, ONE, A( K1, K1 ),
-     $                         LDA, ONE, ONE, VEC, 2, -SGN*B( L1, L1 ),
-     $                         ZERO, X, 2, SCALOC, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 150 J = 1, N
-                        CALL SSCAL( M, SCALOC, C( 1, J ), 1 )
-  150                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K2, L1 ) = X( 2, 1 )
-*
-               ELSE IF( L1.NE.L2 .AND. K1.EQ.K2 ) THEN
-*
-                  SUML = SDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
-                  SUMR = SDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                         B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 1, 1 ) = SGN*( C( K1, L1 )-( SUML+SGN*SUMR ) )
-*
-                  SUML = SDOT( K1-1, A( 1, K1 ), 1, C( 1, L2 ), 1 )
-                  SUMR = SDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                         B( L2, MIN( L2+1, N ) ), LDB )
-                  VEC( 2, 1 ) = SGN*( C( K1, L2 )-( SUML+SGN*SUMR ) )
-*
-                  CALL SLALN2( .FALSE., 2, 1, SMIN, ONE, B( L1, L1 ),
-     $                         LDB, ONE, ONE, VEC, 2, -SGN*A( K1, K1 ),
-     $                         ZERO, X, 2, SCALOC, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 160 J = 1, N
-                        CALL SSCAL( M, SCALOC, C( 1, J ), 1 )
-  160                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K1, L2 ) = X( 2, 1 )
-*
-               ELSE IF( L1.NE.L2 .AND. K1.NE.K2 ) THEN
-*
-                  SUML = SDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
-                  SUMR = SDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                         B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = SDOT( K1-1, A( 1, K1 ), 1, C( 1, L2 ), 1 )
-                  SUMR = SDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                         B( L2, MIN( L2+1, N ) ), LDB )
-                  VEC( 1, 2 ) = C( K1, L2 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = SDOT( K1-1, A( 1, K2 ), 1, C( 1, L1 ), 1 )
-                  SUMR = SDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
-     $                         B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = SDOT( K1-1, A( 1, K2 ), 1, C( 1, L2 ), 1 )
-                  SUMR = SDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
-     $                         B( L2, MIN(L2+1, N ) ), LDB )
-                  VEC( 2, 2 ) = C( K2, L2 ) - ( SUML+SGN*SUMR )
-*
-                  CALL SLASY2( .TRUE., .TRUE., ISGN, 2, 2, A( K1, K1 ),
-     $                         LDA, B( L1, L1 ), LDB, VEC, 2, SCALOC, X,
-     $                         2, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 170 J = 1, N
-                        CALL SSCAL( M, SCALOC, C( 1, J ), 1 )
-  170                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K1, L2 ) = X( 1, 2 )
-                  C( K2, L1 ) = X( 2, 1 )
-                  C( K2, L2 ) = X( 2, 2 )
-               END IF
-*
-  180       CONTINUE
-  190    CONTINUE
-*
-      ELSE IF( NOTRNA .AND. .NOT.NOTRNB ) THEN
-*
-*        Solve    A*X + ISGN*X*B' = scale*C.
-*
-*        The (K,L)th block of X is determined starting from
-*        bottom-right corner column by column by
-*
-*            A(K,K)*X(K,L) + ISGN*X(K,L)*B(L,L)' = C(K,L) - R(K,L)
-*
-*        Where
-*                      M                          N
-*            R(K,L) = SUM [A(K,I)*X(I,L)] + ISGN*SUM [X(K,J)*B(L,J)'].
-*                    I=K+1                      J=L+1
-*
-*        Start column loop (index = L)
-*        L1 (L2): column index of the first (last) row of X(K,L)
-*
-         LNEXT = N
-         DO 250 L = N, 1, -1
-            IF( L.GT.LNEXT )
-     $         GO TO 250
-            IF( L.EQ.1 ) THEN
-               L1 = L
-               L2 = L
-            ELSE
-               IF( B( L, L-1 ).NE.ZERO ) THEN
-                  L1 = L - 1
-                  L2 = L
-                  LNEXT = L - 2
-               ELSE
-                  L1 = L
-                  L2 = L
-                  LNEXT = L - 1
-               END IF
-            END IF
-*
-*           Start row loop (index = K)
-*           K1 (K2): row index of the first (last) row of X(K,L)
-*
-            KNEXT = M
-            DO 240 K = M, 1, -1
-               IF( K.GT.KNEXT )
-     $            GO TO 240
-               IF( K.EQ.1 ) THEN
-                  K1 = K
-                  K2 = K
-               ELSE
-                  IF( A( K, K-1 ).NE.ZERO ) THEN
-                     K1 = K - 1
-                     K2 = K
-                     KNEXT = K - 2
-                  ELSE
-                     K1 = K
-                     K2 = K
-                     KNEXT = K - 1
-                  END IF
-               END IF
-*
-               IF( L1.EQ.L2 .AND. K1.EQ.K2 ) THEN
-                  SUML = SDOT( M-K1, A( K1, MIN(K1+1, M ) ), LDA,
-     $                   C( MIN( K1+1, M ), L1 ), 1 )
-                  SUMR = SDOT( N-L1, C( K1, MIN( L1+1, N ) ), LDC,
-     $                         B( L1, MIN( L1+1, N ) ), LDB )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-                  SCALOC = ONE
-*
-                  A11 = A( K1, K1 ) + SGN*B( L1, L1 )
-                  DA11 = ABS( A11 )
-                  IF( DA11.LE.SMIN ) THEN
-                     A11 = SMIN
-                     DA11 = SMIN
-                     INFO = 1
-                  END IF
-                  DB = ABS( VEC( 1, 1 ) )
-                  IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
-                     IF( DB.GT.BIGNUM*DA11 )
-     $                  SCALOC = ONE / DB
-                  END IF
-                  X( 1, 1 ) = ( VEC( 1, 1 )*SCALOC ) / A11
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 200 J = 1, N
-                        CALL SSCAL( M, SCALOC, C( 1, J ), 1 )
-  200                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-*
-               ELSE IF( L1.EQ.L2 .AND. K1.NE.K2 ) THEN
-*
-                  SUML = SDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
-     $                         C( MIN( K2+1, M ), L1 ), 1 )
-                  SUMR = SDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                         B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = SDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
-     $                         C( MIN( K2+1, M ), L1 ), 1 )
-                  SUMR = SDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
-     $                         B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
-*
-                  CALL SLALN2( .FALSE., 2, 1, SMIN, ONE, A( K1, K1 ),
-     $                         LDA, ONE, ONE, VEC, 2, -SGN*B( L1, L1 ),
-     $                         ZERO, X, 2, SCALOC, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 210 J = 1, N
-                        CALL SSCAL( M, SCALOC, C( 1, J ), 1 )
-  210                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K2, L1 ) = X( 2, 1 )
-*
-               ELSE IF( L1.NE.L2 .AND. K1.EQ.K2 ) THEN
-*
-                  SUML = SDOT( M-K1, A( K1, MIN( K1+1, M ) ), LDA,
-     $                         C( MIN( K1+1, M ), L1 ), 1 )
-                  SUMR = SDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                         B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 1, 1 ) = SGN*( C( K1, L1 )-( SUML+SGN*SUMR ) )
-*
-                  SUML = SDOT( M-K1, A( K1, MIN( K1+1, M ) ), LDA,
-     $                         C( MIN( K1+1, M ), L2 ), 1 )
-                  SUMR = SDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                         B( L2, MIN( L2+1, N ) ), LDB )
-                  VEC( 2, 1 ) = SGN*( C( K1, L2 )-( SUML+SGN*SUMR ) )
-*
-                  CALL SLALN2( .FALSE., 2, 1, SMIN, ONE, B( L1, L1 ),
-     $                         LDB, ONE, ONE, VEC, 2, -SGN*A( K1, K1 ),
-     $                         ZERO, X, 2, SCALOC, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 220 J = 1, N
-                        CALL SSCAL( M, SCALOC, C( 1, J ), 1 )
-  220                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K1, L2 ) = X( 2, 1 )
-*
-               ELSE IF( L1.NE.L2 .AND. K1.NE.K2 ) THEN
-*
-                  SUML = SDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
-     $                         C( MIN( K2+1, M ), L1 ), 1 )
-                  SUMR = SDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                         B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = SDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
-     $                         C( MIN( K2+1, M ), L2 ), 1 )
-                  SUMR = SDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
-     $                         B( L2, MIN( L2+1, N ) ), LDB )
-                  VEC( 1, 2 ) = C( K1, L2 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = SDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
-     $                         C( MIN( K2+1, M ), L1 ), 1 )
-                  SUMR = SDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
-     $                         B( L1, MIN( L2+1, N ) ), LDB )
-                  VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
-*
-                  SUML = SDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
-     $                         C( MIN( K2+1, M ), L2 ), 1 )
-                  SUMR = SDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
-     $                         B( L2, MIN( L2+1, N ) ), LDB )
-                  VEC( 2, 2 ) = C( K2, L2 ) - ( SUML+SGN*SUMR )
-*
-                  CALL SLASY2( .FALSE., .TRUE., ISGN, 2, 2, A( K1, K1 ),
-     $                         LDA, B( L1, L1 ), LDB, VEC, 2, SCALOC, X,
-     $                         2, XNORM, IERR )
-                  IF( IERR.NE.0 )
-     $               INFO = 1
-*
-                  IF( SCALOC.NE.ONE ) THEN
-                     DO 230 J = 1, N
-                        CALL SSCAL( M, SCALOC, C( 1, J ), 1 )
-  230                CONTINUE
-                     SCALE = SCALE*SCALOC
-                  END IF
-                  C( K1, L1 ) = X( 1, 1 )
-                  C( K1, L2 ) = X( 1, 2 )
-                  C( K2, L1 ) = X( 2, 1 )
-                  C( K2, L2 ) = X( 2, 2 )
-               END IF
-*
-  240       CONTINUE
-  250    CONTINUE
-*
-      END IF
-*
-      RETURN
-*
-*     End of STRSYL
-*
-      END
--- a/libcruft/lapack/strti2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-      SUBROUTINE STRTI2( UPLO, DIAG, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  STRTI2 computes the inverse of a real upper or lower triangular
-*  matrix.
-*
-*  This is the Level 2 BLAS version of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the matrix A is upper or lower triangular.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  DIAG    (input) CHARACTER*1
-*          Specifies whether or not the matrix A is unit triangular.
-*          = 'N':  Non-unit triangular
-*          = 'U':  Unit triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the triangular matrix A.  If UPLO = 'U', the
-*          leading n by n upper triangular part of the array A contains
-*          the upper triangular matrix, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n by n lower triangular part of the array A contains
-*          the lower triangular matrix, and the strictly upper
-*          triangular part of A is not referenced.  If DIAG = 'U', the
-*          diagonal elements of A are also not referenced and are
-*          assumed to be 1.
-*
-*          On exit, the (triangular) inverse of the original matrix, in
-*          the same storage format.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE
-      PARAMETER          ( ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOUNIT, UPPER
-      INTEGER            J
-      REAL               AJJ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SSCAL, STRMV, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      NOUNIT = LSAME( DIAG, 'N' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'STRTI2', -INFO )
-         RETURN
-      END IF
-*
-      IF( UPPER ) THEN
-*
-*        Compute inverse of upper triangular matrix.
-*
-         DO 10 J = 1, N
-            IF( NOUNIT ) THEN
-               A( J, J ) = ONE / A( J, J )
-               AJJ = -A( J, J )
-            ELSE
-               AJJ = -ONE
-            END IF
-*
-*           Compute elements 1:j-1 of j-th column.
-*
-            CALL STRMV( 'Upper', 'No transpose', DIAG, J-1, A, LDA,
-     $                  A( 1, J ), 1 )
-            CALL SSCAL( J-1, AJJ, A( 1, J ), 1 )
-   10    CONTINUE
-      ELSE
-*
-*        Compute inverse of lower triangular matrix.
-*
-         DO 20 J = N, 1, -1
-            IF( NOUNIT ) THEN
-               A( J, J ) = ONE / A( J, J )
-               AJJ = -A( J, J )
-            ELSE
-               AJJ = -ONE
-            END IF
-            IF( J.LT.N ) THEN
-*
-*              Compute elements j+1:n of j-th column.
-*
-               CALL STRMV( 'Lower', 'No transpose', DIAG, N-J,
-     $                     A( J+1, J+1 ), LDA, A( J+1, J ), 1 )
-               CALL SSCAL( N-J, AJJ, A( J+1, J ), 1 )
-            END IF
-   20    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of STRTI2
-*
-      END
--- a/libcruft/lapack/strtri.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,176 +0,0 @@
-      SUBROUTINE STRTRI( UPLO, DIAG, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  STRTRI computes the inverse of a real upper or lower triangular
-*  matrix A.
-*
-*  This is the Level 3 BLAS version of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  A is upper triangular;
-*          = 'L':  A is lower triangular.
-*
-*  DIAG    (input) CHARACTER*1
-*          = 'N':  A is non-unit triangular;
-*          = 'U':  A is unit triangular.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the triangular matrix A.  If UPLO = 'U', the
-*          leading N-by-N upper triangular part of the array A contains
-*          the upper triangular matrix, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading N-by-N lower triangular part of the array A contains
-*          the lower triangular matrix, and the strictly upper
-*          triangular part of A is not referenced.  If DIAG = 'U', the
-*          diagonal elements of A are also not referenced and are
-*          assumed to be 1.
-*          On exit, the (triangular) inverse of the original matrix, in
-*          the same storage format.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = i, A(i,i) is exactly zero.  The triangular
-*               matrix is singular and its inverse can not be computed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ONE, ZERO
-      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOUNIT, UPPER
-      INTEGER            J, JB, NB, NN
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           STRMM, STRSM, STRTI2, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      NOUNIT = LSAME( DIAG, 'N' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'STRTRI', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Check for singularity if non-unit.
-*
-      IF( NOUNIT ) THEN
-         DO 10 INFO = 1, N
-            IF( A( INFO, INFO ).EQ.ZERO )
-     $         RETURN
-   10    CONTINUE
-         INFO = 0
-      END IF
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 )
-      IF( NB.LE.1 .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code
-*
-         CALL STRTI2( UPLO, DIAG, N, A, LDA, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( UPPER ) THEN
-*
-*           Compute inverse of upper triangular matrix
-*
-            DO 20 J = 1, N, NB
-               JB = MIN( NB, N-J+1 )
-*
-*              Compute rows 1:j-1 of current block column
-*
-               CALL STRMM( 'Left', 'Upper', 'No transpose', DIAG, J-1,
-     $                     JB, ONE, A, LDA, A( 1, J ), LDA )
-               CALL STRSM( 'Right', 'Upper', 'No transpose', DIAG, J-1,
-     $                     JB, -ONE, A( J, J ), LDA, A( 1, J ), LDA )
-*
-*              Compute inverse of current diagonal block
-*
-               CALL STRTI2( 'Upper', DIAG, JB, A( J, J ), LDA, INFO )
-   20       CONTINUE
-         ELSE
-*
-*           Compute inverse of lower triangular matrix
-*
-            NN = ( ( N-1 ) / NB )*NB + 1
-            DO 30 J = NN, 1, -NB
-               JB = MIN( NB, N-J+1 )
-               IF( J+JB.LE.N ) THEN
-*
-*                 Compute rows j+jb:n of current block column
-*
-                  CALL STRMM( 'Left', 'Lower', 'No transpose', DIAG,
-     $                        N-J-JB+1, JB, ONE, A( J+JB, J+JB ), LDA,
-     $                        A( J+JB, J ), LDA )
-                  CALL STRSM( 'Right', 'Lower', 'No transpose', DIAG,
-     $                        N-J-JB+1, JB, -ONE, A( J, J ), LDA,
-     $                        A( J+JB, J ), LDA )
-               END IF
-*
-*              Compute inverse of current diagonal block
-*
-               CALL STRTI2( 'Lower', DIAG, JB, A( J, J ), LDA, INFO )
-   30       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of STRTRI
-*
-      END
--- a/libcruft/lapack/strtrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-      SUBROUTINE STRTRS( UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, TRANS, UPLO
-      INTEGER            INFO, LDA, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  STRTRS solves a triangular system of the form
-*
-*     A * X = B  or  A**T * X = B,
-*
-*  where A is a triangular matrix of order N, and B is an N-by-NRHS
-*  matrix.  A check is made to verify that A is nonsingular.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  A is upper triangular;
-*          = 'L':  A is lower triangular.
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the form of the system of equations:
-*          = 'N':  A * X = B  (No transpose)
-*          = 'T':  A**T * X = B  (Transpose)
-*          = 'C':  A**H * X = B  (Conjugate transpose = Transpose)
-*
-*  DIAG    (input) CHARACTER*1
-*          = 'N':  A is non-unit triangular;
-*          = 'U':  A is unit triangular.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  A       (input) REAL array, dimension (LDA,N)
-*          The triangular matrix A.  If UPLO = 'U', the leading N-by-N
-*          upper triangular part of the array A contains the upper
-*          triangular matrix, and the strictly lower triangular part of
-*          A is not referenced.  If UPLO = 'L', the leading N-by-N lower
-*          triangular part of the array A contains the lower triangular
-*          matrix, and the strictly upper triangular part of A is not
-*          referenced.  If DIAG = 'U', the diagonal elements of A are
-*          also not referenced and are assumed to be 1.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input/output) REAL array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, if INFO = 0, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = i, the i-th diagonal element of A is zero,
-*               indicating that the matrix is singular and the solutions
-*               X have not been computed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO, ONE
-      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOUNIT
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           STRSM, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      NOUNIT = LSAME( DIAG, 'N' )
-      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND. .NOT.
-     $         LSAME( TRANS, 'T' ) .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -9
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'STRTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Check for singularity.
-*
-      IF( NOUNIT ) THEN
-         DO 10 INFO = 1, N
-            IF( A( INFO, INFO ).EQ.ZERO )
-     $         RETURN
-   10    CONTINUE
-      END IF
-      INFO = 0
-*
-*     Solve A * x = b  or  A' * x = b.
-*
-      CALL STRSM( 'Left', UPLO, TRANS, DIAG, N, NRHS, ONE, A, LDA, B,
-     $            LDB )
-*
-      RETURN
-*
-*     End of STRTRS
-*
-      END
--- a/libcruft/lapack/stzrzf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,244 +0,0 @@
-      SUBROUTINE STZRZF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      REAL               A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  STZRZF reduces the M-by-N ( M<=N ) real upper trapezoidal matrix A
-*  to upper triangular form by means of orthogonal transformations.
-*
-*  The upper trapezoidal matrix A is factored as
-*
-*     A = ( R  0 ) * Z,
-*
-*  where Z is an N-by-N orthogonal matrix and R is an M-by-M upper
-*  triangular matrix.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= M.
-*
-*  A       (input/output) REAL array, dimension (LDA,N)
-*          On entry, the leading M-by-N upper trapezoidal part of the
-*          array A must contain the matrix to be factorized.
-*          On exit, the leading M-by-M upper triangular part of A
-*          contains the upper triangular matrix R, and elements M+1 to
-*          N of the first M rows of A, with the array TAU, represent the
-*          orthogonal matrix Z as a product of M elementary reflectors.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) REAL array, dimension (M)
-*          The scalar factors of the elementary reflectors.
-*
-*  WORK    (workspace/output) REAL array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,M).
-*          For optimum performance LWORK >= M*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  The factorization is obtained by Householder's method.  The kth
-*  transformation matrix, Z( k ), which is used to introduce zeros into
-*  the ( m - k + 1 )th row of A, is given in the form
-*
-*     Z( k ) = ( I     0   ),
-*              ( 0  T( k ) )
-*
-*  where
-*
-*     T( k ) = I - tau*u( k )*u( k )',   u( k ) = (   1    ),
-*                                                 (   0    )
-*                                                 ( z( k ) )
-*
-*  tau is a scalar and z( k ) is an ( n - m ) element vector.
-*  tau and z( k ) are chosen to annihilate the elements of the kth row
-*  of X.
-*
-*  The scalar tau is returned in the kth element of TAU and the vector
-*  u( k ) in the kth row of A, such that the elements of z( k ) are
-*  in  a( k, m + 1 ), ..., a( k, n ). The elements of R are returned in
-*  the upper triangular part of A.
-*
-*  Z is given by
-*
-*     Z =  Z( 1 ) * Z( 2 ) * ... * Z( m ).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      REAL               ZERO
-      PARAMETER          ( ZERO = 0.0E+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IWS, KI, KK, LDWORK, LWKOPT, M1, MU, NB,
-     $                   NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           SLARZB, SLARZT, SLATRZ, XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.M ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( M.EQ.0 .OR. M.EQ.N ) THEN
-            LWKOPT = 1
-         ELSE
-*
-*           Determine the block size.
-*
-            NB = ILAENV( 1, 'SGERQF', ' ', M, N, -1, -1 )
-            LWKOPT = M*NB
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
-            INFO = -7
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'STZRZF', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 ) THEN
-         RETURN
-      ELSE IF( M.EQ.N ) THEN
-         DO 10 I = 1, N
-            TAU( I ) = ZERO
-   10    CONTINUE
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 1
-      IWS = M
-      IF( NB.GT.1 .AND. NB.LT.M ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'SGERQF', ' ', M, N, -1, -1 ) )
-         IF( NX.LT.M ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = M
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'SGERQF', ' ', M, N, -1,
-     $                 -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.M .AND. NX.LT.M ) THEN
-*
-*        Use blocked code initially.
-*        The last kk rows are handled by the block method.
-*
-         M1 = MIN( M+1, N )
-         KI = ( ( M-NX-1 ) / NB )*NB
-         KK = MIN( M, KI+NB )
-*
-         DO 20 I = M - KK + KI + 1, M - KK + 1, -NB
-            IB = MIN( M-I+1, NB )
-*
-*           Compute the TZ factorization of the current block
-*           A(i:i+ib-1,i:n)
-*
-            CALL SLATRZ( IB, N-I+1, N-M, A( I, I ), LDA, TAU( I ),
-     $                   WORK )
-            IF( I.GT.1 ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i+ib-1) . . . H(i+1) H(i)
-*
-               CALL SLARZT( 'Backward', 'Rowwise', N-M, IB, A( I, M1 ),
-     $                      LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H to A(1:i-1,i:n) from the right
-*
-               CALL SLARZB( 'Right', 'No transpose', 'Backward',
-     $                      'Rowwise', I-1, N-I+1, IB, N-M, A( I, M1 ),
-     $                      LDA, WORK, LDWORK, A( 1, I ), LDA,
-     $                      WORK( IB+1 ), LDWORK )
-            END IF
-   20    CONTINUE
-         MU = I + NB - 1
-      ELSE
-         MU = M
-      END IF
-*
-*     Use unblocked code to factor the last or only block
-*
-      IF( MU.GT.0 )
-     $   CALL SLATRZ( MU, N, N-M, A, LDA, TAU, WORK )
-*
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of STZRZF
-*
-      END
--- a/libcruft/lapack/zbdsqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,742 +0,0 @@
-      SUBROUTINE ZBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
-     $                   LDU, C, LDC, RWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * ), E( * ), RWORK( * )
-      COMPLEX*16         C( LDC, * ), U( LDU, * ), VT( LDVT, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZBDSQR computes the singular values and, optionally, the right and/or
-*  left singular vectors from the singular value decomposition (SVD) of
-*  a real N-by-N (upper or lower) bidiagonal matrix B using the implicit
-*  zero-shift QR algorithm.  The SVD of B has the form
-* 
-*     B = Q * S * P**H
-* 
-*  where S is the diagonal matrix of singular values, Q is an orthogonal
-*  matrix of left singular vectors, and P is an orthogonal matrix of
-*  right singular vectors.  If left singular vectors are requested, this
-*  subroutine actually returns U*Q instead of Q, and, if right singular
-*  vectors are requested, this subroutine returns P**H*VT instead of
-*  P**H, for given complex input matrices U and VT.  When U and VT are
-*  the unitary matrices that reduce a general matrix A to bidiagonal
-*  form: A = U*B*VT, as computed by ZGEBRD, then
-* 
-*     A = (U*Q) * S * (P**H*VT)
-* 
-*  is the SVD of A.  Optionally, the subroutine may also compute Q**H*C
-*  for a given complex input matrix C.
-*
-*  See "Computing  Small Singular Values of Bidiagonal Matrices With
-*  Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan,
-*  LAPACK Working Note #3 (or SIAM J. Sci. Statist. Comput. vol. 11,
-*  no. 5, pp. 873-912, Sept 1990) and
-*  "Accurate singular values and differential qd algorithms," by
-*  B. Parlett and V. Fernando, Technical Report CPAM-554, Mathematics
-*  Department, University of California at Berkeley, July 1992
-*  for a detailed description of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  B is upper bidiagonal;
-*          = 'L':  B is lower bidiagonal.
-*
-*  N       (input) INTEGER
-*          The order of the matrix B.  N >= 0.
-*
-*  NCVT    (input) INTEGER
-*          The number of columns of the matrix VT. NCVT >= 0.
-*
-*  NRU     (input) INTEGER
-*          The number of rows of the matrix U. NRU >= 0.
-*
-*  NCC     (input) INTEGER
-*          The number of columns of the matrix C. NCC >= 0.
-*
-*  D       (input/output) DOUBLE PRECISION array, dimension (N)
-*          On entry, the n diagonal elements of the bidiagonal matrix B.
-*          On exit, if INFO=0, the singular values of B in decreasing
-*          order.
-*
-*  E       (input/output) DOUBLE PRECISION array, dimension (N-1)
-*          On entry, the N-1 offdiagonal elements of the bidiagonal
-*          matrix B.
-*          On exit, if INFO = 0, E is destroyed; if INFO > 0, D and E
-*          will contain the diagonal and superdiagonal elements of a
-*          bidiagonal matrix orthogonally equivalent to the one given
-*          as input.
-*
-*  VT      (input/output) COMPLEX*16 array, dimension (LDVT, NCVT)
-*          On entry, an N-by-NCVT matrix VT.
-*          On exit, VT is overwritten by P**H * VT.
-*          Not referenced if NCVT = 0.
-*
-*  LDVT    (input) INTEGER
-*          The leading dimension of the array VT.
-*          LDVT >= max(1,N) if NCVT > 0; LDVT >= 1 if NCVT = 0.
-*
-*  U       (input/output) COMPLEX*16 array, dimension (LDU, N)
-*          On entry, an NRU-by-N matrix U.
-*          On exit, U is overwritten by U * Q.
-*          Not referenced if NRU = 0.
-*
-*  LDU     (input) INTEGER
-*          The leading dimension of the array U.  LDU >= max(1,NRU).
-*
-*  C       (input/output) COMPLEX*16 array, dimension (LDC, NCC)
-*          On entry, an N-by-NCC matrix C.
-*          On exit, C is overwritten by Q**H * C.
-*          Not referenced if NCC = 0.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C.
-*          LDC >= max(1,N) if NCC > 0; LDC >=1 if NCC = 0.
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (2*N)
-*          if NCVT = NRU = NCC = 0, (max(1, 4*N-4)) otherwise
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  If INFO = -i, the i-th argument had an illegal value
-*          > 0:  the algorithm did not converge; D and E contain the
-*                elements of a bidiagonal matrix which is orthogonally
-*                similar to the input matrix B;  if INFO = i, i
-*                elements of E have not converged to zero.
-*
-*  Internal Parameters
-*  ===================
-*
-*  TOLMUL  DOUBLE PRECISION, default = max(10,min(100,EPS**(-1/8)))
-*          TOLMUL controls the convergence criterion of the QR loop.
-*          If it is positive, TOLMUL*EPS is the desired relative
-*             precision in the computed singular values.
-*          If it is negative, abs(TOLMUL*EPS*sigma_max) is the
-*             desired absolute accuracy in the computed singular
-*             values (corresponds to relative accuracy
-*             abs(TOLMUL*EPS) in the largest singular value.
-*          abs(TOLMUL) should be between 1 and 1/EPS, and preferably
-*             between 10 (for fast convergence) and .1/EPS
-*             (for there to be some accuracy in the results).
-*          Default is to lose at either one eighth or 2 of the
-*             available decimal digits in each computed singular value
-*             (whichever is smaller).
-*
-*  MAXITR  INTEGER, default = 6
-*          MAXITR controls the maximum number of passes of the
-*          algorithm through its inner loop. The algorithms stops
-*          (and so fails to converge) if the number of passes
-*          through the inner loop exceeds MAXITR*N**2.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D0 )
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D0 )
-      DOUBLE PRECISION   NEGONE
-      PARAMETER          ( NEGONE = -1.0D0 )
-      DOUBLE PRECISION   HNDRTH
-      PARAMETER          ( HNDRTH = 0.01D0 )
-      DOUBLE PRECISION   TEN
-      PARAMETER          ( TEN = 10.0D0 )
-      DOUBLE PRECISION   HNDRD
-      PARAMETER          ( HNDRD = 100.0D0 )
-      DOUBLE PRECISION   MEIGTH
-      PARAMETER          ( MEIGTH = -0.125D0 )
-      INTEGER            MAXITR
-      PARAMETER          ( MAXITR = 6 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LOWER, ROTATE
-      INTEGER            I, IDIR, ISUB, ITER, J, LL, LLL, M, MAXIT, NM1,
-     $                   NM12, NM13, OLDLL, OLDM
-      DOUBLE PRECISION   ABSE, ABSS, COSL, COSR, CS, EPS, F, G, H, MU,
-     $                   OLDCS, OLDSN, R, SHIFT, SIGMN, SIGMX, SINL,
-     $                   SINR, SLL, SMAX, SMIN, SMINL, SMINOA,
-     $                   SN, THRESH, TOL, TOLMUL, UNFL
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           LSAME, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLARTG, DLAS2, DLASQ1, DLASV2, XERBLA, ZDROT,
-     $                   ZDSCAL, ZLASR, ZSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, MAX, MIN, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      LOWER = LSAME( UPLO, 'L' )
-      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LOWER ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NCVT.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( NRU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( NCC.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( ( NCVT.EQ.0 .AND. LDVT.LT.1 ) .OR.
-     $         ( NCVT.GT.0 .AND. LDVT.LT.MAX( 1, N ) ) ) THEN
-         INFO = -9
-      ELSE IF( LDU.LT.MAX( 1, NRU ) ) THEN
-         INFO = -11
-      ELSE IF( ( NCC.EQ.0 .AND. LDC.LT.1 ) .OR.
-     $         ( NCC.GT.0 .AND. LDC.LT.MAX( 1, N ) ) ) THEN
-         INFO = -13
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZBDSQR', -INFO )
-         RETURN
-      END IF
-      IF( N.EQ.0 )
-     $   RETURN
-      IF( N.EQ.1 )
-     $   GO TO 160
-*
-*     ROTATE is true if any singular vectors desired, false otherwise
-*
-      ROTATE = ( NCVT.GT.0 ) .OR. ( NRU.GT.0 ) .OR. ( NCC.GT.0 )
-*
-*     If no singular vectors desired, use qd algorithm
-*
-      IF( .NOT.ROTATE ) THEN
-         CALL DLASQ1( N, D, E, RWORK, INFO )
-         RETURN
-      END IF
-*
-      NM1 = N - 1
-      NM12 = NM1 + NM1
-      NM13 = NM12 + NM1
-      IDIR = 0
-*
-*     Get machine constants
-*
-      EPS = DLAMCH( 'Epsilon' )
-      UNFL = DLAMCH( 'Safe minimum' )
-*
-*     If matrix lower bidiagonal, rotate to be upper bidiagonal
-*     by applying Givens rotations on the left
-*
-      IF( LOWER ) THEN
-         DO 10 I = 1, N - 1
-            CALL DLARTG( D( I ), E( I ), CS, SN, R )
-            D( I ) = R
-            E( I ) = SN*D( I+1 )
-            D( I+1 ) = CS*D( I+1 )
-            RWORK( I ) = CS
-            RWORK( NM1+I ) = SN
-   10    CONTINUE
-*
-*        Update singular vectors if desired
-*
-         IF( NRU.GT.0 )
-     $      CALL ZLASR( 'R', 'V', 'F', NRU, N, RWORK( 1 ), RWORK( N ),
-     $                  U, LDU )
-         IF( NCC.GT.0 )
-     $      CALL ZLASR( 'L', 'V', 'F', N, NCC, RWORK( 1 ), RWORK( N ),
-     $                  C, LDC )
-      END IF
-*
-*     Compute singular values to relative accuracy TOL
-*     (By setting TOL to be negative, algorithm will compute
-*     singular values to absolute accuracy ABS(TOL)*norm(input matrix))
-*
-      TOLMUL = MAX( TEN, MIN( HNDRD, EPS**MEIGTH ) )
-      TOL = TOLMUL*EPS
-*
-*     Compute approximate maximum, minimum singular values
-*
-      SMAX = ZERO
-      DO 20 I = 1, N
-         SMAX = MAX( SMAX, ABS( D( I ) ) )
-   20 CONTINUE
-      DO 30 I = 1, N - 1
-         SMAX = MAX( SMAX, ABS( E( I ) ) )
-   30 CONTINUE
-      SMINL = ZERO
-      IF( TOL.GE.ZERO ) THEN
-*
-*        Relative accuracy desired
-*
-         SMINOA = ABS( D( 1 ) )
-         IF( SMINOA.EQ.ZERO )
-     $      GO TO 50
-         MU = SMINOA
-         DO 40 I = 2, N
-            MU = ABS( D( I ) )*( MU / ( MU+ABS( E( I-1 ) ) ) )
-            SMINOA = MIN( SMINOA, MU )
-            IF( SMINOA.EQ.ZERO )
-     $         GO TO 50
-   40    CONTINUE
-   50    CONTINUE
-         SMINOA = SMINOA / SQRT( DBLE( N ) )
-         THRESH = MAX( TOL*SMINOA, MAXITR*N*N*UNFL )
-      ELSE
-*
-*        Absolute accuracy desired
-*
-         THRESH = MAX( ABS( TOL )*SMAX, MAXITR*N*N*UNFL )
-      END IF
-*
-*     Prepare for main iteration loop for the singular values
-*     (MAXIT is the maximum number of passes through the inner
-*     loop permitted before nonconvergence signalled.)
-*
-      MAXIT = MAXITR*N*N
-      ITER = 0
-      OLDLL = -1
-      OLDM = -1
-*
-*     M points to last element of unconverged part of matrix
-*
-      M = N
-*
-*     Begin main iteration loop
-*
-   60 CONTINUE
-*
-*     Check for convergence or exceeding iteration count
-*
-      IF( M.LE.1 )
-     $   GO TO 160
-      IF( ITER.GT.MAXIT )
-     $   GO TO 200
-*
-*     Find diagonal block of matrix to work on
-*
-      IF( TOL.LT.ZERO .AND. ABS( D( M ) ).LE.THRESH )
-     $   D( M ) = ZERO
-      SMAX = ABS( D( M ) )
-      SMIN = SMAX
-      DO 70 LLL = 1, M - 1
-         LL = M - LLL
-         ABSS = ABS( D( LL ) )
-         ABSE = ABS( E( LL ) )
-         IF( TOL.LT.ZERO .AND. ABSS.LE.THRESH )
-     $      D( LL ) = ZERO
-         IF( ABSE.LE.THRESH )
-     $      GO TO 80
-         SMIN = MIN( SMIN, ABSS )
-         SMAX = MAX( SMAX, ABSS, ABSE )
-   70 CONTINUE
-      LL = 0
-      GO TO 90
-   80 CONTINUE
-      E( LL ) = ZERO
-*
-*     Matrix splits since E(LL) = 0
-*
-      IF( LL.EQ.M-1 ) THEN
-*
-*        Convergence of bottom singular value, return to top of loop
-*
-         M = M - 1
-         GO TO 60
-      END IF
-   90 CONTINUE
-      LL = LL + 1
-*
-*     E(LL) through E(M-1) are nonzero, E(LL-1) is zero
-*
-      IF( LL.EQ.M-1 ) THEN
-*
-*        2 by 2 block, handle separately
-*
-         CALL DLASV2( D( M-1 ), E( M-1 ), D( M ), SIGMN, SIGMX, SINR,
-     $                COSR, SINL, COSL )
-         D( M-1 ) = SIGMX
-         E( M-1 ) = ZERO
-         D( M ) = SIGMN
-*
-*        Compute singular vectors, if desired
-*
-         IF( NCVT.GT.0 )
-     $      CALL ZDROT( NCVT, VT( M-1, 1 ), LDVT, VT( M, 1 ), LDVT,
-     $                  COSR, SINR )
-         IF( NRU.GT.0 )
-     $      CALL ZDROT( NRU, U( 1, M-1 ), 1, U( 1, M ), 1, COSL, SINL )
-         IF( NCC.GT.0 )
-     $      CALL ZDROT( NCC, C( M-1, 1 ), LDC, C( M, 1 ), LDC, COSL,
-     $                  SINL )
-         M = M - 2
-         GO TO 60
-      END IF
-*
-*     If working on new submatrix, choose shift direction
-*     (from larger end diagonal element towards smaller)
-*
-      IF( LL.GT.OLDM .OR. M.LT.OLDLL ) THEN
-         IF( ABS( D( LL ) ).GE.ABS( D( M ) ) ) THEN
-*
-*           Chase bulge from top (big end) to bottom (small end)
-*
-            IDIR = 1
-         ELSE
-*
-*           Chase bulge from bottom (big end) to top (small end)
-*
-            IDIR = 2
-         END IF
-      END IF
-*
-*     Apply convergence tests
-*
-      IF( IDIR.EQ.1 ) THEN
-*
-*        Run convergence test in forward direction
-*        First apply standard test to bottom of matrix
-*
-         IF( ABS( E( M-1 ) ).LE.ABS( TOL )*ABS( D( M ) ) .OR.
-     $       ( TOL.LT.ZERO .AND. ABS( E( M-1 ) ).LE.THRESH ) ) THEN
-            E( M-1 ) = ZERO
-            GO TO 60
-         END IF
-*
-         IF( TOL.GE.ZERO ) THEN
-*
-*           If relative accuracy desired,
-*           apply convergence criterion forward
-*
-            MU = ABS( D( LL ) )
-            SMINL = MU
-            DO 100 LLL = LL, M - 1
-               IF( ABS( E( LLL ) ).LE.TOL*MU ) THEN
-                  E( LLL ) = ZERO
-                  GO TO 60
-               END IF
-               MU = ABS( D( LLL+1 ) )*( MU / ( MU+ABS( E( LLL ) ) ) )
-               SMINL = MIN( SMINL, MU )
-  100       CONTINUE
-         END IF
-*
-      ELSE
-*
-*        Run convergence test in backward direction
-*        First apply standard test to top of matrix
-*
-         IF( ABS( E( LL ) ).LE.ABS( TOL )*ABS( D( LL ) ) .OR.
-     $       ( TOL.LT.ZERO .AND. ABS( E( LL ) ).LE.THRESH ) ) THEN
-            E( LL ) = ZERO
-            GO TO 60
-         END IF
-*
-         IF( TOL.GE.ZERO ) THEN
-*
-*           If relative accuracy desired,
-*           apply convergence criterion backward
-*
-            MU = ABS( D( M ) )
-            SMINL = MU
-            DO 110 LLL = M - 1, LL, -1
-               IF( ABS( E( LLL ) ).LE.TOL*MU ) THEN
-                  E( LLL ) = ZERO
-                  GO TO 60
-               END IF
-               MU = ABS( D( LLL ) )*( MU / ( MU+ABS( E( LLL ) ) ) )
-               SMINL = MIN( SMINL, MU )
-  110       CONTINUE
-         END IF
-      END IF
-      OLDLL = LL
-      OLDM = M
-*
-*     Compute shift.  First, test if shifting would ruin relative
-*     accuracy, and if so set the shift to zero.
-*
-      IF( TOL.GE.ZERO .AND. N*TOL*( SMINL / SMAX ).LE.
-     $    MAX( EPS, HNDRTH*TOL ) ) THEN
-*
-*        Use a zero shift to avoid loss of relative accuracy
-*
-         SHIFT = ZERO
-      ELSE
-*
-*        Compute the shift from 2-by-2 block at end of matrix
-*
-         IF( IDIR.EQ.1 ) THEN
-            SLL = ABS( D( LL ) )
-            CALL DLAS2( D( M-1 ), E( M-1 ), D( M ), SHIFT, R )
-         ELSE
-            SLL = ABS( D( M ) )
-            CALL DLAS2( D( LL ), E( LL ), D( LL+1 ), SHIFT, R )
-         END IF
-*
-*        Test if shift negligible, and if so set to zero
-*
-         IF( SLL.GT.ZERO ) THEN
-            IF( ( SHIFT / SLL )**2.LT.EPS )
-     $         SHIFT = ZERO
-         END IF
-      END IF
-*
-*     Increment iteration count
-*
-      ITER = ITER + M - LL
-*
-*     If SHIFT = 0, do simplified QR iteration
-*
-      IF( SHIFT.EQ.ZERO ) THEN
-         IF( IDIR.EQ.1 ) THEN
-*
-*           Chase bulge from top to bottom
-*           Save cosines and sines for later singular vector updates
-*
-            CS = ONE
-            OLDCS = ONE
-            DO 120 I = LL, M - 1
-               CALL DLARTG( D( I )*CS, E( I ), CS, SN, R )
-               IF( I.GT.LL )
-     $            E( I-1 ) = OLDSN*R
-               CALL DLARTG( OLDCS*R, D( I+1 )*SN, OLDCS, OLDSN, D( I ) )
-               RWORK( I-LL+1 ) = CS
-               RWORK( I-LL+1+NM1 ) = SN
-               RWORK( I-LL+1+NM12 ) = OLDCS
-               RWORK( I-LL+1+NM13 ) = OLDSN
-  120       CONTINUE
-            H = D( M )*CS
-            D( M ) = H*OLDCS
-            E( M-1 ) = H*OLDSN
-*
-*           Update singular vectors
-*
-            IF( NCVT.GT.0 )
-     $         CALL ZLASR( 'L', 'V', 'F', M-LL+1, NCVT, RWORK( 1 ),
-     $                     RWORK( N ), VT( LL, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL ZLASR( 'R', 'V', 'F', NRU, M-LL+1, RWORK( NM12+1 ),
-     $                     RWORK( NM13+1 ), U( 1, LL ), LDU )
-            IF( NCC.GT.0 )
-     $         CALL ZLASR( 'L', 'V', 'F', M-LL+1, NCC, RWORK( NM12+1 ),
-     $                     RWORK( NM13+1 ), C( LL, 1 ), LDC )
-*
-*           Test convergence
-*
-            IF( ABS( E( M-1 ) ).LE.THRESH )
-     $         E( M-1 ) = ZERO
-*
-         ELSE
-*
-*           Chase bulge from bottom to top
-*           Save cosines and sines for later singular vector updates
-*
-            CS = ONE
-            OLDCS = ONE
-            DO 130 I = M, LL + 1, -1
-               CALL DLARTG( D( I )*CS, E( I-1 ), CS, SN, R )
-               IF( I.LT.M )
-     $            E( I ) = OLDSN*R
-               CALL DLARTG( OLDCS*R, D( I-1 )*SN, OLDCS, OLDSN, D( I ) )
-               RWORK( I-LL ) = CS
-               RWORK( I-LL+NM1 ) = -SN
-               RWORK( I-LL+NM12 ) = OLDCS
-               RWORK( I-LL+NM13 ) = -OLDSN
-  130       CONTINUE
-            H = D( LL )*CS
-            D( LL ) = H*OLDCS
-            E( LL ) = H*OLDSN
-*
-*           Update singular vectors
-*
-            IF( NCVT.GT.0 )
-     $         CALL ZLASR( 'L', 'V', 'B', M-LL+1, NCVT, RWORK( NM12+1 ),
-     $                     RWORK( NM13+1 ), VT( LL, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL ZLASR( 'R', 'V', 'B', NRU, M-LL+1, RWORK( 1 ),
-     $                     RWORK( N ), U( 1, LL ), LDU )
-            IF( NCC.GT.0 )
-     $         CALL ZLASR( 'L', 'V', 'B', M-LL+1, NCC, RWORK( 1 ),
-     $                     RWORK( N ), C( LL, 1 ), LDC )
-*
-*           Test convergence
-*
-            IF( ABS( E( LL ) ).LE.THRESH )
-     $         E( LL ) = ZERO
-         END IF
-      ELSE
-*
-*        Use nonzero shift
-*
-         IF( IDIR.EQ.1 ) THEN
-*
-*           Chase bulge from top to bottom
-*           Save cosines and sines for later singular vector updates
-*
-            F = ( ABS( D( LL ) )-SHIFT )*
-     $          ( SIGN( ONE, D( LL ) )+SHIFT / D( LL ) )
-            G = E( LL )
-            DO 140 I = LL, M - 1
-               CALL DLARTG( F, G, COSR, SINR, R )
-               IF( I.GT.LL )
-     $            E( I-1 ) = R
-               F = COSR*D( I ) + SINR*E( I )
-               E( I ) = COSR*E( I ) - SINR*D( I )
-               G = SINR*D( I+1 )
-               D( I+1 ) = COSR*D( I+1 )
-               CALL DLARTG( F, G, COSL, SINL, R )
-               D( I ) = R
-               F = COSL*E( I ) + SINL*D( I+1 )
-               D( I+1 ) = COSL*D( I+1 ) - SINL*E( I )
-               IF( I.LT.M-1 ) THEN
-                  G = SINL*E( I+1 )
-                  E( I+1 ) = COSL*E( I+1 )
-               END IF
-               RWORK( I-LL+1 ) = COSR
-               RWORK( I-LL+1+NM1 ) = SINR
-               RWORK( I-LL+1+NM12 ) = COSL
-               RWORK( I-LL+1+NM13 ) = SINL
-  140       CONTINUE
-            E( M-1 ) = F
-*
-*           Update singular vectors
-*
-            IF( NCVT.GT.0 )
-     $         CALL ZLASR( 'L', 'V', 'F', M-LL+1, NCVT, RWORK( 1 ),
-     $                     RWORK( N ), VT( LL, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL ZLASR( 'R', 'V', 'F', NRU, M-LL+1, RWORK( NM12+1 ),
-     $                     RWORK( NM13+1 ), U( 1, LL ), LDU )
-            IF( NCC.GT.0 )
-     $         CALL ZLASR( 'L', 'V', 'F', M-LL+1, NCC, RWORK( NM12+1 ),
-     $                     RWORK( NM13+1 ), C( LL, 1 ), LDC )
-*
-*           Test convergence
-*
-            IF( ABS( E( M-1 ) ).LE.THRESH )
-     $         E( M-1 ) = ZERO
-*
-         ELSE
-*
-*           Chase bulge from bottom to top
-*           Save cosines and sines for later singular vector updates
-*
-            F = ( ABS( D( M ) )-SHIFT )*( SIGN( ONE, D( M ) )+SHIFT /
-     $          D( M ) )
-            G = E( M-1 )
-            DO 150 I = M, LL + 1, -1
-               CALL DLARTG( F, G, COSR, SINR, R )
-               IF( I.LT.M )
-     $            E( I ) = R
-               F = COSR*D( I ) + SINR*E( I-1 )
-               E( I-1 ) = COSR*E( I-1 ) - SINR*D( I )
-               G = SINR*D( I-1 )
-               D( I-1 ) = COSR*D( I-1 )
-               CALL DLARTG( F, G, COSL, SINL, R )
-               D( I ) = R
-               F = COSL*E( I-1 ) + SINL*D( I-1 )
-               D( I-1 ) = COSL*D( I-1 ) - SINL*E( I-1 )
-               IF( I.GT.LL+1 ) THEN
-                  G = SINL*E( I-2 )
-                  E( I-2 ) = COSL*E( I-2 )
-               END IF
-               RWORK( I-LL ) = COSR
-               RWORK( I-LL+NM1 ) = -SINR
-               RWORK( I-LL+NM12 ) = COSL
-               RWORK( I-LL+NM13 ) = -SINL
-  150       CONTINUE
-            E( LL ) = F
-*
-*           Test convergence
-*
-            IF( ABS( E( LL ) ).LE.THRESH )
-     $         E( LL ) = ZERO
-*
-*           Update singular vectors if desired
-*
-            IF( NCVT.GT.0 )
-     $         CALL ZLASR( 'L', 'V', 'B', M-LL+1, NCVT, RWORK( NM12+1 ),
-     $                     RWORK( NM13+1 ), VT( LL, 1 ), LDVT )
-            IF( NRU.GT.0 )
-     $         CALL ZLASR( 'R', 'V', 'B', NRU, M-LL+1, RWORK( 1 ),
-     $                     RWORK( N ), U( 1, LL ), LDU )
-            IF( NCC.GT.0 )
-     $         CALL ZLASR( 'L', 'V', 'B', M-LL+1, NCC, RWORK( 1 ),
-     $                     RWORK( N ), C( LL, 1 ), LDC )
-         END IF
-      END IF
-*
-*     QR iteration finished, go back and check convergence
-*
-      GO TO 60
-*
-*     All singular values converged, so make them positive
-*
-  160 CONTINUE
-      DO 170 I = 1, N
-         IF( D( I ).LT.ZERO ) THEN
-            D( I ) = -D( I )
-*
-*           Change sign of singular vectors, if desired
-*
-            IF( NCVT.GT.0 )
-     $         CALL ZDSCAL( NCVT, NEGONE, VT( I, 1 ), LDVT )
-         END IF
-  170 CONTINUE
-*
-*     Sort the singular values into decreasing order (insertion sort on
-*     singular values, but only one transposition per singular vector)
-*
-      DO 190 I = 1, N - 1
-*
-*        Scan for smallest D(I)
-*
-         ISUB = 1
-         SMIN = D( 1 )
-         DO 180 J = 2, N + 1 - I
-            IF( D( J ).LE.SMIN ) THEN
-               ISUB = J
-               SMIN = D( J )
-            END IF
-  180    CONTINUE
-         IF( ISUB.NE.N+1-I ) THEN
-*
-*           Swap singular values and vectors
-*
-            D( ISUB ) = D( N+1-I )
-            D( N+1-I ) = SMIN
-            IF( NCVT.GT.0 )
-     $         CALL ZSWAP( NCVT, VT( ISUB, 1 ), LDVT, VT( N+1-I, 1 ),
-     $                     LDVT )
-            IF( NRU.GT.0 )
-     $         CALL ZSWAP( NRU, U( 1, ISUB ), 1, U( 1, N+1-I ), 1 )
-            IF( NCC.GT.0 )
-     $         CALL ZSWAP( NCC, C( ISUB, 1 ), LDC, C( N+1-I, 1 ), LDC )
-         END IF
-  190 CONTINUE
-      GO TO 220
-*
-*     Maximum number of iterations exceeded, failure to converge
-*
-  200 CONTINUE
-      INFO = 0
-      DO 210 I = 1, N - 1
-         IF( E( I ).NE.ZERO )
-     $      INFO = INFO + 1
-  210 CONTINUE
-  220 CONTINUE
-      RETURN
-*
-*     End of ZBDSQR
-*
-      END
--- a/libcruft/lapack/zdrscl.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-      SUBROUTINE ZDRSCL( N, SA, SX, INCX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-      DOUBLE PRECISION   SA
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         SX( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZDRSCL multiplies an n-element complex vector x by the real scalar
-*  1/a.  This is done without overflow or underflow as long as
-*  the final result x/a does not overflow or underflow.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of components of the vector x.
-*
-*  SA      (input) DOUBLE PRECISION
-*          The scalar a which is used to divide each component of x.
-*          SA must be >= 0, or the subroutine will divide by zero.
-*
-*  SX      (input/output) COMPLEX*16 array, dimension
-*                         (1+(N-1)*abs(INCX))
-*          The n-element vector x.
-*
-*  INCX    (input) INTEGER
-*          The increment between successive values of the vector SX.
-*          > 0:  SX(1) = X(1) and SX(1+(i-1)*INCX) = x(i),     1< i<= n
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            DONE
-      DOUBLE PRECISION   BIGNUM, CDEN, CDEN1, CNUM, CNUM1, MUL, SMLNUM
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLABAD, ZDSCAL
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-*     Get machine parameters
-*
-      SMLNUM = DLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-*
-*     Initialize the denominator to SA and the numerator to 1.
-*
-      CDEN = SA
-      CNUM = ONE
-*
-   10 CONTINUE
-      CDEN1 = CDEN*SMLNUM
-      CNUM1 = CNUM / BIGNUM
-      IF( ABS( CDEN1 ).GT.ABS( CNUM ) .AND. CNUM.NE.ZERO ) THEN
-*
-*        Pre-multiply X by SMLNUM if CDEN is large compared to CNUM.
-*
-         MUL = SMLNUM
-         DONE = .FALSE.
-         CDEN = CDEN1
-      ELSE IF( ABS( CNUM1 ).GT.ABS( CDEN ) ) THEN
-*
-*        Pre-multiply X by BIGNUM if CDEN is small compared to CNUM.
-*
-         MUL = BIGNUM
-         DONE = .FALSE.
-         CNUM = CNUM1
-      ELSE
-*
-*        Multiply X by CNUM / CDEN and return.
-*
-         MUL = CNUM / CDEN
-         DONE = .TRUE.
-      END IF
-*
-*     Scale the vector X by MUL
-*
-      CALL ZDSCAL( N, MUL, SX, INCX )
-*
-      IF( .NOT.DONE )
-     $   GO TO 10
-*
-      RETURN
-*
-*     End of ZDRSCL
-*
-      END
--- a/libcruft/lapack/zgbcon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,234 +0,0 @@
-      SUBROUTINE ZGBCON( NORM, N, KL, KU, AB, LDAB, IPIV, ANORM, RCOND,
-     $                   WORK, RWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call ZLACN2 in place of ZLACON, 10 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            INFO, KL, KU, LDAB, N
-      DOUBLE PRECISION   ANORM, RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      DOUBLE PRECISION   RWORK( * )
-      COMPLEX*16         AB( LDAB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGBCON estimates the reciprocal of the condition number of a complex
-*  general band matrix A, in either the 1-norm or the infinity-norm,
-*  using the LU factorization computed by ZGBTRF.
-*
-*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
-*  condition number is computed as
-*     RCOND = 1 / ( norm(A) * norm(inv(A)) ).
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies whether the 1-norm condition number or the
-*          infinity-norm condition number is required:
-*          = '1' or 'O':  1-norm;
-*          = 'I':         Infinity-norm.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KL      (input) INTEGER
-*          The number of subdiagonals within the band of A.  KL >= 0.
-*
-*  KU      (input) INTEGER
-*          The number of superdiagonals within the band of A.  KU >= 0.
-*
-*  AB      (input) COMPLEX*16 array, dimension (LDAB,N)
-*          Details of the LU factorization of the band matrix A, as
-*          computed by ZGBTRF.  U is stored as an upper triangular band
-*          matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and
-*          the multipliers used during the factorization are stored in
-*          rows KL+KU+2 to 2*KL+KU+1.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= N, row i of the matrix was
-*          interchanged with row IPIV(i).
-*
-*  ANORM   (input) DOUBLE PRECISION
-*          If NORM = '1' or 'O', the 1-norm of the original matrix A.
-*          If NORM = 'I', the infinity-norm of the original matrix A.
-*
-*  RCOND   (output) DOUBLE PRECISION
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(norm(A) * norm(inv(A))).
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (2*N)
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LNOTI, ONENRM
-      CHARACTER          NORMIN
-      INTEGER            IX, J, JP, KASE, KASE1, KD, LM
-      DOUBLE PRECISION   AINVNM, SCALE, SMLNUM
-      COMPLEX*16         T, ZDUM
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IZAMAX
-      DOUBLE PRECISION   DLAMCH
-      COMPLEX*16         ZDOTC
-      EXTERNAL           LSAME, IZAMAX, DLAMCH, ZDOTC
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZAXPY, ZDRSCL, ZLACN2, ZLATBS
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DIMAG, MIN
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' )
-      IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KL.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( KU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDAB.LT.2*KL+KU+1 ) THEN
-         INFO = -6
-      ELSE IF( ANORM.LT.ZERO ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGBCON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      RCOND = ZERO
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      ELSE IF( ANORM.EQ.ZERO ) THEN
-         RETURN
-      END IF
-*
-      SMLNUM = DLAMCH( 'Safe minimum' )
-*
-*     Estimate the norm of inv(A).
-*
-      AINVNM = ZERO
-      NORMIN = 'N'
-      IF( ONENRM ) THEN
-         KASE1 = 1
-      ELSE
-         KASE1 = 2
-      END IF
-      KD = KL + KU + 1
-      LNOTI = KL.GT.0
-      KASE = 0
-   10 CONTINUE
-      CALL ZLACN2( N, WORK( N+1 ), WORK, AINVNM, KASE, ISAVE )
-      IF( KASE.NE.0 ) THEN
-         IF( KASE.EQ.KASE1 ) THEN
-*
-*           Multiply by inv(L).
-*
-            IF( LNOTI ) THEN
-               DO 20 J = 1, N - 1
-                  LM = MIN( KL, N-J )
-                  JP = IPIV( J )
-                  T = WORK( JP )
-                  IF( JP.NE.J ) THEN
-                     WORK( JP ) = WORK( J )
-                     WORK( J ) = T
-                  END IF
-                  CALL ZAXPY( LM, -T, AB( KD+1, J ), 1, WORK( J+1 ), 1 )
-   20          CONTINUE
-            END IF
-*
-*           Multiply by inv(U).
-*
-            CALL ZLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   KL+KU, AB, LDAB, WORK, SCALE, RWORK, INFO )
-         ELSE
-*
-*           Multiply by inv(U').
-*
-            CALL ZLATBS( 'Upper', 'Conjugate transpose', 'Non-unit',
-     $                   NORMIN, N, KL+KU, AB, LDAB, WORK, SCALE, RWORK,
-     $                   INFO )
-*
-*           Multiply by inv(L').
-*
-            IF( LNOTI ) THEN
-               DO 30 J = N - 1, 1, -1
-                  LM = MIN( KL, N-J )
-                  WORK( J ) = WORK( J ) - ZDOTC( LM, AB( KD+1, J ), 1,
-     $                        WORK( J+1 ), 1 )
-                  JP = IPIV( J )
-                  IF( JP.NE.J ) THEN
-                     T = WORK( JP )
-                     WORK( JP ) = WORK( J )
-                     WORK( J ) = T
-                  END IF
-   30          CONTINUE
-            END IF
-         END IF
-*
-*        Divide X by 1/SCALE if doing so will not cause overflow.
-*
-         NORMIN = 'Y'
-         IF( SCALE.NE.ONE ) THEN
-            IX = IZAMAX( N, WORK, 1 )
-            IF( SCALE.LT.CABS1( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
-     $         GO TO 40
-            CALL ZDRSCL( N, SCALE, WORK, 1 )
-         END IF
-         GO TO 10
-      END IF
-*
-*     Compute the estimate of the reciprocal condition number.
-*
-      IF( AINVNM.NE.ZERO )
-     $   RCOND = ( ONE / AINVNM ) / ANORM
-*
-   40 CONTINUE
-      RETURN
-*
-*     End of ZGBCON
-*
-      END
--- a/libcruft/lapack/zgbtf2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,202 +0,0 @@
-      SUBROUTINE ZGBTF2( M, N, KL, KU, AB, LDAB, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, KL, KU, LDAB, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX*16         AB( LDAB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGBTF2 computes an LU factorization of a complex m-by-n band matrix
-*  A using partial pivoting with row interchanges.
-*
-*  This is the unblocked version of the algorithm, calling Level 2 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  KL      (input) INTEGER
-*          The number of subdiagonals within the band of A.  KL >= 0.
-*
-*  KU      (input) INTEGER
-*          The number of superdiagonals within the band of A.  KU >= 0.
-*
-*  AB      (input/output) COMPLEX*16 array, dimension (LDAB,N)
-*          On entry, the matrix A in band storage, in rows KL+1 to
-*          2*KL+KU+1; rows 1 to KL of the array need not be set.
-*          The j-th column of A is stored in the j-th column of the
-*          array AB as follows:
-*          AB(kl+ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl)
-*
-*          On exit, details of the factorization: U is stored as an
-*          upper triangular band matrix with KL+KU superdiagonals in
-*          rows 1 to KL+KU+1, and the multipliers used during the
-*          factorization are stored in rows KL+KU+2 to 2*KL+KU+1.
-*          See below for further details.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
-*
-*  IPIV    (output) INTEGER array, dimension (min(M,N))
-*          The pivot indices; for 1 <= i <= min(M,N), row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = +i, U(i,i) is exactly zero. The factorization
-*               has been completed, but the factor U is exactly
-*               singular, and division by zero will occur if it is used
-*               to solve a system of equations.
-*
-*  Further Details
-*  ===============
-*
-*  The band storage scheme is illustrated by the following example, when
-*  M = N = 6, KL = 2, KU = 1:
-*
-*  On entry:                       On exit:
-*
-*      *    *    *    +    +    +       *    *    *   u14  u25  u36
-*      *    *    +    +    +    +       *    *   u13  u24  u35  u46
-*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
-*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
-*     a21  a32  a43  a54  a65   *      m21  m32  m43  m54  m65   *
-*     a31  a42  a53  a64   *    *      m31  m42  m53  m64   *    *
-*
-*  Array elements marked * are not used by the routine; elements marked
-*  + need not be set on entry, but are required by the routine to store
-*  elements of U, because of fill-in resulting from the row
-*  interchanges.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),
-     $                   ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J, JP, JU, KM, KV
-*     ..
-*     .. External Functions ..
-      INTEGER            IZAMAX
-      EXTERNAL           IZAMAX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZGERU, ZSCAL, ZSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     KV is the number of superdiagonals in the factor U, allowing for
-*     fill-in.
-*
-      KV = KU + KL
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KL.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( KU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDAB.LT.KL+KV+1 ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGBTF2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Gaussian elimination with partial pivoting
-*
-*     Set fill-in elements in columns KU+2 to KV to zero.
-*
-      DO 20 J = KU + 2, MIN( KV, N )
-         DO 10 I = KV - J + 2, KL
-            AB( I, J ) = ZERO
-   10    CONTINUE
-   20 CONTINUE
-*
-*     JU is the index of the last column affected by the current stage
-*     of the factorization.
-*
-      JU = 1
-*
-      DO 40 J = 1, MIN( M, N )
-*
-*        Set fill-in elements in column J+KV to zero.
-*
-         IF( J+KV.LE.N ) THEN
-            DO 30 I = 1, KL
-               AB( I, J+KV ) = ZERO
-   30       CONTINUE
-         END IF
-*
-*        Find pivot and test for singularity. KM is the number of
-*        subdiagonal elements in the current column.
-*
-         KM = MIN( KL, M-J )
-         JP = IZAMAX( KM+1, AB( KV+1, J ), 1 )
-         IPIV( J ) = JP + J - 1
-         IF( AB( KV+JP, J ).NE.ZERO ) THEN
-            JU = MAX( JU, MIN( J+KU+JP-1, N ) )
-*
-*           Apply interchange to columns J to JU.
-*
-            IF( JP.NE.1 )
-     $         CALL ZSWAP( JU-J+1, AB( KV+JP, J ), LDAB-1,
-     $                     AB( KV+1, J ), LDAB-1 )
-            IF( KM.GT.0 ) THEN
-*
-*              Compute multipliers.
-*
-               CALL ZSCAL( KM, ONE / AB( KV+1, J ), AB( KV+2, J ), 1 )
-*
-*              Update trailing submatrix within the band.
-*
-               IF( JU.GT.J )
-     $            CALL ZGERU( KM, JU-J, -ONE, AB( KV+2, J ), 1,
-     $                        AB( KV, J+1 ), LDAB-1, AB( KV+1, J+1 ),
-     $                        LDAB-1 )
-            END IF
-         ELSE
-*
-*           If pivot is zero, set INFO to the index of the pivot
-*           unless a zero pivot has already been found.
-*
-            IF( INFO.EQ.0 )
-     $         INFO = J
-         END IF
-   40 CONTINUE
-      RETURN
-*
-*     End of ZGBTF2
-*
-      END
--- a/libcruft/lapack/zgbtrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,442 +0,0 @@
-      SUBROUTINE ZGBTRF( M, N, KL, KU, AB, LDAB, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, KL, KU, LDAB, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX*16         AB( LDAB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGBTRF computes an LU factorization of a complex m-by-n band matrix A
-*  using partial pivoting with row interchanges.
-*
-*  This is the blocked version of the algorithm, calling Level 3 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  KL      (input) INTEGER
-*          The number of subdiagonals within the band of A.  KL >= 0.
-*
-*  KU      (input) INTEGER
-*          The number of superdiagonals within the band of A.  KU >= 0.
-*
-*  AB      (input/output) COMPLEX*16 array, dimension (LDAB,N)
-*          On entry, the matrix A in band storage, in rows KL+1 to
-*          2*KL+KU+1; rows 1 to KL of the array need not be set.
-*          The j-th column of A is stored in the j-th column of the
-*          array AB as follows:
-*          AB(kl+ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl)
-*
-*          On exit, details of the factorization: U is stored as an
-*          upper triangular band matrix with KL+KU superdiagonals in
-*          rows 1 to KL+KU+1, and the multipliers used during the
-*          factorization are stored in rows KL+KU+2 to 2*KL+KU+1.
-*          See below for further details.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
-*
-*  IPIV    (output) INTEGER array, dimension (min(M,N))
-*          The pivot indices; for 1 <= i <= min(M,N), row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = +i, U(i,i) is exactly zero. The factorization
-*               has been completed, but the factor U is exactly
-*               singular, and division by zero will occur if it is used
-*               to solve a system of equations.
-*
-*  Further Details
-*  ===============
-*
-*  The band storage scheme is illustrated by the following example, when
-*  M = N = 6, KL = 2, KU = 1:
-*
-*  On entry:                       On exit:
-*
-*      *    *    *    +    +    +       *    *    *   u14  u25  u36
-*      *    *    +    +    +    +       *    *   u13  u24  u35  u46
-*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
-*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
-*     a21  a32  a43  a54  a65   *      m21  m32  m43  m54  m65   *
-*     a31  a42  a53  a64   *    *      m31  m42  m53  m64   *    *
-*
-*  Array elements marked * are not used by the routine; elements marked
-*  + need not be set on entry, but are required by the routine to store
-*  elements of U because of fill-in resulting from the row interchanges.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),
-     $                   ZERO = ( 0.0D+0, 0.0D+0 ) )
-      INTEGER            NBMAX, LDWORK
-      PARAMETER          ( NBMAX = 64, LDWORK = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I2, I3, II, IP, J, J2, J3, JB, JJ, JM, JP,
-     $                   JU, K2, KM, KV, NB, NW
-      COMPLEX*16         TEMP
-*     ..
-*     .. Local Arrays ..
-      COMPLEX*16         WORK13( LDWORK, NBMAX ),
-     $                   WORK31( LDWORK, NBMAX )
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV, IZAMAX
-      EXTERNAL           ILAENV, IZAMAX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZCOPY, ZGBTF2, ZGEMM, ZGERU, ZLASWP,
-     $                   ZSCAL, ZSWAP, ZTRSM
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     KV is the number of superdiagonals in the factor U, allowing for
-*     fill-in
-*
-      KV = KU + KL
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KL.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( KU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDAB.LT.KL+KV+1 ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGBTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment
-*
-      NB = ILAENV( 1, 'ZGBTRF', ' ', M, N, KL, KU )
-*
-*     The block size must not exceed the limit set by the size of the
-*     local arrays WORK13 and WORK31.
-*
-      NB = MIN( NB, NBMAX )
-*
-      IF( NB.LE.1 .OR. NB.GT.KL ) THEN
-*
-*        Use unblocked code
-*
-         CALL ZGBTF2( M, N, KL, KU, AB, LDAB, IPIV, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-*        Zero the superdiagonal elements of the work array WORK13
-*
-         DO 20 J = 1, NB
-            DO 10 I = 1, J - 1
-               WORK13( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-*
-*        Zero the subdiagonal elements of the work array WORK31
-*
-         DO 40 J = 1, NB
-            DO 30 I = J + 1, NB
-               WORK31( I, J ) = ZERO
-   30       CONTINUE
-   40    CONTINUE
-*
-*        Gaussian elimination with partial pivoting
-*
-*        Set fill-in elements in columns KU+2 to KV to zero
-*
-         DO 60 J = KU + 2, MIN( KV, N )
-            DO 50 I = KV - J + 2, KL
-               AB( I, J ) = ZERO
-   50       CONTINUE
-   60    CONTINUE
-*
-*        JU is the index of the last column affected by the current
-*        stage of the factorization
-*
-         JU = 1
-*
-         DO 180 J = 1, MIN( M, N ), NB
-            JB = MIN( NB, MIN( M, N )-J+1 )
-*
-*           The active part of the matrix is partitioned
-*
-*              A11   A12   A13
-*              A21   A22   A23
-*              A31   A32   A33
-*
-*           Here A11, A21 and A31 denote the current block of JB columns
-*           which is about to be factorized. The number of rows in the
-*           partitioning are JB, I2, I3 respectively, and the numbers
-*           of columns are JB, J2, J3. The superdiagonal elements of A13
-*           and the subdiagonal elements of A31 lie outside the band.
-*
-            I2 = MIN( KL-JB, M-J-JB+1 )
-            I3 = MIN( JB, M-J-KL+1 )
-*
-*           J2 and J3 are computed after JU has been updated.
-*
-*           Factorize the current block of JB columns
-*
-            DO 80 JJ = J, J + JB - 1
-*
-*              Set fill-in elements in column JJ+KV to zero
-*
-               IF( JJ+KV.LE.N ) THEN
-                  DO 70 I = 1, KL
-                     AB( I, JJ+KV ) = ZERO
-   70             CONTINUE
-               END IF
-*
-*              Find pivot and test for singularity. KM is the number of
-*              subdiagonal elements in the current column.
-*
-               KM = MIN( KL, M-JJ )
-               JP = IZAMAX( KM+1, AB( KV+1, JJ ), 1 )
-               IPIV( JJ ) = JP + JJ - J
-               IF( AB( KV+JP, JJ ).NE.ZERO ) THEN
-                  JU = MAX( JU, MIN( JJ+KU+JP-1, N ) )
-                  IF( JP.NE.1 ) THEN
-*
-*                    Apply interchange to columns J to J+JB-1
-*
-                     IF( JP+JJ-1.LT.J+KL ) THEN
-*
-                        CALL ZSWAP( JB, AB( KV+1+JJ-J, J ), LDAB-1,
-     $                              AB( KV+JP+JJ-J, J ), LDAB-1 )
-                     ELSE
-*
-*                       The interchange affects columns J to JJ-1 of A31
-*                       which are stored in the work array WORK31
-*
-                        CALL ZSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1,
-     $                              WORK31( JP+JJ-J-KL, 1 ), LDWORK )
-                        CALL ZSWAP( J+JB-JJ, AB( KV+1, JJ ), LDAB-1,
-     $                              AB( KV+JP, JJ ), LDAB-1 )
-                     END IF
-                  END IF
-*
-*                 Compute multipliers
-*
-                  CALL ZSCAL( KM, ONE / AB( KV+1, JJ ), AB( KV+2, JJ ),
-     $                        1 )
-*
-*                 Update trailing submatrix within the band and within
-*                 the current block. JM is the index of the last column
-*                 which needs to be updated.
-*
-                  JM = MIN( JU, J+JB-1 )
-                  IF( JM.GT.JJ )
-     $               CALL ZGERU( KM, JM-JJ, -ONE, AB( KV+2, JJ ), 1,
-     $                           AB( KV, JJ+1 ), LDAB-1,
-     $                           AB( KV+1, JJ+1 ), LDAB-1 )
-               ELSE
-*
-*                 If pivot is zero, set INFO to the index of the pivot
-*                 unless a zero pivot has already been found.
-*
-                  IF( INFO.EQ.0 )
-     $               INFO = JJ
-               END IF
-*
-*              Copy current column of A31 into the work array WORK31
-*
-               NW = MIN( JJ-J+1, I3 )
-               IF( NW.GT.0 )
-     $            CALL ZCOPY( NW, AB( KV+KL+1-JJ+J, JJ ), 1,
-     $                        WORK31( 1, JJ-J+1 ), 1 )
-   80       CONTINUE
-            IF( J+JB.LE.N ) THEN
-*
-*              Apply the row interchanges to the other blocks.
-*
-               J2 = MIN( JU-J+1, KV ) - JB
-               J3 = MAX( 0, JU-J-KV+1 )
-*
-*              Use ZLASWP to apply the row interchanges to A12, A22, and
-*              A32.
-*
-               CALL ZLASWP( J2, AB( KV+1-JB, J+JB ), LDAB-1, 1, JB,
-     $                      IPIV( J ), 1 )
-*
-*              Adjust the pivot indices.
-*
-               DO 90 I = J, J + JB - 1
-                  IPIV( I ) = IPIV( I ) + J - 1
-   90          CONTINUE
-*
-*              Apply the row interchanges to A13, A23, and A33
-*              columnwise.
-*
-               K2 = J - 1 + JB + J2
-               DO 110 I = 1, J3
-                  JJ = K2 + I
-                  DO 100 II = J + I - 1, J + JB - 1
-                     IP = IPIV( II )
-                     IF( IP.NE.II ) THEN
-                        TEMP = AB( KV+1+II-JJ, JJ )
-                        AB( KV+1+II-JJ, JJ ) = AB( KV+1+IP-JJ, JJ )
-                        AB( KV+1+IP-JJ, JJ ) = TEMP
-                     END IF
-  100             CONTINUE
-  110          CONTINUE
-*
-*              Update the relevant part of the trailing submatrix
-*
-               IF( J2.GT.0 ) THEN
-*
-*                 Update A12
-*
-                  CALL ZTRSM( 'Left', 'Lower', 'No transpose', 'Unit',
-     $                        JB, J2, ONE, AB( KV+1, J ), LDAB-1,
-     $                        AB( KV+1-JB, J+JB ), LDAB-1 )
-*
-                  IF( I2.GT.0 ) THEN
-*
-*                    Update A22
-*
-                     CALL ZGEMM( 'No transpose', 'No transpose', I2, J2,
-     $                           JB, -ONE, AB( KV+1+JB, J ), LDAB-1,
-     $                           AB( KV+1-JB, J+JB ), LDAB-1, ONE,
-     $                           AB( KV+1, J+JB ), LDAB-1 )
-                  END IF
-*
-                  IF( I3.GT.0 ) THEN
-*
-*                    Update A32
-*
-                     CALL ZGEMM( 'No transpose', 'No transpose', I3, J2,
-     $                           JB, -ONE, WORK31, LDWORK,
-     $                           AB( KV+1-JB, J+JB ), LDAB-1, ONE,
-     $                           AB( KV+KL+1-JB, J+JB ), LDAB-1 )
-                  END IF
-               END IF
-*
-               IF( J3.GT.0 ) THEN
-*
-*                 Copy the lower triangle of A13 into the work array
-*                 WORK13
-*
-                  DO 130 JJ = 1, J3
-                     DO 120 II = JJ, JB
-                        WORK13( II, JJ ) = AB( II-JJ+1, JJ+J+KV-1 )
-  120                CONTINUE
-  130             CONTINUE
-*
-*                 Update A13 in the work array
-*
-                  CALL ZTRSM( 'Left', 'Lower', 'No transpose', 'Unit',
-     $                        JB, J3, ONE, AB( KV+1, J ), LDAB-1,
-     $                        WORK13, LDWORK )
-*
-                  IF( I2.GT.0 ) THEN
-*
-*                    Update A23
-*
-                     CALL ZGEMM( 'No transpose', 'No transpose', I2, J3,
-     $                           JB, -ONE, AB( KV+1+JB, J ), LDAB-1,
-     $                           WORK13, LDWORK, ONE, AB( 1+JB, J+KV ),
-     $                           LDAB-1 )
-                  END IF
-*
-                  IF( I3.GT.0 ) THEN
-*
-*                    Update A33
-*
-                     CALL ZGEMM( 'No transpose', 'No transpose', I3, J3,
-     $                           JB, -ONE, WORK31, LDWORK, WORK13,
-     $                           LDWORK, ONE, AB( 1+KL, J+KV ), LDAB-1 )
-                  END IF
-*
-*                 Copy the lower triangle of A13 back into place
-*
-                  DO 150 JJ = 1, J3
-                     DO 140 II = JJ, JB
-                        AB( II-JJ+1, JJ+J+KV-1 ) = WORK13( II, JJ )
-  140                CONTINUE
-  150             CONTINUE
-               END IF
-            ELSE
-*
-*              Adjust the pivot indices.
-*
-               DO 160 I = J, J + JB - 1
-                  IPIV( I ) = IPIV( I ) + J - 1
-  160          CONTINUE
-            END IF
-*
-*           Partially undo the interchanges in the current block to
-*           restore the upper triangular form of A31 and copy the upper
-*           triangle of A31 back into place
-*
-            DO 170 JJ = J + JB - 1, J, -1
-               JP = IPIV( JJ ) - JJ + 1
-               IF( JP.NE.1 ) THEN
-*
-*                 Apply interchange to columns J to JJ-1
-*
-                  IF( JP+JJ-1.LT.J+KL ) THEN
-*
-*                    The interchange does not affect A31
-*
-                     CALL ZSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1,
-     $                           AB( KV+JP+JJ-J, J ), LDAB-1 )
-                  ELSE
-*
-*                    The interchange does affect A31
-*
-                     CALL ZSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1,
-     $                           WORK31( JP+JJ-J-KL, 1 ), LDWORK )
-                  END IF
-               END IF
-*
-*              Copy the current column of A31 back into place
-*
-               NW = MIN( I3, JJ-J+1 )
-               IF( NW.GT.0 )
-     $            CALL ZCOPY( NW, WORK31( 1, JJ-J+1 ), 1,
-     $                        AB( KV+KL+1-JJ+J, JJ ), 1 )
-  170       CONTINUE
-  180    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of ZGBTRF
-*
-      END
--- a/libcruft/lapack/zgbtrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,214 +0,0 @@
-      SUBROUTINE ZGBTRS( TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TRANS
-      INTEGER            INFO, KL, KU, LDAB, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX*16         AB( LDAB, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGBTRS solves a system of linear equations
-*     A * X = B,  A**T * X = B,  or  A**H * X = B
-*  with a general band matrix A using the LU factorization computed
-*  by ZGBTRF.
-*
-*  Arguments
-*  =========
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the form of the system of equations.
-*          = 'N':  A * X = B     (No transpose)
-*          = 'T':  A**T * X = B  (Transpose)
-*          = 'C':  A**H * X = B  (Conjugate transpose)
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KL      (input) INTEGER
-*          The number of subdiagonals within the band of A.  KL >= 0.
-*
-*  KU      (input) INTEGER
-*          The number of superdiagonals within the band of A.  KU >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  AB      (input) COMPLEX*16 array, dimension (LDAB,N)
-*          Details of the LU factorization of the band matrix A, as
-*          computed by ZGBTRF.  U is stored as an upper triangular band
-*          matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and
-*          the multipliers used during the factorization are stored in
-*          rows KL+KU+2 to 2*KL+KU+1.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= N, row i of the matrix was
-*          interchanged with row IPIV(i).
-*
-*  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LNOTI, NOTRAN
-      INTEGER            I, J, KD, L, LM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZGEMV, ZGERU, ZLACGV, ZSWAP, ZTBSV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      NOTRAN = LSAME( TRANS, 'N' )
-      IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
-     $    LSAME( TRANS, 'C' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KL.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( KU.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDAB.LT.( 2*KL+KU+1 ) ) THEN
-         INFO = -7
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGBTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      KD = KU + KL + 1
-      LNOTI = KL.GT.0
-*
-      IF( NOTRAN ) THEN
-*
-*        Solve  A*X = B.
-*
-*        Solve L*X = B, overwriting B with X.
-*
-*        L is represented as a product of permutations and unit lower
-*        triangular matrices L = P(1) * L(1) * ... * P(n-1) * L(n-1),
-*        where each transformation L(i) is a rank-one modification of
-*        the identity matrix.
-*
-         IF( LNOTI ) THEN
-            DO 10 J = 1, N - 1
-               LM = MIN( KL, N-J )
-               L = IPIV( J )
-               IF( L.NE.J )
-     $            CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
-               CALL ZGERU( LM, NRHS, -ONE, AB( KD+1, J ), 1, B( J, 1 ),
-     $                     LDB, B( J+1, 1 ), LDB )
-   10       CONTINUE
-         END IF
-*
-         DO 20 I = 1, NRHS
-*
-*           Solve U*X = B, overwriting B with X.
-*
-            CALL ZTBSV( 'Upper', 'No transpose', 'Non-unit', N, KL+KU,
-     $                  AB, LDAB, B( 1, I ), 1 )
-   20    CONTINUE
-*
-      ELSE IF( LSAME( TRANS, 'T' ) ) THEN
-*
-*        Solve A**T * X = B.
-*
-         DO 30 I = 1, NRHS
-*
-*           Solve U**T * X = B, overwriting B with X.
-*
-            CALL ZTBSV( 'Upper', 'Transpose', 'Non-unit', N, KL+KU, AB,
-     $                  LDAB, B( 1, I ), 1 )
-   30    CONTINUE
-*
-*        Solve L**T * X = B, overwriting B with X.
-*
-         IF( LNOTI ) THEN
-            DO 40 J = N - 1, 1, -1
-               LM = MIN( KL, N-J )
-               CALL ZGEMV( 'Transpose', LM, NRHS, -ONE, B( J+1, 1 ),
-     $                     LDB, AB( KD+1, J ), 1, ONE, B( J, 1 ), LDB )
-               L = IPIV( J )
-               IF( L.NE.J )
-     $            CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
-   40       CONTINUE
-         END IF
-*
-      ELSE
-*
-*        Solve A**H * X = B.
-*
-         DO 50 I = 1, NRHS
-*
-*           Solve U**H * X = B, overwriting B with X.
-*
-            CALL ZTBSV( 'Upper', 'Conjugate transpose', 'Non-unit', N,
-     $                  KL+KU, AB, LDAB, B( 1, I ), 1 )
-   50    CONTINUE
-*
-*        Solve L**H * X = B, overwriting B with X.
-*
-         IF( LNOTI ) THEN
-            DO 60 J = N - 1, 1, -1
-               LM = MIN( KL, N-J )
-               CALL ZLACGV( NRHS, B( J, 1 ), LDB )
-               CALL ZGEMV( 'Conjugate transpose', LM, NRHS, -ONE,
-     $                     B( J+1, 1 ), LDB, AB( KD+1, J ), 1, ONE,
-     $                     B( J, 1 ), LDB )
-               CALL ZLACGV( NRHS, B( J, 1 ), LDB )
-               L = IPIV( J )
-               IF( L.NE.J )
-     $            CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
-   60       CONTINUE
-         END IF
-      END IF
-      RETURN
-*
-*     End of ZGBTRS
-*
-      END
--- a/libcruft/lapack/zgebak.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,189 +0,0 @@
-      SUBROUTINE ZGEBAK( JOB, SIDE, N, ILO, IHI, SCALE, M, V, LDV,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOB, SIDE
-      INTEGER            IHI, ILO, INFO, LDV, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   SCALE( * )
-      COMPLEX*16         V( LDV, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGEBAK forms the right or left eigenvectors of a complex general
-*  matrix by backward transformation on the computed eigenvectors of the
-*  balanced matrix output by ZGEBAL.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies the type of backward transformation required:
-*          = 'N', do nothing, return immediately;
-*          = 'P', do backward transformation for permutation only;
-*          = 'S', do backward transformation for scaling only;
-*          = 'B', do backward transformations for both permutation and
-*                 scaling.
-*          JOB must be the same as the argument JOB supplied to ZGEBAL.
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'R':  V contains right eigenvectors;
-*          = 'L':  V contains left eigenvectors.
-*
-*  N       (input) INTEGER
-*          The number of rows of the matrix V.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          The integers ILO and IHI determined by ZGEBAL.
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  SCALE   (input) DOUBLE PRECISION array, dimension (N)
-*          Details of the permutation and scaling factors, as returned
-*          by ZGEBAL.
-*
-*  M       (input) INTEGER
-*          The number of columns of the matrix V.  M >= 0.
-*
-*  V       (input/output) COMPLEX*16 array, dimension (LDV,M)
-*          On entry, the matrix of right or left eigenvectors to be
-*          transformed, as returned by ZHSEIN or ZTREVC.
-*          On exit, V is overwritten by the transformed eigenvectors.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V. LDV >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFTV, RIGHTV
-      INTEGER            I, II, K
-      DOUBLE PRECISION   S
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZDSCAL, ZSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and Test the input parameters
-*
-      RIGHTV = LSAME( SIDE, 'R' )
-      LEFTV = LSAME( SIDE, 'L' )
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
-     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -5
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -7
-      ELSE IF( LDV.LT.MAX( 1, N ) ) THEN
-         INFO = -9
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGEBAK', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-      IF( M.EQ.0 )
-     $   RETURN
-      IF( LSAME( JOB, 'N' ) )
-     $   RETURN
-*
-      IF( ILO.EQ.IHI )
-     $   GO TO 30
-*
-*     Backward balance
-*
-      IF( LSAME( JOB, 'S' ) .OR. LSAME( JOB, 'B' ) ) THEN
-*
-         IF( RIGHTV ) THEN
-            DO 10 I = ILO, IHI
-               S = SCALE( I )
-               CALL ZDSCAL( M, S, V( I, 1 ), LDV )
-   10       CONTINUE
-         END IF
-*
-         IF( LEFTV ) THEN
-            DO 20 I = ILO, IHI
-               S = ONE / SCALE( I )
-               CALL ZDSCAL( M, S, V( I, 1 ), LDV )
-   20       CONTINUE
-         END IF
-*
-      END IF
-*
-*     Backward permutation
-*
-*     For  I = ILO-1 step -1 until 1,
-*              IHI+1 step 1 until N do --
-*
-   30 CONTINUE
-      IF( LSAME( JOB, 'P' ) .OR. LSAME( JOB, 'B' ) ) THEN
-         IF( RIGHTV ) THEN
-            DO 40 II = 1, N
-               I = II
-               IF( I.GE.ILO .AND. I.LE.IHI )
-     $            GO TO 40
-               IF( I.LT.ILO )
-     $            I = ILO - II
-               K = SCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 40
-               CALL ZSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   40       CONTINUE
-         END IF
-*
-         IF( LEFTV ) THEN
-            DO 50 II = 1, N
-               I = II
-               IF( I.GE.ILO .AND. I.LE.IHI )
-     $            GO TO 50
-               IF( I.LT.ILO )
-     $            I = ILO - II
-               K = SCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 50
-               CALL ZSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   50       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZGEBAK
-*
-      END
--- a/libcruft/lapack/zgebal.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,330 +0,0 @@
-      SUBROUTINE ZGEBAL( JOB, N, A, LDA, ILO, IHI, SCALE, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOB
-      INTEGER            IHI, ILO, INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   SCALE( * )
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGEBAL balances a general complex matrix A.  This involves, first,
-*  permuting A by a similarity transformation to isolate eigenvalues
-*  in the first 1 to ILO-1 and last IHI+1 to N elements on the
-*  diagonal; and second, applying a diagonal similarity transformation
-*  to rows and columns ILO to IHI to make the rows and columns as
-*  close in norm as possible.  Both steps are optional.
-*
-*  Balancing may reduce the 1-norm of the matrix, and improve the
-*  accuracy of the computed eigenvalues and/or eigenvectors.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies the operations to be performed on A:
-*          = 'N':  none:  simply set ILO = 1, IHI = N, SCALE(I) = 1.0
-*                  for i = 1,...,N;
-*          = 'P':  permute only;
-*          = 'S':  scale only;
-*          = 'B':  both permute and scale.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the input matrix A.
-*          On exit,  A is overwritten by the balanced matrix.
-*          If JOB = 'N', A is not referenced.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  ILO     (output) INTEGER
-*  IHI     (output) INTEGER
-*          ILO and IHI are set to integers such that on exit
-*          A(i,j) = 0 if i > j and j = 1,...,ILO-1 or I = IHI+1,...,N.
-*          If JOB = 'N' or 'S', ILO = 1 and IHI = N.
-*
-*  SCALE   (output) DOUBLE PRECISION array, dimension (N)
-*          Details of the permutations and scaling factors applied to
-*          A.  If P(j) is the index of the row and column interchanged
-*          with row and column j and D(j) is the scaling factor
-*          applied to row and column j, then
-*          SCALE(j) = P(j)    for j = 1,...,ILO-1
-*                   = D(j)    for j = ILO,...,IHI
-*                   = P(j)    for j = IHI+1,...,N.
-*          The order in which the interchanges are made is N to IHI+1,
-*          then 1 to ILO-1.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The permutations consist of row and column interchanges which put
-*  the matrix in the form
-*
-*             ( T1   X   Y  )
-*     P A P = (  0   B   Z  )
-*             (  0   0   T2 )
-*
-*  where T1 and T2 are upper triangular matrices whose eigenvalues lie
-*  along the diagonal.  The column indices ILO and IHI mark the starting
-*  and ending columns of the submatrix B. Balancing consists of applying
-*  a diagonal similarity transformation inv(D) * B * D to make the
-*  1-norms of each row of B and its corresponding column nearly equal.
-*  The output matrix is
-*
-*     ( T1     X*D          Y    )
-*     (  0  inv(D)*B*D  inv(D)*Z ).
-*     (  0      0           T2   )
-*
-*  Information about the permutations P and the diagonal matrix D is
-*  returned in the vector SCALE.
-*
-*  This subroutine is based on the EISPACK routine CBAL.
-*
-*  Modified by Tzu-Yi Chen, Computer Science Division, University of
-*    California at Berkeley, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-      DOUBLE PRECISION   SCLFAC
-      PARAMETER          ( SCLFAC = 2.0D+0 )
-      DOUBLE PRECISION   FACTOR
-      PARAMETER          ( FACTOR = 0.95D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOCONV
-      INTEGER            I, ICA, IEXC, IRA, J, K, L, M
-      DOUBLE PRECISION   C, CA, F, G, R, RA, S, SFMAX1, SFMAX2, SFMIN1,
-     $                   SFMIN2
-      COMPLEX*16         CDUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IZAMAX
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           LSAME, IZAMAX, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZDSCAL, ZSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DIMAG, MAX, MIN
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( DBLE( CDUM ) ) + ABS( DIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
-     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGEBAL', -INFO )
-         RETURN
-      END IF
-*
-      K = 1
-      L = N
-*
-      IF( N.EQ.0 )
-     $   GO TO 210
-*
-      IF( LSAME( JOB, 'N' ) ) THEN
-         DO 10 I = 1, N
-            SCALE( I ) = ONE
-   10    CONTINUE
-         GO TO 210
-      END IF
-*
-      IF( LSAME( JOB, 'S' ) )
-     $   GO TO 120
-*
-*     Permutation to isolate eigenvalues if possible
-*
-      GO TO 50
-*
-*     Row and column exchange.
-*
-   20 CONTINUE
-      SCALE( M ) = J
-      IF( J.EQ.M )
-     $   GO TO 30
-*
-      CALL ZSWAP( L, A( 1, J ), 1, A( 1, M ), 1 )
-      CALL ZSWAP( N-K+1, A( J, K ), LDA, A( M, K ), LDA )
-*
-   30 CONTINUE
-      GO TO ( 40, 80 )IEXC
-*
-*     Search for rows isolating an eigenvalue and push them down.
-*
-   40 CONTINUE
-      IF( L.EQ.1 )
-     $   GO TO 210
-      L = L - 1
-*
-   50 CONTINUE
-      DO 70 J = L, 1, -1
-*
-         DO 60 I = 1, L
-            IF( I.EQ.J )
-     $         GO TO 60
-            IF( DBLE( A( J, I ) ).NE.ZERO .OR. DIMAG( A( J, I ) ).NE.
-     $          ZERO )GO TO 70
-   60    CONTINUE
-*
-         M = L
-         IEXC = 1
-         GO TO 20
-   70 CONTINUE
-*
-      GO TO 90
-*
-*     Search for columns isolating an eigenvalue and push them left.
-*
-   80 CONTINUE
-      K = K + 1
-*
-   90 CONTINUE
-      DO 110 J = K, L
-*
-         DO 100 I = K, L
-            IF( I.EQ.J )
-     $         GO TO 100
-            IF( DBLE( A( I, J ) ).NE.ZERO .OR. DIMAG( A( I, J ) ).NE.
-     $          ZERO )GO TO 110
-  100    CONTINUE
-*
-         M = K
-         IEXC = 2
-         GO TO 20
-  110 CONTINUE
-*
-  120 CONTINUE
-      DO 130 I = K, L
-         SCALE( I ) = ONE
-  130 CONTINUE
-*
-      IF( LSAME( JOB, 'P' ) )
-     $   GO TO 210
-*
-*     Balance the submatrix in rows K to L.
-*
-*     Iterative loop for norm reduction
-*
-      SFMIN1 = DLAMCH( 'S' ) / DLAMCH( 'P' )
-      SFMAX1 = ONE / SFMIN1
-      SFMIN2 = SFMIN1*SCLFAC
-      SFMAX2 = ONE / SFMIN2
-  140 CONTINUE
-      NOCONV = .FALSE.
-*
-      DO 200 I = K, L
-         C = ZERO
-         R = ZERO
-*
-         DO 150 J = K, L
-            IF( J.EQ.I )
-     $         GO TO 150
-            C = C + CABS1( A( J, I ) )
-            R = R + CABS1( A( I, J ) )
-  150    CONTINUE
-         ICA = IZAMAX( L, A( 1, I ), 1 )
-         CA = ABS( A( ICA, I ) )
-         IRA = IZAMAX( N-K+1, A( I, K ), LDA )
-         RA = ABS( A( I, IRA+K-1 ) )
-*
-*        Guard against zero C or R due to underflow.
-*
-         IF( C.EQ.ZERO .OR. R.EQ.ZERO )
-     $      GO TO 200
-         G = R / SCLFAC
-         F = ONE
-         S = C + R
-  160    CONTINUE
-         IF( C.GE.G .OR. MAX( F, C, CA ).GE.SFMAX2 .OR.
-     $       MIN( R, G, RA ).LE.SFMIN2 )GO TO 170
-         F = F*SCLFAC
-         C = C*SCLFAC
-         CA = CA*SCLFAC
-         R = R / SCLFAC
-         G = G / SCLFAC
-         RA = RA / SCLFAC
-         GO TO 160
-*
-  170    CONTINUE
-         G = C / SCLFAC
-  180    CONTINUE
-         IF( G.LT.R .OR. MAX( R, RA ).GE.SFMAX2 .OR.
-     $       MIN( F, C, G, CA ).LE.SFMIN2 )GO TO 190
-         F = F / SCLFAC
-         C = C / SCLFAC
-         G = G / SCLFAC
-         CA = CA / SCLFAC
-         R = R*SCLFAC
-         RA = RA*SCLFAC
-         GO TO 180
-*
-*        Now balance.
-*
-  190    CONTINUE
-         IF( ( C+R ).GE.FACTOR*S )
-     $      GO TO 200
-         IF( F.LT.ONE .AND. SCALE( I ).LT.ONE ) THEN
-            IF( F*SCALE( I ).LE.SFMIN1 )
-     $         GO TO 200
-         END IF
-         IF( F.GT.ONE .AND. SCALE( I ).GT.ONE ) THEN
-            IF( SCALE( I ).GE.SFMAX1 / F )
-     $         GO TO 200
-         END IF
-         G = ONE / F
-         SCALE( I ) = SCALE( I )*F
-         NOCONV = .TRUE.
-*
-         CALL ZDSCAL( N-K+1, G, A( I, K ), LDA )
-         CALL ZDSCAL( L, F, A( 1, I ), 1 )
-*
-  200 CONTINUE
-*
-      IF( NOCONV )
-     $   GO TO 140
-*
-  210 CONTINUE
-      ILO = K
-      IHI = L
-*
-      RETURN
-*
-*     End of ZGEBAL
-*
-      END
--- a/libcruft/lapack/zgebd2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,250 +0,0 @@
-      SUBROUTINE ZGEBD2( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * ), E( * )
-      COMPLEX*16         A( LDA, * ), TAUP( * ), TAUQ( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGEBD2 reduces a complex general m by n matrix A to upper or lower
-*  real bidiagonal form B by a unitary transformation: Q' * A * P = B.
-*
-*  If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows in the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns in the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the m by n general matrix to be reduced.
-*          On exit,
-*          if m >= n, the diagonal and the first superdiagonal are
-*            overwritten with the upper bidiagonal matrix B; the
-*            elements below the diagonal, with the array TAUQ, represent
-*            the unitary matrix Q as a product of elementary
-*            reflectors, and the elements above the first superdiagonal,
-*            with the array TAUP, represent the unitary matrix P as
-*            a product of elementary reflectors;
-*          if m < n, the diagonal and the first subdiagonal are
-*            overwritten with the lower bidiagonal matrix B; the
-*            elements below the first subdiagonal, with the array TAUQ,
-*            represent the unitary matrix Q as a product of
-*            elementary reflectors, and the elements above the diagonal,
-*            with the array TAUP, represent the unitary matrix P as
-*            a product of elementary reflectors.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  D       (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The diagonal elements of the bidiagonal matrix B:
-*          D(i) = A(i,i).
-*
-*  E       (output) DOUBLE PRECISION array, dimension (min(M,N)-1)
-*          The off-diagonal elements of the bidiagonal matrix B:
-*          if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1;
-*          if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1.
-*
-*  TAUQ    (output) COMPLEX*16 array dimension (min(M,N))
-*          The scalar factors of the elementary reflectors which
-*          represent the unitary matrix Q. See Further Details.
-*
-*  TAUP    (output) COMPLEX*16 array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors which
-*          represent the unitary matrix P. See Further Details.
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (max(M,N))
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrices Q and P are represented as products of elementary
-*  reflectors:
-*
-*  If m >= n,
-*
-*     Q = H(1) H(2) . . . H(n)  and  P = G(1) G(2) . . . G(n-1)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are complex scalars, and v and u are complex
-*  vectors; v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in
-*  A(i+1:m,i); u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in
-*  A(i,i+2:n); tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  If m < n,
-*
-*     Q = H(1) H(2) . . . H(m-1)  and  P = G(1) G(2) . . . G(m)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are complex scalars, v and u are complex vectors;
-*  v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in A(i+2:m,i);
-*  u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in A(i,i+1:n);
-*  tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  The contents of A on exit are illustrated by the following examples:
-*
-*  m = 6 and n = 5 (m > n):          m = 5 and n = 6 (m < n):
-*
-*    (  d   e   u1  u1  u1 )           (  d   u1  u1  u1  u1  u1 )
-*    (  v1  d   e   u2  u2 )           (  e   d   u2  u2  u2  u2 )
-*    (  v1  v2  d   e   u3 )           (  v1  e   d   u3  u3  u3 )
-*    (  v1  v2  v3  d   e  )           (  v1  v2  e   d   u4  u4 )
-*    (  v1  v2  v3  v4  d  )           (  v1  v2  v3  e   d   u5 )
-*    (  v1  v2  v3  v4  v5 )
-*
-*  where d and e denote diagonal and off-diagonal elements of B, vi
-*  denotes an element of the vector defining H(i), and ui an element of
-*  the vector defining G(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ),
-     $                   ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      COMPLEX*16         ALPHA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLACGV, ZLARF, ZLARFG
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.LT.0 ) THEN
-         CALL XERBLA( 'ZGEBD2', -INFO )
-         RETURN
-      END IF
-*
-      IF( M.GE.N ) THEN
-*
-*        Reduce to upper bidiagonal form
-*
-         DO 10 I = 1, N
-*
-*           Generate elementary reflector H(i) to annihilate A(i+1:m,i)
-*
-            ALPHA = A( I, I )
-            CALL ZLARFG( M-I+1, ALPHA, A( MIN( I+1, M ), I ), 1,
-     $                   TAUQ( I ) )
-            D( I ) = ALPHA
-            A( I, I ) = ONE
-*
-*           Apply H(i)' to A(i:m,i+1:n) from the left
-*
-            IF( I.LT.N )
-     $         CALL ZLARF( 'Left', M-I+1, N-I, A( I, I ), 1,
-     $                     DCONJG( TAUQ( I ) ), A( I, I+1 ), LDA, WORK )
-            A( I, I ) = D( I )
-*
-            IF( I.LT.N ) THEN
-*
-*              Generate elementary reflector G(i) to annihilate
-*              A(i,i+2:n)
-*
-               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
-               ALPHA = A( I, I+1 )
-               CALL ZLARFG( N-I, ALPHA, A( I, MIN( I+2, N ) ), LDA,
-     $                      TAUP( I ) )
-               E( I ) = ALPHA
-               A( I, I+1 ) = ONE
-*
-*              Apply G(i) to A(i+1:m,i+1:n) from the right
-*
-               CALL ZLARF( 'Right', M-I, N-I, A( I, I+1 ), LDA,
-     $                     TAUP( I ), A( I+1, I+1 ), LDA, WORK )
-               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
-               A( I, I+1 ) = E( I )
-            ELSE
-               TAUP( I ) = ZERO
-            END IF
-   10    CONTINUE
-      ELSE
-*
-*        Reduce to lower bidiagonal form
-*
-         DO 20 I = 1, M
-*
-*           Generate elementary reflector G(i) to annihilate A(i,i+1:n)
-*
-            CALL ZLACGV( N-I+1, A( I, I ), LDA )
-            ALPHA = A( I, I )
-            CALL ZLARFG( N-I+1, ALPHA, A( I, MIN( I+1, N ) ), LDA,
-     $                   TAUP( I ) )
-            D( I ) = ALPHA
-            A( I, I ) = ONE
-*
-*           Apply G(i) to A(i+1:m,i:n) from the right
-*
-            IF( I.LT.M )
-     $         CALL ZLARF( 'Right', M-I, N-I+1, A( I, I ), LDA,
-     $                     TAUP( I ), A( I+1, I ), LDA, WORK )
-            CALL ZLACGV( N-I+1, A( I, I ), LDA )
-            A( I, I ) = D( I )
-*
-            IF( I.LT.M ) THEN
-*
-*              Generate elementary reflector H(i) to annihilate
-*              A(i+2:m,i)
-*
-               ALPHA = A( I+1, I )
-               CALL ZLARFG( M-I, ALPHA, A( MIN( I+2, M ), I ), 1,
-     $                      TAUQ( I ) )
-               E( I ) = ALPHA
-               A( I+1, I ) = ONE
-*
-*              Apply H(i)' to A(i+1:m,i+1:n) from the left
-*
-               CALL ZLARF( 'Left', M-I, N-I, A( I+1, I ), 1,
-     $                     DCONJG( TAUQ( I ) ), A( I+1, I+1 ), LDA,
-     $                     WORK )
-               A( I+1, I ) = E( I )
-            ELSE
-               TAUQ( I ) = ZERO
-            END IF
-   20    CONTINUE
-      END IF
-      RETURN
-*
-*     End of ZGEBD2
-*
-      END
--- a/libcruft/lapack/zgebrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,268 +0,0 @@
-      SUBROUTINE ZGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * ), E( * )
-      COMPLEX*16         A( LDA, * ), TAUP( * ), TAUQ( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGEBRD reduces a general complex M-by-N matrix A to upper or lower
-*  bidiagonal form B by a unitary transformation: Q**H * A * P = B.
-*
-*  If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows in the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns in the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the M-by-N general matrix to be reduced.
-*          On exit,
-*          if m >= n, the diagonal and the first superdiagonal are
-*            overwritten with the upper bidiagonal matrix B; the
-*            elements below the diagonal, with the array TAUQ, represent
-*            the unitary matrix Q as a product of elementary
-*            reflectors, and the elements above the first superdiagonal,
-*            with the array TAUP, represent the unitary matrix P as
-*            a product of elementary reflectors;
-*          if m < n, the diagonal and the first subdiagonal are
-*            overwritten with the lower bidiagonal matrix B; the
-*            elements below the first subdiagonal, with the array TAUQ,
-*            represent the unitary matrix Q as a product of
-*            elementary reflectors, and the elements above the diagonal,
-*            with the array TAUP, represent the unitary matrix P as
-*            a product of elementary reflectors.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  D       (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The diagonal elements of the bidiagonal matrix B:
-*          D(i) = A(i,i).
-*
-*  E       (output) DOUBLE PRECISION array, dimension (min(M,N)-1)
-*          The off-diagonal elements of the bidiagonal matrix B:
-*          if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1;
-*          if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1.
-*
-*  TAUQ    (output) COMPLEX*16 array dimension (min(M,N))
-*          The scalar factors of the elementary reflectors which
-*          represent the unitary matrix Q. See Further Details.
-*
-*  TAUP    (output) COMPLEX*16 array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors which
-*          represent the unitary matrix P. See Further Details.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The length of the array WORK.  LWORK >= max(1,M,N).
-*          For optimum performance LWORK >= (M+N)*NB, where NB
-*          is the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrices Q and P are represented as products of elementary
-*  reflectors:
-*
-*  If m >= n,
-*
-*     Q = H(1) H(2) . . . H(n)  and  P = G(1) G(2) . . . G(n-1)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are complex scalars, and v and u are complex
-*  vectors; v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in
-*  A(i+1:m,i); u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in
-*  A(i,i+2:n); tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  If m < n,
-*
-*     Q = H(1) H(2) . . . H(m-1)  and  P = G(1) G(2) . . . G(m)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are complex scalars, and v and u are complex
-*  vectors; v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in
-*  A(i+2:m,i); u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in
-*  A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  The contents of A on exit are illustrated by the following examples:
-*
-*  m = 6 and n = 5 (m > n):          m = 5 and n = 6 (m < n):
-*
-*    (  d   e   u1  u1  u1 )           (  d   u1  u1  u1  u1  u1 )
-*    (  v1  d   e   u2  u2 )           (  e   d   u2  u2  u2  u2 )
-*    (  v1  v2  d   e   u3 )           (  v1  e   d   u3  u3  u3 )
-*    (  v1  v2  v3  d   e  )           (  v1  v2  e   d   u4  u4 )
-*    (  v1  v2  v3  v4  d  )           (  v1  v2  v3  e   d   u5 )
-*    (  v1  v2  v3  v4  v5 )
-*
-*  where d and e denote diagonal and off-diagonal elements of B, vi
-*  denotes an element of the vector defining H(i), and ui an element of
-*  the vector defining G(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IINFO, J, LDWRKX, LDWRKY, LWKOPT, MINMN, NB,
-     $                   NBMIN, NX
-      DOUBLE PRECISION   WS
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZGEBD2, ZGEMM, ZLABRD
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      NB = MAX( 1, ILAENV( 1, 'ZGEBRD', ' ', M, N, -1, -1 ) )
-      LWKOPT = ( M+N )*NB
-      WORK( 1 ) = DBLE( LWKOPT )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.MAX( 1, M, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.LT.0 ) THEN
-         CALL XERBLA( 'ZGEBRD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      MINMN = MIN( M, N )
-      IF( MINMN.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      WS = MAX( M, N )
-      LDWRKX = M
-      LDWRKY = N
-*
-      IF( NB.GT.1 .AND. NB.LT.MINMN ) THEN
-*
-*        Set the crossover point NX.
-*
-         NX = MAX( NB, ILAENV( 3, 'ZGEBRD', ' ', M, N, -1, -1 ) )
-*
-*        Determine when to switch from blocked to unblocked code.
-*
-         IF( NX.LT.MINMN ) THEN
-            WS = ( M+N )*NB
-            IF( LWORK.LT.WS ) THEN
-*
-*              Not enough work space for the optimal NB, consider using
-*              a smaller block size.
-*
-               NBMIN = ILAENV( 2, 'ZGEBRD', ' ', M, N, -1, -1 )
-               IF( LWORK.GE.( M+N )*NBMIN ) THEN
-                  NB = LWORK / ( M+N )
-               ELSE
-                  NB = 1
-                  NX = MINMN
-               END IF
-            END IF
-         END IF
-      ELSE
-         NX = MINMN
-      END IF
-*
-      DO 30 I = 1, MINMN - NX, NB
-*
-*        Reduce rows and columns i:i+ib-1 to bidiagonal form and return
-*        the matrices X and Y which are needed to update the unreduced
-*        part of the matrix
-*
-         CALL ZLABRD( M-I+1, N-I+1, NB, A( I, I ), LDA, D( I ), E( I ),
-     $                TAUQ( I ), TAUP( I ), WORK, LDWRKX,
-     $                WORK( LDWRKX*NB+1 ), LDWRKY )
-*
-*        Update the trailing submatrix A(i+ib:m,i+ib:n), using
-*        an update of the form  A := A - V*Y' - X*U'
-*
-         CALL ZGEMM( 'No transpose', 'Conjugate transpose', M-I-NB+1,
-     $               N-I-NB+1, NB, -ONE, A( I+NB, I ), LDA,
-     $               WORK( LDWRKX*NB+NB+1 ), LDWRKY, ONE,
-     $               A( I+NB, I+NB ), LDA )
-         CALL ZGEMM( 'No transpose', 'No transpose', M-I-NB+1, N-I-NB+1,
-     $               NB, -ONE, WORK( NB+1 ), LDWRKX, A( I, I+NB ), LDA,
-     $               ONE, A( I+NB, I+NB ), LDA )
-*
-*        Copy diagonal and off-diagonal elements of B back into A
-*
-         IF( M.GE.N ) THEN
-            DO 10 J = I, I + NB - 1
-               A( J, J ) = D( J )
-               A( J, J+1 ) = E( J )
-   10       CONTINUE
-         ELSE
-            DO 20 J = I, I + NB - 1
-               A( J, J ) = D( J )
-               A( J+1, J ) = E( J )
-   20       CONTINUE
-         END IF
-   30 CONTINUE
-*
-*     Use unblocked code to reduce the remainder of the matrix
-*
-      CALL ZGEBD2( M-I+1, N-I+1, A( I, I ), LDA, D( I ), E( I ),
-     $             TAUQ( I ), TAUP( I ), WORK, IINFO )
-      WORK( 1 ) = WS
-      RETURN
-*
-*     End of ZGEBRD
-*
-      END
--- a/libcruft/lapack/zgecon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,193 +0,0 @@
-      SUBROUTINE ZGECON( NORM, N, A, LDA, ANORM, RCOND, WORK, RWORK,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call ZLACN2 in place of ZLACON, 10 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            INFO, LDA, N
-      DOUBLE PRECISION   ANORM, RCOND
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   RWORK( * )
-      COMPLEX*16         A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGECON estimates the reciprocal of the condition number of a general
-*  complex matrix A, in either the 1-norm or the infinity-norm, using
-*  the LU factorization computed by ZGETRF.
-*
-*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
-*  condition number is computed as
-*     RCOND = 1 / ( norm(A) * norm(inv(A)) ).
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies whether the 1-norm condition number or the
-*          infinity-norm condition number is required:
-*          = '1' or 'O':  1-norm;
-*          = 'I':         Infinity-norm.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input) COMPLEX*16 array, dimension (LDA,N)
-*          The factors L and U from the factorization A = P*L*U
-*          as computed by ZGETRF.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  ANORM   (input) DOUBLE PRECISION
-*          If NORM = '1' or 'O', the 1-norm of the original matrix A.
-*          If NORM = 'I', the infinity-norm of the original matrix A.
-*
-*  RCOND   (output) DOUBLE PRECISION
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(norm(A) * norm(inv(A))).
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (2*N)
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (2*N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ONENRM
-      CHARACTER          NORMIN
-      INTEGER            IX, KASE, KASE1
-      DOUBLE PRECISION   AINVNM, SCALE, SL, SMLNUM, SU
-      COMPLEX*16         ZDUM
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IZAMAX
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           LSAME, IZAMAX, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZDRSCL, ZLACN2, ZLATRS
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DIMAG, MAX
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' )
-      IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( ANORM.LT.ZERO ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGECON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      RCOND = ZERO
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      ELSE IF( ANORM.EQ.ZERO ) THEN
-         RETURN
-      END IF
-*
-      SMLNUM = DLAMCH( 'Safe minimum' )
-*
-*     Estimate the norm of inv(A).
-*
-      AINVNM = ZERO
-      NORMIN = 'N'
-      IF( ONENRM ) THEN
-         KASE1 = 1
-      ELSE
-         KASE1 = 2
-      END IF
-      KASE = 0
-   10 CONTINUE
-      CALL ZLACN2( N, WORK( N+1 ), WORK, AINVNM, KASE, ISAVE )
-      IF( KASE.NE.0 ) THEN
-         IF( KASE.EQ.KASE1 ) THEN
-*
-*           Multiply by inv(L).
-*
-            CALL ZLATRS( 'Lower', 'No transpose', 'Unit', NORMIN, N, A,
-     $                   LDA, WORK, SL, RWORK, INFO )
-*
-*           Multiply by inv(U).
-*
-            CALL ZLATRS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   A, LDA, WORK, SU, RWORK( N+1 ), INFO )
-         ELSE
-*
-*           Multiply by inv(U').
-*
-            CALL ZLATRS( 'Upper', 'Conjugate transpose', 'Non-unit',
-     $                   NORMIN, N, A, LDA, WORK, SU, RWORK( N+1 ),
-     $                   INFO )
-*
-*           Multiply by inv(L').
-*
-            CALL ZLATRS( 'Lower', 'Conjugate transpose', 'Unit', NORMIN,
-     $                   N, A, LDA, WORK, SL, RWORK, INFO )
-         END IF
-*
-*        Divide X by 1/(SL*SU) if doing so will not cause overflow.
-*
-         SCALE = SL*SU
-         NORMIN = 'Y'
-         IF( SCALE.NE.ONE ) THEN
-            IX = IZAMAX( N, WORK, 1 )
-            IF( SCALE.LT.CABS1( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
-     $         GO TO 20
-            CALL ZDRSCL( N, SCALE, WORK, 1 )
-         END IF
-         GO TO 10
-      END IF
-*
-*     Compute the estimate of the reciprocal condition number.
-*
-      IF( AINVNM.NE.ZERO )
-     $   RCOND = ( ONE / AINVNM ) / ANORM
-*
-   20 CONTINUE
-      RETURN
-*
-*     End of ZGECON
-*
-      END
--- a/libcruft/lapack/zgeesx.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,384 +0,0 @@
-      SUBROUTINE ZGEESX( JOBVS, SORT, SELECT, SENSE, N, A, LDA, SDIM, W,
-     $                   VS, LDVS, RCONDE, RCONDV, WORK, LWORK, RWORK,
-     $                   BWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBVS, SENSE, SORT
-      INTEGER            INFO, LDA, LDVS, LWORK, N, SDIM
-      DOUBLE PRECISION   RCONDE, RCONDV
-*     ..
-*     .. Array Arguments ..
-      LOGICAL            BWORK( * )
-      DOUBLE PRECISION   RWORK( * )
-      COMPLEX*16         A( LDA, * ), VS( LDVS, * ), W( * ), WORK( * )
-*     ..
-*     .. Function Arguments ..
-      LOGICAL            SELECT
-      EXTERNAL           SELECT
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGEESX computes for an N-by-N complex nonsymmetric matrix A, the
-*  eigenvalues, the Schur form T, and, optionally, the matrix of Schur
-*  vectors Z.  This gives the Schur factorization A = Z*T*(Z**H).
-*
-*  Optionally, it also orders the eigenvalues on the diagonal of the
-*  Schur form so that selected eigenvalues are at the top left;
-*  computes a reciprocal condition number for the average of the
-*  selected eigenvalues (RCONDE); and computes a reciprocal condition
-*  number for the right invariant subspace corresponding to the
-*  selected eigenvalues (RCONDV).  The leading columns of Z form an
-*  orthonormal basis for this invariant subspace.
-*
-*  For further explanation of the reciprocal condition numbers RCONDE
-*  and RCONDV, see Section 4.10 of the LAPACK Users' Guide (where
-*  these quantities are called s and sep respectively).
-*
-*  A complex matrix is in Schur form if it is upper triangular.
-*
-*  Arguments
-*  =========
-*
-*  JOBVS   (input) CHARACTER*1
-*          = 'N': Schur vectors are not computed;
-*          = 'V': Schur vectors are computed.
-*
-*  SORT    (input) CHARACTER*1
-*          Specifies whether or not to order the eigenvalues on the
-*          diagonal of the Schur form.
-*          = 'N': Eigenvalues are not ordered;
-*          = 'S': Eigenvalues are ordered (see SELECT).
-*
-*  SELECT  (external procedure) LOGICAL FUNCTION of one COMPLEX*16 argument
-*          SELECT must be declared EXTERNAL in the calling subroutine.
-*          If SORT = 'S', SELECT is used to select eigenvalues to order
-*          to the top left of the Schur form.
-*          If SORT = 'N', SELECT is not referenced.
-*          An eigenvalue W(j) is selected if SELECT(W(j)) is true.
-*
-*  SENSE   (input) CHARACTER*1
-*          Determines which reciprocal condition numbers are computed.
-*          = 'N': None are computed;
-*          = 'E': Computed for average of selected eigenvalues only;
-*          = 'V': Computed for selected right invariant subspace only;
-*          = 'B': Computed for both.
-*          If SENSE = 'E', 'V' or 'B', SORT must equal 'S'.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A. N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA, N)
-*          On entry, the N-by-N matrix A.
-*          On exit, A is overwritten by its Schur form T.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  SDIM    (output) INTEGER
-*          If SORT = 'N', SDIM = 0.
-*          If SORT = 'S', SDIM = number of eigenvalues for which
-*                         SELECT is true.
-*
-*  W       (output) COMPLEX*16 array, dimension (N)
-*          W contains the computed eigenvalues, in the same order
-*          that they appear on the diagonal of the output Schur form T.
-*
-*  VS      (output) COMPLEX*16 array, dimension (LDVS,N)
-*          If JOBVS = 'V', VS contains the unitary matrix Z of Schur
-*          vectors.
-*          If JOBVS = 'N', VS is not referenced.
-*
-*  LDVS    (input) INTEGER
-*          The leading dimension of the array VS.  LDVS >= 1, and if
-*          JOBVS = 'V', LDVS >= N.
-*
-*  RCONDE  (output) DOUBLE PRECISION
-*          If SENSE = 'E' or 'B', RCONDE contains the reciprocal
-*          condition number for the average of the selected eigenvalues.
-*          Not referenced if SENSE = 'N' or 'V'.
-*
-*  RCONDV  (output) DOUBLE PRECISION
-*          If SENSE = 'V' or 'B', RCONDV contains the reciprocal
-*          condition number for the selected right invariant subspace.
-*          Not referenced if SENSE = 'N' or 'E'.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,2*N).
-*          Also, if SENSE = 'E' or 'V' or 'B', LWORK >= 2*SDIM*(N-SDIM),
-*          where SDIM is the number of selected eigenvalues computed by
-*          this routine.  Note that 2*SDIM*(N-SDIM) <= N*N/2. Note also
-*          that an error is only returned if LWORK < max(1,2*N), but if
-*          SENSE = 'E' or 'V' or 'B' this may not be large enough.
-*          For good performance, LWORK must generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates upper bound on the optimal size of the
-*          array WORK, returns this value as the first entry of the WORK
-*          array, and no error message related to LWORK is issued by
-*          XERBLA.
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (N)
-*
-*  BWORK   (workspace) LOGICAL array, dimension (N)
-*          Not referenced if SORT = 'N'.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value.
-*          > 0: if INFO = i, and i is
-*             <= N: the QR algorithm failed to compute all the
-*                   eigenvalues; elements 1:ILO-1 and i+1:N of W
-*                   contain those eigenvalues which have converged; if
-*                   JOBVS = 'V', VS contains the transformation which
-*                   reduces A to its partially converged Schur form.
-*             = N+1: the eigenvalues could not be reordered because some
-*                   eigenvalues were too close to separate (the problem
-*                   is very ill-conditioned);
-*             = N+2: after reordering, roundoff changed values of some
-*                   complex eigenvalues so that leading eigenvalues in
-*                   the Schur form no longer satisfy SELECT=.TRUE.  This
-*                   could also be caused by underflow due to scaling.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            SCALEA, WANTSB, WANTSE, WANTSN, WANTST, WANTSV,
-     $                   WANTVS
-      INTEGER            HSWORK, I, IBAL, ICOND, IERR, IEVAL, IHI, ILO,
-     $                   ITAU, IWRK, LWRK, MAXWRK, MINWRK
-      DOUBLE PRECISION   ANRM, BIGNUM, CSCALE, EPS, SMLNUM
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   DUM( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLABAD, DLASCL, XERBLA, ZCOPY, ZGEBAK, ZGEBAL,
-     $                   ZGEHRD, ZHSEQR, ZLACPY, ZLASCL, ZTRSEN, ZUNGHR
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      DOUBLE PRECISION   DLAMCH, ZLANGE
-      EXTERNAL           LSAME, ILAENV, DLAMCH, ZLANGE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      WANTVS = LSAME( JOBVS, 'V' )
-      WANTST = LSAME( SORT, 'S' )
-      WANTSN = LSAME( SENSE, 'N' )
-      WANTSE = LSAME( SENSE, 'E' )
-      WANTSV = LSAME( SENSE, 'V' )
-      WANTSB = LSAME( SENSE, 'B' )
-      IF( ( .NOT.WANTVS ) .AND. ( .NOT.LSAME( JOBVS, 'N' ) ) ) THEN
-         INFO = -1
-      ELSE IF( ( .NOT.WANTST ) .AND. ( .NOT.LSAME( SORT, 'N' ) ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.( WANTSN .OR. WANTSE .OR. WANTSV .OR. WANTSB ) .OR.
-     $         ( .NOT.WANTST .AND. .NOT.WANTSN ) ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDVS.LT.1 .OR. ( WANTVS .AND. LDVS.LT.N ) ) THEN
-         INFO = -11
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of real workspace needed at that point in the
-*       code, as well as the preferred amount for good performance.
-*       CWorkspace refers to complex workspace, and RWorkspace to real
-*       workspace. NB refers to the optimal block size for the
-*       immediately following subroutine, as returned by ILAENV.
-*       HSWORK refers to the workspace preferred by ZHSEQR, as
-*       calculated below. HSWORK is computed assuming ILO=1 and IHI=N,
-*       the worst case.
-*       If SENSE = 'E', 'V' or 'B', then the amount of workspace needed
-*       depends on SDIM, which is computed by the routine ZTRSEN later
-*       in the code.)
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( N.EQ.0 ) THEN
-            MINWRK = 1
-            LWRK = 1
-         ELSE
-            MAXWRK = N + N*ILAENV( 1, 'ZGEHRD', ' ', N, 1, N, 0 )
-            MINWRK = 2*N
-*
-            CALL ZHSEQR( 'S', JOBVS, N, 1, N, A, LDA, W, VS, LDVS,
-     $             WORK, -1, IEVAL )
-            HSWORK = WORK( 1 )
-*
-            IF( .NOT.WANTVS ) THEN
-               MAXWRK = MAX( MAXWRK, HSWORK )
-            ELSE
-               MAXWRK = MAX( MAXWRK, N + ( N - 1 )*ILAENV( 1, 'ZUNGHR',
-     $                       ' ', N, 1, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, HSWORK )
-            END IF
-            LWRK = MAXWRK
-            IF( .NOT.WANTSN )
-     $         LWRK = MAX( LWRK, ( N*N )/2 )
-         END IF
-         WORK( 1 ) = LWRK
-*
-         IF( LWORK.LT.MINWRK ) THEN
-            INFO = -15
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGEESX', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         SDIM = 0
-         RETURN
-      END IF
-*
-*     Get machine constants
-*
-      EPS = DLAMCH( 'P' )
-      SMLNUM = DLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SQRT( SMLNUM ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = ZLANGE( 'M', N, N, A, LDA, DUM )
-      SCALEA = .FALSE.
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-         SCALEA = .TRUE.
-         CSCALE = SMLNUM
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-         SCALEA = .TRUE.
-         CSCALE = BIGNUM
-      END IF
-      IF( SCALEA )
-     $   CALL ZLASCL( 'G', 0, 0, ANRM, CSCALE, N, N, A, LDA, IERR )
-*
-*
-*     Permute the matrix to make it more nearly triangular
-*     (CWorkspace: none)
-*     (RWorkspace: need N)
-*
-      IBAL = 1
-      CALL ZGEBAL( 'P', N, A, LDA, ILO, IHI, RWORK( IBAL ), IERR )
-*
-*     Reduce to upper Hessenberg form
-*     (CWorkspace: need 2*N, prefer N+N*NB)
-*     (RWorkspace: none)
-*
-      ITAU = 1
-      IWRK = N + ITAU
-      CALL ZGEHRD( N, ILO, IHI, A, LDA, WORK( ITAU ), WORK( IWRK ),
-     $             LWORK-IWRK+1, IERR )
-*
-      IF( WANTVS ) THEN
-*
-*        Copy Householder vectors to VS
-*
-         CALL ZLACPY( 'L', N, N, A, LDA, VS, LDVS )
-*
-*        Generate unitary matrix in VS
-*        (CWorkspace: need 2*N-1, prefer N+(N-1)*NB)
-*        (RWorkspace: none)
-*
-         CALL ZUNGHR( N, ILO, IHI, VS, LDVS, WORK( ITAU ), WORK( IWRK ),
-     $                LWORK-IWRK+1, IERR )
-      END IF
-*
-      SDIM = 0
-*
-*     Perform QR iteration, accumulating Schur vectors in VS if desired
-*     (CWorkspace: need 1, prefer HSWORK (see comments) )
-*     (RWorkspace: none)
-*
-      IWRK = ITAU
-      CALL ZHSEQR( 'S', JOBVS, N, ILO, IHI, A, LDA, W, VS, LDVS,
-     $             WORK( IWRK ), LWORK-IWRK+1, IEVAL )
-      IF( IEVAL.GT.0 )
-     $   INFO = IEVAL
-*
-*     Sort eigenvalues if desired
-*
-      IF( WANTST .AND. INFO.EQ.0 ) THEN
-         IF( SCALEA )
-     $      CALL ZLASCL( 'G', 0, 0, CSCALE, ANRM, N, 1, W, N, IERR )
-         DO 10 I = 1, N
-            BWORK( I ) = SELECT( W( I ) )
-   10    CONTINUE
-*
-*        Reorder eigenvalues, transform Schur vectors, and compute
-*        reciprocal condition numbers
-*        (CWorkspace: if SENSE is not 'N', need 2*SDIM*(N-SDIM)
-*                     otherwise, need none )
-*        (RWorkspace: none)
-*
-         CALL ZTRSEN( SENSE, JOBVS, BWORK, N, A, LDA, VS, LDVS, W, SDIM,
-     $                RCONDE, RCONDV, WORK( IWRK ), LWORK-IWRK+1,
-     $                ICOND )
-         IF( .NOT.WANTSN )
-     $      MAXWRK = MAX( MAXWRK, 2*SDIM*( N-SDIM ) )
-         IF( ICOND.EQ.-14 ) THEN
-*
-*           Not enough complex workspace
-*
-            INFO = -15
-         END IF
-      END IF
-*
-      IF( WANTVS ) THEN
-*
-*        Undo balancing
-*        (CWorkspace: none)
-*        (RWorkspace: need N)
-*
-         CALL ZGEBAK( 'P', 'R', N, ILO, IHI, RWORK( IBAL ), N, VS, LDVS,
-     $                IERR )
-      END IF
-*
-      IF( SCALEA ) THEN
-*
-*        Undo scaling for the Schur form of A
-*
-         CALL ZLASCL( 'U', 0, 0, CSCALE, ANRM, N, N, A, LDA, IERR )
-         CALL ZCOPY( N, A, LDA+1, W, 1 )
-         IF( ( WANTSV .OR. WANTSB ) .AND. INFO.EQ.0 ) THEN
-            DUM( 1 ) = RCONDV
-            CALL DLASCL( 'G', 0, 0, CSCALE, ANRM, 1, 1, DUM, 1, IERR )
-            RCONDV = DUM( 1 )
-         END IF
-      END IF
-*
-      WORK( 1 ) = MAXWRK
-      RETURN
-*
-*     End of ZGEESX
-*
-      END
--- a/libcruft/lapack/zgeev.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,396 +0,0 @@
-      SUBROUTINE ZGEEV( JOBVL, JOBVR, N, A, LDA, W, VL, LDVL, VR, LDVR,
-     $                  WORK, LWORK, RWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBVL, JOBVR
-      INTEGER            INFO, LDA, LDVL, LDVR, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   RWORK( * )
-      COMPLEX*16         A( LDA, * ), VL( LDVL, * ), VR( LDVR, * ),
-     $                   W( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGEEV computes for an N-by-N complex nonsymmetric matrix A, the
-*  eigenvalues and, optionally, the left and/or right eigenvectors.
-*
-*  The right eigenvector v(j) of A satisfies
-*                   A * v(j) = lambda(j) * v(j)
-*  where lambda(j) is its eigenvalue.
-*  The left eigenvector u(j) of A satisfies
-*                u(j)**H * A = lambda(j) * u(j)**H
-*  where u(j)**H denotes the conjugate transpose of u(j).
-*
-*  The computed eigenvectors are normalized to have Euclidean norm
-*  equal to 1 and largest component real.
-*
-*  Arguments
-*  =========
-*
-*  JOBVL   (input) CHARACTER*1
-*          = 'N': left eigenvectors of A are not computed;
-*          = 'V': left eigenvectors of are computed.
-*
-*  JOBVR   (input) CHARACTER*1
-*          = 'N': right eigenvectors of A are not computed;
-*          = 'V': right eigenvectors of A are computed.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A. N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the N-by-N matrix A.
-*          On exit, A has been overwritten.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  W       (output) COMPLEX*16 array, dimension (N)
-*          W contains the computed eigenvalues.
-*
-*  VL      (output) COMPLEX*16 array, dimension (LDVL,N)
-*          If JOBVL = 'V', the left eigenvectors u(j) are stored one
-*          after another in the columns of VL, in the same order
-*          as their eigenvalues.
-*          If JOBVL = 'N', VL is not referenced.
-*          u(j) = VL(:,j), the j-th column of VL.
-*
-*  LDVL    (input) INTEGER
-*          The leading dimension of the array VL.  LDVL >= 1; if
-*          JOBVL = 'V', LDVL >= N.
-*
-*  VR      (output) COMPLEX*16 array, dimension (LDVR,N)
-*          If JOBVR = 'V', the right eigenvectors v(j) are stored one
-*          after another in the columns of VR, in the same order
-*          as their eigenvalues.
-*          If JOBVR = 'N', VR is not referenced.
-*          v(j) = VR(:,j), the j-th column of VR.
-*
-*  LDVR    (input) INTEGER
-*          The leading dimension of the array VR.  LDVR >= 1; if
-*          JOBVR = 'V', LDVR >= N.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,2*N).
-*          For good performance, LWORK must generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (2*N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if INFO = i, the QR algorithm failed to compute all the
-*                eigenvalues, and no eigenvectors have been computed;
-*                elements and i+1:N of W contain eigenvalues which have
-*                converged.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, SCALEA, WANTVL, WANTVR
-      CHARACTER          SIDE
-      INTEGER            HSWORK, I, IBAL, IERR, IHI, ILO, IRWORK, ITAU,
-     $                   IWRK, K, MAXWRK, MINWRK, NOUT
-      DOUBLE PRECISION   ANRM, BIGNUM, CSCALE, EPS, SCL, SMLNUM
-      COMPLEX*16         TMP
-*     ..
-*     .. Local Arrays ..
-      LOGICAL            SELECT( 1 )
-      DOUBLE PRECISION   DUM( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLABAD, XERBLA, ZDSCAL, ZGEBAK, ZGEBAL, ZGEHRD,
-     $                   ZHSEQR, ZLACPY, ZLASCL, ZSCAL, ZTREVC, ZUNGHR
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IDAMAX, ILAENV
-      DOUBLE PRECISION   DLAMCH, DZNRM2, ZLANGE
-      EXTERNAL           LSAME, IDAMAX, ILAENV, DLAMCH, DZNRM2, ZLANGE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, DCMPLX, DCONJG, DIMAG, MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      WANTVL = LSAME( JOBVL, 'V' )
-      WANTVR = LSAME( JOBVR, 'V' )
-      IF( ( .NOT.WANTVL ) .AND. ( .NOT.LSAME( JOBVL, 'N' ) ) ) THEN
-         INFO = -1
-      ELSE IF( ( .NOT.WANTVR ) .AND. ( .NOT.LSAME( JOBVR, 'N' ) ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDVL.LT.1 .OR. ( WANTVL .AND. LDVL.LT.N ) ) THEN
-         INFO = -8
-      ELSE IF( LDVR.LT.1 .OR. ( WANTVR .AND. LDVR.LT.N ) ) THEN
-         INFO = -10
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of workspace needed at that point in the code,
-*       as well as the preferred amount for good performance.
-*       CWorkspace refers to complex workspace, and RWorkspace to real
-*       workspace. NB refers to the optimal block size for the
-*       immediately following subroutine, as returned by ILAENV.
-*       HSWORK refers to the workspace preferred by ZHSEQR, as
-*       calculated below. HSWORK is computed assuming ILO=1 and IHI=N,
-*       the worst case.)
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( N.EQ.0 ) THEN
-            MINWRK = 1
-            MAXWRK = 1
-         ELSE
-            MAXWRK = N + N*ILAENV( 1, 'ZGEHRD', ' ', N, 1, N, 0 )
-            MINWRK = 2*N
-            IF( WANTVL ) THEN
-               MAXWRK = MAX( MAXWRK, N + ( N - 1 )*ILAENV( 1, 'ZUNGHR',
-     $                       ' ', N, 1, N, -1 ) )
-               CALL ZHSEQR( 'S', 'V', N, 1, N, A, LDA, W, VL, LDVL,
-     $                WORK, -1, INFO )
-            ELSE IF( WANTVR ) THEN
-               MAXWRK = MAX( MAXWRK, N + ( N - 1 )*ILAENV( 1, 'ZUNGHR',
-     $                       ' ', N, 1, N, -1 ) )
-               CALL ZHSEQR( 'S', 'V', N, 1, N, A, LDA, W, VR, LDVR,
-     $                WORK, -1, INFO )
-            ELSE
-               CALL ZHSEQR( 'E', 'N', N, 1, N, A, LDA, W, VR, LDVR,
-     $                WORK, -1, INFO )
-            END IF
-            HSWORK = WORK( 1 )
-            MAXWRK = MAX( MAXWRK, HSWORK, MINWRK )
-         END IF
-         WORK( 1 ) = MAXWRK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
-            INFO = -12
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGEEV ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Get machine constants
-*
-      EPS = DLAMCH( 'P' )
-      SMLNUM = DLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SQRT( SMLNUM ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = ZLANGE( 'M', N, N, A, LDA, DUM )
-      SCALEA = .FALSE.
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-         SCALEA = .TRUE.
-         CSCALE = SMLNUM
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-         SCALEA = .TRUE.
-         CSCALE = BIGNUM
-      END IF
-      IF( SCALEA )
-     $   CALL ZLASCL( 'G', 0, 0, ANRM, CSCALE, N, N, A, LDA, IERR )
-*
-*     Balance the matrix
-*     (CWorkspace: none)
-*     (RWorkspace: need N)
-*
-      IBAL = 1
-      CALL ZGEBAL( 'B', N, A, LDA, ILO, IHI, RWORK( IBAL ), IERR )
-*
-*     Reduce to upper Hessenberg form
-*     (CWorkspace: need 2*N, prefer N+N*NB)
-*     (RWorkspace: none)
-*
-      ITAU = 1
-      IWRK = ITAU + N
-      CALL ZGEHRD( N, ILO, IHI, A, LDA, WORK( ITAU ), WORK( IWRK ),
-     $             LWORK-IWRK+1, IERR )
-*
-      IF( WANTVL ) THEN
-*
-*        Want left eigenvectors
-*        Copy Householder vectors to VL
-*
-         SIDE = 'L'
-         CALL ZLACPY( 'L', N, N, A, LDA, VL, LDVL )
-*
-*        Generate unitary matrix in VL
-*        (CWorkspace: need 2*N-1, prefer N+(N-1)*NB)
-*        (RWorkspace: none)
-*
-         CALL ZUNGHR( N, ILO, IHI, VL, LDVL, WORK( ITAU ), WORK( IWRK ),
-     $                LWORK-IWRK+1, IERR )
-*
-*        Perform QR iteration, accumulating Schur vectors in VL
-*        (CWorkspace: need 1, prefer HSWORK (see comments) )
-*        (RWorkspace: none)
-*
-         IWRK = ITAU
-         CALL ZHSEQR( 'S', 'V', N, ILO, IHI, A, LDA, W, VL, LDVL,
-     $                WORK( IWRK ), LWORK-IWRK+1, INFO )
-*
-         IF( WANTVR ) THEN
-*
-*           Want left and right eigenvectors
-*           Copy Schur vectors to VR
-*
-            SIDE = 'B'
-            CALL ZLACPY( 'F', N, N, VL, LDVL, VR, LDVR )
-         END IF
-*
-      ELSE IF( WANTVR ) THEN
-*
-*        Want right eigenvectors
-*        Copy Householder vectors to VR
-*
-         SIDE = 'R'
-         CALL ZLACPY( 'L', N, N, A, LDA, VR, LDVR )
-*
-*        Generate unitary matrix in VR
-*        (CWorkspace: need 2*N-1, prefer N+(N-1)*NB)
-*        (RWorkspace: none)
-*
-         CALL ZUNGHR( N, ILO, IHI, VR, LDVR, WORK( ITAU ), WORK( IWRK ),
-     $                LWORK-IWRK+1, IERR )
-*
-*        Perform QR iteration, accumulating Schur vectors in VR
-*        (CWorkspace: need 1, prefer HSWORK (see comments) )
-*        (RWorkspace: none)
-*
-         IWRK = ITAU
-         CALL ZHSEQR( 'S', 'V', N, ILO, IHI, A, LDA, W, VR, LDVR,
-     $                WORK( IWRK ), LWORK-IWRK+1, INFO )
-*
-      ELSE
-*
-*        Compute eigenvalues only
-*        (CWorkspace: need 1, prefer HSWORK (see comments) )
-*        (RWorkspace: none)
-*
-         IWRK = ITAU
-         CALL ZHSEQR( 'E', 'N', N, ILO, IHI, A, LDA, W, VR, LDVR,
-     $                WORK( IWRK ), LWORK-IWRK+1, INFO )
-      END IF
-*
-*     If INFO > 0 from ZHSEQR, then quit
-*
-      IF( INFO.GT.0 )
-     $   GO TO 50
-*
-      IF( WANTVL .OR. WANTVR ) THEN
-*
-*        Compute left and/or right eigenvectors
-*        (CWorkspace: need 2*N)
-*        (RWorkspace: need 2*N)
-*
-         IRWORK = IBAL + N
-         CALL ZTREVC( SIDE, 'B', SELECT, N, A, LDA, VL, LDVL, VR, LDVR,
-     $                N, NOUT, WORK( IWRK ), RWORK( IRWORK ), IERR )
-      END IF
-*
-      IF( WANTVL ) THEN
-*
-*        Undo balancing of left eigenvectors
-*        (CWorkspace: none)
-*        (RWorkspace: need N)
-*
-         CALL ZGEBAK( 'B', 'L', N, ILO, IHI, RWORK( IBAL ), N, VL, LDVL,
-     $                IERR )
-*
-*        Normalize left eigenvectors and make largest component real
-*
-         DO 20 I = 1, N
-            SCL = ONE / DZNRM2( N, VL( 1, I ), 1 )
-            CALL ZDSCAL( N, SCL, VL( 1, I ), 1 )
-            DO 10 K = 1, N
-               RWORK( IRWORK+K-1 ) = DBLE( VL( K, I ) )**2 +
-     $                               DIMAG( VL( K, I ) )**2
-   10       CONTINUE
-            K = IDAMAX( N, RWORK( IRWORK ), 1 )
-            TMP = DCONJG( VL( K, I ) ) / SQRT( RWORK( IRWORK+K-1 ) )
-            CALL ZSCAL( N, TMP, VL( 1, I ), 1 )
-            VL( K, I ) = DCMPLX( DBLE( VL( K, I ) ), ZERO )
-   20    CONTINUE
-      END IF
-*
-      IF( WANTVR ) THEN
-*
-*        Undo balancing of right eigenvectors
-*        (CWorkspace: none)
-*        (RWorkspace: need N)
-*
-         CALL ZGEBAK( 'B', 'R', N, ILO, IHI, RWORK( IBAL ), N, VR, LDVR,
-     $                IERR )
-*
-*        Normalize right eigenvectors and make largest component real
-*
-         DO 40 I = 1, N
-            SCL = ONE / DZNRM2( N, VR( 1, I ), 1 )
-            CALL ZDSCAL( N, SCL, VR( 1, I ), 1 )
-            DO 30 K = 1, N
-               RWORK( IRWORK+K-1 ) = DBLE( VR( K, I ) )**2 +
-     $                               DIMAG( VR( K, I ) )**2
-   30       CONTINUE
-            K = IDAMAX( N, RWORK( IRWORK ), 1 )
-            TMP = DCONJG( VR( K, I ) ) / SQRT( RWORK( IRWORK+K-1 ) )
-            CALL ZSCAL( N, TMP, VR( 1, I ), 1 )
-            VR( K, I ) = DCMPLX( DBLE( VR( K, I ) ), ZERO )
-   40    CONTINUE
-      END IF
-*
-*     Undo scaling if necessary
-*
-   50 CONTINUE
-      IF( SCALEA ) THEN
-         CALL ZLASCL( 'G', 0, 0, CSCALE, ANRM, N-INFO, 1, W( INFO+1 ),
-     $                MAX( N-INFO, 1 ), IERR )
-         IF( INFO.GT.0 ) THEN
-            CALL ZLASCL( 'G', 0, 0, CSCALE, ANRM, ILO-1, 1, W, N, IERR )
-         END IF
-      END IF
-*
-      WORK( 1 ) = MAXWRK
-      RETURN
-*
-*     End of ZGEEV
-*
-      END
--- a/libcruft/lapack/zgehd2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-      SUBROUTINE ZGEHD2( N, ILO, IHI, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, ILO, INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGEHD2 reduces a complex general matrix A to upper Hessenberg form H
-*  by a unitary similarity transformation:  Q' * A * Q = H .
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          It is assumed that A is already upper triangular in rows
-*          and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally
-*          set by a previous call to ZGEBAL; otherwise they should be
-*          set to 1 and N respectively. See Further Details.
-*          1 <= ILO <= IHI <= max(1,N).
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the n by n general matrix to be reduced.
-*          On exit, the upper triangle and the first subdiagonal of A
-*          are overwritten with the upper Hessenberg matrix H, and the
-*          elements below the first subdiagonal, with the array TAU,
-*          represent the unitary matrix Q as a product of elementary
-*          reflectors. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  TAU     (output) COMPLEX*16 array, dimension (N-1)
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of (ihi-ilo) elementary
-*  reflectors
-*
-*     Q = H(ilo) H(ilo+1) . . . H(ihi-1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i) = 0, v(i+1) = 1 and v(ihi+1:n) = 0; v(i+2:ihi) is stored on
-*  exit in A(i+2:ihi,i), and tau in TAU(i).
-*
-*  The contents of A are illustrated by the following example, with
-*  n = 7, ilo = 2 and ihi = 6:
-*
-*  on entry,                        on exit,
-*
-*  ( a   a   a   a   a   a   a )    (  a   a   h   h   h   h   a )
-*  (     a   a   a   a   a   a )    (      a   h   h   h   h   a )
-*  (     a   a   a   a   a   a )    (      h   h   h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  h   h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  v3  h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  v3  v4  h   h   h )
-*  (                         a )    (                          a )
-*
-*  where a denotes an element of the original matrix A, h denotes a
-*  modified element of the upper Hessenberg matrix H, and vi denotes an
-*  element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      COMPLEX*16         ALPHA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLARF, ZLARFG
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -2
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGEHD2', -INFO )
-         RETURN
-      END IF
-*
-      DO 10 I = ILO, IHI - 1
-*
-*        Compute elementary reflector H(i) to annihilate A(i+2:ihi,i)
-*
-         ALPHA = A( I+1, I )
-         CALL ZLARFG( IHI-I, ALPHA, A( MIN( I+2, N ), I ), 1, TAU( I ) )
-         A( I+1, I ) = ONE
-*
-*        Apply H(i) to A(1:ihi,i+1:ihi) from the right
-*
-         CALL ZLARF( 'Right', IHI, IHI-I, A( I+1, I ), 1, TAU( I ),
-     $               A( 1, I+1 ), LDA, WORK )
-*
-*        Apply H(i)' to A(i+1:ihi,i+1:n) from the left
-*
-         CALL ZLARF( 'Left', IHI-I, N-I, A( I+1, I ), 1,
-     $               DCONJG( TAU( I ) ), A( I+1, I+1 ), LDA, WORK )
-*
-         A( I+1, I ) = ALPHA
-   10 CONTINUE
-*
-      RETURN
-*
-*     End of ZGEHD2
-*
-      END
--- a/libcruft/lapack/zgehrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,273 +0,0 @@
-      SUBROUTINE ZGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, ILO, INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16        A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGEHRD reduces a complex general matrix A to upper Hessenberg form H by
-*  an unitary similarity transformation:  Q' * A * Q = H .
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          It is assumed that A is already upper triangular in rows
-*          and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally
-*          set by a previous call to ZGEBAL; otherwise they should be
-*          set to 1 and N respectively. See Further Details.
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the N-by-N general matrix to be reduced.
-*          On exit, the upper triangle and the first subdiagonal of A
-*          are overwritten with the upper Hessenberg matrix H, and the
-*          elements below the first subdiagonal, with the array TAU,
-*          represent the unitary matrix Q as a product of elementary
-*          reflectors. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  TAU     (output) COMPLEX*16 array, dimension (N-1)
-*          The scalar factors of the elementary reflectors (see Further
-*          Details). Elements 1:ILO-1 and IHI:N-1 of TAU are set to
-*          zero.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (LWORK)
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The length of the array WORK.  LWORK >= max(1,N).
-*          For optimum performance LWORK >= N*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of (ihi-ilo) elementary
-*  reflectors
-*
-*     Q = H(ilo) H(ilo+1) . . . H(ihi-1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i) = 0, v(i+1) = 1 and v(ihi+1:n) = 0; v(i+2:ihi) is stored on
-*  exit in A(i+2:ihi,i), and tau in TAU(i).
-*
-*  The contents of A are illustrated by the following example, with
-*  n = 7, ilo = 2 and ihi = 6:
-*
-*  on entry,                        on exit,
-*
-*  ( a   a   a   a   a   a   a )    (  a   a   h   h   h   h   a )
-*  (     a   a   a   a   a   a )    (      a   h   h   h   h   a )
-*  (     a   a   a   a   a   a )    (      h   h   h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  h   h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  v3  h   h   h   h )
-*  (     a   a   a   a   a   a )    (      v2  v3  v4  h   h   h )
-*  (                         a )    (                          a )
-*
-*  where a denotes an element of the original matrix A, h denotes a
-*  modified element of the upper Hessenberg matrix H, and vi denotes an
-*  element of the vector defining H(i).
-*
-*  This file is a slight modification of LAPACK-3.0's ZGEHRD
-*  subroutine incorporating improvements proposed by Quintana-Orti and
-*  Van de Geijn (2005). 
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            NBMAX, LDT
-      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1 )
-      COMPLEX*16        ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ), 
-     $                     ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, J, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NH, NX
-      COMPLEX*16        EI
-*     ..
-*     .. Local Arrays ..
-      COMPLEX*16        T( LDT, NBMAX )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZAXPY, ZGEHD2, ZGEMM, ZLAHR2, ZLARFB, ZTRMM,
-     $                   XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      NB = MIN( NBMAX, ILAENV( 1, 'ZGEHRD', ' ', N, ILO, IHI, -1 ) )
-      LWKOPT = N*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -2
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGEHRD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Set elements 1:ILO-1 and IHI:N-1 of TAU to zero
-*
-      DO 10 I = 1, ILO - 1
-         TAU( I ) = ZERO
-   10 CONTINUE
-      DO 20 I = MAX( 1, IHI ), N - 1
-         TAU( I ) = ZERO
-   20 CONTINUE
-*
-*     Quick return if possible
-*
-      NH = IHI - ILO + 1
-      IF( NH.LE.1 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-*     Determine the block size
-*
-      NB = MIN( NBMAX, ILAENV( 1, 'ZGEHRD', ' ', N, ILO, IHI, -1 ) )
-      NBMIN = 2
-      IWS = 1
-      IF( NB.GT.1 .AND. NB.LT.NH ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code
-*        (last block is always handled by unblocked code)
-*
-         NX = MAX( NB, ILAENV( 3, 'ZGEHRD', ' ', N, ILO, IHI, -1 ) )
-         IF( NX.LT.NH ) THEN
-*
-*           Determine if workspace is large enough for blocked code
-*
-            IWS = N*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  determine the
-*              minimum value of NB, and reduce NB or force use of
-*              unblocked code
-*
-               NBMIN = MAX( 2, ILAENV( 2, 'ZGEHRD', ' ', N, ILO, IHI,
-     $                 -1 ) )
-               IF( LWORK.GE.N*NBMIN ) THEN
-                  NB = LWORK / N
-               ELSE
-                  NB = 1
-               END IF
-            END IF
-         END IF
-      END IF
-      LDWORK = N
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.NH ) THEN
-*
-*        Use unblocked code below
-*
-         I = ILO
-*
-      ELSE
-*
-*        Use blocked code
-*
-         DO 40 I = ILO, IHI - 1 - NX, NB
-            IB = MIN( NB, IHI-I )
-*
-*           Reduce columns i:i+ib-1 to Hessenberg form, returning the
-*           matrices V and T of the block reflector H = I - V*T*V'
-*           which performs the reduction, and also the matrix Y = A*V*T
-*
-            CALL ZLAHR2( IHI, I, IB, A( 1, I ), LDA, TAU( I ), T, LDT,
-     $                   WORK, LDWORK )
-*
-*           Apply the block reflector H to A(1:ihi,i+ib:ihi) from the
-*           right, computing  A := A - Y * V'. V(i+ib,ib-1) must be set
-*           to 1
-*
-            EI = A( I+IB, I+IB-1 )
-            A( I+IB, I+IB-1 ) = ONE
-            CALL ZGEMM( 'No transpose', 'Conjugate transpose', 
-     $                  IHI, IHI-I-IB+1,
-     $                  IB, -ONE, WORK, LDWORK, A( I+IB, I ), LDA, ONE,
-     $                  A( 1, I+IB ), LDA )
-            A( I+IB, I+IB-1 ) = EI
-*
-*           Apply the block reflector H to A(1:i,i+1:i+ib-1) from the
-*           right
-*
-            CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose',
-     $                  'Unit', I, IB-1,
-     $                  ONE, A( I+1, I ), LDA, WORK, LDWORK )
-            DO 30 J = 0, IB-2
-               CALL ZAXPY( I, -ONE, WORK( LDWORK*J+1 ), 1,
-     $                     A( 1, I+J+1 ), 1 )
-   30       CONTINUE
-*
-*           Apply the block reflector H to A(i+1:ihi,i+ib:n) from the
-*           left
-*
-            CALL ZLARFB( 'Left', 'Conjugate transpose', 'Forward',
-     $                   'Columnwise',
-     $                   IHI-I, N-I-IB+1, IB, A( I+1, I ), LDA, T, LDT,
-     $                   A( I+1, I+IB ), LDA, WORK, LDWORK )
-   40    CONTINUE
-      END IF
-*
-*     Use unblocked code to reduce the rest of the matrix
-*
-      CALL ZGEHD2( N, I, IHI, A, LDA, TAU, WORK, IINFO )
-      WORK( 1 ) = IWS
-*
-      RETURN
-*
-*     End of ZGEHRD
-*
-      END
--- a/libcruft/lapack/zgelq2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,123 +0,0 @@
-      SUBROUTINE ZGELQ2( M, N, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGELQ2 computes an LQ factorization of a complex m by n matrix A:
-*  A = L * Q.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the m by n matrix A.
-*          On exit, the elements on and below the diagonal of the array
-*          contain the m by min(m,n) lower trapezoidal matrix L (L is
-*          lower triangular if m <= n); the elements above the diagonal,
-*          with the array TAU, represent the unitary matrix Q as a
-*          product of elementary reflectors (see Further Details).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) COMPLEX*16 array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (M)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(k)' . . . H(2)' H(1)', where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i-1) = 0 and v(i) = 1; conjg(v(i+1:n)) is stored on exit in
-*  A(i,i+1:n), and tau in TAU(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, K
-      COMPLEX*16         ALPHA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLACGV, ZLARF, ZLARFG
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGELQ2', -INFO )
-         RETURN
-      END IF
-*
-      K = MIN( M, N )
-*
-      DO 10 I = 1, K
-*
-*        Generate elementary reflector H(i) to annihilate A(i,i+1:n)
-*
-         CALL ZLACGV( N-I+1, A( I, I ), LDA )
-         ALPHA = A( I, I )
-         CALL ZLARFG( N-I+1, ALPHA, A( I, MIN( I+1, N ) ), LDA,
-     $                TAU( I ) )
-         IF( I.LT.M ) THEN
-*
-*           Apply H(i) to A(i+1:m,i:n) from the right
-*
-            A( I, I ) = ONE
-            CALL ZLARF( 'Right', M-I, N-I+1, A( I, I ), LDA, TAU( I ),
-     $                  A( I+1, I ), LDA, WORK )
-         END IF
-         A( I, I ) = ALPHA
-         CALL ZLACGV( N-I+1, A( I, I ), LDA )
-   10 CONTINUE
-      RETURN
-*
-*     End of ZGELQ2
-*
-      END
--- a/libcruft/lapack/zgelqf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,195 +0,0 @@
-      SUBROUTINE ZGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGELQF computes an LQ factorization of a complex M-by-N matrix A:
-*  A = L * Q.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the elements on and below the diagonal of the array
-*          contain the m-by-min(m,n) lower trapezoidal matrix L (L is
-*          lower triangular if m <= n); the elements above the diagonal,
-*          with the array TAU, represent the unitary matrix Q as a
-*          product of elementary reflectors (see Further Details).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) COMPLEX*16 array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,M).
-*          For optimum performance LWORK >= M*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(k)' . . . H(2)' H(1)', where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i-1) = 0 and v(i) = 1; conjg(v(i+1:n)) is stored on exit in
-*  A(i,i+1:n), and tau in TAU(i).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, K, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZGELQ2, ZLARFB, ZLARFT
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NB = ILAENV( 1, 'ZGELQF', ' ', M, N, -1, -1 )
-      LWKOPT = M*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGELQF', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      K = MIN( M, N )
-      IF( K.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = M
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'ZGELQF', ' ', M, N, -1, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = M
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'ZGELQF', ' ', M, N, -1,
-     $                 -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code initially
-*
-         DO 10 I = 1, K - NX, NB
-            IB = MIN( K-I+1, NB )
-*
-*           Compute the LQ factorization of the current block
-*           A(i:i+ib-1,i:n)
-*
-            CALL ZGELQ2( IB, N-I+1, A( I, I ), LDA, TAU( I ), WORK,
-     $                   IINFO )
-            IF( I+IB.LE.M ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i) H(i+1) . . . H(i+ib-1)
-*
-               CALL ZLARFT( 'Forward', 'Rowwise', N-I+1, IB, A( I, I ),
-     $                      LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H to A(i+ib:m,i:n) from the right
-*
-               CALL ZLARFB( 'Right', 'No transpose', 'Forward',
-     $                      'Rowwise', M-I-IB+1, N-I+1, IB, A( I, I ),
-     $                      LDA, WORK, LDWORK, A( I+IB, I ), LDA,
-     $                      WORK( IB+1 ), LDWORK )
-            END IF
-   10    CONTINUE
-      ELSE
-         I = 1
-      END IF
-*
-*     Use unblocked code to factor the last or only block.
-*
-      IF( I.LE.K )
-     $   CALL ZGELQ2( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK,
-     $                IINFO )
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of ZGELQF
-*
-      END
--- a/libcruft/lapack/zgelsd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,566 +0,0 @@
-      SUBROUTINE ZGELSD( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK,
-     $                   WORK, LWORK, RWORK, IWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LDB, LWORK, M, N, NRHS, RANK
-      DOUBLE PRECISION   RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      DOUBLE PRECISION   RWORK( * ), S( * )
-      COMPLEX*16         A( LDA, * ), B( LDB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGELSD computes the minimum-norm solution to a real linear least
-*  squares problem:
-*      minimize 2-norm(| b - A*x |)
-*  using the singular value decomposition (SVD) of A. A is an M-by-N
-*  matrix which may be rank-deficient.
-*
-*  Several right hand side vectors b and solution vectors x can be
-*  handled in a single call; they are stored as the columns of the
-*  M-by-NRHS right hand side matrix B and the N-by-NRHS solution
-*  matrix X.
-*
-*  The problem is solved in three steps:
-*  (1) Reduce the coefficient matrix A to bidiagonal form with
-*      Householder tranformations, reducing the original problem
-*      into a "bidiagonal least squares problem" (BLS)
-*  (2) Solve the BLS using a divide and conquer approach.
-*  (3) Apply back all the Householder tranformations to solve
-*      the original least squares problem.
-*
-*  The effective rank of A is determined by treating as zero those
-*  singular values which are less than RCOND times the largest singular
-*  value.
-*
-*  The divide and conquer algorithm makes very mild assumptions about
-*  floating point arithmetic. It will work on machines with a guard
-*  digit in add/subtract, or on those binary machines without guard
-*  digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or
-*  Cray-2. It could conceivably fail on hexadecimal or decimal machines
-*  without guard digits, but we know of none.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrices B and X. NRHS >= 0.
-*
-*  A       (input) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, A has been destroyed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
-*          On entry, the M-by-NRHS right hand side matrix B.
-*          On exit, B is overwritten by the N-by-NRHS solution matrix X.
-*          If m >= n and RANK = n, the residual sum-of-squares for
-*          the solution in the i-th column is given by the sum of
-*          squares of the modulus of elements n+1:m in that column.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,M,N).
-*
-*  S       (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The singular values of A in decreasing order.
-*          The condition number of A in the 2-norm = S(1)/S(min(m,n)).
-*
-*  RCOND   (input) DOUBLE PRECISION
-*          RCOND is used to determine the effective rank of A.
-*          Singular values S(i) <= RCOND*S(1) are treated as zero.
-*          If RCOND < 0, machine precision is used instead.
-*
-*  RANK    (output) INTEGER
-*          The effective rank of A, i.e., the number of singular values
-*          which are greater than RCOND*S(1).
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK must be at least 1.
-*          The exact minimum amount of workspace needed depends on M,
-*          N and NRHS. As long as LWORK is at least
-*              2*N + N*NRHS
-*          if M is greater than or equal to N or
-*              2*M + M*NRHS
-*          if M is less than N, the code will execute correctly.
-*          For good performance, LWORK should generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the array WORK and the
-*          minimum sizes of the arrays RWORK and IWORK, and returns
-*          these values as the first entries of the WORK, RWORK and
-*          IWORK arrays, and no error message related to LWORK is issued
-*          by XERBLA.
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (MAX(1,LRWORK))
-*          LRWORK >=
-*              10*N + 2*N*SMLSIZ + 8*N*NLVL + 3*SMLSIZ*NRHS +
-*             (SMLSIZ+1)**2
-*          if M is greater than or equal to N or
-*             10*M + 2*M*SMLSIZ + 8*M*NLVL + 3*SMLSIZ*NRHS +
-*             (SMLSIZ+1)**2
-*          if M is less than N, the code will execute correctly.
-*          SMLSIZ is returned by ILAENV and is equal to the maximum
-*          size of the subproblems at the bottom of the computation
-*          tree (usually about 25), and
-*             NLVL = MAX( 0, INT( LOG_2( MIN( M,N )/(SMLSIZ+1) ) ) + 1 )
-*          On exit, if INFO = 0, RWORK(1) returns the minimum LRWORK.
-*
-*  IWORK   (workspace) INTEGER array, dimension (MAX(1,LIWORK))
-*          LIWORK >= max(1, 3*MINMN*NLVL + 11*MINMN),
-*          where MINMN = MIN( M,N ).
-*          On exit, if INFO = 0, IWORK(1) returns the minimum LIWORK.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  the algorithm for computing the SVD failed to converge;
-*                if INFO = i, i off-diagonal elements of an intermediate
-*                bidiagonal form did not converge to zero.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Ren-Cang Li, Computer Science Division, University of
-*       California at Berkeley, USA
-*     Osni Marques, LBNL/NERSC, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0 )
-      COMPLEX*16         CZERO
-      PARAMETER          ( CZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            IASCL, IBSCL, IE, IL, ITAU, ITAUP, ITAUQ,
-     $                   LDWORK, LIWORK, LRWORK, MAXMN, MAXWRK, MINMN,
-     $                   MINWRK, MM, MNTHR, NLVL, NRWORK, NWORK, SMLSIZ
-      DOUBLE PRECISION   ANRM, BIGNUM, BNRM, EPS, SFMIN, SMLNUM
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLABAD, DLASCL, DLASET, XERBLA, ZGEBRD, ZGELQF,
-     $                   ZGEQRF, ZLACPY, ZLALSD, ZLASCL, ZLASET, ZUNMBR,
-     $                   ZUNMLQ, ZUNMQR
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      DOUBLE PRECISION   DLAMCH, ZLANGE
-      EXTERNAL           ILAENV, DLAMCH, ZLANGE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          INT, LOG, MAX, MIN, DBLE
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments.
-*
-      INFO = 0
-      MINMN = MIN( M, N )
-      MAXMN = MAX( M, N )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, MAXMN ) ) THEN
-         INFO = -7
-      END IF
-*
-*     Compute workspace.
-*     (Note: Comments in the code beginning "Workspace:" describe the
-*     minimal amount of workspace needed at that point in the code,
-*     as well as the preferred amount for good performance.
-*     NB refers to the optimal block size for the immediately
-*     following subroutine, as returned by ILAENV.)
-*
-      IF( INFO.EQ.0 ) THEN
-         MINWRK = 1
-         MAXWRK = 1
-         LIWORK = 1
-         LRWORK = 1
-         IF( MINMN.GT.0 ) THEN
-            SMLSIZ = ILAENV( 9, 'ZGELSD', ' ', 0, 0, 0, 0 )
-            MNTHR = ILAENV( 6, 'ZGELSD', ' ', M, N, NRHS, -1 )
-            NLVL = MAX( INT( LOG( DBLE( MINMN ) / DBLE( SMLSIZ + 1 ) ) /
-     $                  LOG( TWO ) ) + 1, 0 )
-            LIWORK = 3*MINMN*NLVL + 11*MINMN
-            MM = M
-            IF( M.GE.N .AND. M.GE.MNTHR ) THEN
-*
-*              Path 1a - overdetermined, with many more rows than
-*                        columns.
-*
-               MM = N
-               MAXWRK = MAX( MAXWRK, N*ILAENV( 1, 'ZGEQRF', ' ', M, N,
-     $                       -1, -1 ) )
-               MAXWRK = MAX( MAXWRK, NRHS*ILAENV( 1, 'ZUNMQR', 'LC', M,
-     $                       NRHS, N, -1 ) )
-            END IF
-            IF( M.GE.N ) THEN
-*
-*              Path 1 - overdetermined or exactly determined.
-*
-               LRWORK = 10*N + 2*N*SMLSIZ + 8*N*NLVL + 3*SMLSIZ*NRHS +
-     $                  ( SMLSIZ + 1 )**2
-               MAXWRK = MAX( MAXWRK, 2*N + ( MM + N )*ILAENV( 1,
-     $                       'ZGEBRD', ' ', MM, N, -1, -1 ) )
-               MAXWRK = MAX( MAXWRK, 2*N + NRHS*ILAENV( 1, 'ZUNMBR',
-     $                       'QLC', MM, NRHS, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, 2*N + ( N - 1 )*ILAENV( 1,
-     $                       'ZUNMBR', 'PLN', N, NRHS, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, 2*N + N*NRHS )
-               MINWRK = MAX( 2*N + MM, 2*N + N*NRHS )
-            END IF
-            IF( N.GT.M ) THEN
-               LRWORK = 10*M + 2*M*SMLSIZ + 8*M*NLVL + 3*SMLSIZ*NRHS +
-     $                  ( SMLSIZ + 1 )**2
-               IF( N.GE.MNTHR ) THEN
-*
-*                 Path 2a - underdetermined, with many more columns
-*                           than rows.
-*
-                  MAXWRK = M + M*ILAENV( 1, 'ZGELQF', ' ', M, N, -1,
-     $                     -1 )
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M + 2*M*ILAENV( 1,
-     $                          'ZGEBRD', ' ', M, M, -1, -1 ) )
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M + NRHS*ILAENV( 1,
-     $                          'ZUNMBR', 'QLC', M, NRHS, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M + ( M - 1 )*ILAENV( 1,
-     $                          'ZUNMLQ', 'LC', N, NRHS, M, -1 ) )
-                  IF( NRHS.GT.1 ) THEN
-                     MAXWRK = MAX( MAXWRK, M*M + M + M*NRHS )
-                  ELSE
-                     MAXWRK = MAX( MAXWRK, M*M + 2*M )
-                  END IF
-                  MAXWRK = MAX( MAXWRK, M*M + 4*M + M*NRHS )
-               ELSE
-*
-*                 Path 2 - underdetermined.
-*
-                  MAXWRK = 2*M + ( N + M )*ILAENV( 1, 'ZGEBRD', ' ', M,
-     $                     N, -1, -1 )
-                  MAXWRK = MAX( MAXWRK, 2*M + NRHS*ILAENV( 1, 'ZUNMBR',
-     $                          'QLC', M, NRHS, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, 2*M + M*ILAENV( 1, 'ZUNMBR',
-     $                          'PLN', N, NRHS, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, 2*M + M*NRHS )
-               END IF
-               MINWRK = MAX( 2*M + N, 2*M + M*NRHS )
-            END IF
-         END IF
-         MINWRK = MIN( MINWRK, MAXWRK )
-         WORK( 1 ) = MAXWRK
-         IWORK( 1 ) = LIWORK
-         RWORK( 1 ) = LRWORK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
-            INFO = -12
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGELSD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         RANK = 0
-         RETURN
-      END IF
-*
-*     Get machine parameters.
-*
-      EPS = DLAMCH( 'P' )
-      SFMIN = DLAMCH( 'S' )
-      SMLNUM = SFMIN / EPS
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-*
-*     Scale A if max entry outside range [SMLNUM,BIGNUM].
-*
-      ANRM = ZLANGE( 'M', M, N, A, LDA, RWORK )
-      IASCL = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL ZLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO )
-         IASCL = 1
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM.
-*
-         CALL ZLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO )
-         IASCL = 2
-      ELSE IF( ANRM.EQ.ZERO ) THEN
-*
-*        Matrix all zero. Return zero solution.
-*
-         CALL ZLASET( 'F', MAX( M, N ), NRHS, CZERO, CZERO, B, LDB )
-         CALL DLASET( 'F', MINMN, 1, ZERO, ZERO, S, 1 )
-         RANK = 0
-         GO TO 10
-      END IF
-*
-*     Scale B if max entry outside range [SMLNUM,BIGNUM].
-*
-      BNRM = ZLANGE( 'M', M, NRHS, B, LDB, RWORK )
-      IBSCL = 0
-      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM.
-*
-         CALL ZLASCL( 'G', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 1
-      ELSE IF( BNRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM.
-*
-         CALL ZLASCL( 'G', 0, 0, BNRM, BIGNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 2
-      END IF
-*
-*     If M < N make sure B(M+1:N,:) = 0
-*
-      IF( M.LT.N )
-     $   CALL ZLASET( 'F', N-M, NRHS, CZERO, CZERO, B( M+1, 1 ), LDB )
-*
-*     Overdetermined case.
-*
-      IF( M.GE.N ) THEN
-*
-*        Path 1 - overdetermined or exactly determined.
-*
-         MM = M
-         IF( M.GE.MNTHR ) THEN
-*
-*           Path 1a - overdetermined, with many more rows than columns
-*
-            MM = N
-            ITAU = 1
-            NWORK = ITAU + N
-*
-*           Compute A=Q*R.
-*           (RWorkspace: need N)
-*           (CWorkspace: need N, prefer N*NB)
-*
-            CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
-     $                   LWORK-NWORK+1, INFO )
-*
-*           Multiply B by transpose(Q).
-*           (RWorkspace: need N)
-*           (CWorkspace: need NRHS, prefer NRHS*NB)
-*
-            CALL ZUNMQR( 'L', 'C', M, NRHS, N, A, LDA, WORK( ITAU ), B,
-     $                   LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-*           Zero out below R.
-*
-            IF( N.GT.1 ) THEN
-               CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO, A( 2, 1 ),
-     $                      LDA )
-            END IF
-         END IF
-*
-         ITAUQ = 1
-         ITAUP = ITAUQ + N
-         NWORK = ITAUP + N
-         IE = 1
-         NRWORK = IE + N
-*
-*        Bidiagonalize R in A.
-*        (RWorkspace: need N)
-*        (CWorkspace: need 2*N+MM, prefer 2*N+(MM+N)*NB)
-*
-         CALL ZGEBRD( MM, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
-     $                WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
-     $                INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors of R.
-*        (CWorkspace: need 2*N+NRHS, prefer 2*N+NRHS*NB)
-*
-         CALL ZUNMBR( 'Q', 'L', 'C', MM, NRHS, N, A, LDA, WORK( ITAUQ ),
-     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-*        Solve the bidiagonal least squares problem.
-*
-         CALL ZLALSD( 'U', SMLSIZ, N, NRHS, S, RWORK( IE ), B, LDB,
-     $                RCOND, RANK, WORK( NWORK ), RWORK( NRWORK ),
-     $                IWORK, INFO )
-         IF( INFO.NE.0 ) THEN
-            GO TO 10
-         END IF
-*
-*        Multiply B by right bidiagonalizing vectors of R.
-*
-         CALL ZUNMBR( 'P', 'L', 'N', N, NRHS, N, A, LDA, WORK( ITAUP ),
-     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-      ELSE IF( N.GE.MNTHR .AND. LWORK.GE.4*M+M*M+
-     $         MAX( M, 2*M-4, NRHS, N-3*M ) ) THEN
-*
-*        Path 2a - underdetermined, with many more columns than rows
-*        and sufficient workspace for an efficient algorithm.
-*
-         LDWORK = M
-         IF( LWORK.GE.MAX( 4*M+M*LDA+MAX( M, 2*M-4, NRHS, N-3*M ),
-     $       M*LDA+M+M*NRHS ) )LDWORK = LDA
-         ITAU = 1
-         NWORK = M + 1
-*
-*        Compute A=L*Q.
-*        (CWorkspace: need 2*M, prefer M+M*NB)
-*
-         CALL ZGELQF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
-     $                LWORK-NWORK+1, INFO )
-         IL = NWORK
-*
-*        Copy L to WORK(IL), zeroing out above its diagonal.
-*
-         CALL ZLACPY( 'L', M, M, A, LDA, WORK( IL ), LDWORK )
-         CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO, WORK( IL+LDWORK ),
-     $                LDWORK )
-         ITAUQ = IL + LDWORK*M
-         ITAUP = ITAUQ + M
-         NWORK = ITAUP + M
-         IE = 1
-         NRWORK = IE + M
-*
-*        Bidiagonalize L in WORK(IL).
-*        (RWorkspace: need M)
-*        (CWorkspace: need M*M+4*M, prefer M*M+4*M+2*M*NB)
-*
-         CALL ZGEBRD( M, M, WORK( IL ), LDWORK, S, RWORK( IE ),
-     $                WORK( ITAUQ ), WORK( ITAUP ), WORK( NWORK ),
-     $                LWORK-NWORK+1, INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors of L.
-*        (CWorkspace: need M*M+4*M+NRHS, prefer M*M+4*M+NRHS*NB)
-*
-         CALL ZUNMBR( 'Q', 'L', 'C', M, NRHS, M, WORK( IL ), LDWORK,
-     $                WORK( ITAUQ ), B, LDB, WORK( NWORK ),
-     $                LWORK-NWORK+1, INFO )
-*
-*        Solve the bidiagonal least squares problem.
-*
-         CALL ZLALSD( 'U', SMLSIZ, M, NRHS, S, RWORK( IE ), B, LDB,
-     $                RCOND, RANK, WORK( NWORK ), RWORK( NRWORK ),
-     $                IWORK, INFO )
-         IF( INFO.NE.0 ) THEN
-            GO TO 10
-         END IF
-*
-*        Multiply B by right bidiagonalizing vectors of L.
-*
-         CALL ZUNMBR( 'P', 'L', 'N', M, NRHS, M, WORK( IL ), LDWORK,
-     $                WORK( ITAUP ), B, LDB, WORK( NWORK ),
-     $                LWORK-NWORK+1, INFO )
-*
-*        Zero out below first M rows of B.
-*
-         CALL ZLASET( 'F', N-M, NRHS, CZERO, CZERO, B( M+1, 1 ), LDB )
-         NWORK = ITAU + M
-*
-*        Multiply transpose(Q) by B.
-*        (CWorkspace: need NRHS, prefer NRHS*NB)
-*
-         CALL ZUNMLQ( 'L', 'C', N, NRHS, M, A, LDA, WORK( ITAU ), B,
-     $                LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-      ELSE
-*
-*        Path 2 - remaining underdetermined cases.
-*
-         ITAUQ = 1
-         ITAUP = ITAUQ + M
-         NWORK = ITAUP + M
-         IE = 1
-         NRWORK = IE + M
-*
-*        Bidiagonalize A.
-*        (RWorkspace: need M)
-*        (CWorkspace: need 2*M+N, prefer 2*M+(M+N)*NB)
-*
-         CALL ZGEBRD( M, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
-     $                WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
-     $                INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors.
-*        (CWorkspace: need 2*M+NRHS, prefer 2*M+NRHS*NB)
-*
-         CALL ZUNMBR( 'Q', 'L', 'C', M, NRHS, N, A, LDA, WORK( ITAUQ ),
-     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-*        Solve the bidiagonal least squares problem.
-*
-         CALL ZLALSD( 'L', SMLSIZ, M, NRHS, S, RWORK( IE ), B, LDB,
-     $                RCOND, RANK, WORK( NWORK ), RWORK( NRWORK ),
-     $                IWORK, INFO )
-         IF( INFO.NE.0 ) THEN
-            GO TO 10
-         END IF
-*
-*        Multiply B by right bidiagonalizing vectors of A.
-*
-         CALL ZUNMBR( 'P', 'L', 'N', N, NRHS, M, A, LDA, WORK( ITAUP ),
-     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
-*
-      END IF
-*
-*     Undo scaling.
-*
-      IF( IASCL.EQ.1 ) THEN
-         CALL ZLASCL( 'G', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO )
-         CALL DLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
-     $                INFO )
-      ELSE IF( IASCL.EQ.2 ) THEN
-         CALL ZLASCL( 'G', 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB, INFO )
-         CALL DLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
-     $                INFO )
-      END IF
-      IF( IBSCL.EQ.1 ) THEN
-         CALL ZLASCL( 'G', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO )
-      ELSE IF( IBSCL.EQ.2 ) THEN
-         CALL ZLASCL( 'G', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO )
-      END IF
-*
-   10 CONTINUE
-      WORK( 1 ) = MAXWRK
-      IWORK( 1 ) = LIWORK
-      RWORK( 1 ) = LRWORK
-      RETURN
-*
-*     End of ZGELSD
-*
-      END
--- a/libcruft/lapack/zgelss.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,634 +0,0 @@
-      SUBROUTINE ZGELSS( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK,
-     $                   WORK, LWORK, RWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LDB, LWORK, M, N, NRHS, RANK
-      DOUBLE PRECISION   RCOND
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   RWORK( * ), S( * )
-      COMPLEX*16         A( LDA, * ), B( LDB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGELSS computes the minimum norm solution to a complex linear
-*  least squares problem:
-*
-*  Minimize 2-norm(| b - A*x |).
-*
-*  using the singular value decomposition (SVD) of A. A is an M-by-N
-*  matrix which may be rank-deficient.
-*
-*  Several right hand side vectors b and solution vectors x can be
-*  handled in a single call; they are stored as the columns of the
-*  M-by-NRHS right hand side matrix B and the N-by-NRHS solution matrix
-*  X.
-*
-*  The effective rank of A is determined by treating as zero those
-*  singular values which are less than RCOND times the largest singular
-*  value.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrices B and X. NRHS >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the first min(m,n) rows of A are overwritten with
-*          its right singular vectors, stored rowwise.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
-*          On entry, the M-by-NRHS right hand side matrix B.
-*          On exit, B is overwritten by the N-by-NRHS solution matrix X.
-*          If m >= n and RANK = n, the residual sum-of-squares for
-*          the solution in the i-th column is given by the sum of
-*          squares of the modulus of elements n+1:m in that column.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,M,N).
-*
-*  S       (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The singular values of A in decreasing order.
-*          The condition number of A in the 2-norm = S(1)/S(min(m,n)).
-*
-*  RCOND   (input) DOUBLE PRECISION
-*          RCOND is used to determine the effective rank of A.
-*          Singular values S(i) <= RCOND*S(1) are treated as zero.
-*          If RCOND < 0, machine precision is used instead.
-*
-*  RANK    (output) INTEGER
-*          The effective rank of A, i.e., the number of singular values
-*          which are greater than RCOND*S(1).
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= 1, and also:
-*          LWORK >=  2*min(M,N) + max(M,N,NRHS)
-*          For good performance, LWORK should generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (5*min(M,N))
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  the algorithm for computing the SVD failed to converge;
-*                if INFO = i, i off-diagonal elements of an intermediate
-*                bidiagonal form did not converge to zero.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-      COMPLEX*16         CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0D+0, 0.0D+0 ),
-     $                   CONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            BL, CHUNK, I, IASCL, IBSCL, IE, IL, IRWORK,
-     $                   ITAU, ITAUP, ITAUQ, IWORK, LDWORK, MAXMN,
-     $                   MAXWRK, MINMN, MINWRK, MM, MNTHR
-      DOUBLE PRECISION   ANRM, BIGNUM, BNRM, EPS, SFMIN, SMLNUM, THR
-*     ..
-*     .. Local Arrays ..
-      COMPLEX*16         VDUM( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLABAD, DLASCL, DLASET, XERBLA, ZBDSQR, ZCOPY,
-     $                   ZDRSCL, ZGEBRD, ZGELQF, ZGEMM, ZGEMV, ZGEQRF,
-     $                   ZLACPY, ZLASCL, ZLASET, ZUNGBR, ZUNMBR, ZUNMLQ,
-     $                   ZUNMQR
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      DOUBLE PRECISION   DLAMCH, ZLANGE
-      EXTERNAL           ILAENV, DLAMCH, ZLANGE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      MINMN = MIN( M, N )
-      MAXMN = MAX( M, N )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, MAXMN ) ) THEN
-         INFO = -7
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of workspace needed at that point in the code,
-*       as well as the preferred amount for good performance.
-*       CWorkspace refers to complex workspace, and RWorkspace refers
-*       to real workspace. NB refers to the optimal block size for the
-*       immediately following subroutine, as returned by ILAENV.)
-*
-      IF( INFO.EQ.0 ) THEN
-         MINWRK = 1
-         MAXWRK = 1
-         IF( MINMN.GT.0 ) THEN
-            MM = M
-            MNTHR = ILAENV( 6, 'ZGELSS', ' ', M, N, NRHS, -1 )
-            IF( M.GE.N .AND. M.GE.MNTHR ) THEN
-*
-*              Path 1a - overdetermined, with many more rows than
-*                        columns
-*
-               MM = N
-               MAXWRK = MAX( MAXWRK, N + N*ILAENV( 1, 'ZGEQRF', ' ', M,
-     $                       N, -1, -1 ) )
-               MAXWRK = MAX( MAXWRK, N + NRHS*ILAENV( 1, 'ZUNMQR', 'LC',
-     $                       M, NRHS, N, -1 ) )
-            END IF
-            IF( M.GE.N ) THEN
-*
-*              Path 1 - overdetermined or exactly determined
-*
-               MAXWRK = MAX( MAXWRK, 2*N + ( MM + N )*ILAENV( 1,
-     $                       'ZGEBRD', ' ', MM, N, -1, -1 ) )
-               MAXWRK = MAX( MAXWRK, 2*N + NRHS*ILAENV( 1, 'ZUNMBR',
-     $                       'QLC', MM, NRHS, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, 2*N + ( N - 1 )*ILAENV( 1,
-     $                       'ZUNGBR', 'P', N, N, N, -1 ) )
-               MAXWRK = MAX( MAXWRK, N*NRHS )
-               MINWRK = 2*N + MAX( NRHS, M )
-            END IF
-            IF( N.GT.M ) THEN
-               MINWRK = 2*M + MAX( NRHS, N )
-               IF( N.GE.MNTHR ) THEN
-*
-*                 Path 2a - underdetermined, with many more columns
-*                 than rows
-*
-                  MAXWRK = M + M*ILAENV( 1, 'ZGELQF', ' ', M, N, -1,
-     $                     -1 )
-                  MAXWRK = MAX( MAXWRK, 3*M + M*M + 2*M*ILAENV( 1,
-     $                          'ZGEBRD', ' ', M, M, -1, -1 ) )
-                  MAXWRK = MAX( MAXWRK, 3*M + M*M + NRHS*ILAENV( 1,
-     $                          'ZUNMBR', 'QLC', M, NRHS, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, 3*M + M*M + ( M - 1 )*ILAENV( 1,
-     $                          'ZUNGBR', 'P', M, M, M, -1 ) )
-                  IF( NRHS.GT.1 ) THEN
-                     MAXWRK = MAX( MAXWRK, M*M + M + M*NRHS )
-                  ELSE
-                     MAXWRK = MAX( MAXWRK, M*M + 2*M )
-                  END IF
-                  MAXWRK = MAX( MAXWRK, M + NRHS*ILAENV( 1, 'ZUNMLQ',
-     $                          'LC', N, NRHS, M, -1 ) )
-               ELSE
-*
-*                 Path 2 - underdetermined
-*
-                  MAXWRK = 2*M + ( N + M )*ILAENV( 1, 'ZGEBRD', ' ', M,
-     $                     N, -1, -1 )
-                  MAXWRK = MAX( MAXWRK, 2*M + NRHS*ILAENV( 1, 'ZUNMBR',
-     $                          'QLC', M, NRHS, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, 2*M + M*ILAENV( 1, 'ZUNGBR',
-     $                          'P', M, N, M, -1 ) )
-                  MAXWRK = MAX( MAXWRK, N*NRHS )
-               END IF
-            END IF
-            MAXWRK = MAX( MINWRK, MAXWRK )
-         END IF
-         WORK( 1 ) = MAXWRK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY )
-     $      INFO = -12
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGELSS', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         RANK = 0
-         RETURN
-      END IF
-*
-*     Get machine parameters
-*
-      EPS = DLAMCH( 'P' )
-      SFMIN = DLAMCH( 'S' )
-      SMLNUM = SFMIN / EPS
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = ZLANGE( 'M', M, N, A, LDA, RWORK )
-      IASCL = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL ZLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO )
-         IASCL = 1
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM
-*
-         CALL ZLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO )
-         IASCL = 2
-      ELSE IF( ANRM.EQ.ZERO ) THEN
-*
-*        Matrix all zero. Return zero solution.
-*
-         CALL ZLASET( 'F', MAX( M, N ), NRHS, CZERO, CZERO, B, LDB )
-         CALL DLASET( 'F', MINMN, 1, ZERO, ZERO, S, MINMN )
-         RANK = 0
-         GO TO 70
-      END IF
-*
-*     Scale B if max element outside range [SMLNUM,BIGNUM]
-*
-      BNRM = ZLANGE( 'M', M, NRHS, B, LDB, RWORK )
-      IBSCL = 0
-      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL ZLASCL( 'G', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 1
-      ELSE IF( BNRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM
-*
-         CALL ZLASCL( 'G', 0, 0, BNRM, BIGNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 2
-      END IF
-*
-*     Overdetermined case
-*
-      IF( M.GE.N ) THEN
-*
-*        Path 1 - overdetermined or exactly determined
-*
-         MM = M
-         IF( M.GE.MNTHR ) THEN
-*
-*           Path 1a - overdetermined, with many more rows than columns
-*
-            MM = N
-            ITAU = 1
-            IWORK = ITAU + N
-*
-*           Compute A=Q*R
-*           (CWorkspace: need 2*N, prefer N+N*NB)
-*           (RWorkspace: none)
-*
-            CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
-     $                   LWORK-IWORK+1, INFO )
-*
-*           Multiply B by transpose(Q)
-*           (CWorkspace: need N+NRHS, prefer N+NRHS*NB)
-*           (RWorkspace: none)
-*
-            CALL ZUNMQR( 'L', 'C', M, NRHS, N, A, LDA, WORK( ITAU ), B,
-     $                   LDB, WORK( IWORK ), LWORK-IWORK+1, INFO )
-*
-*           Zero out below R
-*
-            IF( N.GT.1 )
-     $         CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO, A( 2, 1 ),
-     $                      LDA )
-         END IF
-*
-         IE = 1
-         ITAUQ = 1
-         ITAUP = ITAUQ + N
-         IWORK = ITAUP + N
-*
-*        Bidiagonalize R in A
-*        (CWorkspace: need 2*N+MM, prefer 2*N+(MM+N)*NB)
-*        (RWorkspace: need N)
-*
-         CALL ZGEBRD( MM, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
-     $                WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors of R
-*        (CWorkspace: need 2*N+NRHS, prefer 2*N+NRHS*NB)
-*        (RWorkspace: none)
-*
-         CALL ZUNMBR( 'Q', 'L', 'C', MM, NRHS, N, A, LDA, WORK( ITAUQ ),
-     $                B, LDB, WORK( IWORK ), LWORK-IWORK+1, INFO )
-*
-*        Generate right bidiagonalizing vectors of R in A
-*        (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*        (RWorkspace: none)
-*
-         CALL ZUNGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                WORK( IWORK ), LWORK-IWORK+1, INFO )
-         IRWORK = IE + N
-*
-*        Perform bidiagonal QR iteration
-*          multiply B by transpose of left singular vectors
-*          compute right singular vectors in A
-*        (CWorkspace: none)
-*        (RWorkspace: need BDSPAC)
-*
-         CALL ZBDSQR( 'U', N, N, 0, NRHS, S, RWORK( IE ), A, LDA, VDUM,
-     $                1, B, LDB, RWORK( IRWORK ), INFO )
-         IF( INFO.NE.0 )
-     $      GO TO 70
-*
-*        Multiply B by reciprocals of singular values
-*
-         THR = MAX( RCOND*S( 1 ), SFMIN )
-         IF( RCOND.LT.ZERO )
-     $      THR = MAX( EPS*S( 1 ), SFMIN )
-         RANK = 0
-         DO 10 I = 1, N
-            IF( S( I ).GT.THR ) THEN
-               CALL ZDRSCL( NRHS, S( I ), B( I, 1 ), LDB )
-               RANK = RANK + 1
-            ELSE
-               CALL ZLASET( 'F', 1, NRHS, CZERO, CZERO, B( I, 1 ), LDB )
-            END IF
-   10    CONTINUE
-*
-*        Multiply B by right singular vectors
-*        (CWorkspace: need N, prefer N*NRHS)
-*        (RWorkspace: none)
-*
-         IF( LWORK.GE.LDB*NRHS .AND. NRHS.GT.1 ) THEN
-            CALL ZGEMM( 'C', 'N', N, NRHS, N, CONE, A, LDA, B, LDB,
-     $                  CZERO, WORK, LDB )
-            CALL ZLACPY( 'G', N, NRHS, WORK, LDB, B, LDB )
-         ELSE IF( NRHS.GT.1 ) THEN
-            CHUNK = LWORK / N
-            DO 20 I = 1, NRHS, CHUNK
-               BL = MIN( NRHS-I+1, CHUNK )
-               CALL ZGEMM( 'C', 'N', N, BL, N, CONE, A, LDA, B( 1, I ),
-     $                     LDB, CZERO, WORK, N )
-               CALL ZLACPY( 'G', N, BL, WORK, N, B( 1, I ), LDB )
-   20       CONTINUE
-         ELSE
-            CALL ZGEMV( 'C', N, N, CONE, A, LDA, B, 1, CZERO, WORK, 1 )
-            CALL ZCOPY( N, WORK, 1, B, 1 )
-         END IF
-*
-      ELSE IF( N.GE.MNTHR .AND. LWORK.GE.3*M+M*M+MAX( M, NRHS, N-2*M ) )
-     $          THEN
-*
-*        Underdetermined case, M much less than N
-*
-*        Path 2a - underdetermined, with many more columns than rows
-*        and sufficient workspace for an efficient algorithm
-*
-         LDWORK = M
-         IF( LWORK.GE.3*M+M*LDA+MAX( M, NRHS, N-2*M ) )
-     $      LDWORK = LDA
-         ITAU = 1
-         IWORK = M + 1
-*
-*        Compute A=L*Q
-*        (CWorkspace: need 2*M, prefer M+M*NB)
-*        (RWorkspace: none)
-*
-         CALL ZGELQF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
-     $                LWORK-IWORK+1, INFO )
-         IL = IWORK
-*
-*        Copy L to WORK(IL), zeroing out above it
-*
-         CALL ZLACPY( 'L', M, M, A, LDA, WORK( IL ), LDWORK )
-         CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO, WORK( IL+LDWORK ),
-     $                LDWORK )
-         IE = 1
-         ITAUQ = IL + LDWORK*M
-         ITAUP = ITAUQ + M
-         IWORK = ITAUP + M
-*
-*        Bidiagonalize L in WORK(IL)
-*        (CWorkspace: need M*M+4*M, prefer M*M+3*M+2*M*NB)
-*        (RWorkspace: need M)
-*
-         CALL ZGEBRD( M, M, WORK( IL ), LDWORK, S, RWORK( IE ),
-     $                WORK( ITAUQ ), WORK( ITAUP ), WORK( IWORK ),
-     $                LWORK-IWORK+1, INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors of L
-*        (CWorkspace: need M*M+3*M+NRHS, prefer M*M+3*M+NRHS*NB)
-*        (RWorkspace: none)
-*
-         CALL ZUNMBR( 'Q', 'L', 'C', M, NRHS, M, WORK( IL ), LDWORK,
-     $                WORK( ITAUQ ), B, LDB, WORK( IWORK ),
-     $                LWORK-IWORK+1, INFO )
-*
-*        Generate right bidiagonalizing vectors of R in WORK(IL)
-*        (CWorkspace: need M*M+4*M-1, prefer M*M+3*M+(M-1)*NB)
-*        (RWorkspace: none)
-*
-         CALL ZUNGBR( 'P', M, M, M, WORK( IL ), LDWORK, WORK( ITAUP ),
-     $                WORK( IWORK ), LWORK-IWORK+1, INFO )
-         IRWORK = IE + M
-*
-*        Perform bidiagonal QR iteration, computing right singular
-*        vectors of L in WORK(IL) and multiplying B by transpose of
-*        left singular vectors
-*        (CWorkspace: need M*M)
-*        (RWorkspace: need BDSPAC)
-*
-         CALL ZBDSQR( 'U', M, M, 0, NRHS, S, RWORK( IE ), WORK( IL ),
-     $                LDWORK, A, LDA, B, LDB, RWORK( IRWORK ), INFO )
-         IF( INFO.NE.0 )
-     $      GO TO 70
-*
-*        Multiply B by reciprocals of singular values
-*
-         THR = MAX( RCOND*S( 1 ), SFMIN )
-         IF( RCOND.LT.ZERO )
-     $      THR = MAX( EPS*S( 1 ), SFMIN )
-         RANK = 0
-         DO 30 I = 1, M
-            IF( S( I ).GT.THR ) THEN
-               CALL ZDRSCL( NRHS, S( I ), B( I, 1 ), LDB )
-               RANK = RANK + 1
-            ELSE
-               CALL ZLASET( 'F', 1, NRHS, CZERO, CZERO, B( I, 1 ), LDB )
-            END IF
-   30    CONTINUE
-         IWORK = IL + M*LDWORK
-*
-*        Multiply B by right singular vectors of L in WORK(IL)
-*        (CWorkspace: need M*M+2*M, prefer M*M+M+M*NRHS)
-*        (RWorkspace: none)
-*
-         IF( LWORK.GE.LDB*NRHS+IWORK-1 .AND. NRHS.GT.1 ) THEN
-            CALL ZGEMM( 'C', 'N', M, NRHS, M, CONE, WORK( IL ), LDWORK,
-     $                  B, LDB, CZERO, WORK( IWORK ), LDB )
-            CALL ZLACPY( 'G', M, NRHS, WORK( IWORK ), LDB, B, LDB )
-         ELSE IF( NRHS.GT.1 ) THEN
-            CHUNK = ( LWORK-IWORK+1 ) / M
-            DO 40 I = 1, NRHS, CHUNK
-               BL = MIN( NRHS-I+1, CHUNK )
-               CALL ZGEMM( 'C', 'N', M, BL, M, CONE, WORK( IL ), LDWORK,
-     $                     B( 1, I ), LDB, CZERO, WORK( IWORK ), M )
-               CALL ZLACPY( 'G', M, BL, WORK( IWORK ), M, B( 1, I ),
-     $                      LDB )
-   40       CONTINUE
-         ELSE
-            CALL ZGEMV( 'C', M, M, CONE, WORK( IL ), LDWORK, B( 1, 1 ),
-     $                  1, CZERO, WORK( IWORK ), 1 )
-            CALL ZCOPY( M, WORK( IWORK ), 1, B( 1, 1 ), 1 )
-         END IF
-*
-*        Zero out below first M rows of B
-*
-         CALL ZLASET( 'F', N-M, NRHS, CZERO, CZERO, B( M+1, 1 ), LDB )
-         IWORK = ITAU + M
-*
-*        Multiply transpose(Q) by B
-*        (CWorkspace: need M+NRHS, prefer M+NHRS*NB)
-*        (RWorkspace: none)
-*
-         CALL ZUNMLQ( 'L', 'C', N, NRHS, M, A, LDA, WORK( ITAU ), B,
-     $                LDB, WORK( IWORK ), LWORK-IWORK+1, INFO )
-*
-      ELSE
-*
-*        Path 2 - remaining underdetermined cases
-*
-         IE = 1
-         ITAUQ = 1
-         ITAUP = ITAUQ + M
-         IWORK = ITAUP + M
-*
-*        Bidiagonalize A
-*        (CWorkspace: need 3*M, prefer 2*M+(M+N)*NB)
-*        (RWorkspace: need N)
-*
-         CALL ZGEBRD( M, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
-     $                WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                INFO )
-*
-*        Multiply B by transpose of left bidiagonalizing vectors
-*        (CWorkspace: need 2*M+NRHS, prefer 2*M+NRHS*NB)
-*        (RWorkspace: none)
-*
-         CALL ZUNMBR( 'Q', 'L', 'C', M, NRHS, N, A, LDA, WORK( ITAUQ ),
-     $                B, LDB, WORK( IWORK ), LWORK-IWORK+1, INFO )
-*
-*        Generate right bidiagonalizing vectors in A
-*        (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*        (RWorkspace: none)
-*
-         CALL ZUNGBR( 'P', M, N, M, A, LDA, WORK( ITAUP ),
-     $                WORK( IWORK ), LWORK-IWORK+1, INFO )
-         IRWORK = IE + M
-*
-*        Perform bidiagonal QR iteration,
-*           computing right singular vectors of A in A and
-*           multiplying B by transpose of left singular vectors
-*        (CWorkspace: none)
-*        (RWorkspace: need BDSPAC)
-*
-         CALL ZBDSQR( 'L', M, N, 0, NRHS, S, RWORK( IE ), A, LDA, VDUM,
-     $                1, B, LDB, RWORK( IRWORK ), INFO )
-         IF( INFO.NE.0 )
-     $      GO TO 70
-*
-*        Multiply B by reciprocals of singular values
-*
-         THR = MAX( RCOND*S( 1 ), SFMIN )
-         IF( RCOND.LT.ZERO )
-     $      THR = MAX( EPS*S( 1 ), SFMIN )
-         RANK = 0
-         DO 50 I = 1, M
-            IF( S( I ).GT.THR ) THEN
-               CALL ZDRSCL( NRHS, S( I ), B( I, 1 ), LDB )
-               RANK = RANK + 1
-            ELSE
-               CALL ZLASET( 'F', 1, NRHS, CZERO, CZERO, B( I, 1 ), LDB )
-            END IF
-   50    CONTINUE
-*
-*        Multiply B by right singular vectors of A
-*        (CWorkspace: need N, prefer N*NRHS)
-*        (RWorkspace: none)
-*
-         IF( LWORK.GE.LDB*NRHS .AND. NRHS.GT.1 ) THEN
-            CALL ZGEMM( 'C', 'N', N, NRHS, M, CONE, A, LDA, B, LDB,
-     $                  CZERO, WORK, LDB )
-            CALL ZLACPY( 'G', N, NRHS, WORK, LDB, B, LDB )
-         ELSE IF( NRHS.GT.1 ) THEN
-            CHUNK = LWORK / N
-            DO 60 I = 1, NRHS, CHUNK
-               BL = MIN( NRHS-I+1, CHUNK )
-               CALL ZGEMM( 'C', 'N', N, BL, M, CONE, A, LDA, B( 1, I ),
-     $                     LDB, CZERO, WORK, N )
-               CALL ZLACPY( 'F', N, BL, WORK, N, B( 1, I ), LDB )
-   60       CONTINUE
-         ELSE
-            CALL ZGEMV( 'C', M, N, CONE, A, LDA, B, 1, CZERO, WORK, 1 )
-            CALL ZCOPY( N, WORK, 1, B, 1 )
-         END IF
-      END IF
-*
-*     Undo scaling
-*
-      IF( IASCL.EQ.1 ) THEN
-         CALL ZLASCL( 'G', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO )
-         CALL DLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
-     $                INFO )
-      ELSE IF( IASCL.EQ.2 ) THEN
-         CALL ZLASCL( 'G', 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB, INFO )
-         CALL DLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
-     $                INFO )
-      END IF
-      IF( IBSCL.EQ.1 ) THEN
-         CALL ZLASCL( 'G', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO )
-      ELSE IF( IBSCL.EQ.2 ) THEN
-         CALL ZLASCL( 'G', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO )
-      END IF
-   70 CONTINUE
-      WORK( 1 ) = MAXWRK
-      RETURN
-*
-*     End of ZGELSS
-*
-      END
--- a/libcruft/lapack/zgelsy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,385 +0,0 @@
-      SUBROUTINE ZGELSY( M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND, RANK,
-     $                   WORK, LWORK, RWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LDB, LWORK, M, N, NRHS, RANK
-      DOUBLE PRECISION   RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      DOUBLE PRECISION   RWORK( * )
-      COMPLEX*16         A( LDA, * ), B( LDB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGELSY computes the minimum-norm solution to a complex linear least
-*  squares problem:
-*      minimize || A * X - B ||
-*  using a complete orthogonal factorization of A.  A is an M-by-N
-*  matrix which may be rank-deficient.
-*
-*  Several right hand side vectors b and solution vectors x can be
-*  handled in a single call; they are stored as the columns of the
-*  M-by-NRHS right hand side matrix B and the N-by-NRHS solution
-*  matrix X.
-*
-*  The routine first computes a QR factorization with column pivoting:
-*      A * P = Q * [ R11 R12 ]
-*                  [  0  R22 ]
-*  with R11 defined as the largest leading submatrix whose estimated
-*  condition number is less than 1/RCOND.  The order of R11, RANK,
-*  is the effective rank of A.
-*
-*  Then, R22 is considered to be negligible, and R12 is annihilated
-*  by unitary transformations from the right, arriving at the
-*  complete orthogonal factorization:
-*     A * P = Q * [ T11 0 ] * Z
-*                 [  0  0 ]
-*  The minimum-norm solution is then
-*     X = P * Z' [ inv(T11)*Q1'*B ]
-*                [        0       ]
-*  where Q1 consists of the first RANK columns of Q.
-*
-*  This routine is basically identical to the original xGELSX except
-*  three differences:
-*    o The permutation of matrix B (the right hand side) is faster and
-*      more simple.
-*    o The call to the subroutine xGEQPF has been substituted by the
-*      the call to the subroutine xGEQP3. This subroutine is a Blas-3
-*      version of the QR factorization with column pivoting.
-*    o Matrix B (the right hand side) is updated with Blas-3.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of
-*          columns of matrices B and X. NRHS >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, A has been overwritten by details of its
-*          complete orthogonal factorization.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
-*          On entry, the M-by-NRHS right hand side matrix B.
-*          On exit, the N-by-NRHS solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B. LDB >= max(1,M,N).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          On entry, if JPVT(i) .ne. 0, the i-th column of A is permuted
-*          to the front of AP, otherwise column i is a free column.
-*          On exit, if JPVT(i) = k, then the i-th column of A*P
-*          was the k-th column of A.
-*
-*  RCOND   (input) DOUBLE PRECISION
-*          RCOND is used to determine the effective rank of A, which
-*          is defined as the order of the largest leading triangular
-*          submatrix R11 in the QR factorization with pivoting of A,
-*          whose estimated condition number < 1/RCOND.
-*
-*  RANK    (output) INTEGER
-*          The effective rank of A, i.e., the order of the submatrix
-*          R11.  This is the same as the order of the submatrix T11
-*          in the complete orthogonal factorization of A.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          The unblocked strategy requires that:
-*            LWORK >= MN + MAX( 2*MN, N+1, MN+NRHS )
-*          where MN = min(M,N).
-*          The block algorithm requires that:
-*            LWORK >= MN + MAX( 2*MN, NB*(N+1), MN+MN*NB, MN+NB*NRHS )
-*          where NB is an upper bound on the blocksize returned
-*          by ILAENV for the routines ZGEQP3, ZTZRZF, CTZRQF, ZUNMQR,
-*          and ZUNMRZ.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (2*N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*    E. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*    G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            IMAX, IMIN
-      PARAMETER          ( IMAX = 1, IMIN = 2 )
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-      COMPLEX*16         CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0D+0, 0.0D+0 ),
-     $                   CONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IASCL, IBSCL, ISMAX, ISMIN, J, LWKOPT, MN,
-     $                   NB, NB1, NB2, NB3, NB4
-      DOUBLE PRECISION   ANRM, BIGNUM, BNRM, SMAX, SMAXPR, SMIN, SMINPR,
-     $                   SMLNUM, WSIZE
-      COMPLEX*16         C1, C2, S1, S2
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLABAD, XERBLA, ZCOPY, ZGEQP3, ZLAIC1, ZLASCL,
-     $                   ZLASET, ZTRSM, ZTZRZF, ZUNMQR, ZUNMRZ
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      DOUBLE PRECISION   DLAMCH, ZLANGE
-      EXTERNAL           ILAENV, DLAMCH, ZLANGE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCMPLX, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-      MN = MIN( M, N )
-      ISMIN = MN + 1
-      ISMAX = 2*MN + 1
-*
-*     Test the input arguments.
-*
-      INFO = 0
-      NB1 = ILAENV( 1, 'ZGEQRF', ' ', M, N, -1, -1 )
-      NB2 = ILAENV( 1, 'ZGERQF', ' ', M, N, -1, -1 )
-      NB3 = ILAENV( 1, 'ZUNMQR', ' ', M, N, NRHS, -1 )
-      NB4 = ILAENV( 1, 'ZUNMRQ', ' ', M, N, NRHS, -1 )
-      NB = MAX( NB1, NB2, NB3, NB4 )
-      LWKOPT = MAX( 1, MN+2*N+NB*( N+1 ), 2*MN+NB*NRHS )
-      WORK( 1 ) = DCMPLX( LWKOPT )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, M, N ) ) THEN
-         INFO = -7
-      ELSE IF( LWORK.LT.( MN+MAX( 2*MN, N+1, MN+NRHS ) ) .AND. .NOT.
-     $         LQUERY ) THEN
-         INFO = -12
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGELSY', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( MIN( M, N, NRHS ).EQ.0 ) THEN
-         RANK = 0
-         RETURN
-      END IF
-*
-*     Get machine parameters
-*
-      SMLNUM = DLAMCH( 'S' ) / DLAMCH( 'P' )
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-*
-*     Scale A, B if max entries outside range [SMLNUM,BIGNUM]
-*
-      ANRM = ZLANGE( 'M', M, N, A, LDA, RWORK )
-      IASCL = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL ZLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO )
-         IASCL = 1
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM
-*
-         CALL ZLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO )
-         IASCL = 2
-      ELSE IF( ANRM.EQ.ZERO ) THEN
-*
-*        Matrix all zero. Return zero solution.
-*
-         CALL ZLASET( 'F', MAX( M, N ), NRHS, CZERO, CZERO, B, LDB )
-         RANK = 0
-         GO TO 70
-      END IF
-*
-      BNRM = ZLANGE( 'M', M, NRHS, B, LDB, RWORK )
-      IBSCL = 0
-      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
-*
-*        Scale matrix norm up to SMLNUM
-*
-         CALL ZLASCL( 'G', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 1
-      ELSE IF( BNRM.GT.BIGNUM ) THEN
-*
-*        Scale matrix norm down to BIGNUM
-*
-         CALL ZLASCL( 'G', 0, 0, BNRM, BIGNUM, M, NRHS, B, LDB, INFO )
-         IBSCL = 2
-      END IF
-*
-*     Compute QR factorization with column pivoting of A:
-*        A * P = Q * R
-*
-      CALL ZGEQP3( M, N, A, LDA, JPVT, WORK( 1 ), WORK( MN+1 ),
-     $             LWORK-MN, RWORK, INFO )
-      WSIZE = MN + DBLE( WORK( MN+1 ) )
-*
-*     complex workspace: MN+NB*(N+1). real workspace 2*N.
-*     Details of Householder rotations stored in WORK(1:MN).
-*
-*     Determine RANK using incremental condition estimation
-*
-      WORK( ISMIN ) = CONE
-      WORK( ISMAX ) = CONE
-      SMAX = ABS( A( 1, 1 ) )
-      SMIN = SMAX
-      IF( ABS( A( 1, 1 ) ).EQ.ZERO ) THEN
-         RANK = 0
-         CALL ZLASET( 'F', MAX( M, N ), NRHS, CZERO, CZERO, B, LDB )
-         GO TO 70
-      ELSE
-         RANK = 1
-      END IF
-*
-   10 CONTINUE
-      IF( RANK.LT.MN ) THEN
-         I = RANK + 1
-         CALL ZLAIC1( IMIN, RANK, WORK( ISMIN ), SMIN, A( 1, I ),
-     $                A( I, I ), SMINPR, S1, C1 )
-         CALL ZLAIC1( IMAX, RANK, WORK( ISMAX ), SMAX, A( 1, I ),
-     $                A( I, I ), SMAXPR, S2, C2 )
-*
-         IF( SMAXPR*RCOND.LE.SMINPR ) THEN
-            DO 20 I = 1, RANK
-               WORK( ISMIN+I-1 ) = S1*WORK( ISMIN+I-1 )
-               WORK( ISMAX+I-1 ) = S2*WORK( ISMAX+I-1 )
-   20       CONTINUE
-            WORK( ISMIN+RANK ) = C1
-            WORK( ISMAX+RANK ) = C2
-            SMIN = SMINPR
-            SMAX = SMAXPR
-            RANK = RANK + 1
-            GO TO 10
-         END IF
-      END IF
-*
-*     complex workspace: 3*MN.
-*
-*     Logically partition R = [ R11 R12 ]
-*                             [  0  R22 ]
-*     where R11 = R(1:RANK,1:RANK)
-*
-*     [R11,R12] = [ T11, 0 ] * Y
-*
-      IF( RANK.LT.N )
-     $   CALL ZTZRZF( RANK, N, A, LDA, WORK( MN+1 ), WORK( 2*MN+1 ),
-     $                LWORK-2*MN, INFO )
-*
-*     complex workspace: 2*MN.
-*     Details of Householder rotations stored in WORK(MN+1:2*MN)
-*
-*     B(1:M,1:NRHS) := Q' * B(1:M,1:NRHS)
-*
-      CALL ZUNMQR( 'Left', 'Conjugate transpose', M, NRHS, MN, A, LDA,
-     $             WORK( 1 ), B, LDB, WORK( 2*MN+1 ), LWORK-2*MN, INFO )
-      WSIZE = MAX( WSIZE, 2*MN+DBLE( WORK( 2*MN+1 ) ) )
-*
-*     complex workspace: 2*MN+NB*NRHS.
-*
-*     B(1:RANK,1:NRHS) := inv(T11) * B(1:RANK,1:NRHS)
-*
-      CALL ZTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', RANK,
-     $            NRHS, CONE, A, LDA, B, LDB )
-*
-      DO 40 J = 1, NRHS
-         DO 30 I = RANK + 1, N
-            B( I, J ) = CZERO
-   30    CONTINUE
-   40 CONTINUE
-*
-*     B(1:N,1:NRHS) := Y' * B(1:N,1:NRHS)
-*
-      IF( RANK.LT.N ) THEN
-         CALL ZUNMRZ( 'Left', 'Conjugate transpose', N, NRHS, RANK,
-     $                N-RANK, A, LDA, WORK( MN+1 ), B, LDB,
-     $                WORK( 2*MN+1 ), LWORK-2*MN, INFO )
-      END IF
-*
-*     complex workspace: 2*MN+NRHS.
-*
-*     B(1:N,1:NRHS) := P * B(1:N,1:NRHS)
-*
-      DO 60 J = 1, NRHS
-         DO 50 I = 1, N
-            WORK( JPVT( I ) ) = B( I, J )
-   50    CONTINUE
-         CALL ZCOPY( N, WORK( 1 ), 1, B( 1, J ), 1 )
-   60 CONTINUE
-*
-*     complex workspace: N.
-*
-*     Undo scaling
-*
-      IF( IASCL.EQ.1 ) THEN
-         CALL ZLASCL( 'G', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO )
-         CALL ZLASCL( 'U', 0, 0, SMLNUM, ANRM, RANK, RANK, A, LDA,
-     $                INFO )
-      ELSE IF( IASCL.EQ.2 ) THEN
-         CALL ZLASCL( 'G', 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB, INFO )
-         CALL ZLASCL( 'U', 0, 0, BIGNUM, ANRM, RANK, RANK, A, LDA,
-     $                INFO )
-      END IF
-      IF( IBSCL.EQ.1 ) THEN
-         CALL ZLASCL( 'G', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO )
-      ELSE IF( IBSCL.EQ.2 ) THEN
-         CALL ZLASCL( 'G', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO )
-      END IF
-*
-   70 CONTINUE
-      WORK( 1 ) = DCMPLX( LWKOPT )
-*
-      RETURN
-*
-*     End of ZGELSY
-*
-      END
--- a/libcruft/lapack/zgeqp3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,293 +0,0 @@
-      SUBROUTINE ZGEQP3( M, N, A, LDA, JPVT, TAU, WORK, LWORK, RWORK,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      DOUBLE PRECISION   RWORK( * )
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGEQP3 computes a QR factorization with column pivoting of a
-*  matrix A:  A*P = Q*R  using Level 3 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the upper triangle of the array contains the
-*          min(M,N)-by-N upper trapezoidal matrix R; the elements below
-*          the diagonal, together with the array TAU, represent the
-*          unitary matrix Q as a product of min(M,N) elementary
-*          reflectors.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          On entry, if JPVT(J).ne.0, the J-th column of A is permuted
-*          to the front of A*P (a leading column); if JPVT(J)=0,
-*          the J-th column of A is a free column.
-*          On exit, if JPVT(J)=K, then the J-th column of A*P was the
-*          the K-th column of A.
-*
-*  TAU     (output) COMPLEX*16 array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO=0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= N+1.
-*          For optimal performance LWORK >= ( N+1 )*NB, where NB
-*          is the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (2*N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit.
-*          < 0: if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(k), where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a real/complex scalar, and v is a real/complex vector
-*  with v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in
-*  A(i+1:m,i), and tau in TAU(i).
-*
-*  Based on contributions by
-*    G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*    X. Sun, Computer Science Dept., Duke University, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            INB, INBMIN, IXOVER
-      PARAMETER          ( INB = 1, INBMIN = 2, IXOVER = 3 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            FJB, IWS, J, JB, LWKOPT, MINMN, MINWS, NA, NB,
-     $                   NBMIN, NFXD, NX, SM, SMINMN, SN, TOPBMN
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZGEQRF, ZLAQP2, ZLAQPS, ZSWAP, ZUNMQR
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      DOUBLE PRECISION   DZNRM2
-      EXTERNAL           ILAENV, DZNRM2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          INT, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test input arguments
-*     ====================
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         MINMN = MIN( M, N )
-         IF( MINMN.EQ.0 ) THEN
-            IWS = 1
-            LWKOPT = 1
-         ELSE
-            IWS = N + 1
-            NB = ILAENV( INB, 'ZGEQRF', ' ', M, N, -1, -1 )
-            LWKOPT = ( N + 1 )*NB
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( ( LWORK.LT.IWS ) .AND. .NOT.LQUERY ) THEN
-            INFO = -8
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGEQP3', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( MINMN.EQ.0 ) THEN
-         RETURN
-      END IF
-*
-*     Move initial columns up front.
-*
-      NFXD = 1
-      DO 10 J = 1, N
-         IF( JPVT( J ).NE.0 ) THEN
-            IF( J.NE.NFXD ) THEN
-               CALL ZSWAP( M, A( 1, J ), 1, A( 1, NFXD ), 1 )
-               JPVT( J ) = JPVT( NFXD )
-               JPVT( NFXD ) = J
-            ELSE
-               JPVT( J ) = J
-            END IF
-            NFXD = NFXD + 1
-         ELSE
-            JPVT( J ) = J
-         END IF
-   10 CONTINUE
-      NFXD = NFXD - 1
-*
-*     Factorize fixed columns
-*     =======================
-*
-*     Compute the QR factorization of fixed columns and update
-*     remaining columns.
-*
-      IF( NFXD.GT.0 ) THEN
-         NA = MIN( M, NFXD )
-*CC      CALL ZGEQR2( M, NA, A, LDA, TAU, WORK, INFO )
-         CALL ZGEQRF( M, NA, A, LDA, TAU, WORK, LWORK, INFO )
-         IWS = MAX( IWS, INT( WORK( 1 ) ) )
-         IF( NA.LT.N ) THEN
-*CC         CALL ZUNM2R( 'Left', 'Conjugate Transpose', M, N-NA,
-*CC  $                   NA, A, LDA, TAU, A( 1, NA+1 ), LDA, WORK,
-*CC  $                   INFO )
-            CALL ZUNMQR( 'Left', 'Conjugate Transpose', M, N-NA, NA, A,
-     $                   LDA, TAU, A( 1, NA+1 ), LDA, WORK, LWORK,
-     $                   INFO )
-            IWS = MAX( IWS, INT( WORK( 1 ) ) )
-         END IF
-      END IF
-*
-*     Factorize free columns
-*     ======================
-*
-      IF( NFXD.LT.MINMN ) THEN
-*
-         SM = M - NFXD
-         SN = N - NFXD
-         SMINMN = MINMN - NFXD
-*
-*        Determine the block size.
-*
-         NB = ILAENV( INB, 'ZGEQRF', ' ', SM, SN, -1, -1 )
-         NBMIN = 2
-         NX = 0
-*
-         IF( ( NB.GT.1 ) .AND. ( NB.LT.SMINMN ) ) THEN
-*
-*           Determine when to cross over from blocked to unblocked code.
-*
-            NX = MAX( 0, ILAENV( IXOVER, 'ZGEQRF', ' ', SM, SN, -1,
-     $           -1 ) )
-*
-*
-            IF( NX.LT.SMINMN ) THEN
-*
-*              Determine if workspace is large enough for blocked code.
-*
-               MINWS = ( SN+1 )*NB
-               IWS = MAX( IWS, MINWS )
-               IF( LWORK.LT.MINWS ) THEN
-*
-*                 Not enough workspace to use optimal NB: Reduce NB and
-*                 determine the minimum value of NB.
-*
-                  NB = LWORK / ( SN+1 )
-                  NBMIN = MAX( 2, ILAENV( INBMIN, 'ZGEQRF', ' ', SM, SN,
-     $                    -1, -1 ) )
-*
-*
-               END IF
-            END IF
-         END IF
-*
-*        Initialize partial column norms. The first N elements of work
-*        store the exact column norms.
-*
-         DO 20 J = NFXD + 1, N
-            RWORK( J ) = DZNRM2( SM, A( NFXD+1, J ), 1 )
-            RWORK( N+J ) = RWORK( J )
-   20    CONTINUE
-*
-         IF( ( NB.GE.NBMIN ) .AND. ( NB.LT.SMINMN ) .AND.
-     $       ( NX.LT.SMINMN ) ) THEN
-*
-*           Use blocked code initially.
-*
-            J = NFXD + 1
-*
-*           Compute factorization: while loop.
-*
-*
-            TOPBMN = MINMN - NX
-   30       CONTINUE
-            IF( J.LE.TOPBMN ) THEN
-               JB = MIN( NB, TOPBMN-J+1 )
-*
-*              Factorize JB columns among columns J:N.
-*
-               CALL ZLAQPS( M, N-J+1, J-1, JB, FJB, A( 1, J ), LDA,
-     $                      JPVT( J ), TAU( J ), RWORK( J ),
-     $                      RWORK( N+J ), WORK( 1 ), WORK( JB+1 ),
-     $                      N-J+1 )
-*
-               J = J + FJB
-               GO TO 30
-            END IF
-         ELSE
-            J = NFXD + 1
-         END IF
-*
-*        Use unblocked code to factor the last or only block.
-*
-*
-         IF( J.LE.MINMN )
-     $      CALL ZLAQP2( M, N-J+1, J-1, A( 1, J ), LDA, JPVT( J ),
-     $                   TAU( J ), RWORK( J ), RWORK( N+J ), WORK( 1 ) )
-*
-      END IF
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of ZGEQP3
-*
-      END
--- a/libcruft/lapack/zgeqpf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,234 +0,0 @@
-      SUBROUTINE ZGEQPF( M, N, A, LDA, JPVT, TAU, WORK, RWORK, INFO )
-*
-*  -- LAPACK deprecated driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      DOUBLE PRECISION   RWORK( * )
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  This routine is deprecated and has been replaced by routine ZGEQP3.
-*
-*  ZGEQPF computes a QR factorization with column pivoting of a
-*  complex M-by-N matrix A: A*P = Q*R.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the upper triangle of the array contains the
-*          min(M,N)-by-N upper triangular matrix R; the elements
-*          below the diagonal, together with the array TAU,
-*          represent the unitary matrix Q as a product of
-*          min(m,n) elementary reflectors.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          On entry, if JPVT(i) .ne. 0, the i-th column of A is permuted
-*          to the front of A*P (a leading column); if JPVT(i) = 0,
-*          the i-th column of A is a free column.
-*          On exit, if JPVT(i) = k, then the i-th column of A*P
-*          was the k-th column of A.
-*
-*  TAU     (output) COMPLEX*16 array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors.
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (N)
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (2*N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(n)
-*
-*  Each H(i) has the form
-*
-*     H = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i).
-*
-*  The matrix P is represented in jpvt as follows: If
-*     jpvt(j) = i
-*  then the jth column of P is the ith canonical unit vector.
-*
-*  Partial column norm updating strategy modified by
-*    Z. Drmac and Z. Bujanovic, Dept. of Mathematics,
-*    University of Zagreb, Croatia.
-*    June 2006.
-*  For more details see LAPACK Working Note 176.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ITEMP, J, MA, MN, PVT
-      DOUBLE PRECISION   TEMP, TEMP2, TOL3Z
-      COMPLEX*16         AII
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZGEQR2, ZLARF, ZLARFG, ZSWAP, ZUNM2R
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DCMPLX, DCONJG, MAX, MIN, SQRT
-*     ..
-*     .. External Functions ..
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DLAMCH, DZNRM2
-      EXTERNAL           IDAMAX, DLAMCH, DZNRM2
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGEQPF', -INFO )
-         RETURN
-      END IF
-*
-      MN = MIN( M, N )
-      TOL3Z = SQRT(DLAMCH('Epsilon'))
-*
-*     Move initial columns up front
-*
-      ITEMP = 1
-      DO 10 I = 1, N
-         IF( JPVT( I ).NE.0 ) THEN
-            IF( I.NE.ITEMP ) THEN
-               CALL ZSWAP( M, A( 1, I ), 1, A( 1, ITEMP ), 1 )
-               JPVT( I ) = JPVT( ITEMP )
-               JPVT( ITEMP ) = I
-            ELSE
-               JPVT( I ) = I
-            END IF
-            ITEMP = ITEMP + 1
-         ELSE
-            JPVT( I ) = I
-         END IF
-   10 CONTINUE
-      ITEMP = ITEMP - 1
-*
-*     Compute the QR factorization and update remaining columns
-*
-      IF( ITEMP.GT.0 ) THEN
-         MA = MIN( ITEMP, M )
-         CALL ZGEQR2( M, MA, A, LDA, TAU, WORK, INFO )
-         IF( MA.LT.N ) THEN
-            CALL ZUNM2R( 'Left', 'Conjugate transpose', M, N-MA, MA, A,
-     $                   LDA, TAU, A( 1, MA+1 ), LDA, WORK, INFO )
-         END IF
-      END IF
-*
-      IF( ITEMP.LT.MN ) THEN
-*
-*        Initialize partial column norms. The first n elements of
-*        work store the exact column norms.
-*
-         DO 20 I = ITEMP + 1, N
-            RWORK( I ) = DZNRM2( M-ITEMP, A( ITEMP+1, I ), 1 )
-            RWORK( N+I ) = RWORK( I )
-   20    CONTINUE
-*
-*        Compute factorization
-*
-         DO 40 I = ITEMP + 1, MN
-*
-*           Determine ith pivot column and swap if necessary
-*
-            PVT = ( I-1 ) + IDAMAX( N-I+1, RWORK( I ), 1 )
-*
-            IF( PVT.NE.I ) THEN
-               CALL ZSWAP( M, A( 1, PVT ), 1, A( 1, I ), 1 )
-               ITEMP = JPVT( PVT )
-               JPVT( PVT ) = JPVT( I )
-               JPVT( I ) = ITEMP
-               RWORK( PVT ) = RWORK( I )
-               RWORK( N+PVT ) = RWORK( N+I )
-            END IF
-*
-*           Generate elementary reflector H(i)
-*
-            AII = A( I, I )
-            CALL ZLARFG( M-I+1, AII, A( MIN( I+1, M ), I ), 1,
-     $                   TAU( I ) )
-            A( I, I ) = AII
-*
-            IF( I.LT.N ) THEN
-*
-*              Apply H(i) to A(i:m,i+1:n) from the left
-*
-               AII = A( I, I )
-               A( I, I ) = DCMPLX( ONE )
-               CALL ZLARF( 'Left', M-I+1, N-I, A( I, I ), 1,
-     $                     DCONJG( TAU( I ) ), A( I, I+1 ), LDA, WORK )
-               A( I, I ) = AII
-            END IF
-*
-*           Update partial column norms
-*
-            DO 30 J = I + 1, N
-               IF( RWORK( J ).NE.ZERO ) THEN
-*
-*                 NOTE: The following 4 lines follow from the analysis in
-*                 Lapack Working Note 176.
-*                 
-                  TEMP = ABS( A( I, J ) ) / RWORK( J )
-                  TEMP = MAX( ZERO, ( ONE+TEMP )*( ONE-TEMP ) )
-                  TEMP2 = TEMP*( RWORK( J ) / RWORK( N+J ) )**2
-                  IF( TEMP2 .LE. TOL3Z ) THEN 
-                     IF( M-I.GT.0 ) THEN
-                        RWORK( J ) = DZNRM2( M-I, A( I+1, J ), 1 )
-                        RWORK( N+J ) = RWORK( J )
-                     ELSE
-                        RWORK( J ) = ZERO
-                        RWORK( N+J ) = ZERO
-                     END IF
-                  ELSE
-                     RWORK( J ) = RWORK( J )*SQRT( TEMP )
-                  END IF
-               END IF
-   30       CONTINUE
-*
-   40    CONTINUE
-      END IF
-      RETURN
-*
-*     End of ZGEQPF
-*
-      END
--- a/libcruft/lapack/zgeqr2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,121 +0,0 @@
-      SUBROUTINE ZGEQR2( M, N, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGEQR2 computes a QR factorization of a complex m by n matrix A:
-*  A = Q * R.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the m by n matrix A.
-*          On exit, the elements on and above the diagonal of the array
-*          contain the min(m,n) by n upper trapezoidal matrix R (R is
-*          upper triangular if m >= n); the elements below the diagonal,
-*          with the array TAU, represent the unitary matrix Q as a
-*          product of elementary reflectors (see Further Details).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) COMPLEX*16 array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(k), where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i),
-*  and tau in TAU(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, K
-      COMPLEX*16         ALPHA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLARF, ZLARFG
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGEQR2', -INFO )
-         RETURN
-      END IF
-*
-      K = MIN( M, N )
-*
-      DO 10 I = 1, K
-*
-*        Generate elementary reflector H(i) to annihilate A(i+1:m,i)
-*
-         CALL ZLARFG( M-I+1, A( I, I ), A( MIN( I+1, M ), I ), 1,
-     $                TAU( I ) )
-         IF( I.LT.N ) THEN
-*
-*           Apply H(i)' to A(i:m,i+1:n) from the left
-*
-            ALPHA = A( I, I )
-            A( I, I ) = ONE
-            CALL ZLARF( 'Left', M-I+1, N-I, A( I, I ), 1,
-     $                  DCONJG( TAU( I ) ), A( I, I+1 ), LDA, WORK )
-            A( I, I ) = ALPHA
-         END IF
-   10 CONTINUE
-      RETURN
-*
-*     End of ZGEQR2
-*
-      END
--- a/libcruft/lapack/zgeqrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,196 +0,0 @@
-      SUBROUTINE ZGEQRF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGEQRF computes a QR factorization of a complex M-by-N matrix A:
-*  A = Q * R.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the elements on and above the diagonal of the array
-*          contain the min(M,N)-by-N upper trapezoidal matrix R (R is
-*          upper triangular if m >= n); the elements below the diagonal,
-*          with the array TAU, represent the unitary matrix Q as a
-*          product of min(m,n) elementary reflectors (see Further
-*          Details).
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) COMPLEX*16 array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,N).
-*          For optimum performance LWORK >= N*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(k), where k = min(m,n).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i),
-*  and tau in TAU(i).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, K, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZGEQR2, ZLARFB, ZLARFT
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NB = ILAENV( 1, 'ZGEQRF', ' ', M, N, -1, -1 )
-      LWKOPT = N*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGEQRF', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      K = MIN( M, N )
-      IF( K.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = N
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'ZGEQRF', ' ', M, N, -1, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = N
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'ZGEQRF', ' ', M, N, -1,
-     $                 -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code initially
-*
-         DO 10 I = 1, K - NX, NB
-            IB = MIN( K-I+1, NB )
-*
-*           Compute the QR factorization of the current block
-*           A(i:m,i:i+ib-1)
-*
-            CALL ZGEQR2( M-I+1, IB, A( I, I ), LDA, TAU( I ), WORK,
-     $                   IINFO )
-            IF( I+IB.LE.N ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i) H(i+1) . . . H(i+ib-1)
-*
-               CALL ZLARFT( 'Forward', 'Columnwise', M-I+1, IB,
-     $                      A( I, I ), LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H' to A(i:m,i+ib:n) from the left
-*
-               CALL ZLARFB( 'Left', 'Conjugate transpose', 'Forward',
-     $                      'Columnwise', M-I+1, N-I-IB+1, IB,
-     $                      A( I, I ), LDA, WORK, LDWORK, A( I, I+IB ),
-     $                      LDA, WORK( IB+1 ), LDWORK )
-            END IF
-   10    CONTINUE
-      ELSE
-         I = 1
-      END IF
-*
-*     Use unblocked code to factor the last or only block.
-*
-      IF( I.LE.K )
-     $   CALL ZGEQR2( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK,
-     $                IINFO )
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of ZGEQRF
-*
-      END
--- a/libcruft/lapack/zgesv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-      SUBROUTINE ZGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX*16         A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGESV computes the solution to a complex system of linear equations
-*     A * X = B,
-*  where A is an N-by-N matrix and X and B are N-by-NRHS matrices.
-*
-*  The LU decomposition with partial pivoting and row interchanges is
-*  used to factor A as
-*     A = P * L * U,
-*  where P is a permutation matrix, L is unit lower triangular, and U is
-*  upper triangular.  The factored form of A is then used to solve the
-*  system of equations A * X = B.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of linear equations, i.e., the order of the
-*          matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the N-by-N coefficient matrix A.
-*          On exit, the factors L and U from the factorization
-*          A = P*L*U; the unit diagonal elements of L are not stored.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  IPIV    (output) INTEGER array, dimension (N)
-*          The pivot indices that define the permutation matrix P;
-*          row i of the matrix was interchanged with row IPIV(i).
-*
-*  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
-*          On entry, the N-by-NRHS matrix of right hand side matrix B.
-*          On exit, if INFO = 0, the N-by-NRHS solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, U(i,i) is exactly zero.  The factorization
-*                has been completed, but the factor U is exactly
-*                singular, so the solution could not be computed.
-*
-*  =====================================================================
-*
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZGETRF, ZGETRS
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGESV ', -INFO )
-         RETURN
-      END IF
-*
-*     Compute the LU factorization of A.
-*
-      CALL ZGETRF( N, N, A, LDA, IPIV, INFO )
-      IF( INFO.EQ.0 ) THEN
-*
-*        Solve the system A*X = B, overwriting B with X.
-*
-         CALL ZGETRS( 'No transpose', N, NRHS, A, LDA, IPIV, B, LDB,
-     $                INFO )
-      END IF
-      RETURN
-*
-*     End of ZGESV
-*
-      END
--- a/libcruft/lapack/zgesvd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3602 +0,0 @@
-      SUBROUTINE ZGESVD( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT,
-     $                   WORK, LWORK, RWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBU, JOBVT
-      INTEGER            INFO, LDA, LDU, LDVT, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   RWORK( * ), S( * )
-      COMPLEX*16         A( LDA, * ), U( LDU, * ), VT( LDVT, * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGESVD computes the singular value decomposition (SVD) of a complex
-*  M-by-N matrix A, optionally computing the left and/or right singular
-*  vectors. The SVD is written
-*
-*       A = U * SIGMA * conjugate-transpose(V)
-*
-*  where SIGMA is an M-by-N matrix which is zero except for its
-*  min(m,n) diagonal elements, U is an M-by-M unitary matrix, and
-*  V is an N-by-N unitary matrix.  The diagonal elements of SIGMA
-*  are the singular values of A; they are real and non-negative, and
-*  are returned in descending order.  The first min(m,n) columns of
-*  U and V are the left and right singular vectors of A.
-*
-*  Note that the routine returns V**H, not V.
-*
-*  Arguments
-*  =========
-*
-*  JOBU    (input) CHARACTER*1
-*          Specifies options for computing all or part of the matrix U:
-*          = 'A':  all M columns of U are returned in array U:
-*          = 'S':  the first min(m,n) columns of U (the left singular
-*                  vectors) are returned in the array U;
-*          = 'O':  the first min(m,n) columns of U (the left singular
-*                  vectors) are overwritten on the array A;
-*          = 'N':  no columns of U (no left singular vectors) are
-*                  computed.
-*
-*  JOBVT   (input) CHARACTER*1
-*          Specifies options for computing all or part of the matrix
-*          V**H:
-*          = 'A':  all N rows of V**H are returned in the array VT;
-*          = 'S':  the first min(m,n) rows of V**H (the right singular
-*                  vectors) are returned in the array VT;
-*          = 'O':  the first min(m,n) rows of V**H (the right singular
-*                  vectors) are overwritten on the array A;
-*          = 'N':  no rows of V**H (no right singular vectors) are
-*                  computed.
-*
-*          JOBVT and JOBU cannot both be 'O'.
-*
-*  M       (input) INTEGER
-*          The number of rows of the input matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the input matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit,
-*          if JOBU = 'O',  A is overwritten with the first min(m,n)
-*                          columns of U (the left singular vectors,
-*                          stored columnwise);
-*          if JOBVT = 'O', A is overwritten with the first min(m,n)
-*                          rows of V**H (the right singular vectors,
-*                          stored rowwise);
-*          if JOBU .ne. 'O' and JOBVT .ne. 'O', the contents of A
-*                          are destroyed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  S       (output) DOUBLE PRECISION array, dimension (min(M,N))
-*          The singular values of A, sorted so that S(i) >= S(i+1).
-*
-*  U       (output) COMPLEX*16 array, dimension (LDU,UCOL)
-*          (LDU,M) if JOBU = 'A' or (LDU,min(M,N)) if JOBU = 'S'.
-*          If JOBU = 'A', U contains the M-by-M unitary matrix U;
-*          if JOBU = 'S', U contains the first min(m,n) columns of U
-*          (the left singular vectors, stored columnwise);
-*          if JOBU = 'N' or 'O', U is not referenced.
-*
-*  LDU     (input) INTEGER
-*          The leading dimension of the array U.  LDU >= 1; if
-*          JOBU = 'S' or 'A', LDU >= M.
-*
-*  VT      (output) COMPLEX*16 array, dimension (LDVT,N)
-*          If JOBVT = 'A', VT contains the N-by-N unitary matrix
-*          V**H;
-*          if JOBVT = 'S', VT contains the first min(m,n) rows of
-*          V**H (the right singular vectors, stored rowwise);
-*          if JOBVT = 'N' or 'O', VT is not referenced.
-*
-*  LDVT    (input) INTEGER
-*          The leading dimension of the array VT.  LDVT >= 1; if
-*          JOBVT = 'A', LDVT >= N; if JOBVT = 'S', LDVT >= min(M,N).
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          LWORK >=  MAX(1,2*MIN(M,N)+MAX(M,N)).
-*          For good performance, LWORK should generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (5*min(M,N))
-*          On exit, if INFO > 0, RWORK(1:MIN(M,N)-1) contains the
-*          unconverged superdiagonal elements of an upper bidiagonal
-*          matrix B whose diagonal is in S (not necessarily sorted).
-*          B satisfies A = U * B * VT, so it has the same singular
-*          values as A, and singular vectors related by U and VT.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          > 0:  if ZBDSQR did not converge, INFO specifies how many
-*                superdiagonals of an intermediate bidiagonal form B
-*                did not converge to zero. See the description of RWORK
-*                above for details.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0D0, 0.0D0 ),
-     $                   CONE = ( 1.0D0, 0.0D0 ) )
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, WNTUA, WNTUAS, WNTUN, WNTUO, WNTUS,
-     $                   WNTVA, WNTVAS, WNTVN, WNTVO, WNTVS
-      INTEGER            BLK, CHUNK, I, IE, IERR, IR, IRWORK, ISCL,
-     $                   ITAU, ITAUP, ITAUQ, IU, IWORK, LDWRKR, LDWRKU,
-     $                   MAXWRK, MINMN, MINWRK, MNTHR, NCU, NCVT, NRU,
-     $                   NRVT, WRKBL
-      DOUBLE PRECISION   ANRM, BIGNUM, EPS, SMLNUM
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   DUM( 1 )
-      COMPLEX*16         CDUM( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLASCL, XERBLA, ZBDSQR, ZGEBRD, ZGELQF, ZGEMM,
-     $                   ZGEQRF, ZLACPY, ZLASCL, ZLASET, ZUNGBR, ZUNGLQ,
-     $                   ZUNGQR, ZUNMBR
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      DOUBLE PRECISION   DLAMCH, ZLANGE
-      EXTERNAL           LSAME, ILAENV, DLAMCH, ZLANGE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      MINMN = MIN( M, N )
-      WNTUA = LSAME( JOBU, 'A' )
-      WNTUS = LSAME( JOBU, 'S' )
-      WNTUAS = WNTUA .OR. WNTUS
-      WNTUO = LSAME( JOBU, 'O' )
-      WNTUN = LSAME( JOBU, 'N' )
-      WNTVA = LSAME( JOBVT, 'A' )
-      WNTVS = LSAME( JOBVT, 'S' )
-      WNTVAS = WNTVA .OR. WNTVS
-      WNTVO = LSAME( JOBVT, 'O' )
-      WNTVN = LSAME( JOBVT, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-      IF( .NOT.( WNTUA .OR. WNTUS .OR. WNTUO .OR. WNTUN ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.( WNTVA .OR. WNTVS .OR. WNTVO .OR. WNTVN ) .OR.
-     $         ( WNTVO .AND. WNTUO ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -6
-      ELSE IF( LDU.LT.1 .OR. ( WNTUAS .AND. LDU.LT.M ) ) THEN
-         INFO = -9
-      ELSE IF( LDVT.LT.1 .OR. ( WNTVA .AND. LDVT.LT.N ) .OR.
-     $         ( WNTVS .AND. LDVT.LT.MINMN ) ) THEN
-         INFO = -11
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of workspace needed at that point in the code,
-*       as well as the preferred amount for good performance.
-*       CWorkspace refers to complex workspace, and RWorkspace to
-*       real workspace. NB refers to the optimal block size for the
-*       immediately following subroutine, as returned by ILAENV.)
-*
-      IF( INFO.EQ.0 ) THEN
-         MINWRK = 1
-         MAXWRK = 1
-         IF( M.GE.N .AND. MINMN.GT.0 ) THEN
-*
-*           Space needed for ZBDSQR is BDSPAC = 5*N
-*
-            MNTHR = ILAENV( 6, 'ZGESVD', JOBU // JOBVT, M, N, 0, 0 )
-            IF( M.GE.MNTHR ) THEN
-               IF( WNTUN ) THEN
-*
-*                 Path 1 (M much larger than N, JOBU='N')
-*
-                  MAXWRK = N + N*ILAENV( 1, 'ZGEQRF', ' ', M, N, -1,
-     $                     -1 )
-                  MAXWRK = MAX( MAXWRK, 2*N+2*N*
-     $                     ILAENV( 1, 'ZGEBRD', ' ', N, N, -1, -1 ) )
-                  IF( WNTVO .OR. WNTVAS )
-     $               MAXWRK = MAX( MAXWRK, 2*N+( N-1 )*
-     $                        ILAENV( 1, 'ZUNGBR', 'P', N, N, N, -1 ) )
-                  MINWRK = 3*N
-               ELSE IF( WNTUO .AND. WNTVN ) THEN
-*
-*                 Path 2 (M much larger than N, JOBU='O', JOBVT='N')
-*
-                  WRKBL = N + N*ILAENV( 1, 'ZGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'ZUNGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+2*N*
-     $                    ILAENV( 1, 'ZGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+N*
-     $                    ILAENV( 1, 'ZUNGBR', 'Q', N, N, N, -1 ) )
-                  MAXWRK = MAX( N*N+WRKBL, N*N+M*N )
-                  MINWRK = 2*N + M
-               ELSE IF( WNTUO .AND. WNTVAS ) THEN
-*
-*                 Path 3 (M much larger than N, JOBU='O', JOBVT='S' or
-*                 'A')
-*
-                  WRKBL = N + N*ILAENV( 1, 'ZGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'ZUNGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+2*N*
-     $                    ILAENV( 1, 'ZGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+N*
-     $                    ILAENV( 1, 'ZUNGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+( N-1 )*
-     $                    ILAENV( 1, 'ZUNGBR', 'P', N, N, N, -1 ) )
-                  MAXWRK = MAX( N*N+WRKBL, N*N+M*N )
-                  MINWRK = 2*N + M
-               ELSE IF( WNTUS .AND. WNTVN ) THEN
-*
-*                 Path 4 (M much larger than N, JOBU='S', JOBVT='N')
-*
-                  WRKBL = N + N*ILAENV( 1, 'ZGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'ZUNGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+2*N*
-     $                    ILAENV( 1, 'ZGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+N*
-     $                    ILAENV( 1, 'ZUNGBR', 'Q', N, N, N, -1 ) )
-                  MAXWRK = N*N + WRKBL
-                  MINWRK = 2*N + M
-               ELSE IF( WNTUS .AND. WNTVO ) THEN
-*
-*                 Path 5 (M much larger than N, JOBU='S', JOBVT='O')
-*
-                  WRKBL = N + N*ILAENV( 1, 'ZGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'ZUNGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+2*N*
-     $                    ILAENV( 1, 'ZGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+N*
-     $                    ILAENV( 1, 'ZUNGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+( N-1 )*
-     $                    ILAENV( 1, 'ZUNGBR', 'P', N, N, N, -1 ) )
-                  MAXWRK = 2*N*N + WRKBL
-                  MINWRK = 2*N + M
-               ELSE IF( WNTUS .AND. WNTVAS ) THEN
-*
-*                 Path 6 (M much larger than N, JOBU='S', JOBVT='S' or
-*                 'A')
-*
-                  WRKBL = N + N*ILAENV( 1, 'ZGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+N*ILAENV( 1, 'ZUNGQR', ' ', M,
-     $                    N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+2*N*
-     $                    ILAENV( 1, 'ZGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+N*
-     $                    ILAENV( 1, 'ZUNGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+( N-1 )*
-     $                    ILAENV( 1, 'ZUNGBR', 'P', N, N, N, -1 ) )
-                  MAXWRK = N*N + WRKBL
-                  MINWRK = 2*N + M
-               ELSE IF( WNTUA .AND. WNTVN ) THEN
-*
-*                 Path 7 (M much larger than N, JOBU='A', JOBVT='N')
-*
-                  WRKBL = N + N*ILAENV( 1, 'ZGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+M*ILAENV( 1, 'ZUNGQR', ' ', M,
-     $                    M, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+2*N*
-     $                    ILAENV( 1, 'ZGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+N*
-     $                    ILAENV( 1, 'ZUNGBR', 'Q', N, N, N, -1 ) )
-                  MAXWRK = N*N + WRKBL
-                  MINWRK = 2*N + M
-               ELSE IF( WNTUA .AND. WNTVO ) THEN
-*
-*                 Path 8 (M much larger than N, JOBU='A', JOBVT='O')
-*
-                  WRKBL = N + N*ILAENV( 1, 'ZGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+M*ILAENV( 1, 'ZUNGQR', ' ', M,
-     $                    M, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+2*N*
-     $                    ILAENV( 1, 'ZGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+N*
-     $                    ILAENV( 1, 'ZUNGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+( N-1 )*
-     $                    ILAENV( 1, 'ZUNGBR', 'P', N, N, N, -1 ) )
-                  MAXWRK = 2*N*N + WRKBL
-                  MINWRK = 2*N + M
-               ELSE IF( WNTUA .AND. WNTVAS ) THEN
-*
-*                 Path 9 (M much larger than N, JOBU='A', JOBVT='S' or
-*                 'A')
-*
-                  WRKBL = N + N*ILAENV( 1, 'ZGEQRF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, N+M*ILAENV( 1, 'ZUNGQR', ' ', M,
-     $                    M, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+2*N*
-     $                    ILAENV( 1, 'ZGEBRD', ' ', N, N, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+N*
-     $                    ILAENV( 1, 'ZUNGBR', 'Q', N, N, N, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*N+( N-1 )*
-     $                    ILAENV( 1, 'ZUNGBR', 'P', N, N, N, -1 ) )
-                  MAXWRK = N*N + WRKBL
-                  MINWRK = 2*N + M
-               END IF
-            ELSE
-*
-*              Path 10 (M at least N, but not much larger)
-*
-               MAXWRK = 2*N + ( M+N )*ILAENV( 1, 'ZGEBRD', ' ', M, N,
-     $                  -1, -1 )
-               IF( WNTUS .OR. WNTUO )
-     $            MAXWRK = MAX( MAXWRK, 2*N+N*
-     $                     ILAENV( 1, 'ZUNGBR', 'Q', M, N, N, -1 ) )
-               IF( WNTUA )
-     $            MAXWRK = MAX( MAXWRK, 2*N+M*
-     $                     ILAENV( 1, 'ZUNGBR', 'Q', M, M, N, -1 ) )
-               IF( .NOT.WNTVN )
-     $            MAXWRK = MAX( MAXWRK, 2*N+( N-1 )*
-     $                     ILAENV( 1, 'ZUNGBR', 'P', N, N, N, -1 ) )
-               MINWRK = 2*N + M
-            END IF
-         ELSE IF( MINMN.GT.0 ) THEN
-*
-*           Space needed for ZBDSQR is BDSPAC = 5*M
-*
-            MNTHR = ILAENV( 6, 'ZGESVD', JOBU // JOBVT, M, N, 0, 0 )
-            IF( N.GE.MNTHR ) THEN
-               IF( WNTVN ) THEN
-*
-*                 Path 1t(N much larger than M, JOBVT='N')
-*
-                  MAXWRK = M + M*ILAENV( 1, 'ZGELQF', ' ', M, N, -1,
-     $                     -1 )
-                  MAXWRK = MAX( MAXWRK, 2*M+2*M*
-     $                     ILAENV( 1, 'ZGEBRD', ' ', M, M, -1, -1 ) )
-                  IF( WNTUO .OR. WNTUAS )
-     $               MAXWRK = MAX( MAXWRK, 2*M+M*
-     $                        ILAENV( 1, 'ZUNGBR', 'Q', M, M, M, -1 ) )
-                  MINWRK = 3*M
-               ELSE IF( WNTVO .AND. WNTUN ) THEN
-*
-*                 Path 2t(N much larger than M, JOBU='N', JOBVT='O')
-*
-                  WRKBL = M + M*ILAENV( 1, 'ZGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'ZUNGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+2*M*
-     $                    ILAENV( 1, 'ZGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+( M-1 )*
-     $                    ILAENV( 1, 'ZUNGBR', 'P', M, M, M, -1 ) )
-                  MAXWRK = MAX( M*M+WRKBL, M*M+M*N )
-                  MINWRK = 2*M + N
-               ELSE IF( WNTVO .AND. WNTUAS ) THEN
-*
-*                 Path 3t(N much larger than M, JOBU='S' or 'A',
-*                 JOBVT='O')
-*
-                  WRKBL = M + M*ILAENV( 1, 'ZGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'ZUNGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+2*M*
-     $                    ILAENV( 1, 'ZGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+( M-1 )*
-     $                    ILAENV( 1, 'ZUNGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+M*
-     $                    ILAENV( 1, 'ZUNGBR', 'Q', M, M, M, -1 ) )
-                  MAXWRK = MAX( M*M+WRKBL, M*M+M*N )
-                  MINWRK = 2*M + N
-               ELSE IF( WNTVS .AND. WNTUN ) THEN
-*
-*                 Path 4t(N much larger than M, JOBU='N', JOBVT='S')
-*
-                  WRKBL = M + M*ILAENV( 1, 'ZGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'ZUNGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+2*M*
-     $                    ILAENV( 1, 'ZGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+( M-1 )*
-     $                    ILAENV( 1, 'ZUNGBR', 'P', M, M, M, -1 ) )
-                  MAXWRK = M*M + WRKBL
-                  MINWRK = 2*M + N
-               ELSE IF( WNTVS .AND. WNTUO ) THEN
-*
-*                 Path 5t(N much larger than M, JOBU='O', JOBVT='S')
-*
-                  WRKBL = M + M*ILAENV( 1, 'ZGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'ZUNGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+2*M*
-     $                    ILAENV( 1, 'ZGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+( M-1 )*
-     $                    ILAENV( 1, 'ZUNGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+M*
-     $                    ILAENV( 1, 'ZUNGBR', 'Q', M, M, M, -1 ) )
-                  MAXWRK = 2*M*M + WRKBL
-                  MINWRK = 2*M + N
-               ELSE IF( WNTVS .AND. WNTUAS ) THEN
-*
-*                 Path 6t(N much larger than M, JOBU='S' or 'A',
-*                 JOBVT='S')
-*
-                  WRKBL = M + M*ILAENV( 1, 'ZGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+M*ILAENV( 1, 'ZUNGLQ', ' ', M,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+2*M*
-     $                    ILAENV( 1, 'ZGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+( M-1 )*
-     $                    ILAENV( 1, 'ZUNGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+M*
-     $                    ILAENV( 1, 'ZUNGBR', 'Q', M, M, M, -1 ) )
-                  MAXWRK = M*M + WRKBL
-                  MINWRK = 2*M + N
-               ELSE IF( WNTVA .AND. WNTUN ) THEN
-*
-*                 Path 7t(N much larger than M, JOBU='N', JOBVT='A')
-*
-                  WRKBL = M + M*ILAENV( 1, 'ZGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+N*ILAENV( 1, 'ZUNGLQ', ' ', N,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+2*M*
-     $                    ILAENV( 1, 'ZGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+( M-1 )*
-     $                    ILAENV( 1, 'ZUNGBR', 'P', M, M, M, -1 ) )
-                  MAXWRK = M*M + WRKBL
-                  MINWRK = 2*M + N
-               ELSE IF( WNTVA .AND. WNTUO ) THEN
-*
-*                 Path 8t(N much larger than M, JOBU='O', JOBVT='A')
-*
-                  WRKBL = M + M*ILAENV( 1, 'ZGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+N*ILAENV( 1, 'ZUNGLQ', ' ', N,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+2*M*
-     $                    ILAENV( 1, 'ZGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+( M-1 )*
-     $                    ILAENV( 1, 'ZUNGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+M*
-     $                    ILAENV( 1, 'ZUNGBR', 'Q', M, M, M, -1 ) )
-                  MAXWRK = 2*M*M + WRKBL
-                  MINWRK = 2*M + N
-               ELSE IF( WNTVA .AND. WNTUAS ) THEN
-*
-*                 Path 9t(N much larger than M, JOBU='S' or 'A',
-*                 JOBVT='A')
-*
-                  WRKBL = M + M*ILAENV( 1, 'ZGELQF', ' ', M, N, -1, -1 )
-                  WRKBL = MAX( WRKBL, M+N*ILAENV( 1, 'ZUNGLQ', ' ', N,
-     $                    N, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+2*M*
-     $                    ILAENV( 1, 'ZGEBRD', ' ', M, M, -1, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+( M-1 )*
-     $                    ILAENV( 1, 'ZUNGBR', 'P', M, M, M, -1 ) )
-                  WRKBL = MAX( WRKBL, 2*M+M*
-     $                    ILAENV( 1, 'ZUNGBR', 'Q', M, M, M, -1 ) )
-                  MAXWRK = M*M + WRKBL
-                  MINWRK = 2*M + N
-               END IF
-            ELSE
-*
-*              Path 10t(N greater than M, but not much larger)
-*
-               MAXWRK = 2*M + ( M+N )*ILAENV( 1, 'ZGEBRD', ' ', M, N,
-     $                  -1, -1 )
-               IF( WNTVS .OR. WNTVO )
-     $            MAXWRK = MAX( MAXWRK, 2*M+M*
-     $                     ILAENV( 1, 'ZUNGBR', 'P', M, N, M, -1 ) )
-               IF( WNTVA )
-     $            MAXWRK = MAX( MAXWRK, 2*M+N*
-     $                     ILAENV( 1, 'ZUNGBR', 'P', N, N, M, -1 ) )
-               IF( .NOT.WNTUN )
-     $            MAXWRK = MAX( MAXWRK, 2*M+( M-1 )*
-     $                     ILAENV( 1, 'ZUNGBR', 'Q', M, M, M, -1 ) )
-               MINWRK = 2*M + N
-            END IF
-         END IF
-         MAXWRK = MAX( MAXWRK, MINWRK )
-         WORK( 1 ) = MAXWRK
-*
-         IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
-            INFO = -13
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGESVD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         RETURN
-      END IF
-*
-*     Get machine constants
-*
-      EPS = DLAMCH( 'P' )
-      SMLNUM = SQRT( DLAMCH( 'S' ) ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = ZLANGE( 'M', M, N, A, LDA, DUM )
-      ISCL = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-         ISCL = 1
-         CALL ZLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, IERR )
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-         ISCL = 1
-         CALL ZLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, IERR )
-      END IF
-*
-      IF( M.GE.N ) THEN
-*
-*        A has at least as many rows as columns. If A has sufficiently
-*        more rows than columns, first reduce using the QR
-*        decomposition (if sufficient workspace available)
-*
-         IF( M.GE.MNTHR ) THEN
-*
-            IF( WNTUN ) THEN
-*
-*              Path 1 (M much larger than N, JOBU='N')
-*              No left singular vectors to be computed
-*
-               ITAU = 1
-               IWORK = ITAU + N
-*
-*              Compute A=Q*R
-*              (CWorkspace: need 2*N, prefer N+N*NB)
-*              (RWorkspace: need 0)
-*
-               CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
-     $                      LWORK-IWORK+1, IERR )
-*
-*              Zero out below R
-*
-               CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO, A( 2, 1 ),
-     $                      LDA )
-               IE = 1
-               ITAUQ = 1
-               ITAUP = ITAUQ + N
-               IWORK = ITAUP + N
-*
-*              Bidiagonalize R in A
-*              (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
-*              (RWorkspace: need N)
-*
-               CALL ZGEBRD( N, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
-     $                      WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                      IERR )
-               NCVT = 0
-               IF( WNTVO .OR. WNTVAS ) THEN
-*
-*                 If right singular vectors desired, generate P'.
-*                 (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  NCVT = N
-               END IF
-               IRWORK = IE + N
-*
-*              Perform bidiagonal QR iteration, computing right
-*              singular vectors of A in A if desired
-*              (CWorkspace: 0)
-*              (RWorkspace: need BDSPAC)
-*
-               CALL ZBDSQR( 'U', N, NCVT, 0, 0, S, RWORK( IE ), A, LDA,
-     $                      CDUM, 1, CDUM, 1, RWORK( IRWORK ), INFO )
-*
-*              If right singular vectors desired in VT, copy them there
-*
-               IF( WNTVAS )
-     $            CALL ZLACPY( 'F', N, N, A, LDA, VT, LDVT )
-*
-            ELSE IF( WNTUO .AND. WNTVN ) THEN
-*
-*              Path 2 (M much larger than N, JOBU='O', JOBVT='N')
-*              N left singular vectors to be overwritten on A and
-*              no right singular vectors to be computed
-*
-               IF( LWORK.GE.N*N+3*N ) THEN
-*
-*                 Sufficient workspace for a fast algorithm
-*
-                  IR = 1
-                  IF( LWORK.GE.MAX( WRKBL, LDA*N )+LDA*N ) THEN
-*
-*                    WORK(IU) is LDA by N, WORK(IR) is LDA by N
-*
-                     LDWRKU = LDA
-                     LDWRKR = LDA
-                  ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N )+N*N ) THEN
-*
-*                    WORK(IU) is LDA by N, WORK(IR) is N by N
-*
-                     LDWRKU = LDA
-                     LDWRKR = N
-                  ELSE
-*
-*                    WORK(IU) is LDWRKU by N, WORK(IR) is N by N
-*
-                     LDWRKU = ( LWORK-N*N ) / N
-                     LDWRKR = N
-                  END IF
-                  ITAU = IR + LDWRKR*N
-                  IWORK = ITAU + N
-*
-*                 Compute A=Q*R
-*                 (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy R to WORK(IR) and zero out below it
-*
-                  CALL ZLACPY( 'U', N, N, A, LDA, WORK( IR ), LDWRKR )
-                  CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                         WORK( IR+1 ), LDWRKR )
-*
-*                 Generate Q in A
-*                 (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = 1
-                  ITAUQ = ITAU
-                  ITAUP = ITAUQ + N
-                  IWORK = ITAUP + N
-*
-*                 Bidiagonalize R in WORK(IR)
-*                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
-*                 (RWorkspace: need N)
-*
-                  CALL ZGEBRD( N, N, WORK( IR ), LDWRKR, S, RWORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Generate left vectors bidiagonalizing R
-*                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
-*                 (RWorkspace: need 0)
-*
-                  CALL ZUNGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
-     $                         WORK( ITAUQ ), WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-                  IRWORK = IE + N
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of R in WORK(IR)
-*                 (CWorkspace: need N*N)
-*                 (RWorkspace: need BDSPAC)
-*
-                  CALL ZBDSQR( 'U', N, 0, N, 0, S, RWORK( IE ), CDUM, 1,
-     $                         WORK( IR ), LDWRKR, CDUM, 1,
-     $                         RWORK( IRWORK ), INFO )
-                  IU = ITAUQ
-*
-*                 Multiply Q in A by left singular vectors of R in
-*                 WORK(IR), storing result in WORK(IU) and copying to A
-*                 (CWorkspace: need N*N+N, prefer N*N+M*N)
-*                 (RWorkspace: 0)
-*
-                  DO 10 I = 1, M, LDWRKU
-                     CHUNK = MIN( M-I+1, LDWRKU )
-                     CALL ZGEMM( 'N', 'N', CHUNK, N, N, CONE, A( I, 1 ),
-     $                           LDA, WORK( IR ), LDWRKR, CZERO,
-     $                           WORK( IU ), LDWRKU )
-                     CALL ZLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU,
-     $                            A( I, 1 ), LDA )
-   10             CONTINUE
-*
-               ELSE
-*
-*                 Insufficient workspace for a fast algorithm
-*
-                  IE = 1
-                  ITAUQ = 1
-                  ITAUP = ITAUQ + N
-                  IWORK = ITAUP + N
-*
-*                 Bidiagonalize A
-*                 (CWorkspace: need 2*N+M, prefer 2*N+(M+N)*NB)
-*                 (RWorkspace: N)
-*
-                  CALL ZGEBRD( M, N, A, LDA, S, RWORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Generate left vectors bidiagonalizing A
-*                 (CWorkspace: need 3*N, prefer 2*N+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNGBR( 'Q', M, N, N, A, LDA, WORK( ITAUQ ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IRWORK = IE + N
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of A in A
-*                 (CWorkspace: need 0)
-*                 (RWorkspace: need BDSPAC)
-*
-                  CALL ZBDSQR( 'U', N, 0, M, 0, S, RWORK( IE ), CDUM, 1,
-     $                         A, LDA, CDUM, 1, RWORK( IRWORK ), INFO )
-*
-               END IF
-*
-            ELSE IF( WNTUO .AND. WNTVAS ) THEN
-*
-*              Path 3 (M much larger than N, JOBU='O', JOBVT='S' or 'A')
-*              N left singular vectors to be overwritten on A and
-*              N right singular vectors to be computed in VT
-*
-               IF( LWORK.GE.N*N+3*N ) THEN
-*
-*                 Sufficient workspace for a fast algorithm
-*
-                  IR = 1
-                  IF( LWORK.GE.MAX( WRKBL, LDA*N )+LDA*N ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is LDA by N
-*
-                     LDWRKU = LDA
-                     LDWRKR = LDA
-                  ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N )+N*N ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is N by N
-*
-                     LDWRKU = LDA
-                     LDWRKR = N
-                  ELSE
-*
-*                    WORK(IU) is LDWRKU by N and WORK(IR) is N by N
-*
-                     LDWRKU = ( LWORK-N*N ) / N
-                     LDWRKR = N
-                  END IF
-                  ITAU = IR + LDWRKR*N
-                  IWORK = ITAU + N
-*
-*                 Compute A=Q*R
-*                 (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy R to VT, zeroing out below it
-*
-                  CALL ZLACPY( 'U', N, N, A, LDA, VT, LDVT )
-                  IF( N.GT.1 )
-     $               CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            VT( 2, 1 ), LDVT )
-*
-*                 Generate Q in A
-*                 (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = 1
-                  ITAUQ = ITAU
-                  ITAUP = ITAUQ + N
-                  IWORK = ITAUP + N
-*
-*                 Bidiagonalize R in VT, copying result to WORK(IR)
-*                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
-*                 (RWorkspace: need N)
-*
-                  CALL ZGEBRD( N, N, VT, LDVT, S, RWORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  CALL ZLACPY( 'L', N, N, VT, LDVT, WORK( IR ), LDWRKR )
-*
-*                 Generate left vectors bidiagonalizing R in WORK(IR)
-*                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
-     $                         WORK( ITAUQ ), WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-*
-*                 Generate right vectors bidiagonalizing R in VT
-*                 (CWorkspace: need N*N+3*N-1, prefer N*N+2*N+(N-1)*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IRWORK = IE + N
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of R in WORK(IR) and computing right
-*                 singular vectors of R in VT
-*                 (CWorkspace: need N*N)
-*                 (RWorkspace: need BDSPAC)
-*
-                  CALL ZBDSQR( 'U', N, N, N, 0, S, RWORK( IE ), VT,
-     $                         LDVT, WORK( IR ), LDWRKR, CDUM, 1,
-     $                         RWORK( IRWORK ), INFO )
-                  IU = ITAUQ
-*
-*                 Multiply Q in A by left singular vectors of R in
-*                 WORK(IR), storing result in WORK(IU) and copying to A
-*                 (CWorkspace: need N*N+N, prefer N*N+M*N)
-*                 (RWorkspace: 0)
-*
-                  DO 20 I = 1, M, LDWRKU
-                     CHUNK = MIN( M-I+1, LDWRKU )
-                     CALL ZGEMM( 'N', 'N', CHUNK, N, N, CONE, A( I, 1 ),
-     $                           LDA, WORK( IR ), LDWRKR, CZERO,
-     $                           WORK( IU ), LDWRKU )
-                     CALL ZLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU,
-     $                            A( I, 1 ), LDA )
-   20             CONTINUE
-*
-               ELSE
-*
-*                 Insufficient workspace for a fast algorithm
-*
-                  ITAU = 1
-                  IWORK = ITAU + N
-*
-*                 Compute A=Q*R
-*                 (CWorkspace: need 2*N, prefer N+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy R to VT, zeroing out below it
-*
-                  CALL ZLACPY( 'U', N, N, A, LDA, VT, LDVT )
-                  IF( N.GT.1 )
-     $               CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            VT( 2, 1 ), LDVT )
-*
-*                 Generate Q in A
-*                 (CWorkspace: need 2*N, prefer N+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = 1
-                  ITAUQ = ITAU
-                  ITAUP = ITAUQ + N
-                  IWORK = ITAUP + N
-*
-*                 Bidiagonalize R in VT
-*                 (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
-*                 (RWorkspace: N)
-*
-                  CALL ZGEBRD( N, N, VT, LDVT, S, RWORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Multiply Q in A by left vectors bidiagonalizing R
-*                 (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNMBR( 'Q', 'R', 'N', M, N, N, VT, LDVT,
-     $                         WORK( ITAUQ ), A, LDA, WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-*
-*                 Generate right vectors bidiagonalizing R in VT
-*                 (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IRWORK = IE + N
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of A in A and computing right
-*                 singular vectors of A in VT
-*                 (CWorkspace: 0)
-*                 (RWorkspace: need BDSPAC)
-*
-                  CALL ZBDSQR( 'U', N, N, M, 0, S, RWORK( IE ), VT,
-     $                         LDVT, A, LDA, CDUM, 1, RWORK( IRWORK ),
-     $                         INFO )
-*
-               END IF
-*
-            ELSE IF( WNTUS ) THEN
-*
-               IF( WNTVN ) THEN
-*
-*                 Path 4 (M much larger than N, JOBU='S', JOBVT='N')
-*                 N left singular vectors to be computed in U and
-*                 no right singular vectors to be computed
-*
-                  IF( LWORK.GE.N*N+3*N ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IR = 1
-                     IF( LWORK.GE.WRKBL+LDA*N ) THEN
-*
-*                       WORK(IR) is LDA by N
-*
-                        LDWRKR = LDA
-                     ELSE
-*
-*                       WORK(IR) is N by N
-*
-                        LDWRKR = N
-                     END IF
-                     ITAU = IR + LDWRKR*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R
-*                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IR), zeroing out below it
-*
-                     CALL ZLACPY( 'U', N, N, A, LDA, WORK( IR ),
-     $                            LDWRKR )
-                     CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            WORK( IR+1 ), LDWRKR )
-*
-*                    Generate Q in A
-*                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IR)
-*                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL ZGEBRD( N, N, WORK( IR ), LDWRKR, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left vectors bidiagonalizing R in WORK(IR)
-*                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IR)
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', N, 0, N, 0, S, RWORK( IE ), CDUM,
-     $                            1, WORK( IR ), LDWRKR, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-*                    Multiply Q in A by left singular vectors of R in
-*                    WORK(IR), storing result in U
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEMM( 'N', 'N', M, N, N, CONE, A, LDA,
-     $                           WORK( IR ), LDWRKR, CZERO, U, LDU )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGQR( M, N, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Zero out below R in A
-*
-                     CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            A( 2, 1 ), LDA )
-*
-*                    Bidiagonalize R in A
-*                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL ZGEBRD( N, N, A, LDA, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left vectors bidiagonalizing R
-*                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNMBR( 'Q', 'R', 'N', M, N, N, A, LDA,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', N, 0, M, 0, S, RWORK( IE ), CDUM,
-     $                            1, U, LDU, CDUM, 1, RWORK( IRWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTVO ) THEN
-*
-*                 Path 5 (M much larger than N, JOBU='S', JOBVT='O')
-*                 N left singular vectors to be computed in U and
-*                 N right singular vectors to be overwritten on A
-*
-                  IF( LWORK.GE.2*N*N+3*N ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+2*LDA*N ) THEN
-*
-*                       WORK(IU) is LDA by N and WORK(IR) is LDA by N
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*N
-                        LDWRKR = LDA
-                     ELSE IF( LWORK.GE.WRKBL+( LDA+N )*N ) THEN
-*
-*                       WORK(IU) is LDA by N and WORK(IR) is N by N
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*N
-                        LDWRKR = N
-                     ELSE
-*
-*                       WORK(IU) is N by N and WORK(IR) is N by N
-*
-                        LDWRKU = N
-                        IR = IU + LDWRKU*N
-                        LDWRKR = N
-                     END IF
-                     ITAU = IR + LDWRKR*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R
-*                    (CWorkspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IU), zeroing out below it
-*
-                     CALL ZLACPY( 'U', N, N, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            WORK( IU+1 ), LDWRKU )
-*
-*                    Generate Q in A
-*                    (CWorkspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IU), copying result to
-*                    WORK(IR)
-*                    (CWorkspace: need   2*N*N+3*N,
-*                                 prefer 2*N*N+2*N+2*N*NB)
-*                    (RWorkspace: need   N)
-*
-                     CALL ZGEBRD( N, N, WORK( IU ), LDWRKU, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'U', N, N, WORK( IU ), LDWRKU,
-     $                            WORK( IR ), LDWRKR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IU)
-*                    (CWorkspace: need 2*N*N+3*N, prefer 2*N*N+2*N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IR)
-*                    (CWorkspace: need   2*N*N+3*N-1,
-*                                 prefer 2*N*N+2*N+(N-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'P', N, N, N, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IU) and computing
-*                    right singular vectors of R in WORK(IR)
-*                    (CWorkspace: need 2*N*N)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', N, N, N, 0, S, RWORK( IE ),
-     $                            WORK( IR ), LDWRKR, WORK( IU ),
-     $                            LDWRKU, CDUM, 1, RWORK( IRWORK ),
-     $                            INFO )
-*
-*                    Multiply Q in A by left singular vectors of R in
-*                    WORK(IU), storing result in U
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEMM( 'N', 'N', M, N, N, CONE, A, LDA,
-     $                           WORK( IU ), LDWRKU, CZERO, U, LDU )
-*
-*                    Copy right singular vectors of R to A
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: 0)
-*
-                     CALL ZLACPY( 'F', N, N, WORK( IR ), LDWRKR, A,
-     $                            LDA )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGQR( M, N, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Zero out below R in A
-*
-                     CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            A( 2, 1 ), LDA )
-*
-*                    Bidiagonalize R in A
-*                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL ZGEBRD( N, N, A, LDA, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left vectors bidiagonalizing R
-*                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNMBR( 'Q', 'R', 'N', M, N, N, A, LDA,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right vectors bidiagonalizing R in A
-*                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in A
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', N, N, M, 0, S, RWORK( IE ), A,
-     $                            LDA, U, LDU, CDUM, 1, RWORK( IRWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTVAS ) THEN
-*
-*                 Path 6 (M much larger than N, JOBU='S', JOBVT='S'
-*                         or 'A')
-*                 N left singular vectors to be computed in U and
-*                 N right singular vectors to be computed in VT
-*
-                  IF( LWORK.GE.N*N+3*N ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+LDA*N ) THEN
-*
-*                       WORK(IU) is LDA by N
-*
-                        LDWRKU = LDA
-                     ELSE
-*
-*                       WORK(IU) is N by N
-*
-                        LDWRKU = N
-                     END IF
-                     ITAU = IU + LDWRKU*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R
-*                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IU), zeroing out below it
-*
-                     CALL ZLACPY( 'U', N, N, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            WORK( IU+1 ), LDWRKU )
-*
-*                    Generate Q in A
-*                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGQR( M, N, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IU), copying result to VT
-*                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL ZGEBRD( N, N, WORK( IU ), LDWRKU, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'U', N, N, WORK( IU ), LDWRKU, VT,
-     $                            LDVT )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IU)
-*                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in VT
-*                    (CWorkspace: need   N*N+3*N-1,
-*                                 prefer N*N+2*N+(N-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IU) and computing
-*                    right singular vectors of R in VT
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', N, N, N, 0, S, RWORK( IE ), VT,
-     $                            LDVT, WORK( IU ), LDWRKU, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-*                    Multiply Q in A by left singular vectors of R in
-*                    WORK(IU), storing result in U
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEMM( 'N', 'N', M, N, N, CONE, A, LDA,
-     $                           WORK( IU ), LDWRKU, CZERO, U, LDU )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGQR( M, N, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to VT, zeroing out below it
-*
-                     CALL ZLACPY( 'U', N, N, A, LDA, VT, LDVT )
-                     IF( N.GT.1 )
-     $                  CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                               VT( 2, 1 ), LDVT )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in VT
-*                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL ZGEBRD( N, N, VT, LDVT, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left bidiagonalizing vectors
-*                    in VT
-*                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNMBR( 'Q', 'R', 'N', M, N, N, VT, LDVT,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in VT
-*                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in VT
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', N, N, M, 0, S, RWORK( IE ), VT,
-     $                            LDVT, U, LDU, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-                  END IF
-*
-               END IF
-*
-            ELSE IF( WNTUA ) THEN
-*
-               IF( WNTVN ) THEN
-*
-*                 Path 7 (M much larger than N, JOBU='A', JOBVT='N')
-*                 M left singular vectors to be computed in U and
-*                 no right singular vectors to be computed
-*
-                  IF( LWORK.GE.N*N+MAX( N+M, 3*N ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IR = 1
-                     IF( LWORK.GE.WRKBL+LDA*N ) THEN
-*
-*                       WORK(IR) is LDA by N
-*
-                        LDWRKR = LDA
-                     ELSE
-*
-*                       WORK(IR) is N by N
-*
-                        LDWRKR = N
-                     END IF
-                     ITAU = IR + LDWRKR*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Copy R to WORK(IR), zeroing out below it
-*
-                     CALL ZLACPY( 'U', N, N, A, LDA, WORK( IR ),
-     $                            LDWRKR )
-                     CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            WORK( IR+1 ), LDWRKR )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need N*N+N+M, prefer N*N+N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IR)
-*                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL ZGEBRD( N, N, WORK( IR ), LDWRKR, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IR)
-*                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'Q', N, N, N, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IR)
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', N, 0, N, 0, S, RWORK( IE ), CDUM,
-     $                            1, WORK( IR ), LDWRKR, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-*                    Multiply Q in U by left singular vectors of R in
-*                    WORK(IR), storing result in A
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEMM( 'N', 'N', M, N, N, CONE, U, LDU,
-     $                           WORK( IR ), LDWRKR, CZERO, A, LDA )
-*
-*                    Copy left singular vectors of A from A to U
-*
-                     CALL ZLACPY( 'F', M, N, A, LDA, U, LDU )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need N+M, prefer N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Zero out below R in A
-*
-                     CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            A( 2, 1 ), LDA )
-*
-*                    Bidiagonalize R in A
-*                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL ZGEBRD( N, N, A, LDA, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left bidiagonalizing vectors
-*                    in A
-*                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNMBR( 'Q', 'R', 'N', M, N, N, A, LDA,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', N, 0, M, 0, S, RWORK( IE ), CDUM,
-     $                            1, U, LDU, CDUM, 1, RWORK( IRWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTVO ) THEN
-*
-*                 Path 8 (M much larger than N, JOBU='A', JOBVT='O')
-*                 M left singular vectors to be computed in U and
-*                 N right singular vectors to be overwritten on A
-*
-                  IF( LWORK.GE.2*N*N+MAX( N+M, 3*N ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+2*LDA*N ) THEN
-*
-*                       WORK(IU) is LDA by N and WORK(IR) is LDA by N
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*N
-                        LDWRKR = LDA
-                     ELSE IF( LWORK.GE.WRKBL+( LDA+N )*N ) THEN
-*
-*                       WORK(IU) is LDA by N and WORK(IR) is N by N
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*N
-                        LDWRKR = N
-                     ELSE
-*
-*                       WORK(IU) is N by N and WORK(IR) is N by N
-*
-                        LDWRKU = N
-                        IR = IU + LDWRKU*N
-                        LDWRKR = N
-                     END IF
-                     ITAU = IR + LDWRKR*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need 2*N*N+N+M, prefer 2*N*N+N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IU), zeroing out below it
-*
-                     CALL ZLACPY( 'U', N, N, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            WORK( IU+1 ), LDWRKU )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IU), copying result to
-*                    WORK(IR)
-*                    (CWorkspace: need   2*N*N+3*N,
-*                                 prefer 2*N*N+2*N+2*N*NB)
-*                    (RWorkspace: need   N)
-*
-                     CALL ZGEBRD( N, N, WORK( IU ), LDWRKU, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'U', N, N, WORK( IU ), LDWRKU,
-     $                            WORK( IR ), LDWRKR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IU)
-*                    (CWorkspace: need 2*N*N+3*N, prefer 2*N*N+2*N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IR)
-*                    (CWorkspace: need   2*N*N+3*N-1,
-*                                 prefer 2*N*N+2*N+(N-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'P', N, N, N, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IU) and computing
-*                    right singular vectors of R in WORK(IR)
-*                    (CWorkspace: need 2*N*N)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', N, N, N, 0, S, RWORK( IE ),
-     $                            WORK( IR ), LDWRKR, WORK( IU ),
-     $                            LDWRKU, CDUM, 1, RWORK( IRWORK ),
-     $                            INFO )
-*
-*                    Multiply Q in U by left singular vectors of R in
-*                    WORK(IU), storing result in A
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEMM( 'N', 'N', M, N, N, CONE, U, LDU,
-     $                           WORK( IU ), LDWRKU, CZERO, A, LDA )
-*
-*                    Copy left singular vectors of A from A to U
-*
-                     CALL ZLACPY( 'F', M, N, A, LDA, U, LDU )
-*
-*                    Copy right singular vectors of R from WORK(IR) to A
-*
-                     CALL ZLACPY( 'F', N, N, WORK( IR ), LDWRKR, A,
-     $                            LDA )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need N+M, prefer N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Zero out below R in A
-*
-                     CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            A( 2, 1 ), LDA )
-*
-*                    Bidiagonalize R in A
-*                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL ZGEBRD( N, N, A, LDA, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left bidiagonalizing vectors
-*                    in A
-*                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNMBR( 'Q', 'R', 'N', M, N, N, A, LDA,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in A
-*                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in A
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', N, N, M, 0, S, RWORK( IE ), A,
-     $                            LDA, U, LDU, CDUM, 1, RWORK( IRWORK ),
-     $                            INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTVAS ) THEN
-*
-*                 Path 9 (M much larger than N, JOBU='A', JOBVT='S'
-*                         or 'A')
-*                 M left singular vectors to be computed in U and
-*                 N right singular vectors to be computed in VT
-*
-                  IF( LWORK.GE.N*N+MAX( N+M, 3*N ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+LDA*N ) THEN
-*
-*                       WORK(IU) is LDA by N
-*
-                        LDWRKU = LDA
-                     ELSE
-*
-*                       WORK(IU) is N by N
-*
-                        LDWRKU = N
-                     END IF
-                     ITAU = IU + LDWRKU*N
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need N*N+N+M, prefer N*N+N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R to WORK(IU), zeroing out below it
-*
-                     CALL ZLACPY( 'U', N, N, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                            WORK( IU+1 ), LDWRKU )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in WORK(IU), copying result to VT
-*                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL ZGEBRD( N, N, WORK( IU ), LDWRKU, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'U', N, N, WORK( IU ), LDWRKU, VT,
-     $                            LDVT )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IU)
-*                    (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'Q', N, N, N, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in VT
-*                    (CWorkspace: need   N*N+3*N-1,
-*                                 prefer N*N+2*N+(N-1)*NB)
-*                    (RWorkspace: need   0)
-*
-                     CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of R in WORK(IU) and computing
-*                    right singular vectors of R in VT
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', N, N, N, 0, S, RWORK( IE ), VT,
-     $                            LDVT, WORK( IU ), LDWRKU, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-*                    Multiply Q in U by left singular vectors of R in
-*                    WORK(IU), storing result in A
-*                    (CWorkspace: need N*N)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEMM( 'N', 'N', M, N, N, CONE, U, LDU,
-     $                           WORK( IU ), LDWRKU, CZERO, A, LDA )
-*
-*                    Copy left singular vectors of A from A to U
-*
-                     CALL ZLACPY( 'F', M, N, A, LDA, U, LDU )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + N
-*
-*                    Compute A=Q*R, copying result to U
-*                    (CWorkspace: need 2*N, prefer N+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
-*
-*                    Generate Q in U
-*                    (CWorkspace: need N+M, prefer N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGQR( M, M, N, U, LDU, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy R from A to VT, zeroing out below it
-*
-                     CALL ZLACPY( 'U', N, N, A, LDA, VT, LDVT )
-                     IF( N.GT.1 )
-     $                  CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
-     $                               VT( 2, 1 ), LDVT )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + N
-                     IWORK = ITAUP + N
-*
-*                    Bidiagonalize R in VT
-*                    (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
-*                    (RWorkspace: need N)
-*
-                     CALL ZGEBRD( N, N, VT, LDVT, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply Q in U by left bidiagonalizing vectors
-*                    in VT
-*                    (CWorkspace: need 2*N+M, prefer 2*N+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNMBR( 'Q', 'R', 'N', M, N, N, VT, LDVT,
-     $                            WORK( ITAUQ ), U, LDU, WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in VT
-*                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + N
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in VT
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', N, N, M, 0, S, RWORK( IE ), VT,
-     $                            LDVT, U, LDU, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-                  END IF
-*
-               END IF
-*
-            END IF
-*
-         ELSE
-*
-*           M .LT. MNTHR
-*
-*           Path 10 (M at least N, but not much larger)
-*           Reduce to bidiagonal form without QR decomposition
-*
-            IE = 1
-            ITAUQ = 1
-            ITAUP = ITAUQ + N
-            IWORK = ITAUP + N
-*
-*           Bidiagonalize A
-*           (CWorkspace: need 2*N+M, prefer 2*N+(M+N)*NB)
-*           (RWorkspace: need N)
-*
-            CALL ZGEBRD( M, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
-     $                   WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                   IERR )
-            IF( WNTUAS ) THEN
-*
-*              If left singular vectors desired in U, copy result to U
-*              and generate left bidiagonalizing vectors in U
-*              (CWorkspace: need 2*N+NCU, prefer 2*N+NCU*NB)
-*              (RWorkspace: 0)
-*
-               CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
-               IF( WNTUS )
-     $            NCU = N
-               IF( WNTUA )
-     $            NCU = M
-               CALL ZUNGBR( 'Q', M, NCU, N, U, LDU, WORK( ITAUQ ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTVAS ) THEN
-*
-*              If right singular vectors desired in VT, copy result to
-*              VT and generate right bidiagonalizing vectors in VT
-*              (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*              (RWorkspace: 0)
-*
-               CALL ZLACPY( 'U', N, N, A, LDA, VT, LDVT )
-               CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTUO ) THEN
-*
-*              If left singular vectors desired in A, generate left
-*              bidiagonalizing vectors in A
-*              (CWorkspace: need 3*N, prefer 2*N+N*NB)
-*              (RWorkspace: 0)
-*
-               CALL ZUNGBR( 'Q', M, N, N, A, LDA, WORK( ITAUQ ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTVO ) THEN
-*
-*              If right singular vectors desired in A, generate right
-*              bidiagonalizing vectors in A
-*              (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
-*              (RWorkspace: 0)
-*
-               CALL ZUNGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IRWORK = IE + N
-            IF( WNTUAS .OR. WNTUO )
-     $         NRU = M
-            IF( WNTUN )
-     $         NRU = 0
-            IF( WNTVAS .OR. WNTVO )
-     $         NCVT = N
-            IF( WNTVN )
-     $         NCVT = 0
-            IF( ( .NOT.WNTUO ) .AND. ( .NOT.WNTVO ) ) THEN
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in U and computing right singular
-*              vectors in VT
-*              (CWorkspace: 0)
-*              (RWorkspace: need BDSPAC)
-*
-               CALL ZBDSQR( 'U', N, NCVT, NRU, 0, S, RWORK( IE ), VT,
-     $                      LDVT, U, LDU, CDUM, 1, RWORK( IRWORK ),
-     $                      INFO )
-            ELSE IF( ( .NOT.WNTUO ) .AND. WNTVO ) THEN
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in U and computing right singular
-*              vectors in A
-*              (CWorkspace: 0)
-*              (RWorkspace: need BDSPAC)
-*
-               CALL ZBDSQR( 'U', N, NCVT, NRU, 0, S, RWORK( IE ), A,
-     $                      LDA, U, LDU, CDUM, 1, RWORK( IRWORK ),
-     $                      INFO )
-            ELSE
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in A and computing right singular
-*              vectors in VT
-*              (CWorkspace: 0)
-*              (RWorkspace: need BDSPAC)
-*
-               CALL ZBDSQR( 'U', N, NCVT, NRU, 0, S, RWORK( IE ), VT,
-     $                      LDVT, A, LDA, CDUM, 1, RWORK( IRWORK ),
-     $                      INFO )
-            END IF
-*
-         END IF
-*
-      ELSE
-*
-*        A has more columns than rows. If A has sufficiently more
-*        columns than rows, first reduce using the LQ decomposition (if
-*        sufficient workspace available)
-*
-         IF( N.GE.MNTHR ) THEN
-*
-            IF( WNTVN ) THEN
-*
-*              Path 1t(N much larger than M, JOBVT='N')
-*              No right singular vectors to be computed
-*
-               ITAU = 1
-               IWORK = ITAU + M
-*
-*              Compute A=L*Q
-*              (CWorkspace: need 2*M, prefer M+M*NB)
-*              (RWorkspace: 0)
-*
-               CALL ZGELQF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
-     $                      LWORK-IWORK+1, IERR )
-*
-*              Zero out above L
-*
-               CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO, A( 1, 2 ),
-     $                      LDA )
-               IE = 1
-               ITAUQ = 1
-               ITAUP = ITAUQ + M
-               IWORK = ITAUP + M
-*
-*              Bidiagonalize L in A
-*              (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
-*              (RWorkspace: need M)
-*
-               CALL ZGEBRD( M, M, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
-     $                      WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                      IERR )
-               IF( WNTUO .OR. WNTUAS ) THEN
-*
-*                 If left singular vectors desired, generate Q
-*                 (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-               END IF
-               IRWORK = IE + M
-               NRU = 0
-               IF( WNTUO .OR. WNTUAS )
-     $            NRU = M
-*
-*              Perform bidiagonal QR iteration, computing left singular
-*              vectors of A in A if desired
-*              (CWorkspace: 0)
-*              (RWorkspace: need BDSPAC)
-*
-               CALL ZBDSQR( 'U', M, 0, NRU, 0, S, RWORK( IE ), CDUM, 1,
-     $                      A, LDA, CDUM, 1, RWORK( IRWORK ), INFO )
-*
-*              If left singular vectors desired in U, copy them there
-*
-               IF( WNTUAS )
-     $            CALL ZLACPY( 'F', M, M, A, LDA, U, LDU )
-*
-            ELSE IF( WNTVO .AND. WNTUN ) THEN
-*
-*              Path 2t(N much larger than M, JOBU='N', JOBVT='O')
-*              M right singular vectors to be overwritten on A and
-*              no left singular vectors to be computed
-*
-               IF( LWORK.GE.M*M+3*M ) THEN
-*
-*                 Sufficient workspace for a fast algorithm
-*
-                  IR = 1
-                  IF( LWORK.GE.MAX( WRKBL, LDA*N )+LDA*M ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is LDA by M
-*
-                     LDWRKU = LDA
-                     CHUNK = N
-                     LDWRKR = LDA
-                  ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N )+M*M ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is M by M
-*
-                     LDWRKU = LDA
-                     CHUNK = N
-                     LDWRKR = M
-                  ELSE
-*
-*                    WORK(IU) is M by CHUNK and WORK(IR) is M by M
-*
-                     LDWRKU = M
-                     CHUNK = ( LWORK-M*M ) / M
-                     LDWRKR = M
-                  END IF
-                  ITAU = IR + LDWRKR*M
-                  IWORK = ITAU + M
-*
-*                 Compute A=L*Q
-*                 (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy L to WORK(IR) and zero out above it
-*
-                  CALL ZLACPY( 'L', M, M, A, LDA, WORK( IR ), LDWRKR )
-                  CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                         WORK( IR+LDWRKR ), LDWRKR )
-*
-*                 Generate Q in A
-*                 (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = 1
-                  ITAUQ = ITAU
-                  ITAUP = ITAUQ + M
-                  IWORK = ITAUP + M
-*
-*                 Bidiagonalize L in WORK(IR)
-*                 (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
-*                 (RWorkspace: need M)
-*
-                  CALL ZGEBRD( M, M, WORK( IR ), LDWRKR, S, RWORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Generate right vectors bidiagonalizing L
-*                 (CWorkspace: need M*M+3*M-1, prefer M*M+2*M+(M-1)*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
-     $                         WORK( ITAUP ), WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-                  IRWORK = IE + M
-*
-*                 Perform bidiagonal QR iteration, computing right
-*                 singular vectors of L in WORK(IR)
-*                 (CWorkspace: need M*M)
-*                 (RWorkspace: need BDSPAC)
-*
-                  CALL ZBDSQR( 'U', M, M, 0, 0, S, RWORK( IE ),
-     $                         WORK( IR ), LDWRKR, CDUM, 1, CDUM, 1,
-     $                         RWORK( IRWORK ), INFO )
-                  IU = ITAUQ
-*
-*                 Multiply right singular vectors of L in WORK(IR) by Q
-*                 in A, storing result in WORK(IU) and copying to A
-*                 (CWorkspace: need M*M+M, prefer M*M+M*N)
-*                 (RWorkspace: 0)
-*
-                  DO 30 I = 1, N, CHUNK
-                     BLK = MIN( N-I+1, CHUNK )
-                     CALL ZGEMM( 'N', 'N', M, BLK, M, CONE, WORK( IR ),
-     $                           LDWRKR, A( 1, I ), LDA, CZERO,
-     $                           WORK( IU ), LDWRKU )
-                     CALL ZLACPY( 'F', M, BLK, WORK( IU ), LDWRKU,
-     $                            A( 1, I ), LDA )
-   30             CONTINUE
-*
-               ELSE
-*
-*                 Insufficient workspace for a fast algorithm
-*
-                  IE = 1
-                  ITAUQ = 1
-                  ITAUP = ITAUQ + M
-                  IWORK = ITAUP + M
-*
-*                 Bidiagonalize A
-*                 (CWorkspace: need 2*M+N, prefer 2*M+(M+N)*NB)
-*                 (RWorkspace: need M)
-*
-                  CALL ZGEBRD( M, N, A, LDA, S, RWORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Generate right vectors bidiagonalizing A
-*                 (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNGBR( 'P', M, N, M, A, LDA, WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IRWORK = IE + M
-*
-*                 Perform bidiagonal QR iteration, computing right
-*                 singular vectors of A in A
-*                 (CWorkspace: 0)
-*                 (RWorkspace: need BDSPAC)
-*
-                  CALL ZBDSQR( 'L', M, N, 0, 0, S, RWORK( IE ), A, LDA,
-     $                         CDUM, 1, CDUM, 1, RWORK( IRWORK ), INFO )
-*
-               END IF
-*
-            ELSE IF( WNTVO .AND. WNTUAS ) THEN
-*
-*              Path 3t(N much larger than M, JOBU='S' or 'A', JOBVT='O')
-*              M right singular vectors to be overwritten on A and
-*              M left singular vectors to be computed in U
-*
-               IF( LWORK.GE.M*M+3*M ) THEN
-*
-*                 Sufficient workspace for a fast algorithm
-*
-                  IR = 1
-                  IF( LWORK.GE.MAX( WRKBL, LDA*N )+LDA*M ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is LDA by M
-*
-                     LDWRKU = LDA
-                     CHUNK = N
-                     LDWRKR = LDA
-                  ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N )+M*M ) THEN
-*
-*                    WORK(IU) is LDA by N and WORK(IR) is M by M
-*
-                     LDWRKU = LDA
-                     CHUNK = N
-                     LDWRKR = M
-                  ELSE
-*
-*                    WORK(IU) is M by CHUNK and WORK(IR) is M by M
-*
-                     LDWRKU = M
-                     CHUNK = ( LWORK-M*M ) / M
-                     LDWRKR = M
-                  END IF
-                  ITAU = IR + LDWRKR*M
-                  IWORK = ITAU + M
-*
-*                 Compute A=L*Q
-*                 (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy L to U, zeroing about above it
-*
-                  CALL ZLACPY( 'L', M, M, A, LDA, U, LDU )
-                  CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO, U( 1, 2 ),
-     $                         LDU )
-*
-*                 Generate Q in A
-*                 (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = 1
-                  ITAUQ = ITAU
-                  ITAUP = ITAUQ + M
-                  IWORK = ITAUP + M
-*
-*                 Bidiagonalize L in U, copying result to WORK(IR)
-*                 (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
-*                 (RWorkspace: need M)
-*
-                  CALL ZGEBRD( M, M, U, LDU, S, RWORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  CALL ZLACPY( 'U', M, M, U, LDU, WORK( IR ), LDWRKR )
-*
-*                 Generate right vectors bidiagonalizing L in WORK(IR)
-*                 (CWorkspace: need M*M+3*M-1, prefer M*M+2*M+(M-1)*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
-     $                         WORK( ITAUP ), WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-*
-*                 Generate left vectors bidiagonalizing L in U
-*                 (CWorkspace: need M*M+3*M, prefer M*M+2*M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IRWORK = IE + M
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of L in U, and computing right
-*                 singular vectors of L in WORK(IR)
-*                 (CWorkspace: need M*M)
-*                 (RWorkspace: need BDSPAC)
-*
-                  CALL ZBDSQR( 'U', M, M, M, 0, S, RWORK( IE ),
-     $                         WORK( IR ), LDWRKR, U, LDU, CDUM, 1,
-     $                         RWORK( IRWORK ), INFO )
-                  IU = ITAUQ
-*
-*                 Multiply right singular vectors of L in WORK(IR) by Q
-*                 in A, storing result in WORK(IU) and copying to A
-*                 (CWorkspace: need M*M+M, prefer M*M+M*N))
-*                 (RWorkspace: 0)
-*
-                  DO 40 I = 1, N, CHUNK
-                     BLK = MIN( N-I+1, CHUNK )
-                     CALL ZGEMM( 'N', 'N', M, BLK, M, CONE, WORK( IR ),
-     $                           LDWRKR, A( 1, I ), LDA, CZERO,
-     $                           WORK( IU ), LDWRKU )
-                     CALL ZLACPY( 'F', M, BLK, WORK( IU ), LDWRKU,
-     $                            A( 1, I ), LDA )
-   40             CONTINUE
-*
-               ELSE
-*
-*                 Insufficient workspace for a fast algorithm
-*
-                  ITAU = 1
-                  IWORK = ITAU + M
-*
-*                 Compute A=L*Q
-*                 (CWorkspace: need 2*M, prefer M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Copy L to U, zeroing out above it
-*
-                  CALL ZLACPY( 'L', M, M, A, LDA, U, LDU )
-                  CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO, U( 1, 2 ),
-     $                         LDU )
-*
-*                 Generate Q in A
-*                 (CWorkspace: need 2*M, prefer M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IE = 1
-                  ITAUQ = ITAU
-                  ITAUP = ITAUQ + M
-                  IWORK = ITAUP + M
-*
-*                 Bidiagonalize L in U
-*                 (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
-*                 (RWorkspace: need M)
-*
-                  CALL ZGEBRD( M, M, U, LDU, S, RWORK( IE ),
-     $                         WORK( ITAUQ ), WORK( ITAUP ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                 Multiply right vectors bidiagonalizing L by Q in A
-*                 (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNMBR( 'P', 'L', 'C', M, N, M, U, LDU,
-     $                         WORK( ITAUP ), A, LDA, WORK( IWORK ),
-     $                         LWORK-IWORK+1, IERR )
-*
-*                 Generate left vectors bidiagonalizing L in U
-*                 (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*                 (RWorkspace: 0)
-*
-                  CALL ZUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
-                  IRWORK = IE + M
-*
-*                 Perform bidiagonal QR iteration, computing left
-*                 singular vectors of A in U and computing right
-*                 singular vectors of A in A
-*                 (CWorkspace: 0)
-*                 (RWorkspace: need BDSPAC)
-*
-                  CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), A, LDA,
-     $                         U, LDU, CDUM, 1, RWORK( IRWORK ), INFO )
-*
-               END IF
-*
-            ELSE IF( WNTVS ) THEN
-*
-               IF( WNTUN ) THEN
-*
-*                 Path 4t(N much larger than M, JOBU='N', JOBVT='S')
-*                 M right singular vectors to be computed in VT and
-*                 no left singular vectors to be computed
-*
-                  IF( LWORK.GE.M*M+3*M ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IR = 1
-                     IF( LWORK.GE.WRKBL+LDA*M ) THEN
-*
-*                       WORK(IR) is LDA by M
-*
-                        LDWRKR = LDA
-                     ELSE
-*
-*                       WORK(IR) is M by M
-*
-                        LDWRKR = M
-                     END IF
-                     ITAU = IR + LDWRKR*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q
-*                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IR), zeroing out above it
-*
-                     CALL ZLACPY( 'L', M, M, A, LDA, WORK( IR ),
-     $                            LDWRKR )
-                     CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            WORK( IR+LDWRKR ), LDWRKR )
-*
-*                    Generate Q in A
-*                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IR)
-*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL ZGEBRD( M, M, WORK( IR ), LDWRKR, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right vectors bidiagonalizing L in
-*                    WORK(IR)
-*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+(M-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing right
-*                    singular vectors of L in WORK(IR)
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', M, M, 0, 0, S, RWORK( IE ),
-     $                            WORK( IR ), LDWRKR, CDUM, 1, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IR) by
-*                    Q in A, storing result in VT
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEMM( 'N', 'N', M, N, M, CONE, WORK( IR ),
-     $                           LDWRKR, A, LDA, CZERO, VT, LDVT )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy result to VT
-*
-                     CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Zero out above L in A
-*
-                     CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            A( 1, 2 ), LDA )
-*
-*                    Bidiagonalize L in A
-*                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL ZGEBRD( M, M, A, LDA, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right vectors bidiagonalizing L by Q in VT
-*                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNMBR( 'P', 'L', 'C', M, N, M, A, LDA,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing right
-*                    singular vectors of A in VT
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', M, N, 0, 0, S, RWORK( IE ), VT,
-     $                            LDVT, CDUM, 1, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTUO ) THEN
-*
-*                 Path 5t(N much larger than M, JOBU='O', JOBVT='S')
-*                 M right singular vectors to be computed in VT and
-*                 M left singular vectors to be overwritten on A
-*
-                  IF( LWORK.GE.2*M*M+3*M ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+2*LDA*M ) THEN
-*
-*                       WORK(IU) is LDA by M and WORK(IR) is LDA by M
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*M
-                        LDWRKR = LDA
-                     ELSE IF( LWORK.GE.WRKBL+( LDA+M )*M ) THEN
-*
-*                       WORK(IU) is LDA by M and WORK(IR) is M by M
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*M
-                        LDWRKR = M
-                     ELSE
-*
-*                       WORK(IU) is M by M and WORK(IR) is M by M
-*
-                        LDWRKU = M
-                        IR = IU + LDWRKU*M
-                        LDWRKR = M
-                     END IF
-                     ITAU = IR + LDWRKR*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q
-*                    (CWorkspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IU), zeroing out below it
-*
-                     CALL ZLACPY( 'L', M, M, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            WORK( IU+LDWRKU ), LDWRKU )
-*
-*                    Generate Q in A
-*                    (CWorkspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IU), copying result to
-*                    WORK(IR)
-*                    (CWorkspace: need   2*M*M+3*M,
-*                                 prefer 2*M*M+2*M+2*M*NB)
-*                    (RWorkspace: need   M)
-*
-                     CALL ZGEBRD( M, M, WORK( IU ), LDWRKU, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'L', M, M, WORK( IU ), LDWRKU,
-     $                            WORK( IR ), LDWRKR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IU)
-*                    (CWorkspace: need   2*M*M+3*M-1,
-*                                 prefer 2*M*M+2*M+(M-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IR)
-*                    (CWorkspace: need 2*M*M+3*M, prefer 2*M*M+2*M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'Q', M, M, M, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of L in WORK(IR) and computing
-*                    right singular vectors of L in WORK(IU)
-*                    (CWorkspace: need 2*M*M)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', M, M, M, 0, S, RWORK( IE ),
-     $                            WORK( IU ), LDWRKU, WORK( IR ),
-     $                            LDWRKR, CDUM, 1, RWORK( IRWORK ),
-     $                            INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IU) by
-*                    Q in A, storing result in VT
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEMM( 'N', 'N', M, N, M, CONE, WORK( IU ),
-     $                           LDWRKU, A, LDA, CZERO, VT, LDVT )
-*
-*                    Copy left singular vectors of L to A
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: 0)
-*
-                     CALL ZLACPY( 'F', M, M, WORK( IR ), LDWRKR, A,
-     $                            LDA )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Zero out above L in A
-*
-                     CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            A( 1, 2 ), LDA )
-*
-*                    Bidiagonalize L in A
-*                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL ZGEBRD( M, M, A, LDA, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right vectors bidiagonalizing L by Q in VT
-*                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNMBR( 'P', 'L', 'C', M, N, M, A, LDA,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors of L in A
-*                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in A and computing right
-*                    singular vectors of A in VT
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), VT,
-     $                            LDVT, A, LDA, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTUAS ) THEN
-*
-*                 Path 6t(N much larger than M, JOBU='S' or 'A',
-*                         JOBVT='S')
-*                 M right singular vectors to be computed in VT and
-*                 M left singular vectors to be computed in U
-*
-                  IF( LWORK.GE.M*M+3*M ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+LDA*M ) THEN
-*
-*                       WORK(IU) is LDA by N
-*
-                        LDWRKU = LDA
-                     ELSE
-*
-*                       WORK(IU) is LDA by M
-*
-                        LDWRKU = M
-                     END IF
-                     ITAU = IU + LDWRKU*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q
-*                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IU), zeroing out above it
-*
-                     CALL ZLACPY( 'L', M, M, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            WORK( IU+LDWRKU ), LDWRKU )
-*
-*                    Generate Q in A
-*                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IU), copying result to U
-*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL ZGEBRD( M, M, WORK( IU ), LDWRKU, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'L', M, M, WORK( IU ), LDWRKU, U,
-     $                            LDU )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IU)
-*                    (CWorkspace: need   M*M+3*M-1,
-*                                 prefer M*M+2*M+(M-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in U
-*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of L in U and computing right
-*                    singular vectors of L in WORK(IU)
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', M, M, M, 0, S, RWORK( IE ),
-     $                            WORK( IU ), LDWRKU, U, LDU, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IU) by
-*                    Q in A, storing result in VT
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEMM( 'N', 'N', M, N, M, CONE, WORK( IU ),
-     $                           LDWRKU, A, LDA, CZERO, VT, LDVT )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to U, zeroing out above it
-*
-                     CALL ZLACPY( 'L', M, M, A, LDA, U, LDU )
-                     CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            U( 1, 2 ), LDU )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in U
-*                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL ZGEBRD( M, M, U, LDU, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right bidiagonalizing vectors in U by Q
-*                    in VT
-*                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNMBR( 'P', 'L', 'C', M, N, M, U, LDU,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in U
-*                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in VT
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), VT,
-     $                            LDVT, U, LDU, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-                  END IF
-*
-               END IF
-*
-            ELSE IF( WNTVA ) THEN
-*
-               IF( WNTUN ) THEN
-*
-*                 Path 7t(N much larger than M, JOBU='N', JOBVT='A')
-*                 N right singular vectors to be computed in VT and
-*                 no left singular vectors to be computed
-*
-                  IF( LWORK.GE.M*M+MAX( N+M, 3*M ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IR = 1
-                     IF( LWORK.GE.WRKBL+LDA*M ) THEN
-*
-*                       WORK(IR) is LDA by M
-*
-                        LDWRKR = LDA
-                     ELSE
-*
-*                       WORK(IR) is M by M
-*
-                        LDWRKR = M
-                     END IF
-                     ITAU = IR + LDWRKR*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Copy L to WORK(IR), zeroing out above it
-*
-                     CALL ZLACPY( 'L', M, M, A, LDA, WORK( IR ),
-     $                            LDWRKR )
-                     CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            WORK( IR+LDWRKR ), LDWRKR )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need M*M+M+N, prefer M*M+M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IR)
-*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL ZGEBRD( M, M, WORK( IR ), LDWRKR, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IR)
-*                    (CWorkspace: need   M*M+3*M-1,
-*                                 prefer M*M+2*M+(M-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'P', M, M, M, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing right
-*                    singular vectors of L in WORK(IR)
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', M, M, 0, 0, S, RWORK( IE ),
-     $                            WORK( IR ), LDWRKR, CDUM, 1, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IR) by
-*                    Q in VT, storing result in A
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEMM( 'N', 'N', M, N, M, CONE, WORK( IR ),
-     $                           LDWRKR, VT, LDVT, CZERO, A, LDA )
-*
-*                    Copy right singular vectors of A from A to VT
-*
-                     CALL ZLACPY( 'F', M, N, A, LDA, VT, LDVT )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need M+N, prefer M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Zero out above L in A
-*
-                     CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            A( 1, 2 ), LDA )
-*
-*                    Bidiagonalize L in A
-*                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL ZGEBRD( M, M, A, LDA, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right bidiagonalizing vectors in A by Q
-*                    in VT
-*                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNMBR( 'P', 'L', 'C', M, N, M, A, LDA,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing right
-*                    singular vectors of A in VT
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', M, N, 0, 0, S, RWORK( IE ), VT,
-     $                            LDVT, CDUM, 1, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTUO ) THEN
-*
-*                 Path 8t(N much larger than M, JOBU='O', JOBVT='A')
-*                 N right singular vectors to be computed in VT and
-*                 M left singular vectors to be overwritten on A
-*
-                  IF( LWORK.GE.2*M*M+MAX( N+M, 3*M ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+2*LDA*M ) THEN
-*
-*                       WORK(IU) is LDA by M and WORK(IR) is LDA by M
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*M
-                        LDWRKR = LDA
-                     ELSE IF( LWORK.GE.WRKBL+( LDA+M )*M ) THEN
-*
-*                       WORK(IU) is LDA by M and WORK(IR) is M by M
-*
-                        LDWRKU = LDA
-                        IR = IU + LDWRKU*M
-                        LDWRKR = M
-                     ELSE
-*
-*                       WORK(IU) is M by M and WORK(IR) is M by M
-*
-                        LDWRKU = M
-                        IR = IU + LDWRKU*M
-                        LDWRKR = M
-                     END IF
-                     ITAU = IR + LDWRKR*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (CWorkspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need 2*M*M+M+N, prefer 2*M*M+M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IU), zeroing out above it
-*
-                     CALL ZLACPY( 'L', M, M, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            WORK( IU+LDWRKU ), LDWRKU )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IU), copying result to
-*                    WORK(IR)
-*                    (CWorkspace: need   2*M*M+3*M,
-*                                 prefer 2*M*M+2*M+2*M*NB)
-*                    (RWorkspace: need   M)
-*
-                     CALL ZGEBRD( M, M, WORK( IU ), LDWRKU, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'L', M, M, WORK( IU ), LDWRKU,
-     $                            WORK( IR ), LDWRKR )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IU)
-*                    (CWorkspace: need   2*M*M+3*M-1,
-*                                 prefer 2*M*M+2*M+(M-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in WORK(IR)
-*                    (CWorkspace: need 2*M*M+3*M, prefer 2*M*M+2*M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'Q', M, M, M, WORK( IR ), LDWRKR,
-     $                            WORK( ITAUQ ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of L in WORK(IR) and computing
-*                    right singular vectors of L in WORK(IU)
-*                    (CWorkspace: need 2*M*M)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', M, M, M, 0, S, RWORK( IE ),
-     $                            WORK( IU ), LDWRKU, WORK( IR ),
-     $                            LDWRKR, CDUM, 1, RWORK( IRWORK ),
-     $                            INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IU) by
-*                    Q in VT, storing result in A
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEMM( 'N', 'N', M, N, M, CONE, WORK( IU ),
-     $                           LDWRKU, VT, LDVT, CZERO, A, LDA )
-*
-*                    Copy right singular vectors of A from A to VT
-*
-                     CALL ZLACPY( 'F', M, N, A, LDA, VT, LDVT )
-*
-*                    Copy left singular vectors of A from WORK(IR) to A
-*
-                     CALL ZLACPY( 'F', M, M, WORK( IR ), LDWRKR, A,
-     $                            LDA )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need M+N, prefer M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Zero out above L in A
-*
-                     CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            A( 1, 2 ), LDA )
-*
-*                    Bidiagonalize L in A
-*                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL ZGEBRD( M, M, A, LDA, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right bidiagonalizing vectors in A by Q
-*                    in VT
-*                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNMBR( 'P', 'L', 'C', M, N, M, A, LDA,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in A
-*                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in A and computing right
-*                    singular vectors of A in VT
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), VT,
-     $                            LDVT, A, LDA, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-                  END IF
-*
-               ELSE IF( WNTUAS ) THEN
-*
-*                 Path 9t(N much larger than M, JOBU='S' or 'A',
-*                         JOBVT='A')
-*                 N right singular vectors to be computed in VT and
-*                 M left singular vectors to be computed in U
-*
-                  IF( LWORK.GE.M*M+MAX( N+M, 3*M ) ) THEN
-*
-*                    Sufficient workspace for a fast algorithm
-*
-                     IU = 1
-                     IF( LWORK.GE.WRKBL+LDA*M ) THEN
-*
-*                       WORK(IU) is LDA by M
-*
-                        LDWRKU = LDA
-                     ELSE
-*
-*                       WORK(IU) is M by M
-*
-                        LDWRKU = M
-                     END IF
-                     ITAU = IU + LDWRKU*M
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need M*M+M+N, prefer M*M+M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to WORK(IU), zeroing out above it
-*
-                     CALL ZLACPY( 'L', M, M, A, LDA, WORK( IU ),
-     $                            LDWRKU )
-                     CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            WORK( IU+LDWRKU ), LDWRKU )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in WORK(IU), copying result to U
-*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL ZGEBRD( M, M, WORK( IU ), LDWRKU, S,
-     $                            RWORK( IE ), WORK( ITAUQ ),
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'L', M, M, WORK( IU ), LDWRKU, U,
-     $                            LDU )
-*
-*                    Generate right bidiagonalizing vectors in WORK(IU)
-*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+(M-1)*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'P', M, M, M, WORK( IU ), LDWRKU,
-     $                            WORK( ITAUP ), WORK( IWORK ),
-     $                            LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in U
-*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of L in U and computing right
-*                    singular vectors of L in WORK(IU)
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', M, M, M, 0, S, RWORK( IE ),
-     $                            WORK( IU ), LDWRKU, U, LDU, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-*                    Multiply right singular vectors of L in WORK(IU) by
-*                    Q in VT, storing result in A
-*                    (CWorkspace: need M*M)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGEMM( 'N', 'N', M, N, M, CONE, WORK( IU ),
-     $                           LDWRKU, VT, LDVT, CZERO, A, LDA )
-*
-*                    Copy right singular vectors of A from A to VT
-*
-                     CALL ZLACPY( 'F', M, N, A, LDA, VT, LDVT )
-*
-                  ELSE
-*
-*                    Insufficient workspace for a fast algorithm
-*
-                     ITAU = 1
-                     IWORK = ITAU + M
-*
-*                    Compute A=L*Q, copying result to VT
-*                    (CWorkspace: need 2*M, prefer M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
-*
-*                    Generate Q in VT
-*                    (CWorkspace: need M+N, prefer M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Copy L to U, zeroing out above it
-*
-                     CALL ZLACPY( 'L', M, M, A, LDA, U, LDU )
-                     CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
-     $                            U( 1, 2 ), LDU )
-                     IE = 1
-                     ITAUQ = ITAU
-                     ITAUP = ITAUQ + M
-                     IWORK = ITAUP + M
-*
-*                    Bidiagonalize L in U
-*                    (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
-*                    (RWorkspace: need M)
-*
-                     CALL ZGEBRD( M, M, U, LDU, S, RWORK( IE ),
-     $                            WORK( ITAUQ ), WORK( ITAUP ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Multiply right bidiagonalizing vectors in U by Q
-*                    in VT
-*                    (CWorkspace: need 2*M+N, prefer 2*M+N*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNMBR( 'P', 'L', 'C', M, N, M, U, LDU,
-     $                            WORK( ITAUP ), VT, LDVT,
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-*
-*                    Generate left bidiagonalizing vectors in U
-*                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*                    (RWorkspace: 0)
-*
-                     CALL ZUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
-     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
-                     IRWORK = IE + M
-*
-*                    Perform bidiagonal QR iteration, computing left
-*                    singular vectors of A in U and computing right
-*                    singular vectors of A in VT
-*                    (CWorkspace: 0)
-*                    (RWorkspace: need BDSPAC)
-*
-                     CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), VT,
-     $                            LDVT, U, LDU, CDUM, 1,
-     $                            RWORK( IRWORK ), INFO )
-*
-                  END IF
-*
-               END IF
-*
-            END IF
-*
-         ELSE
-*
-*           N .LT. MNTHR
-*
-*           Path 10t(N greater than M, but not much larger)
-*           Reduce to bidiagonal form without LQ decomposition
-*
-            IE = 1
-            ITAUQ = 1
-            ITAUP = ITAUQ + M
-            IWORK = ITAUP + M
-*
-*           Bidiagonalize A
-*           (CWorkspace: need 2*M+N, prefer 2*M+(M+N)*NB)
-*           (RWorkspace: M)
-*
-            CALL ZGEBRD( M, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
-     $                   WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
-     $                   IERR )
-            IF( WNTUAS ) THEN
-*
-*              If left singular vectors desired in U, copy result to U
-*              and generate left bidiagonalizing vectors in U
-*              (CWorkspace: need 3*M-1, prefer 2*M+(M-1)*NB)
-*              (RWorkspace: 0)
-*
-               CALL ZLACPY( 'L', M, M, A, LDA, U, LDU )
-               CALL ZUNGBR( 'Q', M, M, N, U, LDU, WORK( ITAUQ ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTVAS ) THEN
-*
-*              If right singular vectors desired in VT, copy result to
-*              VT and generate right bidiagonalizing vectors in VT
-*              (CWorkspace: need 2*M+NRVT, prefer 2*M+NRVT*NB)
-*              (RWorkspace: 0)
-*
-               CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
-               IF( WNTVA )
-     $            NRVT = N
-               IF( WNTVS )
-     $            NRVT = M
-               CALL ZUNGBR( 'P', NRVT, N, M, VT, LDVT, WORK( ITAUP ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTUO ) THEN
-*
-*              If left singular vectors desired in A, generate left
-*              bidiagonalizing vectors in A
-*              (CWorkspace: need 3*M-1, prefer 2*M+(M-1)*NB)
-*              (RWorkspace: 0)
-*
-               CALL ZUNGBR( 'Q', M, M, N, A, LDA, WORK( ITAUQ ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IF( WNTVO ) THEN
-*
-*              If right singular vectors desired in A, generate right
-*              bidiagonalizing vectors in A
-*              (CWorkspace: need 3*M, prefer 2*M+M*NB)
-*              (RWorkspace: 0)
-*
-               CALL ZUNGBR( 'P', M, N, M, A, LDA, WORK( ITAUP ),
-     $                      WORK( IWORK ), LWORK-IWORK+1, IERR )
-            END IF
-            IRWORK = IE + M
-            IF( WNTUAS .OR. WNTUO )
-     $         NRU = M
-            IF( WNTUN )
-     $         NRU = 0
-            IF( WNTVAS .OR. WNTVO )
-     $         NCVT = N
-            IF( WNTVN )
-     $         NCVT = 0
-            IF( ( .NOT.WNTUO ) .AND. ( .NOT.WNTVO ) ) THEN
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in U and computing right singular
-*              vectors in VT
-*              (CWorkspace: 0)
-*              (RWorkspace: need BDSPAC)
-*
-               CALL ZBDSQR( 'L', M, NCVT, NRU, 0, S, RWORK( IE ), VT,
-     $                      LDVT, U, LDU, CDUM, 1, RWORK( IRWORK ),
-     $                      INFO )
-            ELSE IF( ( .NOT.WNTUO ) .AND. WNTVO ) THEN
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in U and computing right singular
-*              vectors in A
-*              (CWorkspace: 0)
-*              (RWorkspace: need BDSPAC)
-*
-               CALL ZBDSQR( 'L', M, NCVT, NRU, 0, S, RWORK( IE ), A,
-     $                      LDA, U, LDU, CDUM, 1, RWORK( IRWORK ),
-     $                      INFO )
-            ELSE
-*
-*              Perform bidiagonal QR iteration, if desired, computing
-*              left singular vectors in A and computing right singular
-*              vectors in VT
-*              (CWorkspace: 0)
-*              (RWorkspace: need BDSPAC)
-*
-               CALL ZBDSQR( 'L', M, NCVT, NRU, 0, S, RWORK( IE ), VT,
-     $                      LDVT, A, LDA, CDUM, 1, RWORK( IRWORK ),
-     $                      INFO )
-            END IF
-*
-         END IF
-*
-      END IF
-*
-*     Undo scaling if necessary
-*
-      IF( ISCL.EQ.1 ) THEN
-         IF( ANRM.GT.BIGNUM )
-     $      CALL DLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
-     $                   IERR )
-         IF( INFO.NE.0 .AND. ANRM.GT.BIGNUM )
-     $      CALL DLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN-1, 1,
-     $                   RWORK( IE ), MINMN, IERR )
-         IF( ANRM.LT.SMLNUM )
-     $      CALL DLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
-     $                   IERR )
-         IF( INFO.NE.0 .AND. ANRM.LT.SMLNUM )
-     $      CALL DLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN-1, 1,
-     $                   RWORK( IE ), MINMN, IERR )
-      END IF
-*
-*     Return optimal workspace in WORK(1)
-*
-      WORK( 1 ) = MAXWRK
-*
-      RETURN
-*
-*     End of ZGESVD
-*
-      END
--- a/libcruft/lapack/zgetf2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-      SUBROUTINE ZGETF2( M, N, A, LDA, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGETF2 computes an LU factorization of a general m-by-n matrix A
-*  using partial pivoting with row interchanges.
-*
-*  The factorization has the form
-*     A = P * L * U
-*  where P is a permutation matrix, L is lower triangular with unit
-*  diagonal elements (lower trapezoidal if m > n), and U is upper
-*  triangular (upper trapezoidal if m < n).
-*
-*  This is the right-looking Level 2 BLAS version of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the m by n matrix to be factored.
-*          On exit, the factors L and U from the factorization
-*          A = P*L*U; the unit diagonal elements of L are not stored.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  IPIV    (output) INTEGER array, dimension (min(M,N))
-*          The pivot indices; for 1 <= i <= min(M,N), row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*          > 0: if INFO = k, U(k,k) is exactly zero. The factorization
-*               has been completed, but the factor U is exactly
-*               singular, and division by zero will occur if it is used
-*               to solve a system of equations.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),
-     $                   ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   SFMIN
-      INTEGER            I, J, JP
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH
-      INTEGER            IZAMAX
-      EXTERNAL           DLAMCH, IZAMAX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZGERU, ZSCAL, ZSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGETF2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Compute machine safe minimum
-*
-      SFMIN = DLAMCH('S') 
-*
-      DO 10 J = 1, MIN( M, N )
-*
-*        Find pivot and test for singularity.
-*
-         JP = J - 1 + IZAMAX( M-J+1, A( J, J ), 1 )
-         IPIV( J ) = JP
-         IF( A( JP, J ).NE.ZERO ) THEN
-*
-*           Apply the interchange to columns 1:N.
-*
-            IF( JP.NE.J )
-     $         CALL ZSWAP( N, A( J, 1 ), LDA, A( JP, 1 ), LDA )
-*
-*           Compute elements J+1:M of J-th column.
-*
-            IF( J.LT.M ) THEN
-               IF( ABS(A( J, J )) .GE. SFMIN ) THEN
-                  CALL ZSCAL( M-J, ONE / A( J, J ), A( J+1, J ), 1 )
-               ELSE
-                  DO 20 I = 1, M-J
-                     A( J+I, J ) = A( J+I, J ) / A( J, J )
-   20             CONTINUE
-               END IF
-            END IF
-*
-         ELSE IF( INFO.EQ.0 ) THEN
-*
-            INFO = J
-         END IF
-*
-         IF( J.LT.MIN( M, N ) ) THEN
-*
-*           Update trailing submatrix.
-*
-            CALL ZGERU( M-J, N-J, -ONE, A( J+1, J ), 1, A( J, J+1 ),
-     $                  LDA, A( J+1, J+1 ), LDA )
-         END IF
-   10 CONTINUE
-      RETURN
-*
-*     End of ZGETF2
-*
-      END
--- a/libcruft/lapack/zgetrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,159 +0,0 @@
-      SUBROUTINE ZGETRF( M, N, A, LDA, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGETRF computes an LU factorization of a general M-by-N matrix A
-*  using partial pivoting with row interchanges.
-*
-*  The factorization has the form
-*     A = P * L * U
-*  where P is a permutation matrix, L is lower triangular with unit
-*  diagonal elements (lower trapezoidal if m > n), and U is upper
-*  triangular (upper trapezoidal if m < n).
-*
-*  This is the right-looking Level 3 BLAS version of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the M-by-N matrix to be factored.
-*          On exit, the factors L and U from the factorization
-*          A = P*L*U; the unit diagonal elements of L are not stored.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  IPIV    (output) INTEGER array, dimension (min(M,N))
-*          The pivot indices; for 1 <= i <= min(M,N), row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, U(i,i) is exactly zero. The factorization
-*                has been completed, but the factor U is exactly
-*                singular, and division by zero will occur if it is used
-*                to solve a system of equations.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, IINFO, J, JB, NB
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZGEMM, ZGETF2, ZLASWP, ZTRSM
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGETRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'ZGETRF', ' ', M, N, -1, -1 )
-      IF( NB.LE.1 .OR. NB.GE.MIN( M, N ) ) THEN
-*
-*        Use unblocked code.
-*
-         CALL ZGETF2( M, N, A, LDA, IPIV, INFO )
-      ELSE
-*
-*        Use blocked code.
-*
-         DO 20 J = 1, MIN( M, N ), NB
-            JB = MIN( MIN( M, N )-J+1, NB )
-*
-*           Factor diagonal and subdiagonal blocks and test for exact
-*           singularity.
-*
-            CALL ZGETF2( M-J+1, JB, A( J, J ), LDA, IPIV( J ), IINFO )
-*
-*           Adjust INFO and the pivot indices.
-*
-            IF( INFO.EQ.0 .AND. IINFO.GT.0 )
-     $         INFO = IINFO + J - 1
-            DO 10 I = J, MIN( M, J+JB-1 )
-               IPIV( I ) = J - 1 + IPIV( I )
-   10       CONTINUE
-*
-*           Apply interchanges to columns 1:J-1.
-*
-            CALL ZLASWP( J-1, A, LDA, J, J+JB-1, IPIV, 1 )
-*
-            IF( J+JB.LE.N ) THEN
-*
-*              Apply interchanges to columns J+JB:N.
-*
-               CALL ZLASWP( N-J-JB+1, A( 1, J+JB ), LDA, J, J+JB-1,
-     $                      IPIV, 1 )
-*
-*              Compute block row of U.
-*
-               CALL ZTRSM( 'Left', 'Lower', 'No transpose', 'Unit', JB,
-     $                     N-J-JB+1, ONE, A( J, J ), LDA, A( J, J+JB ),
-     $                     LDA )
-               IF( J+JB.LE.M ) THEN
-*
-*                 Update trailing submatrix.
-*
-                  CALL ZGEMM( 'No transpose', 'No transpose', M-J-JB+1,
-     $                        N-J-JB+1, JB, -ONE, A( J+JB, J ), LDA,
-     $                        A( J, J+JB ), LDA, ONE, A( J+JB, J+JB ),
-     $                        LDA )
-               END IF
-            END IF
-   20    CONTINUE
-      END IF
-      RETURN
-*
-*     End of ZGETRF
-*
-      END
--- a/libcruft/lapack/zgetri.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,193 +0,0 @@
-      SUBROUTINE ZGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX*16         A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGETRI computes the inverse of a matrix using the LU factorization
-*  computed by ZGETRF.
-*
-*  This method inverts U and then computes inv(A) by solving the system
-*  inv(A)*L = inv(U) for inv(A).
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the factors L and U from the factorization
-*          A = P*L*U as computed by ZGETRF.
-*          On exit, if INFO = 0, the inverse of the original matrix A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices from ZGETRF; for 1<=i<=N, row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO=0, then WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,N).
-*          For optimal performance LWORK >= N*NB, where NB is
-*          the optimal blocksize returned by ILAENV.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, U(i,i) is exactly zero; the matrix is
-*                singular and its inverse could not be computed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ),
-     $                   ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IWS, J, JB, JJ, JP, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZGEMM, ZGEMV, ZSWAP, ZTRSM, ZTRTRI
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      NB = ILAENV( 1, 'ZGETRI', ' ', N, -1, -1, -1 )
-      LWKOPT = N*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -3
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGETRI', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Form inv(U).  If INFO > 0 from ZTRTRI, then U is singular,
-*     and the inverse is not computed.
-*
-      CALL ZTRTRI( 'Upper', 'Non-unit', N, A, LDA, INFO )
-      IF( INFO.GT.0 )
-     $   RETURN
-*
-      NBMIN = 2
-      LDWORK = N
-      IF( NB.GT.1 .AND. NB.LT.N ) THEN
-         IWS = MAX( LDWORK*NB, 1 )
-         IF( LWORK.LT.IWS ) THEN
-            NB = LWORK / LDWORK
-            NBMIN = MAX( 2, ILAENV( 2, 'ZGETRI', ' ', N, -1, -1, -1 ) )
-         END IF
-      ELSE
-         IWS = N
-      END IF
-*
-*     Solve the equation inv(A)*L = inv(U) for inv(A).
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code.
-*
-         DO 20 J = N, 1, -1
-*
-*           Copy current column of L to WORK and replace with zeros.
-*
-            DO 10 I = J + 1, N
-               WORK( I ) = A( I, J )
-               A( I, J ) = ZERO
-   10       CONTINUE
-*
-*           Compute current column of inv(A).
-*
-            IF( J.LT.N )
-     $         CALL ZGEMV( 'No transpose', N, N-J, -ONE, A( 1, J+1 ),
-     $                     LDA, WORK( J+1 ), 1, ONE, A( 1, J ), 1 )
-   20    CONTINUE
-      ELSE
-*
-*        Use blocked code.
-*
-         NN = ( ( N-1 ) / NB )*NB + 1
-         DO 50 J = NN, 1, -NB
-            JB = MIN( NB, N-J+1 )
-*
-*           Copy current block column of L to WORK and replace with
-*           zeros.
-*
-            DO 40 JJ = J, J + JB - 1
-               DO 30 I = JJ + 1, N
-                  WORK( I+( JJ-J )*LDWORK ) = A( I, JJ )
-                  A( I, JJ ) = ZERO
-   30          CONTINUE
-   40       CONTINUE
-*
-*           Compute current block column of inv(A).
-*
-            IF( J+JB.LE.N )
-     $         CALL ZGEMM( 'No transpose', 'No transpose', N, JB,
-     $                     N-J-JB+1, -ONE, A( 1, J+JB ), LDA,
-     $                     WORK( J+JB ), LDWORK, ONE, A( 1, J ), LDA )
-            CALL ZTRSM( 'Right', 'Lower', 'No transpose', 'Unit', N, JB,
-     $                  ONE, WORK( J ), LDWORK, A( 1, J ), LDA )
-   50    CONTINUE
-      END IF
-*
-*     Apply column interchanges.
-*
-      DO 60 J = N - 1, 1, -1
-         JP = IPIV( J )
-         IF( JP.NE.J )
-     $      CALL ZSWAP( N, A( 1, J ), 1, A( 1, JP ), 1 )
-   60 CONTINUE
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of ZGETRI
-*
-      END
--- a/libcruft/lapack/zgetrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-      SUBROUTINE ZGETRS( TRANS, N, NRHS, A, LDA, IPIV, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TRANS
-      INTEGER            INFO, LDA, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX*16         A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGETRS solves a system of linear equations
-*     A * X = B,  A**T * X = B,  or  A**H * X = B
-*  with a general N-by-N matrix A using the LU factorization computed
-*  by ZGETRF.
-*
-*  Arguments
-*  =========
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the form of the system of equations:
-*          = 'N':  A * X = B     (No transpose)
-*          = 'T':  A**T * X = B  (Transpose)
-*          = 'C':  A**H * X = B  (Conjugate transpose)
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  A       (input) COMPLEX*16 array, dimension (LDA,N)
-*          The factors L and U from the factorization A = P*L*U
-*          as computed by ZGETRF.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices from ZGETRF; for 1<=i<=N, row i of the
-*          matrix was interchanged with row IPIV(i).
-*
-*  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOTRAN
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLASWP, ZTRSM
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      NOTRAN = LSAME( TRANS, 'N' )
-      IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
-     $    LSAME( TRANS, 'C' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGETRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      IF( NOTRAN ) THEN
-*
-*        Solve A * X = B.
-*
-*        Apply row interchanges to the right hand sides.
-*
-         CALL ZLASWP( NRHS, B, LDB, 1, N, IPIV, 1 )
-*
-*        Solve L*X = B, overwriting B with X.
-*
-         CALL ZTRSM( 'Left', 'Lower', 'No transpose', 'Unit', N, NRHS,
-     $               ONE, A, LDA, B, LDB )
-*
-*        Solve U*X = B, overwriting B with X.
-*
-         CALL ZTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N,
-     $               NRHS, ONE, A, LDA, B, LDB )
-      ELSE
-*
-*        Solve A**T * X = B  or A**H * X = B.
-*
-*        Solve U'*X = B, overwriting B with X.
-*
-         CALL ZTRSM( 'Left', 'Upper', TRANS, 'Non-unit', N, NRHS, ONE,
-     $               A, LDA, B, LDB )
-*
-*        Solve L'*X = B, overwriting B with X.
-*
-         CALL ZTRSM( 'Left', 'Lower', TRANS, 'Unit', N, NRHS, ONE, A,
-     $               LDA, B, LDB )
-*
-*        Apply row interchanges to the solution vectors.
-*
-         CALL ZLASWP( NRHS, B, LDB, 1, N, IPIV, -1 )
-      END IF
-*
-      RETURN
-*
-*     End of ZGETRS
-*
-      END
--- a/libcruft/lapack/zggbak.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,220 +0,0 @@
-      SUBROUTINE ZGGBAK( JOB, SIDE, N, ILO, IHI, LSCALE, RSCALE, M, V,
-     $                   LDV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOB, SIDE
-      INTEGER            IHI, ILO, INFO, LDV, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   LSCALE( * ), RSCALE( * )
-      COMPLEX*16         V( LDV, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGGBAK forms the right or left eigenvectors of a complex generalized
-*  eigenvalue problem A*x = lambda*B*x, by backward transformation on
-*  the computed eigenvectors of the balanced pair of matrices output by
-*  ZGGBAL.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies the type of backward transformation required:
-*          = 'N':  do nothing, return immediately;
-*          = 'P':  do backward transformation for permutation only;
-*          = 'S':  do backward transformation for scaling only;
-*          = 'B':  do backward transformations for both permutation and
-*                  scaling.
-*          JOB must be the same as the argument JOB supplied to ZGGBAL.
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'R':  V contains right eigenvectors;
-*          = 'L':  V contains left eigenvectors.
-*
-*  N       (input) INTEGER
-*          The number of rows of the matrix V.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          The integers ILO and IHI determined by ZGGBAL.
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  LSCALE  (input) DOUBLE PRECISION array, dimension (N)
-*          Details of the permutations and/or scaling factors applied
-*          to the left side of A and B, as returned by ZGGBAL.
-*
-*  RSCALE  (input) DOUBLE PRECISION array, dimension (N)
-*          Details of the permutations and/or scaling factors applied
-*          to the right side of A and B, as returned by ZGGBAL.
-*
-*  M       (input) INTEGER
-*          The number of columns of the matrix V.  M >= 0.
-*
-*  V       (input/output) COMPLEX*16 array, dimension (LDV,M)
-*          On entry, the matrix of right or left eigenvectors to be
-*          transformed, as returned by ZTGEVC.
-*          On exit, V is overwritten by the transformed eigenvectors.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the matrix V. LDV >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  See R.C. Ward, Balancing the generalized eigenvalue problem,
-*                 SIAM J. Sci. Stat. Comp. 2 (1981), 141-152.
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            LEFTV, RIGHTV
-      INTEGER            I, K
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZDSCAL, ZSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      RIGHTV = LSAME( SIDE, 'R' )
-      LEFTV = LSAME( SIDE, 'L' )
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
-     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ILO.LT.1 ) THEN
-         INFO = -4
-      ELSE IF( N.EQ.0 .AND. IHI.EQ.0 .AND. ILO.NE.1 ) THEN
-         INFO = -4
-      ELSE IF( N.GT.0 .AND. ( IHI.LT.ILO .OR. IHI.GT.MAX( 1, N ) ) )
-     $   THEN
-         INFO = -5
-      ELSE IF( N.EQ.0 .AND. ILO.EQ.1 .AND. IHI.NE.0 ) THEN
-         INFO = -5
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -8
-      ELSE IF( LDV.LT.MAX( 1, N ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGGBAK', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-      IF( M.EQ.0 )
-     $   RETURN
-      IF( LSAME( JOB, 'N' ) )
-     $   RETURN
-*
-      IF( ILO.EQ.IHI )
-     $   GO TO 30
-*
-*     Backward balance
-*
-      IF( LSAME( JOB, 'S' ) .OR. LSAME( JOB, 'B' ) ) THEN
-*
-*        Backward transformation on right eigenvectors
-*
-         IF( RIGHTV ) THEN
-            DO 10 I = ILO, IHI
-               CALL ZDSCAL( M, RSCALE( I ), V( I, 1 ), LDV )
-   10       CONTINUE
-         END IF
-*
-*        Backward transformation on left eigenvectors
-*
-         IF( LEFTV ) THEN
-            DO 20 I = ILO, IHI
-               CALL ZDSCAL( M, LSCALE( I ), V( I, 1 ), LDV )
-   20       CONTINUE
-         END IF
-      END IF
-*
-*     Backward permutation
-*
-   30 CONTINUE
-      IF( LSAME( JOB, 'P' ) .OR. LSAME( JOB, 'B' ) ) THEN
-*
-*        Backward permutation on right eigenvectors
-*
-         IF( RIGHTV ) THEN
-            IF( ILO.EQ.1 )
-     $         GO TO 50
-            DO 40 I = ILO - 1, 1, -1
-               K = RSCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 40
-               CALL ZSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   40       CONTINUE
-*
-   50       CONTINUE
-            IF( IHI.EQ.N )
-     $         GO TO 70
-            DO 60 I = IHI + 1, N
-               K = RSCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 60
-               CALL ZSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   60       CONTINUE
-         END IF
-*
-*        Backward permutation on left eigenvectors
-*
-   70    CONTINUE
-         IF( LEFTV ) THEN
-            IF( ILO.EQ.1 )
-     $         GO TO 90
-            DO 80 I = ILO - 1, 1, -1
-               K = LSCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 80
-               CALL ZSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-   80       CONTINUE
-*
-   90       CONTINUE
-            IF( IHI.EQ.N )
-     $         GO TO 110
-            DO 100 I = IHI + 1, N
-               K = LSCALE( I )
-               IF( K.EQ.I )
-     $            GO TO 100
-               CALL ZSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
-  100       CONTINUE
-         END IF
-      END IF
-*
-  110 CONTINUE
-*
-      RETURN
-*
-*     End of ZGGBAK
-*
-      END
--- a/libcruft/lapack/zggbal.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,482 +0,0 @@
-      SUBROUTINE ZGGBAL( JOB, N, A, LDA, B, LDB, ILO, IHI, LSCALE,
-     $                   RSCALE, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOB
-      INTEGER            IHI, ILO, INFO, LDA, LDB, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   LSCALE( * ), RSCALE( * ), WORK( * )
-      COMPLEX*16         A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGGBAL balances a pair of general complex matrices (A,B).  This
-*  involves, first, permuting A and B by similarity transformations to
-*  isolate eigenvalues in the first 1 to ILO$-$1 and last IHI+1 to N
-*  elements on the diagonal; and second, applying a diagonal similarity
-*  transformation to rows and columns ILO to IHI to make the rows
-*  and columns as close in norm as possible. Both steps are optional.
-*
-*  Balancing may reduce the 1-norm of the matrices, and improve the
-*  accuracy of the computed eigenvalues and/or eigenvectors in the
-*  generalized eigenvalue problem A*x = lambda*B*x.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies the operations to be performed on A and B:
-*          = 'N':  none:  simply set ILO = 1, IHI = N, LSCALE(I) = 1.0
-*                  and RSCALE(I) = 1.0 for i=1,...,N;
-*          = 'P':  permute only;
-*          = 'S':  scale only;
-*          = 'B':  both permute and scale.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the input matrix A.
-*          On exit, A is overwritten by the balanced matrix.
-*          If JOB = 'N', A is not referenced.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,N).
-*
-*  B       (input/output) COMPLEX*16 array, dimension (LDB,N)
-*          On entry, the input matrix B.
-*          On exit, B is overwritten by the balanced matrix.
-*          If JOB = 'N', B is not referenced.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B. LDB >= max(1,N).
-*
-*  ILO     (output) INTEGER
-*  IHI     (output) INTEGER
-*          ILO and IHI are set to integers such that on exit
-*          A(i,j) = 0 and B(i,j) = 0 if i > j and
-*          j = 1,...,ILO-1 or i = IHI+1,...,N.
-*          If JOB = 'N' or 'S', ILO = 1 and IHI = N.
-*
-*  LSCALE  (output) DOUBLE PRECISION array, dimension (N)
-*          Details of the permutations and scaling factors applied
-*          to the left side of A and B.  If P(j) is the index of the
-*          row interchanged with row j, and D(j) is the scaling factor
-*          applied to row j, then
-*            LSCALE(j) = P(j)    for J = 1,...,ILO-1
-*                      = D(j)    for J = ILO,...,IHI
-*                      = P(j)    for J = IHI+1,...,N.
-*          The order in which the interchanges are made is N to IHI+1,
-*          then 1 to ILO-1.
-*
-*  RSCALE  (output) DOUBLE PRECISION array, dimension (N)
-*          Details of the permutations and scaling factors applied
-*          to the right side of A and B.  If P(j) is the index of the
-*          column interchanged with column j, and D(j) is the scaling
-*          factor applied to column j, then
-*            RSCALE(j) = P(j)    for J = 1,...,ILO-1
-*                      = D(j)    for J = ILO,...,IHI
-*                      = P(j)    for J = IHI+1,...,N.
-*          The order in which the interchanges are made is N to IHI+1,
-*          then 1 to ILO-1.
-*
-*  WORK    (workspace) REAL array, dimension (lwork)
-*          lwork must be at least max(1,6*N) when JOB = 'S' or 'B', and
-*          at least 1 when JOB = 'N' or 'P'.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  See R.C. WARD, Balancing the generalized eigenvalue problem,
-*                 SIAM J. Sci. Stat. Comp. 2 (1981), 141-152.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, HALF, ONE
-      PARAMETER          ( ZERO = 0.0D+0, HALF = 0.5D+0, ONE = 1.0D+0 )
-      DOUBLE PRECISION   THREE, SCLFAC
-      PARAMETER          ( THREE = 3.0D+0, SCLFAC = 1.0D+1 )
-      COMPLEX*16         CZERO
-      PARAMETER          ( CZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ICAB, IFLOW, IP1, IR, IRAB, IT, J, JC, JP1,
-     $                   K, KOUNT, L, LCAB, LM1, LRAB, LSFMAX, LSFMIN,
-     $                   M, NR, NRP2
-      DOUBLE PRECISION   ALPHA, BASL, BETA, CAB, CMAX, COEF, COEF2,
-     $                   COEF5, COR, EW, EWC, GAMMA, PGAMMA, RAB, SFMAX,
-     $                   SFMIN, SUM, T, TA, TB, TC
-      COMPLEX*16         CDUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IZAMAX
-      DOUBLE PRECISION   DDOT, DLAMCH
-      EXTERNAL           LSAME, IZAMAX, DDOT, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DAXPY, DSCAL, XERBLA, ZDSCAL, ZSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DIMAG, INT, LOG10, MAX, MIN, SIGN
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( DBLE( CDUM ) ) + ABS( DIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
-     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGGBAL', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         ILO = 1
-         IHI = N
-         RETURN
-      END IF
-*
-      IF( N.EQ.1 ) THEN
-         ILO = 1
-         IHI = N
-         LSCALE( 1 ) = ONE
-         RSCALE( 1 ) = ONE
-         RETURN
-      END IF
-*
-      IF( LSAME( JOB, 'N' ) ) THEN
-         ILO = 1
-         IHI = N
-         DO 10 I = 1, N
-            LSCALE( I ) = ONE
-            RSCALE( I ) = ONE
-   10    CONTINUE
-         RETURN
-      END IF
-*
-      K = 1
-      L = N
-      IF( LSAME( JOB, 'S' ) )
-     $   GO TO 190
-*
-      GO TO 30
-*
-*     Permute the matrices A and B to isolate the eigenvalues.
-*
-*     Find row with one nonzero in columns 1 through L
-*
-   20 CONTINUE
-      L = LM1
-      IF( L.NE.1 )
-     $   GO TO 30
-*
-      RSCALE( 1 ) = 1
-      LSCALE( 1 ) = 1
-      GO TO 190
-*
-   30 CONTINUE
-      LM1 = L - 1
-      DO 80 I = L, 1, -1
-         DO 40 J = 1, LM1
-            JP1 = J + 1
-            IF( A( I, J ).NE.CZERO .OR. B( I, J ).NE.CZERO )
-     $         GO TO 50
-   40    CONTINUE
-         J = L
-         GO TO 70
-*
-   50    CONTINUE
-         DO 60 J = JP1, L
-            IF( A( I, J ).NE.CZERO .OR. B( I, J ).NE.CZERO )
-     $         GO TO 80
-   60    CONTINUE
-         J = JP1 - 1
-*
-   70    CONTINUE
-         M = L
-         IFLOW = 1
-         GO TO 160
-   80 CONTINUE
-      GO TO 100
-*
-*     Find column with one nonzero in rows K through N
-*
-   90 CONTINUE
-      K = K + 1
-*
-  100 CONTINUE
-      DO 150 J = K, L
-         DO 110 I = K, LM1
-            IP1 = I + 1
-            IF( A( I, J ).NE.CZERO .OR. B( I, J ).NE.CZERO )
-     $         GO TO 120
-  110    CONTINUE
-         I = L
-         GO TO 140
-  120    CONTINUE
-         DO 130 I = IP1, L
-            IF( A( I, J ).NE.CZERO .OR. B( I, J ).NE.CZERO )
-     $         GO TO 150
-  130    CONTINUE
-         I = IP1 - 1
-  140    CONTINUE
-         M = K
-         IFLOW = 2
-         GO TO 160
-  150 CONTINUE
-      GO TO 190
-*
-*     Permute rows M and I
-*
-  160 CONTINUE
-      LSCALE( M ) = I
-      IF( I.EQ.M )
-     $   GO TO 170
-      CALL ZSWAP( N-K+1, A( I, K ), LDA, A( M, K ), LDA )
-      CALL ZSWAP( N-K+1, B( I, K ), LDB, B( M, K ), LDB )
-*
-*     Permute columns M and J
-*
-  170 CONTINUE
-      RSCALE( M ) = J
-      IF( J.EQ.M )
-     $   GO TO 180
-      CALL ZSWAP( L, A( 1, J ), 1, A( 1, M ), 1 )
-      CALL ZSWAP( L, B( 1, J ), 1, B( 1, M ), 1 )
-*
-  180 CONTINUE
-      GO TO ( 20, 90 )IFLOW
-*
-  190 CONTINUE
-      ILO = K
-      IHI = L
-*
-      IF( LSAME( JOB, 'P' ) ) THEN
-         DO 195 I = ILO, IHI
-            LSCALE( I ) = ONE
-            RSCALE( I ) = ONE
-  195    CONTINUE
-         RETURN
-      END IF
-*
-      IF( ILO.EQ.IHI )
-     $   RETURN
-*
-*     Balance the submatrix in rows ILO to IHI.
-*
-      NR = IHI - ILO + 1
-      DO 200 I = ILO, IHI
-         RSCALE( I ) = ZERO
-         LSCALE( I ) = ZERO
-*
-         WORK( I ) = ZERO
-         WORK( I+N ) = ZERO
-         WORK( I+2*N ) = ZERO
-         WORK( I+3*N ) = ZERO
-         WORK( I+4*N ) = ZERO
-         WORK( I+5*N ) = ZERO
-  200 CONTINUE
-*
-*     Compute right side vector in resulting linear equations
-*
-      BASL = LOG10( SCLFAC )
-      DO 240 I = ILO, IHI
-         DO 230 J = ILO, IHI
-            IF( A( I, J ).EQ.CZERO ) THEN
-               TA = ZERO
-               GO TO 210
-            END IF
-            TA = LOG10( CABS1( A( I, J ) ) ) / BASL
-*
-  210       CONTINUE
-            IF( B( I, J ).EQ.CZERO ) THEN
-               TB = ZERO
-               GO TO 220
-            END IF
-            TB = LOG10( CABS1( B( I, J ) ) ) / BASL
-*
-  220       CONTINUE
-            WORK( I+4*N ) = WORK( I+4*N ) - TA - TB
-            WORK( J+5*N ) = WORK( J+5*N ) - TA - TB
-  230    CONTINUE
-  240 CONTINUE
-*
-      COEF = ONE / DBLE( 2*NR )
-      COEF2 = COEF*COEF
-      COEF5 = HALF*COEF2
-      NRP2 = NR + 2
-      BETA = ZERO
-      IT = 1
-*
-*     Start generalized conjugate gradient iteration
-*
-  250 CONTINUE
-*
-      GAMMA = DDOT( NR, WORK( ILO+4*N ), 1, WORK( ILO+4*N ), 1 ) +
-     $        DDOT( NR, WORK( ILO+5*N ), 1, WORK( ILO+5*N ), 1 )
-*
-      EW = ZERO
-      EWC = ZERO
-      DO 260 I = ILO, IHI
-         EW = EW + WORK( I+4*N )
-         EWC = EWC + WORK( I+5*N )
-  260 CONTINUE
-*
-      GAMMA = COEF*GAMMA - COEF2*( EW**2+EWC**2 ) - COEF5*( EW-EWC )**2
-      IF( GAMMA.EQ.ZERO )
-     $   GO TO 350
-      IF( IT.NE.1 )
-     $   BETA = GAMMA / PGAMMA
-      T = COEF5*( EWC-THREE*EW )
-      TC = COEF5*( EW-THREE*EWC )
-*
-      CALL DSCAL( NR, BETA, WORK( ILO ), 1 )
-      CALL DSCAL( NR, BETA, WORK( ILO+N ), 1 )
-*
-      CALL DAXPY( NR, COEF, WORK( ILO+4*N ), 1, WORK( ILO+N ), 1 )
-      CALL DAXPY( NR, COEF, WORK( ILO+5*N ), 1, WORK( ILO ), 1 )
-*
-      DO 270 I = ILO, IHI
-         WORK( I ) = WORK( I ) + TC
-         WORK( I+N ) = WORK( I+N ) + T
-  270 CONTINUE
-*
-*     Apply matrix to vector
-*
-      DO 300 I = ILO, IHI
-         KOUNT = 0
-         SUM = ZERO
-         DO 290 J = ILO, IHI
-            IF( A( I, J ).EQ.CZERO )
-     $         GO TO 280
-            KOUNT = KOUNT + 1
-            SUM = SUM + WORK( J )
-  280       CONTINUE
-            IF( B( I, J ).EQ.CZERO )
-     $         GO TO 290
-            KOUNT = KOUNT + 1
-            SUM = SUM + WORK( J )
-  290    CONTINUE
-         WORK( I+2*N ) = DBLE( KOUNT )*WORK( I+N ) + SUM
-  300 CONTINUE
-*
-      DO 330 J = ILO, IHI
-         KOUNT = 0
-         SUM = ZERO
-         DO 320 I = ILO, IHI
-            IF( A( I, J ).EQ.CZERO )
-     $         GO TO 310
-            KOUNT = KOUNT + 1
-            SUM = SUM + WORK( I+N )
-  310       CONTINUE
-            IF( B( I, J ).EQ.CZERO )
-     $         GO TO 320
-            KOUNT = KOUNT + 1
-            SUM = SUM + WORK( I+N )
-  320    CONTINUE
-         WORK( J+3*N ) = DBLE( KOUNT )*WORK( J ) + SUM
-  330 CONTINUE
-*
-      SUM = DDOT( NR, WORK( ILO+N ), 1, WORK( ILO+2*N ), 1 ) +
-     $      DDOT( NR, WORK( ILO ), 1, WORK( ILO+3*N ), 1 )
-      ALPHA = GAMMA / SUM
-*
-*     Determine correction to current iteration
-*
-      CMAX = ZERO
-      DO 340 I = ILO, IHI
-         COR = ALPHA*WORK( I+N )
-         IF( ABS( COR ).GT.CMAX )
-     $      CMAX = ABS( COR )
-         LSCALE( I ) = LSCALE( I ) + COR
-         COR = ALPHA*WORK( I )
-         IF( ABS( COR ).GT.CMAX )
-     $      CMAX = ABS( COR )
-         RSCALE( I ) = RSCALE( I ) + COR
-  340 CONTINUE
-      IF( CMAX.LT.HALF )
-     $   GO TO 350
-*
-      CALL DAXPY( NR, -ALPHA, WORK( ILO+2*N ), 1, WORK( ILO+4*N ), 1 )
-      CALL DAXPY( NR, -ALPHA, WORK( ILO+3*N ), 1, WORK( ILO+5*N ), 1 )
-*
-      PGAMMA = GAMMA
-      IT = IT + 1
-      IF( IT.LE.NRP2 )
-     $   GO TO 250
-*
-*     End generalized conjugate gradient iteration
-*
-  350 CONTINUE
-      SFMIN = DLAMCH( 'S' )
-      SFMAX = ONE / SFMIN
-      LSFMIN = INT( LOG10( SFMIN ) / BASL+ONE )
-      LSFMAX = INT( LOG10( SFMAX ) / BASL )
-      DO 360 I = ILO, IHI
-         IRAB = IZAMAX( N-ILO+1, A( I, ILO ), LDA )
-         RAB = ABS( A( I, IRAB+ILO-1 ) )
-         IRAB = IZAMAX( N-ILO+1, B( I, ILO ), LDB )
-         RAB = MAX( RAB, ABS( B( I, IRAB+ILO-1 ) ) )
-         LRAB = INT( LOG10( RAB+SFMIN ) / BASL+ONE )
-         IR = LSCALE( I ) + SIGN( HALF, LSCALE( I ) )
-         IR = MIN( MAX( IR, LSFMIN ), LSFMAX, LSFMAX-LRAB )
-         LSCALE( I ) = SCLFAC**IR
-         ICAB = IZAMAX( IHI, A( 1, I ), 1 )
-         CAB = ABS( A( ICAB, I ) )
-         ICAB = IZAMAX( IHI, B( 1, I ), 1 )
-         CAB = MAX( CAB, ABS( B( ICAB, I ) ) )
-         LCAB = INT( LOG10( CAB+SFMIN ) / BASL+ONE )
-         JC = RSCALE( I ) + SIGN( HALF, RSCALE( I ) )
-         JC = MIN( MAX( JC, LSFMIN ), LSFMAX, LSFMAX-LCAB )
-         RSCALE( I ) = SCLFAC**JC
-  360 CONTINUE
-*
-*     Row scaling of matrices A and B
-*
-      DO 370 I = ILO, IHI
-         CALL ZDSCAL( N-ILO+1, LSCALE( I ), A( I, ILO ), LDA )
-         CALL ZDSCAL( N-ILO+1, LSCALE( I ), B( I, ILO ), LDB )
-  370 CONTINUE
-*
-*     Column scaling of matrices A and B
-*
-      DO 380 J = ILO, IHI
-         CALL ZDSCAL( IHI, RSCALE( J ), A( 1, J ), 1 )
-         CALL ZDSCAL( IHI, RSCALE( J ), B( 1, J ), 1 )
-  380 CONTINUE
-*
-      RETURN
-*
-*     End of ZGGBAL
-*
-      END
--- a/libcruft/lapack/zggev.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,454 +0,0 @@
-      SUBROUTINE ZGGEV( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
-     $                  VL, LDVL, VR, LDVR, WORK, LWORK, RWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBVL, JOBVR
-      INTEGER            INFO, LDA, LDB, LDVL, LDVR, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   RWORK( * )
-      COMPLEX*16         A( LDA, * ), ALPHA( * ), B( LDB, * ),
-     $                   BETA( * ), VL( LDVL, * ), VR( LDVR, * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGGEV computes for a pair of N-by-N complex nonsymmetric matrices
-*  (A,B), the generalized eigenvalues, and optionally, the left and/or
-*  right generalized eigenvectors.
-*
-*  A generalized eigenvalue for a pair of matrices (A,B) is a scalar
-*  lambda or a ratio alpha/beta = lambda, such that A - lambda*B is
-*  singular. It is usually represented as the pair (alpha,beta), as
-*  there is a reasonable interpretation for beta=0, and even for both
-*  being zero.
-*
-*  The right generalized eigenvector v(j) corresponding to the
-*  generalized eigenvalue lambda(j) of (A,B) satisfies
-*
-*               A * v(j) = lambda(j) * B * v(j).
-*
-*  The left generalized eigenvector u(j) corresponding to the
-*  generalized eigenvalues lambda(j) of (A,B) satisfies
-*
-*               u(j)**H * A = lambda(j) * u(j)**H * B
-*
-*  where u(j)**H is the conjugate-transpose of u(j).
-*
-*  Arguments
-*  =========
-*
-*  JOBVL   (input) CHARACTER*1
-*          = 'N':  do not compute the left generalized eigenvectors;
-*          = 'V':  compute the left generalized eigenvectors.
-*
-*  JOBVR   (input) CHARACTER*1
-*          = 'N':  do not compute the right generalized eigenvectors;
-*          = 'V':  compute the right generalized eigenvectors.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A, B, VL, and VR.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA, N)
-*          On entry, the matrix A in the pair (A,B).
-*          On exit, A has been overwritten.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of A.  LDA >= max(1,N).
-*
-*  B       (input/output) COMPLEX*16 array, dimension (LDB, N)
-*          On entry, the matrix B in the pair (A,B).
-*          On exit, B has been overwritten.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of B.  LDB >= max(1,N).
-*
-*  ALPHA   (output) COMPLEX*16 array, dimension (N)
-*  BETA    (output) COMPLEX*16 array, dimension (N)
-*          On exit, ALPHA(j)/BETA(j), j=1,...,N, will be the
-*          generalized eigenvalues.
-*
-*          Note: the quotients ALPHA(j)/BETA(j) may easily over- or
-*          underflow, and BETA(j) may even be zero.  Thus, the user
-*          should avoid naively computing the ratio alpha/beta.
-*          However, ALPHA will be always less than and usually
-*          comparable with norm(A) in magnitude, and BETA always less
-*          than and usually comparable with norm(B).
-*
-*  VL      (output) COMPLEX*16 array, dimension (LDVL,N)
-*          If JOBVL = 'V', the left generalized eigenvectors u(j) are
-*          stored one after another in the columns of VL, in the same
-*          order as their eigenvalues.
-*          Each eigenvector is scaled so the largest component has
-*          abs(real part) + abs(imag. part) = 1.
-*          Not referenced if JOBVL = 'N'.
-*
-*  LDVL    (input) INTEGER
-*          The leading dimension of the matrix VL. LDVL >= 1, and
-*          if JOBVL = 'V', LDVL >= N.
-*
-*  VR      (output) COMPLEX*16 array, dimension (LDVR,N)
-*          If JOBVR = 'V', the right generalized eigenvectors v(j) are
-*          stored one after another in the columns of VR, in the same
-*          order as their eigenvalues.
-*          Each eigenvector is scaled so the largest component has
-*          abs(real part) + abs(imag. part) = 1.
-*          Not referenced if JOBVR = 'N'.
-*
-*  LDVR    (input) INTEGER
-*          The leading dimension of the matrix VR. LDVR >= 1, and
-*          if JOBVR = 'V', LDVR >= N.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,2*N).
-*          For good performance, LWORK must generally be larger.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace/output) DOUBLE PRECISION array, dimension (8*N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*          =1,...,N:
-*                The QZ iteration failed.  No eigenvectors have been
-*                calculated, but ALPHA(j) and BETA(j) should be
-*                correct for j=INFO+1,...,N.
-*          > N:  =N+1: other then QZ iteration failed in DHGEQZ,
-*                =N+2: error return from DTGEVC.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
-      COMPLEX*16         CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0D0, 0.0D0 ),
-     $                   CONE = ( 1.0D0, 0.0D0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY
-      CHARACTER          CHTEMP
-      INTEGER            ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT, ILO,
-     $                   IN, IRIGHT, IROWS, IRWRK, ITAU, IWRK, JC, JR,
-     $                   LWKMIN, LWKOPT
-      DOUBLE PRECISION   ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
-     $                   SMLNUM, TEMP
-      COMPLEX*16         X
-*     ..
-*     .. Local Arrays ..
-      LOGICAL            LDUMMA( 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLABAD, XERBLA, ZGEQRF, ZGGBAK, ZGGBAL, ZGGHRD,
-     $                   ZHGEQZ, ZLACPY, ZLASCL, ZLASET, ZTGEVC, ZUNGQR,
-     $                   ZUNMQR
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      DOUBLE PRECISION   DLAMCH, ZLANGE
-      EXTERNAL           LSAME, ILAENV, DLAMCH, ZLANGE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DIMAG, MAX, SQRT
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   ABS1
-*     ..
-*     .. Statement Function definitions ..
-      ABS1( X ) = ABS( DBLE( X ) ) + ABS( DIMAG( X ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode the input arguments
-*
-      IF( LSAME( JOBVL, 'N' ) ) THEN
-         IJOBVL = 1
-         ILVL = .FALSE.
-      ELSE IF( LSAME( JOBVL, 'V' ) ) THEN
-         IJOBVL = 2
-         ILVL = .TRUE.
-      ELSE
-         IJOBVL = -1
-         ILVL = .FALSE.
-      END IF
-*
-      IF( LSAME( JOBVR, 'N' ) ) THEN
-         IJOBVR = 1
-         ILVR = .FALSE.
-      ELSE IF( LSAME( JOBVR, 'V' ) ) THEN
-         IJOBVR = 2
-         ILVR = .TRUE.
-      ELSE
-         IJOBVR = -1
-         ILVR = .FALSE.
-      END IF
-      ILV = ILVL .OR. ILVR
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( IJOBVL.LE.0 ) THEN
-         INFO = -1
-      ELSE IF( IJOBVR.LE.0 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDVL.LT.1 .OR. ( ILVL .AND. LDVL.LT.N ) ) THEN
-         INFO = -11
-      ELSE IF( LDVR.LT.1 .OR. ( ILVR .AND. LDVR.LT.N ) ) THEN
-         INFO = -13
-      END IF
-*
-*     Compute workspace
-*      (Note: Comments in the code beginning "Workspace:" describe the
-*       minimal amount of workspace needed at that point in the code,
-*       as well as the preferred amount for good performance.
-*       NB refers to the optimal block size for the immediately
-*       following subroutine, as returned by ILAENV. The workspace is
-*       computed assuming ILO = 1 and IHI = N, the worst case.)
-*
-      IF( INFO.EQ.0 ) THEN
-         LWKMIN = MAX( 1, 2*N )
-         LWKOPT = MAX( 1, N + N*ILAENV( 1, 'ZGEQRF', ' ', N, 1, N, 0 ) )
-         LWKOPT = MAX( LWKOPT, N +
-     $                 N*ILAENV( 1, 'ZUNMQR', ' ', N, 1, N, 0 ) )
-         IF( ILVL ) THEN
-            LWKOPT = MAX( LWKOPT, N +
-     $                    N*ILAENV( 1, 'ZUNGQR', ' ', N, 1, N, -1 ) )
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY )
-     $      INFO = -15
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGGEV ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Get machine constants
-*
-      EPS = DLAMCH( 'E' )*DLAMCH( 'B' )
-      SMLNUM = DLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SQRT( SMLNUM ) / EPS
-      BIGNUM = ONE / SMLNUM
-*
-*     Scale A if max element outside range [SMLNUM,BIGNUM]
-*
-      ANRM = ZLANGE( 'M', N, N, A, LDA, RWORK )
-      ILASCL = .FALSE.
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
-         ANRMTO = SMLNUM
-         ILASCL = .TRUE.
-      ELSE IF( ANRM.GT.BIGNUM ) THEN
-         ANRMTO = BIGNUM
-         ILASCL = .TRUE.
-      END IF
-      IF( ILASCL )
-     $   CALL ZLASCL( 'G', 0, 0, ANRM, ANRMTO, N, N, A, LDA, IERR )
-*
-*     Scale B if max element outside range [SMLNUM,BIGNUM]
-*
-      BNRM = ZLANGE( 'M', N, N, B, LDB, RWORK )
-      ILBSCL = .FALSE.
-      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
-         BNRMTO = SMLNUM
-         ILBSCL = .TRUE.
-      ELSE IF( BNRM.GT.BIGNUM ) THEN
-         BNRMTO = BIGNUM
-         ILBSCL = .TRUE.
-      END IF
-      IF( ILBSCL )
-     $   CALL ZLASCL( 'G', 0, 0, BNRM, BNRMTO, N, N, B, LDB, IERR )
-*
-*     Permute the matrices A, B to isolate eigenvalues if possible
-*     (Real Workspace: need 6*N)
-*
-      ILEFT = 1
-      IRIGHT = N + 1
-      IRWRK = IRIGHT + N
-      CALL ZGGBAL( 'P', N, A, LDA, B, LDB, ILO, IHI, RWORK( ILEFT ),
-     $             RWORK( IRIGHT ), RWORK( IRWRK ), IERR )
-*
-*     Reduce B to triangular form (QR decomposition of B)
-*     (Complex Workspace: need N, prefer N*NB)
-*
-      IROWS = IHI + 1 - ILO
-      IF( ILV ) THEN
-         ICOLS = N + 1 - ILO
-      ELSE
-         ICOLS = IROWS
-      END IF
-      ITAU = 1
-      IWRK = ITAU + IROWS
-      CALL ZGEQRF( IROWS, ICOLS, B( ILO, ILO ), LDB, WORK( ITAU ),
-     $             WORK( IWRK ), LWORK+1-IWRK, IERR )
-*
-*     Apply the orthogonal transformation to matrix A
-*     (Complex Workspace: need N, prefer N*NB)
-*
-      CALL ZUNMQR( 'L', 'C', IROWS, ICOLS, IROWS, B( ILO, ILO ), LDB,
-     $             WORK( ITAU ), A( ILO, ILO ), LDA, WORK( IWRK ),
-     $             LWORK+1-IWRK, IERR )
-*
-*     Initialize VL
-*     (Complex Workspace: need N, prefer N*NB)
-*
-      IF( ILVL ) THEN
-         CALL ZLASET( 'Full', N, N, CZERO, CONE, VL, LDVL )
-         IF( IROWS.GT.1 ) THEN
-            CALL ZLACPY( 'L', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
-     $                   VL( ILO+1, ILO ), LDVL )
-         END IF
-         CALL ZUNGQR( IROWS, IROWS, IROWS, VL( ILO, ILO ), LDVL,
-     $                WORK( ITAU ), WORK( IWRK ), LWORK+1-IWRK, IERR )
-      END IF
-*
-*     Initialize VR
-*
-      IF( ILVR )
-     $   CALL ZLASET( 'Full', N, N, CZERO, CONE, VR, LDVR )
-*
-*     Reduce to generalized Hessenberg form
-*
-      IF( ILV ) THEN
-*
-*        Eigenvectors requested -- work on whole matrix.
-*
-         CALL ZGGHRD( JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB, VL,
-     $                LDVL, VR, LDVR, IERR )
-      ELSE
-         CALL ZGGHRD( 'N', 'N', IROWS, 1, IROWS, A( ILO, ILO ), LDA,
-     $                B( ILO, ILO ), LDB, VL, LDVL, VR, LDVR, IERR )
-      END IF
-*
-*     Perform QZ algorithm (Compute eigenvalues, and optionally, the
-*     Schur form and Schur vectors)
-*     (Complex Workspace: need N)
-*     (Real Workspace: need N)
-*
-      IWRK = ITAU
-      IF( ILV ) THEN
-         CHTEMP = 'S'
-      ELSE
-         CHTEMP = 'E'
-      END IF
-      CALL ZHGEQZ( CHTEMP, JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB,
-     $             ALPHA, BETA, VL, LDVL, VR, LDVR, WORK( IWRK ),
-     $             LWORK+1-IWRK, RWORK( IRWRK ), IERR )
-      IF( IERR.NE.0 ) THEN
-         IF( IERR.GT.0 .AND. IERR.LE.N ) THEN
-            INFO = IERR
-         ELSE IF( IERR.GT.N .AND. IERR.LE.2*N ) THEN
-            INFO = IERR - N
-         ELSE
-            INFO = N + 1
-         END IF
-         GO TO 70
-      END IF
-*
-*     Compute Eigenvectors
-*     (Real Workspace: need 2*N)
-*     (Complex Workspace: need 2*N)
-*
-      IF( ILV ) THEN
-         IF( ILVL ) THEN
-            IF( ILVR ) THEN
-               CHTEMP = 'B'
-            ELSE
-               CHTEMP = 'L'
-            END IF
-         ELSE
-            CHTEMP = 'R'
-         END IF
-*
-         CALL ZTGEVC( CHTEMP, 'B', LDUMMA, N, A, LDA, B, LDB, VL, LDVL,
-     $                VR, LDVR, N, IN, WORK( IWRK ), RWORK( IRWRK ),
-     $                IERR )
-         IF( IERR.NE.0 ) THEN
-            INFO = N + 2
-            GO TO 70
-         END IF
-*
-*        Undo balancing on VL and VR and normalization
-*        (Workspace: none needed)
-*
-         IF( ILVL ) THEN
-            CALL ZGGBAK( 'P', 'L', N, ILO, IHI, RWORK( ILEFT ),
-     $                   RWORK( IRIGHT ), N, VL, LDVL, IERR )
-            DO 30 JC = 1, N
-               TEMP = ZERO
-               DO 10 JR = 1, N
-                  TEMP = MAX( TEMP, ABS1( VL( JR, JC ) ) )
-   10          CONTINUE
-               IF( TEMP.LT.SMLNUM )
-     $            GO TO 30
-               TEMP = ONE / TEMP
-               DO 20 JR = 1, N
-                  VL( JR, JC ) = VL( JR, JC )*TEMP
-   20          CONTINUE
-   30       CONTINUE
-         END IF
-         IF( ILVR ) THEN
-            CALL ZGGBAK( 'P', 'R', N, ILO, IHI, RWORK( ILEFT ),
-     $                   RWORK( IRIGHT ), N, VR, LDVR, IERR )
-            DO 60 JC = 1, N
-               TEMP = ZERO
-               DO 40 JR = 1, N
-                  TEMP = MAX( TEMP, ABS1( VR( JR, JC ) ) )
-   40          CONTINUE
-               IF( TEMP.LT.SMLNUM )
-     $            GO TO 60
-               TEMP = ONE / TEMP
-               DO 50 JR = 1, N
-                  VR( JR, JC ) = VR( JR, JC )*TEMP
-   50          CONTINUE
-   60       CONTINUE
-         END IF
-      END IF
-*
-*     Undo scaling if necessary
-*
-      IF( ILASCL )
-     $   CALL ZLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHA, N, IERR )
-*
-      IF( ILBSCL )
-     $   CALL ZLASCL( 'G', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
-*
-   70 CONTINUE
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of ZGGEV
-*
-      END
--- a/libcruft/lapack/zgghrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,264 +0,0 @@
-      SUBROUTINE ZGGHRD( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
-     $                   LDQ, Z, LDZ, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPQ, COMPZ
-      INTEGER            IHI, ILO, INFO, LDA, LDB, LDQ, LDZ, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
-     $                   Z( LDZ, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGGHRD reduces a pair of complex matrices (A,B) to generalized upper
-*  Hessenberg form using unitary transformations, where A is a
-*  general matrix and B is upper triangular.  The form of the
-*  generalized eigenvalue problem is
-*     A*x = lambda*B*x,
-*  and B is typically made upper triangular by computing its QR
-*  factorization and moving the unitary matrix Q to the left side
-*  of the equation.
-*
-*  This subroutine simultaneously reduces A to a Hessenberg matrix H:
-*     Q**H*A*Z = H
-*  and transforms B to another upper triangular matrix T:
-*     Q**H*B*Z = T
-*  in order to reduce the problem to its standard form
-*     H*y = lambda*T*y
-*  where y = Z**H*x.
-*
-*  The unitary matrices Q and Z are determined as products of Givens
-*  rotations.  They may either be formed explicitly, or they may be
-*  postmultiplied into input matrices Q1 and Z1, so that
-*       Q1 * A * Z1**H = (Q1*Q) * H * (Z1*Z)**H
-*       Q1 * B * Z1**H = (Q1*Q) * T * (Z1*Z)**H
-*  If Q1 is the unitary matrix from the QR factorization of B in the
-*  original equation A*x = lambda*B*x, then ZGGHRD reduces the original
-*  problem to generalized Hessenberg form.
-*
-*  Arguments
-*  =========
-*
-*  COMPQ   (input) CHARACTER*1
-*          = 'N': do not compute Q;
-*          = 'I': Q is initialized to the unit matrix, and the
-*                 unitary matrix Q is returned;
-*          = 'V': Q must contain a unitary matrix Q1 on entry,
-*                 and the product Q1*Q is returned.
-*
-*  COMPZ   (input) CHARACTER*1
-*          = 'N': do not compute Q;
-*          = 'I': Q is initialized to the unit matrix, and the
-*                 unitary matrix Q is returned;
-*          = 'V': Q must contain a unitary matrix Q1 on entry,
-*                 and the product Q1*Q is returned.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          ILO and IHI mark the rows and columns of A which are to be
-*          reduced.  It is assumed that A is already upper triangular
-*          in rows and columns 1:ILO-1 and IHI+1:N.  ILO and IHI are
-*          normally set by a previous call to ZGGBAL; otherwise they
-*          should be set to 1 and N respectively.
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA, N)
-*          On entry, the N-by-N general matrix to be reduced.
-*          On exit, the upper triangle and the first subdiagonal of A
-*          are overwritten with the upper Hessenberg matrix H, and the
-*          rest is set to zero.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input/output) COMPLEX*16 array, dimension (LDB, N)
-*          On entry, the N-by-N upper triangular matrix B.
-*          On exit, the upper triangular matrix T = Q**H B Z.  The
-*          elements below the diagonal are set to zero.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  Q       (input/output) COMPLEX*16 array, dimension (LDQ, N)
-*          On entry, if COMPQ = 'V', the unitary matrix Q1, typically
-*          from the QR factorization of B.
-*          On exit, if COMPQ='I', the unitary matrix Q, and if
-*          COMPQ = 'V', the product Q1*Q.
-*          Not referenced if COMPQ='N'.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.
-*          LDQ >= N if COMPQ='V' or 'I'; LDQ >= 1 otherwise.
-*
-*  Z       (input/output) COMPLEX*16 array, dimension (LDZ, N)
-*          On entry, if COMPZ = 'V', the unitary matrix Z1.
-*          On exit, if COMPZ='I', the unitary matrix Z, and if
-*          COMPZ = 'V', the product Z1*Z.
-*          Not referenced if COMPZ='N'.
-*
-*  LDZ     (input) INTEGER
-*          The leading dimension of the array Z.
-*          LDZ >= N if COMPZ='V' or 'I'; LDZ >= 1 otherwise.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  This routine reduces A to Hessenberg and B to triangular form by
-*  an unblocked reduction, as described in _Matrix_Computations_,
-*  by Golub and van Loan (Johns Hopkins Press).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         CONE, CZERO
-      PARAMETER          ( CONE = ( 1.0D+0, 0.0D+0 ),
-     $                   CZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ILQ, ILZ
-      INTEGER            ICOMPQ, ICOMPZ, JCOL, JROW
-      DOUBLE PRECISION   C
-      COMPLEX*16         CTEMP, S
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLARTG, ZLASET, ZROT
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode COMPQ
-*
-      IF( LSAME( COMPQ, 'N' ) ) THEN
-         ILQ = .FALSE.
-         ICOMPQ = 1
-      ELSE IF( LSAME( COMPQ, 'V' ) ) THEN
-         ILQ = .TRUE.
-         ICOMPQ = 2
-      ELSE IF( LSAME( COMPQ, 'I' ) ) THEN
-         ILQ = .TRUE.
-         ICOMPQ = 3
-      ELSE
-         ICOMPQ = 0
-      END IF
-*
-*     Decode COMPZ
-*
-      IF( LSAME( COMPZ, 'N' ) ) THEN
-         ILZ = .FALSE.
-         ICOMPZ = 1
-      ELSE IF( LSAME( COMPZ, 'V' ) ) THEN
-         ILZ = .TRUE.
-         ICOMPZ = 2
-      ELSE IF( LSAME( COMPZ, 'I' ) ) THEN
-         ILZ = .TRUE.
-         ICOMPZ = 3
-      ELSE
-         ICOMPZ = 0
-      END IF
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( ICOMPQ.LE.0 ) THEN
-         INFO = -1
-      ELSE IF( ICOMPZ.LE.0 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ILO.LT.1 ) THEN
-         INFO = -4
-      ELSE IF( IHI.GT.N .OR. IHI.LT.ILO-1 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -9
-      ELSE IF( ( ILQ .AND. LDQ.LT.N ) .OR. LDQ.LT.1 ) THEN
-         INFO = -11
-      ELSE IF( ( ILZ .AND. LDZ.LT.N ) .OR. LDZ.LT.1 ) THEN
-         INFO = -13
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGGHRD', -INFO )
-         RETURN
-      END IF
-*
-*     Initialize Q and Z if desired.
-*
-      IF( ICOMPQ.EQ.3 )
-     $   CALL ZLASET( 'Full', N, N, CZERO, CONE, Q, LDQ )
-      IF( ICOMPZ.EQ.3 )
-     $   CALL ZLASET( 'Full', N, N, CZERO, CONE, Z, LDZ )
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 )
-     $   RETURN
-*
-*     Zero out lower triangle of B
-*
-      DO 20 JCOL = 1, N - 1
-         DO 10 JROW = JCOL + 1, N
-            B( JROW, JCOL ) = CZERO
-   10    CONTINUE
-   20 CONTINUE
-*
-*     Reduce A and B
-*
-      DO 40 JCOL = ILO, IHI - 2
-*
-         DO 30 JROW = IHI, JCOL + 2, -1
-*
-*           Step 1: rotate rows JROW-1, JROW to kill A(JROW,JCOL)
-*
-            CTEMP = A( JROW-1, JCOL )
-            CALL ZLARTG( CTEMP, A( JROW, JCOL ), C, S,
-     $                   A( JROW-1, JCOL ) )
-            A( JROW, JCOL ) = CZERO
-            CALL ZROT( N-JCOL, A( JROW-1, JCOL+1 ), LDA,
-     $                 A( JROW, JCOL+1 ), LDA, C, S )
-            CALL ZROT( N+2-JROW, B( JROW-1, JROW-1 ), LDB,
-     $                 B( JROW, JROW-1 ), LDB, C, S )
-            IF( ILQ )
-     $         CALL ZROT( N, Q( 1, JROW-1 ), 1, Q( 1, JROW ), 1, C,
-     $                    DCONJG( S ) )
-*
-*           Step 2: rotate columns JROW, JROW-1 to kill B(JROW,JROW-1)
-*
-            CTEMP = B( JROW, JROW )
-            CALL ZLARTG( CTEMP, B( JROW, JROW-1 ), C, S,
-     $                   B( JROW, JROW ) )
-            B( JROW, JROW-1 ) = CZERO
-            CALL ZROT( IHI, A( 1, JROW ), 1, A( 1, JROW-1 ), 1, C, S )
-            CALL ZROT( JROW-1, B( 1, JROW ), 1, B( 1, JROW-1 ), 1, C,
-     $                 S )
-            IF( ILZ )
-     $         CALL ZROT( N, Z( 1, JROW ), 1, Z( 1, JROW-1 ), 1, C, S )
-   30    CONTINUE
-   40 CONTINUE
-*
-      RETURN
-*
-*     End of ZGGHRD
-*
-      END
--- a/libcruft/lapack/zgtsv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,173 +0,0 @@
-      SUBROUTINE ZGTSV( N, NRHS, DL, D, DU, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         B( LDB, * ), D( * ), DL( * ), DU( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGTSV  solves the equation
-*
-*     A*X = B,
-*
-*  where A is an N-by-N tridiagonal matrix, by Gaussian elimination with
-*  partial pivoting.
-*
-*  Note that the equation  A'*X = B  may be solved by interchanging the
-*  order of the arguments DU and DL.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  DL      (input/output) COMPLEX*16 array, dimension (N-1)
-*          On entry, DL must contain the (n-1) subdiagonal elements of
-*          A.
-*          On exit, DL is overwritten by the (n-2) elements of the
-*          second superdiagonal of the upper triangular matrix U from
-*          the LU factorization of A, in DL(1), ..., DL(n-2).
-*
-*  D       (input/output) COMPLEX*16 array, dimension (N)
-*          On entry, D must contain the diagonal elements of A.
-*          On exit, D is overwritten by the n diagonal elements of U.
-*
-*  DU      (input/output) COMPLEX*16 array, dimension (N-1)
-*          On entry, DU must contain the (n-1) superdiagonal elements
-*          of A.
-*          On exit, DU is overwritten by the (n-1) elements of the first
-*          superdiagonal of U.
-*
-*  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
-*          On entry, the N-by-NRHS right hand side matrix B.
-*          On exit, if INFO = 0, the N-by-NRHS solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, U(i,i) is exactly zero, and the solution
-*                has not been computed.  The factorization has not been
-*                completed unless i = N.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            J, K
-      COMPLEX*16         MULT, TEMP, ZDUM
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DIMAG, MAX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGTSV ', -INFO )
-         RETURN
-      END IF
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      DO 30 K = 1, N - 1
-         IF( DL( K ).EQ.ZERO ) THEN
-*
-*           Subdiagonal is zero, no elimination is required.
-*
-            IF( D( K ).EQ.ZERO ) THEN
-*
-*              Diagonal is zero: set INFO = K and return; a unique
-*              solution can not be found.
-*
-               INFO = K
-               RETURN
-            END IF
-         ELSE IF( CABS1( D( K ) ).GE.CABS1( DL( K ) ) ) THEN
-*
-*           No row interchange required
-*
-            MULT = DL( K ) / D( K )
-            D( K+1 ) = D( K+1 ) - MULT*DU( K )
-            DO 10 J = 1, NRHS
-               B( K+1, J ) = B( K+1, J ) - MULT*B( K, J )
-   10       CONTINUE
-            IF( K.LT.( N-1 ) )
-     $         DL( K ) = ZERO
-         ELSE
-*
-*           Interchange rows K and K+1
-*
-            MULT = D( K ) / DL( K )
-            D( K ) = DL( K )
-            TEMP = D( K+1 )
-            D( K+1 ) = DU( K ) - MULT*TEMP
-            IF( K.LT.( N-1 ) ) THEN
-               DL( K ) = DU( K+1 )
-               DU( K+1 ) = -MULT*DL( K )
-            END IF
-            DU( K ) = TEMP
-            DO 20 J = 1, NRHS
-               TEMP = B( K, J )
-               B( K, J ) = B( K+1, J )
-               B( K+1, J ) = TEMP - MULT*B( K+1, J )
-   20       CONTINUE
-         END IF
-   30 CONTINUE
-      IF( D( N ).EQ.ZERO ) THEN
-         INFO = N
-         RETURN
-      END IF
-*
-*     Back solve with the matrix U from the factorization.
-*
-      DO 50 J = 1, NRHS
-         B( N, J ) = B( N, J ) / D( N )
-         IF( N.GT.1 )
-     $      B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / D( N-1 )
-         DO 40 K = N - 2, 1, -1
-            B( K, J ) = ( B( K, J )-DU( K )*B( K+1, J )-DL( K )*
-     $                  B( K+2, J ) ) / D( K )
-   40    CONTINUE
-   50 CONTINUE
-*
-      RETURN
-*
-*     End of ZGTSV
-*
-      END
--- a/libcruft/lapack/zgttrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,174 +0,0 @@
-      SUBROUTINE ZGTTRF( N, DL, D, DU, DU2, IPIV, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX*16         D( * ), DL( * ), DU( * ), DU2( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGTTRF computes an LU factorization of a complex tridiagonal matrix A
-*  using elimination with partial pivoting and row interchanges.
-*
-*  The factorization has the form
-*     A = L * U
-*  where L is a product of permutation and unit lower bidiagonal
-*  matrices and U is upper triangular with nonzeros in only the main
-*  diagonal and first two superdiagonals.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  DL      (input/output) COMPLEX*16 array, dimension (N-1)
-*          On entry, DL must contain the (n-1) sub-diagonal elements of
-*          A.
-*
-*          On exit, DL is overwritten by the (n-1) multipliers that
-*          define the matrix L from the LU factorization of A.
-*
-*  D       (input/output) COMPLEX*16 array, dimension (N)
-*          On entry, D must contain the diagonal elements of A.
-*
-*          On exit, D is overwritten by the n diagonal elements of the
-*          upper triangular matrix U from the LU factorization of A.
-*
-*  DU      (input/output) COMPLEX*16 array, dimension (N-1)
-*          On entry, DU must contain the (n-1) super-diagonal elements
-*          of A.
-*
-*          On exit, DU is overwritten by the (n-1) elements of the first
-*          super-diagonal of U.
-*
-*  DU2     (output) COMPLEX*16 array, dimension (N-2)
-*          On exit, DU2 is overwritten by the (n-2) elements of the
-*          second super-diagonal of U.
-*
-*  IPIV    (output) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= n, row i of the matrix was
-*          interchanged with row IPIV(i).  IPIV(i) will always be either
-*          i or i+1; IPIV(i) = i indicates a row interchange was not
-*          required.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -k, the k-th argument had an illegal value
-*          > 0:  if INFO = k, U(k,k) is exactly zero. The factorization
-*                has been completed, but the factor U is exactly
-*                singular, and division by zero will occur if it is used
-*                to solve a system of equations.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      COMPLEX*16         FACT, TEMP, ZDUM
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DIMAG
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-         CALL XERBLA( 'ZGTTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Initialize IPIV(i) = i and DU2(i) = 0
-*
-      DO 10 I = 1, N
-         IPIV( I ) = I
-   10 CONTINUE
-      DO 20 I = 1, N - 2
-         DU2( I ) = ZERO
-   20 CONTINUE
-*
-      DO 30 I = 1, N - 2
-         IF( CABS1( D( I ) ).GE.CABS1( DL( I ) ) ) THEN
-*
-*           No row interchange required, eliminate DL(I)
-*
-            IF( CABS1( D( I ) ).NE.ZERO ) THEN
-               FACT = DL( I ) / D( I )
-               DL( I ) = FACT
-               D( I+1 ) = D( I+1 ) - FACT*DU( I )
-            END IF
-         ELSE
-*
-*           Interchange rows I and I+1, eliminate DL(I)
-*
-            FACT = D( I ) / DL( I )
-            D( I ) = DL( I )
-            DL( I ) = FACT
-            TEMP = DU( I )
-            DU( I ) = D( I+1 )
-            D( I+1 ) = TEMP - FACT*D( I+1 )
-            DU2( I ) = DU( I+1 )
-            DU( I+1 ) = -FACT*DU( I+1 )
-            IPIV( I ) = I + 1
-         END IF
-   30 CONTINUE
-      IF( N.GT.1 ) THEN
-         I = N - 1
-         IF( CABS1( D( I ) ).GE.CABS1( DL( I ) ) ) THEN
-            IF( CABS1( D( I ) ).NE.ZERO ) THEN
-               FACT = DL( I ) / D( I )
-               DL( I ) = FACT
-               D( I+1 ) = D( I+1 ) - FACT*DU( I )
-            END IF
-         ELSE
-            FACT = D( I ) / DL( I )
-            D( I ) = DL( I )
-            DL( I ) = FACT
-            TEMP = DU( I )
-            DU( I ) = D( I+1 )
-            D( I+1 ) = TEMP - FACT*D( I+1 )
-            IPIV( I ) = I + 1
-         END IF
-      END IF
-*
-*     Check for a zero on the diagonal of U.
-*
-      DO 40 I = 1, N
-         IF( CABS1( D( I ) ).EQ.ZERO ) THEN
-            INFO = I
-            GO TO 50
-         END IF
-   40 CONTINUE
-   50 CONTINUE
-*
-      RETURN
-*
-*     End of ZGTTRF
-*
-      END
--- a/libcruft/lapack/zgttrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-      SUBROUTINE ZGTTRS( TRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TRANS
-      INTEGER            INFO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX*16         B( LDB, * ), D( * ), DL( * ), DU( * ), DU2( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGTTRS solves one of the systems of equations
-*     A * X = B,  A**T * X = B,  or  A**H * X = B,
-*  with a tridiagonal matrix A using the LU factorization computed
-*  by ZGTTRF.
-*
-*  Arguments
-*  =========
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the form of the system of equations.
-*          = 'N':  A * X = B     (No transpose)
-*          = 'T':  A**T * X = B  (Transpose)
-*          = 'C':  A**H * X = B  (Conjugate transpose)
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  DL      (input) COMPLEX*16 array, dimension (N-1)
-*          The (n-1) multipliers that define the matrix L from the
-*          LU factorization of A.
-*
-*  D       (input) COMPLEX*16 array, dimension (N)
-*          The n diagonal elements of the upper triangular matrix U from
-*          the LU factorization of A.
-*
-*  DU      (input) COMPLEX*16 array, dimension (N-1)
-*          The (n-1) elements of the first super-diagonal of U.
-*
-*  DU2     (input) COMPLEX*16 array, dimension (N-2)
-*          The (n-2) elements of the second super-diagonal of U.
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= n, row i of the matrix was
-*          interchanged with row IPIV(i).  IPIV(i) will always be either
-*          i or i+1; IPIV(i) = i indicates a row interchange was not
-*          required.
-*
-*  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
-*          On entry, the matrix of right hand side vectors B.
-*          On exit, B is overwritten by the solution vectors X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            NOTRAN
-      INTEGER            ITRANS, J, JB, NB
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZGTTS2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      NOTRAN = ( TRANS.EQ.'N' .OR. TRANS.EQ.'n' )
-      IF( .NOT.NOTRAN .AND. .NOT.( TRANS.EQ.'T' .OR. TRANS.EQ.
-     $    't' ) .AND. .NOT.( TRANS.EQ.'C' .OR. TRANS.EQ.'c' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDB.LT.MAX( N, 1 ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZGTTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-*     Decode TRANS
-*
-      IF( NOTRAN ) THEN
-         ITRANS = 0
-      ELSE IF( TRANS.EQ.'T' .OR. TRANS.EQ.'t' ) THEN
-         ITRANS = 1
-      ELSE
-         ITRANS = 2
-      END IF
-*
-*     Determine the number of right-hand sides to solve at a time.
-*
-      IF( NRHS.EQ.1 ) THEN
-         NB = 1
-      ELSE
-         NB = MAX( 1, ILAENV( 1, 'ZGTTRS', TRANS, N, NRHS, -1, -1 ) )
-      END IF
-*
-      IF( NB.GE.NRHS ) THEN
-         CALL ZGTTS2( ITRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB )
-      ELSE
-         DO 10 J = 1, NRHS, NB
-            JB = MIN( NRHS-J+1, NB )
-            CALL ZGTTS2( ITRANS, N, JB, DL, D, DU, DU2, IPIV, B( 1, J ),
-     $                   LDB )
-   10    CONTINUE
-      END IF
-*
-*     End of ZGTTRS
-*
-      END
--- a/libcruft/lapack/zgtts2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,271 +0,0 @@
-      SUBROUTINE ZGTTS2( ITRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            ITRANS, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX*16         B( LDB, * ), D( * ), DL( * ), DU( * ), DU2( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZGTTS2 solves one of the systems of equations
-*     A * X = B,  A**T * X = B,  or  A**H * X = B,
-*  with a tridiagonal matrix A using the LU factorization computed
-*  by ZGTTRF.
-*
-*  Arguments
-*  =========
-*
-*  ITRANS  (input) INTEGER
-*          Specifies the form of the system of equations.
-*          = 0:  A * X = B     (No transpose)
-*          = 1:  A**T * X = B  (Transpose)
-*          = 2:  A**H * X = B  (Conjugate transpose)
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  DL      (input) COMPLEX*16 array, dimension (N-1)
-*          The (n-1) multipliers that define the matrix L from the
-*          LU factorization of A.
-*
-*  D       (input) COMPLEX*16 array, dimension (N)
-*          The n diagonal elements of the upper triangular matrix U from
-*          the LU factorization of A.
-*
-*  DU      (input) COMPLEX*16 array, dimension (N-1)
-*          The (n-1) elements of the first super-diagonal of U.
-*
-*  DU2     (input) COMPLEX*16 array, dimension (N-2)
-*          The (n-2) elements of the second super-diagonal of U.
-*
-*  IPIV    (input) INTEGER array, dimension (N)
-*          The pivot indices; for 1 <= i <= n, row i of the matrix was
-*          interchanged with row IPIV(i).  IPIV(i) will always be either
-*          i or i+1; IPIV(i) = i indicates a row interchange was not
-*          required.
-*
-*  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
-*          On entry, the matrix of right hand side vectors B.
-*          On exit, B is overwritten by the solution vectors X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, J
-      COMPLEX*16         TEMP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      IF( ITRANS.EQ.0 ) THEN
-*
-*        Solve A*X = B using the LU factorization of A,
-*        overwriting each right hand side vector with its solution.
-*
-         IF( NRHS.LE.1 ) THEN
-            J = 1
-   10       CONTINUE
-*
-*           Solve L*x = b.
-*
-            DO 20 I = 1, N - 1
-               IF( IPIV( I ).EQ.I ) THEN
-                  B( I+1, J ) = B( I+1, J ) - DL( I )*B( I, J )
-               ELSE
-                  TEMP = B( I, J )
-                  B( I, J ) = B( I+1, J )
-                  B( I+1, J ) = TEMP - DL( I )*B( I, J )
-               END IF
-   20       CONTINUE
-*
-*           Solve U*x = b.
-*
-            B( N, J ) = B( N, J ) / D( N )
-            IF( N.GT.1 )
-     $         B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) /
-     $                       D( N-1 )
-            DO 30 I = N - 2, 1, -1
-               B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DU2( I )*
-     $                     B( I+2, J ) ) / D( I )
-   30       CONTINUE
-            IF( J.LT.NRHS ) THEN
-               J = J + 1
-               GO TO 10
-            END IF
-         ELSE
-            DO 60 J = 1, NRHS
-*
-*           Solve L*x = b.
-*
-               DO 40 I = 1, N - 1
-                  IF( IPIV( I ).EQ.I ) THEN
-                     B( I+1, J ) = B( I+1, J ) - DL( I )*B( I, J )
-                  ELSE
-                     TEMP = B( I, J )
-                     B( I, J ) = B( I+1, J )
-                     B( I+1, J ) = TEMP - DL( I )*B( I, J )
-                  END IF
-   40          CONTINUE
-*
-*           Solve U*x = b.
-*
-               B( N, J ) = B( N, J ) / D( N )
-               IF( N.GT.1 )
-     $            B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) /
-     $                          D( N-1 )
-               DO 50 I = N - 2, 1, -1
-                  B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DU2( I )*
-     $                        B( I+2, J ) ) / D( I )
-   50          CONTINUE
-   60       CONTINUE
-         END IF
-      ELSE IF( ITRANS.EQ.1 ) THEN
-*
-*        Solve A**T * X = B.
-*
-         IF( NRHS.LE.1 ) THEN
-            J = 1
-   70       CONTINUE
-*
-*           Solve U**T * x = b.
-*
-            B( 1, J ) = B( 1, J ) / D( 1 )
-            IF( N.GT.1 )
-     $         B( 2, J ) = ( B( 2, J )-DU( 1 )*B( 1, J ) ) / D( 2 )
-            DO 80 I = 3, N
-               B( I, J ) = ( B( I, J )-DU( I-1 )*B( I-1, J )-DU2( I-2 )*
-     $                     B( I-2, J ) ) / D( I )
-   80       CONTINUE
-*
-*           Solve L**T * x = b.
-*
-            DO 90 I = N - 1, 1, -1
-               IF( IPIV( I ).EQ.I ) THEN
-                  B( I, J ) = B( I, J ) - DL( I )*B( I+1, J )
-               ELSE
-                  TEMP = B( I+1, J )
-                  B( I+1, J ) = B( I, J ) - DL( I )*TEMP
-                  B( I, J ) = TEMP
-               END IF
-   90       CONTINUE
-            IF( J.LT.NRHS ) THEN
-               J = J + 1
-               GO TO 70
-            END IF
-         ELSE
-            DO 120 J = 1, NRHS
-*
-*           Solve U**T * x = b.
-*
-               B( 1, J ) = B( 1, J ) / D( 1 )
-               IF( N.GT.1 )
-     $            B( 2, J ) = ( B( 2, J )-DU( 1 )*B( 1, J ) ) / D( 2 )
-               DO 100 I = 3, N
-                  B( I, J ) = ( B( I, J )-DU( I-1 )*B( I-1, J )-
-     $                        DU2( I-2 )*B( I-2, J ) ) / D( I )
-  100          CONTINUE
-*
-*           Solve L**T * x = b.
-*
-               DO 110 I = N - 1, 1, -1
-                  IF( IPIV( I ).EQ.I ) THEN
-                     B( I, J ) = B( I, J ) - DL( I )*B( I+1, J )
-                  ELSE
-                     TEMP = B( I+1, J )
-                     B( I+1, J ) = B( I, J ) - DL( I )*TEMP
-                     B( I, J ) = TEMP
-                  END IF
-  110          CONTINUE
-  120       CONTINUE
-         END IF
-      ELSE
-*
-*        Solve A**H * X = B.
-*
-         IF( NRHS.LE.1 ) THEN
-            J = 1
-  130       CONTINUE
-*
-*           Solve U**H * x = b.
-*
-            B( 1, J ) = B( 1, J ) / DCONJG( D( 1 ) )
-            IF( N.GT.1 )
-     $         B( 2, J ) = ( B( 2, J )-DCONJG( DU( 1 ) )*B( 1, J ) ) /
-     $                     DCONJG( D( 2 ) )
-            DO 140 I = 3, N
-               B( I, J ) = ( B( I, J )-DCONJG( DU( I-1 ) )*B( I-1, J )-
-     $                     DCONJG( DU2( I-2 ) )*B( I-2, J ) ) /
-     $                     DCONJG( D( I ) )
-  140       CONTINUE
-*
-*           Solve L**H * x = b.
-*
-            DO 150 I = N - 1, 1, -1
-               IF( IPIV( I ).EQ.I ) THEN
-                  B( I, J ) = B( I, J ) - DCONJG( DL( I ) )*B( I+1, J )
-               ELSE
-                  TEMP = B( I+1, J )
-                  B( I+1, J ) = B( I, J ) - DCONJG( DL( I ) )*TEMP
-                  B( I, J ) = TEMP
-               END IF
-  150       CONTINUE
-            IF( J.LT.NRHS ) THEN
-               J = J + 1
-               GO TO 130
-            END IF
-         ELSE
-            DO 180 J = 1, NRHS
-*
-*           Solve U**H * x = b.
-*
-               B( 1, J ) = B( 1, J ) / DCONJG( D( 1 ) )
-               IF( N.GT.1 )
-     $            B( 2, J ) = ( B( 2, J )-DCONJG( DU( 1 ) )*B( 1, J ) )
-     $                         / DCONJG( D( 2 ) )
-               DO 160 I = 3, N
-                  B( I, J ) = ( B( I, J )-DCONJG( DU( I-1 ) )*
-     $                        B( I-1, J )-DCONJG( DU2( I-2 ) )*
-     $                        B( I-2, J ) ) / DCONJG( D( I ) )
-  160          CONTINUE
-*
-*           Solve L**H * x = b.
-*
-               DO 170 I = N - 1, 1, -1
-                  IF( IPIV( I ).EQ.I ) THEN
-                     B( I, J ) = B( I, J ) - DCONJG( DL( I ) )*
-     $                           B( I+1, J )
-                  ELSE
-                     TEMP = B( I+1, J )
-                     B( I+1, J ) = B( I, J ) - DCONJG( DL( I ) )*TEMP
-                     B( I, J ) = TEMP
-                  END IF
-  170          CONTINUE
-  180       CONTINUE
-         END IF
-      END IF
-*
-*     End of ZGTTS2
-*
-      END
--- a/libcruft/lapack/zheev.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,218 +0,0 @@
-      SUBROUTINE ZHEEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK,
-     $                  INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBZ, UPLO
-      INTEGER            INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   RWORK( * ), W( * )
-      COMPLEX*16         A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZHEEV computes all eigenvalues and, optionally, eigenvectors of a
-*  complex Hermitian matrix A.
-*
-*  Arguments
-*  =========
-*
-*  JOBZ    (input) CHARACTER*1
-*          = 'N':  Compute eigenvalues only;
-*          = 'V':  Compute eigenvalues and eigenvectors.
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA, N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the
-*          leading N-by-N upper triangular part of A contains the
-*          upper triangular part of the matrix A.  If UPLO = 'L',
-*          the leading N-by-N lower triangular part of A contains
-*          the lower triangular part of the matrix A.
-*          On exit, if JOBZ = 'V', then if INFO = 0, A contains the
-*          orthonormal eigenvectors of the matrix A.
-*          If JOBZ = 'N', then on exit the lower triangle (if UPLO='L')
-*          or the upper triangle (if UPLO='U') of A, including the
-*          diagonal, is destroyed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  W       (output) DOUBLE PRECISION array, dimension (N)
-*          If INFO = 0, the eigenvalues in ascending order.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The length of the array WORK.  LWORK >= max(1,2*N-1).
-*          For optimal efficiency, LWORK >= (NB+1)*N,
-*          where NB is the blocksize for ZHETRD returned by ILAENV.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (max(1, 3*N-2))
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the algorithm failed to converge; i
-*                off-diagonal elements of an intermediate tridiagonal
-*                form did not converge to zero.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
-      COMPLEX*16         CONE
-      PARAMETER          ( CONE = ( 1.0D0, 0.0D0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LOWER, LQUERY, WANTZ
-      INTEGER            IINFO, IMAX, INDE, INDTAU, INDWRK, ISCALE,
-     $                   LLWORK, LWKOPT, NB
-      DOUBLE PRECISION   ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
-     $                   SMLNUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      DOUBLE PRECISION   DLAMCH, ZLANHE
-      EXTERNAL           LSAME, ILAENV, DLAMCH, ZLANHE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DSCAL, DSTERF, XERBLA, ZHETRD, ZLASCL, ZSTEQR,
-     $                   ZUNGTR
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      WANTZ = LSAME( JOBZ, 'V' )
-      LOWER = LSAME( UPLO, 'L' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-      INFO = 0
-      IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.( LOWER .OR. LSAME( UPLO, 'U' ) ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         NB = ILAENV( 1, 'ZHETRD', UPLO, N, -1, -1, -1 )
-         LWKOPT = MAX( 1, ( NB+1 )*N )
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, 2*N-1 ) .AND. .NOT.LQUERY )
-     $      INFO = -8
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZHEEV ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         RETURN
-      END IF
-*
-      IF( N.EQ.1 ) THEN
-         W( 1 ) = A( 1, 1 )
-         WORK( 1 ) = 1
-         IF( WANTZ )
-     $      A( 1, 1 ) = CONE
-         RETURN
-      END IF
-*
-*     Get machine constants.
-*
-      SAFMIN = DLAMCH( 'Safe minimum' )
-      EPS = DLAMCH( 'Precision' )
-      SMLNUM = SAFMIN / EPS
-      BIGNUM = ONE / SMLNUM
-      RMIN = SQRT( SMLNUM )
-      RMAX = SQRT( BIGNUM )
-*
-*     Scale matrix to allowable range, if necessary.
-*
-      ANRM = ZLANHE( 'M', UPLO, N, A, LDA, RWORK )
-      ISCALE = 0
-      IF( ANRM.GT.ZERO .AND. ANRM.LT.RMIN ) THEN
-         ISCALE = 1
-         SIGMA = RMIN / ANRM
-      ELSE IF( ANRM.GT.RMAX ) THEN
-         ISCALE = 1
-         SIGMA = RMAX / ANRM
-      END IF
-      IF( ISCALE.EQ.1 )
-     $   CALL ZLASCL( UPLO, 0, 0, ONE, SIGMA, N, N, A, LDA, INFO )
-*
-*     Call ZHETRD to reduce Hermitian matrix to tridiagonal form.
-*
-      INDE = 1
-      INDTAU = 1
-      INDWRK = INDTAU + N
-      LLWORK = LWORK - INDWRK + 1
-      CALL ZHETRD( UPLO, N, A, LDA, W, RWORK( INDE ), WORK( INDTAU ),
-     $             WORK( INDWRK ), LLWORK, IINFO )
-*
-*     For eigenvalues only, call DSTERF.  For eigenvectors, first call
-*     ZUNGTR to generate the unitary matrix, then call ZSTEQR.
-*
-      IF( .NOT.WANTZ ) THEN
-         CALL DSTERF( N, W, RWORK( INDE ), INFO )
-      ELSE
-         CALL ZUNGTR( UPLO, N, A, LDA, WORK( INDTAU ), WORK( INDWRK ),
-     $                LLWORK, IINFO )
-         INDWRK = INDE + N
-         CALL ZSTEQR( JOBZ, N, W, RWORK( INDE ), A, LDA,
-     $                RWORK( INDWRK ), INFO )
-      END IF
-*
-*     If matrix was scaled, then rescale eigenvalues appropriately.
-*
-      IF( ISCALE.EQ.1 ) THEN
-         IF( INFO.EQ.0 ) THEN
-            IMAX = N
-         ELSE
-            IMAX = INFO - 1
-         END IF
-         CALL DSCAL( IMAX, ONE / SIGMA, W, 1 )
-      END IF
-*
-*     Set WORK(1) to optimal complex workspace size.
-*
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of ZHEEV
-*
-      END
--- a/libcruft/lapack/zhegs2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,224 +0,0 @@
-      SUBROUTINE ZHEGS2( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, ITYPE, LDA, LDB, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZHEGS2 reduces a complex Hermitian-definite generalized
-*  eigenproblem to standard form.
-*
-*  If ITYPE = 1, the problem is A*x = lambda*B*x,
-*  and A is overwritten by inv(U')*A*inv(U) or inv(L)*A*inv(L')
-*
-*  If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or
-*  B*A*x = lambda*x, and A is overwritten by U*A*U` or L'*A*L.
-*
-*  B must have been previously factorized as U'*U or L*L' by ZPOTRF.
-*
-*  Arguments
-*  =========
-*
-*  ITYPE   (input) INTEGER
-*          = 1: compute inv(U')*A*inv(U) or inv(L)*A*inv(L');
-*          = 2 or 3: compute U*A*U' or L'*A*L.
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          Hermitian matrix A is stored, and how B has been factorized.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the leading
-*          n by n upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n by n lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*
-*          On exit, if INFO = 0, the transformed matrix, stored in the
-*          same format as A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input) COMPLEX*16 array, dimension (LDB,N)
-*          The triangular factor from the Cholesky factorization of B,
-*          as returned by ZPOTRF.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, HALF
-      PARAMETER          ( ONE = 1.0D+0, HALF = 0.5D+0 )
-      COMPLEX*16         CONE
-      PARAMETER          ( CONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            K
-      DOUBLE PRECISION   AKK, BKK
-      COMPLEX*16         CT
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZAXPY, ZDSCAL, ZHER2, ZLACGV, ZTRMV,
-     $                   ZTRSV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN
-         INFO = -1
-      ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZHEGS2', -INFO )
-         RETURN
-      END IF
-*
-      IF( ITYPE.EQ.1 ) THEN
-         IF( UPPER ) THEN
-*
-*           Compute inv(U')*A*inv(U)
-*
-            DO 10 K = 1, N
-*
-*              Update the upper triangle of A(k:n,k:n)
-*
-               AKK = A( K, K )
-               BKK = B( K, K )
-               AKK = AKK / BKK**2
-               A( K, K ) = AKK
-               IF( K.LT.N ) THEN
-                  CALL ZDSCAL( N-K, ONE / BKK, A( K, K+1 ), LDA )
-                  CT = -HALF*AKK
-                  CALL ZLACGV( N-K, A( K, K+1 ), LDA )
-                  CALL ZLACGV( N-K, B( K, K+1 ), LDB )
-                  CALL ZAXPY( N-K, CT, B( K, K+1 ), LDB, A( K, K+1 ),
-     $                        LDA )
-                  CALL ZHER2( UPLO, N-K, -CONE, A( K, K+1 ), LDA,
-     $                        B( K, K+1 ), LDB, A( K+1, K+1 ), LDA )
-                  CALL ZAXPY( N-K, CT, B( K, K+1 ), LDB, A( K, K+1 ),
-     $                        LDA )
-                  CALL ZLACGV( N-K, B( K, K+1 ), LDB )
-                  CALL ZTRSV( UPLO, 'Conjugate transpose', 'Non-unit',
-     $                        N-K, B( K+1, K+1 ), LDB, A( K, K+1 ),
-     $                        LDA )
-                  CALL ZLACGV( N-K, A( K, K+1 ), LDA )
-               END IF
-   10       CONTINUE
-         ELSE
-*
-*           Compute inv(L)*A*inv(L')
-*
-            DO 20 K = 1, N
-*
-*              Update the lower triangle of A(k:n,k:n)
-*
-               AKK = A( K, K )
-               BKK = B( K, K )
-               AKK = AKK / BKK**2
-               A( K, K ) = AKK
-               IF( K.LT.N ) THEN
-                  CALL ZDSCAL( N-K, ONE / BKK, A( K+1, K ), 1 )
-                  CT = -HALF*AKK
-                  CALL ZAXPY( N-K, CT, B( K+1, K ), 1, A( K+1, K ), 1 )
-                  CALL ZHER2( UPLO, N-K, -CONE, A( K+1, K ), 1,
-     $                        B( K+1, K ), 1, A( K+1, K+1 ), LDA )
-                  CALL ZAXPY( N-K, CT, B( K+1, K ), 1, A( K+1, K ), 1 )
-                  CALL ZTRSV( UPLO, 'No transpose', 'Non-unit', N-K,
-     $                        B( K+1, K+1 ), LDB, A( K+1, K ), 1 )
-               END IF
-   20       CONTINUE
-         END IF
-      ELSE
-         IF( UPPER ) THEN
-*
-*           Compute U*A*U'
-*
-            DO 30 K = 1, N
-*
-*              Update the upper triangle of A(1:k,1:k)
-*
-               AKK = A( K, K )
-               BKK = B( K, K )
-               CALL ZTRMV( UPLO, 'No transpose', 'Non-unit', K-1, B,
-     $                     LDB, A( 1, K ), 1 )
-               CT = HALF*AKK
-               CALL ZAXPY( K-1, CT, B( 1, K ), 1, A( 1, K ), 1 )
-               CALL ZHER2( UPLO, K-1, CONE, A( 1, K ), 1, B( 1, K ), 1,
-     $                     A, LDA )
-               CALL ZAXPY( K-1, CT, B( 1, K ), 1, A( 1, K ), 1 )
-               CALL ZDSCAL( K-1, BKK, A( 1, K ), 1 )
-               A( K, K ) = AKK*BKK**2
-   30       CONTINUE
-         ELSE
-*
-*           Compute L'*A*L
-*
-            DO 40 K = 1, N
-*
-*              Update the lower triangle of A(1:k,1:k)
-*
-               AKK = A( K, K )
-               BKK = B( K, K )
-               CALL ZLACGV( K-1, A( K, 1 ), LDA )
-               CALL ZTRMV( UPLO, 'Conjugate transpose', 'Non-unit', K-1,
-     $                     B, LDB, A( K, 1 ), LDA )
-               CT = HALF*AKK
-               CALL ZLACGV( K-1, B( K, 1 ), LDB )
-               CALL ZAXPY( K-1, CT, B( K, 1 ), LDB, A( K, 1 ), LDA )
-               CALL ZHER2( UPLO, K-1, CONE, A( K, 1 ), LDA, B( K, 1 ),
-     $                     LDB, A, LDA )
-               CALL ZAXPY( K-1, CT, B( K, 1 ), LDB, A( K, 1 ), LDA )
-               CALL ZLACGV( K-1, B( K, 1 ), LDB )
-               CALL ZDSCAL( K-1, BKK, A( K, 1 ), LDA )
-               CALL ZLACGV( K-1, A( K, 1 ), LDA )
-               A( K, K ) = AKK*BKK**2
-   40       CONTINUE
-         END IF
-      END IF
-      RETURN
-*
-*     End of ZHEGS2
-*
-      END
--- a/libcruft/lapack/zhegst.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,259 +0,0 @@
-      SUBROUTINE ZHEGST( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, ITYPE, LDA, LDB, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZHEGST reduces a complex Hermitian-definite generalized
-*  eigenproblem to standard form.
-*
-*  If ITYPE = 1, the problem is A*x = lambda*B*x,
-*  and A is overwritten by inv(U**H)*A*inv(U) or inv(L)*A*inv(L**H)
-*
-*  If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or
-*  B*A*x = lambda*x, and A is overwritten by U*A*U**H or L**H*A*L.
-*
-*  B must have been previously factorized as U**H*U or L*L**H by ZPOTRF.
-*
-*  Arguments
-*  =========
-*
-*  ITYPE   (input) INTEGER
-*          = 1: compute inv(U**H)*A*inv(U) or inv(L)*A*inv(L**H);
-*          = 2 or 3: compute U*A*U**H or L**H*A*L.
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored and B is factored as
-*                  U**H*U;
-*          = 'L':  Lower triangle of A is stored and B is factored as
-*                  L*L**H.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the leading
-*          N-by-N upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading N-by-N lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*
-*          On exit, if INFO = 0, the transformed matrix, stored in the
-*          same format as A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input) COMPLEX*16 array, dimension (LDB,N)
-*          The triangular factor from the Cholesky factorization of B,
-*          as returned by ZPOTRF.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-      COMPLEX*16         CONE, HALF
-      PARAMETER          ( CONE = ( 1.0D+0, 0.0D+0 ),
-     $                   HALF = ( 0.5D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            K, KB, NB
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZHEGS2, ZHEMM, ZHER2K, ZTRMM, ZTRSM
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN
-         INFO = -1
-      ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZHEGST', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'ZHEGST', UPLO, N, -1, -1, -1 )
-*
-      IF( NB.LE.1 .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code
-*
-         CALL ZHEGS2( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( ITYPE.EQ.1 ) THEN
-            IF( UPPER ) THEN
-*
-*              Compute inv(U')*A*inv(U)
-*
-               DO 10 K = 1, N, NB
-                  KB = MIN( N-K+1, NB )
-*
-*                 Update the upper triangle of A(k:n,k:n)
-*
-                  CALL ZHEGS2( ITYPE, UPLO, KB, A( K, K ), LDA,
-     $                         B( K, K ), LDB, INFO )
-                  IF( K+KB.LE.N ) THEN
-                     CALL ZTRSM( 'Left', UPLO, 'Conjugate transpose',
-     $                           'Non-unit', KB, N-K-KB+1, CONE,
-     $                           B( K, K ), LDB, A( K, K+KB ), LDA )
-                     CALL ZHEMM( 'Left', UPLO, KB, N-K-KB+1, -HALF,
-     $                           A( K, K ), LDA, B( K, K+KB ), LDB,
-     $                           CONE, A( K, K+KB ), LDA )
-                     CALL ZHER2K( UPLO, 'Conjugate transpose', N-K-KB+1,
-     $                            KB, -CONE, A( K, K+KB ), LDA,
-     $                            B( K, K+KB ), LDB, ONE,
-     $                            A( K+KB, K+KB ), LDA )
-                     CALL ZHEMM( 'Left', UPLO, KB, N-K-KB+1, -HALF,
-     $                           A( K, K ), LDA, B( K, K+KB ), LDB,
-     $                           CONE, A( K, K+KB ), LDA )
-                     CALL ZTRSM( 'Right', UPLO, 'No transpose',
-     $                           'Non-unit', KB, N-K-KB+1, CONE,
-     $                           B( K+KB, K+KB ), LDB, A( K, K+KB ),
-     $                           LDA )
-                  END IF
-   10          CONTINUE
-            ELSE
-*
-*              Compute inv(L)*A*inv(L')
-*
-               DO 20 K = 1, N, NB
-                  KB = MIN( N-K+1, NB )
-*
-*                 Update the lower triangle of A(k:n,k:n)
-*
-                  CALL ZHEGS2( ITYPE, UPLO, KB, A( K, K ), LDA,
-     $                         B( K, K ), LDB, INFO )
-                  IF( K+KB.LE.N ) THEN
-                     CALL ZTRSM( 'Right', UPLO, 'Conjugate transpose',
-     $                           'Non-unit', N-K-KB+1, KB, CONE,
-     $                           B( K, K ), LDB, A( K+KB, K ), LDA )
-                     CALL ZHEMM( 'Right', UPLO, N-K-KB+1, KB, -HALF,
-     $                           A( K, K ), LDA, B( K+KB, K ), LDB,
-     $                           CONE, A( K+KB, K ), LDA )
-                     CALL ZHER2K( UPLO, 'No transpose', N-K-KB+1, KB,
-     $                            -CONE, A( K+KB, K ), LDA,
-     $                            B( K+KB, K ), LDB, ONE,
-     $                            A( K+KB, K+KB ), LDA )
-                     CALL ZHEMM( 'Right', UPLO, N-K-KB+1, KB, -HALF,
-     $                           A( K, K ), LDA, B( K+KB, K ), LDB,
-     $                           CONE, A( K+KB, K ), LDA )
-                     CALL ZTRSM( 'Left', UPLO, 'No transpose',
-     $                           'Non-unit', N-K-KB+1, KB, CONE,
-     $                           B( K+KB, K+KB ), LDB, A( K+KB, K ),
-     $                           LDA )
-                  END IF
-   20          CONTINUE
-            END IF
-         ELSE
-            IF( UPPER ) THEN
-*
-*              Compute U*A*U'
-*
-               DO 30 K = 1, N, NB
-                  KB = MIN( N-K+1, NB )
-*
-*                 Update the upper triangle of A(1:k+kb-1,1:k+kb-1)
-*
-                  CALL ZTRMM( 'Left', UPLO, 'No transpose', 'Non-unit',
-     $                        K-1, KB, CONE, B, LDB, A( 1, K ), LDA )
-                  CALL ZHEMM( 'Right', UPLO, K-1, KB, HALF, A( K, K ),
-     $                        LDA, B( 1, K ), LDB, CONE, A( 1, K ),
-     $                        LDA )
-                  CALL ZHER2K( UPLO, 'No transpose', K-1, KB, CONE,
-     $                         A( 1, K ), LDA, B( 1, K ), LDB, ONE, A,
-     $                         LDA )
-                  CALL ZHEMM( 'Right', UPLO, K-1, KB, HALF, A( K, K ),
-     $                        LDA, B( 1, K ), LDB, CONE, A( 1, K ),
-     $                        LDA )
-                  CALL ZTRMM( 'Right', UPLO, 'Conjugate transpose',
-     $                        'Non-unit', K-1, KB, CONE, B( K, K ), LDB,
-     $                        A( 1, K ), LDA )
-                  CALL ZHEGS2( ITYPE, UPLO, KB, A( K, K ), LDA,
-     $                         B( K, K ), LDB, INFO )
-   30          CONTINUE
-            ELSE
-*
-*              Compute L'*A*L
-*
-               DO 40 K = 1, N, NB
-                  KB = MIN( N-K+1, NB )
-*
-*                 Update the lower triangle of A(1:k+kb-1,1:k+kb-1)
-*
-                  CALL ZTRMM( 'Right', UPLO, 'No transpose', 'Non-unit',
-     $                        KB, K-1, CONE, B, LDB, A( K, 1 ), LDA )
-                  CALL ZHEMM( 'Left', UPLO, KB, K-1, HALF, A( K, K ),
-     $                        LDA, B( K, 1 ), LDB, CONE, A( K, 1 ),
-     $                        LDA )
-                  CALL ZHER2K( UPLO, 'Conjugate transpose', K-1, KB,
-     $                         CONE, A( K, 1 ), LDA, B( K, 1 ), LDB,
-     $                         ONE, A, LDA )
-                  CALL ZHEMM( 'Left', UPLO, KB, K-1, HALF, A( K, K ),
-     $                        LDA, B( K, 1 ), LDB, CONE, A( K, 1 ),
-     $                        LDA )
-                  CALL ZTRMM( 'Left', UPLO, 'Conjugate transpose',
-     $                        'Non-unit', KB, K-1, CONE, B( K, K ), LDB,
-     $                        A( K, 1 ), LDA )
-                  CALL ZHEGS2( ITYPE, UPLO, KB, A( K, K ), LDA,
-     $                         B( K, K ), LDB, INFO )
-   40          CONTINUE
-            END IF
-         END IF
-      END IF
-      RETURN
-*
-*     End of ZHEGST
-*
-      END
--- a/libcruft/lapack/zhegv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,232 +0,0 @@
-      SUBROUTINE ZHEGV( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK,
-     $                  LWORK, RWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          JOBZ, UPLO
-      INTEGER            INFO, ITYPE, LDA, LDB, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   RWORK( * ), W( * )
-      COMPLEX*16         A( LDA, * ), B( LDB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZHEGV computes all the eigenvalues, and optionally, the eigenvectors
-*  of a complex generalized Hermitian-definite eigenproblem, of the form
-*  A*x=(lambda)*B*x,  A*Bx=(lambda)*x,  or B*A*x=(lambda)*x.
-*  Here A and B are assumed to be Hermitian and B is also
-*  positive definite.
-*
-*  Arguments
-*  =========
-*
-*  ITYPE   (input) INTEGER
-*          Specifies the problem type to be solved:
-*          = 1:  A*x = (lambda)*B*x
-*          = 2:  A*B*x = (lambda)*x
-*          = 3:  B*A*x = (lambda)*x
-*
-*  JOBZ    (input) CHARACTER*1
-*          = 'N':  Compute eigenvalues only;
-*          = 'V':  Compute eigenvalues and eigenvectors.
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangles of A and B are stored;
-*          = 'L':  Lower triangles of A and B are stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrices A and B.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA, N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the
-*          leading N-by-N upper triangular part of A contains the
-*          upper triangular part of the matrix A.  If UPLO = 'L',
-*          the leading N-by-N lower triangular part of A contains
-*          the lower triangular part of the matrix A.
-*
-*          On exit, if JOBZ = 'V', then if INFO = 0, A contains the
-*          matrix Z of eigenvectors.  The eigenvectors are normalized
-*          as follows:
-*          if ITYPE = 1 or 2, Z**H*B*Z = I;
-*          if ITYPE = 3, Z**H*inv(B)*Z = I.
-*          If JOBZ = 'N', then on exit the upper triangle (if UPLO='U')
-*          or the lower triangle (if UPLO='L') of A, including the
-*          diagonal, is destroyed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input/output) COMPLEX*16 array, dimension (LDB, N)
-*          On entry, the Hermitian positive definite matrix B.
-*          If UPLO = 'U', the leading N-by-N upper triangular part of B
-*          contains the upper triangular part of the matrix B.
-*          If UPLO = 'L', the leading N-by-N lower triangular part of B
-*          contains the lower triangular part of the matrix B.
-*
-*          On exit, if INFO <= N, the part of B containing the matrix is
-*          overwritten by the triangular factor U or L from the Cholesky
-*          factorization B = U**H*U or B = L*L**H.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  W       (output) DOUBLE PRECISION array, dimension (N)
-*          If INFO = 0, the eigenvalues in ascending order.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The length of the array WORK.  LWORK >= max(1,2*N-1).
-*          For optimal efficiency, LWORK >= (NB+1)*N,
-*          where NB is the blocksize for ZHETRD returned by ILAENV.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (max(1, 3*N-2))
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  ZPOTRF or ZHEEV returned an error code:
-*             <= N:  if INFO = i, ZHEEV failed to converge;
-*                    i off-diagonal elements of an intermediate
-*                    tridiagonal form did not converge to zero;
-*             > N:   if INFO = N + i, for 1 <= i <= N, then the leading
-*                    minor of order i of B is not positive definite.
-*                    The factorization of B could not be completed and
-*                    no eigenvalues or eigenvectors were computed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, UPPER, WANTZ
-      CHARACTER          TRANS
-      INTEGER            LWKOPT, NB, NEIG
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZHEEV, ZHEGST, ZPOTRF, ZTRMM, ZTRSM
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      WANTZ = LSAME( JOBZ, 'V' )
-      UPPER = LSAME( UPLO, 'U' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-      INFO = 0
-      IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN
-         INFO = -1
-      ELSE IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.( UPPER .OR. LSAME( UPLO, 'L' ) ) ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -8
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         NB = ILAENV( 1, 'ZHETRD', UPLO, N, -1, -1, -1 )
-         LWKOPT = MAX( 1, ( NB + 1 )*N )
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, 2*N - 1 ) .AND. .NOT.LQUERY ) THEN
-            INFO = -11
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZHEGV ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Form a Cholesky factorization of B.
-*
-      CALL ZPOTRF( UPLO, N, B, LDB, INFO )
-      IF( INFO.NE.0 ) THEN
-         INFO = N + INFO
-         RETURN
-      END IF
-*
-*     Transform problem to standard eigenvalue problem and solve.
-*
-      CALL ZHEGST( ITYPE, UPLO, N, A, LDA, B, LDB, INFO )
-      CALL ZHEEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, INFO )
-*
-      IF( WANTZ ) THEN
-*
-*        Backtransform eigenvectors to the original problem.
-*
-         NEIG = N
-         IF( INFO.GT.0 )
-     $      NEIG = INFO - 1
-         IF( ITYPE.EQ.1 .OR. ITYPE.EQ.2 ) THEN
-*
-*           For A*x=(lambda)*B*x and A*B*x=(lambda)*x;
-*           backtransform eigenvectors: x = inv(L)'*y or inv(U)*y
-*
-            IF( UPPER ) THEN
-               TRANS = 'N'
-            ELSE
-               TRANS = 'C'
-            END IF
-*
-            CALL ZTRSM( 'Left', UPLO, TRANS, 'Non-unit', N, NEIG, ONE,
-     $                  B, LDB, A, LDA )
-*
-         ELSE IF( ITYPE.EQ.3 ) THEN
-*
-*           For B*A*x=(lambda)*x;
-*           backtransform eigenvectors: x = L*y or U'*y
-*
-            IF( UPPER ) THEN
-               TRANS = 'C'
-            ELSE
-               TRANS = 'N'
-            END IF
-*
-            CALL ZTRMM( 'Left', UPLO, TRANS, 'Non-unit', N, NEIG, ONE,
-     $                  B, LDB, A, LDA )
-         END IF
-      END IF
-*
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of ZHEGV
-*
-      END
--- a/libcruft/lapack/zhetd2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,258 +0,0 @@
-      SUBROUTINE ZHETD2( UPLO, N, A, LDA, D, E, TAU, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * ), E( * )
-      COMPLEX*16         A( LDA, * ), TAU( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZHETD2 reduces a complex Hermitian matrix A to real symmetric
-*  tridiagonal form T by a unitary similarity transformation:
-*  Q' * A * Q = T.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          Hermitian matrix A is stored:
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the leading
-*          n-by-n upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n-by-n lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*          On exit, if UPLO = 'U', the diagonal and first superdiagonal
-*          of A are overwritten by the corresponding elements of the
-*          tridiagonal matrix T, and the elements above the first
-*          superdiagonal, with the array TAU, represent the unitary
-*          matrix Q as a product of elementary reflectors; if UPLO
-*          = 'L', the diagonal and first subdiagonal of A are over-
-*          written by the corresponding elements of the tridiagonal
-*          matrix T, and the elements below the first subdiagonal, with
-*          the array TAU, represent the unitary matrix Q as a product
-*          of elementary reflectors. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  D       (output) DOUBLE PRECISION array, dimension (N)
-*          The diagonal elements of the tridiagonal matrix T:
-*          D(i) = A(i,i).
-*
-*  E       (output) DOUBLE PRECISION array, dimension (N-1)
-*          The off-diagonal elements of the tridiagonal matrix T:
-*          E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'.
-*
-*  TAU     (output) COMPLEX*16 array, dimension (N-1)
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  If UPLO = 'U', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(n-1) . . . H(2) H(1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in
-*  A(1:i-1,i+1), and tau in TAU(i).
-*
-*  If UPLO = 'L', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(1) H(2) . . . H(n-1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i),
-*  and tau in TAU(i).
-*
-*  The contents of A on exit are illustrated by the following examples
-*  with n = 5:
-*
-*  if UPLO = 'U':                       if UPLO = 'L':
-*
-*    (  d   e   v2  v3  v4 )              (  d                  )
-*    (      d   e   v3  v4 )              (  e   d              )
-*    (          d   e   v4 )              (  v1  e   d          )
-*    (              d   e  )              (  v1  v2  e   d      )
-*    (                  d  )              (  v1  v2  v3  e   d  )
-*
-*  where d and e denote diagonal and off-diagonal elements of T, and vi
-*  denotes an element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE, ZERO, HALF
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),
-     $                   ZERO = ( 0.0D+0, 0.0D+0 ),
-     $                   HALF = ( 0.5D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            I
-      COMPLEX*16         ALPHA, TAUI
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZAXPY, ZHEMV, ZHER2, ZLARFG
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      COMPLEX*16         ZDOTC
-      EXTERNAL           LSAME, ZDOTC
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZHETD2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Reduce the upper triangle of A
-*
-         A( N, N ) = DBLE( A( N, N ) )
-         DO 10 I = N - 1, 1, -1
-*
-*           Generate elementary reflector H(i) = I - tau * v * v'
-*           to annihilate A(1:i-1,i+1)
-*
-            ALPHA = A( I, I+1 )
-            CALL ZLARFG( I, ALPHA, A( 1, I+1 ), 1, TAUI )
-            E( I ) = ALPHA
-*
-            IF( TAUI.NE.ZERO ) THEN
-*
-*              Apply H(i) from both sides to A(1:i,1:i)
-*
-               A( I, I+1 ) = ONE
-*
-*              Compute  x := tau * A * v  storing x in TAU(1:i)
-*
-               CALL ZHEMV( UPLO, I, TAUI, A, LDA, A( 1, I+1 ), 1, ZERO,
-     $                     TAU, 1 )
-*
-*              Compute  w := x - 1/2 * tau * (x'*v) * v
-*
-               ALPHA = -HALF*TAUI*ZDOTC( I, TAU, 1, A( 1, I+1 ), 1 )
-               CALL ZAXPY( I, ALPHA, A( 1, I+1 ), 1, TAU, 1 )
-*
-*              Apply the transformation as a rank-2 update:
-*                 A := A - v * w' - w * v'
-*
-               CALL ZHER2( UPLO, I, -ONE, A( 1, I+1 ), 1, TAU, 1, A,
-     $                     LDA )
-*
-            ELSE
-               A( I, I ) = DBLE( A( I, I ) )
-            END IF
-            A( I, I+1 ) = E( I )
-            D( I+1 ) = A( I+1, I+1 )
-            TAU( I ) = TAUI
-   10    CONTINUE
-         D( 1 ) = A( 1, 1 )
-      ELSE
-*
-*        Reduce the lower triangle of A
-*
-         A( 1, 1 ) = DBLE( A( 1, 1 ) )
-         DO 20 I = 1, N - 1
-*
-*           Generate elementary reflector H(i) = I - tau * v * v'
-*           to annihilate A(i+2:n,i)
-*
-            ALPHA = A( I+1, I )
-            CALL ZLARFG( N-I, ALPHA, A( MIN( I+2, N ), I ), 1, TAUI )
-            E( I ) = ALPHA
-*
-            IF( TAUI.NE.ZERO ) THEN
-*
-*              Apply H(i) from both sides to A(i+1:n,i+1:n)
-*
-               A( I+1, I ) = ONE
-*
-*              Compute  x := tau * A * v  storing y in TAU(i:n-1)
-*
-               CALL ZHEMV( UPLO, N-I, TAUI, A( I+1, I+1 ), LDA,
-     $                     A( I+1, I ), 1, ZERO, TAU( I ), 1 )
-*
-*              Compute  w := x - 1/2 * tau * (x'*v) * v
-*
-               ALPHA = -HALF*TAUI*ZDOTC( N-I, TAU( I ), 1, A( I+1, I ),
-     $                 1 )
-               CALL ZAXPY( N-I, ALPHA, A( I+1, I ), 1, TAU( I ), 1 )
-*
-*              Apply the transformation as a rank-2 update:
-*                 A := A - v * w' - w * v'
-*
-               CALL ZHER2( UPLO, N-I, -ONE, A( I+1, I ), 1, TAU( I ), 1,
-     $                     A( I+1, I+1 ), LDA )
-*
-            ELSE
-               A( I+1, I+1 ) = DBLE( A( I+1, I+1 ) )
-            END IF
-            A( I+1, I ) = E( I )
-            D( I ) = A( I, I )
-            TAU( I ) = TAUI
-   20    CONTINUE
-         D( N ) = A( N, N )
-      END IF
-*
-      RETURN
-*
-*     End of ZHETD2
-*
-      END
--- a/libcruft/lapack/zhetrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,296 +0,0 @@
-      SUBROUTINE ZHETRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * ), E( * )
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZHETRD reduces a complex Hermitian matrix A to real symmetric
-*  tridiagonal form T by a unitary similarity transformation:
-*  Q**H * A * Q = T.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the leading
-*          N-by-N upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading N-by-N lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*          On exit, if UPLO = 'U', the diagonal and first superdiagonal
-*          of A are overwritten by the corresponding elements of the
-*          tridiagonal matrix T, and the elements above the first
-*          superdiagonal, with the array TAU, represent the unitary
-*          matrix Q as a product of elementary reflectors; if UPLO
-*          = 'L', the diagonal and first subdiagonal of A are over-
-*          written by the corresponding elements of the tridiagonal
-*          matrix T, and the elements below the first subdiagonal, with
-*          the array TAU, represent the unitary matrix Q as a product
-*          of elementary reflectors. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  D       (output) DOUBLE PRECISION array, dimension (N)
-*          The diagonal elements of the tridiagonal matrix T:
-*          D(i) = A(i,i).
-*
-*  E       (output) DOUBLE PRECISION array, dimension (N-1)
-*          The off-diagonal elements of the tridiagonal matrix T:
-*          E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'.
-*
-*  TAU     (output) COMPLEX*16 array, dimension (N-1)
-*          The scalar factors of the elementary reflectors (see Further
-*          Details).
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= 1.
-*          For optimum performance LWORK >= N*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  If UPLO = 'U', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(n-1) . . . H(2) H(1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in
-*  A(1:i-1,i+1), and tau in TAU(i).
-*
-*  If UPLO = 'L', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(1) H(2) . . . H(n-1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i),
-*  and tau in TAU(i).
-*
-*  The contents of A on exit are illustrated by the following examples
-*  with n = 5:
-*
-*  if UPLO = 'U':                       if UPLO = 'L':
-*
-*    (  d   e   v2  v3  v4 )              (  d                  )
-*    (      d   e   v3  v4 )              (  e   d              )
-*    (          d   e   v4 )              (  v1  e   d          )
-*    (              d   e  )              (  v1  v2  e   d      )
-*    (                  d  )              (  v1  v2  v3  e   d  )
-*
-*  where d and e denote diagonal and off-diagonal elements of T, and vi
-*  denotes an element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-      COMPLEX*16         CONE
-      PARAMETER          ( CONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, UPPER
-      INTEGER            I, IINFO, IWS, J, KK, LDWORK, LWKOPT, NB,
-     $                   NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZHER2K, ZHETD2, ZLATRD
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.1 .AND. .NOT.LQUERY ) THEN
-         INFO = -9
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-*
-*        Determine the block size.
-*
-         NB = ILAENV( 1, 'ZHETRD', UPLO, N, -1, -1, -1 )
-         LWKOPT = N*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZHETRD', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NX = N
-      IWS = 1
-      IF( NB.GT.1 .AND. NB.LT.N ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code
-*        (last block is always handled by unblocked code).
-*
-         NX = MAX( NB, ILAENV( 3, 'ZHETRD', UPLO, N, -1, -1, -1 ) )
-         IF( NX.LT.N ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = N
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  determine the
-*              minimum value of NB, and reduce NB or force use of
-*              unblocked code by setting NX = N.
-*
-               NB = MAX( LWORK / LDWORK, 1 )
-               NBMIN = ILAENV( 2, 'ZHETRD', UPLO, N, -1, -1, -1 )
-               IF( NB.LT.NBMIN )
-     $            NX = N
-            END IF
-         ELSE
-            NX = N
-         END IF
-      ELSE
-         NB = 1
-      END IF
-*
-      IF( UPPER ) THEN
-*
-*        Reduce the upper triangle of A.
-*        Columns 1:kk are handled by the unblocked method.
-*
-         KK = N - ( ( N-NX+NB-1 ) / NB )*NB
-         DO 20 I = N - NB + 1, KK + 1, -NB
-*
-*           Reduce columns i:i+nb-1 to tridiagonal form and form the
-*           matrix W which is needed to update the unreduced part of
-*           the matrix
-*
-            CALL ZLATRD( UPLO, I+NB-1, NB, A, LDA, E, TAU, WORK,
-     $                   LDWORK )
-*
-*           Update the unreduced submatrix A(1:i-1,1:i-1), using an
-*           update of the form:  A := A - V*W' - W*V'
-*
-            CALL ZHER2K( UPLO, 'No transpose', I-1, NB, -CONE,
-     $                   A( 1, I ), LDA, WORK, LDWORK, ONE, A, LDA )
-*
-*           Copy superdiagonal elements back into A, and diagonal
-*           elements into D
-*
-            DO 10 J = I, I + NB - 1
-               A( J-1, J ) = E( J-1 )
-               D( J ) = A( J, J )
-   10       CONTINUE
-   20    CONTINUE
-*
-*        Use unblocked code to reduce the last or only block
-*
-         CALL ZHETD2( UPLO, KK, A, LDA, D, E, TAU, IINFO )
-      ELSE
-*
-*        Reduce the lower triangle of A
-*
-         DO 40 I = 1, N - NX, NB
-*
-*           Reduce columns i:i+nb-1 to tridiagonal form and form the
-*           matrix W which is needed to update the unreduced part of
-*           the matrix
-*
-            CALL ZLATRD( UPLO, N-I+1, NB, A( I, I ), LDA, E( I ),
-     $                   TAU( I ), WORK, LDWORK )
-*
-*           Update the unreduced submatrix A(i+nb:n,i+nb:n), using
-*           an update of the form:  A := A - V*W' - W*V'
-*
-            CALL ZHER2K( UPLO, 'No transpose', N-I-NB+1, NB, -CONE,
-     $                   A( I+NB, I ), LDA, WORK( NB+1 ), LDWORK, ONE,
-     $                   A( I+NB, I+NB ), LDA )
-*
-*           Copy subdiagonal elements back into A, and diagonal
-*           elements into D
-*
-            DO 30 J = I, I + NB - 1
-               A( J+1, J ) = E( J )
-               D( J ) = A( J, J )
-   30       CONTINUE
-   40    CONTINUE
-*
-*        Use unblocked code to reduce the last or only block
-*
-         CALL ZHETD2( UPLO, N-I+1, A( I, I ), LDA, D( I ), E( I ),
-     $                TAU( I ), IINFO )
-      END IF
-*
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of ZHETRD
-*
-      END
--- a/libcruft/lapack/zhgeqz.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,759 +0,0 @@
-      SUBROUTINE ZHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT,
-     $                   ALPHA, BETA, Q, LDQ, Z, LDZ, WORK, LWORK,
-     $                   RWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPQ, COMPZ, JOB
-      INTEGER            IHI, ILO, INFO, LDH, LDQ, LDT, LDZ, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   RWORK( * )
-      COMPLEX*16         ALPHA( * ), BETA( * ), H( LDH, * ),
-     $                   Q( LDQ, * ), T( LDT, * ), WORK( * ),
-     $                   Z( LDZ, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZHGEQZ computes the eigenvalues of a complex matrix pair (H,T),
-*  where H is an upper Hessenberg matrix and T is upper triangular,
-*  using the single-shift QZ method.
-*  Matrix pairs of this type are produced by the reduction to
-*  generalized upper Hessenberg form of a complex matrix pair (A,B):
-*  
-*     A = Q1*H*Z1**H,  B = Q1*T*Z1**H,
-*  
-*  as computed by ZGGHRD.
-*  
-*  If JOB='S', then the Hessenberg-triangular pair (H,T) is
-*  also reduced to generalized Schur form,
-*  
-*     H = Q*S*Z**H,  T = Q*P*Z**H,
-*  
-*  where Q and Z are unitary matrices and S and P are upper triangular.
-*  
-*  Optionally, the unitary matrix Q from the generalized Schur
-*  factorization may be postmultiplied into an input matrix Q1, and the
-*  unitary matrix Z may be postmultiplied into an input matrix Z1.
-*  If Q1 and Z1 are the unitary matrices from ZGGHRD that reduced
-*  the matrix pair (A,B) to generalized Hessenberg form, then the output
-*  matrices Q1*Q and Z1*Z are the unitary factors from the generalized
-*  Schur factorization of (A,B):
-*  
-*     A = (Q1*Q)*S*(Z1*Z)**H,  B = (Q1*Q)*P*(Z1*Z)**H.
-*  
-*  To avoid overflow, eigenvalues of the matrix pair (H,T)
-*  (equivalently, of (A,B)) are computed as a pair of complex values
-*  (alpha,beta).  If beta is nonzero, lambda = alpha / beta is an
-*  eigenvalue of the generalized nonsymmetric eigenvalue problem (GNEP)
-*     A*x = lambda*B*x
-*  and if alpha is nonzero, mu = beta / alpha is an eigenvalue of the
-*  alternate form of the GNEP
-*     mu*A*y = B*y.
-*  The values of alpha and beta for the i-th eigenvalue can be read
-*  directly from the generalized Schur form:  alpha = S(i,i),
-*  beta = P(i,i).
-*
-*  Ref: C.B. Moler & G.W. Stewart, "An Algorithm for Generalized Matrix
-*       Eigenvalue Problems", SIAM J. Numer. Anal., 10(1973),
-*       pp. 241--256.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          = 'E': Compute eigenvalues only;
-*          = 'S': Computer eigenvalues and the Schur form.
-*
-*  COMPQ   (input) CHARACTER*1
-*          = 'N': Left Schur vectors (Q) are not computed;
-*          = 'I': Q is initialized to the unit matrix and the matrix Q
-*                 of left Schur vectors of (H,T) is returned;
-*          = 'V': Q must contain a unitary matrix Q1 on entry and
-*                 the product Q1*Q is returned.
-*
-*  COMPZ   (input) CHARACTER*1
-*          = 'N': Right Schur vectors (Z) are not computed;
-*          = 'I': Q is initialized to the unit matrix and the matrix Z
-*                 of right Schur vectors of (H,T) is returned;
-*          = 'V': Z must contain a unitary matrix Z1 on entry and
-*                 the product Z1*Z is returned.
-*
-*  N       (input) INTEGER
-*          The order of the matrices H, T, Q, and Z.  N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          ILO and IHI mark the rows and columns of H which are in
-*          Hessenberg form.  It is assumed that A is already upper
-*          triangular in rows and columns 1:ILO-1 and IHI+1:N.
-*          If N > 0, 1 <= ILO <= IHI <= N; if N = 0, ILO=1 and IHI=0.
-*
-*  H       (input/output) COMPLEX*16 array, dimension (LDH, N)
-*          On entry, the N-by-N upper Hessenberg matrix H.
-*          On exit, if JOB = 'S', H contains the upper triangular
-*          matrix S from the generalized Schur factorization.
-*          If JOB = 'E', the diagonal of H matches that of S, but
-*          the rest of H is unspecified.
-*
-*  LDH     (input) INTEGER
-*          The leading dimension of the array H.  LDH >= max( 1, N ).
-*
-*  T       (input/output) COMPLEX*16 array, dimension (LDT, N)
-*          On entry, the N-by-N upper triangular matrix T.
-*          On exit, if JOB = 'S', T contains the upper triangular
-*          matrix P from the generalized Schur factorization.
-*          If JOB = 'E', the diagonal of T matches that of P, but
-*          the rest of T is unspecified.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T.  LDT >= max( 1, N ).
-*
-*  ALPHA   (output) COMPLEX*16 array, dimension (N)
-*          The complex scalars alpha that define the eigenvalues of
-*          GNEP.  ALPHA(i) = S(i,i) in the generalized Schur
-*          factorization.
-*
-*  BETA    (output) COMPLEX*16 array, dimension (N)
-*          The real non-negative scalars beta that define the
-*          eigenvalues of GNEP.  BETA(i) = P(i,i) in the generalized
-*          Schur factorization.
-*
-*          Together, the quantities alpha = ALPHA(j) and beta = BETA(j)
-*          represent the j-th eigenvalue of the matrix pair (A,B), in
-*          one of the forms lambda = alpha/beta or mu = beta/alpha.
-*          Since either lambda or mu may overflow, they should not,
-*          in general, be computed.
-*
-*  Q       (input/output) COMPLEX*16 array, dimension (LDQ, N)
-*          On entry, if COMPZ = 'V', the unitary matrix Q1 used in the
-*          reduction of (A,B) to generalized Hessenberg form.
-*          On exit, if COMPZ = 'I', the unitary matrix of left Schur
-*          vectors of (H,T), and if COMPZ = 'V', the unitary matrix of
-*          left Schur vectors of (A,B).
-*          Not referenced if COMPZ = 'N'.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.  LDQ >= 1.
-*          If COMPQ='V' or 'I', then LDQ >= N.
-*
-*  Z       (input/output) COMPLEX*16 array, dimension (LDZ, N)
-*          On entry, if COMPZ = 'V', the unitary matrix Z1 used in the
-*          reduction of (A,B) to generalized Hessenberg form.
-*          On exit, if COMPZ = 'I', the unitary matrix of right Schur
-*          vectors of (H,T), and if COMPZ = 'V', the unitary matrix of
-*          right Schur vectors of (A,B).
-*          Not referenced if COMPZ = 'N'.
-*
-*  LDZ     (input) INTEGER
-*          The leading dimension of the array Z.  LDZ >= 1.
-*          If COMPZ='V' or 'I', then LDZ >= N.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO >= 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,N).
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          = 1,...,N: the QZ iteration did not converge.  (H,T) is not
-*                     in Schur form, but ALPHA(i) and BETA(i),
-*                     i=INFO+1,...,N should be correct.
-*          = N+1,...,2*N: the shift calculation failed.  (H,T) is not
-*                     in Schur form, but ALPHA(i) and BETA(i),
-*                     i=INFO-N+1,...,N should be correct.
-*
-*  Further Details
-*  ===============
-*
-*  We assume that complex ABS works as long as its value is less than
-*  overflow.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0D+0, 0.0D+0 ),
-     $                   CONE = ( 1.0D+0, 0.0D+0 ) )
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-      DOUBLE PRECISION   HALF
-      PARAMETER          ( HALF = 0.5D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ILAZR2, ILAZRO, ILQ, ILSCHR, ILZ, LQUERY
-      INTEGER            ICOMPQ, ICOMPZ, IFIRST, IFRSTM, IITER, ILAST,
-     $                   ILASTM, IN, ISCHUR, ISTART, J, JC, JCH, JITER,
-     $                   JR, MAXIT
-      DOUBLE PRECISION   ABSB, ANORM, ASCALE, ATOL, BNORM, BSCALE, BTOL,
-     $                   C, SAFMIN, TEMP, TEMP2, TEMPR, ULP
-      COMPLEX*16         ABI22, AD11, AD12, AD21, AD22, CTEMP, CTEMP2,
-     $                   CTEMP3, ESHIFT, RTDISC, S, SHIFT, SIGNBC, T1,
-     $                   U12, X
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   DLAMCH, ZLANHS
-      EXTERNAL           LSAME, DLAMCH, ZLANHS
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLARTG, ZLASET, ZROT, ZSCAL
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, DIMAG, MAX, MIN,
-     $                   SQRT
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   ABS1
-*     ..
-*     .. Statement Function definitions ..
-      ABS1( X ) = ABS( DBLE( X ) ) + ABS( DIMAG( X ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode JOB, COMPQ, COMPZ
-*
-      IF( LSAME( JOB, 'E' ) ) THEN
-         ILSCHR = .FALSE.
-         ISCHUR = 1
-      ELSE IF( LSAME( JOB, 'S' ) ) THEN
-         ILSCHR = .TRUE.
-         ISCHUR = 2
-      ELSE
-         ISCHUR = 0
-      END IF
-*
-      IF( LSAME( COMPQ, 'N' ) ) THEN
-         ILQ = .FALSE.
-         ICOMPQ = 1
-      ELSE IF( LSAME( COMPQ, 'V' ) ) THEN
-         ILQ = .TRUE.
-         ICOMPQ = 2
-      ELSE IF( LSAME( COMPQ, 'I' ) ) THEN
-         ILQ = .TRUE.
-         ICOMPQ = 3
-      ELSE
-         ICOMPQ = 0
-      END IF
-*
-      IF( LSAME( COMPZ, 'N' ) ) THEN
-         ILZ = .FALSE.
-         ICOMPZ = 1
-      ELSE IF( LSAME( COMPZ, 'V' ) ) THEN
-         ILZ = .TRUE.
-         ICOMPZ = 2
-      ELSE IF( LSAME( COMPZ, 'I' ) ) THEN
-         ILZ = .TRUE.
-         ICOMPZ = 3
-      ELSE
-         ICOMPZ = 0
-      END IF
-*
-*     Check Argument Values
-*
-      INFO = 0
-      WORK( 1 ) = MAX( 1, N )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( ISCHUR.EQ.0 ) THEN
-         INFO = -1
-      ELSE IF( ICOMPQ.EQ.0 ) THEN
-         INFO = -2
-      ELSE IF( ICOMPZ.EQ.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( ILO.LT.1 ) THEN
-         INFO = -5
-      ELSE IF( IHI.GT.N .OR. IHI.LT.ILO-1 ) THEN
-         INFO = -6
-      ELSE IF( LDH.LT.N ) THEN
-         INFO = -8
-      ELSE IF( LDT.LT.N ) THEN
-         INFO = -10
-      ELSE IF( LDQ.LT.1 .OR. ( ILQ .AND. LDQ.LT.N ) ) THEN
-         INFO = -14
-      ELSE IF( LDZ.LT.1 .OR. ( ILZ .AND. LDZ.LT.N ) ) THEN
-         INFO = -16
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -18
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZHGEQZ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-*     WORK( 1 ) = CMPLX( 1 )
-      IF( N.LE.0 ) THEN
-         WORK( 1 ) = DCMPLX( 1 )
-         RETURN
-      END IF
-*
-*     Initialize Q and Z
-*
-      IF( ICOMPQ.EQ.3 )
-     $   CALL ZLASET( 'Full', N, N, CZERO, CONE, Q, LDQ )
-      IF( ICOMPZ.EQ.3 )
-     $   CALL ZLASET( 'Full', N, N, CZERO, CONE, Z, LDZ )
-*
-*     Machine Constants
-*
-      IN = IHI + 1 - ILO
-      SAFMIN = DLAMCH( 'S' )
-      ULP = DLAMCH( 'E' )*DLAMCH( 'B' )
-      ANORM = ZLANHS( 'F', IN, H( ILO, ILO ), LDH, RWORK )
-      BNORM = ZLANHS( 'F', IN, T( ILO, ILO ), LDT, RWORK )
-      ATOL = MAX( SAFMIN, ULP*ANORM )
-      BTOL = MAX( SAFMIN, ULP*BNORM )
-      ASCALE = ONE / MAX( SAFMIN, ANORM )
-      BSCALE = ONE / MAX( SAFMIN, BNORM )
-*
-*
-*     Set Eigenvalues IHI+1:N
-*
-      DO 10 J = IHI + 1, N
-         ABSB = ABS( T( J, J ) )
-         IF( ABSB.GT.SAFMIN ) THEN
-            SIGNBC = DCONJG( T( J, J ) / ABSB )
-            T( J, J ) = ABSB
-            IF( ILSCHR ) THEN
-               CALL ZSCAL( J-1, SIGNBC, T( 1, J ), 1 )
-               CALL ZSCAL( J, SIGNBC, H( 1, J ), 1 )
-            ELSE
-               H( J, J ) = H( J, J )*SIGNBC
-            END IF
-            IF( ILZ )
-     $         CALL ZSCAL( N, SIGNBC, Z( 1, J ), 1 )
-         ELSE
-            T( J, J ) = CZERO
-         END IF
-         ALPHA( J ) = H( J, J )
-         BETA( J ) = T( J, J )
-   10 CONTINUE
-*
-*     If IHI < ILO, skip QZ steps
-*
-      IF( IHI.LT.ILO )
-     $   GO TO 190
-*
-*     MAIN QZ ITERATION LOOP
-*
-*     Initialize dynamic indices
-*
-*     Eigenvalues ILAST+1:N have been found.
-*        Column operations modify rows IFRSTM:whatever
-*        Row operations modify columns whatever:ILASTM
-*
-*     If only eigenvalues are being computed, then
-*        IFRSTM is the row of the last splitting row above row ILAST;
-*        this is always at least ILO.
-*     IITER counts iterations since the last eigenvalue was found,
-*        to tell when to use an extraordinary shift.
-*     MAXIT is the maximum number of QZ sweeps allowed.
-*
-      ILAST = IHI
-      IF( ILSCHR ) THEN
-         IFRSTM = 1
-         ILASTM = N
-      ELSE
-         IFRSTM = ILO
-         ILASTM = IHI
-      END IF
-      IITER = 0
-      ESHIFT = CZERO
-      MAXIT = 30*( IHI-ILO+1 )
-*
-      DO 170 JITER = 1, MAXIT
-*
-*        Check for too many iterations.
-*
-         IF( JITER.GT.MAXIT )
-     $      GO TO 180
-*
-*        Split the matrix if possible.
-*
-*        Two tests:
-*           1: H(j,j-1)=0  or  j=ILO
-*           2: T(j,j)=0
-*
-*        Special case: j=ILAST
-*
-         IF( ILAST.EQ.ILO ) THEN
-            GO TO 60
-         ELSE
-            IF( ABS1( H( ILAST, ILAST-1 ) ).LE.ATOL ) THEN
-               H( ILAST, ILAST-1 ) = CZERO
-               GO TO 60
-            END IF
-         END IF
-*
-         IF( ABS( T( ILAST, ILAST ) ).LE.BTOL ) THEN
-            T( ILAST, ILAST ) = CZERO
-            GO TO 50
-         END IF
-*
-*        General case: j<ILAST
-*
-         DO 40 J = ILAST - 1, ILO, -1
-*
-*           Test 1: for H(j,j-1)=0 or j=ILO
-*
-            IF( J.EQ.ILO ) THEN
-               ILAZRO = .TRUE.
-            ELSE
-               IF( ABS1( H( J, J-1 ) ).LE.ATOL ) THEN
-                  H( J, J-1 ) = CZERO
-                  ILAZRO = .TRUE.
-               ELSE
-                  ILAZRO = .FALSE.
-               END IF
-            END IF
-*
-*           Test 2: for T(j,j)=0
-*
-            IF( ABS( T( J, J ) ).LT.BTOL ) THEN
-               T( J, J ) = CZERO
-*
-*              Test 1a: Check for 2 consecutive small subdiagonals in A
-*
-               ILAZR2 = .FALSE.
-               IF( .NOT.ILAZRO ) THEN
-                  IF( ABS1( H( J, J-1 ) )*( ASCALE*ABS1( H( J+1,
-     $                J ) ) ).LE.ABS1( H( J, J ) )*( ASCALE*ATOL ) )
-     $                ILAZR2 = .TRUE.
-               END IF
-*
-*              If both tests pass (1 & 2), i.e., the leading diagonal
-*              element of B in the block is zero, split a 1x1 block off
-*              at the top. (I.e., at the J-th row/column) The leading
-*              diagonal element of the remainder can also be zero, so
-*              this may have to be done repeatedly.
-*
-               IF( ILAZRO .OR. ILAZR2 ) THEN
-                  DO 20 JCH = J, ILAST - 1
-                     CTEMP = H( JCH, JCH )
-                     CALL ZLARTG( CTEMP, H( JCH+1, JCH ), C, S,
-     $                            H( JCH, JCH ) )
-                     H( JCH+1, JCH ) = CZERO
-                     CALL ZROT( ILASTM-JCH, H( JCH, JCH+1 ), LDH,
-     $                          H( JCH+1, JCH+1 ), LDH, C, S )
-                     CALL ZROT( ILASTM-JCH, T( JCH, JCH+1 ), LDT,
-     $                          T( JCH+1, JCH+1 ), LDT, C, S )
-                     IF( ILQ )
-     $                  CALL ZROT( N, Q( 1, JCH ), 1, Q( 1, JCH+1 ), 1,
-     $                             C, DCONJG( S ) )
-                     IF( ILAZR2 )
-     $                  H( JCH, JCH-1 ) = H( JCH, JCH-1 )*C
-                     ILAZR2 = .FALSE.
-                     IF( ABS1( T( JCH+1, JCH+1 ) ).GE.BTOL ) THEN
-                        IF( JCH+1.GE.ILAST ) THEN
-                           GO TO 60
-                        ELSE
-                           IFIRST = JCH + 1
-                           GO TO 70
-                        END IF
-                     END IF
-                     T( JCH+1, JCH+1 ) = CZERO
-   20             CONTINUE
-                  GO TO 50
-               ELSE
-*
-*                 Only test 2 passed -- chase the zero to T(ILAST,ILAST)
-*                 Then process as in the case T(ILAST,ILAST)=0
-*
-                  DO 30 JCH = J, ILAST - 1
-                     CTEMP = T( JCH, JCH+1 )
-                     CALL ZLARTG( CTEMP, T( JCH+1, JCH+1 ), C, S,
-     $                            T( JCH, JCH+1 ) )
-                     T( JCH+1, JCH+1 ) = CZERO
-                     IF( JCH.LT.ILASTM-1 )
-     $                  CALL ZROT( ILASTM-JCH-1, T( JCH, JCH+2 ), LDT,
-     $                             T( JCH+1, JCH+2 ), LDT, C, S )
-                     CALL ZROT( ILASTM-JCH+2, H( JCH, JCH-1 ), LDH,
-     $                          H( JCH+1, JCH-1 ), LDH, C, S )
-                     IF( ILQ )
-     $                  CALL ZROT( N, Q( 1, JCH ), 1, Q( 1, JCH+1 ), 1,
-     $                             C, DCONJG( S ) )
-                     CTEMP = H( JCH+1, JCH )
-                     CALL ZLARTG( CTEMP, H( JCH+1, JCH-1 ), C, S,
-     $                            H( JCH+1, JCH ) )
-                     H( JCH+1, JCH-1 ) = CZERO
-                     CALL ZROT( JCH+1-IFRSTM, H( IFRSTM, JCH ), 1,
-     $                          H( IFRSTM, JCH-1 ), 1, C, S )
-                     CALL ZROT( JCH-IFRSTM, T( IFRSTM, JCH ), 1,
-     $                          T( IFRSTM, JCH-1 ), 1, C, S )
-                     IF( ILZ )
-     $                  CALL ZROT( N, Z( 1, JCH ), 1, Z( 1, JCH-1 ), 1,
-     $                             C, S )
-   30             CONTINUE
-                  GO TO 50
-               END IF
-            ELSE IF( ILAZRO ) THEN
-*
-*              Only test 1 passed -- work on J:ILAST
-*
-               IFIRST = J
-               GO TO 70
-            END IF
-*
-*           Neither test passed -- try next J
-*
-   40    CONTINUE
-*
-*        (Drop-through is "impossible")
-*
-         INFO = 2*N + 1
-         GO TO 210
-*
-*        T(ILAST,ILAST)=0 -- clear H(ILAST,ILAST-1) to split off a
-*        1x1 block.
-*
-   50    CONTINUE
-         CTEMP = H( ILAST, ILAST )
-         CALL ZLARTG( CTEMP, H( ILAST, ILAST-1 ), C, S,
-     $                H( ILAST, ILAST ) )
-         H( ILAST, ILAST-1 ) = CZERO
-         CALL ZROT( ILAST-IFRSTM, H( IFRSTM, ILAST ), 1,
-     $              H( IFRSTM, ILAST-1 ), 1, C, S )
-         CALL ZROT( ILAST-IFRSTM, T( IFRSTM, ILAST ), 1,
-     $              T( IFRSTM, ILAST-1 ), 1, C, S )
-         IF( ILZ )
-     $      CALL ZROT( N, Z( 1, ILAST ), 1, Z( 1, ILAST-1 ), 1, C, S )
-*
-*        H(ILAST,ILAST-1)=0 -- Standardize B, set ALPHA and BETA
-*
-   60    CONTINUE
-         ABSB = ABS( T( ILAST, ILAST ) )
-         IF( ABSB.GT.SAFMIN ) THEN
-            SIGNBC = DCONJG( T( ILAST, ILAST ) / ABSB )
-            T( ILAST, ILAST ) = ABSB
-            IF( ILSCHR ) THEN
-               CALL ZSCAL( ILAST-IFRSTM, SIGNBC, T( IFRSTM, ILAST ), 1 )
-               CALL ZSCAL( ILAST+1-IFRSTM, SIGNBC, H( IFRSTM, ILAST ),
-     $                     1 )
-            ELSE
-               H( ILAST, ILAST ) = H( ILAST, ILAST )*SIGNBC
-            END IF
-            IF( ILZ )
-     $         CALL ZSCAL( N, SIGNBC, Z( 1, ILAST ), 1 )
-         ELSE
-            T( ILAST, ILAST ) = CZERO
-         END IF
-         ALPHA( ILAST ) = H( ILAST, ILAST )
-         BETA( ILAST ) = T( ILAST, ILAST )
-*
-*        Go to next block -- exit if finished.
-*
-         ILAST = ILAST - 1
-         IF( ILAST.LT.ILO )
-     $      GO TO 190
-*
-*        Reset counters
-*
-         IITER = 0
-         ESHIFT = CZERO
-         IF( .NOT.ILSCHR ) THEN
-            ILASTM = ILAST
-            IF( IFRSTM.GT.ILAST )
-     $         IFRSTM = ILO
-         END IF
-         GO TO 160
-*
-*        QZ step
-*
-*        This iteration only involves rows/columns IFIRST:ILAST.  We
-*        assume IFIRST < ILAST, and that the diagonal of B is non-zero.
-*
-   70    CONTINUE
-         IITER = IITER + 1
-         IF( .NOT.ILSCHR ) THEN
-            IFRSTM = IFIRST
-         END IF
-*
-*        Compute the Shift.
-*
-*        At this point, IFIRST < ILAST, and the diagonal elements of
-*        T(IFIRST:ILAST,IFIRST,ILAST) are larger than BTOL (in
-*        magnitude)
-*
-         IF( ( IITER / 10 )*10.NE.IITER ) THEN
-*
-*           The Wilkinson shift (AEP p.512), i.e., the eigenvalue of
-*           the bottom-right 2x2 block of A inv(B) which is nearest to
-*           the bottom-right element.
-*
-*           We factor B as U*D, where U has unit diagonals, and
-*           compute (A*inv(D))*inv(U).
-*
-            U12 = ( BSCALE*T( ILAST-1, ILAST ) ) /
-     $            ( BSCALE*T( ILAST, ILAST ) )
-            AD11 = ( ASCALE*H( ILAST-1, ILAST-1 ) ) /
-     $             ( BSCALE*T( ILAST-1, ILAST-1 ) )
-            AD21 = ( ASCALE*H( ILAST, ILAST-1 ) ) /
-     $             ( BSCALE*T( ILAST-1, ILAST-1 ) )
-            AD12 = ( ASCALE*H( ILAST-1, ILAST ) ) /
-     $             ( BSCALE*T( ILAST, ILAST ) )
-            AD22 = ( ASCALE*H( ILAST, ILAST ) ) /
-     $             ( BSCALE*T( ILAST, ILAST ) )
-            ABI22 = AD22 - U12*AD21
-*
-            T1 = HALF*( AD11+ABI22 )
-            RTDISC = SQRT( T1**2+AD12*AD21-AD11*AD22 )
-            TEMP = DBLE( T1-ABI22 )*DBLE( RTDISC ) +
-     $             DIMAG( T1-ABI22 )*DIMAG( RTDISC )
-            IF( TEMP.LE.ZERO ) THEN
-               SHIFT = T1 + RTDISC
-            ELSE
-               SHIFT = T1 - RTDISC
-            END IF
-         ELSE
-*
-*           Exceptional shift.  Chosen for no particularly good reason.
-*
-            ESHIFT = ESHIFT + DCONJG( ( ASCALE*H( ILAST-1, ILAST ) ) /
-     $               ( BSCALE*T( ILAST-1, ILAST-1 ) ) )
-            SHIFT = ESHIFT
-         END IF
-*
-*        Now check for two consecutive small subdiagonals.
-*
-         DO 80 J = ILAST - 1, IFIRST + 1, -1
-            ISTART = J
-            CTEMP = ASCALE*H( J, J ) - SHIFT*( BSCALE*T( J, J ) )
-            TEMP = ABS1( CTEMP )
-            TEMP2 = ASCALE*ABS1( H( J+1, J ) )
-            TEMPR = MAX( TEMP, TEMP2 )
-            IF( TEMPR.LT.ONE .AND. TEMPR.NE.ZERO ) THEN
-               TEMP = TEMP / TEMPR
-               TEMP2 = TEMP2 / TEMPR
-            END IF
-            IF( ABS1( H( J, J-1 ) )*TEMP2.LE.TEMP*ATOL )
-     $         GO TO 90
-   80    CONTINUE
-*
-         ISTART = IFIRST
-         CTEMP = ASCALE*H( IFIRST, IFIRST ) -
-     $           SHIFT*( BSCALE*T( IFIRST, IFIRST ) )
-   90    CONTINUE
-*
-*        Do an implicit-shift QZ sweep.
-*
-*        Initial Q
-*
-         CTEMP2 = ASCALE*H( ISTART+1, ISTART )
-         CALL ZLARTG( CTEMP, CTEMP2, C, S, CTEMP3 )
-*
-*        Sweep
-*
-         DO 150 J = ISTART, ILAST - 1
-            IF( J.GT.ISTART ) THEN
-               CTEMP = H( J, J-1 )
-               CALL ZLARTG( CTEMP, H( J+1, J-1 ), C, S, H( J, J-1 ) )
-               H( J+1, J-1 ) = CZERO
-            END IF
-*
-            DO 100 JC = J, ILASTM
-               CTEMP = C*H( J, JC ) + S*H( J+1, JC )
-               H( J+1, JC ) = -DCONJG( S )*H( J, JC ) + C*H( J+1, JC )
-               H( J, JC ) = CTEMP
-               CTEMP2 = C*T( J, JC ) + S*T( J+1, JC )
-               T( J+1, JC ) = -DCONJG( S )*T( J, JC ) + C*T( J+1, JC )
-               T( J, JC ) = CTEMP2
-  100       CONTINUE
-            IF( ILQ ) THEN
-               DO 110 JR = 1, N
-                  CTEMP = C*Q( JR, J ) + DCONJG( S )*Q( JR, J+1 )
-                  Q( JR, J+1 ) = -S*Q( JR, J ) + C*Q( JR, J+1 )
-                  Q( JR, J ) = CTEMP
-  110          CONTINUE
-            END IF
-*
-            CTEMP = T( J+1, J+1 )
-            CALL ZLARTG( CTEMP, T( J+1, J ), C, S, T( J+1, J+1 ) )
-            T( J+1, J ) = CZERO
-*
-            DO 120 JR = IFRSTM, MIN( J+2, ILAST )
-               CTEMP = C*H( JR, J+1 ) + S*H( JR, J )
-               H( JR, J ) = -DCONJG( S )*H( JR, J+1 ) + C*H( JR, J )
-               H( JR, J+1 ) = CTEMP
-  120       CONTINUE
-            DO 130 JR = IFRSTM, J
-               CTEMP = C*T( JR, J+1 ) + S*T( JR, J )
-               T( JR, J ) = -DCONJG( S )*T( JR, J+1 ) + C*T( JR, J )
-               T( JR, J+1 ) = CTEMP
-  130       CONTINUE
-            IF( ILZ ) THEN
-               DO 140 JR = 1, N
-                  CTEMP = C*Z( JR, J+1 ) + S*Z( JR, J )
-                  Z( JR, J ) = -DCONJG( S )*Z( JR, J+1 ) + C*Z( JR, J )
-                  Z( JR, J+1 ) = CTEMP
-  140          CONTINUE
-            END IF
-  150    CONTINUE
-*
-  160    CONTINUE
-*
-  170 CONTINUE
-*
-*     Drop-through = non-convergence
-*
-  180 CONTINUE
-      INFO = ILAST
-      GO TO 210
-*
-*     Successful completion of all QZ steps
-*
-  190 CONTINUE
-*
-*     Set Eigenvalues 1:ILO-1
-*
-      DO 200 J = 1, ILO - 1
-         ABSB = ABS( T( J, J ) )
-         IF( ABSB.GT.SAFMIN ) THEN
-            SIGNBC = DCONJG( T( J, J ) / ABSB )
-            T( J, J ) = ABSB
-            IF( ILSCHR ) THEN
-               CALL ZSCAL( J-1, SIGNBC, T( 1, J ), 1 )
-               CALL ZSCAL( J, SIGNBC, H( 1, J ), 1 )
-            ELSE
-               H( J, J ) = H( J, J )*SIGNBC
-            END IF
-            IF( ILZ )
-     $         CALL ZSCAL( N, SIGNBC, Z( 1, J ), 1 )
-         ELSE
-            T( J, J ) = CZERO
-         END IF
-         ALPHA( J ) = H( J, J )
-         BETA( J ) = T( J, J )
-  200 CONTINUE
-*
-*     Normal Termination
-*
-      INFO = 0
-*
-*     Exit (other than argument error) -- return optimal workspace size
-*
-  210 CONTINUE
-      WORK( 1 ) = DCMPLX( N )
-      RETURN
-*
-*     End of ZHGEQZ
-*
-      END
--- a/libcruft/lapack/zhseqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,395 +0,0 @@
-      SUBROUTINE ZHSEQR( JOB, COMPZ, N, ILO, IHI, H, LDH, W, Z, LDZ,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK driver routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, ILO, INFO, LDH, LDZ, LWORK, N
-      CHARACTER          COMPZ, JOB
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         H( LDH, * ), W( * ), WORK( * ), Z( LDZ, * )
-*     ..
-*     Purpose
-*     =======
-*
-*     ZHSEQR computes the eigenvalues of a Hessenberg matrix H
-*     and, optionally, the matrices T and Z from the Schur decomposition
-*     H = Z T Z**H, where T is an upper triangular matrix (the
-*     Schur form), and Z is the unitary matrix of Schur vectors.
-*
-*     Optionally Z may be postmultiplied into an input unitary
-*     matrix Q so that this routine can give the Schur factorization
-*     of a matrix A which has been reduced to the Hessenberg form H
-*     by the unitary matrix Q:  A = Q*H*Q**H = (QZ)*H*(QZ)**H.
-*
-*     Arguments
-*     =========
-*
-*     JOB   (input) CHARACTER*1
-*           = 'E':  compute eigenvalues only;
-*           = 'S':  compute eigenvalues and the Schur form T.
-*
-*     COMPZ (input) CHARACTER*1
-*           = 'N':  no Schur vectors are computed;
-*           = 'I':  Z is initialized to the unit matrix and the matrix Z
-*                   of Schur vectors of H is returned;
-*           = 'V':  Z must contain an unitary matrix Q on entry, and
-*                   the product Q*Z is returned.
-*
-*     N     (input) INTEGER
-*           The order of the matrix H.  N .GE. 0.
-*
-*     ILO   (input) INTEGER
-*     IHI   (input) INTEGER
-*           It is assumed that H is already upper triangular in rows
-*           and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally
-*           set by a previous call to ZGEBAL, and then passed to ZGEHRD
-*           when the matrix output by ZGEBAL is reduced to Hessenberg
-*           form. Otherwise ILO and IHI should be set to 1 and N
-*           respectively.  If N.GT.0, then 1.LE.ILO.LE.IHI.LE.N.
-*           If N = 0, then ILO = 1 and IHI = 0.
-*
-*     H     (input/output) COMPLEX*16 array, dimension (LDH,N)
-*           On entry, the upper Hessenberg matrix H.
-*           On exit, if INFO = 0 and JOB = 'S', H contains the upper
-*           triangular matrix T from the Schur decomposition (the
-*           Schur form). If INFO = 0 and JOB = 'E', the contents of
-*           H are unspecified on exit.  (The output value of H when
-*           INFO.GT.0 is given under the description of INFO below.)
-*
-*           Unlike earlier versions of ZHSEQR, this subroutine may
-*           explicitly H(i,j) = 0 for i.GT.j and j = 1, 2, ... ILO-1
-*           or j = IHI+1, IHI+2, ... N.
-*
-*     LDH   (input) INTEGER
-*           The leading dimension of the array H. LDH .GE. max(1,N).
-*
-*     W        (output) COMPLEX*16 array, dimension (N)
-*           The computed eigenvalues. If JOB = 'S', the eigenvalues are
-*           stored in the same order as on the diagonal of the Schur
-*           form returned in H, with W(i) = H(i,i).
-*
-*     Z     (input/output) COMPLEX*16 array, dimension (LDZ,N)
-*           If COMPZ = 'N', Z is not referenced.
-*           If COMPZ = 'I', on entry Z need not be set and on exit,
-*           if INFO = 0, Z contains the unitary matrix Z of the Schur
-*           vectors of H.  If COMPZ = 'V', on entry Z must contain an
-*           N-by-N matrix Q, which is assumed to be equal to the unit
-*           matrix except for the submatrix Z(ILO:IHI,ILO:IHI). On exit,
-*           if INFO = 0, Z contains Q*Z.
-*           Normally Q is the unitary matrix generated by ZUNGHR
-*           after the call to ZGEHRD which formed the Hessenberg matrix
-*           H. (The output value of Z when INFO.GT.0 is given under
-*           the description of INFO below.)
-*
-*     LDZ   (input) INTEGER
-*           The leading dimension of the array Z.  if COMPZ = 'I' or
-*           COMPZ = 'V', then LDZ.GE.MAX(1,N).  Otherwize, LDZ.GE.1.
-*
-*     WORK  (workspace/output) COMPLEX*16 array, dimension (LWORK)
-*           On exit, if INFO = 0, WORK(1) returns an estimate of
-*           the optimal value for LWORK.
-*
-*     LWORK (input) INTEGER
-*           The dimension of the array WORK.  LWORK .GE. max(1,N)
-*           is sufficient, but LWORK typically as large as 6*N may
-*           be required for optimal performance.  A workspace query
-*           to determine the optimal workspace size is recommended.
-*
-*           If LWORK = -1, then ZHSEQR does a workspace query.
-*           In this case, ZHSEQR checks the input parameters and
-*           estimates the optimal workspace size for the given
-*           values of N, ILO and IHI.  The estimate is returned
-*           in WORK(1).  No error message related to LWORK is
-*           issued by XERBLA.  Neither H nor Z are accessed.
-*
-*
-*     INFO  (output) INTEGER
-*             =  0:  successful exit
-*           .LT. 0:  if INFO = -i, the i-th argument had an illegal
-*                    value
-*           .GT. 0:  if INFO = i, ZHSEQR failed to compute all of
-*                the eigenvalues.  Elements 1:ilo-1 and i+1:n of WR
-*                and WI contain those eigenvalues which have been
-*                successfully computed.  (Failures are rare.)
-*
-*                If INFO .GT. 0 and JOB = 'E', then on exit, the
-*                remaining unconverged eigenvalues are the eigen-
-*                values of the upper Hessenberg matrix rows and
-*                columns ILO through INFO of the final, output
-*                value of H.
-*
-*                If INFO .GT. 0 and JOB   = 'S', then on exit
-*
-*           (*)  (initial value of H)*U  = U*(final value of H)
-*
-*                where U is a unitary matrix.  The final
-*                value of  H is upper Hessenberg and triangular in
-*                rows and columns INFO+1 through IHI.
-*
-*                If INFO .GT. 0 and COMPZ = 'V', then on exit
-*
-*                  (final value of Z)  =  (initial value of Z)*U
-*
-*                where U is the unitary matrix in (*) (regard-
-*                less of the value of JOB.)
-*
-*                If INFO .GT. 0 and COMPZ = 'I', then on exit
-*                      (final value of Z)  = U
-*                where U is the unitary matrix in (*) (regard-
-*                less of the value of JOB.)
-*
-*                If INFO .GT. 0 and COMPZ = 'N', then Z is not
-*                accessed.
-*
-*     ================================================================
-*             Default values supplied by
-*             ILAENV(ISPEC,'ZHSEQR',JOB(:1)//COMPZ(:1),N,ILO,IHI,LWORK).
-*             It is suggested that these defaults be adjusted in order
-*             to attain best performance in each particular
-*             computational environment.
-*
-*            ISPEC=1:  The ZLAHQR vs ZLAQR0 crossover point.
-*                      Default: 75. (Must be at least 11.)
-*
-*            ISPEC=2:  Recommended deflation window size.
-*                      This depends on ILO, IHI and NS.  NS is the
-*                      number of simultaneous shifts returned
-*                      by ILAENV(ISPEC=4).  (See ISPEC=4 below.)
-*                      The default for (IHI-ILO+1).LE.500 is NS.
-*                      The default for (IHI-ILO+1).GT.500 is 3*NS/2.
-*
-*            ISPEC=3:  Nibble crossover point. (See ILAENV for
-*                      details.)  Default: 14% of deflation window
-*                      size.
-*
-*            ISPEC=4:  Number of simultaneous shifts, NS, in
-*                      a multi-shift QR iteration.
-*
-*                      If IHI-ILO+1 is ...
-*
-*                      greater than      ...but less    ... the
-*                      or equal to ...      than        default is
-*
-*                           1               30          NS -   2(+)
-*                          30               60          NS -   4(+)
-*                          60              150          NS =  10(+)
-*                         150              590          NS =  **
-*                         590             3000          NS =  64
-*                        3000             6000          NS = 128
-*                        6000             infinity      NS = 256
-*
-*                  (+)  By default some or all matrices of this order 
-*                       are passed to the implicit double shift routine
-*                       ZLAHQR and NS is ignored.  See ISPEC=1 above 
-*                       and comments in IPARM for details.
-*
-*                       The asterisks (**) indicate an ad-hoc
-*                       function of N increasing from 10 to 64.
-*
-*            ISPEC=5:  Select structured matrix multiply.
-*                      (See ILAENV for details.) Default: 3.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ================================================================
-*     References:
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
-*       Performance, SIAM Journal of Matrix Analysis, volume 23, pages
-*       929--947, 2002.
-*
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part II: Aggressive Early Deflation, SIAM Journal
-*       of Matrix Analysis, volume 23, pages 948--973, 2002.
-*
-*     ================================================================
-*     .. Parameters ..
-*
-*     ==== Matrices of order NTINY or smaller must be processed by
-*     .    ZLAHQR because of insufficient subdiagonal scratch space.
-*     .    (This is a hard limit.) ====
-*
-*     ==== NL allocates some local workspace to help small matrices
-*     .    through a rare ZLAHQR failure.  NL .GT. NTINY = 11 is
-*     .    required and NL .LE. NMIN = ILAENV(ISPEC=1,...) is recom-
-*     .    mended.  (The default value of NMIN is 75.)  Using NL = 49
-*     .    allows up to six simultaneous shifts and a 16-by-16
-*     .    deflation window.  ====
-*
-      INTEGER            NTINY
-      PARAMETER          ( NTINY = 11 )
-      INTEGER            NL
-      PARAMETER          ( NL = 49 )
-      COMPLEX*16         ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0d0, 0.0d0 ),
-     $                   ONE = ( 1.0d0, 0.0d0 ) )
-      DOUBLE PRECISION   RZERO
-      PARAMETER          ( RZERO = 0.0d0 )
-*     ..
-*     .. Local Arrays ..
-      COMPLEX*16         HL( NL, NL ), WORKL( NL )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            KBOT, NMIN
-      LOGICAL            INITZ, LQUERY, WANTT, WANTZ
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      LOGICAL            LSAME
-      EXTERNAL           ILAENV, LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZCOPY, ZLACPY, ZLAHQR, ZLAQR0, ZLASET
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, DCMPLX, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     ==== Decode and check the input parameters. ====
-*
-      WANTT = LSAME( JOB, 'S' )
-      INITZ = LSAME( COMPZ, 'I' )
-      WANTZ = INITZ .OR. LSAME( COMPZ, 'V' )
-      WORK( 1 ) = DCMPLX( DBLE( MAX( 1, N ) ), RZERO )
-      LQUERY = LWORK.EQ.-1
-*
-      INFO = 0
-      IF( .NOT.LSAME( JOB, 'E' ) .AND. .NOT.WANTT ) THEN
-         INFO = -1
-      ELSE IF( .NOT.LSAME( COMPZ, 'N' ) .AND. .NOT.WANTZ ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -5
-      ELSE IF( LDH.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDZ.LT.1 .OR. ( WANTZ .AND. LDZ.LT.MAX( 1, N ) ) ) THEN
-         INFO = -10
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -12
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-*
-*        ==== Quick return in case of invalid argument. ====
-*
-         CALL XERBLA( 'ZHSEQR', -INFO )
-         RETURN
-*
-      ELSE IF( N.EQ.0 ) THEN
-*
-*        ==== Quick return in case N = 0; nothing to do. ====
-*
-         RETURN
-*
-      ELSE IF( LQUERY ) THEN
-*
-*        ==== Quick return in case of a workspace query ====
-*
-         CALL ZLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILO, IHI, Z,
-     $                LDZ, WORK, LWORK, INFO )
-*        ==== Ensure reported workspace size is backward-compatible with
-*        .    previous LAPACK versions. ====
-         WORK( 1 ) = DCMPLX( MAX( DBLE( WORK( 1 ) ), DBLE( MAX( 1,
-     $               N ) ) ), RZERO )
-         RETURN
-*
-      ELSE
-*
-*        ==== copy eigenvalues isolated by ZGEBAL ====
-*
-         IF( ILO.GT.1 )
-     $      CALL ZCOPY( ILO-1, H, LDH+1, W, 1 )
-         IF( IHI.LT.N )
-     $      CALL ZCOPY( N-IHI, H( IHI+1, IHI+1 ), LDH+1, W( IHI+1 ), 1 )
-*
-*        ==== Initialize Z, if requested ====
-*
-         IF( INITZ )
-     $      CALL ZLASET( 'A', N, N, ZERO, ONE, Z, LDZ )
-*
-*        ==== Quick return if possible ====
-*
-         IF( ILO.EQ.IHI ) THEN
-            W( ILO ) = H( ILO, ILO )
-            RETURN
-         END IF
-*
-*        ==== ZLAHQR/ZLAQR0 crossover point ====
-*
-         NMIN = ILAENV( 1, 'ZHSEQR', JOB( : 1 ) // COMPZ( : 1 ), N, ILO,
-     $          IHI, LWORK )
-         NMIN = MAX( NTINY, NMIN )
-*
-*        ==== ZLAQR0 for big matrices; ZLAHQR for small ones ====
-*
-         IF( N.GT.NMIN ) THEN
-            CALL ZLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILO, IHI,
-     $                   Z, LDZ, WORK, LWORK, INFO )
-         ELSE
-*
-*           ==== Small matrix ====
-*
-            CALL ZLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILO, IHI,
-     $                   Z, LDZ, INFO )
-*
-            IF( INFO.GT.0 ) THEN
-*
-*              ==== A rare ZLAHQR failure!  ZLAQR0 sometimes succeeds
-*              .    when ZLAHQR fails. ====
-*
-               KBOT = INFO
-*
-               IF( N.GE.NL ) THEN
-*
-*                 ==== Larger matrices have enough subdiagonal scratch
-*                 .    space to call ZLAQR0 directly. ====
-*
-                  CALL ZLAQR0( WANTT, WANTZ, N, ILO, KBOT, H, LDH, W,
-     $                         ILO, IHI, Z, LDZ, WORK, LWORK, INFO )
-*
-               ELSE
-*
-*                 ==== Tiny matrices don't have enough subdiagonal
-*                 .    scratch space to benefit from ZLAQR0.  Hence,
-*                 .    tiny matrices must be copied into a larger
-*                 .    array before calling ZLAQR0. ====
-*
-                  CALL ZLACPY( 'A', N, N, H, LDH, HL, NL )
-                  HL( N+1, N ) = ZERO
-                  CALL ZLASET( 'A', NL, NL-N, ZERO, ZERO, HL( 1, N+1 ),
-     $                         NL )
-                  CALL ZLAQR0( WANTT, WANTZ, NL, ILO, KBOT, HL, NL, W,
-     $                         ILO, IHI, Z, LDZ, WORKL, NL, INFO )
-                  IF( WANTT .OR. INFO.NE.0 )
-     $               CALL ZLACPY( 'A', N, N, HL, NL, H, LDH )
-               END IF
-            END IF
-         END IF
-*
-*        ==== Clear out the trash, if necessary. ====
-*
-         IF( ( WANTT .OR. INFO.NE.0 ) .AND. N.GT.2 )
-     $      CALL ZLASET( 'L', N-2, N-2, ZERO, ZERO, H( 3, 1 ), LDH )
-*
-*        ==== Ensure reported workspace size is backward-compatible with
-*        .    previous LAPACK versions. ====
-*
-         WORK( 1 ) = DCMPLX( MAX( DBLE( MAX( 1, N ) ),
-     $               DBLE( WORK( 1 ) ) ), RZERO )
-      END IF
-*
-*     ==== End of ZHSEQR ====
-*
-      END
--- a/libcruft/lapack/zlabrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,328 +0,0 @@
-      SUBROUTINE ZLABRD( M, N, NB, A, LDA, D, E, TAUQ, TAUP, X, LDX, Y,
-     $                   LDY )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            LDA, LDX, LDY, M, N, NB
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * ), E( * )
-      COMPLEX*16         A( LDA, * ), TAUP( * ), TAUQ( * ), X( LDX, * ),
-     $                   Y( LDY, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLABRD reduces the first NB rows and columns of a complex general
-*  m by n matrix A to upper or lower real bidiagonal form by a unitary
-*  transformation Q' * A * P, and returns the matrices X and Y which
-*  are needed to apply the transformation to the unreduced part of A.
-*
-*  If m >= n, A is reduced to upper bidiagonal form; if m < n, to lower
-*  bidiagonal form.
-*
-*  This is an auxiliary routine called by ZGEBRD
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows in the matrix A.
-*
-*  N       (input) INTEGER
-*          The number of columns in the matrix A.
-*
-*  NB      (input) INTEGER
-*          The number of leading rows and columns of A to be reduced.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the m by n general matrix to be reduced.
-*          On exit, the first NB rows and columns of the matrix are
-*          overwritten; the rest of the array is unchanged.
-*          If m >= n, elements on and below the diagonal in the first NB
-*            columns, with the array TAUQ, represent the unitary
-*            matrix Q as a product of elementary reflectors; and
-*            elements above the diagonal in the first NB rows, with the
-*            array TAUP, represent the unitary matrix P as a product
-*            of elementary reflectors.
-*          If m < n, elements below the diagonal in the first NB
-*            columns, with the array TAUQ, represent the unitary
-*            matrix Q as a product of elementary reflectors, and
-*            elements on and above the diagonal in the first NB rows,
-*            with the array TAUP, represent the unitary matrix P as
-*            a product of elementary reflectors.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  D       (output) DOUBLE PRECISION array, dimension (NB)
-*          The diagonal elements of the first NB rows and columns of
-*          the reduced matrix.  D(i) = A(i,i).
-*
-*  E       (output) DOUBLE PRECISION array, dimension (NB)
-*          The off-diagonal elements of the first NB rows and columns of
-*          the reduced matrix.
-*
-*  TAUQ    (output) COMPLEX*16 array dimension (NB)
-*          The scalar factors of the elementary reflectors which
-*          represent the unitary matrix Q. See Further Details.
-*
-*  TAUP    (output) COMPLEX*16 array, dimension (NB)
-*          The scalar factors of the elementary reflectors which
-*          represent the unitary matrix P. See Further Details.
-*
-*  X       (output) COMPLEX*16 array, dimension (LDX,NB)
-*          The m-by-nb matrix X required to update the unreduced part
-*          of A.
-*
-*  LDX     (input) INTEGER
-*          The leading dimension of the array X. LDX >= max(1,M).
-*
-*  Y       (output) COMPLEX*16 array, dimension (LDY,NB)
-*          The n-by-nb matrix Y required to update the unreduced part
-*          of A.
-*
-*  LDY     (input) INTEGER
-*          The leading dimension of the array Y. LDY >= max(1,N).
-*
-*  Further Details
-*  ===============
-*
-*  The matrices Q and P are represented as products of elementary
-*  reflectors:
-*
-*     Q = H(1) H(2) . . . H(nb)  and  P = G(1) G(2) . . . G(nb)
-*
-*  Each H(i) and G(i) has the form:
-*
-*     H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'
-*
-*  where tauq and taup are complex scalars, and v and u are complex
-*  vectors.
-*
-*  If m >= n, v(1:i-1) = 0, v(i) = 1, and v(i:m) is stored on exit in
-*  A(i:m,i); u(1:i) = 0, u(i+1) = 1, and u(i+1:n) is stored on exit in
-*  A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  If m < n, v(1:i) = 0, v(i+1) = 1, and v(i+1:m) is stored on exit in
-*  A(i+2:m,i); u(1:i-1) = 0, u(i) = 1, and u(i:n) is stored on exit in
-*  A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i).
-*
-*  The elements of the vectors v and u together form the m-by-nb matrix
-*  V and the nb-by-n matrix U' which are needed, with X and Y, to apply
-*  the transformation to the unreduced part of the matrix, using a block
-*  update of the form:  A := A - V*Y' - X*U'.
-*
-*  The contents of A on exit are illustrated by the following examples
-*  with nb = 2:
-*
-*  m = 6 and n = 5 (m > n):          m = 5 and n = 6 (m < n):
-*
-*    (  1   1   u1  u1  u1 )           (  1   u1  u1  u1  u1  u1 )
-*    (  v1  1   1   u2  u2 )           (  1   1   u2  u2  u2  u2 )
-*    (  v1  v2  a   a   a  )           (  v1  1   a   a   a   a  )
-*    (  v1  v2  a   a   a  )           (  v1  v2  a   a   a   a  )
-*    (  v1  v2  a   a   a  )           (  v1  v2  a   a   a   a  )
-*    (  v1  v2  a   a   a  )
-*
-*  where a denotes an element of the original matrix which is unchanged,
-*  vi denotes an element of the vector defining H(i), and ui an element
-*  of the vector defining G(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ),
-     $                   ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      COMPLEX*16         ALPHA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZGEMV, ZLACGV, ZLARFG, ZSCAL
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 .OR. N.LE.0 )
-     $   RETURN
-*
-      IF( M.GE.N ) THEN
-*
-*        Reduce to upper bidiagonal form
-*
-         DO 10 I = 1, NB
-*
-*           Update A(i:m,i)
-*
-            CALL ZLACGV( I-1, Y( I, 1 ), LDY )
-            CALL ZGEMV( 'No transpose', M-I+1, I-1, -ONE, A( I, 1 ),
-     $                  LDA, Y( I, 1 ), LDY, ONE, A( I, I ), 1 )
-            CALL ZLACGV( I-1, Y( I, 1 ), LDY )
-            CALL ZGEMV( 'No transpose', M-I+1, I-1, -ONE, X( I, 1 ),
-     $                  LDX, A( 1, I ), 1, ONE, A( I, I ), 1 )
-*
-*           Generate reflection Q(i) to annihilate A(i+1:m,i)
-*
-            ALPHA = A( I, I )
-            CALL ZLARFG( M-I+1, ALPHA, A( MIN( I+1, M ), I ), 1,
-     $                   TAUQ( I ) )
-            D( I ) = ALPHA
-            IF( I.LT.N ) THEN
-               A( I, I ) = ONE
-*
-*              Compute Y(i+1:n,i)
-*
-               CALL ZGEMV( 'Conjugate transpose', M-I+1, N-I, ONE,
-     $                     A( I, I+1 ), LDA, A( I, I ), 1, ZERO,
-     $                     Y( I+1, I ), 1 )
-               CALL ZGEMV( 'Conjugate transpose', M-I+1, I-1, ONE,
-     $                     A( I, 1 ), LDA, A( I, I ), 1, ZERO,
-     $                     Y( 1, I ), 1 )
-               CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, Y( I+1, 1 ),
-     $                     LDY, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
-               CALL ZGEMV( 'Conjugate transpose', M-I+1, I-1, ONE,
-     $                     X( I, 1 ), LDX, A( I, I ), 1, ZERO,
-     $                     Y( 1, I ), 1 )
-               CALL ZGEMV( 'Conjugate transpose', I-1, N-I, -ONE,
-     $                     A( 1, I+1 ), LDA, Y( 1, I ), 1, ONE,
-     $                     Y( I+1, I ), 1 )
-               CALL ZSCAL( N-I, TAUQ( I ), Y( I+1, I ), 1 )
-*
-*              Update A(i,i+1:n)
-*
-               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
-               CALL ZLACGV( I, A( I, 1 ), LDA )
-               CALL ZGEMV( 'No transpose', N-I, I, -ONE, Y( I+1, 1 ),
-     $                     LDY, A( I, 1 ), LDA, ONE, A( I, I+1 ), LDA )
-               CALL ZLACGV( I, A( I, 1 ), LDA )
-               CALL ZLACGV( I-1, X( I, 1 ), LDX )
-               CALL ZGEMV( 'Conjugate transpose', I-1, N-I, -ONE,
-     $                     A( 1, I+1 ), LDA, X( I, 1 ), LDX, ONE,
-     $                     A( I, I+1 ), LDA )
-               CALL ZLACGV( I-1, X( I, 1 ), LDX )
-*
-*              Generate reflection P(i) to annihilate A(i,i+2:n)
-*
-               ALPHA = A( I, I+1 )
-               CALL ZLARFG( N-I, ALPHA, A( I, MIN( I+2, N ) ), LDA,
-     $                      TAUP( I ) )
-               E( I ) = ALPHA
-               A( I, I+1 ) = ONE
-*
-*              Compute X(i+1:m,i)
-*
-               CALL ZGEMV( 'No transpose', M-I, N-I, ONE, A( I+1, I+1 ),
-     $                     LDA, A( I, I+1 ), LDA, ZERO, X( I+1, I ), 1 )
-               CALL ZGEMV( 'Conjugate transpose', N-I, I, ONE,
-     $                     Y( I+1, 1 ), LDY, A( I, I+1 ), LDA, ZERO,
-     $                     X( 1, I ), 1 )
-               CALL ZGEMV( 'No transpose', M-I, I, -ONE, A( I+1, 1 ),
-     $                     LDA, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
-               CALL ZGEMV( 'No transpose', I-1, N-I, ONE, A( 1, I+1 ),
-     $                     LDA, A( I, I+1 ), LDA, ZERO, X( 1, I ), 1 )
-               CALL ZGEMV( 'No transpose', M-I, I-1, -ONE, X( I+1, 1 ),
-     $                     LDX, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
-               CALL ZSCAL( M-I, TAUP( I ), X( I+1, I ), 1 )
-               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
-            END IF
-   10    CONTINUE
-      ELSE
-*
-*        Reduce to lower bidiagonal form
-*
-         DO 20 I = 1, NB
-*
-*           Update A(i,i:n)
-*
-            CALL ZLACGV( N-I+1, A( I, I ), LDA )
-            CALL ZLACGV( I-1, A( I, 1 ), LDA )
-            CALL ZGEMV( 'No transpose', N-I+1, I-1, -ONE, Y( I, 1 ),
-     $                  LDY, A( I, 1 ), LDA, ONE, A( I, I ), LDA )
-            CALL ZLACGV( I-1, A( I, 1 ), LDA )
-            CALL ZLACGV( I-1, X( I, 1 ), LDX )
-            CALL ZGEMV( 'Conjugate transpose', I-1, N-I+1, -ONE,
-     $                  A( 1, I ), LDA, X( I, 1 ), LDX, ONE, A( I, I ),
-     $                  LDA )
-            CALL ZLACGV( I-1, X( I, 1 ), LDX )
-*
-*           Generate reflection P(i) to annihilate A(i,i+1:n)
-*
-            ALPHA = A( I, I )
-            CALL ZLARFG( N-I+1, ALPHA, A( I, MIN( I+1, N ) ), LDA,
-     $                   TAUP( I ) )
-            D( I ) = ALPHA
-            IF( I.LT.M ) THEN
-               A( I, I ) = ONE
-*
-*              Compute X(i+1:m,i)
-*
-               CALL ZGEMV( 'No transpose', M-I, N-I+1, ONE, A( I+1, I ),
-     $                     LDA, A( I, I ), LDA, ZERO, X( I+1, I ), 1 )
-               CALL ZGEMV( 'Conjugate transpose', N-I+1, I-1, ONE,
-     $                     Y( I, 1 ), LDY, A( I, I ), LDA, ZERO,
-     $                     X( 1, I ), 1 )
-               CALL ZGEMV( 'No transpose', M-I, I-1, -ONE, A( I+1, 1 ),
-     $                     LDA, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
-               CALL ZGEMV( 'No transpose', I-1, N-I+1, ONE, A( 1, I ),
-     $                     LDA, A( I, I ), LDA, ZERO, X( 1, I ), 1 )
-               CALL ZGEMV( 'No transpose', M-I, I-1, -ONE, X( I+1, 1 ),
-     $                     LDX, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
-               CALL ZSCAL( M-I, TAUP( I ), X( I+1, I ), 1 )
-               CALL ZLACGV( N-I+1, A( I, I ), LDA )
-*
-*              Update A(i+1:m,i)
-*
-               CALL ZLACGV( I-1, Y( I, 1 ), LDY )
-               CALL ZGEMV( 'No transpose', M-I, I-1, -ONE, A( I+1, 1 ),
-     $                     LDA, Y( I, 1 ), LDY, ONE, A( I+1, I ), 1 )
-               CALL ZLACGV( I-1, Y( I, 1 ), LDY )
-               CALL ZGEMV( 'No transpose', M-I, I, -ONE, X( I+1, 1 ),
-     $                     LDX, A( 1, I ), 1, ONE, A( I+1, I ), 1 )
-*
-*              Generate reflection Q(i) to annihilate A(i+2:m,i)
-*
-               ALPHA = A( I+1, I )
-               CALL ZLARFG( M-I, ALPHA, A( MIN( I+2, M ), I ), 1,
-     $                      TAUQ( I ) )
-               E( I ) = ALPHA
-               A( I+1, I ) = ONE
-*
-*              Compute Y(i+1:n,i)
-*
-               CALL ZGEMV( 'Conjugate transpose', M-I, N-I, ONE,
-     $                     A( I+1, I+1 ), LDA, A( I+1, I ), 1, ZERO,
-     $                     Y( I+1, I ), 1 )
-               CALL ZGEMV( 'Conjugate transpose', M-I, I-1, ONE,
-     $                     A( I+1, 1 ), LDA, A( I+1, I ), 1, ZERO,
-     $                     Y( 1, I ), 1 )
-               CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, Y( I+1, 1 ),
-     $                     LDY, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
-               CALL ZGEMV( 'Conjugate transpose', M-I, I, ONE,
-     $                     X( I+1, 1 ), LDX, A( I+1, I ), 1, ZERO,
-     $                     Y( 1, I ), 1 )
-               CALL ZGEMV( 'Conjugate transpose', I, N-I, -ONE,
-     $                     A( 1, I+1 ), LDA, Y( 1, I ), 1, ONE,
-     $                     Y( I+1, I ), 1 )
-               CALL ZSCAL( N-I, TAUQ( I ), Y( I+1, I ), 1 )
-            ELSE
-               CALL ZLACGV( N-I+1, A( I, I ), LDA )
-            END IF
-   20    CONTINUE
-      END IF
-      RETURN
-*
-*     End of ZLABRD
-*
-      END
--- a/libcruft/lapack/zlacgv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-      SUBROUTINE ZLACGV( N, X, INCX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLACGV conjugates a complex vector of length N.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The length of the vector X.  N >= 0.
-*
-*  X       (input/output) COMPLEX*16 array, dimension
-*                         (1+(N-1)*abs(INCX))
-*          On entry, the vector of length N to be conjugated.
-*          On exit, X is overwritten with conjg(X).
-*
-*  INCX    (input) INTEGER
-*          The spacing between successive elements of X.
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, IOFF
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG
-*     ..
-*     .. Executable Statements ..
-*
-      IF( INCX.EQ.1 ) THEN
-         DO 10 I = 1, N
-            X( I ) = DCONJG( X( I ) )
-   10    CONTINUE
-      ELSE
-         IOFF = 1
-         IF( INCX.LT.0 )
-     $      IOFF = 1 - ( N-1 )*INCX
-         DO 20 I = 1, N
-            X( IOFF ) = DCONJG( X( IOFF ) )
-            IOFF = IOFF + INCX
-   20    CONTINUE
-      END IF
-      RETURN
-*
-*     End of ZLACGV
-*
-      END
--- a/libcruft/lapack/zlacn2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,221 +0,0 @@
-      SUBROUTINE ZLACN2( N, V, X, EST, KASE, ISAVE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            KASE, N
-      DOUBLE PRECISION   EST
-*     ..
-*     .. Array Arguments ..
-      INTEGER            ISAVE( 3 )
-      COMPLEX*16         V( * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLACN2 estimates the 1-norm of a square, complex matrix A.
-*  Reverse communication is used for evaluating matrix-vector products.
-*
-*  Arguments
-*  =========
-*
-*  N      (input) INTEGER
-*         The order of the matrix.  N >= 1.
-*
-*  V      (workspace) COMPLEX*16 array, dimension (N)
-*         On the final return, V = A*W,  where  EST = norm(V)/norm(W)
-*         (W is not returned).
-*
-*  X      (input/output) COMPLEX*16 array, dimension (N)
-*         On an intermediate return, X should be overwritten by
-*               A * X,   if KASE=1,
-*               A' * X,  if KASE=2,
-*         where A' is the conjugate transpose of A, and ZLACN2 must be
-*         re-called with all the other parameters unchanged.
-*
-*  EST    (input/output) DOUBLE PRECISION
-*         On entry with KASE = 1 or 2 and ISAVE(1) = 3, EST should be
-*         unchanged from the previous call to ZLACN2.
-*         On exit, EST is an estimate (a lower bound) for norm(A). 
-*
-*  KASE   (input/output) INTEGER
-*         On the initial call to ZLACN2, KASE should be 0.
-*         On an intermediate return, KASE will be 1 or 2, indicating
-*         whether X should be overwritten by A * X  or A' * X.
-*         On the final return from ZLACN2, KASE will again be 0.
-*
-*  ISAVE  (input/output) INTEGER array, dimension (3)
-*         ISAVE is used to save variables between calls to ZLACN2
-*
-*  Further Details
-*  ======= =======
-*
-*  Contributed by Nick Higham, University of Manchester.
-*  Originally named CONEST, dated March 16, 1988.
-*
-*  Reference: N.J. Higham, "FORTRAN codes for estimating the one-norm of
-*  a real or complex matrix, with applications to condition estimation",
-*  ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988.
-*
-*  Last modified:  April, 1999
-*
-*  This is a thread safe version of ZLACON, which uses the array ISAVE
-*  in place of a SAVE statement, as follows:
-*
-*     ZLACON     ZLACN2
-*      JUMP     ISAVE(1)
-*      J        ISAVE(2)
-*      ITER     ISAVE(3)
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER              ITMAX
-      PARAMETER          ( ITMAX = 5 )
-      DOUBLE PRECISION     ONE,         TWO
-      PARAMETER          ( ONE = 1.0D0, TWO = 2.0D0 )
-      COMPLEX*16           CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0D0, 0.0D0 ),
-     $                            CONE = ( 1.0D0, 0.0D0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, JLAST
-      DOUBLE PRECISION   ABSXI, ALTSGN, ESTOLD, SAFMIN, TEMP
-*     ..
-*     .. External Functions ..
-      INTEGER            IZMAX1
-      DOUBLE PRECISION   DLAMCH, DZSUM1
-      EXTERNAL           IZMAX1, DLAMCH, DZSUM1
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZCOPY
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCMPLX, DIMAG
-*     ..
-*     .. Executable Statements ..
-*
-      SAFMIN = DLAMCH( 'Safe minimum' )
-      IF( KASE.EQ.0 ) THEN
-         DO 10 I = 1, N
-            X( I ) = DCMPLX( ONE / DBLE( N ) )
-   10    CONTINUE
-         KASE = 1
-         ISAVE( 1 ) = 1
-         RETURN
-      END IF
-*
-      GO TO ( 20, 40, 70, 90, 120 )ISAVE( 1 )
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 1)
-*     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY A*X.
-*
-   20 CONTINUE
-      IF( N.EQ.1 ) THEN
-         V( 1 ) = X( 1 )
-         EST = ABS( V( 1 ) )
-*        ... QUIT
-         GO TO 130
-      END IF
-      EST = DZSUM1( N, X, 1 )
-*
-      DO 30 I = 1, N
-         ABSXI = ABS( X( I ) )
-         IF( ABSXI.GT.SAFMIN ) THEN
-            X( I ) = DCMPLX( DBLE( X( I ) ) / ABSXI,
-     $               DIMAG( X( I ) ) / ABSXI )
-         ELSE
-            X( I ) = CONE
-         END IF
-   30 CONTINUE
-      KASE = 2
-      ISAVE( 1 ) = 2
-      RETURN
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 2)
-*     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY CTRANS(A)*X.
-*
-   40 CONTINUE
-      ISAVE( 2 ) = IZMAX1( N, X, 1 )
-      ISAVE( 3 ) = 2
-*
-*     MAIN LOOP - ITERATIONS 2,3,...,ITMAX.
-*
-   50 CONTINUE
-      DO 60 I = 1, N
-         X( I ) = CZERO
-   60 CONTINUE
-      X( ISAVE( 2 ) ) = CONE
-      KASE = 1
-      ISAVE( 1 ) = 3
-      RETURN
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 3)
-*     X HAS BEEN OVERWRITTEN BY A*X.
-*
-   70 CONTINUE
-      CALL ZCOPY( N, X, 1, V, 1 )
-      ESTOLD = EST
-      EST = DZSUM1( N, V, 1 )
-*
-*     TEST FOR CYCLING.
-      IF( EST.LE.ESTOLD )
-     $   GO TO 100
-*
-      DO 80 I = 1, N
-         ABSXI = ABS( X( I ) )
-         IF( ABSXI.GT.SAFMIN ) THEN
-            X( I ) = DCMPLX( DBLE( X( I ) ) / ABSXI,
-     $               DIMAG( X( I ) ) / ABSXI )
-         ELSE
-            X( I ) = CONE
-         END IF
-   80 CONTINUE
-      KASE = 2
-      ISAVE( 1 ) = 4
-      RETURN
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 4)
-*     X HAS BEEN OVERWRITTEN BY CTRANS(A)*X.
-*
-   90 CONTINUE
-      JLAST = ISAVE( 2 )
-      ISAVE( 2 ) = IZMAX1( N, X, 1 )
-      IF( ( ABS( X( JLAST ) ).NE.ABS( X( ISAVE( 2 ) ) ) ) .AND.
-     $    ( ISAVE( 3 ).LT.ITMAX ) ) THEN
-         ISAVE( 3 ) = ISAVE( 3 ) + 1
-         GO TO 50
-      END IF
-*
-*     ITERATION COMPLETE.  FINAL STAGE.
-*
-  100 CONTINUE
-      ALTSGN = ONE
-      DO 110 I = 1, N
-         X( I ) = DCMPLX( ALTSGN*( ONE+DBLE( I-1 ) / DBLE( N-1 ) ) )
-         ALTSGN = -ALTSGN
-  110 CONTINUE
-      KASE = 1
-      ISAVE( 1 ) = 5
-      RETURN
-*
-*     ................ ENTRY   (ISAVE( 1 ) = 5)
-*     X HAS BEEN OVERWRITTEN BY A*X.
-*
-  120 CONTINUE
-      TEMP = TWO*( DZSUM1( N, X, 1 ) / DBLE( 3*N ) )
-      IF( TEMP.GT.EST ) THEN
-         CALL ZCOPY( N, X, 1, V, 1 )
-         EST = TEMP
-      END IF
-*
-  130 CONTINUE
-      KASE = 0
-      RETURN
-*
-*     End of ZLACN2
-*
-      END
--- a/libcruft/lapack/zlacon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,212 +0,0 @@
-      SUBROUTINE ZLACON( N, V, X, EST, KASE )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            KASE, N
-      DOUBLE PRECISION   EST
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         V( N ), X( N )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLACON estimates the 1-norm of a square, complex matrix A.
-*  Reverse communication is used for evaluating matrix-vector products.
-*
-*  Arguments
-*  =========
-*
-*  N      (input) INTEGER
-*         The order of the matrix.  N >= 1.
-*
-*  V      (workspace) COMPLEX*16 array, dimension (N)
-*         On the final return, V = A*W,  where  EST = norm(V)/norm(W)
-*         (W is not returned).
-*
-*  X      (input/output) COMPLEX*16 array, dimension (N)
-*         On an intermediate return, X should be overwritten by
-*               A * X,   if KASE=1,
-*               A' * X,  if KASE=2,
-*         where A' is the conjugate transpose of A, and ZLACON must be
-*         re-called with all the other parameters unchanged.
-*
-*  EST    (input/output) DOUBLE PRECISION
-*         On entry with KASE = 1 or 2 and JUMP = 3, EST should be
-*         unchanged from the previous call to ZLACON.
-*         On exit, EST is an estimate (a lower bound) for norm(A). 
-*
-*  KASE   (input/output) INTEGER
-*         On the initial call to ZLACON, KASE should be 0.
-*         On an intermediate return, KASE will be 1 or 2, indicating
-*         whether X should be overwritten by A * X  or A' * X.
-*         On the final return from ZLACON, KASE will again be 0.
-*
-*  Further Details
-*  ======= =======
-*
-*  Contributed by Nick Higham, University of Manchester.
-*  Originally named CONEST, dated March 16, 1988.
-*
-*  Reference: N.J. Higham, "FORTRAN codes for estimating the one-norm of
-*  a real or complex matrix, with applications to condition estimation",
-*  ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988.
-*
-*  Last modified:  April, 1999
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            ITMAX
-      PARAMETER          ( ITMAX = 5 )
-      DOUBLE PRECISION   ONE, TWO
-      PARAMETER          ( ONE = 1.0D0, TWO = 2.0D0 )
-      COMPLEX*16         CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0D0, 0.0D0 ),
-     $                   CONE = ( 1.0D0, 0.0D0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ITER, J, JLAST, JUMP
-      DOUBLE PRECISION   ABSXI, ALTSGN, ESTOLD, SAFMIN, TEMP
-*     ..
-*     .. External Functions ..
-      INTEGER            IZMAX1
-      DOUBLE PRECISION   DLAMCH, DZSUM1
-      EXTERNAL           IZMAX1, DLAMCH, DZSUM1
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZCOPY
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCMPLX, DIMAG
-*     ..
-*     .. Save statement ..
-      SAVE
-*     ..
-*     .. Executable Statements ..
-*
-      SAFMIN = DLAMCH( 'Safe minimum' )
-      IF( KASE.EQ.0 ) THEN
-         DO 10 I = 1, N
-            X( I ) = DCMPLX( ONE / DBLE( N ) )
-   10    CONTINUE
-         KASE = 1
-         JUMP = 1
-         RETURN
-      END IF
-*
-      GO TO ( 20, 40, 70, 90, 120 )JUMP
-*
-*     ................ ENTRY   (JUMP = 1)
-*     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY A*X.
-*
-   20 CONTINUE
-      IF( N.EQ.1 ) THEN
-         V( 1 ) = X( 1 )
-         EST = ABS( V( 1 ) )
-*        ... QUIT
-         GO TO 130
-      END IF
-      EST = DZSUM1( N, X, 1 )
-*
-      DO 30 I = 1, N
-         ABSXI = ABS( X( I ) )
-         IF( ABSXI.GT.SAFMIN ) THEN
-            X( I ) = DCMPLX( DBLE( X( I ) ) / ABSXI,
-     $               DIMAG( X( I ) ) / ABSXI )
-         ELSE
-            X( I ) = CONE
-         END IF
-   30 CONTINUE
-      KASE = 2
-      JUMP = 2
-      RETURN
-*
-*     ................ ENTRY   (JUMP = 2)
-*     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY CTRANS(A)*X.
-*
-   40 CONTINUE
-      J = IZMAX1( N, X, 1 )
-      ITER = 2
-*
-*     MAIN LOOP - ITERATIONS 2,3,...,ITMAX.
-*
-   50 CONTINUE
-      DO 60 I = 1, N
-         X( I ) = CZERO
-   60 CONTINUE
-      X( J ) = CONE
-      KASE = 1
-      JUMP = 3
-      RETURN
-*
-*     ................ ENTRY   (JUMP = 3)
-*     X HAS BEEN OVERWRITTEN BY A*X.
-*
-   70 CONTINUE
-      CALL ZCOPY( N, X, 1, V, 1 )
-      ESTOLD = EST
-      EST = DZSUM1( N, V, 1 )
-*
-*     TEST FOR CYCLING.
-      IF( EST.LE.ESTOLD )
-     $   GO TO 100
-*
-      DO 80 I = 1, N
-         ABSXI = ABS( X( I ) )
-         IF( ABSXI.GT.SAFMIN ) THEN
-            X( I ) = DCMPLX( DBLE( X( I ) ) / ABSXI,
-     $               DIMAG( X( I ) ) / ABSXI )
-         ELSE
-            X( I ) = CONE
-         END IF
-   80 CONTINUE
-      KASE = 2
-      JUMP = 4
-      RETURN
-*
-*     ................ ENTRY   (JUMP = 4)
-*     X HAS BEEN OVERWRITTEN BY CTRANS(A)*X.
-*
-   90 CONTINUE
-      JLAST = J
-      J = IZMAX1( N, X, 1 )
-      IF( ( ABS( X( JLAST ) ).NE.ABS( X( J ) ) ) .AND.
-     $    ( ITER.LT.ITMAX ) ) THEN
-         ITER = ITER + 1
-         GO TO 50
-      END IF
-*
-*     ITERATION COMPLETE.  FINAL STAGE.
-*
-  100 CONTINUE
-      ALTSGN = ONE
-      DO 110 I = 1, N
-         X( I ) = DCMPLX( ALTSGN*( ONE+DBLE( I-1 ) / DBLE( N-1 ) ) )
-         ALTSGN = -ALTSGN
-  110 CONTINUE
-      KASE = 1
-      JUMP = 5
-      RETURN
-*
-*     ................ ENTRY   (JUMP = 5)
-*     X HAS BEEN OVERWRITTEN BY A*X.
-*
-  120 CONTINUE
-      TEMP = TWO*( DZSUM1( N, X, 1 ) / DBLE( 3*N ) )
-      IF( TEMP.GT.EST ) THEN
-         CALL ZCOPY( N, X, 1, V, 1 )
-         EST = TEMP
-      END IF
-*
-  130 CONTINUE
-      KASE = 0
-      RETURN
-*
-*     End of ZLACON
-*
-      END
--- a/libcruft/lapack/zlacpy.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-      SUBROUTINE ZLACPY( UPLO, M, N, A, LDA, B, LDB )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            LDA, LDB, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLACPY copies all or part of a two-dimensional matrix A to another
-*  matrix B.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies the part of the matrix A to be copied to B.
-*          = 'U':      Upper triangular part
-*          = 'L':      Lower triangular part
-*          Otherwise:  All of the matrix A
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input) COMPLEX*16 array, dimension (LDA,N)
-*          The m by n matrix A.  If UPLO = 'U', only the upper trapezium
-*          is accessed; if UPLO = 'L', only the lower trapezium is
-*          accessed.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  B       (output) COMPLEX*16 array, dimension (LDB,N)
-*          On exit, B = A in the locations specified by UPLO.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,M).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-      IF( LSAME( UPLO, 'U' ) ) THEN
-         DO 20 J = 1, N
-            DO 10 I = 1, MIN( J, M )
-               B( I, J ) = A( I, J )
-   10       CONTINUE
-   20    CONTINUE
-*
-      ELSE IF( LSAME( UPLO, 'L' ) ) THEN
-         DO 40 J = 1, N
-            DO 30 I = J, M
-               B( I, J ) = A( I, J )
-   30       CONTINUE
-   40    CONTINUE
-*
-      ELSE
-         DO 60 J = 1, N
-            DO 50 I = 1, M
-               B( I, J ) = A( I, J )
-   50       CONTINUE
-   60    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of ZLACPY
-*
-      END
--- a/libcruft/lapack/zladiv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-      COMPLEX*16     FUNCTION ZLADIV( X, Y )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      COMPLEX*16         X, Y
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLADIV := X / Y, where X and Y are complex.  The computation of X / Y
-*  will not overflow on an intermediary step unless the results
-*  overflows.
-*
-*  Arguments
-*  =========
-*
-*  X       (input) COMPLEX*16
-*  Y       (input) COMPLEX*16
-*          The complex scalars X and Y.
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      DOUBLE PRECISION   ZI, ZR
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLADIV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, DCMPLX, DIMAG
-*     ..
-*     .. Executable Statements ..
-*
-      CALL DLADIV( DBLE( X ), DIMAG( X ), DBLE( Y ), DIMAG( Y ), ZR,
-     $             ZI )
-      ZLADIV = DCMPLX( ZR, ZI )
-*
-      RETURN
-*
-*     End of ZLADIV
-*
-      END
--- a/libcruft/lapack/zlahqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,470 +0,0 @@
-      SUBROUTINE ZLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ,
-     $                   IHIZ, Z, LDZ, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, N
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         H( LDH, * ), W( * ), Z( LDZ, * )
-*     ..
-*
-*     Purpose
-*     =======
-*
-*     ZLAHQR is an auxiliary routine called by CHSEQR to update the
-*     eigenvalues and Schur decomposition already computed by CHSEQR, by
-*     dealing with the Hessenberg submatrix in rows and columns ILO to
-*     IHI.
-*
-*     Arguments
-*     =========
-*
-*     WANTT   (input) LOGICAL
-*          = .TRUE. : the full Schur form T is required;
-*          = .FALSE.: only eigenvalues are required.
-*
-*     WANTZ   (input) LOGICAL
-*          = .TRUE. : the matrix of Schur vectors Z is required;
-*          = .FALSE.: Schur vectors are not required.
-*
-*     N       (input) INTEGER
-*          The order of the matrix H.  N >= 0.
-*
-*     ILO     (input) INTEGER
-*     IHI     (input) INTEGER
-*          It is assumed that H is already upper triangular in rows and
-*          columns IHI+1:N, and that H(ILO,ILO-1) = 0 (unless ILO = 1).
-*          ZLAHQR works primarily with the Hessenberg submatrix in rows
-*          and columns ILO to IHI, but applies transformations to all of
-*          H if WANTT is .TRUE..
-*          1 <= ILO <= max(1,IHI); IHI <= N.
-*
-*     H       (input/output) COMPLEX*16 array, dimension (LDH,N)
-*          On entry, the upper Hessenberg matrix H.
-*          On exit, if INFO is zero and if WANTT is .TRUE., then H
-*          is upper triangular in rows and columns ILO:IHI.  If INFO
-*          is zero and if WANTT is .FALSE., then the contents of H
-*          are unspecified on exit.  The output state of H in case
-*          INF is positive is below under the description of INFO.
-*
-*     LDH     (input) INTEGER
-*          The leading dimension of the array H. LDH >= max(1,N).
-*
-*     W       (output) COMPLEX*16 array, dimension (N)
-*          The computed eigenvalues ILO to IHI are stored in the
-*          corresponding elements of W. If WANTT is .TRUE., the
-*          eigenvalues are stored in the same order as on the diagonal
-*          of the Schur form returned in H, with W(i) = H(i,i).
-*
-*     ILOZ    (input) INTEGER
-*     IHIZ    (input) INTEGER
-*          Specify the rows of Z to which transformations must be
-*          applied if WANTZ is .TRUE..
-*          1 <= ILOZ <= ILO; IHI <= IHIZ <= N.
-*
-*     Z       (input/output) COMPLEX*16 array, dimension (LDZ,N)
-*          If WANTZ is .TRUE., on entry Z must contain the current
-*          matrix Z of transformations accumulated by CHSEQR, and on
-*          exit Z has been updated; transformations are applied only to
-*          the submatrix Z(ILOZ:IHIZ,ILO:IHI).
-*          If WANTZ is .FALSE., Z is not referenced.
-*
-*     LDZ     (input) INTEGER
-*          The leading dimension of the array Z. LDZ >= max(1,N).
-*
-*     INFO    (output) INTEGER
-*           =   0: successful exit
-*          .GT. 0: if INFO = i, ZLAHQR failed to compute all the
-*                  eigenvalues ILO to IHI in a total of 30 iterations
-*                  per eigenvalue; elements i+1:ihi of W contain
-*                  those eigenvalues which have been successfully
-*                  computed.
-*
-*                  If INFO .GT. 0 and WANTT is .FALSE., then on exit,
-*                  the remaining unconverged eigenvalues are the
-*                  eigenvalues of the upper Hessenberg matrix
-*                  rows and columns ILO thorugh INFO of the final,
-*                  output value of H.
-*
-*                  If INFO .GT. 0 and WANTT is .TRUE., then on exit
-*          (*)       (initial value of H)*U  = U*(final value of H)
-*                  where U is an orthognal matrix.    The final
-*                  value of H is upper Hessenberg and triangular in
-*                  rows and columns INFO+1 through IHI.
-*
-*                  If INFO .GT. 0 and WANTZ is .TRUE., then on exit
-*                      (final value of Z)  = (initial value of Z)*U
-*                  where U is the orthogonal matrix in (*)
-*                  (regardless of the value of WANTT.)
-*
-*     Further Details
-*     ===============
-*
-*     02-96 Based on modifications by
-*     David Day, Sandia National Laboratory, USA
-*
-*     12-04 Further modifications by
-*     Ralph Byers, University of Kansas, USA
-*
-*       This is a modified version of ZLAHQR from LAPACK version 3.0.
-*       It is (1) more robust against overflow and underflow and
-*       (2) adopts the more conservative Ahues & Tisseur stopping
-*       criterion (LAWN 122, 1997).
-*
-*     =========================================================
-*
-*     .. Parameters ..
-      INTEGER            ITMAX
-      PARAMETER          ( ITMAX = 30 )
-      COMPLEX*16         ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0d0, 0.0d0 ),
-     $                   ONE = ( 1.0d0, 0.0d0 ) )
-      DOUBLE PRECISION   RZERO, RONE, HALF
-      PARAMETER          ( RZERO = 0.0d0, RONE = 1.0d0, HALF = 0.5d0 )
-      DOUBLE PRECISION   DAT1
-      PARAMETER          ( DAT1 = 3.0d0 / 4.0d0 )
-*     ..
-*     .. Local Scalars ..
-      COMPLEX*16         CDUM, H11, H11S, H22, SC, SUM, T, T1, TEMP, U,
-     $                   V2, X, Y
-      DOUBLE PRECISION   AA, AB, BA, BB, H10, H21, RTEMP, S, SAFMAX,
-     $                   SAFMIN, SMLNUM, SX, T2, TST, ULP
-      INTEGER            I, I1, I2, ITS, J, JHI, JLO, K, L, M, NH, NZ
-*     ..
-*     .. Local Arrays ..
-      COMPLEX*16         V( 2 )
-*     ..
-*     .. External Functions ..
-      COMPLEX*16         ZLADIV
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           ZLADIV, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLABAD, ZCOPY, ZLARFG, ZSCAL
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCONJG, DIMAG, MAX, MIN, SQRT
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( DBLE( CDUM ) ) + ABS( DIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-      IF( ILO.EQ.IHI ) THEN
-         W( ILO ) = H( ILO, ILO )
-         RETURN
-      END IF
-*
-*     ==== clear out the trash ====
-      DO 10 J = ILO, IHI - 3
-         H( J+2, J ) = ZERO
-         H( J+3, J ) = ZERO
-   10 CONTINUE
-      IF( ILO.LE.IHI-2 )
-     $   H( IHI, IHI-2 ) = ZERO
-*     ==== ensure that subdiagonal entries are real ====
-      DO 20 I = ILO + 1, IHI
-         IF( DIMAG( H( I, I-1 ) ).NE.RZERO ) THEN
-*           ==== The following redundant normalization
-*           .    avoids problems with both gradual and
-*           .    sudden underflow in ABS(H(I,I-1)) ====
-            SC = H( I, I-1 ) / CABS1( H( I, I-1 ) )
-            SC = DCONJG( SC ) / ABS( SC )
-            H( I, I-1 ) = ABS( H( I, I-1 ) )
-            IF( WANTT ) THEN
-               JLO = 1
-               JHI = N
-            ELSE
-               JLO = ILO
-               JHI = IHI
-            END IF
-            CALL ZSCAL( JHI-I+1, SC, H( I, I ), LDH )
-            CALL ZSCAL( MIN( JHI, I+1 )-JLO+1, DCONJG( SC ),
-     $                  H( JLO, I ), 1 )
-            IF( WANTZ )
-     $         CALL ZSCAL( IHIZ-ILOZ+1, DCONJG( SC ), Z( ILOZ, I ), 1 )
-         END IF
-   20 CONTINUE
-*
-      NH = IHI - ILO + 1
-      NZ = IHIZ - ILOZ + 1
-*
-*     Set machine-dependent constants for the stopping criterion.
-*
-      SAFMIN = DLAMCH( 'SAFE MINIMUM' )
-      SAFMAX = RONE / SAFMIN
-      CALL DLABAD( SAFMIN, SAFMAX )
-      ULP = DLAMCH( 'PRECISION' )
-      SMLNUM = SAFMIN*( DBLE( NH ) / ULP )
-*
-*     I1 and I2 are the indices of the first row and last column of H
-*     to which transformations must be applied. If eigenvalues only are
-*     being computed, I1 and I2 are set inside the main loop.
-*
-      IF( WANTT ) THEN
-         I1 = 1
-         I2 = N
-      END IF
-*
-*     The main loop begins here. I is the loop index and decreases from
-*     IHI to ILO in steps of 1. Each iteration of the loop works
-*     with the active submatrix in rows and columns L to I.
-*     Eigenvalues I+1 to IHI have already converged. Either L = ILO, or
-*     H(L,L-1) is negligible so that the matrix splits.
-*
-      I = IHI
-   30 CONTINUE
-      IF( I.LT.ILO )
-     $   GO TO 150
-*
-*     Perform QR iterations on rows and columns ILO to I until a
-*     submatrix of order 1 splits off at the bottom because a
-*     subdiagonal element has become negligible.
-*
-      L = ILO
-      DO 130 ITS = 0, ITMAX
-*
-*        Look for a single small subdiagonal element.
-*
-         DO 40 K = I, L + 1, -1
-            IF( CABS1( H( K, K-1 ) ).LE.SMLNUM )
-     $         GO TO 50
-            TST = CABS1( H( K-1, K-1 ) ) + CABS1( H( K, K ) )
-            IF( TST.EQ.ZERO ) THEN
-               IF( K-2.GE.ILO )
-     $            TST = TST + ABS( DBLE( H( K-1, K-2 ) ) )
-               IF( K+1.LE.IHI )
-     $            TST = TST + ABS( DBLE( H( K+1, K ) ) )
-            END IF
-*           ==== The following is a conservative small subdiagonal
-*           .    deflation criterion due to Ahues & Tisseur (LAWN 122,
-*           .    1997). It has better mathematical foundation and
-*           .    improves accuracy in some examples.  ====
-            IF( ABS( DBLE( H( K, K-1 ) ) ).LE.ULP*TST ) THEN
-               AB = MAX( CABS1( H( K, K-1 ) ), CABS1( H( K-1, K ) ) )
-               BA = MIN( CABS1( H( K, K-1 ) ), CABS1( H( K-1, K ) ) )
-               AA = MAX( CABS1( H( K, K ) ),
-     $              CABS1( H( K-1, K-1 )-H( K, K ) ) )
-               BB = MIN( CABS1( H( K, K ) ),
-     $              CABS1( H( K-1, K-1 )-H( K, K ) ) )
-               S = AA + AB
-               IF( BA*( AB / S ).LE.MAX( SMLNUM,
-     $             ULP*( BB*( AA / S ) ) ) )GO TO 50
-            END IF
-   40    CONTINUE
-   50    CONTINUE
-         L = K
-         IF( L.GT.ILO ) THEN
-*
-*           H(L,L-1) is negligible
-*
-            H( L, L-1 ) = ZERO
-         END IF
-*
-*        Exit from loop if a submatrix of order 1 has split off.
-*
-         IF( L.GE.I )
-     $      GO TO 140
-*
-*        Now the active submatrix is in rows and columns L to I. If
-*        eigenvalues only are being computed, only the active submatrix
-*        need be transformed.
-*
-         IF( .NOT.WANTT ) THEN
-            I1 = L
-            I2 = I
-         END IF
-*
-         IF( ITS.EQ.10 .OR. ITS.EQ.20 ) THEN
-*
-*           Exceptional shift.
-*
-            S = DAT1*ABS( DBLE( H( I, I-1 ) ) )
-            T = S + H( I, I )
-         ELSE
-*
-*           Wilkinson's shift.
-*
-            T = H( I, I )
-            U = SQRT( H( I-1, I ) )*SQRT( H( I, I-1 ) )
-            S = CABS1( U )
-            IF( S.NE.RZERO ) THEN
-               X = HALF*( H( I-1, I-1 )-T )
-               SX = CABS1( X )
-               S = MAX( S, CABS1( X ) )
-               Y = S*SQRT( ( X / S )**2+( U / S )**2 )
-               IF( SX.GT.RZERO ) THEN
-                  IF( DBLE( X / SX )*DBLE( Y )+DIMAG( X / SX )*
-     $                DIMAG( Y ).LT.RZERO )Y = -Y
-               END IF
-               T = T - U*ZLADIV( U, ( X+Y ) )
-            END IF
-         END IF
-*
-*        Look for two consecutive small subdiagonal elements.
-*
-         DO 60 M = I - 1, L + 1, -1
-*
-*           Determine the effect of starting the single-shift QR
-*           iteration at row M, and see if this would make H(M,M-1)
-*           negligible.
-*
-            H11 = H( M, M )
-            H22 = H( M+1, M+1 )
-            H11S = H11 - T
-            H21 = H( M+1, M )
-            S = CABS1( H11S ) + ABS( H21 )
-            H11S = H11S / S
-            H21 = H21 / S
-            V( 1 ) = H11S
-            V( 2 ) = H21
-            H10 = H( M, M-1 )
-            IF( ABS( H10 )*ABS( H21 ).LE.ULP*
-     $          ( CABS1( H11S )*( CABS1( H11 )+CABS1( H22 ) ) ) )
-     $          GO TO 70
-   60    CONTINUE
-         H11 = H( L, L )
-         H22 = H( L+1, L+1 )
-         H11S = H11 - T
-         H21 = H( L+1, L )
-         S = CABS1( H11S ) + ABS( H21 )
-         H11S = H11S / S
-         H21 = H21 / S
-         V( 1 ) = H11S
-         V( 2 ) = H21
-   70    CONTINUE
-*
-*        Single-shift QR step
-*
-         DO 120 K = M, I - 1
-*
-*           The first iteration of this loop determines a reflection G
-*           from the vector V and applies it from left and right to H,
-*           thus creating a nonzero bulge below the subdiagonal.
-*
-*           Each subsequent iteration determines a reflection G to
-*           restore the Hessenberg form in the (K-1)th column, and thus
-*           chases the bulge one step toward the bottom of the active
-*           submatrix.
-*
-*           V(2) is always real before the call to ZLARFG, and hence
-*           after the call T2 ( = T1*V(2) ) is also real.
-*
-            IF( K.GT.M )
-     $         CALL ZCOPY( 2, H( K, K-1 ), 1, V, 1 )
-            CALL ZLARFG( 2, V( 1 ), V( 2 ), 1, T1 )
-            IF( K.GT.M ) THEN
-               H( K, K-1 ) = V( 1 )
-               H( K+1, K-1 ) = ZERO
-            END IF
-            V2 = V( 2 )
-            T2 = DBLE( T1*V2 )
-*
-*           Apply G from the left to transform the rows of the matrix
-*           in columns K to I2.
-*
-            DO 80 J = K, I2
-               SUM = DCONJG( T1 )*H( K, J ) + T2*H( K+1, J )
-               H( K, J ) = H( K, J ) - SUM
-               H( K+1, J ) = H( K+1, J ) - SUM*V2
-   80       CONTINUE
-*
-*           Apply G from the right to transform the columns of the
-*           matrix in rows I1 to min(K+2,I).
-*
-            DO 90 J = I1, MIN( K+2, I )
-               SUM = T1*H( J, K ) + T2*H( J, K+1 )
-               H( J, K ) = H( J, K ) - SUM
-               H( J, K+1 ) = H( J, K+1 ) - SUM*DCONJG( V2 )
-   90       CONTINUE
-*
-            IF( WANTZ ) THEN
-*
-*              Accumulate transformations in the matrix Z
-*
-               DO 100 J = ILOZ, IHIZ
-                  SUM = T1*Z( J, K ) + T2*Z( J, K+1 )
-                  Z( J, K ) = Z( J, K ) - SUM
-                  Z( J, K+1 ) = Z( J, K+1 ) - SUM*DCONJG( V2 )
-  100          CONTINUE
-            END IF
-*
-            IF( K.EQ.M .AND. M.GT.L ) THEN
-*
-*              If the QR step was started at row M > L because two
-*              consecutive small subdiagonals were found, then extra
-*              scaling must be performed to ensure that H(M,M-1) remains
-*              real.
-*
-               TEMP = ONE - T1
-               TEMP = TEMP / ABS( TEMP )
-               H( M+1, M ) = H( M+1, M )*DCONJG( TEMP )
-               IF( M+2.LE.I )
-     $            H( M+2, M+1 ) = H( M+2, M+1 )*TEMP
-               DO 110 J = M, I
-                  IF( J.NE.M+1 ) THEN
-                     IF( I2.GT.J )
-     $                  CALL ZSCAL( I2-J, TEMP, H( J, J+1 ), LDH )
-                     CALL ZSCAL( J-I1, DCONJG( TEMP ), H( I1, J ), 1 )
-                     IF( WANTZ ) THEN
-                        CALL ZSCAL( NZ, DCONJG( TEMP ), Z( ILOZ, J ),
-     $                              1 )
-                     END IF
-                  END IF
-  110          CONTINUE
-            END IF
-  120    CONTINUE
-*
-*        Ensure that H(I,I-1) is real.
-*
-         TEMP = H( I, I-1 )
-         IF( DIMAG( TEMP ).NE.RZERO ) THEN
-            RTEMP = ABS( TEMP )
-            H( I, I-1 ) = RTEMP
-            TEMP = TEMP / RTEMP
-            IF( I2.GT.I )
-     $         CALL ZSCAL( I2-I, DCONJG( TEMP ), H( I, I+1 ), LDH )
-            CALL ZSCAL( I-I1, TEMP, H( I1, I ), 1 )
-            IF( WANTZ ) THEN
-               CALL ZSCAL( NZ, TEMP, Z( ILOZ, I ), 1 )
-            END IF
-         END IF
-*
-  130 CONTINUE
-*
-*     Failure to converge in remaining number of iterations
-*
-      INFO = I
-      RETURN
-*
-  140 CONTINUE
-*
-*     H(I,I-1) is negligible: one eigenvalue has converged.
-*
-      W( I ) = H( I, I )
-*
-*     return to start of the main loop with new value of I.
-*
-      I = L - 1
-      GO TO 30
-*
-  150 CONTINUE
-      RETURN
-*
-*     End of ZLAHQR
-*
-      END
--- a/libcruft/lapack/zlahr2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,240 +0,0 @@
-      SUBROUTINE ZLAHR2( N, K, NB, A, LDA, TAU, T, LDT, Y, LDY )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            K, LDA, LDT, LDY, N, NB
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16        A( LDA, * ), T( LDT, NB ), TAU( NB ),
-     $                   Y( LDY, NB )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLAHR2 reduces the first NB columns of A complex general n-BY-(n-k+1)
-*  matrix A so that elements below the k-th subdiagonal are zero. The
-*  reduction is performed by an unitary similarity transformation
-*  Q' * A * Q. The routine returns the matrices V and T which determine
-*  Q as a block reflector I - V*T*V', and also the matrix Y = A * V * T.
-*
-*  This is an auxiliary routine called by ZGEHRD.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  K       (input) INTEGER
-*          The offset for the reduction. Elements below the k-th
-*          subdiagonal in the first NB columns are reduced to zero.
-*          K < N.
-*
-*  NB      (input) INTEGER
-*          The number of columns to be reduced.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N-K+1)
-*          On entry, the n-by-(n-k+1) general matrix A.
-*          On exit, the elements on and above the k-th subdiagonal in
-*          the first NB columns are overwritten with the corresponding
-*          elements of the reduced matrix; the elements below the k-th
-*          subdiagonal, with the array TAU, represent the matrix Q as a
-*          product of elementary reflectors. The other columns of A are
-*          unchanged. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  TAU     (output) COMPLEX*16 array, dimension (NB)
-*          The scalar factors of the elementary reflectors. See Further
-*          Details.
-*
-*  T       (output) COMPLEX*16 array, dimension (LDT,NB)
-*          The upper triangular matrix T.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T.  LDT >= NB.
-*
-*  Y       (output) COMPLEX*16 array, dimension (LDY,NB)
-*          The n-by-nb matrix Y.
-*
-*  LDY     (input) INTEGER
-*          The leading dimension of the array Y. LDY >= N.
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of nb elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(nb).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i+k-1) = 0, v(i+k) = 1; v(i+k+1:n) is stored on exit in
-*  A(i+k+1:n,i), and tau in TAU(i).
-*
-*  The elements of the vectors v together form the (n-k+1)-by-nb matrix
-*  V which is needed, with T and Y, to apply the transformation to the
-*  unreduced part of the matrix, using an update of the form:
-*  A := (I - V*T*V') * (A - Y*V').
-*
-*  The contents of A on exit are illustrated by the following example
-*  with n = 7, k = 3 and nb = 2:
-*
-*     ( a   a   a   a   a )
-*     ( a   a   a   a   a )
-*     ( a   a   a   a   a )
-*     ( h   h   a   a   a )
-*     ( v1  h   a   a   a )
-*     ( v1  v2  a   a   a )
-*     ( v1  v2  a   a   a )
-*
-*  where a denotes an element of the original matrix A, h denotes a
-*  modified element of the upper Hessenberg matrix H, and vi denotes an
-*  element of the vector defining H(i).
-*
-*  This file is a slight modification of LAPACK-3.0's ZLAHRD
-*  incorporating improvements proposed by Quintana-Orti and Van de
-*  Gejin. Note that the entries of A(1:K,2:NB) differ from those
-*  returned by the original LAPACK routine. This function is
-*  not backward compatible with LAPACK3.0.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16        ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ), 
-     $                     ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      COMPLEX*16        EI
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZAXPY, ZCOPY, ZGEMM, ZGEMV, ZLACPY,
-     $                   ZLARFG, ZSCAL, ZTRMM, ZTRMV, ZLACGV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 )
-     $   RETURN
-*
-      DO 10 I = 1, NB
-         IF( I.GT.1 ) THEN
-*
-*           Update A(K+1:N,I)
-*
-*           Update I-th column of A - Y * V'
-*
-            CALL ZLACGV( I-1, A( K+I-1, 1 ), LDA ) 
-            CALL ZGEMV( 'NO TRANSPOSE', N-K, I-1, -ONE, Y(K+1,1), LDY,
-     $                  A( K+I-1, 1 ), LDA, ONE, A( K+1, I ), 1 )
-            CALL ZLACGV( I-1, A( K+I-1, 1 ), LDA ) 
-*
-*           Apply I - V * T' * V' to this column (call it b) from the
-*           left, using the last column of T as workspace
-*
-*           Let  V = ( V1 )   and   b = ( b1 )   (first I-1 rows)
-*                    ( V2 )             ( b2 )
-*
-*           where V1 is unit lower triangular
-*
-*           w := V1' * b1
-*
-            CALL ZCOPY( I-1, A( K+1, I ), 1, T( 1, NB ), 1 )
-            CALL ZTRMV( 'Lower', 'Conjugate transpose', 'UNIT', 
-     $                  I-1, A( K+1, 1 ),
-     $                  LDA, T( 1, NB ), 1 )
-*
-*           w := w + V2'*b2
-*
-            CALL ZGEMV( 'Conjugate transpose', N-K-I+1, I-1, 
-     $                  ONE, A( K+I, 1 ),
-     $                  LDA, A( K+I, I ), 1, ONE, T( 1, NB ), 1 )
-*
-*           w := T'*w
-*
-            CALL ZTRMV( 'Upper', 'Conjugate transpose', 'NON-UNIT', 
-     $                  I-1, T, LDT,
-     $                  T( 1, NB ), 1 )
-*
-*           b2 := b2 - V2*w
-*
-            CALL ZGEMV( 'NO TRANSPOSE', N-K-I+1, I-1, -ONE, 
-     $                  A( K+I, 1 ),
-     $                  LDA, T( 1, NB ), 1, ONE, A( K+I, I ), 1 )
-*
-*           b1 := b1 - V1*w
-*
-            CALL ZTRMV( 'Lower', 'NO TRANSPOSE', 
-     $                  'UNIT', I-1,
-     $                  A( K+1, 1 ), LDA, T( 1, NB ), 1 )
-            CALL ZAXPY( I-1, -ONE, T( 1, NB ), 1, A( K+1, I ), 1 )
-*
-            A( K+I-1, I-1 ) = EI
-         END IF
-*
-*        Generate the elementary reflector H(I) to annihilate
-*        A(K+I+1:N,I)
-*
-         CALL ZLARFG( N-K-I+1, A( K+I, I ), A( MIN( K+I+1, N ), I ), 1,
-     $                TAU( I ) )
-         EI = A( K+I, I )
-         A( K+I, I ) = ONE
-*
-*        Compute  Y(K+1:N,I)
-*
-         CALL ZGEMV( 'NO TRANSPOSE', N-K, N-K-I+1, 
-     $               ONE, A( K+1, I+1 ),
-     $               LDA, A( K+I, I ), 1, ZERO, Y( K+1, I ), 1 )
-         CALL ZGEMV( 'Conjugate transpose', N-K-I+1, I-1, 
-     $               ONE, A( K+I, 1 ), LDA,
-     $               A( K+I, I ), 1, ZERO, T( 1, I ), 1 )
-         CALL ZGEMV( 'NO TRANSPOSE', N-K, I-1, -ONE, 
-     $               Y( K+1, 1 ), LDY,
-     $               T( 1, I ), 1, ONE, Y( K+1, I ), 1 )
-         CALL ZSCAL( N-K, TAU( I ), Y( K+1, I ), 1 )
-*
-*        Compute T(1:I,I)
-*
-         CALL ZSCAL( I-1, -TAU( I ), T( 1, I ), 1 )
-         CALL ZTRMV( 'Upper', 'No Transpose', 'NON-UNIT', 
-     $               I-1, T, LDT,
-     $               T( 1, I ), 1 )
-         T( I, I ) = TAU( I )
-*
-   10 CONTINUE
-      A( K+NB, NB ) = EI
-*
-*     Compute Y(1:K,1:NB)
-*
-      CALL ZLACPY( 'ALL', K, NB, A( 1, 2 ), LDA, Y, LDY )
-      CALL ZTRMM( 'RIGHT', 'Lower', 'NO TRANSPOSE', 
-     $            'UNIT', K, NB,
-     $            ONE, A( K+1, 1 ), LDA, Y, LDY )
-      IF( N.GT.K+NB )
-     $   CALL ZGEMM( 'NO TRANSPOSE', 'NO TRANSPOSE', K, 
-     $               NB, N-K-NB, ONE,
-     $               A( 1, 2+NB ), LDA, A( K+1+NB, 1 ), LDA, ONE, Y,
-     $               LDY )
-      CALL ZTRMM( 'RIGHT', 'Upper', 'NO TRANSPOSE', 
-     $            'NON-UNIT', K, NB,
-     $            ONE, T, LDT, Y, LDY )
-*
-      RETURN
-*
-*     End of ZLAHR2
-*
-      END
--- a/libcruft/lapack/zlahrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,213 +0,0 @@
-      SUBROUTINE ZLAHRD( N, K, NB, A, LDA, TAU, T, LDT, Y, LDY )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            K, LDA, LDT, LDY, N, NB
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), T( LDT, NB ), TAU( NB ),
-     $                   Y( LDY, NB )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLAHRD reduces the first NB columns of a complex general n-by-(n-k+1)
-*  matrix A so that elements below the k-th subdiagonal are zero. The
-*  reduction is performed by a unitary similarity transformation
-*  Q' * A * Q. The routine returns the matrices V and T which determine
-*  Q as a block reflector I - V*T*V', and also the matrix Y = A * V * T.
-*
-*  This is an OBSOLETE auxiliary routine. 
-*  This routine will be 'deprecated' in a  future release.
-*  Please use the new routine ZLAHR2 instead.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  K       (input) INTEGER
-*          The offset for the reduction. Elements below the k-th
-*          subdiagonal in the first NB columns are reduced to zero.
-*
-*  NB      (input) INTEGER
-*          The number of columns to be reduced.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N-K+1)
-*          On entry, the n-by-(n-k+1) general matrix A.
-*          On exit, the elements on and above the k-th subdiagonal in
-*          the first NB columns are overwritten with the corresponding
-*          elements of the reduced matrix; the elements below the k-th
-*          subdiagonal, with the array TAU, represent the matrix Q as a
-*          product of elementary reflectors. The other columns of A are
-*          unchanged. See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  TAU     (output) COMPLEX*16 array, dimension (NB)
-*          The scalar factors of the elementary reflectors. See Further
-*          Details.
-*
-*  T       (output) COMPLEX*16 array, dimension (LDT,NB)
-*          The upper triangular matrix T.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T.  LDT >= NB.
-*
-*  Y       (output) COMPLEX*16 array, dimension (LDY,NB)
-*          The n-by-nb matrix Y.
-*
-*  LDY     (input) INTEGER
-*          The leading dimension of the array Y. LDY >= max(1,N).
-*
-*  Further Details
-*  ===============
-*
-*  The matrix Q is represented as a product of nb elementary reflectors
-*
-*     Q = H(1) H(2) . . . H(nb).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i+k-1) = 0, v(i+k) = 1; v(i+k+1:n) is stored on exit in
-*  A(i+k+1:n,i), and tau in TAU(i).
-*
-*  The elements of the vectors v together form the (n-k+1)-by-nb matrix
-*  V which is needed, with T and Y, to apply the transformation to the
-*  unreduced part of the matrix, using an update of the form:
-*  A := (I - V*T*V') * (A - Y*V').
-*
-*  The contents of A on exit are illustrated by the following example
-*  with n = 7, k = 3 and nb = 2:
-*
-*     ( a   h   a   a   a )
-*     ( a   h   a   a   a )
-*     ( a   h   a   a   a )
-*     ( h   h   a   a   a )
-*     ( v1  h   a   a   a )
-*     ( v1  v2  a   a   a )
-*     ( v1  v2  a   a   a )
-*
-*  where a denotes an element of the original matrix A, h denotes a
-*  modified element of the upper Hessenberg matrix H, and vi denotes an
-*  element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ),
-     $                   ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      COMPLEX*16         EI
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZAXPY, ZCOPY, ZGEMV, ZLACGV, ZLARFG, ZSCAL,
-     $                   ZTRMV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 )
-     $   RETURN
-*
-      DO 10 I = 1, NB
-         IF( I.GT.1 ) THEN
-*
-*           Update A(1:n,i)
-*
-*           Compute i-th column of A - Y * V'
-*
-            CALL ZLACGV( I-1, A( K+I-1, 1 ), LDA )
-            CALL ZGEMV( 'No transpose', N, I-1, -ONE, Y, LDY,
-     $                  A( K+I-1, 1 ), LDA, ONE, A( 1, I ), 1 )
-            CALL ZLACGV( I-1, A( K+I-1, 1 ), LDA )
-*
-*           Apply I - V * T' * V' to this column (call it b) from the
-*           left, using the last column of T as workspace
-*
-*           Let  V = ( V1 )   and   b = ( b1 )   (first I-1 rows)
-*                    ( V2 )             ( b2 )
-*
-*           where V1 is unit lower triangular
-*
-*           w := V1' * b1
-*
-            CALL ZCOPY( I-1, A( K+1, I ), 1, T( 1, NB ), 1 )
-            CALL ZTRMV( 'Lower', 'Conjugate transpose', 'Unit', I-1,
-     $                  A( K+1, 1 ), LDA, T( 1, NB ), 1 )
-*
-*           w := w + V2'*b2
-*
-            CALL ZGEMV( 'Conjugate transpose', N-K-I+1, I-1, ONE,
-     $                  A( K+I, 1 ), LDA, A( K+I, I ), 1, ONE,
-     $                  T( 1, NB ), 1 )
-*
-*           w := T'*w
-*
-            CALL ZTRMV( 'Upper', 'Conjugate transpose', 'Non-unit', I-1,
-     $                  T, LDT, T( 1, NB ), 1 )
-*
-*           b2 := b2 - V2*w
-*
-            CALL ZGEMV( 'No transpose', N-K-I+1, I-1, -ONE, A( K+I, 1 ),
-     $                  LDA, T( 1, NB ), 1, ONE, A( K+I, I ), 1 )
-*
-*           b1 := b1 - V1*w
-*
-            CALL ZTRMV( 'Lower', 'No transpose', 'Unit', I-1,
-     $                  A( K+1, 1 ), LDA, T( 1, NB ), 1 )
-            CALL ZAXPY( I-1, -ONE, T( 1, NB ), 1, A( K+1, I ), 1 )
-*
-            A( K+I-1, I-1 ) = EI
-         END IF
-*
-*        Generate the elementary reflector H(i) to annihilate
-*        A(k+i+1:n,i)
-*
-         EI = A( K+I, I )
-         CALL ZLARFG( N-K-I+1, EI, A( MIN( K+I+1, N ), I ), 1,
-     $                TAU( I ) )
-         A( K+I, I ) = ONE
-*
-*        Compute  Y(1:n,i)
-*
-         CALL ZGEMV( 'No transpose', N, N-K-I+1, ONE, A( 1, I+1 ), LDA,
-     $               A( K+I, I ), 1, ZERO, Y( 1, I ), 1 )
-         CALL ZGEMV( 'Conjugate transpose', N-K-I+1, I-1, ONE,
-     $               A( K+I, 1 ), LDA, A( K+I, I ), 1, ZERO, T( 1, I ),
-     $               1 )
-         CALL ZGEMV( 'No transpose', N, I-1, -ONE, Y, LDY, T( 1, I ), 1,
-     $               ONE, Y( 1, I ), 1 )
-         CALL ZSCAL( N, TAU( I ), Y( 1, I ), 1 )
-*
-*        Compute T(1:i,i)
-*
-         CALL ZSCAL( I-1, -TAU( I ), T( 1, I ), 1 )
-         CALL ZTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, LDT,
-     $               T( 1, I ), 1 )
-         T( I, I ) = TAU( I )
-*
-   10 CONTINUE
-      A( K+NB, NB ) = EI
-*
-      RETURN
-*
-*     End of ZLAHRD
-*
-      END
--- a/libcruft/lapack/zlaic1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,295 +0,0 @@
-      SUBROUTINE ZLAIC1( JOB, J, X, SEST, W, GAMMA, SESTPR, S, C )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            J, JOB
-      DOUBLE PRECISION   SEST, SESTPR
-      COMPLEX*16         C, GAMMA, S
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         W( J ), X( J )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLAIC1 applies one step of incremental condition estimation in
-*  its simplest version:
-*
-*  Let x, twonorm(x) = 1, be an approximate singular vector of an j-by-j
-*  lower triangular matrix L, such that
-*           twonorm(L*x) = sest
-*  Then ZLAIC1 computes sestpr, s, c such that
-*  the vector
-*                  [ s*x ]
-*           xhat = [  c  ]
-*  is an approximate singular vector of
-*                  [ L     0  ]
-*           Lhat = [ w' gamma ]
-*  in the sense that
-*           twonorm(Lhat*xhat) = sestpr.
-*
-*  Depending on JOB, an estimate for the largest or smallest singular
-*  value is computed.
-*
-*  Note that [s c]' and sestpr**2 is an eigenpair of the system
-*
-*      diag(sest*sest, 0) + [alpha  gamma] * [ conjg(alpha) ]
-*                                            [ conjg(gamma) ]
-*
-*  where  alpha =  conjg(x)'*w.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) INTEGER
-*          = 1: an estimate for the largest singular value is computed.
-*          = 2: an estimate for the smallest singular value is computed.
-*
-*  J       (input) INTEGER
-*          Length of X and W
-*
-*  X       (input) COMPLEX*16 array, dimension (J)
-*          The j-vector x.
-*
-*  SEST    (input) DOUBLE PRECISION
-*          Estimated singular value of j by j matrix L
-*
-*  W       (input) COMPLEX*16 array, dimension (J)
-*          The j-vector w.
-*
-*  GAMMA   (input) COMPLEX*16
-*          The diagonal element gamma.
-*
-*  SESTPR  (output) DOUBLE PRECISION
-*          Estimated singular value of (j+1) by (j+1) matrix Lhat.
-*
-*  S       (output) COMPLEX*16
-*          Sine needed in forming xhat.
-*
-*  C       (output) COMPLEX*16
-*          Cosine needed in forming xhat.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0 )
-      DOUBLE PRECISION   HALF, FOUR
-      PARAMETER          ( HALF = 0.5D0, FOUR = 4.0D0 )
-*     ..
-*     .. Local Scalars ..
-      DOUBLE PRECISION   ABSALP, ABSEST, ABSGAM, B, EPS, NORMA, S1, S2,
-     $                   SCL, T, TEST, TMP, ZETA1, ZETA2
-      COMPLEX*16         ALPHA, COSINE, SINE
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DCONJG, MAX, SQRT
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH
-      COMPLEX*16         ZDOTC
-      EXTERNAL           DLAMCH, ZDOTC
-*     ..
-*     .. Executable Statements ..
-*
-      EPS = DLAMCH( 'Epsilon' )
-      ALPHA = ZDOTC( J, X, 1, W, 1 )
-*
-      ABSALP = ABS( ALPHA )
-      ABSGAM = ABS( GAMMA )
-      ABSEST = ABS( SEST )
-*
-      IF( JOB.EQ.1 ) THEN
-*
-*        Estimating largest singular value
-*
-*        special cases
-*
-         IF( SEST.EQ.ZERO ) THEN
-            S1 = MAX( ABSGAM, ABSALP )
-            IF( S1.EQ.ZERO ) THEN
-               S = ZERO
-               C = ONE
-               SESTPR = ZERO
-            ELSE
-               S = ALPHA / S1
-               C = GAMMA / S1
-               TMP = SQRT( S*DCONJG( S )+C*DCONJG( C ) )
-               S = S / TMP
-               C = C / TMP
-               SESTPR = S1*TMP
-            END IF
-            RETURN
-         ELSE IF( ABSGAM.LE.EPS*ABSEST ) THEN
-            S = ONE
-            C = ZERO
-            TMP = MAX( ABSEST, ABSALP )
-            S1 = ABSEST / TMP
-            S2 = ABSALP / TMP
-            SESTPR = TMP*SQRT( S1*S1+S2*S2 )
-            RETURN
-         ELSE IF( ABSALP.LE.EPS*ABSEST ) THEN
-            S1 = ABSGAM
-            S2 = ABSEST
-            IF( S1.LE.S2 ) THEN
-               S = ONE
-               C = ZERO
-               SESTPR = S2
-            ELSE
-               S = ZERO
-               C = ONE
-               SESTPR = S1
-            END IF
-            RETURN
-         ELSE IF( ABSEST.LE.EPS*ABSALP .OR. ABSEST.LE.EPS*ABSGAM ) THEN
-            S1 = ABSGAM
-            S2 = ABSALP
-            IF( S1.LE.S2 ) THEN
-               TMP = S1 / S2
-               SCL = SQRT( ONE+TMP*TMP )
-               SESTPR = S2*SCL
-               S = ( ALPHA / S2 ) / SCL
-               C = ( GAMMA / S2 ) / SCL
-            ELSE
-               TMP = S2 / S1
-               SCL = SQRT( ONE+TMP*TMP )
-               SESTPR = S1*SCL
-               S = ( ALPHA / S1 ) / SCL
-               C = ( GAMMA / S1 ) / SCL
-            END IF
-            RETURN
-         ELSE
-*
-*           normal case
-*
-            ZETA1 = ABSALP / ABSEST
-            ZETA2 = ABSGAM / ABSEST
-*
-            B = ( ONE-ZETA1*ZETA1-ZETA2*ZETA2 )*HALF
-            C = ZETA1*ZETA1
-            IF( B.GT.ZERO ) THEN
-               T = C / ( B+SQRT( B*B+C ) )
-            ELSE
-               T = SQRT( B*B+C ) - B
-            END IF
-*
-            SINE = -( ALPHA / ABSEST ) / T
-            COSINE = -( GAMMA / ABSEST ) / ( ONE+T )
-            TMP = SQRT( SINE*DCONJG( SINE )+COSINE*DCONJG( COSINE ) )
-            S = SINE / TMP
-            C = COSINE / TMP
-            SESTPR = SQRT( T+ONE )*ABSEST
-            RETURN
-         END IF
-*
-      ELSE IF( JOB.EQ.2 ) THEN
-*
-*        Estimating smallest singular value
-*
-*        special cases
-*
-         IF( SEST.EQ.ZERO ) THEN
-            SESTPR = ZERO
-            IF( MAX( ABSGAM, ABSALP ).EQ.ZERO ) THEN
-               SINE = ONE
-               COSINE = ZERO
-            ELSE
-               SINE = -DCONJG( GAMMA )
-               COSINE = DCONJG( ALPHA )
-            END IF
-            S1 = MAX( ABS( SINE ), ABS( COSINE ) )
-            S = SINE / S1
-            C = COSINE / S1
-            TMP = SQRT( S*DCONJG( S )+C*DCONJG( C ) )
-            S = S / TMP
-            C = C / TMP
-            RETURN
-         ELSE IF( ABSGAM.LE.EPS*ABSEST ) THEN
-            S = ZERO
-            C = ONE
-            SESTPR = ABSGAM
-            RETURN
-         ELSE IF( ABSALP.LE.EPS*ABSEST ) THEN
-            S1 = ABSGAM
-            S2 = ABSEST
-            IF( S1.LE.S2 ) THEN
-               S = ZERO
-               C = ONE
-               SESTPR = S1
-            ELSE
-               S = ONE
-               C = ZERO
-               SESTPR = S2
-            END IF
-            RETURN
-         ELSE IF( ABSEST.LE.EPS*ABSALP .OR. ABSEST.LE.EPS*ABSGAM ) THEN
-            S1 = ABSGAM
-            S2 = ABSALP
-            IF( S1.LE.S2 ) THEN
-               TMP = S1 / S2
-               SCL = SQRT( ONE+TMP*TMP )
-               SESTPR = ABSEST*( TMP / SCL )
-               S = -( DCONJG( GAMMA ) / S2 ) / SCL
-               C = ( DCONJG( ALPHA ) / S2 ) / SCL
-            ELSE
-               TMP = S2 / S1
-               SCL = SQRT( ONE+TMP*TMP )
-               SESTPR = ABSEST / SCL
-               S = -( DCONJG( GAMMA ) / S1 ) / SCL
-               C = ( DCONJG( ALPHA ) / S1 ) / SCL
-            END IF
-            RETURN
-         ELSE
-*
-*           normal case
-*
-            ZETA1 = ABSALP / ABSEST
-            ZETA2 = ABSGAM / ABSEST
-*
-            NORMA = MAX( ONE+ZETA1*ZETA1+ZETA1*ZETA2,
-     $              ZETA1*ZETA2+ZETA2*ZETA2 )
-*
-*           See if root is closer to zero or to ONE
-*
-            TEST = ONE + TWO*( ZETA1-ZETA2 )*( ZETA1+ZETA2 )
-            IF( TEST.GE.ZERO ) THEN
-*
-*              root is close to zero, compute directly
-*
-               B = ( ZETA1*ZETA1+ZETA2*ZETA2+ONE )*HALF
-               C = ZETA2*ZETA2
-               T = C / ( B+SQRT( ABS( B*B-C ) ) )
-               SINE = ( ALPHA / ABSEST ) / ( ONE-T )
-               COSINE = -( GAMMA / ABSEST ) / T
-               SESTPR = SQRT( T+FOUR*EPS*EPS*NORMA )*ABSEST
-            ELSE
-*
-*              root is closer to ONE, shift by that amount
-*
-               B = ( ZETA2*ZETA2+ZETA1*ZETA1-ONE )*HALF
-               C = ZETA1*ZETA1
-               IF( B.GE.ZERO ) THEN
-                  T = -C / ( B+SQRT( B*B+C ) )
-               ELSE
-                  T = B - SQRT( B*B+C )
-               END IF
-               SINE = -( ALPHA / ABSEST ) / T
-               COSINE = -( GAMMA / ABSEST ) / ( ONE+T )
-               SESTPR = SQRT( ONE+T+FOUR*EPS*EPS*NORMA )*ABSEST
-            END IF
-            TMP = SQRT( SINE*DCONJG( SINE )+COSINE*DCONJG( COSINE ) )
-            S = SINE / TMP
-            C = COSINE / TMP
-            RETURN
-*
-         END IF
-      END IF
-      RETURN
-*
-*     End of ZLAIC1
-*
-      END
--- a/libcruft/lapack/zlals0.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,433 +0,0 @@
-      SUBROUTINE ZLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B, LDB, BX, LDBX,
-     $                   PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM,
-     $                   POLES, DIFL, DIFR, Z, K, C, S, RWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            GIVPTR, ICOMPQ, INFO, K, LDB, LDBX, LDGCOL,
-     $                   LDGNUM, NL, NR, NRHS, SQRE
-      DOUBLE PRECISION   C, S
-*     ..
-*     .. Array Arguments ..
-      INTEGER            GIVCOL( LDGCOL, * ), PERM( * )
-      DOUBLE PRECISION   DIFL( * ), DIFR( LDGNUM, * ),
-     $                   GIVNUM( LDGNUM, * ), POLES( LDGNUM, * ),
-     $                   RWORK( * ), Z( * )
-      COMPLEX*16         B( LDB, * ), BX( LDBX, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLALS0 applies back the multiplying factors of either the left or the
-*  right singular vector matrix of a diagonal matrix appended by a row
-*  to the right hand side matrix B in solving the least squares problem
-*  using the divide-and-conquer SVD approach.
-*
-*  For the left singular vector matrix, three types of orthogonal
-*  matrices are involved:
-*
-*  (1L) Givens rotations: the number of such rotations is GIVPTR; the
-*       pairs of columns/rows they were applied to are stored in GIVCOL;
-*       and the C- and S-values of these rotations are stored in GIVNUM.
-*
-*  (2L) Permutation. The (NL+1)-st row of B is to be moved to the first
-*       row, and for J=2:N, PERM(J)-th row of B is to be moved to the
-*       J-th row.
-*
-*  (3L) The left singular vector matrix of the remaining matrix.
-*
-*  For the right singular vector matrix, four types of orthogonal
-*  matrices are involved:
-*
-*  (1R) The right singular vector matrix of the remaining matrix.
-*
-*  (2R) If SQRE = 1, one extra Givens rotation to generate the right
-*       null space.
-*
-*  (3R) The inverse transformation of (2L).
-*
-*  (4R) The inverse transformation of (1L).
-*
-*  Arguments
-*  =========
-*
-*  ICOMPQ (input) INTEGER
-*         Specifies whether singular vectors are to be computed in
-*         factored form:
-*         = 0: Left singular vector matrix.
-*         = 1: Right singular vector matrix.
-*
-*  NL     (input) INTEGER
-*         The row dimension of the upper block. NL >= 1.
-*
-*  NR     (input) INTEGER
-*         The row dimension of the lower block. NR >= 1.
-*
-*  SQRE   (input) INTEGER
-*         = 0: the lower block is an NR-by-NR square matrix.
-*         = 1: the lower block is an NR-by-(NR+1) rectangular matrix.
-*
-*         The bidiagonal matrix has row dimension N = NL + NR + 1,
-*         and column dimension M = N + SQRE.
-*
-*  NRHS   (input) INTEGER
-*         The number of columns of B and BX. NRHS must be at least 1.
-*
-*  B      (input/output) COMPLEX*16 array, dimension ( LDB, NRHS )
-*         On input, B contains the right hand sides of the least
-*         squares problem in rows 1 through M. On output, B contains
-*         the solution X in rows 1 through N.
-*
-*  LDB    (input) INTEGER
-*         The leading dimension of B. LDB must be at least
-*         max(1,MAX( M, N ) ).
-*
-*  BX     (workspace) COMPLEX*16 array, dimension ( LDBX, NRHS )
-*
-*  LDBX   (input) INTEGER
-*         The leading dimension of BX.
-*
-*  PERM   (input) INTEGER array, dimension ( N )
-*         The permutations (from deflation and sorting) applied
-*         to the two blocks.
-*
-*  GIVPTR (input) INTEGER
-*         The number of Givens rotations which took place in this
-*         subproblem.
-*
-*  GIVCOL (input) INTEGER array, dimension ( LDGCOL, 2 )
-*         Each pair of numbers indicates a pair of rows/columns
-*         involved in a Givens rotation.
-*
-*  LDGCOL (input) INTEGER
-*         The leading dimension of GIVCOL, must be at least N.
-*
-*  GIVNUM (input) DOUBLE PRECISION array, dimension ( LDGNUM, 2 )
-*         Each number indicates the C or S value used in the
-*         corresponding Givens rotation.
-*
-*  LDGNUM (input) INTEGER
-*         The leading dimension of arrays DIFR, POLES and
-*         GIVNUM, must be at least K.
-*
-*  POLES  (input) DOUBLE PRECISION array, dimension ( LDGNUM, 2 )
-*         On entry, POLES(1:K, 1) contains the new singular
-*         values obtained from solving the secular equation, and
-*         POLES(1:K, 2) is an array containing the poles in the secular
-*         equation.
-*
-*  DIFL   (input) DOUBLE PRECISION array, dimension ( K ).
-*         On entry, DIFL(I) is the distance between I-th updated
-*         (undeflated) singular value and the I-th (undeflated) old
-*         singular value.
-*
-*  DIFR   (input) DOUBLE PRECISION array, dimension ( LDGNUM, 2 ).
-*         On entry, DIFR(I, 1) contains the distances between I-th
-*         updated (undeflated) singular value and the I+1-th
-*         (undeflated) old singular value. And DIFR(I, 2) is the
-*         normalizing factor for the I-th right singular vector.
-*
-*  Z      (input) DOUBLE PRECISION array, dimension ( K )
-*         Contain the components of the deflation-adjusted updating row
-*         vector.
-*
-*  K      (input) INTEGER
-*         Contains the dimension of the non-deflated matrix,
-*         This is the order of the related secular equation. 1 <= K <=N.
-*
-*  C      (input) DOUBLE PRECISION
-*         C contains garbage if SQRE =0 and the C-value of a Givens
-*         rotation related to the right null space if SQRE = 1.
-*
-*  S      (input) DOUBLE PRECISION
-*         S contains garbage if SQRE =0 and the S-value of a Givens
-*         rotation related to the right null space if SQRE = 1.
-*
-*  RWORK  (workspace) DOUBLE PRECISION array, dimension
-*         ( K*(1+NRHS) + 2*NRHS )
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Ren-Cang Li, Computer Science Division, University of
-*       California at Berkeley, USA
-*     Osni Marques, LBNL/NERSC, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO, NEGONE
-      PARAMETER          ( ONE = 1.0D0, ZERO = 0.0D0, NEGONE = -1.0D0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J, JCOL, JROW, M, N, NLP1
-      DOUBLE PRECISION   DIFLJ, DIFRJ, DJ, DSIGJ, DSIGJP, TEMP
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMV, XERBLA, ZCOPY, ZDROT, ZDSCAL, ZLACPY,
-     $                   ZLASCL
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMC3, DNRM2
-      EXTERNAL           DLAMC3, DNRM2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, DCMPLX, DIMAG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN
-         INFO = -1
-      ELSE IF( NL.LT.1 ) THEN
-         INFO = -2
-      ELSE IF( NR.LT.1 ) THEN
-         INFO = -3
-      ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN
-         INFO = -4
-      END IF
-*
-      N = NL + NR + 1
-*
-      IF( NRHS.LT.1 ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.N ) THEN
-         INFO = -7
-      ELSE IF( LDBX.LT.N ) THEN
-         INFO = -9
-      ELSE IF( GIVPTR.LT.0 ) THEN
-         INFO = -11
-      ELSE IF( LDGCOL.LT.N ) THEN
-         INFO = -13
-      ELSE IF( LDGNUM.LT.N ) THEN
-         INFO = -15
-      ELSE IF( K.LT.1 ) THEN
-         INFO = -20
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZLALS0', -INFO )
-         RETURN
-      END IF
-*
-      M = N + SQRE
-      NLP1 = NL + 1
-*
-      IF( ICOMPQ.EQ.0 ) THEN
-*
-*        Apply back orthogonal transformations from the left.
-*
-*        Step (1L): apply back the Givens rotations performed.
-*
-         DO 10 I = 1, GIVPTR
-            CALL ZDROT( NRHS, B( GIVCOL( I, 2 ), 1 ), LDB,
-     $                  B( GIVCOL( I, 1 ), 1 ), LDB, GIVNUM( I, 2 ),
-     $                  GIVNUM( I, 1 ) )
-   10    CONTINUE
-*
-*        Step (2L): permute rows of B.
-*
-         CALL ZCOPY( NRHS, B( NLP1, 1 ), LDB, BX( 1, 1 ), LDBX )
-         DO 20 I = 2, N
-            CALL ZCOPY( NRHS, B( PERM( I ), 1 ), LDB, BX( I, 1 ), LDBX )
-   20    CONTINUE
-*
-*        Step (3L): apply the inverse of the left singular vector
-*        matrix to BX.
-*
-         IF( K.EQ.1 ) THEN
-            CALL ZCOPY( NRHS, BX, LDBX, B, LDB )
-            IF( Z( 1 ).LT.ZERO ) THEN
-               CALL ZDSCAL( NRHS, NEGONE, B, LDB )
-            END IF
-         ELSE
-            DO 100 J = 1, K
-               DIFLJ = DIFL( J )
-               DJ = POLES( J, 1 )
-               DSIGJ = -POLES( J, 2 )
-               IF( J.LT.K ) THEN
-                  DIFRJ = -DIFR( J, 1 )
-                  DSIGJP = -POLES( J+1, 2 )
-               END IF
-               IF( ( Z( J ).EQ.ZERO ) .OR. ( POLES( J, 2 ).EQ.ZERO ) )
-     $              THEN
-                  RWORK( J ) = ZERO
-               ELSE
-                  RWORK( J ) = -POLES( J, 2 )*Z( J ) / DIFLJ /
-     $                         ( POLES( J, 2 )+DJ )
-               END IF
-               DO 30 I = 1, J - 1
-                  IF( ( Z( I ).EQ.ZERO ) .OR.
-     $                ( POLES( I, 2 ).EQ.ZERO ) ) THEN
-                     RWORK( I ) = ZERO
-                  ELSE
-                     RWORK( I ) = POLES( I, 2 )*Z( I ) /
-     $                            ( DLAMC3( POLES( I, 2 ), DSIGJ )-
-     $                            DIFLJ ) / ( POLES( I, 2 )+DJ )
-                  END IF
-   30          CONTINUE
-               DO 40 I = J + 1, K
-                  IF( ( Z( I ).EQ.ZERO ) .OR.
-     $                ( POLES( I, 2 ).EQ.ZERO ) ) THEN
-                     RWORK( I ) = ZERO
-                  ELSE
-                     RWORK( I ) = POLES( I, 2 )*Z( I ) /
-     $                            ( DLAMC3( POLES( I, 2 ), DSIGJP )+
-     $                            DIFRJ ) / ( POLES( I, 2 )+DJ )
-                  END IF
-   40          CONTINUE
-               RWORK( 1 ) = NEGONE
-               TEMP = DNRM2( K, RWORK, 1 )
-*
-*              Since B and BX are complex, the following call to DGEMV
-*              is performed in two steps (real and imaginary parts).
-*
-*              CALL DGEMV( 'T', K, NRHS, ONE, BX, LDBX, WORK, 1, ZERO,
-*    $                     B( J, 1 ), LDB )
-*
-               I = K + NRHS*2
-               DO 60 JCOL = 1, NRHS
-                  DO 50 JROW = 1, K
-                     I = I + 1
-                     RWORK( I ) = DBLE( BX( JROW, JCOL ) )
-   50             CONTINUE
-   60          CONTINUE
-               CALL DGEMV( 'T', K, NRHS, ONE, RWORK( 1+K+NRHS*2 ), K,
-     $                     RWORK( 1 ), 1, ZERO, RWORK( 1+K ), 1 )
-               I = K + NRHS*2
-               DO 80 JCOL = 1, NRHS
-                  DO 70 JROW = 1, K
-                     I = I + 1
-                     RWORK( I ) = DIMAG( BX( JROW, JCOL ) )
-   70             CONTINUE
-   80          CONTINUE
-               CALL DGEMV( 'T', K, NRHS, ONE, RWORK( 1+K+NRHS*2 ), K,
-     $                     RWORK( 1 ), 1, ZERO, RWORK( 1+K+NRHS ), 1 )
-               DO 90 JCOL = 1, NRHS
-                  B( J, JCOL ) = DCMPLX( RWORK( JCOL+K ),
-     $                           RWORK( JCOL+K+NRHS ) )
-   90          CONTINUE
-               CALL ZLASCL( 'G', 0, 0, TEMP, ONE, 1, NRHS, B( J, 1 ),
-     $                      LDB, INFO )
-  100       CONTINUE
-         END IF
-*
-*        Move the deflated rows of BX to B also.
-*
-         IF( K.LT.MAX( M, N ) )
-     $      CALL ZLACPY( 'A', N-K, NRHS, BX( K+1, 1 ), LDBX,
-     $                   B( K+1, 1 ), LDB )
-      ELSE
-*
-*        Apply back the right orthogonal transformations.
-*
-*        Step (1R): apply back the new right singular vector matrix
-*        to B.
-*
-         IF( K.EQ.1 ) THEN
-            CALL ZCOPY( NRHS, B, LDB, BX, LDBX )
-         ELSE
-            DO 180 J = 1, K
-               DSIGJ = POLES( J, 2 )
-               IF( Z( J ).EQ.ZERO ) THEN
-                  RWORK( J ) = ZERO
-               ELSE
-                  RWORK( J ) = -Z( J ) / DIFL( J ) /
-     $                         ( DSIGJ+POLES( J, 1 ) ) / DIFR( J, 2 )
-               END IF
-               DO 110 I = 1, J - 1
-                  IF( Z( J ).EQ.ZERO ) THEN
-                     RWORK( I ) = ZERO
-                  ELSE
-                     RWORK( I ) = Z( J ) / ( DLAMC3( DSIGJ, -POLES( I+1,
-     $                            2 ) )-DIFR( I, 1 ) ) /
-     $                            ( DSIGJ+POLES( I, 1 ) ) / DIFR( I, 2 )
-                  END IF
-  110          CONTINUE
-               DO 120 I = J + 1, K
-                  IF( Z( J ).EQ.ZERO ) THEN
-                     RWORK( I ) = ZERO
-                  ELSE
-                     RWORK( I ) = Z( J ) / ( DLAMC3( DSIGJ, -POLES( I,
-     $                            2 ) )-DIFL( I ) ) /
-     $                            ( DSIGJ+POLES( I, 1 ) ) / DIFR( I, 2 )
-                  END IF
-  120          CONTINUE
-*
-*              Since B and BX are complex, the following call to DGEMV
-*              is performed in two steps (real and imaginary parts).
-*
-*              CALL DGEMV( 'T', K, NRHS, ONE, B, LDB, WORK, 1, ZERO,
-*    $                     BX( J, 1 ), LDBX )
-*
-               I = K + NRHS*2
-               DO 140 JCOL = 1, NRHS
-                  DO 130 JROW = 1, K
-                     I = I + 1
-                     RWORK( I ) = DBLE( B( JROW, JCOL ) )
-  130             CONTINUE
-  140          CONTINUE
-               CALL DGEMV( 'T', K, NRHS, ONE, RWORK( 1+K+NRHS*2 ), K,
-     $                     RWORK( 1 ), 1, ZERO, RWORK( 1+K ), 1 )
-               I = K + NRHS*2
-               DO 160 JCOL = 1, NRHS
-                  DO 150 JROW = 1, K
-                     I = I + 1
-                     RWORK( I ) = DIMAG( B( JROW, JCOL ) )
-  150             CONTINUE
-  160          CONTINUE
-               CALL DGEMV( 'T', K, NRHS, ONE, RWORK( 1+K+NRHS*2 ), K,
-     $                     RWORK( 1 ), 1, ZERO, RWORK( 1+K+NRHS ), 1 )
-               DO 170 JCOL = 1, NRHS
-                  BX( J, JCOL ) = DCMPLX( RWORK( JCOL+K ),
-     $                            RWORK( JCOL+K+NRHS ) )
-  170          CONTINUE
-  180       CONTINUE
-         END IF
-*
-*        Step (2R): if SQRE = 1, apply back the rotation that is
-*        related to the right null space of the subproblem.
-*
-         IF( SQRE.EQ.1 ) THEN
-            CALL ZCOPY( NRHS, B( M, 1 ), LDB, BX( M, 1 ), LDBX )
-            CALL ZDROT( NRHS, BX( 1, 1 ), LDBX, BX( M, 1 ), LDBX, C, S )
-         END IF
-         IF( K.LT.MAX( M, N ) )
-     $      CALL ZLACPY( 'A', N-K, NRHS, B( K+1, 1 ), LDB, BX( K+1, 1 ),
-     $                   LDBX )
-*
-*        Step (3R): permute rows of B.
-*
-         CALL ZCOPY( NRHS, BX( 1, 1 ), LDBX, B( NLP1, 1 ), LDB )
-         IF( SQRE.EQ.1 ) THEN
-            CALL ZCOPY( NRHS, BX( M, 1 ), LDBX, B( M, 1 ), LDB )
-         END IF
-         DO 190 I = 2, N
-            CALL ZCOPY( NRHS, BX( I, 1 ), LDBX, B( PERM( I ), 1 ), LDB )
-  190    CONTINUE
-*
-*        Step (4R): apply back the Givens rotations performed.
-*
-         DO 200 I = GIVPTR, 1, -1
-            CALL ZDROT( NRHS, B( GIVCOL( I, 2 ), 1 ), LDB,
-     $                  B( GIVCOL( I, 1 ), 1 ), LDB, GIVNUM( I, 2 ),
-     $                  -GIVNUM( I, 1 ) )
-  200    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of ZLALS0
-*
-      END
--- a/libcruft/lapack/zlalsa.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,503 +0,0 @@
-      SUBROUTINE ZLALSA( ICOMPQ, SMLSIZ, N, NRHS, B, LDB, BX, LDBX, U,
-     $                   LDU, VT, K, DIFL, DIFR, Z, POLES, GIVPTR,
-     $                   GIVCOL, LDGCOL, PERM, GIVNUM, C, S, RWORK,
-     $                   IWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            ICOMPQ, INFO, LDB, LDBX, LDGCOL, LDU, N, NRHS,
-     $                   SMLSIZ
-*     ..
-*     .. Array Arguments ..
-      INTEGER            GIVCOL( LDGCOL, * ), GIVPTR( * ), IWORK( * ),
-     $                   K( * ), PERM( LDGCOL, * )
-      DOUBLE PRECISION   C( * ), DIFL( LDU, * ), DIFR( LDU, * ),
-     $                   GIVNUM( LDU, * ), POLES( LDU, * ), RWORK( * ),
-     $                   S( * ), U( LDU, * ), VT( LDU, * ), Z( LDU, * )
-      COMPLEX*16         B( LDB, * ), BX( LDBX, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLALSA is an itermediate step in solving the least squares problem
-*  by computing the SVD of the coefficient matrix in compact form (The
-*  singular vectors are computed as products of simple orthorgonal
-*  matrices.).
-*
-*  If ICOMPQ = 0, ZLALSA applies the inverse of the left singular vector
-*  matrix of an upper bidiagonal matrix to the right hand side; and if
-*  ICOMPQ = 1, ZLALSA applies the right singular vector matrix to the
-*  right hand side. The singular vector matrices were generated in
-*  compact form by ZLALSA.
-*
-*  Arguments
-*  =========
-*
-*  ICOMPQ (input) INTEGER
-*         Specifies whether the left or the right singular vector
-*         matrix is involved.
-*         = 0: Left singular vector matrix
-*         = 1: Right singular vector matrix
-*
-*  SMLSIZ (input) INTEGER
-*         The maximum size of the subproblems at the bottom of the
-*         computation tree.
-*
-*  N      (input) INTEGER
-*         The row and column dimensions of the upper bidiagonal matrix.
-*
-*  NRHS   (input) INTEGER
-*         The number of columns of B and BX. NRHS must be at least 1.
-*
-*  B      (input/output) COMPLEX*16 array, dimension ( LDB, NRHS )
-*         On input, B contains the right hand sides of the least
-*         squares problem in rows 1 through M.
-*         On output, B contains the solution X in rows 1 through N.
-*
-*  LDB    (input) INTEGER
-*         The leading dimension of B in the calling subprogram.
-*         LDB must be at least max(1,MAX( M, N ) ).
-*
-*  BX     (output) COMPLEX*16 array, dimension ( LDBX, NRHS )
-*         On exit, the result of applying the left or right singular
-*         vector matrix to B.
-*
-*  LDBX   (input) INTEGER
-*         The leading dimension of BX.
-*
-*  U      (input) DOUBLE PRECISION array, dimension ( LDU, SMLSIZ ).
-*         On entry, U contains the left singular vector matrices of all
-*         subproblems at the bottom level.
-*
-*  LDU    (input) INTEGER, LDU = > N.
-*         The leading dimension of arrays U, VT, DIFL, DIFR,
-*         POLES, GIVNUM, and Z.
-*
-*  VT     (input) DOUBLE PRECISION array, dimension ( LDU, SMLSIZ+1 ).
-*         On entry, VT' contains the right singular vector matrices of
-*         all subproblems at the bottom level.
-*
-*  K      (input) INTEGER array, dimension ( N ).
-*
-*  DIFL   (input) DOUBLE PRECISION array, dimension ( LDU, NLVL ).
-*         where NLVL = INT(log_2 (N/(SMLSIZ+1))) + 1.
-*
-*  DIFR   (input) DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ).
-*         On entry, DIFL(*, I) and DIFR(*, 2 * I -1) record
-*         distances between singular values on the I-th level and
-*         singular values on the (I -1)-th level, and DIFR(*, 2 * I)
-*         record the normalizing factors of the right singular vectors
-*         matrices of subproblems on I-th level.
-*
-*  Z      (input) DOUBLE PRECISION array, dimension ( LDU, NLVL ).
-*         On entry, Z(1, I) contains the components of the deflation-
-*         adjusted updating row vector for subproblems on the I-th
-*         level.
-*
-*  POLES  (input) DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ).
-*         On entry, POLES(*, 2 * I -1: 2 * I) contains the new and old
-*         singular values involved in the secular equations on the I-th
-*         level.
-*
-*  GIVPTR (input) INTEGER array, dimension ( N ).
-*         On entry, GIVPTR( I ) records the number of Givens
-*         rotations performed on the I-th problem on the computation
-*         tree.
-*
-*  GIVCOL (input) INTEGER array, dimension ( LDGCOL, 2 * NLVL ).
-*         On entry, for each I, GIVCOL(*, 2 * I - 1: 2 * I) records the
-*         locations of Givens rotations performed on the I-th level on
-*         the computation tree.
-*
-*  LDGCOL (input) INTEGER, LDGCOL = > N.
-*         The leading dimension of arrays GIVCOL and PERM.
-*
-*  PERM   (input) INTEGER array, dimension ( LDGCOL, NLVL ).
-*         On entry, PERM(*, I) records permutations done on the I-th
-*         level of the computation tree.
-*
-*  GIVNUM (input) DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ).
-*         On entry, GIVNUM(*, 2 *I -1 : 2 * I) records the C- and S-
-*         values of Givens rotations performed on the I-th level on the
-*         computation tree.
-*
-*  C      (input) DOUBLE PRECISION array, dimension ( N ).
-*         On entry, if the I-th subproblem is not square,
-*         C( I ) contains the C-value of a Givens rotation related to
-*         the right null space of the I-th subproblem.
-*
-*  S      (input) DOUBLE PRECISION array, dimension ( N ).
-*         On entry, if the I-th subproblem is not square,
-*         S( I ) contains the S-value of a Givens rotation related to
-*         the right null space of the I-th subproblem.
-*
-*  RWORK  (workspace) DOUBLE PRECISION array, dimension at least
-*         max ( N, (SMLSZ+1)*NRHS*3 ).
-*
-*  IWORK  (workspace) INTEGER array.
-*         The dimension must be at least 3 * N
-*
-*  INFO   (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Ren-Cang Li, Computer Science Division, University of
-*       California at Berkeley, USA
-*     Osni Marques, LBNL/NERSC, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I1, IC, IM1, INODE, J, JCOL, JIMAG, JREAL,
-     $                   JROW, LF, LL, LVL, LVL2, ND, NDB1, NDIML,
-     $                   NDIMR, NL, NLF, NLP1, NLVL, NR, NRF, NRP1, SQRE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMM, DLASDT, XERBLA, ZCOPY, ZLALS0
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, DCMPLX, DIMAG
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN
-         INFO = -1
-      ELSE IF( SMLSIZ.LT.3 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.SMLSIZ ) THEN
-         INFO = -3
-      ELSE IF( NRHS.LT.1 ) THEN
-         INFO = -4
-      ELSE IF( LDB.LT.N ) THEN
-         INFO = -6
-      ELSE IF( LDBX.LT.N ) THEN
-         INFO = -8
-      ELSE IF( LDU.LT.N ) THEN
-         INFO = -10
-      ELSE IF( LDGCOL.LT.N ) THEN
-         INFO = -19
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZLALSA', -INFO )
-         RETURN
-      END IF
-*
-*     Book-keeping and  setting up the computation tree.
-*
-      INODE = 1
-      NDIML = INODE + N
-      NDIMR = NDIML + N
-*
-      CALL DLASDT( N, NLVL, ND, IWORK( INODE ), IWORK( NDIML ),
-     $             IWORK( NDIMR ), SMLSIZ )
-*
-*     The following code applies back the left singular vector factors.
-*     For applying back the right singular vector factors, go to 170.
-*
-      IF( ICOMPQ.EQ.1 ) THEN
-         GO TO 170
-      END IF
-*
-*     The nodes on the bottom level of the tree were solved
-*     by DLASDQ. The corresponding left and right singular vector
-*     matrices are in explicit form. First apply back the left
-*     singular vector matrices.
-*
-      NDB1 = ( ND+1 ) / 2
-      DO 130 I = NDB1, ND
-*
-*        IC : center row of each node
-*        NL : number of rows of left  subproblem
-*        NR : number of rows of right subproblem
-*        NLF: starting row of the left   subproblem
-*        NRF: starting row of the right  subproblem
-*
-         I1 = I - 1
-         IC = IWORK( INODE+I1 )
-         NL = IWORK( NDIML+I1 )
-         NR = IWORK( NDIMR+I1 )
-         NLF = IC - NL
-         NRF = IC + 1
-*
-*        Since B and BX are complex, the following call to DGEMM
-*        is performed in two steps (real and imaginary parts).
-*
-*        CALL DGEMM( 'T', 'N', NL, NRHS, NL, ONE, U( NLF, 1 ), LDU,
-*     $               B( NLF, 1 ), LDB, ZERO, BX( NLF, 1 ), LDBX )
-*
-         J = NL*NRHS*2
-         DO 20 JCOL = 1, NRHS
-            DO 10 JROW = NLF, NLF + NL - 1
-               J = J + 1
-               RWORK( J ) = DBLE( B( JROW, JCOL ) )
-   10       CONTINUE
-   20    CONTINUE
-         CALL DGEMM( 'T', 'N', NL, NRHS, NL, ONE, U( NLF, 1 ), LDU,
-     $               RWORK( 1+NL*NRHS*2 ), NL, ZERO, RWORK( 1 ), NL )
-         J = NL*NRHS*2
-         DO 40 JCOL = 1, NRHS
-            DO 30 JROW = NLF, NLF + NL - 1
-               J = J + 1
-               RWORK( J ) = DIMAG( B( JROW, JCOL ) )
-   30       CONTINUE
-   40    CONTINUE
-         CALL DGEMM( 'T', 'N', NL, NRHS, NL, ONE, U( NLF, 1 ), LDU,
-     $               RWORK( 1+NL*NRHS*2 ), NL, ZERO, RWORK( 1+NL*NRHS ),
-     $               NL )
-         JREAL = 0
-         JIMAG = NL*NRHS
-         DO 60 JCOL = 1, NRHS
-            DO 50 JROW = NLF, NLF + NL - 1
-               JREAL = JREAL + 1
-               JIMAG = JIMAG + 1
-               BX( JROW, JCOL ) = DCMPLX( RWORK( JREAL ),
-     $                            RWORK( JIMAG ) )
-   50       CONTINUE
-   60    CONTINUE
-*
-*        Since B and BX are complex, the following call to DGEMM
-*        is performed in two steps (real and imaginary parts).
-*
-*        CALL DGEMM( 'T', 'N', NR, NRHS, NR, ONE, U( NRF, 1 ), LDU,
-*    $               B( NRF, 1 ), LDB, ZERO, BX( NRF, 1 ), LDBX )
-*
-         J = NR*NRHS*2
-         DO 80 JCOL = 1, NRHS
-            DO 70 JROW = NRF, NRF + NR - 1
-               J = J + 1
-               RWORK( J ) = DBLE( B( JROW, JCOL ) )
-   70       CONTINUE
-   80    CONTINUE
-         CALL DGEMM( 'T', 'N', NR, NRHS, NR, ONE, U( NRF, 1 ), LDU,
-     $               RWORK( 1+NR*NRHS*2 ), NR, ZERO, RWORK( 1 ), NR )
-         J = NR*NRHS*2
-         DO 100 JCOL = 1, NRHS
-            DO 90 JROW = NRF, NRF + NR - 1
-               J = J + 1
-               RWORK( J ) = DIMAG( B( JROW, JCOL ) )
-   90       CONTINUE
-  100    CONTINUE
-         CALL DGEMM( 'T', 'N', NR, NRHS, NR, ONE, U( NRF, 1 ), LDU,
-     $               RWORK( 1+NR*NRHS*2 ), NR, ZERO, RWORK( 1+NR*NRHS ),
-     $               NR )
-         JREAL = 0
-         JIMAG = NR*NRHS
-         DO 120 JCOL = 1, NRHS
-            DO 110 JROW = NRF, NRF + NR - 1
-               JREAL = JREAL + 1
-               JIMAG = JIMAG + 1
-               BX( JROW, JCOL ) = DCMPLX( RWORK( JREAL ),
-     $                            RWORK( JIMAG ) )
-  110       CONTINUE
-  120    CONTINUE
-*
-  130 CONTINUE
-*
-*     Next copy the rows of B that correspond to unchanged rows
-*     in the bidiagonal matrix to BX.
-*
-      DO 140 I = 1, ND
-         IC = IWORK( INODE+I-1 )
-         CALL ZCOPY( NRHS, B( IC, 1 ), LDB, BX( IC, 1 ), LDBX )
-  140 CONTINUE
-*
-*     Finally go through the left singular vector matrices of all
-*     the other subproblems bottom-up on the tree.
-*
-      J = 2**NLVL
-      SQRE = 0
-*
-      DO 160 LVL = NLVL, 1, -1
-         LVL2 = 2*LVL - 1
-*
-*        find the first node LF and last node LL on
-*        the current level LVL
-*
-         IF( LVL.EQ.1 ) THEN
-            LF = 1
-            LL = 1
-         ELSE
-            LF = 2**( LVL-1 )
-            LL = 2*LF - 1
-         END IF
-         DO 150 I = LF, LL
-            IM1 = I - 1
-            IC = IWORK( INODE+IM1 )
-            NL = IWORK( NDIML+IM1 )
-            NR = IWORK( NDIMR+IM1 )
-            NLF = IC - NL
-            NRF = IC + 1
-            J = J - 1
-            CALL ZLALS0( ICOMPQ, NL, NR, SQRE, NRHS, BX( NLF, 1 ), LDBX,
-     $                   B( NLF, 1 ), LDB, PERM( NLF, LVL ),
-     $                   GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL,
-     $                   GIVNUM( NLF, LVL2 ), LDU, POLES( NLF, LVL2 ),
-     $                   DIFL( NLF, LVL ), DIFR( NLF, LVL2 ),
-     $                   Z( NLF, LVL ), K( J ), C( J ), S( J ), RWORK,
-     $                   INFO )
-  150    CONTINUE
-  160 CONTINUE
-      GO TO 330
-*
-*     ICOMPQ = 1: applying back the right singular vector factors.
-*
-  170 CONTINUE
-*
-*     First now go through the right singular vector matrices of all
-*     the tree nodes top-down.
-*
-      J = 0
-      DO 190 LVL = 1, NLVL
-         LVL2 = 2*LVL - 1
-*
-*        Find the first node LF and last node LL on
-*        the current level LVL.
-*
-         IF( LVL.EQ.1 ) THEN
-            LF = 1
-            LL = 1
-         ELSE
-            LF = 2**( LVL-1 )
-            LL = 2*LF - 1
-         END IF
-         DO 180 I = LL, LF, -1
-            IM1 = I - 1
-            IC = IWORK( INODE+IM1 )
-            NL = IWORK( NDIML+IM1 )
-            NR = IWORK( NDIMR+IM1 )
-            NLF = IC - NL
-            NRF = IC + 1
-            IF( I.EQ.LL ) THEN
-               SQRE = 0
-            ELSE
-               SQRE = 1
-            END IF
-            J = J + 1
-            CALL ZLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B( NLF, 1 ), LDB,
-     $                   BX( NLF, 1 ), LDBX, PERM( NLF, LVL ),
-     $                   GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL,
-     $                   GIVNUM( NLF, LVL2 ), LDU, POLES( NLF, LVL2 ),
-     $                   DIFL( NLF, LVL ), DIFR( NLF, LVL2 ),
-     $                   Z( NLF, LVL ), K( J ), C( J ), S( J ), RWORK,
-     $                   INFO )
-  180    CONTINUE
-  190 CONTINUE
-*
-*     The nodes on the bottom level of the tree were solved
-*     by DLASDQ. The corresponding right singular vector
-*     matrices are in explicit form. Apply them back.
-*
-      NDB1 = ( ND+1 ) / 2
-      DO 320 I = NDB1, ND
-         I1 = I - 1
-         IC = IWORK( INODE+I1 )
-         NL = IWORK( NDIML+I1 )
-         NR = IWORK( NDIMR+I1 )
-         NLP1 = NL + 1
-         IF( I.EQ.ND ) THEN
-            NRP1 = NR
-         ELSE
-            NRP1 = NR + 1
-         END IF
-         NLF = IC - NL
-         NRF = IC + 1
-*
-*        Since B and BX are complex, the following call to DGEMM is
-*        performed in two steps (real and imaginary parts).
-*
-*        CALL DGEMM( 'T', 'N', NLP1, NRHS, NLP1, ONE, VT( NLF, 1 ), LDU,
-*    $               B( NLF, 1 ), LDB, ZERO, BX( NLF, 1 ), LDBX )
-*
-         J = NLP1*NRHS*2
-         DO 210 JCOL = 1, NRHS
-            DO 200 JROW = NLF, NLF + NLP1 - 1
-               J = J + 1
-               RWORK( J ) = DBLE( B( JROW, JCOL ) )
-  200       CONTINUE
-  210    CONTINUE
-         CALL DGEMM( 'T', 'N', NLP1, NRHS, NLP1, ONE, VT( NLF, 1 ), LDU,
-     $               RWORK( 1+NLP1*NRHS*2 ), NLP1, ZERO, RWORK( 1 ),
-     $               NLP1 )
-         J = NLP1*NRHS*2
-         DO 230 JCOL = 1, NRHS
-            DO 220 JROW = NLF, NLF + NLP1 - 1
-               J = J + 1
-               RWORK( J ) = DIMAG( B( JROW, JCOL ) )
-  220       CONTINUE
-  230    CONTINUE
-         CALL DGEMM( 'T', 'N', NLP1, NRHS, NLP1, ONE, VT( NLF, 1 ), LDU,
-     $               RWORK( 1+NLP1*NRHS*2 ), NLP1, ZERO,
-     $               RWORK( 1+NLP1*NRHS ), NLP1 )
-         JREAL = 0
-         JIMAG = NLP1*NRHS
-         DO 250 JCOL = 1, NRHS
-            DO 240 JROW = NLF, NLF + NLP1 - 1
-               JREAL = JREAL + 1
-               JIMAG = JIMAG + 1
-               BX( JROW, JCOL ) = DCMPLX( RWORK( JREAL ),
-     $                            RWORK( JIMAG ) )
-  240       CONTINUE
-  250    CONTINUE
-*
-*        Since B and BX are complex, the following call to DGEMM is
-*        performed in two steps (real and imaginary parts).
-*
-*        CALL DGEMM( 'T', 'N', NRP1, NRHS, NRP1, ONE, VT( NRF, 1 ), LDU,
-*    $               B( NRF, 1 ), LDB, ZERO, BX( NRF, 1 ), LDBX )
-*
-         J = NRP1*NRHS*2
-         DO 270 JCOL = 1, NRHS
-            DO 260 JROW = NRF, NRF + NRP1 - 1
-               J = J + 1
-               RWORK( J ) = DBLE( B( JROW, JCOL ) )
-  260       CONTINUE
-  270    CONTINUE
-         CALL DGEMM( 'T', 'N', NRP1, NRHS, NRP1, ONE, VT( NRF, 1 ), LDU,
-     $               RWORK( 1+NRP1*NRHS*2 ), NRP1, ZERO, RWORK( 1 ),
-     $               NRP1 )
-         J = NRP1*NRHS*2
-         DO 290 JCOL = 1, NRHS
-            DO 280 JROW = NRF, NRF + NRP1 - 1
-               J = J + 1
-               RWORK( J ) = DIMAG( B( JROW, JCOL ) )
-  280       CONTINUE
-  290    CONTINUE
-         CALL DGEMM( 'T', 'N', NRP1, NRHS, NRP1, ONE, VT( NRF, 1 ), LDU,
-     $               RWORK( 1+NRP1*NRHS*2 ), NRP1, ZERO,
-     $               RWORK( 1+NRP1*NRHS ), NRP1 )
-         JREAL = 0
-         JIMAG = NRP1*NRHS
-         DO 310 JCOL = 1, NRHS
-            DO 300 JROW = NRF, NRF + NRP1 - 1
-               JREAL = JREAL + 1
-               JIMAG = JIMAG + 1
-               BX( JROW, JCOL ) = DCMPLX( RWORK( JREAL ),
-     $                            RWORK( JIMAG ) )
-  300       CONTINUE
-  310    CONTINUE
-*
-  320 CONTINUE
-*
-  330 CONTINUE
-*
-      RETURN
-*
-*     End of ZLALSA
-*
-      END
--- a/libcruft/lapack/zlalsd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,600 +0,0 @@
-      SUBROUTINE ZLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND,
-     $                   RANK, WORK, RWORK, IWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDB, N, NRHS, RANK, SMLSIZ
-      DOUBLE PRECISION   RCOND
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IWORK( * )
-      DOUBLE PRECISION   D( * ), E( * ), RWORK( * )
-      COMPLEX*16         B( LDB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLALSD uses the singular value decomposition of A to solve the least
-*  squares problem of finding X to minimize the Euclidean norm of each
-*  column of A*X-B, where A is N-by-N upper bidiagonal, and X and B
-*  are N-by-NRHS. The solution X overwrites B.
-*
-*  The singular values of A smaller than RCOND times the largest
-*  singular value are treated as zero in solving the least squares
-*  problem; in this case a minimum norm solution is returned.
-*  The actual singular values are returned in D in ascending order.
-*
-*  This code makes very mild assumptions about floating point
-*  arithmetic. It will work on machines with a guard digit in
-*  add/subtract, or on those binary machines without guard digits
-*  which subtract like the Cray XMP, Cray YMP, Cray C 90, or Cray 2.
-*  It could conceivably fail on hexadecimal or decimal machines
-*  without guard digits, but we know of none.
-*
-*  Arguments
-*  =========
-*
-*  UPLO   (input) CHARACTER*1
-*         = 'U': D and E define an upper bidiagonal matrix.
-*         = 'L': D and E define a  lower bidiagonal matrix.
-*
-*  SMLSIZ (input) INTEGER
-*         The maximum size of the subproblems at the bottom of the
-*         computation tree.
-*
-*  N      (input) INTEGER
-*         The dimension of the  bidiagonal matrix.  N >= 0.
-*
-*  NRHS   (input) INTEGER
-*         The number of columns of B. NRHS must be at least 1.
-*
-*  D      (input/output) DOUBLE PRECISION array, dimension (N)
-*         On entry D contains the main diagonal of the bidiagonal
-*         matrix. On exit, if INFO = 0, D contains its singular values.
-*
-*  E      (input/output) DOUBLE PRECISION array, dimension (N-1)
-*         Contains the super-diagonal entries of the bidiagonal matrix.
-*         On exit, E has been destroyed.
-*
-*  B      (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
-*         On input, B contains the right hand sides of the least
-*         squares problem. On output, B contains the solution X.
-*
-*  LDB    (input) INTEGER
-*         The leading dimension of B in the calling subprogram.
-*         LDB must be at least max(1,N).
-*
-*  RCOND  (input) DOUBLE PRECISION
-*         The singular values of A less than or equal to RCOND times
-*         the largest singular value are treated as zero in solving
-*         the least squares problem. If RCOND is negative,
-*         machine precision is used instead.
-*         For example, if diag(S)*X=B were the least squares problem,
-*         where diag(S) is a diagonal matrix of singular values, the
-*         solution would be X(i) = B(i) / S(i) if S(i) is greater than
-*         RCOND*max(S), and X(i) = 0 if S(i) is less than or equal to
-*         RCOND*max(S).
-*
-*  RANK   (output) INTEGER
-*         The number of singular values of A greater than RCOND times
-*         the largest singular value.
-*
-*  WORK   (workspace) COMPLEX*16 array, dimension at least
-*         (N * NRHS).
-*
-*  RWORK  (workspace) DOUBLE PRECISION array, dimension at least
-*         (9*N + 2*N*SMLSIZ + 8*N*NLVL + 3*SMLSIZ*NRHS + (SMLSIZ+1)**2),
-*         where
-*         NLVL = MAX( 0, INT( LOG_2( MIN( M,N )/(SMLSIZ+1) ) ) + 1 )
-*
-*  IWORK  (workspace) INTEGER array, dimension at least
-*         (3*N*NLVL + 11*N).
-*
-*  INFO   (output) INTEGER
-*         = 0:  successful exit.
-*         < 0:  if INFO = -i, the i-th argument had an illegal value.
-*         > 0:  The algorithm failed to compute an singular value while
-*               working on the submatrix lying in rows and columns
-*               INFO/(N+1) through MOD(INFO,N+1).
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*     Ming Gu and Ren-Cang Li, Computer Science Division, University of
-*       California at Berkeley, USA
-*     Osni Marques, LBNL/NERSC, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE, TWO
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0 )
-      COMPLEX*16         CZERO
-      PARAMETER          ( CZERO = ( 0.0D0, 0.0D0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            BX, BXST, C, DIFL, DIFR, GIVCOL, GIVNUM,
-     $                   GIVPTR, I, ICMPQ1, ICMPQ2, IRWB, IRWIB, IRWRB,
-     $                   IRWU, IRWVT, IRWWRK, IWK, J, JCOL, JIMAG,
-     $                   JREAL, JROW, K, NLVL, NM1, NRWORK, NSIZE, NSUB,
-     $                   PERM, POLES, S, SIZEI, SMLSZP, SQRE, ST, ST1,
-     $                   U, VT, Z
-      DOUBLE PRECISION   CS, EPS, ORGNRM, RCND, R, SN, TOL
-*     ..
-*     .. External Functions ..
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DLAMCH, DLANST
-      EXTERNAL           IDAMAX, DLAMCH, DLANST
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DGEMM, DLARTG, DLASCL, DLASDA, DLASDQ, DLASET,
-     $                   DLASRT, XERBLA, ZCOPY, ZDROT, ZLACPY, ZLALSA,
-     $                   ZLASCL, ZLASET
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCMPLX, DIMAG, INT, LOG, SIGN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( NRHS.LT.1 ) THEN
-         INFO = -4
-      ELSE IF( ( LDB.LT.1 ) .OR. ( LDB.LT.N ) ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZLALSD', -INFO )
-         RETURN
-      END IF
-*
-      EPS = DLAMCH( 'Epsilon' )
-*
-*     Set up the tolerance.
-*
-      IF( ( RCOND.LE.ZERO ) .OR. ( RCOND.GE.ONE ) ) THEN
-         RCND = EPS
-      ELSE
-         RCND = RCOND
-      END IF
-*
-      RANK = 0
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 ) THEN
-         RETURN
-      ELSE IF( N.EQ.1 ) THEN
-         IF( D( 1 ).EQ.ZERO ) THEN
-            CALL ZLASET( 'A', 1, NRHS, CZERO, CZERO, B, LDB )
-         ELSE
-            RANK = 1
-            CALL ZLASCL( 'G', 0, 0, D( 1 ), ONE, 1, NRHS, B, LDB, INFO )
-            D( 1 ) = ABS( D( 1 ) )
-         END IF
-         RETURN
-      END IF
-*
-*     Rotate the matrix if it is lower bidiagonal.
-*
-      IF( UPLO.EQ.'L' ) THEN
-         DO 10 I = 1, N - 1
-            CALL DLARTG( D( I ), E( I ), CS, SN, R )
-            D( I ) = R
-            E( I ) = SN*D( I+1 )
-            D( I+1 ) = CS*D( I+1 )
-            IF( NRHS.EQ.1 ) THEN
-               CALL ZDROT( 1, B( I, 1 ), 1, B( I+1, 1 ), 1, CS, SN )
-            ELSE
-               RWORK( I*2-1 ) = CS
-               RWORK( I*2 ) = SN
-            END IF
-   10    CONTINUE
-         IF( NRHS.GT.1 ) THEN
-            DO 30 I = 1, NRHS
-               DO 20 J = 1, N - 1
-                  CS = RWORK( J*2-1 )
-                  SN = RWORK( J*2 )
-                  CALL ZDROT( 1, B( J, I ), 1, B( J+1, I ), 1, CS, SN )
-   20          CONTINUE
-   30       CONTINUE
-         END IF
-      END IF
-*
-*     Scale.
-*
-      NM1 = N - 1
-      ORGNRM = DLANST( 'M', N, D, E )
-      IF( ORGNRM.EQ.ZERO ) THEN
-         CALL ZLASET( 'A', N, NRHS, CZERO, CZERO, B, LDB )
-         RETURN
-      END IF
-*
-      CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, N, 1, D, N, INFO )
-      CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, NM1, 1, E, NM1, INFO )
-*
-*     If N is smaller than the minimum divide size SMLSIZ, then solve
-*     the problem with another solver.
-*
-      IF( N.LE.SMLSIZ ) THEN
-         IRWU = 1
-         IRWVT = IRWU + N*N
-         IRWWRK = IRWVT + N*N
-         IRWRB = IRWWRK
-         IRWIB = IRWRB + N*NRHS
-         IRWB = IRWIB + N*NRHS
-         CALL DLASET( 'A', N, N, ZERO, ONE, RWORK( IRWU ), N )
-         CALL DLASET( 'A', N, N, ZERO, ONE, RWORK( IRWVT ), N )
-         CALL DLASDQ( 'U', 0, N, N, N, 0, D, E, RWORK( IRWVT ), N,
-     $                RWORK( IRWU ), N, RWORK( IRWWRK ), 1,
-     $                RWORK( IRWWRK ), INFO )
-         IF( INFO.NE.0 ) THEN
-            RETURN
-         END IF
-*
-*        In the real version, B is passed to DLASDQ and multiplied
-*        internally by Q'. Here B is complex and that product is
-*        computed below in two steps (real and imaginary parts).
-*
-         J = IRWB - 1
-         DO 50 JCOL = 1, NRHS
-            DO 40 JROW = 1, N
-               J = J + 1
-               RWORK( J ) = DBLE( B( JROW, JCOL ) )
-   40       CONTINUE
-   50    CONTINUE
-         CALL DGEMM( 'T', 'N', N, NRHS, N, ONE, RWORK( IRWU ), N,
-     $               RWORK( IRWB ), N, ZERO, RWORK( IRWRB ), N )
-         J = IRWB - 1
-         DO 70 JCOL = 1, NRHS
-            DO 60 JROW = 1, N
-               J = J + 1
-               RWORK( J ) = DIMAG( B( JROW, JCOL ) )
-   60       CONTINUE
-   70    CONTINUE
-         CALL DGEMM( 'T', 'N', N, NRHS, N, ONE, RWORK( IRWU ), N,
-     $               RWORK( IRWB ), N, ZERO, RWORK( IRWIB ), N )
-         JREAL = IRWRB - 1
-         JIMAG = IRWIB - 1
-         DO 90 JCOL = 1, NRHS
-            DO 80 JROW = 1, N
-               JREAL = JREAL + 1
-               JIMAG = JIMAG + 1
-               B( JROW, JCOL ) = DCMPLX( RWORK( JREAL ),
-     $                           RWORK( JIMAG ) )
-   80       CONTINUE
-   90    CONTINUE
-*
-         TOL = RCND*ABS( D( IDAMAX( N, D, 1 ) ) )
-         DO 100 I = 1, N
-            IF( D( I ).LE.TOL ) THEN
-               CALL ZLASET( 'A', 1, NRHS, CZERO, CZERO, B( I, 1 ), LDB )
-            ELSE
-               CALL ZLASCL( 'G', 0, 0, D( I ), ONE, 1, NRHS, B( I, 1 ),
-     $                      LDB, INFO )
-               RANK = RANK + 1
-            END IF
-  100    CONTINUE
-*
-*        Since B is complex, the following call to DGEMM is performed
-*        in two steps (real and imaginary parts). That is for V * B
-*        (in the real version of the code V' is stored in WORK).
-*
-*        CALL DGEMM( 'T', 'N', N, NRHS, N, ONE, WORK, N, B, LDB, ZERO,
-*    $               WORK( NWORK ), N )
-*
-         J = IRWB - 1
-         DO 120 JCOL = 1, NRHS
-            DO 110 JROW = 1, N
-               J = J + 1
-               RWORK( J ) = DBLE( B( JROW, JCOL ) )
-  110       CONTINUE
-  120    CONTINUE
-         CALL DGEMM( 'T', 'N', N, NRHS, N, ONE, RWORK( IRWVT ), N,
-     $               RWORK( IRWB ), N, ZERO, RWORK( IRWRB ), N )
-         J = IRWB - 1
-         DO 140 JCOL = 1, NRHS
-            DO 130 JROW = 1, N
-               J = J + 1
-               RWORK( J ) = DIMAG( B( JROW, JCOL ) )
-  130       CONTINUE
-  140    CONTINUE
-         CALL DGEMM( 'T', 'N', N, NRHS, N, ONE, RWORK( IRWVT ), N,
-     $               RWORK( IRWB ), N, ZERO, RWORK( IRWIB ), N )
-         JREAL = IRWRB - 1
-         JIMAG = IRWIB - 1
-         DO 160 JCOL = 1, NRHS
-            DO 150 JROW = 1, N
-               JREAL = JREAL + 1
-               JIMAG = JIMAG + 1
-               B( JROW, JCOL ) = DCMPLX( RWORK( JREAL ),
-     $                           RWORK( JIMAG ) )
-  150       CONTINUE
-  160    CONTINUE
-*
-*        Unscale.
-*
-         CALL DLASCL( 'G', 0, 0, ONE, ORGNRM, N, 1, D, N, INFO )
-         CALL DLASRT( 'D', N, D, INFO )
-         CALL ZLASCL( 'G', 0, 0, ORGNRM, ONE, N, NRHS, B, LDB, INFO )
-*
-         RETURN
-      END IF
-*
-*     Book-keeping and setting up some constants.
-*
-      NLVL = INT( LOG( DBLE( N ) / DBLE( SMLSIZ+1 ) ) / LOG( TWO ) ) + 1
-*
-      SMLSZP = SMLSIZ + 1
-*
-      U = 1
-      VT = 1 + SMLSIZ*N
-      DIFL = VT + SMLSZP*N
-      DIFR = DIFL + NLVL*N
-      Z = DIFR + NLVL*N*2
-      C = Z + NLVL*N
-      S = C + N
-      POLES = S + N
-      GIVNUM = POLES + 2*NLVL*N
-      NRWORK = GIVNUM + 2*NLVL*N
-      BX = 1
-*
-      IRWRB = NRWORK
-      IRWIB = IRWRB + SMLSIZ*NRHS
-      IRWB = IRWIB + SMLSIZ*NRHS
-*
-      SIZEI = 1 + N
-      K = SIZEI + N
-      GIVPTR = K + N
-      PERM = GIVPTR + N
-      GIVCOL = PERM + NLVL*N
-      IWK = GIVCOL + NLVL*N*2
-*
-      ST = 1
-      SQRE = 0
-      ICMPQ1 = 1
-      ICMPQ2 = 0
-      NSUB = 0
-*
-      DO 170 I = 1, N
-         IF( ABS( D( I ) ).LT.EPS ) THEN
-            D( I ) = SIGN( EPS, D( I ) )
-         END IF
-  170 CONTINUE
-*
-      DO 240 I = 1, NM1
-         IF( ( ABS( E( I ) ).LT.EPS ) .OR. ( I.EQ.NM1 ) ) THEN
-            NSUB = NSUB + 1
-            IWORK( NSUB ) = ST
-*
-*           Subproblem found. First determine its size and then
-*           apply divide and conquer on it.
-*
-            IF( I.LT.NM1 ) THEN
-*
-*              A subproblem with E(I) small for I < NM1.
-*
-               NSIZE = I - ST + 1
-               IWORK( SIZEI+NSUB-1 ) = NSIZE
-            ELSE IF( ABS( E( I ) ).GE.EPS ) THEN
-*
-*              A subproblem with E(NM1) not too small but I = NM1.
-*
-               NSIZE = N - ST + 1
-               IWORK( SIZEI+NSUB-1 ) = NSIZE
-            ELSE
-*
-*              A subproblem with E(NM1) small. This implies an
-*              1-by-1 subproblem at D(N), which is not solved
-*              explicitly.
-*
-               NSIZE = I - ST + 1
-               IWORK( SIZEI+NSUB-1 ) = NSIZE
-               NSUB = NSUB + 1
-               IWORK( NSUB ) = N
-               IWORK( SIZEI+NSUB-1 ) = 1
-               CALL ZCOPY( NRHS, B( N, 1 ), LDB, WORK( BX+NM1 ), N )
-            END IF
-            ST1 = ST - 1
-            IF( NSIZE.EQ.1 ) THEN
-*
-*              This is a 1-by-1 subproblem and is not solved
-*              explicitly.
-*
-               CALL ZCOPY( NRHS, B( ST, 1 ), LDB, WORK( BX+ST1 ), N )
-            ELSE IF( NSIZE.LE.SMLSIZ ) THEN
-*
-*              This is a small subproblem and is solved by DLASDQ.
-*
-               CALL DLASET( 'A', NSIZE, NSIZE, ZERO, ONE,
-     $                      RWORK( VT+ST1 ), N )
-               CALL DLASET( 'A', NSIZE, NSIZE, ZERO, ONE,
-     $                      RWORK( U+ST1 ), N )
-               CALL DLASDQ( 'U', 0, NSIZE, NSIZE, NSIZE, 0, D( ST ),
-     $                      E( ST ), RWORK( VT+ST1 ), N, RWORK( U+ST1 ),
-     $                      N, RWORK( NRWORK ), 1, RWORK( NRWORK ),
-     $                      INFO )
-               IF( INFO.NE.0 ) THEN
-                  RETURN
-               END IF
-*
-*              In the real version, B is passed to DLASDQ and multiplied
-*              internally by Q'. Here B is complex and that product is
-*              computed below in two steps (real and imaginary parts).
-*
-               J = IRWB - 1
-               DO 190 JCOL = 1, NRHS
-                  DO 180 JROW = ST, ST + NSIZE - 1
-                     J = J + 1
-                     RWORK( J ) = DBLE( B( JROW, JCOL ) )
-  180             CONTINUE
-  190          CONTINUE
-               CALL DGEMM( 'T', 'N', NSIZE, NRHS, NSIZE, ONE,
-     $                     RWORK( U+ST1 ), N, RWORK( IRWB ), NSIZE,
-     $                     ZERO, RWORK( IRWRB ), NSIZE )
-               J = IRWB - 1
-               DO 210 JCOL = 1, NRHS
-                  DO 200 JROW = ST, ST + NSIZE - 1
-                     J = J + 1
-                     RWORK( J ) = DIMAG( B( JROW, JCOL ) )
-  200             CONTINUE
-  210          CONTINUE
-               CALL DGEMM( 'T', 'N', NSIZE, NRHS, NSIZE, ONE,
-     $                     RWORK( U+ST1 ), N, RWORK( IRWB ), NSIZE,
-     $                     ZERO, RWORK( IRWIB ), NSIZE )
-               JREAL = IRWRB - 1
-               JIMAG = IRWIB - 1
-               DO 230 JCOL = 1, NRHS
-                  DO 220 JROW = ST, ST + NSIZE - 1
-                     JREAL = JREAL + 1
-                     JIMAG = JIMAG + 1
-                     B( JROW, JCOL ) = DCMPLX( RWORK( JREAL ),
-     $                                 RWORK( JIMAG ) )
-  220             CONTINUE
-  230          CONTINUE
-*
-               CALL ZLACPY( 'A', NSIZE, NRHS, B( ST, 1 ), LDB,
-     $                      WORK( BX+ST1 ), N )
-            ELSE
-*
-*              A large problem. Solve it using divide and conquer.
-*
-               CALL DLASDA( ICMPQ1, SMLSIZ, NSIZE, SQRE, D( ST ),
-     $                      E( ST ), RWORK( U+ST1 ), N, RWORK( VT+ST1 ),
-     $                      IWORK( K+ST1 ), RWORK( DIFL+ST1 ),
-     $                      RWORK( DIFR+ST1 ), RWORK( Z+ST1 ),
-     $                      RWORK( POLES+ST1 ), IWORK( GIVPTR+ST1 ),
-     $                      IWORK( GIVCOL+ST1 ), N, IWORK( PERM+ST1 ),
-     $                      RWORK( GIVNUM+ST1 ), RWORK( C+ST1 ),
-     $                      RWORK( S+ST1 ), RWORK( NRWORK ),
-     $                      IWORK( IWK ), INFO )
-               IF( INFO.NE.0 ) THEN
-                  RETURN
-               END IF
-               BXST = BX + ST1
-               CALL ZLALSA( ICMPQ2, SMLSIZ, NSIZE, NRHS, B( ST, 1 ),
-     $                      LDB, WORK( BXST ), N, RWORK( U+ST1 ), N,
-     $                      RWORK( VT+ST1 ), IWORK( K+ST1 ),
-     $                      RWORK( DIFL+ST1 ), RWORK( DIFR+ST1 ),
-     $                      RWORK( Z+ST1 ), RWORK( POLES+ST1 ),
-     $                      IWORK( GIVPTR+ST1 ), IWORK( GIVCOL+ST1 ), N,
-     $                      IWORK( PERM+ST1 ), RWORK( GIVNUM+ST1 ),
-     $                      RWORK( C+ST1 ), RWORK( S+ST1 ),
-     $                      RWORK( NRWORK ), IWORK( IWK ), INFO )
-               IF( INFO.NE.0 ) THEN
-                  RETURN
-               END IF
-            END IF
-            ST = I + 1
-         END IF
-  240 CONTINUE
-*
-*     Apply the singular values and treat the tiny ones as zero.
-*
-      TOL = RCND*ABS( D( IDAMAX( N, D, 1 ) ) )
-*
-      DO 250 I = 1, N
-*
-*        Some of the elements in D can be negative because 1-by-1
-*        subproblems were not solved explicitly.
-*
-         IF( ABS( D( I ) ).LE.TOL ) THEN
-            CALL ZLASET( 'A', 1, NRHS, CZERO, CZERO, WORK( BX+I-1 ), N )
-         ELSE
-            RANK = RANK + 1
-            CALL ZLASCL( 'G', 0, 0, D( I ), ONE, 1, NRHS,
-     $                   WORK( BX+I-1 ), N, INFO )
-         END IF
-         D( I ) = ABS( D( I ) )
-  250 CONTINUE
-*
-*     Now apply back the right singular vectors.
-*
-      ICMPQ2 = 1
-      DO 320 I = 1, NSUB
-         ST = IWORK( I )
-         ST1 = ST - 1
-         NSIZE = IWORK( SIZEI+I-1 )
-         BXST = BX + ST1
-         IF( NSIZE.EQ.1 ) THEN
-            CALL ZCOPY( NRHS, WORK( BXST ), N, B( ST, 1 ), LDB )
-         ELSE IF( NSIZE.LE.SMLSIZ ) THEN
-*
-*           Since B and BX are complex, the following call to DGEMM
-*           is performed in two steps (real and imaginary parts).
-*
-*           CALL DGEMM( 'T', 'N', NSIZE, NRHS, NSIZE, ONE,
-*    $                  RWORK( VT+ST1 ), N, RWORK( BXST ), N, ZERO,
-*    $                  B( ST, 1 ), LDB )
-*
-            J = BXST - N - 1
-            JREAL = IRWB - 1
-            DO 270 JCOL = 1, NRHS
-               J = J + N
-               DO 260 JROW = 1, NSIZE
-                  JREAL = JREAL + 1
-                  RWORK( JREAL ) = DBLE( WORK( J+JROW ) )
-  260          CONTINUE
-  270       CONTINUE
-            CALL DGEMM( 'T', 'N', NSIZE, NRHS, NSIZE, ONE,
-     $                  RWORK( VT+ST1 ), N, RWORK( IRWB ), NSIZE, ZERO,
-     $                  RWORK( IRWRB ), NSIZE )
-            J = BXST - N - 1
-            JIMAG = IRWB - 1
-            DO 290 JCOL = 1, NRHS
-               J = J + N
-               DO 280 JROW = 1, NSIZE
-                  JIMAG = JIMAG + 1
-                  RWORK( JIMAG ) = DIMAG( WORK( J+JROW ) )
-  280          CONTINUE
-  290       CONTINUE
-            CALL DGEMM( 'T', 'N', NSIZE, NRHS, NSIZE, ONE,
-     $                  RWORK( VT+ST1 ), N, RWORK( IRWB ), NSIZE, ZERO,
-     $                  RWORK( IRWIB ), NSIZE )
-            JREAL = IRWRB - 1
-            JIMAG = IRWIB - 1
-            DO 310 JCOL = 1, NRHS
-               DO 300 JROW = ST, ST + NSIZE - 1
-                  JREAL = JREAL + 1
-                  JIMAG = JIMAG + 1
-                  B( JROW, JCOL ) = DCMPLX( RWORK( JREAL ),
-     $                              RWORK( JIMAG ) )
-  300          CONTINUE
-  310       CONTINUE
-         ELSE
-            CALL ZLALSA( ICMPQ2, SMLSIZ, NSIZE, NRHS, WORK( BXST ), N,
-     $                   B( ST, 1 ), LDB, RWORK( U+ST1 ), N,
-     $                   RWORK( VT+ST1 ), IWORK( K+ST1 ),
-     $                   RWORK( DIFL+ST1 ), RWORK( DIFR+ST1 ),
-     $                   RWORK( Z+ST1 ), RWORK( POLES+ST1 ),
-     $                   IWORK( GIVPTR+ST1 ), IWORK( GIVCOL+ST1 ), N,
-     $                   IWORK( PERM+ST1 ), RWORK( GIVNUM+ST1 ),
-     $                   RWORK( C+ST1 ), RWORK( S+ST1 ),
-     $                   RWORK( NRWORK ), IWORK( IWK ), INFO )
-            IF( INFO.NE.0 ) THEN
-               RETURN
-            END IF
-         END IF
-  320 CONTINUE
-*
-*     Unscale and sort the singular values.
-*
-      CALL DLASCL( 'G', 0, 0, ONE, ORGNRM, N, 1, D, N, INFO )
-      CALL DLASRT( 'D', N, D, INFO )
-      CALL ZLASCL( 'G', 0, 0, ORGNRM, ONE, N, NRHS, B, LDB, INFO )
-*
-      RETURN
-*
-*     End of ZLALSD
-*
-      END
--- a/libcruft/lapack/zlange.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-      DOUBLE PRECISION FUNCTION ZLANGE( NORM, M, N, A, LDA, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   WORK( * )
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLANGE  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  complex matrix A.
-*
-*  Description
-*  ===========
-*
-*  ZLANGE returns the value
-*
-*     ZLANGE = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in ZLANGE as described
-*          above.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.  When M = 0,
-*          ZLANGE is set to zero.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.  When N = 0,
-*          ZLANGE is set to zero.
-*
-*  A       (input) COMPLEX*16 array, dimension (LDA,N)
-*          The m by n matrix A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(M,1).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)),
-*          where LWORK >= M when NORM = 'I'; otherwise, WORK is not
-*          referenced.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      DOUBLE PRECISION   SCALE, SUM, VALUE
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZLASSQ
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( MIN( M, N ).EQ.0 ) THEN
-         VALUE = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         VALUE = ZERO
-         DO 20 J = 1, N
-            DO 10 I = 1, M
-               VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   10       CONTINUE
-   20    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN
-*
-*        Find norm1(A).
-*
-         VALUE = ZERO
-         DO 40 J = 1, N
-            SUM = ZERO
-            DO 30 I = 1, M
-               SUM = SUM + ABS( A( I, J ) )
-   30       CONTINUE
-            VALUE = MAX( VALUE, SUM )
-   40    CONTINUE
-      ELSE IF( LSAME( NORM, 'I' ) ) THEN
-*
-*        Find normI(A).
-*
-         DO 50 I = 1, M
-            WORK( I ) = ZERO
-   50    CONTINUE
-         DO 70 J = 1, N
-            DO 60 I = 1, M
-               WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-   60       CONTINUE
-   70    CONTINUE
-         VALUE = ZERO
-         DO 80 I = 1, M
-            VALUE = MAX( VALUE, WORK( I ) )
-   80    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         SCALE = ZERO
-         SUM = ONE
-         DO 90 J = 1, N
-            CALL ZLASSQ( M, A( 1, J ), 1, SCALE, SUM )
-   90    CONTINUE
-         VALUE = SCALE*SQRT( SUM )
-      END IF
-*
-      ZLANGE = VALUE
-      RETURN
-*
-*     End of ZLANGE
-*
-      END
--- a/libcruft/lapack/zlanhe.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,187 +0,0 @@
-      DOUBLE PRECISION FUNCTION ZLANHE( NORM, UPLO, N, A, LDA, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM, UPLO
-      INTEGER            LDA, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   WORK( * )
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLANHE  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  complex hermitian matrix A.
-*
-*  Description
-*  ===========
-*
-*  ZLANHE returns the value
-*
-*     ZLANHE = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in ZLANHE as described
-*          above.
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          hermitian matrix A is to be referenced.
-*          = 'U':  Upper triangular part of A is referenced
-*          = 'L':  Lower triangular part of A is referenced
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.  When N = 0, ZLANHE is
-*          set to zero.
-*
-*  A       (input) COMPLEX*16 array, dimension (LDA,N)
-*          The hermitian matrix A.  If UPLO = 'U', the leading n by n
-*          upper triangular part of A contains the upper triangular part
-*          of the matrix A, and the strictly lower triangular part of A
-*          is not referenced.  If UPLO = 'L', the leading n by n lower
-*          triangular part of A contains the lower triangular part of
-*          the matrix A, and the strictly upper triangular part of A is
-*          not referenced. Note that the imaginary parts of the diagonal
-*          elements need not be set and are assumed to be zero.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(N,1).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)),
-*          where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise,
-*          WORK is not referenced.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      DOUBLE PRECISION   ABSA, SCALE, SUM, VALUE
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZLASSQ
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.EQ.0 ) THEN
-         VALUE = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         VALUE = ZERO
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            DO 20 J = 1, N
-               DO 10 I = 1, J - 1
-                  VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   10          CONTINUE
-               VALUE = MAX( VALUE, ABS( DBLE( A( J, J ) ) ) )
-   20       CONTINUE
-         ELSE
-            DO 40 J = 1, N
-               VALUE = MAX( VALUE, ABS( DBLE( A( J, J ) ) ) )
-               DO 30 I = J + 1, N
-                  VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   30          CONTINUE
-   40       CONTINUE
-         END IF
-      ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR.
-     $         ( NORM.EQ.'1' ) ) THEN
-*
-*        Find normI(A) ( = norm1(A), since A is hermitian).
-*
-         VALUE = ZERO
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            DO 60 J = 1, N
-               SUM = ZERO
-               DO 50 I = 1, J - 1
-                  ABSA = ABS( A( I, J ) )
-                  SUM = SUM + ABSA
-                  WORK( I ) = WORK( I ) + ABSA
-   50          CONTINUE
-               WORK( J ) = SUM + ABS( DBLE( A( J, J ) ) )
-   60       CONTINUE
-            DO 70 I = 1, N
-               VALUE = MAX( VALUE, WORK( I ) )
-   70       CONTINUE
-         ELSE
-            DO 80 I = 1, N
-               WORK( I ) = ZERO
-   80       CONTINUE
-            DO 100 J = 1, N
-               SUM = WORK( J ) + ABS( DBLE( A( J, J ) ) )
-               DO 90 I = J + 1, N
-                  ABSA = ABS( A( I, J ) )
-                  SUM = SUM + ABSA
-                  WORK( I ) = WORK( I ) + ABSA
-   90          CONTINUE
-               VALUE = MAX( VALUE, SUM )
-  100       CONTINUE
-         END IF
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         SCALE = ZERO
-         SUM = ONE
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            DO 110 J = 2, N
-               CALL ZLASSQ( J-1, A( 1, J ), 1, SCALE, SUM )
-  110       CONTINUE
-         ELSE
-            DO 120 J = 1, N - 1
-               CALL ZLASSQ( N-J, A( J+1, J ), 1, SCALE, SUM )
-  120       CONTINUE
-         END IF
-         SUM = 2*SUM
-         DO 130 I = 1, N
-            IF( DBLE( A( I, I ) ).NE.ZERO ) THEN
-               ABSA = ABS( DBLE( A( I, I ) ) )
-               IF( SCALE.LT.ABSA ) THEN
-                  SUM = ONE + SUM*( SCALE / ABSA )**2
-                  SCALE = ABSA
-               ELSE
-                  SUM = SUM + ( ABSA / SCALE )**2
-               END IF
-            END IF
-  130    CONTINUE
-         VALUE = SCALE*SQRT( SUM )
-      END IF
-*
-      ZLANHE = VALUE
-      RETURN
-*
-*     End of ZLANHE
-*
-      END
--- a/libcruft/lapack/zlanhs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-      DOUBLE PRECISION FUNCTION ZLANHS( NORM, N, A, LDA, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          NORM
-      INTEGER            LDA, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   WORK( * )
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLANHS  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  Hessenberg matrix A.
-*
-*  Description
-*  ===========
-*
-*  ZLANHS returns the value
-*
-*     ZLANHS = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in ZLANHS as described
-*          above.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.  When N = 0, ZLANHS is
-*          set to zero.
-*
-*  A       (input) COMPLEX*16 array, dimension (LDA,N)
-*          The n by n upper Hessenberg matrix A; the part of A below the
-*          first sub-diagonal is not referenced.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(N,1).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)),
-*          where LWORK >= N when NORM = 'I'; otherwise, WORK is not
-*          referenced.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      DOUBLE PRECISION   SCALE, SUM, VALUE
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZLASSQ
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.EQ.0 ) THEN
-         VALUE = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         VALUE = ZERO
-         DO 20 J = 1, N
-            DO 10 I = 1, MIN( N, J+1 )
-               VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   10       CONTINUE
-   20    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN
-*
-*        Find norm1(A).
-*
-         VALUE = ZERO
-         DO 40 J = 1, N
-            SUM = ZERO
-            DO 30 I = 1, MIN( N, J+1 )
-               SUM = SUM + ABS( A( I, J ) )
-   30       CONTINUE
-            VALUE = MAX( VALUE, SUM )
-   40    CONTINUE
-      ELSE IF( LSAME( NORM, 'I' ) ) THEN
-*
-*        Find normI(A).
-*
-         DO 50 I = 1, N
-            WORK( I ) = ZERO
-   50    CONTINUE
-         DO 70 J = 1, N
-            DO 60 I = 1, MIN( N, J+1 )
-               WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-   60       CONTINUE
-   70    CONTINUE
-         VALUE = ZERO
-         DO 80 I = 1, N
-            VALUE = MAX( VALUE, WORK( I ) )
-   80    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         SCALE = ZERO
-         SUM = ONE
-         DO 90 J = 1, N
-            CALL ZLASSQ( MIN( N, J+1 ), A( 1, J ), 1, SCALE, SUM )
-   90    CONTINUE
-         VALUE = SCALE*SQRT( SUM )
-      END IF
-*
-      ZLANHS = VALUE
-      RETURN
-*
-*     End of ZLANHS
-*
-      END
--- a/libcruft/lapack/zlantr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,277 +0,0 @@
-      DOUBLE PRECISION FUNCTION ZLANTR( NORM, UPLO, DIAG, M, N, A, LDA,
-     $                 WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, NORM, UPLO
-      INTEGER            LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   WORK( * )
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLANTR  returns the value of the one norm,  or the Frobenius norm, or
-*  the  infinity norm,  or the  element of  largest absolute value  of a
-*  trapezoidal or triangular matrix A.
-*
-*  Description
-*  ===========
-*
-*  ZLANTR returns the value
-*
-*     ZLANTR = ( max(abs(A(i,j))), NORM = 'M' or 'm'
-*              (
-*              ( norm1(A),         NORM = '1', 'O' or 'o'
-*              (
-*              ( normI(A),         NORM = 'I' or 'i'
-*              (
-*              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
-*
-*  where  norm1  denotes the  one norm of a matrix (maximum column sum),
-*  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
-*  normF  denotes the  Frobenius norm of a matrix (square root of sum of
-*  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies the value to be returned in ZLANTR as described
-*          above.
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the matrix A is upper or lower trapezoidal.
-*          = 'U':  Upper trapezoidal
-*          = 'L':  Lower trapezoidal
-*          Note that A is triangular instead of trapezoidal if M = N.
-*
-*  DIAG    (input) CHARACTER*1
-*          Specifies whether or not the matrix A has unit diagonal.
-*          = 'N':  Non-unit diagonal
-*          = 'U':  Unit diagonal
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0, and if
-*          UPLO = 'U', M <= N.  When M = 0, ZLANTR is set to zero.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0, and if
-*          UPLO = 'L', N <= M.  When N = 0, ZLANTR is set to zero.
-*
-*  A       (input) COMPLEX*16 array, dimension (LDA,N)
-*          The trapezoidal matrix A (A is triangular if M = N).
-*          If UPLO = 'U', the leading m by n upper trapezoidal part of
-*          the array A contains the upper trapezoidal matrix, and the
-*          strictly lower triangular part of A is not referenced.
-*          If UPLO = 'L', the leading m by n lower trapezoidal part of
-*          the array A contains the lower trapezoidal matrix, and the
-*          strictly upper triangular part of A is not referenced.  Note
-*          that when DIAG = 'U', the diagonal elements of A are not
-*          referenced and are assumed to be one.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(M,1).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)),
-*          where LWORK >= M when NORM = 'I'; otherwise, WORK is not
-*          referenced.
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UDIAG
-      INTEGER            I, J
-      DOUBLE PRECISION   SCALE, SUM, VALUE
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZLASSQ
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-      IF( MIN( M, N ).EQ.0 ) THEN
-         VALUE = ZERO
-      ELSE IF( LSAME( NORM, 'M' ) ) THEN
-*
-*        Find max(abs(A(i,j))).
-*
-         IF( LSAME( DIAG, 'U' ) ) THEN
-            VALUE = ONE
-            IF( LSAME( UPLO, 'U' ) ) THEN
-               DO 20 J = 1, N
-                  DO 10 I = 1, MIN( M, J-1 )
-                     VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   10             CONTINUE
-   20          CONTINUE
-            ELSE
-               DO 40 J = 1, N
-                  DO 30 I = J + 1, M
-                     VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   30             CONTINUE
-   40          CONTINUE
-            END IF
-         ELSE
-            VALUE = ZERO
-            IF( LSAME( UPLO, 'U' ) ) THEN
-               DO 60 J = 1, N
-                  DO 50 I = 1, MIN( M, J )
-                     VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   50             CONTINUE
-   60          CONTINUE
-            ELSE
-               DO 80 J = 1, N
-                  DO 70 I = J, M
-                     VALUE = MAX( VALUE, ABS( A( I, J ) ) )
-   70             CONTINUE
-   80          CONTINUE
-            END IF
-         END IF
-      ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN
-*
-*        Find norm1(A).
-*
-         VALUE = ZERO
-         UDIAG = LSAME( DIAG, 'U' )
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            DO 110 J = 1, N
-               IF( ( UDIAG ) .AND. ( J.LE.M ) ) THEN
-                  SUM = ONE
-                  DO 90 I = 1, J - 1
-                     SUM = SUM + ABS( A( I, J ) )
-   90             CONTINUE
-               ELSE
-                  SUM = ZERO
-                  DO 100 I = 1, MIN( M, J )
-                     SUM = SUM + ABS( A( I, J ) )
-  100             CONTINUE
-               END IF
-               VALUE = MAX( VALUE, SUM )
-  110       CONTINUE
-         ELSE
-            DO 140 J = 1, N
-               IF( UDIAG ) THEN
-                  SUM = ONE
-                  DO 120 I = J + 1, M
-                     SUM = SUM + ABS( A( I, J ) )
-  120             CONTINUE
-               ELSE
-                  SUM = ZERO
-                  DO 130 I = J, M
-                     SUM = SUM + ABS( A( I, J ) )
-  130             CONTINUE
-               END IF
-               VALUE = MAX( VALUE, SUM )
-  140       CONTINUE
-         END IF
-      ELSE IF( LSAME( NORM, 'I' ) ) THEN
-*
-*        Find normI(A).
-*
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            IF( LSAME( DIAG, 'U' ) ) THEN
-               DO 150 I = 1, M
-                  WORK( I ) = ONE
-  150          CONTINUE
-               DO 170 J = 1, N
-                  DO 160 I = 1, MIN( M, J-1 )
-                     WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-  160             CONTINUE
-  170          CONTINUE
-            ELSE
-               DO 180 I = 1, M
-                  WORK( I ) = ZERO
-  180          CONTINUE
-               DO 200 J = 1, N
-                  DO 190 I = 1, MIN( M, J )
-                     WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-  190             CONTINUE
-  200          CONTINUE
-            END IF
-         ELSE
-            IF( LSAME( DIAG, 'U' ) ) THEN
-               DO 210 I = 1, N
-                  WORK( I ) = ONE
-  210          CONTINUE
-               DO 220 I = N + 1, M
-                  WORK( I ) = ZERO
-  220          CONTINUE
-               DO 240 J = 1, N
-                  DO 230 I = J + 1, M
-                     WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-  230             CONTINUE
-  240          CONTINUE
-            ELSE
-               DO 250 I = 1, M
-                  WORK( I ) = ZERO
-  250          CONTINUE
-               DO 270 J = 1, N
-                  DO 260 I = J, M
-                     WORK( I ) = WORK( I ) + ABS( A( I, J ) )
-  260             CONTINUE
-  270          CONTINUE
-            END IF
-         END IF
-         VALUE = ZERO
-         DO 280 I = 1, M
-            VALUE = MAX( VALUE, WORK( I ) )
-  280    CONTINUE
-      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
-*
-*        Find normF(A).
-*
-         IF( LSAME( UPLO, 'U' ) ) THEN
-            IF( LSAME( DIAG, 'U' ) ) THEN
-               SCALE = ONE
-               SUM = MIN( M, N )
-               DO 290 J = 2, N
-                  CALL ZLASSQ( MIN( M, J-1 ), A( 1, J ), 1, SCALE, SUM )
-  290          CONTINUE
-            ELSE
-               SCALE = ZERO
-               SUM = ONE
-               DO 300 J = 1, N
-                  CALL ZLASSQ( MIN( M, J ), A( 1, J ), 1, SCALE, SUM )
-  300          CONTINUE
-            END IF
-         ELSE
-            IF( LSAME( DIAG, 'U' ) ) THEN
-               SCALE = ONE
-               SUM = MIN( M, N )
-               DO 310 J = 1, N
-                  CALL ZLASSQ( M-J, A( MIN( M, J+1 ), J ), 1, SCALE,
-     $                         SUM )
-  310          CONTINUE
-            ELSE
-               SCALE = ZERO
-               SUM = ONE
-               DO 320 J = 1, N
-                  CALL ZLASSQ( M-J+1, A( J, J ), 1, SCALE, SUM )
-  320          CONTINUE
-            END IF
-         END IF
-         VALUE = SCALE*SQRT( SUM )
-      END IF
-*
-      ZLANTR = VALUE
-      RETURN
-*
-*     End of ZLANTR
-*
-      END
--- a/libcruft/lapack/zlaqp2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,179 +0,0 @@
-      SUBROUTINE ZLAQP2( M, N, OFFSET, A, LDA, JPVT, TAU, VN1, VN2,
-     $                   WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            LDA, M, N, OFFSET
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      DOUBLE PRECISION   VN1( * ), VN2( * )
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLAQP2 computes a QR factorization with column pivoting of
-*  the block A(OFFSET+1:M,1:N).
-*  The block A(1:OFFSET,1:N) is accordingly pivoted, but not factorized.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0.
-*
-*  OFFSET  (input) INTEGER
-*          The number of rows of the matrix A that must be pivoted
-*          but no factorized. OFFSET >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, the upper triangle of block A(OFFSET+1:M,1:N) is
-*          the triangular factor obtained; the elements in block
-*          A(OFFSET+1:M,1:N) below the diagonal, together with the
-*          array TAU, represent the orthogonal matrix Q as a product of
-*          elementary reflectors. Block A(1:OFFSET,1:N) has been
-*          accordingly pivoted, but no factorized.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          On entry, if JPVT(i) .ne. 0, the i-th column of A is permuted
-*          to the front of A*P (a leading column); if JPVT(i) = 0,
-*          the i-th column of A is a free column.
-*          On exit, if JPVT(i) = k, then the i-th column of A*P
-*          was the k-th column of A.
-*
-*  TAU     (output) COMPLEX*16 array, dimension (min(M,N))
-*          The scalar factors of the elementary reflectors.
-*
-*  VN1     (input/output) DOUBLE PRECISION array, dimension (N)
-*          The vector with the partial column norms.
-*
-*  VN2     (input/output) DOUBLE PRECISION array, dimension (N)
-*          The vector with the exact column norms.
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (N)
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*    X. Sun, Computer Science Dept., Duke University, USA
-*
-*  Partial column norm updating strategy modified by
-*    Z. Drmac and Z. Bujanovic, Dept. of Mathematics,
-*    University of Zagreb, Croatia.
-*    June 2006.
-*  For more details see LAPACK Working Note 176.
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      COMPLEX*16         CONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0,
-     $                   CONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ITEMP, J, MN, OFFPI, PVT
-      DOUBLE PRECISION   TEMP, TEMP2, TOL3Z
-      COMPLEX*16         AII
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZLARF, ZLARFG, ZSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DCONJG, MAX, MIN, SQRT
-*     ..
-*     .. External Functions ..
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DLAMCH, DZNRM2
-      EXTERNAL           IDAMAX, DLAMCH, DZNRM2
-*     ..
-*     .. Executable Statements ..
-*
-      MN = MIN( M-OFFSET, N )
-      TOL3Z = SQRT(DLAMCH('Epsilon'))
-*
-*     Compute factorization.
-*
-      DO 20 I = 1, MN
-*
-         OFFPI = OFFSET + I
-*
-*        Determine ith pivot column and swap if necessary.
-*
-         PVT = ( I-1 ) + IDAMAX( N-I+1, VN1( I ), 1 )
-*
-         IF( PVT.NE.I ) THEN
-            CALL ZSWAP( M, A( 1, PVT ), 1, A( 1, I ), 1 )
-            ITEMP = JPVT( PVT )
-            JPVT( PVT ) = JPVT( I )
-            JPVT( I ) = ITEMP
-            VN1( PVT ) = VN1( I )
-            VN2( PVT ) = VN2( I )
-         END IF
-*
-*        Generate elementary reflector H(i).
-*
-         IF( OFFPI.LT.M ) THEN
-            CALL ZLARFG( M-OFFPI+1, A( OFFPI, I ), A( OFFPI+1, I ), 1,
-     $                   TAU( I ) )
-         ELSE
-            CALL ZLARFG( 1, A( M, I ), A( M, I ), 1, TAU( I ) )
-         END IF
-*
-         IF( I.LT.N ) THEN
-*
-*           Apply H(i)' to A(offset+i:m,i+1:n) from the left.
-*
-            AII = A( OFFPI, I )
-            A( OFFPI, I ) = CONE
-            CALL ZLARF( 'Left', M-OFFPI+1, N-I, A( OFFPI, I ), 1,
-     $                  DCONJG( TAU( I ) ), A( OFFPI, I+1 ), LDA,
-     $                  WORK( 1 ) )
-            A( OFFPI, I ) = AII
-         END IF
-*
-*        Update partial column norms.
-*
-         DO 10 J = I + 1, N
-            IF( VN1( J ).NE.ZERO ) THEN
-*
-*              NOTE: The following 4 lines follow from the analysis in
-*              Lapack Working Note 176.
-*
-               TEMP = ONE - ( ABS( A( OFFPI, J ) ) / VN1( J ) )**2
-               TEMP = MAX( TEMP, ZERO )
-               TEMP2 = TEMP*( VN1( J ) / VN2( J ) )**2
-               IF( TEMP2 .LE. TOL3Z ) THEN
-                  IF( OFFPI.LT.M ) THEN
-                     VN1( J ) = DZNRM2( M-OFFPI, A( OFFPI+1, J ), 1 )
-                     VN2( J ) = VN1( J )
-                  ELSE
-                     VN1( J ) = ZERO
-                     VN2( J ) = ZERO
-                  END IF
-               ELSE
-                  VN1( J ) = VN1( J )*SQRT( TEMP )
-               END IF
-            END IF
-   10    CONTINUE
-*
-   20 CONTINUE
-*
-      RETURN
-*
-*     End of ZLAQP2
-*
-      END
--- a/libcruft/lapack/zlaqps.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,266 +0,0 @@
-      SUBROUTINE ZLAQPS( M, N, OFFSET, NB, KB, A, LDA, JPVT, TAU, VN1,
-     $                   VN2, AUXV, F, LDF )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            KB, LDA, LDF, M, N, NB, OFFSET
-*     ..
-*     .. Array Arguments ..
-      INTEGER            JPVT( * )
-      DOUBLE PRECISION   VN1( * ), VN2( * )
-      COMPLEX*16         A( LDA, * ), AUXV( * ), F( LDF, * ), TAU( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLAQPS computes a step of QR factorization with column pivoting
-*  of a complex M-by-N matrix A by using Blas-3.  It tries to factorize
-*  NB columns from A starting from the row OFFSET+1, and updates all
-*  of the matrix with Blas-3 xGEMM.
-*
-*  In some cases, due to catastrophic cancellations, it cannot
-*  factorize NB columns.  Hence, the actual number of factorized
-*  columns is returned in KB.
-*
-*  Block A(1:OFFSET,1:N) is accordingly pivoted, but not factorized.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A. N >= 0
-*
-*  OFFSET  (input) INTEGER
-*          The number of rows of A that have been factorized in
-*          previous steps.
-*
-*  NB      (input) INTEGER
-*          The number of columns to factorize.
-*
-*  KB      (output) INTEGER
-*          The number of columns actually factorized.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the M-by-N matrix A.
-*          On exit, block A(OFFSET+1:M,1:KB) is the triangular
-*          factor obtained and block A(1:OFFSET,1:N) has been
-*          accordingly pivoted, but no factorized.
-*          The rest of the matrix, block A(OFFSET+1:M,KB+1:N) has
-*          been updated.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  JPVT    (input/output) INTEGER array, dimension (N)
-*          JPVT(I) = K <==> Column K of the full matrix A has been
-*          permuted into position I in AP.
-*
-*  TAU     (output) COMPLEX*16 array, dimension (KB)
-*          The scalar factors of the elementary reflectors.
-*
-*  VN1     (input/output) DOUBLE PRECISION array, dimension (N)
-*          The vector with the partial column norms.
-*
-*  VN2     (input/output) DOUBLE PRECISION array, dimension (N)
-*          The vector with the exact column norms.
-*
-*  AUXV    (input/output) COMPLEX*16 array, dimension (NB)
-*          Auxiliar vector.
-*
-*  F       (input/output) COMPLEX*16 array, dimension (LDF,NB)
-*          Matrix F' = L*Y'*A.
-*
-*  LDF     (input) INTEGER
-*          The leading dimension of the array F. LDF >= max(1,N).
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
-*    X. Sun, Computer Science Dept., Duke University, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      COMPLEX*16         CZERO, CONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0,
-     $                   CZERO = ( 0.0D+0, 0.0D+0 ),
-     $                   CONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            ITEMP, J, K, LASTRK, LSTICC, PVT, RK
-      DOUBLE PRECISION   TEMP, TEMP2, TOL3Z
-      COMPLEX*16         AKK
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZGEMM, ZGEMV, ZLARFG, ZSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCONJG, MAX, MIN, NINT, SQRT
-*     ..
-*     .. External Functions ..
-      INTEGER            IDAMAX
-      DOUBLE PRECISION   DLAMCH, DZNRM2
-      EXTERNAL           IDAMAX, DLAMCH, DZNRM2
-*     ..
-*     .. Executable Statements ..
-*
-      LASTRK = MIN( M, N+OFFSET )
-      LSTICC = 0
-      K = 0
-      TOL3Z = SQRT(DLAMCH('Epsilon'))
-*
-*     Beginning of while loop.
-*
-   10 CONTINUE
-      IF( ( K.LT.NB ) .AND. ( LSTICC.EQ.0 ) ) THEN
-         K = K + 1
-         RK = OFFSET + K
-*
-*        Determine ith pivot column and swap if necessary
-*
-         PVT = ( K-1 ) + IDAMAX( N-K+1, VN1( K ), 1 )
-         IF( PVT.NE.K ) THEN
-            CALL ZSWAP( M, A( 1, PVT ), 1, A( 1, K ), 1 )
-            CALL ZSWAP( K-1, F( PVT, 1 ), LDF, F( K, 1 ), LDF )
-            ITEMP = JPVT( PVT )
-            JPVT( PVT ) = JPVT( K )
-            JPVT( K ) = ITEMP
-            VN1( PVT ) = VN1( K )
-            VN2( PVT ) = VN2( K )
-         END IF
-*
-*        Apply previous Householder reflectors to column K:
-*        A(RK:M,K) := A(RK:M,K) - A(RK:M,1:K-1)*F(K,1:K-1)'.
-*
-         IF( K.GT.1 ) THEN
-            DO 20 J = 1, K - 1
-               F( K, J ) = DCONJG( F( K, J ) )
-   20       CONTINUE
-            CALL ZGEMV( 'No transpose', M-RK+1, K-1, -CONE, A( RK, 1 ),
-     $                  LDA, F( K, 1 ), LDF, CONE, A( RK, K ), 1 )
-            DO 30 J = 1, K - 1
-               F( K, J ) = DCONJG( F( K, J ) )
-   30       CONTINUE
-         END IF
-*
-*        Generate elementary reflector H(k).
-*
-         IF( RK.LT.M ) THEN
-            CALL ZLARFG( M-RK+1, A( RK, K ), A( RK+1, K ), 1, TAU( K ) )
-         ELSE
-            CALL ZLARFG( 1, A( RK, K ), A( RK, K ), 1, TAU( K ) )
-         END IF
-*
-         AKK = A( RK, K )
-         A( RK, K ) = CONE
-*
-*        Compute Kth column of F:
-*
-*        Compute  F(K+1:N,K) := tau(K)*A(RK:M,K+1:N)'*A(RK:M,K).
-*
-         IF( K.LT.N ) THEN
-            CALL ZGEMV( 'Conjugate transpose', M-RK+1, N-K, TAU( K ),
-     $                  A( RK, K+1 ), LDA, A( RK, K ), 1, CZERO,
-     $                  F( K+1, K ), 1 )
-         END IF
-*
-*        Padding F(1:K,K) with zeros.
-*
-         DO 40 J = 1, K
-            F( J, K ) = CZERO
-   40    CONTINUE
-*
-*        Incremental updating of F:
-*        F(1:N,K) := F(1:N,K) - tau(K)*F(1:N,1:K-1)*A(RK:M,1:K-1)'
-*                    *A(RK:M,K).
-*
-         IF( K.GT.1 ) THEN
-            CALL ZGEMV( 'Conjugate transpose', M-RK+1, K-1, -TAU( K ),
-     $                  A( RK, 1 ), LDA, A( RK, K ), 1, CZERO,
-     $                  AUXV( 1 ), 1 )
-*
-            CALL ZGEMV( 'No transpose', N, K-1, CONE, F( 1, 1 ), LDF,
-     $                  AUXV( 1 ), 1, CONE, F( 1, K ), 1 )
-         END IF
-*
-*        Update the current row of A:
-*        A(RK,K+1:N) := A(RK,K+1:N) - A(RK,1:K)*F(K+1:N,1:K)'.
-*
-         IF( K.LT.N ) THEN
-            CALL ZGEMM( 'No transpose', 'Conjugate transpose', 1, N-K,
-     $                  K, -CONE, A( RK, 1 ), LDA, F( K+1, 1 ), LDF,
-     $                  CONE, A( RK, K+1 ), LDA )
-         END IF
-*
-*        Update partial column norms.
-*
-         IF( RK.LT.LASTRK ) THEN
-            DO 50 J = K + 1, N
-               IF( VN1( J ).NE.ZERO ) THEN
-*
-*                 NOTE: The following 4 lines follow from the analysis in
-*                 Lapack Working Note 176.
-*
-                  TEMP = ABS( A( RK, J ) ) / VN1( J )
-                  TEMP = MAX( ZERO, ( ONE+TEMP )*( ONE-TEMP ) )
-                  TEMP2 = TEMP*( VN1( J ) / VN2( J ) )**2
-                  IF( TEMP2 .LE. TOL3Z ) THEN
-                     VN2( J ) = DBLE( LSTICC )
-                     LSTICC = J
-                  ELSE
-                     VN1( J ) = VN1( J )*SQRT( TEMP )
-                  END IF
-               END IF
-   50       CONTINUE
-         END IF
-*
-         A( RK, K ) = AKK
-*
-*        End of while loop.
-*
-         GO TO 10
-      END IF
-      KB = K
-      RK = OFFSET + KB
-*
-*     Apply the block reflector to the rest of the matrix:
-*     A(OFFSET+KB+1:M,KB+1:N) := A(OFFSET+KB+1:M,KB+1:N) -
-*                         A(OFFSET+KB+1:M,1:KB)*F(KB+1:N,1:KB)'.
-*
-      IF( KB.LT.MIN( N, M-OFFSET ) ) THEN
-         CALL ZGEMM( 'No transpose', 'Conjugate transpose', M-RK, N-KB,
-     $               KB, -CONE, A( RK+1, 1 ), LDA, F( KB+1, 1 ), LDF,
-     $               CONE, A( RK+1, KB+1 ), LDA )
-      END IF
-*
-*     Recomputation of difficult columns.
-*
-   60 CONTINUE
-      IF( LSTICC.GT.0 ) THEN
-         ITEMP = NINT( VN2( LSTICC ) )
-         VN1( LSTICC ) = DZNRM2( M-RK, A( RK+1, LSTICC ), 1 )
-*
-*        NOTE: The computation of VN1( LSTICC ) relies on the fact that 
-*        SNRM2 does not fail on vectors with norm below the value of
-*        SQRT(DLAMCH('S')) 
-*
-         VN2( LSTICC ) = VN1( LSTICC )
-         LSTICC = ITEMP
-         GO TO 60
-      END IF
-*
-      RETURN
-*
-*     End of ZLAQPS
-*
-      END
--- a/libcruft/lapack/zlaqr0.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,601 +0,0 @@
-      SUBROUTINE ZLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ,
-     $                   IHIZ, Z, LDZ, WORK, LWORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, LWORK, N
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         H( LDH, * ), W( * ), WORK( * ), Z( LDZ, * )
-*     ..
-*
-*     Purpose
-*     =======
-*
-*     ZLAQR0 computes the eigenvalues of a Hessenberg matrix H
-*     and, optionally, the matrices T and Z from the Schur decomposition
-*     H = Z T Z**H, where T is an upper triangular matrix (the
-*     Schur form), and Z is the unitary matrix of Schur vectors.
-*
-*     Optionally Z may be postmultiplied into an input unitary
-*     matrix Q so that this routine can give the Schur factorization
-*     of a matrix A which has been reduced to the Hessenberg form H
-*     by the unitary matrix Q:  A = Q*H*Q**H = (QZ)*H*(QZ)**H.
-*
-*     Arguments
-*     =========
-*
-*     WANTT   (input) LOGICAL
-*          = .TRUE. : the full Schur form T is required;
-*          = .FALSE.: only eigenvalues are required.
-*
-*     WANTZ   (input) LOGICAL
-*          = .TRUE. : the matrix of Schur vectors Z is required;
-*          = .FALSE.: Schur vectors are not required.
-*
-*     N     (input) INTEGER
-*           The order of the matrix H.  N .GE. 0.
-*
-*     ILO   (input) INTEGER
-*     IHI   (input) INTEGER
-*           It is assumed that H is already upper triangular in rows
-*           and columns 1:ILO-1 and IHI+1:N and, if ILO.GT.1,
-*           H(ILO,ILO-1) is zero. ILO and IHI are normally set by a
-*           previous call to ZGEBAL, and then passed to ZGEHRD when the
-*           matrix output by ZGEBAL is reduced to Hessenberg form.
-*           Otherwise, ILO and IHI should be set to 1 and N,
-*           respectively.  If N.GT.0, then 1.LE.ILO.LE.IHI.LE.N.
-*           If N = 0, then ILO = 1 and IHI = 0.
-*
-*     H     (input/output) COMPLEX*16 array, dimension (LDH,N)
-*           On entry, the upper Hessenberg matrix H.
-*           On exit, if INFO = 0 and WANTT is .TRUE., then H
-*           contains the upper triangular matrix T from the Schur
-*           decomposition (the Schur form). If INFO = 0 and WANT is
-*           .FALSE., then the contents of H are unspecified on exit.
-*           (The output value of H when INFO.GT.0 is given under the
-*           description of INFO below.)
-*
-*           This subroutine may explicitly set H(i,j) = 0 for i.GT.j and
-*           j = 1, 2, ... ILO-1 or j = IHI+1, IHI+2, ... N.
-*
-*     LDH   (input) INTEGER
-*           The leading dimension of the array H. LDH .GE. max(1,N).
-*
-*     W        (output) COMPLEX*16 array, dimension (N)
-*           The computed eigenvalues of H(ILO:IHI,ILO:IHI) are stored
-*           in W(ILO:IHI). If WANTT is .TRUE., then the eigenvalues are
-*           stored in the same order as on the diagonal of the Schur
-*           form returned in H, with W(i) = H(i,i).
-*
-*     Z     (input/output) COMPLEX*16 array, dimension (LDZ,IHI)
-*           If WANTZ is .FALSE., then Z is not referenced.
-*           If WANTZ is .TRUE., then Z(ILO:IHI,ILOZ:IHIZ) is
-*           replaced by Z(ILO:IHI,ILOZ:IHIZ)*U where U is the
-*           orthogonal Schur factor of H(ILO:IHI,ILO:IHI).
-*           (The output value of Z when INFO.GT.0 is given under
-*           the description of INFO below.)
-*
-*     LDZ   (input) INTEGER
-*           The leading dimension of the array Z.  if WANTZ is .TRUE.
-*           then LDZ.GE.MAX(1,IHIZ).  Otherwize, LDZ.GE.1.
-*
-*     WORK  (workspace/output) COMPLEX*16 array, dimension LWORK
-*           On exit, if LWORK = -1, WORK(1) returns an estimate of
-*           the optimal value for LWORK.
-*
-*     LWORK (input) INTEGER
-*           The dimension of the array WORK.  LWORK .GE. max(1,N)
-*           is sufficient, but LWORK typically as large as 6*N may
-*           be required for optimal performance.  A workspace query
-*           to determine the optimal workspace size is recommended.
-*
-*           If LWORK = -1, then ZLAQR0 does a workspace query.
-*           In this case, ZLAQR0 checks the input parameters and
-*           estimates the optimal workspace size for the given
-*           values of N, ILO and IHI.  The estimate is returned
-*           in WORK(1).  No error message related to LWORK is
-*           issued by XERBLA.  Neither H nor Z are accessed.
-*
-*
-*     INFO  (output) INTEGER
-*             =  0:  successful exit
-*           .GT. 0:  if INFO = i, ZLAQR0 failed to compute all of
-*                the eigenvalues.  Elements 1:ilo-1 and i+1:n of WR
-*                and WI contain those eigenvalues which have been
-*                successfully computed.  (Failures are rare.)
-*
-*                If INFO .GT. 0 and WANT is .FALSE., then on exit,
-*                the remaining unconverged eigenvalues are the eigen-
-*                values of the upper Hessenberg matrix rows and
-*                columns ILO through INFO of the final, output
-*                value of H.
-*
-*                If INFO .GT. 0 and WANTT is .TRUE., then on exit
-*
-*           (*)  (initial value of H)*U  = U*(final value of H)
-*
-*                where U is a unitary matrix.  The final
-*                value of  H is upper Hessenberg and triangular in
-*                rows and columns INFO+1 through IHI.
-*
-*                If INFO .GT. 0 and WANTZ is .TRUE., then on exit
-*
-*                  (final value of Z(ILO:IHI,ILOZ:IHIZ)
-*                   =  (initial value of Z(ILO:IHI,ILOZ:IHIZ)*U
-*
-*                where U is the unitary matrix in (*) (regard-
-*                less of the value of WANTT.)
-*
-*                If INFO .GT. 0 and WANTZ is .FALSE., then Z is not
-*                accessed.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ================================================================
-*     References:
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
-*       Performance, SIAM Journal of Matrix Analysis, volume 23, pages
-*       929--947, 2002.
-*
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part II: Aggressive Early Deflation, SIAM Journal
-*       of Matrix Analysis, volume 23, pages 948--973, 2002.
-*
-*     ================================================================
-*     .. Parameters ..
-*
-*     ==== Matrices of order NTINY or smaller must be processed by
-*     .    ZLAHQR because of insufficient subdiagonal scratch space.
-*     .    (This is a hard limit.) ====
-*
-*     ==== Exceptional deflation windows:  try to cure rare
-*     .    slow convergence by increasing the size of the
-*     .    deflation window after KEXNW iterations. =====
-*
-*     ==== Exceptional shifts: try to cure rare slow convergence
-*     .    with ad-hoc exceptional shifts every KEXSH iterations.
-*     .    The constants WILK1 and WILK2 are used to form the
-*     .    exceptional shifts. ====
-*
-      INTEGER            NTINY
-      PARAMETER          ( NTINY = 11 )
-      INTEGER            KEXNW, KEXSH
-      PARAMETER          ( KEXNW = 5, KEXSH = 6 )
-      DOUBLE PRECISION   WILK1
-      PARAMETER          ( WILK1 = 0.75d0 )
-      COMPLEX*16         ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0d0, 0.0d0 ),
-     $                   ONE = ( 1.0d0, 0.0d0 ) )
-      DOUBLE PRECISION   TWO
-      PARAMETER          ( TWO = 2.0d0 )
-*     ..
-*     .. Local Scalars ..
-      COMPLEX*16         AA, BB, CC, CDUM, DD, DET, RTDISC, SWAP, TR2
-      DOUBLE PRECISION   S
-      INTEGER            I, INF, IT, ITMAX, K, KACC22, KBOT, KDU, KS,
-     $                   KT, KTOP, KU, KV, KWH, KWTOP, KWV, LD, LS,
-     $                   LWKOPT, NDFL, NH, NHO, NIBBLE, NMIN, NS, NSMAX,
-     $                   NSR, NVE, NW, NWMAX, NWR
-      LOGICAL            NWINC, SORTED
-      CHARACTER          JBCMPZ*2
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Local Arrays ..
-      COMPLEX*16         ZDUM( 1, 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZLACPY, ZLAHQR, ZLAQR3, ZLAQR4, ZLAQR5
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCMPLX, DIMAG, INT, MAX, MIN, MOD,
-     $                   SQRT
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( DBLE( CDUM ) ) + ABS( DIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-      INFO = 0
-*
-*     ==== Quick return for N = 0: nothing to do. ====
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = ONE
-         RETURN
-      END IF
-*
-*     ==== Set up job flags for ILAENV. ====
-*
-      IF( WANTT ) THEN
-         JBCMPZ( 1: 1 ) = 'S'
-      ELSE
-         JBCMPZ( 1: 1 ) = 'E'
-      END IF
-      IF( WANTZ ) THEN
-         JBCMPZ( 2: 2 ) = 'V'
-      ELSE
-         JBCMPZ( 2: 2 ) = 'N'
-      END IF
-*
-*     ==== Tiny matrices must use ZLAHQR. ====
-*
-      IF( N.LE.NTINY ) THEN
-*
-*        ==== Estimate optimal workspace. ====
-*
-         LWKOPT = 1
-         IF( LWORK.NE.-1 )
-     $      CALL ZLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ,
-     $                   IHIZ, Z, LDZ, INFO )
-      ELSE
-*
-*        ==== Use small bulge multi-shift QR with aggressive early
-*        .    deflation on larger-than-tiny matrices. ====
-*
-*        ==== Hope for the best. ====
-*
-         INFO = 0
-*
-*        ==== NWR = recommended deflation window size.  At this
-*        .    point,  N .GT. NTINY = 11, so there is enough
-*        .    subdiagonal workspace for NWR.GE.2 as required.
-*        .    (In fact, there is enough subdiagonal space for
-*        .    NWR.GE.3.) ====
-*
-         NWR = ILAENV( 13, 'ZLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         NWR = MAX( 2, NWR )
-         NWR = MIN( IHI-ILO+1, ( N-1 ) / 3, NWR )
-         NW = NWR
-*
-*        ==== NSR = recommended number of simultaneous shifts.
-*        .    At this point N .GT. NTINY = 11, so there is at
-*        .    enough subdiagonal workspace for NSR to be even
-*        .    and greater than or equal to two as required. ====
-*
-         NSR = ILAENV( 15, 'ZLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         NSR = MIN( NSR, ( N+6 ) / 9, IHI-ILO )
-         NSR = MAX( 2, NSR-MOD( NSR, 2 ) )
-*
-*        ==== Estimate optimal workspace ====
-*
-*        ==== Workspace query call to ZLAQR3 ====
-*
-         CALL ZLAQR3( WANTT, WANTZ, N, ILO, IHI, NWR+1, H, LDH, ILOZ,
-     $                IHIZ, Z, LDZ, LS, LD, W, H, LDH, N, H, LDH, N, H,
-     $                LDH, WORK, -1 )
-*
-*        ==== Optimal workspace = MAX(ZLAQR5, ZLAQR3) ====
-*
-         LWKOPT = MAX( 3*NSR / 2, INT( WORK( 1 ) ) )
-*
-*        ==== Quick return in case of workspace query. ====
-*
-         IF( LWORK.EQ.-1 ) THEN
-            WORK( 1 ) = DCMPLX( LWKOPT, 0 )
-            RETURN
-         END IF
-*
-*        ==== ZLAHQR/ZLAQR0 crossover point ====
-*
-         NMIN = ILAENV( 12, 'ZLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         NMIN = MAX( NTINY, NMIN )
-*
-*        ==== Nibble crossover point ====
-*
-         NIBBLE = ILAENV( 14, 'ZLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         NIBBLE = MAX( 0, NIBBLE )
-*
-*        ==== Accumulate reflections during ttswp?  Use block
-*        .    2-by-2 structure during matrix-matrix multiply? ====
-*
-         KACC22 = ILAENV( 16, 'ZLAQR0', JBCMPZ, N, ILO, IHI, LWORK )
-         KACC22 = MAX( 0, KACC22 )
-         KACC22 = MIN( 2, KACC22 )
-*
-*        ==== NWMAX = the largest possible deflation window for
-*        .    which there is sufficient workspace. ====
-*
-         NWMAX = MIN( ( N-1 ) / 3, LWORK / 2 )
-*
-*        ==== NSMAX = the Largest number of simultaneous shifts
-*        .    for which there is sufficient workspace. ====
-*
-         NSMAX = MIN( ( N+6 ) / 9, 2*LWORK / 3 )
-         NSMAX = NSMAX - MOD( NSMAX, 2 )
-*
-*        ==== NDFL: an iteration count restarted at deflation. ====
-*
-         NDFL = 1
-*
-*        ==== ITMAX = iteration limit ====
-*
-         ITMAX = MAX( 30, 2*KEXSH )*MAX( 10, ( IHI-ILO+1 ) )
-*
-*        ==== Last row and column in the active block ====
-*
-         KBOT = IHI
-*
-*        ==== Main Loop ====
-*
-         DO 70 IT = 1, ITMAX
-*
-*           ==== Done when KBOT falls below ILO ====
-*
-            IF( KBOT.LT.ILO )
-     $         GO TO 80
-*
-*           ==== Locate active block ====
-*
-            DO 10 K = KBOT, ILO + 1, -1
-               IF( H( K, K-1 ).EQ.ZERO )
-     $            GO TO 20
-   10       CONTINUE
-            K = ILO
-   20       CONTINUE
-            KTOP = K
-*
-*           ==== Select deflation window size ====
-*
-            NH = KBOT - KTOP + 1
-            IF( NDFL.LT.KEXNW .OR. NH.LT.NW ) THEN
-*
-*              ==== Typical deflation window.  If possible and
-*              .    advisable, nibble the entire active block.
-*              .    If not, use size NWR or NWR+1 depending upon
-*              .    which has the smaller corresponding subdiagonal
-*              .    entry (a heuristic). ====
-*
-               NWINC = .TRUE.
-               IF( NH.LE.MIN( NMIN, NWMAX ) ) THEN
-                  NW = NH
-               ELSE
-                  NW = MIN( NWR, NH, NWMAX )
-                  IF( NW.LT.NWMAX ) THEN
-                     IF( NW.GE.NH-1 ) THEN
-                        NW = NH
-                     ELSE
-                        KWTOP = KBOT - NW + 1
-                        IF( CABS1( H( KWTOP, KWTOP-1 ) ).GT.
-     $                      CABS1( H( KWTOP-1, KWTOP-2 ) ) )NW = NW + 1
-                     END IF
-                  END IF
-               END IF
-            ELSE
-*
-*              ==== Exceptional deflation window.  If there have
-*              .    been no deflations in KEXNW or more iterations,
-*              .    then vary the deflation window size.   At first,
-*              .    because, larger windows are, in general, more
-*              .    powerful than smaller ones, rapidly increase the
-*              .    window up to the maximum reasonable and possible.
-*              .    Then maybe try a slightly smaller window.  ====
-*
-               IF( NWINC .AND. NW.LT.MIN( NWMAX, NH ) ) THEN
-                  NW = MIN( NWMAX, NH, 2*NW )
-               ELSE
-                  NWINC = .FALSE.
-                  IF( NW.EQ.NH .AND. NH.GT.2 )
-     $               NW = NH - 1
-               END IF
-            END IF
-*
-*           ==== Aggressive early deflation:
-*           .    split workspace under the subdiagonal into
-*           .      - an nw-by-nw work array V in the lower
-*           .        left-hand-corner,
-*           .      - an NW-by-at-least-NW-but-more-is-better
-*           .        (NW-by-NHO) horizontal work array along
-*           .        the bottom edge,
-*           .      - an at-least-NW-but-more-is-better (NHV-by-NW)
-*           .        vertical work array along the left-hand-edge.
-*           .        ====
-*
-            KV = N - NW + 1
-            KT = NW + 1
-            NHO = ( N-NW-1 ) - KT + 1
-            KWV = NW + 2
-            NVE = ( N-NW ) - KWV + 1
-*
-*           ==== Aggressive early deflation ====
-*
-            CALL ZLAQR3( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
-     $                   IHIZ, Z, LDZ, LS, LD, W, H( KV, 1 ), LDH, NHO,
-     $                   H( KV, KT ), LDH, NVE, H( KWV, 1 ), LDH, WORK,
-     $                   LWORK )
-*
-*           ==== Adjust KBOT accounting for new deflations. ====
-*
-            KBOT = KBOT - LD
-*
-*           ==== KS points to the shifts. ====
-*
-            KS = KBOT - LS + 1
-*
-*           ==== Skip an expensive QR sweep if there is a (partly
-*           .    heuristic) reason to expect that many eigenvalues
-*           .    will deflate without it.  Here, the QR sweep is
-*           .    skipped if many eigenvalues have just been deflated
-*           .    or if the remaining active block is small.
-*
-            IF( ( LD.EQ.0 ) .OR. ( ( 100*LD.LE.NW*NIBBLE ) .AND. ( KBOT-
-     $          KTOP+1.GT.MIN( NMIN, NWMAX ) ) ) ) THEN
-*
-*              ==== NS = nominal number of simultaneous shifts.
-*              .    This may be lowered (slightly) if ZLAQR3
-*              .    did not provide that many shifts. ====
-*
-               NS = MIN( NSMAX, NSR, MAX( 2, KBOT-KTOP ) )
-               NS = NS - MOD( NS, 2 )
-*
-*              ==== If there have been no deflations
-*              .    in a multiple of KEXSH iterations,
-*              .    then try exceptional shifts.
-*              .    Otherwise use shifts provided by
-*              .    ZLAQR3 above or from the eigenvalues
-*              .    of a trailing principal submatrix. ====
-*
-               IF( MOD( NDFL, KEXSH ).EQ.0 ) THEN
-                  KS = KBOT - NS + 1
-                  DO 30 I = KBOT, KS + 1, -2
-                     W( I ) = H( I, I ) + WILK1*CABS1( H( I, I-1 ) )
-                     W( I-1 ) = W( I )
-   30             CONTINUE
-               ELSE
-*
-*                 ==== Got NS/2 or fewer shifts? Use ZLAQR4 or
-*                 .    ZLAHQR on a trailing principal submatrix to
-*                 .    get more. (Since NS.LE.NSMAX.LE.(N+6)/9,
-*                 .    there is enough space below the subdiagonal
-*                 .    to fit an NS-by-NS scratch array.) ====
-*
-                  IF( KBOT-KS+1.LE.NS / 2 ) THEN
-                     KS = KBOT - NS + 1
-                     KT = N - NS + 1
-                     CALL ZLACPY( 'A', NS, NS, H( KS, KS ), LDH,
-     $                            H( KT, 1 ), LDH )
-                     IF( NS.GT.NMIN ) THEN
-                        CALL ZLAQR4( .false., .false., NS, 1, NS,
-     $                               H( KT, 1 ), LDH, W( KS ), 1, 1,
-     $                               ZDUM, 1, WORK, LWORK, INF )
-                     ELSE
-                        CALL ZLAHQR( .false., .false., NS, 1, NS,
-     $                               H( KT, 1 ), LDH, W( KS ), 1, 1,
-     $                               ZDUM, 1, INF )
-                     END IF
-                     KS = KS + INF
-*
-*                    ==== In case of a rare QR failure use
-*                    .    eigenvalues of the trailing 2-by-2
-*                    .    principal submatrix.  Scale to avoid
-*                    .    overflows, underflows and subnormals.
-*                    .    (The scale factor S can not be zero,
-*                    .    because H(KBOT,KBOT-1) is nonzero.) ====
-*
-                     IF( KS.GE.KBOT ) THEN
-                        S = CABS1( H( KBOT-1, KBOT-1 ) ) +
-     $                      CABS1( H( KBOT, KBOT-1 ) ) +
-     $                      CABS1( H( KBOT-1, KBOT ) ) +
-     $                      CABS1( H( KBOT, KBOT ) )
-                        AA = H( KBOT-1, KBOT-1 ) / S
-                        CC = H( KBOT, KBOT-1 ) / S
-                        BB = H( KBOT-1, KBOT ) / S
-                        DD = H( KBOT, KBOT ) / S
-                        TR2 = ( AA+DD ) / TWO
-                        DET = ( AA-TR2 )*( DD-TR2 ) - BB*CC
-                        RTDISC = SQRT( -DET )
-                        W( KBOT-1 ) = ( TR2+RTDISC )*S
-                        W( KBOT ) = ( TR2-RTDISC )*S
-*
-                        KS = KBOT - 1
-                     END IF
-                  END IF
-*
-                  IF( KBOT-KS+1.GT.NS ) THEN
-*
-*                    ==== Sort the shifts (Helps a little) ====
-*
-                     SORTED = .false.
-                     DO 50 K = KBOT, KS + 1, -1
-                        IF( SORTED )
-     $                     GO TO 60
-                        SORTED = .true.
-                        DO 40 I = KS, K - 1
-                           IF( CABS1( W( I ) ).LT.CABS1( W( I+1 ) ) )
-     $                          THEN
-                              SORTED = .false.
-                              SWAP = W( I )
-                              W( I ) = W( I+1 )
-                              W( I+1 ) = SWAP
-                           END IF
-   40                   CONTINUE
-   50                CONTINUE
-   60                CONTINUE
-                  END IF
-               END IF
-*
-*              ==== If there are only two shifts, then use
-*              .    only one.  ====
-*
-               IF( KBOT-KS+1.EQ.2 ) THEN
-                  IF( CABS1( W( KBOT )-H( KBOT, KBOT ) ).LT.
-     $                CABS1( W( KBOT-1 )-H( KBOT, KBOT ) ) ) THEN
-                     W( KBOT-1 ) = W( KBOT )
-                  ELSE
-                     W( KBOT ) = W( KBOT-1 )
-                  END IF
-               END IF
-*
-*              ==== Use up to NS of the the smallest magnatiude
-*              .    shifts.  If there aren't NS shifts available,
-*              .    then use them all, possibly dropping one to
-*              .    make the number of shifts even. ====
-*
-               NS = MIN( NS, KBOT-KS+1 )
-               NS = NS - MOD( NS, 2 )
-               KS = KBOT - NS + 1
-*
-*              ==== Small-bulge multi-shift QR sweep:
-*              .    split workspace under the subdiagonal into
-*              .    - a KDU-by-KDU work array U in the lower
-*              .      left-hand-corner,
-*              .    - a KDU-by-at-least-KDU-but-more-is-better
-*              .      (KDU-by-NHo) horizontal work array WH along
-*              .      the bottom edge,
-*              .    - and an at-least-KDU-but-more-is-better-by-KDU
-*              .      (NVE-by-KDU) vertical work WV arrow along
-*              .      the left-hand-edge. ====
-*
-               KDU = 3*NS - 3
-               KU = N - KDU + 1
-               KWH = KDU + 1
-               NHO = ( N-KDU+1-4 ) - ( KDU+1 ) + 1
-               KWV = KDU + 4
-               NVE = N - KDU - KWV + 1
-*
-*              ==== Small-bulge multi-shift QR sweep ====
-*
-               CALL ZLAQR5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NS,
-     $                      W( KS ), H, LDH, ILOZ, IHIZ, Z, LDZ, WORK,
-     $                      3, H( KU, 1 ), LDH, NVE, H( KWV, 1 ), LDH,
-     $                      NHO, H( KU, KWH ), LDH )
-            END IF
-*
-*           ==== Note progress (or the lack of it). ====
-*
-            IF( LD.GT.0 ) THEN
-               NDFL = 1
-            ELSE
-               NDFL = NDFL + 1
-            END IF
-*
-*           ==== End of main loop ====
-   70    CONTINUE
-*
-*        ==== Iteration limit exceeded.  Set INFO to show where
-*        .    the problem occurred and exit. ====
-*
-         INFO = KBOT
-   80    CONTINUE
-      END IF
-*
-*     ==== Return the optimal value of LWORK. ====
-*
-      WORK( 1 ) = DCMPLX( LWKOPT, 0 )
-*
-*     ==== End of ZLAQR0 ====
-*
-      END
--- a/libcruft/lapack/zlaqr1.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-      SUBROUTINE ZLAQR1( N, H, LDH, S1, S2, V )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      COMPLEX*16         S1, S2
-      INTEGER            LDH, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         H( LDH, * ), V( * )
-*     ..
-*
-*       Given a 2-by-2 or 3-by-3 matrix H, ZLAQR1 sets v to a
-*       scalar multiple of the first column of the product
-*
-*       (*)  K = (H - s1*I)*(H - s2*I)
-*
-*       scaling to avoid overflows and most underflows.
-*
-*       This is useful for starting double implicit shift bulges
-*       in the QR algorithm.
-*
-*
-*       N      (input) integer
-*              Order of the matrix H. N must be either 2 or 3.
-*
-*       H      (input) COMPLEX*16 array of dimension (LDH,N)
-*              The 2-by-2 or 3-by-3 matrix H in (*).
-*
-*       LDH    (input) integer
-*              The leading dimension of H as declared in
-*              the calling procedure.  LDH.GE.N
-*
-*       S1     (input) COMPLEX*16
-*       S2     S1 and S2 are the shifts defining K in (*) above.
-*
-*       V      (output) COMPLEX*16 array of dimension N
-*              A scalar multiple of the first column of the
-*              matrix K in (*).
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO
-      PARAMETER          ( ZERO = ( 0.0d0, 0.0d0 ) )
-      DOUBLE PRECISION   RZERO
-      PARAMETER          ( RZERO = 0.0d0 )
-*     ..
-*     .. Local Scalars ..
-      COMPLEX*16         CDUM
-      DOUBLE PRECISION   H21S, H31S, S
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DIMAG
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( DBLE( CDUM ) ) + ABS( DIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-      IF( N.EQ.2 ) THEN
-         S = CABS1( H( 1, 1 )-S2 ) + CABS1( H( 2, 1 ) )
-         IF( S.EQ.RZERO ) THEN
-            V( 1 ) = ZERO
-            V( 2 ) = ZERO
-         ELSE
-            H21S = H( 2, 1 ) / S
-            V( 1 ) = H21S*H( 1, 2 ) + ( H( 1, 1 )-S1 )*
-     $               ( ( H( 1, 1 )-S2 ) / S )
-            V( 2 ) = H21S*( H( 1, 1 )+H( 2, 2 )-S1-S2 )
-         END IF
-      ELSE
-         S = CABS1( H( 1, 1 )-S2 ) + CABS1( H( 2, 1 ) ) +
-     $       CABS1( H( 3, 1 ) )
-         IF( S.EQ.ZERO ) THEN
-            V( 1 ) = ZERO
-            V( 2 ) = ZERO
-            V( 3 ) = ZERO
-         ELSE
-            H21S = H( 2, 1 ) / S
-            H31S = H( 3, 1 ) / S
-            V( 1 ) = ( H( 1, 1 )-S1 )*( ( H( 1, 1 )-S2 ) / S ) +
-     $               H( 1, 2 )*H21S + H( 1, 3 )*H31S
-            V( 2 ) = H21S*( H( 1, 1 )+H( 2, 2 )-S1-S2 ) + H( 2, 3 )*H31S
-            V( 3 ) = H31S*( H( 1, 1 )+H( 3, 3 )-S1-S2 ) + H21S*H( 3, 2 )
-         END IF
-      END IF
-      END
--- a/libcruft/lapack/zlaqr2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,437 +0,0 @@
-      SUBROUTINE ZLAQR2( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
-     $                   IHIZ, Z, LDZ, NS, ND, SH, V, LDV, NH, T, LDT,
-     $                   NV, WV, LDWV, WORK, LWORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHIZ, ILOZ, KBOT, KTOP, LDH, LDT, LDV, LDWV,
-     $                   LDZ, LWORK, N, ND, NH, NS, NV, NW
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         H( LDH, * ), SH( * ), T( LDT, * ), V( LDV, * ),
-     $                   WORK( * ), WV( LDWV, * ), Z( LDZ, * )
-*     ..
-*
-*     This subroutine is identical to ZLAQR3 except that it avoids
-*     recursion by calling ZLAHQR instead of ZLAQR4.
-*
-*
-*     ******************************************************************
-*     Aggressive early deflation:
-*
-*     This subroutine accepts as input an upper Hessenberg matrix
-*     H and performs an unitary similarity transformation
-*     designed to detect and deflate fully converged eigenvalues from
-*     a trailing principal submatrix.  On output H has been over-
-*     written by a new Hessenberg matrix that is a perturbation of
-*     an unitary similarity transformation of H.  It is to be
-*     hoped that the final version of H has many zero subdiagonal
-*     entries.
-*
-*     ******************************************************************
-*     WANTT   (input) LOGICAL
-*          If .TRUE., then the Hessenberg matrix H is fully updated
-*          so that the triangular Schur factor may be
-*          computed (in cooperation with the calling subroutine).
-*          If .FALSE., then only enough of H is updated to preserve
-*          the eigenvalues.
-*
-*     WANTZ   (input) LOGICAL
-*          If .TRUE., then the unitary matrix Z is updated so
-*          so that the unitary Schur factor may be computed
-*          (in cooperation with the calling subroutine).
-*          If .FALSE., then Z is not referenced.
-*
-*     N       (input) INTEGER
-*          The order of the matrix H and (if WANTZ is .TRUE.) the
-*          order of the unitary matrix Z.
-*
-*     KTOP    (input) INTEGER
-*          It is assumed that either KTOP = 1 or H(KTOP,KTOP-1)=0.
-*          KBOT and KTOP together determine an isolated block
-*          along the diagonal of the Hessenberg matrix.
-*
-*     KBOT    (input) INTEGER
-*          It is assumed without a check that either
-*          KBOT = N or H(KBOT+1,KBOT)=0.  KBOT and KTOP together
-*          determine an isolated block along the diagonal of the
-*          Hessenberg matrix.
-*
-*     NW      (input) INTEGER
-*          Deflation window size.  1 .LE. NW .LE. (KBOT-KTOP+1).
-*
-*     H       (input/output) COMPLEX*16 array, dimension (LDH,N)
-*          On input the initial N-by-N section of H stores the
-*          Hessenberg matrix undergoing aggressive early deflation.
-*          On output H has been transformed by a unitary
-*          similarity transformation, perturbed, and the returned
-*          to Hessenberg form that (it is to be hoped) has some
-*          zero subdiagonal entries.
-*
-*     LDH     (input) integer
-*          Leading dimension of H just as declared in the calling
-*          subroutine.  N .LE. LDH
-*
-*     ILOZ    (input) INTEGER
-*     IHIZ    (input) INTEGER
-*          Specify the rows of Z to which transformations must be
-*          applied if WANTZ is .TRUE.. 1 .LE. ILOZ .LE. IHIZ .LE. N.
-*
-*     Z       (input/output) COMPLEX*16 array, dimension (LDZ,IHI)
-*          IF WANTZ is .TRUE., then on output, the unitary
-*          similarity transformation mentioned above has been
-*          accumulated into Z(ILOZ:IHIZ,ILO:IHI) from the right.
-*          If WANTZ is .FALSE., then Z is unreferenced.
-*
-*     LDZ     (input) integer
-*          The leading dimension of Z just as declared in the
-*          calling subroutine.  1 .LE. LDZ.
-*
-*     NS      (output) integer
-*          The number of unconverged (ie approximate) eigenvalues
-*          returned in SR and SI that may be used as shifts by the
-*          calling subroutine.
-*
-*     ND      (output) integer
-*          The number of converged eigenvalues uncovered by this
-*          subroutine.
-*
-*     SH      (output) COMPLEX*16 array, dimension KBOT
-*          On output, approximate eigenvalues that may
-*          be used for shifts are stored in SH(KBOT-ND-NS+1)
-*          through SR(KBOT-ND).  Converged eigenvalues are
-*          stored in SH(KBOT-ND+1) through SH(KBOT).
-*
-*     V       (workspace) COMPLEX*16 array, dimension (LDV,NW)
-*          An NW-by-NW work array.
-*
-*     LDV     (input) integer scalar
-*          The leading dimension of V just as declared in the
-*          calling subroutine.  NW .LE. LDV
-*
-*     NH      (input) integer scalar
-*          The number of columns of T.  NH.GE.NW.
-*
-*     T       (workspace) COMPLEX*16 array, dimension (LDT,NW)
-*
-*     LDT     (input) integer
-*          The leading dimension of T just as declared in the
-*          calling subroutine.  NW .LE. LDT
-*
-*     NV      (input) integer
-*          The number of rows of work array WV available for
-*          workspace.  NV.GE.NW.
-*
-*     WV      (workspace) COMPLEX*16 array, dimension (LDWV,NW)
-*
-*     LDWV    (input) integer
-*          The leading dimension of W just as declared in the
-*          calling subroutine.  NW .LE. LDV
-*
-*     WORK    (workspace) COMPLEX*16 array, dimension LWORK.
-*          On exit, WORK(1) is set to an estimate of the optimal value
-*          of LWORK for the given values of N, NW, KTOP and KBOT.
-*
-*     LWORK   (input) integer
-*          The dimension of the work array WORK.  LWORK = 2*NW
-*          suffices, but greater efficiency may result from larger
-*          values of LWORK.
-*
-*          If LWORK = -1, then a workspace query is assumed; ZLAQR2
-*          only estimates the optimal workspace size for the given
-*          values of N, NW, KTOP and KBOT.  The estimate is returned
-*          in WORK(1).  No error message related to LWORK is issued
-*          by XERBLA.  Neither H nor Z are accessed.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ==================================================================
-*     .. Parameters ..
-      COMPLEX*16         ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0d0, 0.0d0 ),
-     $                   ONE = ( 1.0d0, 0.0d0 ) )
-      DOUBLE PRECISION   RZERO, RONE
-      PARAMETER          ( RZERO = 0.0d0, RONE = 1.0d0 )
-*     ..
-*     .. Local Scalars ..
-      COMPLEX*16         BETA, CDUM, S, TAU
-      DOUBLE PRECISION   FOO, SAFMAX, SAFMIN, SMLNUM, ULP
-      INTEGER            I, IFST, ILST, INFO, INFQR, J, JW, KCOL, KLN,
-     $                   KNT, KROW, KWTOP, LTOP, LWK1, LWK2, LWKOPT
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLABAD, ZCOPY, ZGEHRD, ZGEMM, ZLACPY, ZLAHQR,
-     $                   ZLARF, ZLARFG, ZLASET, ZTREXC, ZUNGHR
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, DIMAG, INT, MAX, MIN
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( DBLE( CDUM ) ) + ABS( DIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     ==== Estimate optimal workspace. ====
-*
-      JW = MIN( NW, KBOT-KTOP+1 )
-      IF( JW.LE.2 ) THEN
-         LWKOPT = 1
-      ELSE
-*
-*        ==== Workspace query call to ZGEHRD ====
-*
-         CALL ZGEHRD( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
-         LWK1 = INT( WORK( 1 ) )
-*
-*        ==== Workspace query call to ZUNGHR ====
-*
-         CALL ZUNGHR( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
-         LWK2 = INT( WORK( 1 ) )
-*
-*        ==== Optimal workspace ====
-*
-         LWKOPT = JW + MAX( LWK1, LWK2 )
-      END IF
-*
-*     ==== Quick return in case of workspace query. ====
-*
-      IF( LWORK.EQ.-1 ) THEN
-         WORK( 1 ) = DCMPLX( LWKOPT, 0 )
-         RETURN
-      END IF
-*
-*     ==== Nothing to do ...
-*     ... for an empty active block ... ====
-      NS = 0
-      ND = 0
-      IF( KTOP.GT.KBOT )
-     $   RETURN
-*     ... nor for an empty deflation window. ====
-      IF( NW.LT.1 )
-     $   RETURN
-*
-*     ==== Machine constants ====
-*
-      SAFMIN = DLAMCH( 'SAFE MINIMUM' )
-      SAFMAX = RONE / SAFMIN
-      CALL DLABAD( SAFMIN, SAFMAX )
-      ULP = DLAMCH( 'PRECISION' )
-      SMLNUM = SAFMIN*( DBLE( N ) / ULP )
-*
-*     ==== Setup deflation window ====
-*
-      JW = MIN( NW, KBOT-KTOP+1 )
-      KWTOP = KBOT - JW + 1
-      IF( KWTOP.EQ.KTOP ) THEN
-         S = ZERO
-      ELSE
-         S = H( KWTOP, KWTOP-1 )
-      END IF
-*
-      IF( KBOT.EQ.KWTOP ) THEN
-*
-*        ==== 1-by-1 deflation window: not much to do ====
-*
-         SH( KWTOP ) = H( KWTOP, KWTOP )
-         NS = 1
-         ND = 0
-         IF( CABS1( S ).LE.MAX( SMLNUM, ULP*CABS1( H( KWTOP,
-     $       KWTOP ) ) ) ) THEN
-            NS = 0
-            ND = 1
-            IF( KWTOP.GT.KTOP )
-     $         H( KWTOP, KWTOP-1 ) = ZERO
-         END IF
-         RETURN
-      END IF
-*
-*     ==== Convert to spike-triangular form.  (In case of a
-*     .    rare QR failure, this routine continues to do
-*     .    aggressive early deflation using that part of
-*     .    the deflation window that converged using INFQR
-*     .    here and there to keep track.) ====
-*
-      CALL ZLACPY( 'U', JW, JW, H( KWTOP, KWTOP ), LDH, T, LDT )
-      CALL ZCOPY( JW-1, H( KWTOP+1, KWTOP ), LDH+1, T( 2, 1 ), LDT+1 )
-*
-      CALL ZLASET( 'A', JW, JW, ZERO, ONE, V, LDV )
-      CALL ZLAHQR( .true., .true., JW, 1, JW, T, LDT, SH( KWTOP ), 1,
-     $             JW, V, LDV, INFQR )
-*
-*     ==== Deflation detection loop ====
-*
-      NS = JW
-      ILST = INFQR + 1
-      DO 10 KNT = INFQR + 1, JW
-*
-*        ==== Small spike tip deflation test ====
-*
-         FOO = CABS1( T( NS, NS ) )
-         IF( FOO.EQ.RZERO )
-     $      FOO = CABS1( S )
-         IF( CABS1( S )*CABS1( V( 1, NS ) ).LE.MAX( SMLNUM, ULP*FOO ) )
-     $        THEN
-*
-*           ==== One more converged eigenvalue ====
-*
-            NS = NS - 1
-         ELSE
-*
-*           ==== One undflatable eigenvalue.  Move it up out of the
-*           .    way.   (ZTREXC can not fail in this case.) ====
-*
-            IFST = NS
-            CALL ZTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, INFO )
-            ILST = ILST + 1
-         END IF
-   10 CONTINUE
-*
-*        ==== Return to Hessenberg form ====
-*
-      IF( NS.EQ.0 )
-     $   S = ZERO
-*
-      IF( NS.LT.JW ) THEN
-*
-*        ==== sorting the diagonal of T improves accuracy for
-*        .    graded matrices.  ====
-*
-         DO 30 I = INFQR + 1, NS
-            IFST = I
-            DO 20 J = I + 1, NS
-               IF( CABS1( T( J, J ) ).GT.CABS1( T( IFST, IFST ) ) )
-     $            IFST = J
-   20       CONTINUE
-            ILST = I
-            IF( IFST.NE.ILST )
-     $         CALL ZTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, INFO )
-   30    CONTINUE
-      END IF
-*
-*     ==== Restore shift/eigenvalue array from T ====
-*
-      DO 40 I = INFQR + 1, JW
-         SH( KWTOP+I-1 ) = T( I, I )
-   40 CONTINUE
-*
-*
-      IF( NS.LT.JW .OR. S.EQ.ZERO ) THEN
-         IF( NS.GT.1 .AND. S.NE.ZERO ) THEN
-*
-*           ==== Reflect spike back into lower triangle ====
-*
-            CALL ZCOPY( NS, V, LDV, WORK, 1 )
-            DO 50 I = 1, NS
-               WORK( I ) = DCONJG( WORK( I ) )
-   50       CONTINUE
-            BETA = WORK( 1 )
-            CALL ZLARFG( NS, BETA, WORK( 2 ), 1, TAU )
-            WORK( 1 ) = ONE
-*
-            CALL ZLASET( 'L', JW-2, JW-2, ZERO, ZERO, T( 3, 1 ), LDT )
-*
-            CALL ZLARF( 'L', NS, JW, WORK, 1, DCONJG( TAU ), T, LDT,
-     $                  WORK( JW+1 ) )
-            CALL ZLARF( 'R', NS, NS, WORK, 1, TAU, T, LDT,
-     $                  WORK( JW+1 ) )
-            CALL ZLARF( 'R', JW, NS, WORK, 1, TAU, V, LDV,
-     $                  WORK( JW+1 ) )
-*
-            CALL ZGEHRD( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
-     $                   LWORK-JW, INFO )
-         END IF
-*
-*        ==== Copy updated reduced window into place ====
-*
-         IF( KWTOP.GT.1 )
-     $      H( KWTOP, KWTOP-1 ) = S*DCONJG( V( 1, 1 ) )
-         CALL ZLACPY( 'U', JW, JW, T, LDT, H( KWTOP, KWTOP ), LDH )
-         CALL ZCOPY( JW-1, T( 2, 1 ), LDT+1, H( KWTOP+1, KWTOP ),
-     $               LDH+1 )
-*
-*        ==== Accumulate orthogonal matrix in order update
-*        .    H and Z, if requested.  (A modified version
-*        .    of  ZUNGHR that accumulates block Householder
-*        .    transformations into V directly might be
-*        .    marginally more efficient than the following.) ====
-*
-         IF( NS.GT.1 .AND. S.NE.ZERO ) THEN
-            CALL ZUNGHR( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
-     $                   LWORK-JW, INFO )
-            CALL ZGEMM( 'N', 'N', JW, NS, NS, ONE, V, LDV, T, LDT, ZERO,
-     $                  WV, LDWV )
-            CALL ZLACPY( 'A', JW, NS, WV, LDWV, V, LDV )
-         END IF
-*
-*        ==== Update vertical slab in H ====
-*
-         IF( WANTT ) THEN
-            LTOP = 1
-         ELSE
-            LTOP = KTOP
-         END IF
-         DO 60 KROW = LTOP, KWTOP - 1, NV
-            KLN = MIN( NV, KWTOP-KROW )
-            CALL ZGEMM( 'N', 'N', KLN, JW, JW, ONE, H( KROW, KWTOP ),
-     $                  LDH, V, LDV, ZERO, WV, LDWV )
-            CALL ZLACPY( 'A', KLN, JW, WV, LDWV, H( KROW, KWTOP ), LDH )
-   60    CONTINUE
-*
-*        ==== Update horizontal slab in H ====
-*
-         IF( WANTT ) THEN
-            DO 70 KCOL = KBOT + 1, N, NH
-               KLN = MIN( NH, N-KCOL+1 )
-               CALL ZGEMM( 'C', 'N', JW, KLN, JW, ONE, V, LDV,
-     $                     H( KWTOP, KCOL ), LDH, ZERO, T, LDT )
-               CALL ZLACPY( 'A', JW, KLN, T, LDT, H( KWTOP, KCOL ),
-     $                      LDH )
-   70       CONTINUE
-         END IF
-*
-*        ==== Update vertical slab in Z ====
-*
-         IF( WANTZ ) THEN
-            DO 80 KROW = ILOZ, IHIZ, NV
-               KLN = MIN( NV, IHIZ-KROW+1 )
-               CALL ZGEMM( 'N', 'N', KLN, JW, JW, ONE, Z( KROW, KWTOP ),
-     $                     LDZ, V, LDV, ZERO, WV, LDWV )
-               CALL ZLACPY( 'A', KLN, JW, WV, LDWV, Z( KROW, KWTOP ),
-     $                      LDZ )
-   80       CONTINUE
-         END IF
-      END IF
-*
-*     ==== Return the number of deflations ... ====
-*
-      ND = JW - NS
-*
-*     ==== ... and the number of shifts. (Subtracting
-*     .    INFQR from the spike length takes care
-*     .    of the case of a rare QR failure while
-*     .    calculating eigenvalues of the deflation
-*     .    window.)  ====
-*
-      NS = NS - INFQR
-*
-*      ==== Return optimal workspace. ====
-*
-      WORK( 1 ) = DCMPLX( LWKOPT, 0 )
-*
-*     ==== End of ZLAQR2 ====
-*
-      END
--- a/libcruft/lapack/zlaqr3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,448 +0,0 @@
-      SUBROUTINE ZLAQR3( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
-     $                   IHIZ, Z, LDZ, NS, ND, SH, V, LDV, NH, T, LDT,
-     $                   NV, WV, LDWV, WORK, LWORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHIZ, ILOZ, KBOT, KTOP, LDH, LDT, LDV, LDWV,
-     $                   LDZ, LWORK, N, ND, NH, NS, NV, NW
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         H( LDH, * ), SH( * ), T( LDT, * ), V( LDV, * ),
-     $                   WORK( * ), WV( LDWV, * ), Z( LDZ, * )
-*     ..
-*
-*     ******************************************************************
-*     Aggressive early deflation:
-*
-*     This subroutine accepts as input an upper Hessenberg matrix
-*     H and performs an unitary similarity transformation
-*     designed to detect and deflate fully converged eigenvalues from
-*     a trailing principal submatrix.  On output H has been over-
-*     written by a new Hessenberg matrix that is a perturbation of
-*     an unitary similarity transformation of H.  It is to be
-*     hoped that the final version of H has many zero subdiagonal
-*     entries.
-*
-*     ******************************************************************
-*     WANTT   (input) LOGICAL
-*          If .TRUE., then the Hessenberg matrix H is fully updated
-*          so that the triangular Schur factor may be
-*          computed (in cooperation with the calling subroutine).
-*          If .FALSE., then only enough of H is updated to preserve
-*          the eigenvalues.
-*
-*     WANTZ   (input) LOGICAL
-*          If .TRUE., then the unitary matrix Z is updated so
-*          so that the unitary Schur factor may be computed
-*          (in cooperation with the calling subroutine).
-*          If .FALSE., then Z is not referenced.
-*
-*     N       (input) INTEGER
-*          The order of the matrix H and (if WANTZ is .TRUE.) the
-*          order of the unitary matrix Z.
-*
-*     KTOP    (input) INTEGER
-*          It is assumed that either KTOP = 1 or H(KTOP,KTOP-1)=0.
-*          KBOT and KTOP together determine an isolated block
-*          along the diagonal of the Hessenberg matrix.
-*
-*     KBOT    (input) INTEGER
-*          It is assumed without a check that either
-*          KBOT = N or H(KBOT+1,KBOT)=0.  KBOT and KTOP together
-*          determine an isolated block along the diagonal of the
-*          Hessenberg matrix.
-*
-*     NW      (input) INTEGER
-*          Deflation window size.  1 .LE. NW .LE. (KBOT-KTOP+1).
-*
-*     H       (input/output) COMPLEX*16 array, dimension (LDH,N)
-*          On input the initial N-by-N section of H stores the
-*          Hessenberg matrix undergoing aggressive early deflation.
-*          On output H has been transformed by a unitary
-*          similarity transformation, perturbed, and the returned
-*          to Hessenberg form that (it is to be hoped) has some
-*          zero subdiagonal entries.
-*
-*     LDH     (input) integer
-*          Leading dimension of H just as declared in the calling
-*          subroutine.  N .LE. LDH
-*
-*     ILOZ    (input) INTEGER
-*     IHIZ    (input) INTEGER
-*          Specify the rows of Z to which transformations must be
-*          applied if WANTZ is .TRUE.. 1 .LE. ILOZ .LE. IHIZ .LE. N.
-*
-*     Z       (input/output) COMPLEX*16 array, dimension (LDZ,IHI)
-*          IF WANTZ is .TRUE., then on output, the unitary
-*          similarity transformation mentioned above has been
-*          accumulated into Z(ILOZ:IHIZ,ILO:IHI) from the right.
-*          If WANTZ is .FALSE., then Z is unreferenced.
-*
-*     LDZ     (input) integer
-*          The leading dimension of Z just as declared in the
-*          calling subroutine.  1 .LE. LDZ.
-*
-*     NS      (output) integer
-*          The number of unconverged (ie approximate) eigenvalues
-*          returned in SR and SI that may be used as shifts by the
-*          calling subroutine.
-*
-*     ND      (output) integer
-*          The number of converged eigenvalues uncovered by this
-*          subroutine.
-*
-*     SH      (output) COMPLEX*16 array, dimension KBOT
-*          On output, approximate eigenvalues that may
-*          be used for shifts are stored in SH(KBOT-ND-NS+1)
-*          through SR(KBOT-ND).  Converged eigenvalues are
-*          stored in SH(KBOT-ND+1) through SH(KBOT).
-*
-*     V       (workspace) COMPLEX*16 array, dimension (LDV,NW)
-*          An NW-by-NW work array.
-*
-*     LDV     (input) integer scalar
-*          The leading dimension of V just as declared in the
-*          calling subroutine.  NW .LE. LDV
-*
-*     NH      (input) integer scalar
-*          The number of columns of T.  NH.GE.NW.
-*
-*     T       (workspace) COMPLEX*16 array, dimension (LDT,NW)
-*
-*     LDT     (input) integer
-*          The leading dimension of T just as declared in the
-*          calling subroutine.  NW .LE. LDT
-*
-*     NV      (input) integer
-*          The number of rows of work array WV available for
-*          workspace.  NV.GE.NW.
-*
-*     WV      (workspace) COMPLEX*16 array, dimension (LDWV,NW)
-*
-*     LDWV    (input) integer
-*          The leading dimension of W just as declared in the
-*          calling subroutine.  NW .LE. LDV
-*
-*     WORK    (workspace) COMPLEX*16 array, dimension LWORK.
-*          On exit, WORK(1) is set to an estimate of the optimal value
-*          of LWORK for the given values of N, NW, KTOP and KBOT.
-*
-*     LWORK   (input) integer
-*          The dimension of the work array WORK.  LWORK = 2*NW
-*          suffices, but greater efficiency may result from larger
-*          values of LWORK.
-*
-*          If LWORK = -1, then a workspace query is assumed; ZLAQR3
-*          only estimates the optimal workspace size for the given
-*          values of N, NW, KTOP and KBOT.  The estimate is returned
-*          in WORK(1).  No error message related to LWORK is issued
-*          by XERBLA.  Neither H nor Z are accessed.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ==================================================================
-*     .. Parameters ..
-      COMPLEX*16         ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0d0, 0.0d0 ),
-     $                   ONE = ( 1.0d0, 0.0d0 ) )
-      DOUBLE PRECISION   RZERO, RONE
-      PARAMETER          ( RZERO = 0.0d0, RONE = 1.0d0 )
-*     ..
-*     .. Local Scalars ..
-      COMPLEX*16         BETA, CDUM, S, TAU
-      DOUBLE PRECISION   FOO, SAFMAX, SAFMIN, SMLNUM, ULP
-      INTEGER            I, IFST, ILST, INFO, INFQR, J, JW, KCOL, KLN,
-     $                   KNT, KROW, KWTOP, LTOP, LWK1, LWK2, LWK3,
-     $                   LWKOPT, NMIN
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH
-      INTEGER            ILAENV
-      EXTERNAL           DLAMCH, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLABAD, ZCOPY, ZGEHRD, ZGEMM, ZLACPY, ZLAHQR,
-     $                   ZLAQR4, ZLARF, ZLARFG, ZLASET, ZTREXC, ZUNGHR
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, DIMAG, INT, MAX, MIN
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( DBLE( CDUM ) ) + ABS( DIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     ==== Estimate optimal workspace. ====
-*
-      JW = MIN( NW, KBOT-KTOP+1 )
-      IF( JW.LE.2 ) THEN
-         LWKOPT = 1
-      ELSE
-*
-*        ==== Workspace query call to ZGEHRD ====
-*
-         CALL ZGEHRD( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
-         LWK1 = INT( WORK( 1 ) )
-*
-*        ==== Workspace query call to ZUNGHR ====
-*
-         CALL ZUNGHR( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
-         LWK2 = INT( WORK( 1 ) )
-*
-*        ==== Workspace query call to ZLAQR4 ====
-*
-         CALL ZLAQR4( .true., .true., JW, 1, JW, T, LDT, SH, 1, JW, V,
-     $                LDV, WORK, -1, INFQR )
-         LWK3 = INT( WORK( 1 ) )
-*
-*        ==== Optimal workspace ====
-*
-         LWKOPT = MAX( JW+MAX( LWK1, LWK2 ), LWK3 )
-      END IF
-*
-*     ==== Quick return in case of workspace query. ====
-*
-      IF( LWORK.EQ.-1 ) THEN
-         WORK( 1 ) = DCMPLX( LWKOPT, 0 )
-         RETURN
-      END IF
-*
-*     ==== Nothing to do ...
-*     ... for an empty active block ... ====
-      NS = 0
-      ND = 0
-      IF( KTOP.GT.KBOT )
-     $   RETURN
-*     ... nor for an empty deflation window. ====
-      IF( NW.LT.1 )
-     $   RETURN
-*
-*     ==== Machine constants ====
-*
-      SAFMIN = DLAMCH( 'SAFE MINIMUM' )
-      SAFMAX = RONE / SAFMIN
-      CALL DLABAD( SAFMIN, SAFMAX )
-      ULP = DLAMCH( 'PRECISION' )
-      SMLNUM = SAFMIN*( DBLE( N ) / ULP )
-*
-*     ==== Setup deflation window ====
-*
-      JW = MIN( NW, KBOT-KTOP+1 )
-      KWTOP = KBOT - JW + 1
-      IF( KWTOP.EQ.KTOP ) THEN
-         S = ZERO
-      ELSE
-         S = H( KWTOP, KWTOP-1 )
-      END IF
-*
-      IF( KBOT.EQ.KWTOP ) THEN
-*
-*        ==== 1-by-1 deflation window: not much to do ====
-*
-         SH( KWTOP ) = H( KWTOP, KWTOP )
-         NS = 1
-         ND = 0
-         IF( CABS1( S ).LE.MAX( SMLNUM, ULP*CABS1( H( KWTOP,
-     $       KWTOP ) ) ) ) THEN
-
-            NS = 0
-            ND = 1
-            IF( KWTOP.GT.KTOP )
-     $         H( KWTOP, KWTOP-1 ) = ZERO
-         END IF
-         RETURN
-      END IF
-*
-*     ==== Convert to spike-triangular form.  (In case of a
-*     .    rare QR failure, this routine continues to do
-*     .    aggressive early deflation using that part of
-*     .    the deflation window that converged using INFQR
-*     .    here and there to keep track.) ====
-*
-      CALL ZLACPY( 'U', JW, JW, H( KWTOP, KWTOP ), LDH, T, LDT )
-      CALL ZCOPY( JW-1, H( KWTOP+1, KWTOP ), LDH+1, T( 2, 1 ), LDT+1 )
-*
-      CALL ZLASET( 'A', JW, JW, ZERO, ONE, V, LDV )
-      NMIN = ILAENV( 12, 'ZLAQR3', 'SV', JW, 1, JW, LWORK )
-      IF( JW.GT.NMIN ) THEN
-         CALL ZLAQR4( .true., .true., JW, 1, JW, T, LDT, SH( KWTOP ), 1,
-     $                JW, V, LDV, WORK, LWORK, INFQR )
-      ELSE
-         CALL ZLAHQR( .true., .true., JW, 1, JW, T, LDT, SH( KWTOP ), 1,
-     $                JW, V, LDV, INFQR )
-      END IF
-*
-*     ==== Deflation detection loop ====
-*
-      NS = JW
-      ILST = INFQR + 1
-      DO 10 KNT = INFQR + 1, JW
-*
-*        ==== Small spike tip deflation test ====
-*
-         FOO = CABS1( T( NS, NS ) )
-         IF( FOO.EQ.RZERO )
-     $      FOO = CABS1( S )
-         IF( CABS1( S )*CABS1( V( 1, NS ) ).LE.MAX( SMLNUM, ULP*FOO ) )
-     $        THEN
-*
-*           ==== One more converged eigenvalue ====
-*
-            NS = NS - 1
-         ELSE
-*
-*           ==== One undflatable eigenvalue.  Move it up out of the
-*           .    way.   (ZTREXC can not fail in this case.) ====
-*
-            IFST = NS
-            CALL ZTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, INFO )
-            ILST = ILST + 1
-         END IF
-   10 CONTINUE
-*
-*        ==== Return to Hessenberg form ====
-*
-      IF( NS.EQ.0 )
-     $   S = ZERO
-*
-      IF( NS.LT.JW ) THEN
-*
-*        ==== sorting the diagonal of T improves accuracy for
-*        .    graded matrices.  ====
-*
-         DO 30 I = INFQR + 1, NS
-            IFST = I
-            DO 20 J = I + 1, NS
-               IF( CABS1( T( J, J ) ).GT.CABS1( T( IFST, IFST ) ) )
-     $            IFST = J
-   20       CONTINUE
-            ILST = I
-            IF( IFST.NE.ILST )
-     $         CALL ZTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, INFO )
-   30    CONTINUE
-      END IF
-*
-*     ==== Restore shift/eigenvalue array from T ====
-*
-      DO 40 I = INFQR + 1, JW
-         SH( KWTOP+I-1 ) = T( I, I )
-   40 CONTINUE
-*
-*
-      IF( NS.LT.JW .OR. S.EQ.ZERO ) THEN
-         IF( NS.GT.1 .AND. S.NE.ZERO ) THEN
-*
-*           ==== Reflect spike back into lower triangle ====
-*
-            CALL ZCOPY( NS, V, LDV, WORK, 1 )
-            DO 50 I = 1, NS
-               WORK( I ) = DCONJG( WORK( I ) )
-   50       CONTINUE
-            BETA = WORK( 1 )
-            CALL ZLARFG( NS, BETA, WORK( 2 ), 1, TAU )
-            WORK( 1 ) = ONE
-*
-            CALL ZLASET( 'L', JW-2, JW-2, ZERO, ZERO, T( 3, 1 ), LDT )
-*
-            CALL ZLARF( 'L', NS, JW, WORK, 1, DCONJG( TAU ), T, LDT,
-     $                  WORK( JW+1 ) )
-            CALL ZLARF( 'R', NS, NS, WORK, 1, TAU, T, LDT,
-     $                  WORK( JW+1 ) )
-            CALL ZLARF( 'R', JW, NS, WORK, 1, TAU, V, LDV,
-     $                  WORK( JW+1 ) )
-*
-            CALL ZGEHRD( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
-     $                   LWORK-JW, INFO )
-         END IF
-*
-*        ==== Copy updated reduced window into place ====
-*
-         IF( KWTOP.GT.1 )
-     $      H( KWTOP, KWTOP-1 ) = S*DCONJG( V( 1, 1 ) )
-         CALL ZLACPY( 'U', JW, JW, T, LDT, H( KWTOP, KWTOP ), LDH )
-         CALL ZCOPY( JW-1, T( 2, 1 ), LDT+1, H( KWTOP+1, KWTOP ),
-     $               LDH+1 )
-*
-*        ==== Accumulate orthogonal matrix in order update
-*        .    H and Z, if requested.  (A modified version
-*        .    of  ZUNGHR that accumulates block Householder
-*        .    transformations into V directly might be
-*        .    marginally more efficient than the following.) ====
-*
-         IF( NS.GT.1 .AND. S.NE.ZERO ) THEN
-            CALL ZUNGHR( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
-     $                   LWORK-JW, INFO )
-            CALL ZGEMM( 'N', 'N', JW, NS, NS, ONE, V, LDV, T, LDT, ZERO,
-     $                  WV, LDWV )
-            CALL ZLACPY( 'A', JW, NS, WV, LDWV, V, LDV )
-         END IF
-*
-*        ==== Update vertical slab in H ====
-*
-         IF( WANTT ) THEN
-            LTOP = 1
-         ELSE
-            LTOP = KTOP
-         END IF
-         DO 60 KROW = LTOP, KWTOP - 1, NV
-            KLN = MIN( NV, KWTOP-KROW )
-            CALL ZGEMM( 'N', 'N', KLN, JW, JW, ONE, H( KROW, KWTOP ),
-     $                  LDH, V, LDV, ZERO, WV, LDWV )
-            CALL ZLACPY( 'A', KLN, JW, WV, LDWV, H( KROW, KWTOP ), LDH )
-   60    CONTINUE
-*
-*        ==== Update horizontal slab in H ====
-*
-         IF( WANTT ) THEN
-            DO 70 KCOL = KBOT + 1, N, NH
-               KLN = MIN( NH, N-KCOL+1 )
-               CALL ZGEMM( 'C', 'N', JW, KLN, JW, ONE, V, LDV,
-     $                     H( KWTOP, KCOL ), LDH, ZERO, T, LDT )
-               CALL ZLACPY( 'A', JW, KLN, T, LDT, H( KWTOP, KCOL ),
-     $                      LDH )
-   70       CONTINUE
-         END IF
-*
-*        ==== Update vertical slab in Z ====
-*
-         IF( WANTZ ) THEN
-            DO 80 KROW = ILOZ, IHIZ, NV
-               KLN = MIN( NV, IHIZ-KROW+1 )
-               CALL ZGEMM( 'N', 'N', KLN, JW, JW, ONE, Z( KROW, KWTOP ),
-     $                     LDZ, V, LDV, ZERO, WV, LDWV )
-               CALL ZLACPY( 'A', KLN, JW, WV, LDWV, Z( KROW, KWTOP ),
-     $                      LDZ )
-   80       CONTINUE
-         END IF
-      END IF
-*
-*     ==== Return the number of deflations ... ====
-*
-      ND = JW - NS
-*
-*     ==== ... and the number of shifts. (Subtracting
-*     .    INFQR from the spike length takes care
-*     .    of the case of a rare QR failure while
-*     .    calculating eigenvalues of the deflation
-*     .    window.)  ====
-*
-      NS = NS - INFQR
-*
-*      ==== Return optimal workspace. ====
-*
-      WORK( 1 ) = DCMPLX( LWKOPT, 0 )
-*
-*     ==== End of ZLAQR3 ====
-*
-      END
--- a/libcruft/lapack/zlaqr4.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,602 +0,0 @@
-      SUBROUTINE ZLAQR4( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ,
-     $                   IHIZ, Z, LDZ, WORK, LWORK, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, LWORK, N
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         H( LDH, * ), W( * ), WORK( * ), Z( LDZ, * )
-*     ..
-*
-*     This subroutine implements one level of recursion for ZLAQR0.
-*     It is a complete implementation of the small bulge multi-shift
-*     QR algorithm.  It may be called by ZLAQR0 and, for large enough
-*     deflation window size, it may be called by ZLAQR3.  This
-*     subroutine is identical to ZLAQR0 except that it calls ZLAQR2
-*     instead of ZLAQR3.
-*
-*     Purpose
-*     =======
-*
-*     ZLAQR4 computes the eigenvalues of a Hessenberg matrix H
-*     and, optionally, the matrices T and Z from the Schur decomposition
-*     H = Z T Z**H, where T is an upper triangular matrix (the
-*     Schur form), and Z is the unitary matrix of Schur vectors.
-*
-*     Optionally Z may be postmultiplied into an input unitary
-*     matrix Q so that this routine can give the Schur factorization
-*     of a matrix A which has been reduced to the Hessenberg form H
-*     by the unitary matrix Q:  A = Q*H*Q**H = (QZ)*H*(QZ)**H.
-*
-*     Arguments
-*     =========
-*
-*     WANTT   (input) LOGICAL
-*          = .TRUE. : the full Schur form T is required;
-*          = .FALSE.: only eigenvalues are required.
-*
-*     WANTZ   (input) LOGICAL
-*          = .TRUE. : the matrix of Schur vectors Z is required;
-*          = .FALSE.: Schur vectors are not required.
-*
-*     N     (input) INTEGER
-*           The order of the matrix H.  N .GE. 0.
-*
-*     ILO   (input) INTEGER
-*     IHI   (input) INTEGER
-*           It is assumed that H is already upper triangular in rows
-*           and columns 1:ILO-1 and IHI+1:N and, if ILO.GT.1,
-*           H(ILO,ILO-1) is zero. ILO and IHI are normally set by a
-*           previous call to ZGEBAL, and then passed to ZGEHRD when the
-*           matrix output by ZGEBAL is reduced to Hessenberg form.
-*           Otherwise, ILO and IHI should be set to 1 and N,
-*           respectively.  If N.GT.0, then 1.LE.ILO.LE.IHI.LE.N.
-*           If N = 0, then ILO = 1 and IHI = 0.
-*
-*     H     (input/output) COMPLEX*16 array, dimension (LDH,N)
-*           On entry, the upper Hessenberg matrix H.
-*           On exit, if INFO = 0 and WANTT is .TRUE., then H
-*           contains the upper triangular matrix T from the Schur
-*           decomposition (the Schur form). If INFO = 0 and WANT is
-*           .FALSE., then the contents of H are unspecified on exit.
-*           (The output value of H when INFO.GT.0 is given under the
-*           description of INFO below.)
-*
-*           This subroutine may explicitly set H(i,j) = 0 for i.GT.j and
-*           j = 1, 2, ... ILO-1 or j = IHI+1, IHI+2, ... N.
-*
-*     LDH   (input) INTEGER
-*           The leading dimension of the array H. LDH .GE. max(1,N).
-*
-*     W        (output) COMPLEX*16 array, dimension (N)
-*           The computed eigenvalues of H(ILO:IHI,ILO:IHI) are stored
-*           in W(ILO:IHI). If WANTT is .TRUE., then the eigenvalues are
-*           stored in the same order as on the diagonal of the Schur
-*           form returned in H, with W(i) = H(i,i).
-*
-*     Z     (input/output) COMPLEX*16 array, dimension (LDZ,IHI)
-*           If WANTZ is .FALSE., then Z is not referenced.
-*           If WANTZ is .TRUE., then Z(ILO:IHI,ILOZ:IHIZ) is
-*           replaced by Z(ILO:IHI,ILOZ:IHIZ)*U where U is the
-*           orthogonal Schur factor of H(ILO:IHI,ILO:IHI).
-*           (The output value of Z when INFO.GT.0 is given under
-*           the description of INFO below.)
-*
-*     LDZ   (input) INTEGER
-*           The leading dimension of the array Z.  if WANTZ is .TRUE.
-*           then LDZ.GE.MAX(1,IHIZ).  Otherwize, LDZ.GE.1.
-*
-*     WORK  (workspace/output) COMPLEX*16 array, dimension LWORK
-*           On exit, if LWORK = -1, WORK(1) returns an estimate of
-*           the optimal value for LWORK.
-*
-*     LWORK (input) INTEGER
-*           The dimension of the array WORK.  LWORK .GE. max(1,N)
-*           is sufficient, but LWORK typically as large as 6*N may
-*           be required for optimal performance.  A workspace query
-*           to determine the optimal workspace size is recommended.
-*
-*           If LWORK = -1, then ZLAQR4 does a workspace query.
-*           In this case, ZLAQR4 checks the input parameters and
-*           estimates the optimal workspace size for the given
-*           values of N, ILO and IHI.  The estimate is returned
-*           in WORK(1).  No error message related to LWORK is
-*           issued by XERBLA.  Neither H nor Z are accessed.
-*
-*
-*     INFO  (output) INTEGER
-*             =  0:  successful exit
-*           .GT. 0:  if INFO = i, ZLAQR4 failed to compute all of
-*                the eigenvalues.  Elements 1:ilo-1 and i+1:n of WR
-*                and WI contain those eigenvalues which have been
-*                successfully computed.  (Failures are rare.)
-*
-*                If INFO .GT. 0 and WANT is .FALSE., then on exit,
-*                the remaining unconverged eigenvalues are the eigen-
-*                values of the upper Hessenberg matrix rows and
-*                columns ILO through INFO of the final, output
-*                value of H.
-*
-*                If INFO .GT. 0 and WANTT is .TRUE., then on exit
-*
-*           (*)  (initial value of H)*U  = U*(final value of H)
-*
-*                where U is a unitary matrix.  The final
-*                value of  H is upper Hessenberg and triangular in
-*                rows and columns INFO+1 through IHI.
-*
-*                If INFO .GT. 0 and WANTZ is .TRUE., then on exit
-*
-*                  (final value of Z(ILO:IHI,ILOZ:IHIZ)
-*                   =  (initial value of Z(ILO:IHI,ILOZ:IHIZ)*U
-*
-*                where U is the unitary matrix in (*) (regard-
-*                less of the value of WANTT.)
-*
-*                If INFO .GT. 0 and WANTZ is .FALSE., then Z is not
-*                accessed.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*     ================================================================
-*     References:
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
-*       Performance, SIAM Journal of Matrix Analysis, volume 23, pages
-*       929--947, 2002.
-*
-*       K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*       Algorithm Part II: Aggressive Early Deflation, SIAM Journal
-*       of Matrix Analysis, volume 23, pages 948--973, 2002.
-*
-*     ================================================================
-*     .. Parameters ..
-*
-*     ==== Matrices of order NTINY or smaller must be processed by
-*     .    ZLAHQR because of insufficient subdiagonal scratch space.
-*     .    (This is a hard limit.) ====
-*
-*     ==== Exceptional deflation windows:  try to cure rare
-*     .    slow convergence by increasing the size of the
-*     .    deflation window after KEXNW iterations. =====
-*
-*     ==== Exceptional shifts: try to cure rare slow convergence
-*     .    with ad-hoc exceptional shifts every KEXSH iterations.
-*     .    The constants WILK1 and WILK2 are used to form the
-*     .    exceptional shifts. ====
-*
-      INTEGER            NTINY
-      PARAMETER          ( NTINY = 11 )
-      INTEGER            KEXNW, KEXSH
-      PARAMETER          ( KEXNW = 5, KEXSH = 6 )
-      DOUBLE PRECISION   WILK1
-      PARAMETER          ( WILK1 = 0.75d0 )
-      COMPLEX*16         ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0d0, 0.0d0 ),
-     $                   ONE = ( 1.0d0, 0.0d0 ) )
-      DOUBLE PRECISION   TWO
-      PARAMETER          ( TWO = 2.0d0 )
-*     ..
-*     .. Local Scalars ..
-      COMPLEX*16         AA, BB, CC, CDUM, DD, DET, RTDISC, SWAP, TR2
-      DOUBLE PRECISION   S
-      INTEGER            I, INF, IT, ITMAX, K, KACC22, KBOT, KDU, KS,
-     $                   KT, KTOP, KU, KV, KWH, KWTOP, KWV, LD, LS,
-     $                   LWKOPT, NDFL, NH, NHO, NIBBLE, NMIN, NS, NSMAX,
-     $                   NSR, NVE, NW, NWMAX, NWR
-      LOGICAL            NWINC, SORTED
-      CHARACTER          JBCMPZ*2
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Local Arrays ..
-      COMPLEX*16         ZDUM( 1, 1 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZLACPY, ZLAHQR, ZLAQR2, ZLAQR5
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCMPLX, DIMAG, INT, MAX, MIN, MOD,
-     $                   SQRT
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( DBLE( CDUM ) ) + ABS( DIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-      INFO = 0
-*
-*     ==== Quick return for N = 0: nothing to do. ====
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = ONE
-         RETURN
-      END IF
-*
-*     ==== Set up job flags for ILAENV. ====
-*
-      IF( WANTT ) THEN
-         JBCMPZ( 1: 1 ) = 'S'
-      ELSE
-         JBCMPZ( 1: 1 ) = 'E'
-      END IF
-      IF( WANTZ ) THEN
-         JBCMPZ( 2: 2 ) = 'V'
-      ELSE
-         JBCMPZ( 2: 2 ) = 'N'
-      END IF
-*
-*     ==== Tiny matrices must use ZLAHQR. ====
-*
-      IF( N.LE.NTINY ) THEN
-*
-*        ==== Estimate optimal workspace. ====
-*
-         LWKOPT = 1
-         IF( LWORK.NE.-1 )
-     $      CALL ZLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ,
-     $                   IHIZ, Z, LDZ, INFO )
-      ELSE
-*
-*        ==== Use small bulge multi-shift QR with aggressive early
-*        .    deflation on larger-than-tiny matrices. ====
-*
-*        ==== Hope for the best. ====
-*
-         INFO = 0
-*
-*        ==== NWR = recommended deflation window size.  At this
-*        .    point,  N .GT. NTINY = 11, so there is enough
-*        .    subdiagonal workspace for NWR.GE.2 as required.
-*        .    (In fact, there is enough subdiagonal space for
-*        .    NWR.GE.3.) ====
-*
-         NWR = ILAENV( 13, 'ZLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         NWR = MAX( 2, NWR )
-         NWR = MIN( IHI-ILO+1, ( N-1 ) / 3, NWR )
-         NW = NWR
-*
-*        ==== NSR = recommended number of simultaneous shifts.
-*        .    At this point N .GT. NTINY = 11, so there is at
-*        .    enough subdiagonal workspace for NSR to be even
-*        .    and greater than or equal to two as required. ====
-*
-         NSR = ILAENV( 15, 'ZLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         NSR = MIN( NSR, ( N+6 ) / 9, IHI-ILO )
-         NSR = MAX( 2, NSR-MOD( NSR, 2 ) )
-*
-*        ==== Estimate optimal workspace ====
-*
-*        ==== Workspace query call to ZLAQR2 ====
-*
-         CALL ZLAQR2( WANTT, WANTZ, N, ILO, IHI, NWR+1, H, LDH, ILOZ,
-     $                IHIZ, Z, LDZ, LS, LD, W, H, LDH, N, H, LDH, N, H,
-     $                LDH, WORK, -1 )
-*
-*        ==== Optimal workspace = MAX(ZLAQR5, ZLAQR2) ====
-*
-         LWKOPT = MAX( 3*NSR / 2, INT( WORK( 1 ) ) )
-*
-*        ==== Quick return in case of workspace query. ====
-*
-         IF( LWORK.EQ.-1 ) THEN
-            WORK( 1 ) = DCMPLX( LWKOPT, 0 )
-            RETURN
-         END IF
-*
-*        ==== ZLAHQR/ZLAQR0 crossover point ====
-*
-         NMIN = ILAENV( 12, 'ZLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         NMIN = MAX( NTINY, NMIN )
-*
-*        ==== Nibble crossover point ====
-*
-         NIBBLE = ILAENV( 14, 'ZLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         NIBBLE = MAX( 0, NIBBLE )
-*
-*        ==== Accumulate reflections during ttswp?  Use block
-*        .    2-by-2 structure during matrix-matrix multiply? ====
-*
-         KACC22 = ILAENV( 16, 'ZLAQR4', JBCMPZ, N, ILO, IHI, LWORK )
-         KACC22 = MAX( 0, KACC22 )
-         KACC22 = MIN( 2, KACC22 )
-*
-*        ==== NWMAX = the largest possible deflation window for
-*        .    which there is sufficient workspace. ====
-*
-         NWMAX = MIN( ( N-1 ) / 3, LWORK / 2 )
-*
-*        ==== NSMAX = the Largest number of simultaneous shifts
-*        .    for which there is sufficient workspace. ====
-*
-         NSMAX = MIN( ( N+6 ) / 9, 2*LWORK / 3 )
-         NSMAX = NSMAX - MOD( NSMAX, 2 )
-*
-*        ==== NDFL: an iteration count restarted at deflation. ====
-*
-         NDFL = 1
-*
-*        ==== ITMAX = iteration limit ====
-*
-         ITMAX = MAX( 30, 2*KEXSH )*MAX( 10, ( IHI-ILO+1 ) )
-*
-*        ==== Last row and column in the active block ====
-*
-         KBOT = IHI
-*
-*        ==== Main Loop ====
-*
-         DO 70 IT = 1, ITMAX
-*
-*           ==== Done when KBOT falls below ILO ====
-*
-            IF( KBOT.LT.ILO )
-     $         GO TO 80
-*
-*           ==== Locate active block ====
-*
-            DO 10 K = KBOT, ILO + 1, -1
-               IF( H( K, K-1 ).EQ.ZERO )
-     $            GO TO 20
-   10       CONTINUE
-            K = ILO
-   20       CONTINUE
-            KTOP = K
-*
-*           ==== Select deflation window size ====
-*
-            NH = KBOT - KTOP + 1
-            IF( NDFL.LT.KEXNW .OR. NH.LT.NW ) THEN
-*
-*              ==== Typical deflation window.  If possible and
-*              .    advisable, nibble the entire active block.
-*              .    If not, use size NWR or NWR+1 depending upon
-*              .    which has the smaller corresponding subdiagonal
-*              .    entry (a heuristic). ====
-*
-               NWINC = .TRUE.
-               IF( NH.LE.MIN( NMIN, NWMAX ) ) THEN
-                  NW = NH
-               ELSE
-                  NW = MIN( NWR, NH, NWMAX )
-                  IF( NW.LT.NWMAX ) THEN
-                     IF( NW.GE.NH-1 ) THEN
-                        NW = NH
-                     ELSE
-                        KWTOP = KBOT - NW + 1
-                        IF( CABS1( H( KWTOP, KWTOP-1 ) ).GT.
-     $                      CABS1( H( KWTOP-1, KWTOP-2 ) ) )NW = NW + 1
-                     END IF
-                  END IF
-               END IF
-            ELSE
-*
-*              ==== Exceptional deflation window.  If there have
-*              .    been no deflations in KEXNW or more iterations,
-*              .    then vary the deflation window size.   At first,
-*              .    because, larger windows are, in general, more
-*              .    powerful than smaller ones, rapidly increase the
-*              .    window up to the maximum reasonable and possible.
-*              .    Then maybe try a slightly smaller window.  ====
-*
-               IF( NWINC .AND. NW.LT.MIN( NWMAX, NH ) ) THEN
-                  NW = MIN( NWMAX, NH, 2*NW )
-               ELSE
-                  NWINC = .FALSE.
-                  IF( NW.EQ.NH .AND. NH.GT.2 )
-     $               NW = NH - 1
-               END IF
-            END IF
-*
-*           ==== Aggressive early deflation:
-*           .    split workspace under the subdiagonal into
-*           .      - an nw-by-nw work array V in the lower
-*           .        left-hand-corner,
-*           .      - an NW-by-at-least-NW-but-more-is-better
-*           .        (NW-by-NHO) horizontal work array along
-*           .        the bottom edge,
-*           .      - an at-least-NW-but-more-is-better (NHV-by-NW)
-*           .        vertical work array along the left-hand-edge.
-*           .        ====
-*
-            KV = N - NW + 1
-            KT = NW + 1
-            NHO = ( N-NW-1 ) - KT + 1
-            KWV = NW + 2
-            NVE = ( N-NW ) - KWV + 1
-*
-*           ==== Aggressive early deflation ====
-*
-            CALL ZLAQR2( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
-     $                   IHIZ, Z, LDZ, LS, LD, W, H( KV, 1 ), LDH, NHO,
-     $                   H( KV, KT ), LDH, NVE, H( KWV, 1 ), LDH, WORK,
-     $                   LWORK )
-*
-*           ==== Adjust KBOT accounting for new deflations. ====
-*
-            KBOT = KBOT - LD
-*
-*           ==== KS points to the shifts. ====
-*
-            KS = KBOT - LS + 1
-*
-*           ==== Skip an expensive QR sweep if there is a (partly
-*           .    heuristic) reason to expect that many eigenvalues
-*           .    will deflate without it.  Here, the QR sweep is
-*           .    skipped if many eigenvalues have just been deflated
-*           .    or if the remaining active block is small.
-*
-            IF( ( LD.EQ.0 ) .OR. ( ( 100*LD.LE.NW*NIBBLE ) .AND. ( KBOT-
-     $          KTOP+1.GT.MIN( NMIN, NWMAX ) ) ) ) THEN
-*
-*              ==== NS = nominal number of simultaneous shifts.
-*              .    This may be lowered (slightly) if ZLAQR2
-*              .    did not provide that many shifts. ====
-*
-               NS = MIN( NSMAX, NSR, MAX( 2, KBOT-KTOP ) )
-               NS = NS - MOD( NS, 2 )
-*
-*              ==== If there have been no deflations
-*              .    in a multiple of KEXSH iterations,
-*              .    then try exceptional shifts.
-*              .    Otherwise use shifts provided by
-*              .    ZLAQR2 above or from the eigenvalues
-*              .    of a trailing principal submatrix. ====
-*
-               IF( MOD( NDFL, KEXSH ).EQ.0 ) THEN
-                  KS = KBOT - NS + 1
-                  DO 30 I = KBOT, KS + 1, -2
-                     W( I ) = H( I, I ) + WILK1*CABS1( H( I, I-1 ) )
-                     W( I-1 ) = W( I )
-   30             CONTINUE
-               ELSE
-*
-*                 ==== Got NS/2 or fewer shifts? Use ZLAHQR
-*                 .    on a trailing principal submatrix to
-*                 .    get more. (Since NS.LE.NSMAX.LE.(N+6)/9,
-*                 .    there is enough space below the subdiagonal
-*                 .    to fit an NS-by-NS scratch array.) ====
-*
-                  IF( KBOT-KS+1.LE.NS / 2 ) THEN
-                     KS = KBOT - NS + 1
-                     KT = N - NS + 1
-                     CALL ZLACPY( 'A', NS, NS, H( KS, KS ), LDH,
-     $                            H( KT, 1 ), LDH )
-                     CALL ZLAHQR( .false., .false., NS, 1, NS,
-     $                            H( KT, 1 ), LDH, W( KS ), 1, 1, ZDUM,
-     $                            1, INF )
-                     KS = KS + INF
-*
-*                    ==== In case of a rare QR failure use
-*                    .    eigenvalues of the trailing 2-by-2
-*                    .    principal submatrix.  Scale to avoid
-*                    .    overflows, underflows and subnormals.
-*                    .    (The scale factor S can not be zero,
-*                    .    because H(KBOT,KBOT-1) is nonzero.) ====
-*
-                     IF( KS.GE.KBOT ) THEN
-                        S = CABS1( H( KBOT-1, KBOT-1 ) ) +
-     $                      CABS1( H( KBOT, KBOT-1 ) ) +
-     $                      CABS1( H( KBOT-1, KBOT ) ) +
-     $                      CABS1( H( KBOT, KBOT ) )
-                        AA = H( KBOT-1, KBOT-1 ) / S
-                        CC = H( KBOT, KBOT-1 ) / S
-                        BB = H( KBOT-1, KBOT ) / S
-                        DD = H( KBOT, KBOT ) / S
-                        TR2 = ( AA+DD ) / TWO
-                        DET = ( AA-TR2 )*( DD-TR2 ) - BB*CC
-                        RTDISC = SQRT( -DET )
-                        W( KBOT-1 ) = ( TR2+RTDISC )*S
-                        W( KBOT ) = ( TR2-RTDISC )*S
-*
-                        KS = KBOT - 1
-                     END IF
-                  END IF
-*
-                  IF( KBOT-KS+1.GT.NS ) THEN
-*
-*                    ==== Sort the shifts (Helps a little) ====
-*
-                     SORTED = .false.
-                     DO 50 K = KBOT, KS + 1, -1
-                        IF( SORTED )
-     $                     GO TO 60
-                        SORTED = .true.
-                        DO 40 I = KS, K - 1
-                           IF( CABS1( W( I ) ).LT.CABS1( W( I+1 ) ) )
-     $                          THEN
-                              SORTED = .false.
-                              SWAP = W( I )
-                              W( I ) = W( I+1 )
-                              W( I+1 ) = SWAP
-                           END IF
-   40                   CONTINUE
-   50                CONTINUE
-   60                CONTINUE
-                  END IF
-               END IF
-*
-*              ==== If there are only two shifts, then use
-*              .    only one.  ====
-*
-               IF( KBOT-KS+1.EQ.2 ) THEN
-                  IF( CABS1( W( KBOT )-H( KBOT, KBOT ) ).LT.
-     $                CABS1( W( KBOT-1 )-H( KBOT, KBOT ) ) ) THEN
-                     W( KBOT-1 ) = W( KBOT )
-                  ELSE
-                     W( KBOT ) = W( KBOT-1 )
-                  END IF
-               END IF
-*
-*              ==== Use up to NS of the the smallest magnatiude
-*              .    shifts.  If there aren't NS shifts available,
-*              .    then use them all, possibly dropping one to
-*              .    make the number of shifts even. ====
-*
-               NS = MIN( NS, KBOT-KS+1 )
-               NS = NS - MOD( NS, 2 )
-               KS = KBOT - NS + 1
-*
-*              ==== Small-bulge multi-shift QR sweep:
-*              .    split workspace under the subdiagonal into
-*              .    - a KDU-by-KDU work array U in the lower
-*              .      left-hand-corner,
-*              .    - a KDU-by-at-least-KDU-but-more-is-better
-*              .      (KDU-by-NHo) horizontal work array WH along
-*              .      the bottom edge,
-*              .    - and an at-least-KDU-but-more-is-better-by-KDU
-*              .      (NVE-by-KDU) vertical work WV arrow along
-*              .      the left-hand-edge. ====
-*
-               KDU = 3*NS - 3
-               KU = N - KDU + 1
-               KWH = KDU + 1
-               NHO = ( N-KDU+1-4 ) - ( KDU+1 ) + 1
-               KWV = KDU + 4
-               NVE = N - KDU - KWV + 1
-*
-*              ==== Small-bulge multi-shift QR sweep ====
-*
-               CALL ZLAQR5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NS,
-     $                      W( KS ), H, LDH, ILOZ, IHIZ, Z, LDZ, WORK,
-     $                      3, H( KU, 1 ), LDH, NVE, H( KWV, 1 ), LDH,
-     $                      NHO, H( KU, KWH ), LDH )
-            END IF
-*
-*           ==== Note progress (or the lack of it). ====
-*
-            IF( LD.GT.0 ) THEN
-               NDFL = 1
-            ELSE
-               NDFL = NDFL + 1
-            END IF
-*
-*           ==== End of main loop ====
-   70    CONTINUE
-*
-*        ==== Iteration limit exceeded.  Set INFO to show where
-*        .    the problem occurred and exit. ====
-*
-         INFO = KBOT
-   80    CONTINUE
-      END IF
-*
-*     ==== Return the optimal value of LWORK. ====
-*
-      WORK( 1 ) = DCMPLX( LWKOPT, 0 )
-*
-*     ==== End of ZLAQR4 ====
-*
-      END
--- a/libcruft/lapack/zlaqr5.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,809 +0,0 @@
-      SUBROUTINE ZLAQR5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NSHFTS, S,
-     $                   H, LDH, ILOZ, IHIZ, Z, LDZ, V, LDV, U, LDU, NV,
-     $                   WV, LDWV, NH, WH, LDWH )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHIZ, ILOZ, KACC22, KBOT, KTOP, LDH, LDU, LDV,
-     $                   LDWH, LDWV, LDZ, N, NH, NSHFTS, NV
-      LOGICAL            WANTT, WANTZ
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         H( LDH, * ), S( * ), U( LDU, * ), V( LDV, * ),
-     $                   WH( LDWH, * ), WV( LDWV, * ), Z( LDZ, * )
-*     ..
-*
-*     This auxiliary subroutine called by ZLAQR0 performs a
-*     single small-bulge multi-shift QR sweep.
-*
-*      WANTT  (input) logical scalar
-*             WANTT = .true. if the triangular Schur factor
-*             is being computed.  WANTT is set to .false. otherwise.
-*
-*      WANTZ  (input) logical scalar
-*             WANTZ = .true. if the unitary Schur factor is being
-*             computed.  WANTZ is set to .false. otherwise.
-*
-*      KACC22 (input) integer with value 0, 1, or 2.
-*             Specifies the computation mode of far-from-diagonal
-*             orthogonal updates.
-*        = 0: ZLAQR5 does not accumulate reflections and does not
-*             use matrix-matrix multiply to update far-from-diagonal
-*             matrix entries.
-*        = 1: ZLAQR5 accumulates reflections and uses matrix-matrix
-*             multiply to update the far-from-diagonal matrix entries.
-*        = 2: ZLAQR5 accumulates reflections, uses matrix-matrix
-*             multiply to update the far-from-diagonal matrix entries,
-*             and takes advantage of 2-by-2 block structure during
-*             matrix multiplies.
-*
-*      N      (input) integer scalar
-*             N is the order of the Hessenberg matrix H upon which this
-*             subroutine operates.
-*
-*      KTOP   (input) integer scalar
-*      KBOT   (input) integer scalar
-*             These are the first and last rows and columns of an
-*             isolated diagonal block upon which the QR sweep is to be
-*             applied. It is assumed without a check that
-*                       either KTOP = 1  or   H(KTOP,KTOP-1) = 0
-*             and
-*                       either KBOT = N  or   H(KBOT+1,KBOT) = 0.
-*
-*      NSHFTS (input) integer scalar
-*             NSHFTS gives the number of simultaneous shifts.  NSHFTS
-*             must be positive and even.
-*
-*      S      (input) COMPLEX*16 array of size (NSHFTS)
-*             S contains the shifts of origin that define the multi-
-*             shift QR sweep.
-*
-*      H      (input/output) COMPLEX*16 array of size (LDH,N)
-*             On input H contains a Hessenberg matrix.  On output a
-*             multi-shift QR sweep with shifts SR(J)+i*SI(J) is applied
-*             to the isolated diagonal block in rows and columns KTOP
-*             through KBOT.
-*
-*      LDH    (input) integer scalar
-*             LDH is the leading dimension of H just as declared in the
-*             calling procedure.  LDH.GE.MAX(1,N).
-*
-*      ILOZ   (input) INTEGER
-*      IHIZ   (input) INTEGER
-*             Specify the rows of Z to which transformations must be
-*             applied if WANTZ is .TRUE.. 1 .LE. ILOZ .LE. IHIZ .LE. N
-*
-*      Z      (input/output) COMPLEX*16 array of size (LDZ,IHI)
-*             If WANTZ = .TRUE., then the QR Sweep unitary
-*             similarity transformation is accumulated into
-*             Z(ILOZ:IHIZ,ILO:IHI) from the right.
-*             If WANTZ = .FALSE., then Z is unreferenced.
-*
-*      LDZ    (input) integer scalar
-*             LDA is the leading dimension of Z just as declared in
-*             the calling procedure. LDZ.GE.N.
-*
-*      V      (workspace) COMPLEX*16 array of size (LDV,NSHFTS/2)
-*
-*      LDV    (input) integer scalar
-*             LDV is the leading dimension of V as declared in the
-*             calling procedure.  LDV.GE.3.
-*
-*      U      (workspace) COMPLEX*16 array of size
-*             (LDU,3*NSHFTS-3)
-*
-*      LDU    (input) integer scalar
-*             LDU is the leading dimension of U just as declared in the
-*             in the calling subroutine.  LDU.GE.3*NSHFTS-3.
-*
-*      NH     (input) integer scalar
-*             NH is the number of columns in array WH available for
-*             workspace. NH.GE.1.
-*
-*      WH     (workspace) COMPLEX*16 array of size (LDWH,NH)
-*
-*      LDWH   (input) integer scalar
-*             Leading dimension of WH just as declared in the
-*             calling procedure.  LDWH.GE.3*NSHFTS-3.
-*
-*      NV     (input) integer scalar
-*             NV is the number of rows in WV agailable for workspace.
-*             NV.GE.1.
-*
-*      WV     (workspace) COMPLEX*16 array of size
-*             (LDWV,3*NSHFTS-3)
-*
-*      LDWV   (input) integer scalar
-*             LDWV is the leading dimension of WV as declared in the
-*             in the calling subroutine.  LDWV.GE.NV.
-*
-*     ================================================================
-*     Based on contributions by
-*        Karen Braman and Ralph Byers, Department of Mathematics,
-*        University of Kansas, USA
-*
-*      ============================================================
-*      Reference:
-*
-*      K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
-*      Algorithm Part I: Maintaining Well Focused Shifts, and
-*      Level 3 Performance, SIAM Journal of Matrix Analysis,
-*      volume 23, pages 929--947, 2002.
-*
-*      ============================================================
-*     .. Parameters ..
-      COMPLEX*16         ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0d0, 0.0d0 ),
-     $                   ONE = ( 1.0d0, 0.0d0 ) )
-      DOUBLE PRECISION   RZERO, RONE
-      PARAMETER          ( RZERO = 0.0d0, RONE = 1.0d0 )
-*     ..
-*     .. Local Scalars ..
-      COMPLEX*16         ALPHA, BETA, CDUM, REFSUM
-      DOUBLE PRECISION   H11, H12, H21, H22, SAFMAX, SAFMIN, SCL,
-     $                   SMLNUM, TST1, TST2, ULP
-      INTEGER            I2, I4, INCOL, J, J2, J4, JBOT, JCOL, JLEN,
-     $                   JROW, JTOP, K, K1, KDU, KMS, KNZ, KRCOL, KZS,
-     $                   M, M22, MBOT, MEND, MSTART, MTOP, NBMPS, NDCOL,
-     $                   NS, NU
-      LOGICAL            ACCUM, BLK22, BMP22
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           DLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-*
-      INTRINSIC          ABS, DBLE, DCONJG, DIMAG, MAX, MIN, MOD
-*     ..
-*     .. Local Arrays ..
-      COMPLEX*16         VT( 3 )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLABAD, ZGEMM, ZLACPY, ZLAQR1, ZLARFG, ZLASET,
-     $                   ZTRMM
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( DBLE( CDUM ) ) + ABS( DIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     ==== If there are no shifts, then there is nothing to do. ====
-*
-      IF( NSHFTS.LT.2 )
-     $   RETURN
-*
-*     ==== If the active block is empty or 1-by-1, then there
-*     .    is nothing to do. ====
-*
-      IF( KTOP.GE.KBOT )
-     $   RETURN
-*
-*     ==== NSHFTS is supposed to be even, but if is odd,
-*     .    then simply reduce it by one.  ====
-*
-      NS = NSHFTS - MOD( NSHFTS, 2 )
-*
-*     ==== Machine constants for deflation ====
-*
-      SAFMIN = DLAMCH( 'SAFE MINIMUM' )
-      SAFMAX = RONE / SAFMIN
-      CALL DLABAD( SAFMIN, SAFMAX )
-      ULP = DLAMCH( 'PRECISION' )
-      SMLNUM = SAFMIN*( DBLE( N ) / ULP )
-*
-*     ==== Use accumulated reflections to update far-from-diagonal
-*     .    entries ? ====
-*
-      ACCUM = ( KACC22.EQ.1 ) .OR. ( KACC22.EQ.2 )
-*
-*     ==== If so, exploit the 2-by-2 block structure? ====
-*
-      BLK22 = ( NS.GT.2 ) .AND. ( KACC22.EQ.2 )
-*
-*     ==== clear trash ====
-*
-      IF( KTOP+2.LE.KBOT )
-     $   H( KTOP+2, KTOP ) = ZERO
-*
-*     ==== NBMPS = number of 2-shift bulges in the chain ====
-*
-      NBMPS = NS / 2
-*
-*     ==== KDU = width of slab ====
-*
-      KDU = 6*NBMPS - 3
-*
-*     ==== Create and chase chains of NBMPS bulges ====
-*
-      DO 210 INCOL = 3*( 1-NBMPS ) + KTOP - 1, KBOT - 2, 3*NBMPS - 2
-         NDCOL = INCOL + KDU
-         IF( ACCUM )
-     $      CALL ZLASET( 'ALL', KDU, KDU, ZERO, ONE, U, LDU )
-*
-*        ==== Near-the-diagonal bulge chase.  The following loop
-*        .    performs the near-the-diagonal part of a small bulge
-*        .    multi-shift QR sweep.  Each 6*NBMPS-2 column diagonal
-*        .    chunk extends from column INCOL to column NDCOL
-*        .    (including both column INCOL and column NDCOL). The
-*        .    following loop chases a 3*NBMPS column long chain of
-*        .    NBMPS bulges 3*NBMPS-2 columns to the right.  (INCOL
-*        .    may be less than KTOP and and NDCOL may be greater than
-*        .    KBOT indicating phantom columns from which to chase
-*        .    bulges before they are actually introduced or to which
-*        .    to chase bulges beyond column KBOT.)  ====
-*
-         DO 140 KRCOL = INCOL, MIN( INCOL+3*NBMPS-3, KBOT-2 )
-*
-*           ==== Bulges number MTOP to MBOT are active double implicit
-*           .    shift bulges.  There may or may not also be small
-*           .    2-by-2 bulge, if there is room.  The inactive bulges
-*           .    (if any) must wait until the active bulges have moved
-*           .    down the diagonal to make room.  The phantom matrix
-*           .    paradigm described above helps keep track.  ====
-*
-            MTOP = MAX( 1, ( ( KTOP-1 )-KRCOL+2 ) / 3+1 )
-            MBOT = MIN( NBMPS, ( KBOT-KRCOL ) / 3 )
-            M22 = MBOT + 1
-            BMP22 = ( MBOT.LT.NBMPS ) .AND. ( KRCOL+3*( M22-1 ) ).EQ.
-     $              ( KBOT-2 )
-*
-*           ==== Generate reflections to chase the chain right
-*           .    one column.  (The minimum value of K is KTOP-1.) ====
-*
-            DO 10 M = MTOP, MBOT
-               K = KRCOL + 3*( M-1 )
-               IF( K.EQ.KTOP-1 ) THEN
-                  CALL ZLAQR1( 3, H( KTOP, KTOP ), LDH, S( 2*M-1 ),
-     $                         S( 2*M ), V( 1, M ) )
-                  ALPHA = V( 1, M )
-                  CALL ZLARFG( 3, ALPHA, V( 2, M ), 1, V( 1, M ) )
-               ELSE
-                  BETA = H( K+1, K )
-                  V( 2, M ) = H( K+2, K )
-                  V( 3, M ) = H( K+3, K )
-                  CALL ZLARFG( 3, BETA, V( 2, M ), 1, V( 1, M ) )
-*
-*                 ==== A Bulge may collapse because of vigilant
-*                 .    deflation or destructive underflow.  (The
-*                 .    initial bulge is always collapsed.) Use
-*                 .    the two-small-subdiagonals trick to try
-*                 .    to get it started again. If V(2,M).NE.0 and
-*                 .    V(3,M) = H(K+3,K+1) = H(K+3,K+2) = 0, then
-*                 .    this bulge is collapsing into a zero
-*                 .    subdiagonal.  It will be restarted next
-*                 .    trip through the loop.)
-*
-                  IF( V( 1, M ).NE.ZERO .AND.
-     $                ( V( 3, M ).NE.ZERO .OR. ( H( K+3,
-     $                K+1 ).EQ.ZERO .AND. H( K+3, K+2 ).EQ.ZERO ) ) )
-     $                 THEN
-*
-*                    ==== Typical case: not collapsed (yet). ====
-*
-                     H( K+1, K ) = BETA
-                     H( K+2, K ) = ZERO
-                     H( K+3, K ) = ZERO
-                  ELSE
-*
-*                    ==== Atypical case: collapsed.  Attempt to
-*                    .    reintroduce ignoring H(K+1,K).  If the
-*                    .    fill resulting from the new reflector
-*                    .    is too large, then abandon it.
-*                    .    Otherwise, use the new one. ====
-*
-                     CALL ZLAQR1( 3, H( K+1, K+1 ), LDH, S( 2*M-1 ),
-     $                            S( 2*M ), VT )
-                     SCL = CABS1( VT( 1 ) ) + CABS1( VT( 2 ) ) +
-     $                     CABS1( VT( 3 ) )
-                     IF( SCL.NE.RZERO ) THEN
-                        VT( 1 ) = VT( 1 ) / SCL
-                        VT( 2 ) = VT( 2 ) / SCL
-                        VT( 3 ) = VT( 3 ) / SCL
-                     END IF
-*
-*                    ==== The following is the traditional and
-*                    .    conservative two-small-subdiagonals
-*                    .    test.  ====
-*                    .
-                     IF( CABS1( H( K+1, K ) )*
-     $                   ( CABS1( VT( 2 ) )+CABS1( VT( 3 ) ) ).GT.ULP*
-     $                   CABS1( VT( 1 ) )*( CABS1( H( K,
-     $                   K ) )+CABS1( H( K+1, K+1 ) )+CABS1( H( K+2,
-     $                   K+2 ) ) ) ) THEN
-*
-*                       ==== Starting a new bulge here would
-*                       .    create non-negligible fill.   If
-*                       .    the old reflector is diagonal (only
-*                       .    possible with underflows), then
-*                       .    change it to I.  Otherwise, use
-*                       .    it with trepidation. ====
-*
-                        IF( V( 2, M ).EQ.ZERO .AND. V( 3, M ).EQ.ZERO )
-     $                       THEN
-                           V( 1, M ) = ZERO
-                        ELSE
-                           H( K+1, K ) = BETA
-                           H( K+2, K ) = ZERO
-                           H( K+3, K ) = ZERO
-                        END IF
-                     ELSE
-*
-*                       ==== Stating a new bulge here would
-*                       .    create only negligible fill.
-*                       .    Replace the old reflector with
-*                       .    the new one. ====
-*
-                        ALPHA = VT( 1 )
-                        CALL ZLARFG( 3, ALPHA, VT( 2 ), 1, VT( 1 ) )
-                        REFSUM = H( K+1, K ) +
-     $                           H( K+2, K )*DCONJG( VT( 2 ) ) +
-     $                           H( K+3, K )*DCONJG( VT( 3 ) )
-                        H( K+1, K ) = H( K+1, K ) -
-     $                                DCONJG( VT( 1 ) )*REFSUM
-                        H( K+2, K ) = ZERO
-                        H( K+3, K ) = ZERO
-                        V( 1, M ) = VT( 1 )
-                        V( 2, M ) = VT( 2 )
-                        V( 3, M ) = VT( 3 )
-                     END IF
-                  END IF
-               END IF
-   10       CONTINUE
-*
-*           ==== Generate a 2-by-2 reflection, if needed. ====
-*
-            K = KRCOL + 3*( M22-1 )
-            IF( BMP22 ) THEN
-               IF( K.EQ.KTOP-1 ) THEN
-                  CALL ZLAQR1( 2, H( K+1, K+1 ), LDH, S( 2*M22-1 ),
-     $                         S( 2*M22 ), V( 1, M22 ) )
-                  BETA = V( 1, M22 )
-                  CALL ZLARFG( 2, BETA, V( 2, M22 ), 1, V( 1, M22 ) )
-               ELSE
-                  BETA = H( K+1, K )
-                  V( 2, M22 ) = H( K+2, K )
-                  CALL ZLARFG( 2, BETA, V( 2, M22 ), 1, V( 1, M22 ) )
-                  H( K+1, K ) = BETA
-                  H( K+2, K ) = ZERO
-               END IF
-            ELSE
-*
-*              ==== Initialize V(1,M22) here to avoid possible undefined
-*              .    variable problems later. ====
-*
-               V( 1, M22 ) = ZERO
-            END IF
-*
-*           ==== Multiply H by reflections from the left ====
-*
-            IF( ACCUM ) THEN
-               JBOT = MIN( NDCOL, KBOT )
-            ELSE IF( WANTT ) THEN
-               JBOT = N
-            ELSE
-               JBOT = KBOT
-            END IF
-            DO 30 J = MAX( KTOP, KRCOL ), JBOT
-               MEND = MIN( MBOT, ( J-KRCOL+2 ) / 3 )
-               DO 20 M = MTOP, MEND
-                  K = KRCOL + 3*( M-1 )
-                  REFSUM = DCONJG( V( 1, M ) )*
-     $                     ( H( K+1, J )+DCONJG( V( 2, M ) )*
-     $                     H( K+2, J )+DCONJG( V( 3, M ) )*H( K+3, J ) )
-                  H( K+1, J ) = H( K+1, J ) - REFSUM
-                  H( K+2, J ) = H( K+2, J ) - REFSUM*V( 2, M )
-                  H( K+3, J ) = H( K+3, J ) - REFSUM*V( 3, M )
-   20          CONTINUE
-   30       CONTINUE
-            IF( BMP22 ) THEN
-               K = KRCOL + 3*( M22-1 )
-               DO 40 J = MAX( K+1, KTOP ), JBOT
-                  REFSUM = DCONJG( V( 1, M22 ) )*
-     $                     ( H( K+1, J )+DCONJG( V( 2, M22 ) )*
-     $                     H( K+2, J ) )
-                  H( K+1, J ) = H( K+1, J ) - REFSUM
-                  H( K+2, J ) = H( K+2, J ) - REFSUM*V( 2, M22 )
-   40          CONTINUE
-            END IF
-*
-*           ==== Multiply H by reflections from the right.
-*           .    Delay filling in the last row until the
-*           .    vigilant deflation check is complete. ====
-*
-            IF( ACCUM ) THEN
-               JTOP = MAX( KTOP, INCOL )
-            ELSE IF( WANTT ) THEN
-               JTOP = 1
-            ELSE
-               JTOP = KTOP
-            END IF
-            DO 80 M = MTOP, MBOT
-               IF( V( 1, M ).NE.ZERO ) THEN
-                  K = KRCOL + 3*( M-1 )
-                  DO 50 J = JTOP, MIN( KBOT, K+3 )
-                     REFSUM = V( 1, M )*( H( J, K+1 )+V( 2, M )*
-     $                        H( J, K+2 )+V( 3, M )*H( J, K+3 ) )
-                     H( J, K+1 ) = H( J, K+1 ) - REFSUM
-                     H( J, K+2 ) = H( J, K+2 ) -
-     $                             REFSUM*DCONJG( V( 2, M ) )
-                     H( J, K+3 ) = H( J, K+3 ) -
-     $                             REFSUM*DCONJG( V( 3, M ) )
-   50             CONTINUE
-*
-                  IF( ACCUM ) THEN
-*
-*                    ==== Accumulate U. (If necessary, update Z later
-*                    .    with with an efficient matrix-matrix
-*                    .    multiply.) ====
-*
-                     KMS = K - INCOL
-                     DO 60 J = MAX( 1, KTOP-INCOL ), KDU
-                        REFSUM = V( 1, M )*( U( J, KMS+1 )+V( 2, M )*
-     $                           U( J, KMS+2 )+V( 3, M )*U( J, KMS+3 ) )
-                        U( J, KMS+1 ) = U( J, KMS+1 ) - REFSUM
-                        U( J, KMS+2 ) = U( J, KMS+2 ) -
-     $                                  REFSUM*DCONJG( V( 2, M ) )
-                        U( J, KMS+3 ) = U( J, KMS+3 ) -
-     $                                  REFSUM*DCONJG( V( 3, M ) )
-   60                CONTINUE
-                  ELSE IF( WANTZ ) THEN
-*
-*                    ==== U is not accumulated, so update Z
-*                    .    now by multiplying by reflections
-*                    .    from the right. ====
-*
-                     DO 70 J = ILOZ, IHIZ
-                        REFSUM = V( 1, M )*( Z( J, K+1 )+V( 2, M )*
-     $                           Z( J, K+2 )+V( 3, M )*Z( J, K+3 ) )
-                        Z( J, K+1 ) = Z( J, K+1 ) - REFSUM
-                        Z( J, K+2 ) = Z( J, K+2 ) -
-     $                                REFSUM*DCONJG( V( 2, M ) )
-                        Z( J, K+3 ) = Z( J, K+3 ) -
-     $                                REFSUM*DCONJG( V( 3, M ) )
-   70                CONTINUE
-                  END IF
-               END IF
-   80       CONTINUE
-*
-*           ==== Special case: 2-by-2 reflection (if needed) ====
-*
-            K = KRCOL + 3*( M22-1 )
-            IF( BMP22 .AND. ( V( 1, M22 ).NE.ZERO ) ) THEN
-               DO 90 J = JTOP, MIN( KBOT, K+3 )
-                  REFSUM = V( 1, M22 )*( H( J, K+1 )+V( 2, M22 )*
-     $                     H( J, K+2 ) )
-                  H( J, K+1 ) = H( J, K+1 ) - REFSUM
-                  H( J, K+2 ) = H( J, K+2 ) -
-     $                          REFSUM*DCONJG( V( 2, M22 ) )
-   90          CONTINUE
-*
-               IF( ACCUM ) THEN
-                  KMS = K - INCOL
-                  DO 100 J = MAX( 1, KTOP-INCOL ), KDU
-                     REFSUM = V( 1, M22 )*( U( J, KMS+1 )+V( 2, M22 )*
-     $                        U( J, KMS+2 ) )
-                     U( J, KMS+1 ) = U( J, KMS+1 ) - REFSUM
-                     U( J, KMS+2 ) = U( J, KMS+2 ) -
-     $                               REFSUM*DCONJG( V( 2, M22 ) )
-  100             CONTINUE
-               ELSE IF( WANTZ ) THEN
-                  DO 110 J = ILOZ, IHIZ
-                     REFSUM = V( 1, M22 )*( Z( J, K+1 )+V( 2, M22 )*
-     $                        Z( J, K+2 ) )
-                     Z( J, K+1 ) = Z( J, K+1 ) - REFSUM
-                     Z( J, K+2 ) = Z( J, K+2 ) -
-     $                             REFSUM*DCONJG( V( 2, M22 ) )
-  110             CONTINUE
-               END IF
-            END IF
-*
-*           ==== Vigilant deflation check ====
-*
-            MSTART = MTOP
-            IF( KRCOL+3*( MSTART-1 ).LT.KTOP )
-     $         MSTART = MSTART + 1
-            MEND = MBOT
-            IF( BMP22 )
-     $         MEND = MEND + 1
-            IF( KRCOL.EQ.KBOT-2 )
-     $         MEND = MEND + 1
-            DO 120 M = MSTART, MEND
-               K = MIN( KBOT-1, KRCOL+3*( M-1 ) )
-*
-*              ==== The following convergence test requires that
-*              .    the tradition small-compared-to-nearby-diagonals
-*              .    criterion and the Ahues & Tisseur (LAWN 122, 1997)
-*              .    criteria both be satisfied.  The latter improves
-*              .    accuracy in some examples. Falling back on an
-*              .    alternate convergence criterion when TST1 or TST2
-*              .    is zero (as done here) is traditional but probably
-*              .    unnecessary. ====
-*
-               IF( H( K+1, K ).NE.ZERO ) THEN
-                  TST1 = CABS1( H( K, K ) ) + CABS1( H( K+1, K+1 ) )
-                  IF( TST1.EQ.RZERO ) THEN
-                     IF( K.GE.KTOP+1 )
-     $                  TST1 = TST1 + CABS1( H( K, K-1 ) )
-                     IF( K.GE.KTOP+2 )
-     $                  TST1 = TST1 + CABS1( H( K, K-2 ) )
-                     IF( K.GE.KTOP+3 )
-     $                  TST1 = TST1 + CABS1( H( K, K-3 ) )
-                     IF( K.LE.KBOT-2 )
-     $                  TST1 = TST1 + CABS1( H( K+2, K+1 ) )
-                     IF( K.LE.KBOT-3 )
-     $                  TST1 = TST1 + CABS1( H( K+3, K+1 ) )
-                     IF( K.LE.KBOT-4 )
-     $                  TST1 = TST1 + CABS1( H( K+4, K+1 ) )
-                  END IF
-                  IF( CABS1( H( K+1, K ) ).LE.MAX( SMLNUM, ULP*TST1 ) )
-     $                 THEN
-                     H12 = MAX( CABS1( H( K+1, K ) ),
-     $                     CABS1( H( K, K+1 ) ) )
-                     H21 = MIN( CABS1( H( K+1, K ) ),
-     $                     CABS1( H( K, K+1 ) ) )
-                     H11 = MAX( CABS1( H( K+1, K+1 ) ),
-     $                     CABS1( H( K, K )-H( K+1, K+1 ) ) )
-                     H22 = MIN( CABS1( H( K+1, K+1 ) ),
-     $                     CABS1( H( K, K )-H( K+1, K+1 ) ) )
-                     SCL = H11 + H12
-                     TST2 = H22*( H11 / SCL )
-*
-                     IF( TST2.EQ.RZERO .OR. H21*( H12 / SCL ).LE.
-     $                   MAX( SMLNUM, ULP*TST2 ) )H( K+1, K ) = ZERO
-                  END IF
-               END IF
-  120       CONTINUE
-*
-*           ==== Fill in the last row of each bulge. ====
-*
-            MEND = MIN( NBMPS, ( KBOT-KRCOL-1 ) / 3 )
-            DO 130 M = MTOP, MEND
-               K = KRCOL + 3*( M-1 )
-               REFSUM = V( 1, M )*V( 3, M )*H( K+4, K+3 )
-               H( K+4, K+1 ) = -REFSUM
-               H( K+4, K+2 ) = -REFSUM*DCONJG( V( 2, M ) )
-               H( K+4, K+3 ) = H( K+4, K+3 ) -
-     $                         REFSUM*DCONJG( V( 3, M ) )
-  130       CONTINUE
-*
-*           ==== End of near-the-diagonal bulge chase. ====
-*
-  140    CONTINUE
-*
-*        ==== Use U (if accumulated) to update far-from-diagonal
-*        .    entries in H.  If required, use U to update Z as
-*        .    well. ====
-*
-         IF( ACCUM ) THEN
-            IF( WANTT ) THEN
-               JTOP = 1
-               JBOT = N
-            ELSE
-               JTOP = KTOP
-               JBOT = KBOT
-            END IF
-            IF( ( .NOT.BLK22 ) .OR. ( INCOL.LT.KTOP ) .OR.
-     $          ( NDCOL.GT.KBOT ) .OR. ( NS.LE.2 ) ) THEN
-*
-*              ==== Updates not exploiting the 2-by-2 block
-*              .    structure of U.  K1 and NU keep track of
-*              .    the location and size of U in the special
-*              .    cases of introducing bulges and chasing
-*              .    bulges off the bottom.  In these special
-*              .    cases and in case the number of shifts
-*              .    is NS = 2, there is no 2-by-2 block
-*              .    structure to exploit.  ====
-*
-               K1 = MAX( 1, KTOP-INCOL )
-               NU = ( KDU-MAX( 0, NDCOL-KBOT ) ) - K1 + 1
-*
-*              ==== Horizontal Multiply ====
-*
-               DO 150 JCOL = MIN( NDCOL, KBOT ) + 1, JBOT, NH
-                  JLEN = MIN( NH, JBOT-JCOL+1 )
-                  CALL ZGEMM( 'C', 'N', NU, JLEN, NU, ONE, U( K1, K1 ),
-     $                        LDU, H( INCOL+K1, JCOL ), LDH, ZERO, WH,
-     $                        LDWH )
-                  CALL ZLACPY( 'ALL', NU, JLEN, WH, LDWH,
-     $                         H( INCOL+K1, JCOL ), LDH )
-  150          CONTINUE
-*
-*              ==== Vertical multiply ====
-*
-               DO 160 JROW = JTOP, MAX( KTOP, INCOL ) - 1, NV
-                  JLEN = MIN( NV, MAX( KTOP, INCOL )-JROW )
-                  CALL ZGEMM( 'N', 'N', JLEN, NU, NU, ONE,
-     $                        H( JROW, INCOL+K1 ), LDH, U( K1, K1 ),
-     $                        LDU, ZERO, WV, LDWV )
-                  CALL ZLACPY( 'ALL', JLEN, NU, WV, LDWV,
-     $                         H( JROW, INCOL+K1 ), LDH )
-  160          CONTINUE
-*
-*              ==== Z multiply (also vertical) ====
-*
-               IF( WANTZ ) THEN
-                  DO 170 JROW = ILOZ, IHIZ, NV
-                     JLEN = MIN( NV, IHIZ-JROW+1 )
-                     CALL ZGEMM( 'N', 'N', JLEN, NU, NU, ONE,
-     $                           Z( JROW, INCOL+K1 ), LDZ, U( K1, K1 ),
-     $                           LDU, ZERO, WV, LDWV )
-                     CALL ZLACPY( 'ALL', JLEN, NU, WV, LDWV,
-     $                            Z( JROW, INCOL+K1 ), LDZ )
-  170             CONTINUE
-               END IF
-            ELSE
-*
-*              ==== Updates exploiting U's 2-by-2 block structure.
-*              .    (I2, I4, J2, J4 are the last rows and columns
-*              .    of the blocks.) ====
-*
-               I2 = ( KDU+1 ) / 2
-               I4 = KDU
-               J2 = I4 - I2
-               J4 = KDU
-*
-*              ==== KZS and KNZ deal with the band of zeros
-*              .    along the diagonal of one of the triangular
-*              .    blocks. ====
-*
-               KZS = ( J4-J2 ) - ( NS+1 )
-               KNZ = NS + 1
-*
-*              ==== Horizontal multiply ====
-*
-               DO 180 JCOL = MIN( NDCOL, KBOT ) + 1, JBOT, NH
-                  JLEN = MIN( NH, JBOT-JCOL+1 )
-*
-*                 ==== Copy bottom of H to top+KZS of scratch ====
-*                  (The first KZS rows get multiplied by zero.) ====
-*
-                  CALL ZLACPY( 'ALL', KNZ, JLEN, H( INCOL+1+J2, JCOL ),
-     $                         LDH, WH( KZS+1, 1 ), LDWH )
-*
-*                 ==== Multiply by U21' ====
-*
-                  CALL ZLASET( 'ALL', KZS, JLEN, ZERO, ZERO, WH, LDWH )
-                  CALL ZTRMM( 'L', 'U', 'C', 'N', KNZ, JLEN, ONE,
-     $                        U( J2+1, 1+KZS ), LDU, WH( KZS+1, 1 ),
-     $                        LDWH )
-*
-*                 ==== Multiply top of H by U11' ====
-*
-                  CALL ZGEMM( 'C', 'N', I2, JLEN, J2, ONE, U, LDU,
-     $                        H( INCOL+1, JCOL ), LDH, ONE, WH, LDWH )
-*
-*                 ==== Copy top of H bottom of WH ====
-*
-                  CALL ZLACPY( 'ALL', J2, JLEN, H( INCOL+1, JCOL ), LDH,
-     $                         WH( I2+1, 1 ), LDWH )
-*
-*                 ==== Multiply by U21' ====
-*
-                  CALL ZTRMM( 'L', 'L', 'C', 'N', J2, JLEN, ONE,
-     $                        U( 1, I2+1 ), LDU, WH( I2+1, 1 ), LDWH )
-*
-*                 ==== Multiply by U22 ====
-*
-                  CALL ZGEMM( 'C', 'N', I4-I2, JLEN, J4-J2, ONE,
-     $                        U( J2+1, I2+1 ), LDU,
-     $                        H( INCOL+1+J2, JCOL ), LDH, ONE,
-     $                        WH( I2+1, 1 ), LDWH )
-*
-*                 ==== Copy it back ====
-*
-                  CALL ZLACPY( 'ALL', KDU, JLEN, WH, LDWH,
-     $                         H( INCOL+1, JCOL ), LDH )
-  180          CONTINUE
-*
-*              ==== Vertical multiply ====
-*
-               DO 190 JROW = JTOP, MAX( INCOL, KTOP ) - 1, NV
-                  JLEN = MIN( NV, MAX( INCOL, KTOP )-JROW )
-*
-*                 ==== Copy right of H to scratch (the first KZS
-*                 .    columns get multiplied by zero) ====
-*
-                  CALL ZLACPY( 'ALL', JLEN, KNZ, H( JROW, INCOL+1+J2 ),
-     $                         LDH, WV( 1, 1+KZS ), LDWV )
-*
-*                 ==== Multiply by U21 ====
-*
-                  CALL ZLASET( 'ALL', JLEN, KZS, ZERO, ZERO, WV, LDWV )
-                  CALL ZTRMM( 'R', 'U', 'N', 'N', JLEN, KNZ, ONE,
-     $                        U( J2+1, 1+KZS ), LDU, WV( 1, 1+KZS ),
-     $                        LDWV )
-*
-*                 ==== Multiply by U11 ====
-*
-                  CALL ZGEMM( 'N', 'N', JLEN, I2, J2, ONE,
-     $                        H( JROW, INCOL+1 ), LDH, U, LDU, ONE, WV,
-     $                        LDWV )
-*
-*                 ==== Copy left of H to right of scratch ====
-*
-                  CALL ZLACPY( 'ALL', JLEN, J2, H( JROW, INCOL+1 ), LDH,
-     $                         WV( 1, 1+I2 ), LDWV )
-*
-*                 ==== Multiply by U21 ====
-*
-                  CALL ZTRMM( 'R', 'L', 'N', 'N', JLEN, I4-I2, ONE,
-     $                        U( 1, I2+1 ), LDU, WV( 1, 1+I2 ), LDWV )
-*
-*                 ==== Multiply by U22 ====
-*
-                  CALL ZGEMM( 'N', 'N', JLEN, I4-I2, J4-J2, ONE,
-     $                        H( JROW, INCOL+1+J2 ), LDH,
-     $                        U( J2+1, I2+1 ), LDU, ONE, WV( 1, 1+I2 ),
-     $                        LDWV )
-*
-*                 ==== Copy it back ====
-*
-                  CALL ZLACPY( 'ALL', JLEN, KDU, WV, LDWV,
-     $                         H( JROW, INCOL+1 ), LDH )
-  190          CONTINUE
-*
-*              ==== Multiply Z (also vertical) ====
-*
-               IF( WANTZ ) THEN
-                  DO 200 JROW = ILOZ, IHIZ, NV
-                     JLEN = MIN( NV, IHIZ-JROW+1 )
-*
-*                    ==== Copy right of Z to left of scratch (first
-*                    .     KZS columns get multiplied by zero) ====
-*
-                     CALL ZLACPY( 'ALL', JLEN, KNZ,
-     $                            Z( JROW, INCOL+1+J2 ), LDZ,
-     $                            WV( 1, 1+KZS ), LDWV )
-*
-*                    ==== Multiply by U12 ====
-*
-                     CALL ZLASET( 'ALL', JLEN, KZS, ZERO, ZERO, WV,
-     $                            LDWV )
-                     CALL ZTRMM( 'R', 'U', 'N', 'N', JLEN, KNZ, ONE,
-     $                           U( J2+1, 1+KZS ), LDU, WV( 1, 1+KZS ),
-     $                           LDWV )
-*
-*                    ==== Multiply by U11 ====
-*
-                     CALL ZGEMM( 'N', 'N', JLEN, I2, J2, ONE,
-     $                           Z( JROW, INCOL+1 ), LDZ, U, LDU, ONE,
-     $                           WV, LDWV )
-*
-*                    ==== Copy left of Z to right of scratch ====
-*
-                     CALL ZLACPY( 'ALL', JLEN, J2, Z( JROW, INCOL+1 ),
-     $                            LDZ, WV( 1, 1+I2 ), LDWV )
-*
-*                    ==== Multiply by U21 ====
-*
-                     CALL ZTRMM( 'R', 'L', 'N', 'N', JLEN, I4-I2, ONE,
-     $                           U( 1, I2+1 ), LDU, WV( 1, 1+I2 ),
-     $                           LDWV )
-*
-*                    ==== Multiply by U22 ====
-*
-                     CALL ZGEMM( 'N', 'N', JLEN, I4-I2, J4-J2, ONE,
-     $                           Z( JROW, INCOL+1+J2 ), LDZ,
-     $                           U( J2+1, I2+1 ), LDU, ONE,
-     $                           WV( 1, 1+I2 ), LDWV )
-*
-*                    ==== Copy the result back to Z ====
-*
-                     CALL ZLACPY( 'ALL', JLEN, KDU, WV, LDWV,
-     $                            Z( JROW, INCOL+1 ), LDZ )
-  200             CONTINUE
-               END IF
-            END IF
-         END IF
-  210 CONTINUE
-*
-*     ==== End of ZLAQR5 ====
-*
-      END
--- a/libcruft/lapack/zlarf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,120 +0,0 @@
-      SUBROUTINE ZLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE
-      INTEGER            INCV, LDC, M, N
-      COMPLEX*16         TAU
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         C( LDC, * ), V( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLARF applies a complex elementary reflector H to a complex M-by-N
-*  matrix C, from either the left or the right. H is represented in the
-*  form
-*
-*        H = I - tau * v * v'
-*
-*  where tau is a complex scalar and v is a complex vector.
-*
-*  If tau = 0, then H is taken to be the unit matrix.
-*
-*  To apply H' (the conjugate transpose of H), supply conjg(tau) instead
-*  tau.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': form  H * C
-*          = 'R': form  C * H
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  V       (input) COMPLEX*16 array, dimension
-*                     (1 + (M-1)*abs(INCV)) if SIDE = 'L'
-*                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R'
-*          The vector v in the representation of H. V is not used if
-*          TAU = 0.
-*
-*  INCV    (input) INTEGER
-*          The increment between elements of v. INCV <> 0.
-*
-*  TAU     (input) COMPLEX*16
-*          The value tau in the representation of H.
-*
-*  C       (input/output) COMPLEX*16 array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by the matrix H * C if SIDE = 'L',
-*          or C * H if SIDE = 'R'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension
-*                         (N) if SIDE = 'L'
-*                      or (M) if SIDE = 'R'
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),
-     $                   ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZGEMV, ZGERC
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  H * C
-*
-         IF( TAU.NE.ZERO ) THEN
-*
-*           w := C' * v
-*
-            CALL ZGEMV( 'Conjugate transpose', M, N, ONE, C, LDC, V,
-     $                  INCV, ZERO, WORK, 1 )
-*
-*           C := C - v * w'
-*
-            CALL ZGERC( M, N, -TAU, V, INCV, WORK, 1, C, LDC )
-         END IF
-      ELSE
-*
-*        Form  C * H
-*
-         IF( TAU.NE.ZERO ) THEN
-*
-*           w := C * v
-*
-            CALL ZGEMV( 'No transpose', M, N, ONE, C, LDC, V, INCV,
-     $                  ZERO, WORK, 1 )
-*
-*           C := C - w * v'
-*
-            CALL ZGERC( M, N, -TAU, WORK, 1, V, INCV, C, LDC )
-         END IF
-      END IF
-      RETURN
-*
-*     End of ZLARF
-*
-      END
--- a/libcruft/lapack/zlarfb.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,608 +0,0 @@
-      SUBROUTINE ZLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,
-     $                   T, LDT, C, LDC, WORK, LDWORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, SIDE, STOREV, TRANS
-      INTEGER            K, LDC, LDT, LDV, LDWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         C( LDC, * ), T( LDT, * ), V( LDV, * ),
-     $                   WORK( LDWORK, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLARFB applies a complex block reflector H or its transpose H' to a
-*  complex M-by-N matrix C, from either the left or the right.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply H or H' from the Left
-*          = 'R': apply H or H' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply H (No transpose)
-*          = 'C': apply H' (Conjugate transpose)
-*
-*  DIRECT  (input) CHARACTER*1
-*          Indicates how H is formed from a product of elementary
-*          reflectors
-*          = 'F': H = H(1) H(2) . . . H(k) (Forward)
-*          = 'B': H = H(k) . . . H(2) H(1) (Backward)
-*
-*  STOREV  (input) CHARACTER*1
-*          Indicates how the vectors which define the elementary
-*          reflectors are stored:
-*          = 'C': Columnwise
-*          = 'R': Rowwise
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  K       (input) INTEGER
-*          The order of the matrix T (= the number of elementary
-*          reflectors whose product defines the block reflector).
-*
-*  V       (input) COMPLEX*16 array, dimension
-*                                (LDV,K) if STOREV = 'C'
-*                                (LDV,M) if STOREV = 'R' and SIDE = 'L'
-*                                (LDV,N) if STOREV = 'R' and SIDE = 'R'
-*          The matrix V. See further details.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V.
-*          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M);
-*          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N);
-*          if STOREV = 'R', LDV >= K.
-*
-*  T       (input) COMPLEX*16 array, dimension (LDT,K)
-*          The triangular K-by-K matrix T in the representation of the
-*          block reflector.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= K.
-*
-*  C       (input/output) COMPLEX*16 array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by H*C or H'*C or C*H or C*H'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (LDWORK,K)
-*
-*  LDWORK  (input) INTEGER
-*          The leading dimension of the array WORK.
-*          If SIDE = 'L', LDWORK >= max(1,N);
-*          if SIDE = 'R', LDWORK >= max(1,M).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      CHARACTER          TRANST
-      INTEGER            I, J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZCOPY, ZGEMM, ZLACGV, ZTRMM
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 .OR. N.LE.0 )
-     $   RETURN
-*
-      IF( LSAME( TRANS, 'N' ) ) THEN
-         TRANST = 'C'
-      ELSE
-         TRANST = 'N'
-      END IF
-*
-      IF( LSAME( STOREV, 'C' ) ) THEN
-*
-         IF( LSAME( DIRECT, 'F' ) ) THEN
-*
-*           Let  V =  ( V1 )    (first K rows)
-*                     ( V2 )
-*           where  V1  is unit lower triangular.
-*
-            IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*              Form  H * C  or  H' * C  where  C = ( C1 )
-*                                                  ( C2 )
-*
-*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK)
-*
-*              W := C1'
-*
-               DO 10 J = 1, K
-                  CALL ZCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 )
-                  CALL ZLACGV( N, WORK( 1, J ), 1 )
-   10          CONTINUE
-*
-*              W := W * V1
-*
-               CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', N,
-     $                     K, ONE, V, LDV, WORK, LDWORK )
-               IF( M.GT.K ) THEN
-*
-*                 W := W + C2'*V2
-*
-                  CALL ZGEMM( 'Conjugate transpose', 'No transpose', N,
-     $                        K, M-K, ONE, C( K+1, 1 ), LDC,
-     $                        V( K+1, 1 ), LDV, ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T'  or  W * T
-*
-               CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit', N, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - V * W'
-*
-               IF( M.GT.K ) THEN
-*
-*                 C2 := C2 - V2 * W'
-*
-                  CALL ZGEMM( 'No transpose', 'Conjugate transpose',
-     $                        M-K, N, K, -ONE, V( K+1, 1 ), LDV, WORK,
-     $                        LDWORK, ONE, C( K+1, 1 ), LDC )
-               END IF
-*
-*              W := W * V1'
-*
-               CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose',
-     $                     'Unit', N, K, ONE, V, LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W'
-*
-               DO 30 J = 1, K
-                  DO 20 I = 1, N
-                     C( J, I ) = C( J, I ) - DCONJG( WORK( I, J ) )
-   20             CONTINUE
-   30          CONTINUE
-*
-            ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*              Form  C * H  or  C * H'  where  C = ( C1  C2 )
-*
-*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)
-*
-*              W := C1
-*
-               DO 40 J = 1, K
-                  CALL ZCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 )
-   40          CONTINUE
-*
-*              W := W * V1
-*
-               CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', M,
-     $                     K, ONE, V, LDV, WORK, LDWORK )
-               IF( N.GT.K ) THEN
-*
-*                 W := W + C2 * V2
-*
-                  CALL ZGEMM( 'No transpose', 'No transpose', M, K, N-K,
-     $                        ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV,
-     $                        ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T  or  W * T'
-*
-               CALL ZTRMM( 'Right', 'Upper', TRANS, 'Non-unit', M, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - W * V'
-*
-               IF( N.GT.K ) THEN
-*
-*                 C2 := C2 - W * V2'
-*
-                  CALL ZGEMM( 'No transpose', 'Conjugate transpose', M,
-     $                        N-K, K, -ONE, WORK, LDWORK, V( K+1, 1 ),
-     $                        LDV, ONE, C( 1, K+1 ), LDC )
-               END IF
-*
-*              W := W * V1'
-*
-               CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose',
-     $                     'Unit', M, K, ONE, V, LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W
-*
-               DO 60 J = 1, K
-                  DO 50 I = 1, M
-                     C( I, J ) = C( I, J ) - WORK( I, J )
-   50             CONTINUE
-   60          CONTINUE
-            END IF
-*
-         ELSE
-*
-*           Let  V =  ( V1 )
-*                     ( V2 )    (last K rows)
-*           where  V2  is unit upper triangular.
-*
-            IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*              Form  H * C  or  H' * C  where  C = ( C1 )
-*                                                  ( C2 )
-*
-*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK)
-*
-*              W := C2'
-*
-               DO 70 J = 1, K
-                  CALL ZCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ), 1 )
-                  CALL ZLACGV( N, WORK( 1, J ), 1 )
-   70          CONTINUE
-*
-*              W := W * V2
-*
-               CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', N,
-     $                     K, ONE, V( M-K+1, 1 ), LDV, WORK, LDWORK )
-               IF( M.GT.K ) THEN
-*
-*                 W := W + C1'*V1
-*
-                  CALL ZGEMM( 'Conjugate transpose', 'No transpose', N,
-     $                        K, M-K, ONE, C, LDC, V, LDV, ONE, WORK,
-     $                        LDWORK )
-               END IF
-*
-*              W := W * T'  or  W * T
-*
-               CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - V * W'
-*
-               IF( M.GT.K ) THEN
-*
-*                 C1 := C1 - V1 * W'
-*
-                  CALL ZGEMM( 'No transpose', 'Conjugate transpose',
-     $                        M-K, N, K, -ONE, V, LDV, WORK, LDWORK,
-     $                        ONE, C, LDC )
-               END IF
-*
-*              W := W * V2'
-*
-               CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose',
-     $                     'Unit', N, K, ONE, V( M-K+1, 1 ), LDV, WORK,
-     $                     LDWORK )
-*
-*              C2 := C2 - W'
-*
-               DO 90 J = 1, K
-                  DO 80 I = 1, N
-                     C( M-K+J, I ) = C( M-K+J, I ) -
-     $                               DCONJG( WORK( I, J ) )
-   80             CONTINUE
-   90          CONTINUE
-*
-            ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*              Form  C * H  or  C * H'  where  C = ( C1  C2 )
-*
-*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)
-*
-*              W := C2
-*
-               DO 100 J = 1, K
-                  CALL ZCOPY( M, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )
-  100          CONTINUE
-*
-*              W := W * V2
-*
-               CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', M,
-     $                     K, ONE, V( N-K+1, 1 ), LDV, WORK, LDWORK )
-               IF( N.GT.K ) THEN
-*
-*                 W := W + C1 * V1
-*
-                  CALL ZGEMM( 'No transpose', 'No transpose', M, K, N-K,
-     $                        ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T  or  W * T'
-*
-               CALL ZTRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - W * V'
-*
-               IF( N.GT.K ) THEN
-*
-*                 C1 := C1 - W * V1'
-*
-                  CALL ZGEMM( 'No transpose', 'Conjugate transpose', M,
-     $                        N-K, K, -ONE, WORK, LDWORK, V, LDV, ONE,
-     $                        C, LDC )
-               END IF
-*
-*              W := W * V2'
-*
-               CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose',
-     $                     'Unit', M, K, ONE, V( N-K+1, 1 ), LDV, WORK,
-     $                     LDWORK )
-*
-*              C2 := C2 - W
-*
-               DO 120 J = 1, K
-                  DO 110 I = 1, M
-                     C( I, N-K+J ) = C( I, N-K+J ) - WORK( I, J )
-  110             CONTINUE
-  120          CONTINUE
-            END IF
-         END IF
-*
-      ELSE IF( LSAME( STOREV, 'R' ) ) THEN
-*
-         IF( LSAME( DIRECT, 'F' ) ) THEN
-*
-*           Let  V =  ( V1  V2 )    (V1: first K columns)
-*           where  V1  is unit upper triangular.
-*
-            IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*              Form  H * C  or  H' * C  where  C = ( C1 )
-*                                                  ( C2 )
-*
-*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK)
-*
-*              W := C1'
-*
-               DO 130 J = 1, K
-                  CALL ZCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 )
-                  CALL ZLACGV( N, WORK( 1, J ), 1 )
-  130          CONTINUE
-*
-*              W := W * V1'
-*
-               CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose',
-     $                     'Unit', N, K, ONE, V, LDV, WORK, LDWORK )
-               IF( M.GT.K ) THEN
-*
-*                 W := W + C2'*V2'
-*
-                  CALL ZGEMM( 'Conjugate transpose',
-     $                        'Conjugate transpose', N, K, M-K, ONE,
-     $                        C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, ONE,
-     $                        WORK, LDWORK )
-               END IF
-*
-*              W := W * T'  or  W * T
-*
-               CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit', N, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - V' * W'
-*
-               IF( M.GT.K ) THEN
-*
-*                 C2 := C2 - V2' * W'
-*
-                  CALL ZGEMM( 'Conjugate transpose',
-     $                        'Conjugate transpose', M-K, N, K, -ONE,
-     $                        V( 1, K+1 ), LDV, WORK, LDWORK, ONE,
-     $                        C( K+1, 1 ), LDC )
-               END IF
-*
-*              W := W * V1
-*
-               CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', N,
-     $                     K, ONE, V, LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W'
-*
-               DO 150 J = 1, K
-                  DO 140 I = 1, N
-                     C( J, I ) = C( J, I ) - DCONJG( WORK( I, J ) )
-  140             CONTINUE
-  150          CONTINUE
-*
-            ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*              Form  C * H  or  C * H'  where  C = ( C1  C2 )
-*
-*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK)
-*
-*              W := C1
-*
-               DO 160 J = 1, K
-                  CALL ZCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 )
-  160          CONTINUE
-*
-*              W := W * V1'
-*
-               CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose',
-     $                     'Unit', M, K, ONE, V, LDV, WORK, LDWORK )
-               IF( N.GT.K ) THEN
-*
-*                 W := W + C2 * V2'
-*
-                  CALL ZGEMM( 'No transpose', 'Conjugate transpose', M,
-     $                        K, N-K, ONE, C( 1, K+1 ), LDC,
-     $                        V( 1, K+1 ), LDV, ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T  or  W * T'
-*
-               CALL ZTRMM( 'Right', 'Upper', TRANS, 'Non-unit', M, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - W * V
-*
-               IF( N.GT.K ) THEN
-*
-*                 C2 := C2 - W * V2
-*
-                  CALL ZGEMM( 'No transpose', 'No transpose', M, N-K, K,
-     $                        -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, ONE,
-     $                        C( 1, K+1 ), LDC )
-               END IF
-*
-*              W := W * V1
-*
-               CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', M,
-     $                     K, ONE, V, LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W
-*
-               DO 180 J = 1, K
-                  DO 170 I = 1, M
-                     C( I, J ) = C( I, J ) - WORK( I, J )
-  170             CONTINUE
-  180          CONTINUE
-*
-            END IF
-*
-         ELSE
-*
-*           Let  V =  ( V1  V2 )    (V2: last K columns)
-*           where  V2  is unit lower triangular.
-*
-            IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*              Form  H * C  or  H' * C  where  C = ( C1 )
-*                                                  ( C2 )
-*
-*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK)
-*
-*              W := C2'
-*
-               DO 190 J = 1, K
-                  CALL ZCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ), 1 )
-                  CALL ZLACGV( N, WORK( 1, J ), 1 )
-  190          CONTINUE
-*
-*              W := W * V2'
-*
-               CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose',
-     $                     'Unit', N, K, ONE, V( 1, M-K+1 ), LDV, WORK,
-     $                     LDWORK )
-               IF( M.GT.K ) THEN
-*
-*                 W := W + C1'*V1'
-*
-                  CALL ZGEMM( 'Conjugate transpose',
-     $                        'Conjugate transpose', N, K, M-K, ONE, C,
-     $                        LDC, V, LDV, ONE, WORK, LDWORK )
-               END IF
-*
-*              W := W * T'  or  W * T
-*
-               CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - V' * W'
-*
-               IF( M.GT.K ) THEN
-*
-*                 C1 := C1 - V1' * W'
-*
-                  CALL ZGEMM( 'Conjugate transpose',
-     $                        'Conjugate transpose', M-K, N, K, -ONE, V,
-     $                        LDV, WORK, LDWORK, ONE, C, LDC )
-               END IF
-*
-*              W := W * V2
-*
-               CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', N,
-     $                     K, ONE, V( 1, M-K+1 ), LDV, WORK, LDWORK )
-*
-*              C2 := C2 - W'
-*
-               DO 210 J = 1, K
-                  DO 200 I = 1, N
-                     C( M-K+J, I ) = C( M-K+J, I ) -
-     $                               DCONJG( WORK( I, J ) )
-  200             CONTINUE
-  210          CONTINUE
-*
-            ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*              Form  C * H  or  C * H'  where  C = ( C1  C2 )
-*
-*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK)
-*
-*              W := C2
-*
-               DO 220 J = 1, K
-                  CALL ZCOPY( M, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )
-  220          CONTINUE
-*
-*              W := W * V2'
-*
-               CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose',
-     $                     'Unit', M, K, ONE, V( 1, N-K+1 ), LDV, WORK,
-     $                     LDWORK )
-               IF( N.GT.K ) THEN
-*
-*                 W := W + C1 * V1'
-*
-                  CALL ZGEMM( 'No transpose', 'Conjugate transpose', M,
-     $                        K, N-K, ONE, C, LDC, V, LDV, ONE, WORK,
-     $                        LDWORK )
-               END IF
-*
-*              W := W * T  or  W * T'
-*
-               CALL ZTRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K,
-     $                     ONE, T, LDT, WORK, LDWORK )
-*
-*              C := C - W * V
-*
-               IF( N.GT.K ) THEN
-*
-*                 C1 := C1 - W * V1
-*
-                  CALL ZGEMM( 'No transpose', 'No transpose', M, N-K, K,
-     $                        -ONE, WORK, LDWORK, V, LDV, ONE, C, LDC )
-               END IF
-*
-*              W := W * V2
-*
-               CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', M,
-     $                     K, ONE, V( 1, N-K+1 ), LDV, WORK, LDWORK )
-*
-*              C1 := C1 - W
-*
-               DO 240 J = 1, K
-                  DO 230 I = 1, M
-                     C( I, N-K+J ) = C( I, N-K+J ) - WORK( I, J )
-  230             CONTINUE
-  240          CONTINUE
-*
-            END IF
-*
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZLARFB
-*
-      END
--- a/libcruft/lapack/zlarfg.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-      SUBROUTINE ZLARFG( N, ALPHA, X, INCX, TAU )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-      COMPLEX*16         ALPHA, TAU
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLARFG generates a complex elementary reflector H of order n, such
-*  that
-*
-*        H' * ( alpha ) = ( beta ),   H' * H = I.
-*             (   x   )   (   0  )
-*
-*  where alpha and beta are scalars, with beta real, and x is an
-*  (n-1)-element complex vector. H is represented in the form
-*
-*        H = I - tau * ( 1 ) * ( 1 v' ) ,
-*                      ( v )
-*
-*  where tau is a complex scalar and v is a complex (n-1)-element
-*  vector. Note that H is not hermitian.
-*
-*  If the elements of x are all zero and alpha is real, then tau = 0
-*  and H is taken to be the unit matrix.
-*
-*  Otherwise  1 <= real(tau) <= 2  and  abs(tau-1) <= 1 .
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the elementary reflector.
-*
-*  ALPHA   (input/output) COMPLEX*16
-*          On entry, the value alpha.
-*          On exit, it is overwritten with the value beta.
-*
-*  X       (input/output) COMPLEX*16 array, dimension
-*                         (1+(N-2)*abs(INCX))
-*          On entry, the vector x.
-*          On exit, it is overwritten with the vector v.
-*
-*  INCX    (input) INTEGER
-*          The increment between elements of X. INCX > 0.
-*
-*  TAU     (output) COMPLEX*16
-*          The value tau.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            J, KNT
-      DOUBLE PRECISION   ALPHI, ALPHR, BETA, RSAFMN, SAFMIN, XNORM
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH, DLAPY3, DZNRM2
-      COMPLEX*16         ZLADIV
-      EXTERNAL           DLAMCH, DLAPY3, DZNRM2, ZLADIV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCMPLX, DIMAG, SIGN
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZDSCAL, ZSCAL
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.LE.0 ) THEN
-         TAU = ZERO
-         RETURN
-      END IF
-*
-      XNORM = DZNRM2( N-1, X, INCX )
-      ALPHR = DBLE( ALPHA )
-      ALPHI = DIMAG( ALPHA )
-*
-      IF( XNORM.EQ.ZERO .AND. ALPHI.EQ.ZERO ) THEN
-*
-*        H  =  I
-*
-         TAU = ZERO
-      ELSE
-*
-*        general case
-*
-         BETA = -SIGN( DLAPY3( ALPHR, ALPHI, XNORM ), ALPHR )
-         SAFMIN = DLAMCH( 'S' ) / DLAMCH( 'E' )
-         RSAFMN = ONE / SAFMIN
-*
-         IF( ABS( BETA ).LT.SAFMIN ) THEN
-*
-*           XNORM, BETA may be inaccurate; scale X and recompute them
-*
-            KNT = 0
-   10       CONTINUE
-            KNT = KNT + 1
-            CALL ZDSCAL( N-1, RSAFMN, X, INCX )
-            BETA = BETA*RSAFMN
-            ALPHI = ALPHI*RSAFMN
-            ALPHR = ALPHR*RSAFMN
-            IF( ABS( BETA ).LT.SAFMIN )
-     $         GO TO 10
-*
-*           New BETA is at most 1, at least SAFMIN
-*
-            XNORM = DZNRM2( N-1, X, INCX )
-            ALPHA = DCMPLX( ALPHR, ALPHI )
-            BETA = -SIGN( DLAPY3( ALPHR, ALPHI, XNORM ), ALPHR )
-            TAU = DCMPLX( ( BETA-ALPHR ) / BETA, -ALPHI / BETA )
-            ALPHA = ZLADIV( DCMPLX( ONE ), ALPHA-BETA )
-            CALL ZSCAL( N-1, ALPHA, X, INCX )
-*
-*           If ALPHA is subnormal, it may lose relative accuracy
-*
-            ALPHA = BETA
-            DO 20 J = 1, KNT
-               ALPHA = ALPHA*SAFMIN
-   20       CONTINUE
-         ELSE
-            TAU = DCMPLX( ( BETA-ALPHR ) / BETA, -ALPHI / BETA )
-            ALPHA = ZLADIV( DCMPLX( ONE ), ALPHA-BETA )
-            CALL ZSCAL( N-1, ALPHA, X, INCX )
-            ALPHA = BETA
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZLARFG
-*
-      END
--- a/libcruft/lapack/zlarft.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,224 +0,0 @@
-      SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, STOREV
-      INTEGER            K, LDT, LDV, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         T( LDT, * ), TAU( * ), V( LDV, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLARFT forms the triangular factor T of a complex block reflector H
-*  of order n, which is defined as a product of k elementary reflectors.
-*
-*  If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular;
-*
-*  If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular.
-*
-*  If STOREV = 'C', the vector which defines the elementary reflector
-*  H(i) is stored in the i-th column of the array V, and
-*
-*     H  =  I - V * T * V'
-*
-*  If STOREV = 'R', the vector which defines the elementary reflector
-*  H(i) is stored in the i-th row of the array V, and
-*
-*     H  =  I - V' * T * V
-*
-*  Arguments
-*  =========
-*
-*  DIRECT  (input) CHARACTER*1
-*          Specifies the order in which the elementary reflectors are
-*          multiplied to form the block reflector:
-*          = 'F': H = H(1) H(2) . . . H(k) (Forward)
-*          = 'B': H = H(k) . . . H(2) H(1) (Backward)
-*
-*  STOREV  (input) CHARACTER*1
-*          Specifies how the vectors which define the elementary
-*          reflectors are stored (see also Further Details):
-*          = 'C': columnwise
-*          = 'R': rowwise
-*
-*  N       (input) INTEGER
-*          The order of the block reflector H. N >= 0.
-*
-*  K       (input) INTEGER
-*          The order of the triangular factor T (= the number of
-*          elementary reflectors). K >= 1.
-*
-*  V       (input/output) COMPLEX*16 array, dimension
-*                               (LDV,K) if STOREV = 'C'
-*                               (LDV,N) if STOREV = 'R'
-*          The matrix V. See further details.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V.
-*          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K.
-*
-*  TAU     (input) COMPLEX*16 array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i).
-*
-*  T       (output) COMPLEX*16 array, dimension (LDT,K)
-*          The k by k triangular factor T of the block reflector.
-*          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is
-*          lower triangular. The rest of the array is not used.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= K.
-*
-*  Further Details
-*  ===============
-*
-*  The shape of the matrix V and the storage of the vectors which define
-*  the H(i) is best illustrated by the following example with n = 5 and
-*  k = 3. The elements equal to 1 are not stored; the corresponding
-*  array elements are modified but restored on exit. The rest of the
-*  array is not used.
-*
-*  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':
-*
-*               V = (  1       )                 V = (  1 v1 v1 v1 v1 )
-*                   ( v1  1    )                     (     1 v2 v2 v2 )
-*                   ( v1 v2  1 )                     (        1 v3 v3 )
-*                   ( v1 v2 v3 )
-*                   ( v1 v2 v3 )
-*
-*  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R':
-*
-*               V = ( v1 v2 v3 )                 V = ( v1 v1  1       )
-*                   ( v1 v2 v3 )                     ( v2 v2 v2  1    )
-*                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 )
-*                   (     1 v3 )
-*                   (        1 )
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),
-     $                   ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J
-      COMPLEX*16         VII
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZGEMV, ZLACGV, ZTRMV
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( LSAME( DIRECT, 'F' ) ) THEN
-         DO 20 I = 1, K
-            IF( TAU( I ).EQ.ZERO ) THEN
-*
-*              H(i)  =  I
-*
-               DO 10 J = 1, I
-                  T( J, I ) = ZERO
-   10          CONTINUE
-            ELSE
-*
-*              general case
-*
-               VII = V( I, I )
-               V( I, I ) = ONE
-               IF( LSAME( STOREV, 'C' ) ) THEN
-*
-*                 T(1:i-1,i) := - tau(i) * V(i:n,1:i-1)' * V(i:n,i)
-*
-                  CALL ZGEMV( 'Conjugate transpose', N-I+1, I-1,
-     $                        -TAU( I ), V( I, 1 ), LDV, V( I, I ), 1,
-     $                        ZERO, T( 1, I ), 1 )
-               ELSE
-*
-*                 T(1:i-1,i) := - tau(i) * V(1:i-1,i:n) * V(i,i:n)'
-*
-                  IF( I.LT.N )
-     $               CALL ZLACGV( N-I, V( I, I+1 ), LDV )
-                  CALL ZGEMV( 'No transpose', I-1, N-I+1, -TAU( I ),
-     $                        V( 1, I ), LDV, V( I, I ), LDV, ZERO,
-     $                        T( 1, I ), 1 )
-                  IF( I.LT.N )
-     $               CALL ZLACGV( N-I, V( I, I+1 ), LDV )
-               END IF
-               V( I, I ) = VII
-*
-*              T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i)
-*
-               CALL ZTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T,
-     $                     LDT, T( 1, I ), 1 )
-               T( I, I ) = TAU( I )
-            END IF
-   20    CONTINUE
-      ELSE
-         DO 40 I = K, 1, -1
-            IF( TAU( I ).EQ.ZERO ) THEN
-*
-*              H(i)  =  I
-*
-               DO 30 J = I, K
-                  T( J, I ) = ZERO
-   30          CONTINUE
-            ELSE
-*
-*              general case
-*
-               IF( I.LT.K ) THEN
-                  IF( LSAME( STOREV, 'C' ) ) THEN
-                     VII = V( N-K+I, I )
-                     V( N-K+I, I ) = ONE
-*
-*                    T(i+1:k,i) :=
-*                            - tau(i) * V(1:n-k+i,i+1:k)' * V(1:n-k+i,i)
-*
-                     CALL ZGEMV( 'Conjugate transpose', N-K+I, K-I,
-     $                           -TAU( I ), V( 1, I+1 ), LDV, V( 1, I ),
-     $                           1, ZERO, T( I+1, I ), 1 )
-                     V( N-K+I, I ) = VII
-                  ELSE
-                     VII = V( I, N-K+I )
-                     V( I, N-K+I ) = ONE
-*
-*                    T(i+1:k,i) :=
-*                            - tau(i) * V(i+1:k,1:n-k+i) * V(i,1:n-k+i)'
-*
-                     CALL ZLACGV( N-K+I-1, V( I, 1 ), LDV )
-                     CALL ZGEMV( 'No transpose', K-I, N-K+I, -TAU( I ),
-     $                           V( I+1, 1 ), LDV, V( I, 1 ), LDV, ZERO,
-     $                           T( I+1, I ), 1 )
-                     CALL ZLACGV( N-K+I-1, V( I, 1 ), LDV )
-                     V( I, N-K+I ) = VII
-                  END IF
-*
-*                 T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i)
-*
-                  CALL ZTRMV( 'Lower', 'No transpose', 'Non-unit', K-I,
-     $                        T( I+1, I+1 ), LDT, T( I+1, I ), 1 )
-               END IF
-               T( I, I ) = TAU( I )
-            END IF
-   40    CONTINUE
-      END IF
-      RETURN
-*
-*     End of ZLARFT
-*
-      END
--- a/libcruft/lapack/zlarfx.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,641 +0,0 @@
-      SUBROUTINE ZLARFX( SIDE, M, N, V, TAU, C, LDC, WORK )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE
-      INTEGER            LDC, M, N
-      COMPLEX*16         TAU
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         C( LDC, * ), V( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLARFX applies a complex elementary reflector H to a complex m by n
-*  matrix C, from either the left or the right. H is represented in the
-*  form
-*
-*        H = I - tau * v * v'
-*
-*  where tau is a complex scalar and v is a complex vector.
-*
-*  If tau = 0, then H is taken to be the unit matrix
-*
-*  This version uses inline code if H has order < 11.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': form  H * C
-*          = 'R': form  C * H
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  V       (input) COMPLEX*16 array, dimension (M) if SIDE = 'L'
-*                                        or (N) if SIDE = 'R'
-*          The vector v in the representation of H.
-*
-*  TAU     (input) COMPLEX*16
-*          The value tau in the representation of H.
-*
-*  C       (input/output) COMPLEX*16 array, dimension (LDC,N)
-*          On entry, the m by n matrix C.
-*          On exit, C is overwritten by the matrix H * C if SIDE = 'L',
-*          or C * H if SIDE = 'R'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDA >= max(1,M).
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (N) if SIDE = 'L'
-*                                            or (M) if SIDE = 'R'
-*          WORK is not referenced if H has order < 11.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ),
-     $                   ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            J
-      COMPLEX*16         SUM, T1, T10, T2, T3, T4, T5, T6, T7, T8, T9,
-     $                   V1, V10, V2, V3, V4, V5, V6, V7, V8, V9
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZGEMV, ZGERC
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG
-*     ..
-*     .. Executable Statements ..
-*
-      IF( TAU.EQ.ZERO )
-     $   RETURN
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  H * C, where H has order m.
-*
-         GO TO ( 10, 30, 50, 70, 90, 110, 130, 150,
-     $           170, 190 )M
-*
-*        Code for general M
-*
-*        w := C'*v
-*
-         CALL ZGEMV( 'Conjugate transpose', M, N, ONE, C, LDC, V, 1,
-     $               ZERO, WORK, 1 )
-*
-*        C := C - tau * v * w'
-*
-         CALL ZGERC( M, N, -TAU, V, 1, WORK, 1, C, LDC )
-         GO TO 410
-   10    CONTINUE
-*
-*        Special code for 1 x 1 Householder
-*
-         T1 = ONE - TAU*V( 1 )*DCONJG( V( 1 ) )
-         DO 20 J = 1, N
-            C( 1, J ) = T1*C( 1, J )
-   20    CONTINUE
-         GO TO 410
-   30    CONTINUE
-*
-*        Special code for 2 x 2 Householder
-*
-         V1 = DCONJG( V( 1 ) )
-         T1 = TAU*DCONJG( V1 )
-         V2 = DCONJG( V( 2 ) )
-         T2 = TAU*DCONJG( V2 )
-         DO 40 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-   40    CONTINUE
-         GO TO 410
-   50    CONTINUE
-*
-*        Special code for 3 x 3 Householder
-*
-         V1 = DCONJG( V( 1 ) )
-         T1 = TAU*DCONJG( V1 )
-         V2 = DCONJG( V( 2 ) )
-         T2 = TAU*DCONJG( V2 )
-         V3 = DCONJG( V( 3 ) )
-         T3 = TAU*DCONJG( V3 )
-         DO 60 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-   60    CONTINUE
-         GO TO 410
-   70    CONTINUE
-*
-*        Special code for 4 x 4 Householder
-*
-         V1 = DCONJG( V( 1 ) )
-         T1 = TAU*DCONJG( V1 )
-         V2 = DCONJG( V( 2 ) )
-         T2 = TAU*DCONJG( V2 )
-         V3 = DCONJG( V( 3 ) )
-         T3 = TAU*DCONJG( V3 )
-         V4 = DCONJG( V( 4 ) )
-         T4 = TAU*DCONJG( V4 )
-         DO 80 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-   80    CONTINUE
-         GO TO 410
-   90    CONTINUE
-*
-*        Special code for 5 x 5 Householder
-*
-         V1 = DCONJG( V( 1 ) )
-         T1 = TAU*DCONJG( V1 )
-         V2 = DCONJG( V( 2 ) )
-         T2 = TAU*DCONJG( V2 )
-         V3 = DCONJG( V( 3 ) )
-         T3 = TAU*DCONJG( V3 )
-         V4 = DCONJG( V( 4 ) )
-         T4 = TAU*DCONJG( V4 )
-         V5 = DCONJG( V( 5 ) )
-         T5 = TAU*DCONJG( V5 )
-         DO 100 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-  100    CONTINUE
-         GO TO 410
-  110    CONTINUE
-*
-*        Special code for 6 x 6 Householder
-*
-         V1 = DCONJG( V( 1 ) )
-         T1 = TAU*DCONJG( V1 )
-         V2 = DCONJG( V( 2 ) )
-         T2 = TAU*DCONJG( V2 )
-         V3 = DCONJG( V( 3 ) )
-         T3 = TAU*DCONJG( V3 )
-         V4 = DCONJG( V( 4 ) )
-         T4 = TAU*DCONJG( V4 )
-         V5 = DCONJG( V( 5 ) )
-         T5 = TAU*DCONJG( V5 )
-         V6 = DCONJG( V( 6 ) )
-         T6 = TAU*DCONJG( V6 )
-         DO 120 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-  120    CONTINUE
-         GO TO 410
-  130    CONTINUE
-*
-*        Special code for 7 x 7 Householder
-*
-         V1 = DCONJG( V( 1 ) )
-         T1 = TAU*DCONJG( V1 )
-         V2 = DCONJG( V( 2 ) )
-         T2 = TAU*DCONJG( V2 )
-         V3 = DCONJG( V( 3 ) )
-         T3 = TAU*DCONJG( V3 )
-         V4 = DCONJG( V( 4 ) )
-         T4 = TAU*DCONJG( V4 )
-         V5 = DCONJG( V( 5 ) )
-         T5 = TAU*DCONJG( V5 )
-         V6 = DCONJG( V( 6 ) )
-         T6 = TAU*DCONJG( V6 )
-         V7 = DCONJG( V( 7 ) )
-         T7 = TAU*DCONJG( V7 )
-         DO 140 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J ) +
-     $            V7*C( 7, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-            C( 7, J ) = C( 7, J ) - SUM*T7
-  140    CONTINUE
-         GO TO 410
-  150    CONTINUE
-*
-*        Special code for 8 x 8 Householder
-*
-         V1 = DCONJG( V( 1 ) )
-         T1 = TAU*DCONJG( V1 )
-         V2 = DCONJG( V( 2 ) )
-         T2 = TAU*DCONJG( V2 )
-         V3 = DCONJG( V( 3 ) )
-         T3 = TAU*DCONJG( V3 )
-         V4 = DCONJG( V( 4 ) )
-         T4 = TAU*DCONJG( V4 )
-         V5 = DCONJG( V( 5 ) )
-         T5 = TAU*DCONJG( V5 )
-         V6 = DCONJG( V( 6 ) )
-         T6 = TAU*DCONJG( V6 )
-         V7 = DCONJG( V( 7 ) )
-         T7 = TAU*DCONJG( V7 )
-         V8 = DCONJG( V( 8 ) )
-         T8 = TAU*DCONJG( V8 )
-         DO 160 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J ) +
-     $            V7*C( 7, J ) + V8*C( 8, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-            C( 7, J ) = C( 7, J ) - SUM*T7
-            C( 8, J ) = C( 8, J ) - SUM*T8
-  160    CONTINUE
-         GO TO 410
-  170    CONTINUE
-*
-*        Special code for 9 x 9 Householder
-*
-         V1 = DCONJG( V( 1 ) )
-         T1 = TAU*DCONJG( V1 )
-         V2 = DCONJG( V( 2 ) )
-         T2 = TAU*DCONJG( V2 )
-         V3 = DCONJG( V( 3 ) )
-         T3 = TAU*DCONJG( V3 )
-         V4 = DCONJG( V( 4 ) )
-         T4 = TAU*DCONJG( V4 )
-         V5 = DCONJG( V( 5 ) )
-         T5 = TAU*DCONJG( V5 )
-         V6 = DCONJG( V( 6 ) )
-         T6 = TAU*DCONJG( V6 )
-         V7 = DCONJG( V( 7 ) )
-         T7 = TAU*DCONJG( V7 )
-         V8 = DCONJG( V( 8 ) )
-         T8 = TAU*DCONJG( V8 )
-         V9 = DCONJG( V( 9 ) )
-         T9 = TAU*DCONJG( V9 )
-         DO 180 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J ) +
-     $            V7*C( 7, J ) + V8*C( 8, J ) + V9*C( 9, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-            C( 7, J ) = C( 7, J ) - SUM*T7
-            C( 8, J ) = C( 8, J ) - SUM*T8
-            C( 9, J ) = C( 9, J ) - SUM*T9
-  180    CONTINUE
-         GO TO 410
-  190    CONTINUE
-*
-*        Special code for 10 x 10 Householder
-*
-         V1 = DCONJG( V( 1 ) )
-         T1 = TAU*DCONJG( V1 )
-         V2 = DCONJG( V( 2 ) )
-         T2 = TAU*DCONJG( V2 )
-         V3 = DCONJG( V( 3 ) )
-         T3 = TAU*DCONJG( V3 )
-         V4 = DCONJG( V( 4 ) )
-         T4 = TAU*DCONJG( V4 )
-         V5 = DCONJG( V( 5 ) )
-         T5 = TAU*DCONJG( V5 )
-         V6 = DCONJG( V( 6 ) )
-         T6 = TAU*DCONJG( V6 )
-         V7 = DCONJG( V( 7 ) )
-         T7 = TAU*DCONJG( V7 )
-         V8 = DCONJG( V( 8 ) )
-         T8 = TAU*DCONJG( V8 )
-         V9 = DCONJG( V( 9 ) )
-         T9 = TAU*DCONJG( V9 )
-         V10 = DCONJG( V( 10 ) )
-         T10 = TAU*DCONJG( V10 )
-         DO 200 J = 1, N
-            SUM = V1*C( 1, J ) + V2*C( 2, J ) + V3*C( 3, J ) +
-     $            V4*C( 4, J ) + V5*C( 5, J ) + V6*C( 6, J ) +
-     $            V7*C( 7, J ) + V8*C( 8, J ) + V9*C( 9, J ) +
-     $            V10*C( 10, J )
-            C( 1, J ) = C( 1, J ) - SUM*T1
-            C( 2, J ) = C( 2, J ) - SUM*T2
-            C( 3, J ) = C( 3, J ) - SUM*T3
-            C( 4, J ) = C( 4, J ) - SUM*T4
-            C( 5, J ) = C( 5, J ) - SUM*T5
-            C( 6, J ) = C( 6, J ) - SUM*T6
-            C( 7, J ) = C( 7, J ) - SUM*T7
-            C( 8, J ) = C( 8, J ) - SUM*T8
-            C( 9, J ) = C( 9, J ) - SUM*T9
-            C( 10, J ) = C( 10, J ) - SUM*T10
-  200    CONTINUE
-         GO TO 410
-      ELSE
-*
-*        Form  C * H, where H has order n.
-*
-         GO TO ( 210, 230, 250, 270, 290, 310, 330, 350,
-     $           370, 390 )N
-*
-*        Code for general N
-*
-*        w := C * v
-*
-         CALL ZGEMV( 'No transpose', M, N, ONE, C, LDC, V, 1, ZERO,
-     $               WORK, 1 )
-*
-*        C := C - tau * w * v'
-*
-         CALL ZGERC( M, N, -TAU, WORK, 1, V, 1, C, LDC )
-         GO TO 410
-  210    CONTINUE
-*
-*        Special code for 1 x 1 Householder
-*
-         T1 = ONE - TAU*V( 1 )*DCONJG( V( 1 ) )
-         DO 220 J = 1, M
-            C( J, 1 ) = T1*C( J, 1 )
-  220    CONTINUE
-         GO TO 410
-  230    CONTINUE
-*
-*        Special code for 2 x 2 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*DCONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*DCONJG( V2 )
-         DO 240 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-  240    CONTINUE
-         GO TO 410
-  250    CONTINUE
-*
-*        Special code for 3 x 3 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*DCONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*DCONJG( V2 )
-         V3 = V( 3 )
-         T3 = TAU*DCONJG( V3 )
-         DO 260 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-  260    CONTINUE
-         GO TO 410
-  270    CONTINUE
-*
-*        Special code for 4 x 4 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*DCONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*DCONJG( V2 )
-         V3 = V( 3 )
-         T3 = TAU*DCONJG( V3 )
-         V4 = V( 4 )
-         T4 = TAU*DCONJG( V4 )
-         DO 280 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-  280    CONTINUE
-         GO TO 410
-  290    CONTINUE
-*
-*        Special code for 5 x 5 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*DCONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*DCONJG( V2 )
-         V3 = V( 3 )
-         T3 = TAU*DCONJG( V3 )
-         V4 = V( 4 )
-         T4 = TAU*DCONJG( V4 )
-         V5 = V( 5 )
-         T5 = TAU*DCONJG( V5 )
-         DO 300 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-  300    CONTINUE
-         GO TO 410
-  310    CONTINUE
-*
-*        Special code for 6 x 6 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*DCONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*DCONJG( V2 )
-         V3 = V( 3 )
-         T3 = TAU*DCONJG( V3 )
-         V4 = V( 4 )
-         T4 = TAU*DCONJG( V4 )
-         V5 = V( 5 )
-         T5 = TAU*DCONJG( V5 )
-         V6 = V( 6 )
-         T6 = TAU*DCONJG( V6 )
-         DO 320 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-  320    CONTINUE
-         GO TO 410
-  330    CONTINUE
-*
-*        Special code for 7 x 7 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*DCONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*DCONJG( V2 )
-         V3 = V( 3 )
-         T3 = TAU*DCONJG( V3 )
-         V4 = V( 4 )
-         T4 = TAU*DCONJG( V4 )
-         V5 = V( 5 )
-         T5 = TAU*DCONJG( V5 )
-         V6 = V( 6 )
-         T6 = TAU*DCONJG( V6 )
-         V7 = V( 7 )
-         T7 = TAU*DCONJG( V7 )
-         DO 340 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 ) +
-     $            V7*C( J, 7 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-            C( J, 7 ) = C( J, 7 ) - SUM*T7
-  340    CONTINUE
-         GO TO 410
-  350    CONTINUE
-*
-*        Special code for 8 x 8 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*DCONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*DCONJG( V2 )
-         V3 = V( 3 )
-         T3 = TAU*DCONJG( V3 )
-         V4 = V( 4 )
-         T4 = TAU*DCONJG( V4 )
-         V5 = V( 5 )
-         T5 = TAU*DCONJG( V5 )
-         V6 = V( 6 )
-         T6 = TAU*DCONJG( V6 )
-         V7 = V( 7 )
-         T7 = TAU*DCONJG( V7 )
-         V8 = V( 8 )
-         T8 = TAU*DCONJG( V8 )
-         DO 360 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 ) +
-     $            V7*C( J, 7 ) + V8*C( J, 8 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-            C( J, 7 ) = C( J, 7 ) - SUM*T7
-            C( J, 8 ) = C( J, 8 ) - SUM*T8
-  360    CONTINUE
-         GO TO 410
-  370    CONTINUE
-*
-*        Special code for 9 x 9 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*DCONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*DCONJG( V2 )
-         V3 = V( 3 )
-         T3 = TAU*DCONJG( V3 )
-         V4 = V( 4 )
-         T4 = TAU*DCONJG( V4 )
-         V5 = V( 5 )
-         T5 = TAU*DCONJG( V5 )
-         V6 = V( 6 )
-         T6 = TAU*DCONJG( V6 )
-         V7 = V( 7 )
-         T7 = TAU*DCONJG( V7 )
-         V8 = V( 8 )
-         T8 = TAU*DCONJG( V8 )
-         V9 = V( 9 )
-         T9 = TAU*DCONJG( V9 )
-         DO 380 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 ) +
-     $            V7*C( J, 7 ) + V8*C( J, 8 ) + V9*C( J, 9 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-            C( J, 7 ) = C( J, 7 ) - SUM*T7
-            C( J, 8 ) = C( J, 8 ) - SUM*T8
-            C( J, 9 ) = C( J, 9 ) - SUM*T9
-  380    CONTINUE
-         GO TO 410
-  390    CONTINUE
-*
-*        Special code for 10 x 10 Householder
-*
-         V1 = V( 1 )
-         T1 = TAU*DCONJG( V1 )
-         V2 = V( 2 )
-         T2 = TAU*DCONJG( V2 )
-         V3 = V( 3 )
-         T3 = TAU*DCONJG( V3 )
-         V4 = V( 4 )
-         T4 = TAU*DCONJG( V4 )
-         V5 = V( 5 )
-         T5 = TAU*DCONJG( V5 )
-         V6 = V( 6 )
-         T6 = TAU*DCONJG( V6 )
-         V7 = V( 7 )
-         T7 = TAU*DCONJG( V7 )
-         V8 = V( 8 )
-         T8 = TAU*DCONJG( V8 )
-         V9 = V( 9 )
-         T9 = TAU*DCONJG( V9 )
-         V10 = V( 10 )
-         T10 = TAU*DCONJG( V10 )
-         DO 400 J = 1, M
-            SUM = V1*C( J, 1 ) + V2*C( J, 2 ) + V3*C( J, 3 ) +
-     $            V4*C( J, 4 ) + V5*C( J, 5 ) + V6*C( J, 6 ) +
-     $            V7*C( J, 7 ) + V8*C( J, 8 ) + V9*C( J, 9 ) +
-     $            V10*C( J, 10 )
-            C( J, 1 ) = C( J, 1 ) - SUM*T1
-            C( J, 2 ) = C( J, 2 ) - SUM*T2
-            C( J, 3 ) = C( J, 3 ) - SUM*T3
-            C( J, 4 ) = C( J, 4 ) - SUM*T4
-            C( J, 5 ) = C( J, 5 ) - SUM*T5
-            C( J, 6 ) = C( J, 6 ) - SUM*T6
-            C( J, 7 ) = C( J, 7 ) - SUM*T7
-            C( J, 8 ) = C( J, 8 ) - SUM*T8
-            C( J, 9 ) = C( J, 9 ) - SUM*T9
-            C( J, 10 ) = C( J, 10 ) - SUM*T10
-  400    CONTINUE
-         GO TO 410
-      END IF
-  410 CONTINUE
-      RETURN
-*
-*     End of ZLARFX
-*
-      END
--- a/libcruft/lapack/zlartg.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,195 +0,0 @@
-      SUBROUTINE ZLARTG( F, G, CS, SN, R )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      DOUBLE PRECISION   CS
-      COMPLEX*16         F, G, R, SN
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLARTG generates a plane rotation so that
-*
-*     [  CS  SN  ]     [ F ]     [ R ]
-*     [  __      ]  .  [   ]  =  [   ]   where CS**2 + |SN|**2 = 1.
-*     [ -SN  CS  ]     [ G ]     [ 0 ]
-*
-*  This is a faster version of the BLAS1 routine ZROTG, except for
-*  the following differences:
-*     F and G are unchanged on return.
-*     If G=0, then CS=1 and SN=0.
-*     If F=0, then CS=0 and SN is chosen so that R is real.
-*
-*  Arguments
-*  =========
-*
-*  F       (input) COMPLEX*16
-*          The first component of vector to be rotated.
-*
-*  G       (input) COMPLEX*16
-*          The second component of vector to be rotated.
-*
-*  CS      (output) DOUBLE PRECISION
-*          The cosine of the rotation.
-*
-*  SN      (output) COMPLEX*16
-*          The sine of the rotation.
-*
-*  R       (output) COMPLEX*16
-*          The nonzero component of the rotated vector.
-*
-*  Further Details
-*  ======= =======
-*
-*  3-5-96 - Modified with a new algorithm by W. Kahan and J. Demmel
-*
-*  This version has a few statements commented out for thread safety
-*  (machine parameters are computed on each entry). 10 feb 03, SJH.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   TWO, ONE, ZERO
-      PARAMETER          ( TWO = 2.0D+0, ONE = 1.0D+0, ZERO = 0.0D+0 )
-      COMPLEX*16         CZERO
-      PARAMETER          ( CZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-*     LOGICAL            FIRST
-      INTEGER            COUNT, I
-      DOUBLE PRECISION   D, DI, DR, EPS, F2, F2S, G2, G2S, SAFMIN,
-     $                   SAFMN2, SAFMX2, SCALE
-      COMPLEX*16         FF, FS, GS
-*     ..
-*     .. External Functions ..
-      DOUBLE PRECISION   DLAMCH, DLAPY2
-      EXTERNAL           DLAMCH, DLAPY2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, DIMAG, INT, LOG,
-     $                   MAX, SQRT
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   ABS1, ABSSQ
-*     ..
-*     .. Save statement ..
-*     SAVE               FIRST, SAFMX2, SAFMIN, SAFMN2
-*     ..
-*     .. Data statements ..
-*     DATA               FIRST / .TRUE. /
-*     ..
-*     .. Statement Function definitions ..
-      ABS1( FF ) = MAX( ABS( DBLE( FF ) ), ABS( DIMAG( FF ) ) )
-      ABSSQ( FF ) = DBLE( FF )**2 + DIMAG( FF )**2
-*     ..
-*     .. Executable Statements ..
-*
-*     IF( FIRST ) THEN
-         SAFMIN = DLAMCH( 'S' )
-         EPS = DLAMCH( 'E' )
-         SAFMN2 = DLAMCH( 'B' )**INT( LOG( SAFMIN / EPS ) /
-     $            LOG( DLAMCH( 'B' ) ) / TWO )
-         SAFMX2 = ONE / SAFMN2
-*        FIRST = .FALSE.
-*     END IF
-      SCALE = MAX( ABS1( F ), ABS1( G ) )
-      FS = F
-      GS = G
-      COUNT = 0
-      IF( SCALE.GE.SAFMX2 ) THEN
-   10    CONTINUE
-         COUNT = COUNT + 1
-         FS = FS*SAFMN2
-         GS = GS*SAFMN2
-         SCALE = SCALE*SAFMN2
-         IF( SCALE.GE.SAFMX2 )
-     $      GO TO 10
-      ELSE IF( SCALE.LE.SAFMN2 ) THEN
-         IF( G.EQ.CZERO ) THEN
-            CS = ONE
-            SN = CZERO
-            R = F
-            RETURN
-         END IF
-   20    CONTINUE
-         COUNT = COUNT - 1
-         FS = FS*SAFMX2
-         GS = GS*SAFMX2
-         SCALE = SCALE*SAFMX2
-         IF( SCALE.LE.SAFMN2 )
-     $      GO TO 20
-      END IF
-      F2 = ABSSQ( FS )
-      G2 = ABSSQ( GS )
-      IF( F2.LE.MAX( G2, ONE )*SAFMIN ) THEN
-*
-*        This is a rare case: F is very small.
-*
-         IF( F.EQ.CZERO ) THEN
-            CS = ZERO
-            R = DLAPY2( DBLE( G ), DIMAG( G ) )
-*           Do complex/real division explicitly with two real divisions
-            D = DLAPY2( DBLE( GS ), DIMAG( GS ) )
-            SN = DCMPLX( DBLE( GS ) / D, -DIMAG( GS ) / D )
-            RETURN
-         END IF
-         F2S = DLAPY2( DBLE( FS ), DIMAG( FS ) )
-*        G2 and G2S are accurate
-*        G2 is at least SAFMIN, and G2S is at least SAFMN2
-         G2S = SQRT( G2 )
-*        Error in CS from underflow in F2S is at most
-*        UNFL / SAFMN2 .lt. sqrt(UNFL*EPS) .lt. EPS
-*        If MAX(G2,ONE)=G2, then F2 .lt. G2*SAFMIN,
-*        and so CS .lt. sqrt(SAFMIN)
-*        If MAX(G2,ONE)=ONE, then F2 .lt. SAFMIN
-*        and so CS .lt. sqrt(SAFMIN)/SAFMN2 = sqrt(EPS)
-*        Therefore, CS = F2S/G2S / sqrt( 1 + (F2S/G2S)**2 ) = F2S/G2S
-         CS = F2S / G2S
-*        Make sure abs(FF) = 1
-*        Do complex/real division explicitly with 2 real divisions
-         IF( ABS1( F ).GT.ONE ) THEN
-            D = DLAPY2( DBLE( F ), DIMAG( F ) )
-            FF = DCMPLX( DBLE( F ) / D, DIMAG( F ) / D )
-         ELSE
-            DR = SAFMX2*DBLE( F )
-            DI = SAFMX2*DIMAG( F )
-            D = DLAPY2( DR, DI )
-            FF = DCMPLX( DR / D, DI / D )
-         END IF
-         SN = FF*DCMPLX( DBLE( GS ) / G2S, -DIMAG( GS ) / G2S )
-         R = CS*F + SN*G
-      ELSE
-*
-*        This is the most common case.
-*        Neither F2 nor F2/G2 are less than SAFMIN
-*        F2S cannot overflow, and it is accurate
-*
-         F2S = SQRT( ONE+G2 / F2 )
-*        Do the F2S(real)*FS(complex) multiply with two real multiplies
-         R = DCMPLX( F2S*DBLE( FS ), F2S*DIMAG( FS ) )
-         CS = ONE / F2S
-         D = F2 + G2
-*        Do complex/real division explicitly with two real divisions
-         SN = DCMPLX( DBLE( R ) / D, DIMAG( R ) / D )
-         SN = SN*DCONJG( GS )
-         IF( COUNT.NE.0 ) THEN
-            IF( COUNT.GT.0 ) THEN
-               DO 30 I = 1, COUNT
-                  R = R*SAFMX2
-   30          CONTINUE
-            ELSE
-               DO 40 I = 1, -COUNT
-                  R = R*SAFMN2
-   40          CONTINUE
-            END IF
-         END IF
-      END IF
-      RETURN
-*
-*     End of ZLARTG
-*
-      END
--- a/libcruft/lapack/zlarz.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,157 +0,0 @@
-      SUBROUTINE ZLARZ( SIDE, M, N, L, V, INCV, TAU, C, LDC, WORK )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE
-      INTEGER            INCV, L, LDC, M, N
-      COMPLEX*16         TAU
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         C( LDC, * ), V( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLARZ applies a complex elementary reflector H to a complex
-*  M-by-N matrix C, from either the left or the right. H is represented
-*  in the form
-*
-*        H = I - tau * v * v'
-*
-*  where tau is a complex scalar and v is a complex vector.
-*
-*  If tau = 0, then H is taken to be the unit matrix.
-*
-*  To apply H' (the conjugate transpose of H), supply conjg(tau) instead
-*  tau.
-*
-*  H is a product of k elementary reflectors as returned by ZTZRZF.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': form  H * C
-*          = 'R': form  C * H
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  L       (input) INTEGER
-*          The number of entries of the vector V containing
-*          the meaningful part of the Householder vectors.
-*          If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
-*
-*  V       (input) COMPLEX*16 array, dimension (1+(L-1)*abs(INCV))
-*          The vector v in the representation of H as returned by
-*          ZTZRZF. V is not used if TAU = 0.
-*
-*  INCV    (input) INTEGER
-*          The increment between elements of v. INCV <> 0.
-*
-*  TAU     (input) COMPLEX*16
-*          The value tau in the representation of H.
-*
-*  C       (input/output) COMPLEX*16 array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by the matrix H * C if SIDE = 'L',
-*          or C * H if SIDE = 'R'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension
-*                         (N) if SIDE = 'L'
-*                      or (M) if SIDE = 'R'
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),
-     $                   ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZAXPY, ZCOPY, ZGEMV, ZGERC, ZGERU, ZLACGV
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  H * C
-*
-         IF( TAU.NE.ZERO ) THEN
-*
-*           w( 1:n ) = conjg( C( 1, 1:n ) )
-*
-            CALL ZCOPY( N, C, LDC, WORK, 1 )
-            CALL ZLACGV( N, WORK, 1 )
-*
-*           w( 1:n ) = conjg( w( 1:n ) + C( m-l+1:m, 1:n )' * v( 1:l ) )
-*
-            CALL ZGEMV( 'Conjugate transpose', L, N, ONE, C( M-L+1, 1 ),
-     $                  LDC, V, INCV, ONE, WORK, 1 )
-            CALL ZLACGV( N, WORK, 1 )
-*
-*           C( 1, 1:n ) = C( 1, 1:n ) - tau * w( 1:n )
-*
-            CALL ZAXPY( N, -TAU, WORK, 1, C, LDC )
-*
-*           C( m-l+1:m, 1:n ) = C( m-l+1:m, 1:n ) - ...
-*                               tau * v( 1:l ) * conjg( w( 1:n )' )
-*
-            CALL ZGERU( L, N, -TAU, V, INCV, WORK, 1, C( M-L+1, 1 ),
-     $                  LDC )
-         END IF
-*
-      ELSE
-*
-*        Form  C * H
-*
-         IF( TAU.NE.ZERO ) THEN
-*
-*           w( 1:m ) = C( 1:m, 1 )
-*
-            CALL ZCOPY( M, C, 1, WORK, 1 )
-*
-*           w( 1:m ) = w( 1:m ) + C( 1:m, n-l+1:n, 1:n ) * v( 1:l )
-*
-            CALL ZGEMV( 'No transpose', M, L, ONE, C( 1, N-L+1 ), LDC,
-     $                  V, INCV, ONE, WORK, 1 )
-*
-*           C( 1:m, 1 ) = C( 1:m, 1 ) - tau * w( 1:m )
-*
-            CALL ZAXPY( M, -TAU, WORK, 1, C, 1 )
-*
-*           C( 1:m, n-l+1:n ) = C( 1:m, n-l+1:n ) - ...
-*                               tau * w( 1:m ) * v( 1:l )'
-*
-            CALL ZGERC( M, L, -TAU, WORK, 1, V, INCV, C( 1, N-L+1 ),
-     $                  LDC )
-*
-         END IF
-*
-      END IF
-*
-      RETURN
-*
-*     End of ZLARZ
-*
-      END
--- a/libcruft/lapack/zlarzb.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,234 +0,0 @@
-      SUBROUTINE ZLARZB( SIDE, TRANS, DIRECT, STOREV, M, N, K, L, V,
-     $                   LDV, T, LDT, C, LDC, WORK, LDWORK )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, SIDE, STOREV, TRANS
-      INTEGER            K, L, LDC, LDT, LDV, LDWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         C( LDC, * ), T( LDT, * ), V( LDV, * ),
-     $                   WORK( LDWORK, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLARZB applies a complex block reflector H or its transpose H**H
-*  to a complex distributed M-by-N  C from the left or the right.
-*
-*  Currently, only STOREV = 'R' and DIRECT = 'B' are supported.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply H or H' from the Left
-*          = 'R': apply H or H' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply H (No transpose)
-*          = 'C': apply H' (Conjugate transpose)
-*
-*  DIRECT  (input) CHARACTER*1
-*          Indicates how H is formed from a product of elementary
-*          reflectors
-*          = 'F': H = H(1) H(2) . . . H(k) (Forward, not supported yet)
-*          = 'B': H = H(k) . . . H(2) H(1) (Backward)
-*
-*  STOREV  (input) CHARACTER*1
-*          Indicates how the vectors which define the elementary
-*          reflectors are stored:
-*          = 'C': Columnwise                        (not supported yet)
-*          = 'R': Rowwise
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C.
-*
-*  K       (input) INTEGER
-*          The order of the matrix T (= the number of elementary
-*          reflectors whose product defines the block reflector).
-*
-*  L       (input) INTEGER
-*          The number of columns of the matrix V containing the
-*          meaningful part of the Householder reflectors.
-*          If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
-*
-*  V       (input) COMPLEX*16 array, dimension (LDV,NV).
-*          If STOREV = 'C', NV = K; if STOREV = 'R', NV = L.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V.
-*          If STOREV = 'C', LDV >= L; if STOREV = 'R', LDV >= K.
-*
-*  T       (input) COMPLEX*16 array, dimension (LDT,K)
-*          The triangular K-by-K matrix T in the representation of the
-*          block reflector.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= K.
-*
-*  C       (input/output) COMPLEX*16 array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by H*C or H'*C or C*H or C*H'.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (LDWORK,K)
-*
-*  LDWORK  (input) INTEGER
-*          The leading dimension of the array WORK.
-*          If SIDE = 'L', LDWORK >= max(1,N);
-*          if SIDE = 'R', LDWORK >= max(1,M).
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      CHARACTER          TRANST
-      INTEGER            I, INFO, J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZCOPY, ZGEMM, ZLACGV, ZTRMM
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 .OR. N.LE.0 )
-     $   RETURN
-*
-*     Check for currently supported options
-*
-      INFO = 0
-      IF( .NOT.LSAME( DIRECT, 'B' ) ) THEN
-         INFO = -3
-      ELSE IF( .NOT.LSAME( STOREV, 'R' ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZLARZB', -INFO )
-         RETURN
-      END IF
-*
-      IF( LSAME( TRANS, 'N' ) ) THEN
-         TRANST = 'C'
-      ELSE
-         TRANST = 'N'
-      END IF
-*
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  H * C  or  H' * C
-*
-*        W( 1:n, 1:k ) = conjg( C( 1:k, 1:n )' )
-*
-         DO 10 J = 1, K
-            CALL ZCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 )
-   10    CONTINUE
-*
-*        W( 1:n, 1:k ) = W( 1:n, 1:k ) + ...
-*                        conjg( C( m-l+1:m, 1:n )' ) * V( 1:k, 1:l )'
-*
-         IF( L.GT.0 )
-     $      CALL ZGEMM( 'Transpose', 'Conjugate transpose', N, K, L,
-     $                  ONE, C( M-L+1, 1 ), LDC, V, LDV, ONE, WORK,
-     $                  LDWORK )
-*
-*        W( 1:n, 1:k ) = W( 1:n, 1:k ) * T'  or  W( 1:m, 1:k ) * T
-*
-         CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K, ONE, T,
-     $               LDT, WORK, LDWORK )
-*
-*        C( 1:k, 1:n ) = C( 1:k, 1:n ) - conjg( W( 1:n, 1:k )' )
-*
-         DO 30 J = 1, N
-            DO 20 I = 1, K
-               C( I, J ) = C( I, J ) - WORK( J, I )
-   20       CONTINUE
-   30    CONTINUE
-*
-*        C( m-l+1:m, 1:n ) = C( m-l+1:m, 1:n ) - ...
-*                    conjg( V( 1:k, 1:l )' ) * conjg( W( 1:n, 1:k )' )
-*
-         IF( L.GT.0 )
-     $      CALL ZGEMM( 'Transpose', 'Transpose', L, N, K, -ONE, V, LDV,
-     $                  WORK, LDWORK, ONE, C( M-L+1, 1 ), LDC )
-*
-      ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*        Form  C * H  or  C * H'
-*
-*        W( 1:m, 1:k ) = C( 1:m, 1:k )
-*
-         DO 40 J = 1, K
-            CALL ZCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 )
-   40    CONTINUE
-*
-*        W( 1:m, 1:k ) = W( 1:m, 1:k ) + ...
-*                        C( 1:m, n-l+1:n ) * conjg( V( 1:k, 1:l )' )
-*
-         IF( L.GT.0 )
-     $      CALL ZGEMM( 'No transpose', 'Transpose', M, K, L, ONE,
-     $                  C( 1, N-L+1 ), LDC, V, LDV, ONE, WORK, LDWORK )
-*
-*        W( 1:m, 1:k ) = W( 1:m, 1:k ) * conjg( T )  or
-*                        W( 1:m, 1:k ) * conjg( T' )
-*
-         DO 50 J = 1, K
-            CALL ZLACGV( K-J+1, T( J, J ), 1 )
-   50    CONTINUE
-         CALL ZTRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K, ONE, T,
-     $               LDT, WORK, LDWORK )
-         DO 60 J = 1, K
-            CALL ZLACGV( K-J+1, T( J, J ), 1 )
-   60    CONTINUE
-*
-*        C( 1:m, 1:k ) = C( 1:m, 1:k ) - W( 1:m, 1:k )
-*
-         DO 80 J = 1, K
-            DO 70 I = 1, M
-               C( I, J ) = C( I, J ) - WORK( I, J )
-   70       CONTINUE
-   80    CONTINUE
-*
-*        C( 1:m, n-l+1:n ) = C( 1:m, n-l+1:n ) - ...
-*                            W( 1:m, 1:k ) * conjg( V( 1:k, 1:l ) )
-*
-         DO 90 J = 1, L
-            CALL ZLACGV( K, V( 1, J ), 1 )
-   90    CONTINUE
-         IF( L.GT.0 )
-     $      CALL ZGEMM( 'No transpose', 'No transpose', M, L, K, -ONE,
-     $                  WORK, LDWORK, V, LDV, ONE, C( 1, N-L+1 ), LDC )
-         DO 100 J = 1, L
-            CALL ZLACGV( K, V( 1, J ), 1 )
-  100    CONTINUE
-*
-      END IF
-*
-      RETURN
-*
-*     End of ZLARZB
-*
-      END
--- a/libcruft/lapack/zlarzt.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,186 +0,0 @@
-      SUBROUTINE ZLARZT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, STOREV
-      INTEGER            K, LDT, LDV, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         T( LDT, * ), TAU( * ), V( LDV, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLARZT forms the triangular factor T of a complex block reflector
-*  H of order > n, which is defined as a product of k elementary
-*  reflectors.
-*
-*  If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular;
-*
-*  If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular.
-*
-*  If STOREV = 'C', the vector which defines the elementary reflector
-*  H(i) is stored in the i-th column of the array V, and
-*
-*     H  =  I - V * T * V'
-*
-*  If STOREV = 'R', the vector which defines the elementary reflector
-*  H(i) is stored in the i-th row of the array V, and
-*
-*     H  =  I - V' * T * V
-*
-*  Currently, only STOREV = 'R' and DIRECT = 'B' are supported.
-*
-*  Arguments
-*  =========
-*
-*  DIRECT  (input) CHARACTER*1
-*          Specifies the order in which the elementary reflectors are
-*          multiplied to form the block reflector:
-*          = 'F': H = H(1) H(2) . . . H(k) (Forward, not supported yet)
-*          = 'B': H = H(k) . . . H(2) H(1) (Backward)
-*
-*  STOREV  (input) CHARACTER*1
-*          Specifies how the vectors which define the elementary
-*          reflectors are stored (see also Further Details):
-*          = 'C': columnwise                        (not supported yet)
-*          = 'R': rowwise
-*
-*  N       (input) INTEGER
-*          The order of the block reflector H. N >= 0.
-*
-*  K       (input) INTEGER
-*          The order of the triangular factor T (= the number of
-*          elementary reflectors). K >= 1.
-*
-*  V       (input/output) COMPLEX*16 array, dimension
-*                               (LDV,K) if STOREV = 'C'
-*                               (LDV,N) if STOREV = 'R'
-*          The matrix V. See further details.
-*
-*  LDV     (input) INTEGER
-*          The leading dimension of the array V.
-*          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K.
-*
-*  TAU     (input) COMPLEX*16 array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i).
-*
-*  T       (output) COMPLEX*16 array, dimension (LDT,K)
-*          The k by k triangular factor T of the block reflector.
-*          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is
-*          lower triangular. The rest of the array is not used.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= K.
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  The shape of the matrix V and the storage of the vectors which define
-*  the H(i) is best illustrated by the following example with n = 5 and
-*  k = 3. The elements equal to 1 are not stored; the corresponding
-*  array elements are modified but restored on exit. The rest of the
-*  array is not used.
-*
-*  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':
-*
-*                                              ______V_____
-*         ( v1 v2 v3 )                        /            \
-*         ( v1 v2 v3 )                      ( v1 v1 v1 v1 v1 . . . . 1 )
-*     V = ( v1 v2 v3 )                      ( v2 v2 v2 v2 v2 . . . 1   )
-*         ( v1 v2 v3 )                      ( v3 v3 v3 v3 v3 . . 1     )
-*         ( v1 v2 v3 )
-*            .  .  .
-*            .  .  .
-*            1  .  .
-*               1  .
-*                  1
-*
-*  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R':
-*
-*                                                        ______V_____
-*            1                                          /            \
-*            .  1                           ( 1 . . . . v1 v1 v1 v1 v1 )
-*            .  .  1                        ( . 1 . . . v2 v2 v2 v2 v2 )
-*            .  .  .                        ( . . 1 . . v3 v3 v3 v3 v3 )
-*            .  .  .
-*         ( v1 v2 v3 )
-*         ( v1 v2 v3 )
-*     V = ( v1 v2 v3 )
-*         ( v1 v2 v3 )
-*         ( v1 v2 v3 )
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, INFO, J
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZGEMV, ZLACGV, ZTRMV
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Executable Statements ..
-*
-*     Check for currently supported options
-*
-      INFO = 0
-      IF( .NOT.LSAME( DIRECT, 'B' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.LSAME( STOREV, 'R' ) ) THEN
-         INFO = -2
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZLARZT', -INFO )
-         RETURN
-      END IF
-*
-      DO 20 I = K, 1, -1
-         IF( TAU( I ).EQ.ZERO ) THEN
-*
-*           H(i)  =  I
-*
-            DO 10 J = I, K
-               T( J, I ) = ZERO
-   10       CONTINUE
-         ELSE
-*
-*           general case
-*
-            IF( I.LT.K ) THEN
-*
-*              T(i+1:k,i) = - tau(i) * V(i+1:k,1:n) * V(i,1:n)'
-*
-               CALL ZLACGV( N, V( I, 1 ), LDV )
-               CALL ZGEMV( 'No transpose', K-I, N, -TAU( I ),
-     $                     V( I+1, 1 ), LDV, V( I, 1 ), LDV, ZERO,
-     $                     T( I+1, I ), 1 )
-               CALL ZLACGV( N, V( I, 1 ), LDV )
-*
-*              T(i+1:k,i) = T(i+1:k,i+1:k) * T(i+1:k,i)
-*
-               CALL ZTRMV( 'Lower', 'No transpose', 'Non-unit', K-I,
-     $                     T( I+1, I+1 ), LDT, T( I+1, I ), 1 )
-            END IF
-            T( I, I ) = TAU( I )
-         END IF
-   20 CONTINUE
-      RETURN
-*
-*     End of ZLARZT
-*
-      END
--- a/libcruft/lapack/zlascl.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,267 +0,0 @@
-      SUBROUTINE ZLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TYPE
-      INTEGER            INFO, KL, KU, LDA, M, N
-      DOUBLE PRECISION   CFROM, CTO
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLASCL multiplies the M by N complex matrix A by the real scalar
-*  CTO/CFROM.  This is done without over/underflow as long as the final
-*  result CTO*A(I,J)/CFROM does not over/underflow. TYPE specifies that
-*  A may be full, upper triangular, lower triangular, upper Hessenberg,
-*  or banded.
-*
-*  Arguments
-*  =========
-*
-*  TYPE    (input) CHARACTER*1
-*          TYPE indices the storage type of the input matrix.
-*          = 'G':  A is a full matrix.
-*          = 'L':  A is a lower triangular matrix.
-*          = 'U':  A is an upper triangular matrix.
-*          = 'H':  A is an upper Hessenberg matrix.
-*          = 'B':  A is a symmetric band matrix with lower bandwidth KL
-*                  and upper bandwidth KU and with the only the lower
-*                  half stored.
-*          = 'Q':  A is a symmetric band matrix with lower bandwidth KL
-*                  and upper bandwidth KU and with the only the upper
-*                  half stored.
-*          = 'Z':  A is a band matrix with lower bandwidth KL and upper
-*                  bandwidth KU.
-*
-*  KL      (input) INTEGER
-*          The lower bandwidth of A.  Referenced only if TYPE = 'B',
-*          'Q' or 'Z'.
-*
-*  KU      (input) INTEGER
-*          The upper bandwidth of A.  Referenced only if TYPE = 'B',
-*          'Q' or 'Z'.
-*
-*  CFROM   (input) DOUBLE PRECISION
-*  CTO     (input) DOUBLE PRECISION
-*          The matrix A is multiplied by CTO/CFROM. A(I,J) is computed
-*          without over/underflow if the final result CTO*A(I,J)/CFROM
-*          can be represented without over/underflow.  CFROM must be
-*          nonzero.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          The matrix to be multiplied by CTO/CFROM.  See TYPE for the
-*          storage type.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  INFO    (output) INTEGER
-*          0  - successful exit
-*          <0 - if INFO = -i, the i-th argument had an illegal value.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            DONE
-      INTEGER            I, ITYPE, J, K1, K2, K3, K4
-      DOUBLE PRECISION   BIGNUM, CFROM1, CFROMC, CTO1, CTOC, MUL, SMLNUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           LSAME, DLAMCH
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, MIN
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-*
-      IF( LSAME( TYPE, 'G' ) ) THEN
-         ITYPE = 0
-      ELSE IF( LSAME( TYPE, 'L' ) ) THEN
-         ITYPE = 1
-      ELSE IF( LSAME( TYPE, 'U' ) ) THEN
-         ITYPE = 2
-      ELSE IF( LSAME( TYPE, 'H' ) ) THEN
-         ITYPE = 3
-      ELSE IF( LSAME( TYPE, 'B' ) ) THEN
-         ITYPE = 4
-      ELSE IF( LSAME( TYPE, 'Q' ) ) THEN
-         ITYPE = 5
-      ELSE IF( LSAME( TYPE, 'Z' ) ) THEN
-         ITYPE = 6
-      ELSE
-         ITYPE = -1
-      END IF
-*
-      IF( ITYPE.EQ.-1 ) THEN
-         INFO = -1
-      ELSE IF( CFROM.EQ.ZERO ) THEN
-         INFO = -4
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -6
-      ELSE IF( N.LT.0 .OR. ( ITYPE.EQ.4 .AND. N.NE.M ) .OR.
-     $         ( ITYPE.EQ.5 .AND. N.NE.M ) ) THEN
-         INFO = -7
-      ELSE IF( ITYPE.LE.3 .AND. LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -9
-      ELSE IF( ITYPE.GE.4 ) THEN
-         IF( KL.LT.0 .OR. KL.GT.MAX( M-1, 0 ) ) THEN
-            INFO = -2
-         ELSE IF( KU.LT.0 .OR. KU.GT.MAX( N-1, 0 ) .OR.
-     $            ( ( ITYPE.EQ.4 .OR. ITYPE.EQ.5 ) .AND. KL.NE.KU ) )
-     $             THEN
-            INFO = -3
-         ELSE IF( ( ITYPE.EQ.4 .AND. LDA.LT.KL+1 ) .OR.
-     $            ( ITYPE.EQ.5 .AND. LDA.LT.KU+1 ) .OR.
-     $            ( ITYPE.EQ.6 .AND. LDA.LT.2*KL+KU+1 ) ) THEN
-            INFO = -9
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZLASCL', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. M.EQ.0 )
-     $   RETURN
-*
-*     Get machine parameters
-*
-      SMLNUM = DLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-*
-      CFROMC = CFROM
-      CTOC = CTO
-*
-   10 CONTINUE
-      CFROM1 = CFROMC*SMLNUM
-      CTO1 = CTOC / BIGNUM
-      IF( ABS( CFROM1 ).GT.ABS( CTOC ) .AND. CTOC.NE.ZERO ) THEN
-         MUL = SMLNUM
-         DONE = .FALSE.
-         CFROMC = CFROM1
-      ELSE IF( ABS( CTO1 ).GT.ABS( CFROMC ) ) THEN
-         MUL = BIGNUM
-         DONE = .FALSE.
-         CTOC = CTO1
-      ELSE
-         MUL = CTOC / CFROMC
-         DONE = .TRUE.
-      END IF
-*
-      IF( ITYPE.EQ.0 ) THEN
-*
-*        Full matrix
-*
-         DO 30 J = 1, N
-            DO 20 I = 1, M
-               A( I, J ) = A( I, J )*MUL
-   20       CONTINUE
-   30    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.1 ) THEN
-*
-*        Lower triangular matrix
-*
-         DO 50 J = 1, N
-            DO 40 I = J, M
-               A( I, J ) = A( I, J )*MUL
-   40       CONTINUE
-   50    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.2 ) THEN
-*
-*        Upper triangular matrix
-*
-         DO 70 J = 1, N
-            DO 60 I = 1, MIN( J, M )
-               A( I, J ) = A( I, J )*MUL
-   60       CONTINUE
-   70    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.3 ) THEN
-*
-*        Upper Hessenberg matrix
-*
-         DO 90 J = 1, N
-            DO 80 I = 1, MIN( J+1, M )
-               A( I, J ) = A( I, J )*MUL
-   80       CONTINUE
-   90    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.4 ) THEN
-*
-*        Lower half of a symmetric band matrix
-*
-         K3 = KL + 1
-         K4 = N + 1
-         DO 110 J = 1, N
-            DO 100 I = 1, MIN( K3, K4-J )
-               A( I, J ) = A( I, J )*MUL
-  100       CONTINUE
-  110    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.5 ) THEN
-*
-*        Upper half of a symmetric band matrix
-*
-         K1 = KU + 2
-         K3 = KU + 1
-         DO 130 J = 1, N
-            DO 120 I = MAX( K1-J, 1 ), K3
-               A( I, J ) = A( I, J )*MUL
-  120       CONTINUE
-  130    CONTINUE
-*
-      ELSE IF( ITYPE.EQ.6 ) THEN
-*
-*        Band matrix
-*
-         K1 = KL + KU + 2
-         K2 = KL + 1
-         K3 = 2*KL + KU + 1
-         K4 = KL + KU + 1 + M
-         DO 150 J = 1, N
-            DO 140 I = MAX( K1-J, K2 ), MIN( K3, K4-J )
-               A( I, J ) = A( I, J )*MUL
-  140       CONTINUE
-  150    CONTINUE
-*
-      END IF
-*
-      IF( .NOT.DONE )
-     $   GO TO 10
-*
-      RETURN
-*
-*     End of ZLASCL
-*
-      END
--- a/libcruft/lapack/zlaset.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-      SUBROUTINE ZLASET( UPLO, M, N, ALPHA, BETA, A, LDA )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            LDA, M, N
-      COMPLEX*16         ALPHA, BETA
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLASET initializes a 2-D array A to BETA on the diagonal and
-*  ALPHA on the offdiagonals.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies the part of the matrix A to be set.
-*          = 'U':      Upper triangular part is set. The lower triangle
-*                      is unchanged.
-*          = 'L':      Lower triangular part is set. The upper triangle
-*                      is unchanged.
-*          Otherwise:  All of the matrix A is set.
-*
-*  M       (input) INTEGER
-*          On entry, M specifies the number of rows of A.
-*
-*  N       (input) INTEGER
-*          On entry, N specifies the number of columns of A.
-*
-*  ALPHA   (input) COMPLEX*16
-*          All the offdiagonal array elements are set to ALPHA.
-*
-*  BETA    (input) COMPLEX*16
-*          All the diagonal array elements are set to BETA.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the m by n matrix A.
-*          On exit, A(i,j) = ALPHA, 1 <= i <= m, 1 <= j <= n, i.ne.j;
-*                   A(i,i) = BETA , 1 <= i <= min(m,n)
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-      IF( LSAME( UPLO, 'U' ) ) THEN
-*
-*        Set the diagonal to BETA and the strictly upper triangular
-*        part of the array to ALPHA.
-*
-         DO 20 J = 2, N
-            DO 10 I = 1, MIN( J-1, M )
-               A( I, J ) = ALPHA
-   10       CONTINUE
-   20    CONTINUE
-         DO 30 I = 1, MIN( N, M )
-            A( I, I ) = BETA
-   30    CONTINUE
-*
-      ELSE IF( LSAME( UPLO, 'L' ) ) THEN
-*
-*        Set the diagonal to BETA and the strictly lower triangular
-*        part of the array to ALPHA.
-*
-         DO 50 J = 1, MIN( M, N )
-            DO 40 I = J + 1, M
-               A( I, J ) = ALPHA
-   40       CONTINUE
-   50    CONTINUE
-         DO 60 I = 1, MIN( N, M )
-            A( I, I ) = BETA
-   60    CONTINUE
-*
-      ELSE
-*
-*        Set the array to BETA on the diagonal and ALPHA on the
-*        offdiagonal.
-*
-         DO 80 J = 1, N
-            DO 70 I = 1, M
-               A( I, J ) = ALPHA
-   70       CONTINUE
-   80    CONTINUE
-         DO 90 I = 1, MIN( M, N )
-            A( I, I ) = BETA
-   90    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of ZLASET
-*
-      END
--- a/libcruft/lapack/zlasr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,363 +0,0 @@
-      SUBROUTINE ZLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIRECT, PIVOT, SIDE
-      INTEGER            LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   C( * ), S( * )
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLASR applies a sequence of real plane rotations to a complex matrix
-*  A, from either the left or the right.
-*
-*  When SIDE = 'L', the transformation takes the form
-*
-*     A := P*A
-*
-*  and when SIDE = 'R', the transformation takes the form
-*
-*     A := A*P**T
-*
-*  where P is an orthogonal matrix consisting of a sequence of z plane
-*  rotations, with z = M when SIDE = 'L' and z = N when SIDE = 'R',
-*  and P**T is the transpose of P.
-*  
-*  When DIRECT = 'F' (Forward sequence), then
-*  
-*     P = P(z-1) * ... * P(2) * P(1)
-*  
-*  and when DIRECT = 'B' (Backward sequence), then
-*  
-*     P = P(1) * P(2) * ... * P(z-1)
-*  
-*  where P(k) is a plane rotation matrix defined by the 2-by-2 rotation
-*  
-*     R(k) = (  c(k)  s(k) )
-*          = ( -s(k)  c(k) ).
-*  
-*  When PIVOT = 'V' (Variable pivot), the rotation is performed
-*  for the plane (k,k+1), i.e., P(k) has the form
-*  
-*     P(k) = (  1                                            )
-*            (       ...                                     )
-*            (              1                                )
-*            (                   c(k)  s(k)                  )
-*            (                  -s(k)  c(k)                  )
-*            (                                1              )
-*            (                                     ...       )
-*            (                                            1  )
-*  
-*  where R(k) appears as a rank-2 modification to the identity matrix in
-*  rows and columns k and k+1.
-*  
-*  When PIVOT = 'T' (Top pivot), the rotation is performed for the
-*  plane (1,k+1), so P(k) has the form
-*  
-*     P(k) = (  c(k)                    s(k)                 )
-*            (         1                                     )
-*            (              ...                              )
-*            (                     1                         )
-*            ( -s(k)                    c(k)                 )
-*            (                                 1             )
-*            (                                      ...      )
-*            (                                             1 )
-*  
-*  where R(k) appears in rows and columns 1 and k+1.
-*  
-*  Similarly, when PIVOT = 'B' (Bottom pivot), the rotation is
-*  performed for the plane (k,z), giving P(k) the form
-*  
-*     P(k) = ( 1                                             )
-*            (      ...                                      )
-*            (             1                                 )
-*            (                  c(k)                    s(k) )
-*            (                         1                     )
-*            (                              ...              )
-*            (                                     1         )
-*            (                 -s(k)                    c(k) )
-*  
-*  where R(k) appears in rows and columns k and z.  The rotations are
-*  performed without ever forming P(k) explicitly.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          Specifies whether the plane rotation matrix P is applied to
-*          A on the left or the right.
-*          = 'L':  Left, compute A := P*A
-*          = 'R':  Right, compute A:= A*P**T
-*
-*  PIVOT   (input) CHARACTER*1
-*          Specifies the plane for which P(k) is a plane rotation
-*          matrix.
-*          = 'V':  Variable pivot, the plane (k,k+1)
-*          = 'T':  Top pivot, the plane (1,k+1)
-*          = 'B':  Bottom pivot, the plane (k,z)
-*
-*  DIRECT  (input) CHARACTER*1
-*          Specifies whether P is a forward or backward sequence of
-*          plane rotations.
-*          = 'F':  Forward, P = P(z-1)*...*P(2)*P(1)
-*          = 'B':  Backward, P = P(1)*P(2)*...*P(z-1)
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  If m <= 1, an immediate
-*          return is effected.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  If n <= 1, an
-*          immediate return is effected.
-*
-*  C       (input) DOUBLE PRECISION array, dimension
-*                  (M-1) if SIDE = 'L'
-*                  (N-1) if SIDE = 'R'
-*          The cosines c(k) of the plane rotations.
-*
-*  S       (input) DOUBLE PRECISION array, dimension
-*                  (M-1) if SIDE = 'L'
-*                  (N-1) if SIDE = 'R'
-*          The sines s(k) of the plane rotations.  The 2-by-2 plane
-*          rotation part of the matrix P(k), R(k), has the form
-*          R(k) = (  c(k)  s(k) )
-*                 ( -s(k)  c(k) ).
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          The M-by-N matrix A.  On exit, A is overwritten by P*A if
-*          SIDE = 'R' or by A*P**T if SIDE = 'L'.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, INFO, J
-      DOUBLE PRECISION   CTEMP, STEMP
-      COMPLEX*16         TEMP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters
-*
-      INFO = 0
-      IF( .NOT.( LSAME( SIDE, 'L' ) .OR. LSAME( SIDE, 'R' ) ) ) THEN
-         INFO = 1
-      ELSE IF( .NOT.( LSAME( PIVOT, 'V' ) .OR. LSAME( PIVOT,
-     $         'T' ) .OR. LSAME( PIVOT, 'B' ) ) ) THEN
-         INFO = 2
-      ELSE IF( .NOT.( LSAME( DIRECT, 'F' ) .OR. LSAME( DIRECT, 'B' ) ) )
-     $          THEN
-         INFO = 3
-      ELSE IF( M.LT.0 ) THEN
-         INFO = 4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = 5
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = 9
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZLASR ', INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( ( M.EQ.0 ) .OR. ( N.EQ.0 ) )
-     $   RETURN
-      IF( LSAME( SIDE, 'L' ) ) THEN
-*
-*        Form  P * A
-*
-         IF( LSAME( PIVOT, 'V' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 20 J = 1, M - 1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 10 I = 1, N
-                        TEMP = A( J+1, I )
-                        A( J+1, I ) = CTEMP*TEMP - STEMP*A( J, I )
-                        A( J, I ) = STEMP*TEMP + CTEMP*A( J, I )
-   10                CONTINUE
-                  END IF
-   20          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 40 J = M - 1, 1, -1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 30 I = 1, N
-                        TEMP = A( J+1, I )
-                        A( J+1, I ) = CTEMP*TEMP - STEMP*A( J, I )
-                        A( J, I ) = STEMP*TEMP + CTEMP*A( J, I )
-   30                CONTINUE
-                  END IF
-   40          CONTINUE
-            END IF
-         ELSE IF( LSAME( PIVOT, 'T' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 60 J = 2, M
-                  CTEMP = C( J-1 )
-                  STEMP = S( J-1 )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 50 I = 1, N
-                        TEMP = A( J, I )
-                        A( J, I ) = CTEMP*TEMP - STEMP*A( 1, I )
-                        A( 1, I ) = STEMP*TEMP + CTEMP*A( 1, I )
-   50                CONTINUE
-                  END IF
-   60          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 80 J = M, 2, -1
-                  CTEMP = C( J-1 )
-                  STEMP = S( J-1 )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 70 I = 1, N
-                        TEMP = A( J, I )
-                        A( J, I ) = CTEMP*TEMP - STEMP*A( 1, I )
-                        A( 1, I ) = STEMP*TEMP + CTEMP*A( 1, I )
-   70                CONTINUE
-                  END IF
-   80          CONTINUE
-            END IF
-         ELSE IF( LSAME( PIVOT, 'B' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 100 J = 1, M - 1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 90 I = 1, N
-                        TEMP = A( J, I )
-                        A( J, I ) = STEMP*A( M, I ) + CTEMP*TEMP
-                        A( M, I ) = CTEMP*A( M, I ) - STEMP*TEMP
-   90                CONTINUE
-                  END IF
-  100          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 120 J = M - 1, 1, -1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 110 I = 1, N
-                        TEMP = A( J, I )
-                        A( J, I ) = STEMP*A( M, I ) + CTEMP*TEMP
-                        A( M, I ) = CTEMP*A( M, I ) - STEMP*TEMP
-  110                CONTINUE
-                  END IF
-  120          CONTINUE
-            END IF
-         END IF
-      ELSE IF( LSAME( SIDE, 'R' ) ) THEN
-*
-*        Form A * P'
-*
-         IF( LSAME( PIVOT, 'V' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 140 J = 1, N - 1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 130 I = 1, M
-                        TEMP = A( I, J+1 )
-                        A( I, J+1 ) = CTEMP*TEMP - STEMP*A( I, J )
-                        A( I, J ) = STEMP*TEMP + CTEMP*A( I, J )
-  130                CONTINUE
-                  END IF
-  140          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 160 J = N - 1, 1, -1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 150 I = 1, M
-                        TEMP = A( I, J+1 )
-                        A( I, J+1 ) = CTEMP*TEMP - STEMP*A( I, J )
-                        A( I, J ) = STEMP*TEMP + CTEMP*A( I, J )
-  150                CONTINUE
-                  END IF
-  160          CONTINUE
-            END IF
-         ELSE IF( LSAME( PIVOT, 'T' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 180 J = 2, N
-                  CTEMP = C( J-1 )
-                  STEMP = S( J-1 )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 170 I = 1, M
-                        TEMP = A( I, J )
-                        A( I, J ) = CTEMP*TEMP - STEMP*A( I, 1 )
-                        A( I, 1 ) = STEMP*TEMP + CTEMP*A( I, 1 )
-  170                CONTINUE
-                  END IF
-  180          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 200 J = N, 2, -1
-                  CTEMP = C( J-1 )
-                  STEMP = S( J-1 )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 190 I = 1, M
-                        TEMP = A( I, J )
-                        A( I, J ) = CTEMP*TEMP - STEMP*A( I, 1 )
-                        A( I, 1 ) = STEMP*TEMP + CTEMP*A( I, 1 )
-  190                CONTINUE
-                  END IF
-  200          CONTINUE
-            END IF
-         ELSE IF( LSAME( PIVOT, 'B' ) ) THEN
-            IF( LSAME( DIRECT, 'F' ) ) THEN
-               DO 220 J = 1, N - 1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 210 I = 1, M
-                        TEMP = A( I, J )
-                        A( I, J ) = STEMP*A( I, N ) + CTEMP*TEMP
-                        A( I, N ) = CTEMP*A( I, N ) - STEMP*TEMP
-  210                CONTINUE
-                  END IF
-  220          CONTINUE
-            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN
-               DO 240 J = N - 1, 1, -1
-                  CTEMP = C( J )
-                  STEMP = S( J )
-                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN
-                     DO 230 I = 1, M
-                        TEMP = A( I, J )
-                        A( I, J ) = STEMP*A( I, N ) + CTEMP*TEMP
-                        A( I, N ) = CTEMP*A( I, N ) - STEMP*TEMP
-  230                CONTINUE
-                  END IF
-  240          CONTINUE
-            END IF
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZLASR
-*
-      END
--- a/libcruft/lapack/zlassq.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,101 +0,0 @@
-      SUBROUTINE ZLASSQ( N, X, INCX, SCALE, SUMSQ )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, N
-      DOUBLE PRECISION   SCALE, SUMSQ
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLASSQ returns the values scl and ssq such that
-*
-*     ( scl**2 )*ssq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq,
-*
-*  where x( i ) = abs( X( 1 + ( i - 1 )*INCX ) ). The value of sumsq is
-*  assumed to be at least unity and the value of ssq will then satisfy
-*
-*     1.0 .le. ssq .le. ( sumsq + 2*n ).
-*
-*  scale is assumed to be non-negative and scl returns the value
-*
-*     scl = max( scale, abs( real( x( i ) ) ), abs( aimag( x( i ) ) ) ),
-*            i
-*
-*  scale and sumsq must be supplied in SCALE and SUMSQ respectively.
-*  SCALE and SUMSQ are overwritten by scl and ssq respectively.
-*
-*  The routine makes only one pass through the vector X.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of elements to be used from the vector X.
-*
-*  X       (input) COMPLEX*16 array, dimension (N)
-*          The vector x as described above.
-*             x( i )  = X( 1 + ( i - 1 )*INCX ), 1 <= i <= n.
-*
-*  INCX    (input) INTEGER
-*          The increment between successive values of the vector X.
-*          INCX > 0.
-*
-*  SCALE   (input/output) DOUBLE PRECISION
-*          On entry, the value  scale  in the equation above.
-*          On exit, SCALE is overwritten with the value  scl .
-*
-*  SUMSQ   (input/output) DOUBLE PRECISION
-*          On entry, the value  sumsq  in the equation above.
-*          On exit, SUMSQ is overwritten with the value  ssq .
-*
-* =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            IX
-      DOUBLE PRECISION   TEMP1
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DIMAG
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.GT.0 ) THEN
-         DO 10 IX = 1, 1 + ( N-1 )*INCX, INCX
-            IF( DBLE( X( IX ) ).NE.ZERO ) THEN
-               TEMP1 = ABS( DBLE( X( IX ) ) )
-               IF( SCALE.LT.TEMP1 ) THEN
-                  SUMSQ = 1 + SUMSQ*( SCALE / TEMP1 )**2
-                  SCALE = TEMP1
-               ELSE
-                  SUMSQ = SUMSQ + ( TEMP1 / SCALE )**2
-               END IF
-            END IF
-            IF( DIMAG( X( IX ) ).NE.ZERO ) THEN
-               TEMP1 = ABS( DIMAG( X( IX ) ) )
-               IF( SCALE.LT.TEMP1 ) THEN
-                  SUMSQ = 1 + SUMSQ*( SCALE / TEMP1 )**2
-                  SCALE = TEMP1
-               ELSE
-                  SUMSQ = SUMSQ + ( TEMP1 / SCALE )**2
-               END IF
-            END IF
-   10    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of ZLASSQ
-*
-      END
--- a/libcruft/lapack/zlaswp.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,119 +0,0 @@
-      SUBROUTINE ZLASWP( N, A, LDA, K1, K2, IPIV, INCX )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, K1, K2, LDA, N
-*     ..
-*     .. Array Arguments ..
-      INTEGER            IPIV( * )
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLASWP performs a series of row interchanges on the matrix A.
-*  One row interchange is initiated for each of rows K1 through K2 of A.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the matrix of column dimension N to which the row
-*          interchanges will be applied.
-*          On exit, the permuted matrix.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.
-*
-*  K1      (input) INTEGER
-*          The first element of IPIV for which a row interchange will
-*          be done.
-*
-*  K2      (input) INTEGER
-*          The last element of IPIV for which a row interchange will
-*          be done.
-*
-*  IPIV    (input) INTEGER array, dimension (K2*abs(INCX))
-*          The vector of pivot indices.  Only the elements in positions
-*          K1 through K2 of IPIV are accessed.
-*          IPIV(K) = L implies rows K and L are to be interchanged.
-*
-*  INCX    (input) INTEGER
-*          The increment between successive values of IPIV.  If IPIV
-*          is negative, the pivots are applied in reverse order.
-*
-*  Further Details
-*  ===============
-*
-*  Modified by
-*   R. C. Whaley, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, I1, I2, INC, IP, IX, IX0, J, K, N32
-      COMPLEX*16         TEMP
-*     ..
-*     .. Executable Statements ..
-*
-*     Interchange row I with row IPIV(I) for each of rows K1 through K2.
-*
-      IF( INCX.GT.0 ) THEN
-         IX0 = K1
-         I1 = K1
-         I2 = K2
-         INC = 1
-      ELSE IF( INCX.LT.0 ) THEN
-         IX0 = 1 + ( 1-K2 )*INCX
-         I1 = K2
-         I2 = K1
-         INC = -1
-      ELSE
-         RETURN
-      END IF
-*
-      N32 = ( N / 32 )*32
-      IF( N32.NE.0 ) THEN
-         DO 30 J = 1, N32, 32
-            IX = IX0
-            DO 20 I = I1, I2, INC
-               IP = IPIV( IX )
-               IF( IP.NE.I ) THEN
-                  DO 10 K = J, J + 31
-                     TEMP = A( I, K )
-                     A( I, K ) = A( IP, K )
-                     A( IP, K ) = TEMP
-   10             CONTINUE
-               END IF
-               IX = IX + INCX
-   20       CONTINUE
-   30    CONTINUE
-      END IF
-      IF( N32.NE.N ) THEN
-         N32 = N32 + 1
-         IX = IX0
-         DO 50 I = I1, I2, INC
-            IP = IPIV( IX )
-            IF( IP.NE.I ) THEN
-               DO 40 K = N32, N
-                  TEMP = A( I, K )
-                  A( I, K ) = A( IP, K )
-                  A( IP, K ) = TEMP
-   40          CONTINUE
-            END IF
-            IX = IX + INCX
-   50    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of ZLASWP
-*
-      END
--- a/libcruft/lapack/zlatbs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,908 +0,0 @@
-      SUBROUTINE ZLATBS( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X,
-     $                   SCALE, CNORM, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, NORMIN, TRANS, UPLO
-      INTEGER            INFO, KD, LDAB, N
-      DOUBLE PRECISION   SCALE
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   CNORM( * )
-      COMPLEX*16         AB( LDAB, * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLATBS solves one of the triangular systems
-*
-*     A * x = s*b,  A**T * x = s*b,  or  A**H * x = s*b,
-*
-*  with scaling to prevent overflow, where A is an upper or lower
-*  triangular band matrix.  Here A' denotes the transpose of A, x and b
-*  are n-element vectors, and s is a scaling factor, usually less than
-*  or equal to 1, chosen so that the components of x will be less than
-*  the overflow threshold.  If the unscaled problem will not cause
-*  overflow, the Level 2 BLAS routine ZTBSV is called.  If the matrix A
-*  is singular (A(j,j) = 0 for some j), then s is set to 0 and a
-*  non-trivial solution to A*x = 0 is returned.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the matrix A is upper or lower triangular.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the operation applied to A.
-*          = 'N':  Solve A * x = s*b     (No transpose)
-*          = 'T':  Solve A**T * x = s*b  (Transpose)
-*          = 'C':  Solve A**H * x = s*b  (Conjugate transpose)
-*
-*  DIAG    (input) CHARACTER*1
-*          Specifies whether or not the matrix A is unit triangular.
-*          = 'N':  Non-unit triangular
-*          = 'U':  Unit triangular
-*
-*  NORMIN  (input) CHARACTER*1
-*          Specifies whether CNORM has been set or not.
-*          = 'Y':  CNORM contains the column norms on entry
-*          = 'N':  CNORM is not set on entry.  On exit, the norms will
-*                  be computed and stored in CNORM.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of subdiagonals or superdiagonals in the
-*          triangular matrix A.  KD >= 0.
-*
-*  AB      (input) COMPLEX*16 array, dimension (LDAB,N)
-*          The upper or lower triangular band matrix A, stored in the
-*          first KD+1 rows of the array. The j-th column of A is stored
-*          in the j-th column of the array AB as follows:
-*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  X       (input/output) COMPLEX*16 array, dimension (N)
-*          On entry, the right hand side b of the triangular system.
-*          On exit, X is overwritten by the solution vector x.
-*
-*  SCALE   (output) DOUBLE PRECISION
-*          The scaling factor s for the triangular system
-*             A * x = s*b,  A**T * x = s*b,  or  A**H * x = s*b.
-*          If SCALE = 0, the matrix A is singular or badly scaled, and
-*          the vector x is an exact or approximate solution to A*x = 0.
-*
-*  CNORM   (input or output) DOUBLE PRECISION array, dimension (N)
-*
-*          If NORMIN = 'Y', CNORM is an input argument and CNORM(j)
-*          contains the norm of the off-diagonal part of the j-th column
-*          of A.  If TRANS = 'N', CNORM(j) must be greater than or equal
-*          to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j)
-*          must be greater than or equal to the 1-norm.
-*
-*          If NORMIN = 'N', CNORM is an output argument and CNORM(j)
-*          returns the 1-norm of the offdiagonal part of the j-th column
-*          of A.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -k, the k-th argument had an illegal value
-*
-*  Further Details
-*  ======= =======
-*
-*  A rough bound on x is computed; if that is less than overflow, ZTBSV
-*  is called, otherwise, specific code is used which checks for possible
-*  overflow or divide-by-zero at every operation.
-*
-*  A columnwise scheme is used for solving A*x = b.  The basic algorithm
-*  if A is lower triangular is
-*
-*       x[1:n] := b[1:n]
-*       for j = 1, ..., n
-*            x(j) := x(j) / A(j,j)
-*            x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j]
-*       end
-*
-*  Define bounds on the components of x after j iterations of the loop:
-*     M(j) = bound on x[1:j]
-*     G(j) = bound on x[j+1:n]
-*  Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}.
-*
-*  Then for iteration j+1 we have
-*     M(j+1) <= G(j) / | A(j+1,j+1) |
-*     G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] |
-*            <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | )
-*
-*  where CNORM(j+1) is greater than or equal to the infinity-norm of
-*  column j+1 of A, not counting the diagonal.  Hence
-*
-*     G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | )
-*                  1<=i<=j
-*  and
-*
-*     |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| )
-*                                   1<=i< j
-*
-*  Since |x(j)| <= M(j), we use the Level 2 BLAS routine ZTBSV if the
-*  reciprocal of the largest M(j), j=1,..,n, is larger than
-*  max(underflow, 1/overflow).
-*
-*  The bound on x(j) is also used to determine when a step in the
-*  columnwise method can be performed without fear of overflow.  If
-*  the computed bound is greater than a large constant, x is scaled to
-*  prevent overflow, but if the bound overflows, x is set to 0, x(j) to
-*  1, and scale to 0, and a non-trivial solution to A*x = 0 is found.
-*
-*  Similarly, a row-wise scheme is used to solve A**T *x = b  or
-*  A**H *x = b.  The basic algorithm for A upper triangular is
-*
-*       for j = 1, ..., n
-*            x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j)
-*       end
-*
-*  We simultaneously compute two bounds
-*       G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j
-*       M(j) = bound on x(i), 1<=i<=j
-*
-*  The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we
-*  add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1.
-*  Then the bound on x(j) is
-*
-*       M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) |
-*
-*            <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| )
-*                      1<=i<=j
-*
-*  and we can safely call ZTBSV if 1/M(n) and 1/G(n) are both greater
-*  than max(underflow, 1/overflow).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, HALF, ONE, TWO
-      PARAMETER          ( ZERO = 0.0D+0, HALF = 0.5D+0, ONE = 1.0D+0,
-     $                   TWO = 2.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOTRAN, NOUNIT, UPPER
-      INTEGER            I, IMAX, J, JFIRST, JINC, JLAST, JLEN, MAIND
-      DOUBLE PRECISION   BIGNUM, GROW, REC, SMLNUM, TJJ, TMAX, TSCAL,
-     $                   XBND, XJ, XMAX
-      COMPLEX*16         CSUMJ, TJJS, USCAL, ZDUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IDAMAX, IZAMAX
-      DOUBLE PRECISION   DLAMCH, DZASUM
-      COMPLEX*16         ZDOTC, ZDOTU, ZLADIV
-      EXTERNAL           LSAME, IDAMAX, IZAMAX, DLAMCH, DZASUM, ZDOTC,
-     $                   ZDOTU, ZLADIV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DSCAL, XERBLA, ZAXPY, ZDSCAL, ZTBSV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, DIMAG, MAX, MIN
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1, CABS2
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
-      CABS2( ZDUM ) = ABS( DBLE( ZDUM ) / 2.D0 ) +
-     $                ABS( DIMAG( ZDUM ) / 2.D0 )
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      NOUNIT = LSAME( DIAG, 'N' )
-*
-*     Test the input parameters.
-*
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
-     $         LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -3
-      ELSE IF( .NOT.LSAME( NORMIN, 'Y' ) .AND. .NOT.
-     $         LSAME( NORMIN, 'N' ) ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -6
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZLATBS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine machine dependent parameters to control overflow.
-*
-      SMLNUM = DLAMCH( 'Safe minimum' )
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SMLNUM / DLAMCH( 'Precision' )
-      BIGNUM = ONE / SMLNUM
-      SCALE = ONE
-*
-      IF( LSAME( NORMIN, 'N' ) ) THEN
-*
-*        Compute the 1-norm of each column, not including the diagonal.
-*
-         IF( UPPER ) THEN
-*
-*           A is upper triangular.
-*
-            DO 10 J = 1, N
-               JLEN = MIN( KD, J-1 )
-               CNORM( J ) = DZASUM( JLEN, AB( KD+1-JLEN, J ), 1 )
-   10       CONTINUE
-         ELSE
-*
-*           A is lower triangular.
-*
-            DO 20 J = 1, N
-               JLEN = MIN( KD, N-J )
-               IF( JLEN.GT.0 ) THEN
-                  CNORM( J ) = DZASUM( JLEN, AB( 2, J ), 1 )
-               ELSE
-                  CNORM( J ) = ZERO
-               END IF
-   20       CONTINUE
-         END IF
-      END IF
-*
-*     Scale the column norms by TSCAL if the maximum element in CNORM is
-*     greater than BIGNUM/2.
-*
-      IMAX = IDAMAX( N, CNORM, 1 )
-      TMAX = CNORM( IMAX )
-      IF( TMAX.LE.BIGNUM*HALF ) THEN
-         TSCAL = ONE
-      ELSE
-         TSCAL = HALF / ( SMLNUM*TMAX )
-         CALL DSCAL( N, TSCAL, CNORM, 1 )
-      END IF
-*
-*     Compute a bound on the computed solution vector to see if the
-*     Level 2 BLAS routine ZTBSV can be used.
-*
-      XMAX = ZERO
-      DO 30 J = 1, N
-         XMAX = MAX( XMAX, CABS2( X( J ) ) )
-   30 CONTINUE
-      XBND = XMAX
-      IF( NOTRAN ) THEN
-*
-*        Compute the growth in A * x = b.
-*
-         IF( UPPER ) THEN
-            JFIRST = N
-            JLAST = 1
-            JINC = -1
-            MAIND = KD + 1
-         ELSE
-            JFIRST = 1
-            JLAST = N
-            JINC = 1
-            MAIND = 1
-         END IF
-*
-         IF( TSCAL.NE.ONE ) THEN
-            GROW = ZERO
-            GO TO 60
-         END IF
-*
-         IF( NOUNIT ) THEN
-*
-*           A is non-unit triangular.
-*
-*           Compute GROW = 1/G(j) and XBND = 1/M(j).
-*           Initially, G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = HALF / MAX( XBND, SMLNUM )
-            XBND = GROW
-            DO 40 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 60
-*
-               TJJS = AB( MAIND, J )
-               TJJ = CABS1( TJJS )
-*
-               IF( TJJ.GE.SMLNUM ) THEN
-*
-*                 M(j) = G(j-1) / abs(A(j,j))
-*
-                  XBND = MIN( XBND, MIN( ONE, TJJ )*GROW )
-               ELSE
-*
-*                 M(j) could overflow, set XBND to 0.
-*
-                  XBND = ZERO
-               END IF
-*
-               IF( TJJ+CNORM( J ).GE.SMLNUM ) THEN
-*
-*                 G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) )
-*
-                  GROW = GROW*( TJJ / ( TJJ+CNORM( J ) ) )
-               ELSE
-*
-*                 G(j) could overflow, set GROW to 0.
-*
-                  GROW = ZERO
-               END IF
-   40       CONTINUE
-            GROW = XBND
-         ELSE
-*
-*           A is unit triangular.
-*
-*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = MIN( ONE, HALF / MAX( XBND, SMLNUM ) )
-            DO 50 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 60
-*
-*              G(j) = G(j-1)*( 1 + CNORM(j) )
-*
-               GROW = GROW*( ONE / ( ONE+CNORM( J ) ) )
-   50       CONTINUE
-         END IF
-   60    CONTINUE
-*
-      ELSE
-*
-*        Compute the growth in A**T * x = b  or  A**H * x = b.
-*
-         IF( UPPER ) THEN
-            JFIRST = 1
-            JLAST = N
-            JINC = 1
-            MAIND = KD + 1
-         ELSE
-            JFIRST = N
-            JLAST = 1
-            JINC = -1
-            MAIND = 1
-         END IF
-*
-         IF( TSCAL.NE.ONE ) THEN
-            GROW = ZERO
-            GO TO 90
-         END IF
-*
-         IF( NOUNIT ) THEN
-*
-*           A is non-unit triangular.
-*
-*           Compute GROW = 1/G(j) and XBND = 1/M(j).
-*           Initially, M(0) = max{x(i), i=1,...,n}.
-*
-            GROW = HALF / MAX( XBND, SMLNUM )
-            XBND = GROW
-            DO 70 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 90
-*
-*              G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) )
-*
-               XJ = ONE + CNORM( J )
-               GROW = MIN( GROW, XBND / XJ )
-*
-               TJJS = AB( MAIND, J )
-               TJJ = CABS1( TJJS )
-*
-               IF( TJJ.GE.SMLNUM ) THEN
-*
-*                 M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j))
-*
-                  IF( XJ.GT.TJJ )
-     $               XBND = XBND*( TJJ / XJ )
-               ELSE
-*
-*                 M(j) could overflow, set XBND to 0.
-*
-                  XBND = ZERO
-               END IF
-   70       CONTINUE
-            GROW = MIN( GROW, XBND )
-         ELSE
-*
-*           A is unit triangular.
-*
-*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = MIN( ONE, HALF / MAX( XBND, SMLNUM ) )
-            DO 80 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 90
-*
-*              G(j) = ( 1 + CNORM(j) )*G(j-1)
-*
-               XJ = ONE + CNORM( J )
-               GROW = GROW / XJ
-   80       CONTINUE
-         END IF
-   90    CONTINUE
-      END IF
-*
-      IF( ( GROW*TSCAL ).GT.SMLNUM ) THEN
-*
-*        Use the Level 2 BLAS solve if the reciprocal of the bound on
-*        elements of X is not too small.
-*
-         CALL ZTBSV( UPLO, TRANS, DIAG, N, KD, AB, LDAB, X, 1 )
-      ELSE
-*
-*        Use a Level 1 BLAS solve, scaling intermediate results.
-*
-         IF( XMAX.GT.BIGNUM*HALF ) THEN
-*
-*           Scale X so that its components are less than or equal to
-*           BIGNUM in absolute value.
-*
-            SCALE = ( BIGNUM*HALF ) / XMAX
-            CALL ZDSCAL( N, SCALE, X, 1 )
-            XMAX = BIGNUM
-         ELSE
-            XMAX = XMAX*TWO
-         END IF
-*
-         IF( NOTRAN ) THEN
-*
-*           Solve A * x = b
-*
-            DO 120 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) / A(j,j), scaling x if necessary.
-*
-               XJ = CABS1( X( J ) )
-               IF( NOUNIT ) THEN
-                  TJJS = AB( MAIND, J )*TSCAL
-               ELSE
-                  TJJS = TSCAL
-                  IF( TSCAL.EQ.ONE )
-     $               GO TO 110
-               END IF
-               TJJ = CABS1( TJJS )
-               IF( TJJ.GT.SMLNUM ) THEN
-*
-*                    abs(A(j,j)) > SMLNUM:
-*
-                  IF( TJJ.LT.ONE ) THEN
-                     IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by 1/b(j).
-*
-                        REC = ONE / XJ
-                        CALL ZDSCAL( N, REC, X, 1 )
-                        SCALE = SCALE*REC
-                        XMAX = XMAX*REC
-                     END IF
-                  END IF
-                  X( J ) = ZLADIV( X( J ), TJJS )
-                  XJ = CABS1( X( J ) )
-               ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                    0 < abs(A(j,j)) <= SMLNUM:
-*
-                  IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                       Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM
-*                       to avoid overflow when dividing by A(j,j).
-*
-                     REC = ( TJJ*BIGNUM ) / XJ
-                     IF( CNORM( J ).GT.ONE ) THEN
-*
-*                          Scale by 1/CNORM(j) to avoid overflow when
-*                          multiplying x(j) times column j.
-*
-                        REC = REC / CNORM( J )
-                     END IF
-                     CALL ZDSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                     XMAX = XMAX*REC
-                  END IF
-                  X( J ) = ZLADIV( X( J ), TJJS )
-                  XJ = CABS1( X( J ) )
-               ELSE
-*
-*                    A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                    scale = 0, and compute a solution to A*x = 0.
-*
-                  DO 100 I = 1, N
-                     X( I ) = ZERO
-  100             CONTINUE
-                  X( J ) = ONE
-                  XJ = ONE
-                  SCALE = ZERO
-                  XMAX = ZERO
-               END IF
-  110          CONTINUE
-*
-*              Scale x if necessary to avoid overflow when adding a
-*              multiple of column j of A.
-*
-               IF( XJ.GT.ONE ) THEN
-                  REC = ONE / XJ
-                  IF( CNORM( J ).GT.( BIGNUM-XMAX )*REC ) THEN
-*
-*                    Scale x by 1/(2*abs(x(j))).
-*
-                     REC = REC*HALF
-                     CALL ZDSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                  END IF
-               ELSE IF( XJ*CNORM( J ).GT.( BIGNUM-XMAX ) ) THEN
-*
-*                 Scale x by 1/2.
-*
-                  CALL ZDSCAL( N, HALF, X, 1 )
-                  SCALE = SCALE*HALF
-               END IF
-*
-               IF( UPPER ) THEN
-                  IF( J.GT.1 ) THEN
-*
-*                    Compute the update
-*                       x(max(1,j-kd):j-1) := x(max(1,j-kd):j-1) -
-*                                             x(j)* A(max(1,j-kd):j-1,j)
-*
-                     JLEN = MIN( KD, J-1 )
-                     CALL ZAXPY( JLEN, -X( J )*TSCAL,
-     $                           AB( KD+1-JLEN, J ), 1, X( J-JLEN ), 1 )
-                     I = IZAMAX( J-1, X, 1 )
-                     XMAX = CABS1( X( I ) )
-                  END IF
-               ELSE IF( J.LT.N ) THEN
-*
-*                 Compute the update
-*                    x(j+1:min(j+kd,n)) := x(j+1:min(j+kd,n)) -
-*                                          x(j) * A(j+1:min(j+kd,n),j)
-*
-                  JLEN = MIN( KD, N-J )
-                  IF( JLEN.GT.0 )
-     $               CALL ZAXPY( JLEN, -X( J )*TSCAL, AB( 2, J ), 1,
-     $                           X( J+1 ), 1 )
-                  I = J + IZAMAX( N-J, X( J+1 ), 1 )
-                  XMAX = CABS1( X( I ) )
-               END IF
-  120       CONTINUE
-*
-         ELSE IF( LSAME( TRANS, 'T' ) ) THEN
-*
-*           Solve A**T * x = b
-*
-            DO 170 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) - sum A(k,j)*x(k).
-*                                    k<>j
-*
-               XJ = CABS1( X( J ) )
-               USCAL = TSCAL
-               REC = ONE / MAX( XMAX, ONE )
-               IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN
-*
-*                 If x(j) could overflow, scale x by 1/(2*XMAX).
-*
-                  REC = REC*HALF
-                  IF( NOUNIT ) THEN
-                     TJJS = AB( MAIND, J )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                  END IF
-                  TJJ = CABS1( TJJS )
-                  IF( TJJ.GT.ONE ) THEN
-*
-*                       Divide by A(j,j) when scaling x if A(j,j) > 1.
-*
-                     REC = MIN( ONE, REC*TJJ )
-                     USCAL = ZLADIV( USCAL, TJJS )
-                  END IF
-                  IF( REC.LT.ONE ) THEN
-                     CALL ZDSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                     XMAX = XMAX*REC
-                  END IF
-               END IF
-*
-               CSUMJ = ZERO
-               IF( USCAL.EQ.DCMPLX( ONE ) ) THEN
-*
-*                 If the scaling needed for A in the dot product is 1,
-*                 call ZDOTU to perform the dot product.
-*
-                  IF( UPPER ) THEN
-                     JLEN = MIN( KD, J-1 )
-                     CSUMJ = ZDOTU( JLEN, AB( KD+1-JLEN, J ), 1,
-     $                       X( J-JLEN ), 1 )
-                  ELSE
-                     JLEN = MIN( KD, N-J )
-                     IF( JLEN.GT.1 )
-     $                  CSUMJ = ZDOTU( JLEN, AB( 2, J ), 1, X( J+1 ),
-     $                          1 )
-                  END IF
-               ELSE
-*
-*                 Otherwise, use in-line code for the dot product.
-*
-                  IF( UPPER ) THEN
-                     JLEN = MIN( KD, J-1 )
-                     DO 130 I = 1, JLEN
-                        CSUMJ = CSUMJ + ( AB( KD+I-JLEN, J )*USCAL )*
-     $                          X( J-JLEN-1+I )
-  130                CONTINUE
-                  ELSE
-                     JLEN = MIN( KD, N-J )
-                     DO 140 I = 1, JLEN
-                        CSUMJ = CSUMJ + ( AB( I+1, J )*USCAL )*X( J+I )
-  140                CONTINUE
-                  END IF
-               END IF
-*
-               IF( USCAL.EQ.DCMPLX( TSCAL ) ) THEN
-*
-*                 Compute x(j) := ( x(j) - CSUMJ ) / A(j,j) if 1/A(j,j)
-*                 was not used to scale the dotproduct.
-*
-                  X( J ) = X( J ) - CSUMJ
-                  XJ = CABS1( X( J ) )
-                  IF( NOUNIT ) THEN
-*
-*                    Compute x(j) = x(j) / A(j,j), scaling if necessary.
-*
-                     TJJS = AB( MAIND, J )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                     IF( TSCAL.EQ.ONE )
-     $                  GO TO 160
-                  END IF
-                  TJJ = CABS1( TJJS )
-                  IF( TJJ.GT.SMLNUM ) THEN
-*
-*                       abs(A(j,j)) > SMLNUM:
-*
-                     IF( TJJ.LT.ONE ) THEN
-                        IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                             Scale X by 1/abs(x(j)).
-*
-                           REC = ONE / XJ
-                           CALL ZDSCAL( N, REC, X, 1 )
-                           SCALE = SCALE*REC
-                           XMAX = XMAX*REC
-                        END IF
-                     END IF
-                     X( J ) = ZLADIV( X( J ), TJJS )
-                  ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                       0 < abs(A(j,j)) <= SMLNUM:
-*
-                     IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM.
-*
-                        REC = ( TJJ*BIGNUM ) / XJ
-                        CALL ZDSCAL( N, REC, X, 1 )
-                        SCALE = SCALE*REC
-                        XMAX = XMAX*REC
-                     END IF
-                     X( J ) = ZLADIV( X( J ), TJJS )
-                  ELSE
-*
-*                       A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                       scale = 0 and compute a solution to A**T *x = 0.
-*
-                     DO 150 I = 1, N
-                        X( I ) = ZERO
-  150                CONTINUE
-                     X( J ) = ONE
-                     SCALE = ZERO
-                     XMAX = ZERO
-                  END IF
-  160             CONTINUE
-               ELSE
-*
-*                 Compute x(j) := x(j) / A(j,j) - CSUMJ if the dot
-*                 product has already been divided by 1/A(j,j).
-*
-                  X( J ) = ZLADIV( X( J ), TJJS ) - CSUMJ
-               END IF
-               XMAX = MAX( XMAX, CABS1( X( J ) ) )
-  170       CONTINUE
-*
-         ELSE
-*
-*           Solve A**H * x = b
-*
-            DO 220 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) - sum A(k,j)*x(k).
-*                                    k<>j
-*
-               XJ = CABS1( X( J ) )
-               USCAL = TSCAL
-               REC = ONE / MAX( XMAX, ONE )
-               IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN
-*
-*                 If x(j) could overflow, scale x by 1/(2*XMAX).
-*
-                  REC = REC*HALF
-                  IF( NOUNIT ) THEN
-                     TJJS = DCONJG( AB( MAIND, J ) )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                  END IF
-                  TJJ = CABS1( TJJS )
-                  IF( TJJ.GT.ONE ) THEN
-*
-*                       Divide by A(j,j) when scaling x if A(j,j) > 1.
-*
-                     REC = MIN( ONE, REC*TJJ )
-                     USCAL = ZLADIV( USCAL, TJJS )
-                  END IF
-                  IF( REC.LT.ONE ) THEN
-                     CALL ZDSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                     XMAX = XMAX*REC
-                  END IF
-               END IF
-*
-               CSUMJ = ZERO
-               IF( USCAL.EQ.DCMPLX( ONE ) ) THEN
-*
-*                 If the scaling needed for A in the dot product is 1,
-*                 call ZDOTC to perform the dot product.
-*
-                  IF( UPPER ) THEN
-                     JLEN = MIN( KD, J-1 )
-                     CSUMJ = ZDOTC( JLEN, AB( KD+1-JLEN, J ), 1,
-     $                       X( J-JLEN ), 1 )
-                  ELSE
-                     JLEN = MIN( KD, N-J )
-                     IF( JLEN.GT.1 )
-     $                  CSUMJ = ZDOTC( JLEN, AB( 2, J ), 1, X( J+1 ),
-     $                          1 )
-                  END IF
-               ELSE
-*
-*                 Otherwise, use in-line code for the dot product.
-*
-                  IF( UPPER ) THEN
-                     JLEN = MIN( KD, J-1 )
-                     DO 180 I = 1, JLEN
-                        CSUMJ = CSUMJ + ( DCONJG( AB( KD+I-JLEN, J ) )*
-     $                          USCAL )*X( J-JLEN-1+I )
-  180                CONTINUE
-                  ELSE
-                     JLEN = MIN( KD, N-J )
-                     DO 190 I = 1, JLEN
-                        CSUMJ = CSUMJ + ( DCONJG( AB( I+1, J ) )*USCAL )
-     $                          *X( J+I )
-  190                CONTINUE
-                  END IF
-               END IF
-*
-               IF( USCAL.EQ.DCMPLX( TSCAL ) ) THEN
-*
-*                 Compute x(j) := ( x(j) - CSUMJ ) / A(j,j) if 1/A(j,j)
-*                 was not used to scale the dotproduct.
-*
-                  X( J ) = X( J ) - CSUMJ
-                  XJ = CABS1( X( J ) )
-                  IF( NOUNIT ) THEN
-*
-*                    Compute x(j) = x(j) / A(j,j), scaling if necessary.
-*
-                     TJJS = DCONJG( AB( MAIND, J ) )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                     IF( TSCAL.EQ.ONE )
-     $                  GO TO 210
-                  END IF
-                  TJJ = CABS1( TJJS )
-                  IF( TJJ.GT.SMLNUM ) THEN
-*
-*                       abs(A(j,j)) > SMLNUM:
-*
-                     IF( TJJ.LT.ONE ) THEN
-                        IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                             Scale X by 1/abs(x(j)).
-*
-                           REC = ONE / XJ
-                           CALL ZDSCAL( N, REC, X, 1 )
-                           SCALE = SCALE*REC
-                           XMAX = XMAX*REC
-                        END IF
-                     END IF
-                     X( J ) = ZLADIV( X( J ), TJJS )
-                  ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                       0 < abs(A(j,j)) <= SMLNUM:
-*
-                     IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM.
-*
-                        REC = ( TJJ*BIGNUM ) / XJ
-                        CALL ZDSCAL( N, REC, X, 1 )
-                        SCALE = SCALE*REC
-                        XMAX = XMAX*REC
-                     END IF
-                     X( J ) = ZLADIV( X( J ), TJJS )
-                  ELSE
-*
-*                       A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                       scale = 0 and compute a solution to A**H *x = 0.
-*
-                     DO 200 I = 1, N
-                        X( I ) = ZERO
-  200                CONTINUE
-                     X( J ) = ONE
-                     SCALE = ZERO
-                     XMAX = ZERO
-                  END IF
-  210             CONTINUE
-               ELSE
-*
-*                 Compute x(j) := x(j) / A(j,j) - CSUMJ if the dot
-*                 product has already been divided by 1/A(j,j).
-*
-                  X( J ) = ZLADIV( X( J ), TJJS ) - CSUMJ
-               END IF
-               XMAX = MAX( XMAX, CABS1( X( J ) ) )
-  220       CONTINUE
-         END IF
-         SCALE = SCALE / TSCAL
-      END IF
-*
-*     Scale the column norms by 1/TSCAL for return.
-*
-      IF( TSCAL.NE.ONE ) THEN
-         CALL DSCAL( N, ONE / TSCAL, CNORM, 1 )
-      END IF
-*
-      RETURN
-*
-*     End of ZLATBS
-*
-      END
--- a/libcruft/lapack/zlatrd.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,279 +0,0 @@
-      SUBROUTINE ZLATRD( UPLO, N, NB, A, LDA, E, TAU, W, LDW )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            LDA, LDW, N, NB
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   E( * )
-      COMPLEX*16         A( LDA, * ), TAU( * ), W( LDW, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLATRD reduces NB rows and columns of a complex Hermitian matrix A to
-*  Hermitian tridiagonal form by a unitary similarity
-*  transformation Q' * A * Q, and returns the matrices V and W which are
-*  needed to apply the transformation to the unreduced part of A.
-*
-*  If UPLO = 'U', ZLATRD reduces the last NB rows and columns of a
-*  matrix, of which the upper triangle is supplied;
-*  if UPLO = 'L', ZLATRD reduces the first NB rows and columns of a
-*  matrix, of which the lower triangle is supplied.
-*
-*  This is an auxiliary routine called by ZHETRD.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          Hermitian matrix A is stored:
-*          = 'U': Upper triangular
-*          = 'L': Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.
-*
-*  NB      (input) INTEGER
-*          The number of rows and columns to be reduced.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the leading
-*          n-by-n upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n-by-n lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*          On exit:
-*          if UPLO = 'U', the last NB columns have been reduced to
-*            tridiagonal form, with the diagonal elements overwriting
-*            the diagonal elements of A; the elements above the diagonal
-*            with the array TAU, represent the unitary matrix Q as a
-*            product of elementary reflectors;
-*          if UPLO = 'L', the first NB columns have been reduced to
-*            tridiagonal form, with the diagonal elements overwriting
-*            the diagonal elements of A; the elements below the diagonal
-*            with the array TAU, represent the  unitary matrix Q as a
-*            product of elementary reflectors.
-*          See Further Details.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  E       (output) DOUBLE PRECISION array, dimension (N-1)
-*          If UPLO = 'U', E(n-nb:n-1) contains the superdiagonal
-*          elements of the last NB columns of the reduced matrix;
-*          if UPLO = 'L', E(1:nb) contains the subdiagonal elements of
-*          the first NB columns of the reduced matrix.
-*
-*  TAU     (output) COMPLEX*16 array, dimension (N-1)
-*          The scalar factors of the elementary reflectors, stored in
-*          TAU(n-nb:n-1) if UPLO = 'U', and in TAU(1:nb) if UPLO = 'L'.
-*          See Further Details.
-*
-*  W       (output) COMPLEX*16 array, dimension (LDW,NB)
-*          The n-by-nb matrix W required to update the unreduced part
-*          of A.
-*
-*  LDW     (input) INTEGER
-*          The leading dimension of the array W. LDW >= max(1,N).
-*
-*  Further Details
-*  ===============
-*
-*  If UPLO = 'U', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(n) H(n-1) . . . H(n-nb+1).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i),
-*  and tau in TAU(i-1).
-*
-*  If UPLO = 'L', the matrix Q is represented as a product of elementary
-*  reflectors
-*
-*     Q = H(1) H(2) . . . H(nb).
-*
-*  Each H(i) has the form
-*
-*     H(i) = I - tau * v * v'
-*
-*  where tau is a complex scalar, and v is a complex vector with
-*  v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i),
-*  and tau in TAU(i).
-*
-*  The elements of the vectors v together form the n-by-nb matrix V
-*  which is needed, with W, to apply the transformation to the unreduced
-*  part of the matrix, using a Hermitian rank-2k update of the form:
-*  A := A - V*W' - W*V'.
-*
-*  The contents of A on exit are illustrated by the following examples
-*  with n = 5 and nb = 2:
-*
-*  if UPLO = 'U':                       if UPLO = 'L':
-*
-*    (  a   a   a   v4  v5 )              (  d                  )
-*    (      a   a   v4  v5 )              (  1   d              )
-*    (          a   1   v5 )              (  v1  1   a          )
-*    (              d   1  )              (  v1  v2  a   a      )
-*    (                  d  )              (  v1  v2  a   a   a  )
-*
-*  where d denotes a diagonal element of the reduced matrix, a denotes
-*  an element of the original matrix that is unchanged, and vi denotes
-*  an element of the vector defining H(i).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO, ONE, HALF
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ),
-     $                   ONE = ( 1.0D+0, 0.0D+0 ),
-     $                   HALF = ( 0.5D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, IW
-      COMPLEX*16         ALPHA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZAXPY, ZGEMV, ZHEMV, ZLACGV, ZLARFG, ZSCAL
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      COMPLEX*16         ZDOTC
-      EXTERNAL           LSAME, ZDOTC
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-      IF( LSAME( UPLO, 'U' ) ) THEN
-*
-*        Reduce last NB columns of upper triangle
-*
-         DO 10 I = N, N - NB + 1, -1
-            IW = I - N + NB
-            IF( I.LT.N ) THEN
-*
-*              Update A(1:i,i)
-*
-               A( I, I ) = DBLE( A( I, I ) )
-               CALL ZLACGV( N-I, W( I, IW+1 ), LDW )
-               CALL ZGEMV( 'No transpose', I, N-I, -ONE, A( 1, I+1 ),
-     $                     LDA, W( I, IW+1 ), LDW, ONE, A( 1, I ), 1 )
-               CALL ZLACGV( N-I, W( I, IW+1 ), LDW )
-               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
-               CALL ZGEMV( 'No transpose', I, N-I, -ONE, W( 1, IW+1 ),
-     $                     LDW, A( I, I+1 ), LDA, ONE, A( 1, I ), 1 )
-               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
-               A( I, I ) = DBLE( A( I, I ) )
-            END IF
-            IF( I.GT.1 ) THEN
-*
-*              Generate elementary reflector H(i) to annihilate
-*              A(1:i-2,i)
-*
-               ALPHA = A( I-1, I )
-               CALL ZLARFG( I-1, ALPHA, A( 1, I ), 1, TAU( I-1 ) )
-               E( I-1 ) = ALPHA
-               A( I-1, I ) = ONE
-*
-*              Compute W(1:i-1,i)
-*
-               CALL ZHEMV( 'Upper', I-1, ONE, A, LDA, A( 1, I ), 1,
-     $                     ZERO, W( 1, IW ), 1 )
-               IF( I.LT.N ) THEN
-                  CALL ZGEMV( 'Conjugate transpose', I-1, N-I, ONE,
-     $                        W( 1, IW+1 ), LDW, A( 1, I ), 1, ZERO,
-     $                        W( I+1, IW ), 1 )
-                  CALL ZGEMV( 'No transpose', I-1, N-I, -ONE,
-     $                        A( 1, I+1 ), LDA, W( I+1, IW ), 1, ONE,
-     $                        W( 1, IW ), 1 )
-                  CALL ZGEMV( 'Conjugate transpose', I-1, N-I, ONE,
-     $                        A( 1, I+1 ), LDA, A( 1, I ), 1, ZERO,
-     $                        W( I+1, IW ), 1 )
-                  CALL ZGEMV( 'No transpose', I-1, N-I, -ONE,
-     $                        W( 1, IW+1 ), LDW, W( I+1, IW ), 1, ONE,
-     $                        W( 1, IW ), 1 )
-               END IF
-               CALL ZSCAL( I-1, TAU( I-1 ), W( 1, IW ), 1 )
-               ALPHA = -HALF*TAU( I-1 )*ZDOTC( I-1, W( 1, IW ), 1,
-     $                 A( 1, I ), 1 )
-               CALL ZAXPY( I-1, ALPHA, A( 1, I ), 1, W( 1, IW ), 1 )
-            END IF
-*
-   10    CONTINUE
-      ELSE
-*
-*        Reduce first NB columns of lower triangle
-*
-         DO 20 I = 1, NB
-*
-*           Update A(i:n,i)
-*
-            A( I, I ) = DBLE( A( I, I ) )
-            CALL ZLACGV( I-1, W( I, 1 ), LDW )
-            CALL ZGEMV( 'No transpose', N-I+1, I-1, -ONE, A( I, 1 ),
-     $                  LDA, W( I, 1 ), LDW, ONE, A( I, I ), 1 )
-            CALL ZLACGV( I-1, W( I, 1 ), LDW )
-            CALL ZLACGV( I-1, A( I, 1 ), LDA )
-            CALL ZGEMV( 'No transpose', N-I+1, I-1, -ONE, W( I, 1 ),
-     $                  LDW, A( I, 1 ), LDA, ONE, A( I, I ), 1 )
-            CALL ZLACGV( I-1, A( I, 1 ), LDA )
-            A( I, I ) = DBLE( A( I, I ) )
-            IF( I.LT.N ) THEN
-*
-*              Generate elementary reflector H(i) to annihilate
-*              A(i+2:n,i)
-*
-               ALPHA = A( I+1, I )
-               CALL ZLARFG( N-I, ALPHA, A( MIN( I+2, N ), I ), 1,
-     $                      TAU( I ) )
-               E( I ) = ALPHA
-               A( I+1, I ) = ONE
-*
-*              Compute W(i+1:n,i)
-*
-               CALL ZHEMV( 'Lower', N-I, ONE, A( I+1, I+1 ), LDA,
-     $                     A( I+1, I ), 1, ZERO, W( I+1, I ), 1 )
-               CALL ZGEMV( 'Conjugate transpose', N-I, I-1, ONE,
-     $                     W( I+1, 1 ), LDW, A( I+1, I ), 1, ZERO,
-     $                     W( 1, I ), 1 )
-               CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, A( I+1, 1 ),
-     $                     LDA, W( 1, I ), 1, ONE, W( I+1, I ), 1 )
-               CALL ZGEMV( 'Conjugate transpose', N-I, I-1, ONE,
-     $                     A( I+1, 1 ), LDA, A( I+1, I ), 1, ZERO,
-     $                     W( 1, I ), 1 )
-               CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, W( I+1, 1 ),
-     $                     LDW, W( 1, I ), 1, ONE, W( I+1, I ), 1 )
-               CALL ZSCAL( N-I, TAU( I ), W( I+1, I ), 1 )
-               ALPHA = -HALF*TAU( I )*ZDOTC( N-I, W( I+1, I ), 1,
-     $                 A( I+1, I ), 1 )
-               CALL ZAXPY( N-I, ALPHA, A( I+1, I ), 1, W( I+1, I ), 1 )
-            END IF
-*
-   20    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of ZLATRD
-*
-      END
--- a/libcruft/lapack/zlatrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,879 +0,0 @@
-      SUBROUTINE ZLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
-     $                   CNORM, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, NORMIN, TRANS, UPLO
-      INTEGER            INFO, LDA, N
-      DOUBLE PRECISION   SCALE
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   CNORM( * )
-      COMPLEX*16         A( LDA, * ), X( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLATRS solves one of the triangular systems
-*
-*     A * x = s*b,  A**T * x = s*b,  or  A**H * x = s*b,
-*
-*  with scaling to prevent overflow.  Here A is an upper or lower
-*  triangular matrix, A**T denotes the transpose of A, A**H denotes the
-*  conjugate transpose of A, x and b are n-element vectors, and s is a
-*  scaling factor, usually less than or equal to 1, chosen so that the
-*  components of x will be less than the overflow threshold.  If the
-*  unscaled problem will not cause overflow, the Level 2 BLAS routine
-*  ZTRSV is called. If the matrix A is singular (A(j,j) = 0 for some j),
-*  then s is set to 0 and a non-trivial solution to A*x = 0 is returned.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the matrix A is upper or lower triangular.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the operation applied to A.
-*          = 'N':  Solve A * x = s*b     (No transpose)
-*          = 'T':  Solve A**T * x = s*b  (Transpose)
-*          = 'C':  Solve A**H * x = s*b  (Conjugate transpose)
-*
-*  DIAG    (input) CHARACTER*1
-*          Specifies whether or not the matrix A is unit triangular.
-*          = 'N':  Non-unit triangular
-*          = 'U':  Unit triangular
-*
-*  NORMIN  (input) CHARACTER*1
-*          Specifies whether CNORM has been set or not.
-*          = 'Y':  CNORM contains the column norms on entry
-*          = 'N':  CNORM is not set on entry.  On exit, the norms will
-*                  be computed and stored in CNORM.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input) COMPLEX*16 array, dimension (LDA,N)
-*          The triangular matrix A.  If UPLO = 'U', the leading n by n
-*          upper triangular part of the array A contains the upper
-*          triangular matrix, and the strictly lower triangular part of
-*          A is not referenced.  If UPLO = 'L', the leading n by n lower
-*          triangular part of the array A contains the lower triangular
-*          matrix, and the strictly upper triangular part of A is not
-*          referenced.  If DIAG = 'U', the diagonal elements of A are
-*          also not referenced and are assumed to be 1.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max (1,N).
-*
-*  X       (input/output) COMPLEX*16 array, dimension (N)
-*          On entry, the right hand side b of the triangular system.
-*          On exit, X is overwritten by the solution vector x.
-*
-*  SCALE   (output) DOUBLE PRECISION
-*          The scaling factor s for the triangular system
-*             A * x = s*b,  A**T * x = s*b,  or  A**H * x = s*b.
-*          If SCALE = 0, the matrix A is singular or badly scaled, and
-*          the vector x is an exact or approximate solution to A*x = 0.
-*
-*  CNORM   (input or output) DOUBLE PRECISION array, dimension (N)
-*
-*          If NORMIN = 'Y', CNORM is an input argument and CNORM(j)
-*          contains the norm of the off-diagonal part of the j-th column
-*          of A.  If TRANS = 'N', CNORM(j) must be greater than or equal
-*          to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j)
-*          must be greater than or equal to the 1-norm.
-*
-*          If NORMIN = 'N', CNORM is an output argument and CNORM(j)
-*          returns the 1-norm of the offdiagonal part of the j-th column
-*          of A.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -k, the k-th argument had an illegal value
-*
-*  Further Details
-*  ======= =======
-*
-*  A rough bound on x is computed; if that is less than overflow, ZTRSV
-*  is called, otherwise, specific code is used which checks for possible
-*  overflow or divide-by-zero at every operation.
-*
-*  A columnwise scheme is used for solving A*x = b.  The basic algorithm
-*  if A is lower triangular is
-*
-*       x[1:n] := b[1:n]
-*       for j = 1, ..., n
-*            x(j) := x(j) / A(j,j)
-*            x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j]
-*       end
-*
-*  Define bounds on the components of x after j iterations of the loop:
-*     M(j) = bound on x[1:j]
-*     G(j) = bound on x[j+1:n]
-*  Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}.
-*
-*  Then for iteration j+1 we have
-*     M(j+1) <= G(j) / | A(j+1,j+1) |
-*     G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] |
-*            <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | )
-*
-*  where CNORM(j+1) is greater than or equal to the infinity-norm of
-*  column j+1 of A, not counting the diagonal.  Hence
-*
-*     G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | )
-*                  1<=i<=j
-*  and
-*
-*     |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| )
-*                                   1<=i< j
-*
-*  Since |x(j)| <= M(j), we use the Level 2 BLAS routine ZTRSV if the
-*  reciprocal of the largest M(j), j=1,..,n, is larger than
-*  max(underflow, 1/overflow).
-*
-*  The bound on x(j) is also used to determine when a step in the
-*  columnwise method can be performed without fear of overflow.  If
-*  the computed bound is greater than a large constant, x is scaled to
-*  prevent overflow, but if the bound overflows, x is set to 0, x(j) to
-*  1, and scale to 0, and a non-trivial solution to A*x = 0 is found.
-*
-*  Similarly, a row-wise scheme is used to solve A**T *x = b  or
-*  A**H *x = b.  The basic algorithm for A upper triangular is
-*
-*       for j = 1, ..., n
-*            x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j)
-*       end
-*
-*  We simultaneously compute two bounds
-*       G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j
-*       M(j) = bound on x(i), 1<=i<=j
-*
-*  The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we
-*  add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1.
-*  Then the bound on x(j) is
-*
-*       M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) |
-*
-*            <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| )
-*                      1<=i<=j
-*
-*  and we can safely call ZTRSV if 1/M(n) and 1/G(n) are both greater
-*  than max(underflow, 1/overflow).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, HALF, ONE, TWO
-      PARAMETER          ( ZERO = 0.0D+0, HALF = 0.5D+0, ONE = 1.0D+0,
-     $                   TWO = 2.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOTRAN, NOUNIT, UPPER
-      INTEGER            I, IMAX, J, JFIRST, JINC, JLAST
-      DOUBLE PRECISION   BIGNUM, GROW, REC, SMLNUM, TJJ, TMAX, TSCAL,
-     $                   XBND, XJ, XMAX
-      COMPLEX*16         CSUMJ, TJJS, USCAL, ZDUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IDAMAX, IZAMAX
-      DOUBLE PRECISION   DLAMCH, DZASUM
-      COMPLEX*16         ZDOTC, ZDOTU, ZLADIV
-      EXTERNAL           LSAME, IDAMAX, IZAMAX, DLAMCH, DZASUM, ZDOTC,
-     $                   ZDOTU, ZLADIV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DSCAL, XERBLA, ZAXPY, ZDSCAL, ZTRSV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, DIMAG, MAX, MIN
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1, CABS2
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
-      CABS2( ZDUM ) = ABS( DBLE( ZDUM ) / 2.D0 ) +
-     $                ABS( DIMAG( ZDUM ) / 2.D0 )
-*     ..
-*     .. Executable Statements ..
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      NOUNIT = LSAME( DIAG, 'N' )
-*
-*     Test the input parameters.
-*
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
-     $         LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -3
-      ELSE IF( .NOT.LSAME( NORMIN, 'Y' ) .AND. .NOT.
-     $         LSAME( NORMIN, 'N' ) ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZLATRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine machine dependent parameters to control overflow.
-*
-      SMLNUM = DLAMCH( 'Safe minimum' )
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SMLNUM / DLAMCH( 'Precision' )
-      BIGNUM = ONE / SMLNUM
-      SCALE = ONE
-*
-      IF( LSAME( NORMIN, 'N' ) ) THEN
-*
-*        Compute the 1-norm of each column, not including the diagonal.
-*
-         IF( UPPER ) THEN
-*
-*           A is upper triangular.
-*
-            DO 10 J = 1, N
-               CNORM( J ) = DZASUM( J-1, A( 1, J ), 1 )
-   10       CONTINUE
-         ELSE
-*
-*           A is lower triangular.
-*
-            DO 20 J = 1, N - 1
-               CNORM( J ) = DZASUM( N-J, A( J+1, J ), 1 )
-   20       CONTINUE
-            CNORM( N ) = ZERO
-         END IF
-      END IF
-*
-*     Scale the column norms by TSCAL if the maximum element in CNORM is
-*     greater than BIGNUM/2.
-*
-      IMAX = IDAMAX( N, CNORM, 1 )
-      TMAX = CNORM( IMAX )
-      IF( TMAX.LE.BIGNUM*HALF ) THEN
-         TSCAL = ONE
-      ELSE
-         TSCAL = HALF / ( SMLNUM*TMAX )
-         CALL DSCAL( N, TSCAL, CNORM, 1 )
-      END IF
-*
-*     Compute a bound on the computed solution vector to see if the
-*     Level 2 BLAS routine ZTRSV can be used.
-*
-      XMAX = ZERO
-      DO 30 J = 1, N
-         XMAX = MAX( XMAX, CABS2( X( J ) ) )
-   30 CONTINUE
-      XBND = XMAX
-*
-      IF( NOTRAN ) THEN
-*
-*        Compute the growth in A * x = b.
-*
-         IF( UPPER ) THEN
-            JFIRST = N
-            JLAST = 1
-            JINC = -1
-         ELSE
-            JFIRST = 1
-            JLAST = N
-            JINC = 1
-         END IF
-*
-         IF( TSCAL.NE.ONE ) THEN
-            GROW = ZERO
-            GO TO 60
-         END IF
-*
-         IF( NOUNIT ) THEN
-*
-*           A is non-unit triangular.
-*
-*           Compute GROW = 1/G(j) and XBND = 1/M(j).
-*           Initially, G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = HALF / MAX( XBND, SMLNUM )
-            XBND = GROW
-            DO 40 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 60
-*
-               TJJS = A( J, J )
-               TJJ = CABS1( TJJS )
-*
-               IF( TJJ.GE.SMLNUM ) THEN
-*
-*                 M(j) = G(j-1) / abs(A(j,j))
-*
-                  XBND = MIN( XBND, MIN( ONE, TJJ )*GROW )
-               ELSE
-*
-*                 M(j) could overflow, set XBND to 0.
-*
-                  XBND = ZERO
-               END IF
-*
-               IF( TJJ+CNORM( J ).GE.SMLNUM ) THEN
-*
-*                 G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) )
-*
-                  GROW = GROW*( TJJ / ( TJJ+CNORM( J ) ) )
-               ELSE
-*
-*                 G(j) could overflow, set GROW to 0.
-*
-                  GROW = ZERO
-               END IF
-   40       CONTINUE
-            GROW = XBND
-         ELSE
-*
-*           A is unit triangular.
-*
-*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = MIN( ONE, HALF / MAX( XBND, SMLNUM ) )
-            DO 50 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 60
-*
-*              G(j) = G(j-1)*( 1 + CNORM(j) )
-*
-               GROW = GROW*( ONE / ( ONE+CNORM( J ) ) )
-   50       CONTINUE
-         END IF
-   60    CONTINUE
-*
-      ELSE
-*
-*        Compute the growth in A**T * x = b  or  A**H * x = b.
-*
-         IF( UPPER ) THEN
-            JFIRST = 1
-            JLAST = N
-            JINC = 1
-         ELSE
-            JFIRST = N
-            JLAST = 1
-            JINC = -1
-         END IF
-*
-         IF( TSCAL.NE.ONE ) THEN
-            GROW = ZERO
-            GO TO 90
-         END IF
-*
-         IF( NOUNIT ) THEN
-*
-*           A is non-unit triangular.
-*
-*           Compute GROW = 1/G(j) and XBND = 1/M(j).
-*           Initially, M(0) = max{x(i), i=1,...,n}.
-*
-            GROW = HALF / MAX( XBND, SMLNUM )
-            XBND = GROW
-            DO 70 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 90
-*
-*              G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) )
-*
-               XJ = ONE + CNORM( J )
-               GROW = MIN( GROW, XBND / XJ )
-*
-               TJJS = A( J, J )
-               TJJ = CABS1( TJJS )
-*
-               IF( TJJ.GE.SMLNUM ) THEN
-*
-*                 M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j))
-*
-                  IF( XJ.GT.TJJ )
-     $               XBND = XBND*( TJJ / XJ )
-               ELSE
-*
-*                 M(j) could overflow, set XBND to 0.
-*
-                  XBND = ZERO
-               END IF
-   70       CONTINUE
-            GROW = MIN( GROW, XBND )
-         ELSE
-*
-*           A is unit triangular.
-*
-*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
-*
-            GROW = MIN( ONE, HALF / MAX( XBND, SMLNUM ) )
-            DO 80 J = JFIRST, JLAST, JINC
-*
-*              Exit the loop if the growth factor is too small.
-*
-               IF( GROW.LE.SMLNUM )
-     $            GO TO 90
-*
-*              G(j) = ( 1 + CNORM(j) )*G(j-1)
-*
-               XJ = ONE + CNORM( J )
-               GROW = GROW / XJ
-   80       CONTINUE
-         END IF
-   90    CONTINUE
-      END IF
-*
-      IF( ( GROW*TSCAL ).GT.SMLNUM ) THEN
-*
-*        Use the Level 2 BLAS solve if the reciprocal of the bound on
-*        elements of X is not too small.
-*
-         CALL ZTRSV( UPLO, TRANS, DIAG, N, A, LDA, X, 1 )
-      ELSE
-*
-*        Use a Level 1 BLAS solve, scaling intermediate results.
-*
-         IF( XMAX.GT.BIGNUM*HALF ) THEN
-*
-*           Scale X so that its components are less than or equal to
-*           BIGNUM in absolute value.
-*
-            SCALE = ( BIGNUM*HALF ) / XMAX
-            CALL ZDSCAL( N, SCALE, X, 1 )
-            XMAX = BIGNUM
-         ELSE
-            XMAX = XMAX*TWO
-         END IF
-*
-         IF( NOTRAN ) THEN
-*
-*           Solve A * x = b
-*
-            DO 120 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) / A(j,j), scaling x if necessary.
-*
-               XJ = CABS1( X( J ) )
-               IF( NOUNIT ) THEN
-                  TJJS = A( J, J )*TSCAL
-               ELSE
-                  TJJS = TSCAL
-                  IF( TSCAL.EQ.ONE )
-     $               GO TO 110
-               END IF
-               TJJ = CABS1( TJJS )
-               IF( TJJ.GT.SMLNUM ) THEN
-*
-*                    abs(A(j,j)) > SMLNUM:
-*
-                  IF( TJJ.LT.ONE ) THEN
-                     IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by 1/b(j).
-*
-                        REC = ONE / XJ
-                        CALL ZDSCAL( N, REC, X, 1 )
-                        SCALE = SCALE*REC
-                        XMAX = XMAX*REC
-                     END IF
-                  END IF
-                  X( J ) = ZLADIV( X( J ), TJJS )
-                  XJ = CABS1( X( J ) )
-               ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                    0 < abs(A(j,j)) <= SMLNUM:
-*
-                  IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                       Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM
-*                       to avoid overflow when dividing by A(j,j).
-*
-                     REC = ( TJJ*BIGNUM ) / XJ
-                     IF( CNORM( J ).GT.ONE ) THEN
-*
-*                          Scale by 1/CNORM(j) to avoid overflow when
-*                          multiplying x(j) times column j.
-*
-                        REC = REC / CNORM( J )
-                     END IF
-                     CALL ZDSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                     XMAX = XMAX*REC
-                  END IF
-                  X( J ) = ZLADIV( X( J ), TJJS )
-                  XJ = CABS1( X( J ) )
-               ELSE
-*
-*                    A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                    scale = 0, and compute a solution to A*x = 0.
-*
-                  DO 100 I = 1, N
-                     X( I ) = ZERO
-  100             CONTINUE
-                  X( J ) = ONE
-                  XJ = ONE
-                  SCALE = ZERO
-                  XMAX = ZERO
-               END IF
-  110          CONTINUE
-*
-*              Scale x if necessary to avoid overflow when adding a
-*              multiple of column j of A.
-*
-               IF( XJ.GT.ONE ) THEN
-                  REC = ONE / XJ
-                  IF( CNORM( J ).GT.( BIGNUM-XMAX )*REC ) THEN
-*
-*                    Scale x by 1/(2*abs(x(j))).
-*
-                     REC = REC*HALF
-                     CALL ZDSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                  END IF
-               ELSE IF( XJ*CNORM( J ).GT.( BIGNUM-XMAX ) ) THEN
-*
-*                 Scale x by 1/2.
-*
-                  CALL ZDSCAL( N, HALF, X, 1 )
-                  SCALE = SCALE*HALF
-               END IF
-*
-               IF( UPPER ) THEN
-                  IF( J.GT.1 ) THEN
-*
-*                    Compute the update
-*                       x(1:j-1) := x(1:j-1) - x(j) * A(1:j-1,j)
-*
-                     CALL ZAXPY( J-1, -X( J )*TSCAL, A( 1, J ), 1, X,
-     $                           1 )
-                     I = IZAMAX( J-1, X, 1 )
-                     XMAX = CABS1( X( I ) )
-                  END IF
-               ELSE
-                  IF( J.LT.N ) THEN
-*
-*                    Compute the update
-*                       x(j+1:n) := x(j+1:n) - x(j) * A(j+1:n,j)
-*
-                     CALL ZAXPY( N-J, -X( J )*TSCAL, A( J+1, J ), 1,
-     $                           X( J+1 ), 1 )
-                     I = J + IZAMAX( N-J, X( J+1 ), 1 )
-                     XMAX = CABS1( X( I ) )
-                  END IF
-               END IF
-  120       CONTINUE
-*
-         ELSE IF( LSAME( TRANS, 'T' ) ) THEN
-*
-*           Solve A**T * x = b
-*
-            DO 170 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) - sum A(k,j)*x(k).
-*                                    k<>j
-*
-               XJ = CABS1( X( J ) )
-               USCAL = TSCAL
-               REC = ONE / MAX( XMAX, ONE )
-               IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN
-*
-*                 If x(j) could overflow, scale x by 1/(2*XMAX).
-*
-                  REC = REC*HALF
-                  IF( NOUNIT ) THEN
-                     TJJS = A( J, J )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                  END IF
-                  TJJ = CABS1( TJJS )
-                  IF( TJJ.GT.ONE ) THEN
-*
-*                       Divide by A(j,j) when scaling x if A(j,j) > 1.
-*
-                     REC = MIN( ONE, REC*TJJ )
-                     USCAL = ZLADIV( USCAL, TJJS )
-                  END IF
-                  IF( REC.LT.ONE ) THEN
-                     CALL ZDSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                     XMAX = XMAX*REC
-                  END IF
-               END IF
-*
-               CSUMJ = ZERO
-               IF( USCAL.EQ.DCMPLX( ONE ) ) THEN
-*
-*                 If the scaling needed for A in the dot product is 1,
-*                 call ZDOTU to perform the dot product.
-*
-                  IF( UPPER ) THEN
-                     CSUMJ = ZDOTU( J-1, A( 1, J ), 1, X, 1 )
-                  ELSE IF( J.LT.N ) THEN
-                     CSUMJ = ZDOTU( N-J, A( J+1, J ), 1, X( J+1 ), 1 )
-                  END IF
-               ELSE
-*
-*                 Otherwise, use in-line code for the dot product.
-*
-                  IF( UPPER ) THEN
-                     DO 130 I = 1, J - 1
-                        CSUMJ = CSUMJ + ( A( I, J )*USCAL )*X( I )
-  130                CONTINUE
-                  ELSE IF( J.LT.N ) THEN
-                     DO 140 I = J + 1, N
-                        CSUMJ = CSUMJ + ( A( I, J )*USCAL )*X( I )
-  140                CONTINUE
-                  END IF
-               END IF
-*
-               IF( USCAL.EQ.DCMPLX( TSCAL ) ) THEN
-*
-*                 Compute x(j) := ( x(j) - CSUMJ ) / A(j,j) if 1/A(j,j)
-*                 was not used to scale the dotproduct.
-*
-                  X( J ) = X( J ) - CSUMJ
-                  XJ = CABS1( X( J ) )
-                  IF( NOUNIT ) THEN
-                     TJJS = A( J, J )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                     IF( TSCAL.EQ.ONE )
-     $                  GO TO 160
-                  END IF
-*
-*                    Compute x(j) = x(j) / A(j,j), scaling if necessary.
-*
-                  TJJ = CABS1( TJJS )
-                  IF( TJJ.GT.SMLNUM ) THEN
-*
-*                       abs(A(j,j)) > SMLNUM:
-*
-                     IF( TJJ.LT.ONE ) THEN
-                        IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                             Scale X by 1/abs(x(j)).
-*
-                           REC = ONE / XJ
-                           CALL ZDSCAL( N, REC, X, 1 )
-                           SCALE = SCALE*REC
-                           XMAX = XMAX*REC
-                        END IF
-                     END IF
-                     X( J ) = ZLADIV( X( J ), TJJS )
-                  ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                       0 < abs(A(j,j)) <= SMLNUM:
-*
-                     IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM.
-*
-                        REC = ( TJJ*BIGNUM ) / XJ
-                        CALL ZDSCAL( N, REC, X, 1 )
-                        SCALE = SCALE*REC
-                        XMAX = XMAX*REC
-                     END IF
-                     X( J ) = ZLADIV( X( J ), TJJS )
-                  ELSE
-*
-*                       A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                       scale = 0 and compute a solution to A**T *x = 0.
-*
-                     DO 150 I = 1, N
-                        X( I ) = ZERO
-  150                CONTINUE
-                     X( J ) = ONE
-                     SCALE = ZERO
-                     XMAX = ZERO
-                  END IF
-  160             CONTINUE
-               ELSE
-*
-*                 Compute x(j) := x(j) / A(j,j) - CSUMJ if the dot
-*                 product has already been divided by 1/A(j,j).
-*
-                  X( J ) = ZLADIV( X( J ), TJJS ) - CSUMJ
-               END IF
-               XMAX = MAX( XMAX, CABS1( X( J ) ) )
-  170       CONTINUE
-*
-         ELSE
-*
-*           Solve A**H * x = b
-*
-            DO 220 J = JFIRST, JLAST, JINC
-*
-*              Compute x(j) = b(j) - sum A(k,j)*x(k).
-*                                    k<>j
-*
-               XJ = CABS1( X( J ) )
-               USCAL = TSCAL
-               REC = ONE / MAX( XMAX, ONE )
-               IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN
-*
-*                 If x(j) could overflow, scale x by 1/(2*XMAX).
-*
-                  REC = REC*HALF
-                  IF( NOUNIT ) THEN
-                     TJJS = DCONJG( A( J, J ) )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                  END IF
-                  TJJ = CABS1( TJJS )
-                  IF( TJJ.GT.ONE ) THEN
-*
-*                       Divide by A(j,j) when scaling x if A(j,j) > 1.
-*
-                     REC = MIN( ONE, REC*TJJ )
-                     USCAL = ZLADIV( USCAL, TJJS )
-                  END IF
-                  IF( REC.LT.ONE ) THEN
-                     CALL ZDSCAL( N, REC, X, 1 )
-                     SCALE = SCALE*REC
-                     XMAX = XMAX*REC
-                  END IF
-               END IF
-*
-               CSUMJ = ZERO
-               IF( USCAL.EQ.DCMPLX( ONE ) ) THEN
-*
-*                 If the scaling needed for A in the dot product is 1,
-*                 call ZDOTC to perform the dot product.
-*
-                  IF( UPPER ) THEN
-                     CSUMJ = ZDOTC( J-1, A( 1, J ), 1, X, 1 )
-                  ELSE IF( J.LT.N ) THEN
-                     CSUMJ = ZDOTC( N-J, A( J+1, J ), 1, X( J+1 ), 1 )
-                  END IF
-               ELSE
-*
-*                 Otherwise, use in-line code for the dot product.
-*
-                  IF( UPPER ) THEN
-                     DO 180 I = 1, J - 1
-                        CSUMJ = CSUMJ + ( DCONJG( A( I, J ) )*USCAL )*
-     $                          X( I )
-  180                CONTINUE
-                  ELSE IF( J.LT.N ) THEN
-                     DO 190 I = J + 1, N
-                        CSUMJ = CSUMJ + ( DCONJG( A( I, J ) )*USCAL )*
-     $                          X( I )
-  190                CONTINUE
-                  END IF
-               END IF
-*
-               IF( USCAL.EQ.DCMPLX( TSCAL ) ) THEN
-*
-*                 Compute x(j) := ( x(j) - CSUMJ ) / A(j,j) if 1/A(j,j)
-*                 was not used to scale the dotproduct.
-*
-                  X( J ) = X( J ) - CSUMJ
-                  XJ = CABS1( X( J ) )
-                  IF( NOUNIT ) THEN
-                     TJJS = DCONJG( A( J, J ) )*TSCAL
-                  ELSE
-                     TJJS = TSCAL
-                     IF( TSCAL.EQ.ONE )
-     $                  GO TO 210
-                  END IF
-*
-*                    Compute x(j) = x(j) / A(j,j), scaling if necessary.
-*
-                  TJJ = CABS1( TJJS )
-                  IF( TJJ.GT.SMLNUM ) THEN
-*
-*                       abs(A(j,j)) > SMLNUM:
-*
-                     IF( TJJ.LT.ONE ) THEN
-                        IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                             Scale X by 1/abs(x(j)).
-*
-                           REC = ONE / XJ
-                           CALL ZDSCAL( N, REC, X, 1 )
-                           SCALE = SCALE*REC
-                           XMAX = XMAX*REC
-                        END IF
-                     END IF
-                     X( J ) = ZLADIV( X( J ), TJJS )
-                  ELSE IF( TJJ.GT.ZERO ) THEN
-*
-*                       0 < abs(A(j,j)) <= SMLNUM:
-*
-                     IF( XJ.GT.TJJ*BIGNUM ) THEN
-*
-*                          Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM.
-*
-                        REC = ( TJJ*BIGNUM ) / XJ
-                        CALL ZDSCAL( N, REC, X, 1 )
-                        SCALE = SCALE*REC
-                        XMAX = XMAX*REC
-                     END IF
-                     X( J ) = ZLADIV( X( J ), TJJS )
-                  ELSE
-*
-*                       A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
-*                       scale = 0 and compute a solution to A**H *x = 0.
-*
-                     DO 200 I = 1, N
-                        X( I ) = ZERO
-  200                CONTINUE
-                     X( J ) = ONE
-                     SCALE = ZERO
-                     XMAX = ZERO
-                  END IF
-  210             CONTINUE
-               ELSE
-*
-*                 Compute x(j) := x(j) / A(j,j) - CSUMJ if the dot
-*                 product has already been divided by 1/A(j,j).
-*
-                  X( J ) = ZLADIV( X( J ), TJJS ) - CSUMJ
-               END IF
-               XMAX = MAX( XMAX, CABS1( X( J ) ) )
-  220       CONTINUE
-         END IF
-         SCALE = SCALE / TSCAL
-      END IF
-*
-*     Scale the column norms by 1/TSCAL for return.
-*
-      IF( TSCAL.NE.ONE ) THEN
-         CALL DSCAL( N, ONE / TSCAL, CNORM, 1 )
-      END IF
-*
-      RETURN
-*
-*     End of ZLATRS
-*
-      END
--- a/libcruft/lapack/zlatrz.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,133 +0,0 @@
-      SUBROUTINE ZLATRZ( M, N, L, A, LDA, TAU, WORK )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            L, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLATRZ factors the M-by-(M+L) complex upper trapezoidal matrix
-*  [ A1 A2 ] = [ A(1:M,1:M) A(1:M,N-L+1:N) ] as ( R  0 ) * Z by means
-*  of unitary transformations, where  Z is an (M+L)-by-(M+L) unitary
-*  matrix and, R and A1 are M-by-M upper triangular matrices.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= 0.
-*
-*  L       (input) INTEGER
-*          The number of columns of the matrix A containing the
-*          meaningful part of the Householder vectors. N-M >= L >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the leading M-by-N upper trapezoidal part of the
-*          array A must contain the matrix to be factorized.
-*          On exit, the leading M-by-M upper triangular part of A
-*          contains the upper triangular matrix R, and elements N-L+1 to
-*          N of the first M rows of A, with the array TAU, represent the
-*          unitary matrix Z as a product of M elementary reflectors.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) COMPLEX*16 array, dimension (M)
-*          The scalar factors of the elementary reflectors.
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (M)
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  The factorization is obtained by Householder's method.  The kth
-*  transformation matrix, Z( k ), which is used to introduce zeros into
-*  the ( m - k + 1 )th row of A, is given in the form
-*
-*     Z( k ) = ( I     0   ),
-*              ( 0  T( k ) )
-*
-*  where
-*
-*     T( k ) = I - tau*u( k )*u( k )',   u( k ) = (   1    ),
-*                                                 (   0    )
-*                                                 ( z( k ) )
-*
-*  tau is a scalar and z( k ) is an l element vector. tau and z( k )
-*  are chosen to annihilate the elements of the kth row of A2.
-*
-*  The scalar tau is returned in the kth element of TAU and the vector
-*  u( k ) in the kth row of A2, such that the elements of z( k ) are
-*  in  a( k, l + 1 ), ..., a( k, n ). The elements of R are returned in
-*  the upper triangular part of A1.
-*
-*  Z is given by
-*
-*     Z =  Z( 1 ) * Z( 2 ) * ... * Z( m ).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I
-      COMPLEX*16         ALPHA
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZLACGV, ZLARFG, ZLARZ
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 ) THEN
-         RETURN
-      ELSE IF( M.EQ.N ) THEN
-         DO 10 I = 1, N
-            TAU( I ) = ZERO
-   10    CONTINUE
-         RETURN
-      END IF
-*
-      DO 20 I = M, 1, -1
-*
-*        Generate elementary reflector H(i) to annihilate
-*        [ A(i,i) A(i,n-l+1:n) ]
-*
-         CALL ZLACGV( L, A( I, N-L+1 ), LDA )
-         ALPHA = DCONJG( A( I, I ) )
-         CALL ZLARFG( L+1, ALPHA, A( I, N-L+1 ), LDA, TAU( I ) )
-         TAU( I ) = DCONJG( TAU( I ) )
-*
-*        Apply H(i) to A(1:i-1,i:n) from the right
-*
-         CALL ZLARZ( 'Right', I-1, N-I+1, L, A( I, N-L+1 ), LDA,
-     $               DCONJG( TAU( I ) ), A( 1, I ), LDA, WORK )
-         A( I, I ) = DCONJG( ALPHA )
-*
-   20 CONTINUE
-*
-      RETURN
-*
-*     End of ZLATRZ
-*
-      END
--- a/libcruft/lapack/zlauu2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,143 +0,0 @@
-      SUBROUTINE ZLAUU2( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLAUU2 computes the product U * U' or L' * L, where the triangular
-*  factor U or L is stored in the upper or lower triangular part of
-*  the array A.
-*
-*  If UPLO = 'U' or 'u' then the upper triangle of the result is stored,
-*  overwriting the factor U in A.
-*  If UPLO = 'L' or 'l' then the lower triangle of the result is stored,
-*  overwriting the factor L in A.
-*
-*  This is the unblocked form of the algorithm, calling Level 2 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the triangular factor stored in the array A
-*          is upper or lower triangular:
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the triangular factor U or L.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the triangular factor U or L.
-*          On exit, if UPLO = 'U', the upper triangle of A is
-*          overwritten with the upper triangle of the product U * U';
-*          if UPLO = 'L', the lower triangle of A is overwritten with
-*          the lower triangle of the product L' * L.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            I
-      DOUBLE PRECISION   AII
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      COMPLEX*16         ZDOTC
-      EXTERNAL           LSAME, ZDOTC
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZDSCAL, ZGEMV, ZLACGV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, DCMPLX, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZLAUU2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Compute the product U * U'.
-*
-         DO 10 I = 1, N
-            AII = A( I, I )
-            IF( I.LT.N ) THEN
-               A( I, I ) = AII*AII + DBLE( ZDOTC( N-I, A( I, I+1 ), LDA,
-     $                     A( I, I+1 ), LDA ) )
-               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
-               CALL ZGEMV( 'No transpose', I-1, N-I, ONE, A( 1, I+1 ),
-     $                     LDA, A( I, I+1 ), LDA, DCMPLX( AII ),
-     $                     A( 1, I ), 1 )
-               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
-            ELSE
-               CALL ZDSCAL( I, AII, A( 1, I ), 1 )
-            END IF
-   10    CONTINUE
-*
-      ELSE
-*
-*        Compute the product L' * L.
-*
-         DO 20 I = 1, N
-            AII = A( I, I )
-            IF( I.LT.N ) THEN
-               A( I, I ) = AII*AII + DBLE( ZDOTC( N-I, A( I+1, I ), 1,
-     $                     A( I+1, I ), 1 ) )
-               CALL ZLACGV( I-1, A( I, 1 ), LDA )
-               CALL ZGEMV( 'Conjugate transpose', N-I, I-1, ONE,
-     $                     A( I+1, 1 ), LDA, A( I+1, I ), 1,
-     $                     DCMPLX( AII ), A( I, 1 ), LDA )
-               CALL ZLACGV( I-1, A( I, 1 ), LDA )
-            ELSE
-               CALL ZDSCAL( I, AII, A( I, 1 ), LDA )
-            END IF
-   20    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of ZLAUU2
-*
-      END
--- a/libcruft/lapack/zlauum.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,160 +0,0 @@
-      SUBROUTINE ZLAUUM( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZLAUUM computes the product U * U' or L' * L, where the triangular
-*  factor U or L is stored in the upper or lower triangular part of
-*  the array A.
-*
-*  If UPLO = 'U' or 'u' then the upper triangle of the result is stored,
-*  overwriting the factor U in A.
-*  If UPLO = 'L' or 'l' then the lower triangle of the result is stored,
-*  overwriting the factor L in A.
-*
-*  This is the blocked form of the algorithm, calling Level 3 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the triangular factor stored in the array A
-*          is upper or lower triangular:
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the triangular factor U or L.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the triangular factor U or L.
-*          On exit, if UPLO = 'U', the upper triangle of A is
-*          overwritten with the upper triangle of the product U * U';
-*          if UPLO = 'L', the lower triangle of A is overwritten with
-*          the lower triangle of the product L' * L.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-      COMPLEX*16         CONE
-      PARAMETER          ( CONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            I, IB, NB
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZGEMM, ZHERK, ZLAUU2, ZTRMM
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZLAUUM', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'ZLAUUM', UPLO, N, -1, -1, -1 )
-*
-      IF( NB.LE.1 .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code
-*
-         CALL ZLAUU2( UPLO, N, A, LDA, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( UPPER ) THEN
-*
-*           Compute the product U * U'.
-*
-            DO 10 I = 1, N, NB
-               IB = MIN( NB, N-I+1 )
-               CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose',
-     $                     'Non-unit', I-1, IB, CONE, A( I, I ), LDA,
-     $                     A( 1, I ), LDA )
-               CALL ZLAUU2( 'Upper', IB, A( I, I ), LDA, INFO )
-               IF( I+IB.LE.N ) THEN
-                  CALL ZGEMM( 'No transpose', 'Conjugate transpose',
-     $                        I-1, IB, N-I-IB+1, CONE, A( 1, I+IB ),
-     $                        LDA, A( I, I+IB ), LDA, CONE, A( 1, I ),
-     $                        LDA )
-                  CALL ZHERK( 'Upper', 'No transpose', IB, N-I-IB+1,
-     $                        ONE, A( I, I+IB ), LDA, ONE, A( I, I ),
-     $                        LDA )
-               END IF
-   10       CONTINUE
-         ELSE
-*
-*           Compute the product L' * L.
-*
-            DO 20 I = 1, N, NB
-               IB = MIN( NB, N-I+1 )
-               CALL ZTRMM( 'Left', 'Lower', 'Conjugate transpose',
-     $                     'Non-unit', IB, I-1, CONE, A( I, I ), LDA,
-     $                     A( I, 1 ), LDA )
-               CALL ZLAUU2( 'Lower', IB, A( I, I ), LDA, INFO )
-               IF( I+IB.LE.N ) THEN
-                  CALL ZGEMM( 'Conjugate transpose', 'No transpose', IB,
-     $                        I-1, N-I-IB+1, CONE, A( I+IB, I ), LDA,
-     $                        A( I+IB, 1 ), LDA, CONE, A( I, 1 ), LDA )
-                  CALL ZHERK( 'Lower', 'Conjugate transpose', IB,
-     $                        N-I-IB+1, ONE, A( I+IB, I ), LDA, ONE,
-     $                        A( I, I ), LDA )
-               END IF
-   20       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZLAUUM
-*
-      END
--- a/libcruft/lapack/zpbcon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,198 +0,0 @@
-      SUBROUTINE ZPBCON( UPLO, N, KD, AB, LDAB, ANORM, RCOND, WORK,
-     $                   RWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call ZLACN2 in place of ZLACON, 10 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, KD, LDAB, N
-      DOUBLE PRECISION   ANORM, RCOND
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   RWORK( * )
-      COMPLEX*16         AB( LDAB, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZPBCON estimates the reciprocal of the condition number (in the
-*  1-norm) of a complex Hermitian positive definite band matrix using
-*  the Cholesky factorization A = U**H*U or A = L*L**H computed by
-*  ZPBTRF.
-*
-*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
-*  condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))).
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangular factor stored in AB;
-*          = 'L':  Lower triangular factor stored in AB.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of superdiagonals of the matrix A if UPLO = 'U',
-*          or the number of sub-diagonals if UPLO = 'L'.  KD >= 0.
-*
-*  AB      (input) COMPLEX*16 array, dimension (LDAB,N)
-*          The triangular factor U or L from the Cholesky factorization
-*          A = U**H*U or A = L*L**H of the band matrix A, stored in the
-*          first KD+1 rows of the array.  The j-th column of U or L is
-*          stored in the j-th column of the array AB as follows:
-*          if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO ='L', AB(1+i-j,j)    = L(i,j) for j<=i<=min(n,j+kd).
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  ANORM   (input) DOUBLE PRECISION
-*          The 1-norm (or infinity-norm) of the Hermitian band matrix A.
-*
-*  RCOND   (output) DOUBLE PRECISION
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an
-*          estimate of the 1-norm of inv(A) computed in this routine.
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (2*N)
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      CHARACTER          NORMIN
-      INTEGER            IX, KASE
-      DOUBLE PRECISION   AINVNM, SCALE, SCALEL, SCALEU, SMLNUM
-      COMPLEX*16         ZDUM
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IZAMAX
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           LSAME, IZAMAX, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZDRSCL, ZLACN2, ZLATBS
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DIMAG
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -5
-      ELSE IF( ANORM.LT.ZERO ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZPBCON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      RCOND = ZERO
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      ELSE IF( ANORM.EQ.ZERO ) THEN
-         RETURN
-      END IF
-*
-      SMLNUM = DLAMCH( 'Safe minimum' )
-*
-*     Estimate the 1-norm of the inverse.
-*
-      KASE = 0
-      NORMIN = 'N'
-   10 CONTINUE
-      CALL ZLACN2( N, WORK( N+1 ), WORK, AINVNM, KASE, ISAVE )
-      IF( KASE.NE.0 ) THEN
-         IF( UPPER ) THEN
-*
-*           Multiply by inv(U').
-*
-            CALL ZLATBS( 'Upper', 'Conjugate transpose', 'Non-unit',
-     $                   NORMIN, N, KD, AB, LDAB, WORK, SCALEL, RWORK,
-     $                   INFO )
-            NORMIN = 'Y'
-*
-*           Multiply by inv(U).
-*
-            CALL ZLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   KD, AB, LDAB, WORK, SCALEU, RWORK, INFO )
-         ELSE
-*
-*           Multiply by inv(L).
-*
-            CALL ZLATBS( 'Lower', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   KD, AB, LDAB, WORK, SCALEL, RWORK, INFO )
-            NORMIN = 'Y'
-*
-*           Multiply by inv(L').
-*
-            CALL ZLATBS( 'Lower', 'Conjugate transpose', 'Non-unit',
-     $                   NORMIN, N, KD, AB, LDAB, WORK, SCALEU, RWORK,
-     $                   INFO )
-         END IF
-*
-*        Multiply by 1/SCALE if doing so will not cause overflow.
-*
-         SCALE = SCALEL*SCALEU
-         IF( SCALE.NE.ONE ) THEN
-            IX = IZAMAX( N, WORK, 1 )
-            IF( SCALE.LT.CABS1( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
-     $         GO TO 20
-            CALL ZDRSCL( N, SCALE, WORK, 1 )
-         END IF
-         GO TO 10
-      END IF
-*
-*     Compute the estimate of the reciprocal condition number.
-*
-      IF( AINVNM.NE.ZERO )
-     $   RCOND = ( ONE / AINVNM ) / ANORM
-*
-   20 CONTINUE
-*
-      RETURN
-*
-*     End of ZPBCON
-*
-      END
--- a/libcruft/lapack/zpbtf2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,200 +0,0 @@
-      SUBROUTINE ZPBTF2( UPLO, N, KD, AB, LDAB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, KD, LDAB, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         AB( LDAB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZPBTF2 computes the Cholesky factorization of a complex Hermitian
-*  positive definite band matrix A.
-*
-*  The factorization has the form
-*     A = U' * U ,  if UPLO = 'U', or
-*     A = L  * L',  if UPLO = 'L',
-*  where U is an upper triangular matrix, U' is the conjugate transpose
-*  of U, and L is lower triangular.
-*
-*  This is the unblocked version of the algorithm, calling Level 2 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          Hermitian matrix A is stored:
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of super-diagonals of the matrix A if UPLO = 'U',
-*          or the number of sub-diagonals if UPLO = 'L'.  KD >= 0.
-*
-*  AB      (input/output) COMPLEX*16 array, dimension (LDAB,N)
-*          On entry, the upper or lower triangle of the Hermitian band
-*          matrix A, stored in the first KD+1 rows of the array.  The
-*          j-th column of A is stored in the j-th column of the array AB
-*          as follows:
-*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
-*
-*          On exit, if INFO = 0, the triangular factor U or L from the
-*          Cholesky factorization A = U'*U or A = L*L' of the band
-*          matrix A, in the same storage format as A.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*          > 0: if INFO = k, the leading minor of order k is not
-*               positive definite, and the factorization could not be
-*               completed.
-*
-*  Further Details
-*  ===============
-*
-*  The band storage scheme is illustrated by the following example, when
-*  N = 6, KD = 2, and UPLO = 'U':
-*
-*  On entry:                       On exit:
-*
-*      *    *   a13  a24  a35  a46      *    *   u13  u24  u35  u46
-*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
-*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
-*
-*  Similarly, if UPLO = 'L' the format of A is as follows:
-*
-*  On entry:                       On exit:
-*
-*     a11  a22  a33  a44  a55  a66     l11  l22  l33  l44  l55  l66
-*     a21  a32  a43  a54  a65   *      l21  l32  l43  l54  l65   *
-*     a31  a42  a53  a64   *    *      l31  l42  l53  l64   *    *
-*
-*  Array elements marked * are not used by the routine.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            J, KLD, KN
-      DOUBLE PRECISION   AJJ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZDSCAL, ZHER, ZLACGV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, MAX, MIN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZPBTF2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      KLD = MAX( 1, LDAB-1 )
-*
-      IF( UPPER ) THEN
-*
-*        Compute the Cholesky factorization A = U'*U.
-*
-         DO 10 J = 1, N
-*
-*           Compute U(J,J) and test for non-positive-definiteness.
-*
-            AJJ = DBLE( AB( KD+1, J ) )
-            IF( AJJ.LE.ZERO ) THEN
-               AB( KD+1, J ) = AJJ
-               GO TO 30
-            END IF
-            AJJ = SQRT( AJJ )
-            AB( KD+1, J ) = AJJ
-*
-*           Compute elements J+1:J+KN of row J and update the
-*           trailing submatrix within the band.
-*
-            KN = MIN( KD, N-J )
-            IF( KN.GT.0 ) THEN
-               CALL ZDSCAL( KN, ONE / AJJ, AB( KD, J+1 ), KLD )
-               CALL ZLACGV( KN, AB( KD, J+1 ), KLD )
-               CALL ZHER( 'Upper', KN, -ONE, AB( KD, J+1 ), KLD,
-     $                    AB( KD+1, J+1 ), KLD )
-               CALL ZLACGV( KN, AB( KD, J+1 ), KLD )
-            END IF
-   10    CONTINUE
-      ELSE
-*
-*        Compute the Cholesky factorization A = L*L'.
-*
-         DO 20 J = 1, N
-*
-*           Compute L(J,J) and test for non-positive-definiteness.
-*
-            AJJ = DBLE( AB( 1, J ) )
-            IF( AJJ.LE.ZERO ) THEN
-               AB( 1, J ) = AJJ
-               GO TO 30
-            END IF
-            AJJ = SQRT( AJJ )
-            AB( 1, J ) = AJJ
-*
-*           Compute elements J+1:J+KN of column J and update the
-*           trailing submatrix within the band.
-*
-            KN = MIN( KD, N-J )
-            IF( KN.GT.0 ) THEN
-               CALL ZDSCAL( KN, ONE / AJJ, AB( 2, J ), 1 )
-               CALL ZHER( 'Lower', KN, -ONE, AB( 2, J ), 1,
-     $                    AB( 1, J+1 ), KLD )
-            END IF
-   20    CONTINUE
-      END IF
-      RETURN
-*
-   30 CONTINUE
-      INFO = J
-      RETURN
-*
-*     End of ZPBTF2
-*
-      END
--- a/libcruft/lapack/zpbtrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,371 +0,0 @@
-      SUBROUTINE ZPBTRF( UPLO, N, KD, AB, LDAB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, KD, LDAB, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         AB( LDAB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZPBTRF computes the Cholesky factorization of a complex Hermitian
-*  positive definite band matrix A.
-*
-*  The factorization has the form
-*     A = U**H * U,  if UPLO = 'U', or
-*     A = L  * L**H,  if UPLO = 'L',
-*  where U is an upper triangular matrix and L is lower triangular.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of superdiagonals of the matrix A if UPLO = 'U',
-*          or the number of subdiagonals if UPLO = 'L'.  KD >= 0.
-*
-*  AB      (input/output) COMPLEX*16 array, dimension (LDAB,N)
-*          On entry, the upper or lower triangle of the Hermitian band
-*          matrix A, stored in the first KD+1 rows of the array.  The
-*          j-th column of A is stored in the j-th column of the array AB
-*          as follows:
-*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
-*
-*          On exit, if INFO = 0, the triangular factor U or L from the
-*          Cholesky factorization A = U**H*U or A = L*L**H of the band
-*          matrix A, in the same storage format as A.
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the leading minor of order i is not
-*                positive definite, and the factorization could not be
-*                completed.
-*
-*  Further Details
-*  ===============
-*
-*  The band storage scheme is illustrated by the following example, when
-*  N = 6, KD = 2, and UPLO = 'U':
-*
-*  On entry:                       On exit:
-*
-*      *    *   a13  a24  a35  a46      *    *   u13  u24  u35  u46
-*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
-*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
-*
-*  Similarly, if UPLO = 'L' the format of A is as follows:
-*
-*  On entry:                       On exit:
-*
-*     a11  a22  a33  a44  a55  a66     l11  l22  l33  l44  l55  l66
-*     a21  a32  a43  a54  a65   *      l21  l32  l43  l54  l65   *
-*     a31  a42  a53  a64   *    *      l31  l42  l53  l64   *    *
-*
-*  Array elements marked * are not used by the routine.
-*
-*  Contributed by
-*  Peter Mayes and Giuseppe Radicati, IBM ECSEC, Rome, March 23, 1989
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-      COMPLEX*16         CONE
-      PARAMETER          ( CONE = ( 1.0D+0, 0.0D+0 ) )
-      INTEGER            NBMAX, LDWORK
-      PARAMETER          ( NBMAX = 32, LDWORK = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I2, I3, IB, II, J, JJ, NB
-*     ..
-*     .. Local Arrays ..
-      COMPLEX*16         WORK( LDWORK, NBMAX )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZGEMM, ZHERK, ZPBTF2, ZPOTF2, ZTRSM
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( ( .NOT.LSAME( UPLO, 'U' ) ) .AND.
-     $    ( .NOT.LSAME( UPLO, 'L' ) ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZPBTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment
-*
-      NB = ILAENV( 1, 'ZPBTRF', UPLO, N, KD, -1, -1 )
-*
-*     The block size must not exceed the semi-bandwidth KD, and must not
-*     exceed the limit set by the size of the local array WORK.
-*
-      NB = MIN( NB, NBMAX )
-*
-      IF( NB.LE.1 .OR. NB.GT.KD ) THEN
-*
-*        Use unblocked code
-*
-         CALL ZPBTF2( UPLO, N, KD, AB, LDAB, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( LSAME( UPLO, 'U' ) ) THEN
-*
-*           Compute the Cholesky factorization of a Hermitian band
-*           matrix, given the upper triangle of the matrix in band
-*           storage.
-*
-*           Zero the upper triangle of the work array.
-*
-            DO 20 J = 1, NB
-               DO 10 I = 1, J - 1
-                  WORK( I, J ) = ZERO
-   10          CONTINUE
-   20       CONTINUE
-*
-*           Process the band matrix one diagonal block at a time.
-*
-            DO 70 I = 1, N, NB
-               IB = MIN( NB, N-I+1 )
-*
-*              Factorize the diagonal block
-*
-               CALL ZPOTF2( UPLO, IB, AB( KD+1, I ), LDAB-1, II )
-               IF( II.NE.0 ) THEN
-                  INFO = I + II - 1
-                  GO TO 150
-               END IF
-               IF( I+IB.LE.N ) THEN
-*
-*                 Update the relevant part of the trailing submatrix.
-*                 If A11 denotes the diagonal block which has just been
-*                 factorized, then we need to update the remaining
-*                 blocks in the diagram:
-*
-*                    A11   A12   A13
-*                          A22   A23
-*                                A33
-*
-*                 The numbers of rows and columns in the partitioning
-*                 are IB, I2, I3 respectively. The blocks A12, A22 and
-*                 A23 are empty if IB = KD. The upper triangle of A13
-*                 lies outside the band.
-*
-                  I2 = MIN( KD-IB, N-I-IB+1 )
-                  I3 = MIN( IB, N-I-KD+1 )
-*
-                  IF( I2.GT.0 ) THEN
-*
-*                    Update A12
-*
-                     CALL ZTRSM( 'Left', 'Upper', 'Conjugate transpose',
-     $                           'Non-unit', IB, I2, CONE,
-     $                           AB( KD+1, I ), LDAB-1,
-     $                           AB( KD+1-IB, I+IB ), LDAB-1 )
-*
-*                    Update A22
-*
-                     CALL ZHERK( 'Upper', 'Conjugate transpose', I2, IB,
-     $                           -ONE, AB( KD+1-IB, I+IB ), LDAB-1, ONE,
-     $                           AB( KD+1, I+IB ), LDAB-1 )
-                  END IF
-*
-                  IF( I3.GT.0 ) THEN
-*
-*                    Copy the lower triangle of A13 into the work array.
-*
-                     DO 40 JJ = 1, I3
-                        DO 30 II = JJ, IB
-                           WORK( II, JJ ) = AB( II-JJ+1, JJ+I+KD-1 )
-   30                   CONTINUE
-   40                CONTINUE
-*
-*                    Update A13 (in the work array).
-*
-                     CALL ZTRSM( 'Left', 'Upper', 'Conjugate transpose',
-     $                           'Non-unit', IB, I3, CONE,
-     $                           AB( KD+1, I ), LDAB-1, WORK, LDWORK )
-*
-*                    Update A23
-*
-                     IF( I2.GT.0 )
-     $                  CALL ZGEMM( 'Conjugate transpose',
-     $                              'No transpose', I2, I3, IB, -CONE,
-     $                              AB( KD+1-IB, I+IB ), LDAB-1, WORK,
-     $                              LDWORK, CONE, AB( 1+IB, I+KD ),
-     $                              LDAB-1 )
-*
-*                    Update A33
-*
-                     CALL ZHERK( 'Upper', 'Conjugate transpose', I3, IB,
-     $                           -ONE, WORK, LDWORK, ONE,
-     $                           AB( KD+1, I+KD ), LDAB-1 )
-*
-*                    Copy the lower triangle of A13 back into place.
-*
-                     DO 60 JJ = 1, I3
-                        DO 50 II = JJ, IB
-                           AB( II-JJ+1, JJ+I+KD-1 ) = WORK( II, JJ )
-   50                   CONTINUE
-   60                CONTINUE
-                  END IF
-               END IF
-   70       CONTINUE
-         ELSE
-*
-*           Compute the Cholesky factorization of a Hermitian band
-*           matrix, given the lower triangle of the matrix in band
-*           storage.
-*
-*           Zero the lower triangle of the work array.
-*
-            DO 90 J = 1, NB
-               DO 80 I = J + 1, NB
-                  WORK( I, J ) = ZERO
-   80          CONTINUE
-   90       CONTINUE
-*
-*           Process the band matrix one diagonal block at a time.
-*
-            DO 140 I = 1, N, NB
-               IB = MIN( NB, N-I+1 )
-*
-*              Factorize the diagonal block
-*
-               CALL ZPOTF2( UPLO, IB, AB( 1, I ), LDAB-1, II )
-               IF( II.NE.0 ) THEN
-                  INFO = I + II - 1
-                  GO TO 150
-               END IF
-               IF( I+IB.LE.N ) THEN
-*
-*                 Update the relevant part of the trailing submatrix.
-*                 If A11 denotes the diagonal block which has just been
-*                 factorized, then we need to update the remaining
-*                 blocks in the diagram:
-*
-*                    A11
-*                    A21   A22
-*                    A31   A32   A33
-*
-*                 The numbers of rows and columns in the partitioning
-*                 are IB, I2, I3 respectively. The blocks A21, A22 and
-*                 A32 are empty if IB = KD. The lower triangle of A31
-*                 lies outside the band.
-*
-                  I2 = MIN( KD-IB, N-I-IB+1 )
-                  I3 = MIN( IB, N-I-KD+1 )
-*
-                  IF( I2.GT.0 ) THEN
-*
-*                    Update A21
-*
-                     CALL ZTRSM( 'Right', 'Lower',
-     $                           'Conjugate transpose', 'Non-unit', I2,
-     $                           IB, CONE, AB( 1, I ), LDAB-1,
-     $                           AB( 1+IB, I ), LDAB-1 )
-*
-*                    Update A22
-*
-                     CALL ZHERK( 'Lower', 'No transpose', I2, IB, -ONE,
-     $                           AB( 1+IB, I ), LDAB-1, ONE,
-     $                           AB( 1, I+IB ), LDAB-1 )
-                  END IF
-*
-                  IF( I3.GT.0 ) THEN
-*
-*                    Copy the upper triangle of A31 into the work array.
-*
-                     DO 110 JJ = 1, IB
-                        DO 100 II = 1, MIN( JJ, I3 )
-                           WORK( II, JJ ) = AB( KD+1-JJ+II, JJ+I-1 )
-  100                   CONTINUE
-  110                CONTINUE
-*
-*                    Update A31 (in the work array).
-*
-                     CALL ZTRSM( 'Right', 'Lower',
-     $                           'Conjugate transpose', 'Non-unit', I3,
-     $                           IB, CONE, AB( 1, I ), LDAB-1, WORK,
-     $                           LDWORK )
-*
-*                    Update A32
-*
-                     IF( I2.GT.0 )
-     $                  CALL ZGEMM( 'No transpose',
-     $                              'Conjugate transpose', I3, I2, IB,
-     $                              -CONE, WORK, LDWORK, AB( 1+IB, I ),
-     $                              LDAB-1, CONE, AB( 1+KD-IB, I+IB ),
-     $                              LDAB-1 )
-*
-*                    Update A33
-*
-                     CALL ZHERK( 'Lower', 'No transpose', I3, IB, -ONE,
-     $                           WORK, LDWORK, ONE, AB( 1, I+KD ),
-     $                           LDAB-1 )
-*
-*                    Copy the upper triangle of A31 back into place.
-*
-                     DO 130 JJ = 1, IB
-                        DO 120 II = 1, MIN( JJ, I3 )
-                           AB( KD+1-JJ+II, JJ+I-1 ) = WORK( II, JJ )
-  120                   CONTINUE
-  130                CONTINUE
-                  END IF
-               END IF
-  140       CONTINUE
-         END IF
-      END IF
-      RETURN
-*
-  150 CONTINUE
-      RETURN
-*
-*     End of ZPBTRF
-*
-      END
--- a/libcruft/lapack/zpbtrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-      SUBROUTINE ZPBTRS( UPLO, N, KD, NRHS, AB, LDAB, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, KD, LDAB, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         AB( LDAB, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZPBTRS solves a system of linear equations A*X = B with a Hermitian
-*  positive definite band matrix A using the Cholesky factorization
-*  A = U**H*U or A = L*L**H computed by ZPBTRF.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangular factor stored in AB;
-*          = 'L':  Lower triangular factor stored in AB.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  KD      (input) INTEGER
-*          The number of superdiagonals of the matrix A if UPLO = 'U',
-*          or the number of subdiagonals if UPLO = 'L'.  KD >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  AB      (input) COMPLEX*16 array, dimension (LDAB,N)
-*          The triangular factor U or L from the Cholesky factorization
-*          A = U**H*U or A = L*L**H of the band matrix A, stored in the
-*          first KD+1 rows of the array.  The j-th column of U or L is
-*          stored in the j-th column of the array AB as follows:
-*          if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j;
-*          if UPLO ='L', AB(1+i-j,j)    = L(i,j) for j<=i<=min(n,j+kd).
-*
-*  LDAB    (input) INTEGER
-*          The leading dimension of the array AB.  LDAB >= KD+1.
-*
-*  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            J
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZTBSV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( KD.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDAB.LT.KD+1 ) THEN
-         INFO = -6
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZPBTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Solve A*X = B where A = U'*U.
-*
-         DO 10 J = 1, NRHS
-*
-*           Solve U'*X = B, overwriting B with X.
-*
-            CALL ZTBSV( 'Upper', 'Conjugate transpose', 'Non-unit', N,
-     $                  KD, AB, LDAB, B( 1, J ), 1 )
-*
-*           Solve U*X = B, overwriting B with X.
-*
-            CALL ZTBSV( 'Upper', 'No transpose', 'Non-unit', N, KD, AB,
-     $                  LDAB, B( 1, J ), 1 )
-   10    CONTINUE
-      ELSE
-*
-*        Solve A*X = B where A = L*L'.
-*
-         DO 20 J = 1, NRHS
-*
-*           Solve L*X = B, overwriting B with X.
-*
-            CALL ZTBSV( 'Lower', 'No transpose', 'Non-unit', N, KD, AB,
-     $                  LDAB, B( 1, J ), 1 )
-*
-*           Solve L'*X = B, overwriting B with X.
-*
-            CALL ZTBSV( 'Lower', 'Conjugate transpose', 'Non-unit', N,
-     $                  KD, AB, LDAB, B( 1, J ), 1 )
-   20    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of ZPBTRS
-*
-      END
--- a/libcruft/lapack/zpocon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,184 +0,0 @@
-      SUBROUTINE ZPOCON( UPLO, N, A, LDA, ANORM, RCOND, WORK, RWORK,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call ZLACN2 in place of ZLACON, 10 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-      DOUBLE PRECISION   ANORM, RCOND
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   RWORK( * )
-      COMPLEX*16         A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZPOCON estimates the reciprocal of the condition number (in the
-*  1-norm) of a complex Hermitian positive definite matrix using the
-*  Cholesky factorization A = U**H*U or A = L*L**H computed by ZPOTRF.
-*
-*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
-*  condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))).
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input) COMPLEX*16 array, dimension (LDA,N)
-*          The triangular factor U or L from the Cholesky factorization
-*          A = U**H*U or A = L*L**H, as computed by ZPOTRF.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  ANORM   (input) DOUBLE PRECISION
-*          The 1-norm (or infinity-norm) of the Hermitian matrix A.
-*
-*  RCOND   (output) DOUBLE PRECISION
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an
-*          estimate of the 1-norm of inv(A) computed in this routine.
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (2*N)
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      CHARACTER          NORMIN
-      INTEGER            IX, KASE
-      DOUBLE PRECISION   AINVNM, SCALE, SCALEL, SCALEU, SMLNUM
-      COMPLEX*16         ZDUM
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IZAMAX
-      DOUBLE PRECISION   DLAMCH
-      EXTERNAL           LSAME, IZAMAX, DLAMCH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZDRSCL, ZLACN2, ZLATRS
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DIMAG, MAX
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( ANORM.LT.ZERO ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZPOCON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      RCOND = ZERO
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      ELSE IF( ANORM.EQ.ZERO ) THEN
-         RETURN
-      END IF
-*
-      SMLNUM = DLAMCH( 'Safe minimum' )
-*
-*     Estimate the 1-norm of inv(A).
-*
-      KASE = 0
-      NORMIN = 'N'
-   10 CONTINUE
-      CALL ZLACN2( N, WORK( N+1 ), WORK, AINVNM, KASE, ISAVE )
-      IF( KASE.NE.0 ) THEN
-         IF( UPPER ) THEN
-*
-*           Multiply by inv(U').
-*
-            CALL ZLATRS( 'Upper', 'Conjugate transpose', 'Non-unit',
-     $                   NORMIN, N, A, LDA, WORK, SCALEL, RWORK, INFO )
-            NORMIN = 'Y'
-*
-*           Multiply by inv(U).
-*
-            CALL ZLATRS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   A, LDA, WORK, SCALEU, RWORK, INFO )
-         ELSE
-*
-*           Multiply by inv(L).
-*
-            CALL ZLATRS( 'Lower', 'No transpose', 'Non-unit', NORMIN, N,
-     $                   A, LDA, WORK, SCALEL, RWORK, INFO )
-            NORMIN = 'Y'
-*
-*           Multiply by inv(L').
-*
-            CALL ZLATRS( 'Lower', 'Conjugate transpose', 'Non-unit',
-     $                   NORMIN, N, A, LDA, WORK, SCALEU, RWORK, INFO )
-         END IF
-*
-*        Multiply by 1/SCALE if doing so will not cause overflow.
-*
-         SCALE = SCALEL*SCALEU
-         IF( SCALE.NE.ONE ) THEN
-            IX = IZAMAX( N, WORK, 1 )
-            IF( SCALE.LT.CABS1( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
-     $         GO TO 20
-            CALL ZDRSCL( N, SCALE, WORK, 1 )
-         END IF
-         GO TO 10
-      END IF
-*
-*     Compute the estimate of the reciprocal condition number.
-*
-      IF( AINVNM.NE.ZERO )
-     $   RCOND = ( ONE / AINVNM ) / ANORM
-*
-   20 CONTINUE
-      RETURN
-*
-*     End of ZPOCON
-*
-      END
--- a/libcruft/lapack/zpotf2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,174 +0,0 @@
-      SUBROUTINE ZPOTF2( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZPOTF2 computes the Cholesky factorization of a complex Hermitian
-*  positive definite matrix A.
-*
-*  The factorization has the form
-*     A = U' * U ,  if UPLO = 'U', or
-*     A = L  * L',  if UPLO = 'L',
-*  where U is an upper triangular matrix and L is lower triangular.
-*
-*  This is the unblocked version of the algorithm, calling Level 2 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the upper or lower triangular part of the
-*          Hermitian matrix A is stored.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the leading
-*          n by n upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n by n lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*
-*          On exit, if INFO = 0, the factor U or L from the Cholesky
-*          factorization A = U'*U  or A = L*L'.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*          > 0: if INFO = k, the leading minor of order k is not
-*               positive definite, and the factorization could not be
-*               completed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-      COMPLEX*16         CONE
-      PARAMETER          ( CONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            J
-      DOUBLE PRECISION   AJJ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      COMPLEX*16         ZDOTC
-      EXTERNAL           LSAME, ZDOTC
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZDSCAL, ZGEMV, ZLACGV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZPOTF2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Compute the Cholesky factorization A = U'*U.
-*
-         DO 10 J = 1, N
-*
-*           Compute U(J,J) and test for non-positive-definiteness.
-*
-            AJJ = DBLE( A( J, J ) ) - ZDOTC( J-1, A( 1, J ), 1,
-     $            A( 1, J ), 1 )
-            IF( AJJ.LE.ZERO ) THEN
-               A( J, J ) = AJJ
-               GO TO 30
-            END IF
-            AJJ = SQRT( AJJ )
-            A( J, J ) = AJJ
-*
-*           Compute elements J+1:N of row J.
-*
-            IF( J.LT.N ) THEN
-               CALL ZLACGV( J-1, A( 1, J ), 1 )
-               CALL ZGEMV( 'Transpose', J-1, N-J, -CONE, A( 1, J+1 ),
-     $                     LDA, A( 1, J ), 1, CONE, A( J, J+1 ), LDA )
-               CALL ZLACGV( J-1, A( 1, J ), 1 )
-               CALL ZDSCAL( N-J, ONE / AJJ, A( J, J+1 ), LDA )
-            END IF
-   10    CONTINUE
-      ELSE
-*
-*        Compute the Cholesky factorization A = L*L'.
-*
-         DO 20 J = 1, N
-*
-*           Compute L(J,J) and test for non-positive-definiteness.
-*
-            AJJ = DBLE( A( J, J ) ) - ZDOTC( J-1, A( J, 1 ), LDA,
-     $            A( J, 1 ), LDA )
-            IF( AJJ.LE.ZERO ) THEN
-               A( J, J ) = AJJ
-               GO TO 30
-            END IF
-            AJJ = SQRT( AJJ )
-            A( J, J ) = AJJ
-*
-*           Compute elements J+1:N of column J.
-*
-            IF( J.LT.N ) THEN
-               CALL ZLACGV( J-1, A( J, 1 ), LDA )
-               CALL ZGEMV( 'No transpose', N-J, J-1, -CONE, A( J+1, 1 ),
-     $                     LDA, A( J, 1 ), LDA, CONE, A( J+1, J ), 1 )
-               CALL ZLACGV( J-1, A( J, 1 ), LDA )
-               CALL ZDSCAL( N-J, ONE / AJJ, A( J+1, J ), 1 )
-            END IF
-   20    CONTINUE
-      END IF
-      GO TO 40
-*
-   30 CONTINUE
-      INFO = J
-*
-   40 CONTINUE
-      RETURN
-*
-*     End of ZPOTF2
-*
-      END
--- a/libcruft/lapack/zpotrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,186 +0,0 @@
-      SUBROUTINE ZPOTRF( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZPOTRF computes the Cholesky factorization of a complex Hermitian
-*  positive definite matrix A.
-*
-*  The factorization has the form
-*     A = U**H * U,  if UPLO = 'U', or
-*     A = L  * L**H,  if UPLO = 'L',
-*  where U is an upper triangular matrix and L is lower triangular.
-*
-*  This is the block version of the algorithm, calling Level 3 BLAS.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the Hermitian matrix A.  If UPLO = 'U', the leading
-*          N-by-N upper triangular part of A contains the upper
-*          triangular part of the matrix A, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading N-by-N lower triangular part of A contains the lower
-*          triangular part of the matrix A, and the strictly upper
-*          triangular part of A is not referenced.
-*
-*          On exit, if INFO = 0, the factor U or L from the Cholesky
-*          factorization A = U**H*U or A = L*L**H.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the leading minor of order i is not
-*                positive definite, and the factorization could not be
-*                completed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      COMPLEX*16         CONE
-      PARAMETER          ( ONE = 1.0D+0, CONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            J, JB, NB
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZGEMM, ZHERK, ZPOTF2, ZTRSM
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZPOTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'ZPOTRF', UPLO, N, -1, -1, -1 )
-      IF( NB.LE.1 .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code.
-*
-         CALL ZPOTF2( UPLO, N, A, LDA, INFO )
-      ELSE
-*
-*        Use blocked code.
-*
-         IF( UPPER ) THEN
-*
-*           Compute the Cholesky factorization A = U'*U.
-*
-            DO 10 J = 1, N, NB
-*
-*              Update and factorize the current diagonal block and test
-*              for non-positive-definiteness.
-*
-               JB = MIN( NB, N-J+1 )
-               CALL ZHERK( 'Upper', 'Conjugate transpose', JB, J-1,
-     $                     -ONE, A( 1, J ), LDA, ONE, A( J, J ), LDA )
-               CALL ZPOTF2( 'Upper', JB, A( J, J ), LDA, INFO )
-               IF( INFO.NE.0 )
-     $            GO TO 30
-               IF( J+JB.LE.N ) THEN
-*
-*                 Compute the current block row.
-*
-                  CALL ZGEMM( 'Conjugate transpose', 'No transpose', JB,
-     $                        N-J-JB+1, J-1, -CONE, A( 1, J ), LDA,
-     $                        A( 1, J+JB ), LDA, CONE, A( J, J+JB ),
-     $                        LDA )
-                  CALL ZTRSM( 'Left', 'Upper', 'Conjugate transpose',
-     $                        'Non-unit', JB, N-J-JB+1, CONE, A( J, J ),
-     $                        LDA, A( J, J+JB ), LDA )
-               END IF
-   10       CONTINUE
-*
-         ELSE
-*
-*           Compute the Cholesky factorization A = L*L'.
-*
-            DO 20 J = 1, N, NB
-*
-*              Update and factorize the current diagonal block and test
-*              for non-positive-definiteness.
-*
-               JB = MIN( NB, N-J+1 )
-               CALL ZHERK( 'Lower', 'No transpose', JB, J-1, -ONE,
-     $                     A( J, 1 ), LDA, ONE, A( J, J ), LDA )
-               CALL ZPOTF2( 'Lower', JB, A( J, J ), LDA, INFO )
-               IF( INFO.NE.0 )
-     $            GO TO 30
-               IF( J+JB.LE.N ) THEN
-*
-*                 Compute the current block column.
-*
-                  CALL ZGEMM( 'No transpose', 'Conjugate transpose',
-     $                        N-J-JB+1, JB, J-1, -CONE, A( J+JB, 1 ),
-     $                        LDA, A( J, 1 ), LDA, CONE, A( J+JB, J ),
-     $                        LDA )
-                  CALL ZTRSM( 'Right', 'Lower', 'Conjugate transpose',
-     $                        'Non-unit', N-J-JB+1, JB, CONE, A( J, J ),
-     $                        LDA, A( J+JB, J ), LDA )
-               END IF
-   20       CONTINUE
-         END IF
-      END IF
-      GO TO 40
-*
-   30 CONTINUE
-      INFO = INFO + J - 1
-*
-   40 CONTINUE
-      RETURN
-*
-*     End of ZPOTRF
-*
-      END
--- a/libcruft/lapack/zpotri.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-      SUBROUTINE ZPOTRI( UPLO, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZPOTRI computes the inverse of a complex Hermitian positive definite
-*  matrix A using the Cholesky factorization A = U**H*U or A = L*L**H
-*  computed by ZPOTRF.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the triangular factor U or L from the Cholesky
-*          factorization A = U**H*U or A = L*L**H, as computed by
-*          ZPOTRF.
-*          On exit, the upper or lower triangle of the (Hermitian)
-*          inverse of A, overwriting the input factor U or L.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the (i,i) element of the factor U or L is
-*                zero, and the inverse could not be computed.
-*
-*  =====================================================================
-*
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLAUUM, ZTRTRI
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZPOTRI', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Invert the triangular Cholesky factor U or L.
-*
-      CALL ZTRTRI( UPLO, 'Non-unit', N, A, LDA, INFO )
-      IF( INFO.GT.0 )
-     $   RETURN
-*
-*     Form inv(U)*inv(U)' or inv(L)'*inv(L).
-*
-      CALL ZLAUUM( UPLO, N, A, LDA, INFO )
-*
-      RETURN
-*
-*     End of ZPOTRI
-*
-      END
--- a/libcruft/lapack/zpotrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-      SUBROUTINE ZPOTRS( UPLO, N, NRHS, A, LDA, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZPOTRS solves a system of linear equations A*X = B with a Hermitian
-*  positive definite matrix A using the Cholesky factorization
-*  A = U**H*U or A = L*L**H computed by ZPOTRF.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  Upper triangle of A is stored;
-*          = 'L':  Lower triangle of A is stored.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  A       (input) COMPLEX*16 array, dimension (LDA,N)
-*          The triangular factor U or L from the Cholesky factorization
-*          A = U**H*U or A = L*L**H, as computed by ZPOTRF.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZTRSM
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZPOTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-      IF( UPPER ) THEN
-*
-*        Solve A*X = B where A = U'*U.
-*
-*        Solve U'*X = B, overwriting B with X.
-*
-         CALL ZTRSM( 'Left', 'Upper', 'Conjugate transpose', 'Non-unit',
-     $               N, NRHS, ONE, A, LDA, B, LDB )
-*
-*        Solve U*X = B, overwriting B with X.
-*
-         CALL ZTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N,
-     $               NRHS, ONE, A, LDA, B, LDB )
-      ELSE
-*
-*        Solve A*X = B where A = L*L'.
-*
-*        Solve L*X = B, overwriting B with X.
-*
-         CALL ZTRSM( 'Left', 'Lower', 'No transpose', 'Non-unit', N,
-     $               NRHS, ONE, A, LDA, B, LDB )
-*
-*        Solve L'*X = B, overwriting B with X.
-*
-         CALL ZTRSM( 'Left', 'Lower', 'Conjugate transpose', 'Non-unit',
-     $               N, NRHS, ONE, A, LDA, B, LDB )
-      END IF
-*
-      RETURN
-*
-*     End of ZPOTRS
-*
-      END
--- a/libcruft/lapack/zptsv.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-      SUBROUTINE ZPTSV( N, NRHS, D, E, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * )
-      COMPLEX*16         B( LDB, * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZPTSV computes the solution to a complex system of linear equations
-*  A*X = B, where A is an N-by-N Hermitian positive definite tridiagonal
-*  matrix, and X and B are N-by-NRHS matrices.
-*
-*  A is factored as A = L*D*L**H, and the factored form of A is then
-*  used to solve the system of equations.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  D       (input/output) DOUBLE PRECISION array, dimension (N)
-*          On entry, the n diagonal elements of the tridiagonal matrix
-*          A.  On exit, the n diagonal elements of the diagonal matrix
-*          D from the factorization A = L*D*L**H.
-*
-*  E       (input/output) COMPLEX*16 array, dimension (N-1)
-*          On entry, the (n-1) subdiagonal elements of the tridiagonal
-*          matrix A.  On exit, the (n-1) subdiagonal elements of the
-*          unit bidiagonal factor L from the L*D*L**H factorization of
-*          A.  E can also be regarded as the superdiagonal of the unit
-*          bidiagonal factor U from the U**H*D*U factorization of A.
-*
-*  B       (input/output) COMPLEX*16 array, dimension (LDB,N)
-*          On entry, the N-by-NRHS right hand side matrix B.
-*          On exit, if INFO = 0, the N-by-NRHS solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  if INFO = i, the leading minor of order i is not
-*                positive definite, and the solution has not been
-*                computed.  The factorization has not been completed
-*                unless i = N.
-*
-*  =====================================================================
-*
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZPTTRF, ZPTTRS
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZPTSV ', -INFO )
-         RETURN
-      END IF
-*
-*     Compute the L*D*L' (or U'*D*U) factorization of A.
-*
-      CALL ZPTTRF( N, D, E, INFO )
-      IF( INFO.EQ.0 ) THEN
-*
-*        Solve the system A*X = B, overwriting B with X.
-*
-         CALL ZPTTRS( 'Lower', N, NRHS, D, E, B, LDB, INFO )
-      END IF
-      RETURN
-*
-*     End of ZPTSV
-*
-      END
--- a/libcruft/lapack/zpttrf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,168 +0,0 @@
-      SUBROUTINE ZPTTRF( N, D, E, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * )
-      COMPLEX*16         E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZPTTRF computes the L*D*L' factorization of a complex Hermitian
-*  positive definite tridiagonal matrix A.  The factorization may also
-*  be regarded as having the form A = U'*D*U.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  D       (input/output) DOUBLE PRECISION array, dimension (N)
-*          On entry, the n diagonal elements of the tridiagonal matrix
-*          A.  On exit, the n diagonal elements of the diagonal matrix
-*          D from the L*D*L' factorization of A.
-*
-*  E       (input/output) COMPLEX*16 array, dimension (N-1)
-*          On entry, the (n-1) subdiagonal elements of the tridiagonal
-*          matrix A.  On exit, the (n-1) subdiagonal elements of the
-*          unit bidiagonal factor L from the L*D*L' factorization of A.
-*          E can also be regarded as the superdiagonal of the unit
-*          bidiagonal factor U from the U'*D*U factorization of A.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*          > 0: if INFO = k, the leading minor of order k is not
-*               positive definite; if k < N, the factorization could not
-*               be completed, while if k = N, the factorization was
-*               completed, but D(N) <= 0.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO
-      PARAMETER          ( ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, I4
-      DOUBLE PRECISION   EII, EIR, F, G
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DBLE, DCMPLX, DIMAG, MOD
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      IF( N.LT.0 ) THEN
-         INFO = -1
-         CALL XERBLA( 'ZPTTRF', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Compute the L*D*L' (or U'*D*U) factorization of A.
-*
-      I4 = MOD( N-1, 4 )
-      DO 10 I = 1, I4
-         IF( D( I ).LE.ZERO ) THEN
-            INFO = I
-            GO TO 30
-         END IF
-         EIR = DBLE( E( I ) )
-         EII = DIMAG( E( I ) )
-         F = EIR / D( I )
-         G = EII / D( I )
-         E( I ) = DCMPLX( F, G )
-         D( I+1 ) = D( I+1 ) - F*EIR - G*EII
-   10 CONTINUE
-*
-      DO 20 I = I4 + 1, N - 4, 4
-*
-*        Drop out of the loop if d(i) <= 0: the matrix is not positive
-*        definite.
-*
-         IF( D( I ).LE.ZERO ) THEN
-            INFO = I
-            GO TO 30
-         END IF
-*
-*        Solve for e(i) and d(i+1).
-*
-         EIR = DBLE( E( I ) )
-         EII = DIMAG( E( I ) )
-         F = EIR / D( I )
-         G = EII / D( I )
-         E( I ) = DCMPLX( F, G )
-         D( I+1 ) = D( I+1 ) - F*EIR - G*EII
-*
-         IF( D( I+1 ).LE.ZERO ) THEN
-            INFO = I + 1
-            GO TO 30
-         END IF
-*
-*        Solve for e(i+1) and d(i+2).
-*
-         EIR = DBLE( E( I+1 ) )
-         EII = DIMAG( E( I+1 ) )
-         F = EIR / D( I+1 )
-         G = EII / D( I+1 )
-         E( I+1 ) = DCMPLX( F, G )
-         D( I+2 ) = D( I+2 ) - F*EIR - G*EII
-*
-         IF( D( I+2 ).LE.ZERO ) THEN
-            INFO = I + 2
-            GO TO 30
-         END IF
-*
-*        Solve for e(i+2) and d(i+3).
-*
-         EIR = DBLE( E( I+2 ) )
-         EII = DIMAG( E( I+2 ) )
-         F = EIR / D( I+2 )
-         G = EII / D( I+2 )
-         E( I+2 ) = DCMPLX( F, G )
-         D( I+3 ) = D( I+3 ) - F*EIR - G*EII
-*
-         IF( D( I+3 ).LE.ZERO ) THEN
-            INFO = I + 3
-            GO TO 30
-         END IF
-*
-*        Solve for e(i+3) and d(i+4).
-*
-         EIR = DBLE( E( I+3 ) )
-         EII = DIMAG( E( I+3 ) )
-         F = EIR / D( I+3 )
-         G = EII / D( I+3 )
-         E( I+3 ) = DCMPLX( F, G )
-         D( I+4 ) = D( I+4 ) - F*EIR - G*EII
-   20 CONTINUE
-*
-*     Check d(n) for positive definiteness.
-*
-      IF( D( N ).LE.ZERO )
-     $   INFO = N
-*
-   30 CONTINUE
-      RETURN
-*
-*     End of ZPTTRF
-*
-      END
--- a/libcruft/lapack/zpttrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,135 +0,0 @@
-      SUBROUTINE ZPTTRS( UPLO, N, NRHS, D, E, B, LDB, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * )
-      COMPLEX*16         B( LDB, * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZPTTRS solves a tridiagonal system of the form
-*     A * X = B
-*  using the factorization A = U'*D*U or A = L*D*L' computed by ZPTTRF.
-*  D is a diagonal matrix specified in the vector D, U (or L) is a unit
-*  bidiagonal matrix whose superdiagonal (subdiagonal) is specified in
-*  the vector E, and X and B are N by NRHS matrices.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies the form of the factorization and whether the
-*          vector E is the superdiagonal of the upper bidiagonal factor
-*          U or the subdiagonal of the lower bidiagonal factor L.
-*          = 'U':  A = U'*D*U, E is the superdiagonal of U
-*          = 'L':  A = L*D*L', E is the subdiagonal of L
-*
-*  N       (input) INTEGER
-*          The order of the tridiagonal matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  D       (input) DOUBLE PRECISION array, dimension (N)
-*          The n diagonal elements of the diagonal matrix D from the
-*          factorization A = U'*D*U or A = L*D*L'.
-*
-*  E       (input) COMPLEX*16 array, dimension (N-1)
-*          If UPLO = 'U', the (n-1) superdiagonal elements of the unit
-*          bidiagonal factor U from the factorization A = U'*D*U.
-*          If UPLO = 'L', the (n-1) subdiagonal elements of the unit
-*          bidiagonal factor L from the factorization A = L*D*L'.
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*          On entry, the right hand side vectors B for the system of
-*          linear equations.
-*          On exit, the solution vectors, X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            UPPER
-      INTEGER            IUPLO, J, JB, NB
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZPTTS2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments.
-*
-      INFO = 0
-      UPPER = ( UPLO.EQ.'U' .OR. UPLO.EQ.'u' )
-      IF( .NOT.UPPER .AND. .NOT.( UPLO.EQ.'L' .OR. UPLO.EQ.'l' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZPTTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 .OR. NRHS.EQ.0 )
-     $   RETURN
-*
-*     Determine the number of right-hand sides to solve at a time.
-*
-      IF( NRHS.EQ.1 ) THEN
-         NB = 1
-      ELSE
-         NB = MAX( 1, ILAENV( 1, 'ZPTTRS', UPLO, N, NRHS, -1, -1 ) )
-      END IF
-*
-*     Decode UPLO
-*
-      IF( UPPER ) THEN
-         IUPLO = 1
-      ELSE
-         IUPLO = 0
-      END IF
-*
-      IF( NB.GE.NRHS ) THEN
-         CALL ZPTTS2( IUPLO, N, NRHS, D, E, B, LDB )
-      ELSE
-         DO 10 J = 1, NRHS, NB
-            JB = MIN( NRHS-J+1, NB )
-            CALL ZPTTS2( IUPLO, N, JB, D, E, B( 1, J ), LDB )
-   10    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of ZPTTRS
-*
-      END
--- a/libcruft/lapack/zptts2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,176 +0,0 @@
-      SUBROUTINE ZPTTS2( IUPLO, N, NRHS, D, E, B, LDB )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IUPLO, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * )
-      COMPLEX*16         B( LDB, * ), E( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZPTTS2 solves a tridiagonal system of the form
-*     A * X = B
-*  using the factorization A = U'*D*U or A = L*D*L' computed by ZPTTRF.
-*  D is a diagonal matrix specified in the vector D, U (or L) is a unit
-*  bidiagonal matrix whose superdiagonal (subdiagonal) is specified in
-*  the vector E, and X and B are N by NRHS matrices.
-*
-*  Arguments
-*  =========
-*
-*  IUPLO   (input) INTEGER
-*          Specifies the form of the factorization and whether the
-*          vector E is the superdiagonal of the upper bidiagonal factor
-*          U or the subdiagonal of the lower bidiagonal factor L.
-*          = 1:  A = U'*D*U, E is the superdiagonal of U
-*          = 0:  A = L*D*L', E is the subdiagonal of L
-*
-*  N       (input) INTEGER
-*          The order of the tridiagonal matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  D       (input) DOUBLE PRECISION array, dimension (N)
-*          The n diagonal elements of the diagonal matrix D from the
-*          factorization A = U'*D*U or A = L*D*L'.
-*
-*  E       (input) COMPLEX*16 array, dimension (N-1)
-*          If IUPLO = 1, the (n-1) superdiagonal elements of the unit
-*          bidiagonal factor U from the factorization A = U'*D*U.
-*          If IUPLO = 0, the (n-1) subdiagonal elements of the unit
-*          bidiagonal factor L from the factorization A = L*D*L'.
-*
-*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
-*          On entry, the right hand side vectors B for the system of
-*          linear equations.
-*          On exit, the solution vectors, X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, J
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           ZDSCAL
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG
-*     ..
-*     .. Executable Statements ..
-*
-*     Quick return if possible
-*
-      IF( N.LE.1 ) THEN
-         IF( N.EQ.1 )
-     $      CALL ZDSCAL( NRHS, 1.D0 / D( 1 ), B, LDB )
-         RETURN
-      END IF
-*
-      IF( IUPLO.EQ.1 ) THEN
-*
-*        Solve A * X = B using the factorization A = U'*D*U,
-*        overwriting each right hand side vector with its solution.
-*
-         IF( NRHS.LE.2 ) THEN
-            J = 1
-   10       CONTINUE
-*
-*           Solve U' * x = b.
-*
-            DO 20 I = 2, N
-               B( I, J ) = B( I, J ) - B( I-1, J )*DCONJG( E( I-1 ) )
-   20       CONTINUE
-*
-*           Solve D * U * x = b.
-*
-            DO 30 I = 1, N
-               B( I, J ) = B( I, J ) / D( I )
-   30       CONTINUE
-            DO 40 I = N - 1, 1, -1
-               B( I, J ) = B( I, J ) - B( I+1, J )*E( I )
-   40       CONTINUE
-            IF( J.LT.NRHS ) THEN
-               J = J + 1
-               GO TO 10
-            END IF
-         ELSE
-            DO 70 J = 1, NRHS
-*
-*              Solve U' * x = b.
-*
-               DO 50 I = 2, N
-                  B( I, J ) = B( I, J ) - B( I-1, J )*DCONJG( E( I-1 ) )
-   50          CONTINUE
-*
-*              Solve D * U * x = b.
-*
-               B( N, J ) = B( N, J ) / D( N )
-               DO 60 I = N - 1, 1, -1
-                  B( I, J ) = B( I, J ) / D( I ) - B( I+1, J )*E( I )
-   60          CONTINUE
-   70       CONTINUE
-         END IF
-      ELSE
-*
-*        Solve A * X = B using the factorization A = L*D*L',
-*        overwriting each right hand side vector with its solution.
-*
-         IF( NRHS.LE.2 ) THEN
-            J = 1
-   80       CONTINUE
-*
-*           Solve L * x = b.
-*
-            DO 90 I = 2, N
-               B( I, J ) = B( I, J ) - B( I-1, J )*E( I-1 )
-   90       CONTINUE
-*
-*           Solve D * L' * x = b.
-*
-            DO 100 I = 1, N
-               B( I, J ) = B( I, J ) / D( I )
-  100       CONTINUE
-            DO 110 I = N - 1, 1, -1
-               B( I, J ) = B( I, J ) - B( I+1, J )*DCONJG( E( I ) )
-  110       CONTINUE
-            IF( J.LT.NRHS ) THEN
-               J = J + 1
-               GO TO 80
-            END IF
-         ELSE
-            DO 140 J = 1, NRHS
-*
-*              Solve L * x = b.
-*
-               DO 120 I = 2, N
-                  B( I, J ) = B( I, J ) - B( I-1, J )*E( I-1 )
-  120          CONTINUE
-*
-*              Solve D * L' * x = b.
-*
-               B( N, J ) = B( N, J ) / D( N )
-               DO 130 I = N - 1, 1, -1
-                  B( I, J ) = B( I, J ) / D( I ) -
-     $                        B( I+1, J )*DCONJG( E( I ) )
-  130          CONTINUE
-  140       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZPTTS2
-*
-      END
--- a/libcruft/lapack/zrot.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-      SUBROUTINE ZROT( N, CX, INCX, CY, INCY, C, S )
-*
-*  -- LAPACK auxiliary routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INCX, INCY, N
-      DOUBLE PRECISION   C
-      COMPLEX*16         S
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         CX( * ), CY( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZROT   applies a plane rotation, where the cos (C) is real and the
-*  sin (S) is complex, and the vectors CX and CY are complex.
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The number of elements in the vectors CX and CY.
-*
-*  CX      (input/output) COMPLEX*16 array, dimension (N)
-*          On input, the vector X.
-*          On output, CX is overwritten with C*X + S*Y.
-*
-*  INCX    (input) INTEGER
-*          The increment between successive values of CY.  INCX <> 0.
-*
-*  CY      (input/output) COMPLEX*16 array, dimension (N)
-*          On input, the vector Y.
-*          On output, CY is overwritten with -CONJG(S)*X + C*Y.
-*
-*  INCY    (input) INTEGER
-*          The increment between successive values of CY.  INCX <> 0.
-*
-*  C       (input) DOUBLE PRECISION
-*  S       (input) COMPLEX*16
-*          C and S define a rotation
-*             [  C          S  ]
-*             [ -conjg(S)   C  ]
-*          where C*C + S*CONJG(S) = 1.0.
-*
-* =====================================================================
-*
-*     .. Local Scalars ..
-      INTEGER            I, IX, IY
-      COMPLEX*16         STEMP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG
-*     ..
-*     .. Executable Statements ..
-*
-      IF( N.LE.0 )
-     $   RETURN
-      IF( INCX.EQ.1 .AND. INCY.EQ.1 )
-     $   GO TO 20
-*
-*     Code for unequal increments or equal increments not equal to 1
-*
-      IX = 1
-      IY = 1
-      IF( INCX.LT.0 )
-     $   IX = ( -N+1 )*INCX + 1
-      IF( INCY.LT.0 )
-     $   IY = ( -N+1 )*INCY + 1
-      DO 10 I = 1, N
-         STEMP = C*CX( IX ) + S*CY( IY )
-         CY( IY ) = C*CY( IY ) - DCONJG( S )*CX( IX )
-         CX( IX ) = STEMP
-         IX = IX + INCX
-         IY = IY + INCY
-   10 CONTINUE
-      RETURN
-*
-*     Code for both increments equal to 1
-*
-   20 CONTINUE
-      DO 30 I = 1, N
-         STEMP = C*CX( I ) + S*CY( I )
-         CY( I ) = C*CY( I ) - DCONJG( S )*CX( I )
-         CX( I ) = STEMP
-   30 CONTINUE
-      RETURN
-      END
--- a/libcruft/lapack/zsteqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,503 +0,0 @@
-      SUBROUTINE ZSTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPZ
-      INTEGER            INFO, LDZ, N
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   D( * ), E( * ), WORK( * )
-      COMPLEX*16         Z( LDZ, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZSTEQR computes all eigenvalues and, optionally, eigenvectors of a
-*  symmetric tridiagonal matrix using the implicit QL or QR method.
-*  The eigenvectors of a full or band complex Hermitian matrix can also
-*  be found if ZHETRD or ZHPTRD or ZHBTRD has been used to reduce this
-*  matrix to tridiagonal form.
-*
-*  Arguments
-*  =========
-*
-*  COMPZ   (input) CHARACTER*1
-*          = 'N':  Compute eigenvalues only.
-*          = 'V':  Compute eigenvalues and eigenvectors of the original
-*                  Hermitian matrix.  On entry, Z must contain the
-*                  unitary matrix used to reduce the original matrix
-*                  to tridiagonal form.
-*          = 'I':  Compute eigenvalues and eigenvectors of the
-*                  tridiagonal matrix.  Z is initialized to the identity
-*                  matrix.
-*
-*  N       (input) INTEGER
-*          The order of the matrix.  N >= 0.
-*
-*  D       (input/output) DOUBLE PRECISION array, dimension (N)
-*          On entry, the diagonal elements of the tridiagonal matrix.
-*          On exit, if INFO = 0, the eigenvalues in ascending order.
-*
-*  E       (input/output) DOUBLE PRECISION array, dimension (N-1)
-*          On entry, the (n-1) subdiagonal elements of the tridiagonal
-*          matrix.
-*          On exit, E has been destroyed.
-*
-*  Z       (input/output) COMPLEX*16 array, dimension (LDZ, N)
-*          On entry, if  COMPZ = 'V', then Z contains the unitary
-*          matrix used in the reduction to tridiagonal form.
-*          On exit, if INFO = 0, then if COMPZ = 'V', Z contains the
-*          orthonormal eigenvectors of the original Hermitian matrix,
-*          and if COMPZ = 'I', Z contains the orthonormal eigenvectors
-*          of the symmetric tridiagonal matrix.
-*          If COMPZ = 'N', then Z is not referenced.
-*
-*  LDZ     (input) INTEGER
-*          The leading dimension of the array Z.  LDZ >= 1, and if
-*          eigenvectors are desired, then  LDZ >= max(1,N).
-*
-*  WORK    (workspace) DOUBLE PRECISION array, dimension (max(1,2*N-2))
-*          If COMPZ = 'N', then WORK is not referenced.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*          > 0:  the algorithm has failed to find all the eigenvalues in
-*                a total of 30*N iterations; if INFO = i, then i
-*                elements of E have not converged to zero; on exit, D
-*                and E contain the elements of a symmetric tridiagonal
-*                matrix which is unitarily similar to the original
-*                matrix.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE, TWO, THREE
-      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0,
-     $                   THREE = 3.0D0 )
-      COMPLEX*16         CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0D0, 0.0D0 ),
-     $                   CONE = ( 1.0D0, 0.0D0 ) )
-      INTEGER            MAXIT
-      PARAMETER          ( MAXIT = 30 )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, ICOMPZ, II, ISCALE, J, JTOT, K, L, L1, LEND,
-     $                   LENDM1, LENDP1, LENDSV, LM1, LSV, M, MM, MM1,
-     $                   NM1, NMAXIT
-      DOUBLE PRECISION   ANORM, B, C, EPS, EPS2, F, G, P, R, RT1, RT2,
-     $                   S, SAFMAX, SAFMIN, SSFMAX, SSFMIN, TST
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   DLAMCH, DLANST, DLAPY2
-      EXTERNAL           LSAME, DLAMCH, DLANST, DLAPY2
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLAE2, DLAEV2, DLARTG, DLASCL, DLASRT, XERBLA,
-     $                   ZLASET, ZLASR, ZSWAP
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, MAX, SIGN, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-*
-      IF( LSAME( COMPZ, 'N' ) ) THEN
-         ICOMPZ = 0
-      ELSE IF( LSAME( COMPZ, 'V' ) ) THEN
-         ICOMPZ = 1
-      ELSE IF( LSAME( COMPZ, 'I' ) ) THEN
-         ICOMPZ = 2
-      ELSE
-         ICOMPZ = -1
-      END IF
-      IF( ICOMPZ.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( ( LDZ.LT.1 ) .OR. ( ICOMPZ.GT.0 .AND. LDZ.LT.MAX( 1,
-     $         N ) ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZSTEQR', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-      IF( N.EQ.1 ) THEN
-         IF( ICOMPZ.EQ.2 )
-     $      Z( 1, 1 ) = CONE
-         RETURN
-      END IF
-*
-*     Determine the unit roundoff and over/underflow thresholds.
-*
-      EPS = DLAMCH( 'E' )
-      EPS2 = EPS**2
-      SAFMIN = DLAMCH( 'S' )
-      SAFMAX = ONE / SAFMIN
-      SSFMAX = SQRT( SAFMAX ) / THREE
-      SSFMIN = SQRT( SAFMIN ) / EPS2
-*
-*     Compute the eigenvalues and eigenvectors of the tridiagonal
-*     matrix.
-*
-      IF( ICOMPZ.EQ.2 )
-     $   CALL ZLASET( 'Full', N, N, CZERO, CONE, Z, LDZ )
-*
-      NMAXIT = N*MAXIT
-      JTOT = 0
-*
-*     Determine where the matrix splits and choose QL or QR iteration
-*     for each block, according to whether top or bottom diagonal
-*     element is smaller.
-*
-      L1 = 1
-      NM1 = N - 1
-*
-   10 CONTINUE
-      IF( L1.GT.N )
-     $   GO TO 160
-      IF( L1.GT.1 )
-     $   E( L1-1 ) = ZERO
-      IF( L1.LE.NM1 ) THEN
-         DO 20 M = L1, NM1
-            TST = ABS( E( M ) )
-            IF( TST.EQ.ZERO )
-     $         GO TO 30
-            IF( TST.LE.( SQRT( ABS( D( M ) ) )*SQRT( ABS( D( M+
-     $          1 ) ) ) )*EPS ) THEN
-               E( M ) = ZERO
-               GO TO 30
-            END IF
-   20    CONTINUE
-      END IF
-      M = N
-*
-   30 CONTINUE
-      L = L1
-      LSV = L
-      LEND = M
-      LENDSV = LEND
-      L1 = M + 1
-      IF( LEND.EQ.L )
-     $   GO TO 10
-*
-*     Scale submatrix in rows and columns L to LEND
-*
-      ANORM = DLANST( 'I', LEND-L+1, D( L ), E( L ) )
-      ISCALE = 0
-      IF( ANORM.EQ.ZERO )
-     $   GO TO 10
-      IF( ANORM.GT.SSFMAX ) THEN
-         ISCALE = 1
-         CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L+1, 1, D( L ), N,
-     $                INFO )
-         CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L, 1, E( L ), N,
-     $                INFO )
-      ELSE IF( ANORM.LT.SSFMIN ) THEN
-         ISCALE = 2
-         CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L+1, 1, D( L ), N,
-     $                INFO )
-         CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L, 1, E( L ), N,
-     $                INFO )
-      END IF
-*
-*     Choose between QL and QR iteration
-*
-      IF( ABS( D( LEND ) ).LT.ABS( D( L ) ) ) THEN
-         LEND = LSV
-         L = LENDSV
-      END IF
-*
-      IF( LEND.GT.L ) THEN
-*
-*        QL Iteration
-*
-*        Look for small subdiagonal element.
-*
-   40    CONTINUE
-         IF( L.NE.LEND ) THEN
-            LENDM1 = LEND - 1
-            DO 50 M = L, LENDM1
-               TST = ABS( E( M ) )**2
-               IF( TST.LE.( EPS2*ABS( D( M ) ) )*ABS( D( M+1 ) )+
-     $             SAFMIN )GO TO 60
-   50       CONTINUE
-         END IF
-*
-         M = LEND
-*
-   60    CONTINUE
-         IF( M.LT.LEND )
-     $      E( M ) = ZERO
-         P = D( L )
-         IF( M.EQ.L )
-     $      GO TO 80
-*
-*        If remaining matrix is 2-by-2, use DLAE2 or SLAEV2
-*        to compute its eigensystem.
-*
-         IF( M.EQ.L+1 ) THEN
-            IF( ICOMPZ.GT.0 ) THEN
-               CALL DLAEV2( D( L ), E( L ), D( L+1 ), RT1, RT2, C, S )
-               WORK( L ) = C
-               WORK( N-1+L ) = S
-               CALL ZLASR( 'R', 'V', 'B', N, 2, WORK( L ),
-     $                     WORK( N-1+L ), Z( 1, L ), LDZ )
-            ELSE
-               CALL DLAE2( D( L ), E( L ), D( L+1 ), RT1, RT2 )
-            END IF
-            D( L ) = RT1
-            D( L+1 ) = RT2
-            E( L ) = ZERO
-            L = L + 2
-            IF( L.LE.LEND )
-     $         GO TO 40
-            GO TO 140
-         END IF
-*
-         IF( JTOT.EQ.NMAXIT )
-     $      GO TO 140
-         JTOT = JTOT + 1
-*
-*        Form shift.
-*
-         G = ( D( L+1 )-P ) / ( TWO*E( L ) )
-         R = DLAPY2( G, ONE )
-         G = D( M ) - P + ( E( L ) / ( G+SIGN( R, G ) ) )
-*
-         S = ONE
-         C = ONE
-         P = ZERO
-*
-*        Inner loop
-*
-         MM1 = M - 1
-         DO 70 I = MM1, L, -1
-            F = S*E( I )
-            B = C*E( I )
-            CALL DLARTG( G, F, C, S, R )
-            IF( I.NE.M-1 )
-     $         E( I+1 ) = R
-            G = D( I+1 ) - P
-            R = ( D( I )-G )*S + TWO*C*B
-            P = S*R
-            D( I+1 ) = G + P
-            G = C*R - B
-*
-*           If eigenvectors are desired, then save rotations.
-*
-            IF( ICOMPZ.GT.0 ) THEN
-               WORK( I ) = C
-               WORK( N-1+I ) = -S
-            END IF
-*
-   70    CONTINUE
-*
-*        If eigenvectors are desired, then apply saved rotations.
-*
-         IF( ICOMPZ.GT.0 ) THEN
-            MM = M - L + 1
-            CALL ZLASR( 'R', 'V', 'B', N, MM, WORK( L ), WORK( N-1+L ),
-     $                  Z( 1, L ), LDZ )
-         END IF
-*
-         D( L ) = D( L ) - P
-         E( L ) = G
-         GO TO 40
-*
-*        Eigenvalue found.
-*
-   80    CONTINUE
-         D( L ) = P
-*
-         L = L + 1
-         IF( L.LE.LEND )
-     $      GO TO 40
-         GO TO 140
-*
-      ELSE
-*
-*        QR Iteration
-*
-*        Look for small superdiagonal element.
-*
-   90    CONTINUE
-         IF( L.NE.LEND ) THEN
-            LENDP1 = LEND + 1
-            DO 100 M = L, LENDP1, -1
-               TST = ABS( E( M-1 ) )**2
-               IF( TST.LE.( EPS2*ABS( D( M ) ) )*ABS( D( M-1 ) )+
-     $             SAFMIN )GO TO 110
-  100       CONTINUE
-         END IF
-*
-         M = LEND
-*
-  110    CONTINUE
-         IF( M.GT.LEND )
-     $      E( M-1 ) = ZERO
-         P = D( L )
-         IF( M.EQ.L )
-     $      GO TO 130
-*
-*        If remaining matrix is 2-by-2, use DLAE2 or SLAEV2
-*        to compute its eigensystem.
-*
-         IF( M.EQ.L-1 ) THEN
-            IF( ICOMPZ.GT.0 ) THEN
-               CALL DLAEV2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2, C, S )
-               WORK( M ) = C
-               WORK( N-1+M ) = S
-               CALL ZLASR( 'R', 'V', 'F', N, 2, WORK( M ),
-     $                     WORK( N-1+M ), Z( 1, L-1 ), LDZ )
-            ELSE
-               CALL DLAE2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2 )
-            END IF
-            D( L-1 ) = RT1
-            D( L ) = RT2
-            E( L-1 ) = ZERO
-            L = L - 2
-            IF( L.GE.LEND )
-     $         GO TO 90
-            GO TO 140
-         END IF
-*
-         IF( JTOT.EQ.NMAXIT )
-     $      GO TO 140
-         JTOT = JTOT + 1
-*
-*        Form shift.
-*
-         G = ( D( L-1 )-P ) / ( TWO*E( L-1 ) )
-         R = DLAPY2( G, ONE )
-         G = D( M ) - P + ( E( L-1 ) / ( G+SIGN( R, G ) ) )
-*
-         S = ONE
-         C = ONE
-         P = ZERO
-*
-*        Inner loop
-*
-         LM1 = L - 1
-         DO 120 I = M, LM1
-            F = S*E( I )
-            B = C*E( I )
-            CALL DLARTG( G, F, C, S, R )
-            IF( I.NE.M )
-     $         E( I-1 ) = R
-            G = D( I ) - P
-            R = ( D( I+1 )-G )*S + TWO*C*B
-            P = S*R
-            D( I ) = G + P
-            G = C*R - B
-*
-*           If eigenvectors are desired, then save rotations.
-*
-            IF( ICOMPZ.GT.0 ) THEN
-               WORK( I ) = C
-               WORK( N-1+I ) = S
-            END IF
-*
-  120    CONTINUE
-*
-*        If eigenvectors are desired, then apply saved rotations.
-*
-         IF( ICOMPZ.GT.0 ) THEN
-            MM = L - M + 1
-            CALL ZLASR( 'R', 'V', 'F', N, MM, WORK( M ), WORK( N-1+M ),
-     $                  Z( 1, M ), LDZ )
-         END IF
-*
-         D( L ) = D( L ) - P
-         E( LM1 ) = G
-         GO TO 90
-*
-*        Eigenvalue found.
-*
-  130    CONTINUE
-         D( L ) = P
-*
-         L = L - 1
-         IF( L.GE.LEND )
-     $      GO TO 90
-         GO TO 140
-*
-      END IF
-*
-*     Undo scaling if necessary
-*
-  140 CONTINUE
-      IF( ISCALE.EQ.1 ) THEN
-         CALL DLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV+1, 1,
-     $                D( LSV ), N, INFO )
-         CALL DLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV, 1, E( LSV ),
-     $                N, INFO )
-      ELSE IF( ISCALE.EQ.2 ) THEN
-         CALL DLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV+1, 1,
-     $                D( LSV ), N, INFO )
-         CALL DLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV, 1, E( LSV ),
-     $                N, INFO )
-      END IF
-*
-*     Check for no convergence to an eigenvalue after a total
-*     of N*MAXIT iterations.
-*
-      IF( JTOT.EQ.NMAXIT ) THEN
-         DO 150 I = 1, N - 1
-            IF( E( I ).NE.ZERO )
-     $         INFO = INFO + 1
-  150    CONTINUE
-         RETURN
-      END IF
-      GO TO 10
-*
-*     Order eigenvalues and eigenvectors.
-*
-  160 CONTINUE
-      IF( ICOMPZ.EQ.0 ) THEN
-*
-*        Use Quick Sort
-*
-         CALL DLASRT( 'I', N, D, INFO )
-*
-      ELSE
-*
-*        Use Selection Sort to minimize swaps of eigenvectors
-*
-         DO 180 II = 2, N
-            I = II - 1
-            K = I
-            P = D( I )
-            DO 170 J = II, N
-               IF( D( J ).LT.P ) THEN
-                  K = J
-                  P = D( J )
-               END IF
-  170       CONTINUE
-            IF( K.NE.I ) THEN
-               D( K ) = D( I )
-               D( I ) = P
-               CALL ZSWAP( N, Z( 1, I ), 1, Z( 1, K ), 1 )
-            END IF
-  180    CONTINUE
-      END IF
-      RETURN
-*
-*     End of ZSTEQR
-*
-      END
--- a/libcruft/lapack/ztgevc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,633 +0,0 @@
-      SUBROUTINE ZTGEVC( SIDE, HOWMNY, SELECT, N, S, LDS, P, LDP, VL,
-     $                   LDVL, VR, LDVR, MM, M, WORK, RWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          HOWMNY, SIDE
-      INTEGER            INFO, LDP, LDS, LDVL, LDVR, M, MM, N
-*     ..
-*     .. Array Arguments ..
-      LOGICAL            SELECT( * )
-      DOUBLE PRECISION   RWORK( * )
-      COMPLEX*16         P( LDP, * ), S( LDS, * ), VL( LDVL, * ),
-     $                   VR( LDVR, * ), WORK( * )
-*     ..
-*
-*
-*  Purpose
-*  =======
-*
-*  ZTGEVC computes some or all of the right and/or left eigenvectors of
-*  a pair of complex matrices (S,P), where S and P are upper triangular.
-*  Matrix pairs of this type are produced by the generalized Schur
-*  factorization of a complex matrix pair (A,B):
-*  
-*     A = Q*S*Z**H,  B = Q*P*Z**H
-*  
-*  as computed by ZGGHRD + ZHGEQZ.
-*  
-*  The right eigenvector x and the left eigenvector y of (S,P)
-*  corresponding to an eigenvalue w are defined by:
-*  
-*     S*x = w*P*x,  (y**H)*S = w*(y**H)*P,
-*  
-*  where y**H denotes the conjugate tranpose of y.
-*  The eigenvalues are not input to this routine, but are computed
-*  directly from the diagonal elements of S and P.
-*  
-*  This routine returns the matrices X and/or Y of right and left
-*  eigenvectors of (S,P), or the products Z*X and/or Q*Y,
-*  where Z and Q are input matrices.
-*  If Q and Z are the unitary factors from the generalized Schur
-*  factorization of a matrix pair (A,B), then Z*X and Q*Y
-*  are the matrices of right and left eigenvectors of (A,B).
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'R': compute right eigenvectors only;
-*          = 'L': compute left eigenvectors only;
-*          = 'B': compute both right and left eigenvectors.
-*
-*  HOWMNY  (input) CHARACTER*1
-*          = 'A': compute all right and/or left eigenvectors;
-*          = 'B': compute all right and/or left eigenvectors,
-*                 backtransformed by the matrices in VR and/or VL;
-*          = 'S': compute selected right and/or left eigenvectors,
-*                 specified by the logical array SELECT.
-*
-*  SELECT  (input) LOGICAL array, dimension (N)
-*          If HOWMNY='S', SELECT specifies the eigenvectors to be
-*          computed.  The eigenvector corresponding to the j-th
-*          eigenvalue is computed if SELECT(j) = .TRUE..
-*          Not referenced if HOWMNY = 'A' or 'B'.
-*
-*  N       (input) INTEGER
-*          The order of the matrices S and P.  N >= 0.
-*
-*  S       (input) COMPLEX*16 array, dimension (LDS,N)
-*          The upper triangular matrix S from a generalized Schur
-*          factorization, as computed by ZHGEQZ.
-*
-*  LDS     (input) INTEGER
-*          The leading dimension of array S.  LDS >= max(1,N).
-*
-*  P       (input) COMPLEX*16 array, dimension (LDP,N)
-*          The upper triangular matrix P from a generalized Schur
-*          factorization, as computed by ZHGEQZ.  P must have real
-*          diagonal elements.
-*
-*  LDP     (input) INTEGER
-*          The leading dimension of array P.  LDP >= max(1,N).
-*
-*  VL      (input/output) COMPLEX*16 array, dimension (LDVL,MM)
-*          On entry, if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must
-*          contain an N-by-N matrix Q (usually the unitary matrix Q
-*          of left Schur vectors returned by ZHGEQZ).
-*          On exit, if SIDE = 'L' or 'B', VL contains:
-*          if HOWMNY = 'A', the matrix Y of left eigenvectors of (S,P);
-*          if HOWMNY = 'B', the matrix Q*Y;
-*          if HOWMNY = 'S', the left eigenvectors of (S,P) specified by
-*                      SELECT, stored consecutively in the columns of
-*                      VL, in the same order as their eigenvalues.
-*          Not referenced if SIDE = 'R'.
-*
-*  LDVL    (input) INTEGER
-*          The leading dimension of array VL.  LDVL >= 1, and if
-*          SIDE = 'L' or 'l' or 'B' or 'b', LDVL >= N.
-*
-*  VR      (input/output) COMPLEX*16 array, dimension (LDVR,MM)
-*          On entry, if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must
-*          contain an N-by-N matrix Q (usually the unitary matrix Z
-*          of right Schur vectors returned by ZHGEQZ).
-*          On exit, if SIDE = 'R' or 'B', VR contains:
-*          if HOWMNY = 'A', the matrix X of right eigenvectors of (S,P);
-*          if HOWMNY = 'B', the matrix Z*X;
-*          if HOWMNY = 'S', the right eigenvectors of (S,P) specified by
-*                      SELECT, stored consecutively in the columns of
-*                      VR, in the same order as their eigenvalues.
-*          Not referenced if SIDE = 'L'.
-*
-*  LDVR    (input) INTEGER
-*          The leading dimension of the array VR.  LDVR >= 1, and if
-*          SIDE = 'R' or 'B', LDVR >= N.
-*
-*  MM      (input) INTEGER
-*          The number of columns in the arrays VL and/or VR. MM >= M.
-*
-*  M       (output) INTEGER
-*          The number of columns in the arrays VL and/or VR actually
-*          used to store the eigenvectors.  If HOWMNY = 'A' or 'B', M
-*          is set to N.  Each selected eigenvector occupies one column.
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (2*N)
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (2*N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit.
-*          < 0:  if INFO = -i, the i-th argument had an illegal value.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-      COMPLEX*16         CZERO, CONE
-      PARAMETER          ( CZERO = ( 0.0D+0, 0.0D+0 ),
-     $                   CONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            COMPL, COMPR, ILALL, ILBACK, ILBBAD, ILCOMP,
-     $                   LSA, LSB
-      INTEGER            I, IBEG, IEIG, IEND, IHWMNY, IM, ISIDE, ISRC,
-     $                   J, JE, JR
-      DOUBLE PRECISION   ACOEFA, ACOEFF, ANORM, ASCALE, BCOEFA, BIG,
-     $                   BIGNUM, BNORM, BSCALE, DMIN, SAFMIN, SBETA,
-     $                   SCALE, SMALL, TEMP, ULP, XMAX
-      COMPLEX*16         BCOEFF, CA, CB, D, SALPHA, SUM, SUMA, SUMB, X
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   DLAMCH
-      COMPLEX*16         ZLADIV
-      EXTERNAL           LSAME, DLAMCH, ZLADIV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLABAD, XERBLA, ZGEMV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, DIMAG, MAX, MIN
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   ABS1
-*     ..
-*     .. Statement Function definitions ..
-      ABS1( X ) = ABS( DBLE( X ) ) + ABS( DIMAG( X ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and Test the input parameters
-*
-      IF( LSAME( HOWMNY, 'A' ) ) THEN
-         IHWMNY = 1
-         ILALL = .TRUE.
-         ILBACK = .FALSE.
-      ELSE IF( LSAME( HOWMNY, 'S' ) ) THEN
-         IHWMNY = 2
-         ILALL = .FALSE.
-         ILBACK = .FALSE.
-      ELSE IF( LSAME( HOWMNY, 'B' ) ) THEN
-         IHWMNY = 3
-         ILALL = .TRUE.
-         ILBACK = .TRUE.
-      ELSE
-         IHWMNY = -1
-      END IF
-*
-      IF( LSAME( SIDE, 'R' ) ) THEN
-         ISIDE = 1
-         COMPL = .FALSE.
-         COMPR = .TRUE.
-      ELSE IF( LSAME( SIDE, 'L' ) ) THEN
-         ISIDE = 2
-         COMPL = .TRUE.
-         COMPR = .FALSE.
-      ELSE IF( LSAME( SIDE, 'B' ) ) THEN
-         ISIDE = 3
-         COMPL = .TRUE.
-         COMPR = .TRUE.
-      ELSE
-         ISIDE = -1
-      END IF
-*
-      INFO = 0
-      IF( ISIDE.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( IHWMNY.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDS.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      ELSE IF( LDP.LT.MAX( 1, N ) ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZTGEVC', -INFO )
-         RETURN
-      END IF
-*
-*     Count the number of eigenvectors
-*
-      IF( .NOT.ILALL ) THEN
-         IM = 0
-         DO 10 J = 1, N
-            IF( SELECT( J ) )
-     $         IM = IM + 1
-   10    CONTINUE
-      ELSE
-         IM = N
-      END IF
-*
-*     Check diagonal of B
-*
-      ILBBAD = .FALSE.
-      DO 20 J = 1, N
-         IF( DIMAG( P( J, J ) ).NE.ZERO )
-     $      ILBBAD = .TRUE.
-   20 CONTINUE
-*
-      IF( ILBBAD ) THEN
-         INFO = -7
-      ELSE IF( COMPL .AND. LDVL.LT.N .OR. LDVL.LT.1 ) THEN
-         INFO = -10
-      ELSE IF( COMPR .AND. LDVR.LT.N .OR. LDVR.LT.1 ) THEN
-         INFO = -12
-      ELSE IF( MM.LT.IM ) THEN
-         INFO = -13
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZTGEVC', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      M = IM
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Machine Constants
-*
-      SAFMIN = DLAMCH( 'Safe minimum' )
-      BIG = ONE / SAFMIN
-      CALL DLABAD( SAFMIN, BIG )
-      ULP = DLAMCH( 'Epsilon' )*DLAMCH( 'Base' )
-      SMALL = SAFMIN*N / ULP
-      BIG = ONE / SMALL
-      BIGNUM = ONE / ( SAFMIN*N )
-*
-*     Compute the 1-norm of each column of the strictly upper triangular
-*     part of A and B to check for possible overflow in the triangular
-*     solver.
-*
-      ANORM = ABS1( S( 1, 1 ) )
-      BNORM = ABS1( P( 1, 1 ) )
-      RWORK( 1 ) = ZERO
-      RWORK( N+1 ) = ZERO
-      DO 40 J = 2, N
-         RWORK( J ) = ZERO
-         RWORK( N+J ) = ZERO
-         DO 30 I = 1, J - 1
-            RWORK( J ) = RWORK( J ) + ABS1( S( I, J ) )
-            RWORK( N+J ) = RWORK( N+J ) + ABS1( P( I, J ) )
-   30    CONTINUE
-         ANORM = MAX( ANORM, RWORK( J )+ABS1( S( J, J ) ) )
-         BNORM = MAX( BNORM, RWORK( N+J )+ABS1( P( J, J ) ) )
-   40 CONTINUE
-*
-      ASCALE = ONE / MAX( ANORM, SAFMIN )
-      BSCALE = ONE / MAX( BNORM, SAFMIN )
-*
-*     Left eigenvectors
-*
-      IF( COMPL ) THEN
-         IEIG = 0
-*
-*        Main loop over eigenvalues
-*
-         DO 140 JE = 1, N
-            IF( ILALL ) THEN
-               ILCOMP = .TRUE.
-            ELSE
-               ILCOMP = SELECT( JE )
-            END IF
-            IF( ILCOMP ) THEN
-               IEIG = IEIG + 1
-*
-               IF( ABS1( S( JE, JE ) ).LE.SAFMIN .AND.
-     $             ABS( DBLE( P( JE, JE ) ) ).LE.SAFMIN ) THEN
-*
-*                 Singular matrix pencil -- return unit eigenvector
-*
-                  DO 50 JR = 1, N
-                     VL( JR, IEIG ) = CZERO
-   50             CONTINUE
-                  VL( IEIG, IEIG ) = CONE
-                  GO TO 140
-               END IF
-*
-*              Non-singular eigenvalue:
-*              Compute coefficients  a  and  b  in
-*                   H
-*                 y  ( a A - b B ) = 0
-*
-               TEMP = ONE / MAX( ABS1( S( JE, JE ) )*ASCALE,
-     $                ABS( DBLE( P( JE, JE ) ) )*BSCALE, SAFMIN )
-               SALPHA = ( TEMP*S( JE, JE ) )*ASCALE
-               SBETA = ( TEMP*DBLE( P( JE, JE ) ) )*BSCALE
-               ACOEFF = SBETA*ASCALE
-               BCOEFF = SALPHA*BSCALE
-*
-*              Scale to avoid underflow
-*
-               LSA = ABS( SBETA ).GE.SAFMIN .AND. ABS( ACOEFF ).LT.SMALL
-               LSB = ABS1( SALPHA ).GE.SAFMIN .AND. ABS1( BCOEFF ).LT.
-     $               SMALL
-*
-               SCALE = ONE
-               IF( LSA )
-     $            SCALE = ( SMALL / ABS( SBETA ) )*MIN( ANORM, BIG )
-               IF( LSB )
-     $            SCALE = MAX( SCALE, ( SMALL / ABS1( SALPHA ) )*
-     $                    MIN( BNORM, BIG ) )
-               IF( LSA .OR. LSB ) THEN
-                  SCALE = MIN( SCALE, ONE /
-     $                    ( SAFMIN*MAX( ONE, ABS( ACOEFF ),
-     $                    ABS1( BCOEFF ) ) ) )
-                  IF( LSA ) THEN
-                     ACOEFF = ASCALE*( SCALE*SBETA )
-                  ELSE
-                     ACOEFF = SCALE*ACOEFF
-                  END IF
-                  IF( LSB ) THEN
-                     BCOEFF = BSCALE*( SCALE*SALPHA )
-                  ELSE
-                     BCOEFF = SCALE*BCOEFF
-                  END IF
-               END IF
-*
-               ACOEFA = ABS( ACOEFF )
-               BCOEFA = ABS1( BCOEFF )
-               XMAX = ONE
-               DO 60 JR = 1, N
-                  WORK( JR ) = CZERO
-   60          CONTINUE
-               WORK( JE ) = CONE
-               DMIN = MAX( ULP*ACOEFA*ANORM, ULP*BCOEFA*BNORM, SAFMIN )
-*
-*                                              H
-*              Triangular solve of  (a A - b B)  y = 0
-*
-*                                      H
-*              (rowwise in  (a A - b B) , or columnwise in a A - b B)
-*
-               DO 100 J = JE + 1, N
-*
-*                 Compute
-*                       j-1
-*                 SUM = sum  conjg( a*S(k,j) - b*P(k,j) )*x(k)
-*                       k=je
-*                 (Scale if necessary)
-*
-                  TEMP = ONE / XMAX
-                  IF( ACOEFA*RWORK( J )+BCOEFA*RWORK( N+J ).GT.BIGNUM*
-     $                TEMP ) THEN
-                     DO 70 JR = JE, J - 1
-                        WORK( JR ) = TEMP*WORK( JR )
-   70                CONTINUE
-                     XMAX = ONE
-                  END IF
-                  SUMA = CZERO
-                  SUMB = CZERO
-*
-                  DO 80 JR = JE, J - 1
-                     SUMA = SUMA + DCONJG( S( JR, J ) )*WORK( JR )
-                     SUMB = SUMB + DCONJG( P( JR, J ) )*WORK( JR )
-   80             CONTINUE
-                  SUM = ACOEFF*SUMA - DCONJG( BCOEFF )*SUMB
-*
-*                 Form x(j) = - SUM / conjg( a*S(j,j) - b*P(j,j) )
-*
-*                 with scaling and perturbation of the denominator
-*
-                  D = DCONJG( ACOEFF*S( J, J )-BCOEFF*P( J, J ) )
-                  IF( ABS1( D ).LE.DMIN )
-     $               D = DCMPLX( DMIN )
-*
-                  IF( ABS1( D ).LT.ONE ) THEN
-                     IF( ABS1( SUM ).GE.BIGNUM*ABS1( D ) ) THEN
-                        TEMP = ONE / ABS1( SUM )
-                        DO 90 JR = JE, J - 1
-                           WORK( JR ) = TEMP*WORK( JR )
-   90                   CONTINUE
-                        XMAX = TEMP*XMAX
-                        SUM = TEMP*SUM
-                     END IF
-                  END IF
-                  WORK( J ) = ZLADIV( -SUM, D )
-                  XMAX = MAX( XMAX, ABS1( WORK( J ) ) )
-  100          CONTINUE
-*
-*              Back transform eigenvector if HOWMNY='B'.
-*
-               IF( ILBACK ) THEN
-                  CALL ZGEMV( 'N', N, N+1-JE, CONE, VL( 1, JE ), LDVL,
-     $                        WORK( JE ), 1, CZERO, WORK( N+1 ), 1 )
-                  ISRC = 2
-                  IBEG = 1
-               ELSE
-                  ISRC = 1
-                  IBEG = JE
-               END IF
-*
-*              Copy and scale eigenvector into column of VL
-*
-               XMAX = ZERO
-               DO 110 JR = IBEG, N
-                  XMAX = MAX( XMAX, ABS1( WORK( ( ISRC-1 )*N+JR ) ) )
-  110          CONTINUE
-*
-               IF( XMAX.GT.SAFMIN ) THEN
-                  TEMP = ONE / XMAX
-                  DO 120 JR = IBEG, N
-                     VL( JR, IEIG ) = TEMP*WORK( ( ISRC-1 )*N+JR )
-  120             CONTINUE
-               ELSE
-                  IBEG = N + 1
-               END IF
-*
-               DO 130 JR = 1, IBEG - 1
-                  VL( JR, IEIG ) = CZERO
-  130          CONTINUE
-*
-            END IF
-  140    CONTINUE
-      END IF
-*
-*     Right eigenvectors
-*
-      IF( COMPR ) THEN
-         IEIG = IM + 1
-*
-*        Main loop over eigenvalues
-*
-         DO 250 JE = N, 1, -1
-            IF( ILALL ) THEN
-               ILCOMP = .TRUE.
-            ELSE
-               ILCOMP = SELECT( JE )
-            END IF
-            IF( ILCOMP ) THEN
-               IEIG = IEIG - 1
-*
-               IF( ABS1( S( JE, JE ) ).LE.SAFMIN .AND.
-     $             ABS( DBLE( P( JE, JE ) ) ).LE.SAFMIN ) THEN
-*
-*                 Singular matrix pencil -- return unit eigenvector
-*
-                  DO 150 JR = 1, N
-                     VR( JR, IEIG ) = CZERO
-  150             CONTINUE
-                  VR( IEIG, IEIG ) = CONE
-                  GO TO 250
-               END IF
-*
-*              Non-singular eigenvalue:
-*              Compute coefficients  a  and  b  in
-*
-*              ( a A - b B ) x  = 0
-*
-               TEMP = ONE / MAX( ABS1( S( JE, JE ) )*ASCALE,
-     $                ABS( DBLE( P( JE, JE ) ) )*BSCALE, SAFMIN )
-               SALPHA = ( TEMP*S( JE, JE ) )*ASCALE
-               SBETA = ( TEMP*DBLE( P( JE, JE ) ) )*BSCALE
-               ACOEFF = SBETA*ASCALE
-               BCOEFF = SALPHA*BSCALE
-*
-*              Scale to avoid underflow
-*
-               LSA = ABS( SBETA ).GE.SAFMIN .AND. ABS( ACOEFF ).LT.SMALL
-               LSB = ABS1( SALPHA ).GE.SAFMIN .AND. ABS1( BCOEFF ).LT.
-     $               SMALL
-*
-               SCALE = ONE
-               IF( LSA )
-     $            SCALE = ( SMALL / ABS( SBETA ) )*MIN( ANORM, BIG )
-               IF( LSB )
-     $            SCALE = MAX( SCALE, ( SMALL / ABS1( SALPHA ) )*
-     $                    MIN( BNORM, BIG ) )
-               IF( LSA .OR. LSB ) THEN
-                  SCALE = MIN( SCALE, ONE /
-     $                    ( SAFMIN*MAX( ONE, ABS( ACOEFF ),
-     $                    ABS1( BCOEFF ) ) ) )
-                  IF( LSA ) THEN
-                     ACOEFF = ASCALE*( SCALE*SBETA )
-                  ELSE
-                     ACOEFF = SCALE*ACOEFF
-                  END IF
-                  IF( LSB ) THEN
-                     BCOEFF = BSCALE*( SCALE*SALPHA )
-                  ELSE
-                     BCOEFF = SCALE*BCOEFF
-                  END IF
-               END IF
-*
-               ACOEFA = ABS( ACOEFF )
-               BCOEFA = ABS1( BCOEFF )
-               XMAX = ONE
-               DO 160 JR = 1, N
-                  WORK( JR ) = CZERO
-  160          CONTINUE
-               WORK( JE ) = CONE
-               DMIN = MAX( ULP*ACOEFA*ANORM, ULP*BCOEFA*BNORM, SAFMIN )
-*
-*              Triangular solve of  (a A - b B) x = 0  (columnwise)
-*
-*              WORK(1:j-1) contains sums w,
-*              WORK(j+1:JE) contains x
-*
-               DO 170 JR = 1, JE - 1
-                  WORK( JR ) = ACOEFF*S( JR, JE ) - BCOEFF*P( JR, JE )
-  170          CONTINUE
-               WORK( JE ) = CONE
-*
-               DO 210 J = JE - 1, 1, -1
-*
-*                 Form x(j) := - w(j) / d
-*                 with scaling and perturbation of the denominator
-*
-                  D = ACOEFF*S( J, J ) - BCOEFF*P( J, J )
-                  IF( ABS1( D ).LE.DMIN )
-     $               D = DCMPLX( DMIN )
-*
-                  IF( ABS1( D ).LT.ONE ) THEN
-                     IF( ABS1( WORK( J ) ).GE.BIGNUM*ABS1( D ) ) THEN
-                        TEMP = ONE / ABS1( WORK( J ) )
-                        DO 180 JR = 1, JE
-                           WORK( JR ) = TEMP*WORK( JR )
-  180                   CONTINUE
-                     END IF
-                  END IF
-*
-                  WORK( J ) = ZLADIV( -WORK( J ), D )
-*
-                  IF( J.GT.1 ) THEN
-*
-*                    w = w + x(j)*(a S(*,j) - b P(*,j) ) with scaling
-*
-                     IF( ABS1( WORK( J ) ).GT.ONE ) THEN
-                        TEMP = ONE / ABS1( WORK( J ) )
-                        IF( ACOEFA*RWORK( J )+BCOEFA*RWORK( N+J ).GE.
-     $                      BIGNUM*TEMP ) THEN
-                           DO 190 JR = 1, JE
-                              WORK( JR ) = TEMP*WORK( JR )
-  190                      CONTINUE
-                        END IF
-                     END IF
-*
-                     CA = ACOEFF*WORK( J )
-                     CB = BCOEFF*WORK( J )
-                     DO 200 JR = 1, J - 1
-                        WORK( JR ) = WORK( JR ) + CA*S( JR, J ) -
-     $                               CB*P( JR, J )
-  200                CONTINUE
-                  END IF
-  210          CONTINUE
-*
-*              Back transform eigenvector if HOWMNY='B'.
-*
-               IF( ILBACK ) THEN
-                  CALL ZGEMV( 'N', N, JE, CONE, VR, LDVR, WORK, 1,
-     $                        CZERO, WORK( N+1 ), 1 )
-                  ISRC = 2
-                  IEND = N
-               ELSE
-                  ISRC = 1
-                  IEND = JE
-               END IF
-*
-*              Copy and scale eigenvector into column of VR
-*
-               XMAX = ZERO
-               DO 220 JR = 1, IEND
-                  XMAX = MAX( XMAX, ABS1( WORK( ( ISRC-1 )*N+JR ) ) )
-  220          CONTINUE
-*
-               IF( XMAX.GT.SAFMIN ) THEN
-                  TEMP = ONE / XMAX
-                  DO 230 JR = 1, IEND
-                     VR( JR, IEIG ) = TEMP*WORK( ( ISRC-1 )*N+JR )
-  230             CONTINUE
-               ELSE
-                  IEND = 0
-               END IF
-*
-               DO 240 JR = IEND + 1, N
-                  VR( JR, IEIG ) = CZERO
-  240          CONTINUE
-*
-            END IF
-  250    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of ZTGEVC
-*
-      END
--- a/libcruft/lapack/ztrcon.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,204 +0,0 @@
-      SUBROUTINE ZTRCON( NORM, UPLO, DIAG, N, A, LDA, RCOND, WORK,
-     $                   RWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call ZLACN2 in place of ZLACON, 10 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, NORM, UPLO
-      INTEGER            INFO, LDA, N
-      DOUBLE PRECISION   RCOND
-*     ..
-*     .. Array Arguments ..
-      DOUBLE PRECISION   RWORK( * )
-      COMPLEX*16         A( LDA, * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZTRCON estimates the reciprocal of the condition number of a
-*  triangular matrix A, in either the 1-norm or the infinity-norm.
-*
-*  The norm of A is computed and an estimate is obtained for
-*  norm(inv(A)), then the reciprocal of the condition number is
-*  computed as
-*     RCOND = 1 / ( norm(A) * norm(inv(A)) ).
-*
-*  Arguments
-*  =========
-*
-*  NORM    (input) CHARACTER*1
-*          Specifies whether the 1-norm condition number or the
-*          infinity-norm condition number is required:
-*          = '1' or 'O':  1-norm;
-*          = 'I':         Infinity-norm.
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  A is upper triangular;
-*          = 'L':  A is lower triangular.
-*
-*  DIAG    (input) CHARACTER*1
-*          = 'N':  A is non-unit triangular;
-*          = 'U':  A is unit triangular.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input) COMPLEX*16 array, dimension (LDA,N)
-*          The triangular matrix A.  If UPLO = 'U', the leading N-by-N
-*          upper triangular part of the array A contains the upper
-*          triangular matrix, and the strictly lower triangular part of
-*          A is not referenced.  If UPLO = 'L', the leading N-by-N lower
-*          triangular part of the array A contains the lower triangular
-*          matrix, and the strictly upper triangular part of A is not
-*          referenced.  If DIAG = 'U', the diagonal elements of A are
-*          also not referenced and are assumed to be 1.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  RCOND   (output) DOUBLE PRECISION
-*          The reciprocal of the condition number of the matrix A,
-*          computed as RCOND = 1/(norm(A) * norm(inv(A))).
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (2*N)
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE, ZERO
-      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOUNIT, ONENRM, UPPER
-      CHARACTER          NORMIN
-      INTEGER            IX, KASE, KASE1
-      DOUBLE PRECISION   AINVNM, ANORM, SCALE, SMLNUM, XNORM
-      COMPLEX*16         ZDUM
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IZAMAX
-      DOUBLE PRECISION   DLAMCH, ZLANTR
-      EXTERNAL           LSAME, IZAMAX, DLAMCH, ZLANTR
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZDRSCL, ZLACN2, ZLATRS
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DIMAG, MAX
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' )
-      NOUNIT = LSAME( DIAG, 'N' )
-*
-      IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZTRCON', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         RCOND = ONE
-         RETURN
-      END IF
-*
-      RCOND = ZERO
-      SMLNUM = DLAMCH( 'Safe minimum' )*DBLE( MAX( 1, N ) )
-*
-*     Compute the norm of the triangular matrix A.
-*
-      ANORM = ZLANTR( NORM, UPLO, DIAG, N, N, A, LDA, RWORK )
-*
-*     Continue only if ANORM > 0.
-*
-      IF( ANORM.GT.ZERO ) THEN
-*
-*        Estimate the norm of the inverse of A.
-*
-         AINVNM = ZERO
-         NORMIN = 'N'
-         IF( ONENRM ) THEN
-            KASE1 = 1
-         ELSE
-            KASE1 = 2
-         END IF
-         KASE = 0
-   10    CONTINUE
-         CALL ZLACN2( N, WORK( N+1 ), WORK, AINVNM, KASE, ISAVE )
-         IF( KASE.NE.0 ) THEN
-            IF( KASE.EQ.KASE1 ) THEN
-*
-*              Multiply by inv(A).
-*
-               CALL ZLATRS( UPLO, 'No transpose', DIAG, NORMIN, N, A,
-     $                      LDA, WORK, SCALE, RWORK, INFO )
-            ELSE
-*
-*              Multiply by inv(A').
-*
-               CALL ZLATRS( UPLO, 'Conjugate transpose', DIAG, NORMIN,
-     $                      N, A, LDA, WORK, SCALE, RWORK, INFO )
-            END IF
-            NORMIN = 'Y'
-*
-*           Multiply by 1/SCALE if doing so will not cause overflow.
-*
-            IF( SCALE.NE.ONE ) THEN
-               IX = IZAMAX( N, WORK, 1 )
-               XNORM = CABS1( WORK( IX ) )
-               IF( SCALE.LT.XNORM*SMLNUM .OR. SCALE.EQ.ZERO )
-     $            GO TO 20
-               CALL ZDRSCL( N, SCALE, WORK, 1 )
-            END IF
-            GO TO 10
-         END IF
-*
-*        Compute the estimate of the reciprocal condition number.
-*
-         IF( AINVNM.NE.ZERO )
-     $      RCOND = ( ONE / ANORM ) / AINVNM
-      END IF
-*
-   20 CONTINUE
-      RETURN
-*
-*     End of ZTRCON
-*
-      END
--- a/libcruft/lapack/ztrevc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,386 +0,0 @@
-      SUBROUTINE ZTREVC( SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR,
-     $                   LDVR, MM, M, WORK, RWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          HOWMNY, SIDE
-      INTEGER            INFO, LDT, LDVL, LDVR, M, MM, N
-*     ..
-*     .. Array Arguments ..
-      LOGICAL            SELECT( * )
-      DOUBLE PRECISION   RWORK( * )
-      COMPLEX*16         T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
-     $                   WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZTREVC computes some or all of the right and/or left eigenvectors of
-*  a complex upper triangular matrix T.
-*  Matrices of this type are produced by the Schur factorization of
-*  a complex general matrix:  A = Q*T*Q**H, as computed by ZHSEQR.
-*  
-*  The right eigenvector x and the left eigenvector y of T corresponding
-*  to an eigenvalue w are defined by:
-*  
-*               T*x = w*x,     (y**H)*T = w*(y**H)
-*  
-*  where y**H denotes the conjugate transpose of the vector y.
-*  The eigenvalues are not input to this routine, but are read directly
-*  from the diagonal of T.
-*  
-*  This routine returns the matrices X and/or Y of right and left
-*  eigenvectors of T, or the products Q*X and/or Q*Y, where Q is an
-*  input matrix.  If Q is the unitary factor that reduces a matrix A to
-*  Schur form T, then Q*X and Q*Y are the matrices of right and left
-*  eigenvectors of A.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'R':  compute right eigenvectors only;
-*          = 'L':  compute left eigenvectors only;
-*          = 'B':  compute both right and left eigenvectors.
-*
-*  HOWMNY  (input) CHARACTER*1
-*          = 'A':  compute all right and/or left eigenvectors;
-*          = 'B':  compute all right and/or left eigenvectors,
-*                  backtransformed using the matrices supplied in
-*                  VR and/or VL;
-*          = 'S':  compute selected right and/or left eigenvectors,
-*                  as indicated by the logical array SELECT.
-*
-*  SELECT  (input) LOGICAL array, dimension (N)
-*          If HOWMNY = 'S', SELECT specifies the eigenvectors to be
-*          computed.
-*          The eigenvector corresponding to the j-th eigenvalue is
-*          computed if SELECT(j) = .TRUE..
-*          Not referenced if HOWMNY = 'A' or 'B'.
-*
-*  N       (input) INTEGER
-*          The order of the matrix T. N >= 0.
-*
-*  T       (input/output) COMPLEX*16 array, dimension (LDT,N)
-*          The upper triangular matrix T.  T is modified, but restored
-*          on exit.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= max(1,N).
-*
-*  VL      (input/output) COMPLEX*16 array, dimension (LDVL,MM)
-*          On entry, if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must
-*          contain an N-by-N matrix Q (usually the unitary matrix Q of
-*          Schur vectors returned by ZHSEQR).
-*          On exit, if SIDE = 'L' or 'B', VL contains:
-*          if HOWMNY = 'A', the matrix Y of left eigenvectors of T;
-*          if HOWMNY = 'B', the matrix Q*Y;
-*          if HOWMNY = 'S', the left eigenvectors of T specified by
-*                           SELECT, stored consecutively in the columns
-*                           of VL, in the same order as their
-*                           eigenvalues.
-*          Not referenced if SIDE = 'R'.
-*
-*  LDVL    (input) INTEGER
-*          The leading dimension of the array VL.  LDVL >= 1, and if
-*          SIDE = 'L' or 'B', LDVL >= N.
-*
-*  VR      (input/output) COMPLEX*16 array, dimension (LDVR,MM)
-*          On entry, if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must
-*          contain an N-by-N matrix Q (usually the unitary matrix Q of
-*          Schur vectors returned by ZHSEQR).
-*          On exit, if SIDE = 'R' or 'B', VR contains:
-*          if HOWMNY = 'A', the matrix X of right eigenvectors of T;
-*          if HOWMNY = 'B', the matrix Q*X;
-*          if HOWMNY = 'S', the right eigenvectors of T specified by
-*                           SELECT, stored consecutively in the columns
-*                           of VR, in the same order as their
-*                           eigenvalues.
-*          Not referenced if SIDE = 'L'.
-*
-*  LDVR    (input) INTEGER
-*          The leading dimension of the array VR.  LDVR >= 1, and if
-*          SIDE = 'R' or 'B'; LDVR >= N.
-*
-*  MM      (input) INTEGER
-*          The number of columns in the arrays VL and/or VR. MM >= M.
-*
-*  M       (output) INTEGER
-*          The number of columns in the arrays VL and/or VR actually
-*          used to store the eigenvectors.  If HOWMNY = 'A' or 'B', M
-*          is set to N.  Each selected eigenvector occupies one
-*          column.
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (2*N)
-*
-*  RWORK   (workspace) DOUBLE PRECISION array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  The algorithm used in this program is basically backward (forward)
-*  substitution, with scaling to make the the code robust against
-*  possible overflow.
-*
-*  Each eigenvector is normalized so that the element of largest
-*  magnitude has magnitude 1; here the magnitude of a complex number
-*  (x,y) is taken to be |x| + |y|.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-      COMPLEX*16         CMZERO, CMONE
-      PARAMETER          ( CMZERO = ( 0.0D+0, 0.0D+0 ),
-     $                   CMONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            ALLV, BOTHV, LEFTV, OVER, RIGHTV, SOMEV
-      INTEGER            I, II, IS, J, K, KI
-      DOUBLE PRECISION   OVFL, REMAX, SCALE, SMIN, SMLNUM, ULP, UNFL
-      COMPLEX*16         CDUM
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            IZAMAX
-      DOUBLE PRECISION   DLAMCH, DZASUM
-      EXTERNAL           LSAME, IZAMAX, DLAMCH, DZASUM
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZCOPY, ZDSCAL, ZGEMV, ZLATRS
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, DIMAG, MAX
-*     ..
-*     .. Statement Functions ..
-      DOUBLE PRECISION   CABS1
-*     ..
-*     .. Statement Function definitions ..
-      CABS1( CDUM ) = ABS( DBLE( CDUM ) ) + ABS( DIMAG( CDUM ) )
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and test the input parameters
-*
-      BOTHV = LSAME( SIDE, 'B' )
-      RIGHTV = LSAME( SIDE, 'R' ) .OR. BOTHV
-      LEFTV = LSAME( SIDE, 'L' ) .OR. BOTHV
-*
-      ALLV = LSAME( HOWMNY, 'A' )
-      OVER = LSAME( HOWMNY, 'B' )
-      SOMEV = LSAME( HOWMNY, 'S' )
-*
-*     Set M to the number of columns required to store the selected
-*     eigenvectors.
-*
-      IF( SOMEV ) THEN
-         M = 0
-         DO 10 J = 1, N
-            IF( SELECT( J ) )
-     $         M = M + 1
-   10    CONTINUE
-      ELSE
-         M = N
-      END IF
-*
-      INFO = 0
-      IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
-         INFO = -1
-      ELSE IF( .NOT.ALLV .AND. .NOT.OVER .AND. .NOT.SOMEV ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDT.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      ELSE IF( LDVL.LT.1 .OR. ( LEFTV .AND. LDVL.LT.N ) ) THEN
-         INFO = -8
-      ELSE IF( LDVR.LT.1 .OR. ( RIGHTV .AND. LDVR.LT.N ) ) THEN
-         INFO = -10
-      ELSE IF( MM.LT.M ) THEN
-         INFO = -11
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZTREVC', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible.
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Set the constants to control overflow.
-*
-      UNFL = DLAMCH( 'Safe minimum' )
-      OVFL = ONE / UNFL
-      CALL DLABAD( UNFL, OVFL )
-      ULP = DLAMCH( 'Precision' )
-      SMLNUM = UNFL*( N / ULP )
-*
-*     Store the diagonal elements of T in working array WORK.
-*
-      DO 20 I = 1, N
-         WORK( I+N ) = T( I, I )
-   20 CONTINUE
-*
-*     Compute 1-norm of each column of strictly upper triangular
-*     part of T to control overflow in triangular solver.
-*
-      RWORK( 1 ) = ZERO
-      DO 30 J = 2, N
-         RWORK( J ) = DZASUM( J-1, T( 1, J ), 1 )
-   30 CONTINUE
-*
-      IF( RIGHTV ) THEN
-*
-*        Compute right eigenvectors.
-*
-         IS = M
-         DO 80 KI = N, 1, -1
-*
-            IF( SOMEV ) THEN
-               IF( .NOT.SELECT( KI ) )
-     $            GO TO 80
-            END IF
-            SMIN = MAX( ULP*( CABS1( T( KI, KI ) ) ), SMLNUM )
-*
-            WORK( 1 ) = CMONE
-*
-*           Form right-hand side.
-*
-            DO 40 K = 1, KI - 1
-               WORK( K ) = -T( K, KI )
-   40       CONTINUE
-*
-*           Solve the triangular system:
-*              (T(1:KI-1,1:KI-1) - T(KI,KI))*X = SCALE*WORK.
-*
-            DO 50 K = 1, KI - 1
-               T( K, K ) = T( K, K ) - T( KI, KI )
-               IF( CABS1( T( K, K ) ).LT.SMIN )
-     $            T( K, K ) = SMIN
-   50       CONTINUE
-*
-            IF( KI.GT.1 ) THEN
-               CALL ZLATRS( 'Upper', 'No transpose', 'Non-unit', 'Y',
-     $                      KI-1, T, LDT, WORK( 1 ), SCALE, RWORK,
-     $                      INFO )
-               WORK( KI ) = SCALE
-            END IF
-*
-*           Copy the vector x or Q*x to VR and normalize.
-*
-            IF( .NOT.OVER ) THEN
-               CALL ZCOPY( KI, WORK( 1 ), 1, VR( 1, IS ), 1 )
-*
-               II = IZAMAX( KI, VR( 1, IS ), 1 )
-               REMAX = ONE / CABS1( VR( II, IS ) )
-               CALL ZDSCAL( KI, REMAX, VR( 1, IS ), 1 )
-*
-               DO 60 K = KI + 1, N
-                  VR( K, IS ) = CMZERO
-   60          CONTINUE
-            ELSE
-               IF( KI.GT.1 )
-     $            CALL ZGEMV( 'N', N, KI-1, CMONE, VR, LDVR, WORK( 1 ),
-     $                        1, DCMPLX( SCALE ), VR( 1, KI ), 1 )
-*
-               II = IZAMAX( N, VR( 1, KI ), 1 )
-               REMAX = ONE / CABS1( VR( II, KI ) )
-               CALL ZDSCAL( N, REMAX, VR( 1, KI ), 1 )
-            END IF
-*
-*           Set back the original diagonal elements of T.
-*
-            DO 70 K = 1, KI - 1
-               T( K, K ) = WORK( K+N )
-   70       CONTINUE
-*
-            IS = IS - 1
-   80    CONTINUE
-      END IF
-*
-      IF( LEFTV ) THEN
-*
-*        Compute left eigenvectors.
-*
-         IS = 1
-         DO 130 KI = 1, N
-*
-            IF( SOMEV ) THEN
-               IF( .NOT.SELECT( KI ) )
-     $            GO TO 130
-            END IF
-            SMIN = MAX( ULP*( CABS1( T( KI, KI ) ) ), SMLNUM )
-*
-            WORK( N ) = CMONE
-*
-*           Form right-hand side.
-*
-            DO 90 K = KI + 1, N
-               WORK( K ) = -DCONJG( T( KI, K ) )
-   90       CONTINUE
-*
-*           Solve the triangular system:
-*              (T(KI+1:N,KI+1:N) - T(KI,KI))'*X = SCALE*WORK.
-*
-            DO 100 K = KI + 1, N
-               T( K, K ) = T( K, K ) - T( KI, KI )
-               IF( CABS1( T( K, K ) ).LT.SMIN )
-     $            T( K, K ) = SMIN
-  100       CONTINUE
-*
-            IF( KI.LT.N ) THEN
-               CALL ZLATRS( 'Upper', 'Conjugate transpose', 'Non-unit',
-     $                      'Y', N-KI, T( KI+1, KI+1 ), LDT,
-     $                      WORK( KI+1 ), SCALE, RWORK, INFO )
-               WORK( KI ) = SCALE
-            END IF
-*
-*           Copy the vector x or Q*x to VL and normalize.
-*
-            IF( .NOT.OVER ) THEN
-               CALL ZCOPY( N-KI+1, WORK( KI ), 1, VL( KI, IS ), 1 )
-*
-               II = IZAMAX( N-KI+1, VL( KI, IS ), 1 ) + KI - 1
-               REMAX = ONE / CABS1( VL( II, IS ) )
-               CALL ZDSCAL( N-KI+1, REMAX, VL( KI, IS ), 1 )
-*
-               DO 110 K = 1, KI - 1
-                  VL( K, IS ) = CMZERO
-  110          CONTINUE
-            ELSE
-               IF( KI.LT.N )
-     $            CALL ZGEMV( 'N', N, N-KI, CMONE, VL( 1, KI+1 ), LDVL,
-     $                        WORK( KI+1 ), 1, DCMPLX( SCALE ),
-     $                        VL( 1, KI ), 1 )
-*
-               II = IZAMAX( N, VL( 1, KI ), 1 )
-               REMAX = ONE / CABS1( VL( II, KI ) )
-               CALL ZDSCAL( N, REMAX, VL( 1, KI ), 1 )
-            END IF
-*
-*           Set back the original diagonal elements of T.
-*
-            DO 120 K = KI + 1, N
-               T( K, K ) = WORK( K+N )
-  120       CONTINUE
-*
-            IS = IS + 1
-  130    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of ZTREVC
-*
-      END
--- a/libcruft/lapack/ztrexc.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,162 +0,0 @@
-      SUBROUTINE ZTREXC( COMPQ, N, T, LDT, Q, LDQ, IFST, ILST, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPQ
-      INTEGER            IFST, ILST, INFO, LDQ, LDT, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         Q( LDQ, * ), T( LDT, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZTREXC reorders the Schur factorization of a complex matrix
-*  A = Q*T*Q**H, so that the diagonal element of T with row index IFST
-*  is moved to row ILST.
-*
-*  The Schur form T is reordered by a unitary similarity transformation
-*  Z**H*T*Z, and optionally the matrix Q of Schur vectors is updated by
-*  postmultplying it with Z.
-*
-*  Arguments
-*  =========
-*
-*  COMPQ   (input) CHARACTER*1
-*          = 'V':  update the matrix Q of Schur vectors;
-*          = 'N':  do not update Q.
-*
-*  N       (input) INTEGER
-*          The order of the matrix T. N >= 0.
-*
-*  T       (input/output) COMPLEX*16 array, dimension (LDT,N)
-*          On entry, the upper triangular matrix T.
-*          On exit, the reordered upper triangular matrix.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= max(1,N).
-*
-*  Q       (input/output) COMPLEX*16 array, dimension (LDQ,N)
-*          On entry, if COMPQ = 'V', the matrix Q of Schur vectors.
-*          On exit, if COMPQ = 'V', Q has been postmultiplied by the
-*          unitary transformation matrix Z which reorders T.
-*          If COMPQ = 'N', Q is not referenced.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.  LDQ >= max(1,N).
-*
-*  IFST    (input) INTEGER
-*  ILST    (input) INTEGER
-*          Specify the reordering of the diagonal elements of T:
-*          The element with row index IFST is moved to row ILST by a
-*          sequence of transpositions between adjacent elements.
-*          1 <= IFST <= N; 1 <= ILST <= N.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            WANTQ
-      INTEGER            K, M1, M2, M3
-      DOUBLE PRECISION   CS
-      COMPLEX*16         SN, T11, T22, TEMP
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLARTG, ZROT
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and test the input parameters.
-*
-      INFO = 0
-      WANTQ = LSAME( COMPQ, 'V' )
-      IF( .NOT.LSAME( COMPQ, 'N' ) .AND. .NOT.WANTQ ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDT.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LDQ.LT.1 .OR. ( WANTQ .AND. LDQ.LT.MAX( 1, N ) ) ) THEN
-         INFO = -6
-      ELSE IF( IFST.LT.1 .OR. IFST.GT.N ) THEN
-         INFO = -7
-      ELSE IF( ILST.LT.1 .OR. ILST.GT.N ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZTREXC', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.1 .OR. IFST.EQ.ILST )
-     $   RETURN
-*
-      IF( IFST.LT.ILST ) THEN
-*
-*        Move the IFST-th diagonal element forward down the diagonal.
-*
-         M1 = 0
-         M2 = -1
-         M3 = 1
-      ELSE
-*
-*        Move the IFST-th diagonal element backward up the diagonal.
-*
-         M1 = -1
-         M2 = 0
-         M3 = -1
-      END IF
-*
-      DO 10 K = IFST + M1, ILST + M2, M3
-*
-*        Interchange the k-th and (k+1)-th diagonal elements.
-*
-         T11 = T( K, K )
-         T22 = T( K+1, K+1 )
-*
-*        Determine the transformation to perform the interchange.
-*
-         CALL ZLARTG( T( K, K+1 ), T22-T11, CS, SN, TEMP )
-*
-*        Apply transformation to the matrix T.
-*
-         IF( K+2.LE.N )
-     $      CALL ZROT( N-K-1, T( K, K+2 ), LDT, T( K+1, K+2 ), LDT, CS,
-     $                 SN )
-         CALL ZROT( K-1, T( 1, K ), 1, T( 1, K+1 ), 1, CS,
-     $              DCONJG( SN ) )
-*
-         T( K, K ) = T22
-         T( K+1, K+1 ) = T11
-*
-         IF( WANTQ ) THEN
-*
-*           Accumulate transformation in the matrix Q.
-*
-            CALL ZROT( N, Q( 1, K ), 1, Q( 1, K+1 ), 1, CS,
-     $                 DCONJG( SN ) )
-         END IF
-*
-   10 CONTINUE
-*
-      RETURN
-*
-*     End of ZTREXC
-*
-      END
--- a/libcruft/lapack/ztrsen.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,359 +0,0 @@
-      SUBROUTINE ZTRSEN( JOB, COMPQ, SELECT, N, T, LDT, Q, LDQ, W, M, S,
-     $                   SEP, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     Modified to call ZLACN2 in place of ZLACON, 10 Feb 03, SJH.
-*
-*     .. Scalar Arguments ..
-      CHARACTER          COMPQ, JOB
-      INTEGER            INFO, LDQ, LDT, LWORK, M, N
-      DOUBLE PRECISION   S, SEP
-*     ..
-*     .. Array Arguments ..
-      LOGICAL            SELECT( * )
-      COMPLEX*16         Q( LDQ, * ), T( LDT, * ), W( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZTRSEN reorders the Schur factorization of a complex matrix
-*  A = Q*T*Q**H, so that a selected cluster of eigenvalues appears in
-*  the leading positions on the diagonal of the upper triangular matrix
-*  T, and the leading columns of Q form an orthonormal basis of the
-*  corresponding right invariant subspace.
-*
-*  Optionally the routine computes the reciprocal condition numbers of
-*  the cluster of eigenvalues and/or the invariant subspace.
-*
-*  Arguments
-*  =========
-*
-*  JOB     (input) CHARACTER*1
-*          Specifies whether condition numbers are required for the
-*          cluster of eigenvalues (S) or the invariant subspace (SEP):
-*          = 'N': none;
-*          = 'E': for eigenvalues only (S);
-*          = 'V': for invariant subspace only (SEP);
-*          = 'B': for both eigenvalues and invariant subspace (S and
-*                 SEP).
-*
-*  COMPQ   (input) CHARACTER*1
-*          = 'V': update the matrix Q of Schur vectors;
-*          = 'N': do not update Q.
-*
-*  SELECT  (input) LOGICAL array, dimension (N)
-*          SELECT specifies the eigenvalues in the selected cluster. To
-*          select the j-th eigenvalue, SELECT(j) must be set to .TRUE..
-*
-*  N       (input) INTEGER
-*          The order of the matrix T. N >= 0.
-*
-*  T       (input/output) COMPLEX*16 array, dimension (LDT,N)
-*          On entry, the upper triangular matrix T.
-*          On exit, T is overwritten by the reordered matrix T, with the
-*          selected eigenvalues as the leading diagonal elements.
-*
-*  LDT     (input) INTEGER
-*          The leading dimension of the array T. LDT >= max(1,N).
-*
-*  Q       (input/output) COMPLEX*16 array, dimension (LDQ,N)
-*          On entry, if COMPQ = 'V', the matrix Q of Schur vectors.
-*          On exit, if COMPQ = 'V', Q has been postmultiplied by the
-*          unitary transformation matrix which reorders T; the leading M
-*          columns of Q form an orthonormal basis for the specified
-*          invariant subspace.
-*          If COMPQ = 'N', Q is not referenced.
-*
-*  LDQ     (input) INTEGER
-*          The leading dimension of the array Q.
-*          LDQ >= 1; and if COMPQ = 'V', LDQ >= N.
-*
-*  W       (output) COMPLEX*16 array, dimension (N)
-*          The reordered eigenvalues of T, in the same order as they
-*          appear on the diagonal of T.
-*
-*  M       (output) INTEGER
-*          The dimension of the specified invariant subspace.
-*          0 <= M <= N.
-*
-*  S       (output) DOUBLE PRECISION
-*          If JOB = 'E' or 'B', S is a lower bound on the reciprocal
-*          condition number for the selected cluster of eigenvalues.
-*          S cannot underestimate the true reciprocal condition number
-*          by more than a factor of sqrt(N). If M = 0 or N, S = 1.
-*          If JOB = 'N' or 'V', S is not referenced.
-*
-*  SEP     (output) DOUBLE PRECISION
-*          If JOB = 'V' or 'B', SEP is the estimated reciprocal
-*          condition number of the specified invariant subspace. If
-*          M = 0 or N, SEP = norm(T).
-*          If JOB = 'N' or 'E', SEP is not referenced.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If JOB = 'N', LWORK >= 1;
-*          if JOB = 'E', LWORK = max(1,M*(N-M));
-*          if JOB = 'V' or 'B', LWORK >= max(1,2*M*(N-M)).
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  ZTRSEN first collects the selected eigenvalues by computing a unitary
-*  transformation Z to move them to the top left corner of T. In other
-*  words, the selected eigenvalues are the eigenvalues of T11 in:
-*
-*                Z'*T*Z = ( T11 T12 ) n1
-*                         (  0  T22 ) n2
-*                            n1  n2
-*
-*  where N = n1+n2 and Z' means the conjugate transpose of Z. The first
-*  n1 columns of Z span the specified invariant subspace of T.
-*
-*  If T has been obtained from the Schur factorization of a matrix
-*  A = Q*T*Q', then the reordered Schur factorization of A is given by
-*  A = (Q*Z)*(Z'*T*Z)*(Q*Z)', and the first n1 columns of Q*Z span the
-*  corresponding invariant subspace of A.
-*
-*  The reciprocal condition number of the average of the eigenvalues of
-*  T11 may be returned in S. S lies between 0 (very badly conditioned)
-*  and 1 (very well conditioned). It is computed as follows. First we
-*  compute R so that
-*
-*                         P = ( I  R ) n1
-*                             ( 0  0 ) n2
-*                               n1 n2
-*
-*  is the projector on the invariant subspace associated with T11.
-*  R is the solution of the Sylvester equation:
-*
-*                        T11*R - R*T22 = T12.
-*
-*  Let F-norm(M) denote the Frobenius-norm of M and 2-norm(M) denote
-*  the two-norm of M. Then S is computed as the lower bound
-*
-*                      (1 + F-norm(R)**2)**(-1/2)
-*
-*  on the reciprocal of 2-norm(P), the true reciprocal condition number.
-*  S cannot underestimate 1 / 2-norm(P) by more than a factor of
-*  sqrt(N).
-*
-*  An approximate error bound for the computed average of the
-*  eigenvalues of T11 is
-*
-*                         EPS * norm(T) / S
-*
-*  where EPS is the machine precision.
-*
-*  The reciprocal condition number of the right invariant subspace
-*  spanned by the first n1 columns of Z (or of Q*Z) is returned in SEP.
-*  SEP is defined as the separation of T11 and T22:
-*
-*                     sep( T11, T22 ) = sigma-min( C )
-*
-*  where sigma-min(C) is the smallest singular value of the
-*  n1*n2-by-n1*n2 matrix
-*
-*     C  = kprod( I(n2), T11 ) - kprod( transpose(T22), I(n1) )
-*
-*  I(m) is an m by m identity matrix, and kprod denotes the Kronecker
-*  product. We estimate sigma-min(C) by the reciprocal of an estimate of
-*  the 1-norm of inverse(C). The true reciprocal 1-norm of inverse(C)
-*  cannot differ from sigma-min(C) by more than a factor of sqrt(n1*n2).
-*
-*  When SEP is small, small changes in T can cause large changes in
-*  the invariant subspace. An approximate bound on the maximum angular
-*  error in the computed right invariant subspace is
-*
-*                      EPS * norm(T) / SEP
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ZERO, ONE
-      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, WANTBH, WANTQ, WANTS, WANTSP
-      INTEGER            IERR, K, KASE, KS, LWMIN, N1, N2, NN
-      DOUBLE PRECISION   EST, RNORM, SCALE
-*     ..
-*     .. Local Arrays ..
-      INTEGER            ISAVE( 3 )
-      DOUBLE PRECISION   RWORK( 1 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   ZLANGE
-      EXTERNAL           LSAME, ZLANGE
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLACN2, ZLACPY, ZTREXC, ZTRSYL
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, SQRT
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and test the input parameters.
-*
-      WANTBH = LSAME( JOB, 'B' )
-      WANTS = LSAME( JOB, 'E' ) .OR. WANTBH
-      WANTSP = LSAME( JOB, 'V' ) .OR. WANTBH
-      WANTQ = LSAME( COMPQ, 'V' )
-*
-*     Set M to the number of selected eigenvalues.
-*
-      M = 0
-      DO 10 K = 1, N
-         IF( SELECT( K ) )
-     $      M = M + 1
-   10 CONTINUE
-*
-      N1 = M
-      N2 = N - M
-      NN = N1*N2
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-*
-      IF( WANTSP ) THEN
-         LWMIN = MAX( 1, 2*NN )
-      ELSE IF( LSAME( JOB, 'N' ) ) THEN
-         LWMIN = 1
-      ELSE IF( LSAME( JOB, 'E' ) ) THEN
-         LWMIN = MAX( 1, NN )
-      END IF
-*
-      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.WANTS .AND. .NOT.WANTSP )
-     $     THEN
-         INFO = -1
-      ELSE IF( .NOT.LSAME( COMPQ, 'N' ) .AND. .NOT.WANTQ ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDT.LT.MAX( 1, N ) ) THEN
-         INFO = -6
-      ELSE IF( LDQ.LT.1 .OR. ( WANTQ .AND. LDQ.LT.N ) ) THEN
-         INFO = -8
-      ELSE IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
-         INFO = -14
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         WORK( 1 ) = LWMIN
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZTRSEN', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.N .OR. M.EQ.0 ) THEN
-         IF( WANTS )
-     $      S = ONE
-         IF( WANTSP )
-     $      SEP = ZLANGE( '1', N, N, T, LDT, RWORK )
-         GO TO 40
-      END IF
-*
-*     Collect the selected eigenvalues at the top left corner of T.
-*
-      KS = 0
-      DO 20 K = 1, N
-         IF( SELECT( K ) ) THEN
-            KS = KS + 1
-*
-*           Swap the K-th eigenvalue to position KS.
-*
-            IF( K.NE.KS )
-     $         CALL ZTREXC( COMPQ, N, T, LDT, Q, LDQ, K, KS, IERR )
-         END IF
-   20 CONTINUE
-*
-      IF( WANTS ) THEN
-*
-*        Solve the Sylvester equation for R:
-*
-*           T11*R - R*T22 = scale*T12
-*
-         CALL ZLACPY( 'F', N1, N2, T( 1, N1+1 ), LDT, WORK, N1 )
-         CALL ZTRSYL( 'N', 'N', -1, N1, N2, T, LDT, T( N1+1, N1+1 ),
-     $                LDT, WORK, N1, SCALE, IERR )
-*
-*        Estimate the reciprocal of the condition number of the cluster
-*        of eigenvalues.
-*
-         RNORM = ZLANGE( 'F', N1, N2, WORK, N1, RWORK )
-         IF( RNORM.EQ.ZERO ) THEN
-            S = ONE
-         ELSE
-            S = SCALE / ( SQRT( SCALE*SCALE / RNORM+RNORM )*
-     $          SQRT( RNORM ) )
-         END IF
-      END IF
-*
-      IF( WANTSP ) THEN
-*
-*        Estimate sep(T11,T22).
-*
-         EST = ZERO
-         KASE = 0
-   30    CONTINUE
-         CALL ZLACN2( NN, WORK( NN+1 ), WORK, EST, KASE, ISAVE )
-         IF( KASE.NE.0 ) THEN
-            IF( KASE.EQ.1 ) THEN
-*
-*              Solve T11*R - R*T22 = scale*X.
-*
-               CALL ZTRSYL( 'N', 'N', -1, N1, N2, T, LDT,
-     $                      T( N1+1, N1+1 ), LDT, WORK, N1, SCALE,
-     $                      IERR )
-            ELSE
-*
-*              Solve T11'*R - R*T22' = scale*X.
-*
-               CALL ZTRSYL( 'C', 'C', -1, N1, N2, T, LDT,
-     $                      T( N1+1, N1+1 ), LDT, WORK, N1, SCALE,
-     $                      IERR )
-            END IF
-            GO TO 30
-         END IF
-*
-         SEP = SCALE / EST
-      END IF
-*
-   40 CONTINUE
-*
-*     Copy reordered eigenvalues to W.
-*
-      DO 50 K = 1, N
-         W( K ) = T( K, K )
-   50 CONTINUE
-*
-      WORK( 1 ) = LWMIN
-*
-      RETURN
-*
-*     End of ZTRSEN
-*
-      END
--- a/libcruft/lapack/ztrsyl.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,365 +0,0 @@
-      SUBROUTINE ZTRSYL( TRANA, TRANB, ISGN, M, N, A, LDA, B, LDB, C,
-     $                   LDC, SCALE, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          TRANA, TRANB
-      INTEGER            INFO, ISGN, LDA, LDB, LDC, M, N
-      DOUBLE PRECISION   SCALE
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), B( LDB, * ), C( LDC, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZTRSYL solves the complex Sylvester matrix equation:
-*
-*     op(A)*X + X*op(B) = scale*C or
-*     op(A)*X - X*op(B) = scale*C,
-*
-*  where op(A) = A or A**H, and A and B are both upper triangular. A is
-*  M-by-M and B is N-by-N; the right hand side C and the solution X are
-*  M-by-N; and scale is an output scale factor, set <= 1 to avoid
-*  overflow in X.
-*
-*  Arguments
-*  =========
-*
-*  TRANA   (input) CHARACTER*1
-*          Specifies the option op(A):
-*          = 'N': op(A) = A    (No transpose)
-*          = 'C': op(A) = A**H (Conjugate transpose)
-*
-*  TRANB   (input) CHARACTER*1
-*          Specifies the option op(B):
-*          = 'N': op(B) = B    (No transpose)
-*          = 'C': op(B) = B**H (Conjugate transpose)
-*
-*  ISGN    (input) INTEGER
-*          Specifies the sign in the equation:
-*          = +1: solve op(A)*X + X*op(B) = scale*C
-*          = -1: solve op(A)*X - X*op(B) = scale*C
-*
-*  M       (input) INTEGER
-*          The order of the matrix A, and the number of rows in the
-*          matrices X and C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The order of the matrix B, and the number of columns in the
-*          matrices X and C. N >= 0.
-*
-*  A       (input) COMPLEX*16 array, dimension (LDA,M)
-*          The upper triangular matrix A.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,M).
-*
-*  B       (input) COMPLEX*16 array, dimension (LDB,N)
-*          The upper triangular matrix B.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B. LDB >= max(1,N).
-*
-*  C       (input/output) COMPLEX*16 array, dimension (LDC,N)
-*          On entry, the M-by-N right hand side matrix C.
-*          On exit, C is overwritten by the solution matrix X.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M)
-*
-*  SCALE   (output) DOUBLE PRECISION
-*          The scale factor, scale, set <= 1 to avoid overflow in X.
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          = 1: A and B have common or very close eigenvalues; perturbed
-*               values were used to solve the equation (but the matrices
-*               A and B are unchanged).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      DOUBLE PRECISION   ONE
-      PARAMETER          ( ONE = 1.0D+0 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOTRNA, NOTRNB
-      INTEGER            J, K, L
-      DOUBLE PRECISION   BIGNUM, DA11, DB, EPS, SCALOC, SGN, SMIN,
-     $                   SMLNUM
-      COMPLEX*16         A11, SUML, SUMR, VEC, X11
-*     ..
-*     .. Local Arrays ..
-      DOUBLE PRECISION   DUM( 1 )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      DOUBLE PRECISION   DLAMCH, ZLANGE
-      COMPLEX*16         ZDOTC, ZDOTU, ZLADIV
-      EXTERNAL           LSAME, DLAMCH, ZLANGE, ZDOTC, ZDOTU, ZLADIV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           DLABAD, XERBLA, ZDSCAL
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, DIMAG, MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Decode and Test input parameters
-*
-      NOTRNA = LSAME( TRANA, 'N' )
-      NOTRNB = LSAME( TRANB, 'N' )
-*
-      INFO = 0
-      IF( .NOT.NOTRNA .AND. .NOT.LSAME( TRANA, 'C' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRNB .AND. .NOT.LSAME( TRANB, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( ISGN.NE.1 .AND. ISGN.NE.-1 ) THEN
-         INFO = -3
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -7
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -9
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -11
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZTRSYL', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-*     Set constants to control overflow
-*
-      EPS = DLAMCH( 'P' )
-      SMLNUM = DLAMCH( 'S' )
-      BIGNUM = ONE / SMLNUM
-      CALL DLABAD( SMLNUM, BIGNUM )
-      SMLNUM = SMLNUM*DBLE( M*N ) / EPS
-      BIGNUM = ONE / SMLNUM
-      SMIN = MAX( SMLNUM, EPS*ZLANGE( 'M', M, M, A, LDA, DUM ),
-     $       EPS*ZLANGE( 'M', N, N, B, LDB, DUM ) )
-      SCALE = ONE
-      SGN = ISGN
-*
-      IF( NOTRNA .AND. NOTRNB ) THEN
-*
-*        Solve    A*X + ISGN*X*B = scale*C.
-*
-*        The (K,L)th block of X is determined starting from
-*        bottom-left corner column by column by
-*
-*            A(K,K)*X(K,L) + ISGN*X(K,L)*B(L,L) = C(K,L) - R(K,L)
-*
-*        Where
-*                    M                        L-1
-*          R(K,L) = SUM [A(K,I)*X(I,L)] +ISGN*SUM [X(K,J)*B(J,L)].
-*                  I=K+1                      J=1
-*
-         DO 30 L = 1, N
-            DO 20 K = M, 1, -1
-*
-               SUML = ZDOTU( M-K, A( K, MIN( K+1, M ) ), LDA,
-     $                C( MIN( K+1, M ), L ), 1 )
-               SUMR = ZDOTU( L-1, C( K, 1 ), LDC, B( 1, L ), 1 )
-               VEC = C( K, L ) - ( SUML+SGN*SUMR )
-*
-               SCALOC = ONE
-               A11 = A( K, K ) + SGN*B( L, L )
-               DA11 = ABS( DBLE( A11 ) ) + ABS( DIMAG( A11 ) )
-               IF( DA11.LE.SMIN ) THEN
-                  A11 = SMIN
-                  DA11 = SMIN
-                  INFO = 1
-               END IF
-               DB = ABS( DBLE( VEC ) ) + ABS( DIMAG( VEC ) )
-               IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
-                  IF( DB.GT.BIGNUM*DA11 )
-     $               SCALOC = ONE / DB
-               END IF
-               X11 = ZLADIV( VEC*DCMPLX( SCALOC ), A11 )
-*
-               IF( SCALOC.NE.ONE ) THEN
-                  DO 10 J = 1, N
-                     CALL ZDSCAL( M, SCALOC, C( 1, J ), 1 )
-   10             CONTINUE
-                  SCALE = SCALE*SCALOC
-               END IF
-               C( K, L ) = X11
-*
-   20       CONTINUE
-   30    CONTINUE
-*
-      ELSE IF( .NOT.NOTRNA .AND. NOTRNB ) THEN
-*
-*        Solve    A' *X + ISGN*X*B = scale*C.
-*
-*        The (K,L)th block of X is determined starting from
-*        upper-left corner column by column by
-*
-*            A'(K,K)*X(K,L) + ISGN*X(K,L)*B(L,L) = C(K,L) - R(K,L)
-*
-*        Where
-*                   K-1                         L-1
-*          R(K,L) = SUM [A'(I,K)*X(I,L)] + ISGN*SUM [X(K,J)*B(J,L)]
-*                   I=1                         J=1
-*
-         DO 60 L = 1, N
-            DO 50 K = 1, M
-*
-               SUML = ZDOTC( K-1, A( 1, K ), 1, C( 1, L ), 1 )
-               SUMR = ZDOTU( L-1, C( K, 1 ), LDC, B( 1, L ), 1 )
-               VEC = C( K, L ) - ( SUML+SGN*SUMR )
-*
-               SCALOC = ONE
-               A11 = DCONJG( A( K, K ) ) + SGN*B( L, L )
-               DA11 = ABS( DBLE( A11 ) ) + ABS( DIMAG( A11 ) )
-               IF( DA11.LE.SMIN ) THEN
-                  A11 = SMIN
-                  DA11 = SMIN
-                  INFO = 1
-               END IF
-               DB = ABS( DBLE( VEC ) ) + ABS( DIMAG( VEC ) )
-               IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
-                  IF( DB.GT.BIGNUM*DA11 )
-     $               SCALOC = ONE / DB
-               END IF
-*
-               X11 = ZLADIV( VEC*DCMPLX( SCALOC ), A11 )
-*
-               IF( SCALOC.NE.ONE ) THEN
-                  DO 40 J = 1, N
-                     CALL ZDSCAL( M, SCALOC, C( 1, J ), 1 )
-   40             CONTINUE
-                  SCALE = SCALE*SCALOC
-               END IF
-               C( K, L ) = X11
-*
-   50       CONTINUE
-   60    CONTINUE
-*
-      ELSE IF( .NOT.NOTRNA .AND. .NOT.NOTRNB ) THEN
-*
-*        Solve    A'*X + ISGN*X*B' = C.
-*
-*        The (K,L)th block of X is determined starting from
-*        upper-right corner column by column by
-*
-*            A'(K,K)*X(K,L) + ISGN*X(K,L)*B'(L,L) = C(K,L) - R(K,L)
-*
-*        Where
-*                    K-1
-*           R(K,L) = SUM [A'(I,K)*X(I,L)] +
-*                    I=1
-*                           N
-*                     ISGN*SUM [X(K,J)*B'(L,J)].
-*                          J=L+1
-*
-         DO 90 L = N, 1, -1
-            DO 80 K = 1, M
-*
-               SUML = ZDOTC( K-1, A( 1, K ), 1, C( 1, L ), 1 )
-               SUMR = ZDOTC( N-L, C( K, MIN( L+1, N ) ), LDC,
-     $                B( L, MIN( L+1, N ) ), LDB )
-               VEC = C( K, L ) - ( SUML+SGN*DCONJG( SUMR ) )
-*
-               SCALOC = ONE
-               A11 = DCONJG( A( K, K )+SGN*B( L, L ) )
-               DA11 = ABS( DBLE( A11 ) ) + ABS( DIMAG( A11 ) )
-               IF( DA11.LE.SMIN ) THEN
-                  A11 = SMIN
-                  DA11 = SMIN
-                  INFO = 1
-               END IF
-               DB = ABS( DBLE( VEC ) ) + ABS( DIMAG( VEC ) )
-               IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
-                  IF( DB.GT.BIGNUM*DA11 )
-     $               SCALOC = ONE / DB
-               END IF
-*
-               X11 = ZLADIV( VEC*DCMPLX( SCALOC ), A11 )
-*
-               IF( SCALOC.NE.ONE ) THEN
-                  DO 70 J = 1, N
-                     CALL ZDSCAL( M, SCALOC, C( 1, J ), 1 )
-   70             CONTINUE
-                  SCALE = SCALE*SCALOC
-               END IF
-               C( K, L ) = X11
-*
-   80       CONTINUE
-   90    CONTINUE
-*
-      ELSE IF( NOTRNA .AND. .NOT.NOTRNB ) THEN
-*
-*        Solve    A*X + ISGN*X*B' = C.
-*
-*        The (K,L)th block of X is determined starting from
-*        bottom-left corner column by column by
-*
-*           A(K,K)*X(K,L) + ISGN*X(K,L)*B'(L,L) = C(K,L) - R(K,L)
-*
-*        Where
-*                    M                          N
-*          R(K,L) = SUM [A(K,I)*X(I,L)] + ISGN*SUM [X(K,J)*B'(L,J)]
-*                  I=K+1                      J=L+1
-*
-         DO 120 L = N, 1, -1
-            DO 110 K = M, 1, -1
-*
-               SUML = ZDOTU( M-K, A( K, MIN( K+1, M ) ), LDA,
-     $                C( MIN( K+1, M ), L ), 1 )
-               SUMR = ZDOTC( N-L, C( K, MIN( L+1, N ) ), LDC,
-     $                B( L, MIN( L+1, N ) ), LDB )
-               VEC = C( K, L ) - ( SUML+SGN*DCONJG( SUMR ) )
-*
-               SCALOC = ONE
-               A11 = A( K, K ) + SGN*DCONJG( B( L, L ) )
-               DA11 = ABS( DBLE( A11 ) ) + ABS( DIMAG( A11 ) )
-               IF( DA11.LE.SMIN ) THEN
-                  A11 = SMIN
-                  DA11 = SMIN
-                  INFO = 1
-               END IF
-               DB = ABS( DBLE( VEC ) ) + ABS( DIMAG( VEC ) )
-               IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
-                  IF( DB.GT.BIGNUM*DA11 )
-     $               SCALOC = ONE / DB
-               END IF
-*
-               X11 = ZLADIV( VEC*DCMPLX( SCALOC ), A11 )
-*
-               IF( SCALOC.NE.ONE ) THEN
-                  DO 100 J = 1, N
-                     CALL ZDSCAL( M, SCALOC, C( 1, J ), 1 )
-  100             CONTINUE
-                  SCALE = SCALE*SCALOC
-               END IF
-               C( K, L ) = X11
-*
-  110       CONTINUE
-  120    CONTINUE
-*
-      END IF
-*
-      RETURN
-*
-*     End of ZTRSYL
-*
-      END
--- a/libcruft/lapack/ztrti2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-      SUBROUTINE ZTRTI2( UPLO, DIAG, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZTRTI2 computes the inverse of a complex upper or lower triangular
-*  matrix.
-*
-*  This is the Level 2 BLAS version of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          Specifies whether the matrix A is upper or lower triangular.
-*          = 'U':  Upper triangular
-*          = 'L':  Lower triangular
-*
-*  DIAG    (input) CHARACTER*1
-*          Specifies whether or not the matrix A is unit triangular.
-*          = 'N':  Non-unit triangular
-*          = 'U':  Unit triangular
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the triangular matrix A.  If UPLO = 'U', the
-*          leading n by n upper triangular part of the array A contains
-*          the upper triangular matrix, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading n by n lower triangular part of the array A contains
-*          the lower triangular matrix, and the strictly upper
-*          triangular part of A is not referenced.  If DIAG = 'U', the
-*          diagonal elements of A are also not referenced and are
-*          assumed to be 1.
-*
-*          On exit, the (triangular) inverse of the original matrix, in
-*          the same storage format.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -k, the k-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOUNIT, UPPER
-      INTEGER            J
-      COMPLEX*16         AJJ
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZSCAL, ZTRMV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      NOUNIT = LSAME( DIAG, 'N' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZTRTI2', -INFO )
-         RETURN
-      END IF
-*
-      IF( UPPER ) THEN
-*
-*        Compute inverse of upper triangular matrix.
-*
-         DO 10 J = 1, N
-            IF( NOUNIT ) THEN
-               A( J, J ) = ONE / A( J, J )
-               AJJ = -A( J, J )
-            ELSE
-               AJJ = -ONE
-            END IF
-*
-*           Compute elements 1:j-1 of j-th column.
-*
-            CALL ZTRMV( 'Upper', 'No transpose', DIAG, J-1, A, LDA,
-     $                  A( 1, J ), 1 )
-            CALL ZSCAL( J-1, AJJ, A( 1, J ), 1 )
-   10    CONTINUE
-      ELSE
-*
-*        Compute inverse of lower triangular matrix.
-*
-         DO 20 J = N, 1, -1
-            IF( NOUNIT ) THEN
-               A( J, J ) = ONE / A( J, J )
-               AJJ = -A( J, J )
-            ELSE
-               AJJ = -ONE
-            END IF
-            IF( J.LT.N ) THEN
-*
-*              Compute elements j+1:n of j-th column.
-*
-               CALL ZTRMV( 'Lower', 'No transpose', DIAG, N-J,
-     $                     A( J+1, J+1 ), LDA, A( J+1, J ), 1 )
-               CALL ZSCAL( N-J, AJJ, A( J+1, J ), 1 )
-            END IF
-   20    CONTINUE
-      END IF
-*
-      RETURN
-*
-*     End of ZTRTI2
-*
-      END
--- a/libcruft/lapack/ztrtri.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,177 +0,0 @@
-      SUBROUTINE ZTRTRI( UPLO, DIAG, N, A, LDA, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, UPLO
-      INTEGER            INFO, LDA, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZTRTRI computes the inverse of a complex upper or lower triangular
-*  matrix A.
-*
-*  This is the Level 3 BLAS version of the algorithm.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  A is upper triangular;
-*          = 'L':  A is lower triangular.
-*
-*  DIAG    (input) CHARACTER*1
-*          = 'N':  A is non-unit triangular;
-*          = 'U':  A is unit triangular.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the triangular matrix A.  If UPLO = 'U', the
-*          leading N-by-N upper triangular part of the array A contains
-*          the upper triangular matrix, and the strictly lower
-*          triangular part of A is not referenced.  If UPLO = 'L', the
-*          leading N-by-N lower triangular part of the array A contains
-*          the lower triangular matrix, and the strictly upper
-*          triangular part of A is not referenced.  If DIAG = 'U', the
-*          diagonal elements of A are also not referenced and are
-*          assumed to be 1.
-*          On exit, the (triangular) inverse of the original matrix, in
-*          the same storage format.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = i, A(i,i) is exactly zero.  The triangular
-*               matrix is singular and its inverse can not be computed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),
-     $                   ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOUNIT, UPPER
-      INTEGER            J, JB, NB, NN
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZTRMM, ZTRSM, ZTRTI2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      UPPER = LSAME( UPLO, 'U' )
-      NOUNIT = LSAME( DIAG, 'N' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZTRTRI', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Check for singularity if non-unit.
-*
-      IF( NOUNIT ) THEN
-         DO 10 INFO = 1, N
-            IF( A( INFO, INFO ).EQ.ZERO )
-     $         RETURN
-   10    CONTINUE
-         INFO = 0
-      END IF
-*
-*     Determine the block size for this environment.
-*
-      NB = ILAENV( 1, 'ZTRTRI', UPLO // DIAG, N, -1, -1, -1 )
-      IF( NB.LE.1 .OR. NB.GE.N ) THEN
-*
-*        Use unblocked code
-*
-         CALL ZTRTI2( UPLO, DIAG, N, A, LDA, INFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( UPPER ) THEN
-*
-*           Compute inverse of upper triangular matrix
-*
-            DO 20 J = 1, N, NB
-               JB = MIN( NB, N-J+1 )
-*
-*              Compute rows 1:j-1 of current block column
-*
-               CALL ZTRMM( 'Left', 'Upper', 'No transpose', DIAG, J-1,
-     $                     JB, ONE, A, LDA, A( 1, J ), LDA )
-               CALL ZTRSM( 'Right', 'Upper', 'No transpose', DIAG, J-1,
-     $                     JB, -ONE, A( J, J ), LDA, A( 1, J ), LDA )
-*
-*              Compute inverse of current diagonal block
-*
-               CALL ZTRTI2( 'Upper', DIAG, JB, A( J, J ), LDA, INFO )
-   20       CONTINUE
-         ELSE
-*
-*           Compute inverse of lower triangular matrix
-*
-            NN = ( ( N-1 ) / NB )*NB + 1
-            DO 30 J = NN, 1, -NB
-               JB = MIN( NB, N-J+1 )
-               IF( J+JB.LE.N ) THEN
-*
-*                 Compute rows j+jb:n of current block column
-*
-                  CALL ZTRMM( 'Left', 'Lower', 'No transpose', DIAG,
-     $                        N-J-JB+1, JB, ONE, A( J+JB, J+JB ), LDA,
-     $                        A( J+JB, J ), LDA )
-                  CALL ZTRSM( 'Right', 'Lower', 'No transpose', DIAG,
-     $                        N-J-JB+1, JB, -ONE, A( J, J ), LDA,
-     $                        A( J+JB, J ), LDA )
-               END IF
-*
-*              Compute inverse of current diagonal block
-*
-               CALL ZTRTI2( 'Lower', DIAG, JB, A( J, J ), LDA, INFO )
-   30       CONTINUE
-         END IF
-      END IF
-*
-      RETURN
-*
-*     End of ZTRTRI
-*
-      END
--- a/libcruft/lapack/ztrtrs.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-      SUBROUTINE ZTRTRS( UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB,
-     $                   INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          DIAG, TRANS, UPLO
-      INTEGER            INFO, LDA, LDB, N, NRHS
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), B( LDB, * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZTRTRS solves a triangular system of the form
-*
-*     A * X = B,  A**T * X = B,  or  A**H * X = B,
-*
-*  where A is a triangular matrix of order N, and B is an N-by-NRHS
-*  matrix.  A check is made to verify that A is nonsingular.
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U':  A is upper triangular;
-*          = 'L':  A is lower triangular.
-*
-*  TRANS   (input) CHARACTER*1
-*          Specifies the form of the system of equations:
-*          = 'N':  A * X = B     (No transpose)
-*          = 'T':  A**T * X = B  (Transpose)
-*          = 'C':  A**H * X = B  (Conjugate transpose)
-*
-*  DIAG    (input) CHARACTER*1
-*          = 'N':  A is non-unit triangular;
-*          = 'U':  A is unit triangular.
-*
-*  N       (input) INTEGER
-*          The order of the matrix A.  N >= 0.
-*
-*  NRHS    (input) INTEGER
-*          The number of right hand sides, i.e., the number of columns
-*          of the matrix B.  NRHS >= 0.
-*
-*  A       (input) COMPLEX*16 array, dimension (LDA,N)
-*          The triangular matrix A.  If UPLO = 'U', the leading N-by-N
-*          upper triangular part of the array A contains the upper
-*          triangular matrix, and the strictly lower triangular part of
-*          A is not referenced.  If UPLO = 'L', the leading N-by-N lower
-*          triangular part of the array A contains the lower triangular
-*          matrix, and the strictly upper triangular part of A is not
-*          referenced.  If DIAG = 'U', the diagonal elements of A are
-*          also not referenced and are assumed to be 1.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,N).
-*
-*  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
-*          On entry, the right hand side matrix B.
-*          On exit, if INFO = 0, the solution matrix X.
-*
-*  LDB     (input) INTEGER
-*          The leading dimension of the array B.  LDB >= max(1,N).
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*          > 0: if INFO = i, the i-th diagonal element of A is zero,
-*               indicating that the matrix is singular and the solutions
-*               X have not been computed.
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ),
-     $                   ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            NOUNIT
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZTRSM
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input parameters.
-*
-      INFO = 0
-      NOUNIT = LSAME( DIAG, 'N' )
-      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND. .NOT.
-     $         LSAME( TRANS, 'T' ) .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( NRHS.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -7
-      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
-         INFO = -9
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZTRTRS', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 )
-     $   RETURN
-*
-*     Check for singularity.
-*
-      IF( NOUNIT ) THEN
-         DO 10 INFO = 1, N
-            IF( A( INFO, INFO ).EQ.ZERO )
-     $         RETURN
-   10    CONTINUE
-      END IF
-      INFO = 0
-*
-*     Solve A * x = b,  A**T * x = b,  or  A**H * x = b.
-*
-      CALL ZTRSM( 'Left', UPLO, TRANS, DIAG, N, NRHS, ONE, A, LDA, B,
-     $            LDB )
-*
-      RETURN
-*
-*     End of ZTRTRS
-*
-      END
--- a/libcruft/lapack/ztzrzf.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,244 +0,0 @@
-      SUBROUTINE ZTZRZF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZTZRZF reduces the M-by-N ( M<=N ) complex upper trapezoidal matrix A
-*  to upper triangular form by means of unitary transformations.
-*
-*  The upper trapezoidal matrix A is factored as
-*
-*     A = ( R  0 ) * Z,
-*
-*  where Z is an N-by-N unitary matrix and R is an M-by-M upper
-*  triangular matrix.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix A.  M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix A.  N >= M.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the leading M-by-N upper trapezoidal part of the
-*          array A must contain the matrix to be factorized.
-*          On exit, the leading M-by-M upper triangular part of A
-*          contains the upper triangular matrix R, and elements M+1 to
-*          N of the first M rows of A, with the array TAU, represent the
-*          unitary matrix Z as a product of M elementary reflectors.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.  LDA >= max(1,M).
-*
-*  TAU     (output) COMPLEX*16 array, dimension (M)
-*          The scalar factors of the elementary reflectors.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.  LWORK >= max(1,M).
-*          For optimum performance LWORK >= M*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  The factorization is obtained by Householder's method.  The kth
-*  transformation matrix, Z( k ), which is used to introduce zeros into
-*  the ( m - k + 1 )th row of A, is given in the form
-*
-*     Z( k ) = ( I     0   ),
-*              ( 0  T( k ) )
-*
-*  where
-*
-*     T( k ) = I - tau*u( k )*u( k )',   u( k ) = (   1    ),
-*                                                 (   0    )
-*                                                 ( z( k ) )
-*
-*  tau is a scalar and z( k ) is an ( n - m ) element vector.
-*  tau and z( k ) are chosen to annihilate the elements of the kth row
-*  of X.
-*
-*  The scalar tau is returned in the kth element of TAU and the vector
-*  u( k ) in the kth row of A, such that the elements of z( k ) are
-*  in  a( k, m + 1 ), ..., a( k, n ). The elements of R are returned in
-*  the upper triangular part of A.
-*
-*  Z is given by
-*
-*     Z =  Z( 1 ) * Z( 2 ) * ... * Z( m ).
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IWS, KI, KK, LDWORK, LWKOPT, M1, MU, NB,
-     $                   NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLARZB, ZLARZT, ZLATRZ
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.M ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -4
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( M.EQ.0 .OR. M.EQ.N ) THEN
-            LWKOPT = 1
-         ELSE
-*
-*           Determine the block size.
-*
-            NB = ILAENV( 1, 'ZGERQF', ' ', M, N, -1, -1 )
-            LWKOPT = M*NB
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
-            INFO = -7
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZTZRZF', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 ) THEN
-         RETURN
-      ELSE IF( M.EQ.N ) THEN
-         DO 10 I = 1, N
-            TAU( I ) = ZERO
-   10    CONTINUE
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 1
-      IWS = M
-      IF( NB.GT.1 .AND. NB.LT.M ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'ZGERQF', ' ', M, N, -1, -1 ) )
-         IF( NX.LT.M ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = M
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'ZGERQF', ' ', M, N, -1,
-     $                 -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.M .AND. NX.LT.M ) THEN
-*
-*        Use blocked code initially.
-*        The last kk rows are handled by the block method.
-*
-         M1 = MIN( M+1, N )
-         KI = ( ( M-NX-1 ) / NB )*NB
-         KK = MIN( M, KI+NB )
-*
-         DO 20 I = M - KK + KI + 1, M - KK + 1, -NB
-            IB = MIN( M-I+1, NB )
-*
-*           Compute the TZ factorization of the current block
-*           A(i:i+ib-1,i:n)
-*
-            CALL ZLATRZ( IB, N-I+1, N-M, A( I, I ), LDA, TAU( I ),
-     $                   WORK )
-            IF( I.GT.1 ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i+ib-1) . . . H(i+1) H(i)
-*
-               CALL ZLARZT( 'Backward', 'Rowwise', N-M, IB, A( I, M1 ),
-     $                      LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H to A(1:i-1,i:n) from the right
-*
-               CALL ZLARZB( 'Right', 'No transpose', 'Backward',
-     $                      'Rowwise', I-1, N-I+1, IB, N-M, A( I, M1 ),
-     $                      LDA, WORK, LDWORK, A( 1, I ), LDA,
-     $                      WORK( IB+1 ), LDWORK )
-            END IF
-   20    CONTINUE
-         MU = I + NB - 1
-      ELSE
-         MU = M
-      END IF
-*
-*     Use unblocked code to factor the last or only block
-*
-      IF( MU.GT.0 )
-     $   CALL ZLATRZ( MU, N, N-M, A, LDA, TAU, WORK )
-*
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of ZTZRZF
-*
-      END
--- a/libcruft/lapack/zung2l.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,128 +0,0 @@
-      SUBROUTINE ZUNG2L( M, N, K, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZUNG2L generates an m by n complex matrix Q with orthonormal columns,
-*  which is defined as the last n columns of a product of k elementary
-*  reflectors of order m
-*
-*        Q  =  H(k) . . . H(2) H(1)
-*
-*  as returned by ZGEQLF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. M >= N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. N >= K >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the (n-k+i)-th column must contain the vector which
-*          defines the elementary reflector H(i), for i = 1,2,...,k, as
-*          returned by ZGEQLF in the last k columns of its array
-*          argument A.
-*          On exit, the m-by-n matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) COMPLEX*16 array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by ZGEQLF.
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),
-     $                   ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, II, J, L
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLARF, ZSCAL
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZUNG2L', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-*     Initialise columns 1:n-k to columns of the unit matrix
-*
-      DO 20 J = 1, N - K
-         DO 10 L = 1, M
-            A( L, J ) = ZERO
-   10    CONTINUE
-         A( M-N+J, J ) = ONE
-   20 CONTINUE
-*
-      DO 40 I = 1, K
-         II = N - K + I
-*
-*        Apply H(i) to A(1:m-k+i,1:n-k+i) from the left
-*
-         A( M-N+II, II ) = ONE
-         CALL ZLARF( 'Left', M-N+II, II-1, A( 1, II ), 1, TAU( I ), A,
-     $               LDA, WORK )
-         CALL ZSCAL( M-N+II-1, -TAU( I ), A( 1, II ), 1 )
-         A( M-N+II, II ) = ONE - TAU( I )
-*
-*        Set A(m-k+i+1:m,n-k+i) to zero
-*
-         DO 30 L = M - N + II + 1, M
-            A( L, II ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-      RETURN
-*
-*     End of ZUNG2L
-*
-      END
--- a/libcruft/lapack/zung2r.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,130 +0,0 @@
-      SUBROUTINE ZUNG2R( M, N, K, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZUNG2R generates an m by n complex matrix Q with orthonormal columns,
-*  which is defined as the first n columns of a product of k elementary
-*  reflectors of order m
-*
-*        Q  =  H(1) H(2) . . . H(k)
-*
-*  as returned by ZGEQRF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. M >= N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. N >= K >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the i-th column must contain the vector which
-*          defines the elementary reflector H(i), for i = 1,2,...,k, as
-*          returned by ZGEQRF in the first k columns of its array
-*          argument A.
-*          On exit, the m by n matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) COMPLEX*16 array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by ZGEQRF.
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (N)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),
-     $                   ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J, L
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLARF, ZSCAL
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZUNG2R', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 )
-     $   RETURN
-*
-*     Initialise columns k+1:n to columns of the unit matrix
-*
-      DO 20 J = K + 1, N
-         DO 10 L = 1, M
-            A( L, J ) = ZERO
-   10    CONTINUE
-         A( J, J ) = ONE
-   20 CONTINUE
-*
-      DO 40 I = K, 1, -1
-*
-*        Apply H(i) to A(i:m,i:n) from the left
-*
-         IF( I.LT.N ) THEN
-            A( I, I ) = ONE
-            CALL ZLARF( 'Left', M-I+1, N-I, A( I, I ), 1, TAU( I ),
-     $                  A( I, I+1 ), LDA, WORK )
-         END IF
-         IF( I.LT.M )
-     $      CALL ZSCAL( M-I, -TAU( I ), A( I+1, I ), 1 )
-         A( I, I ) = ONE - TAU( I )
-*
-*        Set A(1:i-1,i) to zero
-*
-         DO 30 L = 1, I - 1
-            A( L, I ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-      RETURN
-*
-*     End of ZUNG2R
-*
-      END
--- a/libcruft/lapack/zungbr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,245 +0,0 @@
-      SUBROUTINE ZUNGBR( VECT, M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          VECT
-      INTEGER            INFO, K, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZUNGBR generates one of the complex unitary matrices Q or P**H
-*  determined by ZGEBRD when reducing a complex matrix A to bidiagonal
-*  form: A = Q * B * P**H.  Q and P**H are defined as products of
-*  elementary reflectors H(i) or G(i) respectively.
-*
-*  If VECT = 'Q', A is assumed to have been an M-by-K matrix, and Q
-*  is of order M:
-*  if m >= k, Q = H(1) H(2) . . . H(k) and ZUNGBR returns the first n
-*  columns of Q, where m >= n >= k;
-*  if m < k, Q = H(1) H(2) . . . H(m-1) and ZUNGBR returns Q as an
-*  M-by-M matrix.
-*
-*  If VECT = 'P', A is assumed to have been a K-by-N matrix, and P**H
-*  is of order N:
-*  if k < n, P**H = G(k) . . . G(2) G(1) and ZUNGBR returns the first m
-*  rows of P**H, where n >= m >= k;
-*  if k >= n, P**H = G(n-1) . . . G(2) G(1) and ZUNGBR returns P**H as
-*  an N-by-N matrix.
-*
-*  Arguments
-*  =========
-*
-*  VECT    (input) CHARACTER*1
-*          Specifies whether the matrix Q or the matrix P**H is
-*          required, as defined in the transformation applied by ZGEBRD:
-*          = 'Q':  generate Q;
-*          = 'P':  generate P**H.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q or P**H to be returned.
-*          M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q or P**H to be returned.
-*          N >= 0.
-*          If VECT = 'Q', M >= N >= min(M,K);
-*          if VECT = 'P', N >= M >= min(N,K).
-*
-*  K       (input) INTEGER
-*          If VECT = 'Q', the number of columns in the original M-by-K
-*          matrix reduced by ZGEBRD.
-*          If VECT = 'P', the number of rows in the original K-by-N
-*          matrix reduced by ZGEBRD.
-*          K >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the vectors which define the elementary reflectors,
-*          as returned by ZGEBRD.
-*          On exit, the M-by-N matrix Q or P**H.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= M.
-*
-*  TAU     (input) COMPLEX*16 array, dimension
-*                                (min(M,K)) if VECT = 'Q'
-*                                (min(N,K)) if VECT = 'P'
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i) or G(i), which determines Q or P**H, as
-*          returned by ZGEBRD in its array argument TAUQ or TAUP.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,min(M,N)).
-*          For optimum performance LWORK >= min(M,N)*NB, where NB
-*          is the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ),
-     $                   ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, WANTQ
-      INTEGER            I, IINFO, J, LWKOPT, MN, NB
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZUNGLQ, ZUNGQR
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      WANTQ = LSAME( VECT, 'Q' )
-      MN = MIN( M, N )
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( .NOT.WANTQ .AND. .NOT.LSAME( VECT, 'P' ) ) THEN
-         INFO = -1
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( N.LT.0 .OR. ( WANTQ .AND. ( N.GT.M .OR. N.LT.MIN( M,
-     $         K ) ) ) .OR. ( .NOT.WANTQ .AND. ( M.GT.N .OR. M.LT.
-     $         MIN( N, K ) ) ) ) THEN
-         INFO = -3
-      ELSE IF( K.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -6
-      ELSE IF( LWORK.LT.MAX( 1, MN ) .AND. .NOT.LQUERY ) THEN
-         INFO = -9
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( WANTQ ) THEN
-            NB = ILAENV( 1, 'ZUNGQR', ' ', M, N, K, -1 )
-         ELSE
-            NB = ILAENV( 1, 'ZUNGLQ', ' ', M, N, K, -1 )
-         END IF
-         LWKOPT = MAX( 1, MN )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZUNGBR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      IF( WANTQ ) THEN
-*
-*        Form Q, determined by a call to ZGEBRD to reduce an m-by-k
-*        matrix
-*
-         IF( M.GE.K ) THEN
-*
-*           If m >= k, assume m >= n >= k
-*
-            CALL ZUNGQR( M, N, K, A, LDA, TAU, WORK, LWORK, IINFO )
-*
-         ELSE
-*
-*           If m < k, assume m = n
-*
-*           Shift the vectors which define the elementary reflectors one
-*           column to the right, and set the first row and column of Q
-*           to those of the unit matrix
-*
-            DO 20 J = M, 2, -1
-               A( 1, J ) = ZERO
-               DO 10 I = J + 1, M
-                  A( I, J ) = A( I, J-1 )
-   10          CONTINUE
-   20       CONTINUE
-            A( 1, 1 ) = ONE
-            DO 30 I = 2, M
-               A( I, 1 ) = ZERO
-   30       CONTINUE
-            IF( M.GT.1 ) THEN
-*
-*              Form Q(2:m,2:m)
-*
-               CALL ZUNGQR( M-1, M-1, M-1, A( 2, 2 ), LDA, TAU, WORK,
-     $                      LWORK, IINFO )
-            END IF
-         END IF
-      ELSE
-*
-*        Form P', determined by a call to ZGEBRD to reduce a k-by-n
-*        matrix
-*
-         IF( K.LT.N ) THEN
-*
-*           If k < n, assume k <= m <= n
-*
-            CALL ZUNGLQ( M, N, K, A, LDA, TAU, WORK, LWORK, IINFO )
-*
-         ELSE
-*
-*           If k >= n, assume m = n
-*
-*           Shift the vectors which define the elementary reflectors one
-*           row downward, and set the first row and column of P' to
-*           those of the unit matrix
-*
-            A( 1, 1 ) = ONE
-            DO 40 I = 2, N
-               A( I, 1 ) = ZERO
-   40       CONTINUE
-            DO 60 J = 2, N
-               DO 50 I = J - 1, 2, -1
-                  A( I, J ) = A( I-1, J )
-   50          CONTINUE
-               A( 1, J ) = ZERO
-   60       CONTINUE
-            IF( N.GT.1 ) THEN
-*
-*              Form P'(2:n,2:n)
-*
-               CALL ZUNGLQ( N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK,
-     $                      LWORK, IINFO )
-            END IF
-         END IF
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of ZUNGBR
-*
-      END
--- a/libcruft/lapack/zunghr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,165 +0,0 @@
-      SUBROUTINE ZUNGHR( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            IHI, ILO, INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZUNGHR generates a complex unitary matrix Q which is defined as the
-*  product of IHI-ILO elementary reflectors of order N, as returned by
-*  ZGEHRD:
-*
-*  Q = H(ilo) H(ilo+1) . . . H(ihi-1).
-*
-*  Arguments
-*  =========
-*
-*  N       (input) INTEGER
-*          The order of the matrix Q. N >= 0.
-*
-*  ILO     (input) INTEGER
-*  IHI     (input) INTEGER
-*          ILO and IHI must have the same values as in the previous call
-*          of ZGEHRD. Q is equal to the unit matrix except in the
-*          submatrix Q(ilo+1:ihi,ilo+1:ihi).
-*          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the vectors which define the elementary reflectors,
-*          as returned by ZGEHRD.
-*          On exit, the N-by-N unitary matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,N).
-*
-*  TAU     (input) COMPLEX*16 array, dimension (N-1)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by ZGEHRD.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= IHI-ILO.
-*          For optimum performance LWORK >= (IHI-ILO)*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ),
-     $                   ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IINFO, J, LWKOPT, NB, NH
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZUNGQR
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NH = IHI - ILO
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( N.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
-         INFO = -2
-      ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -5
-      ELSE IF( LWORK.LT.MAX( 1, NH ) .AND. .NOT.LQUERY ) THEN
-         INFO = -8
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         NB = ILAENV( 1, 'ZUNGQR', ' ', NH, NH, NH, -1 )
-         LWKOPT = MAX( 1, NH )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZUNGHR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-*     Shift the vectors which define the elementary reflectors one
-*     column to the right, and set the first ilo and the last n-ihi
-*     rows and columns to those of the unit matrix
-*
-      DO 40 J = IHI, ILO + 1, -1
-         DO 10 I = 1, J - 1
-            A( I, J ) = ZERO
-   10    CONTINUE
-         DO 20 I = J + 1, IHI
-            A( I, J ) = A( I, J-1 )
-   20    CONTINUE
-         DO 30 I = IHI + 1, N
-            A( I, J ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-      DO 60 J = 1, ILO
-         DO 50 I = 1, N
-            A( I, J ) = ZERO
-   50    CONTINUE
-         A( J, J ) = ONE
-   60 CONTINUE
-      DO 80 J = IHI + 1, N
-         DO 70 I = 1, N
-            A( I, J ) = ZERO
-   70    CONTINUE
-         A( J, J ) = ONE
-   80 CONTINUE
-*
-      IF( NH.GT.0 ) THEN
-*
-*        Generate Q(ilo+1:ihi,ilo+1:ihi)
-*
-         CALL ZUNGQR( NH, NH, NH, A( ILO+1, ILO+1 ), LDA, TAU( ILO ),
-     $                WORK, LWORK, IINFO )
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of ZUNGHR
-*
-      END
--- a/libcruft/lapack/zungl2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,136 +0,0 @@
-      SUBROUTINE ZUNGL2( M, N, K, A, LDA, TAU, WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZUNGL2 generates an m-by-n complex matrix Q with orthonormal rows,
-*  which is defined as the first m rows of a product of k elementary
-*  reflectors of order n
-*
-*        Q  =  H(k)' . . . H(2)' H(1)'
-*
-*  as returned by ZGELQF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. N >= M.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. M >= K >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the i-th row must contain the vector which defines
-*          the elementary reflector H(i), for i = 1,2,...,k, as returned
-*          by ZGELQF in the first k rows of its array argument A.
-*          On exit, the m by n matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) COMPLEX*16 array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by ZGELQF.
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension (M)
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE, ZERO
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),
-     $                   ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      INTEGER            I, J, L
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLACGV, ZLARF, ZSCAL
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.M ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZUNGL2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 )
-     $   RETURN
-*
-      IF( K.LT.M ) THEN
-*
-*        Initialise rows k+1:m to rows of the unit matrix
-*
-         DO 20 J = 1, N
-            DO 10 L = K + 1, M
-               A( L, J ) = ZERO
-   10       CONTINUE
-            IF( J.GT.K .AND. J.LE.M )
-     $         A( J, J ) = ONE
-   20    CONTINUE
-      END IF
-*
-      DO 40 I = K, 1, -1
-*
-*        Apply H(i)' to A(i:m,i:n) from the right
-*
-         IF( I.LT.N ) THEN
-            CALL ZLACGV( N-I, A( I, I+1 ), LDA )
-            IF( I.LT.M ) THEN
-               A( I, I ) = ONE
-               CALL ZLARF( 'Right', M-I, N-I+1, A( I, I ), LDA,
-     $                     DCONJG( TAU( I ) ), A( I+1, I ), LDA, WORK )
-            END IF
-            CALL ZSCAL( N-I, -TAU( I ), A( I, I+1 ), LDA )
-            CALL ZLACGV( N-I, A( I, I+1 ), LDA )
-         END IF
-         A( I, I ) = ONE - DCONJG( TAU( I ) )
-*
-*        Set A(i,1:i-1) to zero
-*
-         DO 30 L = 1, I - 1
-            A( I, L ) = ZERO
-   30    CONTINUE
-   40 CONTINUE
-      RETURN
-*
-*     End of ZUNGL2
-*
-      END
--- a/libcruft/lapack/zunglq.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,215 +0,0 @@
-      SUBROUTINE ZUNGLQ( M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZUNGLQ generates an M-by-N complex matrix Q with orthonormal rows,
-*  which is defined as the first M rows of a product of K elementary
-*  reflectors of order N
-*
-*        Q  =  H(k)' . . . H(2)' H(1)'
-*
-*  as returned by ZGELQF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. N >= M.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. M >= K >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the i-th row must contain the vector which defines
-*          the elementary reflector H(i), for i = 1,2,...,k, as returned
-*          by ZGELQF in the first k rows of its array argument A.
-*          On exit, the M-by-N matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) COMPLEX*16 array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by ZGELQF.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,M).
-*          For optimum performance LWORK >= M*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit;
-*          < 0:  if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, J, KI, KK, L, LDWORK,
-     $                   LWKOPT, NB, NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLARFB, ZLARFT, ZUNGL2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NB = ILAENV( 1, 'ZUNGLQ', ' ', M, N, K, -1 )
-      LWKOPT = MAX( 1, M )*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.M ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZUNGLQ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.LE.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = M
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'ZUNGLQ', ' ', M, N, K, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = M
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'ZUNGLQ', ' ', M, N, K, -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code after the last block.
-*        The first kk rows are handled by the block method.
-*
-         KI = ( ( K-NX-1 ) / NB )*NB
-         KK = MIN( K, KI+NB )
-*
-*        Set A(kk+1:m,1:kk) to zero.
-*
-         DO 20 J = 1, KK
-            DO 10 I = KK + 1, M
-               A( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-      ELSE
-         KK = 0
-      END IF
-*
-*     Use unblocked code for the last or only block.
-*
-      IF( KK.LT.M )
-     $   CALL ZUNGL2( M-KK, N-KK, K-KK, A( KK+1, KK+1 ), LDA,
-     $                TAU( KK+1 ), WORK, IINFO )
-*
-      IF( KK.GT.0 ) THEN
-*
-*        Use blocked code
-*
-         DO 50 I = KI + 1, 1, -NB
-            IB = MIN( NB, K-I+1 )
-            IF( I+IB.LE.M ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i) H(i+1) . . . H(i+ib-1)
-*
-               CALL ZLARFT( 'Forward', 'Rowwise', N-I+1, IB, A( I, I ),
-     $                      LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H' to A(i+ib:m,i:n) from the right
-*
-               CALL ZLARFB( 'Right', 'Conjugate transpose', 'Forward',
-     $                      'Rowwise', M-I-IB+1, N-I+1, IB, A( I, I ),
-     $                      LDA, WORK, LDWORK, A( I+IB, I ), LDA,
-     $                      WORK( IB+1 ), LDWORK )
-            END IF
-*
-*           Apply H' to columns i:n of current block
-*
-            CALL ZUNGL2( IB, N-I+1, IB, A( I, I ), LDA, TAU( I ), WORK,
-     $                   IINFO )
-*
-*           Set columns 1:i-1 of current block to zero
-*
-            DO 40 J = 1, I - 1
-               DO 30 L = I, I + IB - 1
-                  A( L, J ) = ZERO
-   30          CONTINUE
-   40       CONTINUE
-   50    CONTINUE
-      END IF
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of ZUNGLQ
-*
-      END
--- a/libcruft/lapack/zungql.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,222 +0,0 @@
-      SUBROUTINE ZUNGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZUNGQL generates an M-by-N complex matrix Q with orthonormal columns,
-*  which is defined as the last N columns of a product of K elementary
-*  reflectors of order M
-*
-*        Q  =  H(k) . . . H(2) H(1)
-*
-*  as returned by ZGEQLF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. M >= N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. N >= K >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the (n-k+i)-th column must contain the vector which
-*          defines the elementary reflector H(i), for i = 1,2,...,k, as
-*          returned by ZGEQLF in the last k columns of its array
-*          argument A.
-*          On exit, the M-by-N matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) COMPLEX*16 array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by ZGEQLF.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,N).
-*          For optimum performance LWORK >= N*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, J, KK, L, LDWORK, LWKOPT,
-     $                   NB, NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLARFB, ZLARFT, ZUNG2L
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( N.EQ.0 ) THEN
-            LWKOPT = 1
-         ELSE
-            NB = ILAENV( 1, 'ZUNGQL', ' ', M, N, K, -1 )
-            LWKOPT = N*NB
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-            INFO = -8
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZUNGQL', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 ) THEN
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = N
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'ZUNGQL', ' ', M, N, K, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = N
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'ZUNGQL', ' ', M, N, K, -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code after the first block.
-*        The last kk columns are handled by the block method.
-*
-         KK = MIN( K, ( ( K-NX+NB-1 ) / NB )*NB )
-*
-*        Set A(m-kk+1:m,1:n-kk) to zero.
-*
-         DO 20 J = 1, N - KK
-            DO 10 I = M - KK + 1, M
-               A( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-      ELSE
-         KK = 0
-      END IF
-*
-*     Use unblocked code for the first or only block.
-*
-      CALL ZUNG2L( M-KK, N-KK, K-KK, A, LDA, TAU, WORK, IINFO )
-*
-      IF( KK.GT.0 ) THEN
-*
-*        Use blocked code
-*
-         DO 50 I = K - KK + 1, K, NB
-            IB = MIN( NB, K-I+1 )
-            IF( N-K+I.GT.1 ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i+ib-1) . . . H(i+1) H(i)
-*
-               CALL ZLARFT( 'Backward', 'Columnwise', M-K+I+IB-1, IB,
-     $                      A( 1, N-K+I ), LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H to A(1:m-k+i+ib-1,1:n-k+i-1) from the left
-*
-               CALL ZLARFB( 'Left', 'No transpose', 'Backward',
-     $                      'Columnwise', M-K+I+IB-1, N-K+I-1, IB,
-     $                      A( 1, N-K+I ), LDA, WORK, LDWORK, A, LDA,
-     $                      WORK( IB+1 ), LDWORK )
-            END IF
-*
-*           Apply H to rows 1:m-k+i+ib-1 of current block
-*
-            CALL ZUNG2L( M-K+I+IB-1, IB, IB, A( 1, N-K+I ), LDA,
-     $                   TAU( I ), WORK, IINFO )
-*
-*           Set rows m-k+i+ib:m of current block to zero
-*
-            DO 40 J = N - K + I, N - K + I + IB - 1
-               DO 30 L = M - K + I + IB, M
-                  A( L, J ) = ZERO
-   30          CONTINUE
-   40       CONTINUE
-   50    CONTINUE
-      END IF
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of ZUNGQL
-*
-      END
--- a/libcruft/lapack/zungqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,216 +0,0 @@
-      SUBROUTINE ZUNGQR( M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      INTEGER            INFO, K, LDA, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZUNGQR generates an M-by-N complex matrix Q with orthonormal columns,
-*  which is defined as the first N columns of a product of K elementary
-*  reflectors of order M
-*
-*        Q  =  H(1) H(2) . . . H(k)
-*
-*  as returned by ZGEQRF.
-*
-*  Arguments
-*  =========
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix Q. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix Q. M >= N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines the
-*          matrix Q. N >= K >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the i-th column must contain the vector which
-*          defines the elementary reflector H(i), for i = 1,2,...,k, as
-*          returned by ZGEQRF in the first k columns of its array
-*          argument A.
-*          On exit, the M-by-N matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The first dimension of the array A. LDA >= max(1,M).
-*
-*  TAU     (input) COMPLEX*16 array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by ZGEQRF.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= max(1,N).
-*          For optimum performance LWORK >= N*NB, where NB is the
-*          optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument has an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY
-      INTEGER            I, IB, IINFO, IWS, J, KI, KK, L, LDWORK,
-     $                   LWKOPT, NB, NBMIN, NX
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLARFB, ZLARFT, ZUNG2R
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. External Functions ..
-      INTEGER            ILAENV
-      EXTERNAL           ILAENV
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      NB = ILAENV( 1, 'ZUNGQR', ' ', M, N, K, -1 )
-      LWKOPT = MAX( 1, N )*NB
-      WORK( 1 ) = LWKOPT
-      LQUERY = ( LWORK.EQ.-1 )
-      IF( M.LT.0 ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
-         INFO = -2
-      ELSE IF( K.LT.0 .OR. K.GT.N ) THEN
-         INFO = -3
-      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
-         INFO = -5
-      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
-         INFO = -8
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZUNGQR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.LE.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      NX = 0
-      IWS = N
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-*
-*        Determine when to cross over from blocked to unblocked code.
-*
-         NX = MAX( 0, ILAENV( 3, 'ZUNGQR', ' ', M, N, K, -1 ) )
-         IF( NX.LT.K ) THEN
-*
-*           Determine if workspace is large enough for blocked code.
-*
-            LDWORK = N
-            IWS = LDWORK*NB
-            IF( LWORK.LT.IWS ) THEN
-*
-*              Not enough workspace to use optimal NB:  reduce NB and
-*              determine the minimum value of NB.
-*
-               NB = LWORK / LDWORK
-               NBMIN = MAX( 2, ILAENV( 2, 'ZUNGQR', ' ', M, N, K, -1 ) )
-            END IF
-         END IF
-      END IF
-*
-      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
-*
-*        Use blocked code after the last block.
-*        The first kk columns are handled by the block method.
-*
-         KI = ( ( K-NX-1 ) / NB )*NB
-         KK = MIN( K, KI+NB )
-*
-*        Set A(1:kk,kk+1:n) to zero.
-*
-         DO 20 J = KK + 1, N
-            DO 10 I = 1, KK
-               A( I, J ) = ZERO
-   10       CONTINUE
-   20    CONTINUE
-      ELSE
-         KK = 0
-      END IF
-*
-*     Use unblocked code for the last or only block.
-*
-      IF( KK.LT.N )
-     $   CALL ZUNG2R( M-KK, N-KK, K-KK, A( KK+1, KK+1 ), LDA,
-     $                TAU( KK+1 ), WORK, IINFO )
-*
-      IF( KK.GT.0 ) THEN
-*
-*        Use blocked code
-*
-         DO 50 I = KI + 1, 1, -NB
-            IB = MIN( NB, K-I+1 )
-            IF( I+IB.LE.N ) THEN
-*
-*              Form the triangular factor of the block reflector
-*              H = H(i) H(i+1) . . . H(i+ib-1)
-*
-               CALL ZLARFT( 'Forward', 'Columnwise', M-I+1, IB,
-     $                      A( I, I ), LDA, TAU( I ), WORK, LDWORK )
-*
-*              Apply H to A(i:m,i+ib:n) from the left
-*
-               CALL ZLARFB( 'Left', 'No transpose', 'Forward',
-     $                      'Columnwise', M-I+1, N-I-IB+1, IB,
-     $                      A( I, I ), LDA, WORK, LDWORK, A( I, I+IB ),
-     $                      LDA, WORK( IB+1 ), LDWORK )
-            END IF
-*
-*           Apply H to rows i:m of current block
-*
-            CALL ZUNG2R( M-I+1, IB, IB, A( I, I ), LDA, TAU( I ), WORK,
-     $                   IINFO )
-*
-*           Set rows 1:i-1 of current block to zero
-*
-            DO 40 J = I, I + IB - 1
-               DO 30 L = 1, I - 1
-                  A( L, J ) = ZERO
-   30          CONTINUE
-   40       CONTINUE
-   50    CONTINUE
-      END IF
-*
-      WORK( 1 ) = IWS
-      RETURN
-*
-*     End of ZUNGQR
-*
-      END
--- a/libcruft/lapack/zungtr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,184 +0,0 @@
-      SUBROUTINE ZUNGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          UPLO
-      INTEGER            INFO, LDA, LWORK, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZUNGTR generates a complex unitary matrix Q which is defined as the
-*  product of n-1 elementary reflectors of order N, as returned by
-*  ZHETRD:
-*
-*  if UPLO = 'U', Q = H(n-1) . . . H(2) H(1),
-*
-*  if UPLO = 'L', Q = H(1) H(2) . . . H(n-1).
-*
-*  Arguments
-*  =========
-*
-*  UPLO    (input) CHARACTER*1
-*          = 'U': Upper triangle of A contains elementary reflectors
-*                 from ZHETRD;
-*          = 'L': Lower triangle of A contains elementary reflectors
-*                 from ZHETRD.
-*
-*  N       (input) INTEGER
-*          The order of the matrix Q. N >= 0.
-*
-*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)
-*          On entry, the vectors which define the elementary reflectors,
-*          as returned by ZHETRD.
-*          On exit, the N-by-N unitary matrix Q.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= N.
-*
-*  TAU     (input) COMPLEX*16 array, dimension (N-1)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by ZHETRD.
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK. LWORK >= N-1.
-*          For optimum performance LWORK >= (N-1)*NB, where NB is
-*          the optimal blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ZERO, ONE
-      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ),
-     $                   ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LQUERY, UPPER
-      INTEGER            I, IINFO, J, LWKOPT, NB
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZUNGQL, ZUNGQR
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LQUERY = ( LWORK.EQ.-1 )
-      UPPER = LSAME( UPLO, 'U' )
-      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
-         INFO = -1
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -2
-      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
-         INFO = -4
-      ELSE IF( LWORK.LT.MAX( 1, N-1 ) .AND. .NOT.LQUERY ) THEN
-         INFO = -7
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( UPPER ) THEN
-            NB = ILAENV( 1, 'ZUNGQL', ' ', N-1, N-1, N-1, -1 )
-         ELSE
-            NB = ILAENV( 1, 'ZUNGQR', ' ', N-1, N-1, N-1, -1 )
-         END IF
-         LWKOPT = MAX( 1, N-1 )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZUNGTR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( N.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      IF( UPPER ) THEN
-*
-*        Q was determined by a call to ZHETRD with UPLO = 'U'
-*
-*        Shift the vectors which define the elementary reflectors one
-*        column to the left, and set the last row and column of Q to
-*        those of the unit matrix
-*
-         DO 20 J = 1, N - 1
-            DO 10 I = 1, J - 1
-               A( I, J ) = A( I, J+1 )
-   10       CONTINUE
-            A( N, J ) = ZERO
-   20    CONTINUE
-         DO 30 I = 1, N - 1
-            A( I, N ) = ZERO
-   30    CONTINUE
-         A( N, N ) = ONE
-*
-*        Generate Q(1:n-1,1:n-1)
-*
-         CALL ZUNGQL( N-1, N-1, N-1, A, LDA, TAU, WORK, LWORK, IINFO )
-*
-      ELSE
-*
-*        Q was determined by a call to ZHETRD with UPLO = 'L'.
-*
-*        Shift the vectors which define the elementary reflectors one
-*        column to the right, and set the first row and column of Q to
-*        those of the unit matrix
-*
-         DO 50 J = N, 2, -1
-            A( 1, J ) = ZERO
-            DO 40 I = J + 1, N
-               A( I, J ) = A( I, J-1 )
-   40       CONTINUE
-   50    CONTINUE
-         A( 1, 1 ) = ONE
-         DO 60 I = 2, N
-            A( I, 1 ) = ZERO
-   60    CONTINUE
-         IF( N.GT.1 ) THEN
-*
-*           Generate Q(2:n,2:n)
-*
-            CALL ZUNGQR( N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK,
-     $                   LWORK, IINFO )
-         END IF
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of ZUNGTR
-*
-      END
--- a/libcruft/lapack/zunm2r.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,201 +0,0 @@
-      SUBROUTINE ZUNM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, LDA, LDC, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZUNM2R overwrites the general complex m-by-n matrix C with
-*
-*        Q * C  if SIDE = 'L' and TRANS = 'N', or
-*
-*        Q'* C  if SIDE = 'L' and TRANS = 'C', or
-*
-*        C * Q  if SIDE = 'R' and TRANS = 'N', or
-*
-*        C * Q' if SIDE = 'R' and TRANS = 'C',
-*
-*  where Q is a complex unitary matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(1) H(2) . . . H(k)
-*
-*  as returned by ZGEQRF. Q is of order m if SIDE = 'L' and of order n
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q' from the Left
-*          = 'R': apply Q or Q' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply Q  (No transpose)
-*          = 'C': apply Q' (Conjugate transpose)
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  A       (input) COMPLEX*16 array, dimension (LDA,K)
-*          The i-th column must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          ZGEQRF in the first k columns of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.
-*          If SIDE = 'L', LDA >= max(1,M);
-*          if SIDE = 'R', LDA >= max(1,N).
-*
-*  TAU     (input) COMPLEX*16 array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by ZGEQRF.
-*
-*  C       (input/output) COMPLEX*16 array, dimension (LDC,N)
-*          On entry, the m-by-n matrix C.
-*          On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension
-*                                   (N) if SIDE = 'L',
-*                                   (M) if SIDE = 'R'
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, NOTRAN
-      INTEGER            I, I1, I2, I3, IC, JC, MI, NI, NQ
-      COMPLEX*16         AII, TAUI
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLARF
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-*
-*     NQ is the order of Q
-*
-      IF( LEFT ) THEN
-         NQ = M
-      ELSE
-         NQ = N
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN
-         INFO = -7
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZUNM2R', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 )
-     $   RETURN
-*
-      IF( ( LEFT .AND. .NOT.NOTRAN .OR. .NOT.LEFT .AND. NOTRAN ) ) THEN
-         I1 = 1
-         I2 = K
-         I3 = 1
-      ELSE
-         I1 = K
-         I2 = 1
-         I3 = -1
-      END IF
-*
-      IF( LEFT ) THEN
-         NI = N
-         JC = 1
-      ELSE
-         MI = M
-         IC = 1
-      END IF
-*
-      DO 10 I = I1, I2, I3
-         IF( LEFT ) THEN
-*
-*           H(i) or H(i)' is applied to C(i:m,1:n)
-*
-            MI = M - I + 1
-            IC = I
-         ELSE
-*
-*           H(i) or H(i)' is applied to C(1:m,i:n)
-*
-            NI = N - I + 1
-            JC = I
-         END IF
-*
-*        Apply H(i) or H(i)'
-*
-         IF( NOTRAN ) THEN
-            TAUI = TAU( I )
-         ELSE
-            TAUI = DCONJG( TAU( I ) )
-         END IF
-         AII = A( I, I )
-         A( I, I ) = ONE
-         CALL ZLARF( SIDE, MI, NI, A( I, I ), 1, TAUI, C( IC, JC ), LDC,
-     $               WORK )
-         A( I, I ) = AII
-   10 CONTINUE
-      RETURN
-*
-*     End of ZUNM2R
-*
-      END
--- a/libcruft/lapack/zunmbr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,288 +0,0 @@
-      SUBROUTINE ZUNMBR( VECT, SIDE, TRANS, M, N, K, A, LDA, TAU, C,
-     $                   LDC, WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS, VECT
-      INTEGER            INFO, K, LDA, LDC, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  If VECT = 'Q', ZUNMBR overwrites the general complex M-by-N matrix C
-*  with
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      Q * C          C * Q
-*  TRANS = 'C':      Q**H * C       C * Q**H
-*
-*  If VECT = 'P', ZUNMBR overwrites the general complex M-by-N matrix C
-*  with
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      P * C          C * P
-*  TRANS = 'C':      P**H * C       C * P**H
-*
-*  Here Q and P**H are the unitary matrices determined by ZGEBRD when
-*  reducing a complex matrix A to bidiagonal form: A = Q * B * P**H. Q
-*  and P**H are defined as products of elementary reflectors H(i) and
-*  G(i) respectively.
-*
-*  Let nq = m if SIDE = 'L' and nq = n if SIDE = 'R'. Thus nq is the
-*  order of the unitary matrix Q or P**H that is applied.
-*
-*  If VECT = 'Q', A is assumed to have been an NQ-by-K matrix:
-*  if nq >= k, Q = H(1) H(2) . . . H(k);
-*  if nq < k, Q = H(1) H(2) . . . H(nq-1).
-*
-*  If VECT = 'P', A is assumed to have been a K-by-NQ matrix:
-*  if k < nq, P = G(1) G(2) . . . G(k);
-*  if k >= nq, P = G(1) G(2) . . . G(nq-1).
-*
-*  Arguments
-*  =========
-*
-*  VECT    (input) CHARACTER*1
-*          = 'Q': apply Q or Q**H;
-*          = 'P': apply P or P**H.
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q, Q**H, P or P**H from the Left;
-*          = 'R': apply Q, Q**H, P or P**H from the Right.
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N':  No transpose, apply Q or P;
-*          = 'C':  Conjugate transpose, apply Q**H or P**H.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          If VECT = 'Q', the number of columns in the original
-*          matrix reduced by ZGEBRD.
-*          If VECT = 'P', the number of rows in the original
-*          matrix reduced by ZGEBRD.
-*          K >= 0.
-*
-*  A       (input) COMPLEX*16 array, dimension
-*                                (LDA,min(nq,K)) if VECT = 'Q'
-*                                (LDA,nq)        if VECT = 'P'
-*          The vectors which define the elementary reflectors H(i) and
-*          G(i), whose products determine the matrices Q and P, as
-*          returned by ZGEBRD.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.
-*          If VECT = 'Q', LDA >= max(1,nq);
-*          if VECT = 'P', LDA >= max(1,min(nq,K)).
-*
-*  TAU     (input) COMPLEX*16 array, dimension (min(nq,K))
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i) or G(i) which determines Q or P, as returned
-*          by ZGEBRD in the array argument TAUQ or TAUP.
-*
-*  C       (input/output) COMPLEX*16 array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q
-*          or P*C or P**H*C or C*P or C*P**H.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If SIDE = 'L', LWORK >= max(1,N);
-*          if SIDE = 'R', LWORK >= max(1,M);
-*          if N = 0 or M = 0, LWORK >= 1.
-*          For optimum performance LWORK >= max(1,N*NB) if SIDE = 'L',
-*          and LWORK >= max(1,M*NB) if SIDE = 'R', where NB is the
-*          optimal blocksize. (NB = 0 if M = 0 or N = 0.)
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            APPLYQ, LEFT, LQUERY, NOTRAN
-      CHARACTER          TRANST
-      INTEGER            I1, I2, IINFO, LWKOPT, MI, NB, NI, NQ, NW
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZUNMLQ, ZUNMQR
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      APPLYQ = LSAME( VECT, 'Q' )
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-*     NQ is the order of Q or P and NW is the minimum dimension of WORK
-*
-      IF( LEFT ) THEN
-         NQ = M
-         NW = N
-      ELSE
-         NQ = N
-         NW = M
-      END IF
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         NW = 0
-      END IF
-      IF( .NOT.APPLYQ .AND. .NOT.LSAME( VECT, 'P' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -2
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -3
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -5
-      ELSE IF( K.LT.0 ) THEN
-         INFO = -6
-      ELSE IF( ( APPLYQ .AND. LDA.LT.MAX( 1, NQ ) ) .OR.
-     $         ( .NOT.APPLYQ .AND. LDA.LT.MAX( 1, MIN( NQ, K ) ) ) )
-     $          THEN
-         INFO = -8
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -11
-      ELSE IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
-         INFO = -13
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( NW.GT.0 ) THEN
-            IF( APPLYQ ) THEN
-               IF( LEFT ) THEN
-                  NB = ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M-1, N, M-1,
-     $                 -1 )
-               ELSE
-                  NB = ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M, N-1, N-1,
-     $                 -1 )
-               END IF
-            ELSE
-               IF( LEFT ) THEN
-                  NB = ILAENV( 1, 'ZUNMLQ', SIDE // TRANS, M-1, N, M-1,
-     $                 -1 )
-               ELSE
-                  NB = ILAENV( 1, 'ZUNMLQ', SIDE // TRANS, M, N-1, N-1,
-     $                 -1 )
-               END IF
-            END IF
-            LWKOPT = MAX( 1, NW*NB )
-         ELSE
-            LWKOPT = 1
-         END IF
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZUNMBR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 )
-     $   RETURN
-*
-      IF( APPLYQ ) THEN
-*
-*        Apply Q
-*
-         IF( NQ.GE.K ) THEN
-*
-*           Q was determined by a call to ZGEBRD with nq >= k
-*
-            CALL ZUNMQR( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, IINFO )
-         ELSE IF( NQ.GT.1 ) THEN
-*
-*           Q was determined by a call to ZGEBRD with nq < k
-*
-            IF( LEFT ) THEN
-               MI = M - 1
-               NI = N
-               I1 = 2
-               I2 = 1
-            ELSE
-               MI = M
-               NI = N - 1
-               I1 = 1
-               I2 = 2
-            END IF
-            CALL ZUNMQR( SIDE, TRANS, MI, NI, NQ-1, A( 2, 1 ), LDA, TAU,
-     $                   C( I1, I2 ), LDC, WORK, LWORK, IINFO )
-         END IF
-      ELSE
-*
-*        Apply P
-*
-         IF( NOTRAN ) THEN
-            TRANST = 'C'
-         ELSE
-            TRANST = 'N'
-         END IF
-         IF( NQ.GT.K ) THEN
-*
-*           P was determined by a call to ZGEBRD with nq > k
-*
-            CALL ZUNMLQ( SIDE, TRANST, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, IINFO )
-         ELSE IF( NQ.GT.1 ) THEN
-*
-*           P was determined by a call to ZGEBRD with nq <= k
-*
-            IF( LEFT ) THEN
-               MI = M - 1
-               NI = N
-               I1 = 2
-               I2 = 1
-            ELSE
-               MI = M
-               NI = N - 1
-               I1 = 1
-               I2 = 2
-            END IF
-            CALL ZUNMLQ( SIDE, TRANST, MI, NI, NQ-1, A( 1, 2 ), LDA,
-     $                   TAU, C( I1, I2 ), LDC, WORK, LWORK, IINFO )
-         END IF
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of ZUNMBR
-*
-      END
--- a/libcruft/lapack/zunml2.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,205 +0,0 @@
-      SUBROUTINE ZUNML2( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, LDA, LDC, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZUNML2 overwrites the general complex m-by-n matrix C with
-*
-*        Q * C  if SIDE = 'L' and TRANS = 'N', or
-*
-*        Q'* C  if SIDE = 'L' and TRANS = 'C', or
-*
-*        C * Q  if SIDE = 'R' and TRANS = 'N', or
-*
-*        C * Q' if SIDE = 'R' and TRANS = 'C',
-*
-*  where Q is a complex unitary matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(k)' . . . H(2)' H(1)'
-*
-*  as returned by ZGELQF. Q is of order m if SIDE = 'L' and of order n
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q' from the Left
-*          = 'R': apply Q or Q' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply Q  (No transpose)
-*          = 'C': apply Q' (Conjugate transpose)
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  A       (input) COMPLEX*16 array, dimension
-*                               (LDA,M) if SIDE = 'L',
-*                               (LDA,N) if SIDE = 'R'
-*          The i-th row must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          ZGELQF in the first k rows of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,K).
-*
-*  TAU     (input) COMPLEX*16 array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by ZGELQF.
-*
-*  C       (input/output) COMPLEX*16 array, dimension (LDC,N)
-*          On entry, the m-by-n matrix C.
-*          On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension
-*                                   (N) if SIDE = 'L',
-*                                   (M) if SIDE = 'R'
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      COMPLEX*16         ONE
-      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, NOTRAN
-      INTEGER            I, I1, I2, I3, IC, JC, MI, NI, NQ
-      COMPLEX*16         AII, TAUI
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLACGV, ZLARF
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-*
-*     NQ is the order of Q
-*
-      IF( LEFT ) THEN
-         NQ = M
-      ELSE
-         NQ = N
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
-         INFO = -7
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -10
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZUNML2', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 )
-     $   RETURN
-*
-      IF( ( LEFT .AND. NOTRAN .OR. .NOT.LEFT .AND. .NOT.NOTRAN ) ) THEN
-         I1 = 1
-         I2 = K
-         I3 = 1
-      ELSE
-         I1 = K
-         I2 = 1
-         I3 = -1
-      END IF
-*
-      IF( LEFT ) THEN
-         NI = N
-         JC = 1
-      ELSE
-         MI = M
-         IC = 1
-      END IF
-*
-      DO 10 I = I1, I2, I3
-         IF( LEFT ) THEN
-*
-*           H(i) or H(i)' is applied to C(i:m,1:n)
-*
-            MI = M - I + 1
-            IC = I
-         ELSE
-*
-*           H(i) or H(i)' is applied to C(1:m,i:n)
-*
-            NI = N - I + 1
-            JC = I
-         END IF
-*
-*        Apply H(i) or H(i)'
-*
-         IF( NOTRAN ) THEN
-            TAUI = DCONJG( TAU( I ) )
-         ELSE
-            TAUI = TAU( I )
-         END IF
-         IF( I.LT.NQ )
-     $      CALL ZLACGV( NQ-I, A( I, I+1 ), LDA )
-         AII = A( I, I )
-         A( I, I ) = ONE
-         CALL ZLARF( SIDE, MI, NI, A( I, I ), LDA, TAUI, C( IC, JC ),
-     $               LDC, WORK )
-         A( I, I ) = AII
-         IF( I.LT.NQ )
-     $      CALL ZLACGV( NQ-I, A( I, I+1 ), LDA )
-   10 CONTINUE
-      RETURN
-*
-*     End of ZUNML2
-*
-      END
--- a/libcruft/lapack/zunmlq.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,267 +0,0 @@
-      SUBROUTINE ZUNMLQ( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, LDA, LDC, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZUNMLQ overwrites the general complex M-by-N matrix C with
-*
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      Q * C          C * Q
-*  TRANS = 'C':      Q**H * C       C * Q**H
-*
-*  where Q is a complex unitary matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(k)' . . . H(2)' H(1)'
-*
-*  as returned by ZGELQF. Q is of order M if SIDE = 'L' and of order N
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q**H from the Left;
-*          = 'R': apply Q or Q**H from the Right.
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N':  No transpose, apply Q;
-*          = 'C':  Conjugate transpose, apply Q**H.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  A       (input) COMPLEX*16 array, dimension
-*                               (LDA,M) if SIDE = 'L',
-*                               (LDA,N) if SIDE = 'R'
-*          The i-th row must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          ZGELQF in the first k rows of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,K).
-*
-*  TAU     (input) COMPLEX*16 array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by ZGELQF.
-*
-*  C       (input/output) COMPLEX*16 array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If SIDE = 'L', LWORK >= max(1,N);
-*          if SIDE = 'R', LWORK >= max(1,M).
-*          For optimum performance LWORK >= N*NB if SIDE 'L', and
-*          LWORK >= M*NB if SIDE = 'R', where NB is the optimal
-*          blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            NBMAX, LDT
-      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, LQUERY, NOTRAN
-      CHARACTER          TRANST
-      INTEGER            I, I1, I2, I3, IB, IC, IINFO, IWS, JC, LDWORK,
-     $                   LWKOPT, MI, NB, NBMIN, NI, NQ, NW
-*     ..
-*     .. Local Arrays ..
-      COMPLEX*16         T( LDT, NBMAX )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLARFB, ZLARFT, ZUNML2
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-*     NQ is the order of Q and NW is the minimum dimension of WORK
-*
-      IF( LEFT ) THEN
-         NQ = M
-         NW = N
-      ELSE
-         NQ = N
-         NW = M
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
-         INFO = -7
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -10
-      ELSE IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
-         INFO = -12
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-*
-*        Determine the block size.  NB may be at most NBMAX, where NBMAX
-*        is used to define the local array T.
-*
-         NB = MIN( NBMAX, ILAENV( 1, 'ZUNMLQ', SIDE // TRANS, M, N, K,
-     $        -1 ) )
-         LWKOPT = MAX( 1, NW )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZUNMLQ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      LDWORK = NW
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-         IWS = NW*NB
-         IF( LWORK.LT.IWS ) THEN
-            NB = LWORK / LDWORK
-            NBMIN = MAX( 2, ILAENV( 2, 'ZUNMLQ', SIDE // TRANS, M, N, K,
-     $              -1 ) )
-         END IF
-      ELSE
-         IWS = NW
-      END IF
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
-*
-*        Use unblocked code
-*
-         CALL ZUNML2( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK,
-     $                IINFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( ( LEFT .AND. NOTRAN ) .OR.
-     $       ( .NOT.LEFT .AND. .NOT.NOTRAN ) ) THEN
-            I1 = 1
-            I2 = K
-            I3 = NB
-         ELSE
-            I1 = ( ( K-1 ) / NB )*NB + 1
-            I2 = 1
-            I3 = -NB
-         END IF
-*
-         IF( LEFT ) THEN
-            NI = N
-            JC = 1
-         ELSE
-            MI = M
-            IC = 1
-         END IF
-*
-         IF( NOTRAN ) THEN
-            TRANST = 'C'
-         ELSE
-            TRANST = 'N'
-         END IF
-*
-         DO 10 I = I1, I2, I3
-            IB = MIN( NB, K-I+1 )
-*
-*           Form the triangular factor of the block reflector
-*           H = H(i) H(i+1) . . . H(i+ib-1)
-*
-            CALL ZLARFT( 'Forward', 'Rowwise', NQ-I+1, IB, A( I, I ),
-     $                   LDA, TAU( I ), T, LDT )
-            IF( LEFT ) THEN
-*
-*              H or H' is applied to C(i:m,1:n)
-*
-               MI = M - I + 1
-               IC = I
-            ELSE
-*
-*              H or H' is applied to C(1:m,i:n)
-*
-               NI = N - I + 1
-               JC = I
-            END IF
-*
-*           Apply H or H'
-*
-            CALL ZLARFB( SIDE, TRANST, 'Forward', 'Rowwise', MI, NI, IB,
-     $                   A( I, I ), LDA, T, LDT, C( IC, JC ), LDC, WORK,
-     $                   LDWORK )
-   10    CONTINUE
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of ZUNMLQ
-*
-      END
--- a/libcruft/lapack/zunmqr.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,260 +0,0 @@
-      SUBROUTINE ZUNMQR( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, LDA, LDC, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZUNMQR overwrites the general complex M-by-N matrix C with
-*
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      Q * C          C * Q
-*  TRANS = 'C':      Q**H * C       C * Q**H
-*
-*  where Q is a complex unitary matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(1) H(2) . . . H(k)
-*
-*  as returned by ZGEQRF. Q is of order M if SIDE = 'L' and of order N
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q**H from the Left;
-*          = 'R': apply Q or Q**H from the Right.
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N':  No transpose, apply Q;
-*          = 'C':  Conjugate transpose, apply Q**H.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  A       (input) COMPLEX*16 array, dimension (LDA,K)
-*          The i-th column must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          ZGEQRF in the first k columns of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A.
-*          If SIDE = 'L', LDA >= max(1,M);
-*          if SIDE = 'R', LDA >= max(1,N).
-*
-*  TAU     (input) COMPLEX*16 array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by ZGEQRF.
-*
-*  C       (input/output) COMPLEX*16 array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If SIDE = 'L', LWORK >= max(1,N);
-*          if SIDE = 'R', LWORK >= max(1,M).
-*          For optimum performance LWORK >= N*NB if SIDE = 'L', and
-*          LWORK >= M*NB if SIDE = 'R', where NB is the optimal
-*          blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            NBMAX, LDT
-      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, LQUERY, NOTRAN
-      INTEGER            I, I1, I2, I3, IB, IC, IINFO, IWS, JC, LDWORK,
-     $                   LWKOPT, MI, NB, NBMIN, NI, NQ, NW
-*     ..
-*     .. Local Arrays ..
-      COMPLEX*16         T( LDT, NBMAX )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLARFB, ZLARFT, ZUNM2R
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-*     NQ is the order of Q and NW is the minimum dimension of WORK
-*
-      IF( LEFT ) THEN
-         NQ = M
-         NW = N
-      ELSE
-         NQ = N
-         NW = M
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN
-         INFO = -7
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -10
-      ELSE IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
-         INFO = -12
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-*
-*        Determine the block size.  NB may be at most NBMAX, where NBMAX
-*        is used to define the local array T.
-*
-         NB = MIN( NBMAX, ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M, N, K,
-     $        -1 ) )
-         LWKOPT = MAX( 1, NW )*NB
-         WORK( 1 ) = LWKOPT
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZUNMQR', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) THEN
-         WORK( 1 ) = 1
-         RETURN
-      END IF
-*
-      NBMIN = 2
-      LDWORK = NW
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-         IWS = NW*NB
-         IF( LWORK.LT.IWS ) THEN
-            NB = LWORK / LDWORK
-            NBMIN = MAX( 2, ILAENV( 2, 'ZUNMQR', SIDE // TRANS, M, N, K,
-     $              -1 ) )
-         END IF
-      ELSE
-         IWS = NW
-      END IF
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
-*
-*        Use unblocked code
-*
-         CALL ZUNM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK,
-     $                IINFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( ( LEFT .AND. .NOT.NOTRAN ) .OR.
-     $       ( .NOT.LEFT .AND. NOTRAN ) ) THEN
-            I1 = 1
-            I2 = K
-            I3 = NB
-         ELSE
-            I1 = ( ( K-1 ) / NB )*NB + 1
-            I2 = 1
-            I3 = -NB
-         END IF
-*
-         IF( LEFT ) THEN
-            NI = N
-            JC = 1
-         ELSE
-            MI = M
-            IC = 1
-         END IF
-*
-         DO 10 I = I1, I2, I3
-            IB = MIN( NB, K-I+1 )
-*
-*           Form the triangular factor of the block reflector
-*           H = H(i) H(i+1) . . . H(i+ib-1)
-*
-            CALL ZLARFT( 'Forward', 'Columnwise', NQ-I+1, IB, A( I, I ),
-     $                   LDA, TAU( I ), T, LDT )
-            IF( LEFT ) THEN
-*
-*              H or H' is applied to C(i:m,1:n)
-*
-               MI = M - I + 1
-               IC = I
-            ELSE
-*
-*              H or H' is applied to C(1:m,i:n)
-*
-               NI = N - I + 1
-               JC = I
-            END IF
-*
-*           Apply H or H'
-*
-            CALL ZLARFB( SIDE, TRANS, 'Forward', 'Columnwise', MI, NI,
-     $                   IB, A( I, I ), LDA, T, LDT, C( IC, JC ), LDC,
-     $                   WORK, LDWORK )
-   10    CONTINUE
-      END IF
-      WORK( 1 ) = LWKOPT
-      RETURN
-*
-*     End of ZUNMQR
-*
-      END
--- a/libcruft/lapack/zunmr3.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,212 +0,0 @@
-      SUBROUTINE ZUNMR3( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC,
-     $                   WORK, INFO )
-*
-*  -- LAPACK routine (version 3.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, L, LDA, LDC, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZUNMR3 overwrites the general complex m by n matrix C with
-*
-*        Q * C  if SIDE = 'L' and TRANS = 'N', or
-*
-*        Q'* C  if SIDE = 'L' and TRANS = 'C', or
-*
-*        C * Q  if SIDE = 'R' and TRANS = 'N', or
-*
-*        C * Q' if SIDE = 'R' and TRANS = 'C',
-*
-*  where Q is a complex unitary matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(1) H(2) . . . H(k)
-*
-*  as returned by ZTZRZF. Q is of order m if SIDE = 'L' and of order n
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q' from the Left
-*          = 'R': apply Q or Q' from the Right
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N': apply Q  (No transpose)
-*          = 'C': apply Q' (Conjugate transpose)
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  L       (input) INTEGER
-*          The number of columns of the matrix A containing
-*          the meaningful part of the Householder reflectors.
-*          If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
-*
-*  A       (input) COMPLEX*16 array, dimension
-*                               (LDA,M) if SIDE = 'L',
-*                               (LDA,N) if SIDE = 'R'
-*          The i-th row must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          ZTZRZF in the last k rows of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,K).
-*
-*  TAU     (input) COMPLEX*16 array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by ZTZRZF.
-*
-*  C       (input/output) COMPLEX*16 array, dimension (LDC,N)
-*          On entry, the m-by-n matrix C.
-*          On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace) COMPLEX*16 array, dimension
-*                                   (N) if SIDE = 'L',
-*                                   (M) if SIDE = 'R'
-*
-*  INFO    (output) INTEGER
-*          = 0: successful exit
-*          < 0: if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  =====================================================================
-*
-*     .. Local Scalars ..
-      LOGICAL            LEFT, NOTRAN
-      INTEGER            I, I1, I2, I3, IC, JA, JC, MI, NI, NQ
-      COMPLEX*16         TAUI
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      EXTERNAL           LSAME
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLARZ
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          DCONJG, MAX
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-*
-*     NQ is the order of Q
-*
-      IF( LEFT ) THEN
-         NQ = M
-      ELSE
-         NQ = N
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( L.LT.0 .OR. ( LEFT .AND. ( L.GT.M ) ) .OR.
-     $         ( .NOT.LEFT .AND. ( L.GT.N ) ) ) THEN
-         INFO = -6
-      ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
-         INFO = -8
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -11
-      END IF
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZUNMR3', -INFO )
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 )
-     $   RETURN
-*
-      IF( ( LEFT .AND. .NOT.NOTRAN .OR. .NOT.LEFT .AND. NOTRAN ) ) THEN
-         I1 = 1
-         I2 = K
-         I3 = 1
-      ELSE
-         I1 = K
-         I2 = 1
-         I3 = -1
-      END IF
-*
-      IF( LEFT ) THEN
-         NI = N
-         JA = M - L + 1
-         JC = 1
-      ELSE
-         MI = M
-         JA = N - L + 1
-         IC = 1
-      END IF
-*
-      DO 10 I = I1, I2, I3
-         IF( LEFT ) THEN
-*
-*           H(i) or H(i)' is applied to C(i:m,1:n)
-*
-            MI = M - I + 1
-            IC = I
-         ELSE
-*
-*           H(i) or H(i)' is applied to C(1:m,i:n)
-*
-            NI = N - I + 1
-            JC = I
-         END IF
-*
-*        Apply H(i) or H(i)'
-*
-         IF( NOTRAN ) THEN
-            TAUI = TAU( I )
-         ELSE
-            TAUI = DCONJG( TAU( I ) )
-         END IF
-         CALL ZLARZ( SIDE, MI, NI, L, A( I, JA ), LDA, TAUI,
-     $               C( IC, JC ), LDC, WORK )
-*
-   10 CONTINUE
-*
-      RETURN
-*
-*     End of ZUNMR3
-*
-      END
--- a/libcruft/lapack/zunmrz.f	Tue Nov 10 19:48:02 2009 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,297 +0,0 @@
-      SUBROUTINE ZUNMRZ( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC,
-     $                   WORK, LWORK, INFO )
-*
-*  -- LAPACK routine (version 3.1.1) --
-*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     January 2007
-*
-*     .. Scalar Arguments ..
-      CHARACTER          SIDE, TRANS
-      INTEGER            INFO, K, L, LDA, LDC, LWORK, M, N
-*     ..
-*     .. Array Arguments ..
-      COMPLEX*16         A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  ZUNMRZ overwrites the general complex M-by-N matrix C with
-*
-*                  SIDE = 'L'     SIDE = 'R'
-*  TRANS = 'N':      Q * C          C * Q
-*  TRANS = 'C':      Q**H * C       C * Q**H
-*
-*  where Q is a complex unitary matrix defined as the product of k
-*  elementary reflectors
-*
-*        Q = H(1) H(2) . . . H(k)
-*
-*  as returned by ZTZRZF. Q is of order M if SIDE = 'L' and of order N
-*  if SIDE = 'R'.
-*
-*  Arguments
-*  =========
-*
-*  SIDE    (input) CHARACTER*1
-*          = 'L': apply Q or Q**H from the Left;
-*          = 'R': apply Q or Q**H from the Right.
-*
-*  TRANS   (input) CHARACTER*1
-*          = 'N':  No transpose, apply Q;
-*          = 'C':  Conjugate transpose, apply Q**H.
-*
-*  M       (input) INTEGER
-*          The number of rows of the matrix C. M >= 0.
-*
-*  N       (input) INTEGER
-*          The number of columns of the matrix C. N >= 0.
-*
-*  K       (input) INTEGER
-*          The number of elementary reflectors whose product defines
-*          the matrix Q.
-*          If SIDE = 'L', M >= K >= 0;
-*          if SIDE = 'R', N >= K >= 0.
-*
-*  L       (input) INTEGER
-*          The number of columns of the matrix A containing
-*          the meaningful part of the Householder reflectors.
-*          If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0.
-*
-*  A       (input) COMPLEX*16 array, dimension
-*                               (LDA,M) if SIDE = 'L',
-*                               (LDA,N) if SIDE = 'R'
-*          The i-th row must contain the vector which defines the
-*          elementary reflector H(i), for i = 1,2,...,k, as returned by
-*          ZTZRZF in the last k rows of its array argument A.
-*          A is modified by the routine but restored on exit.
-*
-*  LDA     (input) INTEGER
-*          The leading dimension of the array A. LDA >= max(1,K).
-*
-*  TAU     (input) COMPLEX*16 array, dimension (K)
-*          TAU(i) must contain the scalar factor of the elementary
-*          reflector H(i), as returned by ZTZRZF.
-*
-*  C       (input/output) COMPLEX*16 array, dimension (LDC,N)
-*          On entry, the M-by-N matrix C.
-*          On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q.
-*
-*  LDC     (input) INTEGER
-*          The leading dimension of the array C. LDC >= max(1,M).
-*
-*  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
-*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
-*
-*  LWORK   (input) INTEGER
-*          The dimension of the array WORK.
-*          If SIDE = 'L', LWORK >= max(1,N);
-*          if SIDE = 'R', LWORK >= max(1,M).
-*          For optimum performance LWORK >= N*NB if SIDE = 'L', and
-*          LWORK >= M*NB if SIDE = 'R', where NB is the optimal
-*          blocksize.
-*
-*          If LWORK = -1, then a workspace query is assumed; the routine
-*          only calculates the optimal size of the WORK array, returns
-*          this value as the first entry of the WORK array, and no error
-*          message related to LWORK is issued by XERBLA.
-*
-*  INFO    (output) INTEGER
-*          = 0:  successful exit
-*          < 0:  if INFO = -i, the i-th argument had an illegal value
-*
-*  Further Details
-*  ===============
-*
-*  Based on contributions by
-*    A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
-*
-*  =====================================================================
-*
-*     .. Parameters ..
-      INTEGER            NBMAX, LDT
-      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1 )
-*     ..
-*     .. Local Scalars ..
-      LOGICAL            LEFT, LQUERY, NOTRAN
-      CHARACTER          TRANST
-      INTEGER            I, I1, I2, I3, IB, IC, IINFO, IWS, JA, JC,
-     $                   LDWORK, LWKOPT, MI, NB, NBMIN, NI, NQ, NW
-*     ..
-*     .. Local Arrays ..
-      COMPLEX*16         T( LDT, NBMAX )
-*     ..
-*     .. External Functions ..
-      LOGICAL            LSAME
-      INTEGER            ILAENV
-      EXTERNAL           LSAME, ILAENV
-*     ..
-*     .. External Subroutines ..
-      EXTERNAL           XERBLA, ZLARZB, ZLARZT, ZUNMR3
-*     ..
-*     .. Intrinsic Functions ..
-      INTRINSIC          MAX, MIN
-*     ..
-*     .. Executable Statements ..
-*
-*     Test the input arguments
-*
-      INFO = 0
-      LEFT = LSAME( SIDE, 'L' )
-      NOTRAN = LSAME( TRANS, 'N' )
-      LQUERY = ( LWORK.EQ.-1 )
-*
-*     NQ is the order of Q and NW is the minimum dimension of WORK
-*
-      IF( LEFT ) THEN
-         NQ = M
-         NW = MAX( 1, N )
-      ELSE
-         NQ = N
-         NW = MAX( 1, M )
-      END IF
-      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
-         INFO = -1
-      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
-         INFO = -2
-      ELSE IF( M.LT.0 ) THEN
-         INFO = -3
-      ELSE IF( N.LT.0 ) THEN
-         INFO = -4
-      ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN
-         INFO = -5
-      ELSE IF( L.LT.0 .OR. ( LEFT .AND. ( L.GT.M ) ) .OR.
-     $         ( .NOT.LEFT .AND. ( L.GT.N ) ) ) THEN
-         INFO = -6
-      ELSE IF( LDA.LT.MAX( 1, K ) ) THEN
-         INFO = -8
-      ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
-         INFO = -11
-      END IF
-*
-      IF( INFO.EQ.0 ) THEN
-         IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-            LWKOPT = 1
-         ELSE
-*
-*           Determine the block size.  NB may be at most NBMAX, where
-*           NBMAX is used to define the local array T.
-*
-            NB = MIN( NBMAX, ILAENV( 1, 'ZUNMRQ', SIDE // TRANS, M, N,
-     $                               K, -1 ) )
-            LWKOPT = NW*NB
-         END IF
-         WORK( 1 ) = LWKOPT
-*
-         IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
-            INFO = -13
-         END IF
-      END IF
-*
-      IF( INFO.NE.0 ) THEN
-         CALL XERBLA( 'ZUNMRZ', -INFO )
-         RETURN
-      ELSE IF( LQUERY ) THEN
-         RETURN
-      END IF
-*
-*     Quick return if possible
-*
-      IF( M.EQ.0 .OR. N.EQ.0 ) THEN
-         RETURN
-      END IF
-*
-*     Determine the block size.  NB may be at most NBMAX, where NBMAX
-*     is used to define the local array T.
-*
-      NB = MIN( NBMAX, ILAENV( 1, 'ZUNMRQ', SIDE // TRANS, M, N, K,
-     $     -1 ) )
-      NBMIN = 2
-      LDWORK = NW
-      IF( NB.GT.1 .AND. NB.LT.K ) THEN
-         IWS = NW*NB
-         IF( LWORK.LT.IWS ) THEN
-            NB = LWORK / LDWORK
-            NBMIN = MAX( 2, ILAENV( 2, 'ZUNMRQ', SIDE // TRANS, M, N, K,
-     $              -1 ) )
-         END IF
-      ELSE
-         IWS = NW
-      END IF
-*
-      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
-*
-*        Use unblocked code
-*
-         CALL ZUNMR3( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC,
-     $                WORK, IINFO )
-      ELSE
-*
-*        Use blocked code
-*
-         IF( ( LEFT .AND. .NOT.NOTRAN ) .OR.
-     $       ( .NOT.LEFT .AND. NOTRAN ) ) THEN
-            I1 = 1
-            I2 = K
-            I3 = NB
-         ELSE
-            I1 = ( ( K-1 ) / NB )*NB + 1
-            I2 = 1
-            I3 = -NB
-         END IF
-*
-         IF( LEFT ) THEN
-            NI = N
-            JC = 1
-            JA = M - L + 1
-         ELSE
-            MI = M
-            IC = 1
-            JA = N - L + 1
-         END IF
-*
-         IF( NOTRAN ) THEN
-            TRANST = 'C'
-         ELSE
-            TRANST = 'N'
-         END IF
-*
-         DO 10 I = I1, I2, I3
-            IB = MIN( NB, K-I+1 )
-*
-*           Form the triangular factor of the block reflector
-*           H = H(i+ib-1) . . . H(i+1) H(i)
-*
-            CALL ZLARZT( 'Backward', 'Rowwise', L, IB, A( I, JA ), LDA,
-     $                   TAU( I ), T, LDT )
-*
-            IF( LEFT ) THEN
-*
-*              H or H' is applied to C(i:m,1:n)
-*
-               MI = M - I + 1
-               IC = I
-            ELSE
-*
-*              H or H' is applied to C(1:m,i:n)
-*
-               NI = N - I + 1
-               JC = I
-            END IF
-*
-*           Apply H or H'
-*
-            CALL ZLARZB( SIDE, TRANST, 'Backward', 'Rowwise', MI, NI,
-     $                   IB, L, A( I, JA ), LDA, T, LDT, C( IC, JC ),
-     $                   LDC, WORK, LDWORK )
-   10    CONTINUE
-*
-      END IF
-*
-      WORK( 1 ) = LWKOPT
-*
-      RETURN
-*
-*     End of ZUNMRZ
-*
-      END