C ALGORITHM 807, COLLECTED ALGORITHMS FROM ACM. C THIS WORK PUBLISHED IN TRANSACTIONS ON MATHEMATICAL SOFTWARE, C VOL. 26,NO. 4, December, 2000, P. 602--616. #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # Doc/ # Doc/Makefile.Dp # Doc/Makefile.Sp # Doc/README # Doc/install # Fortran77/ # Fortran77/Dp/ # Fortran77/Dp/Drivers/ # Fortran77/Dp/Drivers/data1 # Fortran77/Dp/Drivers/data2 # Fortran77/Dp/Drivers/data3 # Fortran77/Dp/Drivers/data4 # Fortran77/Dp/Drivers/driver.f # Fortran77/Dp/Drivers/res1 # Fortran77/Dp/Drivers/res2 # Fortran77/Dp/Drivers/res3 # Fortran77/Dp/Drivers/res4 # Fortran77/Dp/Src/ # Fortran77/Dp/Src/src.f # Fortran77/Sp/ # Fortran77/Sp/Drivers/ # Fortran77/Sp/Drivers/data1 # Fortran77/Sp/Drivers/data2 # Fortran77/Sp/Drivers/data3 # Fortran77/Sp/Drivers/data4 # Fortran77/Sp/Drivers/driver.f # Fortran77/Sp/Src/ # Fortran77/Sp/Src/src.f # This archive created: Fri Sep 14 15:00:12 2001 export PATH; PATH=/bin:$PATH if test ! -d 'Doc' then mkdir 'Doc' fi cd 'Doc' if test -f 'Makefile.Dp' then echo shar: will not over-write existing file "'Makefile.Dp'" else cat << "SHAR_EOF" > 'Makefile.Dp' include makefile.inc all: res1 res2 res3 res4 SRCLIBS= $(PORT) $(BLAS) DRIVERLIBS = $(TIMER) $(LAPACK) Objs1= driver.o src.o driver1: $(Objs1) $(F77LINK) $(F77LINKOPTS) -o driver1 $(Objs1) $(DRIVERLIBS) $(SRCLIBS) res1: driver1 data1 driver1 res1 res2: driver1 data2 driver1 res2 res3: driver1 data3 driver1 res3 res4: driver1 data4 driver1 res4 SHAR_EOF fi # end of overwriting check if test -f 'Makefile.Sp' then echo shar: will not over-write existing file "'Makefile.Sp'" else cat << "SHAR_EOF" > 'Makefile.Sp' include makefile.inc all: res1 res2 res3 res4 SRCLIBS= $(PORT) $(BLAS) DRIVERLIBS = $(TIMER) $(LAPACK) Objs1= driver.o src.o driver1: $(Objs1) $(F77LINK) $(F77LINKOPTS) -o driver1 $(Objs1) $(DRIVERLIBS) $(SRCLIBS) res1: driver1 data1 driver1 res1 res2: driver1 data2 driver1 res2 res3: driver1 data3 driver1 res3 res4: driver1 data4 driver1 res4 SHAR_EOF fi # end of overwriting check if test -f 'README' then echo shar: will not over-write existing file "'README'" else cat << "SHAR_EOF" > 'README' -------------------------------------------------------------------------------- - - - README file for the SBR toolbox - - - -------------------------------------------------------------------------------- Author: Bruno Lang Aachen University of Technology na.blang@na-net.ornl.gov Date: May 17, 2000 Version: SBR Toolbox, Rev. 1.4.1 This file provides information for installing, tuning, and testing the SBR toolbox library on a UNIX system. Overview: 0. The installation procedure 1. Getting and unpacking the SBR toolbox 2. Building the SBR library 2.1 Editing the makefile 2.2 Building 2.3 Cross-compiling 3. Performance tuning 4. Running the testing driver 5. Running additional timings 6. Making the SBR toolbox available to other users 7. Bug reports 8. Revision history % ------------------------------------------------------------------------------ 0. The installation procedure ========================== The standard installation procedure is 1. Get and unpack the SBR toolbox (see Sec. 1). 2. Build the SBR library 3. (Optional.) Performance tuning 4. (Recommended.) Running the testing driver 5. (Optional.) Running additional timings 6. (Optional.) Making the SBR toolbox available to other users If you are adventurous then try the following short cut. Otherwise, or if anything goes wrong, follow the detailed instructions. 1. Get and unpack the SBR toolbox (see Sec. 1). 2/4. Type make checks to build the library libSBR.a and to run the quick checks. 6. (Optional.) Move the library to a directory searched by the linker. % ------------------------------------------------------------------------------ 1. Getting and unpacking the SBR toolbox ===================================== Get the file sbr.tar.Z and unpack it with the command zcat sbr.tar.Z | tar xf - (Since you are reading this file you probably have already done both.) This will create a new subdirectory sbr in the current working directory. Change to this directory. The following files should be present: README this file makefile a UNIX makefile for building the library make.inc the file containing site-specific settings sbr.f the SBR toolbox routines drun.f the double-precision testing program srun.f the single-precision testing program INCHK input file for the test runs REFCHK sample output file from the testing driver INTUN1 input file for the first tuning phase INTUN2 input file for the second tuning phase INTIM input file for the additional timings la_ori.f original LAPACK routines needed by the testing program la_mod.f modified LAPACK routines needed by the testing program la_tmg.f routines from the LAPACK test matrix generation suite, needed by the testing program aux_blas.f auxiliary routines for IBM RS machines etime.c timing routine for IBM RS machines % ------------------------------------------------------------------------------ 2. Building the SBR library ======================== 2.1 Editing the file make.inc ------------------------- Edit the file make.inc to match your system setup. In particular, you may want to set: * F77 The name of the Fortran compiler (if you don't have a Fortran77 compiler you can't build the library). * FF77OPTS The compile flags for the Fortran compiler with optimization turned on. * F77LINK The Fortran linker. * F77LINKOPTS Options for the linker when optimization is on. * F77NOOPT The compile flags for the Fortran compiler with optimization turned off. * FF77LINKNOOPT Options for the linker when optimization is off. * CC The C compiler. * CCOPTS Compile flags for the C compiler. * AR The command (including flags) for building object archives. * RANLIB The command for converting archives to random libraries. If that's already done with $(AR), set RANLIB = echo. * SBR_LIB The name of the resulting library will be lib$(SBR_LIB).a, e.g., libSBR.a when the default setting SBR_LIB=SBR is used. * NEW_LIBS Additional object files that must be compiled for the testing program. * OLD_LIBS Linking options for pre-compiled objects, in particular the BLAS. !!! If the BLAS are not already installed then you must install them before installing the SBR toolbox !!! The testing program requires some LAPACK routines. There are two ways to provide these: - You can compile just the required LAPACK routines; for convenience, they are included in the files la_ori.f and la_tmg.f of the SBR distribution. The makefile is pre-configured to use this option. - Instead you may link to an installed LAPACK library. Then you can include the name of the LAPACK library and the test matrix generation library in OLDLIBS: e.g., NEW_LIBS = la_mod.o OLD_LIBS = -lLAPACK -lTMG -lBLAS Note that the modified LAPACK routines must be recompiled in any case. Auxiliary objects: additional objects required for successful linking may be specified in NEW_LIBS: - The ESSL library does not contain the lsame and xerbla functions. Also, etime is provided for timing. % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.2 Building -------- Type make library to build the SBR library. % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.3 Cross-compiling --------------- If the compile server is not identical to the target machine for which the library is built then you must issue a make drivers on the compile server before running the performance tuning and testing driver on the target machine. Otherwise, the programs will be compiled on the target machine or be run on the compile server. (If you do not intend to run the divers, you may omit this step.) % ------------------------------------------------------------------------------ 3. Performance tuning ================== The block sizes for the blocked Householder transformations in the SBR toolbox routines are set in the function NBDFLT, which is the first routine in sbr.f. The default settings may be adequate to obtain reasonable performance on a variety of platforms, but for optimal performance this function must be adapted to the machine. The toolbox comes with double-precision and single-precision drivers and an input file for timing the routines DSYRDB (SSYRDB), DSBRDB (SSBRDB), and DSBRDT (SSBRDT) with matrices of specified size and varying bandwidths and block sizes. The output of the drivers helps to determine a function that can compute a (nearly) optimal block size for a given matrix. * To (build and) run the drivers, have a look at the file INTUN1 (in particular you might want to uncomment one of the 'MaxDim' lines at the beginning - remember that the time grows cubically with the matrix dimension) and then type make tuning1 This command may take a few minutes to complete (about half an hour on a 400 MHz PentiumII, if the matrix size is not restricted). The drivers, 'drun' and 'srun' read the file INTUN1 and produce two output files, DOUTTUN1 and SOUTTUN1. These two files contain the data necessary to determine an optimum block size: the order and semibandwidth(s) of the matrix, the block size, and the time required. In general, the optimum block size will depend on many factors, e.g., - the semibandwidth of the matrix before and after the reduction, - are the transformations accumulated in another matrix U or not ? , - the working precision (single or double) - is the upper or lower triangle of the mattrix worked upon (routines DSYRDB and SSYRDB only) ? , and - the dimension of the matrix. We have listed the factors with respect to decreasing importance. In our experience, it is sufficient to consider only the number of diagonals REMOVED (provided in the variable DELTAB in NBDFLT) for the band reduction routines, or the matrix size for the reduction of full matrices. In addition, the working precision (provided in the logical variable SINGLE) and the accumulation of the transformations (logical variable NEEDU) must be taken into account. Therefore, the code for determining a nearly optimal block size for one of the reduction routines might look like IF ( ALGO .EQ. 'SBRDB' ) THEN * * --- blocksize for reduction banded -> banded --- * IF ( NEEDU ) THEN IF ( SINGLE ) THEN some code ELSE some code ENDIF ELSE IF ( SINGLE ) THEN some code ELSE some code ENDIF ENDIF where each instance of "some code" might be of the form IF ( DELTAB .LT. some threshold ) > THEN * * --- suppress blocking --- * NBDFLT = 1 ELSEIF ( DELTAB .GT. some other threshold ) > THEN * * --- do not use excessive block sizes --- * NBDFLT = some maximum block size ELSE * * --- between these thresholds, increase NBDFLT linearly * with the number of diagonals removed --- * NBDFLT = nbmin + ( DELTAB / some factor ) ENDIF Choosing suitable thresholds and limiting block sizes (which may be obtained from a close inspection of the xOUTTUN1 files) will give an NBDFLT function that delivers close to optimum performance for any matrix size. Note that NBDFLT needs not take care of algorithmic restrictions in the choice of NB (for example, when reducing banded matrices from semibandwidth B1 to B2, the block size must not exceed B2). These restrictions are enforced WITHIN THE REDUCTION ROUTINES. (In the xOUTTUN1 files, NB indicates the block size proposed by the driver, and INFO returns the block size that was eventually used in the routine. Thus, you should have a closer look at NB.) This feature may facilitate obtaining a simple formula for NBDFLT. !!! You must re-build the library after modifying the routine NBDFLT !!! If you are cross-compiling, re-make the drivers on the compile server before proceeding. The next step is to set the intermediate bandwidths in the reduction drivers and the cross-over point in the driver xSBRDD from using the LAPACK routine xSBRDT for tridiagonalizing banded matrices to the SBR routine xSBRDT, which does the same job. To this end, have a look at the file INTUN2 (in particular, you might want to limit the matrix size), and then type make tuning2 which will after some minutes (about half an hour on a 400 MHz PentiumII, if the matrix size was not restricted) produce the files DOUTTUN2 and SOUTTUN2. These contain timings for the drivers with varying intermediate bandwidths and comparisons of xSBTRD with xSBRDT for varying bandwidths. Based on this information, suitable intermediate bandwidths and the crossover point are coded into NBDFLT. Now the tuning phase is completed, except ... !!! You must re-build the library after modifying the routine NBDFLT !!! If you are cross-compiling, re-make the drivers on the compile server before proceeding. % ------------------------------------------------------------------------------ 4. Running the testing drivers =========================== The SBR toolbox comes with double-precision and single-precision testing drivers and an input file INCHK that tests the following reduction paths: - One-step tridiagonalization of a symmetric full matrix (LAPACK) - Reduction of a full matrix to banded form (SBR) - One-step tridiagonalization of a symmetric banded matrix (LAPACK) - Alternative one-step tridiagonalization of a symmetric banded matrix (SBR) - Reduction of a full matrix with the SBR driver - Reduction of a banded matrix with the SBR driver To (build and) run the testing drivers, type make checks The testing drivers, 'drun' and 'srun', read the input file INCHK and produce two output files DOUTCHK and SOUTCHK. This may require a few minutes (about half a minute on a 400 MHz PentiumII). A sample output file, REFCHK, is provided with the SBR toolbox. Note that you can follow the progress of the testing driver through the input file, as the line numbers are written to the standard output. By default, INCHK instructs the testing driver to produce only a summary of all the tests. If the SBR toolbox is installed correctly then the OUTCHK file should not contain lines starting with '***', and it should not report any failed or skipped tests. Note that you may run additional tests or cancel some tests by modifying the input file INCHK. The format of the entries is described in that file. If any of the tests fails, indicating that the residual and/or orthogonality error exceeded some bound, proceed as follows: 1. Edit the INCHK file to enable medium or full output (change line 83 to '3' or '4'). (Medium output generates output for each reduction path, including the problem parameters and timings, full output also includes output for each major routine called in the path, with a listing of its scalar arguments.) 2. Re-run the testing driver. 3. Analyze the output to find the test(s) that failed. Usually the ratios will only marginally exceed the thresholds. In this case, you may either accept the results or increase the thresholds by editing INCHK and re-run the testing driver. If the ratios exceed the thresholds by some orders of magnitude there is some serious problem. If the output files contain lines with '*** Error in line ...' then there was some problem with the input file. Change the INCHK file to enable full output, re-run the testing driver, and try to localize the problem. !!! The testing driver may also be used for getting timings: depending on the desired level of detail, you should set the output level to "1" or "2" by changing line 7 of the INCHK file. Output level 1 will produce overall timings for each reduction path, whereas level 2 will also give the timings for each subroutine call in the path. !!! % ------------------------------------------------------------------------------ 5. Running additional timings ========================== First have a look at the input file INTIM (in particular you might want to restrict the matrix size - remember that the execution time grows cubically with the matrix dimension), then type make timing This will take some minutes (slightly over one hour on a 400 MHz PentiumII) and produce two output files, DOUTTIM and SOUTTIM for the double and single precision results, respectively. These files contain data for the following reduction paths: - LAPACK reduction full -> tridiagonal - SBR driver full -> tridiagonal - LAPACK reduction banded -> tridiagonal - SBR one-step reduction banded -> tridiagonal - SBR driver banded -> tridiagonal % ------------------------------------------------------------------------------ 6. Making the SBR toolbox available to other users =============================================== Move the SBR toolbox library (libSBR.a if you did not change the name) into a directory searched by the linker, e.g., /usr/lib or /usr/local/lib. This may require superuser privileges. % ------------------------------------------------------------------------------ 7. Bug reports =========== Please help us to eliminate any remaining bug in the SBR toolbox. If you discover a bug in one of the SBR toolbox routines, please send a mail to one of the following addresses bischof@sc.rwth-aachen.de (Christian H. Bischof) na.blang@na-net.ornl.gov (Bruno Lang) xiaobai@cs.duke.edu (Xiaobai Sun) indicating the version number of the SBR toolbox, the faulty routine and the conditions under which the error occured (parameters, machine, underlying BLAS / LAPACK libraries, etc.) We will try to fix these problems as soon as possible. % ------------------------------------------------------------------------------ 7. History ======= 1.0 April 30, 1996. First public release 1.1 May 09, 1996. Minor fixes; Fortran standard adherence enhanced; matrix size for the checks reduced. 1.2 June 17, 1996. Minor changes; number of files reduced; single check driver provided 1.3 July 01, 1996. Minor fixes; check driver expanded 1.4 December 29, 1999. Major changes: - completely new testing driver - added reduction drivers - repacking routines have changed - reduction routines can now handle tightly packed band. 1.4.1 May 17, 2000. Minor fixes in the output formats SHAR_EOF fi # end of overwriting check if test -f 'install' then echo shar: will not over-write existing file "'install'" else cat << "SHAR_EOF" > 'install' \section{Installation} \label{sec:install} The SBR toolbox comes with a {\tt UNIX} makefile for easy installation and a testing program for validation and performance tuning. In this section we briefly describe the ``standard'' installation procedure. Detailed information about the installation process may be found in the \NAME{README} file distributed with the software. The installation consists of the following steps. \begin{enumerate} \item Get the SBR toolbox from the TOMS repository at \texttt{netlib} and unpack it with \COMMAND{zcat sbr.tar.Z | tar xf -}% This command puts all the SBR software into a new directory \texttt{sbr}. \item Edit the file \NAME{make.inc} to match your system setup (e.g., the location of the LAPACK library, if the latter is installed on your machine). \item Type \COMMAND{make library}% This command will build the library (called \NAME{libSBR.a} if you did not change the name). \item (Optional.) Fine-tune the performance of the algorithms (cf.\ the \NAME{README} file). \item (Recommended.) Run the validation tests by typing \COMMAND{make checks}% and have a look at the output files \NAME{DOUTCHK} and \NAME{SOUTCHK}. They should report no ``skipped'' or ``failed'' tests. \item (Optional.) Run the additional timings (cf.\ the \NAME{README} file). \item (Optional.) Move the SBR library to a directory searched by the linker. \end{enumerate} The testing programs provide the residuals $|| U \tilde A - A U ||_{F}$, the orthogonality errors $|| U^{T} U - I ||_{F}$, and the timings for the reduction of a symmetric (full or banded) matrix $A$ to a (narrower) banded or tridiagonal matrix $\tilde A$ for matrices of different orders $n$ and different semibandwidths. If the orthogonal matrix $U$ is not accumulated then the above error measures are not available. In this case the deviation of the eigenvalues, $|| \mbox{spec}( A ) - \mbox{spec}( \tilde A ) ||_{2}$, is computed instead, where $\mbox{spec}( A )$ and $\mbox{spec}( \tilde A )$ are the eigenvalues of $A$ and $\tilde A$, respectively, in ascending order. SHAR_EOF fi # end of overwriting check cd .. if test ! -d 'Fortran77' then mkdir 'Fortran77' fi cd 'Fortran77' if test ! -d 'Dp' then mkdir 'Dp' fi cd 'Dp' if test ! -d 'Drivers' then mkdir 'Drivers' fi cd 'Drivers' if test -f 'data1' then echo shar: will not over-write existing file "'data1'" else cat << "SHAR_EOF" > 'data1' C ----------------------------------------------------------------------------- C - - C - Default input file for testing the SBR toolbox - C - - C ----------------------------------------------------------------------------- C C Author: Bruno Lang C Aachen University of Technology C na.blang@na-net.ornl.gov C Date: May 17, 2000 C Version: SBR Toolbox, Rev. 1.4.1 C C ----------------------------------------------------------------------------- C C Format of the commands: C C 'Comment' : The remainder of this line is treated as a comment. C 'FileName' : The following line contains the name of the output file C (up to 7 characters). For example, if you specify 'OUTHCK' C and run the double-precision test driver 'drun', then the C output is directed to the file 'DOUTCHK', whereas the C output of the single-precision driver 'srun' would be C directed to 'SOUTCHK'. C 'MaxDim' : The following line determines a maximum matrix size for C the runs. All runs with larger matrices will be skipped. C This feature can be used to limit the execution time of C the timing/tuning runs without much file editing. C 'NoChecks' : Switch off all numerical checks, even if they are C requested in the following runs. This feature can be used C to reduce the execution time of the timing/tuning runs C without much file editing. C 'OutputLevel' : The value in the following line determines how much output C is produced. C 1 : Generate only the overall summary. C 2 : Generate also condensed summaries for selected C computational routines (this mode should be used to C obtain tuning information). C 3 : Generate a more detailed summary for each test run. C 4 : Generate summaries for each routine called. C 'Print' : The following line (up to 78 characters) is printed to C the output file. C 'Quit' : Quit the test driver, ignore the remainder of the input C file. C C For the above commands, only the first character is relevant (see the C current comment lines), case is ignored. C The following commands trigger tests for computational routines. These C commands must be specified with all 5 characters (case is ignored), and C each requires at least two additional lines (see below). C C 'SYTRD' (cf. lines 86ff): Test run for the one-step reduction C full -> tridiagonal (LAPACK) and, optionally, C for the backward accumulation of the C transformations (ORGTR from LAPACK) C 'SBTRD' (cf. lines 138ff): Test run for the one-step reduction C banded -> tridiagonal (LAPACK) C 'SYRDB' (cf. lines 182ff): Test run for the one-step reduction C full -> banded (SBR) and, optionally, for the C backward accumulation of the transformations C (SYGTR from SBR) C 'SBRDB' (cf. lines 387ff): Test run for the one-step reduction C banded -> banded (SBR) C 'SBRDT' (cf. lines 591ff): Test run for the one-step reduction C banded -> tridiagonal (SBR) C 'SY2BC' (cf. lines 773ff): Test run for the copy full -> banded (SBR) C 'SY2BI' (cf. lines 897ff): Test run for the in-place repacking C full -> banded (SBR) C 'SB2BC' (cf. lines 1021ff): Test run for the copy banded -> banded (SBR) C 'SB2BI' (cf. lines 1123ff): Test run for the in-place repacking C banded -> banded (SBR) C 'SYRDD' (cf. lines 1225ff): Test run for the multi-step reduction driver C full -> banded/tridiagonal (SBR) C 'SBRDD' (cf. lines 1463ff): Test run for the multi-step reduction driver C banded -> banded/tridiagonal (SBR) C C ----------------------------------------------------------------------------- C C --- name of the output file --- C'FileName' C'OUTCHK' C --- set output level --- 'OutputLevel' 1 C ------------------------------------------------------------------------------ C C SYTRD : one-step reduction full -> tridiagonal (LAPACK) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : lda = leading dimension of the array a C 6 : nb1 = blocking factor for the reduction (nb1=0 : use default) C 7 : nx1 = cross-over point to non-blocked algorithm for the reduction C (nx1=0 : use default) C 8 : lwork1 = length of the workspace for the reduction C 9 : xinfo1 = expected info value for the routine sytrd C (xinfo1 <> 0 may be used for checking error exits) C 10 : jobu = accumulate the transformations in a matrix U with the C routine orgtr (jobu='U') or not (jobu='N') ? C 11 : nb2 = blocking factor for the accumulation (nb2=0 : use default) C 12 : nx2 = cross-over point to non-blocked algorithm for the accumulation C (nb2=0 : use default) C 13 : lwork2 = length of workspace for the accumulation C 14 : xinfo2 = expected info value for the routine orgtr C (xinfo2 <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'SYTRD' 'Rand' 0.0 'Upper' 30 30 8 8 10000 0 'Upd' 8 8 10000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 30 30 8 8 10000 0 'Upd' 8 8 10000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Upper' 30 30 8 8 10000 0 'NoU' 8 8 10000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 30 30 8 8 10000 0 'NoU' 8 8 10000 0 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBTRD : one-step reduction banded -> tridiagonal (LAPACK) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the banded matrix A C 6 : lda = leading dimension of the array a C 7 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 8 : ldu = leading dimension of the array u C 9 : xinfo = expected info value for the routine sbtrd C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'SBTRD' 'Rand' 0.0 'Upper' 30 7 8 'Upd' 50 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 30 7 8 'Upd' 50 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Upper' 30 7 8 'NoU' 50 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 30 7 8 'NoU' 50 0 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SYRDB : one-step reduction full -> banded (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : lda = leading dimension of the array a C 6 : b2 = (semi-)bandwidth of the reduced matrix B C 7 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 8 : nb = blocking factor for the reduction (nb=0 : use default) C 9 : lwork1 = length of the workspace for the reduction C 10 : xinfo1 = expected info value for the routine syrdb C (xinfo1 <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : jobu = accumulate the transformations in a matrix U or not ? C jobu = 'O' : do the accumulation 'on the fly' in syrdb C = 'U' : do the accumulation after the reduction with C sygtr C jobu = 'N' : no accumulation C 2 : ldu = leading dimension of the array u C 3 : lwork2 = length of workspace for the accumulation with sygtr C 4 : xinfo2 = expected info value for the routine sygtr C (xinfo2 <> 0 may be used for checking error exits) C C Parameters in the fourth line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' or 'O' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' or 'O' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- nonblocked reduction --- 'SYRDB' 'Rand' 0.0 'Upper' 30 30 6 0.0 1 10000 1 'OnF' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 30 30 6 0.0 1 10000 1 'Onf' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Upper' 30 30 6 0.0 1 10000 1 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 30 30 6 0.0 1 10000 1 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Upper' 30 30 6 0.0 1 10000 1 'NoU' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 30 30 6 0.0 1 10000 1 'NoU' 30 10000 1 'Check' 10.0 10.0 10.0 C --- blocked reduction --- 'SYRDB' 'Rand' 0.0 'Upper' 30 30 7 0.0 6 10000 6 'OnF' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 30 30 7 0.0 6 10000 6 'OnF' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Upper' 30 30 7 0.0 6 10000 6 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 30 30 7 0.0 6 10000 6 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Upper' 30 30 7 0.0 6 10000 6 'NoU' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 30 30 7 0.0 6 10000 6 'NoU' 30 10000 1 'Check' 10.0 10.0 10.0 C --- autopilot, non-exact dimensions --- 'SYRDB' 'Rand' 0.0 'Upper' 29 31 8 0.0 0 10000 8 'OnF' 32 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 29 31 8 0.0 0 10000 8 'OnF' 32 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Upper' 29 31 8 0.0 0 10000 8 'Upd' 32 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 29 31 8 0.0 0 10000 8 'Upd' 32 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Upper' 29 31 8 0.0 0 10000 8 'NoU' 32 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 29 31 8 0.0 0 10000 8 'NoU' 32 10000 1 'Check' 10.0 10.0 10.0 C --- small workspace forcing blocksize reduction --- 'SYRDB' 'Rand' 0.0 'Upper' 30 30 8 0.0 6 300 4 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Upper' 30 30 8 0.0 0 300 4 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 C --- ISDA-type matrix --- 'SYRDB' 'ISDA' 1.0E3 'Upper' 30 30 8 1.0E4 6 10000 6 'Upd' 30 10000 1 'Check' 10.0 1.0E4 10.0 'SYRDB' 'ISDA' 1.0E3 'Upper' 30 30 8 1.0E4 6 10000 6 'NoU' 30 10000 1 'Check' 10.0 10.0 1.0E4 C --- checks for quick return --- 'SYRDB' 'Rand' 0.0 'Upper' 1 30 0 0.0 1 600 1 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Upper' 30 30 29 0.0 1 600 1 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 C --- checks for error exits : --- C --- uplo is neither 'U' nor 'L' --- 'SYRDB' 'Rand' 0.0 'Error' 10 10 4 0.0 4 10000 -1 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 C --- jobu is neither 'U' nor 'N' --- 'SYRDB' 'Rand' 0.0 'Lower' 10 10 4 0.0 4 10000 -2 'Err' 10 10000 1 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SYRDB' 'Rand' 0.0 'Lower' -10 10 4 0.0 4 10000 -3 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 C --- b is out of range --- 'SYRDB' 'Rand' 0.0 'Lower' 1 10 4 0.0 4 10000 -4 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 10 10 0 0.0 4 10000 -4 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 10 10 10 0.0 4 10000 -4 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 C --- lda is too small --- 'SYRDB' 'Rand' 0.0 'Lower' 10 8 4 0.0 4 10000 -6 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 C --- drptol is negative --- 'SYRDB' 'Rand' 0.0 'Lower' 10 10 4 -1.0 4 10000 -7 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 C --- ldu is too small --- 'SYRDB' 'Rand' 0.0 'Lower' 10 10 4 0.0 4 10000 -9 'Upd' 7 10000 1 'Check' 10.0 10.0 10.0 C --- nb negative --- 'SYRDB' 'Rand' 0.0 'Lower' 10 10 4 0.0 -4 10000 -10 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 C --- lwork is too small --- 'SYRDB' 'Rand' 0.0 'Lower' 10 10 4 0.0 4 21 -13 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 C --- this should be just enough --- 'SYRDB' 'Rand' 0.0 'Lower' 10 10 4 0.0 4 22 1 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBRDB : one-step reduction banded -> banded (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : n = dimension of the matrix A C 4 : b1 = (semi-)bandwidth of the matrix A C 5 : lda = leading dimension of the array a C 6 : b2 = (semi-)bandwidth of the reduced matrix B C 7 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 8 : nb = blocking factor for the reduction (nb=0 : use default) C 9 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 10 : ldu = leading dimension of the array u C 11 : lwork = length of workspace for the reduction and accumulation C 12 : xinfo = expected info value for the routine sbrdb C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- nonblocked reduction --- 'SBRDB' 'Rand' 0.0 30 8 13 4 0.0 1 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 8 13 4 0.0 1 'NoU' 30 10000 1 'Check' 10.0 10.0 10.0 C --- blocked reduction --- 'SBRDB' 'Rand' 0.0 31 8 15 4 0.0 3 'Upd' 31 10000 3 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 31 8 15 4 0.0 3 'NoU' 31 10000 3 'Check' 10.0 10.0 10.0 C --- autopilot, nonexact dimensions --- 'SBRDB' 'Rand' 0.0 29 8 23 4 0.0 0 'Upd' 32 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 29 8 23 4 0.0 0 'NoU' 32 10000 4 'Check' 10.0 10.0 10.0 C --- force blocksize reduction by insufficient workspace --- 'SBRDB' 'Rand' 0.0 30 8 20 5 0.0 5 'Upd' 30 200 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 8 20 5 0.0 5 'NoU' 30 100 3 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 29 59 5 0.0 0 'Upd' 30 400 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 29 59 5 0.0 0 'NoU' 30 300 3 'Check' 10.0 10.0 10.0 C --- ISDA-type matrix --- 'SBRDB' 'ISDA' 1.0E3 30 12 24 8 1.0E4 8 'Upd' 30 10000 8 'Check' 10.0 1.0E4 10.0 'SBRDB' 'ISDA' 1.0E3 30 12 24 8 1.0E4 8 'NoU' 30 10000 8 'Check' 10.0 10.0 1.0E4 C --- now the workspace should fit exactly --- 'SBRDB' 'Rand' 0.0 30 10 20 6 0.0 6 'Upd' 30 306 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 10 20 6 0.0 6 'NoU' 30 216 6 'Check' 10.0 10.0 10.0 C --- force buffering by providing very tight lda --- 'SBRDB' 'Rand' 0.0 30 9 16 5 0.0 4 'Upd' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 16 5 0.0 4 'NoU' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 15 5 0.0 4 'Upd' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 15 5 0.0 4 'NoU' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 14 5 0.0 4 'Upd' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 14 5 0.0 4 'NoU' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 13 5 0.0 4 'Upd' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 13 5 0.0 4 'NoU' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 12 5 0.0 4 'Upd' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 12 5 0.0 4 'NoU' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 11 5 0.0 4 'Upd' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 11 5 0.0 4 'NoU' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 10 5 0.0 4 'Upd' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 10 5 0.0 4 'NoU' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 20 12 20 5 0.0 4 'Upd' 20 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 20 12 20 5 0.0 4 'NoU' 20 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 20 12 13 5 0.0 4 'Upd' 20 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 20 12 13 5 0.0 4 'NoU' 20 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 20 19 20 5 0.0 4 'Upd' 20 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 20 19 20 5 0.0 4 'NoU' 20 10000 4 'Check' 10.0 10.0 10.0 C --- checks for quick return --- 'SBRDB' 'Rand' 0.0 10 6 10 6 0.0 1 'Upd' 10 10000 1 'Check' 10.0 10.0 10.0 C --- checks for error exits : --- C --- jobu is neither 'U' nor 'N' --- 'SBRDB' 'Rand' 0.0 10 6 10 3 0.0 1 'Err' 10 10000 -1 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SBRDB' 'Rand' 0.0 -10 6 10 3 0.0 1 'Upd' 10 10000 -2 'Check' 10.0 10.0 10.0 C --- b1 is out of range --- 'SBRDB' 'Rand' 0.0 10 -6 10 3 0.0 1 'Upd' 10 10000 -3 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 10 10 10 3 0.0 1 'Upd' 10 10000 -3 'Check' 10.0 10.0 10.0 C --- b2 is out of range --- 'SBRDB' 'Rand' 0.0 10 6 10 -3 0.0 1 'Upd' 10 10000 -4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 10 6 10 0 0.0 1 'Upd' 10 10000 -4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 10 6 10 7 0.0 1 'Upd' 10 10000 -4 'Check' 10.0 10.0 10.0 C --- lda is too small --- 'SBRDB' 'Rand' 0.0 10 6 6 3 0.0 1 'Upd' 10 10000 -6 'Check' 10.0 10.0 10.0 C --- drptol is negative --- 'SBRDB' 'Rand' 0.0 10 6 10 3 -1.0 1 'Upd' 10 10000 -7 'Check' 10.0 10.0 10.0 C --- ldu is too small --- 'SBRDB' 'Rand' 0.0 10 6 10 3 0.0 1 'Upd' 8 10000 -9 'Check' 10.0 10.0 10.0 C --- nb is negative --- 'SBRDB' 'Rand' 0.0 10 6 10 3 0.0 -1 'Upd' 10 10000 -10 'Check' 10.0 10.0 10.0 C --- lwork is too small --- 'SBRDB' 'Rand' 0.0 10 6 10 3 0.0 1 'Upd' 10 22 -12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 10 6 10 3 0.0 1 'NoU' 10 20 -12 'Check' 10.0 10.0 10.0 C --- for these, workspace should be just sufficient --- 'SBRDB' 'Rand' 0.0 10 6 10 3 0.0 1 'Upd' 10 23 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 10 6 10 3 0.0 1 'NoU' 10 21 1 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBRDT : one-step reduction banded -> tridiagonal (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : n = dimension of the matrix A C 4 : b1 = (semi-)bandwidth of the matrix A C 5 : lda = leading dimension of the array a C 6 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 7 : nb = blocking factor for the reduction (nb=0 : use default) C 8 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 9 : ldu = leading dimension of the array u C 10 : lwork = length of workspace for the reduction and accumulation C 11 : xinfo = expected info value for the routine sbrdt C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- non-blocked reduction/update --- 'SBRDT' 'Rand' 0.0 30 8 16 0.0 1 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 16 0.0 1 'NoU' 30 10000 1 'Check' 10.0 10.0 10.0 C --- blocked reduction/update --- 'SBRDT' 'Rand' 0.0 31 8 16 0.0 8 'Upd' 31 10000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 31 8 16 0.0 8 'NoU' 31 10000 1 'Check' 10.0 10.0 10.0 C --- autopilot --- 'SBRDT' 'Rand' 0.0 29 4 5 0.0 0 'Upd' 32 10000 3 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 29 4 5 0.0 0 'NoU' 32 10000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 29 8 18 0.0 0 'Upd' 32 10000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 29 8 18 0.0 0 'NoU' 32 10000 1 'Check' 10.0 10.0 10.0 C --- ISDA-type matrix --- 'SBRDT' 'ISDA' 1.0E3 30 8 16 1.0E4 8 'Upd' 30 10000 8 'Check' 10.0 1.0E4 10.0 'SBRDT' 'ISDA' 1.0E3 30 8 16 1.0E4 8 'NoU' 30 10000 1 'Check' 10.0 10.0 1.0E4 C --- force repacking by providing rather tight lda --- 'SBRDT' 'Rand' 0.0 30 8 15 0.0 6 'Upd' 30 517 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 15 0.0 6 'NoU' 30 17 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 14 0.0 6 'Upd' 30 522 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 14 0.0 6 'NoU' 30 23 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 13 0.0 6 'Upd' 30 531 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 13 0.0 6 'NoU' 30 31 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 12 0.0 6 'Upd' 30 544 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 12 0.0 6 'NoU' 30 44 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 11 0.0 6 'Upd' 30 561 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 11 0.0 6 'NoU' 30 61 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 10 0.0 6 'Upd' 30 582 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 10 0.0 6 'NoU' 30 82 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 9 0.0 6 'Upd' 30 607 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 9 0.0 6 'NoU' 30 107 1 'Check' 10.0 10.0 10.0 C --- force blocksize reduction by providing too small workspace --- 'SBRDT' 'Rand' 0.0 30 8 16 0.0 6 'Upd' 30 350 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 13 26 0.0 0 'Upd' 30 370 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 14 0.0 6 'Upd' 30 250 3 'Check' 10.0 10.0 10.0 C --- checks for quick return --- 'SBRDT' 'Rand' 0.0 0 0 2 0.0 6 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 0 2 0.0 6 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 1 2 0.0 6 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 C --- checks for error exits --- C --- jobu is neither 'U' nor 'N' --- 'SBRDT' 'Rand' 0.0 10 6 12 0.0 6 'Err' 10 10000 -1 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SBRDT' 'Rand' 0.0 -10 6 12 0.0 6 'Upd' 10 10000 -2 'Check' 10.0 10.0 10.0 C --- b is out of range --- 'SBRDT' 'Rand' 0.0 10 -6 12 0.0 6 'Upd' 10 10000 -3 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 10 10 12 0.0 6 'Upd' 10 10000 -3 'Check' 10.0 10.0 10.0 C --- lda is too small --- 'SBRDT' 'Rand' 0.0 10 6 6 0.0 6 'Upd' 10 10000 -5 'Check' 10.0 10.0 10.0 C --- drptol is negative --- 'SBRDT' 'Rand' 0.0 10 6 12 -1.0 6 'Upd' 10 10000 -6 'Check' 10.0 10.0 10.0 C --- ldu is too small --- 'SBRDT' 'Rand' 0.0 10 6 12 0.0 6 'Upd' 8 10000 -10 'Check' 10.0 10.0 10.0 C --- nb is negative --- 'SBRDT' 'Rand' 0.0 10 6 12 0.0 -6 'Upd' 10 10000 -11 'Check' 10.0 10.0 10.0 C --- workspace is too small --- 'SBRDT' 'Rand' 0.0 30 8 16 0.0 6 'Upd' 50 37 -13 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 16 0.0 6 'NoU' 50 15 -13 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 15 0.0 6 'Upd' 50 38 -13 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 15 0.0 6 'NoU' 50 16 -13 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 9 0.0 6 'Upd' 50 128 -13 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 9 0.0 6 'NoU' 50 106 -13 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SY2BC : copy full -> banded (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the matrix A C 6 : lda1 = leading dimension of the array a in full storage C 7 : lda2 = leading dimension of the array holding A in packed storage C 8 : xinfo = expected info value for the routine sy2bc C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- repack to a tightly fitting band --- 'SY2BC' 'Rand' 0.0 'Upper' 25 8 25 9 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 25 9 1 'Check' 10.0 10.0 10.0 C --- repack to a band with spare diagonals --- 'SY2BC' 'Rand' 0.0 'Upper' 25 8 25 12 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 25 12 1 'Check' 10.0 10.0 10.0 C --- repack to a band with the same leading dimension --- 'SY2BC' 'Rand' 0.0 'Upper' 25 8 25 25 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 25 25 1 'Check' 10.0 10.0 10.0 C --- repack to a band with leading dimension larger by 1 --- 'SY2BC' 'Rand' 0.0 'Upper' 25 8 25 26 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 25 26 1 'Check' 10.0 10.0 10.0 C --- repack to a band with larger leading dimension --- 'SY2BC' 'Rand' 0.0 'Upper' 25 8 25 33 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 25 33 1 'Check' 10.0 10.0 10.0 C --- and now the same tests again, with inexact lda --- 'SY2BC' 'Rand' 0.0 'Upper' 25 8 30 9 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 30 9 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Upper' 25 8 30 12 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 30 12 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Upper' 25 8 30 30 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 30 30 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Upper' 25 8 30 31 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 30 31 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Upper' 25 8 30 35 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 30 35 1 'Check' 10.0 10.0 10.0 C --- check for quick return --- 'SY2BC' 'Rand' 0.0 'Lower' 0 8 30 9 1 'Check' 10.0 10.0 10.0 C --- checks for error exits --- C --- uplo is neither 'U' nor 'L' --- 'SY2BC' 'Rand' 0.0 'Error' 25 8 30 9 -1 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SY2BC' 'Rand' 0.0 'Lower' -25 8 30 9 -2 'Check' 10.0 10.0 10.0 C --- b is out of range --- 'SY2BC' 'Rand' 0.0 'Lower' 25 -8 30 9 -3 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 25 30 9 -3 'Check' 10.0 10.0 10.0 C --- ldfull is too small --- 'SY2BC' 'Rand' 0.0 'Lower' 25 8 23 9 -5 'Check' 10.0 10.0 10.0 C --- ldband is too small --- 'SY2BC' 'Rand' 0.0 'Lower' 25 8 30 8 -7 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SY2BI : in-place copy full -> banded (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the matrix A C 6 : lda1 = leading dimension of the array a in full storage C 7 : lda2 = leading dimension of the array holding A in packed storage C 8 : xinfo = expected info value for the routine sy2bi C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- repack to a tightly fitting band --- 'SY2BI' 'Rand' 0.0 'Upper' 25 8 25 9 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 25 9 1 'Check' 10.0 10.0 10.0 C --- repack to a band with spare diagonals --- 'SY2BI' 'Rand' 0.0 'Upper' 25 8 25 12 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 25 12 1 'Check' 10.0 10.0 10.0 C --- repack to a band with the same leading dimension --- 'SY2BI' 'Rand' 0.0 'Upper' 25 8 25 25 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 25 25 1 'Check' 10.0 10.0 10.0 C --- repack to a band with leading dimension larger by 1 --- 'SY2BI' 'Rand' 0.0 'Upper' 25 8 25 26 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 25 26 1 'Check' 10.0 10.0 10.0 C --- repack to a band with larger leading dimension --- 'SY2BI' 'Rand' 0.0 'Upper' 25 8 25 33 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 25 33 1 'Check' 10.0 10.0 10.0 C --- and now the same tests again, with inexact lda --- 'SY2BI' 'Rand' 0.0 'Upper' 25 8 30 9 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 30 9 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Upper' 25 8 30 12 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 30 12 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Upper' 25 8 30 30 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 30 30 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Upper' 25 8 30 31 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 30 31 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Upper' 25 8 30 35 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 30 35 1 'Check' 10.0 10.0 10.0 C --- check for quick return --- 'SY2BI' 'Rand' 0.0 'Lower' 0 8 30 9 1 'Check' 10.0 10.0 10.0 C --- checks for error exits --- C --- uplo is neither 'U' nor 'L' --- 'SY2BI' 'Rand' 0.0 'Error' 25 8 30 9 -1 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SY2BI' 'Rand' 0.0 'Lower' -25 8 30 9 -2 'Check' 10.0 10.0 10.0 C --- b is out of range --- 'SY2BI' 'Rand' 0.0 'Lower' 25 -8 30 9 -3 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 25 30 9 -3 'Check' 10.0 10.0 10.0 C --- ldfull is too small --- 'SY2BI' 'Rand' 0.0 'Lower' 25 8 23 9 -5 'Check' 10.0 10.0 10.0 C --- ldband is too small --- 'SY2BI' 'Rand' 0.0 'Lower' 25 8 30 8 -6 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SB2BC : copy banded -> banded (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the matrix A C 6 : lda1 = leading dimension of the source array a C 7 : lda2 = leading dimension of the destination array C 8 : xinfo = expected info value for the routine sb2bc C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- repack a tightly fitting band --- C --- repack to a tightly fitting band --- 'SB2BC' 'Rand' 0.0 'Upper' 25 8 9 9 1 'Check' 10.0 10.0 10.0 'SB2BC' 'Rand' 0.0 'Lower' 25 8 9 9 1 'Check' 10.0 10.0 10.0 C --- repack to a band with spare diagonals --- 'SB2BC' 'Rand' 0.0 'Upper' 25 8 9 12 1 'Check' 10.0 10.0 10.0 'SB2BC' 'Rand' 0.0 'Lower' 25 8 9 12 1 'Check' 10.0 10.0 10.0 C --- and now repack a band with diagonals to spare --- C --- repack to tight fit --- 'SB2BC' 'Rand' 0.0 'Upper' 25 8 15 9 1 'Check' 10.0 10.0 10.0 'SB2BC' 'Rand' 0.0 'Lower' 25 8 15 9 1 'Check' 10.0 10.0 10.0 C --- repack to a band with spare diagonals --- 'SB2BC' 'Rand' 0.0 'Upper' 25 8 15 12 1 'Check' 10.0 10.0 10.0 'SB2BC' 'Rand' 0.0 'Lower' 25 8 15 12 1 'Check' 10.0 10.0 10.0 C --- repack to a band with the same leading dimension --- 'SB2BC' 'Rand' 0.0 'Upper' 25 8 15 15 1 'Check' 10.0 10.0 10.0 'SB2BC' 'Rand' 0.0 'Lower' 25 8 15 15 1 'Check' 10.0 10.0 10.0 C --- repack to a band with larger leading dimension --- 'SB2BC' 'Rand' 0.0 'Upper' 25 8 15 25 1 'Check' 10.0 10.0 10.0 'SB2BC' 'Rand' 0.0 'Lower' 25 8 15 25 1 'Check' 10.0 10.0 10.0 C --- check for quick return --- 'SB2BC' 'Rand' 0.0 'Lower' 0 0 30 9 1 'Check' 10.0 10.0 10.0 C --- checks for error exits --- C --- uplo is neither 'U' nor 'L' --- 'SB2BC' 'Rand' 0.0 'Error' 25 8 12 9 -1 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SB2BC' 'Rand' 0.0 'Lower' -25 8 12 9 -2 'Check' 10.0 10.0 10.0 C --- b is out of range --- 'SB2BC' 'Rand' 0.0 'Lower' 25 -8 12 9 -3 'Check' 10.0 10.0 10.0 'SB2BC' 'Rand' 0.0 'Lower' 25 25 25 9 -3 'Check' 10.0 10.0 10.0 C --- ldsrc is too small --- 'SB2BC' 'Rand' 0.0 'Lower' 25 8 6 9 -5 'Check' 10.0 10.0 10.0 C --- lddst is too small --- 'SB2BC' 'Rand' 0.0 'Lower' 25 8 11 7 -7 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SB2BI : in-place copy banded -> banded (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the matrix A C 6 : lda1 = leading dimension of the source array a C 7 : lda2 = leading dimension of the destination array C 8 : xinfo = expected info value for the routine sb2bi C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- repack a tightly fitting band --- C --- repack to a tightly fitting band --- 'SB2BI' 'Rand' 0.0 'Upper' 25 8 9 9 1 'Check' 10.0 10.0 10.0 'SB2BI' 'Rand' 0.0 'Lower' 25 8 9 9 1 'Check' 10.0 10.0 10.0 C --- repack to a band with spare diagonals --- 'SB2BI' 'Rand' 0.0 'Upper' 25 8 9 12 1 'Check' 10.0 10.0 10.0 'SB2BI' 'Rand' 0.0 'Lower' 25 8 9 12 1 'Check' 10.0 10.0 10.0 C --- and now repack a band with diagonals to spare --- C --- repack to tight fit --- 'SB2BI' 'Rand' 0.0 'Upper' 25 8 15 9 1 'Check' 10.0 10.0 10.0 'SB2BI' 'Rand' 0.0 'Lower' 25 8 15 9 1 'Check' 10.0 10.0 10.0 C --- repack to a band with spare diagonals --- 'SB2BI' 'Rand' 0.0 'Upper' 25 8 15 12 1 'Check' 10.0 10.0 10.0 'SB2BI' 'Rand' 0.0 'Lower' 25 8 15 12 1 'Check' 10.0 10.0 10.0 C --- repack to a band with the same leading dimension --- 'SB2BI' 'Rand' 0.0 'Upper' 25 8 15 15 1 'Check' 10.0 10.0 10.0 'SB2BI' 'Rand' 0.0 'Lower' 25 8 15 15 1 'Check' 10.0 10.0 10.0 C --- repack to a band with larger leading dimension --- 'SB2BI' 'Rand' 0.0 'Upper' 25 8 15 25 1 'Check' 10.0 10.0 10.0 'SB2BI' 'Rand' 0.0 'Lower' 25 8 15 25 1 'Check' 10.0 10.0 10.0 C --- check for quick return --- 'SB2BI' 'Rand' 0.0 'Lower' 0 0 30 9 1 'Check' 10.0 10.0 10.0 C --- checks for error exits --- C --- uplo is neither 'U' nor 'L' --- 'SB2BI' 'Rand' 0.0 'Error' 25 8 12 9 -1 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SB2BI' 'Rand' 0.0 'Lower' -25 8 12 9 -2 'Check' 10.0 10.0 10.0 C --- b is out of range --- 'SB2BI' 'Rand' 0.0 'Lower' 25 -8 12 9 -3 'Check' 10.0 10.0 10.0 'SB2BI' 'Rand' 0.0 'Lower' 25 25 25 9 -3 'Check' 10.0 10.0 10.0 C --- ldsrc is too small --- 'SB2BI' 'Rand' 0.0 'Lower' 25 8 6 9 -5 'Check' 10.0 10.0 10.0 C --- lddst is too small --- 'SB2BI' 'Rand' 0.0 'Lower' 25 8 11 7 -6 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SYRDD : driver routine for the reduction full -> banded/tridiagonal C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : lda1 = leading dimension of the array a C 6 : b2 = (semi-)bandwidth of the reduced matrix B C 7 : lda2 = leading dimension of the array holding the banded matrix C 8 : nsteps = number of reduction steps C 9 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 10 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 11 : lwork = length of workspace for the reduction and accumulation C 12 : xinfo = expected info value for the routine syrdb C (xinfo <> 0 may be used for checking error exits) C C If nsteps > 1 then the second line contains the nstep-1 intermediate C bandwidths, and the third line contains the nsteps blocking factors for the C reduction steps. C If nsteps = 1 then the second line contains the blocking factor for the C reduction step (the line specifying intermediate bandwidths is missing). C If nsteps = 0 then no intermediate bandwidths or blocking factors are C specified (so both lines are missing). C C Parameters in the last line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- one-step reduction --- 'SYRDD' 'Rand' 0.0 'Upper' 30 30 1 2 1 0.0 'Upd' 10000 1 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 1 2 1 0.0 'NoU' 10000 1 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 1 2 1 0.0 'Upd' 10000 1 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 1 2 1 0.0 'NoU' 10000 1 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 8 9 1 0.0 'Upd' 10000 1 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 8 9 1 0.0 'NoU' 10000 1 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 8 9 1 0.0 'Upd' 10000 1 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 8 9 1 0.0 'NoU' 10000 1 5 'Check' 10.0 10.0 10.0 C --- two-step reduction --- 'SYRDD' 'Rand' 0.0 'Upper' 30 30 1 16 2 0.0 'Upd' 10000 1 12 5 4 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 1 16 2 0.0 'NoU' 10000 1 12 5 4 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 1 16 2 0.0 'Upd' 10000 1 12 5 4 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 1 16 2 0.0 'NoU' 10000 1 12 5 4 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 8 14 2 0.0 'Upd' 10000 1 12 5 4 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 8 14 2 0.0 'NoU' 10000 1 12 5 4 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 8 14 2 0.0 'Upd' 10000 1 12 5 4 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 8 14 2 0.0 'NoU' 10000 1 12 5 4 'Check' 10.0 10.0 10.0 C --- autopilot --- 'SYRDD' 'Rand' 0.0 'Upper' 30 30 1 2 0 0.0 'Upd' 10000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 1 2 0 0.0 'NoU' 10000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 1 2 0 0.0 'Upd' 10000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 1 2 0 0.0 'NoU' 10000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 5 6 0 0.0 'Upd' 10000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 5 6 0 0.0 'NoU' 10000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 5 6 0 0.0 'Upd' 10000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 5 6 0 0.0 'NoU' 10000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 300 300 1 64 0 0.0 'Upd' 20000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 300 300 1 64 0 0.0 'NoU' 20000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 300 300 1 64 0 0.0 'Upd' 20000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 300 300 1 64 0 0.0 'NoU' 20000 1 'Check' 10.0 10.0 10.0 C --- check for quick return --- 'SYRDD' 'Rand' 0.0 'Lower' 0 4 1 2 0 0.0 'Upd' 10000 1 'Check' 10.0 10.0 10.0 C --- check for error exits --- C --- jobu is neither 'U' nor 'N' --- 'SYRDD' 'Rand' 0.0 'Lower' 10 10 4 8 1 0.0 'Err' 10000 -1 5 'Check' 10.0 10.0 10.0 C --- uplo is neither 'U' nor 'L' --- 'SYRDD' 'Rand' 0.0 'Error' 10 10 4 8 1 0.0 'Upd' 10000 -2 5 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SYRDD' 'Rand' 0.0 'Lower' -10 10 4 8 1 0.0 'Upd' 10000 -3 5 'Check' 10.0 10.0 10.0 C --- b2 is out of range --- 'SYRDD' 'Rand' 0.0 'Lower' 10 10 -1 8 1 0.0 'Upd' 10000 -4 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 10 10 0 8 1 0.0 'Upd' 10000 -4 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 10 10 10 20 1 0.0 'Upd' 10000 -4 5 'Check' 10.0 10.0 10.0 C --- lda is too small --- 'SYRDD' 'Rand' 0.0 'Lower' 10 8 4 8 1 0.0 'Upd' 10000 -6 5 'Check' 10.0 10.0 10.0 C --- drptol is out of range --- 'SYRDD' 'Rand' 0.0 'Lower' 10 10 4 8 1 -1.0 'Upd' 10000 -7 5 'Check' 10.0 10.0 10.0 C --- ldband is out of range --- 'SYRDD' 'Rand' 0.0 'Lower' 10 10 4 4 1 0.0 'Upd' 10000 -9 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 10 10 4 6 2 0.0 'Upd' 10000 -9 6 5 3 'Check' 10.0 10.0 10.0 C --- nsteps is negative --- 'SYRDD' 'Rand' 0.0 'Lower' 10 10 4 8 -1 0.0 'Upd' 10000 -12 'Check' 10.0 10.0 10.0 C --- sequence of bandwidths is non-decreasing --- 'SYRDD' 'Rand' 0.0 'Lower' 10 10 1 20 3 0.0 'Upd' 10000 -13 10 3 5 5 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 10 10 3 8 3 0.0 'Upd' 10000 -13 6 2 5 5 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 10 10 1 8 3 0.0 'Upd' 10000 -13 4 5 5 5 5 'Check' 10.0 10.0 10.0 C --- sequence of blocking factors contains negative entries --- 'SYRDD' 'Rand' 0.0 'Lower' 10 10 4 8 1 0.0 'Upd' 10000 -14 -5 'Check' 10.0 10.0 10.0 C --- workspace is too small --- 'SYRDD' 'Rand' 0.0 'Lower' 10 10 4 8 1 0.0 'Upd' 38 -16 5 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBRDD : driver routine for the reduction banded -> banded/tridiagonal C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the matrix A C 6 : lda = leading dimension of the array a C 7 : b2 = (seim-)bandwidth of the reduced matrix B C 8 : nsteps = number of reduction steps C 9 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 10 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 11 : ldu = leading dimension of the array u C 12 : lwork = length of workspace for the reduction and accumulation C 13 : xinfo = expected info value for the routine syrdb C (xinfo <> 0 may be used for checking error exits) C C If nsteps > 1 then the second line contains the nstep-1 intermediate C bandwidths, and the third line contains the nsteps blocking factors for the C reduction steps. C If nsteps = 1 then the second line contains the blocking factor for the C reduction step (the line specifying intermediate bandwidths is missing). C If nsteps = 0 then no intermediate bandwidths or blocking factors are C specified (so both lines are missing). C C Parameters in the last line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- one-step reduction --- 'SBRDD' 'Rand' 0.0 'Upper' 30 15 30 1 1 0.0 'Upd' 30 10000 1 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 15 30 1 1 0.0 'NoU' 30 10000 1 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 1 1 0.0 'Upd' 30 10000 1 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 1 1 0.0 'NoU' 30 10000 1 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 4 8 1 1 0.0 'Upd' 30 10000 1 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 4 8 1 1 0.0 'NoU' 30 10000 1 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 4 8 1 1 0.0 'Upd' 30 10000 1 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 4 8 1 1 0.0 'NoU' 30 10000 1 5 'Check' 10.0 10.0 10.0 C --- two-step reduction --- 'SBRDD' 'Rand' 0.0 'Upper' 30 15 30 1 2 0.0 'Upd' 30 10000 1 12 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 15 30 1 2 0.0 'NoU' 30 10000 1 12 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 1 2 0.0 'Upd' 30 10000 1 12 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 1 2 0.0 'NoU' 30 10000 1 12 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 15 30 3 2 0.0 'Upd' 30 10000 1 12 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 15 30 3 2 0.0 'NoU' 30 10000 1 12 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 3 2 0.0 'Upd' 30 10000 1 12 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 3 2 0.0 'NoU' 30 10000 1 12 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 15 30 1 2 0.0 'Upd' 30 10000 1 3 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 15 30 1 2 0.0 'NoU' 30 10000 1 3 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 1 2 0.0 'Upd' 30 10000 1 3 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 1 2 0.0 'NoU' 30 10000 1 3 5 3 'Check' 10.0 10.0 10.0 C --- doubling sequence --- 'SBRDD' 'Rand' 0.0 'Upper' 30 15 16 1 4 0.0 'Upd' 30 10000 1 14 12 8 0 0 0 0 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 15 16 1 4 0.0 'NoU' 30 10000 1 14 12 8 0 0 0 0 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 16 1 4 0.0 'Upd' 30 10000 1 14 12 8 0 0 0 0 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 16 1 4 0.0 'NoU' 30 10000 1 14 12 8 0 0 0 0 'Check' 10.0 10.0 10.0 C --- autopilot --- 'SBRDD' 'Rand' 0.0 'Upper' 80 70 80 1 0 0.0 'Upd' 80 10000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 80 70 80 1 0 0.0 'NoU' 80 10000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 80 70 80 1 0 0.0 'Upd' 80 10000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 80 70 80 1 0 0.0 'NoU' 80 10000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 12 30 1 0 0.0 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 12 30 1 0 0.0 'NoU' 30 10000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 12 30 1 0 0.0 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 12 30 1 0 0.0 'NoU' 30 10000 1 'Check' 10.0 10.0 10.0 C --- check for quick return --- 'SBRDD' 'Rand' 0.0 'Lower' 0 4 8 1 0 0.0 'Upd' 10 10000 1 'Check' 10.0 10.0 10.0 C --- check for error exits --- C --- jobu is neither 'U' nor 'N' --- 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 1 0.0 'Err' 10 10000 -1 5 'Check' 10.0 10.0 10.0 C --- uplo is neither 'U' nor 'L' --- 'SBRDD' 'Rand' 0.0 'Error' 10 4 8 1 1 0.0 'Upd' 10 10000 -2 5 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SBRDD' 'Rand' 0.0 'Lower' -10 4 8 1 1 0.0 'Upd' 10 10000 -3 5 'Check' 10.0 10.0 10.0 C --- b1 is out of range --- 'SBRDD' 'Rand' 0.0 'Lower' 10 -4 8 1 1 0.0 'Upd' 10 10000 -4 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 10 10 18 1 1 0.0 'Upd' 10 10000 -4 5 'Check' 10.0 10.0 10.0 C --- b2 is out of range --- 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 0 1 0.0 'Upd' 10 10000 -5 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 0 0 8 1 1 0.0 'Upd' 10 10000 -5 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 5 1 0.0 'Upd' 10 10000 -5 5 'Check' 10.0 10.0 10.0 C --- lda is too small --- 'SBRDD' 'Rand' 0.0 'Lower' 10 4 4 1 1 0.0 'Upd' 10 10000 -7 5 'Check' 10.0 10.0 10.0 C --- drptol is out of range --- 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 1 -1.0 'Upd' 10 10000 -8 5 'Check' 10.0 10.0 10.0 C --- ldu is out of range --- 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 1 0.0 'Upd' 8 10000 -12 5 'Check' 10.0 10.0 10.0 C --- nsteps is negative --- 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 -1 0.0 'Upd' 10 10000 -13 'Check' 10.0 10.0 10.0 C --- sequence of bandwidths is non-decreasing --- 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 4 0.0 'Upd' 10 10000 -14 5 3 2 5 5 5 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 4 0.0 'Upd' 10 10000 -14 3 5 2 5 5 5 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 4 0.0 'Upd' 10 10000 -14 3 2 5 5 5 5 5 'Check' 10.0 10.0 10.0 C --- negative blocking factors --- 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 3 0.0 'Upd' 10 10000 -15 3 2 5 -5 5 'Check' 10.0 10.0 10.0 C --- workspace is too small --- 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 1 1 0.0 'Upd' 30 42 -17 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 1 0.0 'Upd' 10 8 -17 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 1 2 0.0 'Upd' 30 55 -17 8 5 5 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C --- quit --- 'Quit' C SHAR_EOF fi # end of overwriting check if test -f 'data2' then echo shar: will not over-write existing file "'data2'" else cat << "SHAR_EOF" > 'data2' C ----------------------------------------------------------------------------- C - - C - Default input file for timing the SBR toolbox - C - - C ----------------------------------------------------------------------------- C C Author: Bruno Lang C Aachen University of Technology C na.blang@na-net.ornl.gov C Date: May 17, 2000 C Version: SBR Toolbox, Rev. 1.4.1 C C ----------------------------------------------------------------------------- C C For the format of the commands, see the file INCHK C C --- if you are in a hurry, uncomment the following two lines --- C'MaxDim' C800 C --- if you are in a real hurry, uncomment the following two lines --- C'MaxDim' C400 C --- if you want result checking, comment out the following line --- 'NoChecks' C ----------------------------------------------------------------------------- C C --- name of the output file --- C'FileName' C'OUTTIM' C --- set output level --- 'OutputLevel' 3 C ----------------------------------------------------------------------------- C C SYTRD : one-step reduction full -> tridiagonal (LAPACK) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : lda = leading dimension of the array a C 6 : nb1 = blocking factor for the reduction (nb1=0 : use default) C 7 : nx1 = cross-over point to non-blocked algorithm for the reduction C (nx1=0 : use default) C 8 : lwork1 = length of the workspace for the reduction C 9 : xinfo1 = expected info value for the routine sytrd C (xinfo1 <> 0 may be used for checking error exits) C 10 : jobu = accumulate the transformations in a matrix U with the C routine orgtr (jobu='U') or not (jobu='N') ? C 11 : nb2 = blocking factor for the accumulation (nb2=0 : use default) C 12 : nx2 = cross-over point to non-blocked algorithm for the accumulation C (nb2=0 : use default) C 13 : lwork2 = length of workspace for the accumulation C 14 : xinfo2 = expected info value for the routine orgtr C (xinfo2 <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '*** Timing the LAPACK reduction full -> tridiagonal ***' 'Print' '' 'Print' ' no update' 'Print' '' 'SYTRD' 'Rand' 0.0 'Lower' 200 200 0 0 1000000 0 'NoU' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 400 400 0 0 1000000 0 'NoU' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 600 600 0 0 1000000 0 'NoU' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 800 800 0 0 1000000 0 'NoU' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 1000 1000 0 0 1000000 0 'NoU' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' '' 'SYTRD' 'Rand' 0.0 'Lower' 200 200 0 0 1000000 0 'Upd' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 400 400 0 0 1000000 0 'Upd' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 600 600 0 0 1000000 0 'Upd' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 800 800 0 0 1000000 0 'Upd' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 1000 1000 0 0 1000000 0 'Upd' 0 0 1000000 0 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SYRDD : driver routine for the reduction full -> banded/tridiagonal C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : lda1 = leading dimension of the array a C 6 : b2 = (semi-)bandwidth of the reduced matrix B C 7 : lda2 = leading dimension of the array holding the banded matrix C 8 : nsteps = number of reduction steps C 9 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 10 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 11 : lwork = length of workspace for the reduction and accumulation C 12 : xinfo = expected info value for the routine syrdb C (xinfo <> 0 may be used for checking error exits) C C If nsteps > 1 then the second line contains the nstep-1 intermediate C bandwidths, and the third line contains the nsteps blocking factors for the C reduction steps. C If nsteps = 1 then the second line contains the blocking factor for the C reduction step (the line specifying intermediate bandwidths is missing). C If nsteps = 0 then no intermediate bandwidths or blocking factors are C specified (so both lines are missing). C C Parameters in the last line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '' 'Print' '*** Timing the SBR driver full -> tridiagonal ***' 'Print' '' 'Print' ' no update' 'Print' '' 'SYRDD' 'Rand' 0.0 'Upper' 200 200 1 2 0 0.0 'NoU' 1000000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 400 400 1 2 0 0.0 'NoU' 1000000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 600 600 1 2 0 0.0 'NoU' 1000000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 800 800 1 2 0 0.0 'NoU' 1000000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 1000 1000 1 2 0 0.0 'NoU' 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' '' 'SYRDD' 'Rand' 0.0 'Upper' 200 200 1 2 0 0.0 'Upd' 1000000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 400 400 1 2 0 0.0 'Upd' 1000000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 600 600 1 2 0 0.0 'Upd' 1000000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 800 800 1 2 0 0.0 'Upd' 1000000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 1000 1000 1 2 0 0.0 'Upd' 1000000 1 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBTRD : one-step reduction banded -> tridiagonal (LAPACK) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the banded matrix A C 6 : lda = leading dimension of the array a C 7 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 8 : ldu = leading dimension of the array u C 9 : xinfo = expected info value for the routine sbtrd C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '' 'Print' '*** Timing the LAPACK reduction banded -> tridiagonal ***' 'Print' '' 'Print' ' no update' 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 200 4 5 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 8 9 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 12 13 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 16 17 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 24 25 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 32 33 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 48 49 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 64 65 'NoU' 200 0 'Check' 10.0 10.0 10.0 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 400 4 5 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 8 9 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 12 13 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 16 17 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 24 25 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 32 33 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 48 49 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 64 65 'NoU' 400 0 'Check' 10.0 10.0 10.0 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 600 4 5 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 8 9 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 12 13 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 16 17 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 24 25 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 32 33 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 48 49 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 64 65 'NoU' 600 0 'Check' 10.0 10.0 10.0 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 800 4 5 'NoU' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 8 9 'NoU' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 12 13 'NoU' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 16 17 'NoU' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 24 25 'NoU' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 32 33 'NoU' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 48 49 'NoU' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 64 65 'NoU' 800 0 'Check' 10.0 10.0 10.0 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 1000 4 5 'NoU' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 8 9 'NoU' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 12 13 'NoU' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 16 17 'NoU' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 24 25 'NoU' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 32 33 'NoU' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 48 49 'NoU' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 64 65 'NoU' 1000 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 200 4 5 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 8 9 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 12 13 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 16 17 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 24 25 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 32 33 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 48 49 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 64 65 'Upd' 200 0 'Check' 10.0 10.0 10.0 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 400 4 5 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 8 9 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 12 13 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 16 17 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 24 25 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 32 33 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 48 49 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 64 65 'Upd' 400 0 'Check' 10.0 10.0 10.0 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 600 4 5 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 8 9 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 12 13 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 16 17 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 24 25 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 32 33 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 48 49 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 64 65 'Upd' 600 0 'Check' 10.0 10.0 10.0 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 800 4 5 'Upd' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 8 9 'Upd' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 12 13 'Upd' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 16 17 'Upd' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 24 25 'Upd' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 32 33 'Upd' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 48 49 'Upd' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 64 65 'Upd' 800 0 'Check' 10.0 10.0 10.0 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 1000 4 5 'Upd' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 8 9 'Upd' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 12 13 'Upd' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 16 17 'Upd' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 24 25 'Upd' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 32 33 'Upd' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 48 49 'Upd' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 64 65 'Upd' 1000 0 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBRDT : one-step reduction banded -> tridiagonal (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : n = dimension of the matrix A C 4 : b1 = (semi-)bandwidth of the matrix A C 5 : lda = leading dimension of the array a C 6 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 7 : nb = blocking factor for the reduction (nb=0 : use default) C 8 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 9 : ldu = leading dimension of the array u C 10 : lwork = length of workspace for the reduction and accumulation C 11 : xinfo = expected info value for the routine sbrdt C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '' 'Print' '*** Timing the SBR reduction banded -> tridiagonal ***' 'Print' '' 'Print' ' no update' 'Print' '' 'SBRDT' 'Rand' 0.0 200 4 8 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 12 24 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 24 48 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 48 96 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 64 128 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 400 4 8 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 12 24 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 24 48 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 48 96 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 64 128 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 600 4 8 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 12 24 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 24 48 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 48 96 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 64 128 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 800 4 8 0.0 0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 8 16 0.0 0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 12 24 0.0 0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 16 32 0.0 0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 24 48 0.0 0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 32 64 0.0 0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 48 96 0.0 0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 64 128 0.0 0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 1000 4 8 0.0 0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 8 16 0.0 0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 12 24 0.0 0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 16 32 0.0 0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 24 48 0.0 0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 32 64 0.0 0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 48 96 0.0 0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 64 128 0.0 0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' ' *** ignore messages about tests failing because ***' 'Print' ' *** SBRDT returned a wrong (but positive) info ***' 'Print' '' 'SBRDT' 'Rand' 0.0 200 4 8 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 12 24 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 24 48 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 48 96 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 64 128 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 400 4 8 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 12 24 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 24 48 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 48 96 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 64 128 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 600 4 8 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 12 24 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 24 48 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 48 96 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 64 128 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 800 4 8 0.0 0 'Upd' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 8 16 0.0 0 'Upd' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 12 24 0.0 0 'Upd' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 16 32 0.0 0 'Upd' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 24 48 0.0 0 'Upd' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 32 64 0.0 0 'Upd' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 48 96 0.0 0 'Upd' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 64 128 0.0 0 'Upd' 800 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 1000 4 8 0.0 0 'Upd' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 8 16 0.0 0 'Upd' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 12 24 0.0 0 'Upd' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 16 32 0.0 0 'Upd' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 24 48 0.0 0 'Upd' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 32 64 0.0 0 'Upd' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 48 96 0.0 0 'Upd' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 64 128 0.0 0 'Upd' 1000 1000000 1 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBRDD : driver routine for the reduction banded -> banded/tridiagonal C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the matrix A C 6 : lda = leading dimension of the array a C 7 : b2 = (seim-)bandwidth of the reduced matrix B C 8 : nsteps = number of reduction steps C 9 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 10 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 11 : ldu = leading dimension of the array u C 12 : lwork = length of workspace for the reduction and accumulation C 13 : xinfo = expected info value for the routine syrdb C (xinfo <> 0 may be used for checking error exits) C C If nsteps > 1 then the second line contains the nstep-1 intermediate C bandwidths, and the third line contains the nsteps blocking factors for the C reduction steps. C If nsteps = 1 then the second line contains the blocking factor for the C reduction step (the line specifying intermediate bandwidths is missing). C If nsteps = 0 then no intermediate bandwidths or blocking factors are C specified (so both lines are missing). C C Parameters in the last line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '' 'Print' '*** Timing the SBR driver banded -> tridiagonal ***' 'Print' '' 'Print' ' no update' 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 200 4 8 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 8 16 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 12 24 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 16 32 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 24 48 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 48 96 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 400 4 8 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 8 16 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 12 24 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 16 32 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 24 48 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 48 96 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 600 4 8 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 8 16 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 12 24 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 16 32 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 24 48 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 48 96 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 800 4 8 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 8 16 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 12 24 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 16 32 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 24 48 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 32 64 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 48 96 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 64 128 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 1000 4 8 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 8 16 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 12 24 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 16 32 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 24 48 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 32 64 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 48 96 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 64 128 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 200 4 8 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 8 16 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 12 24 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 16 32 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 24 48 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 48 96 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 400 4 8 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 8 16 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 12 24 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 16 32 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 24 48 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 48 96 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 600 4 8 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 8 16 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 12 24 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 16 32 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 24 48 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 48 96 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 800 4 8 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 8 16 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 12 24 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 16 32 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 24 48 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 32 64 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 48 96 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 64 128 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 1000 4 8 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 8 16 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 12 24 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 16 32 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 24 48 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 32 64 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 48 96 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 64 128 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C --- quit --- 'Quit' C SHAR_EOF fi # end of overwriting check if test -f 'data3' then echo shar: will not over-write existing file "'data3'" else cat << "SHAR_EOF" > 'data3' C ----------------------------------------------------------------------------- C - - C - Default input file for tuning the SBR toolbox - C - - C ----------------------------------------------------------------------------- C C Author: Bruno Lang C Aachen University of Technology C na.blang@na-net.ornl.gov C Date: May 17, 2000 C Version: SBR Toolbox, Rev. 1.4.1 C C ----------------------------------------------------------------------------- C C For the format of the commands, see the file INCHK C C --- if you are in a hurry, uncomment the following two lines --- C'MaxDim' C400 C --- if you are in a real hurry, uncomment the following two lines --- C'MaxDim' C200 C --- if you want result checking, comment out the following line --- 'NoChecks' C ----------------------------------------------------------------------------- C C --- name of the output file --- C'FileName' C'OUTTUN1' C --- set output level --- 'OutputLevel' 2 C ------------------------------------------------------------------------------ C C SYRDB : one-step reduction full -> banded (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : lda = leading dimension of the array a C 6 : b2 = (semi-)bandwidth of the reduced matrix B C 7 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 8 : nb = blocking factor for the reduction (nb=0 : use default) C 9 : lwork1 = length of the workspace for the reduction C 10 : xinfo1 = expected info value for the routine syrdb C (xinfo1 <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : jobu = accumulate the transformations in a matrix U or not ? C jobu = 'O' : do the accumulation 'on the fly' in syrdb C = 'U' : do the accumulation after the reduction with C sygtr C jobu = 'N' : no accumulation C 2 : ldu = leading dimension of the array u C 3 : lwork2 = length of workspace for the accumulation with sygtr C 4 : xinfo2 = expected info value for the routine sygtr C (xinfo2 <> 0 may be used for checking error exits) C C Parameters in the fourth line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' or 'O' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' or 'O' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '*** Setting nb for SYRDB ***' 'Print' '' 'Print' ' no update' 'Print' '' 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 1 1000000 1 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 4 1000000 4 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 6 1000000 6 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 8 1000000 8 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 12 1000000 12 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 16 1000000 16 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 20 1000000 20 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 24 1000000 24 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 32 1000000 32 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 40 1000000 40 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 48 1000000 48 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 64 1000000 64 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 1 1000000 1 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 4 1000000 4 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 6 1000000 6 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 8 1000000 8 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 12 1000000 12 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 16 1000000 16 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 20 1000000 20 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 24 1000000 24 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 32 1000000 32 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 40 1000000 40 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 48 1000000 48 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 64 1000000 64 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 1 1000000 1 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 4 1000000 4 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 6 1000000 6 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 8 1000000 8 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 12 1000000 12 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 16 1000000 16 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 20 1000000 20 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 24 1000000 24 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 32 1000000 32 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 40 1000000 40 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 48 1000000 48 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 64 1000000 64 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' '' 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 1 1000000 1 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 4 1000000 4 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 6 1000000 6 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 8 1000000 8 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 12 1000000 12 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 16 1000000 16 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 20 1000000 20 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 24 1000000 24 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 32 1000000 32 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 40 1000000 40 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 48 1000000 48 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 64 1000000 64 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 1 1000000 1 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 4 1000000 4 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 6 1000000 6 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 8 1000000 8 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 12 1000000 12 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 16 1000000 16 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 20 1000000 20 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 24 1000000 24 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 32 1000000 32 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 40 1000000 40 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 48 1000000 48 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 64 1000000 64 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 1 1000000 1 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 4 1000000 4 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 6 1000000 6 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 8 1000000 8 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 12 1000000 12 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 16 1000000 16 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 20 1000000 20 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 24 1000000 24 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 32 1000000 32 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 40 1000000 40 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 48 1000000 48 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 64 1000000 64 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBRDB : one-step reduction banded -> banded (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : n = dimension of the matrix A C 4 : b1 = (semi-)bandwidth of the matrix A C 5 : lda = leading dimension of the array a C 6 : b2 = (semi-)bandwidth of the reduced matrix B C 7 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 8 : nb = blocking factor for the reduction (nb=0 : use default) C 9 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 10 : ldu = leading dimension of the array u C 11 : lwork = length of workspace for the reduction and accumulation C 12 : xinfo = expected info value for the routine sbrdb C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '' 'Print' '*** Setting nb for SBRDB ***' 'Print' '' 'Print' ' no update' 'Print' '' 'SBRDB' 'Rand' 0.0 200 16 32 8 0.0 1 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 16 32 8 0.0 4 'NoU' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 16 32 8 0.0 6 'NoU' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 16 32 8 0.0 8 'NoU' 200 1000000 8 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 1 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 4 'NoU' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 6 'NoU' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 8 'NoU' 200 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 10 'NoU' 200 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 12 'NoU' 200 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 16 'NoU' 200 1000000 16 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 1 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 4 'NoU' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 6 'NoU' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 8 'NoU' 200 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 10 'NoU' 200 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 12 'NoU' 200 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 16 'NoU' 200 1000000 16 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 20 'NoU' 200 1000000 20 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 24 'NoU' 200 1000000 24 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 32 'NoU' 200 1000000 32 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 400 16 32 8 0.0 1 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 16 32 8 0.0 4 'NoU' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 16 32 8 0.0 6 'NoU' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 16 32 8 0.0 8 'NoU' 400 1000000 8 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 1 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 4 'NoU' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 6 'NoU' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 8 'NoU' 400 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 10 'NoU' 400 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 12 'NoU' 400 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 16 'NoU' 400 1000000 16 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 1 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 4 'NoU' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 6 'NoU' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 8 'NoU' 400 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 10 'NoU' 400 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 12 'NoU' 400 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 16 'NoU' 400 1000000 16 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 20 'NoU' 400 1000000 20 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 24 'NoU' 400 1000000 24 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 32 'NoU' 400 1000000 32 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 600 16 32 8 0.0 1 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 16 32 8 0.0 4 'NoU' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 16 32 8 0.0 6 'NoU' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 16 32 8 0.0 8 'NoU' 600 1000000 8 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 1 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 4 'NoU' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 6 'NoU' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 8 'NoU' 600 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 10 'NoU' 600 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 12 'NoU' 600 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 16 'NoU' 600 1000000 16 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 1 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 4 'NoU' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 6 'NoU' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 8 'NoU' 600 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 10 'NoU' 600 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 12 'NoU' 600 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 16 'NoU' 600 1000000 16 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 20 'NoU' 600 1000000 20 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 24 'NoU' 600 1000000 24 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 32 'NoU' 600 1000000 32 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' '' 'SBRDB' 'Rand' 0.0 200 16 32 8 0.0 1 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 16 32 8 0.0 4 'Upd' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 16 32 8 0.0 6 'Upd' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 16 32 8 0.0 8 'Upd' 200 1000000 8 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 1 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 4 'Upd' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 6 'Upd' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 8 'Upd' 200 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 10 'Upd' 200 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 12 'Upd' 200 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 16 'Upd' 200 1000000 16 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 1 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 4 'Upd' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 6 'Upd' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 8 'Upd' 200 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 10 'Upd' 200 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 12 'Upd' 200 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 16 'Upd' 200 1000000 16 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 20 'Upd' 200 1000000 20 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 24 'Upd' 200 1000000 24 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 32 'Upd' 200 1000000 32 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 400 16 32 8 0.0 1 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 16 32 8 0.0 4 'Upd' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 16 32 8 0.0 6 'Upd' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 16 32 8 0.0 8 'Upd' 400 1000000 8 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 1 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 4 'Upd' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 6 'Upd' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 8 'Upd' 400 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 10 'Upd' 400 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 12 'Upd' 400 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 16 'Upd' 400 1000000 16 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 1 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 4 'Upd' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 6 'Upd' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 8 'Upd' 400 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 10 'Upd' 400 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 12 'Upd' 400 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 16 'Upd' 400 1000000 16 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 20 'Upd' 400 1000000 20 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 24 'Upd' 400 1000000 24 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 32 'Upd' 400 1000000 32 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 600 16 32 8 0.0 1 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 16 32 8 0.0 4 'Upd' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 16 32 8 0.0 6 'Upd' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 16 32 8 0.0 8 'Upd' 600 1000000 8 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 1 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 4 'Upd' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 6 'Upd' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 8 'Upd' 600 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 10 'Upd' 600 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 12 'Upd' 600 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 16 'Upd' 600 1000000 16 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 1 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 4 'Upd' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 6 'Upd' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 8 'Upd' 600 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 10 'Upd' 600 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 12 'Upd' 600 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 16 'Upd' 600 1000000 16 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 20 'Upd' 600 1000000 20 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 24 'Upd' 600 1000000 24 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 32 'Upd' 600 1000000 32 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBRDT : one-step reduction banded -> tridiagonal (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : n = dimension of the matrix A C 4 : b1 = (semi-)bandwidth of the matrix A C 5 : lda = leading dimension of the array a C 6 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 7 : nb = blocking factor for the reduction (nb=0 : use default) C 8 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 9 : ldu = leading dimension of the array u C 10 : lwork = length of workspace for the reduction and accumulation C 11 : xinfo = expected info value for the routine sbrdt C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '' 'Print' '*** Setting nb for SBRDT ***' 'Print' '' 'Print' ' with update' 'Print' '' 'SBRDT' 'Rand' 0.0 200 8 16 0.0 1 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 4 'Upd' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 6 'Upd' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 8 'Upd' 200 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 10 'Upd' 200 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 12 'Upd' 200 1000000 12 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 200 16 32 0.0 1 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 4 'Upd' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 6 'Upd' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 8 'Upd' 200 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 10 'Upd' 200 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 12 'Upd' 200 1000000 12 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 16 'Upd' 200 1000000 16 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 20 'Upd' 200 1000000 20 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 24 'Upd' 200 1000000 24 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 200 32 64 0.0 1 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 4 'Upd' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 6 'Upd' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 8 'Upd' 200 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 10 'Upd' 200 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 12 'Upd' 200 1000000 12 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 16 'Upd' 200 1000000 16 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 20 'Upd' 200 1000000 20 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 32 'Upd' 200 1000000 32 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 40 'Upd' 200 1000000 40 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 400 8 16 0.0 1 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 4 'Upd' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 6 'Upd' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 8 'Upd' 400 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 10 'Upd' 400 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 12 'Upd' 400 1000000 12 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 400 16 32 0.0 1 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 4 'Upd' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 6 'Upd' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 8 'Upd' 400 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 10 'Upd' 400 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 12 'Upd' 400 1000000 12 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 16 'Upd' 400 1000000 16 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 20 'Upd' 400 1000000 20 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 24 'Upd' 400 1000000 24 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 400 32 64 0.0 1 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 4 'Upd' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 6 'Upd' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 8 'Upd' 400 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 10 'Upd' 400 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 12 'Upd' 400 1000000 12 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 16 'Upd' 400 1000000 16 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 20 'Upd' 400 1000000 20 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 32 'Upd' 400 1000000 32 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 40 'Upd' 400 1000000 40 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 600 8 16 0.0 1 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 4 'Upd' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 6 'Upd' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 8 'Upd' 600 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 10 'Upd' 600 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 12 'Upd' 600 1000000 12 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 600 16 32 0.0 1 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 4 'Upd' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 6 'Upd' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 8 'Upd' 600 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 10 'Upd' 600 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 12 'Upd' 600 1000000 12 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 16 'Upd' 600 1000000 16 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 20 'Upd' 600 1000000 20 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 24 'Upd' 600 1000000 24 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 600 32 64 0.0 1 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 4 'Upd' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 6 'Upd' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 8 'Upd' 600 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 10 'Upd' 600 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 12 'Upd' 600 1000000 12 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 16 'Upd' 600 1000000 16 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 20 'Upd' 600 1000000 20 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 32 'Upd' 600 1000000 32 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 40 'Upd' 600 1000000 40 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C --- quit --- 'Quit' C SHAR_EOF fi # end of overwriting check if test -f 'data4' then echo shar: will not over-write existing file "'data4'" else cat << "SHAR_EOF" > 'data4' C ----------------------------------------------------------------------------- C - - C - Default input file for tuning the SBR toolbox - C - - C ----------------------------------------------------------------------------- C C Author: Bruno Lang C Aachen University of Technology C na.blang@na-net.ornl.gov C Date: May 17, 2000 C Version: SBR Toolbox, Rev. 1.4.1 C C ----------------------------------------------------------------------------- C C For the format of the commands, see the file INCHK C C --- if you are in a hurry, uncomment the following two lines --- C'MaxDim' C400 C --- if you are in a real hurry, uncomment the following two lines --- C'MaxDim' C200 C --- if you want result checking, comment out the following line --- 'NoChecks' C ----------------------------------------------------------------------------- C C --- name of the output file --- C'FileName' C'OUTTUN2' C --- set output level --- 'OutputLevel' 2 C ------------------------------------------------------------------------------ C C SYRDD : driver routine for the reduction full -> banded/tridiagonal C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : lda1 = leading dimension of the array a C 6 : b2 = (semi-)bandwidth of the reduced matrix B C 7 : lda2 = leading dimension of the array holding the banded matrix C 8 : nsteps = number of reduction steps C 9 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 10 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 11 : lwork = length of workspace for the reduction and accumulation C 12 : xinfo = expected info value for the routine syrdb C (xinfo <> 0 may be used for checking error exits) C C If nsteps > 1 then the second line contains the nstep-1 intermediate C bandwidths, and the third line contains the nsteps blocking factors for the C reduction steps. C If nsteps = 1 then the second line contains the blocking factor for the C reduction step (the line specifying intermediate bandwidths is missing). C If nsteps = 0 then no intermediate bandwidths or blocking factors are C specified (so both lines are missing). C C Parameters in the last line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '*** Setting intermediate bandwidth for SYRDD ***' 'Print' '' 'Print' ' no update' 'Print' '' 'Print' 'one-step (b=1):' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 2 1 0.0 'NoU' 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 24 2 0.0 'NoU' 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 32 2 0.0 'NoU' 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=20:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 40 2 0.0 'NoU' 1000000 1 20 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 48 2 0.0 'NoU' 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 64 2 0.0 'NoU' 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=40:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 80 2 0.0 'NoU' 1000000 1 40 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 96 2 0.0 'NoU' 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 128 2 0.0 'NoU' 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 2 1 0.0 'NoU' 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 24 2 0.0 'NoU' 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 32 2 0.0 'NoU' 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=20:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 40 2 0.0 'NoU' 1000000 1 20 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 48 2 0.0 'NoU' 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 64 2 0.0 'NoU' 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=40:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 80 2 0.0 'NoU' 1000000 1 40 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 96 2 0.0 'NoU' 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 128 2 0.0 'NoU' 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 2 1 0.0 'NoU' 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 24 2 0.0 'NoU' 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 32 2 0.0 'NoU' 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=20:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 40 2 0.0 'NoU' 1000000 1 20 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 48 2 0.0 'NoU' 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 64 2 0.0 'NoU' 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=40:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 80 2 0.0 'NoU' 1000000 1 40 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 96 2 0.0 'NoU' 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 128 2 0.0 'NoU' 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' '' 'Print' 'one-step (b=1):' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 2 1 0.0 'Upd' 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 24 2 0.0 'Upd' 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 32 2 0.0 'Upd' 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=20:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 40 2 0.0 'Upd' 1000000 1 20 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 48 2 0.0 'Upd' 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 64 2 0.0 'Upd' 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=40:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 80 2 0.0 'Upd' 1000000 1 40 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 96 2 0.0 'Upd' 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 128 2 0.0 'Upd' 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 2 1 0.0 'Upd' 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 24 2 0.0 'Upd' 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 32 2 0.0 'Upd' 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=20:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 40 2 0.0 'Upd' 1000000 1 20 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 48 2 0.0 'Upd' 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 64 2 0.0 'Upd' 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=40:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 80 2 0.0 'Upd' 1000000 1 40 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 96 2 0.0 'Upd' 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 128 2 0.0 'Upd' 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 2 1 0.0 'Upd' 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 24 2 0.0 'Upd' 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 32 2 0.0 'Upd' 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=20:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 40 2 0.0 'Upd' 1000000 1 20 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 48 2 0.0 'Upd' 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 64 2 0.0 'Upd' 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=40:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 80 2 0.0 'Upd' 1000000 1 40 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 96 2 0.0 'Upd' 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 128 2 0.0 'Upd' 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBRDD : driver routine for the reduction banded -> banded/tridiagonal C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the matrix A C 6 : lda = leading dimension of the array a C 7 : b2 = (seim-)bandwidth of the reduced matrix B C 8 : nsteps = number of reduction steps C 9 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 10 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 11 : ldu = leading dimension of the array u C 12 : lwork = length of workspace for the reduction and accumulation C 13 : xinfo = expected info value for the routine syrdb C (xinfo <> 0 may be used for checking error exits) C C If nsteps > 1 then the second line contains the nstep-1 intermediate C bandwidths, and the third line contains the nsteps blocking factors for the C reduction steps. C If nsteps = 1 then the second line contains the blocking factor for the C reduction step (the line specifying intermediate bandwidths is missing). C If nsteps = 0 then no intermediate bandwidths or blocking factors are C specified (so both lines are missing). C C Parameters in the last line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '' 'Print' '*** Setting intermediate bandwidth for SBRDD ***' 'Print' '' 'Print' ' no update' 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 1 0.0 'NoU' 200 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 2 0.0 'NoU' 200 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 2 0.0 'NoU' 200 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 2 0.0 'NoU' 200 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 2 0.0 'NoU' 200 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 1 0.0 'NoU' 200 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'NoU' 200 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'NoU' 200 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'NoU' 200 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'NoU' 200 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'NoU' 200 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'NoU' 200 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 1 0.0 'NoU' 200 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'NoU' 200 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'NoU' 200 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'NoU' 200 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'NoU' 200 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'NoU' 200 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'NoU' 200 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'NoU' 200 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 1 0.0 'NoU' 400 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 2 0.0 'NoU' 400 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 2 0.0 'NoU' 400 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 2 0.0 'NoU' 400 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 2 0.0 'NoU' 400 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 1 0.0 'NoU' 400 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'NoU' 400 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'NoU' 400 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'NoU' 400 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'NoU' 400 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'NoU' 400 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'NoU' 400 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 1 0.0 'NoU' 400 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'NoU' 400 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'NoU' 400 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'NoU' 400 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'NoU' 400 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'NoU' 400 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'NoU' 400 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'NoU' 400 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 1 0.0 'NoU' 600 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 2 0.0 'NoU' 600 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 2 0.0 'NoU' 600 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 2 0.0 'NoU' 600 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 2 0.0 'NoU' 600 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 1 0.0 'NoU' 600 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'NoU' 600 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'NoU' 600 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'NoU' 600 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'NoU' 600 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'NoU' 600 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'NoU' 600 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 1 0.0 'NoU' 600 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'NoU' 600 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'NoU' 600 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'NoU' 600 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'NoU' 600 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'NoU' 600 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'NoU' 600 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'NoU' 600 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 1 0.0 'Upd' 200 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 2 0.0 'Upd' 200 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 2 0.0 'Upd' 200 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 2 0.0 'Upd' 200 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 2 0.0 'Upd' 200 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 1 0.0 'Upd' 200 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'Upd' 200 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'Upd' 200 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'Upd' 200 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'Upd' 200 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'Upd' 200 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'Upd' 200 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 1 0.0 'Upd' 200 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'Upd' 200 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'Upd' 200 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'Upd' 200 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'Upd' 200 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'Upd' 200 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'Upd' 200 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'Upd' 200 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 1 0.0 'Upd' 400 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 2 0.0 'Upd' 400 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 2 0.0 'Upd' 400 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 2 0.0 'Upd' 400 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 2 0.0 'Upd' 400 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 1 0.0 'Upd' 400 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'Upd' 400 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'Upd' 400 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'Upd' 400 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'Upd' 400 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'Upd' 400 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'Upd' 400 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 1 0.0 'Upd' 400 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'Upd' 400 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'Upd' 400 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'Upd' 400 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'Upd' 400 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'Upd' 400 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'Upd' 400 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'Upd' 400 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 1 0.0 'Upd' 600 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 2 0.0 'Upd' 600 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 2 0.0 'Upd' 600 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 2 0.0 'Upd' 600 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 2 0.0 'Upd' 600 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 1 0.0 'Upd' 600 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'Upd' 600 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'Upd' 600 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'Upd' 600 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'Upd' 600 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'Upd' 600 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'Upd' 600 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 1 0.0 'Upd' 600 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'Upd' 600 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'Upd' 600 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'Upd' 600 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'Upd' 600 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'Upd' 600 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'Upd' 600 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'Upd' 600 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBTRD : one-step reduction banded -> tridiagonal (LAPACK) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the banded matrix A C 6 : lda = leading dimension of the array a C 7 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 8 : ldu = leading dimension of the array u C 9 : xinfo = expected info value for the routine sbtrd C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C C SBRDT : one-step reduction banded -> tridiagonal (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : n = dimension of the matrix A C 4 : b1 = (semi-)bandwidth of the matrix A C 5 : lda = leading dimension of the array a C 6 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 7 : nb = blocking factor for the reduction (nb=0 : use default) C 8 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 9 : ldu = leading dimension of the array u C 10 : lwork = length of workspace for the reduction and accumulation C 11 : xinfo = expected info value for the routine sbrdt C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '' 'Print' '*** Where to switch from SYTRD to SYRDT ? ***' 'Print' '' 'Print' ' no update' 'Print' '' 'Print' 'b=4' 'SBTRD' 'Rand' 0.0 'Lower' 200 4 5 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 4 8 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=6' 'SBTRD' 'Rand' 0.0 'Lower' 200 6 7 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 6 12 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=8' 'SBTRD' 'Rand' 0.0 'Lower' 200 8 9 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=10' 'SBTRD' 'Rand' 0.0 'Lower' 200 10 11 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 10 20 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=12' 'SBTRD' 'Rand' 0.0 'Lower' 200 12 13 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 12 24 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=16' 'SBTRD' 'Rand' 0.0 'Lower' 200 16 17 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=20' 'SBTRD' 'Rand' 0.0 'Lower' 200 20 21 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 20 40 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=24' 'SBTRD' 'Rand' 0.0 'Lower' 200 24 25 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 24 48 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=32' 'SBTRD' 'Rand' 0.0 'Lower' 200 32 33 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=40' 'SBTRD' 'Rand' 0.0 'Lower' 200 40 41 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 40 80 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=48' 'SBTRD' 'Rand' 0.0 'Lower' 200 48 49 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 48 96 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=64' 'SBTRD' 'Rand' 0.0 'Lower' 200 64 65 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 64 128 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'b=4' 'SBTRD' 'Rand' 0.0 'Lower' 400 4 5 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 4 8 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=6' 'SBTRD' 'Rand' 0.0 'Lower' 400 6 7 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 6 12 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=8' 'SBTRD' 'Rand' 0.0 'Lower' 400 8 9 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=10' 'SBTRD' 'Rand' 0.0 'Lower' 400 10 11 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 10 20 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=12' 'SBTRD' 'Rand' 0.0 'Lower' 400 12 13 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 12 24 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=16' 'SBTRD' 'Rand' 0.0 'Lower' 400 16 17 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=20' 'SBTRD' 'Rand' 0.0 'Lower' 400 20 21 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 20 40 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=24' 'SBTRD' 'Rand' 0.0 'Lower' 400 24 25 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 24 48 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=32' 'SBTRD' 'Rand' 0.0 'Lower' 400 32 33 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=40' 'SBTRD' 'Rand' 0.0 'Lower' 400 40 41 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 40 80 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=48' 'SBTRD' 'Rand' 0.0 'Lower' 400 48 49 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 48 96 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=64' 'SBTRD' 'Rand' 0.0 'Lower' 400 64 65 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 64 128 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'b=4' 'SBTRD' 'Rand' 0.0 'Lower' 600 4 5 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 4 8 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=6' 'SBTRD' 'Rand' 0.0 'Lower' 600 6 7 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 6 12 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=8' 'SBTRD' 'Rand' 0.0 'Lower' 600 8 9 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=10' 'SBTRD' 'Rand' 0.0 'Lower' 600 10 11 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 10 20 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=12' 'SBTRD' 'Rand' 0.0 'Lower' 600 12 13 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 12 24 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=16' 'SBTRD' 'Rand' 0.0 'Lower' 600 16 17 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=20' 'SBTRD' 'Rand' 0.0 'Lower' 600 20 21 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 20 40 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=24' 'SBTRD' 'Rand' 0.0 'Lower' 600 24 25 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 24 48 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=32' 'SBTRD' 'Rand' 0.0 'Lower' 600 32 33 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=40' 'SBTRD' 'Rand' 0.0 'Lower' 600 40 41 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 40 80 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=48' 'SBTRD' 'Rand' 0.0 'Lower' 600 48 49 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 48 96 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=64' 'SBTRD' 'Rand' 0.0 'Lower' 600 64 65 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 64 128 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' ' *** ignore messages about tests failing because ***' 'Print' ' *** SBRDT returned a wrong (but positive) info ***' 'Print' '' 'Print' 'b=4' 'SBTRD' 'Rand' 0.0 'Lower' 200 4 5 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 4 8 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=6' 'SBTRD' 'Rand' 0.0 'Lower' 200 6 7 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 6 12 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=8' 'SBTRD' 'Rand' 0.0 'Lower' 200 8 9 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=10' 'SBTRD' 'Rand' 0.0 'Lower' 200 10 11 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 10 20 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=12' 'SBTRD' 'Rand' 0.0 'Lower' 200 12 13 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 12 24 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=16' 'SBTRD' 'Rand' 0.0 'Lower' 200 16 17 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=20' 'SBTRD' 'Rand' 0.0 'Lower' 200 20 21 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 20 40 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=24' 'SBTRD' 'Rand' 0.0 'Lower' 200 24 25 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 24 48 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=32' 'SBTRD' 'Rand' 0.0 'Lower' 200 32 33 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=40' 'SBTRD' 'Rand' 0.0 'Lower' 200 40 41 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 40 80 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=48' 'SBTRD' 'Rand' 0.0 'Lower' 200 48 49 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 48 96 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=64' 'SBTRD' 'Rand' 0.0 'Lower' 200 64 65 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 64 128 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'b=4' 'SBTRD' 'Rand' 0.0 'Lower' 400 4 5 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 4 8 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=6' 'SBTRD' 'Rand' 0.0 'Lower' 400 6 7 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 6 12 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=8' 'SBTRD' 'Rand' 0.0 'Lower' 400 8 9 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=10' 'SBTRD' 'Rand' 0.0 'Lower' 400 10 11 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 10 20 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=12' 'SBTRD' 'Rand' 0.0 'Lower' 400 12 13 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 12 24 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=16' 'SBTRD' 'Rand' 0.0 'Lower' 400 16 17 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=20' 'SBTRD' 'Rand' 0.0 'Lower' 400 20 21 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 20 40 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=24' 'SBTRD' 'Rand' 0.0 'Lower' 400 24 25 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 24 48 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=32' 'SBTRD' 'Rand' 0.0 'Lower' 400 32 33 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=40' 'SBTRD' 'Rand' 0.0 'Lower' 400 40 41 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 40 80 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=48' 'SBTRD' 'Rand' 0.0 'Lower' 400 48 49 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 48 96 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=64' 'SBTRD' 'Rand' 0.0 'Lower' 400 64 65 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 64 128 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'b=4' 'SBTRD' 'Rand' 0.0 'Lower' 600 4 5 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 4 8 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=6' 'SBTRD' 'Rand' 0.0 'Lower' 600 6 7 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 6 12 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=8' 'SBTRD' 'Rand' 0.0 'Lower' 600 8 9 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=10' 'SBTRD' 'Rand' 0.0 'Lower' 600 10 11 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 10 20 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=12' 'SBTRD' 'Rand' 0.0 'Lower' 600 12 13 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 12 24 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=16' 'SBTRD' 'Rand' 0.0 'Lower' 600 16 17 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=20' 'SBTRD' 'Rand' 0.0 'Lower' 600 20 21 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 20 40 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=24' 'SBTRD' 'Rand' 0.0 'Lower' 600 24 25 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 24 48 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=32' 'SBTRD' 'Rand' 0.0 'Lower' 600 32 33 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=40' 'SBTRD' 'Rand' 0.0 'Lower' 600 40 41 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 40 80 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=48' 'SBTRD' 'Rand' 0.0 'Lower' 600 48 49 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 48 96 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=64' 'SBTRD' 'Rand' 0.0 'Lower' 600 64 65 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 64 128 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C --- quit --- 'Quit' C SHAR_EOF fi # end of overwriting check if test -f 'driver.f' then echo shar: will not over-write existing file "'driver.f'" else cat << "SHAR_EOF" > 'driver.f' SUBROUTINE DORQLX( NB0, NX0, > M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) C SUBROUTINE DORGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) * * -- LAPACK routine (version 3.0) -- * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., * Courant Institute, Argonne National Lab, and Rice University * June 30, 1999 * * .. Scalar Arguments .. INTEGER NB0, NX0, INFO, K, LDA, LWORK, M, N * .. * .. Array Arguments .. DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) C DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) * .. * * Purpose * ======= * * dORQLx generates an M-by-N real matrix Q with orthonormal columns, C* 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 * ========= * * nb0 (input) integer * The blocking factor. * * nx0 (input) integer * The cross-over point for the nonblocked algorithm. * * 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) C* 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) C* 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 (LWORK) C* WORK (workspace/output) DOUBLE PRECISION array, dimension (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 C DOUBLE PRECISION ZERO PARAMETER ( ZERO = 0.0D+0 ) C 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 C EXTERNAL DLARFB, DLARFT, DORG2L, XERBLA * .. * .. Intrinsic Functions .. INTRINSIC MAX, MIN * .. * .. External Functions .. INTEGER ILAENV EXTERNAL ILAENV * .. * .. Executable Statements .. * * Test the input arguments * INFO = 0 IF ( NB0 .GT. 0 ) THEN NB = NB0 ELSE NB = ILAENV( 1, 'dORGQL', ' ', M, N, K, -1 ) ENDIF C NB = ILAENV( 1, 'DORGQL', ' ', 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( 'dORGQL', -INFO ) C CALL XERBLA( 'DORGQL', -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. * IF ( NX0 .GT. 0 ) THEN NX = NX0 ELSE NX = MAX( 0, ILAENV( 3, 'dORGQL', ' ', M, N, K, -1 ) ) ENDIF C 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 = 2 C 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 ) C 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 ) C CALL DLARFT( 'Backward', 'Columnwise', M-K+I+IB-1, IB, C $ 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 ) C CALL DLARFB( 'Left', 'No transpose', 'Backward', C $ 'Columnwise', M-K+I+IB-1, N-K+I-1, IB, C $ A( 1, N-K+I ), LDA, WORK, LDWORK, A, LDA, C $ 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 ) C CALL DORG2L( M-K+I+IB-1, IB, IB, A( 1, N-K+I ), LDA, C $ 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 dORQLx C* End of DORGQL * END SUBROUTINE DORQRX( NB0, NX0, > M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) C SUBROUTINE DORGQR( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) * * -- LAPACK routine (version 3.0) -- * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., * Courant Institute, Argonne National Lab, and Rice University * June 30, 1999 * * .. Scalar Arguments .. INTEGER NB0, NX0, INFO, K, LDA, LWORK, M, N C INTEGER INFO, K, LDA, LWORK, M, N * .. * .. Array Arguments .. DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) C DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) * .. * * Purpose * ======= * * dORQRx generates an M-by-N real matrix Q with orthonormal columns, C* 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. C* as returned by DGEQRF. * * Arguments * ========= * * nb0 (input) integer * The blocking factor. * * nx0 (input) integer * The cross-over point for the non-blocked algorithm. * * 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) C* 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 C* 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) C* 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* reflector H(i), as returned by DGEQRF. * * WORK (workspace/output) double precision array, dimension (LWORK) C* WORK (workspace/output) DOUBLE PRECISION array, dimension (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 C DOUBLE PRECISION ZERO PARAMETER ( ZERO = 0.0D+0 ) C 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 C EXTERNAL DLARFB, DLARFT, DORG2R, XERBLA * .. * .. Intrinsic Functions .. INTRINSIC MAX, MIN * .. * .. External Functions .. INTEGER ILAENV EXTERNAL ILAENV * .. * .. Executable Statements .. * * Test the input arguments * INFO = 0 IF ( NB0 .GT. 0 ) THEN NB = NB0 ELSE NB = ILAENV( 1, 'dORGQR', ' ', M, N, K, -1 ) ENDIF C 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 ) C 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. * IF ( NX0 .GT. 0 ) THEN NX = NX0 ELSE NX = MAX( 0, ILAENV( 3, 'dORGQR', ' ', M, N, K, -1 ) ) ENDIF C 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 = 2 C 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 ) C $ CALL DORG2R( M-KK, N-KK, K-KK, A( KK+1, KK+1 ), LDA, C $ 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 ) C CALL DLARFT( 'Forward', 'Columnwise', M-I+1, IB, C $ 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 ) C CALL DLARFB( 'Left', 'No transpose', 'Forward', C $ 'Columnwise', M-I+1, N-I-IB+1, IB, C $ A( I, I ), LDA, WORK, LDWORK, A( I, I+IB ), C $ 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 ) C CALL DORG2R( M-I+1, IB, IB, A( I, I ), LDA, TAU( I ), WORK, C $ 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 dORQRx C* End of DORGQR * END SUBROUTINE DORGTX( NB0, NX0, > UPLO, N, A, LDA, TAU, WORK, LWORK, INFO ) C SUBROUTINE DORGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO ) * * -- LAPACK routine (version 3.0) -- * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., * Courant Institute, Argonne National Lab, and Rice University * June 30, 1999 * * .. Scalar Arguments .. CHARACTER UPLO INTEGER NB0, NX0, INFO, LDA, LWORK, N C INTEGER INFO, LDA, LWORK, N * .. * .. Array Arguments .. DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) C DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) * .. * * Purpose * ======= * * dORGTx generates a real orthogonal matrix Q which is defined as the C* 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: C* DSYTRD: * * if UPLO = 'U', Q = H(n-1) . . . H(2) H(1), * * if UPLO = 'L', Q = H(1) H(2) . . . H(n-1). * * Arguments * ========= * * nb0 (input) integer * The blocking factor. * * nx0 (input) integer * The cross-over point for the nonblocked algorithm. * * UPLO (input) CHARACTER*1 * = 'U': Upper triangle of A contains elementary reflectors * from dSYTRD; C* from DSYTRD; * = 'L': Lower triangle of A contains elementary reflectors * from dSYTRD. C* from DSYTRD. * * N (input) INTEGER * The order of the matrix Q. N >= 0. * * A (input/output) dPreicision array, dimension (LDA,N) C* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) * On entry, the vectors which define the elementary reflectors, * as returned by dSYTRD. C* 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) dPreicision array, dimension (N-1) C* 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. C* reflector H(i), as returned by DSYTRD. * * WORK (workspace/output) double precision array, dimension (LWORK) C* WORK (workspace/output) DOUBLE PRECISION array, dimension (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 C DOUBLE PRECISION ZERO, ONE PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) C 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 DORQLX, DORQRX, XERBLA C 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 IF ( NB0 .GT. 0 ) THEN NB = NB0 ELSE NB = ILAENV( 1, 'dORGQL', ' ', N-1, N-1, N-1, -1 ) ENDIF C NB = ILAENV( 1, 'DORGQL', ' ', N-1, N-1, N-1, -1 ) ELSE IF ( NB0 .GT. 0 ) THEN NB = NB0 ELSE NB = ILAENV( 1, 'dORGQR', ' ', N-1, N-1, N-1, -1 ) ENDIF C 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 ) C 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' C* 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 DORQLX( NB0, NX0, > N-1, N-1, N-1, A, LDA, TAU, WORK, LWORK, IINFO ) C 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'. C* 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 DORQRX( NB0, NX0, > N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK, $ LWORK, IINFO ) C CALL DORGQR( N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK, C $ LWORK, IINFO ) END IF END IF WORK( 1 ) = LWKOPT RETURN * * End of dORGTR C* End of DORGTR * END C SUBROUTINE DSBTRD( VECT, UPLO, N, KD, AB, LDAB, D, E, Q, LDQ, SUBROUTINE DSBTRX( VECT, UPLO, N, KD, AB, LDAB, D, E, Q, LDQ, $ WORK, INFO ) * * -- LAPACK routine (version 3.0) -- * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., * Courant Institute, Argonne National Lab, and Rice University * June 30, 1999 * * .. Scalar Arguments .. CHARACTER UPLO, VECT INTEGER INFO, KD, LDAB, LDQ, N * .. * .. Array Arguments .. C DOUBLE PRECISION AB( LDAB, * ), D( * ), E( * ), Q( LDQ, * ), DOUBLE PRECISION AB( LDAB, * ), D( * ), E( * ), Q( LDQ, * ), $ WORK( * ) * .. * * Purpose * ======= * C* DSBTRD reduces a real symmetric band matrix A to symmetric * dSBTRD reduces a real symmetric band matrix A to symmetric * tridiagonal form T by an orthogonal similarity transformation: * Q**T * A * Q = T. * * Arguments * ========= * * VECT (input) CHARACTER*1 * = 'N': do not form Q; * = 'V': form Q; * = 'U': update a matrix X, by forming X*Q. * * 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. * C* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) * 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, the diagonal elements of AB are overwritten by the * diagonal elements of the tridiagonal matrix T; if KD > 0, the * elements on the first superdiagonal (if UPLO = 'U') or the * first subdiagonal (if UPLO = 'L') are overwritten by the * off-diagonal elements of T; the rest of AB is overwritten by * values generated during the reduction. * * LDAB (input) INTEGER * The leading dimension of the array AB. LDAB >= KD+1. * C* D (output) DOUBLE PRECISION array, dimension (N) * D (output) double precision array, dimension (N) * The diagonal elements of the tridiagonal matrix T. * C* E (output) DOUBLE PRECISION array, dimension (N-1) * E (output) double precision array, dimension (N-1) * The off-diagonal elements of the tridiagonal matrix T: * E(i) = T(i,i+1) if UPLO = 'U'; E(i) = T(i+1,i) if UPLO = 'L'. * C* Q (input/output) DOUBLE PRECISION array, dimension (LDQ,N) * Q (input/output) double precision array, dimension (LDQ,N) * On entry, if VECT = 'U', then Q must contain an N-by-N * matrix X; if VECT = 'N' or 'V', then Q need not be set. * * On exit: * if VECT = 'V', Q contains the N-by-N orthogonal matrix Q; * if VECT = 'U', Q contains the product X*Q; * if VECT = 'N', the array Q is not referenced. * * LDQ (input) INTEGER * The leading dimension of the array Q. * LDQ >= 1, and LDQ >= N if VECT = 'V' or 'U'. * C* WORK (workspace) DOUBLE PRECISION array, dimension (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 * * Further Details * =============== * * Modified by Linda Kaufman, Bell Labs. * * ===================================================================== * * .. Parameters .. C DOUBLE PRECISION ZERO, ONE DOUBLE PRECISION ZERO, ONE C PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) * .. * .. Local Scalars .. LOGICAL INITQ, UPPER, WANTQ INTEGER I, I2, IBL, INCA, INCX, IQAEND, IQB, IQEND, J, $ J1, J1END, J1INC, J2, JEND, JIN, JINC, K, KD1, $ KDM1, KDN, L, LAST, LEND, NQ, NR, NRT C DOUBLE PRECISION TEMP DOUBLE PRECISION TEMP * .. * .. External Subroutines .. C EXTERNAL DLAR2V, DLARGV, DLARTG, DLARTV, DLASET, DROT, EXTERNAL DLAR2V, DLARGV, DLARTG, DLARTV, DLASET, DROT, $ XERBLA * .. * .. Intrinsic Functions .. INTRINSIC MAX, MIN * .. * .. External Functions .. LOGICAL LSAME EXTERNAL LSAME * .. * .. Executable Statements .. * * Test the input parameters * INITQ = LSAME( VECT, 'V' ) WANTQ = INITQ .OR. LSAME( VECT, 'U' ) UPPER = LSAME( UPLO, 'U' ) KD1 = KD + 1 KDM1 = KD - 1 INCX = LDAB - 1 IQEND = 1 * INFO = 0 IF( .NOT.WANTQ .AND. .NOT.LSAME( VECT, 'N' ) ) 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( KD.LT.0 ) THEN INFO = -4 ELSE IF( LDAB.LT.KD1 ) THEN INFO = -6 ELSE IF( LDQ.LT.MAX( 1, N ) .AND. WANTQ ) THEN INFO = -10 END IF IF( INFO.NE.0 ) THEN C CALL XERBLA( 'DSBTRD', -INFO ) CALL XERBLA( 'dSBTRD', -INFO ) RETURN END IF * * Quick return if possible * IF( N.EQ.0 ) $ RETURN * * Initialize Q to the unit matrix, if needed * IF( INITQ ) C $ CALL DLASET( 'Full', N, N, ZERO, ONE, Q, LDQ ) $ CALL DLASET( 'Full', N, N, ZERO, ONE, Q, LDQ ) * * Wherever possible, plane rotations are generated and applied in * vector operations of length NR over the index set J1:J2:KD1. * * The cosines and sines of the plane rotations are stored in the * arrays D and WORK. * INCA = KD1*LDAB KDN = MIN( N-1, KD ) IF( UPPER ) THEN * IF( KD.GT.1 ) THEN * * Reduce to tridiagonal form, working with upper triangle * NR = 0 J1 = KDN + 2 J2 = 1 * DO 90 I = 1, N - 2 * * Reduce i-th row of matrix to tridiagonal form * DO 80 K = KDN + 1, 2, -1 J1 = J1 + KDN J2 = J2 + KDN * IF( NR.GT.0 ) THEN * * generate plane rotations to annihilate nonzero * elements which have been created outside the band * C CALL DLARGV( NR, AB( 1, J1-1 ), INCA, WORK( J1 ), CALL DLARGV( NR, AB( 1, J1-1 ), INCA, WORK( J1 ), $ KD1, D( J1 ), KD1 ) * * apply rotations from the right * * * Dependent on the the number of diagonals either C* DLARTV or DROT is used * dLARTV or dROT is used * IF( NR.GE.2*KD-1 ) THEN DO 10 L = 1, KD - 1 C CALL DLARTV( NR, AB( L+1, J1-1 ), INCA, CALL DLARTV( NR, AB( L+1, J1-1 ), INCA, $ AB( L, J1 ), INCA, D( J1 ), $ WORK( J1 ), KD1 ) 10 CONTINUE * ELSE JEND = J1 + ( NR-1 )*KD1 DO 20 JINC = J1, JEND, KD1 C CALL DROT( KDM1, AB( 2, JINC-1 ), 1, CALL DROT( KDM1, AB( 2, JINC-1 ), 1, $ AB( 1, JINC ), 1, D( JINC ), $ WORK( JINC ) ) 20 CONTINUE END IF END IF * * IF( K.GT.2 ) THEN IF( K.LE.N-I+1 ) THEN * * generate plane rotation to annihilate a(i,i+k-1) * within the band * C CALL DLARTG( AB( KD-K+3, I+K-2 ), CALL DLARTG( AB( KD-K+3, I+K-2 ), $ AB( KD-K+2, I+K-1 ), D( I+K-1 ), $ WORK( I+K-1 ), TEMP ) AB( KD-K+3, I+K-2 ) = TEMP * * apply rotation from the right * C CALL DROT( K-3, AB( KD-K+4, I+K-2 ), 1, CALL DROT( K-3, AB( KD-K+4, I+K-2 ), 1, $ AB( KD-K+3, I+K-1 ), 1, D( I+K-1 ), $ WORK( I+K-1 ) ) END IF NR = NR + 1 J1 = J1 - KDN - 1 END IF * * apply plane rotations from both sides to diagonal * blocks * IF( NR.GT.0 ) C $ CALL DLAR2V( NR, AB( KD1, J1-1 ), AB( KD1, J1 ), $ CALL DLAR2V( NR, AB( KD1, J1-1 ), AB( KD1, J1 ), $ AB( KD, J1 ), INCA, D( J1 ), $ WORK( J1 ), KD1 ) * * apply plane rotations from the left * IF( NR.GT.0 ) THEN IF( 2*KD-1.LT.NR ) THEN * * Dependent on the the number of diagonals either C* DLARTV or DROT is used * dLARTV or dROT is used * DO 30 L = 1, KD - 1 IF( J2+L.GT.N ) THEN NRT = NR - 1 ELSE NRT = NR END IF IF( NRT.GT.0 ) C $ CALL DLARTV( NRT, AB( KD-L, J1+L ), INCA, $ CALL DLARTV( NRT, AB( KD-L, J1+L ), INCA, $ AB( KD-L+1, J1+L ), INCA, $ D( J1 ), WORK( J1 ), KD1 ) 30 CONTINUE ELSE J1END = J1 + KD1*( NR-2 ) IF( J1END.GE.J1 ) THEN DO 40 JIN = J1, J1END, KD1 C CALL DROT( KD-1, AB( KD-1, JIN+1 ), INCX, CALL DROT( KD-1, AB( KD-1, JIN+1 ), INCX, $ AB( KD, JIN+1 ), INCX, $ D( JIN ), WORK( JIN ) ) 40 CONTINUE END IF LEND = MIN( KDM1, N-J2 ) LAST = J1END + KD1 IF( LEND.GT.0 ) C $ CALL DROT( LEND, AB( KD-1, LAST+1 ), INCX, $ CALL DROT( LEND, AB( KD-1, LAST+1 ), INCX, $ AB( KD, LAST+1 ), INCX, D( LAST ), $ WORK( LAST ) ) END IF END IF * IF( WANTQ ) THEN * * accumulate product of plane rotations in Q * IF( INITQ ) THEN * * take advantage of the fact that Q was * initially the Identity matrix * IQEND = MAX( IQEND, J2 ) I2 = MAX( 0, K-3 ) IQAEND = 1 + I*KD IF( K.EQ.2 ) $ IQAEND = IQAEND + KD IQAEND = MIN( IQAEND, IQEND ) DO 50 J = J1, J2, KD1 IBL = I - I2 / KDM1 I2 = I2 + 1 IQB = MAX( 1, J-IBL ) NQ = 1 + IQAEND - IQB IQAEND = MIN( IQAEND+KD, IQEND ) C CALL DROT( NQ, Q( IQB, J-1 ), 1, Q( IQB, J ), CALL DROT( NQ, Q( IQB, J-1 ), 1, Q( IQB, J ), $ 1, D( J ), WORK( J ) ) 50 CONTINUE ELSE * DO 60 J = J1, J2, KD1 C CALL DROT( N, Q( 1, J-1 ), 1, Q( 1, J ), 1, CALL DROT( N, Q( 1, J-1 ), 1, Q( 1, J ), 1, $ D( J ), WORK( J ) ) 60 CONTINUE END IF * END IF * IF( J2+KDN.GT.N ) THEN * * adjust J2 to keep within the bounds of the matrix * NR = NR - 1 J2 = J2 - KDN - 1 END IF * DO 70 J = J1, J2, KD1 * * create nonzero element a(j-1,j+kd) outside the band * and store it in WORK * WORK( J+KD ) = WORK( J )*AB( 1, J+KD ) AB( 1, J+KD ) = D( J )*AB( 1, J+KD ) 70 CONTINUE 80 CONTINUE 90 CONTINUE END IF * IF( KD.GT.0 ) THEN * * copy off-diagonal elements to E * DO 100 I = 1, N - 1 E( I ) = AB( KD, I+1 ) 100 CONTINUE ELSE * * set E to zero if original matrix was diagonal * DO 110 I = 1, N - 1 E( I ) = ZERO 110 CONTINUE END IF * * copy diagonal elements to D * DO 120 I = 1, N D( I ) = AB( KD1, I ) 120 CONTINUE * ELSE * IF( KD.GT.1 ) THEN * * Reduce to tridiagonal form, working with lower triangle * NR = 0 J1 = KDN + 2 J2 = 1 * DO 210 I = 1, N - 2 * * Reduce i-th column of matrix to tridiagonal form * DO 200 K = KDN + 1, 2, -1 J1 = J1 + KDN J2 = J2 + KDN * IF( NR.GT.0 ) THEN * * generate plane rotations to annihilate nonzero * elements which have been created outside the band * C CALL DLARGV( NR, AB( KD1, J1-KD1 ), INCA, CALL DLARGV( NR, AB( KD1, J1-KD1 ), INCA, $ WORK( J1 ), KD1, D( J1 ), KD1 ) * * apply plane rotations from one side * * * Dependent on the the number of diagonals either C* DLARTV or DROT is used * dLARTV or dROT is used * IF( NR.GT.2*KD-1 ) THEN DO 130 L = 1, KD - 1 C CALL DLARTV( NR, AB( KD1-L, J1-KD1+L ), INCA, CALL DLARTV( NR, AB( KD1-L, J1-KD1+L ), INCA, $ AB( KD1-L+1, J1-KD1+L ), INCA, $ D( J1 ), WORK( J1 ), KD1 ) 130 CONTINUE ELSE JEND = J1 + KD1*( NR-1 ) DO 140 JINC = J1, JEND, KD1 C CALL DROT( KDM1, AB( KD, JINC-KD ), INCX, CALL DROT( KDM1, AB( KD, JINC-KD ), INCX, $ AB( KD1, JINC-KD ), INCX, $ D( JINC ), WORK( JINC ) ) 140 CONTINUE END IF * END IF * IF( K.GT.2 ) THEN IF( K.LE.N-I+1 ) THEN * * generate plane rotation to annihilate a(i+k-1,i) * within the band * C CALL DLARTG( AB( K-1, I ), AB( K, I ), CALL DLARTG( AB( K-1, I ), AB( K, I ), $ D( I+K-1 ), WORK( I+K-1 ), TEMP ) AB( K-1, I ) = TEMP * * apply rotation from the left * C CALL DROT( K-3, AB( K-2, I+1 ), LDAB-1, CALL DROT( K-3, AB( K-2, I+1 ), LDAB-1, $ AB( K-1, I+1 ), LDAB-1, D( I+K-1 ), $ WORK( I+K-1 ) ) END IF NR = NR + 1 J1 = J1 - KDN - 1 END IF * * apply plane rotations from both sides to diagonal * blocks * IF( NR.GT.0 ) C $ CALL DLAR2V( NR, AB( 1, J1-1 ), AB( 1, J1 ), $ CALL DLAR2V( NR, AB( 1, J1-1 ), AB( 1, J1 ), $ AB( 2, J1-1 ), INCA, D( J1 ), $ WORK( J1 ), KD1 ) * * apply plane rotations from the right * * * Dependent on the the number of diagonals either C* DLARTV or DROT is used * dLARTV or dROT is used * IF( NR.GT.0 ) THEN IF( NR.GT.2*KD-1 ) THEN DO 150 L = 1, KD - 1 IF( J2+L.GT.N ) THEN NRT = NR - 1 ELSE NRT = NR END IF IF( NRT.GT.0 ) C $ CALL DLARTV( NRT, AB( L+2, J1-1 ), INCA, $ CALL DLARTV( NRT, AB( L+2, J1-1 ), INCA, $ AB( L+1, J1 ), INCA, D( J1 ), $ WORK( J1 ), KD1 ) 150 CONTINUE ELSE J1END = J1 + KD1*( NR-2 ) IF( J1END.GE.J1 ) THEN DO 160 J1INC = J1, J1END, KD1 C CALL DROT( KDM1, AB( 3, J1INC-1 ), 1, CALL DROT( KDM1, AB( 3, J1INC-1 ), 1, $ AB( 2, J1INC ), 1, D( J1INC ), $ WORK( J1INC ) ) 160 CONTINUE END IF LEND = MIN( KDM1, N-J2 ) LAST = J1END + KD1 IF( LEND.GT.0 ) C $ CALL DROT( LEND, AB( 3, LAST-1 ), 1, $ CALL DROT( LEND, AB( 3, LAST-1 ), 1, $ AB( 2, LAST ), 1, D( LAST ), $ WORK( LAST ) ) END IF END IF * * * IF( WANTQ ) THEN * * accumulate product of plane rotations in Q * IF( INITQ ) THEN * * take advantage of the fact that Q was * initially the Identity matrix * IQEND = MAX( IQEND, J2 ) I2 = MAX( 0, K-3 ) IQAEND = 1 + I*KD IF( K.EQ.2 ) $ IQAEND = IQAEND + KD IQAEND = MIN( IQAEND, IQEND ) DO 170 J = J1, J2, KD1 IBL = I - I2 / KDM1 I2 = I2 + 1 IQB = MAX( 1, J-IBL ) NQ = 1 + IQAEND - IQB IQAEND = MIN( IQAEND+KD, IQEND ) C CALL DROT( NQ, Q( IQB, J-1 ), 1, Q( IQB, J ), CALL DROT( NQ, Q( IQB, J-1 ), 1, Q( IQB, J ), $ 1, D( J ), WORK( J ) ) 170 CONTINUE ELSE * DO 180 J = J1, J2, KD1 C CALL DROT( N, Q( 1, J-1 ), 1, Q( 1, J ), 1, CALL DROT( N, Q( 1, J-1 ), 1, Q( 1, J ), 1, $ D( J ), WORK( J ) ) 180 CONTINUE END IF END IF * IF( J2+KDN.GT.N ) THEN * * adjust J2 to keep within the bounds of the matrix * NR = NR - 1 J2 = J2 - KDN - 1 END IF * DO 190 J = J1, J2, KD1 * * create nonzero element a(j+kd,j-1) outside the * band and store it in WORK * WORK( J+KD ) = WORK( J )*AB( KD1, J ) AB( KD1, J ) = D( J )*AB( KD1, J ) 190 CONTINUE 200 CONTINUE 210 CONTINUE END IF * IF( KD.GT.0 ) THEN * * copy off-diagonal elements to E * DO 220 I = 1, N - 1 E( I ) = AB( 2, I ) 220 CONTINUE ELSE * * set E to zero if original matrix was diagonal * DO 230 I = 1, N - 1 E( I ) = ZERO 230 CONTINUE END IF * * copy diagonal elements to D * DO 240 I = 1, N D( I ) = AB( 1, I ) 240 CONTINUE END IF * RETURN * C* End of DSBTRD * End of dSBTRD * END SUBROUTINE DSYTRX( NB0, NX0, > UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO ) C SUBROUTINE DSYTRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO ) * * -- LAPACK routine (version 3.0) -- * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., * Courant Institute, Argonne National Lab, and Rice University * June 30, 1999 * * .. Scalar Arguments .. CHARACTER UPLO INTEGER NB0, NX0, INFO, LDA, LWORK, N C INTEGER INFO, LDA, LWORK, N * .. * .. Array Arguments .. DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAU( * ), $ WORK( * ) C DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAU( * ), C $ WORK( * ) * .. * * Purpose * ======= * * dSYTRx reduces a real symmetric matrix A to real symmetric C* DSYTRD reduces a real symmetric matrix A to real symmetric * tridiagonal form T by an orthogonal similarity transformation: * Q**T * A * Q = T. * * Arguments * ========= * * nb0 (input) integer * The blocking factor. * * nx0 (input) integer * The cross-over point to the nonblocked algorithm. C * * 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) C* 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) C* 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) C* 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) C* 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 (LWORK) C* WORK (workspace/output) DOUBLE PRECISION array, dimension (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 C DOUBLE PRECISION ONE PARAMETER ( ONE = 1.0D+0 ) C 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 C 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. * IF ( NB0 .GT. 0 ) THEN NB = NB0 ELSE NB = ILAENV( 1, 'DSYTRD', UPLO, N, -1, -1, -1 ) ENDIF C 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 ) C 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). * IF ( NX0 .GT. 0 ) THEN NX = MAX( NB, NX0 ) ELSE NX = MAX( NB, ILAENV( 3, 'DSYTRD', UPLO, N, -1, -1, -1 ) ) ENDIF C 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 = 2 C 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 ) C CALL DLATRD( UPLO, I+NB-1, NB, A, LDA, E, TAU, WORK, C $ 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 ) C CALL DSYR2K( UPLO, 'No transpose', I-1, NB, -ONE, A( 1, I ), C $ 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 ) C 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 ) C CALL DLATRD( UPLO, N-I+1, NB, A( I, I ), LDA, E( I ), C $ 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 ) C CALL DSYR2K( UPLO, 'No transpose', N-I-NB+1, NB, -ONE, C $ A( I+NB, I ), LDA, WORK( NB+1 ), LDWORK, ONE, C $ 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 ) C CALL DSYTD2( UPLO, N-I+1, A( I, I ), LDA, D( I ), E( I ), C $ TAU( I ), IINFO ) END IF * WORK( 1 ) = LWKOPT RETURN * * End of dSYTRD C* End of DSYTRD * END SUBROUTINE DLAGSY( N, K, D, A, LDA, ISEED, WORK, INFO ) * * -- LAPACK auxiliary test routine (version 3.0) * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., * Courant Institute, Argonne National Lab, and Rice University * February 29, 1992 * * .. Scalar Arguments .. INTEGER INFO, K, LDA, N * .. * .. Array Arguments .. INTEGER ISEED( 4 ) DOUBLE PRECISION A( LDA, * ), D( * ), WORK( * ) * .. * * Purpose * ======= * * DLAGSY generates a real symmetric matrix A, by pre- and post- * multiplying a real diagonal matrix D with a random orthogonal matrix: * A = U*D*U'. The semi-bandwidth may then be reduced to k by additional * orthogonal transformations. * * Arguments * ========= * * N (input) INTEGER * The order of the matrix A. N >= 0. * * K (input) INTEGER * The number of nonzero subdiagonals within the band of A. * 0 <= K <= N-1. * * D (input) DOUBLE PRECISION array, dimension (N) * The diagonal elements of the diagonal matrix D. * * A (output) DOUBLE PRECISION array, dimension (LDA,N) * The generated n by n symmetric matrix A (the full matrix is * stored). * * LDA (input) INTEGER * The leading dimension of the array A. LDA >= N. * * ISEED (input/output) INTEGER array, dimension (4) * On entry, the seed of the random number generator; the array * elements must be between 0 and 4095, and ISEED(4) must be * odd. * On exit, the seed is updated. * * WORK (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, HALF PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0, HALF = 0.5D+0 ) * .. * .. Local Scalars .. INTEGER I, J DOUBLE PRECISION ALPHA, TAU, WA, WB, WN * .. * .. External Subroutines .. EXTERNAL DAXPY, DGEMV, DGER, DLARNV, DSCAL, DSYMV, $ DSYR2, XERBLA * .. * .. External Functions .. DOUBLE PRECISION DDOT, DNRM2 EXTERNAL DDOT, DNRM2 * .. * .. Intrinsic Functions .. INTRINSIC MAX, SIGN * .. * .. Executable Statements .. * * Test the input arguments * INFO = 0 IF( N.LT.0 ) THEN INFO = -1 ELSE IF( K.LT.0 .OR. K.GT.N-1 ) THEN INFO = -2 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN INFO = -5 END IF IF( INFO.LT.0 ) THEN CALL XERBLA( 'DLAGSY', -INFO ) RETURN END IF * * initialize lower triangle of A to diagonal matrix * DO 20 J = 1, N DO 10 I = J + 1, N A( I, J ) = ZERO 10 CONTINUE 20 CONTINUE DO 30 I = 1, N A( I, I ) = D( I ) 30 CONTINUE * * Generate lower triangle of symmetric matrix * DO 40 I = N - 1, 1, -1 * * generate random reflection * CALL DLARNV( 3, ISEED, N-I+1, WORK ) WN = DNRM2( N-I+1, WORK, 1 ) WA = SIGN( WN, WORK( 1 ) ) IF( WN.EQ.ZERO ) THEN TAU = ZERO ELSE WB = WORK( 1 ) + WA CALL DSCAL( N-I, ONE / WB, WORK( 2 ), 1 ) WORK( 1 ) = ONE TAU = WB / WA END IF * * apply random reflection to A(i:n,i:n) from the left * and the right * * compute y := tau * A * u * CALL DSYMV( 'Lower', N-I+1, TAU, A( I, I ), LDA, WORK, 1, ZERO, $ WORK( N+1 ), 1 ) * * compute v := y - 1/2 * tau * ( y, u ) * u * ALPHA = -HALF*TAU*DDOT( N-I+1, WORK( N+1 ), 1, WORK, 1 ) CALL DAXPY( N-I+1, ALPHA, WORK, 1, WORK( N+1 ), 1 ) * * apply the transformation as a rank-2 update to A(i:n,i:n) * CALL DSYR2( 'Lower', N-I+1, -ONE, WORK, 1, WORK( N+1 ), 1, $ A( I, I ), LDA ) 40 CONTINUE * * Reduce number of subdiagonals to K * DO 60 I = 1, N - 1 - K * * generate reflection to annihilate A(k+i+1:n,i) * WN = DNRM2( N-K-I+1, A( K+I, I ), 1 ) WA = SIGN( WN, A( K+I, I ) ) IF( WN.EQ.ZERO ) THEN TAU = ZERO ELSE WB = A( K+I, I ) + WA CALL DSCAL( N-K-I, ONE / WB, A( K+I+1, I ), 1 ) A( K+I, I ) = ONE TAU = WB / WA END IF * * apply reflection to A(k+i:n,i+1:k+i-1) from the left * CALL DGEMV( 'Transpose', N-K-I+1, K-1, ONE, A( K+I, I+1 ), LDA, $ A( K+I, I ), 1, ZERO, WORK, 1 ) CALL DGER( N-K-I+1, K-1, -TAU, A( K+I, I ), 1, WORK, 1, $ A( K+I, I+1 ), LDA ) * * apply reflection to A(k+i:n,k+i:n) from the left and the right * * compute y := tau * A * u * CALL DSYMV( 'Lower', N-K-I+1, TAU, A( K+I, K+I ), LDA, $ A( K+I, I ), 1, ZERO, WORK, 1 ) * * compute v := y - 1/2 * tau * ( y, u ) * u * ALPHA = -HALF*TAU*DDOT( N-K-I+1, WORK, 1, A( K+I, I ), 1 ) CALL DAXPY( N-K-I+1, ALPHA, A( K+I, I ), 1, WORK, 1 ) * * apply symmetric rank-2 update to A(k+i:n,k+i:n) * CALL DSYR2( 'Lower', N-K-I+1, -ONE, A( K+I, I ), 1, WORK, 1, $ A( K+I, K+I ), LDA ) * A( K+I, I ) = -WA DO 50 J = K + I + 1, N A( J, I ) = ZERO 50 CONTINUE 60 CONTINUE * * Store full symmetric matrix * DO 80 J = 1, N DO 70 I = J + 1, N A( J, I ) = A( I, J ) 70 CONTINUE 80 CONTINUE RETURN * * End of DLAGSY * END DOUBLE PRECISION FUNCTION DLARAN( ISEED ) * * -- LAPACK auxiliary routine (version 3.0) -- * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., * Courant Institute, Argonne National Lab, and Rice University * February 29, 1992 * * .. Array Arguments .. INTEGER ISEED( 4 ) * .. * * Purpose * ======= * * DLARAN returns a random real number from a uniform (0,1) * distribution. * * Arguments * ========= * * ISEED (input/output) INTEGER array, dimension (4) * On entry, the seed of the random number generator; the array * elements must be between 0 and 4095, and ISEED(4) must be * odd. * On exit, the seed is updated. * * Further Details * =============== * * This routine uses a multiplicative congruential method with modulus * 2**48 and multiplier 33952834046453 (see G.S.Fishman, * 'Multiplicative congruential random number generators with modulus * 2**b: an exhaustive analysis for b = 32 and a partial analysis for * b = 48', Math. Comp. 189, pp 331-344, 1990). * * 48-bit integers are stored in 4 integer array elements with 12 bits * per element. Hence the routine is portable across machines with * integers of 32 bits or more. * * ===================================================================== * * .. Parameters .. INTEGER M1, M2, M3, M4 PARAMETER ( M1 = 494, M2 = 322, M3 = 2508, M4 = 2549 ) DOUBLE PRECISION ONE PARAMETER ( ONE = 1.0D+0 ) INTEGER IPW2 DOUBLE PRECISION R PARAMETER ( IPW2 = 4096, R = ONE / IPW2 ) * .. * .. Local Scalars .. INTEGER IT1, IT2, IT3, IT4 * .. * .. Intrinsic Functions .. INTRINSIC DBLE, MOD * .. * .. Executable Statements .. * * multiply the seed by the multiplier modulo 2**48 * IT4 = ISEED( 4 )*M4 IT3 = IT4 / IPW2 IT4 = IT4 - IPW2*IT3 IT3 = IT3 + ISEED( 3 )*M4 + ISEED( 4 )*M3 IT2 = IT3 / IPW2 IT3 = IT3 - IPW2*IT2 IT2 = IT2 + ISEED( 2 )*M4 + ISEED( 3 )*M3 + ISEED( 4 )*M2 IT1 = IT2 / IPW2 IT2 = IT2 - IPW2*IT1 IT1 = IT1 + ISEED( 1 )*M4 + ISEED( 2 )*M3 + ISEED( 3 )*M2 + $ ISEED( 4 )*M1 IT1 = MOD( IT1, IPW2 ) * * return updated seed * ISEED( 1 ) = IT1 ISEED( 2 ) = IT2 ISEED( 3 ) = IT3 ISEED( 4 ) = IT4 * * convert 48-bit integer to a real number in the interval (0,1) * DLARAN = R*( DBLE( IT1 )+R*( DBLE( IT2 )+R*( DBLE( IT3 )+R* $ ( DBLE( IT4 ) ) ) ) ) RETURN * * End of DLARAN * END * ********************************************************************** * PROGRAM DRUN * * Description: * * This is the testing and timing driver for the SBR toolbox. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Local constants and variables: * DOUBLE PRECISION ONE PARAMETER ( ONE = 1.0D0 ) * * --- array dimensions --- * INTEGER NMAX, SZA, SZACPY, SZU, SZWORK PARAMETER ( NMAX = 1400 , > SZA = NMAX * NMAX , > SZACPY = 500 * NMAX , > SZU = NMAX * NMAX , > SZWORK = NMAX * NMAX ) DOUBLE PRECISION A( SZA ), ACPY( SZACPY ), U( SZU ), > EVLS( NMAX ), D( NMAX ), E( NMAX ), > TAU( NMAX ), WORK( SZWORK ) COMMON /ARRAYS/ A, ACPY, U, EVLS, D, E, TAU, WORK * * nmax maximum matrix size * a holds the matrix A to be reduced (full or banded) * sza size of the array a. * sza >= nmax * nmax, if full matrices are handled * >= ( bmax+1 ) * nmax, if only banded matrices with * semibandwidth <= bmax are handled * acpy holds the reduced matrix (banded) * szacpy size of the array acpy. * szacpy >= ( bmax+1 ) * nmax, where bmax is the maximum * semibandwith * u holds the accumulated transformation matrix U, if required * szu size of the array u. * szu >= nmax * nmax, if U is accumulated * >= 0, otherwise * evls the eigenvalues of the matrix A (accessed during * initialization) * d main diagonal of the reduced tridiagonal matrix * e sub(super)diagonal of the reduced tridiagonal matrix * tau scaling factors in the reduction full -> banded/tridiagonal * work workspace * szwork size of the array work. * szwork depends on the reduction algorithms that are run, on * the matrix sizes, on the blocking factors, and on the * leading dimensions of the matrices. * Recomended: szwork >= 100 * nmax. * arrays common block is used only because some machines cannot * handle large arrays on the stack * * --- I/O control --- * INTEGER IUNIT, OUNIT, OUNITF, I1MACH * PARAMETER ( IUNIT = 5, OUNITF = 8 ) * CHARACTER*8 IFILE CHARACTER*8 OFILE * PARAMETER ( IFILE = 'INFILE' ) INTEGER OLEVEL, OUTSUM, OUTTUN, OUTRUN, OUTDET, > LINENO, LINE0 PARAMETER ( OUTSUM = 1, OUTTUN = 2, OUTRUN = 3, > OUTDET = 4 ) CHARACTER*78 MBUF * * iunit unit number for input file * ounit unit number for output * ounitf unit number for output file * ifile name of input file * ofile name of output file * olevel level of output * olevel = outsum : only summary for all the runs * = outtun : short summaries for tuning * = outrun : summary for each run * = outdet : detailed output for each run * lineno number of current input line * line0 first input line corresponding to the current run * mbuf buffer for messages * * --- for statistics --- * INTEGER SYTRD, ORGTR, SBTRD, SYRDB, SYGTR, SBRDB, > SBRDT, SY2BC, SY2BI, SB2BC, SB2BI, SYRDD, > SBRDD, TOTAL PARAMETER ( SYTRD = 1, ORGTR = 2, SBTRD = 3, > SYRDB = 4, SYGTR = 5, SBRDB = 6, > SBRDT = 7, SY2BC = 8, SY2BI = 9, > SB2BC = 10, SB2BI = 11, SYRDD = 12, > SBRDD = 13, TOTAL = 14 ) INTEGER TRY( TOTAL ), SKIP( TOTAL ), FAIL( TOTAL ) CHARACTER*6 PRBLMN( TOTAL ) CHARACTER*40 COMMNT( TOTAL ) * * sytrd tests for dsytrd (full -> tridiagonal, LAPACK) * orgtr tests for dorgtr (backward accumulation, LAPACK) * sbtrd tests for dsbtrd (banded -> tridiagonal, LAPACK) * syrdb tests for dsyrdb (full -> banded, SBR) * sygtr tests for dsygtr (backward accumulation, SBR) * sbrdb tests for dsbrdb (banded -> banded, SBR) * sbrdt tests for dsbrdt (banded -> tridiagonal, SBR) * sy2bc tests for dsy2bc (full -> banded copy, SBR) * sy2bi tests for dsy2bi (full -> banded repacking, SBR) * sb2bc tests for dsb2bc (banded -> banded copy, SBR) * sb2bi tests for dsb2bi (banded -> banded repacking, SBR) * syrdd tests for dsyrdd (reduction driver for full matrices, SBR) * sbrdd tests for dsbrdd (reduction driver for banded matrices, SBR) * total all tests * count counters for all tests * fail counters for failed tests * skip counters for skipped tests * prblmn names of the reduction paths (for output) * commnt comments to the reduction paths (for output) * REAL STIME, BTIME, CTIME, RTIME * * stime time before all the tests * btime time before the procedure call * ctime time for the procedure call * rtime time for a full reduction/accumulation path * * --- controlling the test runs --- * DOUBLE PRECISION EPS, NOTUSD * * eps machine epsilon * notusd (large) value for marking memory that should not be accessed * CHARACTER*5 PNAME INTEGER MAXDIM, PRBLM, N, B1, LDA1, B2, LDA2, LDU, > NSTEPS, STEP, LWORK1, LWORK2, NX1, NX2, > XINFO1, XINFO2, INFO CHARACTER MTYPE, UPLO, FRMT1, FRMT2, JOBU, JOBU0 DOUBLE PRECISION DIAM, DRPTOL INTEGER B( 100 ), NB( 100 ) * * pname name of the routine to test (without precision specifier) * maxdim maximum matrix size for the runs (runs with larger matrices * are skipped) * prblm number of the routine to test (numbering sytrd=1, etc. as * above) * mtype matrix type * mtype = 'R' : Eigenvalues are uniformly random in [ -1, 1 ). * = 'I' : ISDA-type matrix: eigenvalues are clustered * around 0 and 1. * diam diameter of the eigenvalue clusters in multiples of the * machine precision (used only for ISDA-type matrices) * uplo use upper or lower triangle of the matrix ? * n matrix dimension * frmt1 format of the matrix before the reduction ('F'ull/'B'anded) * b1 semibandwidth before the reduction * lda1 leading dimension before the reductino * frmt2 format after the reduction ('B'anded/'T'ridiagonal) * b2 semibandwidth after the reduction * lda2 leading dimension after the reduction * jobu0 accumulate the transformations in an orthogonal matrix ? * jobu accumulate in the current routine ? * ldu leading dimension of the array u * nsteps number of reduction steps (used only in the driver routines) * step number of the last step performed or tried * b intermediate bandwidths for multi-step reduction * nb blocking factors for the reduction/accumulation steps * drptol threshold for skipping ransformations * lwork1 length of workspace for the reduction * lwork2 length of workspace for backward accumulation * nx1 cross-over point for LAPACK tridiagonalization dsytrd * nx2 cross-over point for LAPACK backward accumulation dorgtr * xinfo1 error code expected from the reduction routine * xinfo2 error code expected from backward accumulation * info actual error code returned from the routines * CHARACTER CHECK DOUBLE PRECISION ORTHU, SORTHU, TORTHU, RES, SRES, TRES, > DEVLS, SDEVLS, TDEVLS LOGICAL CHECKS, ERRCHK, OK INTEGER NUSED * * check is result checking required ? ('C'check/'N'oCheck) * checks are checks enabled ? * orthu ortogonality error, i.e., (Frobenius) norm of U' * U - I * sorthu = orthu / ( n * eps ), the scaled orthogonality error * torthu threshold on sorthu for accepting the run * res residual, i.e., (Frobenius) norm of U * B - A * U, where * A is the original matrix and B is the reduced matrix * sres = res / ( n * eps * norm( A ) ), the scaled residual * tres threshold on sres * devls deviation of the eigenvalues, i.e., (Frobenius) norm of * spec( A ) - spec( B ), where spec( A ) and spec( B ) are * the (ascendingly sorted) eigenvalues of the original matrix * and the reduced matrix, respectively * sdevls = devls / ( n * eps * norm( A ) ), the scaled deviation * tdevls threshold on devls * errchk was it a check for error exit ? * ok did the numerical checks meet the thresholds ? * nused number of workspace elements that were modified * INTEGER I * * Routines called: * REAL SECOND DOUBLE PRECISION D1MACH LOGICAL LSAME, LXSAME EXTERNAL SECOND, D1MACH, LSAME, LXSAME * * dsecnd timer (LAPACK) * dlamch determine machine parameters (LAPACK) * lsame case-insensitive character-matching (BLAS) * lxsame case-insensitive string matching (this file) * EXTERNAL DLACPY, DORGTX, DSB2BC, DSB2BI, DSBRDB, > DSBRDD, DSBRDT, DSBTRX, DSY2BC, DSY2BI, > DSYGTR, DSYINI, DSYNCK, DSYRDB, DSYRDD, > DSYTRX * * dlacpy copy matrix (LAPACK) * dorgtx backward accumulation of transformations (LAPACK, modified) * dsb2bc banded -> banded copy (SBR) * dsb2bi banded -> banded repacking (SBR) * dsbrdb banded -> banded reduction (SBR) * dsbrdd reduction driver for banded matrices (SBR) * dsbrdt banded -> tridiagonal reduction (SBR) * dsbtrx banded -> tridiagonal reduction (LAPACK, modified) * dsy2bc full -> banded copy (SBR) * dsy2bi full -> banded repacking (SBR) * dsygtr backward accumulation of transformations (SBR) * dsyini initialize symmetric (full or banded) matrix * dsynck numerical checks for the reduction * dsyrdb full -> banded reduction (SBR) * dsyrdd reduction driver for full matrices (SBR) * dsytrx full -> tridiagonal reduction (LAPACK, modified) * INTRINSIC MAX, MIN * * --- names and explanations for the test paths --- * DATA > PRBLMN( SYTRD )/'dsytrd'/, > COMMNT( SYTRD )/'full -> tridiagonal, one-step (LAPACK)'/, > PRBLMN( ORGTR )/'dorgtr'/, > COMMNT( ORGTR )/'accumulation of transformations (LAPACK)'/, > PRBLMN( SBTRD )/'dsbtrd'/, > COMMNT( SBTRD )/'banded -> tridiagonal, one-step (LAPACK)'/ DATA > PRBLMN( SYRDB )/'dsyrdb'/, > COMMNT( SYRDB )/'full -> banded, one-step (SBR)'/, > PRBLMN( SYGTR )/'dsygtr'/, > COMMNT( SYGTR )/'accumulation of transformations (SBR)'/, > PRBLMN( SBRDB )/'dsbrdb'/, > COMMNT( SBRDB )/'banded -> banded, one-step (SBR)'/, > PRBLMN( SBRDT )/'dsbrdt'/, > COMMNT( SBRDT )/'banded -> tridiagonal, one-step (SBR)'/ DATA > PRBLMN( SY2BC )/'dsy2bc'/, > COMMNT( SY2BC )/'copy full -> banded (SBR)'/, > PRBLMN( SY2BI )/'dsy2bi'/, > COMMNT( SY2BI )/'in-place copy full -> banded (SBR)'/, > PRBLMN( SB2BC )/'dsb2bc'/, > COMMNT( SB2BC )/'copy banded -> banded (SBR)'/, > PRBLMN( SB2BI )/'dsb2bi'/, > COMMNT( SB2BI )/'in-place copy banded -> banded (SBR)'/ DATA > PRBLMN( SYRDD )/'dsyrdd'/, > COMMNT( SYRDD )/'reduction driver for full matrices (SBR)'/, > PRBLMN( SBRDD )/'dsbrdd'/, > COMMNT( SBRDD )/'reduction driver for banded matrcs (SBR)'/, > PRBLMN( TOTAL )/'Total '/, > COMMNT( TOTAL )/' '/ * * ---------------------------------------------------------------------- * STIME = SECOND() * * --- initialize --- * DO 1000 I = 1, TOTAL TRY( I ) = 0 SKIP( I ) = 0 FAIL( I ) = 0 1000 CONTINUE * * EPS = DLAMCH( 'Epsilon' ) * NOTUSD = ONE / DLAMCH( 'SafeMinimum' ) EPS = D1MACH(4) NOTUSD = ONE /(D1MACH(1)*(ONE+EPS)) * * --- open input and output files --- * * OPEN( UNIT=IUNIT, FILE=IFILE ) LINENO = 0 * IUNIT = I1MACH(1) OUNIT = I1MACH(2) OLEVEL = OUTSUM MAXDIM = NMAX CHECKS = .TRUE. * 2000 CONTINUE * * --- read next line from input file --- * LINENO = LINENO + 1 LINE0 = LINENO READ( IUNIT, * ) PNAME * WRITE( *, * ) LINE0 * * --- if comment line then just skip it --- * IF ( LSAME( PNAME( 1:1 ), 'Comment' ) ) THEN GOTO 2000 * * --- filename for output file ? --- * ELSEIF ( LSAME( PNAME( 1:1 ), 'FileName' ) ) THEN LINENO = LINENO + 1 READ( IUNIT, * ) OFILE( 2:8 ) OFILE( 1:1 ) = 'DoublePrec' OUNIT = OUNITF OPEN( UNIT=OUNIT, FILE=OFILE ) GOTO 2000 * * --- set output level ? --- * ELSEIF ( LSAME( PNAME( 1:1 ), 'OutputLevel' ) ) THEN LINENO = LINENO + 1 READ( IUNIT, * ) I IF ( ( I .LT. OUTSUM ) .OR. ( I .GT. OUTDET ) ) THEN WRITE( OUNIT, 9300 ) LINENO, 'Output level out of range' ELSE OLEVEL = I ENDIF GOTO 2000 * * --- message to print --- * ELSEIF ( LSAME( PNAME( 1:1 ), 'Print' ) ) THEN LINENO = LINENO + 1 READ( IUNIT, * ) MBUF WRITE( OUNIT, 9100 ) MBUF GOTO 2000 * * --- maximum matrix size --- * ELSEIF ( LSAME( PNAME( 1:1 ), 'MaxDim' ) ) THEN LINENO = LINENO + 1 READ( IUNIT, * ) MAXDIM GOTO 2000 * * --- disable checks ? --- * ELSEIF ( LSAME( PNAME( 1:1 ), 'NoChecks' ) ) THEN CHECKS = .FALSE. GOTO 2000 * * --- test run ? * If so then read and set parameters for the run --- * ELSEIF ( LXSAME( PNAME, 'SYTRD' ) ) THEN * * --- LAPACK reduction full -> tridiagonal --- * PRBLM = SYTRD READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, LDA1, NB( 1 ), NX1, > LWORK1, XINFO1, JOBU, NB( 2 ), NX2, LWORK2, > XINFO2 FRMT1 = 'Full' B1 = MAX( N-1, 0 ) FRMT2 = 'Tridiagonal' B2 = 1 LDA2 = B2 + 1 LDU = N ELSEIF ( LXSAME( PNAME, 'SBTRD' ) ) THEN * * --- LAPACK reduction banded -> tridiagonal --- * PRBLM = SBTRD READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, B1, LDA1, JOBU, LDU, > XINFO1 FRMT1 = 'Banded' FRMT2 = 'Tridiagonal' B2 = 1 LDA2 = B2 + 1 LWORK1 = N ELSEIF ( LXSAME( PNAME, 'SYRDB' ) ) THEN * * --- SBR reduction full -> banded --- * PRBLM = SYRDB READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, LDA1, B2, DRPTOL, > NB( 1 ), LWORK1, XINFO1 LINENO = LINENO + 1 READ( IUNIT, * ) JOBU0, LDU, LWORK2, XINFO2 FRMT1 = 'Full' B1 = MAX( N-1, 0 ) DRPTOL = DRPTOL * EPS FRMT2 = 'Banded' LDA2 = B2 + 1 IF ( LSAME( JOBU0, 'OnFly' ) ) THEN JOBU = 'Update' ELSEIF ( LSAME( JOBU0, 'Update' ) ) THEN JOBU = 'NoU' ELSE JOBU = JOBU0 ENDIF ELSEIF ( LXSAME( PNAME, 'SBRDB' ) ) THEN * * --- SBR reduction banded -> banded --- * PRBLM = SBRDB READ( IUNIT, * ) MTYPE, DIAM, N, B1, LDA1, B2, DRPTOL, > NB( 1 ), JOBU, LDU, LWORK1, XINFO1 FRMT1 = 'Banded' UPLO = 'Lower' DRPTOL = DRPTOL * EPS FRMT2 = 'Banded' LDA2 = B2 + 1 ELSEIF ( LXSAME( PNAME, 'SBRDT' ) ) THEN * * --- SBR reduction banded -> tridiagonal --- * PRBLM = SBRDT READ( IUNIT, * ) MTYPE, DIAM, N, B1, LDA1, DRPTOL, NB( 1 ), > JOBU, LDU, LWORK1, XINFO1 FRMT1 = 'Banded' UPLO = 'Lower' DRPTOL = DRPTOL * EPS FRMT2 = 'Tridiagonal' B2 = 1 LDA2 = B2 + 1 ELSEIF ( LXSAME( PNAME, 'SY2BC' ) ) THEN * * --- SBR copy full -> banded --- * PRBLM = SY2BC READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, B1, LDA1, LDA2, > XINFO1 FRMT1 = 'Full' FRMT2 = 'Banded' B2 = B1 LWORK1 = 0 JOBU = 'NoU' LDU = N ELSEIF ( LXSAME( PNAME, 'SY2BI' ) ) THEN * * --- SBR in-place copy full -> banded --- * PRBLM = SY2BI READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, B1, LDA1, LDA2, > XINFO1 FRMT1 = 'Full' FRMT2 = 'Banded' B2 = B1 LWORK1 = 0 JOBU = 'NoU' LDU = N ELSEIF ( LXSAME( PNAME, 'SB2BC' ) ) THEN * * --- SBR copy banded -> banded --- * PRBLM = SB2BC READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, B1, LDA1, LDA2, > XINFO1 FRMT1 = 'Banded' FRMT2 = 'Banded' B2 = B1 LWORK1 = 0 JOBU = 'NoU' LDU = N ELSEIF ( LXSAME( PNAME, 'SB2BI' ) ) THEN * * --- SBR in-place copy full -> banded --- * PRBLM = SB2BI READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, B1, LDA1, LDA2, > XINFO1 FRMT1 = 'Banded' FRMT2 = 'Banded' B2 = B1 LWORK1 = 0 JOBU = 'NoU' LDU = N ELSEIF ( LXSAME( PNAME, 'SYRDD' ) ) THEN * * --- SBR driver for full matrices --- * PRBLM = SYRDD READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, LDA1, B2, LDA2, > NSTEPS, DRPTOL, JOBU, LWORK1, XINFO1 FRMT1 = 'Full' B1 = MAX( N-1, 0 ) DRPTOL = DRPTOL * EPS IF ( B2 .EQ. 1 ) THEN FRMT2 = 'Tridiagonal' ELSE FRMT2 = 'Banded' ENDIF LDU = N IF ( NSTEPS .GT. 1 ) THEN LINENO = LINENO + 1 READ( IUNIT, * ) ( B( I ), I = 1, NSTEPS-1 ) ENDIF IF ( NSTEPS .GT. 0 ) THEN LINENO = LINENO + 1 READ( IUNIT, * ) ( NB( I ), I = 1, NSTEPS ) ENDIF ELSEIF ( LXSAME( PNAME, 'SBRDD' ) ) THEN * * --- SBR driver for banded matrices --- * PRBLM = SBRDD READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, B1, LDA1, B2, NSTEPS, > DRPTOL, JOBU, LDU, LWORK1, XINFO1 FRMT1 = 'Banded' DRPTOL = DRPTOL * EPS IF ( B2 .EQ. 1 ) THEN FRMT2 = 'Tridiagonal' ELSE FRMT2 = 'Banded' ENDIF LDA2 = B2 + 1 IF ( NSTEPS .GT. 1 ) THEN LINENO = LINENO + 1 READ( IUNIT, * ) ( B( I ), I = 1, NSTEPS-1 ) ENDIF IF ( NSTEPS .GT. 0 ) THEN LINENO = LINENO + 1 READ( IUNIT, * ) ( NB( I ), I = 1, NSTEPS ) ENDIF * * --- done ? --- * ELSEIF ( LSAME( PNAME( 1:1 ), 'Quit' ) ) THEN GOTO 8000 ELSE WRITE( OUNIT, 9300 ) LINENO, 'Command not recognized' GOTO 2000 ENDIF * * - - - - - - - - if we get here then a test run is required - - - - - * LINENO = LINENO + 2 READ ( IUNIT, * ) CHECK, TORTHU, TRES, TDEVLS ERRCHK = .FALSE. * TRY( PRBLM ) = TRY( PRBLM ) + 1 * * --- is the problem too large ? --- * IF ( N .GT. MAXDIM ) THEN SKIP( PRBLM ) = SKIP( PRBLM ) + 1 WRITE( OUNIT, 9310 ) LINE0 GOTO 2000 ENDIF * * --- initialize matrices --- * INFO = 0 BTIME = SECOND() CALL DSYINI( MTYPE, EVLS, NMAX, DIAM, > FRMT1, UPLO, N, B1, A, LDA1, SZA, > JOBU, U, LDU, SZU, > NOTUSD, WORK, SZWORK, INFO ) CTIME = SECOND() - BTIME * * --- protocol output, if required --- * IF ( OLEVEL .GE. OUTDET ) THEN WRITE( OUNIT, 9500 ) MTYPE, NMAX, DIAM, FRMT1, UPLO, N WRITE( OUNIT, 9501 ) B1, LDA1, SZA, JOBU, LDU, SZU WRITE( OUNIT, 9502 ) NOTUSD, SZWORK WRITE( OUNIT, 9400 ) INFO, CTIME ENDIF * IF ( ( INFO .EQ. -3 ) .OR. ( INFO .EQ. -11 ) .OR. > ( INFO .EQ. -15 ) .OR. ( INFO .EQ. -18 ) ) THEN * * --- test problem is too large : skip --- * SKIP( PRBLM ) = SKIP( PRBLM ) + 1 WRITE( OUNIT, 9310 ) LINE0 GOTO 3000 ENDIF * * --- mark workspace "unused" --- * DO 2100 I = 1, MIN( MAX( 2*LWORK1, 10000 ), SZWORK ) WORK( I ) = NOTUSD 2100 CONTINUE * * - - - - - - - - do the reduction / repacking - - - - - - - - - - - - * INFO = 0 BTIME = SECOND() IF ( PRBLM .EQ. SYTRD ) THEN CALL DSYTRX( NB( 1 ), NX1, UPLO, N, A, LDA1, D, E, > TAU, WORK, LWORK1, INFO ) ELSEIF ( PRBLM .EQ. SBTRD ) THEN CALL DSBTRX( JOBU, UPLO, N, B1, A, LDA1, D, E, > U, LDU, WORK, INFO ) ELSEIF ( PRBLM .EQ. SYRDB ) THEN CALL DSYRDB( UPLO, JOBU, N, B2, A, LDA1, DRPTOL, > U, LDU, NB( 1 ), TAU, WORK, LWORK1, INFO ) ELSEIF ( PRBLM .EQ. SBRDB ) THEN CALL DSBRDB( JOBU, N, B1, B2, A, LDA1, DRPTOL, > U, LDU, NB( 1 ), WORK, LWORK1, INFO ) ELSEIF ( PRBLM .EQ. SBRDT ) THEN CALL DSBRDT( JOBU, N, B1, A, LDA1, DRPTOL, D, E, > U, LDU, NB( 1 ), WORK, LWORK1, INFO ) ELSEIF ( PRBLM .EQ. SY2BC ) THEN CALL DSY2BC( UPLO, N, B1, A, LDA1, ACPY, LDA2, INFO ) ELSEIF ( PRBLM .EQ. SY2BI ) THEN CALL DSY2BI( UPLO, N, B1, A, LDA1, LDA2, INFO ) ELSEIF ( PRBLM .EQ. SB2BC ) THEN CALL DSB2BC( UPLO, N, B1, A, LDA1, ACPY, LDA2, INFO ) ELSEIF ( PRBLM .EQ. SB2BI ) THEN CALL DSB2BI( UPLO, N, B1, A, LDA1, LDA2, INFO ) ELSEIF ( PRBLM .EQ. SYRDD ) THEN CALL DSYRDD( JOBU, UPLO, N, B2, A, LDA1, DRPTOL, > ACPY, LDA2, D, E, NSTEPS, B, NB, > WORK, LWORK1, STEP, INFO ) ELSEIF ( PRBLM .EQ. SBRDD ) THEN CALL DSBRDD( JOBU, UPLO, N, B1, B2, A, LDA1, DRPTOL, > D, E, U, LDU, NSTEPS, B, NB, > WORK, LWORK1, STEP, INFO ) ENDIF CTIME = SECOND() - BTIME RTIME = CTIME * * --- protocol output, if required --- * IF ( OLEVEL .GE. OUTDET ) THEN IF ( PRBLM .EQ. SYTRD ) THEN WRITE( OUNIT, 9510 ) UPLO, N, LDA1, NB( 1 ), NX1, LWORK1 WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SBTRD ) THEN WRITE( OUNIT, 9520 ) JOBU, UPLO, N, B1, LDA1, LDU WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SYRDB ) THEN WRITE( OUNIT, 9530 ) UPLO, JOBU, N, B2, LDA1, DRPTOL WRITE( OUNIT, 9531 ) LDU, NB( 1 ), LWORK1 WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SBRDB ) THEN WRITE( OUNIT, 9540 ) JOBU, N, B1, B2, LDA1, DRPTOL WRITE( OUNIT, 9531 ) LDU, NB( 1 ), LWORK1 WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SBRDT ) THEN WRITE( OUNIT, 9550 ) JOBU, N, B1, LDA1, DRPTOL WRITE( OUNIT, 9531 ) LDU, NB( 1 ), LWORK1 WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SY2BC ) THEN WRITE( OUNIT, 9560 ) UPLO, N, B1, LDA1, LDA2 WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SY2BI ) THEN WRITE( OUNIT, 9570 ) UPLO, N, B1, LDA1, LDA2 WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SB2BC ) THEN WRITE( OUNIT, 9580 ) UPLO, N, B1, LDA1, LDA2 WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SB2BI ) THEN WRITE( OUNIT, 9590 ) UPLO, N, B1, LDA1, LDA2 WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SYRDD ) THEN WRITE( OUNIT, 9600 ) JOBU, UPLO, N, B2, LDA1 WRITE( OUNIT, 9601 ) DRPTOL, LDA2, NSTEPS, LWORK1 WRITE( OUNIT, 9401 ) STEP, INFO, CTIME ELSEIF ( PRBLM .EQ. SBRDD ) THEN WRITE( OUNIT, 9610 ) JOBU, UPLO, N, B1, B2, LDA1 WRITE( OUNIT, 9611 ) DRPTOL, LDU, NSTEPS, LWORK1 WRITE( OUNIT, 9401 ) STEP, INFO, CTIME ENDIF ELSEIF ( OLEVEL .EQ. OUTTUN ) THEN IF ( PRBLM .EQ. SYTRD ) THEN WRITE( OUNIT, 9515 ) UPLO, N, NB( 1 ), INFO, CTIME ELSEIF ( PRBLM .EQ. SBTRD ) THEN WRITE( OUNIT, 9525 ) UPLO, JOBU, N, B1, INFO, CTIME ELSEIF ( PRBLM .EQ. SYRDB ) THEN WRITE( OUNIT, 9535 ) UPLO, JOBU, N, B2, NB( 1 ), INFO, > CTIME ELSEIF ( PRBLM .EQ. SBRDB ) THEN WRITE( OUNIT, 9545 ) JOBU, N, B1, B2, NB( 1 ), INFO, CTIME ELSEIF ( PRBLM .EQ. SBRDT ) THEN WRITE( OUNIT, 9555 ) JOBU, N, B1, NB( 1 ), INFO, CTIME ELSEIF ( PRBLM .EQ. SYRDD ) THEN WRITE( OUNIT, 9605 ) UPLO, JOBU, N, B2, NSTEPS, STEP, > INFO, CTIME ELSEIF ( PRBLM .EQ. SBRDD ) THEN WRITE( OUNIT, 9615 ) UPLO, JOBU, N, B1, B2, NSTEPS, STEP, > INFO, CTIME ENDIF ENDIF * * - - - - - - - - check if the error code is as expected - - - - - - - * IF ( INFO .NE. XINFO1 ) THEN * * --- wrong error code --- * FAIL( PRBLM ) = FAIL( PRBLM ) + 1 IF ( ( PRBLM .EQ. SYRDD ) .OR. ( PRBLM .EQ. SBRDD ) ) THEN WRITE( OUNIT, 9900 ) LINE0, PRBLMN( PRBLM ), INFO, STEP, > XINFO1 ELSE WRITE( OUNIT, 9901 ) LINE0, PRBLMN( PRBLM ), INFO, XINFO1 ENDIF GOTO 3000 ELSEIF ( ( ( PRBLM .EQ. SYRDD ) .OR. ( PRBLM .EQ. SBRDD ) ) > .AND. ( INFO .EQ. 1 ) .AND. ( NSTEPS .GT. 0 ) > .AND. ( STEP .NE. NSTEPS ) ) THEN * * --- error code was ok, but the driver took a wrong * number of steps --- * FAIL( PRBLM ) = FAIL( PRBLM ) + 1 WRITE( OUNIT, 9910 ) LINE0, PRBLMN( PRBLM ), STEP, > NSTEPS GOTO 3000 ELSEIF ( INFO .LT. 0 ) THEN * * --- successful error exit --- * ERRCHK = .TRUE. GOTO 3000 ENDIF * * - - - - - - - - check workspace usage - - - - - - - - - - - - - - - - * NUSED = 0 DO 2200 I = 1, MIN( MAX( 2*LWORK1, 10000 ), SZWORK ) IF ( .NOT. ( WORK( I ) .EQ. NOTUSD ) ) NUSED = I 2200 CONTINUE * IF ( NUSED .GT. LWORK1 ) THEN * * --- ran over the workspace bounds --- * FAIL( PRBLM ) = FAIL( PRBLM ) + 1 WRITE( OUNIT, 9920 ) LINE0, PRBLMN( PRBLM ), NUSED, LWORK1 GOTO 3000 ELSEIF ( OLEVEL .GE. OUTDET ) THEN * * --- write protocol --- * WRITE( OUNIT, 9410 ) NUSED, LWORK1 ENDIF * * - - - - - - - - accumulate transformations, if required - - - - - - - * IF ( ( PRBLM .EQ. SYTRD ) .AND. LSAME( JOBU, 'Update' ) ) THEN * * --- copy the Householder vectors into the array u --- * CALL DLACPY( UPLO, N, N, A, LDA1, U, LDU ) * * --- backward accumulation --- * TRY( ORGTR ) = TRY( ORGTR ) + 1 INFO = 0 BTIME = SECOND() CALL DORGTX( NB( 2 ), NX2, UPLO, N, U, LDU, TAU, > WORK, LWORK2, INFO ) CTIME = SECOND() - BTIME RTIME = RTIME + CTIME * * --- protocol output, if required --- * IF ( OLEVEL .GE. OUTDET ) THEN WRITE( OUNIT, 9620 ) UPLO, N, LDU, NB( 2 ), NX2, LWORK2 WRITE( OUNIT, 9400 ) INFO, CTIME ENDIF * * --- is the error code as expected ? --- * IF ( INFO .NE. XINFO2 ) THEN FAIL( ORGTR ) = FAIL( ORGTR ) + 1 WRITE( OUNIT, 9901 ) LINE0, 'dorgtr', INFO, XINFO2 GOTO 3000 ELSEIF ( INFO .NE. 0 ) THEN ERRCHK = .TRUE. GOTO 3000 ENDIF * ELSEIF ( ( PRBLM .EQ. SYRDB ) .AND. LSAME( JOBU0, 'Update' ) ) > THEN * * --- copy the Householder vectors into the array u --- * CALL DLACPY( UPLO, N, N, A, LDA1, U, LDU ) * * --- backward accumulation --- * TRY( SYGTR ) = TRY( SYGTR ) + 1 INFO = 0 BTIME = SECOND() CALL DSYGTR( UPLO, N, B2, U, LDU, TAU, WORK, LWORK2, INFO ) CTIME = SECOND() - BTIME RTIME = RTIME + CTIME * * --- protocol output, if required --- * IF ( OLEVEL .GE. OUTDET ) THEN WRITE( OUNIT, 9630 ) UPLO, N, B2, LDU, LWORK2 WRITE( OUNIT, 9400 ) INFO, CTIME ENDIF * * --- is the error code as expected ? --- * IF ( INFO .NE. XINFO2 ) THEN FAIL( SYGTR ) = FAIL( SYGTR ) + 1 WRITE( OUNIT, 9901 ) LINE0, 'dsygtr', INFO, XINFO2 GOTO 3000 ELSEIF ( INFO .NE. 1 ) THEN GOTO 3000 ENDIF ENDIF * * - - - - - - - - check results - - - - - - - - - - - - - - - - - - - - * ORTHU = -ONE SORTHU = -ONE RES = -ONE SRES = -ONE DEVLS = -ONE SDEVLS = -ONE * IF ( ( .NOT. ERRCHK ) .AND. > CHECKS .AND. LSAME( CHECK, 'Check' ) ) THEN OK = .TRUE. * * --- if the reduced matrix is banded then copy it * into the array acpy --- * IF ( PRBLM .EQ. SYRDB ) THEN INFO = 0 BTIME = SECOND() CALL DSY2BC( UPLO, N, B2, A, LDA1, ACPY, LDA2, INFO ) CTIME = SECOND() - BTIME IF ( OLEVEL .GE. OUTDET ) THEN WRITE( OUNIT, 9560 ) UPLO, N, B2, LDA1, LDA2 WRITE( OUNIT, 9400 ) INFO, CTIME ENDIF IF ( LSAME( JOBU0, 'Update' ) ) JOBU = 'Update' ELSEIF ( ( PRBLM .EQ. SBRDB ) .OR. > ( ( PRBLM .EQ. SBRDD ) .AND. ( B2 .GT. 1 ) ) ) THEN INFO = 0 BTIME = SECOND() CALL DSB2BC( 'Lower', N, B2, A, LDA1, ACPY, LDA2, INFO ) CTIME = SECOND() - BTIME IF ( OLEVEL .GE. OUTDET ) THEN WRITE( OUNIT, 9580 ) 'Lower', N, B2, LDA1, LDA2 WRITE( OUNIT, 9400 ) INFO, CTIME ENDIF ELSEIF ( ( PRBLM .EQ. SY2BI ) .OR. ( PRBLM .EQ. SB2BI ) ) > THEN INFO = 0 BTIME = SECOND() CALL DSB2BC( 'Lower', N, B2, A, LDA2, ACPY, LDA2, INFO ) CTIME = SECOND() - BTIME IF ( OLEVEL .GE. OUTDET ) THEN WRITE( OUNIT, 9580 ) UPLO, N, B2, LDA2, LDA2 WRITE( OUNIT, 9400 ) INFO, CTIME ENDIF ELSEIF ( PRBLM .EQ. SYRDD ) THEN * * --- copy orthogonal matrix into u --- * CALL DLACPY( 'Full', N, N, A, LDA1, U, LDU ) ENDIF * * --- perform numerical checks --- * INFO = 0 BTIME = SECOND() CALL DSYNCK( EVLS, FRMT1, UPLO, N, B1, A, LDA1, SZA, > FRMT2, B2, ACPY, LDA2, D, E, JOBU, U, LDU, > ORTHU, SORTHU, RES, SRES, DEVLS, SDEVLS, > NOTUSD, WORK, SZWORK, INFO ) CTIME = SECOND() - BTIME * * --- protocol output, if required --- * IF ( OLEVEL .GE. OUTDET ) THEN WRITE( OUNIT, 9640 ) FRMT1, UPLO, N, B1, LDA1, SZA WRITE( OUNIT, 9641 ) FRMT2, B2, LDA2, JOBU, LDU WRITE( OUNIT, 9642 ) ORTHU, SORTHU WRITE( OUNIT, 9643 ) RES, SRES WRITE( OUNIT, 9644 ) DEVLS, SDEVLS WRITE( OUNIT, 9645 ) NOTUSD, SZWORK WRITE( OUNIT, 9400 ) INFO, CTIME ENDIF * * --- failed any computational check ? --- * IF ( .NOT. ( SORTHU .LE. TORTHU ) ) THEN WRITE( OUNIT, 9930 ) LINE0, 'orhogonality', SORTHU, TORTHU OK = .FALSE. ENDIF IF ( .NOT. ( SRES .LE. TRES ) ) THEN WRITE( OUNIT, 9930 ) LINE0, 'residual', SRES, TRES OK = .FALSE. ENDIF IF ( .NOT. ( SDEVLS .LE. TDEVLS ) ) THEN WRITE( OUNIT, 9930 ) LINE0, 'eigenvalues', SDEVLS, TDEVLS OK = .FALSE. ENDIF IF ( .NOT. OK ) FAIL( PRBLM ) = FAIL( PRBLM ) + 1 ENDIF * * - - - - - - - - print summary for this run - - - - - - - - - - - - - * 3000 IF ( OLEVEL .GE. OUTRUN ) THEN WRITE( OUNIT, 9700 ) LINE0, PRBLMN( PRBLM ), COMMNT( PRBLM ) * IF ( PRBLM .EQ. SYTRD ) THEN WRITE( OUNIT, 9710 ) MTYPE, DIAM, UPLO, N, LDA1 WRITE( OUNIT, 9711 ) NB( 1 ), NX1, LWORK1, XINFO1 WRITE( OUNIT, 9712 ) JOBU, NB( 2 ), NX2, LWORK2, XINFO2 ELSEIF ( PRBLM .EQ. SBTRD ) THEN WRITE( OUNIT, 9720 ) MTYPE, DIAM, UPLO, N, B1, LDA1 WRITE( OUNIT, 9721 ) JOBU, LDU, XINFO1 ELSEIF ( PRBLM .EQ. SYRDB ) THEN WRITE( OUNIT, 9730 ) MTYPE, DIAM, UPLO, N, LDA1, B2 WRITE( OUNIT, 9731 ) DRPTOL, NB( 1 ), LWORK1, XINFO1 WRITE( OUNIT, 9732 ) JOBU, LDU, LWORK2, XINFO2 ELSEIF ( PRBLM .EQ. SBRDB ) THEN WRITE( OUNIT, 9740 ) MTYPE, DIAM, N, B1, LDA1, B2 WRITE( OUNIT, 9741 ) DRPTOL, NB( 1 ), JOBU, LDU, LWORK1 WRITE( OUNIT, 9742 ) XINFO1 ELSEIF ( PRBLM .EQ. SBRDT ) THEN WRITE( OUNIT, 9750 ) MTYPE, DIAM, N, B1, LDA1 WRITE( OUNIT, 9741 ) DRPTOL, NB( 1 ), JOBU, LDU, LWORK1 WRITE( OUNIT, 9742 ) XINFO1 ELSEIF ( ( PRBLM .EQ. SY2BC ) > .OR. ( PRBLM .EQ. SY2BI ) > .OR. ( PRBLM .EQ. SB2BC ) > .OR. ( PRBLM .EQ. SB2BI ) ) THEN WRITE( OUNIT, 9760 ) MTYPE, DIAM, UPLO, N, B1, LDA1 WRITE( OUNIT, 9761 ) LDA2, XINFO1 ELSEIF ( PRBLM .EQ. SYRDD ) THEN WRITE( OUNIT, 9770 ) MTYPE, DIAM, UPLO, N, LDA1, B2 WRITE( OUNIT, 9771 ) LDA2, NSTEPS, DRPTOL, JOBU, LWORK1 WRITE( OUNIT, 9742 ) XINFO1 IF ( NSTEPS .GT. 1 ) THEN WRITE( OUNIT, 9772 ) ( B( I ), I = 1, NSTEPS-1 ) ENDIF IF ( NSTEPS .GT. 0 ) THEN WRITE( OUNIT, 9773 ) ( NB( I ), I = 1, NSTEPS ) ENDIF ELSEIF ( PRBLM .EQ. SBRDD ) THEN WRITE( OUNIT, 9780 ) MTYPE, DIAM, UPLO, N, B1, LDA1, B2 WRITE( OUNIT, 9781 ) NSTEPS, DRPTOL, JOBU, LDU WRITE( OUNIT, 9782 ) LWORK1, XINFO1 IF ( NSTEPS .GT. 1 ) THEN WRITE( OUNIT, 9772 ) ( B( I ), I = 1, NSTEPS-1 ) ENDIF IF ( NSTEPS .GT. 0 ) THEN WRITE( OUNIT, 9773 ) ( NB( I ), I = 1, NSTEPS ) ENDIF ENDIF * * --- print available information on numerical checks --- * IF ( ERRCHK ) THEN WRITE( OUNIT, 9420 ) ELSE IF ( .NOT. ( SORTHU .EQ. -ONE ) ) THEN WRITE( OUNIT, 9430 ) ORTHU, SORTHU, TORTHU ENDIF IF ( .NOT. ( SRES .EQ. -ONE ) ) THEN WRITE( OUNIT, 9431 ) RES, SRES, TRES ENDIF IF ( .NOT. ( SDEVLS .EQ. -ONE ) ) THEN WRITE( OUNIT, 9432 ) DEVLS, SDEVLS, TDEVLS ENDIF ENDIF * WRITE( OUNIT, 9440 ) RTIME ENDIF * IF ( OLEVEL .GE. OUTDET ) WRITE( OUNIT, 9000 ) * * --- end of the main loop --- * GOTO 2000 * * - - - - - - - - print "global" summary - - - - - - - - - - - - - - - * 8000 WRITE( OUNIT, * ) WRITE( OUNIT, 9010 ) WRITE( OUNIT, 9020 ) WRITE( OUNIT, 9000 ) DO 8100 PRBLM = SYTRD, TOTAL-1 WRITE( OUNIT, 9030 ) PRBLMN( PRBLM ), COMMNT( PRBLM ), > TRY( PRBLM ), SKIP( PRBLM ), > FAIL( PRBLM ) TRY( TOTAL ) = TRY( TOTAL ) + TRY( PRBLM ) SKIP( TOTAL ) = SKIP( TOTAL ) + SKIP( PRBLM ) FAIL( TOTAL ) = FAIL( TOTAL ) + FAIL( PRBLM ) 8100 CONTINUE WRITE( OUNIT, 9000 ) WRITE( OUNIT, 9030 ) PRBLMN( TOTAL ), COMMNT( TOTAL ), > TRY( TOTAL ), SKIP( TOTAL ), FAIL( TOTAL ) WRITE( OUNIT, 9000 ) WRITE( OUNIT, 9040 ) SECOND() - STIME * * - - - - - - - - formats - - - - - - - - - - - - - - - - - - - - - - - * * --- "global" summary" --- * 9000 FORMAT( 1X, '----------------------------------------', > '---------------------------------------' ) 9010 FORMAT( 1X, '========================================', > '=======================================' ) * 9020 FORMAT( 1X, 'Tests for ', > ' Total Skipped Failed' ) 9030 FORMAT( 1X, A6, ' : ', A40, ' :', I8, I8, I8 ) * 9040 FORMAT( 1X, 'Total time : ', F8.2, ' seconds' ) * * --- messages --- * 9100 FORMAT( 1X, A ) * * --- problems with the input file --- * 9300 FORMAT( 1X, '*** Error in line ', I5, ' : ', A40 ) 9310 FORMAT( 1X, '+++ Line ', I5, ' : Test too large - skipped' ) * * --- general status reporting --- * 9400 FORMAT( 1X, ' info=', I5, ', time=', F12.6 ) 9401 FORMAT( 1X, ' step=', I5, ', info=', I5, > ', time=', F12.6 ) * 9410 FORMAT( 1X, ' used ', I8, ' out of ', > I8, ' workspace' ) * 9420 FORMAT( 1X, ' ((( check for error exit ))),' ) * 9430 FORMAT( 1X, ' Norm(U''*U-I) =', E10.3, '=', > E10.3, '*n*macheps (thresh=', E10.3, '),' ) 9431 FORMAT( 1X, ' Norm(U*B-A*U)=', E10.3, '=', > E10.3, '*n*macheps*Norm(A) (thresh=', E10.3, '),' ) 9432 FORMAT( 1X, ' Norm(Dlambda)=', E10.3, '=', > E10.3, '*n*macheps*Norm(A) (thresh=', E10.3, '),' ) * 9440 FORMAT( 1X, ' reduction time=', F12.6 ) * * --- formats for tracing single routine calls --- * 9500 FORMAT( 1X, ' dsyini: mtype=', A1, ', szevls=', I5, > ', diam=', E11.4, ', frmt=', A1, ', uplo=', A1, > ', n=', I5, ',' ) 9501 FORMAT( 1X, ' b=', I5, ', lda=', I5, ', sza=', I8, > ', jobu=', A1, ', ldu=', I5, ', szu=', I8, ',' ) 9502 FORMAT( 1X, ' notusd=', E11.4, ', szwork=', I8, ',' ) * 9510 FORMAT( 1X, ' dsytrd: uplo=', A1, ', n=', I5, ', lda=', I5, > ', nb0=', I5, ', nx0=', I5, ', lwork=', I8, ',' ) 9515 FORMAT( 1X, 'dsytrd: uplo=', A1, ', n=', I5, ', nb=', I3, > ', info=', I3, ', time=', F9.3 ) * 9520 FORMAT( 1X, ' dsbtrd: vect=', A1, ', uplo=', A1, ', n=', I5, > ', kd=', I5, ', ldab=', I5, ', ldu=', I5, ',' ) 9525 FORMAT( 1X, 'dsbtrd: uplo=', A1, ', jobu=', A1, ', n=', I5, > ', b1=', I3, ', info=', I3, ', time=', F9.3 ) * 9530 FORMAT( 1X, ' dsyrdb: uplo=', A1, ', job=', A1, ', n=', I5, > ', b=', I5, ', lda=', I5, ', drptol=', E11.4, ',' ) 9531 FORMAT( 1X, ' ldu=', I5, ', nb=', I5, ', lwork=', I8, > ',' ) 9535 FORMAT( 1X, 'dsyrdb: uplo=', A1, ', jobu=', A1, ', n=', I5, > ', b2=', I3, ', nb=', I3, ', info=', I3, > ', time=', F9.3 ) * 9540 FORMAT( 1X, ' dsbrdb: job=', A1, ', n=', I5, ', b1=', I5, > ', b2=', I5, ', lda=', I5, ', drptol=', E11.4, ',' ) 9545 FORMAT( 1X, 'dsbrdb: jobu=', A1, ', n=', I5, ', b1=', I3, > ', b2=', I3, ', nb=',I3, ', info=', I3, > ', time=', F9.3 ) * 9550 FORMAT( 1X, ' dsbrdt: job=', A1, ', n=', I5, ', b=', I5, > ', lda=', I5, ', drptol=', E11.4, ',' ) 9555 FORMAT( 1X, 'dsbrdt: jobu=', A1, ', n=', I5, ', b1=', I3, > ', nb=', I3, ', info=', I3, ', time=', F9.3 ) * 9560 FORMAT( 1X, ' dsy2bc: uplo=', A1, ', n=', I5, ', b=', I5, > ', ldfull=', I5, ', ldband=', I5, ',' ) * 9570 FORMAT( 1X, ' dsy2bi: uplo=', A1, ', n=', I5, ', b=', I5, > ', ldfull=', I5, ', ldband=', I5, ',' ) * 9580 FORMAT( 1X, ' dsb2bc: uplo=', A1, ', n=', I5, ', b=', I5, > ', ldsrc=', I5, ', lddst=', I5, ',' ) * 9590 FORMAT( 1X, ' dsb2bi: uplo=', A1, ', n=', I5, ', b=', I5, > ', ldsrc=', I5, ', lddst=', I5, ',' ) * 9600 FORMAT( 1X, ' dsyrdd: job=', A1, ', uplo=', A1, ', n=', I5, > ', b2=', I5, ', lda=', I5, ',' ) 9601 FORMAT( 1X, ' drptol=', E11.4, ', ldband=', I5, > ', nsteps=', I5, ', lwork=', I8, ',' ) 9605 FORMAT( 1X, 'dsyrdd: uplo=', A1, ', job=', A1, ', n=', I5, > ', b2=', I3, ', nsteps=', I2, ', step=', I2, > ', info=', I3, ', time=', F9.3 ) * 9610 FORMAT( 1X, ' dsbrdd: jobu=', A1, ', uplo=', A1, ', n=', I5, > ', b1=', I5, ', b2=', I5, ', lda=', I5, ',' ) 9611 FORMAT( 1X, ' drptol=', E11.4, ', ldu=', I5, > ', nsteps=', I5, ', lwork=', I8, ',' ) 9615 FORMAT( 1X, 'dsbrdd: uplo=', A1, ', jobu=', A1, ', n=', I5, > ', b1=', I3, ', b2=', I3, ', nsteps=', I2, > ', step=', I2, ', info=', I3, ', time=', F9.3 ) * 9620 FORMAT( 1X, ' dorgtr: uplo=', A1, ', n=', I5, ', lda=', I5, > ', nb=', I5, ', nx=', I5, ', lwork=', I8, ',' ) * 9630 FORMAT( 1X, ' dsygtr: uplo=', A1, ', n=', I5, ', b=', I5, > ', lda=', I5, ', lwork=', I8, ',' ) * 9640 FORMAT( 1X, ' dsynck: frmt1=', A1, ', uplo1=', A1, ', n=', I5, > ', b1=', I5, ', lda1=', I5, ', sza1=', I8, ',' ) 9641 FORMAT( 1X, ' frmt2=', A1, ', b2=', I5, ', lda2=', I5, > ', jobu=', A1, ', ldu=', I5, ',' ) 9642 FORMAT( 1X, ' Norm( U''*U - I ) =', E11.4, > ' = ', E11.4, '*n*macheps,' ) 9643 FORMAT( 1X, ' Norm( U*B - A*U )=', E11.4, > ' = ', E11.4, '*n*macheps*Norm( A ),' ) 9644 FORMAT( 1X, ' Norm( Dlambda ) =', E11.4, > ' = ', E11.4, '*n*macheps*Norm( A ),' ) 9645 FORMAT( 1X, ' notusd=', E11.4, ', szwork=', I8, ',' ) * * --- formats for tracing single runs --- * 9700 FORMAT( 1X, 'Line ', I5, ' / ', A, ' : ', A, ',' ) * 9710 FORMAT( 1X, ' mtype=', A1, ', diam=', E11.4, > ', uplo=', A1, ', n=', I5, ', lda=', I5, ',' ) 9711 FORMAT( 1X, ' nb1=', I5, ', nx1=', I5, ', lwork1=', I8, > ', xinfo1=', I5, ',' ) 9712 FORMAT( 1X, ' jobu=', A1, ', nb2=', I5, ', nx2=', I5, > ', lwork2=', I8, ', xinfo2=', I5, ',' ) * 9720 FORMAT( 1X, ' mtype=', A1, ', diam=', E11.4, ', uplo=', A1, > ', n=', I5, ', b1=', I5, ', lda=', I5, ',' ) 9721 FORMAT( 1X, ' jobu=', A1, ', ldu=', I5, ', xinfo=', I5, ',' ) * 9730 FORMAT( 1X, ' mtype=', A1, ', diam=', E11.4, ', uplo=', A1, > ', n=', I5, ', lda=', I5, ', b2=', I5, ',' ) 9731 FORMAT( 1X, ' drptol=', E11.4, ', nb=', I5, ', lwork1=', I8, > ', xinfo1=', I5, ',' ) 9732 FORMAT( 1X, ' jobu=', A1, ', ldu=', I5, ', lwork2=', I8, > ', xinfo2=', I5, ',' ) * 9740 FORMAT( 1X, ' mtype=', A1, ', diam=', E11.4, ', n=', I5, > ', b1=', I5, ', lda=', I5, ', b2=', I5, ',' ) 9741 FORMAT( 1X, ' drptol=', E11.4, ', nb=', I5, ', jobu=', A1, > ', ldu=', I5, ', lwork=', I8, ',' ) 9742 FORMAT( 1X, ' xinfo=', I5, ',' ) * 9750 FORMAT( 1X, ' mtype=', A1, ', diam=', E11.4, > ', n=', I5, ', b1=', I5, ', lda=', I5, ',' ) * 9760 FORMAT( 1X, ' mtype=', A1, ', diam=', E11.4, ', uplo=', A1, > ', n=', I5, ', b1=', I5, ', lda1=', I5, ',' ) 9761 FORMAT( 1X, ' lda2=', I5, ', xinfo=', I5, ',' ) * 9770 FORMAT( 1X, ' mtype=', A1, ', diam=', E11.4, ', uplo=', A1, > ', n=', I5, ', lda1=', I5, ', b2=', I5, ',' ) 9771 FORMAT( 1X, ' lda2=', I5, ', nsteps=', I5, > ', drptol=', E11.4, ', jobu=', A1, ', lwork=', I8, ',' ) 9772 FORMAT( 1X, ' b ( 2: )=', 100(I5, ',') ) 9773 FORMAT( 1X, ' nb( 1: )=', 100(I5, ',') ) * 9780 FORMAT( 1X, ' mtype=', A1, ', diam=', E11.4, ', uplo=', A1, > ', n=', I5, ', b1=', I5, ', lda=', I5, ', b2=', I5, > ',' ) 9781 FORMAT( 1X, ' nsteps=', I5, ', drptol=', E11.4, > ', jobu=', A1, ', ldu=', I5, ',' ) 9782 FORMAT( 1X, ' lwork=', I8, ', xinfo=', I5, ',' ) * * --- unexpected behaviour of the routines --- * 9900 FORMAT( 1X, '*** Test in line ', I5, ' failed : ', A6, > ' returned info=', I5, ' in step ', I5, > ' (expected ', I5, ')' ) 9901 FORMAT( 1X, '*** Test in line ', I5, ' failed : ', A6, > ' returned info=', I5, ' (expected ', I5, ')' ) * 9910 FORMAT( 1X, '*** Test in line ', I5, ' failed : ', A6, > ' returned step=', I5, ' (expected ', I5, ')' ) * 9920 FORMAT( 1X, '*** Test in line ', I5, ' failed : ', A6, > ' used ', I8, ' workspace (allowed ', I8, ')' ) * 9930 FORMAT( 1X, '*** Test in line ', I5, ' failed ', A, > ' test: ', E10.3, ' (thresh=', E10.3, ')' ) * * - - - - - - - - done - - - - - - - - - - - - - - - - - - - - - - - - * STOP END * * ********************************************************************** * SUBROUTINE DSYINI( MTYPE, EVLS, SZEVLS, DIAM, > FRMT, UPLO, N, B, A, LDA, SZA, > JOBU, U, LDU, SZU, > NOTUSD, WORK, SZWORK, INFO ) * * Description: * * Generates a symmetric (full or banded) matrix A with either * prescribed eigenvalues, random eigenvalues, or two clusters of * eigenvalues. The matrix is returned either in (upper or lower) * symmetric full storage or in (upper or lower) symmetric banded * storage. In addition, U can be set to the identity matrix. * * Note: In contrast to the LAPACK routine dlagsy, this routine * generates the banded matrix within an n-by-(b+1) array. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * ---------------------------------------------------------------------- * * Parameters: * CHARACTER*1 MTYPE, FRMT, UPLO, JOBU INTEGER N, B, LDA, SZA, LDU, SZU, SZWORK, SZEVLS, > INFO DOUBLE PRECISION DIAM, NOTUSD DOUBLE PRECISION A( LDA, * ), U( LDU, * ), EVLS( * ), > WORK( * ) * * mtype (in) character*1 * The matrix type. * mtype = 'S' : Generate a matrix with prescribed eigenvalues. * = 'R' : Eigenvalues are uniformly random in [ -1, 1 ). * = 'I' : ISDA-type matrix: eigenvalues are clustered * around 0 and 1. * * evls (in OR out) double precision array, dimension ( szevls ) * The eigenvalues of the matrix A. * If mtype = 'S' then evls is an input parameter, and the * first n elements of evls are taken as eigenvalues for the * matrix A. * If mtype = 'R' or 'I', then evls is an output parameter and * contains the eigenvalues of the matrix A. * * szevls (in) integer * The size of the array evls. * szevls >= n. * * diam (in) double precision * The diameter of the eigenvalue clusters (in multiples of * machine_epsilon). * Accessed only if mtype = 'I'. * * frmt (in) character*1 * The storage format for the matrix A. * frmt = 'F' : (Symmetric upper or lower) full storage. * = 'B' : (Symmetric upper or lower) banded storage. * * uplo (in) character*1 * Which triangle of the matrix is used? * uplo = 'U' : Initialize the upper triangle. * = 'L' : Initialize the lower triangle. * In banded storage (frmt = 'B'), uplo also determines * whether the upper or lower banded storage scheme is used. * * n (in) integer * The dimension of the matrix. * n >= 0. * * b (in) integer * The semibandwidth (i.e., the number of subdiagonals) of the * matrix A. * 0 <= b <= max( n-1, 0 ). * * a (out) double precision array, dimension ( lda, n ) * The n-by-n symmetric matrix with semibandwidth b. * If frmt = 'F' then A is returned in the leading n-by-n * subarray - that is, matrix element A( i, j ) is stored at * array position a( i, j ) -, with the strict lower * (uplo = 'U') or the strictly upper (uplo = 'L') triangle set * to some large value (NOT_USED). * If frmt = 'B' then A is returned in banded format in the * leading (b+1)-times-n subarray - that is, matrix element * A( i, j ) is stored at array position a( b+1+i-j, j ) if * uplo = 'U', and at position a( 1+i-j, j ) if uplo = 'L'. * In any case, the remainder of the first n columns is set * to the same large value mentioned above. * * lda (in) integer * The leading dimension of the array a. * lda >= n, if frmt = 'F' * >= b+1, if frmt = 'B'. * * sza (in) integer * The total size (in elements) of the array (not matrix!) a. * sza >= lda * n. * * jobu (in) character*1 * Set the matrix U to identity? * jobu = 'U' : Yes. * = 'N' : No. * * u (out) double precision array, dimension ( ldu, n ) * If jobu = 'U' then the leading n-by-n subarray is set to * an n-by-n identity matrix. * If jobu = 'N' then u is not accessed. * * ldu (in) integer * The leading dimension of the array u. * ldu >= n. * * szu (in) integer * The total size (in elements) of the array (not matrix!) u. * szu >= ldu * n, if jobu = 'U' * >= 0 , if jobu = 'N'. * * notusd (in) double precision * Value for marking elements that should not be used. * Typically a rather large number. * * work (workspace) double precision array, dimension ( szwork ) * * szwork (in) integer * The size of the array work. * szwork >= 2 * n. * * info (out) integer * On exit, info indicates the consistence of the arguments. * = 0 : All arguments are OK. * = -1 : mtype is none of 'S', 'R', 'I' (upper/lower case). * = -3 : szevls is too small ( < n ). * = -4 : diam is out of range (negative). * = -5 : frmt is none of 'F', 'B' (upper or lower case). * = -6 : uplo is none of 'U', 'L' (upper or lower case). * = -7 : n is out of range ( < 0 ). * = -8 : b is out of range ( < 0 or > max( n-1, 0 ) ). * = -10 : lda is too small ( < n, if full, < b+1, if banded). * = -11 : sza is too small ( < n*lda ). * = -12 : jobu is none of 'U', 'N' (upper or lower case). * = -14 : ldu is too small ( < n ). * = -15 : szu is too small ( < n*ldu, if U is required). * = -18 : szwork is too small (see above). * * ---------------------------------------------------------------------- * * Local constants and variables: * DOUBLE PRECISION ZERO, HALF, ONE, TWO PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, > ONE = 1.0D0, TWO = 2.0D0 ) * LOGICAL SPEC, ISDA, FULL, UPPER, NEEDU INTEGER ISEED( 4 ) DOUBLE PRECISION SDIAM * * spec matrix with prescribed spectrum ? * isda ISDA-type matrix or random matrix ? * full store the matrix in full or banded format ? * upper use upper or lower triangle ? * needu update I or not ? * iseed seed for the random number generator * sdiam scaled diameter * INTEGER D, I, J, K, Q DOUBLE PRECISION C, S, FILL, A11, A12, A21, A22, TMP * * d the number of the new diagonal * c cosine of the rotation angle * s sine of the rotation angle * fill new fill-in element * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * DOUBLE PRECISION D1MACH, DLARAN EXTERNAL DCOPY, DLAGSY, D1MACH, DLARAN, DLARTG, > DLASET * * dcopy vector copy (BLAS) * dlagsy generate symmetric matrix (LAPACK TMG) * dlamch inquire machine parameters (LAPACK) * dlaran random number generator (LAPACK TMG) * dlartg generate rotation (LAPACK) * dlaset initialize diagonal matrix (LAPACK) * INTRINSIC MAX, MIN * * ---------------------------------------------------------------------- * * --- sanity check for the arguments --- * SPEC = LSAME( MTYPE, 'Spectrum' ) ISDA = LSAME( MTYPE, 'Isda' ) FULL = LSAME( FRMT, 'Full' ) UPPER = LSAME( UPLO, 'Upper' ) NEEDU = LSAME( JOBU, 'Update' ) * IF ( .NOT. ( ISDA .OR. SPEC .OR. LSAME( MTYPE, 'Random' ) ) ) > THEN INFO = -1 ELSEIF ( SZEVLS .LT. N ) THEN INFO = -3 ELSEIF ( DIAM .LT. ZERO ) THEN INFO = -4 ELSEIF ( .NOT. ( FULL .OR. LSAME( FRMT, 'Banded' ) ) ) THEN INFO = -5 ELSEIF ( .NOT. ( UPPER .OR. LSAME( UPLO, 'Lower' ) ) ) THEN INFO = -6 ELSEIF ( N .LT. 0 ) THEN INFO = -7 ELSEIF ( ( B .LT. 0 ) .OR. ( B .GT. MAX( N-1, 0 ) ) ) THEN INFO = -8 ELSEIF ( ( FULL .AND. ( LDA .LT. N ) ) > .OR. ( LDA .LT. B+1 ) ) THEN INFO = -10 ELSEIF ( SZA .LT. N*LDA ) THEN INFO = -11 ELSEIF ( .NOT. ( NEEDU .OR. LSAME( JOBU, 'NoUpdate' ) ) ) THEN INFO = -12 ELSEIF ( LDU .LT. N ) THEN INFO = -14 ELSEIF ( NEEDU .AND. ( SZU .LT. N*LDU ) ) THEN INFO = -15 ELSEIF ( SZWORK .LT. 2*N ) THEN INFO = -18 ELSE INFO = 0 ENDIF IF ( INFO .NE. 0 ) GOTO 9999 * * --- check for quick return --- * IF ( N .EQ. 0 ) GOTO 9999 * IF ( .NOT. SPEC ) THEN * * --- set up eigenvalue distribution --- * ISEED( 1 ) = 4001 ISEED( 2 ) = 3001 ISEED( 3 ) = 2001 ISEED( 4 ) = 1001 * SDIAM = TWO * DIAM * D1MACH(4) DO 1000 I = 1, N IF ( ISDA ) THEN EVLS( I ) = SDIAM * ( DLARAN( ISEED ) - HALF ) IF ( DLARAN( ISEED ) .LT. HALF ) THEN EVLS( I ) = EVLS( I ) + ONE ENDIF ELSE EVLS( I ) = TWO * ( DLARAN( ISEED ) - HALF ) ENDIF 1000 CONTINUE ENDIF * * --- initialize random number generator --- * ISEED( 1 ) = 1001 ISEED( 2 ) = 2001 ISEED( 3 ) = 3001 ISEED( 4 ) = 4001 * IF ( FULL ) THEN * * - - - - - - - initialize matrix in full storage - - - - - - - - - - - * CALL DLAGSY( N, B, EVLS, A, LDA, ISEED, WORK, INFO ) * IF ( UPPER ) THEN * * --- mark lower triangle "not used" --- * DO 2100 J = 1, N-1 DO 2010 I = J+1, N A( I, J ) = NOTUSD 2010 CONTINUE 2100 CONTINUE ELSE * * --- mark upper triangle "not used" --- * DO 2300 J = 2, N DO 2210 I = 1, J-1 A( I, J ) = NOTUSD 2210 CONTINUE 2300 CONTINUE ENDIF * ELSE * * - - - - - - - - initialize matrix in banded storage - - - - - - - - - * * - - - - - - - - first initialize in lower packed storage - - - - - - - * CALL DCOPY( N, EVLS, 1, A( 1, 1 ), LDA ) * DO 3500 D = 1, B * * --- add d-th diagonal --- * DO 3300 I = N-1, 1, -1 * * --- to generate an new element at position * ( i+1, i-d ), ... --- * * --- ... first determine a random rotation, ... --- * A11 = DLARAN( ISEED ) A12 = DLARAN( ISEED ) CALL DLARTG( A11, A12, C, S, TMP ) * * --- ... apply it to rows i and i+1, ... --- * DO 3010 Q = MAX( I-D+1, 1 ), I-1 IF ( Q .EQ. ( I-D+1 ) ) THEN A( D+1, Q ) = -S * A( D, Q ) A( D, Q ) = C * A( D, Q ) ELSE TMP = C * A( I-Q+2, Q ) - S * A( I-Q+1, Q ) A( I-Q+1, Q ) = C * A( I-Q+1, Q ) + S * A( I-Q+2, Q ) A( I-Q+2, Q ) = TMP ENDIF 3010 CONTINUE * * --- ... apply it to A( i:i+1, i:i+1 ), ... --- * IF ( D .EQ. 1 ) THEN A11 = C * A( 1, I ) A21 = -S * A( 1, I ) A12 = S * A( 1, I+1 ) A22 = C * A( 1, I+1 ) ELSE A11 = C * A( 1, I ) + S * A( 2, I ) A21 = C * A( 2, I ) - S * A( 1, I ) A12 = C * A( 2, I ) + S * A( 1, I+1 ) A22 = C * A( 1, I+1 ) - S * A( 2, I ) ENDIF A( 1, I ) = C * A11 + S * A12 A( 2, I ) = C * A21 + S * A22 A( 1, I+1 ) = C * A22 - S * A21 * * --- ... apply it to columns i and i+1, ... --- * DO 3020 Q = I+2, MIN( I+D, N ) TMP = C * A( Q-I, I+1 ) - S * A( Q-I+1, I ) A( Q-I+1, I ) = C * A( Q-I+1, I ) + S * A( Q-I, I+1 ) A( Q-I, I+1 ) = TMP 3020 CONTINUE IF ( ( I+D+1 ) .LE. N ) THEN FILL = S * A( D+1, I+1 ) A( D+1, I+1 ) = C * A( D+1, I+1 ) ENDIF * * --- ... and chase the fill-in element down the band --- * DO 3200 K = I+D, N-1, D * CALL DLARTG( A( D+1, K-D ), FILL, C, S, TMP ) A( D+1, K-D ) = TMP * DO 3110 Q = K-D+1, K-1 TMP = C * A( K-Q+2, Q ) - S * A( K-Q+1, Q ) A( K-Q+1, Q ) = C * A( K-Q+1, Q ) + S * A( K-Q+2, Q ) A( K-Q+2, Q ) = TMP 3110 CONTINUE * A11 = C * A( 1, K ) + S * A( 2, K ) A21 = C * A( 2, K ) - S * A( 1, K ) A12 = C * A( 2, K ) + S * A( 1, K+1 ) A22 = C * A( 1, K+1 ) - S * A( 2, K ) A( 1, K ) = C * A11 + S * A12 A( 2, K ) = C * A21 + S * A22 A( 1, K+1 ) = C * A22 - S * A21 * DO 3120 Q = K+2, MIN( K+D, N ) TMP = C * A( Q-K, K+1 ) - S * A( Q-K+1, K ) A( Q-K+1, K ) = C * A( Q-K+1, K ) + S * A( Q-K, K+1 ) A( Q-K, K+1 ) = TMP 3120 CONTINUE IF ( ( K+D+1 ) .LE. N ) THEN FILL = S * A( D+1, K+1 ) A( D+1, K+1 ) = C * A( D+1, K+1 ) ENDIF 3200 CONTINUE * 3300 CONTINUE * * --- mark the last d entries of the row "not used" --- * DO 3410 I = N-D+1, N A( D+1, I ) = NOTUSD 3410 CONTINUE * 3500 CONTINUE * * - - - - - - - - end : first initialize in lower packed storage - - - - * IF ( UPPER ) THEN * * --- convert from lower to upper banded storage --- * DO 3700 I = 0, B/2 CALL DCOPY( N-B+I, A( B+1-I, 1 ), LDA, WORK, 1 ) DO 3610 J = 1, N-I A( B+1-I, I+J ) = A( I+1, J ) 3610 CONTINUE DO 3620 K = 1, I A( B+1-I, K ) = NOTUSD 3620 CONTINUE CALL DCOPY( N-B+I, WORK, 1, A( I+1, B+1-I ), LDA ) DO 3630 K = 1, B-I A( I+1, K ) = NOTUSD 3630 CONTINUE 3700 CONTINUE ENDIF * * - - - - - - - - end : initialize matrix in banded storage - - - - - - * ENDIF * * --- generate identity matrix in U --- * IF ( NEEDU ) THEN CALL DLASET( 'All', N, N, ZERO, ONE, U, LDU ) ENDIF * 9999 RETURN END * * ********************************************************************** * SUBROUTINE DSYNCK( EVLS, FRMT1, UPLO1, N, B1, A1, LDA1, SZA1, > FRMT2, B2, A2, LDA2, D, E, > JOBU, U, LDU, > ORTHU, SORTHU, RES, SRES, DEVLS, SDEVLS, > NOTUSD, WORK, SZWORK, INFO ) * * Description: * * This routine performs numerical tests after an orthogonal * transformation * T * A --> B = U * A * U. * A is rebuilt by calling dsyini, B may be given in banded or * tridiagonal format. * Depending on whether U was build explicitly during the reduction, * either * T * the orthogonality U * U - I of U * and the residual U * B - A * U * or * the difference between A's and B's eigenvalues * is checked. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * ---------------------------------------------------------------------- * * Parameters: * CHARACTER*1 FRMT1, UPLO1, FRMT2, JOBU INTEGER N, B1, LDA1, SZA1, B2, LDA2, LDU, > SZWORK, INFO DOUBLE PRECISION ORTHU, SORTHU, RES, SRES, DEVLS, SDEVLS, > NOTUSD DOUBLE PRECISION EVLS( * ), A1( LDA1, * ), A2( LDA2, * ), > D( * ), E( * ), U( LDU, * ), WORK( * ) * * evls (in) double precision array, dimension ( n ) * The eigenvalues of the matrix A, as returned from dsyini. * * frmt1 (in) character*1 * The storage format of the original matrix A. * frmt1 = 'F' : (Symmetric) full storage. * = 'B' : (Symmetric) banded storage. * * uplo1 (in) character*1 * Which triangle of the matrix A (and B) is used? * uplo1 = 'U' : Use the upper triangle. * = 'L' : Use the lower triangle. * In banded storage (frmt1 = 'B'), uplo1 also determines * whether the upper or lower banded storage scheme is used. * * n (in) integer * The dimension of the matrix. * n >= 0. * * b1 (in) integer * The semibandwidth (i.e., the number of subdiagonals) of the * original matrix A. * 0 <= b1 <= max( n-1, 0 ). * * a1 (out) double precision array, dimension ( lda1, n ) * a1 is used to build a copy of the original n-by-n symmetric * matrix A with semibandwidth b1. * If frmt = 'F' then A is returned in the leading n-by-n * subarray - that is, matrix element A( i, j ) is stored at * array position a1( i, j ) -, with the strict lower * (uplo = 'U') or the strictly upper (uplo = 'L') triangle set * to some large value (NOT_USED). * If frmt = 'B' then A is returned in banded format in the * leading (b1+1)-times-n subarray - that is, matrix element * A( i, j ) is stored at array position a1( b1+1+i-j, j ) if * uplo = 'U', and at position a1( 1+i-j, j ) if uplo = 'L'. * * lda1 (in) integer * The leading dimension of the array a1. * lda >= n, if frmt1 = 'F' * >= b1+1, if frmt1 = 'B'. * * sza1 (in) integer * The total size (in elements) of the array (not matrix!) a1. * sza1 >= lda1 * n. * * frmt2 (in) character*1 * The storage format of the reduced matrix B. * frmt1 = 'B' : (Symmetric) banded storage. * = 'T' : (Symmetric) tridiagonal in arrays d and e. * * b2 (in) integer * The semibandwidth (i.e., the number of subdiagonals) of the * reduced matrix B. * 0 <= b2 <= max( n-1, 0 ). * * a2 (in) double precision array, dimension ( lda2, n ) * If frmt2 = 'B' then the leading (b2+1)-times-n subarray of * a2 holds the reduced symmetric matrix B with semibandwidth * b2 in banded format - that is, matrix element A( i, j ) is * stored at array position a2( b2+1+i-j, j ) if uplo = 'U', * and at position a2( 1+i-j, j ) if uplo = 'L'. * If frmt2 = 'T' then a2 is not referenced. * * lda2 (in) integer * The leading dimension of the array a2. * lda2 >= b2+1. * * d (in) double precision array, dimension ( n ) * If frmt2 = 'T' then the first n elements of d hold the * main diagonal of the tridiagonal matrix B. * If frmt2 = 'B' then d is not referenced. * * e (in) double precision array, dimension ( n-1 ) * If frmt2 = 'T' then the first n-1 elements of e hold the * subdiagonal (superdiagonal) of the tridiagonal matrix B. * If frmt2 = 'B' then e is not referenced. * * jobu (in) character*1 * Does U contain the accumulated transformations ? * jobu = 'U' : Yes. * = 'N' : No. * * u (in) double precision array, dimension ( ldu, n ) * If jobu = 'U' then the leading n-by-n subarray contains * the accumulated transformations from the reduction (an * orthogonal matrix). * If jobu = 'N' then u is not accessed. * * ldu (in) integer * The leading dimension of the array u. * ldu >= n. * * orthu (out) double precision * The orthogonality error : F-norm( U''*U - I ). * If jobu = 'N' then orthu is set to 0. * * sorthu (out) double precision * The scaled orthogonality error : orthu / ( n * macheps). * If jobu = 'N' then sorthu is set to 0. * * res (out) double precision * The residual : F-norm( U*B - A*U ). * If jobu = 'N' then res is set to 0. * * sres (out) double precision * The scaled residual : res / ( n * macheps * F-norm( A ) ). * If jobu = 'N' then sres is set to 0. * * devls (out) double precision * The change of the eigenvalues : * 2-norm( sort(evls) - sort(spec(B)) ). * If jobu = 'U' then devls is set to 0. * * sdevls (out) double precision * The scaled eigenvalue changes : * devls / ( n * macheps * F-norm( A ) ). * If jobu = 'U' then sdevls is set to 0. * * notusd (in) double precision * Value for marking elements that should not be used. * Typically a rather large number. * * work (workspace) double precision array, dimension ( szwork ) * * szwork (in) integer * The length of the array work. * szwork >= max( 3*n-2, 2*n ). * * info (out) integer * On exit, info indicates the consistence of the arguments. * = 0 : All arguments are OK. * = -2 : frmt1 is none of 'F', 'B' (upper/lower case). * = -3 : uplo1 is none of 'U', 'L' (upper/lower case). * = -4 : n is out of range ( < 0 ). * = -5 : b1 is out of range ( < 0 or > max( n-1, 0 ) ). * = -7 : lda1 too small ( < n, if full, < b1+1, if banded). * = -8 : sza1 is too small ( < n * lda1 ). * = -9 : frmt2 is none of 'B', 'T' (upper/lower case). * = -10 : b2 is out of range ( < 0 or > max( n-1, 0 ), * or > 1 if frmt2 = 'T' ). * = -12 : lda2 is too small ( < b2+1 ). * = -15 : jobu is none of 'U', 'N' (upper/lower case). * = -17 : ldu is too small ( < n ). * = -26 : szwork is too small (see above). * * ---------------------------------------------------------------------- * * Local constants and variables: * DOUBLE PRECISION ZERO, ONE PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) * LOGICAL FULL1, UPPER, TRI2, HAVEU DOUBLE PRECISION EPS, NORMA INTEGER NCOLS, COLS, J0, J, IX * * full1 build A in full storage ? * upper use upper triangle ? * tri2 is B given in tridiagonal storage ? * haveu is the accumulated matrix U available ? * eps machine epsilon * norma the Frobenius norm of the matrix A * ncols maximum width of a block column that fits into workspace * cols width of current block column * j0 first column of the current block column * j current column * ix points to the position of the current column in workspace * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * DOUBLE PRECISION D1MACH, DLANGE, DNRM2 EXTERNAL DAXPY, DCOPY, DGEMM, DGEMV, D1MACH, > DLANGE, DLASRT, DNRM2, DSBEV, DSBMV, > DSCAL, DSTEV, DSYINI, DSYMM * * daxpy add multiple of a vector to another one (BLAS) * dcopy vector copy (BLAS) * dgemm matrix-matrix product (BLAS) * dgemv matrix-vector product (BLAS) * dlamch determine machine parameters (LAPACK) * dlange matrix norm (LAPACK) * dlasrt sort a vector (LAPACK) * dnrm2 2-norm of a vector (BLAS) * dsbev compute eigensystem of symmetric banded matrix (LAPACK) * dsbmv banded symmetri matrix-vector product (BLAS) * dscal scale a vector (BLAS) * dstev compute eigensystem of symmetric tridiagonal matrix (LAPACK) * dsyini initialize symmetric matrix (this file) * dsymm symmetric matrix-matrix product (BLAS) * INTRINSIC MAX, MIN, SQRT * * ---------------------------------------------------------------------- * * --- sanity check for the arguments --- * FULL1 = LSAME( FRMT1, 'Full' ) UPPER = LSAME( UPLO1, 'Upper' ) TRI2 = LSAME( FRMT2, 'Tridiagonal' ) HAVEU = LSAME( JOBU, 'U' ) * IF ( .NOT. ( FULL1 .OR. LSAME( FRMT1, 'Banded' ) ) ) THEN INFO = -2 ELSEIF ( .NOT. ( UPPER .OR. LSAME( UPLO1, 'Lower' ) ) ) THEN INFO = -3 ELSEIF ( N .LT. 0 ) THEN INFO = -4 ELSEIF ( ( B1 .LT. 0 ) .OR. ( B1 .GT. MAX( N-1, 0 ) ) ) THEN INFO = -5 ELSEIF ( ( FULL1 .AND. ( LDA1 .LT. N ) ) .OR. > ( LDA1 .LT. B1+1 ) ) THEN INFO = -7 ELSEIF ( SZA1 .LT. N*LDA1 ) THEN INFO = -8 ELSEIF ( .NOT. ( TRI2 .OR. LSAME( FRMT2, 'Banded' ) ) ) THEN INFO = -9 ELSEIF ( ( B2 .LT. 0 ) .OR. > ( ( N .GT. 0 ) .AND. > ( ( B2 .GT. N-1 ) .OR. > ( TRI2 .AND. ( B2 .GT. 1 ) ) ) ) ) THEN INFO = -10 ELSEIF ( LDA2 .LT. B2+1 ) THEN INFO = -12 ELSEIF ( .NOT. ( HAVEU .OR. LSAME( JOBU, 'NoU' ) ) ) THEN INFO = -15 ELSEIF ( LDU .LT. N ) THEN INFO = -17 ELSEIF ( SZWORK .LT. MAX( 3*N-2, 2*N ) ) THEN INFO = -26 ELSE INFO = 0 ENDIF IF ( INFO .NE. 0 ) GOTO 9999 * * --- check for quick return --- * IF ( N .EQ. 0 ) GOTO 9999 * * --- determine machine precision --- * EPS = D1MACH(4) * T * - - - - - - compute orthogonality error = F-Norm( U * U - I ) - - - * IF ( LSAME( JOBU, 'Update' ) ) THEN ORTHU = ZERO * T * --- how many columns of U * U - I fit into workspace ? --- * NCOLS = SZWORK / N DO 1100 J0 = 1, N, NCOLS COLS = MIN( NCOLS, N-J0+1 ) * T * --- compute n-by-cols block column of U * U --- * CALL DGEMM( 'Transpose', 'NoTranspose', N, COLS, N, > ONE, U, LDU, U( 1, J0 ), LDU, ZERO, WORK, N ) * * --- subtract corresponding parts of I --- * DO 1010 J = J0, J0+COLS-1 WORK( (J-J0)*N+J ) = WORK( (J-J0)*N+J ) - ONE 1010 CONTINUE ORTHU = ORTHU + DLANGE( 'Frobenius', N, COLS, WORK, N, > WORK )**2 1100 CONTINUE ORTHU = SQRT( ORTHU ) SORTHU = ORTHU / ( N * EPS ) ELSE * * --- no orthogonality information available --- * ORTHU = - ONE SORTHU = - ONE ENDIF * T * - - - - - - end : compute orthogonality error = F-Norm( U * U - I ) * NORMA = DNRM2( N, EVLS, 1 ) * IF ( LSAME( JOBU, 'Update' ) ) THEN * * --- do not compute changes in eigenvalues --- * DEVLS = - ONE SDEVLS = - ONE * * - - - - - - - compute residual error = F-Norm( U * B - A * U ) - - - * * --- build another copy of the original matrix A --- * CALL DSYINI( 'Spectrum', EVLS, N, ZERO, > FRMT1, UPLO1, N, B1, A1, LDA1, SZA1, > 'NoU', WORK, N, 0, > NOTUSD, WORK, SZWORK, INFO ) * RES = ZERO * * --- how many cols of U * B - A * U fit into workspace ? --- * NCOLS = SZWORK / N * DO 2000 J0 = 1, N, NCOLS COLS = MIN( NCOLS, N-J0+1 ) * * --- build the next cols columns of U * B --- * IF ( LSAME( FRMT2, 'Tridiagonal' ) ) THEN DO 2010 J = J0, J0+COLS-1 IX = ( J - J0 ) * N + 1 CALL DCOPY( N, U( 1, J ), 1, WORK( IX ), 1 ) CALL DSCAL( N, D( J ), WORK( IX ), 1 ) IF ( J .GT. 1 ) THEN CALL DAXPY( N, E( J-1 ), U( 1, J-1 ), 1, > WORK( IX ), 1 ) ENDIF IF ( J .LT. N ) THEN CALL DAXPY( N, E( J ), U( 1, J+1 ), 1, WORK( IX ), 1 ) ENDIF 2010 CONTINUE ELSE DO 2020 J = J0, J0+COLS-1 IX = ( J - J0 ) * N + 1 CALL DGEMV( 'NoTranspose', N, MIN( B2+1, N-J+1 ), > ONE, U( 1, J ), LDU, A2( 1, J ), 1, > ZERO, WORK( IX ), 1 ) IF ( B2 .GT. 0 ) THEN IF ( J .GT. B2 ) THEN CALL DGEMV( 'NoTranspose', N, B2, > ONE, U( 1, J-B2 ), LDU, > A2( B2+1, J-B2 ), LDA2 - 1, > ONE, WORK( IX ), 1 ) ELSEIF ( J .GT. 1 ) THEN CALL DGEMV( 'NoTranspose', N, J - 1, > ONE, U( 1, 1 ), LDU, > A2( J, 1 ), LDA2 - 1, > ONE, WORK( IX ), 1 ) ENDIF ENDIF 2020 CONTINUE ENDIF * * --- subtract corresponding columns of A * U --- * IF ( LSAME( FRMT1, 'Full' ) ) THEN CALL DSYMM( 'Left', UPLO1, N, COLS, > -ONE, A1, LDA1, U( 1, J0 ), LDU, > ONE, WORK, N ) ELSE DO 2110 J = J0, J0+COLS-1 CALL DSBMV( UPLO1, N, B1, -ONE, A1, LDA1, U( 1, J ), 1, > ONE, WORK( (J-J0)*N+1 ), 1 ) 2110 CONTINUE ENDIF * RES = RES + DLANGE( 'Frobenius', N, COLS, WORK, N, WORK )**2 2000 CONTINUE * RES = SQRT( RES ) SRES = RES / ( N * NORMA * EPS ) * * - - - - - - - end : compute residual error = F-Norm( U * B - A * U ) * ELSE * * --- no residual information available --- * RES = - ONE SRES = - ONE * * - - - - - - - check if eigenvalues have changed - - - - - - - - - - - * * --- compute eigenvalues of the tridiagonal or banded * matrix --- * IF ( LSAME( FRMT2, 'Tridiagonal' ) ) THEN CALL DSTEV( 'NoEigenvectors', N, D, E, WORK, N, WORK, INFO ) ELSE CALL DSBEV( 'NoEigenvectors', 'Lower', N, B2, A2, LDA2, > D, WORK, N, WORK, INFO ) ENDIF * * --- compare with (sorted) original eigenvalues --- * IF ( INFO .EQ. 0 ) THEN CALL DLASRT( 'Increasing', N, EVLS, INFO ) CALL DAXPY( N, -ONE, EVLS, 1, D, 1 ) DEVLS = DNRM2( N, D, 1 ) SDEVLS = DEVLS / ( N * NORMA * EPS ) ELSE DEVLS = - ONE SDEVLS = - ONE ENDIF * * - - - - - - - end : check if eigenvalues have changed - - - - - - - - * ENDIF * 9999 RETURN END * * ********************************************************************** * LOGICAL FUNCTION LXSAME( S1, S2 ) * * Description: * * Checks if two strings agree (ignoring case). * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*( * ) S1, S2 * * s1 (in) character*( * ) * The first string. * * s2 (in) character*( * ) * The second string. * * Local constants and variables: * INTEGER I * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * INTRINSIC LEN * * ---------------------------------------------------------------------- * LXSAME = ( LEN( S1 ) .EQ. LEN( S2 ) ) IF ( LXSAME ) THEN DO 100 I = 1, LEN( S1 ) LXSAME = LXSAME .AND. LSAME( S1( I:I ), S2( I:I ) ) 100 CONTINUE ENDIF * RETURN END * SHAR_EOF fi # end of overwriting check if test -f 'res1' then echo shar: will not over-write existing file "'res1'" else cat << "SHAR_EOF" > 'res1' =============================================================================== Tests for Total Skipped Failed ------------------------------------------------------------------------------- dsytrd : full -> tridiagonal, one-step (LAPACK) : 4 0 0 dorgtr : accumulation of transformations (LAPACK) : 2 0 0 dsbtrd : banded -> tridiagonal, one-step (LAPACK) : 4 0 0 dsyrdb : full -> banded, one-step (SBR) : 36 0 0 dsygtr : accumulation of transformations (SBR) : 11 0 0 dsbrdb : banded -> banded, one-step (SBR) : 50 0 0 dsbrdt : banded -> tridiagonal, one-step (SBR) : 44 0 0 dsy2bc : copy full -> banded (SBR) : 27 0 0 dsy2bi : in-place copy full -> banded (SBR) : 27 0 0 dsb2bc : copy banded -> banded (SBR) : 19 0 0 dsb2bi : in-place copy banded -> banded (SBR) : 19 0 0 dsyrdd : reduction driver for full matrices (SBR) : 45 0 0 dsbrdd : reduction driver for banded matrcs (SBR) : 52 0 0 ------------------------------------------------------------------------------- Total : : 340 0 0 ------------------------------------------------------------------------------- Total time : 129.96 seconds SHAR_EOF fi # end of overwriting check if test -f 'res2' then echo shar: will not over-write existing file "'res2'" else cat << "SHAR_EOF" > 'res2' *** Timing the LAPACK reduction full -> tridiagonal *** no update Line 81 / dsytrd : full -> tridiagonal, one-step (LAPACK) , mtype=R, diam= 0.0000E+00, uplo=L, n= 200, lda= 200, nb1= 0, nx1= 0, lwork1= 1000000, xinfo1= 0, jobu=N, nb2= 0, nx2= 0, lwork2= 1000000, xinfo2= 0, reduction time= 1.400000 Line 84 / dsytrd : full -> tridiagonal, one-step (LAPACK) , mtype=R, diam= 0.0000E+00, uplo=L, n= 400, lda= 400, nb1= 0, nx1= 0, lwork1= 1000000, xinfo1= 0, jobu=N, nb2= 0, nx2= 0, lwork2= 1000000, xinfo2= 0, reduction time= 10.709999 Line 87 / dsytrd : full -> tridiagonal, one-step (LAPACK) , mtype=R, diam= 0.0000E+00, uplo=L, n= 600, lda= 600, nb1= 0, nx1= 0, lwork1= 1000000, xinfo1= 0, jobu=N, nb2= 0, nx2= 0, lwork2= 1000000, xinfo2= 0, reduction time= 37.089996 Line 90 / dsytrd : full -> tridiagonal, one-step (LAPACK) , mtype=R, diam= 0.0000E+00, uplo=L, n= 800, lda= 800, nb1= 0, nx1= 0, lwork1= 1000000, xinfo1= 0, jobu=N, nb2= 0, nx2= 0, lwork2= 1000000, xinfo2= 0, reduction time= 89.190002 Line 93 / dsytrd : full -> tridiagonal, one-step (LAPACK) , mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, lda= 1000, nb1= 0, nx1= 0, lwork1= 1000000, xinfo1= 0, jobu=N, nb2= 0, nx2= 0, lwork2= 1000000, xinfo2= 0, reduction time= 175.879974 with update Line 102 / dsytrd : full -> tridiagonal, one-step (LAPACK) , mtype=R, diam= 0.0000E+00, uplo=L, n= 200, lda= 200, nb1= 0, nx1= 0, lwork1= 1000000, xinfo1= 0, jobu=U, nb2= 0, nx2= 0, lwork2= 1000000, xinfo2= 0, reduction time= 3.750061 Line 105 / dsytrd : full -> tridiagonal, one-step (LAPACK) , mtype=R, diam= 0.0000E+00, uplo=L, n= 400, lda= 400, nb1= 0, nx1= 0, lwork1= 1000000, xinfo1= 0, jobu=U, nb2= 0, nx2= 0, lwork2= 1000000, xinfo2= 0, reduction time= 30.540039 Line 108 / dsytrd : full -> tridiagonal, one-step (LAPACK) , mtype=R, diam= 0.0000E+00, uplo=L, n= 600, lda= 600, nb1= 0, nx1= 0, lwork1= 1000000, xinfo1= 0, jobu=U, nb2= 0, nx2= 0, lwork2= 1000000, xinfo2= 0, reduction time= 103.380005 Line 111 / dsytrd : full -> tridiagonal, one-step (LAPACK) , mtype=R, diam= 0.0000E+00, uplo=L, n= 800, lda= 800, nb1= 0, nx1= 0, lwork1= 1000000, xinfo1= 0, jobu=U, nb2= 0, nx2= 0, lwork2= 1000000, xinfo2= 0, reduction time= 247.030090 Line 114 / dsytrd : full -> tridiagonal, one-step (LAPACK) , mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, lda= 1000, nb1= 0, nx1= 0, lwork1= 1000000, xinfo1= 0, jobu=U, nb2= 0, nx2= 0, lwork2= 1000000, xinfo2= 0, reduction time= 482.520020 *** Timing the SBR driver full -> tridiagonal *** no update Line 171 / dsyrdd : reduction driver for full matrices (SBR), mtype=R, diam= 0.0000E+00, uplo=U, n= 200, lda1= 200, b2= 1, lda2= 2, nsteps= 0, drptol= 0.0000E+00, jobu=N, lwork= 1000000, xinfo= 1, reduction time= 1.260010 Line 174 / dsyrdd : reduction driver for full matrices (SBR), mtype=R, diam= 0.0000E+00, uplo=U, n= 400, lda1= 400, b2= 1, lda2= 2, nsteps= 0, drptol= 0.0000E+00, jobu=N, lwork= 1000000, xinfo= 1, reduction time= 10.060059 Line 177 / dsyrdd : reduction driver for full matrices (SBR), mtype=R, diam= 0.0000E+00, uplo=U, n= 600, lda1= 600, b2= 1, lda2= 2, nsteps= 0, drptol= 0.0000E+00, jobu=N, lwork= 1000000, xinfo= 1, reduction time= 34.719971 Line 180 / dsyrdd : reduction driver for full matrices (SBR), mtype=R, diam= 0.0000E+00, uplo=U, n= 800, lda1= 800, b2= 1, lda2= 2, nsteps= 0, drptol= 0.0000E+00, jobu=N, lwork= 1000000, xinfo= 1, reduction time= 84.540161 Line 183 / dsyrdd : reduction driver for full matrices (SBR), mtype=R, diam= 0.0000E+00, uplo=U, n= 1000, lda1= 1000, b2= 1, lda2= 2, nsteps= 0, drptol= 0.0000E+00, jobu=N, lwork= 1000000, xinfo= 1, reduction time= 167.760010 with update Line 192 / dsyrdd : reduction driver for full matrices (SBR), mtype=R, diam= 0.0000E+00, uplo=U, n= 200, lda1= 200, b2= 1, lda2= 2, nsteps= 0, drptol= 0.0000E+00, jobu=U, lwork= 1000000, xinfo= 1, reduction time= 3.699951 Line 195 / dsyrdd : reduction driver for full matrices (SBR), mtype=R, diam= 0.0000E+00, uplo=U, n= 400, lda1= 400, b2= 1, lda2= 2, nsteps= 0, drptol= 0.0000E+00, jobu=U, lwork= 1000000, xinfo= 1, reduction time= 29.310059 Line 198 / dsyrdd : reduction driver for full matrices (SBR), mtype=R, diam= 0.0000E+00, uplo=U, n= 600, lda1= 600, b2= 1, lda2= 2, nsteps= 0, drptol= 0.0000E+00, jobu=U, lwork= 1000000, xinfo= 1, reduction time= 100.560059 Line 201 / dsyrdd : reduction driver for full matrices (SBR), mtype=R, diam= 0.0000E+00, uplo=U, n= 800, lda1= 800, b2= 1, lda2= 2, nsteps= 0, drptol= 0.0000E+00, jobu=U, lwork= 1000000, xinfo= 1, reduction time= 241.930176 Line 204 / dsyrdd : reduction driver for full matrices (SBR), mtype=R, diam= 0.0000E+00, uplo=U, n= 1000, lda1= 1000, b2= 1, lda2= 2, nsteps= 0, drptol= 0.0000E+00, jobu=U, lwork= 1000000, xinfo= 1, reduction time= 473.800049 *** Timing the LAPACK reduction banded -> tridiagonal *** no update Line 249 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 4, lda= 5, jobu=N, ldu= 200, xinfo= 0, reduction time= 0.110107 Line 252 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 8, lda= 9, jobu=N, ldu= 200, xinfo= 0, reduction time= 0.280029 Line 255 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 12, lda= 13, jobu=N, ldu= 200, xinfo= 0, reduction time= 0.389893 Line 258 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 16, lda= 17, jobu=N, ldu= 200, xinfo= 0, reduction time= 0.460205 Line 261 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 24, lda= 25, jobu=N, ldu= 200, xinfo= 0, reduction time= 0.580078 Line 264 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 32, lda= 33, jobu=N, ldu= 200, xinfo= 0, reduction time= 0.700195 Line 267 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 48, lda= 49, jobu=N, ldu= 200, xinfo= 0, reduction time= 0.889893 Line 270 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 64, lda= 65, jobu=N, ldu= 200, xinfo= 0, reduction time= 1.060059 Line 275 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 4, lda= 5, jobu=N, ldu= 400, xinfo= 0, reduction time= 0.390137 Line 278 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 8, lda= 9, jobu=N, ldu= 400, xinfo= 0, reduction time= 0.899902 Line 281 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 12, lda= 13, jobu=N, ldu= 400, xinfo= 0, reduction time= 1.469971 Line 284 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 16, lda= 17, jobu=N, ldu= 400, xinfo= 0, reduction time= 1.820068 Line 287 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 24, lda= 25, jobu=N, ldu= 400, xinfo= 0, reduction time= 2.319824 Line 290 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 32, lda= 33, jobu=N, ldu= 400, xinfo= 0, reduction time= 2.810059 Line 293 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 48, lda= 49, jobu=N, ldu= 400, xinfo= 0, reduction time= 3.719971 Line 296 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 64, lda= 65, jobu=N, ldu= 400, xinfo= 0, reduction time= 4.600098 Line 301 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 4, lda= 5, jobu=N, ldu= 600, xinfo= 0, reduction time= 0.850098 Line 304 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 8, lda= 9, jobu=N, ldu= 600, xinfo= 0, reduction time= 1.859863 Line 307 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 12, lda= 13, jobu=N, ldu= 600, xinfo= 0, reduction time= 3.110107 Line 310 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 16, lda= 17, jobu=N, ldu= 600, xinfo= 0, reduction time= 4.020020 Line 313 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 24, lda= 25, jobu=N, ldu= 600, xinfo= 0, reduction time= 5.189941 Line 316 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 32, lda= 33, jobu=N, ldu= 600, xinfo= 0, reduction time= 6.340088 Line 319 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 48, lda= 49, jobu=N, ldu= 600, xinfo= 0, reduction time= 8.659912 Line 322 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 64, lda= 65, jobu=N, ldu= 600, xinfo= 0, reduction time= 10.760010 Line 327 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 4, lda= 5, jobu=N, ldu= 800, xinfo= 0, reduction time= 1.459961 Line 330 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 8, lda= 9, jobu=N, ldu= 800, xinfo= 0, reduction time= 3.220215 Line 333 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 12, lda= 13, jobu=N, ldu= 800, xinfo= 0, reduction time= 5.169922 Line 336 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 16, lda= 17, jobu=N, ldu= 800, xinfo= 0, reduction time= 6.910156 Line 339 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 24, lda= 25, jobu=N, ldu= 800, xinfo= 0, reduction time= 9.379883 Line 342 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 32, lda= 33, jobu=N, ldu= 800, xinfo= 0, reduction time= 11.469971 Line 345 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 48, lda= 49, jobu=N, ldu= 800, xinfo= 0, reduction time= 15.540039 Line 348 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 64, lda= 65, jobu=N, ldu= 800, xinfo= 0, reduction time= 19.250000 Line 353 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 4, lda= 5, jobu=N, ldu= 1000, xinfo= 0, reduction time= 2.270020 Line 356 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 8, lda= 9, jobu=N, ldu= 1000, xinfo= 0, reduction time= 4.869873 Line 359 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 12, lda= 13, jobu=N, ldu= 1000, xinfo= 0, reduction time= 7.830078 Line 362 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 16, lda= 17, jobu=N, ldu= 1000, xinfo= 0, reduction time= 10.510010 Line 365 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 24, lda= 25, jobu=N, ldu= 1000, xinfo= 0, reduction time= 14.540039 Line 368 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 32, lda= 33, jobu=N, ldu= 1000, xinfo= 0, reduction time= 17.910156 Line 371 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 48, lda= 49, jobu=N, ldu= 1000, xinfo= 0, reduction time= 24.200195 Line 374 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 64, lda= 65, jobu=N, ldu= 1000, xinfo= 0, reduction time= 30.220215 with update Line 383 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 4, lda= 5, jobu=U, ldu= 200, xinfo= 0, reduction time= 1.259766 Line 386 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 8, lda= 9, jobu=U, ldu= 200, xinfo= 0, reduction time= 1.589844 Line 389 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 12, lda= 13, jobu=U, ldu= 200, xinfo= 0, reduction time= 1.779785 Line 392 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 16, lda= 17, jobu=U, ldu= 200, xinfo= 0, reduction time= 1.889648 Line 395 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 24, lda= 25, jobu=U, ldu= 200, xinfo= 0, reduction time= 2.030273 Line 398 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 32, lda= 33, jobu=U, ldu= 200, xinfo= 0, reduction time= 2.160156 Line 401 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 48, lda= 49, jobu=U, ldu= 200, xinfo= 0, reduction time= 2.350098 Line 404 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 64, lda= 65, jobu=U, ldu= 200, xinfo= 0, reduction time= 2.500000 Line 409 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 4, lda= 5, jobu=U, ldu= 400, xinfo= 0, reduction time= 9.290039 Line 412 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 8, lda= 9, jobu=U, ldu= 400, xinfo= 0, reduction time= 11.290039 Line 415 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 12, lda= 13, jobu=U, ldu= 400, xinfo= 0, reduction time= 12.409668 Line 418 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 16, lda= 17, jobu=U, ldu= 400, xinfo= 0, reduction time= 12.990234 Line 421 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 24, lda= 25, jobu=U, ldu= 400, xinfo= 0, reduction time= 13.759766 Line 424 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 32, lda= 33, jobu=U, ldu= 400, xinfo= 0, reduction time= 14.400391 Line 427 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 48, lda= 49, jobu=U, ldu= 400, xinfo= 0, reduction time= 15.609863 Line 430 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 64, lda= 65, jobu=U, ldu= 400, xinfo= 0, reduction time= 16.390137 Line 435 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 4, lda= 5, jobu=U, ldu= 600, xinfo= 0, reduction time= 32.070313 Line 438 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 8, lda= 9, jobu=U, ldu= 600, xinfo= 0, reduction time= 37.889648 Line 441 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 12, lda= 13, jobu=U, ldu= 600, xinfo= 0, reduction time= 41.080078 Line 444 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 16, lda= 17, jobu=U, ldu= 600, xinfo= 0, reduction time= 42.890137 Line 447 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 24, lda= 25, jobu=U, ldu= 600, xinfo= 0, reduction time= 45.090332 Line 450 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 32, lda= 33, jobu=U, ldu= 600, xinfo= 0, reduction time= 46.979980 Line 453 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 48, lda= 49, jobu=U, ldu= 600, xinfo= 0, reduction time= 49.069824 Line 456 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 64, lda= 65, jobu=U, ldu= 600, xinfo= 0, reduction time= 52.009766 Line 461 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 4, lda= 5, jobu=U, ldu= 800, xinfo= 0, reduction time= 79.229980 Line 464 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 8, lda= 9, jobu=U, ldu= 800, xinfo= 0, reduction time= 93.649902 Line 467 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 12, lda= 13, jobu=U, ldu= 800, xinfo= 0, reduction time= 100.850098 Line 470 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 16, lda= 17, jobu=U, ldu= 800, xinfo= 0, reduction time= 100.650391 Line 473 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 24, lda= 25, jobu=U, ldu= 800, xinfo= 0, reduction time= 109.579590 Line 476 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 32, lda= 33, jobu=U, ldu= 800, xinfo= 0, reduction time= 107.930176 Line 479 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 48, lda= 49, jobu=U, ldu= 800, xinfo= 0, reduction time= 113.150391 Line 482 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 64, lda= 65, jobu=U, ldu= 800, xinfo= 0, reduction time= 122.680176 Line 487 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 4, lda= 5, jobu=U, ldu= 1000, xinfo= 0, reduction time= 154.910156 Line 490 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 8, lda= 9, jobu=U, ldu= 1000, xinfo= 0, reduction time= 176.100098 Line 493 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 12, lda= 13, jobu=U, ldu= 1000, xinfo= 0, reduction time= 193.929688 Line 496 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 16, lda= 17, jobu=U, ldu= 1000, xinfo= 0, reduction time= 192.419922 Line 499 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 24, lda= 25, jobu=U, ldu= 1000, xinfo= 0, reduction time= 200.620117 Line 502 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 32, lda= 33, jobu=U, ldu= 1000, xinfo= 0, reduction time= 206.000000 Line 505 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 48, lda= 49, jobu=U, ldu= 1000, xinfo= 0, reduction time= 213.649902 Line 508 / dsbtrd : banded -> tridiagonal, one-step (LAPACK), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 64, lda= 65, jobu=U, ldu= 1000, xinfo= 0, reduction time= 229.709961 *** Timing the SBR reduction banded -> tridiagonal *** no update Line 555 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 200, b1= 4, lda= 8, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.370117 Line 558 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 200, b1= 8, lda= 16, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.329590 Line 561 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 200, b1= 12, lda= 24, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.540039 Line 564 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 200, b1= 16, lda= 32, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.620117 Line 567 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 200, b1= 24, lda= 48, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.800293 Line 570 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 200, b1= 32, lda= 64, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.939941 Line 573 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 200, b1= 48, lda= 96, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 1.169922 Line 576 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 200, b1= 64, lda= 128, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 1.380371 Line 581 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 400, b1= 4, lda= 8, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 1.520020 Line 584 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 400, b1= 8, lda= 16, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 1.390137 Line 587 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 400, b1= 12, lda= 24, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 2.239746 Line 590 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 400, b1= 16, lda= 32, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 2.610352 Line 593 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 400, b1= 24, lda= 48, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 3.490234 Line 596 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 400, b1= 32, lda= 64, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 4.299805 Line 599 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 400, b1= 48, lda= 96, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 5.899902 Line 602 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 400, b1= 64, lda= 128, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 7.330078 Line 607 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 600, b1= 4, lda= 8, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 3.399902 Line 610 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 600, b1= 8, lda= 16, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 3.160156 Line 613 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 600, b1= 12, lda= 24, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 5.120117 Line 616 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 600, b1= 16, lda= 32, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 6.000000 Line 619 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 600, b1= 24, lda= 48, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 8.060059 Line 622 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 600, b1= 32, lda= 64, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 10.120117 Line 625 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 600, b1= 48, lda= 96, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 14.099609 Line 628 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 600, b1= 64, lda= 128, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 18.010254 Line 633 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 800, b1= 4, lda= 8, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 6.079590 Line 636 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 800, b1= 8, lda= 16, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 5.600098 Line 639 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 800, b1= 12, lda= 24, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 9.179688 Line 642 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 800, b1= 16, lda= 32, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 10.760742 Line 645 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 800, b1= 24, lda= 48, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 14.620117 Line 648 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 800, b1= 32, lda= 64, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 18.359375 Line 651 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 800, b1= 48, lda= 96, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 25.959961 Line 654 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 800, b1= 64, lda= 128, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 33.459961 Line 659 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 1000, b1= 4, lda= 8, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 9.459961 Line 662 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 1000, b1= 8, lda= 16, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 8.769531 Line 665 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 1000, b1= 12, lda= 24, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 14.440430 Line 668 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 1000, b1= 16, lda= 32, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 16.919922 Line 671 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 1000, b1= 24, lda= 48, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 22.909180 Line 674 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 1000, b1= 32, lda= 64, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 28.959961 Line 677 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 1000, b1= 48, lda= 96, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 41.360352 Line 680 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 1000, b1= 64, lda= 128, drptol= 0.0000E+00, nb= 0, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 53.570313 with update *** ignore messages about tests failing because *** *** SBRDT returned a wrong (but positive) info *** *** Test in line 693 failed : dsbrdt returned info= 3 (expected 1) Line 693 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 200, b1= 4, lda= 8, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 5.169922 *** Test in line 696 failed : dsbrdt returned info= 4 (expected 1) Line 696 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 200, b1= 8, lda= 16, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 4.809570 *** Test in line 699 failed : dsbrdt returned info= 4 (expected 1) Line 699 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 200, b1= 12, lda= 24, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 4.870117 *** Test in line 702 failed : dsbrdt returned info= 6 (expected 1) Line 702 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 200, b1= 16, lda= 32, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 5.160156 *** Test in line 705 failed : dsbrdt returned info= 8 (expected 1) Line 705 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 200, b1= 24, lda= 48, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 5.140625 *** Test in line 708 failed : dsbrdt returned info= 12 (expected 1) Line 708 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 200, b1= 32, lda= 64, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 5.389648 *** Test in line 711 failed : dsbrdt returned info= 16 (expected 1) Line 711 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 200, b1= 48, lda= 96, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 5.629883 *** Test in line 714 failed : dsbrdt returned info= 22 (expected 1) Line 714 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 200, b1= 64, lda= 128, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 5.889648 *** Test in line 719 failed : dsbrdt returned info= 3 (expected 1) Line 719 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 400, b1= 4, lda= 8, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 40.810547 *** Test in line 722 failed : dsbrdt returned info= 4 (expected 1) Line 722 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 400, b1= 8, lda= 16, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 38.150391 *** Test in line 725 failed : dsbrdt returned info= 4 (expected 1) Line 725 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 400, b1= 12, lda= 24, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 37.580078 *** Test in line 728 failed : dsbrdt returned info= 6 (expected 1) Line 728 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 400, b1= 16, lda= 32, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 37.529297 *** Test in line 731 failed : dsbrdt returned info= 8 (expected 1) Line 731 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 400, b1= 24, lda= 48, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 38.089844 *** Test in line 734 failed : dsbrdt returned info= 12 (expected 1) Line 734 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 400, b1= 32, lda= 64, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 39.389648 *** Test in line 737 failed : dsbrdt returned info= 16 (expected 1) Line 737 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 400, b1= 48, lda= 96, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 41.040039 *** Test in line 740 failed : dsbrdt returned info= 22 (expected 1) Line 740 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 400, b1= 64, lda= 128, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 42.830078 *** Test in line 745 failed : dsbrdt returned info= 3 (expected 1) Line 745 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 600, b1= 4, lda= 8, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 135.049805 *** Test in line 748 failed : dsbrdt returned info= 4 (expected 1) Line 748 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 600, b1= 8, lda= 16, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 126.279297 *** Test in line 751 failed : dsbrdt returned info= 4 (expected 1) Line 751 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 600, b1= 12, lda= 24, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 123.990234 *** Test in line 754 failed : dsbrdt returned info= 6 (expected 1) Line 754 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 600, b1= 16, lda= 32, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 126.099609 *** Test in line 757 failed : dsbrdt returned info= 8 (expected 1) Line 757 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 600, b1= 24, lda= 48, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 127.290039 *** Test in line 760 failed : dsbrdt returned info= 12 (expected 1) Line 760 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 600, b1= 32, lda= 64, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 131.120117 *** Test in line 763 failed : dsbrdt returned info= 16 (expected 1) Line 763 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 600, b1= 48, lda= 96, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 134.370117 *** Test in line 766 failed : dsbrdt returned info= 22 (expected 1) Line 766 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 600, b1= 64, lda= 128, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 139.489258 *** Test in line 771 failed : dsbrdt returned info= 3 (expected 1) Line 771 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 800, b1= 4, lda= 8, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 314.759766 *** Test in line 774 failed : dsbrdt returned info= 4 (expected 1) Line 774 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 800, b1= 8, lda= 16, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 298.330078 *** Test in line 777 failed : dsbrdt returned info= 4 (expected 1) Line 777 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 800, b1= 12, lda= 24, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 291.160156 *** Test in line 780 failed : dsbrdt returned info= 6 (expected 1) Line 780 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 800, b1= 16, lda= 32, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 296.000000 *** Test in line 783 failed : dsbrdt returned info= 8 (expected 1) Line 783 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 800, b1= 24, lda= 48, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 297.229492 *** Test in line 786 failed : dsbrdt returned info= 12 (expected 1) Line 786 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 800, b1= 32, lda= 64, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 304.639648 *** Test in line 789 failed : dsbrdt returned info= 16 (expected 1) Line 789 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 800, b1= 48, lda= 96, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 310.850586 *** Test in line 792 failed : dsbrdt returned info= 22 (expected 1) Line 792 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 800, b1= 64, lda= 128, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 320.259766 *** Test in line 797 failed : dsbrdt returned info= 3 (expected 1) Line 797 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 1000, b1= 4, lda= 8, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 612.699219 *** Test in line 800 failed : dsbrdt returned info= 4 (expected 1) Line 800 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 1000, b1= 8, lda= 16, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 582.500000 *** Test in line 803 failed : dsbrdt returned info= 4 (expected 1) Line 803 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 1000, b1= 12, lda= 24, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 567.380859 *** Test in line 806 failed : dsbrdt returned info= 6 (expected 1) Line 806 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 1000, b1= 16, lda= 32, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 574.790039 *** Test in line 809 failed : dsbrdt returned info= 8 (expected 1) Line 809 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 1000, b1= 24, lda= 48, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 576.379883 *** Test in line 812 failed : dsbrdt returned info= 12 (expected 1) Line 812 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 1000, b1= 32, lda= 64, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 589.299805 *** Test in line 815 failed : dsbrdt returned info= 16 (expected 1) Line 815 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 1000, b1= 48, lda= 96, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 597.101563 *** Test in line 818 failed : dsbrdt returned info= 22 (expected 1) Line 818 / dsbrdt : banded -> tridiagonal, one-step (SBR) , mtype=R, diam= 0.0000E+00, n= 1000, b1= 64, lda= 128, drptol= 0.0000E+00, nb= 0, jobu=U, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 612.800781 *** Timing the SBR driver banded -> tridiagonal *** no update Line 876 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 4, lda= 8, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.109375 Line 879 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 8, lda= 16, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.291016 Line 882 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 12, lda= 24, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.509766 Line 885 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 16, lda= 32, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.599609 Line 888 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 24, lda= 48, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.769531 Line 891 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 32, lda= 64, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.919922 Line 894 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 48, lda= 96, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 1.509766 Line 897 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 64, lda= 128, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 1.990234 Line 902 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 4, lda= 8, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 0.390625 Line 905 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 8, lda= 16, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 0.900391 Line 908 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 12, lda= 24, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 1.560547 Line 911 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 16, lda= 32, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 2.560547 Line 914 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 24, lda= 48, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 3.400391 Line 917 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 32, lda= 64, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 4.191406 Line 920 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 48, lda= 96, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 7.160156 Line 923 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 64, lda= 128, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 9.830078 Line 928 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 4, lda= 8, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 0.839844 Line 931 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 8, lda= 16, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 1.869141 Line 934 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 12, lda= 24, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 3.179688 Line 937 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 16, lda= 32, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 5.871094 Line 940 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 24, lda= 48, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 7.880859 Line 943 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 32, lda= 64, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 9.880859 Line 946 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 48, lda= 96, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 16.980469 Line 949 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 64, lda= 128, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 23.710938 Line 954 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 4, lda= 8, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 1.451172 Line 957 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 8, lda= 16, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 3.210938 Line 960 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 12, lda= 24, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 5.300781 Line 963 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 16, lda= 32, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 10.570313 Line 966 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 24, lda= 48, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 14.279297 Line 969 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 32, lda= 64, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 17.919922 Line 972 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 48, lda= 96, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 30.880859 Line 975 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 64, lda= 128, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 43.470703 Line 980 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 4, lda= 8, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 2.250000 Line 983 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 8, lda= 16, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 4.849609 Line 986 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 12, lda= 24, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 7.990234 Line 989 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 16, lda= 32, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 16.589844 Line 992 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 24, lda= 48, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 22.480469 Line 995 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 32, lda= 64, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 28.359375 Line 998 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 48, lda= 96, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 48.900391 Line 1001 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 64, lda= 128, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 69.310547 with update Line 1010 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 4, lda= 8, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.109375 Line 1013 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 8, lda= 16, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.289063 Line 1016 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 12, lda= 24, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.509766 Line 1019 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 16, lda= 32, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.611328 Line 1022 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 24, lda= 48, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.781250 Line 1025 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 32, lda= 64, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 0.919922 Line 1028 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 48, lda= 96, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 1.529297 Line 1031 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 200, b1= 64, lda= 128, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 200, lwork= 1000000, xinfo= 1, reduction time= 2.000000 Line 1036 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 4, lda= 8, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 0.390625 Line 1039 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 8, lda= 16, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 0.898438 Line 1042 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 12, lda= 24, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 1.558594 Line 1045 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 16, lda= 32, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 2.560547 Line 1048 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 24, lda= 48, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 3.410156 Line 1051 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 32, lda= 64, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 4.199219 Line 1054 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 48, lda= 96, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 7.160156 Line 1057 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 400, b1= 64, lda= 128, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 400, lwork= 1000000, xinfo= 1, reduction time= 9.859375 Line 1062 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 4, lda= 8, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 0.841797 Line 1065 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 8, lda= 16, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 1.880859 Line 1068 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 12, lda= 24, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 3.179688 Line 1071 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 16, lda= 32, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 5.878906 Line 1074 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 24, lda= 48, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 7.900391 Line 1077 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 32, lda= 64, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 9.900391 Line 1080 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 48, lda= 96, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 17.089844 Line 1083 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 600, b1= 64, lda= 128, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 600, lwork= 1000000, xinfo= 1, reduction time= 23.699219 Line 1088 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 4, lda= 8, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 1.449219 Line 1091 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 8, lda= 16, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 3.189453 Line 1094 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 12, lda= 24, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 5.320313 Line 1097 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 16, lda= 32, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 10.560547 Line 1100 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 24, lda= 48, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 14.240234 Line 1103 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 32, lda= 64, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 17.900391 Line 1106 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 48, lda= 96, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 30.910156 Line 1109 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 800, b1= 64, lda= 128, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 800, lwork= 1000000, xinfo= 1, reduction time= 43.628906 Line 1114 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 4, lda= 8, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 2.259766 Line 1117 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 8, lda= 16, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 4.949219 Line 1120 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 12, lda= 24, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 8.111328 Line 1123 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 16, lda= 32, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 16.529297 Line 1126 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 24, lda= 48, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 22.419922 Line 1129 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 32, lda= 64, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 28.361328 Line 1132 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 48, lda= 96, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 49.230469 Line 1135 / dsbrdd : reduction driver for banded matrcs (SBR), mtype=R, diam= 0.0000E+00, uplo=L, n= 1000, b1= 64, lda= 128, b2= 1, nsteps= 0, drptol= 0.0000E+00, jobu=N, ldu= 1000, lwork= 1000000, xinfo= 1, reduction time= 69.419922 =============================================================================== Tests for Total Skipped Failed ------------------------------------------------------------------------------- dsytrd : full -> tridiagonal, one-step (LAPACK) : 10 0 0 dorgtr : accumulation of transformations (LAPACK) : 5 0 0 dsbtrd : banded -> tridiagonal, one-step (LAPACK) : 80 0 0 dsyrdb : full -> banded, one-step (SBR) : 0 0 0 dsygtr : accumulation of transformations (SBR) : 0 0 0 dsbrdb : banded -> banded, one-step (SBR) : 0 0 0 dsbrdt : banded -> tridiagonal, one-step (SBR) : 80 0 40 dsy2bc : copy full -> banded (SBR) : 0 0 0 dsy2bi : in-place copy full -> banded (SBR) : 0 0 0 dsb2bc : copy banded -> banded (SBR) : 0 0 0 dsb2bi : in-place copy banded -> banded (SBR) : 0 0 0 dsyrdd : reduction driver for full matrices (SBR) : 10 0 0 dsbrdd : reduction driver for banded matrcs (SBR) : 80 0 0 ------------------------------------------------------------------------------- Total : : 265 0 40 ------------------------------------------------------------------------------- Total time : 20163.49 seconds SHAR_EOF fi # end of overwriting check if test -f 'res3' then echo shar: will not over-write existing file "'res3'" else cat << "SHAR_EOF" > 'res3' *** Setting nb for SYRDB *** no update dsyrdb: uplo=L, jobu=N, n= 200, b2= 64, nb= 1, info= 1, time= 1.270 dsyrdb: uplo=L, jobu=N, n= 200, b2= 64, nb= 4, info= 4, time= 1.240 dsyrdb: uplo=L, jobu=N, n= 200, b2= 64, nb= 6, info= 6, time= 1.320 dsyrdb: uplo=L, jobu=N, n= 200, b2= 64, nb= 8, info= 8, time= 1.290 dsyrdb: uplo=L, jobu=N, n= 200, b2= 64, nb= 12, info= 12, time= 1.420 dsyrdb: uplo=L, jobu=N, n= 200, b2= 64, nb= 16, info= 16, time= 1.450 dsyrdb: uplo=L, jobu=N, n= 200, b2= 64, nb= 20, info= 20, time= 1.510 dsyrdb: uplo=L, jobu=N, n= 200, b2= 64, nb= 24, info= 24, time= 1.580 dsyrdb: uplo=L, jobu=N, n= 200, b2= 64, nb= 32, info= 32, time= 1.730 dsyrdb: uplo=L, jobu=N, n= 200, b2= 64, nb= 40, info= 40, time= 1.880 dsyrdb: uplo=L, jobu=N, n= 200, b2= 64, nb= 48, info= 48, time= 2.040 dsyrdb: uplo=L, jobu=N, n= 200, b2= 64, nb= 64, info= 64, time= 2.430 dsyrdb: uplo=L, jobu=N, n= 400, b2= 64, nb= 1, info= 1, time= 13.390 dsyrdb: uplo=L, jobu=N, n= 400, b2= 64, nb= 4, info= 4, time= 13.300 dsyrdb: uplo=L, jobu=N, n= 400, b2= 64, nb= 6, info= 6, time= 13.450 dsyrdb: uplo=L, jobu=N, n= 400, b2= 64, nb= 8, info= 8, time= 13.800 dsyrdb: uplo=L, jobu=N, n= 400, b2= 64, nb= 12, info= 12, time= 14.120 dsyrdb: uplo=L, jobu=N, n= 400, b2= 64, nb= 16, info= 16, time= 14.760 dsyrdb: uplo=L, jobu=N, n= 400, b2= 64, nb= 20, info= 20, time= 14.640 dsyrdb: uplo=L, jobu=N, n= 400, b2= 64, nb= 24, info= 24, time= 14.980 dsyrdb: uplo=L, jobu=N, n= 400, b2= 64, nb= 32, info= 32, time= 15.730 dsyrdb: uplo=L, jobu=N, n= 400, b2= 64, nb= 40, info= 40, time= 16.440 dsyrdb: uplo=L, jobu=N, n= 400, b2= 64, nb= 48, info= 48, time= 17.400 dsyrdb: uplo=L, jobu=N, n= 400, b2= 64, nb= 64, info= 64, time= 19.230 dsyrdb: uplo=L, jobu=N, n= 600, b2= 64, nb= 1, info= 1, time= 48.980 dsyrdb: uplo=L, jobu=N, n= 600, b2= 64, nb= 4, info= 4, time= 49.430 dsyrdb: uplo=L, jobu=N, n= 600, b2= 64, nb= 6, info= 6, time= 49.630 dsyrdb: uplo=L, jobu=N, n= 600, b2= 64, nb= 8, info= 8, time= 49.520 dsyrdb: uplo=L, jobu=N, n= 600, b2= 64, nb= 12, info= 12, time= 50.610 dsyrdb: uplo=L, jobu=N, n= 600, b2= 64, nb= 16, info= 16, time= 51.060 dsyrdb: uplo=L, jobu=N, n= 600, b2= 64, nb= 20, info= 20, time= 52.040 dsyrdb: uplo=L, jobu=N, n= 600, b2= 64, nb= 24, info= 24, time= 53.560 dsyrdb: uplo=L, jobu=N, n= 600, b2= 64, nb= 32, info= 32, time= 55.650 dsyrdb: uplo=L, jobu=N, n= 600, b2= 64, nb= 40, info= 40, time= 56.910 dsyrdb: uplo=L, jobu=N, n= 600, b2= 64, nb= 48, info= 48, time= 58.370 dsyrdb: uplo=L, jobu=N, n= 600, b2= 64, nb= 64, info= 64, time= 62.150 with update dsyrdb: uplo=L, jobu=U, n= 200, b2= 64, nb= 1, info= 1, time= 3.070 dsyrdb: uplo=L, jobu=U, n= 200, b2= 64, nb= 4, info= 4, time= 3.120 dsyrdb: uplo=L, jobu=U, n= 200, b2= 64, nb= 6, info= 6, time= 3.140 dsyrdb: uplo=L, jobu=U, n= 200, b2= 64, nb= 8, info= 8, time= 3.170 dsyrdb: uplo=L, jobu=U, n= 200, b2= 64, nb= 12, info= 12, time= 3.250 dsyrdb: uplo=L, jobu=U, n= 200, b2= 64, nb= 16, info= 16, time= 3.470 dsyrdb: uplo=L, jobu=U, n= 200, b2= 64, nb= 20, info= 20, time= 3.550 dsyrdb: uplo=L, jobu=U, n= 200, b2= 64, nb= 24, info= 24, time= 3.620 dsyrdb: uplo=L, jobu=U, n= 200, b2= 64, nb= 32, info= 32, time= 3.810 dsyrdb: uplo=L, jobu=U, n= 200, b2= 64, nb= 40, info= 40, time= 4.030 dsyrdb: uplo=L, jobu=U, n= 200, b2= 64, nb= 48, info= 48, time= 4.140 dsyrdb: uplo=L, jobu=U, n= 200, b2= 64, nb= 64, info= 64, time= 4.610 dsyrdb: uplo=L, jobu=U, n= 400, b2= 64, nb= 1, info= 1, time= 36.240 dsyrdb: uplo=L, jobu=U, n= 400, b2= 64, nb= 4, info= 4, time= 35.970 dsyrdb: uplo=L, jobu=U, n= 400, b2= 64, nb= 6, info= 6, time= 36.550 dsyrdb: uplo=L, jobu=U, n= 400, b2= 64, nb= 8, info= 8, time= 36.880 dsyrdb: uplo=L, jobu=U, n= 400, b2= 64, nb= 12, info= 12, time= 37.120 dsyrdb: uplo=L, jobu=U, n= 400, b2= 64, nb= 16, info= 16, time= 37.410 dsyrdb: uplo=L, jobu=U, n= 400, b2= 64, nb= 20, info= 20, time= 37.980 dsyrdb: uplo=L, jobu=U, n= 400, b2= 64, nb= 24, info= 24, time= 38.480 dsyrdb: uplo=L, jobu=U, n= 400, b2= 64, nb= 32, info= 32, time= 39.160 dsyrdb: uplo=L, jobu=U, n= 400, b2= 64, nb= 40, info= 40, time= 40.440 dsyrdb: uplo=L, jobu=U, n= 400, b2= 64, nb= 48, info= 48, time= 41.380 dsyrdb: uplo=L, jobu=U, n= 400, b2= 64, nb= 64, info= 64, time= 44.110 dsyrdb: uplo=L, jobu=U, n= 600, b2= 64, nb= 1, info= 1, time= 138.830 dsyrdb: uplo=L, jobu=U, n= 600, b2= 64, nb= 4, info= 4, time= 138.800 dsyrdb: uplo=L, jobu=U, n= 600, b2= 64, nb= 6, info= 6, time= 139.300 dsyrdb: uplo=L, jobu=U, n= 600, b2= 64, nb= 8, info= 8, time= 139.740 dsyrdb: uplo=L, jobu=U, n= 600, b2= 64, nb= 12, info= 12, time= 141.290 dsyrdb: uplo=L, jobu=U, n= 600, b2= 64, nb= 16, info= 16, time= 142.420 dsyrdb: uplo=L, jobu=U, n= 600, b2= 64, nb= 20, info= 20, time= 143.170 dsyrdb: uplo=L, jobu=U, n= 600, b2= 64, nb= 24, info= 24, time= 144.470 dsyrdb: uplo=L, jobu=U, n= 600, b2= 64, nb= 32, info= 32, time= 146.940 dsyrdb: uplo=L, jobu=U, n= 600, b2= 64, nb= 40, info= 40, time= 150.100 dsyrdb: uplo=L, jobu=U, n= 600, b2= 64, nb= 48, info= 48, time= 153.050 dsyrdb: uplo=L, jobu=U, n= 600, b2= 64, nb= 64, info= 64, time= 156.950 *** Setting nb for SBRDB *** no update dsbrdb: jobu=N, n= 200, b1= 16, b2= 8, nb= 1, info= 1, time= 0.630 dsbrdb: jobu=N, n= 200, b1= 16, b2= 8, nb= 4, info= 4, time= 0.640 dsbrdb: jobu=N, n= 200, b1= 16, b2= 8, nb= 6, info= 6, time= 0.700 dsbrdb: jobu=N, n= 200, b1= 16, b2= 8, nb= 8, info= 8, time= 0.820 dsbrdb: jobu=N, n= 200, b1= 32, b2= 16, nb= 1, info= 1, time= 0.750 dsbrdb: jobu=N, n= 200, b1= 32, b2= 16, nb= 4, info= 4, time= 0.780 dsbrdb: jobu=N, n= 200, b1= 32, b2= 16, nb= 6, info= 6, time= 0.870 dsbrdb: jobu=N, n= 200, b1= 32, b2= 16, nb= 8, info= 8, time= 0.950 dsbrdb: jobu=N, n= 200, b1= 32, b2= 16, nb= 10, info= 10, time= 1.060 dsbrdb: jobu=N, n= 200, b1= 32, b2= 16, nb= 12, info= 12, time= 1.070 dsbrdb: jobu=N, n= 200, b1= 32, b2= 16, nb= 16, info= 16, time= 1.260 dsbrdb: jobu=N, n= 200, b1= 64, b2= 32, nb= 1, info= 1, time= 0.960 dsbrdb: jobu=N, n= 200, b1= 64, b2= 32, nb= 4, info= 4, time= 1.000 dsbrdb: jobu=N, n= 200, b1= 64, b2= 32, nb= 6, info= 6, time= 1.070 dsbrdb: jobu=N, n= 200, b1= 64, b2= 32, nb= 8, info= 8, time= 1.120 dsbrdb: jobu=N, n= 200, b1= 64, b2= 32, nb= 10, info= 10, time= 1.120 dsbrdb: jobu=N, n= 200, b1= 64, b2= 32, nb= 12, info= 12, time= 1.250 dsbrdb: jobu=N, n= 200, b1= 64, b2= 32, nb= 16, info= 16, time= 1.320 dsbrdb: jobu=N, n= 200, b1= 64, b2= 32, nb= 20, info= 20, time= 1.480 dsbrdb: jobu=N, n= 200, b1= 64, b2= 32, nb= 24, info= 24, time= 1.670 dsbrdb: jobu=N, n= 200, b1= 64, b2= 32, nb= 32, info= 32, time= 1.940 dsbrdb: jobu=N, n= 400, b1= 16, b2= 8, nb= 1, info= 1, time= 2.620 dsbrdb: jobu=N, n= 400, b1= 16, b2= 8, nb= 4, info= 4, time= 2.700 dsbrdb: jobu=N, n= 400, b1= 16, b2= 8, nb= 6, info= 6, time= 3.010 dsbrdb: jobu=N, n= 400, b1= 16, b2= 8, nb= 8, info= 8, time= 3.410 dsbrdb: jobu=N, n= 400, b1= 32, b2= 16, nb= 1, info= 1, time= 3.330 dsbrdb: jobu=N, n= 400, b1= 32, b2= 16, nb= 4, info= 4, time= 3.500 dsbrdb: jobu=N, n= 400, b1= 32, b2= 16, nb= 6, info= 6, time= 3.880 dsbrdb: jobu=N, n= 400, b1= 32, b2= 16, nb= 8, info= 8, time= 4.270 dsbrdb: jobu=N, n= 400, b1= 32, b2= 16, nb= 10, info= 10, time= 4.780 dsbrdb: jobu=N, n= 400, b1= 32, b2= 16, nb= 12, info= 12, time= 4.960 dsbrdb: jobu=N, n= 400, b1= 32, b2= 16, nb= 16, info= 16, time= 5.790 dsbrdb: jobu=N, n= 400, b1= 64, b2= 32, nb= 1, info= 1, time= 5.000 dsbrdb: jobu=N, n= 400, b1= 64, b2= 32, nb= 4, info= 4, time= 5.250 dsbrdb: jobu=N, n= 400, b1= 64, b2= 32, nb= 6, info= 6, time= 5.610 dsbrdb: jobu=N, n= 400, b1= 64, b2= 32, nb= 8, info= 8, time= 5.650 dsbrdb: jobu=N, n= 400, b1= 64, b2= 32, nb= 10, info= 10, time= 5.920 dsbrdb: jobu=N, n= 400, b1= 64, b2= 32, nb= 12, info= 12, time= 6.240 dsbrdb: jobu=N, n= 400, b1= 64, b2= 32, nb= 16, info= 16, time= 7.160 dsbrdb: jobu=N, n= 400, b1= 64, b2= 32, nb= 20, info= 20, time= 7.660 dsbrdb: jobu=N, n= 400, b1= 64, b2= 32, nb= 24, info= 24, time= 8.450 dsbrdb: jobu=N, n= 400, b1= 64, b2= 32, nb= 32, info= 32, time= 10.080 dsbrdb: jobu=N, n= 600, b1= 16, b2= 8, nb= 1, info= 1, time= 5.970 dsbrdb: jobu=N, n= 600, b1= 16, b2= 8, nb= 4, info= 4, time= 6.120 dsbrdb: jobu=N, n= 600, b1= 16, b2= 8, nb= 6, info= 6, time= 6.840 dsbrdb: jobu=N, n= 600, b1= 16, b2= 8, nb= 8, info= 8, time= 7.870 dsbrdb: jobu=N, n= 600, b1= 32, b2= 16, nb= 1, info= 1, time= 7.790 dsbrdb: jobu=N, n= 600, b1= 32, b2= 16, nb= 4, info= 4, time= 8.280 dsbrdb: jobu=N, n= 600, b1= 32, b2= 16, nb= 6, info= 6, time= 9.020 dsbrdb: jobu=N, n= 600, b1= 32, b2= 16, nb= 8, info= 8, time= 10.090 dsbrdb: jobu=N, n= 600, b1= 32, b2= 16, nb= 10, info= 10, time= 10.990 dsbrdb: jobu=N, n= 600, b1= 32, b2= 16, nb= 12, info= 12, time= 11.510 dsbrdb: jobu=N, n= 600, b1= 32, b2= 16, nb= 16, info= 16, time= 13.560 dsbrdb: jobu=N, n= 600, b1= 64, b2= 32, nb= 1, info= 1, time= 12.380 dsbrdb: jobu=N, n= 600, b1= 64, b2= 32, nb= 4, info= 4, time= 12.830 dsbrdb: jobu=N, n= 600, b1= 64, b2= 32, nb= 6, info= 6, time= 13.780 dsbrdb: jobu=N, n= 600, b1= 64, b2= 32, nb= 8, info= 8, time= 14.010 dsbrdb: jobu=N, n= 600, b1= 64, b2= 32, nb= 10, info= 10, time= 14.709 dsbrdb: jobu=N, n= 600, b1= 64, b2= 32, nb= 12, info= 12, time= 15.780 dsbrdb: jobu=N, n= 600, b1= 64, b2= 32, nb= 16, info= 16, time= 17.170 dsbrdb: jobu=N, n= 600, b1= 64, b2= 32, nb= 20, info= 20, time= 18.850 dsbrdb: jobu=N, n= 600, b1= 64, b2= 32, nb= 24, info= 24, time= 20.540 dsbrdb: jobu=N, n= 600, b1= 64, b2= 32, nb= 32, info= 32, time= 24.650 with update dsbrdb: jobu=U, n= 200, b1= 16, b2= 8, nb= 1, info= 1, time= 2.930 dsbrdb: jobu=U, n= 200, b1= 16, b2= 8, nb= 4, info= 4, time= 3.060 dsbrdb: jobu=U, n= 200, b1= 16, b2= 8, nb= 6, info= 6, time= 3.210 dsbrdb: jobu=U, n= 200, b1= 16, b2= 8, nb= 8, info= 8, time= 3.480 dsbrdb: jobu=U, n= 200, b1= 32, b2= 16, nb= 1, info= 1, time= 2.780 dsbrdb: jobu=U, n= 200, b1= 32, b2= 16, nb= 4, info= 4, time= 2.920 dsbrdb: jobu=U, n= 200, b1= 32, b2= 16, nb= 6, info= 6, time= 3.000 dsbrdb: jobu=U, n= 200, b1= 32, b2= 16, nb= 8, info= 8, time= 3.180 dsbrdb: jobu=U, n= 200, b1= 32, b2= 16, nb= 10, info= 10, time= 3.310 dsbrdb: jobu=U, n= 200, b1= 32, b2= 16, nb= 12, info= 12, time= 3.460 dsbrdb: jobu=U, n= 200, b1= 32, b2= 16, nb= 16, info= 16, time= 3.750 dsbrdb: jobu=U, n= 200, b1= 64, b2= 32, nb= 1, info= 1, time= 2.740 dsbrdb: jobu=U, n= 200, b1= 64, b2= 32, nb= 4, info= 4, time= 2.790 dsbrdb: jobu=U, n= 200, b1= 64, b2= 32, nb= 6, info= 6, time= 2.940 dsbrdb: jobu=U, n= 200, b1= 64, b2= 32, nb= 8, info= 8, time= 2.980 dsbrdb: jobu=U, n= 200, b1= 64, b2= 32, nb= 10, info= 10, time= 3.040 dsbrdb: jobu=U, n= 200, b1= 64, b2= 32, nb= 12, info= 12, time= 3.130 dsbrdb: jobu=U, n= 200, b1= 64, b2= 32, nb= 16, info= 16, time= 3.330 dsbrdb: jobu=U, n= 200, b1= 64, b2= 32, nb= 20, info= 20, time= 3.510 dsbrdb: jobu=U, n= 200, b1= 64, b2= 32, nb= 24, info= 24, time= 3.660 dsbrdb: jobu=U, n= 200, b1= 64, b2= 32, nb= 32, info= 32, time= 4.140 dsbrdb: jobu=U, n= 400, b1= 16, b2= 8, nb= 1, info= 1, time= 20.950 dsbrdb: jobu=U, n= 400, b1= 16, b2= 8, nb= 4, info= 4, time= 22.300 dsbrdb: jobu=U, n= 400, b1= 16, b2= 8, nb= 6, info= 6, time= 23.640 dsbrdb: jobu=U, n= 400, b1= 16, b2= 8, nb= 8, info= 8, time= 24.880 dsbrdb: jobu=U, n= 400, b1= 32, b2= 16, nb= 1, info= 1, time= 20.020 dsbrdb: jobu=U, n= 400, b1= 32, b2= 16, nb= 4, info= 4, time= 21.020 dsbrdb: jobu=U, n= 400, b1= 32, b2= 16, nb= 6, info= 6, time= 21.940 dsbrdb: jobu=U, n= 400, b1= 32, b2= 16, nb= 8, info= 8, time= 22.590 dsbrdb: jobu=U, n= 400, b1= 32, b2= 16, nb= 10, info= 10, time= 23.700 dsbrdb: jobu=U, n= 400, b1= 32, b2= 16, nb= 12, info= 12, time= 23.920 dsbrdb: jobu=U, n= 400, b1= 32, b2= 16, nb= 16, info= 16, time= 26.150 dsbrdb: jobu=U, n= 400, b1= 64, b2= 32, nb= 1, info= 1, time= 20.490 dsbrdb: jobu=U, n= 400, b1= 64, b2= 32, nb= 4, info= 4, time= 20.790 dsbrdb: jobu=U, n= 400, b1= 64, b2= 32, nb= 6, info= 6, time= 21.900 dsbrdb: jobu=U, n= 400, b1= 64, b2= 32, nb= 8, info= 8, time= 22.290 dsbrdb: jobu=U, n= 400, b1= 64, b2= 32, nb= 10, info= 10, time= 22.880 dsbrdb: jobu=U, n= 400, b1= 64, b2= 32, nb= 12, info= 12, time= 23.110 dsbrdb: jobu=U, n= 400, b1= 64, b2= 32, nb= 16, info= 16, time= 24.390 dsbrdb: jobu=U, n= 400, b1= 64, b2= 32, nb= 20, info= 20, time= 25.380 dsbrdb: jobu=U, n= 400, b1= 64, b2= 32, nb= 24, info= 24, time= 27.070 dsbrdb: jobu=U, n= 400, b1= 64, b2= 32, nb= 32, info= 32, time= 29.140 dsbrdb: jobu=U, n= 600, b1= 16, b2= 8, nb= 1, info= 1, time= 70.370 dsbrdb: jobu=U, n= 600, b1= 16, b2= 8, nb= 4, info= 4, time= 74.440 dsbrdb: jobu=U, n= 600, b1= 16, b2= 8, nb= 6, info= 6, time= 79.360 dsbrdb: jobu=U, n= 600, b1= 16, b2= 8, nb= 8, info= 8, time= 82.550 dsbrdb: jobu=U, n= 600, b1= 32, b2= 16, nb= 1, info= 1, time= 66.310 dsbrdb: jobu=U, n= 600, b1= 32, b2= 16, nb= 4, info= 4, time= 68.650 dsbrdb: jobu=U, n= 600, b1= 32, b2= 16, nb= 6, info= 6, time= 71.141 dsbrdb: jobu=U, n= 600, b1= 32, b2= 16, nb= 8, info= 8, time= 74.350 dsbrdb: jobu=U, n= 600, b1= 32, b2= 16, nb= 10, info= 10, time= 76.760 dsbrdb: jobu=U, n= 600, b1= 32, b2= 16, nb= 12, info= 12, time= 78.660 dsbrdb: jobu=U, n= 600, b1= 32, b2= 16, nb= 16, info= 16, time= 84.010 dsbrdb: jobu=U, n= 600, b1= 64, b2= 32, nb= 1, info= 1, time= 67.820 dsbrdb: jobu=U, n= 600, b1= 64, b2= 32, nb= 4, info= 4, time= 68.250 dsbrdb: jobu=U, n= 600, b1= 64, b2= 32, nb= 6, info= 6, time= 70.200 dsbrdb: jobu=U, n= 600, b1= 64, b2= 32, nb= 8, info= 8, time= 71.410 dsbrdb: jobu=U, n= 600, b1= 64, b2= 32, nb= 10, info= 10, time= 73.390 dsbrdb: jobu=U, n= 600, b1= 64, b2= 32, nb= 12, info= 12, time= 74.640 dsbrdb: jobu=U, n= 600, b1= 64, b2= 32, nb= 16, info= 16, time= 77.880 dsbrdb: jobu=U, n= 600, b1= 64, b2= 32, nb= 20, info= 20, time= 80.810 dsbrdb: jobu=U, n= 600, b1= 64, b2= 32, nb= 24, info= 24, time= 84.390 dsbrdb: jobu=U, n= 600, b1= 64, b2= 32, nb= 32, info= 32, time= 91.760 *** Setting nb for SBRDT *** with update dsbrdt: jobu=U, n= 200, b1= 8, nb= 1, info= 1, time= 1.061 dsbrdt: jobu=U, n= 200, b1= 8, nb= 4, info= 4, time= 4.899 dsbrdt: jobu=U, n= 200, b1= 8, nb= 6, info= 6, time= 5.300 dsbrdt: jobu=U, n= 200, b1= 8, nb= 8, info= 8, time= 5.400 dsbrdt: jobu=U, n= 200, b1= 8, nb= 10, info= 10, time= 5.650 dsbrdt: jobu=U, n= 200, b1= 8, nb= 12, info= 12, time= 5.931 dsbrdt: jobu=U, n= 200, b1= 16, nb= 1, info= 1, time= 3.279 dsbrdt: jobu=U, n= 200, b1= 16, nb= 4, info= 4, time= 4.890 dsbrdt: jobu=U, n= 200, b1= 16, nb= 6, info= 6, time= 5.021 dsbrdt: jobu=U, n= 200, b1= 16, nb= 8, info= 8, time= 5.210 dsbrdt: jobu=U, n= 200, b1= 16, nb= 10, info= 10, time= 5.320 dsbrdt: jobu=U, n= 200, b1= 16, nb= 12, info= 12, time= 5.510 dsbrdt: jobu=U, n= 200, b1= 16, nb= 16, info= 16, time= 5.790 dsbrdt: jobu=U, n= 200, b1= 16, nb= 20, info= 20, time= 6.120 dsbrdt: jobu=U, n= 200, b1= 16, nb= 24, info= 24, time= 6.330 dsbrdt: jobu=U, n= 200, b1= 32, nb= 1, info= 1, time= 3.630 dsbrdt: jobu=U, n= 200, b1= 32, nb= 4, info= 4, time= 5.060 dsbrdt: jobu=U, n= 200, b1= 32, nb= 6, info= 6, time= 5.190 dsbrdt: jobu=U, n= 200, b1= 32, nb= 8, info= 8, time= 5.280 dsbrdt: jobu=U, n= 200, b1= 32, nb= 10, info= 10, time= 5.431 dsbrdt: jobu=U, n= 200, b1= 32, nb= 12, info= 12, time= 5.390 dsbrdt: jobu=U, n= 200, b1= 32, nb= 16, info= 16, time= 5.640 dsbrdt: jobu=U, n= 200, b1= 32, nb= 20, info= 20, time= 5.840 dsbrdt: jobu=U, n= 200, b1= 32, nb= 32, info= 32, time= 6.351 dsbrdt: jobu=U, n= 200, b1= 32, nb= 40, info= 40, time= 6.750 dsbrdt: jobu=U, n= 400, b1= 8, nb= 1, info= 1, time= 7.909 dsbrdt: jobu=U, n= 400, b1= 8, nb= 4, info= 4, time= 37.670 dsbrdt: jobu=U, n= 400, b1= 8, nb= 6, info= 6, time= 39.450 dsbrdt: jobu=U, n= 400, b1= 8, nb= 8, info= 8, time= 41.660 dsbrdt: jobu=U, n= 400, b1= 8, nb= 10, info= 10, time= 43.540 dsbrdt: jobu=U, n= 400, b1= 8, nb= 12, info= 12, time= 45.710 dsbrdt: jobu=U, n= 400, b1= 16, nb= 1, info= 1, time= 24.511 dsbrdt: jobu=U, n= 400, b1= 16, nb= 4, info= 4, time= 36.641 dsbrdt: jobu=U, n= 400, b1= 16, nb= 6, info= 6, time= 37.859 dsbrdt: jobu=U, n= 400, b1= 16, nb= 8, info= 8, time= 38.819 dsbrdt: jobu=U, n= 400, b1= 16, nb= 10, info= 10, time= 39.811 dsbrdt: jobu=U, n= 400, b1= 16, nb= 12, info= 12, time= 41.170 dsbrdt: jobu=U, n= 400, b1= 16, nb= 16, info= 16, time= 43.399 dsbrdt: jobu=U, n= 400, b1= 16, nb= 20, info= 20, time= 45.570 dsbrdt: jobu=U, n= 400, b1= 16, nb= 24, info= 24, time= 47.580 dsbrdt: jobu=U, n= 400, b1= 32, nb= 1, info= 1, time= 25.990 dsbrdt: jobu=U, n= 400, b1= 32, nb= 4, info= 4, time= 37.250 dsbrdt: jobu=U, n= 400, b1= 32, nb= 6, info= 6, time= 38.069 dsbrdt: jobu=U, n= 400, b1= 32, nb= 8, info= 8, time= 38.739 dsbrdt: jobu=U, n= 400, b1= 32, nb= 10, info= 10, time= 39.380 dsbrdt: jobu=U, n= 400, b1= 32, nb= 12, info= 12, time= 40.000 dsbrdt: jobu=U, n= 400, b1= 32, nb= 16, info= 16, time= 40.950 dsbrdt: jobu=U, n= 400, b1= 32, nb= 20, info= 20, time= 42.250 dsbrdt: jobu=U, n= 400, b1= 32, nb= 32, info= 32, time= 46.030 dsbrdt: jobu=U, n= 400, b1= 32, nb= 40, info= 40, time= 48.239 dsbrdt: jobu=U, n= 600, b1= 8, nb= 1, info= 1, time= 25.600 dsbrdt: jobu=U, n= 600, b1= 8, nb= 4, info= 4, time= 127.690 dsbrdt: jobu=U, n= 600, b1= 8, nb= 6, info= 6, time= 134.300 dsbrdt: jobu=U, n= 600, b1= 8, nb= 8, info= 8, time= 141.820 dsbrdt: jobu=U, n= 600, b1= 8, nb= 10, info= 10, time= 148.960 dsbrdt: jobu=U, n= 600, b1= 8, nb= 12, info= 12, time= 155.729 dsbrdt: jobu=U, n= 600, b1= 16, nb= 1, info= 1, time= 81.830 dsbrdt: jobu=U, n= 600, b1= 16, nb= 4, info= 4, time= 123.700 dsbrdt: jobu=U, n= 600, b1= 16, nb= 6, info= 6, time= 127.140 dsbrdt: jobu=U, n= 600, b1= 16, nb= 8, info= 8, time= 131.060 dsbrdt: jobu=U, n= 600, b1= 16, nb= 10, info= 10, time= 134.700 dsbrdt: jobu=U, n= 600, b1= 16, nb= 12, info= 12, time= 137.830 dsbrdt: jobu=U, n= 600, b1= 16, nb= 16, info= 16, time= 145.110 dsbrdt: jobu=U, n= 600, b1= 16, nb= 20, info= 20, time= 154.210 dsbrdt: jobu=U, n= 600, b1= 16, nb= 24, info= 24, time= 161.670 dsbrdt: jobu=U, n= 600, b1= 32, nb= 1, info= 1, time= 86.070 dsbrdt: jobu=U, n= 600, b1= 32, nb= 4, info= 4, time= 125.300 dsbrdt: jobu=U, n= 600, b1= 32, nb= 6, info= 6, time= 127.330 dsbrdt: jobu=U, n= 600, b1= 32, nb= 8, info= 8, time= 128.700 dsbrdt: jobu=U, n= 600, b1= 32, nb= 10, info= 10, time= 131.110 dsbrdt: jobu=U, n= 600, b1= 32, nb= 12, info= 12, time= 132.750 dsbrdt: jobu=U, n= 600, b1= 32, nb= 16, info= 16, time= 136.310 dsbrdt: jobu=U, n= 600, b1= 32, nb= 20, info= 20, time= 140.510 dsbrdt: jobu=U, n= 600, b1= 32, nb= 32, info= 32, time= 152.310 dsbrdt: jobu=U, n= 600, b1= 32, nb= 40, info= 40, time= 160.960 =============================================================================== Tests for Total Skipped Failed ------------------------------------------------------------------------------- dsytrd : full -> tridiagonal, one-step (LAPACK) : 0 0 0 dorgtr : accumulation of transformations (LAPACK) : 0 0 0 dsbtrd : banded -> tridiagonal, one-step (LAPACK) : 0 0 0 dsyrdb : full -> banded, one-step (SBR) : 72 0 0 dsygtr : accumulation of transformations (SBR) : 0 0 0 dsbrdb : banded -> banded, one-step (SBR) : 126 0 0 dsbrdt : banded -> tridiagonal, one-step (SBR) : 75 0 0 dsy2bc : copy full -> banded (SBR) : 0 0 0 dsy2bi : in-place copy full -> banded (SBR) : 0 0 0 dsb2bc : copy banded -> banded (SBR) : 0 0 0 dsb2bi : in-place copy banded -> banded (SBR) : 0 0 0 dsyrdd : reduction driver for full matrices (SBR) : 0 0 0 dsbrdd : reduction driver for banded matrcs (SBR) : 0 0 0 ------------------------------------------------------------------------------- Total : : 273 0 0 ------------------------------------------------------------------------------- Total time : 13000.97 seconds SHAR_EOF fi # end of overwriting check if test -f 'res4' then echo shar: will not over-write existing file "'res4'" else cat << "SHAR_EOF" > 'res4' *** Setting intermediate bandwidth for SYRDD *** no update one-step (b=1): dsyrdd: uplo=L, job=N, n= 200, b2= 1, nsteps= 1, step= 1, info= 1, time= 1.320 b=12: dsyrdd: uplo=L, job=N, n= 200, b2= 1, nsteps= 2, step= 2, info= 1, time= 2.690 b=16: dsyrdd: uplo=L, job=N, n= 200, b2= 1, nsteps= 2, step= 2, info= 1, time= 2.860 b=20: dsyrdd: uplo=L, job=N, n= 200, b2= 1, nsteps= 2, step= 2, info= 1, time= 3.010 b=24: dsyrdd: uplo=L, job=N, n= 200, b2= 1, nsteps= 2, step= 2, info= 1, time= 3.100 b=32: dsyrdd: uplo=L, job=N, n= 200, b2= 1, nsteps= 2, step= 2, info= 1, time= 3.350 b=40: dsyrdd: uplo=L, job=N, n= 200, b2= 1, nsteps= 2, step= 2, info= 1, time= 3.400 b=48: dsyrdd: uplo=L, job=N, n= 200, b2= 1, nsteps= 2, step= 2, info= 1, time= 3.230 b=64: dsyrdd: uplo=L, job=N, n= 200, b2= 1, nsteps= 2, step= 2, info= 1, time= 3.090 one-step (b=1): dsyrdd: uplo=L, job=N, n= 400, b2= 1, nsteps= 1, step= 1, info= 1, time= 10.130 b=12: dsyrdd: uplo=L, job=N, n= 400, b2= 1, nsteps= 2, step= 2, info= 1, time= 18.920 b=16: dsyrdd: uplo=L, job=N, n= 400, b2= 1, nsteps= 2, step= 2, info= 1, time= 20.190 b=20: dsyrdd: uplo=L, job=N, n= 400, b2= 1, nsteps= 2, step= 2, info= 1, time= 20.610 b=24: dsyrdd: uplo=L, job=N, n= 400, b2= 1, nsteps= 2, step= 2, info= 1, time= 20.900 b=32: dsyrdd: uplo=L, job=N, n= 400, b2= 1, nsteps= 2, step= 2, info= 1, time= 21.980 b=40: dsyrdd: uplo=L, job=N, n= 400, b2= 1, nsteps= 2, step= 2, info= 1, time= 22.510 b=48: dsyrdd: uplo=L, job=N, n= 400, b2= 1, nsteps= 2, step= 2, info= 1, time= 23.210 b=64: dsyrdd: uplo=L, job=N, n= 400, b2= 1, nsteps= 2, step= 2, info= 1, time= 23.240 one-step (b=1): dsyrdd: uplo=L, job=N, n= 600, b2= 1, nsteps= 1, step= 1, info= 1, time= 35.030 b=12: dsyrdd: uplo=L, job=N, n= 600, b2= 1, nsteps= 2, step= 2, info= 1, time= 60.340 b=16: dsyrdd: uplo=L, job=N, n= 600, b2= 1, nsteps= 2, step= 2, info= 1, time= 63.460 b=20: dsyrdd: uplo=L, job=N, n= 600, b2= 1, nsteps= 2, step= 2, info= 1, time= 64.890 b=24: dsyrdd: uplo=L, job=N, n= 600, b2= 1, nsteps= 2, step= 2, info= 1, time= 66.460 b=32: dsyrdd: uplo=L, job=N, n= 600, b2= 1, nsteps= 2, step= 2, info= 1, time= 69.220 b=40: dsyrdd: uplo=L, job=N, n= 600, b2= 1, nsteps= 2, step= 2, info= 1, time= 71.170 b=48: dsyrdd: uplo=L, job=N, n= 600, b2= 1, nsteps= 2, step= 2, info= 1, time= 71.720 b=64: dsyrdd: uplo=L, job=N, n= 600, b2= 1, nsteps= 2, step= 2, info= 1, time= 73.120 with update one-step (b=1): dsyrdd: uplo=L, job=U, n= 200, b2= 1, nsteps= 1, step= 1, info= 1, time= 3.620 b=12: dsyrdd: uplo=L, job=U, n= 200, b2= 1, nsteps= 2, step= 2, info= 1, time= 9.020 b=16: dsyrdd: uplo=L, job=U, n= 200, b2= 1, nsteps= 2, step= 2, info= 1, time= 9.090 b=20: dsyrdd: uplo=L, job=U, n= 200, b2= 1, nsteps= 2, step= 2, info= 1, time= 9.200 b=24: dsyrdd: uplo=L, job=U, n= 200, b2= 1, nsteps= 2, step= 2, info= 1, time= 9.130 b=32: dsyrdd: uplo=L, job=U, n= 200, b2= 1, nsteps= 2, step= 2, info= 1, time= 9.230 b=40: dsyrdd: uplo=L, job=U, n= 200, b2= 1, nsteps= 2, step= 2, info= 1, time= 9.070 b=48: dsyrdd: uplo=L, job=U, n= 200, b2= 1, nsteps= 2, step= 2, info= 1, time= 8.750 b=64: dsyrdd: uplo=L, job=U, n= 200, b2= 1, nsteps= 2, step= 2, info= 1, time= 8.460 one-step (b=1): dsyrdd: uplo=L, job=U, n= 400, b2= 1, nsteps= 1, step= 1, info= 1, time= 29.590 b=12: dsyrdd: uplo=L, job=U, n= 400, b2= 1, nsteps= 2, step= 2, info= 1, time= 71.840 b=16: dsyrdd: uplo=L, job=U, n= 400, b2= 1, nsteps= 2, step= 2, info= 1, time= 72.500 b=20: dsyrdd: uplo=L, job=U, n= 400, b2= 1, nsteps= 2, step= 2, info= 1, time= 73.100 b=24: dsyrdd: uplo=L, job=U, n= 400, b2= 1, nsteps= 2, step= 2, info= 1, time= 72.620 b=32: dsyrdd: uplo=L, job=U, n= 400, b2= 1, nsteps= 2, step= 2, info= 1, time= 72.770 b=40: dsyrdd: uplo=L, job=U, n= 400, b2= 1, nsteps= 2, step= 2, info= 1, time= 71.920 b=48: dsyrdd: uplo=L, job=U, n= 400, b2= 1, nsteps= 2, step= 2, info= 1, time= 71.840 b=64: dsyrdd: uplo=L, job=U, n= 400, b2= 1, nsteps= 2, step= 2, info= 1, time= 70.300 one-step (b=1): dsyrdd: uplo=L, job=U, n= 600, b2= 1, nsteps= 1, step= 1, info= 1, time= 101.170 b=12: dsyrdd: uplo=L, job=U, n= 600, b2= 1, nsteps= 2, step= 2, info= 1, time= 245.990 b=16: dsyrdd: uplo=L, job=U, n= 600, b2= 1, nsteps= 2, step= 2, info= 1, time= 247.640 b=20: dsyrdd: uplo=L, job=U, n= 600, b2= 1, nsteps= 2, step= 2, info= 1, time= 249.290 b=24: dsyrdd: uplo=L, job=U, n= 600, b2= 1, nsteps= 2, step= 2, info= 1, time= 246.640 b=32: dsyrdd: uplo=L, job=U, n= 600, b2= 1, nsteps= 2, step= 2, info= 1, time= 248.040 b=40: dsyrdd: uplo=L, job=U, n= 600, b2= 1, nsteps= 2, step= 2, info= 1, time= 246.080 b=48: dsyrdd: uplo=L, job=U, n= 600, b2= 1, nsteps= 2, step= 2, info= 1, time= 244.880 b=64: dsyrdd: uplo=L, job=U, n= 600, b2= 1, nsteps= 2, step= 2, info= 1, time= 243.220 *** Setting intermediate bandwidth for SBRDD *** no update one-step (b=1): dsbrdd: uplo=L, jobu=N, n= 200, b1= 32, b2= 1, nsteps= 1, step= 1, info= 1, time= 0.950 b=8: dsbrdd: uplo=L, jobu=N, n= 200, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 1.540 b=12: dsbrdd: uplo=L, jobu=N, n= 200, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 1.600 b=16: dsbrdd: uplo=L, jobu=N, n= 200, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 1.410 b=24: dsbrdd: uplo=L, jobu=N, n= 200, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 1.240 one-step (b=1): dsbrdd: uplo=L, jobu=N, n= 200, b1= 64, b2= 1, nsteps= 1, step= 1, info= 1, time= 1.380 b=8: dsbrdd: uplo=L, jobu=N, n= 200, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 2.310 b=12: dsbrdd: uplo=L, jobu=N, n= 200, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 2.490 b=16: dsbrdd: uplo=L, jobu=N, n= 200, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 2.490 b=24: dsbrdd: uplo=L, jobu=N, n= 200, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 2.280 b=32: dsbrdd: uplo=L, jobu=N, n= 200, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 2.000 b=48: dsbrdd: uplo=L, jobu=N, n= 200, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 1.700 one-step (b=1): dsbrdd: uplo=L, jobu=N, n= 200, b1= 96, b2= 1, nsteps= 1, step= 1, info= 1, time= 1.490 b=8: dsbrdd: uplo=L, jobu=N, n= 200, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 2.530 b=12: dsbrdd: uplo=L, jobu=N, n= 200, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 2.790 b=16: dsbrdd: uplo=L, jobu=N, n= 200, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 2.860 b=24: dsbrdd: uplo=L, jobu=N, n= 200, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 2.850 b=32: dsbrdd: uplo=L, jobu=N, n= 200, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 2.670 b=48: dsbrdd: uplo=L, jobu=N, n= 200, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 2.410 b=64: dsbrdd: uplo=L, jobu=N, n= 200, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 2.110 one-step (b=1): dsbrdd: uplo=L, jobu=N, n= 400, b1= 32, b2= 1, nsteps= 1, step= 1, info= 1, time= 4.310 b=8: dsbrdd: uplo=L, jobu=N, n= 400, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 6.540 b=12: dsbrdd: uplo=L, jobu=N, n= 400, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 6.260 b=16: dsbrdd: uplo=L, jobu=N, n= 400, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 6.290 b=24: dsbrdd: uplo=L, jobu=N, n= 400, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 5.600 one-step (b=1): dsbrdd: uplo=L, jobu=N, n= 400, b1= 64, b2= 1, nsteps= 1, step= 1, info= 1, time= 7.260 b=8: dsbrdd: uplo=L, jobu=N, n= 400, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 11.350 b=12: dsbrdd: uplo=L, jobu=N, n= 400, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 11.820 b=16: dsbrdd: uplo=L, jobu=N, n= 400, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 12.070 b=24: dsbrdd: uplo=L, jobu=N, n= 400, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 10.910 b=32: dsbrdd: uplo=L, jobu=N, n= 400, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 10.000 b=48: dsbrdd: uplo=L, jobu=N, n= 400, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 8.500 one-step (b=1): dsbrdd: uplo=L, jobu=N, n= 400, b1= 96, b2= 1, nsteps= 1, step= 1, info= 1, time= 9.570 b=8: dsbrdd: uplo=L, jobu=N, n= 400, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 14.540 b=12: dsbrdd: uplo=L, jobu=N, n= 400, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 15.230 b=16: dsbrdd: uplo=L, jobu=N, n= 400, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 16.330 b=24: dsbrdd: uplo=L, jobu=N, n= 400, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 16.020 b=32: dsbrdd: uplo=L, jobu=N, n= 400, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 14.850 b=48: dsbrdd: uplo=L, jobu=N, n= 400, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 13.220 b=64: dsbrdd: uplo=L, jobu=N, n= 400, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 11.840 one-step (b=1): dsbrdd: uplo=L, jobu=N, n= 600, b1= 32, b2= 1, nsteps= 1, step= 1, info= 1, time= 10.090 b=8: dsbrdd: uplo=L, jobu=N, n= 600, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 15.160 b=12: dsbrdd: uplo=L, jobu=N, n= 600, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 14.300 b=16: dsbrdd: uplo=L, jobu=N, n= 600, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 14.500 b=24: dsbrdd: uplo=L, jobu=N, n= 600, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 12.890 one-step (b=1): dsbrdd: uplo=L, jobu=N, n= 600, b1= 64, b2= 1, nsteps= 1, step= 1, info= 1, time= 17.790 b=8: dsbrdd: uplo=L, jobu=N, n= 600, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 27.650 b=12: dsbrdd: uplo=L, jobu=N, n= 600, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 28.510 b=16: dsbrdd: uplo=L, jobu=N, n= 600, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 29.250 b=24: dsbrdd: uplo=L, jobu=N, n= 600, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 26.330 b=32: dsbrdd: uplo=L, jobu=N, n= 600, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 24.000 b=48: dsbrdd: uplo=L, jobu=N, n= 600, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 20.440 one-step (b=1): dsbrdd: uplo=L, jobu=N, n= 600, b1= 96, b2= 1, nsteps= 1, step= 1, info= 1, time= 24.290 b=8: dsbrdd: uplo=L, jobu=N, n= 600, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 36.580 b=12: dsbrdd: uplo=L, jobu=N, n= 600, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 38.040 b=16: dsbrdd: uplo=L, jobu=N, n= 600, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 41.210 b=24: dsbrdd: uplo=L, jobu=N, n= 600, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 43.010 b=32: dsbrdd: uplo=L, jobu=N, n= 600, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 37.120 b=48: dsbrdd: uplo=L, jobu=N, n= 600, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 33.150 b=64: dsbrdd: uplo=L, jobu=N, n= 600, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 29.580 with update one-step (b=1): dsbrdd: uplo=L, jobu=U, n= 200, b1= 32, b2= 1, nsteps= 1, step= 1, info= 1, time= 5.420 b=8: dsbrdd: uplo=L, jobu=U, n= 200, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 9.370 b=12: dsbrdd: uplo=L, jobu=U, n= 200, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 8.580 b=16: dsbrdd: uplo=L, jobu=U, n= 200, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 7.960 b=24: dsbrdd: uplo=L, jobu=U, n= 200, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 6.720 one-step (b=1): dsbrdd: uplo=L, jobu=U, n= 200, b1= 64, b2= 1, nsteps= 1, step= 1, info= 1, time= 6.030 b=8: dsbrdd: uplo=L, jobu=U, n= 200, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 10.530 b=12: dsbrdd: uplo=L, jobu=U, n= 200, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 10.340 b=16: dsbrdd: uplo=L, jobu=U, n= 200, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 10.020 b=24: dsbrdd: uplo=L, jobu=U, n= 200, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 9.290 b=32: dsbrdd: uplo=L, jobu=U, n= 200, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 8.440 b=48: dsbrdd: uplo=L, jobu=U, n= 200, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 7.200 one-step (b=1): dsbrdd: uplo=L, jobu=U, n= 200, b1= 96, b2= 1, nsteps= 1, step= 1, info= 1, time= 6.160 b=8: dsbrdd: uplo=L, jobu=U, n= 200, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 10.710 b=12: dsbrdd: uplo=L, jobu=U, n= 200, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 10.630 b=16: dsbrdd: uplo=L, jobu=U, n= 200, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 10.600 b=24: dsbrdd: uplo=L, jobu=U, n= 200, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 10.130 b=32: dsbrdd: uplo=L, jobu=U, n= 200, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 9.560 b=48: dsbrdd: uplo=L, jobu=U, n= 200, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 8.730 b=64: dsbrdd: uplo=L, jobu=U, n= 200, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 7.720 one-step (b=1): dsbrdd: uplo=L, jobu=U, n= 400, b1= 32, b2= 1, nsteps= 1, step= 1, info= 1, time= 39.940 b=8: dsbrdd: uplo=L, jobu=U, n= 400, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 69.140 b=12: dsbrdd: uplo=L, jobu=U, n= 400, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 63.600 b=16: dsbrdd: uplo=L, jobu=U, n= 400, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 58.660 b=24: dsbrdd: uplo=L, jobu=U, n= 400, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 50.510 one-step (b=1): dsbrdd: uplo=L, jobu=U, n= 400, b1= 64, b2= 1, nsteps= 1, step= 1, info= 1, time= 43.370 b=8: dsbrdd: uplo=L, jobu=U, n= 400, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 77.150 b=12: dsbrdd: uplo=L, jobu=U, n= 400, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 75.050 b=16: dsbrdd: uplo=L, jobu=U, n= 400, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 72.570 b=24: dsbrdd: uplo=L, jobu=U, n= 400, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 67.130 b=32: dsbrdd: uplo=L, jobu=U, n= 400, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 61.830 b=48: dsbrdd: uplo=L, jobu=U, n= 400, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 52.180 one-step (b=1): dsbrdd: uplo=L, jobu=U, n= 400, b1= 96, b2= 1, nsteps= 1, step= 1, info= 1, time= 45.500 b=8: dsbrdd: uplo=L, jobu=U, n= 400, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 80.890 b=12: dsbrdd: uplo=L, jobu=U, n= 400, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 80.150 b=16: dsbrdd: uplo=L, jobu=U, n= 400, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 79.350 b=24: dsbrdd: uplo=L, jobu=U, n= 400, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 76.190 b=32: dsbrdd: uplo=L, jobu=U, n= 400, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 72.450 b=48: dsbrdd: uplo=L, jobu=U, n= 400, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 63.960 b=64: dsbrdd: uplo=L, jobu=U, n= 400, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 57.730 one-step (b=1): dsbrdd: uplo=L, jobu=U, n= 600, b1= 32, b2= 1, nsteps= 1, step= 1, info= 1, time= 132.370 b=8: dsbrdd: uplo=L, jobu=U, n= 600, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 230.830 b=12: dsbrdd: uplo=L, jobu=U, n= 600, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 211.480 b=16: dsbrdd: uplo=L, jobu=U, n= 600, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 197.271 b=24: dsbrdd: uplo=L, jobu=U, n= 600, b1= 32, b2= 1, nsteps= 2, step= 2, info= 1, time= 165.730 one-step (b=1): dsbrdd: uplo=L, jobu=U, n= 600, b1= 64, b2= 1, nsteps= 1, step= 1, info= 1, time= 140.061 b=8: dsbrdd: uplo=L, jobu=U, n= 600, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 253.980 b=12: dsbrdd: uplo=L, jobu=U, n= 600, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 245.500 b=16: dsbrdd: uplo=L, jobu=U, n= 600, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 240.290 b=24: dsbrdd: uplo=L, jobu=U, n= 600, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 219.939 b=32: dsbrdd: uplo=L, jobu=U, n= 600, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 204.771 b=48: dsbrdd: uplo=L, jobu=U, n= 600, b1= 64, b2= 1, nsteps= 2, step= 2, info= 1, time= 170.040 one-step (b=1): dsbrdd: uplo=L, jobu=U, n= 600, b1= 96, b2= 1, nsteps= 1, step= 1, info= 1, time= 146.820 b=8: dsbrdd: uplo=L, jobu=U, n= 600, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 267.130 b=12: dsbrdd: uplo=L, jobu=U, n= 600, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 261.311 b=16: dsbrdd: uplo=L, jobu=U, n= 600, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 261.090 b=24: dsbrdd: uplo=L, jobu=U, n= 600, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 248.360 b=32: dsbrdd: uplo=L, jobu=U, n= 600, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 237.181 b=48: dsbrdd: uplo=L, jobu=U, n= 600, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 210.290 b=64: dsbrdd: uplo=L, jobu=U, n= 600, b1= 96, b2= 1, nsteps= 2, step= 2, info= 1, time= 189.641 *** Where to switch from SYTRD to SYRDT ? *** no update b=4 dsbtrd: uplo=L, jobu=N, n= 200, b1= 4, info= 0, time= 0.110 dsbrdt: jobu=N, n= 200, b1= 4, nb= 0, info= 1, time= 0.410 b=6 dsbtrd: uplo=L, jobu=N, n= 200, b1= 6, info= 0, time= 0.200 dsbrdt: jobu=N, n= 200, b1= 6, nb= 0, info= 1, time= 0.370 b=8 dsbtrd: uplo=L, jobu=N, n= 200, b1= 8, info= 0, time= 0.280 dsbrdt: jobu=N, n= 200, b1= 8, nb= 0, info= 1, time= 0.359 b=10 dsbtrd: uplo=L, jobu=N, n= 200, b1= 10, info= 0, time= 0.360 dsbrdt: jobu=N, n= 200, b1= 10, nb= 0, info= 1, time= 0.369 b=12 dsbtrd: uplo=L, jobu=N, n= 200, b1= 12, info= 0, time= 0.380 dsbrdt: jobu=N, n= 200, b1= 12, nb= 0, info= 1, time= 0.550 b=16 dsbtrd: uplo=L, jobu=N, n= 200, b1= 16, info= 0, time= 0.449 dsbrdt: jobu=N, n= 200, b1= 16, nb= 0, info= 1, time= 0.630 b=20 dsbtrd: uplo=L, jobu=N, n= 200, b1= 20, info= 0, time= 0.530 dsbrdt: jobu=N, n= 200, b1= 20, nb= 0, info= 1, time= 0.710 b=24 dsbtrd: uplo=L, jobu=N, n= 200, b1= 24, info= 0, time= 0.590 dsbrdt: jobu=N, n= 200, b1= 24, nb= 0, info= 1, time= 0.801 b=32 dsbtrd: uplo=L, jobu=N, n= 200, b1= 32, info= 0, time= 0.689 dsbrdt: jobu=N, n= 200, b1= 32, nb= 0, info= 1, time= 0.960 b=40 dsbtrd: uplo=L, jobu=N, n= 200, b1= 40, info= 0, time= 0.811 dsbrdt: jobu=N, n= 200, b1= 40, nb= 0, info= 1, time= 1.100 b=48 dsbtrd: uplo=L, jobu=N, n= 200, b1= 48, info= 0, time= 0.880 dsbrdt: jobu=N, n= 200, b1= 48, nb= 0, info= 1, time= 1.220 b=64 dsbtrd: uplo=L, jobu=N, n= 200, b1= 64, info= 0, time= 1.060 dsbrdt: jobu=N, n= 200, b1= 64, nb= 0, info= 1, time= 1.420 b=4 dsbtrd: uplo=L, jobu=N, n= 400, b1= 4, info= 0, time= 0.400 dsbrdt: jobu=N, n= 400, b1= 4, nb= 0, info= 1, time= 1.609 b=6 dsbtrd: uplo=L, jobu=N, n= 400, b1= 6, info= 0, time= 0.641 dsbrdt: jobu=N, n= 400, b1= 6, nb= 0, info= 1, time= 1.470 b=8 dsbtrd: uplo=L, jobu=N, n= 400, b1= 8, info= 0, time= 0.891 dsbrdt: jobu=N, n= 400, b1= 8, nb= 0, info= 1, time= 1.431 b=10 dsbtrd: uplo=L, jobu=N, n= 400, b1= 10, info= 0, time= 1.130 dsbrdt: jobu=N, n= 400, b1= 10, nb= 0, info= 1, time= 1.490 b=12 dsbtrd: uplo=L, jobu=N, n= 400, b1= 12, info= 0, time= 1.439 dsbrdt: jobu=N, n= 400, b1= 12, nb= 0, info= 1, time= 2.300 b=16 dsbtrd: uplo=L, jobu=N, n= 400, b1= 16, info= 0, time= 1.800 dsbrdt: jobu=N, n= 400, b1= 16, nb= 0, info= 1, time= 2.670 b=20 dsbtrd: uplo=L, jobu=N, n= 400, b1= 20, info= 0, time= 2.060 dsbrdt: jobu=N, n= 400, b1= 20, nb= 0, info= 1, time= 3.100 b=24 dsbtrd: uplo=L, jobu=N, n= 400, b1= 24, info= 0, time= 2.300 dsbrdt: jobu=N, n= 400, b1= 24, nb= 0, info= 1, time= 3.520 b=32 dsbtrd: uplo=L, jobu=N, n= 400, b1= 32, info= 0, time= 2.850 dsbrdt: jobu=N, n= 400, b1= 32, nb= 0, info= 1, time= 4.340 b=40 dsbtrd: uplo=L, jobu=N, n= 400, b1= 40, info= 0, time= 3.280 dsbrdt: jobu=N, n= 400, b1= 40, nb= 0, info= 1, time= 5.189 b=48 dsbtrd: uplo=L, jobu=N, n= 400, b1= 48, info= 0, time= 3.779 dsbrdt: jobu=N, n= 400, b1= 48, nb= 0, info= 1, time= 5.910 b=64 dsbtrd: uplo=L, jobu=N, n= 400, b1= 64, info= 0, time= 4.580 dsbrdt: jobu=N, n= 400, b1= 64, nb= 0, info= 1, time= 7.380 b=4 dsbtrd: uplo=L, jobu=N, n= 600, b1= 4, info= 0, time= 0.840 dsbrdt: jobu=N, n= 600, b1= 4, nb= 0, info= 1, time= 3.620 b=6 dsbtrd: uplo=L, jobu=N, n= 600, b1= 6, info= 0, time= 1.350 dsbrdt: jobu=N, n= 600, b1= 6, nb= 0, info= 1, time= 3.311 b=8 dsbtrd: uplo=L, jobu=N, n= 600, b1= 8, info= 0, time= 1.840 dsbrdt: jobu=N, n= 600, b1= 8, nb= 0, info= 1, time= 3.280 b=10 dsbtrd: uplo=L, jobu=N, n= 600, b1= 10, info= 0, time= 2.410 dsbrdt: jobu=N, n= 600, b1= 10, nb= 0, info= 1, time= 3.410 b=12 dsbtrd: uplo=L, jobu=N, n= 600, b1= 12, info= 0, time= 3.040 dsbrdt: jobu=N, n= 600, b1= 12, nb= 0, info= 1, time= 5.240 b=16 dsbtrd: uplo=L, jobu=N, n= 600, b1= 16, info= 0, time= 4.040 dsbrdt: jobu=N, n= 600, b1= 16, nb= 0, info= 1, time= 6.149 b=20 dsbtrd: uplo=L, jobu=N, n= 600, b1= 20, info= 0, time= 4.630 dsbrdt: jobu=N, n= 600, b1= 20, nb= 0, info= 1, time= 7.150 b=24 dsbtrd: uplo=L, jobu=N, n= 600, b1= 24, info= 0, time= 5.199 dsbrdt: jobu=N, n= 600, b1= 24, nb= 0, info= 1, time= 8.190 b=32 dsbtrd: uplo=L, jobu=N, n= 600, b1= 32, info= 0, time= 6.400 dsbrdt: jobu=N, n= 600, b1= 32, nb= 0, info= 1, time= 10.170 b=40 dsbtrd: uplo=L, jobu=N, n= 600, b1= 40, info= 0, time= 7.460 dsbrdt: jobu=N, n= 600, b1= 40, nb= 0, info= 1, time= 12.320 b=48 dsbtrd: uplo=L, jobu=N, n= 600, b1= 48, info= 0, time= 8.479 dsbrdt: jobu=N, n= 600, b1= 48, nb= 0, info= 1, time= 14.260 b=64 dsbtrd: uplo=L, jobu=N, n= 600, b1= 64, info= 0, time= 10.659 dsbrdt: jobu=N, n= 600, b1= 64, nb= 0, info= 1, time= 18.220 with update *** ignore messages about tests failing because *** *** SBRDT returned a wrong (but positive) info *** b=4 dsbtrd: uplo=L, jobu=U, n= 200, b1= 4, info= 0, time= 1.270 dsbrdt: jobu=U, n= 200, b1= 4, nb= 0, info= 3, time= 5.180 *** Test in line 1768 failed : dsbrdt returned info= 3 (expected 1) b=6 dsbtrd: uplo=L, jobu=U, n= 200, b1= 6, info= 0, time= 1.460 dsbrdt: jobu=U, n= 200, b1= 6, nb= 0, info= 4, time= 5.050 *** Test in line 1776 failed : dsbrdt returned info= 4 (expected 1) b=8 dsbtrd: uplo=L, jobu=U, n= 200, b1= 8, info= 0, time= 1.610 dsbrdt: jobu=U, n= 200, b1= 8, nb= 0, info= 4, time= 4.870 *** Test in line 1784 failed : dsbrdt returned info= 4 (expected 1) b=10 dsbtrd: uplo=L, jobu=U, n= 200, b1= 10, info= 0, time= 1.710 dsbrdt: jobu=U, n= 200, b1= 10, nb= 0, info= 4, time= 4.790 *** Test in line 1792 failed : dsbrdt returned info= 4 (expected 1) b=12 dsbtrd: uplo=L, jobu=U, n= 200, b1= 12, info= 0, time= 1.760 dsbrdt: jobu=U, n= 200, b1= 12, nb= 0, info= 4, time= 4.891 *** Test in line 1800 failed : dsbrdt returned info= 4 (expected 1) b=16 dsbtrd: uplo=L, jobu=U, n= 200, b1= 16, info= 0, time= 1.869 dsbrdt: jobu=U, n= 200, b1= 16, nb= 0, info= 6, time= 5.070 *** Test in line 1808 failed : dsbrdt returned info= 6 (expected 1) b=20 dsbtrd: uplo=L, jobu=U, n= 200, b1= 20, info= 0, time= 1.970 dsbrdt: jobu=U, n= 200, b1= 20, nb= 0, info= 8, time= 5.160 *** Test in line 1816 failed : dsbrdt returned info= 8 (expected 1) b=24 dsbtrd: uplo=L, jobu=U, n= 200, b1= 24, info= 0, time= 2.040 dsbrdt: jobu=U, n= 200, b1= 24, nb= 0, info= 8, time= 5.180 *** Test in line 1824 failed : dsbrdt returned info= 8 (expected 1) b=32 dsbtrd: uplo=L, jobu=U, n= 200, b1= 32, info= 0, time= 2.170 dsbrdt: jobu=U, n= 200, b1= 32, nb= 0, info= 12, time= 5.400 *** Test in line 1832 failed : dsbrdt returned info= 12 (expected 1) b=40 dsbtrd: uplo=L, jobu=U, n= 200, b1= 40, info= 0, time= 2.270 dsbrdt: jobu=U, n= 200, b1= 40, nb= 0, info= 14, time= 5.630 *** Test in line 1840 failed : dsbrdt returned info= 14 (expected 1) b=48 dsbtrd: uplo=L, jobu=U, n= 200, b1= 48, info= 0, time= 2.350 dsbrdt: jobu=U, n= 200, b1= 48, nb= 0, info= 16, time= 5.660 *** Test in line 1848 failed : dsbrdt returned info= 16 (expected 1) b=64 dsbtrd: uplo=L, jobu=U, n= 200, b1= 64, info= 0, time= 2.490 dsbrdt: jobu=U, n= 200, b1= 64, nb= 0, info= 22, time= 6.000 *** Test in line 1856 failed : dsbrdt returned info= 22 (expected 1) b=4 dsbtrd: uplo=L, jobu=U, n= 400, b1= 4, info= 0, time= 9.490 dsbrdt: jobu=U, n= 400, b1= 4, nb= 0, info= 3, time= 39.631 *** Test in line 1866 failed : dsbrdt returned info= 3 (expected 1) b=6 dsbtrd: uplo=L, jobu=U, n= 400, b1= 6, info= 0, time= 10.620 dsbrdt: jobu=U, n= 400, b1= 6, nb= 0, info= 4, time= 38.910 *** Test in line 1874 failed : dsbrdt returned info= 4 (expected 1) b=8 dsbtrd: uplo=L, jobu=U, n= 400, b1= 8, info= 0, time= 11.380 dsbrdt: jobu=U, n= 400, b1= 8, nb= 0, info= 4, time= 37.540 *** Test in line 1882 failed : dsbrdt returned info= 4 (expected 1) b=10 dsbtrd: uplo=L, jobu=U, n= 400, b1= 10, info= 0, time= 11.980 dsbrdt: jobu=U, n= 400, b1= 10, nb= 0, info= 4, time= 36.870 *** Test in line 1890 failed : dsbrdt returned info= 4 (expected 1) b=12 dsbtrd: uplo=L, jobu=U, n= 400, b1= 12, info= 0, time= 12.480 dsbrdt: jobu=U, n= 400, b1= 12, nb= 0, info= 4, time= 37.170 *** Test in line 1898 failed : dsbrdt returned info= 4 (expected 1) b=16 dsbtrd: uplo=L, jobu=U, n= 400, b1= 16, info= 0, time= 13.120 dsbrdt: jobu=U, n= 400, b1= 16, nb= 0, info= 6, time= 37.710 *** Test in line 1906 failed : dsbrdt returned info= 6 (expected 1) b=20 dsbtrd: uplo=L, jobu=U, n= 400, b1= 20, info= 0, time= 13.529 dsbrdt: jobu=U, n= 400, b1= 20, nb= 0, info= 8, time= 38.771 *** Test in line 1914 failed : dsbrdt returned info= 8 (expected 1) b=24 dsbtrd: uplo=L, jobu=U, n= 400, b1= 24, info= 0, time= 13.900 dsbrdt: jobu=U, n= 400, b1= 24, nb= 0, info= 8, time= 38.681 *** Test in line 1922 failed : dsbrdt returned info= 8 (expected 1) b=32 dsbtrd: uplo=L, jobu=U, n= 400, b1= 32, info= 0, time= 14.430 dsbrdt: jobu=U, n= 400, b1= 32, nb= 0, info= 12, time= 39.950 *** Test in line 1930 failed : dsbrdt returned info= 12 (expected 1) b=40 dsbtrd: uplo=L, jobu=U, n= 400, b1= 40, info= 0, time= 15.021 dsbrdt: jobu=U, n= 400, b1= 40, nb= 0, info= 14, time= 40.830 *** Test in line 1938 failed : dsbrdt returned info= 14 (expected 1) b=48 dsbtrd: uplo=L, jobu=U, n= 400, b1= 48, info= 0, time= 15.529 dsbrdt: jobu=U, n= 400, b1= 48, nb= 0, info= 16, time= 41.530 *** Test in line 1946 failed : dsbrdt returned info= 16 (expected 1) b=64 dsbtrd: uplo=L, jobu=U, n= 400, b1= 64, info= 0, time= 16.470 dsbrdt: jobu=U, n= 400, b1= 64, nb= 0, info= 22, time= 43.271 *** Test in line 1954 failed : dsbrdt returned info= 22 (expected 1) b=4 dsbtrd: uplo=L, jobu=U, n= 600, b1= 4, info= 0, time= 31.620 dsbrdt: jobu=U, n= 600, b1= 4, nb= 0, info= 3, time= 134.631 *** Test in line 1964 failed : dsbrdt returned info= 3 (expected 1) b=6 dsbtrd: uplo=L, jobu=U, n= 600, b1= 6, info= 0, time= 35.880 dsbrdt: jobu=U, n= 600, b1= 6, nb= 0, info= 4, time= 132.239 *** Test in line 1972 failed : dsbrdt returned info= 4 (expected 1) b=8 dsbtrd: uplo=L, jobu=U, n= 600, b1= 8, info= 0, time= 38.141 dsbrdt: jobu=U, n= 600, b1= 8, nb= 0, info= 4, time= 127.700 *** Test in line 1980 failed : dsbrdt returned info= 4 (expected 1) b=10 dsbtrd: uplo=L, jobu=U, n= 600, b1= 10, info= 0, time= 40.050 dsbrdt: jobu=U, n= 600, b1= 10, nb= 0, info= 4, time= 126.499 *** Test in line 1988 failed : dsbrdt returned info= 4 (expected 1) b=12 dsbtrd: uplo=L, jobu=U, n= 600, b1= 12, info= 0, time= 41.290 dsbrdt: jobu=U, n= 600, b1= 12, nb= 0, info= 4, time= 126.221 *** Test in line 1996 failed : dsbrdt returned info= 4 (expected 1) b=16 dsbtrd: uplo=L, jobu=U, n= 600, b1= 16, info= 0, time= 44.010 dsbrdt: jobu=U, n= 600, b1= 16, nb= 0, info= 6, time= 131.989 *** Test in line 2004 failed : dsbrdt returned info= 6 (expected 1) b=20 dsbtrd: uplo=L, jobu=U, n= 600, b1= 20, info= 0, time= 44.570 dsbrdt: jobu=U, n= 600, b1= 20, nb= 0, info= 8, time= 132.899 *** Test in line 2012 failed : dsbrdt returned info= 8 (expected 1) b=24 dsbtrd: uplo=L, jobu=U, n= 600, b1= 24, info= 0, time= 45.700 dsbrdt: jobu=U, n= 600, b1= 24, nb= 0, info= 8, time= 129.671 *** Test in line 2020 failed : dsbrdt returned info= 8 (expected 1) b=32 dsbtrd: uplo=L, jobu=U, n= 600, b1= 32, info= 0, time= 46.770 dsbrdt: jobu=U, n= 600, b1= 32, nb= 0, info= 12, time= 133.810 *** Test in line 2028 failed : dsbrdt returned info= 12 (expected 1) b=40 dsbtrd: uplo=L, jobu=U, n= 600, b1= 40, info= 0, time= 47.640 dsbrdt: jobu=U, n= 600, b1= 40, nb= 0, info= 14, time= 135.030 *** Test in line 2036 failed : dsbrdt returned info= 14 (expected 1) b=48 dsbtrd: uplo=L, jobu=U, n= 600, b1= 48, info= 0, time= 49.592 dsbrdt: jobu=U, n= 600, b1= 48, nb= 0, info= 16, time= 135.590 *** Test in line 2044 failed : dsbrdt returned info= 16 (expected 1) b=64 dsbtrd: uplo=L, jobu=U, n= 600, b1= 64, info= 0, time= 51.391 dsbrdt: jobu=U, n= 600, b1= 64, nb= 0, info= 22, time= 140.850 *** Test in line 2052 failed : dsbrdt returned info= 22 (expected 1) =============================================================================== Tests for Total Skipped Failed ------------------------------------------------------------------------------- dsytrd : full -> tridiagonal, one-step (LAPACK) : 0 0 0 dorgtr : accumulation of transformations (LAPACK) : 0 0 0 dsbtrd : banded -> tridiagonal, one-step (LAPACK) : 72 0 0 dsyrdb : full -> banded, one-step (SBR) : 0 0 0 dsygtr : accumulation of transformations (SBR) : 0 0 0 dsbrdb : banded -> banded, one-step (SBR) : 0 0 0 dsbrdt : banded -> tridiagonal, one-step (SBR) : 72 0 36 dsy2bc : copy full -> banded (SBR) : 0 0 0 dsy2bi : in-place copy full -> banded (SBR) : 0 0 0 dsb2bc : copy banded -> banded (SBR) : 0 0 0 dsb2bi : in-place copy banded -> banded (SBR) : 0 0 0 dsyrdd : reduction driver for full matrices (SBR) : 54 0 0 dsbrdd : reduction driver for banded matrcs (SBR) : 120 0 0 ------------------------------------------------------------------------------- Total : : 318 0 36 ------------------------------------------------------------------------------- Total time : 16797.73 seconds SHAR_EOF fi # end of overwriting check cd .. if test ! -d 'Src' then mkdir 'Src' fi cd 'Src' if test -f 'src.f' then echo shar: will not over-write existing file "'src.f'" else cat << "SHAR_EOF" > 'src.f' * ********************************************************************** * INTEGER FUNCTION NBDFLT( ALGO, PREC, REQEST, N, B1, B2, NEEDU ) * * ---------------------------------------------------------------------- * * Description: * * Determine an appropriate default blocking factor or crossover point * or intermediate bandwidth for the reduction routine specified in * algo. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * ---------------------------------------------------------------------- * * Parameters: * CHARACTER*5 ALGO CHARACTER*1 PREC, REQEST INTEGER N, B1, B2 LOGICAL NEEDU * * algo (in) character*5 * For which SBR routine do we need a control parameter ? * algo = 'SYRDB' : Reduction full -> banded. * = 'SBRDB' : Reduction banded -> banded. * = 'SBRDT' : Reduction banded -> tridiagonal. * = 'SYRDD' : Driver for reducing full matrices. * = 'SBRDD' : Driver for reducing banded matrices. * * prec (in) character*1 * Is it the single or double precision routine ? * prec = 'D' : Double precision. * = 'S' : Single precision. * * reqest (in) character*1 * Which control parameter is required ? * reqest = 'B' : Blocking factor or intermediate bandwidth. * = 'C' : Crossover point to LAPACK code. * * n (in) integer * The size of the matrix to reduce. * n >= 0. * * b1 (in) integer * The bandwidth of the matrix before the reduction. * 0 <= b1 < n. * * b2 (in) integer * The bandwidth of the matrix after the reduction. * 1 <= b2 <= b1 or b1 = b2 = 0. * * needu (in) logical * Do we update the transformation matrix ? * needu = .true. : Yes. * = .false. : No. * * ---------------------------------------------------------------------- * * Local variables: * LOGICAL SINGLE INTEGER DELTAB * * single single or double precision routine ? * deltab number of diagonals to reduce * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * * ---------------------------------------------------------------------- * SINGLE = LSAME( PREC, 'SinglePrecision' ) DELTAB = B1 - B2 * IF ( ( ALGO .EQ. 'SYRDB' ) .AND. > ( LSAME( REQEST, 'BlockingFactor' ) ) ) THEN * * --- block size for reduction from full to banded --- * IF ( NEEDU ) THEN IF ( SINGLE ) THEN NBDFLT = 32 ELSE NBDFLT = 32 ENDIF ELSE IF ( SINGLE ) THEN NBDFLT = 32 ELSE NBDFLT = 32 ENDIF ENDIF * ELSEIF ( ( ALGO .EQ. 'SBRDB' ) .AND. > ( LSAME( REQEST, 'BlockingFactor' ) ) ) THEN * * --- block size for bandwidth reduction --- * IF ( NEEDU ) THEN IF ( SINGLE ) THEN NBDFLT = ( ( DELTAB + 7 ) / 8 ) * 2 ELSE NBDFLT = ( ( DELTAB + 7 ) / 8 ) * 2 ENDIF IF ( NBDFLT .LT. 4 ) NBDFLT = 4 IF ( NBDFLT .GT. DELTAB ) NBDFLT = DELTAB ELSE IF ( SINGLE ) THEN NBDFLT = ( ( DELTAB + 7 ) / 8 ) * 2 ELSE NBDFLT = ( ( DELTAB + 7 ) / 8 ) * 2 ENDIF IF ( NBDFLT .LT. 4 ) NBDFLT = 4 IF ( NBDFLT .GT. DELTAB ) NBDFLT = DELTAB ENDIF IF ( NBDFLT .LT. 1 ) NBDFLT = 1 * ELSEIF ( ( ALGO .EQ. 'SBRDT' ) .AND. > ( LSAME( REQEST, 'BlockingFactor' ) ) ) THEN * * --- block size for reduction to tridiagonal form --- * IF ( NEEDU ) THEN IF ( SINGLE ) THEN NBDFLT = ( ( B1 + 5 ) / 6 ) * 2 ELSE NBDFLT = ( ( B1 + 5 ) / 6 ) * 2 ENDIF IF ( NBDFLT .LT. 4 ) NBDFLT = 4 IF ( NBDFLT .GT. DELTAB ) NBDFLT = DELTAB ELSE NBDFLT = 1 ENDIF * ELSEIF ( ( ALGO .EQ. 'SYRDD' ) .AND. > ( LSAME( REQEST, 'Bandwidth' ) ) ) THEN * * --- intermediate bandwidth in the reduction driver --- * IF ( NEEDU ) THEN NBDFLT = 1 ELSE IF ( ( N .GE. 300 ) .OR. ( B2 .GT. 1 ) ) THEN IF ( SINGLE ) THEN NBDFLT = 32 ELSE NBDFLT = 32 ENDIF ELSE NBDFLT = 1 ENDIF ENDIF * ELSEIF ( ( ALGO .EQ. 'SBRDD' ) .AND. > ( LSAME( REQEST, 'Bandwidth' ) ) ) THEN * * --- intermediate bandwidth in the reduction driver --- * IF ( NEEDU ) THEN NBDFLT = 1 ELSE IF ( SINGLE ) THEN NBDFLT = 32 ELSE NBDFLT = 32 ENDIF ENDIF * ELSEIF ( ( ALGO .EQ. 'SBRDD' ) .AND. > ( LSAME( REQEST, 'CrossoverPoint' ) ) ) THEN * * --- crossover point from SBRDT to SBTRD --- * IF ( NEEDU ) THEN IF ( SINGLE ) THEN NBDFLT = 8 ELSE NBDFLT = 8 ENDIF ELSE IF ( SINGLE ) THEN NBDFLT = 16 ELSE NBDFLT = 16 ENDIF ENDIF * ELSE NBDFLT = 1 ENDIF * RETURN END * * ********************************************************************** * SUBROUTINE DSYRDB( UPLO, JOB, N, B, A, LDA, DRPTOL, > U, LDU, NB, TAU, > WORK, LWORK, INFO ) * * ---------------------------------------------------------------------- * * Description: * * Given a symmetric n-times-n matrix A with either its lower or upper * triangle explicitly stored, dsyrdb reduces A to a symmetric banded * matrix B with b sub(super)diagonals by using a sequence of * orthogonal similarity transformations. If desired, the same * transformations are also applied from the right to the matrix U. * That is, if initially U was the identity, then the resulting banded * matrix B and the updated U fulfill the equation * * T * U * A * U = B . * * A must be given in full storage (with either its lower or upper * triangle explicitly stored) and will be overwritten with B and * the "mantissae" of the Householder vectors used for the reduction. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 UPLO, JOB INTEGER N, B, LDA, LDU, NB, LWORK, INFO DOUBLE PRECISION DRPTOL DOUBLE PRECISION A( LDA, * ), U( LDU, * ), TAU( * ), > WORK( * ) * * uplo (in) character*1 * Reduce the upper or lower triangle of A ? * uplo = 'U' : Upper triangle. * = 'L' : Lower triangle. * * job (in) character*1 * Specifies if U is required or not. * job = 'U' : Update U. * = 'N' : Do not update U. * * n (in) integer * The order of the matrix A. * n >= 0. * * b (in) integer * The number of sub(super-)diagonals of the reduced matrix B. * 1 <= b < n, if n > 1. * b = 0 , if n <= 1. * * a (in/out) double precision array, dimension ( lda, n ) * On entry, this array contains the symmetric matrix A with * either its lower (uplo = 'L') or upper (uplo = 'U') triangle * stored. * On exit, the main diagonal and the first b sub-(super-) * diagonals contain the banded matrix B, and the Householder * vectors that were used in the reduction are stored in the * remaining parts of the lower (upper) triangle. * * lda (in) integer * The leading dimension of the array a. * lda >= max( n, 1 ). * * drptol (in) double precision * Threshold for dropping the Householder transformations: if * the norm of the vector to be eliminated is already smaller * than drptol then the transform is skipped. * drptol >= 0.0. * If you do not know, use 0.0. * * u (in/out) double precision array, dimension ( ldu, n ) * On entry, u contains some n-by-n matrix U. * On exit, U is postmultiplied with all orthogonal transforms * that were used to reduce A to banded form. * Accessed only if the update of U is required. * * ldu (in) integer * The leading dimension of the array u. * ldu >= max( n, 1 ). * * nb (in) integer * The blocking factor, as suggested by the user, for the * reduction and the update of U. * 0 <= nb <= b. * nb = 0 : User does not know how many Householder transforms * should be blocked for reasonable performance. * Let the routine figure it out (depending on the * workspace available). * nb = 1 : Do not block. * nb > 1 : Try to block nb Housholder transforms * (if the workspace is not sufficient then a smaller * blocking factor will be used). * * tau (out) double precision array, dimension ( n ) * The scaling factors for the Householder transforms used in * the reduction. * * work (workspace) double precision array, dimension ( lwork ) * * lwork (in) integer * The size of the workspace (must be provided on entry). * lwork >= 3 * n - 2 * b. * * Workspace that small prevents blocking and may degrade * performance. For using nb-blocked transformations, provide * lwork >= nb * ( 3 * n - 2 * b ). * As a rule, lwork >= 50 * n should be fine. * * info (out) integer * On exit, info indicates the consistence of the arguments. * info = - 1 : uplo is none of 'U', 'L' (upper/lower case). * = - 2 : job is none of 'U', 'N' (upper/lower case). * = - 3 : n is out of range (negative). * = - 4 : b is out of range ( < 0, or = 0 while n > 1, * or >= n ). * = - 6 : lda is out of range ( < n or < 1 ). * = - 7 : drptol is out of range (negative). * = - 9 : ldu is out of range ( < n or < 1 ). * = -10 : nb is out of range (negative). * = -13 : lwork is too small (see above). * info >= 1 : All arguments are OK. * In this case, info returns the blocking factor * that was used in the reduction and in the * update of U. * * ---------------------------------------------------------------------- * * Local variables: * DOUBLE PRECISION ZERO PARAMETER ( ZERO = 0.0D0 ) * LOGICAL UPPER, NEEDU INTEGER NB0, NB1, NB2, J, J0, > LEN, IW, IY, IWORK * * upper reduce the upper triangle of A ? * needu update U ? * nb0 the final blocking factor for "full" block columns * nb1 width of the current block column to reduce (= nb0, except * for the last block column) * nb2 number of nonzero Householder vectors in the current * WY transform * j first column of the current block column * j0 last column of the current block column * len length of the current block column * iw points to the portion of the workspace where the block * transform W is stored * iy points to the location of Y in the workspace * iwork points to the portion of work that is used as workspace for * other routines * * The workspace is used as follows: * * - The first nb1 * len <= nb0 * ( n - b ) elements hold the block W * of the current block WY transform. * Here, nb1 <= nb0 denotes the width of the current block column and * len <= n - b denotes its height; nb0 is the final blocking factor. * - The next nb1 * len elements hold the block Y. * - Another ( len + nb1 ) * nb1 <= n * nb0 elements are used as * workspace in the routines dgeqrl, dgewyg, dgewy, and dsywy. * * Routines called: * LOGICAL LSAME INTEGER NBDFLT EXTERNAL LSAME, NBDFLT * * lsame case-insensitive character matching (BLAS) * nbdflt determine default blocking factor (SBR) * EXTERNAL DGEQRL, DGEWY, DGEWYG, DSYWY * * dgeqrl QR or QL factorization (SBR) * dgewy apply WY transform from one side (SBR) * dgewyg generate WY factors (SBRtoolbox) * dsywy apply two-sided WY transform to a symmetric matrix (SBR) * INTRINSIC MAX, MIN * * ---------------------------------------------------------------------- * * --- check for errors in input --- * UPPER = LSAME( UPLO, 'U' ) NEEDU = LSAME( JOB, 'U' ) * IF ( .NOT. ( UPPER .OR. LSAME( UPLO, 'L' ) ) ) THEN INFO = - 1 ELSEIF ( .NOT. ( NEEDU .OR. LSAME( JOB, 'N' ) ) ) THEN INFO = - 2 ELSEIF ( N .LT. 0 ) THEN INFO = - 3 ELSEIF ( ( ( N .LE. 1 ) .AND. ( B .NE. 0 ) ) .OR. > ( ( N .GT. 1 ) .AND. > ( ( B .LT. 1 ) .OR. ( B .GE. N ) ) ) ) THEN INFO = - 4 ELSEIF ( LDA .LT. MAX( N, 1 ) ) THEN INFO = - 6 ELSEIF ( DRPTOL .LT. ZERO ) THEN INFO = - 7 ELSEIF ( LDU .LT. MAX( N, 1 ) ) THEN INFO = - 9 ELSEIF ( NB .LT. 0 ) THEN INFO = -10 ELSEIF ( LWORK .LT. ( 3*N-2*B ) ) THEN INFO = -13 ELSE INFO = 1 ENDIF * IF ( INFO .NE. 1 ) GOTO 999 * * --- check for quick return --- * IF ( ( N .LE. 1 ) .OR. ( B .EQ. ( N-1 ) ) ) GOTO 999 * * --- compute the maximum blocking factor for the * given workspace --- * NB0 = LWORK / ( 3 * N - 2 * B ) * * --- adjust to the user-supplied or default value --- * IF ( NB .GT. 0 ) THEN NB0 = MIN( NB, B, NB0 ) ELSE NB0 = MIN( NBDFLT( 'SYRDB', 'DoublePrec', 'BlockingFactor', > N, N-1, B, NEEDU ), > B, NB0 ) ENDIF * * ...................................................................... * IW = 1 * IF ( UPPER ) THEN * * --- reduce the upper triangle --- * DO 100 J0 = N, B+2, - NB0 * LEN = J0 - B NB1 = MIN( NB0, LEN-1 ) J = J0 - NB1 + 1 IY = IW + NB1 * LEN IWORK = IY + NB1 * LEN * CALL DGEQRL( 'L', LEN, NB1, A( 1, J ), LDA, DRPTOL, > TAU( J ), WORK( IWORK ) ) CALL DGEWYG( 'Upper', LEN, NB1, A( 1, J ), LDA, TAU( J ), > WORK( IW ), LEN, WORK( IY ), LEN, NB2, > WORK( IWORK ) ) CALL DGEWY( 'Left', LEN, B - NB1, NB2, A( 1, LEN+1 ), LDA, > WORK( IW ), LEN, WORK( IY ), LEN, > WORK( IWORK ) ) CALL DSYWY( 'Upper', LEN, NB2, A( 1, 1 ), LDA, > WORK( IW ), LEN, WORK( IY ), LEN, > WORK( IWORK ) ) * IF ( NEEDU ) THEN CALL DGEWY( 'Right', N, LEN, NB2, U( 1, 1 ), LDU, > WORK( IW ), LEN, WORK( IY ), LEN, > WORK( IWORK ) ) ENDIF * 100 CONTINUE * TAU( B+1 ) = ZERO * ELSE * * --- reduce the lower triangle --- * DO 200 J = 1, N-B-1, NB0 * LEN = N - ( J + B ) + 1 NB1 = MIN( NB0, LEN - 1 ) IY = IW + NB1 * LEN IWORK = IY + NB1 * LEN * CALL DGEQRL( 'R', LEN, NB1, A( J+B, J ), LDA, DRPTOL, > TAU( J ), WORK( IWORK ) ) CALL DGEWYG( 'Lower', LEN, NB1, A( J+B, J ), LDA, TAU( J ), > WORK( IW ), LEN, WORK( IY ), LEN, NB2, > WORK( IWORK ) ) CALL DGEWY( 'Left', LEN, B - NB1, NB2, A( J+B, J+NB1 ), LDA, > WORK( IW ), LEN, WORK( IY ), LEN, > WORK( IWORK ) ) CALL DSYWY( 'Lower', LEN, NB2, A( J+B, J+B ), LDA, > WORK( IW ), LEN, WORK( IY ), LEN, > WORK( IWORK ) ) * IF ( NEEDU ) THEN CALL DGEWY( 'Right', N, LEN, NB2, U( 1, J+B ), LDU, > WORK( IW ), LEN, WORK( IY ), LEN, > WORK( IWORK ) ) ENDIF > 200 CONTINUE * TAU( N-B ) = ZERO * ENDIF * * --- return the blocking factor --- * INFO = NB0 * 999 RETURN END * * ********************************************************************** * SUBROUTINE DSYGTR( UPLO, N, B, A, LDA, TAU, WORK, LWORK, INFO ) * * ---------------------------------------------------------------------- * * Description: * * dsygtr generates a real orthogonal matrix U of size n, defined as * the product of n - b Householder transformations, as returned by * dsyrdb. * * If uplo = 'U' then * * U = H( n ) * ... * H( b + 2 ), * * where the "mantissa" of the length-( k - b ) Householder * transformation H( k ) is stored in a( 1:k-b-1, k ) and its scaling * factor is stored in tau( k ), * * if uplo = 'L' then * * U = H( 1 ) * ... * H( n - b - 1 ), * * where the "mantiassa" of the length-(n - b - k - 1) Householder * transformation H( k ) is stored in a( b+k+1:n, k ) and its scaling * factor is stored in tau( k ). * * On exit, a is overwritten with the orthogonal matrix U. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 UPLO INTEGER N, B, LDA, LWORK, INFO DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) * * uplo (in) character*1 * Are the Householder vectors stored in the upper or lower * triangle of A ? * uplo = 'U' : Upper triangle. * = 'L' : Lower triangle. * * n (in) integer * The dimension of the reduced matrix A (and of the requested * orthogonal matrix). * n >= 0. * * b (in) integer * The number of sub(super-)diagonals of the reduced matrix. * 1 <= b < n, if n > 1. * b = 0 , if n <= 1. * * a (in/out) double precision array, dimension ( lda, n ) * On entry, the columns of a hold the "mantissae" of the * Householder transformations, as returned from dsyrdb. * On exit, a is overwritten with the orthogonal matrix U. * * lda (in) integer * The leading dimension of the array a. * lda >= max( n, 1 ). * * tau (in) double precision array, dimension ( n ). * The scaling factors for the Householder transformations, as * returned by dsyrdb. * * work (workspace) double precision array, dimension ( lwork ) * * lwork (in) integer * The size of the workspace (must be provided on entry). * lwork >= n - b. * * Workspace that small prevents blocking and may degrade * performance. For using nb-blocked transformations, provide * lwork >= nb * ( n - b ). * As a rule, lwork >= 20 * n should be fine. * * info (out) integer * On exit, info indocates the consistence of the arguments. * info = 1 : All arguments were OK. * info = -1 : uplo is none of 'U', 'L' (upper/lower case). * = -2 : n is out of range (negative). * = -3 : b is out of range ( < 0, or = 0 while n > 1, * or >= n ). * = -5 : lda is out of range ( < n or < 1 ). * = -8 : lwork is out of range ( < n - b ). * * ---------------------------------------------------------------------- * * Local variables: * DOUBLE PRECISION ZERO, ONE PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) * LOGICAL UPPER INTEGER B1, J * * upper are the Householder vectors stored in the upper triangle ? * b1 = b + 1 * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * EXTERNAL DCOPY, DLASET, DORGQL, DORGQR * * dcopy vector copy (BLAS) * dlaset initialize matrix (LAPACK) * dorgql build orthogonal matrix after QL factorization (LAPACK) * dorgqr build orthogonal matrix after QR factorization (LAPACK) * INTRINSIC MAX * * ---------------------------------------------------------------------- * * --- check for errors in the input --- * UPPER = LSAME( UPLO, 'U' ) B1 = B + 1 * IF ( .NOT. ( UPPER .OR. ( LSAME( UPLO, 'L' ) ) ) ) THEN INFO = - 1 ELSEIF ( N .LT. 0 ) THEN INFO = - 2 ELSEIF ( ( ( N .LE. 1 ) .AND. ( B .NE. 0 ) ) .OR. > ( ( N .GT. 1 ) .AND. > ( ( B .LT. 1 ) .OR. ( B .GE. N ) ) ) ) THEN INFO = - 3 ELSEIF ( LDA .LT. MAX( N, 1 ) ) THEN INFO = - 5 ELSEIF ( LWORK .LT. ( N-B ) ) THEN INFO = - 8 ELSE INFO = 1 ENDIF * IF ( INFO .NE. 1 ) GOTO 999 * * --- check for quick return --- * IF ( B1 .GE. N ) THEN CALL DLASET( 'All', N, N, ZERO, ONE, A, LDA ) GOTO 999 ENDIF * * ...................................................................... * IF ( UPPER ) THEN * * --- move the Householder vectors by b columns to * the left --- * DO 100 J = B+2, N CALL DCOPY( J-B1, A( 1, J ), 1, A( 1, J-B ), 1 ) 100 CONTINUE * * --- set the last b columns and rows to identity --- * CALL DLASET( 'All', B, N-B, ZERO, ZERO, A( N-B+1, 1 ), LDA ) CALL DLASET( 'All', N-B, B, ZERO, ZERO, A( 1, N-B+1 ), LDA ) CALL DLASET( 'All', B, B, ZERO, ONE, A( N-B+1, N-B+1 ), LDA ) * * --- generate the leading ( n-b )-by-( n-b ) * orthogonal matrix --- * CALL DORGQL( N-B, N-B, N-B, A, LDA, TAU( B+1 ), > WORK, LWORK, INFO ) * ELSE * * --- move the Householder vectors by b columns to * the right --- * DO 200 J = N-1, B1, -1 CALL DCOPY( N-J, A( J+1, J-B ), 1, A( J+1, J ), 1 ) 200 CONTINUE * * --- set the first b columns and rows to identity --- * CALL DLASET( 'All', N, B, ZERO, ONE, A, LDA ) CALL DLASET( 'All', B, N-B, ZERO, ZERO, A( 1, B1 ), LDA ) * * --- generate the trailing ( n-b )-by-( n-b ) * orthogonal matrix --- * CALL DORGQR( N-B, N-B, N-B, A( B1, B1 ), LDA, TAU, > WORK, LWORK, INFO ) * ENDIF * IF ( INFO .EQ. 0 ) INFO = 1 * 999 RETURN END * * ********************************************************************** * SUBROUTINE DSBRDB( JOB, N, B1, B2, A, LDA, DRPTOL, > U, LDU, NB, > WORK, LWORK, INFO ) * * ---------------------------------------------------------------------- * * Description: * * Given a symmetric n-times-n matrix A with b1 sub(or super-) * diagonals, dsbrdb reduces A to a narrower band with b2 sub(super) * diagonals by using a sequence of orthogonal similarity * transformations. If desired, the same transformations are also * applied from the right to the matrix U. That is, if initially U was * the identity, then the resulting banded matrix B and the updated U * fulfill the equation * * T * U * A * U = B . * * A must be given in the LAPACK packed storage scheme for lower * triangular banded matrices and will be overwritten with B. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 JOB INTEGER N, B1, B2, LDA, LDU, NB, LWORK, INFO DOUBLE PRECISION DRPTOL DOUBLE PRECISION A( LDA, * ), U( LDU, * ), WORK( * ) * * job (in) character*1 * Specifies whether U is required or not. * job = 'U' : Update U. * = 'N' : Do not update U. * * n (in) integer * The order of the matrix. * n >= 0. * * b1 (in) integer * The number of sub(super-)diagonals of A. * b1 >= 0 and b1 < n (if n > 0). * * b2 (in) integer * The number of sub(super-)diagonals of B. * 1 <= b2 <= b1 or b2 = b1 = 0. * * a (in/out) double precision array, dimension ( lda, n ) * On entry, this array contains the symmetric matrix A. The * leading ( b1+1 )-by-n part of a contains the lower triangle * of A with A( i, j ) stored in a( 1+i-j, j ), and the * strictly upper triangle is not referenced. * On exit, for i = 1, ..., b2+1, the first n - i + 1 elements * in the i-th row of a contain the reduced matrix B, * for i = b2 + 2, ..., b1+1, the first n - i + 1 elements in * the i-th row of a are zeroed, and * for i = b1 + 2, ..., min( b1+(b1-b2)+nb, n, lda ), the first * n - i + 1 elements in the i-th row of a are destroyed. * * lda (in) integer * The leading dimension of the array a. * lda >= min( b1 + 1, n ). * * To avoid unnecessary copying and therefore improve the * performance in the blocked case, we recommend * lda >= nb + b1 + ( b1 - b2 ). * * drptol (in) double precision * Threshold for dropping the Householder transformations: if * the norm of the vector to be eliminated is already smaller * than drptol then the transform is skipped. * drptol >= 0.0. * If you do not know, use 0.0. * * u (in/out) double precision array, dimension ( ldu, n ) * On entry, u contains some n-by-n matrix U. * On exit, U is postmultiplied by all orthogonal transforms * that were used to reduce the bandwidth of A. * Accessed only if the update of U is required. * * ldu (in) integer * The leading dimension of the array u. * ldu >= max( n, 1 ). * * nb (in) integer * The blocking factor nb, as suggested by the user, for the * reduction of A and the update of U. * 0 <= nb <= b2. * nb = 0 : User does not know how many Householder transforms * should be blocked for reasonable performance. Let * the routine figure it out (depending on the * workspace available). * = 1 : Do not block * > 1 : Try to block nb Householder transforms (if the * workspace is not sufficient then a smaller blocking * factor will be used). * * work (workspace) double precision array, dimension ( lwork ) * * lwork (in) integer * The size of the workspace (must be provided on entry). * lwork >= 3 * b1 + b2, if U is not required, and * >= n + 2 * b1 + 1, if U is required. * * Workspace that small enforces non-blocked transforms. * For using nb-blocked transforms, we need * lwork >= ( 3 * b1 + b2 ) * nb, if U is not required, and * >= ( n + 2 * b1 + 1 ) * nb, if U is required. * * If lda < b1 + ( b1 - b2 ) + nb, then ADDITIONAL workspace * is needed to buffer some of the intermediate fill-in during * the reduction. More precisely, we need * another ndiag * ( ndiag+1 ) / 2 elements to buffer one * ndiag-by-ndiag triangle of each diagonal block, where * ndiag = min( b1+(b1-b2)+nb, n ) - lda, and * another ( n / b1 ) * nsub * ( nsub+1 ) / 2 elements to * buffer an nsub-by-nsub triangle from each of the n / b1 * subdiagonal blocks, where * nsub = min( b1+(b1-b2), n ) - lda * Note that roughly n * ( b1 + (b1-b2) - lda ) / 2 elements * are sufficient, and that no buffer space is required if * lda >= b1 + ( b1 - b2 ) + nb. * * info (out) integer * On exit, info indicates the consistence of the arguments. * info = - 1 : job is none of 'U', 'N' (upper/lower case). * = - 2 : n is out of range (negative). * = - 3 : b1 is out of range (negative or >= n ). * = - 4 : b2 is out of range ( < 0, or = 0 while b1 >= 1, * or > b1 ). * = - 6 : lda is out of range ( < b1 + ( b1 - b2 ) + 1 * and < n ). * = - 7 : drptol is out of range ( < 0.0 ). * = - 9 : ldu is out of range ( < n ). * = -10 : nb is out of range (negative). * = -12 : lwork is too small (see above). * info >= 1 : All arguments are OK. * In this case, info returns the blocking factor * that was used in the reduction and in the * update of U. * * ---------------------------------------------------------------------- * * Local variables: * * --- constants --- * DOUBLE PRECISION ZERO PARAMETER ( ZERO = 0.0D0 ) * * --- for the reduction part --- * LOGICAL NEEDU INTEGER DELTAB, NB0, LDH, PREW, K, > L, NBLK, NB1, LDWY * * needu is U required ? * deltab = b1 - b2, the number of diagonals to remove * nb0 blocking factor that is ultimately used in the reduction * and in the update * ldh = min( deltab + nb0, n - b2 ), the size of the blocks * affected by each block transform * prew = b2 - nb0, the width of the block to be premultiplied * k numbers the "elimination steps" * l numbers the bulge chasing operations associated with each * elimination step * nblk number of the current block column * nb1 number of nonzero Householder vectors in the current block * transform * ldwy leading dimension of the arrays containing W and Y * * --- workspace management --- * INTEGER NSUB, SZSUB, LSUB, NSUB1, NDIAG, LDIAG, > NDIAG1, ISUB, IDIAG, IC, ID, ID1, IX, > IW, IY, IWORK, J * * nsub the dimension of the triangles from the subdiagonal blocks * that must be buffered in the workspace * (nsub <= b1 + ( b1 - b2 ) - lda) * szsub = nsub * ( nsub+1 ) / 2, the size of each such triangle * lsub = ( n / b ) * szsub, the total size of all these triangles * nsub1 the dimension of the current triangle, plus 1 * ndiag the dimension of the triangle from the main diagonal block * that must be buffered in the workspace * (ndiag <= b1 + ( b1 - b2 ) + nb0 - lda ) * ldiag = ndiag * ( ndiag+1 ) / 2, the size of this triangle * ndiag1 the dimension of the current triangle, plus 1 * isub points to the portion of the workspace that will hold the * triangles from all the subdiagonal blocks * idiag points to the portion of the workspace that will hold the * triangle from the current diagonal block * ic column position of the next element to be buffered * id diagonal position of the next element to be buffered * id1 = id + 1 * ix position in the workspace for this element * iw points to the portion of work that will hold the block * W of the WY tranform * iy points to the portion of work that will hold Y * iwork points to the portion of work that is used as workspace * in the routines dqrupd, dsywy, and dgewy * * The workspace is used as follows: * * - The first ( n / b1 ) * nsub * ( nsub+1 ) / 2 elements are used to * buffer nsub-by-nsub triangles of fill-in from the subdiagonal * blocks (see the discussion on lwork). * Here, nsub = min( b1+(b1-b2), n ) - lda <= b1 - b2 - 1. * These elements are needed only if nsub > 0. * - The next ndiag * ( ndiag+1 ) / 2 elements are used to buffer one * ndiag-by-ndiag triangle from the current diagonal block. * Here, ndiag = min( b1+(b1-b2)+nb0, n ) - lda <= b1 - 1. * These elements are needed only if ndiag > 0. * - The following ldh * nb0 elements hold the block W of the block WY * transform. * Here, ldh = min( b1-b2+nb0, n-b2 ) <= b1 - b2 + nb0 <= b1. * - The following ldh * nb0 elements hold the block Y. * - The remaining workspace is alternatively used by the routines * dqrupd (which needs ( n+1 )*nb0 elements if U is required and * ( ldh+1 )*nb0 elements otherwise), dsywy (( b1+1 )*nb0 elements), * and dgewy (b1*nb0 elements). * * Routines called: * LOGICAL LSAME INTEGER NBDFLT EXTERNAL LSAME, NBDFLT * * lsame case-insensitive character matching (BLAS) * nbdflt determine default blocking factor * EXTERNAL DGEWY, DQRUPD, DSYWY * * dgewy apply WY block transform (SBR) * dqrupd QR decomposition of a block of A, update of U, and premulti- * plication of another block of A (SBR) * dsywy apply two-sided block transform to a symmetric matrix (SBR) * INTRINSIC MAX, MIN * * ---------------------------------------------------------------------- * * --- check for errors in input --- * NEEDU = LSAME( JOB, 'U' ) * IF ( .NOT. ( NEEDU .OR. LSAME( JOB, 'N' ) ) ) THEN INFO = - 1 ELSEIF ( N .LT. 0 ) THEN INFO = - 2 ELSEIF ( ( B1 .LT. 0 ) .OR. > ( ( N .GT. 0 ) .AND. ( B1 .GE. N ) ) ) THEN INFO = - 3 ELSEIF ( ( B2 .LT. 0 ) .OR. > ( ( B1 .GE. 1 ) .AND. ( B2 .EQ. 0 ) ) .OR. > ( B2 .GT. B1 ) ) THEN INFO = - 4 ELSEIF ( LDA .LT. MIN( B1+1, N ) ) THEN INFO = - 6 ELSEIF ( DRPTOL .LT. ZERO ) THEN INFO = - 7 ELSEIF ( NEEDU .AND. ( LDU .LT. MAX( N, 1 ) ) ) THEN INFO = - 9 ELSEIF ( NB .LT. 0 ) THEN INFO = - 10 ELSE INFO = 1 ENDIF * IF ( INFO .NE. 1 ) GOTO 999 * * --- check for quick return --- * IF ( ( N .EQ. 0 ) .OR. ( B2 .EQ. B1 ) ) GOTO 999 * * --- determine blocking factor --- * IF ( NB .GT. 0 ) THEN NB0 = NB ELSE NB0 = NBDFLT( 'SBRDB', 'PrecString', 'BlockingFactor', > N, B1, B2, NEEDU ) ENDIF NB0 = MIN( NB0, B2 ) * * --- how many diagonals are eliminated, and how many must * be buffered ? --- * DELTAB = B1 - B2 NSUB = MAX( MIN( B1+DELTAB, N ) - LDA, 0 ) SZSUB = ( NSUB * ( NSUB + 1 ) ) / 2 LSUB = ( N / B1 ) * SZSUB * * --- reduce nb0 until workspace is sufficient --- * 10 CONTINUE * * --- how much of the diagonal blocks must be buffered ? --- * NDIAG = MAX( MIN( B1+DELTAB+NB0, N ) - LDA, 0 ) LDIAG = ( NDIAG * ( NDIAG + 1 ) ) / 2 IF ( NEEDU ) THEN IWORK = ( N + 2 * B1 + 1 ) * NB0 ELSE IWORK = ( 3 * B1 + B2 ) * NB0 ENDIF IF ( LWORK .LT. ( LSUB+LDIAG+IWORK ) ) THEN IF ( NB0 .GT. 1 ) THEN NB0 = NB0 - 1 GOTO 10 ELSE INFO = -12 GOTO 999 ENDIF ENDIF * * --- OK, now that we have nb0, set other constants --- * LDH = MIN( DELTAB+NB0, N-B2 ) PREW = MAX( B2-NB0, 0 ) * * --- set up pointers to the submatrices stored in work * (the data layout is pointed out above) --- * ISUB = 1 IDIAG = ISUB + LSUB IW = IDIAG + LDIAG IY = IW + LDH * NB0 IWORK = IY + LDH * NB0 * * --- make sure that the "bulge buffer" is empty --- * DO 30 K = B1+2, MIN( B1+NB0+DELTAB, LDA, N ) DO 20 J = 1, N-K+1 A( K, J ) = ZERO 20 CONTINUE 30 CONTINUE * DO 40 K = ISUB, IDIAG+LDIAG-1 WORK( K ) = ZERO 40 CONTINUE * * ...................................................................... * DO 400 K = 1, N - B2 - 1, NB0 * * --- QR decomposition to eliminate the leading nb0 * columns of the band --- * CALL DQRUPD( MIN( LDH, N-K-B2+1 ), NB0, DELTAB, > A( B2+1, K ), LDA - 1, DRPTOL, > NEEDU, N, U( 1, K+B2 ), LDU, > PREW, A( PREW+1, K+NB0 ), > NB1, WORK( IY ), WORK( IW ), LDWY, > WORK( IWORK ) ) * * --- bulge chasing --- * DO 300 L = K + B2, N - 1, B1 * NBLK = 1 + ( L - K - B2 ) / B1 IF ( NB1 .GT. 0 ) THEN * * --- symmetric update of diagonal block --- * CALL DSYWY( 'Lower', MIN( LDH, N-L+1 ), NB1, > A( 1, L ), LDA - 1, > WORK( IW ), LDWY, WORK( IY ), LDWY, > WORK( IWORK ) ) ENDIF * * --- if lda < b1 + ( b1 - b2 ) + nb0, then before * transforming the subdiagonal block, an * ndiag-by-ndiag triangle of the diagonal block * must be copied into the workspace ... --- * NDIAG = MIN( B1+LDH, N-L+1 ) - LDA NDIAG1 = NDIAG + 1 IX = IDIAG DO 120 J = 1, NDIAG IC = L + J DO 110 ID = 1, NDIAG1-J WORK( IX ) = A( ID, IC ) IX = IX + 1 110 CONTINUE 120 CONTINUE * * --- ... the bottommost rows of the subdiagonal block * must be set to zero --- * NSUB = MIN( MAX( N-L+1-LDA, 0 ), B1+(B1-B2)-LDA ) NSUB1 = NSUB + 1 DO 140 ID = NSUB1, NDIAG ID1 = ID + 1 DO 130 J = 1, ID A( ID1-J, L+J ) = ZERO 130 CONTINUE 140 CONTINUE * * --- ... and an nsub-by-nsub triangle of the * subdiagonal block must be restored from workspace --- * IX = ISUB + ( NBLK - 1 ) * SZSUB DO 160 J = 1, NSUB IC = L + J DO 150 ID = 1, NSUB1-J A( ID, IC ) = WORK( IX ) IX = IX + 1 150 CONTINUE 160 CONTINUE * IF ( NB1 .GT. 0 ) THEN * * --- postmultiply --- * IF ( N .GE. ( L+LDH ) ) THEN CALL DGEWY( 'Right', MIN( B1, N-L-LDH+1 ), > LDH, NB1, A( LDH+1, L ), LDA - 1, > WORK( IW ), LDWY, WORK( IY ), LDWY, > WORK( IWORK ) ) ENDIF ENDIF * IF ( N .GT. ( L+B1 ) ) THEN * * --- QR decomposition to eliminate the leading * nb0 columns of the bulge --- * CALL DQRUPD( MIN( LDH, N-L-B1+1 ), NB0, DELTAB, > A( B1+1, L ), LDA - 1, DRPTOL, > NEEDU, N, U( 1, L+B1 ), LDU, > B1 - NB0, A( B1-NB0+1, L+NB0 ), > NB1, WORK( IY ), WORK( IW ), LDWY, > WORK( IWORK ) ) ENDIF * * --- if lda < b1 + ( b1 - b2 ) + nb0, then an * nsub-by-nsub triangle of the subdiagonal block * must be copied into the workspace ... --- * NSUB = MIN( MAX( N-L-NB0+1-LDA, 0 ), B1+(B1-B2)-LDA ) NSUB1 = NSUB + 1 IX = ISUB + ( NBLK - 1 ) * SZSUB DO 220 J = 1, NSUB IC = L + J + NB0 DO 210 ID = 1, NSUB1-J WORK( IX ) = A( ID, IC ) IX = IX + 1 210 CONTINUE 220 CONTINUE * * --- ... and the ndiag-by-ndiag triangle of the * diagonal block must be restored from workspace --- * IX = IDIAG DO 240 J = 1, NDIAG IC = L + J DO 230 ID = 1, NDIAG1-J A( ID, IC ) = WORK( IX ) IX = IX + 1 230 CONTINUE 240 CONTINUE * 300 CONTINUE * 400 CONTINUE * INFO = NB0 * 999 RETURN END * * ********************************************************************** * SUBROUTINE DSBRDT( JOB, N, B, A, LDA, DRPTOL, > D, E, > U, LDU, NB, > WORK, LWORK, INFO ) * * ---------------------------------------------------------------------- * * Description: * * Given a symmetric n-by-n matrix A with b sub(or super-) diagonals, * dsbrdt reduces A to tridiagonal form using a sequence of orthogonal * similarity transformations. If desired, the same transformations are * also applied from the right to the matrix U. That is, if initially U * was the identity, then the resulting tridiagonal matrix T and the * updated U fulfill the equation * * T * U * A * U = T . * * A must be given in the LAPACK packed storage scheme for lower * triangular banded matrices. * * Author: Bruno Lang * Aachen University of technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 JOB INTEGER N, B, LDA, LDU, NB, LWORK, INFO DOUBLE PRECISION DRPTOL DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), U( LDU, * ), > WORK( * ) * * job (in) character*1 * Specifies whether U is required or not. * job = 'U' : Update U. * = 'N' : Do not update U. * * n (in) integer * The order of the matrix A. * n >= 0. * * b (in) integer * The number of sub(super-)diagonals of A. * 0 <= b < n, if n >= 1. * b = 0 , if n = 0. * * a (in/out) double precision array, dimension ( lda, n ) * On entry, this array contains the symmetric matrix A. The * leading ( b+1 )-by-n part of a contains the lower triangle * of A with A( i, j ) stored in a( 1+i-j, j ), and the * strictly upper triangle is not referenced. * On exit, for i = 1, ..., min( 2*b, n, lda ), the first * n - i + 1 elements in the i-th row of a are destroyed. * * lda (in) integer * The leading dimension of the array a. * lda >= b+1. * For optimum performance, we recommend lda >= 2*b. * * drptol (in) double precision * The threshold for dropping Householder transformations: if * the norm of the vector to be eliminated is already smaller * than drptol then the transform is skipped. * drptol >= 0.0. * If you do not know, use 0.0. * * d (out) double precision array, dimension ( n ) * On exit, d( 1 .. n ) contains the main diagonal of the * reduced tridiagonal matrix. * * e (out) double precision array, dimension ( n-1 ) * On exit, e( 1 .. n-1 ) contains the sub(super-)diagonal of * the reduced tridiagonal matrix. * * u (in/out) double precision array, dimension ( ldu, n ) * On entry, u contains some n-by-n matrix U. * On exit, U is postmultiplied with all orthogonal transforms * that were used to reduce the bandwidth of A. * Accessed only if the update of U is required. * * ldu (in) integer * The leading dimension of the array u. * ldu >= max( n, 1 ). * * nb (in) integer * The blocking factor nb, as suggested by the user, for the * update of U (nb is accessed only if U is required). * nb >= 0. * = 0 : User does not know how many Householder transforms * should be blocked for reasonable performance. Let * the routine figure it out (depending on the * workspace available). * = 1 : Do not block the update of U. * > 1 : Try to block nb Householder transforms (if the * workspace is not sufficient then a smaller * blocking factor will be used). * * work (workspace) double precision array, dimension ( lwork ) * * lwork (in) integer * The size of the workspace (must be provided on entry). * If lda >= 2*b, then * lwork >= 2 * b, if U is not required. * lwork >= b + n, if U is required and is updated with * non-blocked Householder transforms. * lwork >= 2 * nb * ( n + b + nb - 1 ), if U is updated * with nb-blocked transforms. * If lda < 2*b, then ADDITIONAL ( n/b + 1 )*szsub + nsave * elements of workspace are needed to buffer * intermediate elements. Here, nsave = 2*b-lda, * and szsub = (nsave*(nsave-1))/2. * Note that this is roughly n*(2*b-lda)/2 * elements. * * info (out) integer * On exit, info indicates the consistence of the arguments. * info = - 1 : job is none of 'U', 'N' (upper/lower case). * = - 2 : n is out of range (negative). * = - 3 : b is out of range (negative or * >= n, while n > 0 ). * = - 5 : lda is too small ( < min( b+1, n ) ). * = - 6 : drptol is out of range (negative). * = -10 : ldu is too small ( < n or < 1 ). * = -11 : nb is out of range (negative). * = -13 : workspace is too small (see above). * info >= 1 : All arguments are OK. * In this case, info returns the blocking factor * that was used in the update of U (if job='U'), * or info = 1 (if job='N'). * * ---------------------------------------------------------------------- * * Local variables: * * --- constants --- * DOUBLE PRECISION ZERO, ONE PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) * * --- for the reduction part --- * INTEGER NSAVE, NSAVE1, IDIAG, ISUB, SZSUB, ID, IC, > IX, NBLK, HEIGHT, WIDTH, K, J, I, J0 DOUBLE PRECISION TAU * * nsave the number of diagonals that must be saved * nsave1 = nsave + 1 * idiag points to the portion of the workspace that holds the part * of the current diagonal block of the band * isub points to the portion of the workspace that holds the part * of the subdiagonal blocks of the band * szsub number of elements that must be saved from each subdiagonal * block * id diagonal position of the element to save * ic column position of the element to save * ix position in the workspace for saving the element * nblk number of the block to process next * height height of the block to process next * width width of the subdiagonal block * k numbers the columns to be eliminated * j counter for the "progress" of the bulge chasing * tau scaling factor of the current Householder transform * * --- for updating U --- * LOGICAL NEEDU, BLOCK, ONFLY INTEGER NB0, IV, IY, IW, ITAU, IWORK, LDWY0, > K0, IFIRST, NB1, LDWY, NB2, V DOUBLE PRECISION BETA * * needu is U needed ? * block is U needed, and is there enough workspace for blocking the * updates ? * onfly is U needed, and is blocking prohibited by small workspace ? * nb0 blocking factor that is ultimately used in the update * iv points to the portion of work that will hold the Householder * vectors for nb consecutive "eliminate & chase" sweeps * (required size for this buffer : n * nb0) * iy points to the portion of work that will hold the block * transform Y in the WY representation (required size for this * buffer : ( b + nb0 - 1 ) * nb0) * iw points to the portion of work that will hold the block * transform W in the WY representation (required size for this * buffer : ( b + nb0 - 1 ) * nb0) * itau points to the portion of work that will hold the scaling * factors (required size for this buffer: nb0) * iwork points to the protion of work that may be used as working * space by the routines dlarfx, dsyrf, and dgewy. * (required size for this buffer : n * nb0, if U is needed, * b otherwise) * ldwy0 = b + nb0 - 1, the leading dimension of "full" block * Householder reflectors W and Y, resp. * k0 number of the first sweep that contributed to the the * current block transform * ifirst first row affected by the current block transform * nb1 number of transforms in the current block update (usually * = nb0, except for the one at the bottom or the last sweeps) * ldwy size of the current block transform (usually = ldwy0, * except for the last block transform of the sweep) * nb2 number of nonzero transforms in the current block update * (usually = nb1, except for special matrices) * v points to the portion of work that holds the current * Householder vector * beta coefficient in the quadratic equation for determining the * maximum possible blocking factor * * The workspace is used as follows: * * If lda < 2 * b then some of the intermediate fill-in is held in the * workspace. More precisely, nsave = 2 * b - lda is the size of the * (triangular) blocks that extend beyond the array a. Then * nsave-by-nsave blocks of the band must be swapped between the array * a and the workspace. Note that actually only (nsave-1)-by-(nsave-1) * blocks of size szsub = ( ( nsave - 1 ) * nsave ) / 2 must be saved * as the remaining nsave elements are made zero by the algorithm. * - The first szsub + nsave elements of the workspace are used to * buffer a triangular portion of the current diagonal block, and * - the next ( n / b ) * szsub elements hold n / b triangular * (nsave-1)-by-(nsave-1) portions of the subdiagonal blocks. * If lda >= 2 * b then the whole fill-in fits into the array a, and * the above-mentioned buffers are not needed. * * If U is not needed (or U is needed, but its update is non-blocked) * then the next b places of work hold the current Householder vector * and the following b (or n, resp.) places are used as workspace for * applying the transformation. * * If U is updated via blocked Householder transforms (comprising nb0 * Householder transforms) * T * (affected part of) U = U * ( I + W * Y ) * then in the current implementation * - the next n * nb0 places hold the Householder vectors for * nb0 successive "eliminate & chase" sweeps down the band, * - the next ( b + nb0 - 1 ) * nb0 places hold the block Y, * - the next ( b + nb0 - 1 ) * nb0 places hold W, * - the next n * nb0 places are alternatively used as workspace for * the routines dsyrf (b elements), dlarfx (b elements), and dgewyr * (n * nb0 elements), and * - the buffer for nb0 scaling factors is overlapped with the first * nb0 elements of the "multiuse" workspace. * * Routines called: * LOGICAL LSAME INTEGER NBDFLT EXTERNAL LSAME, NBDFLT * * lsame case-insensitive character matching (BLAS) * nbdflt determine default blocking factor * EXTERNAL DCOPY, DGBWYG, DGEWY, DLARFX, DLBRFG, > DSYRF * * dcopy vector copy (BLAS) * dgbwyg generate WY block reflector (SBR) * dgewy apply WY block reflector (SBR) * dlbrfg determine Householder vector (SBR) * dsyrf apply two-sided transform to a symmetric matrix (SBR) * dlarfx apply Householder transform (LAPACK) * INTRINSIC DBLE, INT, MAX, MIN, MOD, SQRT * * ---------------------------------------------------------------------- * * --- check for errors in input --- * NEEDU = LSAME( JOB, 'U' ) * IF ( .NOT. ( NEEDU .OR. LSAME( JOB, 'N' ) ) ) THEN INFO = -1 ELSEIF ( N .LT. 0 ) THEN INFO = -2 ELSEIF ( ( B .LT. 0 ) .OR. ( ( N .GT. 0 ) .AND. ( B .GE. N ) ) ) > THEN INFO = -3 ELSEIF ( LDA .LT. ( B+1 ) ) THEN INFO = -5 ELSEIF ( DRPTOL .LT. ZERO ) THEN INFO = -6 ELSEIF ( LDU .LT. MAX( N, 1 ) ) THEN INFO = -10 ELSEIF ( NEEDU .AND. ( NB .LT. 0 ) ) THEN INFO = -11 ELSE INFO = 1 ENDIF * IF ( INFO .NE. 1 ) GOTO 999 * * --- check for quick return --- * IF ( N .EQ. 0 ) THEN GOTO 999 ELSEIF ( B .EQ. 0 ) THEN CALL DCOPY( N, A( 1, 1 ), LDA, D, 1 ) DO 10 J = 1, N-1 E( J ) = ZERO 10 CONTINUE GOTO 999 ELSEIF ( B .EQ. 1 ) THEN CALL DCOPY( N, A( 1, 1 ), LDA, D, 1 ) CALL DCOPY( N-1, A( 2, 1 ), LDA, E, 1 ) GOTO 999 ENDIF * * --- check if workspace is sufficient --- * NSAVE = 2 * B - LDA IF ( NSAVE .GT. 0 ) THEN SZSUB = ( ( NSAVE - 1 ) * NSAVE ) / 2 IX = SZSUB + NSAVE + ( N / B ) * SZSUB ELSE SZSUB = 0 IX = 0 ENDIF IF ( ( LWORK .LT. ( IX+2*B ) ) .OR. > ( NEEDU .AND. ( LWORK .LT. ( IX+B+N ) ) ) ) THEN INFO = -13 GOTO 999 ENDIF * * --- compute the final blocking factor for updating U --- * IF ( NEEDU ) THEN * * --- first determine the maximum possible value nb0 * (for blocking nb0 updates, we need * 2 * nb0 * ( n + b + nb0 - 1 ) workspace). --- * BETA = DBLE( N + B - 1 ) NB0 = INT( ( SQRT( BETA**2 + 2.0D0*( LWORK-IX ) ) - BETA ) > / 2.0D0 ) * * --- adjust to the user-supplied or default value --- * IF ( NB .GT. 0 ) THEN NB0 = MIN( NB, NB0, N-2 ) ELSE NB0 = MIN( NBDFLT( 'SBRDT', 'DoublePrec', 'BlockingFactor', > N, B, 1, .TRUE. ), > NB0 ) ENDIF * IF ( NB0 .LT. 1 ) NB0 = 1 * * --- OK, now we are done --- * BLOCK = ( NB0 .GT. 1 ) ONFLY = ( .NOT. BLOCK ) INFO = NB0 ELSE NB0 = 1 BLOCK = .FALSE. ONFLY = .FALSE. ENDIF * * --- set up pointers to the submatrices stored in work * (the data layout is pointed out above) --- * IF ( NSAVE .GT. 0 ) THEN IDIAG = 1 ISUB = IDIAG + ( SZSUB + NSAVE ) IV = ISUB + ( N / B ) * SZSUB ELSE IDIAG = -1 ISUB = -1 IV = 1 ENDIF * LDWY0 = B + NB0 - 1 IF ( BLOCK ) THEN IY = IV + N * NB0 IW = IY + LDWY0 * NB0 IWORK = IW + LDWY0 * NB0 ITAU = IWORK ELSE IY = -1 IW = -1 IWORK = IV + B ITAU = -1 ENDIF V = IV * * --- make sure that the "bulge buffer" is empty --- * DO 30 J = 2, N-B DO 20 K = B+2, MIN( 2*B, LDA, N-J+1 ) A( K, J ) = ZERO 20 CONTINUE 30 CONTINUE * DO 40 IX = 1, IV-1 WORK( IX ) = ZERO 40 CONTINUE * * ...................................................................... * K0 = 1 * * --- in the k-th pass of the following main loop, * the k-th column of the band is zeroed and the * resulting bulge is chased down the band --- * DO 700 K = 1, N-2 * * --- determine the length of the column and the * Householder vector --- * HEIGHT = MIN( B, N-K ) CALL DLBRFG( HEIGHT, A( 2, K ), A( 3, K ), 1, TAU, DRPTOL ) * * --- save the vector and zero column of A --- * IF ( BLOCK ) THEN V = IV + ( K - K0 ) * ( N - K0 + 1 ) ENDIF WORK( V ) = ONE CALL DCOPY( HEIGHT-1, A( 3, K ), 1, WORK( V+1 ), 1 ) DO 110 I = 3, HEIGHT+1 A( I, K ) = ZERO 110 CONTINUE * * --- save the new tridiagonal elements --- * D( K ) = A( 1, K ) E( K ) = A( 2, K ) * IF ( TAU .NE. ZERO ) THEN * * --- apply the Householder transform to both sides * of the first diagonal block --- * CALL DSYRF( 'Lower', HEIGHT, WORK( V ), 1, TAU, > A( 1, K+1 ), LDA - 1, WORK( IWORK ) ) * * --- if the transformations of U are not blocked * then apply them as they are generated --- * IF ( ONFLY ) THEN CALL DLARFX( 'Right', N, HEIGHT, WORK( V ), TAU, > U( 1, K+1 ), LDU, WORK( IWORK ) ) ENDIF ENDIF * * --- start the bulge chasing --- * DO 500 J = K+1, N-B, B NBLK = 1 + ( J - K - 1 ) / B * * --- determine the size of the subdiagonal block --- * WIDTH = HEIGHT HEIGHT = MIN( B, N-J-(B-1) ) * * --- if lda is too small then parts of the diagonal * block must be saved ... --- * NSAVE = B + HEIGHT - LDA NSAVE1 = NSAVE + 1 IX = IDIAG DO 220 J0 = 1, NSAVE IC = J + J0 DO 210 ID = 1, NSAVE1-J0 WORK( IX ) = A( ID, IC ) IX = IX + 1 210 CONTINUE 220 CONTINUE * * --- ... and the subdiagonal block must be restored --- * IX = ISUB + ( NBLK - 1 ) * SZSUB IF ( HEIGHT .EQ. B ) THEN DO 230 J0 = 1, NSAVE A( NSAVE1-J0, J+J0 ) = ZERO 230 CONTINUE DO 250 J0 = 2, NSAVE IC = J + J0 - 1 DO 240 ID = 1, NSAVE1-J0 A( ID, IC ) = WORK( IX ) IX = IX + 1 240 CONTINUE 250 CONTINUE ELSE DO 270 J0 = 1, NSAVE IC = J + J0 DO 260 ID = 1, NSAVE1-J0 A( ID, IC ) = WORK( IX ) IX = IX + 1 260 CONTINUE 270 CONTINUE ENDIF * IF ( TAU .NE. ZERO ) THEN * * --- apply the previous Householder transform * to the subdiagonal block (from the right) --- * CALL DLARFX( 'Right', HEIGHT, WIDTH, WORK( V ), TAU, > A( B+1, J ), LDA-1, WORK( IWORK ) ) ENDIF * * --- save the previous scaling factor --- * WORK( V ) = TAU * * --- generate a new Householder transform to * zero the first column of the subdiagonal block --- * CALL DLBRFG( HEIGHT, A( B+1, J ), A( B+2, J ), 1, > TAU, DRPTOL ) * IF ( BLOCK ) THEN V = IV + ( K - K0 ) * ( N - K0 + 1 ) + NBLK * B ENDIF WORK( V ) = ONE CALL DCOPY( HEIGHT-1, A( B+2, J ), 1, WORK( V+1 ), 1 ) DO 310 I = B+2, B+HEIGHT A( I, J ) = ZERO 310 CONTINUE * IF ( TAU .NE. ZERO ) THEN * * --- apply the transform to the subdiagonal block * (from the left) --- * CALL DLARFX( 'Left', HEIGHT, WIDTH-1, WORK( V ), TAU, > A( B, J+1 ), LDA-1, WORK( IWORK ) ) ENDIF * * --- if lda is too small then the subdiagonal block * must be saved ... --- * IX = ISUB + ( NBLK - 1 ) * SZSUB DO 420 J0 = 2, NSAVE IC = J + J0 DO 410 ID = 1, NSAVE1-J0 WORK( IX ) = A( ID, IC ) IX = IX + 1 410 CONTINUE 420 CONTINUE * * --- ... and the diagonal block must be restored --- * IX = IDIAG DO 440 J0 = 1, NSAVE IC = J + J0 DO 430 ID = 1, NSAVE1-J0 A( ID, IC ) = WORK( IX ) IX = IX + 1 430 CONTINUE 440 CONTINUE IF ( TAU .NE. ZERO ) THEN * * --- apply the transform to the diagonal block * (two-sided) --- * CALL DSYRF( 'Lower', HEIGHT, WORK( V ), 1, TAU, > A( 1, J+B ), LDA-1, WORK( IWORK ) ) * * --- if the transformations of U are not blocked * then apply them as they are generated --- * IF ( ONFLY ) THEN CALL DLARFX( 'Right', N, HEIGHT, WORK( V ), TAU, > U( 1, J+B ), LDU, WORK( IWORK ) ) ENDIF ENDIF * 500 CONTINUE * * --- save the last scaling factor --- * WORK( V ) = TAU * * ...................................................................... * IF ( BLOCK ) THEN * * --- (delayed) update of the transformation matrix U. * To allow blocked operations, the update is only * done in every nb0-th pass through the k loop --- * IF ( ( MOD( K, NB0 ) .EQ. 0 ) .OR. ( K .EQ. ( N-2 ) ) ) > THEN * * --- the following loop applies block transforms * reversely to their generation, e.g., starting * at the bottom and working up. * First, determine which columns ifirst ... * are affected by the block transform and * how many (nb1) transforms it contains --- * DO 600 IFIRST = N-MOD( N-K0-1, B ), K0+1, -B * * --- how many Householder transforms contribute * to the current block transform ? --- * NB1 = MIN( K-K0+1, N-IFIRST+1 ) LDWY = MIN( LDWY0, N-IFIRST+1 ) * * --- determine the block Householder reflector * corresponding to these nb1 vectors --- * V = IFIRST - K0 - 1 + IV CALL DCOPY( NB1, WORK( V ), N-K0+1, WORK( ITAU ), 1 ) CALL DGBWYG( LDWY, NB1, B-1, > WORK( V ), N-K0, WORK( ITAU ), > WORK( IW ), LDWY, WORK( IY ), LDWY, NB2 ) * * --- update U by postmultiplying --- * CALL DGEWY( 'Right', N, LDWY, NB2, > U( 1, IFIRST ), LDU, > WORK( IW ), LDWY, WORK( IY ), LDWY, > WORK( IWORK ) ) * 600 CONTINUE * K0 = K0 + NB0 * ENDIF ENDIF * * ...................................................................... * 700 CONTINUE * * --- end of the main loop: cleanup for the very tail * of the band --- * D( N-1 ) = A( 1, N-1 ) E( N-1 ) = A( 2, N-1 ) * D( N ) = A( 1, N ) * 999 RETURN END * * ********************************************************************** * SUBROUTINE DSY2BC( UPLO, N, B, AFULL, LDFULL, ABAND, LDBAND, > INFO ) * * ---------------------------------------------------------------------- * * Description: * * dsy2bc copies a symmetric banded A matrix from (upper or lower) * symmetric (full) storage to lower banded storage. * * Note that afull and aband must refer to different memory locations, * i.e., A may NOT be repacked within the same array. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 UPLO INTEGER N, B, LDFULL, LDBAND, INFO DOUBLE PRECISION AFULL( LDFULL, * ), ABAND( LDBAND, * ) * * uplo (in) character*1 * Is the matrix A stored in the upper or lower triangle of the * array afull ? * uplo = 'U' : Upper triangle. * = 'L' : Lower triangle. * * n (in) integer * The size of the matrix A. * n >= 0. * * b (in) integer * The (semi-)bandwidth of the matrix A. * 0 <= b < n, if n >= 1. * b = 0 , if n = 0. * * afull (in) double precision array, dimension ( ldfull, n ) * The symmetric banded matrix A in upper or lower symmetric * storage. * * ldfull (in) integer * The leading dimension of the array afull. * ldfull >= max( n, 1 ). * * aband (out) double precision array, dimension ( ldband, n ) * The symmetric banded matrix A in lower banded storage (upper * banded storage is not supported). * * ldband (in) * The leading dimension of the array aband. * ldband >= b + 1. * * info (out) integer * On exit, info indicates the consistency of the arguments. * info = -1 : uplo was none of 'U', 'L' (upper/lower case). * = -2 : n was out of range (negative). * = -3 : b was out of range (negative or >= n ). * = -5 : ldfull was out of range ( < n or < 1 ). * = -7 : ldband was out of range ( < b + 1 ). * info = 1 : All arguments were ok. * * ---------------------------------------------------------------------- * * Local variables: * LOGICAL UPPER INTEGER J, I * * upper is A given in upper symmetric storage ? * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * INTRINSIC MAX, MIN * * ---------------------------------------------------------------------- * * --- check for errors in the parameters --- * UPPER = LSAME( UPLO, 'U' ) * IF ( .NOT. ( UPPER .OR. ( LSAME( UPLO, 'L' ) ) ) ) THEN INFO = - 1 ELSEIF ( N .LT. 0 ) THEN INFO = - 2 ELSEIF ( ( B .LT. 0 ) .OR. > ( ( N .GT. 0 ) .AND. ( B .GE. N ) ) ) THEN INFO = - 3 ELSEIF ( LDFULL .LT. MAX( N, 1 ) ) THEN INFO = - 5 ELSEIF ( LDBAND .LT. ( B+1 ) ) THEN INFO = - 7 ELSE INFO = 1 ENDIF * IF ( INFO .NE. 1 ) GOTO 999 * * --- check for quick return --- * IF ( N .EQ. 0 ) GOTO 999 * * --- non-trivial case --- * IF ( UPPER ) THEN * * --- "upper to lower" --- * DO 110 J = 1, N DO 100 I = MAX( J-B, 1 ), J ABAND( 1+J-I, I ) = AFULL( I, J ) 100 CONTINUE 110 CONTINUE ELSE * * --- "lower to lower" --- * DO 210 J = 1, N DO 200 I = J, MIN( J+B, N ) ABAND( 1+I-J, J ) = AFULL( I, J ) 200 CONTINUE 210 CONTINUE ENDIF * 999 RETURN END * * ********************************************************************** * SUBROUTINE DSY2BI( UPLO, N, B, A, LDFULL, LDBAND, INFO ) * * ---------------------------------------------------------------------- * * Description: * * dsy2bi copies a symmetric banded A matrix from (upper or lower) * symmetric (full) storage to lower banded storage within the same * array a (i.e., in-place). * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 UPLO INTEGER N, B, LDFULL, LDBAND, INFO DOUBLE PRECISION A( * ) * * uplo (in) character*1 * Is the matrix A stored in the upper or lower triangle of the * array a ? * uplo = 'U' : Upper triangle. * = 'L' : Lower triangle. * * n (in) integer * The size of the matrix A. * n >= 0. * * b (in) integer * The (semi-)bandwidth of the matrix A. * 0 <= b < n, if n >= 1. * b = 0 , if n = 0. * * a (in/out) double precision array, * dimension ( max( ldfull, ldband), n ) * On entry, the symmetric banded matrix A in upper or lower * symmetric storage. * On exit, the symmetric banded matrix A in lower banded * storage (upper banded storage is not supported). * Note that this routine treats a as a one-dimensional array. * * ldfull (in) integer * The leading dimension of the array a (in full storage). * ldfull >= max( n, 1 ). * * ldband (in) * The leading dimension of the array a (in banded storage). * ldband >= b + 1. * * info (out) integer * On exit, info indicates the consistency of the arguments. * info = -1 : uplo was none of 'U', 'L' (upper/lower case). * = -2 : n was out of range (negative). * = -3 : b was out of range (negative or >= n ). * = -5 : ldfull was out of range ( < n or < 1 ). * = -6 : ldband was out of range ( < b + 1 ). * info = 1 : All arguments were ok. * * ---------------------------------------------------------------------- * * Local variables: * LOGICAL UPPER INTEGER B1, IBAND, IFULL, J, I * * upper is A given in upper symmetric storage ? * b1 = b + 1 * iband iband + i points to the next entry in a (banded storage) * ifull ifull + i points to the next entry in a (full storage) * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * EXTERNAL DSB2BI * * dsb2bi in-place repacking from banded to banded storage (SBR) * INTRINSIC MAX, MIN * * ---------------------------------------------------------------------- * * --- check for errors in the parameters --- * UPPER = LSAME( UPLO, 'U' ) B1 = B + 1 * IF ( .NOT. ( UPPER .OR. ( LSAME( UPLO, 'L' ) ) ) ) THEN INFO = - 1 ELSEIF ( N .LT. 0 ) THEN INFO = - 2 ELSEIF ( ( B .LT. 0 ) .OR. > ( ( N .GT. 0 ) .AND. ( B .GE. N ) ) ) THEN INFO = - 3 ELSEIF ( LDFULL .LT. MAX( N, 1 ) ) THEN INFO = - 5 ELSEIF ( LDBAND .LT. B1 ) THEN INFO = - 6 ELSE INFO = 1 ENDIF * IF ( INFO .NE. 1 ) GOTO 999 * * --- check for quick return --- * IF ( N .EQ. 0 ) GOTO 999 * * --- non-trivial case --- * IF ( UPPER ) THEN * * --- "upper to lower"; avoid overwriting by first * packing the band as tight as possible (i.e., * leading dimension b + 1) and then "stretching" * to leading dimension ldband --- * DO 110 J = 1, N IBAND = ( J - 1 ) * B1 + 1 - J DO 100 I = J, MIN( J+B, N ) A( IBAND+I ) = A( (I-1)*LDFULL+J ) 100 CONTINUE 110 CONTINUE * IF ( LDBAND .GT. B1 ) THEN CALL DSB2BI( 'Lower', N, B, A, B1, LDBAND, INFO ) ENDIF * ELSE * * --- "lower to lower"; avoid overwriting by * copying the columns in the "safe" order --- * IF ( LDBAND .LE. ( LDFULL+1 ) ) THEN DO 210 J = 1, N IBAND = ( J - 1 ) * LDBAND + 1 - J IFULL = ( J - 1 ) * LDFULL DO 200 I = J, MIN( J+B, N ) A( IBAND+I ) = A( IFULL+I ) 200 CONTINUE 210 CONTINUE ELSE DO 310 J = N, 1, -1 IBAND = ( J - 1 ) * LDBAND + 1 - J IFULL = ( J - 1 ) * LDFULL DO 300 I = MIN( J+B, N ), J, -1 A( IBAND+I ) = A( IFULL+I ) 300 CONTINUE 310 CONTINUE ENDIF * ENDIF * 999 RETURN END * * ********************************************************************** * SUBROUTINE DSB2BC( UPLO, N, B, ASRC, LDSRC, ADST, LDDST, INFO ) * * ---------------------------------------------------------------------- * * Description: * * dsb2bc copies a symmetric banded A matrix from upper or lower * banded storage to lower banded storage. It may be used to pack the * matrix tightly by setting lddst accordingly. * * Note that asrc and adst must refer to different memory locations, * i.e., A may NOT be repacked within the same array. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 UPLO INTEGER N, B, LDSRC, LDDST, INFO DOUBLE PRECISION ASRC( LDSRC, * ), ADST( LDDST, * ) * * uplo (in) character*1 * Is the matrix A given in upper or lower banded storage ? * uplo = 'U' : Upper banded storage. * = 'L' : Lower banded storage. * * n (in) integer * The size of the matrix A. * n >= 0. * * b (in) integer * The (semi-)bandwidth of the matrix A. * 0 <= b < n, if n >= 1. * b = 0 , if n = 0. * * asrc (in) double precision array, dimension ( ldsrc, n ) * The symmetric banded matrix A in upper or lower banded * storage. * * ldsrc (in) integer * The leading dimension of the array asrc. * ldsrc >= b + 1. * * adst (out) double precision array, dimension ( lddst, n ) * The symmetric banded matrix A in lower banded storage. * * lddst (in) integer * The leading dimension of the array adst. * lddst >= b + 1. * * info (out) integer * On exit, info indicates the consistency of the arguments. * info = -1 : uplo was none of 'U', 'L' (upper/lower case). * = -2 : n was out of range (negative). * = -3 : b was out of range (negative or >= n ). * = -5 : ldsrc was out of range ( < b + 1 ). * = -7 : lddst was out of range ( < b + 1 ). * info = 1 : All arguments were ok. * * ---------------------------------------------------------------------- * * Local variables: * LOGICAL UPPER INTEGER B1, J, I * * upper is A given in upper banded storage ? * b1 = b + 1 * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * INTRINSIC MIN * * ---------------------------------------------------------------------- * * --- check for errors in the parameters --- * UPPER = LSAME( UPLO, 'U' ) B1 = B + 1 * IF ( .NOT. ( UPPER .OR. ( LSAME( UPLO, 'L' ) ) ) ) THEN INFO = - 1 ELSEIF ( N .LT. 0 ) THEN INFO = - 2 ELSEIF ( ( B .LT. 0 ) .OR. > ( ( N .GT. 0 ) .AND. ( B .GE. N ) ) ) THEN INFO = - 3 ELSEIF ( LDSRC .LT. B1 ) THEN INFO = - 5 ELSEIF ( LDDST .LT. B1 ) THEN INFO = - 7 ELSE INFO = 1 ENDIF * IF ( INFO .NE. 1 ) GOTO 999 * * --- check for quick return --- * IF ( N .EQ. 0 ) GOTO 999 * * --- non-trivial case --- * IF ( UPPER ) THEN * * --- "upper to lower" --- * DO 110 J = 1, N DO 100 I = 1, MIN( B1, N-J+1 ) ADST( I, J ) = ASRC( B+2-I, J+I-1 ) 100 CONTINUE 110 CONTINUE ELSE * * --- "lower to lower" --- * DO 210 J = 1, N DO 200 I = 1, MIN( B1, N-J+1 ) ADST( I, J ) = ASRC( I, J ) 200 CONTINUE 210 CONTINUE * ENDIF * 999 RETURN END * * ********************************************************************** * SUBROUTINE DSB2BI( UPLO, N, B, A, LDSRC, LDDST, INFO ) * * ---------------------------------------------------------------------- * * Description: * * dsb2bi copies a symmetric banded A matrix from upper or lower banded * storage to lower banded storage within the same array a (i.e., * in-place). It may be used to pack the matrix tightly by setting * lddst accordingly. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 UPLO INTEGER N, B, LDSRC, LDDST, INFO DOUBLE PRECISION A( * ) * * uplo (in) character*1 * Is the matrix A given in the upper or lower banded storage ? * uplo = 'U' : Upper banded storage. * = 'L' : Lower banded storage. * * n (in) integer * The size of the matrix A. * n >= 0. * * b (in) integer * The (semi-)bandwidth of the matrix A. * 0 <= b < n. * * a (in/out) double precision array, * dimension ( max( ldsrc, lddst ), n ) * On entry, the symmetric banded matrix A in upper or lower * banded storage. * On exit, the symmetric banded matrix A in lower banded * storage (upper banded storage is not supported). * Note that this routine treats a as a one-dimensional array. * * ldsrc (in) integer * The leading dimension of the array a (input storage scheme). * ldsrc >= b + 1. * * lddst (in) integer * The leading dimension of the array a (output storage * scheme). * lddst >= b + 1. * * info (out) integer * On exit, info indicates the consistency of the arguments. * info = -1 : uplo was none of 'U', 'L' (upper/lower case). * = -2 : n was out of range (negative). * = -3 : b was out of range (negative or >= n ). * = -5 : ldsrc was out of range ( < b + 1 ). * = -6 : lddst was out of range ( < b + 1 ). * info = 1 : All arguments were ok. * * ---------------------------------------------------------------------- * * Local variables: * LOGICAL UPPER INTEGER B1, LDSRC1, ISRC, IDST, J, I * * upper is A given in upper banded storage ? * b1 = b + 1 * ldsrc1 leading dimension of the current source, minus 1 * isrc isrc + i points to the next source element in a * idst idst + something points to the next destination element in a * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * INTRINSIC MAX, MIN * * ---------------------------------------------------------------------- * * --- check for errors in the parameters --- * UPPER = LSAME( UPLO, 'U' ) B1 = B + 1 * IF ( .NOT. ( UPPER .OR. ( LSAME( UPLO, 'L' ) ) ) ) THEN INFO = - 1 ELSEIF ( N .LT. 0 ) THEN INFO = - 2 ELSEIF ( ( B .LT. 0 ) .OR. > ( ( N .GT. 0 ) .AND. ( B .GE. N ) ) ) THEN INFO = - 3 ELSEIF ( LDSRC .LT. B1 ) THEN INFO = - 5 ELSEIF ( LDDST .LT. B1 ) THEN INFO = - 6 ELSE INFO = 1 ENDIF * IF ( INFO .NE. 1 ) GOTO 999 * * --- check for quick return --- * IF ( N .EQ. 0 ) GOTO 999 * * --- non-trivial case --- * IF ( UPPER ) THEN * * --- "upper to lower" --- * IF ( LDDST .LE. LDSRC ) THEN * * --- no danger of overwriting --- * LDSRC1 = LDSRC - 1 DO 110 J = 1, N IDST = ( J - 1 ) * LDDST ISRC = ( J - 2 ) * LDSRC + B + 2 DO 100 I = 1, MIN( B1, N-J+1 ) A( IDST+I ) = A( ISRC+I*LDSRC1 ) 100 CONTINUE 110 CONTINUE ELSE * * --- first copy to upper storage, then transpose --- * DO 210 J = N, 1, -1 IDST = ( J - 1 ) * LDDST ISRC = ( J - 1 ) * LDSRC DO 200 I = B1, MAX( B1-J+1, 1 ), -1 A( IDST+I ) = A( ISRC+I ) 200 CONTINUE 210 CONTINUE * LDSRC1 = LDDST - 1 DO 230 J = 1, N IDST = ( J - 1 ) * LDDST ISRC = ( J - 2 ) * LDDST + B + 2 DO 220 I = 1, MIN( B1, N-J+1 ) A( IDST+I ) = A( ISRC+I*LDSRC1 ) 220 CONTINUE 230 CONTINUE ENDIF * ELSE * * --- "lower to lower"; avoid overwriting by * copying the columns in the "safe" order --- * IF ( LDDST .LE. LDSRC ) > THEN DO 310 J = 1, N IDST = ( J - 1 ) * LDDST ISRC = ( J - 1 ) * LDSRC DO 300 I = 1, MIN( B1, N-J+1 ) A( IDST+I ) = A( ISRC+I ) 300 CONTINUE 310 CONTINUE ELSE DO 410 J = N, 1, -1 IDST = ( J - 1 ) * LDDST ISRC = ( J - 1 ) * LDSRC DO 400 I = MIN( B1, N-J+1 ), 1, -1 A( IDST+I ) = A( ISRC+I ) 400 CONTINUE 410 CONTINUE ENDIF * ENDIF * 999 RETURN END * * ********************************************************************** * SUBROUTINE DSBRDD( JOBU, UPLO, N, B1, B2, A, LDA, DRPTOL, D, E, > U, LDU, NSTEPS, B, NB, > WORK, LWORK, STEP, INFO ) * * Description: * * Driver routine for the multi-step reduction of symmetric banded * matrices to narrower banded form. * Given a symmetric n-by-n matrix A with b1 sub(or super-) diagonals, * dsbrdd reduces A to a symmetric banded matrix B with b2 sub(or * super-) diagonals using a sequence of orthogonal transformations. * If desired, the same transformations are also applied from the right * to the matrix U. That is, if initially U was the identity, then the * resulting banded matrix B and the updated U fulfill the equation * * T * U * A * U = B . * * A must be given in the LAPACK packed storage scheme for upper or * lower banded matrices and is returned in lower banded storage (upper * banded is not supported for output). * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 JOBU, UPLO INTEGER N, B1, B2, LDA, LDU, NSTEPS, LWORK, STEP, > INFO INTEGER B( * ), NB( * ) DOUBLE PRECISION DRPTOL DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), U( LDU, * ), > WORK( * ) * * jobu (in) character*1 * Specifies whether U is required or not. * jobu = 'U' : Update U. * = 'N' : Do not update U. * * uplo (in) character*1 * Is the matrix A given in the upper or lower banded storage ? * uplo = 'U' : Upper banded storage. * = 'L' : Lower banded storage. * * n (in) integer * The size of the matrix A. * n >= 0. * * b1 (in) integer * The number of sub(super-)diagonals of A. * 0 <= b1 < n, if n > 0. * b1 = 0, if n = 0. * * b2 (in) integer * The number of sub(super-)diagonals of B. * 1 <= b2 <= b1 or b2 = b1 = 0. * * a (in/out) double precision array, dimension ( lda, n ) * On entry, the leading (b1+1)-by-n portion of a contains the * symmetric banded matrix A in upper or lower banded storage. * If uplo='U' then for i = 1, ..., n, the matrix elements * A( i, j ), j = i, ..., min( i+b1, n ), are stored at * position a( b1+1+i-j, j ), whereas for uplo='L', the matrix * elements A( i, j ), j = max( i-b, 1 ), ..., i, are stored at * position a( 1+i-j, j ). * On exit, the leading (b2+1)-by-n portion of a contains the * reduced matrix B in lower (!) banded storage. * * lda (in) integer * The leading dimension of the array a. * lda >= min( b1+1, n ) and lda > 0. * * drptol (in) double precision * Threshold for dropping the Householder transformations: if * the norm of the vector to be eliminated is already smaller * than drptol then the transform is skipped. * drptol >= 0.0. * If you do not know, use 0.0. * * d (out) double precision array, dimension ( n ) * If b2 = 1 then, on exit, d( 1 .. n ) contains the main * diagonal of the resulting tridiagonal matrix B. * * e (out) double precision array, dimension ( n-1 ) * If b2 = 1 then, on exit, e( 1 .. n-1 ) contains the * subdiagonal of the resulting tridiagonal matrix B. * * u (in/out) double precision array, dimension ( ldu, n ) * On entry, u contains some n-by-n matrix U. * On exit, U is postmultiplied with all orthogonal transforms * that were used to reduce the bandwidth of A. * Accessed only if the update of U is required. * * ldu (in) integer * The leading dimension of the array u. * ldu >= max( n, 1 ). * * nsteps (in) integer * The number of reduction steps. * nsteps >= 0. * * If nsteps > 0 then the reduction from b1 to b2 is done in * exactly nsteps steps with user-specified intermediate * bandwidths and blocking factors (see paramaters b and nb, * below). * If nsteps = 0 then the routine tries to determine these * parameters on its own. * If you do not know or if you do not care, use 0. * * b (in) integer array, dimension ( nsteps-1 ) * The sequence of intermediate bandwidths. The nsteps * bandwidth reduction steps are * b1 --> b( 1 ), * b( 1 ) --> b( 2 ), * ... * b( nsteps-1 ) --> b2. * This array is accessed only if nsteps > 1. * * nb (in) integer array, dimension ( nsteps ) * The blocking factors nb, as suggested by the user, for the * reduction and/or the accumulation of the transformations * in each of the nb reduction steps. * Note that the automatic selection of suitable blocking * factors is enabled by setting nb( i ) = 0 for some steps i. * This array is accessed only if nsteps > 0. * * work (workspace) double precision array, dimension ( lwork ) * * lwork (in) integer * The length of the workspace array. * The exact amount of workspace required depends on the * sequence of intermediate bandwidths (i.e., b), on the * leading dimension of the array a (i.e., lda), and on the * blocking factors for the reduction steps (i.e., nb). * lwork >= maximum workspace requirement for any of the * reduction steps. * As a rule, lwork >= b1 * n should work fine. * * step (out) integer * On exit, step returns the number of the last reduction step * that was performed (or tried). * * info (out) integer * On exit, info indicates the status of the reduction. * info = 1 : All arguments were OK, and the reduction went * without problems. * = -1 : jobu is none of 'U', 'N' (upper/lower case). * = -2 : uplo is none of 'U', 'L' (upper/lower case). * = -3 : n is out of range (negative). * = -4 : b1 is out of range ( < 0 or >= n ). * = -5 : b2 is out of range ( < 0, or = 0 while b1 >= 1, * or > b1 ). * = -7 : lda is too small (see above). * = -8 : drptol is out of range (negative). * = -12 : ldu is out of range ( < n ). * = -13 : nsteps is out of range (negative). * = -14 : the sequence of bandwidths b1, b( 1 ), b( 2 ), * ..., b( nsteps-1 ), b2 is not monotonically * decreasing * = -15 : nb contains negative entries * = -17 : lwork is too small (see above). * If info < 0 and step > 0 then the parameter for the step-th * reduction step was not OK. * * Local constants and variables: * DOUBLE PRECISION ZERO PARAMETER ( ZERO = 0.0D0 ) * LOGICAL NEEDU, UPPER INTEGER BCURR, LDCURR, NBCURR, BNEXT, LDNEXT, NX CHARACTER*1 ULCURR * * needu is U needed ? * upper is A given in upper or lower banded storage ? * bcurr current bandwidth * ldcurr current leading dimension of the band * nbcurr blocking factor for the current step * bnext bandwidth after the next reduction step * ldnext leading dimension of the band after repacking * nx cross-over point from LAPACK to SBR code, and block size * ulcurr is the current band in upper or lower storage ? * * Routines called: * LOGICAL LSAME INTEGER NBDFLT EXTERNAL LSAME, NBDFLT * * lsame case-insensitive character matching (BLAS) * nbdflt determine default crossover point from LAPACK to SBR code * or default intermediate bandwidth (SBR) * EXTERNAL DSB2BI, DSBRDB, DSBRDT, DSBTRD * * dsb2bi in-place repacking of banded matrices (SBR) * dsbrdb one-step reduction banded -> banded (SBR) * dsbrdt one-step reduction banded -> tridiagonal (SBR) * dsbtrd one-step reduction banded -> tridiagonal (LAPACK) * INTRINSIC MAX, MIN * * ---------------------------------------------------------------------- * * --- check for errors in input --- * NEEDU = LSAME( JOBU, 'U' ) UPPER = LSAME( UPLO, 'U' ) * IF ( .NOT. ( NEEDU .OR. LSAME( JOBU, 'N' ) ) ) THEN INFO = -1 ELSEIF ( .NOT. ( UPPER .OR. LSAME( UPLO, 'Lower' ) ) ) THEN INFO = -2 ELSEIF ( N .LT. 0 ) THEN INFO = -3 ELSEIF ( ( B1 .LT. 0 ) .OR. > ( ( N .GT. 0 ) .AND. ( B1 .GE. N ) ) ) THEN INFO = -4 ELSEIF ( ( B2 .LT. 0 ) .OR. > ( ( B2 .EQ. 0 ) .AND. ( B1 .GE. 1 ) ) .OR. > ( B2 .GT. B1 ) ) THEN INFO = -5 ELSEIF ( LDA .LT. ( B1+1 ) ) THEN INFO = -7 ELSEIF ( DRPTOL .LT. ZERO ) THEN INFO = -8 ELSEIF ( NEEDU .AND. ( LDU .LT. MAX( N, 1 ) ) ) THEN INFO = -12 ELSEIF ( NSTEPS .LT. 0 ) THEN INFO = -13 ELSE INFO = 0 ENDIF IF ( INFO .LT. 0 ) GOTO 999 * IF ( NSTEPS .GT. 1 ) THEN IF ( ( B( 1 ) .GT. B1 ) .OR. ( B2 .GT. B( NSTEPS-1 ) ) ) THEN INFO = -14 ELSE DO 10 STEP = 1, NSTEPS-2 IF ( B( STEP+1 ) .GT. B( STEP ) ) INFO = -14 10 CONTINUE ENDIF ENDIF IF ( INFO .LT. 0 ) GOTO 999 * IF ( NSTEPS .GT. 0 ) THEN DO 20 STEP = 1, NSTEPS IF ( NB( STEP ) .LT. 0 ) INFO = -15 20 CONTINUE ENDIF IF ( INFO .LT. 0 ) GOTO 999 * * --- set current bandwidth, leading dimension, etc. --- * ULCURR = UPLO BCURR = B1 LDCURR = LDA STEP = 0 * * --- while bandwidth is too large do next reduction step --- * 100 IF ( BCURR .GT. B2 ) THEN STEP = STEP + 1 * * --- determine target bandwidth and blocking factor * for the next reduction step --- * IF ( STEP .LT. NSTEPS ) THEN BNEXT = B( STEP ) NBCURR = NB( STEP ) ELSEIF ( STEP .EQ. NSTEPS ) THEN BNEXT = B2 NBCURR = NB( STEP ) ELSE * * --- automatic bandwidth selection --- * BNEXT = NBDFLT( 'SBRDD', 'DoublePrec', 'Bandwidth', > N, BCURR, B2, NEEDU ) * * --- if the proposed intermediate bandwidth is out * of range then do a one-step reduction --- * IF ( ( BNEXT .GE. BCURR ) .OR. ( BNEXT .LT. B2 ) ) THEN BNEXT = B2 ENDIF NBCURR = 0 ENDIF * IF ( BNEXT .EQ. 1 ) THEN * * --- reduction to tridiagonal form; * use SBR or LAPACK code ? --- * NX = NBDFLT( 'SBRDD', 'DoublePrec', 'CrossoverPoint', > N, BCURR, B2, NEEDU ) IF ( BCURR .LT. NX ) THEN * * --- LAPACK tridiagonalization; first repack the * band to improve performance --- * LDNEXT = BCURR + 1 IF ( LDCURR .NE. LDNEXT ) THEN CALL DSB2BI( ULCURR, N, BCURR, A, LDCURR, LDNEXT, INFO ) LDCURR = LDNEXT ULCURR = 'Lower' ENDIF * IF ( LWORK .LT. N ) THEN INFO = -17 ELSE CALL DSBTRD( JOBU, ULCURR, N, BCURR, A, LDCURR, D, E, > U, LDU, WORK, INFO ) ENDIF ELSE * * --- SBR tridiagonalization; first repack the band * to improve performance --- * LDNEXT = MIN( 2*BCURR, LDA ) IF ( ( LDCURR .NE. LDNEXT ) .OR. > LSAME( ULCURR, 'Upper' ) ) THEN CALL DSB2BI( ULCURR, N, BCURR, A, LDCURR, LDNEXT, INFO ) LDCURR = LDNEXT ULCURR = 'Lower' ENDIF * CALL DSBRDT( JOBU, N, BCURR, A, LDCURR, DRPTOL, D, E, > U, LDU, NBCURR, WORK, LWORK, INFO ) IF ( INFO .EQ. -13 ) INFO = -17 ENDIF * ELSE * * --- SBR reduction to narrower banded form; first * repack the band to improve performance (optimum * leading dimension depends on the blocking * factor - so determine that one first) --- * IF ( NBCURR .EQ. 0 ) THEN NX = NBDFLT( 'SBRDB', 'DoublePrec', 'BlockingFactor', > N, BCURR, BNEXT, NEEDU ) ELSE NX = NBCURR ENDIF IF ( NX .GT. BNEXT ) NX = BNEXT IF ( NX .LT. 1 ) NX = 1 LDNEXT = MIN( BCURR+(BCURR-BNEXT)+NX, LDA ) IF ( ( LDCURR .NE. LDNEXT ) .OR. > LSAME( ULCURR, 'Upper' ) ) THEN CALL DSB2BI( ULCURR, N, BCURR, A, LDCURR, LDNEXT, INFO ) LDCURR = LDNEXT ULCURR = 'Lower' ENDIF * CALL DSBRDB( JOBU, N, BCURR, BNEXT, A, LDCURR, DRPTOL, > U, LDU, NBCURR, WORK, LWORK, INFO ) IF ( INFO .EQ. -12 ) INFO = -17 ENDIF * BCURR = BNEXT IF ( INFO .GE. 0 ) GOTO 100 * ENDIF * * --- after the reduction, repack the band to leading * dimension lda and lower banded storage scheme --- * IF ( ( INFO .GE. 0 ) .AND. > ( ( LDCURR .NE. LDA ) .OR. LSAME( ULCURR, 'Upper' ) ) ) > THEN CALL DSB2BI( ULCURR, N, BCURR, A, LDCURR, LDA, INFO ) ENDIF * IF ( INFO .GE. 0 ) INFO = 1 * 999 RETURN END * * ********************************************************************** * SUBROUTINE DSYRDD( JOBU, UPLO, N, B2, A, LDA, DRPTOL, > ABAND, LDBAND, D, E, NSTEPS, B, NB, > WORK, LWORK, STEP, INFO ) * * Description: * * Driver routine for the multi-step reduction of symmetric matrices to * banded form. * Given a symmetric n-by-n matrix A, dsyrdd reduces A to a symmetric * banded matrix B with b2 sub(or super-) diagonals using a sequence of * orthogonal transformations. * If desired, the same transformations are also accumulated in an * orthogonal matrix U. That is, the resulting banded matrix B and the * accumulated matrix U fulfill the equation * * T * U * A * U = B . * * A must be given in the LAPACK symmetric storage scheme with either * the upper or lower triangle stored explicitly, and B is returned in * lower banded storage (upper banded is not supported for output). * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 JOBU, UPLO INTEGER N, B2, LDA, LDBAND, NSTEPS, LWORK, STEP, > INFO INTEGER B( * ), NB( * ) DOUBLE PRECISION DRPTOL DOUBLE PRECISION A( LDA, * ), ABAND( LDBAND, * ), > D( * ), E( * ), WORK( * ) * * jobu (in) character*1 * Specifies whether U is required or not. * jobu = 'U' : Build U. * = 'N' : Do not build U. * * uplo (in) character*1 * Is the matrix A stored in the upper or lower triangle of a ? * uplo = 'U' : Upper triangle. * = 'L' : Lower triangle. * * n (in) integer * The size of the matrix A. * n >= 0. * * b2 (in) integer * The number of sub(super-)diagonals of B. * 1 <= b2 < n, if n > 1. * b2 = 0 , if n <= 1. * * a (in/out) double precision array, dimension ( lda, n ) * On entry, the leading n-by-n portion of a contains the * symmetric matrix A in upper or lower symmetric storage. * If uplo='U' then the upper triangle of A is stored in * the upper triangle of the leading n-by-n portion of a; * if uplo='L' then the lower triangle of A is stored in * the lower triangle of the leading n-by-n portion of a. * On exit, A is destroyed. * If jobu='U' then the leading n-by-n portion of a holds * the orthogonal matrix U. * * lda (in) integer * The leading dimension of the array a. * lda >= max( n, 1 ). * * drptol (in) double precision * Threshold for dropping the Householder transformations: if * the norm of the vector to be eliminated is already smaller * than drptol then the transform is skipped. * drptol >= 0.0. * If you do not know, use 0.0. * * aband (out) double precision array, dimension ( ldband, n ) * On exit, the leading (b2+1)-by-n portion of aband holds the * symmetric banded matrix B in lower banded storage (i.e., for * j = 1, ..., n and i = j, ..., min( j+b2, n ), the matrix * element B( i, j ) is stored in location aband( i-j+1, j ). * * ldband (in) integer * The leading dimension of the array aband. * ldband >= b( 1 ) + 1, if nsteps > 1. * >= b2 + 1 , otherwise. * For reasonable performance, set ldband >= 2 * b( 1 ) if * nsteps > 1, and ldband >= 50 if nsteps = 0. * * d (out) double precision array, dimension ( n ) * If b2 = 1 then, on exit, d( 1 .. n ) contains the main * diagonal of the resulting tridiagonal matrix B. * * e (out) double precision array, dimension ( n-1 ) * If b2 = 1 then, on exit, e( 1 .. n-1 ) contains the * subdiagonal of the resulting tridiagonal matrix B. * * nsteps (in) integer * The number of reduction steps. * nsteps >= 0. * * If nsteps > 0 then the reduction from full to b2 diagonals * is done in exactly nsteps steps with user-specified * intermediate bandwidths and blocking factors (see paramaters * b and nb, below). * If nsteps = 0 then the routine tries to determine these * parameters on its own. * If you do not know or if you do not care, use 0. * * b (in) integer array, dimension ( nsteps-1 ) * The sequence of intermediate bandwidths. The nsteps * bandwidth reduction steps are * n-1 --> b( 1 ), * b( 1 ) --> b( 2 ), * ... * b( nsteps-1 ) --> b2. * This array is accessed only if nsteps > 1. * * nb (in) integer array, dimension ( nsteps ) * The blocking factors nb, as suggested by the user, for the * reduction and/or the accumulation of the transformations * in each of the nb reduction steps. * Note that the automatic selection of suitable blocking * factors is enabled by setting nb( i ) = 0 for some steps i. * This array is accessed only if nsteps > 0. * * work (workspace) double precision array, dimension ( lwork ) * * lwork (in) integer * The length of the workspace array. * The exact amount of workspace required depends on the * sequence of intermediate bandwidths (i.e., b), on the * leading dimension of the array a (i.e., lda), and on the * blocking factors for the reduction steps (i.e., nb). * lwork >= maximum workspace requirement for any of the * reduction steps. * Minimum requirement is 4 * n, but setting lwork this low may * severely degrade performance. * As a rule, lwork >= 50 * n should work fine; if you can * spare it, use lwork >= 100 * n. * * step (out) integer * On exit, step returns the number of the last reduction step * that was performed (or tried). * * info (out) integer * On exit, info indicates the status of the reduction. * info = 1 : All arguments were OK, and the reduction went * without problems. * = -1 : jobu is none of 'U', 'N' (upper/lower case). * = -2 : uplo is none of 'U', 'L' (upper/lower case). * = -3 : n is out of range (negative). * = -4 : b2 is out of range ( < 0, * or < 1 or >= n while n > 1 ). * = -6 : lda is too small (see above). * = -7 : drptol is out of range (negative). * = -9 : ldband is out of range ( < b(1)+1 ). * = -12 : nsteps is out of range (negative). * = -13 : the sequence of bandwidths n-1, b( 1 ), b( 2 ), * ..., b( nsteps-1 ), b2 is not monotonically * decreasing * = -14 : nb contains negative entries * = -16 : lwork is too small (see above). * If info < 0 and step > 0 then the parameter for the step-th * reduction step was not OK. * * Local constants and variables: * DOUBLE PRECISION ZERO PARAMETER ( ZERO = 0.0D0 ) * LOGICAL NEEDU, UPPER INTEGER BNEXT, NBCURR * * needu is U needed ? * upper is the upper triangle of A stored ? * nbcurr blocking factor for the current step * bnext bandwidth after the next reduction step * * Routines called: * LOGICAL LSAME INTEGER NBDFLT EXTERNAL LSAME, NBDFLT * * lsame case-insensitive character matching (BLAS) * nbdflt determine intermediate bandwidth (SBR) * EXTERNAL DORGTR, DSBRDD, DSY2BC, DSYGTR, DSYRDB, > DSYTRD * * dorgtr accumulation of the transformations (LAPACK) * dsbrdd bandwidth reduction for banded matrices (SBR) * dsy2bc repacking from full to banded storage (SBR) * dsygtr accumulation of the transformations (SBR) * dsyrdb reduction full -> banded (SBR) * dsytrd one-step reduction full -> tridiagonal (LAPACK) * INTRINSIC MAX * * ---------------------------------------------------------------------- * STEP = 1 * * --- check for errors in input --- * NEEDU = LSAME( JOBU, 'U' ) UPPER = LSAME( UPLO, 'U' ) * IF ( .NOT. ( NEEDU .OR. LSAME( JOBU, 'N' ) ) ) THEN INFO = -1 ELSEIF ( .NOT. ( UPPER .OR. LSAME( UPLO, 'Lower' ) ) ) THEN INFO = -2 ELSEIF ( N .LT. 0 ) THEN INFO = -3 ELSEIF ( ( B2 .LT. 0 ) .OR. > ( ( N .GT. 1 ) .AND. > ( ( B2 .LT. 1 ) .OR. ( B2 .GT. N-1 ) ) ) ) THEN INFO = -4 ELSEIF ( LDA .LT. MAX( N, 1 ) ) THEN INFO = -6 ELSEIF ( DRPTOL .LT. ZERO ) THEN INFO = -7 ELSEIF ( ( LDBAND .LE. B2 ) .OR. > ( ( NSTEPS .GT. 1 ) .AND. ( LDBAND .LE. B( 1 ) ) ) ) > THEN INFO = -9 ELSEIF ( NSTEPS .LT. 0 ) THEN INFO = -12 ELSEIF ( LWORK .LT. 4*N ) THEN INFO = -16 ELSE INFO = 0 ENDIF IF ( INFO .LT. 0 ) GOTO 999 * IF ( NSTEPS .GT. 1 ) THEN IF ( ( B( 1 ) .GT. ( N-1 ) ) .OR. > ( B2 .GT. B( NSTEPS-1 ) ) ) THEN INFO = -13 ELSE DO 10 STEP = 1, NSTEPS-2 IF ( B( STEP+1 ) .GT. B( STEP ) ) INFO = -13 10 CONTINUE ENDIF ENDIF IF ( INFO .LT. 0 ) GOTO 999 * IF ( NSTEPS .GT. 0 ) THEN DO 20 STEP = 1, NSTEPS IF ( NB( STEP ) .LT. 0 ) INFO = -14 20 CONTINUE ENDIF IF ( INFO .LT. 0 ) GOTO 999 * * --- check for quick return --- * IF ( N .EQ. 0 ) GOTO 999 * STEP = 1 * * --- determine first intermediate bandwidth and blocking * factor --- * IF ( NSTEPS .GT. 0 ) THEN IF ( NSTEPS .EQ. 1 ) THEN BNEXT = B2 ELSE BNEXT = B( 1 ) ENDIF NBCURR = NB( 1 ) ELSE * * --- automatic bandwidth selection --- * BNEXT = NBDFLT( 'SYRDD', 'DoublePrec', 'Bandwidth', > N, N - 1, B2, NEEDU ) * * --- if the proposed intermediate bandwidth is out * of range then do a one-step reduction --- * IF ( ( BNEXT .GT. N-1 ) .OR. ( BNEXT .LT. B2 ) .OR. > ( LDBAND .LT. 2*BNEXT ) ) THEN BNEXT = B2 ENDIF NBCURR = 0 ENDIF * IF ( BNEXT .EQ. 1 ) THEN * * --- use LAPACK code for direct tridiagonalization --- * CALL DSYTRD( UPLO, N, A, LDA, D, E, WORK( 1 ), > WORK( N ), LWORK-N+1, INFO ) IF ( NEEDU ) THEN CALL DORGTR( UPLO, N, A, LDA, WORK( 1 ), > WORK( N ), LWORK-N+1, INFO ) ENDIF ELSE * * --- reduction to bandwidth > 1 width dsyrdb --- * CALL DSYRDB( UPLO, 'NoU', N, BNEXT, A, LDA, DRPTOL, > WORK( 1 ), N, NBCURR, WORK( 1 ), > WORK( N+1 ), LWORK-N, INFO ) * * --- repack the reduced matrix to banded storage --- * CALL DSY2BC( UPLO, N, BNEXT, A, LDA, ABAND, LDBAND, INFO ) * * --- accumulation of the transformations, if required --- * IF ( NEEDU ) THEN CALL DSYGTR( UPLO, N, BNEXT, A, LDA, WORK( 1 ), > WORK( N+1 ), LWORK-N, INFO ) ENDIF * * --- further reduce the banded matrix, if required --- * IF ( ( BNEXT .GT. B2 ) .AND. ( INFO .GE. 0 ) ) THEN IF ( NSTEPS .EQ. 0 ) THEN CALL DSBRDD( JOBU, 'Lower', N, BNEXT, B2, ABAND, LDBAND, > DRPTOL, D, E, A, LDA, 0, B, NB, > WORK, LWORK, STEP, INFO ) ELSE CALL DSBRDD( JOBU, 'Lower', N, BNEXT, B2, ABAND, LDBAND, > DRPTOL, D, E, A, LDA, NSTEPS-1, B( 2 ), > NB( 2 ), WORK, LWORK, STEP, INFO ) ENDIF STEP = STEP + 1 ENDIF ENDIF * 999 IF ( INFO .GE. 0 ) INFO = 1 * RETURN END * * ********************************************************************** * SUBROUTINE DLBRFG( N, ALPHA, X, INCX, TAU, DRPTOL ) * * ---------------------------------------------------------------------- * * Description: * * dlbrfg generates an elementary reflector H of order n, such that * * T * H * ( alpha ) = ( beta ) , H * H = I , * ( x ) ( 0 ) * * where alpha and beta are scalars, and x is an ( n - 1 )-element * vector. H is represented in the form * * T * H = I - tau * ( 1 ) * ( 1 v ) , * ( v ) * * where tau is a scalar and v is an ( n - 1 )-element vector. * * If the elements of x are all zero, or the 2-norm of x does not * exceed drptol, then x is simply zeroed out, tau is set to 0, * indicating that H is the identity matrix. In this case, the * transformation is effectively skipped. * * Otherwise 1 <= tau <= 2. * * This routine is a modified version of dlbrfg by Bischof/Sun which * in turn is a modified version of the LAPACK routine dlarfg. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * Parameters: * INTEGER N, INCX DOUBLE PRECISION ALPHA, TAU, DRPTOL DOUBLE PRECISION X( * ) * * n (in) integer * The order of the elementary reflector. * n >= 0. * * alpha (in/out) double precision * On entry, the value alpha. * On exit, it is overwritten with the value beta. * * x (in/out) double precision array, dimension ( 1+(n-2)*incx ) * On entry, the vector x. * On exit, the "x elements" are overwritten with the vector v. * * incx (in) integer * The increment between elements of x. * incx > 0. * * tau (out) double precision * The scaling factor tau. * * drptol (in) double precision * Threshold for dropping Householder transforms. * If the norm of the vector to eliminate is already <= drptol * then the transform is skipped. * drptol >= 0.0. * If you do not know, use 0.0. * * ---------------------------------------------------------------------- * * Local variables: * DOUBLE PRECISION ZERO, ONE PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) * DOUBLE PRECISION XNORM, BETA, SAFMIN, RSAFMN INTEGER CNT, J * * xnorm 2-norm of x * beta the computed value beta * safmin safe minimum (such that relative accuracy can be guaranteed) * rsafmn 1 / safmin * cnt counts the rescaling steps * * Routines called: * DOUBLE PRECISION DLAMCH, DLAPY2, DNRM2 EXTERNAL DLAMCH, DLAPY2, DNRM2, DSCAL * * dlamch determine machine parameters (LAPACK) * dlapy2 stable 2-norm of 2-vector (LAPACK) * dnrm2 2-norm of a vector (BLAS) * dscal vector scaling (BLAS) * INTRINSIC SIGN, ABS * * ---------------------------------------------------------------------- * * --- check for quick exit --- * IF ( N .LE. 1 ) THEN TAU = ZERO ELSE * XNORM = DNRM2( N-1, X, INCX ) * IF ( XNORM .LE. DRPTOL ) THEN * * --- H = I --- * TAU = ZERO DO 10 J = 1, N-1 X( 1+(J-1)*INCX ) = ZERO 10 CONTINUE * 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 CNT = 0 * 100 CONTINUE CNT = CNT + 1 ALPHA = ALPHA * RSAFMN CALL DSCAL( N-1, RSAFMN, X, INCX ) BETA = BETA * RSAFMN IF ( ABS( BETA ) .LT. SAFMIN ) GOTO 100 * * --- now abs( beta ) is 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 110 J = 1, CNT ALPHA = ALPHA * SAFMIN 110 CONTINUE * ELSE * TAU = ( BETA - ALPHA ) / BETA CALL DSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX ) ALPHA = BETA * ENDIF * ENDIF * ENDIF * RETURN END * * ********************************************************************** * SUBROUTINE DSYRF( UPLO, N, V, INCV, TAU, > A, LDA, WORK ) * * ---------------------------------------------------------------------- * * Description: * * T * Apply the Householder transform H = I - tau * v * v from both * sides to the symmetric matrix A, i.e., update * * T * A := H * A * H ( = H * A * H ) . * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * ---------------------------------------------------------------------- * * Parameters: * CHARACTER*1 UPLO INTEGER N, INCV, LDA DOUBLE PRECISION TAU DOUBLE PRECISION V( * ), A( LDA, * ), WORK( * ) * * uplo (in) character*1 * Is the upper or lower triangle of A stored ? * uplo = 'U' : Upper triangle. * = 'L' : Lower triangle. * * n (in) integer * The dimension of the matrix A. * n >= 0. * * v (in) double precision array, dimension ( 1+(n-1)*incv ) * The Householder vector associated with H. * Usually, v( 1 ) = 1, and v( 2:n ) contains the "mantissa" of * the transform. * * incv (in) integer * The increment between the elements of v. * incv > 0. * * tau (in) double precision * The scaling factor for the transform. * * a (in/out) double precision array, dimension ( lda, n ) * On entry, an n-by-n symmetric matrix A with either the lower * or the upper triangle stored. * On exit, the leading A is overwritten with H * A * H. * * lda (in) integer * The leading dimension of the array a. * lda >= max( n, 1 ). * * work (workspace) double precision array, dimension ( n ) * * ---------------------------------------------------------------------- * * Local variables: * DOUBLE PRECISION ZERO, ONE PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) * DOUBLE PRECISION ALPHA * * alpha auxiliary factor * * Routines called: * DOUBLE PRECISION DDOT EXTERNAL DAXPY, DDOT, DSYMV, DSYR2 * * daxpy add multiple of a vector to another vector (BLAS) * ddot dot product of two vectors (BLAS) * dsymv symmetric matrix-vector product (BLAS) * dsyr2 symmetric rank-2 update (BLAS) * * ---------------------------------------------------------------------- * IF ( ( N .GT. 0 ) .AND. ( TAU .NE. ZERO ) ) THEN * * --- work( 1:n ) := x = tau * A * v --- * CALL DSYMV( UPLO, N, TAU, A, LDA, V, INCV, ZERO, WORK, 1 ) * * T * --- work( 1:n ) := w = x - 1/2 * tau * ( x * v ) * v --- * ALPHA = -0.5D0 * TAU * DDOT( N, WORK, 1, V, INCV ) CALL DAXPY( N, ALPHA, V, INCV, WORK, 1 ) * * T T * --- A := A - v * w - w * v --- * CALL DSYR2( UPLO, N, -ONE, V, INCV, WORK, 1, A, LDA ) * ENDIF * RETURN END * * ********************************************************************** * SUBROUTINE DGBQR2( M, N, D, A, LDA, TAU, DRPTOL, WORK ) * * ---------------------------------------------------------------------- * * Description: * * Given an m-by-n matrix A with d subdiagonals, dgeqr2 computes * a QR factorization of A. * * The matrix Q is represented as a product of elementary reflectors * * Q = H( 1 ) * ... * H( k ) , where k = min( m, n ). * * Each H( j ) has the form * * T * H( j ) = I - tau * v * v * * where tau is a scalar, and v is a vector of length m with * v( 1:j-1 ) = 0 and v( j ) = 1. * On exit, v( j+1:m ) is stored in a( j+1:m, j ) and tau in tau( j ). * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * Parameters: * INTEGER M, N, D, LDA DOUBLE PRECISION DRPTOL DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) * * m (in) integer * The number of rows in the matrix A. * m >= 0. * * n (in) integer * The number of columns in the matrix A. * n >= 0. * * d (in) integer * The number of subdiagonals of the matrix A. * 0 <= d <= m - 1, if m > 0. * d = 0 , if m = 0. * * a (in/out) double precision array, dimension ( lda, n ) * On entry, the m-by-n matrix A with lower bandwidth b. * On exit, the elements on and above the diagonal contain the * min( m, n )-by-n upper trapezoidal matrix R (R is upper * triangular if m >= n); the elements below the diagonal, * together with the array tau, represent the orthogonal * matrix Q as a product of Householder transformations. * * lda (in) integer * The leading dimension of the array a. * lda >= min( m, 1 ). * * tau (out) double precision array, dimension ( min( m-1, n ) ) * The scaling factors of the Householder transformations. * * drptol (in) double precision * Threshold for dropping Householder transforms. * If the norm of the vector to be zeroed is already less than * drptol then the transform is skipped. * drptol >= 0.0. * * work (workspace) double precision array, dimension ( n ) * * ---------------------------------------------------------------------- * * Local variables: * DOUBLE PRECISION ZERO, ONE PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) * INTEGER J, LEN DOUBLE PRECISION AJJ * * len length of the current transform * ajj temporary buffer for the element a( j, j ) * * Routines called: * EXTERNAL DLARFX, DLBRFG * * dlarfx apply Householder transformation (LAPACK) * dlbrfg generate Householder vector (SBR) * INTRINSIC MIN * * ---------------------------------------------------------------------- * DO 100 J = 1, MIN( M-1, N ) * LEN = MIN( D+1, M-J+1 ) * * --- generate Householder reflector H( j ) to zero * A( j+1:j+d, j ) --- * CALL DLBRFG( LEN, A( J, J ), A( J+1, J ), 1, > TAU( J ), DRPTOL ) * * --- apply the transform --- * IF ( TAU( J ) .NE. ZERO ) THEN * AJJ = A( J, J ) A( J, J ) = ONE CALL DLARFX( 'Left', LEN, N-J, A( J, J ), TAU( J ), > A( J, J+1 ), LDA, WORK ) A( J, J ) = AJJ * ENDIF * 100 CONTINUE * RETURN END * * ********************************************************************** * SUBROUTINE DGEQRL( DECOMP, M, N, A, LDA, DRPTOL, > TAU, WORK ) * * ---------------------------------------------------------------------- * * Description: * * Compute the QR or QL factorization of the m-by-n matrix A, * where m >= n. * * The matrix Q is represented as a product of elementary reflectors * * Q = H( 1 ) * ... * H( n ) (QR decomposition) * * or * * Q = H( n ) * ... * H( 1 ) (QL decomposition). * * Each H( j ) has the form * * T * H( j ) = I - tau * v * v * * where tau is a scalar, and v is a vector of length m. * * In the QR case, * v( 1:j-1 ) = 0 and v( j ) = 1 and, on exit, v( j+1:m ) is * stored in a( j+1:m, j ) and tau in tau( j ). * * In the QL case, * v( m-n+j+1:m ) = 0 and v( m-n+j ) = 1 and, on exit, * v( 1:m-n+j-1 ) is stored in a( 1:m-n+j-1, j ) and tau in tau( j ). * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * Parameters: * CHARACTER*1 DECOMP INTEGER M, N, LDA DOUBLE PRECISION DRPTOL DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) * * decomp (in) character*1 * Which decomposition is required ? * decomp = 'L' : QL decomposition. * = 'R' : QR decomposition. * * m (in) integer * The number of rows of the matrix A. * m >= 0. * * n (in) integer * The number of columns of the matrix A. * 0 <= n <= m. * * a (in/out) double precision array, dimension ( lda, n ) * On entry, the m-by-n matrix A. * If decomp = 'R' then, on exit, the elements on and above the * diagonal contain the 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 * Householder transformations. * If decomp = 'L' then, on exit, the n-by-n matrix L is stored * in the lower triangle at the "bottom" of A, and the * Householder vectors are stored in the remaining trapezoid. * * lda (in) integer * The leading dimension of the array a. * lda >= min( m, 1 ). * * tau (out) double precision array, dimension ( n ) * The scaling factors of the Householder transformations. * * drptol (in) double precision * Threshold for dropping Householder transforms. * If the norm of the vector to be zeroed is already less than * drptol then the transform is skipped. * drptol >= 0.0. * * work (workspace) double precision array, dimension ( n ) * * ---------------------------------------------------------------------- * * Local variables: * DOUBLE PRECISION ONE PARAMETER ( ONE = 1.0D0 ) * INTEGER I, J DOUBLE PRECISION TMP * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * EXTERNAL DLARFX, DLBRFG * * dlarfx apply Householder transform (LAPACK) * dlbrfg generate Householder vector (SBR) * INTRINSIC MIN * * ---------------------------------------------------------------------- * IF ( N .GT. 0 ) THEN * IF ( LSAME( DECOMP, 'L' ) ) THEN * * --- QL factorization --- * DO 100 J = N, 1, -1 * * --- generate Householder vector to zero out * A( 1:m-n+j, j) --- * I = M - N + J CALL DLBRFG( I, A( I, J ), A( 1, J ), 1, TAU( J ), > DRPTOL ) * * --- apply transformation from the left --- * TMP = A( I, J ) A( I, J ) = ONE CALL DLARFX( 'Left', I, J-1, A( 1, J ), TAU( J ), > A, LDA, WORK ) A( I, J ) = TMP * 100 CONTINUE * ELSE * * --- QR factorization --- * DO 200 J = 1, N * * --- generate Householder vector to zero out * A( j+1:m, j ) --- * CALL DLBRFG( M-J+1, A( J, J ), > A( MIN( J+1, M ), J ), 1, TAU( J ), > DRPTOL ) * * --- apply transformation from the left --- * TMP = A( J, J ) A( J, J ) = ONE CALL DLARFX( 'Left', M-J+1, N-J, A( J, J ), TAU( J ), > A( J, J+1 ), LDA, WORK ) A( J, J ) = TMP * 200 CONTINUE * ENDIF * ENDIF * RETURN END * * ********************************************************************** * SUBROUTINE DGBWYG( M, N, D, A, LDA, TAU, > W, LDW, Y, LDY, K ) * * ---------------------------------------------------------------------- * * Description: * * Given a set of Householder vectors as returned by dgbqr2, this * routine returns W and Y such that * * T * Q = I + W * Y * * where Q is the product of the Householder matrices. * * Each Householder transformation is represented by a vector vj and * a scalar tau( j ) such that * T T T * H( j ) = I - tau( j ) * ( 1, vj ) * ( 1, vj ) . * * The matrix Q is accumulated as * T * Q( j + 1 ) = I + W( j + 1 ) * Y( j + 1 ) = Q( j ) * H( j ) * * where * T T * Y( j + 1 ) = [ Y( j ), y ] with y = [ 0, vj ] and * * W( j + 1 ) = [ W( j ), w ] with w = - tau( j ) * Q( j ) * y. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * Parameters: * INTEGER M, N, D, LDA, LDW, LDY, K DOUBLE PRECISION A( LDA, * ), TAU( * ), > W( LDW, * ), Y( LDY, * ) * * m (in) integer * The number of rows of the matrix A. * m >= 0. * * n (in) integer * The number of columns of the matrix A. * n >= 0. * * d (in) integer * The number of subdiagonals of the matrix A (as the vectors * vj are stored in these subdiagonals, d is the length of * these transforms, minus 1). * 0 <= d <= m - 1, if m > 0. * d = 0 , if m = 0. * * a (in/out) double precision array, dimension ( lda, n ) * On entry, the d subdiagonals of the m-by-n matrix A contain * the Householder vectors vj. * On exit, A is zero below the main diagonal. * * lda (in) integer * The leading dimension of the array A. * lda >= max( m, 1 ). * * tau (in/out) double precision array, dimension ( n ) * On entry, tau contains the scaling factors for the * Householder transforms. * On exit, tau is destroyed. * * w (out) double precision array, dimension ( ldw, n ) * On exit, the first k columns of w contain the block * reflector W (zero below the d-th subdiagonal). * * ldw (in) integer * The leading dimension of the array w. * ldw >= max( m, 1 ). * * y (out) double precision array, dimension ( ldy, n ) * On exit, the first k columns of y contain the block * reflector Y (zero above the main diagonal and below the d-th * subdiagonal). * * ldy (in) integer * The leading dimension of the array y. * ldy >= max( m, 1 ). * * k (out) integer * On exit, k is the "active blocksize" * = the number of valid columns in W and Y * = the number of nontrivial Householder transforms contained * in W and Y * = the number of nonzero tau entries in the input. * 0 <= k <= n. * * ---------------------------------------------------------------------- * * Local variables: * DOUBLE PRECISION ZERO, ONE PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) * INTEGER I, J, LEN * * len length of the vector v( j ) * * Routines called: * EXTERNAL DGEMV, DSWAP * * dgemv matrix-vector product (BLAS) * dswap swap two vectors (BLAS) * INTRINSIC MIN * * ---------------------------------------------------------------------- * K = 0 * DO 200 J = 1, MIN( M-1, N ) * IF ( TAU( J ) .NE. ZERO ) THEN * * --- W and Y grow --- * K = K + 1 LEN = MIN( M-J, D ) * * --- copy vj to Y( :, k ) and zero A( j+1:j+d, j ) --- * DO 110 I = 1, M Y( I, K ) = ZERO 110 CONTINUE Y( J, K ) = ONE CALL DSWAP( LEN, A( J+1, J ), 1, Y( J+1, K ), 1 ) * * --- W( :, k ) = - tau( j ) * Y( :, k ) --- * DO 120 I = 1, J-1 W( I, K ) = ZERO 120 CONTINUE DO 130 I = J, J+LEN W( I, K ) = -TAU( J ) * Y( I, K ) 130 CONTINUE DO 140 I = J+LEN+1, M W( I, K ) = ZERO 140 CONTINUE * * --- W( :, k ) = - tau( j ) * Q( j-1 ) * y( j ) * T * = ( I + W( j-1 ) * Y( k-1 ) ) * W( :, k ) --- * CALL DGEMV( 'Transpose', LEN+J, K-1, > ONE, Y, LDY, W( 1, K ), 1, ZERO, TAU, 1 ) CALL DGEMV( 'NoTranspose', LEN+J, K-1, > ONE, W, LDW, TAU, 1, ONE, W( 1, K ), 1 ) * ENDIF * 200 CONTINUE * RETURN END * * ********************************************************************** * SUBROUTINE DGEWYG( UPLO, M, N, A, LDA, TAU, > W, LDW, Y, LDY, K, > WORK ) * * ---------------------------------------------------------------------- * * Description: * * Given a set of Householder vectors as returned by dgeqrl, this * routine returns W and Y such that * * T * Q = I + W * Y * * where Q is the product of the Householder matrices. * * Each Householder transformation is represented by a vector vj and * a scalar tau( j ) such that * T T T * H( j ) = I - tau( j ) * ( 1, vj ) * ( 1, vj ) . * * The matrix Q is accumulated as * T * Q( j + 1 ) = I + W( j + 1 ) * Y( j + 1 ) = Q( j ) * H( j ) * * where * T T * Y( j + 1 ) = [ Y( j ), y ] with y = [ 0, vj ] and * * W( j + 1 ) = [ W( j ), w ] with w = - tau( j ) * Q( j ) * y. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * Parameters: * CHARACTER*1 UPLO INTEGER M, N, LDA, LDW, LDY, K DOUBLE PRECISION A( LDA, * ), TAU( * ), > W( LDW, * ), Y( LDY, * ), WORK( * ) * * uplo (in) character*1 * Are the Housholder vectors stored in the upper or lower * triangle of A ? * uplo = 'U' : Upper triangle. * = 'L' : Lower triangle. * * m (in) integer * The row dimension of the matrix A. * m >= 0. * * n (in) integer * The column dimension of A. * 0 <= n <= m. * * a (in) double precision array, dimension ( lda, n ) * The matrix containing the Householder vectors. * * lda (in) integer * The leading dimension of the array a. * lda >= max( m, 1 ). * * tau (in) double precision array, dimension ( n ) * The scaling factors for the Householder transformations. * * w (out) double precision array, dimension ( ldw, n ) * On exit, the first k columns of w contain the block * reflector W. * * ldw (in) integer * The leading dimension of the array w. * ldw >= max( m, 1 ). * * y (out) double precision array, dimension ( ldy, n ) * On exit, the first k columns of y contain the block * reflector Y. * * ldy (in) integer * The leading dimension of the array y. * ldy >= max( m, 1 ). * * k (out) integer * On exit, k is the "active blocksize" * = the number of valid columns in W and Y * = the number of nontrivial Householder transforms contained * in W and Y * = the number of nonzero tau entries in the input. * 0 <= k <= n. * * work (workspace) double precision array, dimension ( n-1 ) * * ---------------------------------------------------------------------- * * Local variables: * DOUBLE PRECISION ZERO, ONE PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) * INTEGER J, I DOUBLE PRECISION TMP * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * EXTERNAL DCOPY, DGEMV * * dcopy BLAS * dgemv BLAS * * ---------------------------------------------------------------------- * K = 0 * IF ( ( M .GT. 0 ) .AND. ( N .GT. 0 ) ) THEN * IF ( LSAME( UPLO, 'Lower' ) ) THEN * * --- vectors come from a QR decomposition --- * DO 200 J = 1, N * TMP = - TAU( J ) * IF ( TMP .NE. ZERO ) THEN K = K + 1 * * --- Y( :, k ) := vj --- * DO 110 I = 1, J-1 Y( I, K ) = ZERO 110 CONTINUE Y( J, K ) = ONE CALL DCOPY( M-J, A( J+1, J ), 1, Y( J+1, K ), 1 ) * * --- W( :, k ) := - tau( j ) * vj --- * DO 120 I = 1, J-1 W( I, K ) = ZERO 120 CONTINUE DO 130 I = J, M W( I, K ) = TMP * Y( I, K ) 130 CONTINUE * * --- apply previous transformations --- * IF ( K .GT. 1 ) THEN CALL DGEMV( 'Transpose', M, K-1, > ONE, Y, LDY, W( 1, K ), 1, ZERO, WORK, 1 ) CALL DGEMV( 'NoTranspose', M, K-1, > ONE, W, LDW, WORK, 1, ONE, W( 1, K ), 1 ) ENDIF ENDIF * 200 CONTINUE * ELSE * * --- vectors come from a QL decomposition --- * DO 400 J = N, 1, -1 * TMP = - TAU( J ) * IF ( TMP .NE. ZERO ) THEN K = K + 1 * * --- Y( :, k ) := vj --- * DO 310 I = M-N+J+1, M Y( I, K ) = ZERO 310 CONTINUE Y( M-N+J, K ) = ONE CALL DCOPY( M-N+J-1, A( 1, J ), 1, Y( 1, K ), 1 ) * * --- W( :, k ) := - tau( j ) * vj --- * DO 320 I = M-N+J+1, M W( I, K ) = ZERO 320 CONTINUE DO 330 I = 1, M-N+J W( I, K ) = TMP * Y( I, K ) 330 CONTINUE * * --- apply previous transformations --- * IF ( K .GT. 1 ) THEN CALL DGEMV( 'Transpose', M, K-1, > ONE, Y, LDY, W( 1, K ), 1, ZERO, WORK, 1 ) CALL DGEMV( 'NoTranspose', M, K-1, > ONE, W, LDW, WORK, 1, ONE, W( 1, K ), 1 ) ENDIF ENDIF * 400 CONTINUE * ENDIF * ENDIF * RETURN END * * ********************************************************************** * SUBROUTINE DGEWY( SIDE, M, N, K, A, LDA, > W, LDW, Y, LDY, > WORK ) * * ---------------------------------------------------------------------- * * Description: * * Apply a WY block transform to the matrix A (from the left or from * the right), i.e., update A as * * T T * A := ( I + W * Y ) * A , or * * T * A := A * ( I + W * Y ) , resp. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * Parameters: * CHARACTER*1 SIDE INTEGER M, N, K, LDA, LDW, LDY DOUBLE PRECISION A( LDA, * ), W( LDW, * ), Y( LDY, * ), > WORK( * ) * * side (in) character*1 * Apply the transforms from the left or from the right ? * side = 'L' : From the left. * = 'R' : From the right. * * m (in) integer * The number of rows of the matrix A. * m >= 0. * * n (in) integer * The number of columns of the matrix A. * n >= 0. * * k (in) integer * The number of columns of the matrices W and Y. * k >= 0. * * a (in/out) double precision array, dimension ( lda, n ) * On entry, the matrix A. * T T * On exit, ( I + W * Y ) * A, if side = 'L', or * T * A * ( I + W * Y ), if side = 'R'. * * lda (in) integer * The leading dimension of the array a. * lda >= max( m, 1 ). * * w (in) double precision array, dimension ( ldw, k ) * The matrix W. * * ldw (in) integer * The leading dimension of the array w. * ldw >= max( m, 1 ), if side = 'L'. * >= max( n, 1 ), if side = 'R'. * (W has row dimension m or n, resp.) * * y (in) double precision array, dimension ( ldy, k ) * The matrix Y. * * ldy (in) integer * The leading dimension of the array y. * ldy >= max( m, 1 ), if side = 'L'. * >= max( n, 1 ), if side = 'R'. * (Y has row dimension m or n, resp.) * * work (workspace) double precision array, * dimension ( n*k ), if side = 'L'. * ( m*k ), if side = 'R'. * * ---------------------------------------------------------------------- * * Local variables: * DOUBLE PRECISION ZERO, ONE PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * EXTERNAL DGEMM * * dgemm matrix-matrix product (BLAS) * * ---------------------------------------------------------------------- * IF ( ( K .GT. 0 ) .AND. ( M .GT. 0 ) .AND. ( N .GT. 0 ) ) THEN * IF ( LSAME( SIDE, 'L' ) ) THEN * * T * --- work = W * A --- * CALL DGEMM( 'Transpose', 'NoTranspose', K, N, M, > ONE, W, LDW, A, LDA, ZERO, WORK, K ) * * --- A = Y * work + A --- * CALL DGEMM( 'NoTranspose', 'NoTranspose', M, N, K, > ONE, Y, LDY, WORK, K, ONE, A, LDA ) * ELSE * * --- work = A * W --- * CALL DGEMM( 'NoTranspose', 'NoTranspose', M, K, N, > ONE, A, LDA, W, LDW, ZERO, WORK, M ) * * T * --- A = A + work * Y --- * CALL DGEMM( 'NoTranspose', 'Transpose', M, N, K, > ONE, WORK, M, Y, LDY, ONE, A, LDA ) * ENDIF ENDIF * RETURN END * * ********************************************************************** * SUBROUTINE DQRUPD( M, N, B, A, LDA, DRPTOL, > NEEDA1, M1, A1, LDA1, N2, A2, > NB, Y, W, LDWY, WORK ) * * ---------------------------------------------------------------------- * * Description: * * dqrupd forms the QR factorization * * A = Q * R * * of the m-by-n block A and overwrites A by R. * In addition, the matrices W and Y in the block representation * * T * Q = I + W * Y * * are built from the Householder transforms that were used in the * QR decomposition, a matrix A1 may be updated via * * A1 := A1 * Q , * * and another matrix A2 is updated via * * T * A2 := Q * A2 . * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * Parameters: * INTEGER M, N, B, LDA, M1, LDA1, N2, NB, LDWY DOUBLE PRECISION DRPTOL LOGICAL NEEDA1 DOUBLE PRECISION A( LDA, * ), A1( LDA1, * ), A2( LDA, * ), > Y( * ), W( * ), WORK( * ) * * m (in) integer * The number of rows in the block A, for which a QR * decomposition is sought. * m > 0. * * n (in) integer * The number of columns in that block. * n > 0. * * b (in) integer * The number of nonzero subdiagonals in the block (the * subdiagonals below the b-th are supposed to be zero and are * not accessed.) * b > 0. * * a (in/out) double precision array, dimension ( lda, n ) * On entry, A is a m-by-n matrix with lower bandwidth <= b. * Because of the banded storage scheme used in the calling * routine, the zero elements below the b-th subdiagonal may * not be explicitly stored. Therefore, they are not accessed * in this routine. * On exit, the subdiagonals 1, ..., b of A are zeroed out, and * the upper triangle of A is overwritten with the matrix R of * the factorization A = Q * R. * * lda (in) integer * The leading dimension of the array a. * lda >= m. * * drptol (in) double precision * Threshold for dropping the Householder transformations: if * the norm of the vector to be eliminated is already smaller * than drptol then the transformation is skipped. * drptol >= 0.0. * * needa1 (in) logical * Is A1 required or not ? * needa1 = .true. : Update A1. * = .false. : Do not update A1. * * m1 (in) integer * The number of rows of the matrix A1 (the number of columns * must be m). Accessed only if A1 is required. * m1 >= 0. * * a1 (in/out) double precision array, dimension ( lda1, m ) * On entry, the m1-by-m matrix A1. * On exit, A1 may be overwritten with A1 * Q. * * lda1 (in) integer * The leading dimension of the array a1. Accessed only if A1 * is required. * lda1 >= max( m1, 1 ). * * n2 (in) integer * The number of columns in the block A2. * 0 <= n2 <= lda. * * a2 (in/out) double precision array, dimension ( lda, n2 ) * On entry, the m-by-n2 matrix A2. * T * On exit, A2 is overwritten with Q * A2. * * nb (out) integer * The number of non-zero Householder vectors contributing to * Q. * 0 <= nb <= min( m-1, n ). * * y (out) double precision array, dimension ( ldwy, n ) T * The m-by-nb matrix Y in the representation Q = I + W * Y . * * w (out) double precision array, dimension ( ldwy, n ) T * The m-by-nb matrix W in the representation Q = I + W * Y . * * ldwy (out) integer * The leading dimension of the arrays w and y. * ldwy = m. * * work (workspace) double precision array, * dimension ( max( m1, m )*n + n ), if A1 is required. * ( m*n + n ) , otherwise. * * ---------------------------------------------------------------------- * * Local variables : * INTEGER ITAU, IWORK * * itau points to the portion of work that will hold the scaling * values tau for the blocked transforms (required size for * this buffer : n elements) * iwork points to the portion of work that will be used as workspace * for the routines dgbqr2 (n elements) and dgewy * ( max( m1, m ) * nb elements). * * Routines called: * EXTERNAL DGBQR2, DGBWYG, DGEWY * * dgbqr2 QR factorization of a banded matrix (SBR) * dgbwyg generate WY factors (SBR) * dgewy apply WY transform (SBR) * * ---------------------------------------------------------------------- * * --- set pointers to subdivide workspace --- * ITAU = 1 IWORK = ITAU + N * * --- factorize A = Q * R --- * CALL DGBQR2( M, N, B, A, LDA, WORK( ITAU ), DRPTOL, > WORK( IWORK ) ) * * --- build W and Y factors --- * LDWY = M CALL DGBWYG( M, N, B, A, LDA, WORK( ITAU ), > W, LDWY, Y, LDWY, NB ) * IF ( NB .GT. 0 ) THEN * * --- update A1 --- * IF ( NEEDA1 ) THEN CALL DGEWY( 'Right', M1, M, NB, A1, LDA1, > W, LDWY, Y, LDWY, WORK( IWORK ) ) ENDIF * * --- premultiply A2 --- * IF ( N2 .GT. 0 ) THEN CALL DGEWY( 'Left', M, N2, NB, A2, LDA, > W, LDWY, Y, LDWY, WORK( IWORK ) ) ENDIF ENDIF * RETURN END * * ********************************************************************** * SUBROUTINE DSYWY( UPLO, N, K, A, LDA, W, LDW, Y, LDY, WORK ) * * ---------------------------------------------------------------------- * * Description: * * Apply a two-sided WY block transform to the symmetric matrix A, * T T T * i.e., replace A with ( I + W * Y ) * A * ( I + W * Y ). * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * Parameters: * CHARACTER*1 UPLO INTEGER N, K, LDA, LDW, LDY DOUBLE PRECISION A( LDA, * ), W( LDW, * ), Y( LDY, * ), > WORK( * ) * * uplo (in) character*1 * Is the upper or lower triangle of A stored ? * uplo = 'U' : Upper triangle. * = 'L' : Lower triangle. * * n (in) integer * The size of the block to transform. * n >= 0. * * k (in) integer * The number of nontrivial Householder transforms in the * block WY transform. * k >= 0. * * a (in/out) double precision array, dimension ( lda, n ) * On entry, the n-by-n symmetric matrix A. * T T T * On exit, A is overwritten with ( I+WY ) * A * ( I+WY ). * * lda (in) integer * The leading dimension of the array a. * lda >= max( n, 1 ). * * w (in) double precision array, dimension ( ldw, k ) * Contains the block reflector W. * * ldw (in) integer * The leading dimension of the array w. * ldw >= max( n, 1 ). * * y (in) double precision array, dimension ( ldy, k ) * Contains the block reflector Y. * * ldy (in) integer * The leading dimension of the array y. * ldy >= max( n, 1 ). * * work (workspace) double precision array, dimension ( (n+k)*k ) * * ---------------------------------------------------------------------- * * Local variables: * DOUBLE PRECISION ZERO, ONE PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) * * Routines called: * EXTERNAL DGEMM, DSYMM, DSYR2K * * dgemm matrix-matrix product (BLAS) * dsymm symmetric matrix-matrix product (BLAS) * dsyr2k symmetric rank-2 update (BLAS) * * ---------------------------------------------------------------------- * IF ( ( N .GT. 0 ) .AND. ( K .GT. 0 ) ) THEN * * --- work( 1 .. n*k ) := X1 = A * W --- * CALL DSYMM( 'Left', UPLO, N, K, > ONE, A, LDA, W, LDW, ZERO, WORK, N ) * * T * --- work( n*k+1 .. n*k+k*k ) := X2 = 1/2 * X1 * W --- * CALL DGEMM( 'Transpose', 'NoTranspose', K, K, N, > 0.5D0, WORK, N, W, LDW, ZERO, WORK( N*K+1 ), K ) * * --- work( 1 .. n*k ) := X3 = X1 + Y * X2 --- * CALL DGEMM( 'NoTranspose', 'NoTranspose', N, K, K, > ONE, Y, LDY, WORK( N*K+1 ), K, ONE, WORK, N ) * * T T * --- A := A + X3 * Y + Y * X3 --- * CALL DSYR2K( UPLO, 'NoTranspose', N, K, > ONE, WORK, N, Y, LDY, ONE, A, LDA ) * ENDIF * RETURN END SHAR_EOF fi # end of overwriting check cd .. cd .. if test ! -d 'Sp' then mkdir 'Sp' fi cd 'Sp' if test ! -d 'Drivers' then mkdir 'Drivers' fi cd 'Drivers' if test -f 'data1' then echo shar: will not over-write existing file "'data1'" else cat << "SHAR_EOF" > 'data1' C ----------------------------------------------------------------------------- C - - C - Default input file for testing the SBR toolbox - C - - C ----------------------------------------------------------------------------- C C Author: Bruno Lang C Aachen University of Technology C na.blang@na-net.ornl.gov C Date: May 17, 2000 C Version: SBR Toolbox, Rev. 1.4.1 C C ----------------------------------------------------------------------------- C C Format of the commands: C C 'Comment' : The remainder of this line is treated as a comment. C 'FileName' : The following line contains the name of the output file C (up to 7 characters). For example, if you specify 'OUTHCK' C and run the double-precision test driver 'drun', then the C output is directed to the file 'DOUTCHK', whereas the C output of the single-precision driver 'srun' would be C directed to 'SOUTCHK'. C 'MaxDim' : The following line determines a maximum matrix size for C the runs. All runs with larger matrices will be skipped. C This feature can be used to limit the execution time of C the timing/tuning runs without much file editing. C 'NoChecks' : Switch off all numerical checks, even if they are C requested in the following runs. This feature can be used C to reduce the execution time of the timing/tuning runs C without much file editing. C 'OutputLevel' : The value in the following line determines how much output C is produced. C 1 : Generate only the overall summary. C 2 : Generate also condensed summaries for selected C computational routines (this mode should be used to C obtain tuning information). C 3 : Generate a more detailed summary for each test run. C 4 : Generate summaries for each routine called. C 'Print' : The following line (up to 78 characters) is printed to C the output file. C 'Quit' : Quit the test driver, ignore the remainder of the input C file. C C For the above commands, only the first character is relevant (see the C current comment lines), case is ignored. C The following commands trigger tests for computational routines. These C commands must be specified with all 5 characters (case is ignored), and C each requires at least two additional lines (see below). C C 'SYTRD' (cf. lines 86ff): Test run for the one-step reduction C full -> tridiagonal (LAPACK) and, optionally, C for the backward accumulation of the C transformations (ORGTR from LAPACK) C 'SBTRD' (cf. lines 138ff): Test run for the one-step reduction C banded -> tridiagonal (LAPACK) C 'SYRDB' (cf. lines 182ff): Test run for the one-step reduction C full -> banded (SBR) and, optionally, for the C backward accumulation of the transformations C (SYGTR from SBR) C 'SBRDB' (cf. lines 387ff): Test run for the one-step reduction C banded -> banded (SBR) C 'SBRDT' (cf. lines 591ff): Test run for the one-step reduction C banded -> tridiagonal (SBR) C 'SY2BC' (cf. lines 773ff): Test run for the copy full -> banded (SBR) C 'SY2BI' (cf. lines 897ff): Test run for the in-place repacking C full -> banded (SBR) C 'SB2BC' (cf. lines 1021ff): Test run for the copy banded -> banded (SBR) C 'SB2BI' (cf. lines 1123ff): Test run for the in-place repacking C banded -> banded (SBR) C 'SYRDD' (cf. lines 1225ff): Test run for the multi-step reduction driver C full -> banded/tridiagonal (SBR) C 'SBRDD' (cf. lines 1463ff): Test run for the multi-step reduction driver C banded -> banded/tridiagonal (SBR) C C ----------------------------------------------------------------------------- C C --- name of the output file --- C'FileName' C'OUTCHK' C --- set output level --- 'OutputLevel' 1 C ------------------------------------------------------------------------------ C C SYTRD : one-step reduction full -> tridiagonal (LAPACK) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : lda = leading dimension of the array a C 6 : nb1 = blocking factor for the reduction (nb1=0 : use default) C 7 : nx1 = cross-over point to non-blocked algorithm for the reduction C (nx1=0 : use default) C 8 : lwork1 = length of the workspace for the reduction C 9 : xinfo1 = expected info value for the routine sytrd C (xinfo1 <> 0 may be used for checking error exits) C 10 : jobu = accumulate the transformations in a matrix U with the C routine orgtr (jobu='U') or not (jobu='N') ? C 11 : nb2 = blocking factor for the accumulation (nb2=0 : use default) C 12 : nx2 = cross-over point to non-blocked algorithm for the accumulation C (nb2=0 : use default) C 13 : lwork2 = length of workspace for the accumulation C 14 : xinfo2 = expected info value for the routine orgtr C (xinfo2 <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'SYTRD' 'Rand' 0.0 'Upper' 30 30 8 8 10000 0 'Upd' 8 8 10000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 30 30 8 8 10000 0 'Upd' 8 8 10000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Upper' 30 30 8 8 10000 0 'NoU' 8 8 10000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 30 30 8 8 10000 0 'NoU' 8 8 10000 0 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBTRD : one-step reduction banded -> tridiagonal (LAPACK) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the banded matrix A C 6 : lda = leading dimension of the array a C 7 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 8 : ldu = leading dimension of the array u C 9 : xinfo = expected info value for the routine sbtrd C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'SBTRD' 'Rand' 0.0 'Upper' 30 7 8 'Upd' 50 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 30 7 8 'Upd' 50 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Upper' 30 7 8 'NoU' 50 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 30 7 8 'NoU' 50 0 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SYRDB : one-step reduction full -> banded (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : lda = leading dimension of the array a C 6 : b2 = (semi-)bandwidth of the reduced matrix B C 7 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 8 : nb = blocking factor for the reduction (nb=0 : use default) C 9 : lwork1 = length of the workspace for the reduction C 10 : xinfo1 = expected info value for the routine syrdb C (xinfo1 <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : jobu = accumulate the transformations in a matrix U or not ? C jobu = 'O' : do the accumulation 'on the fly' in syrdb C = 'U' : do the accumulation after the reduction with C sygtr C jobu = 'N' : no accumulation C 2 : ldu = leading dimension of the array u C 3 : lwork2 = length of workspace for the accumulation with sygtr C 4 : xinfo2 = expected info value for the routine sygtr C (xinfo2 <> 0 may be used for checking error exits) C C Parameters in the fourth line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' or 'O' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' or 'O' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- nonblocked reduction --- 'SYRDB' 'Rand' 0.0 'Upper' 30 30 6 0.0 1 10000 1 'OnF' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 30 30 6 0.0 1 10000 1 'Onf' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Upper' 30 30 6 0.0 1 10000 1 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 30 30 6 0.0 1 10000 1 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Upper' 30 30 6 0.0 1 10000 1 'NoU' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 30 30 6 0.0 1 10000 1 'NoU' 30 10000 1 'Check' 10.0 10.0 10.0 C --- blocked reduction --- 'SYRDB' 'Rand' 0.0 'Upper' 30 30 7 0.0 6 10000 6 'OnF' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 30 30 7 0.0 6 10000 6 'OnF' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Upper' 30 30 7 0.0 6 10000 6 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 30 30 7 0.0 6 10000 6 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Upper' 30 30 7 0.0 6 10000 6 'NoU' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 30 30 7 0.0 6 10000 6 'NoU' 30 10000 1 'Check' 10.0 10.0 10.0 C --- autopilot, non-exact dimensions --- 'SYRDB' 'Rand' 0.0 'Upper' 29 31 8 0.0 0 10000 8 'OnF' 32 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 29 31 8 0.0 0 10000 8 'OnF' 32 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Upper' 29 31 8 0.0 0 10000 8 'Upd' 32 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 29 31 8 0.0 0 10000 8 'Upd' 32 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Upper' 29 31 8 0.0 0 10000 8 'NoU' 32 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 29 31 8 0.0 0 10000 8 'NoU' 32 10000 1 'Check' 10.0 10.0 10.0 C --- small workspace forcing blocksize reduction --- 'SYRDB' 'Rand' 0.0 'Upper' 30 30 8 0.0 6 300 4 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Upper' 30 30 8 0.0 0 300 4 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 C --- ISDA-type matrix --- 'SYRDB' 'ISDA' 1.0E3 'Upper' 30 30 8 1.0E4 6 10000 6 'Upd' 30 10000 1 'Check' 10.0 1.0E4 10.0 'SYRDB' 'ISDA' 1.0E3 'Upper' 30 30 8 1.0E4 6 10000 6 'NoU' 30 10000 1 'Check' 10.0 10.0 1.0E4 C --- checks for quick return --- 'SYRDB' 'Rand' 0.0 'Upper' 1 30 0 0.0 1 600 1 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Upper' 30 30 29 0.0 1 600 1 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 C --- checks for error exits : --- C --- uplo is neither 'U' nor 'L' --- 'SYRDB' 'Rand' 0.0 'Error' 10 10 4 0.0 4 10000 -1 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 C --- jobu is neither 'U' nor 'N' --- 'SYRDB' 'Rand' 0.0 'Lower' 10 10 4 0.0 4 10000 -2 'Err' 10 10000 1 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SYRDB' 'Rand' 0.0 'Lower' -10 10 4 0.0 4 10000 -3 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 C --- b is out of range --- 'SYRDB' 'Rand' 0.0 'Lower' 1 10 4 0.0 4 10000 -4 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 10 10 0 0.0 4 10000 -4 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 10 10 10 0.0 4 10000 -4 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 C --- lda is too small --- 'SYRDB' 'Rand' 0.0 'Lower' 10 8 4 0.0 4 10000 -6 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 C --- drptol is negative --- 'SYRDB' 'Rand' 0.0 'Lower' 10 10 4 -1.0 4 10000 -7 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 C --- ldu is too small --- 'SYRDB' 'Rand' 0.0 'Lower' 10 10 4 0.0 4 10000 -9 'Upd' 7 10000 1 'Check' 10.0 10.0 10.0 C --- nb negative --- 'SYRDB' 'Rand' 0.0 'Lower' 10 10 4 0.0 -4 10000 -10 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 C --- lwork is too small --- 'SYRDB' 'Rand' 0.0 'Lower' 10 10 4 0.0 4 21 -13 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 C --- this should be just enough --- 'SYRDB' 'Rand' 0.0 'Lower' 10 10 4 0.0 4 22 1 'NoU' 10 10000 1 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBRDB : one-step reduction banded -> banded (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : n = dimension of the matrix A C 4 : b1 = (semi-)bandwidth of the matrix A C 5 : lda = leading dimension of the array a C 6 : b2 = (semi-)bandwidth of the reduced matrix B C 7 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 8 : nb = blocking factor for the reduction (nb=0 : use default) C 9 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 10 : ldu = leading dimension of the array u C 11 : lwork = length of workspace for the reduction and accumulation C 12 : xinfo = expected info value for the routine sbrdb C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- nonblocked reduction --- 'SBRDB' 'Rand' 0.0 30 8 13 4 0.0 1 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 8 13 4 0.0 1 'NoU' 30 10000 1 'Check' 10.0 10.0 10.0 C --- blocked reduction --- 'SBRDB' 'Rand' 0.0 31 8 15 4 0.0 3 'Upd' 31 10000 3 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 31 8 15 4 0.0 3 'NoU' 31 10000 3 'Check' 10.0 10.0 10.0 C --- autopilot, nonexact dimensions --- 'SBRDB' 'Rand' 0.0 29 8 23 4 0.0 0 'Upd' 32 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 29 8 23 4 0.0 0 'NoU' 32 10000 4 'Check' 10.0 10.0 10.0 C --- force blocksize reduction by insufficient workspace --- 'SBRDB' 'Rand' 0.0 30 8 20 5 0.0 5 'Upd' 30 200 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 8 20 5 0.0 5 'NoU' 30 100 3 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 29 59 5 0.0 0 'Upd' 30 400 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 29 59 5 0.0 0 'NoU' 30 300 3 'Check' 10.0 10.0 10.0 C --- ISDA-type matrix --- 'SBRDB' 'ISDA' 1.0E3 30 12 24 8 1.0E4 8 'Upd' 30 10000 8 'Check' 10.0 1.0E4 10.0 'SBRDB' 'ISDA' 1.0E3 30 12 24 8 1.0E4 8 'NoU' 30 10000 8 'Check' 10.0 10.0 1.0E4 C --- now the workspace should fit exactly --- 'SBRDB' 'Rand' 0.0 30 10 20 6 0.0 6 'Upd' 30 306 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 10 20 6 0.0 6 'NoU' 30 216 6 'Check' 10.0 10.0 10.0 C --- force buffering by providing very tight lda --- 'SBRDB' 'Rand' 0.0 30 9 16 5 0.0 4 'Upd' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 16 5 0.0 4 'NoU' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 15 5 0.0 4 'Upd' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 15 5 0.0 4 'NoU' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 14 5 0.0 4 'Upd' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 14 5 0.0 4 'NoU' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 13 5 0.0 4 'Upd' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 13 5 0.0 4 'NoU' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 12 5 0.0 4 'Upd' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 12 5 0.0 4 'NoU' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 11 5 0.0 4 'Upd' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 11 5 0.0 4 'NoU' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 10 5 0.0 4 'Upd' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 30 9 10 5 0.0 4 'NoU' 30 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 20 12 20 5 0.0 4 'Upd' 20 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 20 12 20 5 0.0 4 'NoU' 20 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 20 12 13 5 0.0 4 'Upd' 20 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 20 12 13 5 0.0 4 'NoU' 20 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 20 19 20 5 0.0 4 'Upd' 20 10000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 20 19 20 5 0.0 4 'NoU' 20 10000 4 'Check' 10.0 10.0 10.0 C --- checks for quick return --- 'SBRDB' 'Rand' 0.0 10 6 10 6 0.0 1 'Upd' 10 10000 1 'Check' 10.0 10.0 10.0 C --- checks for error exits : --- C --- jobu is neither 'U' nor 'N' --- 'SBRDB' 'Rand' 0.0 10 6 10 3 0.0 1 'Err' 10 10000 -1 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SBRDB' 'Rand' 0.0 -10 6 10 3 0.0 1 'Upd' 10 10000 -2 'Check' 10.0 10.0 10.0 C --- b1 is out of range --- 'SBRDB' 'Rand' 0.0 10 -6 10 3 0.0 1 'Upd' 10 10000 -3 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 10 10 10 3 0.0 1 'Upd' 10 10000 -3 'Check' 10.0 10.0 10.0 C --- b2 is out of range --- 'SBRDB' 'Rand' 0.0 10 6 10 -3 0.0 1 'Upd' 10 10000 -4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 10 6 10 0 0.0 1 'Upd' 10 10000 -4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 10 6 10 7 0.0 1 'Upd' 10 10000 -4 'Check' 10.0 10.0 10.0 C --- lda is too small --- 'SBRDB' 'Rand' 0.0 10 6 6 3 0.0 1 'Upd' 10 10000 -6 'Check' 10.0 10.0 10.0 C --- drptol is negative --- 'SBRDB' 'Rand' 0.0 10 6 10 3 -1.0 1 'Upd' 10 10000 -7 'Check' 10.0 10.0 10.0 C --- ldu is too small --- 'SBRDB' 'Rand' 0.0 10 6 10 3 0.0 1 'Upd' 8 10000 -9 'Check' 10.0 10.0 10.0 C --- nb is negative --- 'SBRDB' 'Rand' 0.0 10 6 10 3 0.0 -1 'Upd' 10 10000 -10 'Check' 10.0 10.0 10.0 C --- lwork is too small --- 'SBRDB' 'Rand' 0.0 10 6 10 3 0.0 1 'Upd' 10 22 -12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 10 6 10 3 0.0 1 'NoU' 10 20 -12 'Check' 10.0 10.0 10.0 C --- for these, workspace should be just sufficient --- 'SBRDB' 'Rand' 0.0 10 6 10 3 0.0 1 'Upd' 10 23 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 10 6 10 3 0.0 1 'NoU' 10 21 1 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBRDT : one-step reduction banded -> tridiagonal (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : n = dimension of the matrix A C 4 : b1 = (semi-)bandwidth of the matrix A C 5 : lda = leading dimension of the array a C 6 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 7 : nb = blocking factor for the reduction (nb=0 : use default) C 8 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 9 : ldu = leading dimension of the array u C 10 : lwork = length of workspace for the reduction and accumulation C 11 : xinfo = expected info value for the routine sbrdt C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- non-blocked reduction/update --- 'SBRDT' 'Rand' 0.0 30 8 16 0.0 1 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 16 0.0 1 'NoU' 30 10000 1 'Check' 10.0 10.0 10.0 C --- blocked reduction/update --- 'SBRDT' 'Rand' 0.0 31 8 16 0.0 8 'Upd' 31 10000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 31 8 16 0.0 8 'NoU' 31 10000 1 'Check' 10.0 10.0 10.0 C --- autopilot --- 'SBRDT' 'Rand' 0.0 29 4 5 0.0 0 'Upd' 32 10000 3 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 29 4 5 0.0 0 'NoU' 32 10000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 29 8 18 0.0 0 'Upd' 32 10000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 29 8 18 0.0 0 'NoU' 32 10000 1 'Check' 10.0 10.0 10.0 C --- ISDA-type matrix --- 'SBRDT' 'ISDA' 1.0E3 30 8 16 1.0E4 8 'Upd' 30 10000 8 'Check' 10.0 1.0E4 10.0 'SBRDT' 'ISDA' 1.0E3 30 8 16 1.0E4 8 'NoU' 30 10000 1 'Check' 10.0 10.0 1.0E4 C --- force repacking by providing rather tight lda --- 'SBRDT' 'Rand' 0.0 30 8 15 0.0 6 'Upd' 30 517 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 15 0.0 6 'NoU' 30 17 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 14 0.0 6 'Upd' 30 522 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 14 0.0 6 'NoU' 30 23 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 13 0.0 6 'Upd' 30 531 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 13 0.0 6 'NoU' 30 31 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 12 0.0 6 'Upd' 30 544 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 12 0.0 6 'NoU' 30 44 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 11 0.0 6 'Upd' 30 561 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 11 0.0 6 'NoU' 30 61 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 10 0.0 6 'Upd' 30 582 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 10 0.0 6 'NoU' 30 82 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 9 0.0 6 'Upd' 30 607 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 9 0.0 6 'NoU' 30 107 1 'Check' 10.0 10.0 10.0 C --- force blocksize reduction by providing too small workspace --- 'SBRDT' 'Rand' 0.0 30 8 16 0.0 6 'Upd' 30 350 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 13 26 0.0 0 'Upd' 30 370 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 14 0.0 6 'Upd' 30 250 3 'Check' 10.0 10.0 10.0 C --- checks for quick return --- 'SBRDT' 'Rand' 0.0 0 0 2 0.0 6 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 0 2 0.0 6 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 1 2 0.0 6 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 C --- checks for error exits --- C --- jobu is neither 'U' nor 'N' --- 'SBRDT' 'Rand' 0.0 10 6 12 0.0 6 'Err' 10 10000 -1 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SBRDT' 'Rand' 0.0 -10 6 12 0.0 6 'Upd' 10 10000 -2 'Check' 10.0 10.0 10.0 C --- b is out of range --- 'SBRDT' 'Rand' 0.0 10 -6 12 0.0 6 'Upd' 10 10000 -3 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 10 10 12 0.0 6 'Upd' 10 10000 -3 'Check' 10.0 10.0 10.0 C --- lda is too small --- 'SBRDT' 'Rand' 0.0 10 6 6 0.0 6 'Upd' 10 10000 -5 'Check' 10.0 10.0 10.0 C --- drptol is negative --- 'SBRDT' 'Rand' 0.0 10 6 12 -1.0 6 'Upd' 10 10000 -6 'Check' 10.0 10.0 10.0 C --- ldu is too small --- 'SBRDT' 'Rand' 0.0 10 6 12 0.0 6 'Upd' 8 10000 -10 'Check' 10.0 10.0 10.0 C --- nb is negative --- 'SBRDT' 'Rand' 0.0 10 6 12 0.0 -6 'Upd' 10 10000 -11 'Check' 10.0 10.0 10.0 C --- workspace is too small --- 'SBRDT' 'Rand' 0.0 30 8 16 0.0 6 'Upd' 50 37 -13 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 16 0.0 6 'NoU' 50 15 -13 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 15 0.0 6 'Upd' 50 38 -13 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 15 0.0 6 'NoU' 50 16 -13 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 9 0.0 6 'Upd' 50 128 -13 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 30 8 9 0.0 6 'NoU' 50 106 -13 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SY2BC : copy full -> banded (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the matrix A C 6 : lda1 = leading dimension of the array a in full storage C 7 : lda2 = leading dimension of the array holding A in packed storage C 8 : xinfo = expected info value for the routine sy2bc C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- repack to a tightly fitting band --- 'SY2BC' 'Rand' 0.0 'Upper' 25 8 25 9 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 25 9 1 'Check' 10.0 10.0 10.0 C --- repack to a band with spare diagonals --- 'SY2BC' 'Rand' 0.0 'Upper' 25 8 25 12 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 25 12 1 'Check' 10.0 10.0 10.0 C --- repack to a band with the same leading dimension --- 'SY2BC' 'Rand' 0.0 'Upper' 25 8 25 25 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 25 25 1 'Check' 10.0 10.0 10.0 C --- repack to a band with leading dimension larger by 1 --- 'SY2BC' 'Rand' 0.0 'Upper' 25 8 25 26 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 25 26 1 'Check' 10.0 10.0 10.0 C --- repack to a band with larger leading dimension --- 'SY2BC' 'Rand' 0.0 'Upper' 25 8 25 33 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 25 33 1 'Check' 10.0 10.0 10.0 C --- and now the same tests again, with inexact lda --- 'SY2BC' 'Rand' 0.0 'Upper' 25 8 30 9 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 30 9 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Upper' 25 8 30 12 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 30 12 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Upper' 25 8 30 30 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 30 30 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Upper' 25 8 30 31 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 30 31 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Upper' 25 8 30 35 1 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 8 30 35 1 'Check' 10.0 10.0 10.0 C --- check for quick return --- 'SY2BC' 'Rand' 0.0 'Lower' 0 8 30 9 1 'Check' 10.0 10.0 10.0 C --- checks for error exits --- C --- uplo is neither 'U' nor 'L' --- 'SY2BC' 'Rand' 0.0 'Error' 25 8 30 9 -1 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SY2BC' 'Rand' 0.0 'Lower' -25 8 30 9 -2 'Check' 10.0 10.0 10.0 C --- b is out of range --- 'SY2BC' 'Rand' 0.0 'Lower' 25 -8 30 9 -3 'Check' 10.0 10.0 10.0 'SY2BC' 'Rand' 0.0 'Lower' 25 25 30 9 -3 'Check' 10.0 10.0 10.0 C --- ldfull is too small --- 'SY2BC' 'Rand' 0.0 'Lower' 25 8 23 9 -5 'Check' 10.0 10.0 10.0 C --- ldband is too small --- 'SY2BC' 'Rand' 0.0 'Lower' 25 8 30 8 -7 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SY2BI : in-place copy full -> banded (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the matrix A C 6 : lda1 = leading dimension of the array a in full storage C 7 : lda2 = leading dimension of the array holding A in packed storage C 8 : xinfo = expected info value for the routine sy2bi C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- repack to a tightly fitting band --- 'SY2BI' 'Rand' 0.0 'Upper' 25 8 25 9 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 25 9 1 'Check' 10.0 10.0 10.0 C --- repack to a band with spare diagonals --- 'SY2BI' 'Rand' 0.0 'Upper' 25 8 25 12 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 25 12 1 'Check' 10.0 10.0 10.0 C --- repack to a band with the same leading dimension --- 'SY2BI' 'Rand' 0.0 'Upper' 25 8 25 25 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 25 25 1 'Check' 10.0 10.0 10.0 C --- repack to a band with leading dimension larger by 1 --- 'SY2BI' 'Rand' 0.0 'Upper' 25 8 25 26 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 25 26 1 'Check' 10.0 10.0 10.0 C --- repack to a band with larger leading dimension --- 'SY2BI' 'Rand' 0.0 'Upper' 25 8 25 33 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 25 33 1 'Check' 10.0 10.0 10.0 C --- and now the same tests again, with inexact lda --- 'SY2BI' 'Rand' 0.0 'Upper' 25 8 30 9 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 30 9 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Upper' 25 8 30 12 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 30 12 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Upper' 25 8 30 30 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 30 30 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Upper' 25 8 30 31 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 30 31 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Upper' 25 8 30 35 1 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 8 30 35 1 'Check' 10.0 10.0 10.0 C --- check for quick return --- 'SY2BI' 'Rand' 0.0 'Lower' 0 8 30 9 1 'Check' 10.0 10.0 10.0 C --- checks for error exits --- C --- uplo is neither 'U' nor 'L' --- 'SY2BI' 'Rand' 0.0 'Error' 25 8 30 9 -1 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SY2BI' 'Rand' 0.0 'Lower' -25 8 30 9 -2 'Check' 10.0 10.0 10.0 C --- b is out of range --- 'SY2BI' 'Rand' 0.0 'Lower' 25 -8 30 9 -3 'Check' 10.0 10.0 10.0 'SY2BI' 'Rand' 0.0 'Lower' 25 25 30 9 -3 'Check' 10.0 10.0 10.0 C --- ldfull is too small --- 'SY2BI' 'Rand' 0.0 'Lower' 25 8 23 9 -5 'Check' 10.0 10.0 10.0 C --- ldband is too small --- 'SY2BI' 'Rand' 0.0 'Lower' 25 8 30 8 -6 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SB2BC : copy banded -> banded (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the matrix A C 6 : lda1 = leading dimension of the source array a C 7 : lda2 = leading dimension of the destination array C 8 : xinfo = expected info value for the routine sb2bc C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- repack a tightly fitting band --- C --- repack to a tightly fitting band --- 'SB2BC' 'Rand' 0.0 'Upper' 25 8 9 9 1 'Check' 10.0 10.0 10.0 'SB2BC' 'Rand' 0.0 'Lower' 25 8 9 9 1 'Check' 10.0 10.0 10.0 C --- repack to a band with spare diagonals --- 'SB2BC' 'Rand' 0.0 'Upper' 25 8 9 12 1 'Check' 10.0 10.0 10.0 'SB2BC' 'Rand' 0.0 'Lower' 25 8 9 12 1 'Check' 10.0 10.0 10.0 C --- and now repack a band with diagonals to spare --- C --- repack to tight fit --- 'SB2BC' 'Rand' 0.0 'Upper' 25 8 15 9 1 'Check' 10.0 10.0 10.0 'SB2BC' 'Rand' 0.0 'Lower' 25 8 15 9 1 'Check' 10.0 10.0 10.0 C --- repack to a band with spare diagonals --- 'SB2BC' 'Rand' 0.0 'Upper' 25 8 15 12 1 'Check' 10.0 10.0 10.0 'SB2BC' 'Rand' 0.0 'Lower' 25 8 15 12 1 'Check' 10.0 10.0 10.0 C --- repack to a band with the same leading dimension --- 'SB2BC' 'Rand' 0.0 'Upper' 25 8 15 15 1 'Check' 10.0 10.0 10.0 'SB2BC' 'Rand' 0.0 'Lower' 25 8 15 15 1 'Check' 10.0 10.0 10.0 C --- repack to a band with larger leading dimension --- 'SB2BC' 'Rand' 0.0 'Upper' 25 8 15 25 1 'Check' 10.0 10.0 10.0 'SB2BC' 'Rand' 0.0 'Lower' 25 8 15 25 1 'Check' 10.0 10.0 10.0 C --- check for quick return --- 'SB2BC' 'Rand' 0.0 'Lower' 0 0 30 9 1 'Check' 10.0 10.0 10.0 C --- checks for error exits --- C --- uplo is neither 'U' nor 'L' --- 'SB2BC' 'Rand' 0.0 'Error' 25 8 12 9 -1 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SB2BC' 'Rand' 0.0 'Lower' -25 8 12 9 -2 'Check' 10.0 10.0 10.0 C --- b is out of range --- 'SB2BC' 'Rand' 0.0 'Lower' 25 -8 12 9 -3 'Check' 10.0 10.0 10.0 'SB2BC' 'Rand' 0.0 'Lower' 25 25 25 9 -3 'Check' 10.0 10.0 10.0 C --- ldsrc is too small --- 'SB2BC' 'Rand' 0.0 'Lower' 25 8 6 9 -5 'Check' 10.0 10.0 10.0 C --- lddst is too small --- 'SB2BC' 'Rand' 0.0 'Lower' 25 8 11 7 -7 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SB2BI : in-place copy banded -> banded (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the matrix A C 6 : lda1 = leading dimension of the source array a C 7 : lda2 = leading dimension of the destination array C 8 : xinfo = expected info value for the routine sb2bi C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- repack a tightly fitting band --- C --- repack to a tightly fitting band --- 'SB2BI' 'Rand' 0.0 'Upper' 25 8 9 9 1 'Check' 10.0 10.0 10.0 'SB2BI' 'Rand' 0.0 'Lower' 25 8 9 9 1 'Check' 10.0 10.0 10.0 C --- repack to a band with spare diagonals --- 'SB2BI' 'Rand' 0.0 'Upper' 25 8 9 12 1 'Check' 10.0 10.0 10.0 'SB2BI' 'Rand' 0.0 'Lower' 25 8 9 12 1 'Check' 10.0 10.0 10.0 C --- and now repack a band with diagonals to spare --- C --- repack to tight fit --- 'SB2BI' 'Rand' 0.0 'Upper' 25 8 15 9 1 'Check' 10.0 10.0 10.0 'SB2BI' 'Rand' 0.0 'Lower' 25 8 15 9 1 'Check' 10.0 10.0 10.0 C --- repack to a band with spare diagonals --- 'SB2BI' 'Rand' 0.0 'Upper' 25 8 15 12 1 'Check' 10.0 10.0 10.0 'SB2BI' 'Rand' 0.0 'Lower' 25 8 15 12 1 'Check' 10.0 10.0 10.0 C --- repack to a band with the same leading dimension --- 'SB2BI' 'Rand' 0.0 'Upper' 25 8 15 15 1 'Check' 10.0 10.0 10.0 'SB2BI' 'Rand' 0.0 'Lower' 25 8 15 15 1 'Check' 10.0 10.0 10.0 C --- repack to a band with larger leading dimension --- 'SB2BI' 'Rand' 0.0 'Upper' 25 8 15 25 1 'Check' 10.0 10.0 10.0 'SB2BI' 'Rand' 0.0 'Lower' 25 8 15 25 1 'Check' 10.0 10.0 10.0 C --- check for quick return --- 'SB2BI' 'Rand' 0.0 'Lower' 0 0 30 9 1 'Check' 10.0 10.0 10.0 C --- checks for error exits --- C --- uplo is neither 'U' nor 'L' --- 'SB2BI' 'Rand' 0.0 'Error' 25 8 12 9 -1 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SB2BI' 'Rand' 0.0 'Lower' -25 8 12 9 -2 'Check' 10.0 10.0 10.0 C --- b is out of range --- 'SB2BI' 'Rand' 0.0 'Lower' 25 -8 12 9 -3 'Check' 10.0 10.0 10.0 'SB2BI' 'Rand' 0.0 'Lower' 25 25 25 9 -3 'Check' 10.0 10.0 10.0 C --- ldsrc is too small --- 'SB2BI' 'Rand' 0.0 'Lower' 25 8 6 9 -5 'Check' 10.0 10.0 10.0 C --- lddst is too small --- 'SB2BI' 'Rand' 0.0 'Lower' 25 8 11 7 -6 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SYRDD : driver routine for the reduction full -> banded/tridiagonal C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : lda1 = leading dimension of the array a C 6 : b2 = (semi-)bandwidth of the reduced matrix B C 7 : lda2 = leading dimension of the array holding the banded matrix C 8 : nsteps = number of reduction steps C 9 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 10 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 11 : lwork = length of workspace for the reduction and accumulation C 12 : xinfo = expected info value for the routine syrdb C (xinfo <> 0 may be used for checking error exits) C C If nsteps > 1 then the second line contains the nstep-1 intermediate C bandwidths, and the third line contains the nsteps blocking factors for the C reduction steps. C If nsteps = 1 then the second line contains the blocking factor for the C reduction step (the line specifying intermediate bandwidths is missing). C If nsteps = 0 then no intermediate bandwidths or blocking factors are C specified (so both lines are missing). C C Parameters in the last line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- one-step reduction --- 'SYRDD' 'Rand' 0.0 'Upper' 30 30 1 2 1 0.0 'Upd' 10000 1 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 1 2 1 0.0 'NoU' 10000 1 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 1 2 1 0.0 'Upd' 10000 1 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 1 2 1 0.0 'NoU' 10000 1 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 8 9 1 0.0 'Upd' 10000 1 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 8 9 1 0.0 'NoU' 10000 1 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 8 9 1 0.0 'Upd' 10000 1 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 8 9 1 0.0 'NoU' 10000 1 5 'Check' 10.0 10.0 10.0 C --- two-step reduction --- 'SYRDD' 'Rand' 0.0 'Upper' 30 30 1 16 2 0.0 'Upd' 10000 1 12 5 4 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 1 16 2 0.0 'NoU' 10000 1 12 5 4 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 1 16 2 0.0 'Upd' 10000 1 12 5 4 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 1 16 2 0.0 'NoU' 10000 1 12 5 4 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 8 14 2 0.0 'Upd' 10000 1 12 5 4 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 8 14 2 0.0 'NoU' 10000 1 12 5 4 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 8 14 2 0.0 'Upd' 10000 1 12 5 4 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 8 14 2 0.0 'NoU' 10000 1 12 5 4 'Check' 10.0 10.0 10.0 C --- autopilot --- 'SYRDD' 'Rand' 0.0 'Upper' 30 30 1 2 0 0.0 'Upd' 10000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 1 2 0 0.0 'NoU' 10000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 1 2 0 0.0 'Upd' 10000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 1 2 0 0.0 'NoU' 10000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 5 6 0 0.0 'Upd' 10000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 30 30 5 6 0 0.0 'NoU' 10000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 5 6 0 0.0 'Upd' 10000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 30 30 5 6 0 0.0 'NoU' 10000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 300 300 1 64 0 0.0 'Upd' 20000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 300 300 1 64 0 0.0 'NoU' 20000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 300 300 1 64 0 0.0 'Upd' 20000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 300 300 1 64 0 0.0 'NoU' 20000 1 'Check' 10.0 10.0 10.0 C --- check for quick return --- 'SYRDD' 'Rand' 0.0 'Lower' 0 4 1 2 0 0.0 'Upd' 10000 1 'Check' 10.0 10.0 10.0 C --- check for error exits --- C --- jobu is neither 'U' nor 'N' --- 'SYRDD' 'Rand' 0.0 'Lower' 10 10 4 8 1 0.0 'Err' 10000 -1 5 'Check' 10.0 10.0 10.0 C --- uplo is neither 'U' nor 'L' --- 'SYRDD' 'Rand' 0.0 'Error' 10 10 4 8 1 0.0 'Upd' 10000 -2 5 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SYRDD' 'Rand' 0.0 'Lower' -10 10 4 8 1 0.0 'Upd' 10000 -3 5 'Check' 10.0 10.0 10.0 C --- b2 is out of range --- 'SYRDD' 'Rand' 0.0 'Lower' 10 10 -1 8 1 0.0 'Upd' 10000 -4 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 10 10 0 8 1 0.0 'Upd' 10000 -4 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 10 10 10 20 1 0.0 'Upd' 10000 -4 5 'Check' 10.0 10.0 10.0 C --- lda is too small --- 'SYRDD' 'Rand' 0.0 'Lower' 10 8 4 8 1 0.0 'Upd' 10000 -6 5 'Check' 10.0 10.0 10.0 C --- drptol is out of range --- 'SYRDD' 'Rand' 0.0 'Lower' 10 10 4 8 1 -1.0 'Upd' 10000 -7 5 'Check' 10.0 10.0 10.0 C --- ldband is out of range --- 'SYRDD' 'Rand' 0.0 'Lower' 10 10 4 4 1 0.0 'Upd' 10000 -9 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 10 10 4 6 2 0.0 'Upd' 10000 -9 6 5 3 'Check' 10.0 10.0 10.0 C --- nsteps is negative --- 'SYRDD' 'Rand' 0.0 'Lower' 10 10 4 8 -1 0.0 'Upd' 10000 -12 'Check' 10.0 10.0 10.0 C --- sequence of bandwidths is non-decreasing --- 'SYRDD' 'Rand' 0.0 'Lower' 10 10 1 20 3 0.0 'Upd' 10000 -13 10 3 5 5 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 10 10 3 8 3 0.0 'Upd' 10000 -13 6 2 5 5 5 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Lower' 10 10 1 8 3 0.0 'Upd' 10000 -13 4 5 5 5 5 'Check' 10.0 10.0 10.0 C --- sequence of blocking factors contains negative entries --- 'SYRDD' 'Rand' 0.0 'Lower' 10 10 4 8 1 0.0 'Upd' 10000 -14 -5 'Check' 10.0 10.0 10.0 C --- workspace is too small --- 'SYRDD' 'Rand' 0.0 'Lower' 10 10 4 8 1 0.0 'Upd' 38 -16 5 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBRDD : driver routine for the reduction banded -> banded/tridiagonal C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the matrix A C 6 : lda = leading dimension of the array a C 7 : b2 = (seim-)bandwidth of the reduced matrix B C 8 : nsteps = number of reduction steps C 9 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 10 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 11 : ldu = leading dimension of the array u C 12 : lwork = length of workspace for the reduction and accumulation C 13 : xinfo = expected info value for the routine syrdb C (xinfo <> 0 may be used for checking error exits) C C If nsteps > 1 then the second line contains the nstep-1 intermediate C bandwidths, and the third line contains the nsteps blocking factors for the C reduction steps. C If nsteps = 1 then the second line contains the blocking factor for the C reduction step (the line specifying intermediate bandwidths is missing). C If nsteps = 0 then no intermediate bandwidths or blocking factors are C specified (so both lines are missing). C C Parameters in the last line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C --- one-step reduction --- 'SBRDD' 'Rand' 0.0 'Upper' 30 15 30 1 1 0.0 'Upd' 30 10000 1 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 15 30 1 1 0.0 'NoU' 30 10000 1 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 1 1 0.0 'Upd' 30 10000 1 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 1 1 0.0 'NoU' 30 10000 1 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 4 8 1 1 0.0 'Upd' 30 10000 1 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 4 8 1 1 0.0 'NoU' 30 10000 1 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 4 8 1 1 0.0 'Upd' 30 10000 1 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 4 8 1 1 0.0 'NoU' 30 10000 1 5 'Check' 10.0 10.0 10.0 C --- two-step reduction --- 'SBRDD' 'Rand' 0.0 'Upper' 30 15 30 1 2 0.0 'Upd' 30 10000 1 12 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 15 30 1 2 0.0 'NoU' 30 10000 1 12 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 1 2 0.0 'Upd' 30 10000 1 12 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 1 2 0.0 'NoU' 30 10000 1 12 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 15 30 3 2 0.0 'Upd' 30 10000 1 12 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 15 30 3 2 0.0 'NoU' 30 10000 1 12 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 3 2 0.0 'Upd' 30 10000 1 12 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 3 2 0.0 'NoU' 30 10000 1 12 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 15 30 1 2 0.0 'Upd' 30 10000 1 3 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 15 30 1 2 0.0 'NoU' 30 10000 1 3 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 1 2 0.0 'Upd' 30 10000 1 3 5 3 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 1 2 0.0 'NoU' 30 10000 1 3 5 3 'Check' 10.0 10.0 10.0 C --- doubling sequence --- 'SBRDD' 'Rand' 0.0 'Upper' 30 15 16 1 4 0.0 'Upd' 30 10000 1 14 12 8 0 0 0 0 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 15 16 1 4 0.0 'NoU' 30 10000 1 14 12 8 0 0 0 0 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 16 1 4 0.0 'Upd' 30 10000 1 14 12 8 0 0 0 0 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 16 1 4 0.0 'NoU' 30 10000 1 14 12 8 0 0 0 0 'Check' 10.0 10.0 10.0 C --- autopilot --- 'SBRDD' 'Rand' 0.0 'Upper' 80 70 80 1 0 0.0 'Upd' 80 10000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 80 70 80 1 0 0.0 'NoU' 80 10000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 80 70 80 1 0 0.0 'Upd' 80 10000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 80 70 80 1 0 0.0 'NoU' 80 10000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 12 30 1 0 0.0 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Upper' 30 12 30 1 0 0.0 'NoU' 30 10000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 12 30 1 0 0.0 'Upd' 30 10000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 12 30 1 0 0.0 'NoU' 30 10000 1 'Check' 10.0 10.0 10.0 C --- check for quick return --- 'SBRDD' 'Rand' 0.0 'Lower' 0 4 8 1 0 0.0 'Upd' 10 10000 1 'Check' 10.0 10.0 10.0 C --- check for error exits --- C --- jobu is neither 'U' nor 'N' --- 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 1 0.0 'Err' 10 10000 -1 5 'Check' 10.0 10.0 10.0 C --- uplo is neither 'U' nor 'L' --- 'SBRDD' 'Rand' 0.0 'Error' 10 4 8 1 1 0.0 'Upd' 10 10000 -2 5 'Check' 10.0 10.0 10.0 C --- n is negative --- 'SBRDD' 'Rand' 0.0 'Lower' -10 4 8 1 1 0.0 'Upd' 10 10000 -3 5 'Check' 10.0 10.0 10.0 C --- b1 is out of range --- 'SBRDD' 'Rand' 0.0 'Lower' 10 -4 8 1 1 0.0 'Upd' 10 10000 -4 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 10 10 18 1 1 0.0 'Upd' 10 10000 -4 5 'Check' 10.0 10.0 10.0 C --- b2 is out of range --- 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 0 1 0.0 'Upd' 10 10000 -5 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 0 0 8 1 1 0.0 'Upd' 10 10000 -5 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 5 1 0.0 'Upd' 10 10000 -5 5 'Check' 10.0 10.0 10.0 C --- lda is too small --- 'SBRDD' 'Rand' 0.0 'Lower' 10 4 4 1 1 0.0 'Upd' 10 10000 -7 5 'Check' 10.0 10.0 10.0 C --- drptol is out of range --- 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 1 -1.0 'Upd' 10 10000 -8 5 'Check' 10.0 10.0 10.0 C --- ldu is out of range --- 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 1 0.0 'Upd' 8 10000 -12 5 'Check' 10.0 10.0 10.0 C --- nsteps is negative --- 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 -1 0.0 'Upd' 10 10000 -13 'Check' 10.0 10.0 10.0 C --- sequence of bandwidths is non-decreasing --- 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 4 0.0 'Upd' 10 10000 -14 5 3 2 5 5 5 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 4 0.0 'Upd' 10 10000 -14 3 5 2 5 5 5 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 4 0.0 'Upd' 10 10000 -14 3 2 5 5 5 5 5 'Check' 10.0 10.0 10.0 C --- negative blocking factors --- 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 3 0.0 'Upd' 10 10000 -15 3 2 5 -5 5 'Check' 10.0 10.0 10.0 C --- workspace is too small --- 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 1 1 0.0 'Upd' 30 42 -17 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 10 4 8 1 1 0.0 'Upd' 10 8 -17 5 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 30 15 30 1 2 0.0 'Upd' 30 55 -17 8 5 5 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C --- quit --- 'Quit' C SHAR_EOF fi # end of overwriting check if test -f 'data2' then echo shar: will not over-write existing file "'data2'" else cat << "SHAR_EOF" > 'data2' C ----------------------------------------------------------------------------- C - - C - Default input file for timing the SBR toolbox - C - - C ----------------------------------------------------------------------------- C C Author: Bruno Lang C Aachen University of Technology C na.blang@na-net.ornl.gov C Date: May 17, 2000 C Version: SBR Toolbox, Rev. 1.4.1 C C ----------------------------------------------------------------------------- C C For the format of the commands, see the file INCHK C C --- if you are in a hurry, uncomment the following two lines --- C'MaxDim' C800 C --- if you are in a real hurry, uncomment the following two lines --- 'MaxDim' 400 C --- if you want result checking, comment out the following line --- 'NoChecks' C ----------------------------------------------------------------------------- C C --- name of the output file --- C'FileName' C'OUTTIM' C --- set output level --- 'OutputLevel' 3 C ----------------------------------------------------------------------------- C C SYTRD : one-step reduction full -> tridiagonal (LAPACK) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : lda = leading dimension of the array a C 6 : nb1 = blocking factor for the reduction (nb1=0 : use default) C 7 : nx1 = cross-over point to non-blocked algorithm for the reduction C (nx1=0 : use default) C 8 : lwork1 = length of the workspace for the reduction C 9 : xinfo1 = expected info value for the routine sytrd C (xinfo1 <> 0 may be used for checking error exits) C 10 : jobu = accumulate the transformations in a matrix U with the C routine orgtr (jobu='U') or not (jobu='N') ? C 11 : nb2 = blocking factor for the accumulation (nb2=0 : use default) C 12 : nx2 = cross-over point to non-blocked algorithm for the accumulation C (nb2=0 : use default) C 13 : lwork2 = length of workspace for the accumulation C 14 : xinfo2 = expected info value for the routine orgtr C (xinfo2 <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '*** Timing the LAPACK reduction full -> tridiagonal ***' 'Print' '' 'Print' ' no update' 'Print' '' 'SYTRD' 'Rand' 0.0 'Lower' 200 200 0 0 1000000 0 'NoU' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 400 400 0 0 1000000 0 'NoU' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 600 600 0 0 1000000 0 'NoU' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 800 800 0 0 1000000 0 'NoU' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 1000 1000 0 0 1000000 0 'NoU' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' '' 'SYTRD' 'Rand' 0.0 'Lower' 200 200 0 0 1000000 0 'Upd' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 400 400 0 0 1000000 0 'Upd' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 600 600 0 0 1000000 0 'Upd' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 800 800 0 0 1000000 0 'Upd' 0 0 1000000 0 'Check' 10.0 10.0 10.0 'SYTRD' 'Rand' 0.0 'Lower' 1000 1000 0 0 1000000 0 'Upd' 0 0 1000000 0 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SYRDD : driver routine for the reduction full -> banded/tridiagonal C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : lda1 = leading dimension of the array a C 6 : b2 = (semi-)bandwidth of the reduced matrix B C 7 : lda2 = leading dimension of the array holding the banded matrix C 8 : nsteps = number of reduction steps C 9 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 10 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 11 : lwork = length of workspace for the reduction and accumulation C 12 : xinfo = expected info value for the routine syrdb C (xinfo <> 0 may be used for checking error exits) C C If nsteps > 1 then the second line contains the nstep-1 intermediate C bandwidths, and the third line contains the nsteps blocking factors for the C reduction steps. C If nsteps = 1 then the second line contains the blocking factor for the C reduction step (the line specifying intermediate bandwidths is missing). C If nsteps = 0 then no intermediate bandwidths or blocking factors are C specified (so both lines are missing). C C Parameters in the last line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '' 'Print' '*** Timing the SBR driver full -> tridiagonal ***' 'Print' '' 'Print' ' no update' 'Print' '' 'SYRDD' 'Rand' 0.0 'Upper' 200 200 1 2 0 0.0 'NoU' 1000000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 400 400 1 2 0 0.0 'NoU' 1000000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 600 600 1 2 0 0.0 'NoU' 1000000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 800 800 1 2 0 0.0 'NoU' 1000000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 1000 1000 1 2 0 0.0 'NoU' 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' '' 'SYRDD' 'Rand' 0.0 'Upper' 200 200 1 2 0 0.0 'Upd' 1000000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 400 400 1 2 0 0.0 'Upd' 1000000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 600 600 1 2 0 0.0 'Upd' 1000000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 800 800 1 2 0 0.0 'Upd' 1000000 1 'Check' 10.0 10.0 10.0 'SYRDD' 'Rand' 0.0 'Upper' 1000 1000 1 2 0 0.0 'Upd' 1000000 1 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBTRD : one-step reduction banded -> tridiagonal (LAPACK) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the banded matrix A C 6 : lda = leading dimension of the array a C 7 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 8 : ldu = leading dimension of the array u C 9 : xinfo = expected info value for the routine sbtrd C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '' 'Print' '*** Timing the LAPACK reduction banded -> tridiagonal ***' 'Print' '' 'Print' ' no update' 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 200 4 5 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 8 9 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 12 13 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 16 17 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 24 25 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 32 33 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 48 49 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 64 65 'NoU' 200 0 'Check' 10.0 10.0 10.0 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 400 4 5 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 8 9 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 12 13 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 16 17 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 24 25 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 32 33 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 48 49 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 64 65 'NoU' 400 0 'Check' 10.0 10.0 10.0 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 600 4 5 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 8 9 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 12 13 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 16 17 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 24 25 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 32 33 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 48 49 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 64 65 'NoU' 600 0 'Check' 10.0 10.0 10.0 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 800 4 5 'NoU' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 8 9 'NoU' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 12 13 'NoU' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 16 17 'NoU' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 24 25 'NoU' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 32 33 'NoU' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 48 49 'NoU' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 64 65 'NoU' 800 0 'Check' 10.0 10.0 10.0 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 1000 4 5 'NoU' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 8 9 'NoU' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 12 13 'NoU' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 16 17 'NoU' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 24 25 'NoU' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 32 33 'NoU' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 48 49 'NoU' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 64 65 'NoU' 1000 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 200 4 5 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 8 9 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 12 13 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 16 17 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 24 25 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 32 33 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 48 49 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 200 64 65 'Upd' 200 0 'Check' 10.0 10.0 10.0 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 400 4 5 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 8 9 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 12 13 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 16 17 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 24 25 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 32 33 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 48 49 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 400 64 65 'Upd' 400 0 'Check' 10.0 10.0 10.0 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 600 4 5 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 8 9 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 12 13 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 16 17 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 24 25 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 32 33 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 48 49 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 600 64 65 'Upd' 600 0 'Check' 10.0 10.0 10.0 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 800 4 5 'Upd' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 8 9 'Upd' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 12 13 'Upd' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 16 17 'Upd' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 24 25 'Upd' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 32 33 'Upd' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 48 49 'Upd' 800 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 800 64 65 'Upd' 800 0 'Check' 10.0 10.0 10.0 'Print' '' 'SBTRD' 'Rand' 0.0 'Lower' 1000 4 5 'Upd' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 8 9 'Upd' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 12 13 'Upd' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 16 17 'Upd' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 24 25 'Upd' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 32 33 'Upd' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 48 49 'Upd' 1000 0 'Check' 10.0 10.0 10.0 'SBTRD' 'Rand' 0.0 'Lower' 1000 64 65 'Upd' 1000 0 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBRDT : one-step reduction banded -> tridiagonal (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : n = dimension of the matrix A C 4 : b1 = (semi-)bandwidth of the matrix A C 5 : lda = leading dimension of the array a C 6 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 7 : nb = blocking factor for the reduction (nb=0 : use default) C 8 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 9 : ldu = leading dimension of the array u C 10 : lwork = length of workspace for the reduction and accumulation C 11 : xinfo = expected info value for the routine sbrdt C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '' 'Print' '*** Timing the SBR reduction banded -> tridiagonal ***' 'Print' '' 'Print' ' no update' 'Print' '' 'SBRDT' 'Rand' 0.0 200 4 8 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 12 24 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 24 48 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 48 96 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 64 128 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 400 4 8 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 12 24 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 24 48 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 48 96 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 64 128 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 600 4 8 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 12 24 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 24 48 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 48 96 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 64 128 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 800 4 8 0.0 0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 8 16 0.0 0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 12 24 0.0 0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 16 32 0.0 0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 24 48 0.0 0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 32 64 0.0 0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 48 96 0.0 0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 64 128 0.0 0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 1000 4 8 0.0 0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 8 16 0.0 0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 12 24 0.0 0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 16 32 0.0 0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 24 48 0.0 0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 32 64 0.0 0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 48 96 0.0 0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 64 128 0.0 0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' ' *** ignore messages about tests failing because ***' 'Print' ' *** SBRDT returned a wrong (but positive) info ***' 'Print' '' 'SBRDT' 'Rand' 0.0 200 4 8 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 12 24 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 24 48 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 48 96 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 64 128 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 400 4 8 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 12 24 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 24 48 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 48 96 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 64 128 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 600 4 8 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 12 24 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 24 48 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 48 96 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 64 128 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 800 4 8 0.0 0 'Upd' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 8 16 0.0 0 'Upd' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 12 24 0.0 0 'Upd' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 16 32 0.0 0 'Upd' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 24 48 0.0 0 'Upd' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 32 64 0.0 0 'Upd' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 48 96 0.0 0 'Upd' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 800 64 128 0.0 0 'Upd' 800 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 1000 4 8 0.0 0 'Upd' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 8 16 0.0 0 'Upd' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 12 24 0.0 0 'Upd' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 16 32 0.0 0 'Upd' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 24 48 0.0 0 'Upd' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 32 64 0.0 0 'Upd' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 48 96 0.0 0 'Upd' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 1000 64 128 0.0 0 'Upd' 1000 1000000 1 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBRDD : driver routine for the reduction banded -> banded/tridiagonal C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the matrix A C 6 : lda = leading dimension of the array a C 7 : b2 = (seim-)bandwidth of the reduced matrix B C 8 : nsteps = number of reduction steps C 9 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 10 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 11 : ldu = leading dimension of the array u C 12 : lwork = length of workspace for the reduction and accumulation C 13 : xinfo = expected info value for the routine syrdb C (xinfo <> 0 may be used for checking error exits) C C If nsteps > 1 then the second line contains the nstep-1 intermediate C bandwidths, and the third line contains the nsteps blocking factors for the C reduction steps. C If nsteps = 1 then the second line contains the blocking factor for the C reduction step (the line specifying intermediate bandwidths is missing). C If nsteps = 0 then no intermediate bandwidths or blocking factors are C specified (so both lines are missing). C C Parameters in the last line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '' 'Print' '*** Timing the SBR driver banded -> tridiagonal ***' 'Print' '' 'Print' ' no update' 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 200 4 8 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 8 16 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 12 24 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 16 32 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 24 48 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 48 96 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 400 4 8 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 8 16 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 12 24 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 16 32 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 24 48 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 48 96 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 600 4 8 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 8 16 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 12 24 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 16 32 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 24 48 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 48 96 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 800 4 8 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 8 16 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 12 24 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 16 32 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 24 48 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 32 64 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 48 96 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 64 128 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 1000 4 8 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 8 16 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 12 24 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 16 32 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 24 48 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 32 64 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 48 96 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 64 128 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 200 4 8 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 8 16 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 12 24 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 16 32 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 24 48 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 48 96 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 0 0.0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 400 4 8 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 8 16 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 12 24 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 16 32 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 24 48 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 48 96 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 0 0.0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 600 4 8 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 8 16 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 12 24 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 16 32 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 24 48 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 48 96 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 0 0.0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 800 4 8 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 8 16 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 12 24 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 16 32 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 24 48 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 32 64 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 48 96 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 800 64 128 1 0 0.0 'NoU' 800 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDD' 'Rand' 0.0 'Lower' 1000 4 8 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 8 16 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 12 24 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 16 32 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 24 48 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 32 64 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 48 96 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 'SBRDD' 'Rand' 0.0 'Lower' 1000 64 128 1 0 0.0 'NoU' 1000 1000000 1 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C --- quit --- 'Quit' C SHAR_EOF fi # end of overwriting check if test -f 'data3' then echo shar: will not over-write existing file "'data3'" else cat << "SHAR_EOF" > 'data3' C ----------------------------------------------------------------------------- C - - C - Default input file for tuning the SBR toolbox - C - - C ----------------------------------------------------------------------------- C C Author: Bruno Lang C Aachen University of Technology C na.blang@na-net.ornl.gov C Date: May 17, 2000 C Version: SBR Toolbox, Rev. 1.4.1 C C ----------------------------------------------------------------------------- C C For the format of the commands, see the file INCHK C C --- if you are in a hurry, uncomment the following two lines --- C'MaxDim' C400 C --- if you are in a real hurry, uncomment the following two lines --- 'MaxDim' 200 C --- if you want result checking, comment out the following line --- 'NoChecks' C ----------------------------------------------------------------------------- C C --- name of the output file --- C'FileName' C'OUTTUN1' C --- set output level --- 'OutputLevel' 2 C ------------------------------------------------------------------------------ C C SYRDB : one-step reduction full -> banded (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : lda = leading dimension of the array a C 6 : b2 = (semi-)bandwidth of the reduced matrix B C 7 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 8 : nb = blocking factor for the reduction (nb=0 : use default) C 9 : lwork1 = length of the workspace for the reduction C 10 : xinfo1 = expected info value for the routine syrdb C (xinfo1 <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : jobu = accumulate the transformations in a matrix U or not ? C jobu = 'O' : do the accumulation 'on the fly' in syrdb C = 'U' : do the accumulation after the reduction with C sygtr C jobu = 'N' : no accumulation C 2 : ldu = leading dimension of the array u C 3 : lwork2 = length of workspace for the accumulation with sygtr C 4 : xinfo2 = expected info value for the routine sygtr C (xinfo2 <> 0 may be used for checking error exits) C C Parameters in the fourth line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' or 'O' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' or 'O' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '*** Setting nb for SYRDB ***' 'Print' '' 'Print' ' no update' 'Print' '' 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 1 1000000 1 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 4 1000000 4 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 6 1000000 6 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 8 1000000 8 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 12 1000000 12 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 16 1000000 16 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 20 1000000 20 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 24 1000000 24 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 32 1000000 32 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 40 1000000 40 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 48 1000000 48 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 64 1000000 64 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 1 1000000 1 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 4 1000000 4 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 6 1000000 6 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 8 1000000 8 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 12 1000000 12 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 16 1000000 16 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 20 1000000 20 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 24 1000000 24 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 32 1000000 32 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 40 1000000 40 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 48 1000000 48 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 64 1000000 64 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 1 1000000 1 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 4 1000000 4 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 6 1000000 6 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 8 1000000 8 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 12 1000000 12 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 16 1000000 16 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 20 1000000 20 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 24 1000000 24 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 32 1000000 32 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 40 1000000 40 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 48 1000000 48 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 64 1000000 64 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' '' 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 1 1000000 1 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 4 1000000 4 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 6 1000000 6 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 8 1000000 8 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 12 1000000 12 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 16 1000000 16 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 20 1000000 20 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 24 1000000 24 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 32 1000000 32 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 40 1000000 40 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 48 1000000 48 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 200 200 64 0.0 64 1000000 64 'OnF' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 1 1000000 1 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 4 1000000 4 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 6 1000000 6 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 8 1000000 8 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 12 1000000 12 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 16 1000000 16 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 20 1000000 20 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 24 1000000 24 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 32 1000000 32 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 40 1000000 40 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 48 1000000 48 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 400 400 64 0.0 64 1000000 64 'OnF' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 1 1000000 1 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 4 1000000 4 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 6 1000000 6 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 8 1000000 8 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 12 1000000 12 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 16 1000000 16 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 20 1000000 20 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 24 1000000 24 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 32 1000000 32 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 40 1000000 40 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 48 1000000 48 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 'SYRDB' 'Rand' 0.0 'Lower' 600 600 64 0.0 64 1000000 64 'OnF' 600 1000000 1 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBRDB : one-step reduction banded -> banded (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : n = dimension of the matrix A C 4 : b1 = (semi-)bandwidth of the matrix A C 5 : lda = leading dimension of the array a C 6 : b2 = (semi-)bandwidth of the reduced matrix B C 7 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 8 : nb = blocking factor for the reduction (nb=0 : use default) C 9 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 10 : ldu = leading dimension of the array u C 11 : lwork = length of workspace for the reduction and accumulation C 12 : xinfo = expected info value for the routine sbrdb C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '' 'Print' '*** Setting nb for SBRDB ***' 'Print' '' 'Print' ' no update' 'Print' '' 'SBRDB' 'Rand' 0.0 200 16 32 8 0.0 1 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 16 32 8 0.0 4 'NoU' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 16 32 8 0.0 6 'NoU' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 16 32 8 0.0 8 'NoU' 200 1000000 8 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 1 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 4 'NoU' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 6 'NoU' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 8 'NoU' 200 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 10 'NoU' 200 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 12 'NoU' 200 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 16 'NoU' 200 1000000 16 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 1 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 4 'NoU' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 6 'NoU' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 8 'NoU' 200 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 10 'NoU' 200 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 12 'NoU' 200 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 16 'NoU' 200 1000000 16 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 20 'NoU' 200 1000000 20 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 24 'NoU' 200 1000000 24 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 32 'NoU' 200 1000000 32 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 400 16 32 8 0.0 1 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 16 32 8 0.0 4 'NoU' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 16 32 8 0.0 6 'NoU' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 16 32 8 0.0 8 'NoU' 400 1000000 8 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 1 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 4 'NoU' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 6 'NoU' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 8 'NoU' 400 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 10 'NoU' 400 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 12 'NoU' 400 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 16 'NoU' 400 1000000 16 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 1 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 4 'NoU' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 6 'NoU' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 8 'NoU' 400 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 10 'NoU' 400 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 12 'NoU' 400 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 16 'NoU' 400 1000000 16 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 20 'NoU' 400 1000000 20 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 24 'NoU' 400 1000000 24 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 32 'NoU' 400 1000000 32 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 600 16 32 8 0.0 1 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 16 32 8 0.0 4 'NoU' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 16 32 8 0.0 6 'NoU' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 16 32 8 0.0 8 'NoU' 600 1000000 8 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 1 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 4 'NoU' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 6 'NoU' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 8 'NoU' 600 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 10 'NoU' 600 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 12 'NoU' 600 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 16 'NoU' 600 1000000 16 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 1 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 4 'NoU' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 6 'NoU' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 8 'NoU' 600 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 10 'NoU' 600 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 12 'NoU' 600 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 16 'NoU' 600 1000000 16 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 20 'NoU' 600 1000000 20 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 24 'NoU' 600 1000000 24 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 32 'NoU' 600 1000000 32 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' '' 'SBRDB' 'Rand' 0.0 200 16 32 8 0.0 1 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 16 32 8 0.0 4 'Upd' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 16 32 8 0.0 6 'Upd' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 16 32 8 0.0 8 'Upd' 200 1000000 8 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 1 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 4 'Upd' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 6 'Upd' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 8 'Upd' 200 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 10 'Upd' 200 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 12 'Upd' 200 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 32 64 16 0.0 16 'Upd' 200 1000000 16 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 1 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 4 'Upd' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 6 'Upd' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 8 'Upd' 200 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 10 'Upd' 200 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 12 'Upd' 200 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 16 'Upd' 200 1000000 16 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 20 'Upd' 200 1000000 20 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 24 'Upd' 200 1000000 24 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 200 64 128 32 0.0 32 'Upd' 200 1000000 32 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 400 16 32 8 0.0 1 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 16 32 8 0.0 4 'Upd' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 16 32 8 0.0 6 'Upd' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 16 32 8 0.0 8 'Upd' 400 1000000 8 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 1 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 4 'Upd' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 6 'Upd' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 8 'Upd' 400 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 10 'Upd' 400 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 12 'Upd' 400 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 32 64 16 0.0 16 'Upd' 400 1000000 16 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 1 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 4 'Upd' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 6 'Upd' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 8 'Upd' 400 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 10 'Upd' 400 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 12 'Upd' 400 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 16 'Upd' 400 1000000 16 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 20 'Upd' 400 1000000 20 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 24 'Upd' 400 1000000 24 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 400 64 128 32 0.0 32 'Upd' 400 1000000 32 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 600 16 32 8 0.0 1 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 16 32 8 0.0 4 'Upd' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 16 32 8 0.0 6 'Upd' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 16 32 8 0.0 8 'Upd' 600 1000000 8 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 1 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 4 'Upd' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 6 'Upd' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 8 'Upd' 600 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 10 'Upd' 600 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 12 'Upd' 600 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 32 64 16 0.0 16 'Upd' 600 1000000 16 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 1 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 4 'Upd' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 6 'Upd' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 8 'Upd' 600 1000000 8 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 10 'Upd' 600 1000000 10 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 12 'Upd' 600 1000000 12 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 16 'Upd' 600 1000000 16 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 20 'Upd' 600 1000000 20 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 24 'Upd' 600 1000000 24 'Check' 10.0 10.0 10.0 'SBRDB' 'Rand' 0.0 600 64 128 32 0.0 32 'Upd' 600 1000000 32 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBRDT : one-step reduction banded -> tridiagonal (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : n = dimension of the matrix A C 4 : b1 = (semi-)bandwidth of the matrix A C 5 : lda = leading dimension of the array a C 6 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 7 : nb = blocking factor for the reduction (nb=0 : use default) C 8 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 9 : ldu = leading dimension of the array u C 10 : lwork = length of workspace for the reduction and accumulation C 11 : xinfo = expected info value for the routine sbrdt C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '' 'Print' '*** Setting nb for SBRDT ***' 'Print' '' 'Print' ' with update' 'Print' '' 'SBRDT' 'Rand' 0.0 200 8 16 0.0 1 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 4 'Upd' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 6 'Upd' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 8 'Upd' 200 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 10 'Upd' 200 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 12 'Upd' 200 1000000 12 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 200 16 32 0.0 1 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 4 'Upd' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 6 'Upd' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 8 'Upd' 200 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 10 'Upd' 200 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 12 'Upd' 200 1000000 12 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 16 'Upd' 200 1000000 16 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 20 'Upd' 200 1000000 20 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 24 'Upd' 200 1000000 24 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 200 32 64 0.0 1 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 4 'Upd' 200 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 6 'Upd' 200 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 8 'Upd' 200 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 10 'Upd' 200 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 12 'Upd' 200 1000000 12 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 16 'Upd' 200 1000000 16 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 20 'Upd' 200 1000000 20 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 32 'Upd' 200 1000000 32 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 40 'Upd' 200 1000000 40 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 400 8 16 0.0 1 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 4 'Upd' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 6 'Upd' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 8 'Upd' 400 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 10 'Upd' 400 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 12 'Upd' 400 1000000 12 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 400 16 32 0.0 1 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 4 'Upd' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 6 'Upd' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 8 'Upd' 400 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 10 'Upd' 400 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 12 'Upd' 400 1000000 12 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 16 'Upd' 400 1000000 16 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 20 'Upd' 400 1000000 20 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 24 'Upd' 400 1000000 24 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 400 32 64 0.0 1 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 4 'Upd' 400 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 6 'Upd' 400 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 8 'Upd' 400 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 10 'Upd' 400 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 12 'Upd' 400 1000000 12 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 16 'Upd' 400 1000000 16 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 20 'Upd' 400 1000000 20 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 32 'Upd' 400 1000000 32 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 40 'Upd' 400 1000000 40 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 600 8 16 0.0 1 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 4 'Upd' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 6 'Upd' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 8 'Upd' 600 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 10 'Upd' 600 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 12 'Upd' 600 1000000 12 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 600 16 32 0.0 1 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 4 'Upd' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 6 'Upd' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 8 'Upd' 600 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 10 'Upd' 600 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 12 'Upd' 600 1000000 12 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 16 'Upd' 600 1000000 16 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 20 'Upd' 600 1000000 20 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 24 'Upd' 600 1000000 24 'Check' 10.0 10.0 10.0 'Print' '' 'SBRDT' 'Rand' 0.0 600 32 64 0.0 1 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 4 'Upd' 600 1000000 4 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 6 'Upd' 600 1000000 6 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 8 'Upd' 600 1000000 8 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 10 'Upd' 600 1000000 10 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 12 'Upd' 600 1000000 12 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 16 'Upd' 600 1000000 16 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 20 'Upd' 600 1000000 20 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 32 'Upd' 600 1000000 32 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 40 'Upd' 600 1000000 40 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C --- quit --- 'Quit' C SHAR_EOF fi # end of overwriting check if test -f 'data4' then echo shar: will not over-write existing file "'data4'" else cat << "SHAR_EOF" > 'data4' C ----------------------------------------------------------------------------- C - - C - Default input file for tuning the SBR toolbox - C - - C ----------------------------------------------------------------------------- C C Author: Bruno Lang C Aachen University of Technology C na.blang@na-net.ornl.gov C Date: May 17, 2000 C Version: SBR Toolbox, Rev. 1.4.1 C C ----------------------------------------------------------------------------- C C For the format of the commands, see the file INCHK C C --- if you are in a hurry, uncomment the following two lines --- C'MaxDim' C400 C --- if you are in a real hurry, uncomment the following two lines --- 'MaxDim' 200 C --- if you want result checking, comment out the following line --- 'NoChecks' C ----------------------------------------------------------------------------- C C --- name of the output file --- C'FileName' C'OUTTUN2' C --- set output level --- 'OutputLevel' 2 C ------------------------------------------------------------------------------ C C SYRDD : driver routine for the reduction full -> banded/tridiagonal C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : lda1 = leading dimension of the array a C 6 : b2 = (semi-)bandwidth of the reduced matrix B C 7 : lda2 = leading dimension of the array holding the banded matrix C 8 : nsteps = number of reduction steps C 9 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 10 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 11 : lwork = length of workspace for the reduction and accumulation C 12 : xinfo = expected info value for the routine syrdb C (xinfo <> 0 may be used for checking error exits) C C If nsteps > 1 then the second line contains the nstep-1 intermediate C bandwidths, and the third line contains the nsteps blocking factors for the C reduction steps. C If nsteps = 1 then the second line contains the blocking factor for the C reduction step (the line specifying intermediate bandwidths is missing). C If nsteps = 0 then no intermediate bandwidths or blocking factors are C specified (so both lines are missing). C C Parameters in the last line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '*** Setting intermediate bandwidth for SYRDD ***' 'Print' '' 'Print' ' no update' 'Print' '' 'Print' 'one-step (b=1):' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 2 1 0.0 'NoU' 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 24 2 0.0 'NoU' 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 32 2 0.0 'NoU' 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=20:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 40 2 0.0 'NoU' 1000000 1 20 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 48 2 0.0 'NoU' 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 64 2 0.0 'NoU' 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=40:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 80 2 0.0 'NoU' 1000000 1 40 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 96 2 0.0 'NoU' 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 128 2 0.0 'NoU' 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 2 1 0.0 'NoU' 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 24 2 0.0 'NoU' 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 32 2 0.0 'NoU' 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=20:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 40 2 0.0 'NoU' 1000000 1 20 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 48 2 0.0 'NoU' 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 64 2 0.0 'NoU' 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=40:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 80 2 0.0 'NoU' 1000000 1 40 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 96 2 0.0 'NoU' 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 128 2 0.0 'NoU' 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 2 1 0.0 'NoU' 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 24 2 0.0 'NoU' 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 32 2 0.0 'NoU' 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=20:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 40 2 0.0 'NoU' 1000000 1 20 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 48 2 0.0 'NoU' 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 64 2 0.0 'NoU' 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=40:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 80 2 0.0 'NoU' 1000000 1 40 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 96 2 0.0 'NoU' 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 128 2 0.0 'NoU' 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' '' 'Print' 'one-step (b=1):' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 2 1 0.0 'Upd' 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 24 2 0.0 'Upd' 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 32 2 0.0 'Upd' 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=20:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 40 2 0.0 'Upd' 1000000 1 20 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 48 2 0.0 'Upd' 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 64 2 0.0 'Upd' 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=40:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 80 2 0.0 'Upd' 1000000 1 40 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 96 2 0.0 'Upd' 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SYRDD' 'Rand' 0.0 'Lower' 200 200 1 128 2 0.0 'Upd' 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 2 1 0.0 'Upd' 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 24 2 0.0 'Upd' 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 32 2 0.0 'Upd' 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=20:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 40 2 0.0 'Upd' 1000000 1 20 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 48 2 0.0 'Upd' 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 64 2 0.0 'Upd' 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=40:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 80 2 0.0 'Upd' 1000000 1 40 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 96 2 0.0 'Upd' 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SYRDD' 'Rand' 0.0 'Lower' 400 400 1 128 2 0.0 'Upd' 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 2 1 0.0 'Upd' 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 24 2 0.0 'Upd' 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 32 2 0.0 'Upd' 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=20:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 40 2 0.0 'Upd' 1000000 1 20 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 48 2 0.0 'Upd' 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 64 2 0.0 'Upd' 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=40:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 80 2 0.0 'Upd' 1000000 1 40 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 96 2 0.0 'Upd' 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SYRDD' 'Rand' 0.0 'Lower' 600 600 1 128 2 0.0 'Upd' 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBRDD : driver routine for the reduction banded -> banded/tridiagonal C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the matrix A C 6 : lda = leading dimension of the array a C 7 : b2 = (seim-)bandwidth of the reduced matrix B C 8 : nsteps = number of reduction steps C 9 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 10 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 11 : ldu = leading dimension of the array u C 12 : lwork = length of workspace for the reduction and accumulation C 13 : xinfo = expected info value for the routine syrdb C (xinfo <> 0 may be used for checking error exits) C C If nsteps > 1 then the second line contains the nstep-1 intermediate C bandwidths, and the third line contains the nsteps blocking factors for the C reduction steps. C If nsteps = 1 then the second line contains the blocking factor for the C reduction step (the line specifying intermediate bandwidths is missing). C If nsteps = 0 then no intermediate bandwidths or blocking factors are C specified (so both lines are missing). C C Parameters in the last line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '' 'Print' '*** Setting intermediate bandwidth for SBRDD ***' 'Print' '' 'Print' ' no update' 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 1 0.0 'NoU' 200 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 2 0.0 'NoU' 200 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 2 0.0 'NoU' 200 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 2 0.0 'NoU' 200 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 2 0.0 'NoU' 200 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 1 0.0 'NoU' 200 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'NoU' 200 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'NoU' 200 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'NoU' 200 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'NoU' 200 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'NoU' 200 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'NoU' 200 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 1 0.0 'NoU' 200 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'NoU' 200 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'NoU' 200 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'NoU' 200 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'NoU' 200 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'NoU' 200 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'NoU' 200 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'NoU' 200 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 1 0.0 'NoU' 400 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 2 0.0 'NoU' 400 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 2 0.0 'NoU' 400 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 2 0.0 'NoU' 400 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 2 0.0 'NoU' 400 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 1 0.0 'NoU' 400 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'NoU' 400 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'NoU' 400 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'NoU' 400 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'NoU' 400 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'NoU' 400 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'NoU' 400 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 1 0.0 'NoU' 400 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'NoU' 400 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'NoU' 400 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'NoU' 400 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'NoU' 400 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'NoU' 400 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'NoU' 400 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'NoU' 400 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 1 0.0 'NoU' 600 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 2 0.0 'NoU' 600 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 2 0.0 'NoU' 600 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 2 0.0 'NoU' 600 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 2 0.0 'NoU' 600 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 1 0.0 'NoU' 600 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'NoU' 600 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'NoU' 600 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'NoU' 600 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'NoU' 600 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'NoU' 600 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'NoU' 600 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 1 0.0 'NoU' 600 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'NoU' 600 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'NoU' 600 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'NoU' 600 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'NoU' 600 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'NoU' 600 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'NoU' 600 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'NoU' 600 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 1 0.0 'Upd' 200 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 2 0.0 'Upd' 200 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 2 0.0 'Upd' 200 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 2 0.0 'Upd' 200 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 200 32 64 1 2 0.0 'Upd' 200 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 1 0.0 'Upd' 200 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'Upd' 200 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'Upd' 200 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'Upd' 200 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'Upd' 200 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'Upd' 200 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 200 64 128 1 2 0.0 'Upd' 200 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 1 0.0 'Upd' 200 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'Upd' 200 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'Upd' 200 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'Upd' 200 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'Upd' 200 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'Upd' 200 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'Upd' 200 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SBRDD' 'Rand' 0.0 'Lower' 200 96 192 1 2 0.0 'Upd' 200 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 1 0.0 'Upd' 400 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 2 0.0 'Upd' 400 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 2 0.0 'Upd' 400 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 2 0.0 'Upd' 400 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 400 32 64 1 2 0.0 'Upd' 400 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 1 0.0 'Upd' 400 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'Upd' 400 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'Upd' 400 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'Upd' 400 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'Upd' 400 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'Upd' 400 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 400 64 128 1 2 0.0 'Upd' 400 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 1 0.0 'Upd' 400 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'Upd' 400 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'Upd' 400 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'Upd' 400 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'Upd' 400 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'Upd' 400 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'Upd' 400 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SBRDD' 'Rand' 0.0 'Lower' 400 96 192 1 2 0.0 'Upd' 400 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 1 0.0 'Upd' 600 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 2 0.0 'Upd' 600 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 2 0.0 'Upd' 600 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 2 0.0 'Upd' 600 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 600 32 64 1 2 0.0 'Upd' 600 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 1 0.0 'Upd' 600 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'Upd' 600 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'Upd' 600 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'Upd' 600 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'Upd' 600 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'Upd' 600 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 600 64 128 1 2 0.0 'Upd' 600 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'one-step (b=1):' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 1 0.0 'Upd' 600 1000000 1 0 'Check' 10.0 10.0 10.0 'Print' 'b=8:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'Upd' 600 1000000 1 8 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=12:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'Upd' 600 1000000 1 12 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=16:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'Upd' 600 1000000 1 16 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=24:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'Upd' 600 1000000 1 24 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=32:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'Upd' 600 1000000 1 32 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=48:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'Upd' 600 1000000 1 48 0 0 'Check' 10.0 10.0 10.0 'Print' 'b=64:' 'SBRDD' 'Rand' 0.0 'Lower' 600 96 192 1 2 0.0 'Upd' 600 1000000 1 64 0 0 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C SBTRD : one-step reduction banded -> tridiagonal (LAPACK) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : uplo = use upper (uplo='U') or lower triangle (uplo='L') of the C matrix A ? C 4 : n = dimension of the matrix A C 5 : b1 = (semi-)bandwidth of the banded matrix A C 6 : lda = leading dimension of the array a C 7 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 8 : ldu = leading dimension of the array u C 9 : xinfo = expected info value for the routine sbtrd C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ C C SBRDT : one-step reduction banded -> tridiagonal (SBR) C C Parameters in the second line: C 1 : mtype = matrix type (mtype='R' : random, mtype='I' : isda) C 2 : diam = diameter of the eigenvalue clusters (in multiples of macheps; C used only if mtype='I' C 3 : n = dimension of the matrix A C 4 : b1 = (semi-)bandwidth of the matrix A C 5 : lda = leading dimension of the array a C 6 : drptol = threshold for dropping Householder transforms (in multiples C of macheps) C 7 : nb = blocking factor for the reduction (nb=0 : use default) C 8 : jobu = accumulate the transformations in a matrix U (jobu='U') or C not (jobu='N') ? C 9 : ldu = leading dimension of the array u C 10 : lwork = length of workspace for the reduction and accumulation C 11 : xinfo = expected info value for the routine sbrdt C (xinfo <> 0 may be used for checking error exits) C C Parameters in the third line: C 1 : check = check the results (check='C') or not (check='N') ? C 2 : torthu = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps); C used only if check='C' and jobu='U' C 3 : tres = threshold for the residual error F-norm( U * A - B * U ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='U' C 4 : tdevls = threshold for the orthogonality error F-norm( U' * U - I ) C (in multiples of n * macheps * F-norm( A )); C used only if check='C' and jobu='N' C C ------------------------------------------------------------------------------ 'Print' '' 'Print' '*** Where to switch from SYTRD to SYRDT ? ***' 'Print' '' 'Print' ' no update' 'Print' '' 'Print' 'b=4' 'SBTRD' 'Rand' 0.0 'Lower' 200 4 5 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 4 8 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=6' 'SBTRD' 'Rand' 0.0 'Lower' 200 6 7 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 6 12 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=8' 'SBTRD' 'Rand' 0.0 'Lower' 200 8 9 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=10' 'SBTRD' 'Rand' 0.0 'Lower' 200 10 11 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 10 20 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=12' 'SBTRD' 'Rand' 0.0 'Lower' 200 12 13 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 12 24 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=16' 'SBTRD' 'Rand' 0.0 'Lower' 200 16 17 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=20' 'SBTRD' 'Rand' 0.0 'Lower' 200 20 21 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 20 40 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=24' 'SBTRD' 'Rand' 0.0 'Lower' 200 24 25 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 24 48 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=32' 'SBTRD' 'Rand' 0.0 'Lower' 200 32 33 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=40' 'SBTRD' 'Rand' 0.0 'Lower' 200 40 41 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 40 80 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=48' 'SBTRD' 'Rand' 0.0 'Lower' 200 48 49 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 48 96 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=64' 'SBTRD' 'Rand' 0.0 'Lower' 200 64 65 'NoU' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 64 128 0.0 0 'NoU' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'b=4' 'SBTRD' 'Rand' 0.0 'Lower' 400 4 5 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 4 8 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=6' 'SBTRD' 'Rand' 0.0 'Lower' 400 6 7 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 6 12 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=8' 'SBTRD' 'Rand' 0.0 'Lower' 400 8 9 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=10' 'SBTRD' 'Rand' 0.0 'Lower' 400 10 11 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 10 20 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=12' 'SBTRD' 'Rand' 0.0 'Lower' 400 12 13 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 12 24 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=16' 'SBTRD' 'Rand' 0.0 'Lower' 400 16 17 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=20' 'SBTRD' 'Rand' 0.0 'Lower' 400 20 21 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 20 40 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=24' 'SBTRD' 'Rand' 0.0 'Lower' 400 24 25 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 24 48 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=32' 'SBTRD' 'Rand' 0.0 'Lower' 400 32 33 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=40' 'SBTRD' 'Rand' 0.0 'Lower' 400 40 41 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 40 80 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=48' 'SBTRD' 'Rand' 0.0 'Lower' 400 48 49 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 48 96 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=64' 'SBTRD' 'Rand' 0.0 'Lower' 400 64 65 'NoU' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 64 128 0.0 0 'NoU' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'b=4' 'SBTRD' 'Rand' 0.0 'Lower' 600 4 5 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 4 8 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=6' 'SBTRD' 'Rand' 0.0 'Lower' 600 6 7 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 6 12 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=8' 'SBTRD' 'Rand' 0.0 'Lower' 600 8 9 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=10' 'SBTRD' 'Rand' 0.0 'Lower' 600 10 11 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 10 20 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=12' 'SBTRD' 'Rand' 0.0 'Lower' 600 12 13 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 12 24 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=16' 'SBTRD' 'Rand' 0.0 'Lower' 600 16 17 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=20' 'SBTRD' 'Rand' 0.0 'Lower' 600 20 21 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 20 40 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=24' 'SBTRD' 'Rand' 0.0 'Lower' 600 24 25 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 24 48 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=32' 'SBTRD' 'Rand' 0.0 'Lower' 600 32 33 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=40' 'SBTRD' 'Rand' 0.0 'Lower' 600 40 41 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 40 80 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=48' 'SBTRD' 'Rand' 0.0 'Lower' 600 48 49 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 48 96 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=64' 'SBTRD' 'Rand' 0.0 'Lower' 600 64 65 'NoU' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 64 128 0.0 0 'NoU' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' ' with update' 'Print' ' *** ignore messages about tests failing because ***' 'Print' ' *** SBRDT returned a wrong (but positive) info ***' 'Print' '' 'Print' 'b=4' 'SBTRD' 'Rand' 0.0 'Lower' 200 4 5 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 4 8 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=6' 'SBTRD' 'Rand' 0.0 'Lower' 200 6 7 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 6 12 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=8' 'SBTRD' 'Rand' 0.0 'Lower' 200 8 9 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 8 16 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=10' 'SBTRD' 'Rand' 0.0 'Lower' 200 10 11 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 10 20 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=12' 'SBTRD' 'Rand' 0.0 'Lower' 200 12 13 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 12 24 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=16' 'SBTRD' 'Rand' 0.0 'Lower' 200 16 17 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 16 32 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=20' 'SBTRD' 'Rand' 0.0 'Lower' 200 20 21 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 20 40 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=24' 'SBTRD' 'Rand' 0.0 'Lower' 200 24 25 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 24 48 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=32' 'SBTRD' 'Rand' 0.0 'Lower' 200 32 33 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 32 64 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=40' 'SBTRD' 'Rand' 0.0 'Lower' 200 40 41 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 40 80 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=48' 'SBTRD' 'Rand' 0.0 'Lower' 200 48 49 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 48 96 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=64' 'SBTRD' 'Rand' 0.0 'Lower' 200 64 65 'Upd' 200 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 200 64 128 0.0 0 'Upd' 200 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'b=4' 'SBTRD' 'Rand' 0.0 'Lower' 400 4 5 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 4 8 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=6' 'SBTRD' 'Rand' 0.0 'Lower' 400 6 7 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 6 12 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=8' 'SBTRD' 'Rand' 0.0 'Lower' 400 8 9 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 8 16 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=10' 'SBTRD' 'Rand' 0.0 'Lower' 400 10 11 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 10 20 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=12' 'SBTRD' 'Rand' 0.0 'Lower' 400 12 13 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 12 24 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=16' 'SBTRD' 'Rand' 0.0 'Lower' 400 16 17 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 16 32 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=20' 'SBTRD' 'Rand' 0.0 'Lower' 400 20 21 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 20 40 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=24' 'SBTRD' 'Rand' 0.0 'Lower' 400 24 25 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 24 48 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=32' 'SBTRD' 'Rand' 0.0 'Lower' 400 32 33 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 32 64 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=40' 'SBTRD' 'Rand' 0.0 'Lower' 400 40 41 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 40 80 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=48' 'SBTRD' 'Rand' 0.0 'Lower' 400 48 49 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 48 96 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=64' 'SBTRD' 'Rand' 0.0 'Lower' 400 64 65 'Upd' 400 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 400 64 128 0.0 0 'Upd' 400 1000000 1 'Check' 10.0 10.0 10.0 'Print' '' 'Print' 'b=4' 'SBTRD' 'Rand' 0.0 'Lower' 600 4 5 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 4 8 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=6' 'SBTRD' 'Rand' 0.0 'Lower' 600 6 7 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 6 12 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=8' 'SBTRD' 'Rand' 0.0 'Lower' 600 8 9 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 8 16 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=10' 'SBTRD' 'Rand' 0.0 'Lower' 600 10 11 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 10 20 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=12' 'SBTRD' 'Rand' 0.0 'Lower' 600 12 13 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 12 24 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=16' 'SBTRD' 'Rand' 0.0 'Lower' 600 16 17 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 16 32 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=20' 'SBTRD' 'Rand' 0.0 'Lower' 600 20 21 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 20 40 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=24' 'SBTRD' 'Rand' 0.0 'Lower' 600 24 25 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 24 48 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=32' 'SBTRD' 'Rand' 0.0 'Lower' 600 32 33 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 32 64 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=40' 'SBTRD' 'Rand' 0.0 'Lower' 600 40 41 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 40 80 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=48' 'SBTRD' 'Rand' 0.0 'Lower' 600 48 49 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 48 96 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 'Print' 'b=64' 'SBTRD' 'Rand' 0.0 'Lower' 600 64 65 'Upd' 600 0 'Check' 10.0 10.0 10.0 'SBRDT' 'Rand' 0.0 600 64 128 0.0 0 'Upd' 600 1000000 1 'Check' 10.0 10.0 10.0 C ------------------------------------------------------------------------------ C C --- quit --- 'Quit' C SHAR_EOF fi # end of overwriting check if test -f 'driver.f' then echo shar: will not over-write existing file "'driver.f'" else cat << "SHAR_EOF" > 'driver.f' SUBROUTINE SORQLX( NB0, NX0, > M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) C SUBROUTINE DORGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) * * -- LAPACK routine (version 3.0) -- * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., * Courant Institute, Argonne National Lab, and Rice University * June 30, 1999 * * .. Scalar Arguments .. INTEGER NB0, NX0, INFO, K, LDA, LWORK, M, N * .. * .. Array Arguments .. REAL A( LDA, * ), TAU( * ), WORK( * ) C DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) * .. * * Purpose * ======= * * sORQLx generates an M-by-N real matrix Q with orthonormal columns, C* 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 * ========= * * nb0 (input) integer * The blocking factor. * * nx0 (input) integer * The cross-over point for the nonblocked algorithm. * * 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) C* 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) real array, dimension (K) C* 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) real array, dimension (LWORK) C* WORK (workspace/output) DOUBLE PRECISION array, dimension (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 C DOUBLE PRECISION ZERO PARAMETER ( ZERO = 0.0E+0 ) C 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 SLARFB, SLARFT, SORG2L, XERBLA C EXTERNAL DLARFB, DLARFT, DORG2L, XERBLA * .. * .. Intrinsic Functions .. INTRINSIC MAX, MIN * .. * .. External Functions .. INTEGER ILAENV EXTERNAL ILAENV * .. * .. Executable Statements .. * * Test the input arguments * INFO = 0 IF ( NB0 .GT. 0 ) THEN NB = NB0 ELSE NB = ILAENV( 1, 'sORGQL', ' ', M, N, K, -1 ) ENDIF C NB = ILAENV( 1, 'DORGQL', ' ', 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( 'sORGQL', -INFO ) C CALL XERBLA( 'DORGQL', -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. * IF ( NX0 .GT. 0 ) THEN NX = NX0 ELSE NX = MAX( 0, ILAENV( 3, 'sORGQL', ' ', M, N, K, -1 ) ) ENDIF C 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 = 2 C 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 SORG2L( M-KK, N-KK, K-KK, A, LDA, TAU, WORK, IINFO ) C 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 SLARFT( 'Backward', 'Columnwise', M-K+I+IB-1, IB, $ A( 1, N-K+I ), LDA, TAU( I ), WORK, LDWORK ) C CALL DLARFT( 'Backward', 'Columnwise', M-K+I+IB-1, IB, C $ 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 ) C CALL DLARFB( 'Left', 'No transpose', 'Backward', C $ 'Columnwise', M-K+I+IB-1, N-K+I-1, IB, C $ A( 1, N-K+I ), LDA, WORK, LDWORK, A, LDA, C $ 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 ) C CALL DORG2L( M-K+I+IB-1, IB, IB, A( 1, N-K+I ), LDA, C $ 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 sORQLx C* End of DORGQL * END SUBROUTINE SORQRX( NB0, NX0, > M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) C SUBROUTINE DORGQR( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) * * -- LAPACK routine (version 3.0) -- * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., * Courant Institute, Argonne National Lab, and Rice University * June 30, 1999 * * .. Scalar Arguments .. INTEGER NB0, NX0, INFO, K, LDA, LWORK, M, N C INTEGER INFO, K, LDA, LWORK, M, N * .. * .. Array Arguments .. REAL A( LDA, * ), TAU( * ), WORK( * ) C DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) * .. * * Purpose * ======= * * sORQRx generates an M-by-N real matrix Q with orthonormal columns, C* 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 sGEQRF. C* as returned by DGEQRF. * * Arguments * ========= * * nb0 (input) integer * The blocking factor. * * nx0 (input) integer * The cross-over point for the non-blocked algorithm. * * 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) C* 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 sGEQRF in the first k columns of its array C* 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) real array, dimension (K) C* TAU (input) DOUBLE PRECISION array, dimension (K) * TAU(i) must contain the scalar factor of the elementary * reflector H(i), as returned by sGEQRF. C* reflector H(i), as returned by DGEQRF. * * WORK (workspace/output) real array, dimension (LWORK) C* WORK (workspace/output) DOUBLE PRECISION array, dimension (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 C DOUBLE PRECISION ZERO PARAMETER ( ZERO = 0.0E+0 ) C 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 SLARFB, SLARFT, SORG2R, XERBLA C EXTERNAL DLARFB, DLARFT, DORG2R, XERBLA * .. * .. Intrinsic Functions .. INTRINSIC MAX, MIN * .. * .. External Functions .. INTEGER ILAENV EXTERNAL ILAENV * .. * .. Executable Statements .. * * Test the input arguments * INFO = 0 IF ( NB0 .GT. 0 ) THEN NB = NB0 ELSE NB = ILAENV( 1, 'sORGQR', ' ', M, N, K, -1 ) ENDIF C 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( 'sORGQR', -INFO ) C 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. * IF ( NX0 .GT. 0 ) THEN NX = NX0 ELSE NX = MAX( 0, ILAENV( 3, 'sORGQR', ' ', M, N, K, -1 ) ) ENDIF C 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 = 2 C 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 SORG2R( M-KK, N-KK, K-KK, A( KK+1, KK+1 ), LDA, $ TAU( KK+1 ), WORK, IINFO ) C $ CALL DORG2R( M-KK, N-KK, K-KK, A( KK+1, KK+1 ), LDA, C $ 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 ) C CALL DLARFT( 'Forward', 'Columnwise', M-I+1, IB, C $ 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 ) C CALL DLARFB( 'Left', 'No transpose', 'Forward', C $ 'Columnwise', M-I+1, N-I-IB+1, IB, C $ A( I, I ), LDA, WORK, LDWORK, A( I, I+IB ), C $ 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 ) C CALL DORG2R( M-I+1, IB, IB, A( I, I ), LDA, TAU( I ), WORK, C $ 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 sORQRx C* End of DORGQR * END SUBROUTINE SORGTX( NB0, NX0, > UPLO, N, A, LDA, TAU, WORK, LWORK, INFO ) C SUBROUTINE DORGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO ) * * -- LAPACK routine (version 3.0) -- * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., * Courant Institute, Argonne National Lab, and Rice University * June 30, 1999 * * .. Scalar Arguments .. CHARACTER UPLO INTEGER NB0, NX0, INFO, LDA, LWORK, N C INTEGER INFO, LDA, LWORK, N * .. * .. Array Arguments .. REAL A( LDA, * ), TAU( * ), WORK( * ) C DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) * .. * * Purpose * ======= * * sORGTx generates a real orthogonal matrix Q which is defined as the C* DORGTR generates a real orthogonal matrix Q which is defined as the * product of n-1 elementary reflectors of order N, as returned by * sSYTRD: C* DSYTRD: * * if UPLO = 'U', Q = H(n-1) . . . H(2) H(1), * * if UPLO = 'L', Q = H(1) H(2) . . . H(n-1). * * Arguments * ========= * * nb0 (input) integer * The blocking factor. * * nx0 (input) integer * The cross-over point for the nonblocked algorithm. * * UPLO (input) CHARACTER*1 * = 'U': Upper triangle of A contains elementary reflectors * from sSYTRD; C* from DSYTRD; * = 'L': Lower triangle of A contains elementary reflectors * from sSYTRD. C* from DSYTRD. * * N (input) INTEGER * The order of the matrix Q. N >= 0. * * A (input/output) sPreicision array, dimension (LDA,N) C* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) * On entry, the vectors which define the elementary reflectors, * as returned by sSYTRD. C* 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) sPreicision array, dimension (N-1) C* TAU (input) DOUBLE PRECISION array, dimension (N-1) * TAU(i) must contain the scalar factor of the elementary * reflector H(i), as returned by sSYTRD. C* reflector H(i), as returned by DSYTRD. * * WORK (workspace/output) real array, dimension (LWORK) C* WORK (workspace/output) DOUBLE PRECISION array, dimension (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 C DOUBLE PRECISION ZERO, ONE PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0 ) C 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 SORQLX, SORQRX, XERBLA C 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 IF ( NB0 .GT. 0 ) THEN NB = NB0 ELSE NB = ILAENV( 1, 'sORGQL', ' ', N-1, N-1, N-1, -1 ) ENDIF C NB = ILAENV( 1, 'DORGQL', ' ', N-1, N-1, N-1, -1 ) ELSE IF ( NB0 .GT. 0 ) THEN NB = NB0 ELSE NB = ILAENV( 1, 'sORGQR', ' ', N-1, N-1, N-1, -1 ) ENDIF C 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( 'sORGTR', -INFO ) C 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 sSYTRD with UPLO = 'U' C* 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 SORQLX( NB0, NX0, > N-1, N-1, N-1, A, LDA, TAU, WORK, LWORK, IINFO ) C CALL DORGQL( N-1, N-1, N-1, A, LDA, TAU, WORK, LWORK, IINFO ) * ELSE * * Q was determined by a call to sSYTRD with UPLO = 'L'. C* 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 SORQRX( NB0, NX0, > N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK, $ LWORK, IINFO ) C CALL DORGQR( N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK, C $ LWORK, IINFO ) END IF END IF WORK( 1 ) = LWKOPT RETURN * * End of sORGTR C* End of DORGTR * END C SUBROUTINE DSBTRD( VECT, UPLO, N, KD, AB, LDAB, D, E, Q, LDQ, SUBROUTINE SSBTRX( VECT, UPLO, N, KD, AB, LDAB, D, E, Q, LDQ, $ WORK, INFO ) * * -- LAPACK routine (version 3.0) -- * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., * Courant Institute, Argonne National Lab, and Rice University * June 30, 1999 * * .. Scalar Arguments .. CHARACTER UPLO, VECT INTEGER INFO, KD, LDAB, LDQ, N * .. * .. Array Arguments .. C DOUBLE PRECISION AB( LDAB, * ), D( * ), E( * ), Q( LDQ, * ), REAL AB( LDAB, * ), D( * ), E( * ), Q( LDQ, * ), $ WORK( * ) * .. * * Purpose * ======= * C* DSBTRD reduces a real symmetric band matrix A to symmetric * sSBTRD reduces a real symmetric band matrix A to symmetric * tridiagonal form T by an orthogonal similarity transformation: * Q**T * A * Q = T. * * Arguments * ========= * * VECT (input) CHARACTER*1 * = 'N': do not form Q; * = 'V': form Q; * = 'U': update a matrix X, by forming X*Q. * * 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. * C* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) * 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, the diagonal elements of AB are overwritten by the * diagonal elements of the tridiagonal matrix T; if KD > 0, the * elements on the first superdiagonal (if UPLO = 'U') or the * first subdiagonal (if UPLO = 'L') are overwritten by the * off-diagonal elements of T; the rest of AB is overwritten by * values generated during the reduction. * * LDAB (input) INTEGER * The leading dimension of the array AB. LDAB >= KD+1. * C* D (output) DOUBLE PRECISION array, dimension (N) * D (output) real array, dimension (N) * The diagonal elements of the tridiagonal matrix T. * C* E (output) DOUBLE PRECISION array, dimension (N-1) * E (output) real array, dimension (N-1) * The off-diagonal elements of the tridiagonal matrix T: * E(i) = T(i,i+1) if UPLO = 'U'; E(i) = T(i+1,i) if UPLO = 'L'. * C* Q (input/output) DOUBLE PRECISION array, dimension (LDQ,N) * Q (input/output) real array, dimension (LDQ,N) * On entry, if VECT = 'U', then Q must contain an N-by-N * matrix X; if VECT = 'N' or 'V', then Q need not be set. * * On exit: * if VECT = 'V', Q contains the N-by-N orthogonal matrix Q; * if VECT = 'U', Q contains the product X*Q; * if VECT = 'N', the array Q is not referenced. * * LDQ (input) INTEGER * The leading dimension of the array Q. * LDQ >= 1, and LDQ >= N if VECT = 'V' or 'U'. * C* WORK (workspace) DOUBLE PRECISION array, dimension (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 * * Further Details * =============== * * Modified by Linda Kaufman, Bell Labs. * * ===================================================================== * * .. Parameters .. C DOUBLE PRECISION ZERO, ONE REAL ZERO, ONE C PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0 ) * .. * .. Local Scalars .. LOGICAL INITQ, UPPER, WANTQ INTEGER I, I2, IBL, INCA, INCX, IQAEND, IQB, IQEND, J, $ J1, J1END, J1INC, J2, JEND, JIN, JINC, K, KD1, $ KDM1, KDN, L, LAST, LEND, NQ, NR, NRT C DOUBLE PRECISION TEMP REAL TEMP * .. * .. External Subroutines .. C EXTERNAL DLAR2V, DLARGV, DLARTG, DLARTV, DLASET, DROT, EXTERNAL SLAR2V, SLARGV, SLARTG, SLARTV, SLASET, SROT, $ XERBLA * .. * .. Intrinsic Functions .. INTRINSIC MAX, MIN * .. * .. External Functions .. LOGICAL LSAME EXTERNAL LSAME * .. * .. Executable Statements .. * * Test the input parameters * INITQ = LSAME( VECT, 'V' ) WANTQ = INITQ .OR. LSAME( VECT, 'U' ) UPPER = LSAME( UPLO, 'U' ) KD1 = KD + 1 KDM1 = KD - 1 INCX = LDAB - 1 IQEND = 1 * INFO = 0 IF( .NOT.WANTQ .AND. .NOT.LSAME( VECT, 'N' ) ) 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( KD.LT.0 ) THEN INFO = -4 ELSE IF( LDAB.LT.KD1 ) THEN INFO = -6 ELSE IF( LDQ.LT.MAX( 1, N ) .AND. WANTQ ) THEN INFO = -10 END IF IF( INFO.NE.0 ) THEN C CALL XERBLA( 'DSBTRD', -INFO ) CALL XERBLA( 'sSBTRD', -INFO ) RETURN END IF * * Quick return if possible * IF( N.EQ.0 ) $ RETURN * * Initialize Q to the unit matrix, if needed * IF( INITQ ) C $ CALL DLASET( 'Full', N, N, ZERO, ONE, Q, LDQ ) $ CALL SLASET( 'Full', N, N, ZERO, ONE, Q, LDQ ) * * Wherever possible, plane rotations are generated and applied in * vector operations of length NR over the index set J1:J2:KD1. * * The cosines and sines of the plane rotations are stored in the * arrays D and WORK. * INCA = KD1*LDAB KDN = MIN( N-1, KD ) IF( UPPER ) THEN * IF( KD.GT.1 ) THEN * * Reduce to tridiagonal form, working with upper triangle * NR = 0 J1 = KDN + 2 J2 = 1 * DO 90 I = 1, N - 2 * * Reduce i-th row of matrix to tridiagonal form * DO 80 K = KDN + 1, 2, -1 J1 = J1 + KDN J2 = J2 + KDN * IF( NR.GT.0 ) THEN * * generate plane rotations to annihilate nonzero * elements which have been created outside the band * C CALL DLARGV( NR, AB( 1, J1-1 ), INCA, WORK( J1 ), CALL SLARGV( NR, AB( 1, J1-1 ), INCA, WORK( J1 ), $ KD1, D( J1 ), KD1 ) * * apply rotations from the right * * * Dependent on the the number of diagonals either C* DLARTV or DROT is used * sLARTV or sROT is used * IF( NR.GE.2*KD-1 ) THEN DO 10 L = 1, KD - 1 C CALL DLARTV( NR, AB( L+1, J1-1 ), INCA, CALL SLARTV( NR, AB( L+1, J1-1 ), INCA, $ AB( L, J1 ), INCA, D( J1 ), $ WORK( J1 ), KD1 ) 10 CONTINUE * ELSE JEND = J1 + ( NR-1 )*KD1 DO 20 JINC = J1, JEND, KD1 C CALL DROT( KDM1, AB( 2, JINC-1 ), 1, CALL SROT( KDM1, AB( 2, JINC-1 ), 1, $ AB( 1, JINC ), 1, D( JINC ), $ WORK( JINC ) ) 20 CONTINUE END IF END IF * * IF( K.GT.2 ) THEN IF( K.LE.N-I+1 ) THEN * * generate plane rotation to annihilate a(i,i+k-1) * within the band * C CALL DLARTG( AB( KD-K+3, I+K-2 ), CALL SLARTG( AB( KD-K+3, I+K-2 ), $ AB( KD-K+2, I+K-1 ), D( I+K-1 ), $ WORK( I+K-1 ), TEMP ) AB( KD-K+3, I+K-2 ) = TEMP * * apply rotation from the right * C CALL DROT( K-3, AB( KD-K+4, I+K-2 ), 1, CALL SROT( K-3, AB( KD-K+4, I+K-2 ), 1, $ AB( KD-K+3, I+K-1 ), 1, D( I+K-1 ), $ WORK( I+K-1 ) ) END IF NR = NR + 1 J1 = J1 - KDN - 1 END IF * * apply plane rotations from both sides to diagonal * blocks * IF( NR.GT.0 ) C $ CALL DLAR2V( NR, AB( KD1, J1-1 ), AB( KD1, J1 ), $ CALL SLAR2V( NR, AB( KD1, J1-1 ), AB( KD1, J1 ), $ AB( KD, J1 ), INCA, D( J1 ), $ WORK( J1 ), KD1 ) * * apply plane rotations from the left * IF( NR.GT.0 ) THEN IF( 2*KD-1.LT.NR ) THEN * * Dependent on the the number of diagonals either C* DLARTV or DROT is used * sLARTV or sROT is used * DO 30 L = 1, KD - 1 IF( J2+L.GT.N ) THEN NRT = NR - 1 ELSE NRT = NR END IF IF( NRT.GT.0 ) C $ CALL DLARTV( NRT, AB( KD-L, J1+L ), INCA, $ CALL SLARTV( NRT, AB( KD-L, J1+L ), INCA, $ AB( KD-L+1, J1+L ), INCA, $ D( J1 ), WORK( J1 ), KD1 ) 30 CONTINUE ELSE J1END = J1 + KD1*( NR-2 ) IF( J1END.GE.J1 ) THEN DO 40 JIN = J1, J1END, KD1 C CALL DROT( KD-1, AB( KD-1, JIN+1 ), INCX, CALL SROT( KD-1, AB( KD-1, JIN+1 ), INCX, $ AB( KD, JIN+1 ), INCX, $ D( JIN ), WORK( JIN ) ) 40 CONTINUE END IF LEND = MIN( KDM1, N-J2 ) LAST = J1END + KD1 IF( LEND.GT.0 ) C $ CALL DROT( LEND, AB( KD-1, LAST+1 ), INCX, $ CALL SROT( LEND, AB( KD-1, LAST+1 ), INCX, $ AB( KD, LAST+1 ), INCX, D( LAST ), $ WORK( LAST ) ) END IF END IF * IF( WANTQ ) THEN * * accumulate product of plane rotations in Q * IF( INITQ ) THEN * * take advantage of the fact that Q was * initially the Identity matrix * IQEND = MAX( IQEND, J2 ) I2 = MAX( 0, K-3 ) IQAEND = 1 + I*KD IF( K.EQ.2 ) $ IQAEND = IQAEND + KD IQAEND = MIN( IQAEND, IQEND ) DO 50 J = J1, J2, KD1 IBL = I - I2 / KDM1 I2 = I2 + 1 IQB = MAX( 1, J-IBL ) NQ = 1 + IQAEND - IQB IQAEND = MIN( IQAEND+KD, IQEND ) C CALL DROT( NQ, Q( IQB, J-1 ), 1, Q( IQB, J ), CALL SROT( NQ, Q( IQB, J-1 ), 1, Q( IQB, J ), $ 1, D( J ), WORK( J ) ) 50 CONTINUE ELSE * DO 60 J = J1, J2, KD1 C CALL DROT( N, Q( 1, J-1 ), 1, Q( 1, J ), 1, CALL SROT( N, Q( 1, J-1 ), 1, Q( 1, J ), 1, $ D( J ), WORK( J ) ) 60 CONTINUE END IF * END IF * IF( J2+KDN.GT.N ) THEN * * adjust J2 to keep within the bounds of the matrix * NR = NR - 1 J2 = J2 - KDN - 1 END IF * DO 70 J = J1, J2, KD1 * * create nonzero element a(j-1,j+kd) outside the band * and store it in WORK * WORK( J+KD ) = WORK( J )*AB( 1, J+KD ) AB( 1, J+KD ) = D( J )*AB( 1, J+KD ) 70 CONTINUE 80 CONTINUE 90 CONTINUE END IF * IF( KD.GT.0 ) THEN * * copy off-diagonal elements to E * DO 100 I = 1, N - 1 E( I ) = AB( KD, I+1 ) 100 CONTINUE ELSE * * set E to zero if original matrix was diagonal * DO 110 I = 1, N - 1 E( I ) = ZERO 110 CONTINUE END IF * * copy diagonal elements to D * DO 120 I = 1, N D( I ) = AB( KD1, I ) 120 CONTINUE * ELSE * IF( KD.GT.1 ) THEN * * Reduce to tridiagonal form, working with lower triangle * NR = 0 J1 = KDN + 2 J2 = 1 * DO 210 I = 1, N - 2 * * Reduce i-th column of matrix to tridiagonal form * DO 200 K = KDN + 1, 2, -1 J1 = J1 + KDN J2 = J2 + KDN * IF( NR.GT.0 ) THEN * * generate plane rotations to annihilate nonzero * elements which have been created outside the band * C CALL DLARGV( NR, AB( KD1, J1-KD1 ), INCA, CALL SLARGV( NR, AB( KD1, J1-KD1 ), INCA, $ WORK( J1 ), KD1, D( J1 ), KD1 ) * * apply plane rotations from one side * * * Dependent on the the number of diagonals either C* DLARTV or DROT is used * sLARTV or sROT is used * IF( NR.GT.2*KD-1 ) THEN DO 130 L = 1, KD - 1 C CALL DLARTV( NR, AB( KD1-L, J1-KD1+L ), INCA, CALL SLARTV( NR, AB( KD1-L, J1-KD1+L ), INCA, $ AB( KD1-L+1, J1-KD1+L ), INCA, $ D( J1 ), WORK( J1 ), KD1 ) 130 CONTINUE ELSE JEND = J1 + KD1*( NR-1 ) DO 140 JINC = J1, JEND, KD1 C CALL DROT( KDM1, AB( KD, JINC-KD ), INCX, CALL SROT( KDM1, AB( KD, JINC-KD ), INCX, $ AB( KD1, JINC-KD ), INCX, $ D( JINC ), WORK( JINC ) ) 140 CONTINUE END IF * END IF * IF( K.GT.2 ) THEN IF( K.LE.N-I+1 ) THEN * * generate plane rotation to annihilate a(i+k-1,i) * within the band * C CALL DLARTG( AB( K-1, I ), AB( K, I ), CALL SLARTG( AB( K-1, I ), AB( K, I ), $ D( I+K-1 ), WORK( I+K-1 ), TEMP ) AB( K-1, I ) = TEMP * * apply rotation from the left * C CALL DROT( K-3, AB( K-2, I+1 ), LDAB-1, CALL SROT( K-3, AB( K-2, I+1 ), LDAB-1, $ AB( K-1, I+1 ), LDAB-1, D( I+K-1 ), $ WORK( I+K-1 ) ) END IF NR = NR + 1 J1 = J1 - KDN - 1 END IF * * apply plane rotations from both sides to diagonal * blocks * IF( NR.GT.0 ) C $ CALL DLAR2V( NR, AB( 1, J1-1 ), AB( 1, J1 ), $ CALL SLAR2V( NR, AB( 1, J1-1 ), AB( 1, J1 ), $ AB( 2, J1-1 ), INCA, D( J1 ), $ WORK( J1 ), KD1 ) * * apply plane rotations from the right * * * Dependent on the the number of diagonals either C* DLARTV or DROT is used * sLARTV or sROT is used * IF( NR.GT.0 ) THEN IF( NR.GT.2*KD-1 ) THEN DO 150 L = 1, KD - 1 IF( J2+L.GT.N ) THEN NRT = NR - 1 ELSE NRT = NR END IF IF( NRT.GT.0 ) C $ CALL DLARTV( NRT, AB( L+2, J1-1 ), INCA, $ CALL SLARTV( NRT, AB( L+2, J1-1 ), INCA, $ AB( L+1, J1 ), INCA, D( J1 ), $ WORK( J1 ), KD1 ) 150 CONTINUE ELSE J1END = J1 + KD1*( NR-2 ) IF( J1END.GE.J1 ) THEN DO 160 J1INC = J1, J1END, KD1 C CALL DROT( KDM1, AB( 3, J1INC-1 ), 1, CALL SROT( KDM1, AB( 3, J1INC-1 ), 1, $ AB( 2, J1INC ), 1, D( J1INC ), $ WORK( J1INC ) ) 160 CONTINUE END IF LEND = MIN( KDM1, N-J2 ) LAST = J1END + KD1 IF( LEND.GT.0 ) C $ CALL DROT( LEND, AB( 3, LAST-1 ), 1, $ CALL SROT( LEND, AB( 3, LAST-1 ), 1, $ AB( 2, LAST ), 1, D( LAST ), $ WORK( LAST ) ) END IF END IF * * * IF( WANTQ ) THEN * * accumulate product of plane rotations in Q * IF( INITQ ) THEN * * take advantage of the fact that Q was * initially the Identity matrix * IQEND = MAX( IQEND, J2 ) I2 = MAX( 0, K-3 ) IQAEND = 1 + I*KD IF( K.EQ.2 ) $ IQAEND = IQAEND + KD IQAEND = MIN( IQAEND, IQEND ) DO 170 J = J1, J2, KD1 IBL = I - I2 / KDM1 I2 = I2 + 1 IQB = MAX( 1, J-IBL ) NQ = 1 + IQAEND - IQB IQAEND = MIN( IQAEND+KD, IQEND ) C CALL DROT( NQ, Q( IQB, J-1 ), 1, Q( IQB, J ), CALL SROT( NQ, Q( IQB, J-1 ), 1, Q( IQB, J ), $ 1, D( J ), WORK( J ) ) 170 CONTINUE ELSE * DO 180 J = J1, J2, KD1 C CALL DROT( N, Q( 1, J-1 ), 1, Q( 1, J ), 1, CALL SROT( N, Q( 1, J-1 ), 1, Q( 1, J ), 1, $ D( J ), WORK( J ) ) 180 CONTINUE END IF END IF * IF( J2+KDN.GT.N ) THEN * * adjust J2 to keep within the bounds of the matrix * NR = NR - 1 J2 = J2 - KDN - 1 END IF * DO 190 J = J1, J2, KD1 * * create nonzero element a(j+kd,j-1) outside the * band and store it in WORK * WORK( J+KD ) = WORK( J )*AB( KD1, J ) AB( KD1, J ) = D( J )*AB( KD1, J ) 190 CONTINUE 200 CONTINUE 210 CONTINUE END IF * IF( KD.GT.0 ) THEN * * copy off-diagonal elements to E * DO 220 I = 1, N - 1 E( I ) = AB( 2, I ) 220 CONTINUE ELSE * * set E to zero if original matrix was diagonal * DO 230 I = 1, N - 1 E( I ) = ZERO 230 CONTINUE END IF * * copy diagonal elements to D * DO 240 I = 1, N D( I ) = AB( 1, I ) 240 CONTINUE END IF * RETURN * C* End of DSBTRD * End of sSBTRD * END SUBROUTINE SSYTRX( NB0, NX0, > UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO ) C SUBROUTINE DSYTRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO ) * * -- LAPACK routine (version 3.0) -- * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., * Courant Institute, Argonne National Lab, and Rice University * June 30, 1999 * * .. Scalar Arguments .. CHARACTER UPLO INTEGER NB0, NX0, INFO, LDA, LWORK, N C INTEGER INFO, LDA, LWORK, N * .. * .. Array Arguments .. REAL A( LDA, * ), D( * ), E( * ), TAU( * ), $ WORK( * ) C DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAU( * ), C $ WORK( * ) * .. * * Purpose * ======= * * sSYTRx reduces a real symmetric matrix A to real symmetric C* DSYTRD reduces a real symmetric matrix A to real symmetric * tridiagonal form T by an orthogonal similarity transformation: * Q**T * A * Q = T. * * Arguments * ========= * * nb0 (input) integer * The blocking factor. * * nx0 (input) integer * The cross-over point to the nonblocked algorithm. C * * 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) C* 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) real array, dimension (N) C* D (output) DOUBLE PRECISION array, dimension (N) * The diagonal elements of the tridiagonal matrix T: * D(i) = A(i,i). * * E (output) real array, dimension (N-1) C* 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) real array, dimension (N-1) C* TAU (output) DOUBLE PRECISION array, dimension (N-1) * The scalar factors of the elementary reflectors (see Further * Details). * * WORK (workspace/output) real array, dimension (LWORK) C* WORK (workspace/output) DOUBLE PRECISION array, dimension (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 C DOUBLE PRECISION ONE PARAMETER ( ONE = 1.0E+0 ) C PARAMETER ( ONE = 1.0D+0 ) * .. * .. Local Scalars .. LOGICAL LQUERY, UPPER INTEGER I, IINFO, IWS, J, KK, LDWORK, LWKOPT, NB, $ NBMIN, NX * .. * .. External Subroutines .. EXTERNAL SLATRD, SSYR2K, SSYTD2, XERBLA C 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. * IF ( NB0 .GT. 0 ) THEN NB = NB0 ELSE NB = ILAENV( 1, 'DSYTRD', UPLO, N, -1, -1, -1 ) ENDIF C NB = ILAENV( 1, 'DSYTRD', UPLO, N, -1, -1, -1 ) LWKOPT = N*NB WORK( 1 ) = LWKOPT END IF * IF( INFO.NE.0 ) THEN CALL XERBLA( 'sSYTRD', -INFO ) C 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). * IF ( NX0 .GT. 0 ) THEN NX = MAX( NB, NX0 ) ELSE NX = MAX( NB, ILAENV( 3, 'DSYTRD', UPLO, N, -1, -1, -1 ) ) ENDIF C 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 = 2 C 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 SLATRD( UPLO, I+NB-1, NB, A, LDA, E, TAU, WORK, $ LDWORK ) C CALL DLATRD( UPLO, I+NB-1, NB, A, LDA, E, TAU, WORK, C $ 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 ) C CALL DSYR2K( UPLO, 'No transpose', I-1, NB, -ONE, A( 1, I ), C $ 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 ) C 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 SLATRD( UPLO, N-I+1, NB, A( I, I ), LDA, E( I ), $ TAU( I ), WORK, LDWORK ) C CALL DLATRD( UPLO, N-I+1, NB, A( I, I ), LDA, E( I ), C $ 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 ) C CALL DSYR2K( UPLO, 'No transpose', N-I-NB+1, NB, -ONE, C $ A( I+NB, I ), LDA, WORK( NB+1 ), LDWORK, ONE, C $ 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 ) C CALL DSYTD2( UPLO, N-I+1, A( I, I ), LDA, D( I ), E( I ), C $ TAU( I ), IINFO ) END IF * WORK( 1 ) = LWKOPT RETURN * * End of sSYTRD C* End of DSYTRD * END SUBROUTINE SLAGSY( N, K, D, A, LDA, ISEED, WORK, INFO ) * * -- LAPACK auxiliary test routine (version 3.0) * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., * Courant Institute, Argonne National Lab, and Rice University * February 29, 1992 * * .. Scalar Arguments .. INTEGER INFO, K, LDA, N * .. * .. Array Arguments .. INTEGER ISEED( 4 ) REAL A( LDA, * ), D( * ), WORK( * ) * .. * * Purpose * ======= * * SLAGSY generates a real symmetric matrix A, by pre- and post- * multiplying a real diagonal matrix D with a random orthogonal matrix: * A = U*D*U'. The semi-bandwidth may then be reduced to k by additional * orthogonal transformations. * * Arguments * ========= * * N (input) INTEGER * The order of the matrix A. N >= 0. * * K (input) INTEGER * The number of nonzero subdiagonals within the band of A. * 0 <= K <= N-1. * * D (input) REAL array, dimension (N) * The diagonal elements of the diagonal matrix D. * * A (output) REAL array, dimension (LDA,N) * The generated n by n symmetric matrix A (the full matrix is * stored). * * LDA (input) INTEGER * The leading dimension of the array A. LDA >= N. * * ISEED (input/output) INTEGER array, dimension (4) * On entry, the seed of the random number generator; the array * elements must be between 0 and 4095, and ISEED(4) must be * odd. * On exit, the seed is updated. * * WORK (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, HALF PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0, HALF = 0.5E+0 ) * .. * .. Local Scalars .. INTEGER I, J REAL ALPHA, TAU, WA, WB, WN * .. * .. External Subroutines .. EXTERNAL SAXPY, SGEMV, SGER, SLARNV, SSCAL, SSYMV, $ SSYR2, XERBLA * .. * .. External Functions .. REAL SDOT, SNRM2 EXTERNAL SDOT, SNRM2 * .. * .. Intrinsic Functions .. INTRINSIC MAX, SIGN * .. * .. Executable Statements .. * * Test the input arguments * INFO = 0 IF( N.LT.0 ) THEN INFO = -1 ELSE IF( K.LT.0 .OR. K.GT.N-1 ) THEN INFO = -2 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN INFO = -5 END IF IF( INFO.LT.0 ) THEN CALL XERBLA( 'SLAGSY', -INFO ) RETURN END IF * * initialize lower triangle of A to diagonal matrix * DO 20 J = 1, N DO 10 I = J + 1, N A( I, J ) = ZERO 10 CONTINUE 20 CONTINUE DO 30 I = 1, N A( I, I ) = D( I ) 30 CONTINUE * * Generate lower triangle of symmetric matrix * DO 40 I = N - 1, 1, -1 * * generate random reflection * CALL SLARNV( 3, ISEED, N-I+1, WORK ) WN = SNRM2( N-I+1, WORK, 1 ) WA = SIGN( WN, WORK( 1 ) ) IF( WN.EQ.ZERO ) THEN TAU = ZERO ELSE WB = WORK( 1 ) + WA CALL SSCAL( N-I, ONE / WB, WORK( 2 ), 1 ) WORK( 1 ) = ONE TAU = WB / WA END IF * * apply random reflection to A(i:n,i:n) from the left * and the right * * compute y := tau * A * u * CALL SSYMV( 'Lower', N-I+1, TAU, A( I, I ), LDA, WORK, 1, ZERO, $ WORK( N+1 ), 1 ) * * compute v := y - 1/2 * tau * ( y, u ) * u * ALPHA = -HALF*TAU*SDOT( N-I+1, WORK( N+1 ), 1, WORK, 1 ) CALL SAXPY( N-I+1, ALPHA, WORK, 1, WORK( N+1 ), 1 ) * * apply the transformation as a rank-2 update to A(i:n,i:n) * CALL SSYR2( 'Lower', N-I+1, -ONE, WORK, 1, WORK( N+1 ), 1, $ A( I, I ), LDA ) 40 CONTINUE * * Reduce number of subdiagonals to K * DO 60 I = 1, N - 1 - K * * generate reflection to annihilate A(k+i+1:n,i) * WN = SNRM2( N-K-I+1, A( K+I, I ), 1 ) WA = SIGN( WN, A( K+I, I ) ) IF( WN.EQ.ZERO ) THEN TAU = ZERO ELSE WB = A( K+I, I ) + WA CALL SSCAL( N-K-I, ONE / WB, A( K+I+1, I ), 1 ) A( K+I, I ) = ONE TAU = WB / WA END IF * * apply reflection to A(k+i:n,i+1:k+i-1) from the left * CALL SGEMV( 'Transpose', N-K-I+1, K-1, ONE, A( K+I, I+1 ), LDA, $ A( K+I, I ), 1, ZERO, WORK, 1 ) CALL SGER( N-K-I+1, K-1, -TAU, A( K+I, I ), 1, WORK, 1, $ A( K+I, I+1 ), LDA ) * * apply reflection to A(k+i:n,k+i:n) from the left and the right * * compute y := tau * A * u * CALL SSYMV( 'Lower', N-K-I+1, TAU, A( K+I, K+I ), LDA, $ A( K+I, I ), 1, ZERO, WORK, 1 ) * * compute v := y - 1/2 * tau * ( y, u ) * u * ALPHA = -HALF*TAU*SDOT( N-K-I+1, WORK, 1, A( K+I, I ), 1 ) CALL SAXPY( N-K-I+1, ALPHA, A( K+I, I ), 1, WORK, 1 ) * * apply symmetric rank-2 update to A(k+i:n,k+i:n) * CALL SSYR2( 'Lower', N-K-I+1, -ONE, A( K+I, I ), 1, WORK, 1, $ A( K+I, K+I ), LDA ) * A( K+I, I ) = -WA DO 50 J = K + I + 1, N A( J, I ) = ZERO 50 CONTINUE 60 CONTINUE * * Store full symmetric matrix * DO 80 J = 1, N DO 70 I = J + 1, N A( J, I ) = A( I, J ) 70 CONTINUE 80 CONTINUE RETURN * * End of SLAGSY * END REAL FUNCTION SLARAN( ISEED ) * * -- LAPACK auxiliary routine (version 3.0) -- * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., * Courant Institute, Argonne National Lab, and Rice University * February 29, 1992 * * .. Array Arguments .. INTEGER ISEED( 4 ) * .. * * Purpose * ======= * * SLARAN returns a random real number from a uniform (0,1) * distribution. * * Arguments * ========= * * ISEED (input/output) INTEGER array, dimension (4) * On entry, the seed of the random number generator; the array * elements must be between 0 and 4095, and ISEED(4) must be * odd. * On exit, the seed is updated. * * Further Details * =============== * * This routine uses a multiplicative congruential method with modulus * 2**48 and multiplier 33952834046453 (see G.S.Fishman, * 'Multiplicative congruential random number generators with modulus * 2**b: an exhaustive analysis for b = 32 and a partial analysis for * b = 48', Math. Comp. 189, pp 331-344, 1990). * * 48-bit integers are stored in 4 integer array elements with 12 bits * per element. Hence the routine is portable across machines with * integers of 32 bits or more. * * ===================================================================== * * .. Parameters .. INTEGER M1, M2, M3, M4 PARAMETER ( M1 = 494, M2 = 322, M3 = 2508, M4 = 2549 ) REAL ONE PARAMETER ( ONE = 1.0E+0 ) INTEGER IPW2 REAL R PARAMETER ( IPW2 = 4096, R = ONE / IPW2 ) * .. * .. Local Scalars .. INTEGER IT1, IT2, IT3, IT4 * .. * .. Intrinsic Functions .. INTRINSIC MOD, REAL * .. * .. Executable Statements .. * * multiply the seed by the multiplier modulo 2**48 * IT4 = ISEED( 4 )*M4 IT3 = IT4 / IPW2 IT4 = IT4 - IPW2*IT3 IT3 = IT3 + ISEED( 3 )*M4 + ISEED( 4 )*M3 IT2 = IT3 / IPW2 IT3 = IT3 - IPW2*IT2 IT2 = IT2 + ISEED( 2 )*M4 + ISEED( 3 )*M3 + ISEED( 4 )*M2 IT1 = IT2 / IPW2 IT2 = IT2 - IPW2*IT1 IT1 = IT1 + ISEED( 1 )*M4 + ISEED( 2 )*M3 + ISEED( 3 )*M2 + $ ISEED( 4 )*M1 IT1 = MOD( IT1, IPW2 ) * * return updated seed * ISEED( 1 ) = IT1 ISEED( 2 ) = IT2 ISEED( 3 ) = IT3 ISEED( 4 ) = IT4 * * convert 48-bit integer to a real number in the interval (0,1) * SLARAN = R*( REAL( IT1 )+R*( REAL( IT2 )+R*( REAL( IT3 )+R* $ ( REAL( IT4 ) ) ) ) ) RETURN * * End of SLARAN * END * ********************************************************************** * PROGRAM SRUN * * Description: * * This is the testing and timing driver for the SBR toolbox. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Local constants and variables: * REAL ONE PARAMETER ( ONE = 1.0E0 ) * * --- array dimensions --- * INTEGER NMAX, SZA, SZACPY, SZU, SZWORK PARAMETER ( NMAX = 1400 , > SZA = NMAX * NMAX , > SZACPY = 500 * NMAX , > SZU = NMAX * NMAX , > SZWORK = NMAX * NMAX ) REAL A( SZA ), ACPY( SZACPY ), U( SZU ), > EVLS( NMAX ), D( NMAX ), E( NMAX ), > TAU( NMAX ), WORK( SZWORK ) COMMON /ARRAYS/ A, ACPY, U, EVLS, D, E, TAU, WORK * * nmax maximum matrix size * a holds the matrix A to be reduced (full or banded) * sza size of the array a. * sza >= nmax * nmax, if full matrices are handled * >= ( bmax+1 ) * nmax, if only banded matrices with * semibandwidth <= bmax are handled * acpy holds the reduced matrix (banded) * szacpy size of the array acpy. * szacpy >= ( bmax+1 ) * nmax, where bmax is the maximum * semibandwith * u holds the accumulated transformation matrix U, if required * szu size of the array u. * szu >= nmax * nmax, if U is accumulated * >= 0, otherwise * evls the eigenvalues of the matrix A (accessed during * initialization) * d main diagonal of the reduced tridiagonal matrix * e sub(super)diagonal of the reduced tridiagonal matrix * tau scaling factors in the reduction full -> banded/tridiagonal * work workspace * szwork size of the array work. * szwork depends on the reduction algorithms that are run, on * the matrix sizes, on the blocking factors, and on the * leading dimensions of the matrices. * Recomended: szwork >= 100 * nmax. * arrays common block is used only because some machines cannot * handle large arrays on the stack * * --- I/O control --- * INTEGER IUNIT, OUNIT, OUNITF INTEGER I1MACH * PARAMETER ( IUNIT = 5, OUNITF = 8 ) * CHARACTER*8 IFILE, OFILE CHARACTER*8 OFILE * PARAMETER ( IFILE = 'INFILE' ) INTEGER OLEVEL, OUTSUM, OUTTUN, OUTRUN, OUTDET, > LINENO, LINE0 PARAMETER ( OUTSUM = 1, OUTTUN = 2, OUTRUN = 3, > OUTDET = 4 ) CHARACTER*78 MBUF * * iunit unit number for input file * ounit unit number for output * ounitf unit number for output file * ifile name of input file * ofile name of output file * olevel level of output * olevel = outsum : only summary for all the runs * = outtun : short summaries for tuning * = outrun : summary for each run * = outdet : detailed output for each run * lineno number of current input line * line0 first input line corresponding to the current run * mbuf buffer for messages * * --- for statistics --- * INTEGER SYTRD, ORGTR, SBTRD, SYRDB, SYGTR, SBRDB, > SBRDT, SY2BC, SY2BI, SB2BC, SB2BI, SYRDD, > SBRDD, TOTAL PARAMETER ( SYTRD = 1, ORGTR = 2, SBTRD = 3, > SYRDB = 4, SYGTR = 5, SBRDB = 6, > SBRDT = 7, SY2BC = 8, SY2BI = 9, > SB2BC = 10, SB2BI = 11, SYRDD = 12, > SBRDD = 13, TOTAL = 14 ) INTEGER TRY( TOTAL ), SKIP( TOTAL ), FAIL( TOTAL ) CHARACTER*6 PRBLMN( TOTAL ) CHARACTER*40 COMMNT( TOTAL ) * * sytrd tests for ssytrd (full -> tridiagonal, LAPACK) * orgtr tests for sorgtr (backward accumulation, LAPACK) * sbtrd tests for ssbtrd (banded -> tridiagonal, LAPACK) * syrdb tests for ssyrdb (full -> banded, SBR) * sygtr tests for ssygtr (backward accumulation, SBR) * sbrdb tests for ssbrdb (banded -> banded, SBR) * sbrdt tests for ssbrdt (banded -> tridiagonal, SBR) * sy2bc tests for ssy2bc (full -> banded copy, SBR) * sy2bi tests for ssy2bi (full -> banded repacking, SBR) * sb2bc tests for ssb2bc (banded -> banded copy, SBR) * sb2bi tests for ssb2bi (banded -> banded repacking, SBR) * syrdd tests for ssyrdd (reduction driver for full matrices, SBR) * sbrdd tests for ssbrdd (reduction driver for banded matrices, SBR) * total all tests * count counters for all tests * fail counters for failed tests * skip counters for skipped tests * prblmn names of the reduction paths (for output) * commnt comments to the reduction paths (for output) * DOUBLE PRECISION STIME, BTIME, CTIME, RTIME * * stime time before all the tests * btime time before the procedure call * ctime time for the procedure call * rtime time for a full reduction/accumulation path * * --- controlling the test runs --- * REAL EPS, NOTUSD * * eps machine epsilon * notusd (large) value for marking memory that should not be accessed * CHARACTER*5 PNAME INTEGER MAXDIM, PRBLM, N, B1, LDA1, B2, LDA2, LDU, > NSTEPS, STEP, LWORK1, LWORK2, NX1, NX2, > XINFO1, XINFO2, INFO CHARACTER MTYPE, UPLO, FRMT1, FRMT2, JOBU, JOBU0 REAL DIAM, DRPTOL INTEGER B( 100 ), NB( 100 ) * * pname name of the routine to test (without precision specifier) * maxdim maximum matrix size for the runs (runs with larger matrices * are skipped) * prblm number of the routine to test (numbering sytrd=1, etc. as * above) * mtype matrix type * mtype = 'R' : Eigenvalues are uniformly random in [ -1, 1 ). * = 'I' : ISDA-type matrix: eigenvalues are clustered * around 0 and 1. * diam diameter of the eigenvalue clusters in multiples of the * machine precision (used only for ISDA-type matrices) * uplo use upper or lower triangle of the matrix ? * n matrix dimension * frmt1 format of the matrix before the reduction ('F'ull/'B'anded) * b1 semibandwidth before the reduction * lda1 leading dimension before the reductino * frmt2 format after the reduction ('B'anded/'T'ridiagonal) * b2 semibandwidth after the reduction * lda2 leading dimension after the reduction * jobu0 accumulate the transformations in an orthogonal matrix ? * jobu accumulate in the current routine ? * ldu leading dimension of the array u * nsteps number of reduction steps (used only in the driver routines) * step number of the last step performed or tried * b intermediate bandwidths for multi-step reduction * nb blocking factors for the reduction/accumulation steps * drptol threshold for skipping ransformations * lwork1 length of workspace for the reduction * lwork2 length of workspace for backward accumulation * nx1 cross-over point for LAPACK tridiagonalization ssytrd * nx2 cross-over point for LAPACK backward accumulation sorgtr * xinfo1 error code expected from the reduction routine * xinfo2 error code expected from backward accumulation * info actual error code returned from the routines * CHARACTER CHECK REAL ORTHU, SORTHU, TORTHU, RES, SRES, TRES, > DEVLS, SDEVLS, TDEVLS LOGICAL CHECKS, ERRCHK, OK INTEGER NUSED * * check is result checking required ? ('C'check/'N'oCheck) * checks are checks enabled ? * orthu ortogonality error, i.e., (Frobenius) norm of U' * U - I * sorthu = orthu / ( n * eps ), the scaled orthogonality error * torthu threshold on sorthu for accepting the run * res residual, i.e., (Frobenius) norm of U * B - A * U, where * A is the original matrix and B is the reduced matrix * sres = res / ( n * eps * norm( A ) ), the scaled residual * tres threshold on sres * devls deviation of the eigenvalues, i.e., (Frobenius) norm of * spec( A ) - spec( B ), where spec( A ) and spec( B ) are * the (ascendingly sorted) eigenvalues of the original matrix * and the reduced matrix, respectively * sdevls = devls / ( n * eps * norm( A ) ), the scaled deviation * tdevls threshold on devls * errchk was it a check for error exit ? * ok did the numerical checks meet the thresholds ? * nused number of workspace elements that were modified * INTEGER I * * Routines called: * REAL SECOND REAL R1MACH LOGICAL LSAME, LXSAME EXTERNAL SECOND, R1MACH, LSAME, LXSAME * * dsecnd timer (LAPACK) * slamch determine machine parameters (LAPACK) * lsame case-insensitive character-matching (BLAS) * lxsame case-insensitive string matching (this file) * EXTERNAL SLACPY, SORGTX, SSB2BC, SSB2BI, SSBRDB, > SSBRDD, SSBRDT, SSBTRX, SSY2BC, SSY2BI, > SSYGTR, SSYINI, SSYNCK, SSYRDB, SSYRDD, > SSYTRX * * slacpy copy matrix (LAPACK) * sorgtx backward accumulation of transformations (LAPACK, modified) * ssb2bc banded -> banded copy (SBR) * ssb2bi banded -> banded repacking (SBR) * ssbrdb banded -> banded reduction (SBR) * ssbrdd reduction driver for banded matrices (SBR) * ssbrdt banded -> tridiagonal reduction (SBR) * ssbtrx banded -> tridiagonal reduction (LAPACK, modified) * ssy2bc full -> banded copy (SBR) * ssy2bi full -> banded repacking (SBR) * ssygtr backward accumulation of transformations (SBR) * ssyini initialize symmetric (full or banded) matrix * ssynck numerical checks for the reduction * ssyrdb full -> banded reduction (SBR) * ssyrdd reduction driver for full matrices (SBR) * ssytrx full -> tridiagonal reduction (LAPACK, modified) * INTRINSIC MAX, MIN * * --- names and explanations for the test paths --- * DATA > PRBLMN( SYTRD )/'ssytrd'/, > COMMNT( SYTRD )/'full -> tridiagonal, one-step (LAPACK)'/, > PRBLMN( ORGTR )/'sorgtr'/, > COMMNT( ORGTR )/'accumulation of transformations (LAPACK)'/, > PRBLMN( SBTRD )/'ssbtrd'/, > COMMNT( SBTRD )/'banded -> tridiagonal, one-step (LAPACK)'/ DATA > PRBLMN( SYRDB )/'ssyrdb'/, > COMMNT( SYRDB )/'full -> banded, one-step (SBR)'/, > PRBLMN( SYGTR )/'ssygtr'/, > COMMNT( SYGTR )/'accumulation of transformations (SBR)'/, > PRBLMN( SBRDB )/'ssbrdb'/, > COMMNT( SBRDB )/'banded -> banded, one-step (SBR)'/, > PRBLMN( SBRDT )/'ssbrdt'/, > COMMNT( SBRDT )/'banded -> tridiagonal, one-step (SBR)'/ DATA > PRBLMN( SY2BC )/'ssy2bc'/, > COMMNT( SY2BC )/'copy full -> banded (SBR)'/, > PRBLMN( SY2BI )/'ssy2bi'/, > COMMNT( SY2BI )/'in-place copy full -> banded (SBR)'/, > PRBLMN( SB2BC )/'ssb2bc'/, > COMMNT( SB2BC )/'copy banded -> banded (SBR)'/, > PRBLMN( SB2BI )/'ssb2bi'/, > COMMNT( SB2BI )/'in-place copy banded -> banded (SBR)'/ DATA > PRBLMN( SYRDD )/'ssyrdd'/, > COMMNT( SYRDD )/'reduction driver for full matrices (SBR)'/, > PRBLMN( SBRDD )/'ssbrdd'/, > COMMNT( SBRDD )/'reduction driver for banded matrcs (SBR)'/, > PRBLMN( TOTAL )/'Total '/, > COMMNT( TOTAL )/' '/ * * ---------------------------------------------------------------------- * STIME = SECOND() * * --- initialize --- * DO 1000 I = 1, TOTAL TRY( I ) = 0 SKIP( I ) = 0 FAIL( I ) = 0 1000 CONTINUE * * EPS = SLAMCH( 'Epsilon' ) * NOTUSD = ONE / SLAMCH( 'SafeMinimum' ) EPS = R1MACH(4) NOTUSD = ONE/(R1MACH(1)*(ONE + EPS)) * * --- open input and output files --- * * OPEN( UNIT=IUNIT, FILE=IFILE ) LINENO = 0 * IUNIT = I1MACH(1) OUNIT = I1MACH(2) OLEVEL = OUTSUM MAXDIM = NMAX CHECKS = .TRUE. * 2000 CONTINUE * * --- read next line from input file --- * LINENO = LINENO + 1 LINE0 = LINENO READ( IUNIT, * ) PNAME * WRITE( *, * ) LINE0 * * --- if comment line then just skip it --- * IF ( LSAME( PNAME( 1:1 ), 'Comment' ) ) THEN GOTO 2000 * * --- filename for output file ? --- * ELSEIF ( LSAME( PNAME( 1:1 ), 'FileName' ) ) THEN LINENO = LINENO + 1 READ( IUNIT, * ) OFILE( 2:8 ) OFILE( 1:1 ) = 'SinglePrec' OUNIT = OUNITF OPEN( UNIT=OUNIT, FILE=OFILE ) GOTO 2000 * * --- set output level ? --- * ELSEIF ( LSAME( PNAME( 1:1 ), 'OutputLevel' ) ) THEN LINENO = LINENO + 1 READ( IUNIT, * ) I IF ( ( I .LT. OUTSUM ) .OR. ( I .GT. OUTDET ) ) THEN WRITE( OUNIT, 9300 ) LINENO, 'Output level out of range' ELSE OLEVEL = I ENDIF GOTO 2000 * * --- message to print --- * ELSEIF ( LSAME( PNAME( 1:1 ), 'Print' ) ) THEN LINENO = LINENO + 1 READ( IUNIT, * ) MBUF WRITE( OUNIT, 9100 ) MBUF GOTO 2000 * * --- maximum matrix size --- * ELSEIF ( LSAME( PNAME( 1:1 ), 'MaxDim' ) ) THEN LINENO = LINENO + 1 READ( IUNIT, * ) MAXDIM GOTO 2000 * * --- disable checks ? --- * ELSEIF ( LSAME( PNAME( 1:1 ), 'NoChecks' ) ) THEN CHECKS = .FALSE. GOTO 2000 * * --- test run ? * If so then read and set parameters for the run --- * ELSEIF ( LXSAME( PNAME, 'SYTRD' ) ) THEN * * --- LAPACK reduction full -> tridiagonal --- * PRBLM = SYTRD READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, LDA1, NB( 1 ), NX1, > LWORK1, XINFO1, JOBU, NB( 2 ), NX2, LWORK2, > XINFO2 FRMT1 = 'Full' B1 = MAX( N-1, 0 ) FRMT2 = 'Tridiagonal' B2 = 1 LDA2 = B2 + 1 LDU = N ELSEIF ( LXSAME( PNAME, 'SBTRD' ) ) THEN * * --- LAPACK reduction banded -> tridiagonal --- * PRBLM = SBTRD READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, B1, LDA1, JOBU, LDU, > XINFO1 FRMT1 = 'Banded' FRMT2 = 'Tridiagonal' B2 = 1 LDA2 = B2 + 1 LWORK1 = N ELSEIF ( LXSAME( PNAME, 'SYRDB' ) ) THEN * * --- SBR reduction full -> banded --- * PRBLM = SYRDB READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, LDA1, B2, DRPTOL, > NB( 1 ), LWORK1, XINFO1 LINENO = LINENO + 1 READ( IUNIT, * ) JOBU0, LDU, LWORK2, XINFO2 FRMT1 = 'Full' B1 = MAX( N-1, 0 ) DRPTOL = DRPTOL * EPS FRMT2 = 'Banded' LDA2 = B2 + 1 IF ( LSAME( JOBU0, 'OnFly' ) ) THEN JOBU = 'Update' ELSEIF ( LSAME( JOBU0, 'Update' ) ) THEN JOBU = 'NoU' ELSE JOBU = JOBU0 ENDIF ELSEIF ( LXSAME( PNAME, 'SBRDB' ) ) THEN * * --- SBR reduction banded -> banded --- * PRBLM = SBRDB READ( IUNIT, * ) MTYPE, DIAM, N, B1, LDA1, B2, DRPTOL, > NB( 1 ), JOBU, LDU, LWORK1, XINFO1 FRMT1 = 'Banded' UPLO = 'Lower' DRPTOL = DRPTOL * EPS FRMT2 = 'Banded' LDA2 = B2 + 1 ELSEIF ( LXSAME( PNAME, 'SBRDT' ) ) THEN * * --- SBR reduction banded -> tridiagonal --- * PRBLM = SBRDT READ( IUNIT, * ) MTYPE, DIAM, N, B1, LDA1, DRPTOL, NB( 1 ), > JOBU, LDU, LWORK1, XINFO1 FRMT1 = 'Banded' UPLO = 'Lower' DRPTOL = DRPTOL * EPS FRMT2 = 'Tridiagonal' B2 = 1 LDA2 = B2 + 1 ELSEIF ( LXSAME( PNAME, 'SY2BC' ) ) THEN * * --- SBR copy full -> banded --- * PRBLM = SY2BC READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, B1, LDA1, LDA2, > XINFO1 FRMT1 = 'Full' FRMT2 = 'Banded' B2 = B1 LWORK1 = 0 JOBU = 'NoU' LDU = N ELSEIF ( LXSAME( PNAME, 'SY2BI' ) ) THEN * * --- SBR in-place copy full -> banded --- * PRBLM = SY2BI READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, B1, LDA1, LDA2, > XINFO1 FRMT1 = 'Full' FRMT2 = 'Banded' B2 = B1 LWORK1 = 0 JOBU = 'NoU' LDU = N ELSEIF ( LXSAME( PNAME, 'SB2BC' ) ) THEN * * --- SBR copy banded -> banded --- * PRBLM = SB2BC READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, B1, LDA1, LDA2, > XINFO1 FRMT1 = 'Banded' FRMT2 = 'Banded' B2 = B1 LWORK1 = 0 JOBU = 'NoU' LDU = N ELSEIF ( LXSAME( PNAME, 'SB2BI' ) ) THEN * * --- SBR in-place copy full -> banded --- * PRBLM = SB2BI READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, B1, LDA1, LDA2, > XINFO1 FRMT1 = 'Banded' FRMT2 = 'Banded' B2 = B1 LWORK1 = 0 JOBU = 'NoU' LDU = N ELSEIF ( LXSAME( PNAME, 'SYRDD' ) ) THEN * * --- SBR driver for full matrices --- * PRBLM = SYRDD READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, LDA1, B2, LDA2, > NSTEPS, DRPTOL, JOBU, LWORK1, XINFO1 FRMT1 = 'Full' B1 = MAX( N-1, 0 ) DRPTOL = DRPTOL * EPS IF ( B2 .EQ. 1 ) THEN FRMT2 = 'Tridiagonal' ELSE FRMT2 = 'Banded' ENDIF LDU = N IF ( NSTEPS .GT. 1 ) THEN LINENO = LINENO + 1 READ( IUNIT, * ) ( B( I ), I = 1, NSTEPS-1 ) ENDIF IF ( NSTEPS .GT. 0 ) THEN LINENO = LINENO + 1 READ( IUNIT, * ) ( NB( I ), I = 1, NSTEPS ) ENDIF ELSEIF ( LXSAME( PNAME, 'SBRDD' ) ) THEN * * --- SBR driver for banded matrices --- * PRBLM = SBRDD READ( IUNIT, * ) MTYPE, DIAM, UPLO, N, B1, LDA1, B2, NSTEPS, > DRPTOL, JOBU, LDU, LWORK1, XINFO1 FRMT1 = 'Banded' DRPTOL = DRPTOL * EPS IF ( B2 .EQ. 1 ) THEN FRMT2 = 'Tridiagonal' ELSE FRMT2 = 'Banded' ENDIF LDA2 = B2 + 1 IF ( NSTEPS .GT. 1 ) THEN LINENO = LINENO + 1 READ( IUNIT, * ) ( B( I ), I = 1, NSTEPS-1 ) ENDIF IF ( NSTEPS .GT. 0 ) THEN LINENO = LINENO + 1 READ( IUNIT, * ) ( NB( I ), I = 1, NSTEPS ) ENDIF * * --- done ? --- * ELSEIF ( LSAME( PNAME( 1:1 ), 'Quit' ) ) THEN GOTO 8000 ELSE WRITE( OUNIT, 9300 ) LINENO, 'Command not recognized' GOTO 2000 ENDIF * * - - - - - - - - if we get here then a test run is required - - - - - * LINENO = LINENO + 2 READ ( IUNIT, * ) CHECK, TORTHU, TRES, TDEVLS ERRCHK = .FALSE. * TRY( PRBLM ) = TRY( PRBLM ) + 1 * * --- is the problem too large ? --- * IF ( N .GT. MAXDIM ) THEN SKIP( PRBLM ) = SKIP( PRBLM ) + 1 WRITE( OUNIT, 9310 ) LINE0 GOTO 2000 ENDIF * * --- initialize matrices --- * INFO = 0 BTIME = SECOND() CALL SSYINI( MTYPE, EVLS, NMAX, DIAM, > FRMT1, UPLO, N, B1, A, LDA1, SZA, > JOBU, U, LDU, SZU, > NOTUSD, WORK, SZWORK, INFO ) CTIME = SECOND() - BTIME * * --- protocol output, if required --- * IF ( OLEVEL .GE. OUTDET ) THEN WRITE( OUNIT, 9500 ) MTYPE, NMAX, DIAM, FRMT1, UPLO, N WRITE( OUNIT, 9501 ) B1, LDA1, SZA, JOBU, LDU, SZU WRITE( OUNIT, 9502 ) NOTUSD, SZWORK WRITE( OUNIT, 9400 ) INFO, CTIME ENDIF * IF ( ( INFO .EQ. -3 ) .OR. ( INFO .EQ. -11 ) .OR. > ( INFO .EQ. -15 ) .OR. ( INFO .EQ. -18 ) ) THEN * * --- test problem is too large : skip --- * SKIP( PRBLM ) = SKIP( PRBLM ) + 1 WRITE( OUNIT, 9310 ) LINE0 GOTO 3000 ENDIF * * --- mark workspace "unused" --- * DO 2100 I = 1, MIN( MAX( 2*LWORK1, 10000 ), SZWORK ) WORK( I ) = NOTUSD 2100 CONTINUE * * - - - - - - - - do the reduction / repacking - - - - - - - - - - - - * INFO = 0 BTIME = SECOND() IF ( PRBLM .EQ. SYTRD ) THEN CALL SSYTRX( NB( 1 ), NX1, UPLO, N, A, LDA1, D, E, > TAU, WORK, LWORK1, INFO ) ELSEIF ( PRBLM .EQ. SBTRD ) THEN CALL SSBTRX( JOBU, UPLO, N, B1, A, LDA1, D, E, > U, LDU, WORK, INFO ) ELSEIF ( PRBLM .EQ. SYRDB ) THEN CALL SSYRDB( UPLO, JOBU, N, B2, A, LDA1, DRPTOL, > U, LDU, NB( 1 ), TAU, WORK, LWORK1, INFO ) ELSEIF ( PRBLM .EQ. SBRDB ) THEN CALL SSBRDB( JOBU, N, B1, B2, A, LDA1, DRPTOL, > U, LDU, NB( 1 ), WORK, LWORK1, INFO ) ELSEIF ( PRBLM .EQ. SBRDT ) THEN CALL SSBRDT( JOBU, N, B1, A, LDA1, DRPTOL, D, E, > U, LDU, NB( 1 ), WORK, LWORK1, INFO ) ELSEIF ( PRBLM .EQ. SY2BC ) THEN CALL SSY2BC( UPLO, N, B1, A, LDA1, ACPY, LDA2, INFO ) ELSEIF ( PRBLM .EQ. SY2BI ) THEN CALL SSY2BI( UPLO, N, B1, A, LDA1, LDA2, INFO ) ELSEIF ( PRBLM .EQ. SB2BC ) THEN CALL SSB2BC( UPLO, N, B1, A, LDA1, ACPY, LDA2, INFO ) ELSEIF ( PRBLM .EQ. SB2BI ) THEN CALL SSB2BI( UPLO, N, B1, A, LDA1, LDA2, INFO ) ELSEIF ( PRBLM .EQ. SYRDD ) THEN CALL SSYRDD( JOBU, UPLO, N, B2, A, LDA1, DRPTOL, > ACPY, LDA2, D, E, NSTEPS, B, NB, > WORK, LWORK1, STEP, INFO ) ELSEIF ( PRBLM .EQ. SBRDD ) THEN CALL SSBRDD( JOBU, UPLO, N, B1, B2, A, LDA1, DRPTOL, > D, E, U, LDU, NSTEPS, B, NB, > WORK, LWORK1, STEP, INFO ) ENDIF CTIME = SECOND() - BTIME RTIME = CTIME * * --- protocol output, if required --- * IF ( OLEVEL .GE. OUTDET ) THEN IF ( PRBLM .EQ. SYTRD ) THEN WRITE( OUNIT, 9510 ) UPLO, N, LDA1, NB( 1 ), NX1, LWORK1 WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SBTRD ) THEN WRITE( OUNIT, 9520 ) JOBU, UPLO, N, B1, LDA1, LDU WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SYRDB ) THEN WRITE( OUNIT, 9530 ) UPLO, JOBU, N, B2, LDA1, DRPTOL WRITE( OUNIT, 9531 ) LDU, NB( 1 ), LWORK1 WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SBRDB ) THEN WRITE( OUNIT, 9540 ) JOBU, N, B1, B2, LDA1, DRPTOL WRITE( OUNIT, 9531 ) LDU, NB( 1 ), LWORK1 WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SBRDT ) THEN WRITE( OUNIT, 9550 ) JOBU, N, B1, LDA1, DRPTOL WRITE( OUNIT, 9531 ) LDU, NB( 1 ), LWORK1 WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SY2BC ) THEN WRITE( OUNIT, 9560 ) UPLO, N, B1, LDA1, LDA2 WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SY2BI ) THEN WRITE( OUNIT, 9570 ) UPLO, N, B1, LDA1, LDA2 WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SB2BC ) THEN WRITE( OUNIT, 9580 ) UPLO, N, B1, LDA1, LDA2 WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SB2BI ) THEN WRITE( OUNIT, 9590 ) UPLO, N, B1, LDA1, LDA2 WRITE( OUNIT, 9400 ) INFO, CTIME ELSEIF ( PRBLM .EQ. SYRDD ) THEN WRITE( OUNIT, 9600 ) JOBU, UPLO, N, B2, LDA1 WRITE( OUNIT, 9601 ) DRPTOL, LDA2, NSTEPS, LWORK1 WRITE( OUNIT, 9401 ) STEP, INFO, CTIME ELSEIF ( PRBLM .EQ. SBRDD ) THEN WRITE( OUNIT, 9610 ) JOBU, UPLO, N, B1, B2, LDA1 WRITE( OUNIT, 9611 ) DRPTOL, LDU, NSTEPS, LWORK1 WRITE( OUNIT, 9401 ) STEP, INFO, CTIME ENDIF ELSEIF ( OLEVEL .EQ. OUTTUN ) THEN IF ( PRBLM .EQ. SYTRD ) THEN WRITE( OUNIT, 9515 ) UPLO, N, NB( 1 ), INFO, CTIME ELSEIF ( PRBLM .EQ. SBTRD ) THEN WRITE( OUNIT, 9525 ) UPLO, JOBU, N, B1, INFO, CTIME ELSEIF ( PRBLM .EQ. SYRDB ) THEN WRITE( OUNIT, 9535 ) UPLO, JOBU, N, B2, NB( 1 ), INFO, > CTIME ELSEIF ( PRBLM .EQ. SBRDB ) THEN WRITE( OUNIT, 9545 ) JOBU, N, B1, B2, NB( 1 ), INFO, CTIME ELSEIF ( PRBLM .EQ. SBRDT ) THEN WRITE( OUNIT, 9555 ) JOBU, N, B1, NB( 1 ), INFO, CTIME ELSEIF ( PRBLM .EQ. SYRDD ) THEN WRITE( OUNIT, 9605 ) UPLO, JOBU, N, B2, NSTEPS, STEP, > INFO, CTIME ELSEIF ( PRBLM .EQ. SBRDD ) THEN WRITE( OUNIT, 9615 ) UPLO, JOBU, N, B1, B2, NSTEPS, STEP, > INFO, CTIME ENDIF ENDIF * * - - - - - - - - check if the error code is as expected - - - - - - - * IF ( INFO .NE. XINFO1 ) THEN * * --- wrong error code --- * FAIL( PRBLM ) = FAIL( PRBLM ) + 1 IF ( ( PRBLM .EQ. SYRDD ) .OR. ( PRBLM .EQ. SBRDD ) ) THEN WRITE( OUNIT, 9900 ) LINE0, PRBLMN( PRBLM ), INFO, STEP, > XINFO1 ELSE WRITE( OUNIT, 9901 ) LINE0, PRBLMN( PRBLM ), INFO, XINFO1 ENDIF GOTO 3000 ELSEIF ( ( ( PRBLM .EQ. SYRDD ) .OR. ( PRBLM .EQ. SBRDD ) ) > .AND. ( INFO .EQ. 1 ) .AND. ( NSTEPS .GT. 0 ) > .AND. ( STEP .NE. NSTEPS ) ) THEN * * --- error code was ok, but the driver took a wrong * number of steps --- * FAIL( PRBLM ) = FAIL( PRBLM ) + 1 WRITE( OUNIT, 9910 ) LINE0, PRBLMN( PRBLM ), STEP, > NSTEPS GOTO 3000 ELSEIF ( INFO .LT. 0 ) THEN * * --- successful error exit --- * ERRCHK = .TRUE. GOTO 3000 ENDIF * * - - - - - - - - check workspace usage - - - - - - - - - - - - - - - - * NUSED = 0 DO 2200 I = 1, MIN( MAX( 2*LWORK1, 10000 ), SZWORK ) IF ( .NOT. ( WORK( I ) .EQ. NOTUSD ) ) NUSED = I 2200 CONTINUE * IF ( NUSED .GT. LWORK1 ) THEN * * --- ran over the workspace bounds --- * FAIL( PRBLM ) = FAIL( PRBLM ) + 1 WRITE( OUNIT, 9920 ) LINE0, PRBLMN( PRBLM ), NUSED, LWORK1 GOTO 3000 ELSEIF ( OLEVEL .GE. OUTDET ) THEN * * --- write protocol --- * WRITE( OUNIT, 9410 ) NUSED, LWORK1 ENDIF * * - - - - - - - - accumulate transformations, if required - - - - - - - * IF ( ( PRBLM .EQ. SYTRD ) .AND. LSAME( JOBU, 'Update' ) ) THEN * * --- copy the Householder vectors into the array u --- * CALL SLACPY( UPLO, N, N, A, LDA1, U, LDU ) * * --- backward accumulation --- * TRY( ORGTR ) = TRY( ORGTR ) + 1 INFO = 0 BTIME = SECOND() CALL SORGTX( NB( 2 ), NX2, UPLO, N, U, LDU, TAU, > WORK, LWORK2, INFO ) CTIME = SECOND() - BTIME RTIME = RTIME + CTIME * * --- protocol output, if required --- * IF ( OLEVEL .GE. OUTDET ) THEN WRITE( OUNIT, 9620 ) UPLO, N, LDU, NB( 2 ), NX2, LWORK2 WRITE( OUNIT, 9400 ) INFO, CTIME ENDIF * * --- is the error code as expected ? --- * IF ( INFO .NE. XINFO2 ) THEN FAIL( ORGTR ) = FAIL( ORGTR ) + 1 WRITE( OUNIT, 9901 ) LINE0, 'sorgtr', INFO, XINFO2 GOTO 3000 ELSEIF ( INFO .NE. 0 ) THEN ERRCHK = .TRUE. GOTO 3000 ENDIF * ELSEIF ( ( PRBLM .EQ. SYRDB ) .AND. LSAME( JOBU0, 'Update' ) ) > THEN * * --- copy the Householder vectors into the array u --- * CALL SLACPY( UPLO, N, N, A, LDA1, U, LDU ) * * --- backward accumulation --- * TRY( SYGTR ) = TRY( SYGTR ) + 1 INFO = 0 BTIME = SECOND() CALL SSYGTR( UPLO, N, B2, U, LDU, TAU, WORK, LWORK2, INFO ) CTIME = SECOND() - BTIME RTIME = RTIME + CTIME * * --- protocol output, if required --- * IF ( OLEVEL .GE. OUTDET ) THEN WRITE( OUNIT, 9630 ) UPLO, N, B2, LDU, LWORK2 WRITE( OUNIT, 9400 ) INFO, CTIME ENDIF * * --- is the error code as expected ? --- * IF ( INFO .NE. XINFO2 ) THEN FAIL( SYGTR ) = FAIL( SYGTR ) + 1 WRITE( OUNIT, 9901 ) LINE0, 'ssygtr', INFO, XINFO2 GOTO 3000 ELSEIF ( INFO .NE. 1 ) THEN GOTO 3000 ENDIF ENDIF * * - - - - - - - - check results - - - - - - - - - - - - - - - - - - - - * ORTHU = -ONE SORTHU = -ONE RES = -ONE SRES = -ONE DEVLS = -ONE SDEVLS = -ONE * IF ( ( .NOT. ERRCHK ) .AND. > CHECKS .AND. LSAME( CHECK, 'Check' ) ) THEN OK = .TRUE. * * --- if the reduced matrix is banded then copy it * into the array acpy --- * IF ( PRBLM .EQ. SYRDB ) THEN INFO = 0 BTIME = SECOND() CALL SSY2BC( UPLO, N, B2, A, LDA1, ACPY, LDA2, INFO ) CTIME = SECOND() - BTIME IF ( OLEVEL .GE. OUTDET ) THEN WRITE( OUNIT, 9560 ) UPLO, N, B2, LDA1, LDA2 WRITE( OUNIT, 9400 ) INFO, CTIME ENDIF IF ( LSAME( JOBU0, 'Update' ) ) JOBU = 'Update' ELSEIF ( ( PRBLM .EQ. SBRDB ) .OR. > ( ( PRBLM .EQ. SBRDD ) .AND. ( B2 .GT. 1 ) ) ) THEN INFO = 0 BTIME = SECOND() CALL SSB2BC( 'Lower', N, B2, A, LDA1, ACPY, LDA2, INFO ) CTIME = SECOND() - BTIME IF ( OLEVEL .GE. OUTDET ) THEN WRITE( OUNIT, 9580 ) 'Lower', N, B2, LDA1, LDA2 WRITE( OUNIT, 9400 ) INFO, CTIME ENDIF ELSEIF ( ( PRBLM .EQ. SY2BI ) .OR. ( PRBLM .EQ. SB2BI ) ) > THEN INFO = 0 BTIME = SECOND() CALL SSB2BC( 'Lower', N, B2, A, LDA2, ACPY, LDA2, INFO ) CTIME = SECOND() - BTIME IF ( OLEVEL .GE. OUTDET ) THEN WRITE( OUNIT, 9580 ) UPLO, N, B2, LDA2, LDA2 WRITE( OUNIT, 9400 ) INFO, CTIME ENDIF ELSEIF ( PRBLM .EQ. SYRDD ) THEN * * --- copy orthogonal matrix into u --- * CALL SLACPY( 'Full', N, N, A, LDA1, U, LDU ) ENDIF * * --- perform numerical checks --- * INFO = 0 BTIME = SECOND() CALL SSYNCK( EVLS, FRMT1, UPLO, N, B1, A, LDA1, SZA, > FRMT2, B2, ACPY, LDA2, D, E, JOBU, U, LDU, > ORTHU, SORTHU, RES, SRES, DEVLS, SDEVLS, > NOTUSD, WORK, SZWORK, INFO ) CTIME = SECOND() - BTIME * * --- protocol output, if required --- * IF ( OLEVEL .GE. OUTDET ) THEN WRITE( OUNIT, 9640 ) FRMT1, UPLO, N, B1, LDA1, SZA WRITE( OUNIT, 9641 ) FRMT2, B2, LDA2, JOBU, LDU WRITE( OUNIT, 9642 ) ORTHU, SORTHU WRITE( OUNIT, 9643 ) RES, SRES WRITE( OUNIT, 9644 ) DEVLS, SDEVLS WRITE( OUNIT, 9645 ) NOTUSD, SZWORK WRITE( OUNIT, 9400 ) INFO, CTIME ENDIF * * --- failed any computational check ? --- * IF ( .NOT. ( SORTHU .LE. TORTHU ) ) THEN WRITE( OUNIT, 9930 ) LINE0, 'orhogonality', SORTHU, TORTHU OK = .FALSE. ENDIF IF ( .NOT. ( SRES .LE. TRES ) ) THEN WRITE( OUNIT, 9930 ) LINE0, 'residual', SRES, TRES OK = .FALSE. ENDIF IF ( .NOT. ( SDEVLS .LE. TDEVLS ) ) THEN WRITE( OUNIT, 9930 ) LINE0, 'eigenvalues', SDEVLS, TDEVLS OK = .FALSE. ENDIF IF ( .NOT. OK ) FAIL( PRBLM ) = FAIL( PRBLM ) + 1 ENDIF * * - - - - - - - - print summary for this run - - - - - - - - - - - - - * 3000 IF ( OLEVEL .GE. OUTRUN ) THEN WRITE( OUNIT, 9700 ) LINE0, PRBLMN( PRBLM ), COMMNT( PRBLM ) * IF ( PRBLM .EQ. SYTRD ) THEN WRITE( OUNIT, 9710 ) MTYPE, DIAM, UPLO, N, LDA1 WRITE( OUNIT, 9711 ) NB( 1 ), NX1, LWORK1, XINFO1 WRITE( OUNIT, 9712 ) JOBU, NB( 2 ), NX2, LWORK2, XINFO2 ELSEIF ( PRBLM .EQ. SBTRD ) THEN WRITE( OUNIT, 9720 ) MTYPE, DIAM, UPLO, N, B1, LDA1 WRITE( OUNIT, 9721 ) JOBU, LDU, XINFO1 ELSEIF ( PRBLM .EQ. SYRDB ) THEN WRITE( OUNIT, 9730 ) MTYPE, DIAM, UPLO, N, LDA1, B2 WRITE( OUNIT, 9731 ) DRPTOL, NB( 1 ), LWORK1, XINFO1 WRITE( OUNIT, 9732 ) JOBU, LDU, LWORK2, XINFO2 ELSEIF ( PRBLM .EQ. SBRDB ) THEN WRITE( OUNIT, 9740 ) MTYPE, DIAM, N, B1, LDA1, B2 WRITE( OUNIT, 9741 ) DRPTOL, NB( 1 ), JOBU, LDU, LWORK1 WRITE( OUNIT, 9742 ) XINFO1 ELSEIF ( PRBLM .EQ. SBRDT ) THEN WRITE( OUNIT, 9750 ) MTYPE, DIAM, N, B1, LDA1 WRITE( OUNIT, 9741 ) DRPTOL, NB( 1 ), JOBU, LDU, LWORK1 WRITE( OUNIT, 9742 ) XINFO1 ELSEIF ( ( PRBLM .EQ. SY2BC ) > .OR. ( PRBLM .EQ. SY2BI ) > .OR. ( PRBLM .EQ. SB2BC ) > .OR. ( PRBLM .EQ. SB2BI ) ) THEN WRITE( OUNIT, 9760 ) MTYPE, DIAM, UPLO, N, B1, LDA1 WRITE( OUNIT, 9761 ) LDA2, XINFO1 ELSEIF ( PRBLM .EQ. SYRDD ) THEN WRITE( OUNIT, 9770 ) MTYPE, DIAM, UPLO, N, LDA1, B2 WRITE( OUNIT, 9771 ) LDA2, NSTEPS, DRPTOL, JOBU, LWORK1 WRITE( OUNIT, 9742 ) XINFO1 IF ( NSTEPS .GT. 1 ) THEN WRITE( OUNIT, 9772 ) ( B( I ), I = 1, NSTEPS-1 ) ENDIF IF ( NSTEPS .GT. 0 ) THEN WRITE( OUNIT, 9773 ) ( NB( I ), I = 1, NSTEPS ) ENDIF ELSEIF ( PRBLM .EQ. SBRDD ) THEN WRITE( OUNIT, 9780 ) MTYPE, DIAM, UPLO, N, B1, LDA1, B2 WRITE( OUNIT, 9781 ) NSTEPS, DRPTOL, JOBU, LDU WRITE( OUNIT, 9782 ) LWORK1, XINFO1 IF ( NSTEPS .GT. 1 ) THEN WRITE( OUNIT, 9772 ) ( B( I ), I = 1, NSTEPS-1 ) ENDIF IF ( NSTEPS .GT. 0 ) THEN WRITE( OUNIT, 9773 ) ( NB( I ), I = 1, NSTEPS ) ENDIF ENDIF * * --- print available information on numerical checks --- * IF ( ERRCHK ) THEN WRITE( OUNIT, 9420 ) ELSE IF ( .NOT. ( SORTHU .EQ. -ONE ) ) THEN WRITE( OUNIT, 9430 ) ORTHU, SORTHU, TORTHU ENDIF IF ( .NOT. ( SRES .EQ. -ONE ) ) THEN WRITE( OUNIT, 9431 ) RES, SRES, TRES ENDIF IF ( .NOT. ( SDEVLS .EQ. -ONE ) ) THEN WRITE( OUNIT, 9432 ) DEVLS, SDEVLS, TDEVLS ENDIF ENDIF * WRITE( OUNIT, 9440 ) RTIME ENDIF * IF ( OLEVEL .GE. OUTDET ) WRITE( OUNIT, 9000 ) * * --- end of the main loop --- * GOTO 2000 * * - - - - - - - - print "global" summary - - - - - - - - - - - - - - - * 8000 WRITE( OUNIT, * ) WRITE( OUNIT, 9010 ) WRITE( OUNIT, 9020 ) WRITE( OUNIT, 9000 ) DO 8100 PRBLM = SYTRD, TOTAL-1 WRITE( OUNIT, 9030 ) PRBLMN( PRBLM ), COMMNT( PRBLM ), > TRY( PRBLM ), SKIP( PRBLM ), > FAIL( PRBLM ) TRY( TOTAL ) = TRY( TOTAL ) + TRY( PRBLM ) SKIP( TOTAL ) = SKIP( TOTAL ) + SKIP( PRBLM ) FAIL( TOTAL ) = FAIL( TOTAL ) + FAIL( PRBLM ) 8100 CONTINUE WRITE( OUNIT, 9000 ) WRITE( OUNIT, 9030 ) PRBLMN( TOTAL ), COMMNT( TOTAL ), > TRY( TOTAL ), SKIP( TOTAL ), FAIL( TOTAL ) WRITE( OUNIT, 9000 ) WRITE( OUNIT, 9040 ) SECOND() - STIME * * - - - - - - - - formats - - - - - - - - - - - - - - - - - - - - - - - * * --- "global" summary" --- * 9000 FORMAT( 1X, '----------------------------------------', > '---------------------------------------' ) 9010 FORMAT( 1X, '========================================', > '=======================================' ) * 9020 FORMAT( 1X, 'Tests for ', > ' Total Skipped Failed' ) 9030 FORMAT( 1X, A6, ' : ', A40, ' :', I8, I8, I8 ) * 9040 FORMAT( 1X, 'Total time : ', F8.2, ' seconds' ) * * --- messages --- * 9100 FORMAT( 1X, A ) * * --- problems with the input file --- * 9300 FORMAT( 1X, '*** Error in line ', I5, ' : ', A40 ) 9310 FORMAT( 1X, '+++ Line ', I5, ' : Test too large - skipped' ) * * --- general status reporting --- * 9400 FORMAT( 1X, ' info=', I5, ', time=', F12.6 ) 9401 FORMAT( 1X, ' step=', I5, ', info=', I5, > ', time=', F12.6 ) * 9410 FORMAT( 1X, ' used ', I8, ' out of ', > I8, ' workspace' ) * 9420 FORMAT( 1X, ' ((( check for error exit ))),' ) * 9430 FORMAT( 1X, ' Norm(U''*U-I) =', E10.3, '=', > E10.3, '*n*macheps (thresh=', E10.3, '),' ) 9431 FORMAT( 1X, ' Norm(U*B-A*U)=', E10.3, '=', > E10.3, '*n*macheps*Norm(A) (thresh=', E10.3, '),' ) 9432 FORMAT( 1X, ' Norm(Dlambda)=', E10.3, '=', > E10.3, '*n*macheps*Norm(A) (thresh=', E10.3, '),' ) * 9440 FORMAT( 1X, ' reduction time=', F12.6 ) * * --- formats for tracing single routine calls --- * 9500 FORMAT( 1X, ' ssyini: mtype=', A1, ', szevls=', I5, > ', diam=', E11.4, ', frmt=', A1, ', uplo=', A1, > ', n=', I5, ',' ) 9501 FORMAT( 1X, ' b=', I5, ', lda=', I5, ', sza=', I8, > ', jobu=', A1, ', ldu=', I5, ', szu=', I8, ',' ) 9502 FORMAT( 1X, ' notusd=', E11.4, ', szwork=', I8, ',' ) * 9510 FORMAT( 1X, ' ssytrd: uplo=', A1, ', n=', I5, ', lda=', I5, > ', nb0=', I5, ', nx0=', I5, ', lwork=', I8, ',' ) 9515 FORMAT( 1X, 'ssytrd: uplo=', A1, ', n=', I5, ', nb=', I3, > ', info=', I3, ', time=', F9.3 ) * 9520 FORMAT( 1X, ' ssbtrd: vect=', A1, ', uplo=', A1, ', n=', I5, > ', kd=', I5, ', ldab=', I5, ', ldu=', I5, ',' ) 9525 FORMAT( 1X, 'ssbtrd: uplo=', A1, ', jobu=', A1, ', n=', I5, > ', b1=', I3, ', info=', I3, ', time=', F9.3 ) * 9530 FORMAT( 1X, ' ssyrdb: uplo=', A1, ', job=', A1, ', n=', I5, > ', b=', I5, ', lda=', I5, ', drptol=', E11.4, ',' ) 9531 FORMAT( 1X, ' ldu=', I5, ', nb=', I5, ', lwork=', I8, > ',' ) 9535 FORMAT( 1X, 'ssyrdb: uplo=', A1, ', jobu=', A1, ', n=', I5, > ', b2=', I3, ', nb=', I3, ', info=', I3, > ', time=', F9.3 ) * 9540 FORMAT( 1X, ' ssbrdb: job=', A1, ', n=', I5, ', b1=', I5, > ', b2=', I5, ', lda=', I5, ', drptol=', E11.4, ',' ) 9545 FORMAT( 1X, 'ssbrdb: jobu=', A1, ', n=', I5, ', b1=', I3, > ', b2=', I3, ', nb=',I3, ', info=', I3, > ', time=', F9.3 ) * 9550 FORMAT( 1X, ' ssbrdt: job=', A1, ', n=', I5, ', b=', I5, > ', lda=', I5, ', drptol=', E11.4, ',' ) 9555 FORMAT( 1X, 'ssbrdt: jobu=', A1, ', n=', I5, ', b1=', I3, > ', nb=', I3, ', info=', I3, ', time=', F9.3 ) * 9560 FORMAT( 1X, ' ssy2bc: uplo=', A1, ', n=', I5, ', b=', I5, > ', ldfull=', I5, ', ldband=', I5, ',' ) * 9570 FORMAT( 1X, ' ssy2bi: uplo=', A1, ', n=', I5, ', b=', I5, > ', ldfull=', I5, ', ldband=', I5, ',' ) * 9580 FORMAT( 1X, ' ssb2bc: uplo=', A1, ', n=', I5, ', b=', I5, > ', ldsrc=', I5, ', lddst=', I5, ',' ) * 9590 FORMAT( 1X, ' ssb2bi: uplo=', A1, ', n=', I5, ', b=', I5, > ', ldsrc=', I5, ', lddst=', I5, ',' ) * 9600 FORMAT( 1X, ' ssyrdd: job=', A1, ', uplo=', A1, ', n=', I5, > ', b2=', I5, ', lda=', I5, ',' ) 9601 FORMAT( 1X, ' drptol=', E11.4, ', ldband=', I5, > ', nsteps=', I5, ', lwork=', I8, ',' ) 9605 FORMAT( 1X, 'ssyrdd: uplo=', A1, ', job=', A1, ', n=', I5, > ', b2=', I3, ', nsteps=', I2, ', step=', I2, > ', info=', I3, ', time=', F9.3 ) * 9610 FORMAT( 1X, ' ssbrdd: jobu=', A1, ', uplo=', A1, ', n=', I5, > ', b1=', I5, ', b2=', I5, ', lda=', I5, ',' ) 9611 FORMAT( 1X, ' drptol=', E11.4, ', ldu=', I5, > ', nsteps=', I5, ', lwork=', I8, ',' ) 9615 FORMAT( 1X, 'ssbrdd: uplo=', A1, ', jobu=', A1, ', n=', I5, > ', b1=', I3, ', b2=', I3, ', nsteps=', I2, > ', step=', I2, ', info=', I3, ', time=', F9.3 ) * 9620 FORMAT( 1X, ' sorgtr: uplo=', A1, ', n=', I5, ', lda=', I5, > ', nb=', I5, ', nx=', I5, ', lwork=', I8, ',' ) * 9630 FORMAT( 1X, ' ssygtr: uplo=', A1, ', n=', I5, ', b=', I5, > ', lda=', I5, ', lwork=', I8, ',' ) * 9640 FORMAT( 1X, ' ssynck: frmt1=', A1, ', uplo1=', A1, ', n=', I5, > ', b1=', I5, ', lda1=', I5, ', sza1=', I8, ',' ) 9641 FORMAT( 1X, ' frmt2=', A1, ', b2=', I5, ', lda2=', I5, > ', jobu=', A1, ', ldu=', I5, ',' ) 9642 FORMAT( 1X, ' Norm( U''*U - I ) =', E11.4, > ' = ', E11.4, '*n*macheps,' ) 9643 FORMAT( 1X, ' Norm( U*B - A*U )=', E11.4, > ' = ', E11.4, '*n*macheps*Norm( A ),' ) 9644 FORMAT( 1X, ' Norm( Dlambda ) =', E11.4, > ' = ', E11.4, '*n*macheps*Norm( A ),' ) 9645 FORMAT( 1X, ' notusd=', E11.4, ', szwork=', I8, ',' ) * * --- formats for tracing single runs --- * 9700 FORMAT( 1X, 'Line ', I5, ' / ', A, ' : ', A, ',' ) * 9710 FORMAT( 1X, ' mtype=', A1, ', diam=', E11.4, > ', uplo=', A1, ', n=', I5, ', lda=', I5, ',' ) 9711 FORMAT( 1X, ' nb1=', I5, ', nx1=', I5, ', lwork1=', I8, > ', xinfo1=', I5, ',' ) 9712 FORMAT( 1X, ' jobu=', A1, ', nb2=', I5, ', nx2=', I5, > ', lwork2=', I8, ', xinfo2=', I5, ',' ) * 9720 FORMAT( 1X, ' mtype=', A1, ', diam=', E11.4, ', uplo=', A1, > ', n=', I5, ', b1=', I5, ', lda=', I5, ',' ) 9721 FORMAT( 1X, ' jobu=', A1, ', ldu=', I5, ', xinfo=', I5, ',' ) * 9730 FORMAT( 1X, ' mtype=', A1, ', diam=', E11.4, ', uplo=', A1, > ', n=', I5, ', lda=', I5, ', b2=', I5, ',' ) 9731 FORMAT( 1X, ' drptol=', E11.4, ', nb=', I5, ', lwork1=', I8, > ', xinfo1=', I5, ',' ) 9732 FORMAT( 1X, ' jobu=', A1, ', ldu=', I5, ', lwork2=', I8, > ', xinfo2=', I5, ',' ) * 9740 FORMAT( 1X, ' mtype=', A1, ', diam=', E11.4, ', n=', I5, > ', b1=', I5, ', lda=', I5, ', b2=', I5, ',' ) 9741 FORMAT( 1X, ' drptol=', E11.4, ', nb=', I5, ', jobu=', A1, > ', ldu=', I5, ', lwork=', I8, ',' ) 9742 FORMAT( 1X, ' xinfo=', I5, ',' ) * 9750 FORMAT( 1X, ' mtype=', A1, ', diam=', E11.4, > ', n=', I5, ', b1=', I5, ', lda=', I5, ',' ) * 9760 FORMAT( 1X, ' mtype=', A1, ', diam=', E11.4, ', uplo=', A1, > ', n=', I5, ', b1=', I5, ', lda1=', I5, ',' ) 9761 FORMAT( 1X, ' lda2=', I5, ', xinfo=', I5, ',' ) * 9770 FORMAT( 1X, ' mtype=', A1, ', diam=', E11.4, ', uplo=', A1, > ', n=', I5, ', lda1=', I5, ', b2=', I5, ',' ) 9771 FORMAT( 1X, ' lda2=', I5, ', nsteps=', I5, > ', drptol=', E11.4, ', jobu=', A1, ', lwork=', I8, ',' ) 9772 FORMAT( 1X, ' b ( 2: )=', 100(I5, ',') ) 9773 FORMAT( 1X, ' nb( 1: )=', 100(I5, ',') ) * 9780 FORMAT( 1X, ' mtype=', A1, ', diam=', E11.4, ', uplo=', A1, > ', n=', I5, ', b1=', I5, ', lda=', I5, ', b2=', I5, > ',' ) 9781 FORMAT( 1X, ' nsteps=', I5, ', drptol=', E11.4, > ', jobu=', A1, ', ldu=', I5, ',' ) 9782 FORMAT( 1X, ' lwork=', I8, ', xinfo=', I5, ',' ) * * --- unexpected behaviour of the routines --- * 9900 FORMAT( 1X, '*** Test in line ', I5, ' failed : ', A6, > ' returned info=', I5, ' in step ', I5, > ' (expected ', I5, ')' ) 9901 FORMAT( 1X, '*** Test in line ', I5, ' failed : ', A6, > ' returned info=', I5, ' (expected ', I5, ')' ) * 9910 FORMAT( 1X, '*** Test in line ', I5, ' failed : ', A6, > ' returned step=', I5, ' (expected ', I5, ')' ) * 9920 FORMAT( 1X, '*** Test in line ', I5, ' failed : ', A6, > ' used ', I8, ' workspace (allowed ', I8, ')' ) * 9930 FORMAT( 1X, '*** Test in line ', I5, ' failed ', A, > ' test: ', E10.3, ' (thresh=', E10.3, ')' ) * * - - - - - - - - done - - - - - - - - - - - - - - - - - - - - - - - - * STOP END * * ********************************************************************** * SUBROUTINE SSYINI( MTYPE, EVLS, SZEVLS, DIAM, > FRMT, UPLO, N, B, A, LDA, SZA, > JOBU, U, LDU, SZU, > NOTUSD, WORK, SZWORK, INFO ) * * Description: * * Generates a symmetric (full or banded) matrix A with either * prescribed eigenvalues, random eigenvalues, or two clusters of * eigenvalues. The matrix is returned either in (upper or lower) * symmetric full storage or in (upper or lower) symmetric banded * storage. In addition, U can be set to the identity matrix. * * Note: In contrast to the LAPACK routine slagsy, this routine * generates the banded matrix within an n-by-(b+1) array. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * ---------------------------------------------------------------------- * * Parameters: * CHARACTER*1 MTYPE, FRMT, UPLO, JOBU INTEGER N, B, LDA, SZA, LDU, SZU, SZWORK, SZEVLS, > INFO REAL DIAM, NOTUSD REAL A( LDA, * ), U( LDU, * ), EVLS( * ), > WORK( * ) * * mtype (in) character*1 * The matrix type. * mtype = 'S' : Generate a matrix with prescribed eigenvalues. * = 'R' : Eigenvalues are uniformly random in [ -1, 1 ). * = 'I' : ISDA-type matrix: eigenvalues are clustered * around 0 and 1. * * evls (in OR out) real array, dimension ( szevls ) * The eigenvalues of the matrix A. * If mtype = 'S' then evls is an input parameter, and the * first n elements of evls are taken as eigenvalues for the * matrix A. * If mtype = 'R' or 'I', then evls is an output parameter and * contains the eigenvalues of the matrix A. * * szevls (in) integer * The size of the array evls. * szevls >= n. * * diam (in) real * The diameter of the eigenvalue clusters (in multiples of * machine_epsilon). * Accessed only if mtype = 'I'. * * frmt (in) character*1 * The storage format for the matrix A. * frmt = 'F' : (Symmetric upper or lower) full storage. * = 'B' : (Symmetric upper or lower) banded storage. * * uplo (in) character*1 * Which triangle of the matrix is used? * uplo = 'U' : Initialize the upper triangle. * = 'L' : Initialize the lower triangle. * In banded storage (frmt = 'B'), uplo also determines * whether the upper or lower banded storage scheme is used. * * n (in) integer * The dimension of the matrix. * n >= 0. * * b (in) integer * The semibandwidth (i.e., the number of subdiagonals) of the * matrix A. * 0 <= b <= max( n-1, 0 ). * * a (out) real array, dimension ( lda, n ) * The n-by-n symmetric matrix with semibandwidth b. * If frmt = 'F' then A is returned in the leading n-by-n * subarray - that is, matrix element A( i, j ) is stored at * array position a( i, j ) -, with the strict lower * (uplo = 'U') or the strictly upper (uplo = 'L') triangle set * to some large value (NOT_USED). * If frmt = 'B' then A is returned in banded format in the * leading (b+1)-times-n subarray - that is, matrix element * A( i, j ) is stored at array position a( b+1+i-j, j ) if * uplo = 'U', and at position a( 1+i-j, j ) if uplo = 'L'. * In any case, the remainder of the first n columns is set * to the same large value mentioned above. * * lda (in) integer * The leading dimension of the array a. * lda >= n, if frmt = 'F' * >= b+1, if frmt = 'B'. * * sza (in) integer * The total size (in elements) of the array (not matrix!) a. * sza >= lda * n. * * jobu (in) character*1 * Set the matrix U to identity? * jobu = 'U' : Yes. * = 'N' : No. * * u (out) real array, dimension ( ldu, n ) * If jobu = 'U' then the leading n-by-n subarray is set to * an n-by-n identity matrix. * If jobu = 'N' then u is not accessed. * * ldu (in) integer * The leading dimension of the array u. * ldu >= n. * * szu (in) integer * The total size (in elements) of the array (not matrix!) u. * szu >= ldu * n, if jobu = 'U' * >= 0 , if jobu = 'N'. * * notusd (in) real * Value for marking elements that should not be used. * Typically a rather large number. * * work (workspace) real array, dimension ( szwork ) * * szwork (in) integer * The size of the array work. * szwork >= 2 * n. * * info (out) integer * On exit, info indicates the consistence of the arguments. * = 0 : All arguments are OK. * = -1 : mtype is none of 'S', 'R', 'I' (upper/lower case). * = -3 : szevls is too small ( < n ). * = -4 : diam is out of range (negative). * = -5 : frmt is none of 'F', 'B' (upper or lower case). * = -6 : uplo is none of 'U', 'L' (upper or lower case). * = -7 : n is out of range ( < 0 ). * = -8 : b is out of range ( < 0 or > max( n-1, 0 ) ). * = -10 : lda is too small ( < n, if full, < b+1, if banded). * = -11 : sza is too small ( < n*lda ). * = -12 : jobu is none of 'U', 'N' (upper or lower case). * = -14 : ldu is too small ( < n ). * = -15 : szu is too small ( < n*ldu, if U is required). * = -18 : szwork is too small (see above). * * ---------------------------------------------------------------------- * * Local constants and variables: * REAL ZERO, HALF, ONE, TWO PARAMETER ( ZERO = 0.0E0, HALF = 0.5E0, > ONE = 1.0E0, TWO = 2.0E0 ) * LOGICAL SPEC, ISDA, FULL, UPPER, NEEDU INTEGER ISEED( 4 ) REAL SDIAM * * spec matrix with prescribed spectrum ? * isda ISDA-type matrix or random matrix ? * full store the matrix in full or banded format ? * upper use upper or lower triangle ? * needu update I or not ? * iseed seed for the random number generator * sdiam scaled diameter * INTEGER D, I, J, K, Q REAL C, S, FILL, A11, A12, A21, A22, TMP * * d the number of the new diagonal * c cosine of the rotation angle * s sine of the rotation angle * fill new fill-in element * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * REAL R1MACH, SLARAN EXTERNAL SCOPY, SLAGSY, R1MACH, SLARAN, SLARTG, > SLASET * * scopy vector copy (BLAS) * slagsy generate symmetric matrix (LAPACK TMG) * slamch inquire machine parameters (LAPACK) * slaran random number generator (LAPACK TMG) * slartg generate rotation (LAPACK) * slaset initialize diagonal matrix (LAPACK) * INTRINSIC MAX, MIN * * ---------------------------------------------------------------------- * * --- sanity check for the arguments --- * SPEC = LSAME( MTYPE, 'Spectrum' ) ISDA = LSAME( MTYPE, 'Isda' ) FULL = LSAME( FRMT, 'Full' ) UPPER = LSAME( UPLO, 'Upper' ) NEEDU = LSAME( JOBU, 'Update' ) * IF ( .NOT. ( ISDA .OR. SPEC .OR. LSAME( MTYPE, 'Random' ) ) ) > THEN INFO = -1 ELSEIF ( SZEVLS .LT. N ) THEN INFO = -3 ELSEIF ( DIAM .LT. ZERO ) THEN INFO = -4 ELSEIF ( .NOT. ( FULL .OR. LSAME( FRMT, 'Banded' ) ) ) THEN INFO = -5 ELSEIF ( .NOT. ( UPPER .OR. LSAME( UPLO, 'Lower' ) ) ) THEN INFO = -6 ELSEIF ( N .LT. 0 ) THEN INFO = -7 ELSEIF ( ( B .LT. 0 ) .OR. ( B .GT. MAX( N-1, 0 ) ) ) THEN INFO = -8 ELSEIF ( ( FULL .AND. ( LDA .LT. N ) ) > .OR. ( LDA .LT. B+1 ) ) THEN INFO = -10 ELSEIF ( SZA .LT. N*LDA ) THEN INFO = -11 ELSEIF ( .NOT. ( NEEDU .OR. LSAME( JOBU, 'NoUpdate' ) ) ) THEN INFO = -12 ELSEIF ( LDU .LT. N ) THEN INFO = -14 ELSEIF ( NEEDU .AND. ( SZU .LT. N*LDU ) ) THEN INFO = -15 ELSEIF ( SZWORK .LT. 2*N ) THEN INFO = -18 ELSE INFO = 0 ENDIF IF ( INFO .NE. 0 ) GOTO 9999 * * --- check for quick return --- * IF ( N .EQ. 0 ) GOTO 9999 * IF ( .NOT. SPEC ) THEN * * --- set up eigenvalue distribution --- * ISEED( 1 ) = 4001 ISEED( 2 ) = 3001 ISEED( 3 ) = 2001 ISEED( 4 ) = 1001 * SDIAM = TWO * DIAM * R1MACH(4) DO 1000 I = 1, N IF ( ISDA ) THEN EVLS( I ) = SDIAM * ( SLARAN( ISEED ) - HALF ) IF ( SLARAN( ISEED ) .LT. HALF ) THEN EVLS( I ) = EVLS( I ) + ONE ENDIF ELSE EVLS( I ) = TWO * ( SLARAN( ISEED ) - HALF ) ENDIF 1000 CONTINUE ENDIF * * --- initialize random number generator --- * ISEED( 1 ) = 1001 ISEED( 2 ) = 2001 ISEED( 3 ) = 3001 ISEED( 4 ) = 4001 * IF ( FULL ) THEN * * - - - - - - - initialize matrix in full storage - - - - - - - - - - - * CALL SLAGSY( N, B, EVLS, A, LDA, ISEED, WORK, INFO ) * IF ( UPPER ) THEN * * --- mark lower triangle "not used" --- * DO 2100 J = 1, N-1 DO 2010 I = J+1, N A( I, J ) = NOTUSD 2010 CONTINUE 2100 CONTINUE ELSE * * --- mark upper triangle "not used" --- * DO 2300 J = 2, N DO 2210 I = 1, J-1 A( I, J ) = NOTUSD 2210 CONTINUE 2300 CONTINUE ENDIF * ELSE * * - - - - - - - - initialize matrix in banded storage - - - - - - - - - * * - - - - - - - - first initialize in lower packed storage - - - - - - - * CALL SCOPY( N, EVLS, 1, A( 1, 1 ), LDA ) * DO 3500 D = 1, B * * --- add d-th diagonal --- * DO 3300 I = N-1, 1, -1 * * --- to generate an new element at position * ( i+1, i-d ), ... --- * * --- ... first determine a random rotation, ... --- * A11 = SLARAN( ISEED ) A12 = SLARAN( ISEED ) CALL SLARTG( A11, A12, C, S, TMP ) * * --- ... apply it to rows i and i+1, ... --- * DO 3010 Q = MAX( I-D+1, 1 ), I-1 IF ( Q .EQ. ( I-D+1 ) ) THEN A( D+1, Q ) = -S * A( D, Q ) A( D, Q ) = C * A( D, Q ) ELSE TMP = C * A( I-Q+2, Q ) - S * A( I-Q+1, Q ) A( I-Q+1, Q ) = C * A( I-Q+1, Q ) + S * A( I-Q+2, Q ) A( I-Q+2, Q ) = TMP ENDIF 3010 CONTINUE * * --- ... apply it to A( i:i+1, i:i+1 ), ... --- * IF ( D .EQ. 1 ) THEN A11 = C * A( 1, I ) A21 = -S * A( 1, I ) A12 = S * A( 1, I+1 ) A22 = C * A( 1, I+1 ) ELSE A11 = C * A( 1, I ) + S * A( 2, I ) A21 = C * A( 2, I ) - S * A( 1, I ) A12 = C * A( 2, I ) + S * A( 1, I+1 ) A22 = C * A( 1, I+1 ) - S * A( 2, I ) ENDIF A( 1, I ) = C * A11 + S * A12 A( 2, I ) = C * A21 + S * A22 A( 1, I+1 ) = C * A22 - S * A21 * * --- ... apply it to columns i and i+1, ... --- * DO 3020 Q = I+2, MIN( I+D, N ) TMP = C * A( Q-I, I+1 ) - S * A( Q-I+1, I ) A( Q-I+1, I ) = C * A( Q-I+1, I ) + S * A( Q-I, I+1 ) A( Q-I, I+1 ) = TMP 3020 CONTINUE IF ( ( I+D+1 ) .LE. N ) THEN FILL = S * A( D+1, I+1 ) A( D+1, I+1 ) = C * A( D+1, I+1 ) ENDIF * * --- ... and chase the fill-in element down the band --- * DO 3200 K = I+D, N-1, D * CALL SLARTG( A( D+1, K-D ), FILL, C, S, TMP ) A( D+1, K-D ) = TMP * DO 3110 Q = K-D+1, K-1 TMP = C * A( K-Q+2, Q ) - S * A( K-Q+1, Q ) A( K-Q+1, Q ) = C * A( K-Q+1, Q ) + S * A( K-Q+2, Q ) A( K-Q+2, Q ) = TMP 3110 CONTINUE * A11 = C * A( 1, K ) + S * A( 2, K ) A21 = C * A( 2, K ) - S * A( 1, K ) A12 = C * A( 2, K ) + S * A( 1, K+1 ) A22 = C * A( 1, K+1 ) - S * A( 2, K ) A( 1, K ) = C * A11 + S * A12 A( 2, K ) = C * A21 + S * A22 A( 1, K+1 ) = C * A22 - S * A21 * DO 3120 Q = K+2, MIN( K+D, N ) TMP = C * A( Q-K, K+1 ) - S * A( Q-K+1, K ) A( Q-K+1, K ) = C * A( Q-K+1, K ) + S * A( Q-K, K+1 ) A( Q-K, K+1 ) = TMP 3120 CONTINUE IF ( ( K+D+1 ) .LE. N ) THEN FILL = S * A( D+1, K+1 ) A( D+1, K+1 ) = C * A( D+1, K+1 ) ENDIF 3200 CONTINUE * 3300 CONTINUE * * --- mark the last d entries of the row "not used" --- * DO 3410 I = N-D+1, N A( D+1, I ) = NOTUSD 3410 CONTINUE * 3500 CONTINUE * * - - - - - - - - end : first initialize in lower packed storage - - - - * IF ( UPPER ) THEN * * --- convert from lower to upper banded storage --- * DO 3700 I = 0, B/2 CALL SCOPY( N-B+I, A( B+1-I, 1 ), LDA, WORK, 1 ) DO 3610 J = 1, N-I A( B+1-I, I+J ) = A( I+1, J ) 3610 CONTINUE DO 3620 K = 1, I A( B+1-I, K ) = NOTUSD 3620 CONTINUE CALL SCOPY( N-B+I, WORK, 1, A( I+1, B+1-I ), LDA ) DO 3630 K = 1, B-I A( I+1, K ) = NOTUSD 3630 CONTINUE 3700 CONTINUE ENDIF * * - - - - - - - - end : initialize matrix in banded storage - - - - - - * ENDIF * * --- generate identity matrix in U --- * IF ( NEEDU ) THEN CALL SLASET( 'All', N, N, ZERO, ONE, U, LDU ) ENDIF * 9999 RETURN END * * ********************************************************************** * SUBROUTINE SSYNCK( EVLS, FRMT1, UPLO1, N, B1, A1, LDA1, SZA1, > FRMT2, B2, A2, LDA2, D, E, > JOBU, U, LDU, > ORTHU, SORTHU, RES, SRES, DEVLS, SDEVLS, > NOTUSD, WORK, SZWORK, INFO ) * * Description: * * This routine performs numerical tests after an orthogonal * transformation * T * A --> B = U * A * U. * A is rebuilt by calling ssyini, B may be given in banded or * tridiagonal format. * Depending on whether U was build explicitly during the reduction, * either * T * the orthogonality U * U - I of U * and the residual U * B - A * U * or * the difference between A's and B's eigenvalues * is checked. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * ---------------------------------------------------------------------- * * Parameters: * CHARACTER*1 FRMT1, UPLO1, FRMT2, JOBU INTEGER N, B1, LDA1, SZA1, B2, LDA2, LDU, > SZWORK, INFO REAL ORTHU, SORTHU, RES, SRES, DEVLS, SDEVLS, > NOTUSD REAL EVLS( * ), A1( LDA1, * ), A2( LDA2, * ), > D( * ), E( * ), U( LDU, * ), WORK( * ) * * evls (in) real array, dimension ( n ) * The eigenvalues of the matrix A, as returned from ssyini. * * frmt1 (in) character*1 * The storage format of the original matrix A. * frmt1 = 'F' : (Symmetric) full storage. * = 'B' : (Symmetric) banded storage. * * uplo1 (in) character*1 * Which triangle of the matrix A (and B) is used? * uplo1 = 'U' : Use the upper triangle. * = 'L' : Use the lower triangle. * In banded storage (frmt1 = 'B'), uplo1 also determines * whether the upper or lower banded storage scheme is used. * * n (in) integer * The dimension of the matrix. * n >= 0. * * b1 (in) integer * The semibandwidth (i.e., the number of subdiagonals) of the * original matrix A. * 0 <= b1 <= max( n-1, 0 ). * * a1 (out) real array, dimension ( lda1, n ) * a1 is used to build a copy of the original n-by-n symmetric * matrix A with semibandwidth b1. * If frmt = 'F' then A is returned in the leading n-by-n * subarray - that is, matrix element A( i, j ) is stored at * array position a1( i, j ) -, with the strict lower * (uplo = 'U') or the strictly upper (uplo = 'L') triangle set * to some large value (NOT_USED). * If frmt = 'B' then A is returned in banded format in the * leading (b1+1)-times-n subarray - that is, matrix element * A( i, j ) is stored at array position a1( b1+1+i-j, j ) if * uplo = 'U', and at position a1( 1+i-j, j ) if uplo = 'L'. * * lda1 (in) integer * The leading dimension of the array a1. * lda >= n, if frmt1 = 'F' * >= b1+1, if frmt1 = 'B'. * * sza1 (in) integer * The total size (in elements) of the array (not matrix!) a1. * sza1 >= lda1 * n. * * frmt2 (in) character*1 * The storage format of the reduced matrix B. * frmt1 = 'B' : (Symmetric) banded storage. * = 'T' : (Symmetric) tridiagonal in arrays d and e. * * b2 (in) integer * The semibandwidth (i.e., the number of subdiagonals) of the * reduced matrix B. * 0 <= b2 <= max( n-1, 0 ). * * a2 (in) real array, dimension ( lda2, n ) * If frmt2 = 'B' then the leading (b2+1)-times-n subarray of * a2 holds the reduced symmetric matrix B with semibandwidth * b2 in banded format - that is, matrix element A( i, j ) is * stored at array position a2( b2+1+i-j, j ) if uplo = 'U', * and at position a2( 1+i-j, j ) if uplo = 'L'. * If frmt2 = 'T' then a2 is not referenced. * * lda2 (in) integer * The leading dimension of the array a2. * lda2 >= b2+1. * * d (in) real array, dimension ( n ) * If frmt2 = 'T' then the first n elements of d hold the * main diagonal of the tridiagonal matrix B. * If frmt2 = 'B' then d is not referenced. * * e (in) real array, dimension ( n-1 ) * If frmt2 = 'T' then the first n-1 elements of e hold the * subdiagonal (superdiagonal) of the tridiagonal matrix B. * If frmt2 = 'B' then e is not referenced. * * jobu (in) character*1 * Does U contain the accumulated transformations ? * jobu = 'U' : Yes. * = 'N' : No. * * u (in) real array, dimension ( ldu, n ) * If jobu = 'U' then the leading n-by-n subarray contains * the accumulated transformations from the reduction (an * orthogonal matrix). * If jobu = 'N' then u is not accessed. * * ldu (in) integer * The leading dimension of the array u. * ldu >= n. * * orthu (out) real * The orthogonality error : F-norm( U''*U - I ). * If jobu = 'N' then orthu is set to 0. * * sorthu (out) real * The scaled orthogonality error : orthu / ( n * macheps). * If jobu = 'N' then sorthu is set to 0. * * res (out) real * The residual : F-norm( U*B - A*U ). * If jobu = 'N' then res is set to 0. * * sres (out) real * The scaled residual : res / ( n * macheps * F-norm( A ) ). * If jobu = 'N' then sres is set to 0. * * devls (out) real * The change of the eigenvalues : * 2-norm( sort(evls) - sort(spec(B)) ). * If jobu = 'U' then devls is set to 0. * * sdevls (out) real * The scaled eigenvalue changes : * devls / ( n * macheps * F-norm( A ) ). * If jobu = 'U' then sdevls is set to 0. * * notusd (in) real * Value for marking elements that should not be used. * Typically a rather large number. * * work (workspace) real array, dimension ( szwork ) * * szwork (in) integer * The length of the array work. * szwork >= max( 3*n-2, 2*n ). * * info (out) integer * On exit, info indicates the consistence of the arguments. * = 0 : All arguments are OK. * = -2 : frmt1 is none of 'F', 'B' (upper/lower case). * = -3 : uplo1 is none of 'U', 'L' (upper/lower case). * = -4 : n is out of range ( < 0 ). * = -5 : b1 is out of range ( < 0 or > max( n-1, 0 ) ). * = -7 : lda1 too small ( < n, if full, < b1+1, if banded). * = -8 : sza1 is too small ( < n * lda1 ). * = -9 : frmt2 is none of 'B', 'T' (upper/lower case). * = -10 : b2 is out of range ( < 0 or > max( n-1, 0 ), * or > 1 if frmt2 = 'T' ). * = -12 : lda2 is too small ( < b2+1 ). * = -15 : jobu is none of 'U', 'N' (upper/lower case). * = -17 : ldu is too small ( < n ). * = -26 : szwork is too small (see above). * * ---------------------------------------------------------------------- * * Local constants and variables: * REAL ZERO, ONE PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0 ) * LOGICAL FULL1, UPPER, TRI2, HAVEU REAL EPS, NORMA INTEGER NCOLS, COLS, J0, J, IX * * full1 build A in full storage ? * upper use upper triangle ? * tri2 is B given in tridiagonal storage ? * haveu is the accumulated matrix U available ? * eps machine epsilon * norma the Frobenius norm of the matrix A * ncols maximum width of a block column that fits into workspace * cols width of current block column * j0 first column of the current block column * j current column * ix points to the position of the current column in workspace * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * REAL R1MACH, SLANGE, SNRM2 EXTERNAL SAXPY, SCOPY, SGEMM, SGEMV, R1MACH, > SLANGE, SLASRT, SNRM2, SSBEV, SSBMV, > SSCAL, SSTEV, SSYINI, SSYMM * * saxpy add multiple of a vector to another one (BLAS) * scopy vector copy (BLAS) * sgemm matrix-matrix product (BLAS) * sgemv matrix-vector product (BLAS) * slamch determine machine parameters (LAPACK) * slange matrix norm (LAPACK) * slasrt sort a vector (LAPACK) * snrm2 2-norm of a vector (BLAS) * ssbev compute eigensystem of symmetric banded matrix (LAPACK) * ssbmv banded symmetri matrix-vector product (BLAS) * sscal scale a vector (BLAS) * sstev compute eigensystem of symmetric tridiagonal matrix (LAPACK) * ssyini initialize symmetric matrix (this file) * ssymm symmetric matrix-matrix product (BLAS) * INTRINSIC MAX, MIN, SQRT * * ---------------------------------------------------------------------- * * --- sanity check for the arguments --- * FULL1 = LSAME( FRMT1, 'Full' ) UPPER = LSAME( UPLO1, 'Upper' ) TRI2 = LSAME( FRMT2, 'Tridiagonal' ) HAVEU = LSAME( JOBU, 'U' ) * IF ( .NOT. ( FULL1 .OR. LSAME( FRMT1, 'Banded' ) ) ) THEN INFO = -2 ELSEIF ( .NOT. ( UPPER .OR. LSAME( UPLO1, 'Lower' ) ) ) THEN INFO = -3 ELSEIF ( N .LT. 0 ) THEN INFO = -4 ELSEIF ( ( B1 .LT. 0 ) .OR. ( B1 .GT. MAX( N-1, 0 ) ) ) THEN INFO = -5 ELSEIF ( ( FULL1 .AND. ( LDA1 .LT. N ) ) .OR. > ( LDA1 .LT. B1+1 ) ) THEN INFO = -7 ELSEIF ( SZA1 .LT. N*LDA1 ) THEN INFO = -8 ELSEIF ( .NOT. ( TRI2 .OR. LSAME( FRMT2, 'Banded' ) ) ) THEN INFO = -9 ELSEIF ( ( B2 .LT. 0 ) .OR. > ( ( N .GT. 0 ) .AND. > ( ( B2 .GT. N-1 ) .OR. > ( TRI2 .AND. ( B2 .GT. 1 ) ) ) ) ) THEN INFO = -10 ELSEIF ( LDA2 .LT. B2+1 ) THEN INFO = -12 ELSEIF ( .NOT. ( HAVEU .OR. LSAME( JOBU, 'NoU' ) ) ) THEN INFO = -15 ELSEIF ( LDU .LT. N ) THEN INFO = -17 ELSEIF ( SZWORK .LT. MAX( 3*N-2, 2*N ) ) THEN INFO = -26 ELSE INFO = 0 ENDIF IF ( INFO .NE. 0 ) GOTO 9999 * * --- check for quick return --- * IF ( N .EQ. 0 ) GOTO 9999 * * --- determine machine precision --- * EPS = R1MACH(4) * T * - - - - - - compute orthogonality error = F-Norm( U * U - I ) - - - * IF ( LSAME( JOBU, 'Update' ) ) THEN ORTHU = ZERO * T * --- how many columns of U * U - I fit into workspace ? --- * NCOLS = SZWORK / N DO 1100 J0 = 1, N, NCOLS COLS = MIN( NCOLS, N-J0+1 ) * T * --- compute n-by-cols block column of U * U --- * CALL SGEMM( 'Transpose', 'NoTranspose', N, COLS, N, > ONE, U, LDU, U( 1, J0 ), LDU, ZERO, WORK, N ) * * --- subtract corresponding parts of I --- * DO 1010 J = J0, J0+COLS-1 WORK( (J-J0)*N+J ) = WORK( (J-J0)*N+J ) - ONE 1010 CONTINUE ORTHU = ORTHU + SLANGE( 'Frobenius', N, COLS, WORK, N, > WORK )**2 1100 CONTINUE ORTHU = SQRT( ORTHU ) SORTHU = ORTHU / ( N * EPS ) ELSE * * --- no orthogonality information available --- * ORTHU = - ONE SORTHU = - ONE ENDIF * T * - - - - - - end : compute orthogonality error = F-Norm( U * U - I ) * NORMA = SNRM2( N, EVLS, 1 ) * IF ( LSAME( JOBU, 'Update' ) ) THEN * * --- do not compute changes in eigenvalues --- * DEVLS = - ONE SDEVLS = - ONE * * - - - - - - - compute residual error = F-Norm( U * B - A * U ) - - - * * --- build another copy of the original matrix A --- * CALL SSYINI( 'Spectrum', EVLS, N, ZERO, > FRMT1, UPLO1, N, B1, A1, LDA1, SZA1, > 'NoU', WORK, N, 0, > NOTUSD, WORK, SZWORK, INFO ) * RES = ZERO * * --- how many cols of U * B - A * U fit into workspace ? --- * NCOLS = SZWORK / N * DO 2000 J0 = 1, N, NCOLS COLS = MIN( NCOLS, N-J0+1 ) * * --- build the next cols columns of U * B --- * IF ( LSAME( FRMT2, 'Tridiagonal' ) ) THEN DO 2010 J = J0, J0+COLS-1 IX = ( J - J0 ) * N + 1 CALL SCOPY( N, U( 1, J ), 1, WORK( IX ), 1 ) CALL SSCAL( N, D( J ), WORK( IX ), 1 ) IF ( J .GT. 1 ) THEN CALL SAXPY( N, E( J-1 ), U( 1, J-1 ), 1, > WORK( IX ), 1 ) ENDIF IF ( J .LT. N ) THEN CALL SAXPY( N, E( J ), U( 1, J+1 ), 1, WORK( IX ), 1 ) ENDIF 2010 CONTINUE ELSE DO 2020 J = J0, J0+COLS-1 IX = ( J - J0 ) * N + 1 CALL SGEMV( 'NoTranspose', N, MIN( B2+1, N-J+1 ), > ONE, U( 1, J ), LDU, A2( 1, J ), 1, > ZERO, WORK( IX ), 1 ) IF ( B2 .GT. 0 ) THEN IF ( J .GT. B2 ) THEN CALL SGEMV( 'NoTranspose', N, B2, > ONE, U( 1, J-B2 ), LDU, > A2( B2+1, J-B2 ), LDA2 - 1, > ONE, WORK( IX ), 1 ) ELSEIF ( J .GT. 1 ) THEN CALL SGEMV( 'NoTranspose', N, J - 1, > ONE, U( 1, 1 ), LDU, > A2( J, 1 ), LDA2 - 1, > ONE, WORK( IX ), 1 ) ENDIF ENDIF 2020 CONTINUE ENDIF * * --- subtract corresponding columns of A * U --- * IF ( LSAME( FRMT1, 'Full' ) ) THEN CALL SSYMM( 'Left', UPLO1, N, COLS, > -ONE, A1, LDA1, U( 1, J0 ), LDU, > ONE, WORK, N ) ELSE DO 2110 J = J0, J0+COLS-1 CALL SSBMV( UPLO1, N, B1, -ONE, A1, LDA1, U( 1, J ), 1, > ONE, WORK( (J-J0)*N+1 ), 1 ) 2110 CONTINUE ENDIF * RES = RES + SLANGE( 'Frobenius', N, COLS, WORK, N, WORK )**2 2000 CONTINUE * RES = SQRT( RES ) SRES = RES / ( N * NORMA * EPS ) * * - - - - - - - end : compute residual error = F-Norm( U * B - A * U ) * ELSE * * --- no residual information available --- * RES = - ONE SRES = - ONE * * - - - - - - - check if eigenvalues have changed - - - - - - - - - - - * * --- compute eigenvalues of the tridiagonal or banded * matrix --- * IF ( LSAME( FRMT2, 'Tridiagonal' ) ) THEN CALL SSTEV( 'NoEigenvectors', N, D, E, WORK, N, WORK, INFO ) ELSE CALL SSBEV( 'NoEigenvectors', 'Lower', N, B2, A2, LDA2, > D, WORK, N, WORK, INFO ) ENDIF * * --- compare with (sorted) original eigenvalues --- * IF ( INFO .EQ. 0 ) THEN CALL SLASRT( 'Increasing', N, EVLS, INFO ) CALL SAXPY( N, -ONE, EVLS, 1, D, 1 ) DEVLS = SNRM2( N, D, 1 ) SDEVLS = DEVLS / ( N * NORMA * EPS ) ELSE DEVLS = - ONE SDEVLS = - ONE ENDIF * * - - - - - - - end : check if eigenvalues have changed - - - - - - - - * ENDIF * 9999 RETURN END * * ********************************************************************** * LOGICAL FUNCTION LXSAME( S1, S2 ) * * Description: * * Checks if two strings agree (ignoring case). * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*( * ) S1, S2 * * s1 (in) character*( * ) * The first string. * * s2 (in) character*( * ) * The second string. * * Local constants and variables: * INTEGER I * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * INTRINSIC LEN * * ---------------------------------------------------------------------- * LXSAME = ( LEN( S1 ) .EQ. LEN( S2 ) ) IF ( LXSAME ) THEN DO 100 I = 1, LEN( S1 ) LXSAME = LXSAME .AND. LSAME( S1( I:I ), S2( I:I ) ) 100 CONTINUE ENDIF * RETURN END * SHAR_EOF fi # end of overwriting check cd .. if test ! -d 'Src' then mkdir 'Src' fi cd 'Src' if test -f 'src.f' then echo shar: will not over-write existing file "'src.f'" else cat << "SHAR_EOF" > 'src.f' * ********************************************************************** * INTEGER FUNCTION NBDFLT( ALGO, PREC, REQEST, N, B1, B2, NEEDU ) * * ---------------------------------------------------------------------- * * Description: * * Determine an appropriate default blocking factor or crossover point * or intermediate bandwidth for the reduction routine specified in * algo. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * ---------------------------------------------------------------------- * * Parameters: * CHARACTER*5 ALGO CHARACTER*1 PREC, REQEST INTEGER N, B1, B2 LOGICAL NEEDU * * algo (in) character*5 * For which SBR routine do we need a control parameter ? * algo = 'SYRDB' : Reduction full -> banded. * = 'SBRDB' : Reduction banded -> banded. * = 'SBRDT' : Reduction banded -> tridiagonal. * = 'SYRDD' : Driver for reducing full matrices. * = 'SBRDD' : Driver for reducing banded matrices. * * prec (in) character*1 * Is it the single or double precision routine ? * prec = 'D' : Double precision. * = 'S' : Single precision. * * reqest (in) character*1 * Which control parameter is required ? * reqest = 'B' : Blocking factor or intermediate bandwidth. * = 'C' : Crossover point to LAPACK code. * * n (in) integer * The size of the matrix to reduce. * n >= 0. * * b1 (in) integer * The bandwidth of the matrix before the reduction. * 0 <= b1 < n. * * b2 (in) integer * The bandwidth of the matrix after the reduction. * 1 <= b2 <= b1 or b1 = b2 = 0. * * needu (in) logical * Do we update the transformation matrix ? * needu = .true. : Yes. * = .false. : No. * * ---------------------------------------------------------------------- * * Local variables: * LOGICAL SINGLE INTEGER DELTAB * * single single or double precision routine ? * deltab number of diagonals to reduce * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * * ---------------------------------------------------------------------- * SINGLE = LSAME( PREC, 'SinglePrecision' ) DELTAB = B1 - B2 * IF ( ( ALGO .EQ. 'SYRDB' ) .AND. > ( LSAME( REQEST, 'BlockingFactor' ) ) ) THEN * * --- block size for reduction from full to banded --- * IF ( NEEDU ) THEN IF ( SINGLE ) THEN NBDFLT = 32 ELSE NBDFLT = 32 ENDIF ELSE IF ( SINGLE ) THEN NBDFLT = 32 ELSE NBDFLT = 32 ENDIF ENDIF * ELSEIF ( ( ALGO .EQ. 'SBRDB' ) .AND. > ( LSAME( REQEST, 'BlockingFactor' ) ) ) THEN * * --- block size for bandwidth reduction --- * IF ( NEEDU ) THEN IF ( SINGLE ) THEN NBDFLT = ( ( DELTAB + 7 ) / 8 ) * 2 ELSE NBDFLT = ( ( DELTAB + 7 ) / 8 ) * 2 ENDIF IF ( NBDFLT .LT. 4 ) NBDFLT = 4 IF ( NBDFLT .GT. DELTAB ) NBDFLT = DELTAB ELSE IF ( SINGLE ) THEN NBDFLT = ( ( DELTAB + 7 ) / 8 ) * 2 ELSE NBDFLT = ( ( DELTAB + 7 ) / 8 ) * 2 ENDIF IF ( NBDFLT .LT. 4 ) NBDFLT = 4 IF ( NBDFLT .GT. DELTAB ) NBDFLT = DELTAB ENDIF IF ( NBDFLT .LT. 1 ) NBDFLT = 1 * ELSEIF ( ( ALGO .EQ. 'SBRDT' ) .AND. > ( LSAME( REQEST, 'BlockingFactor' ) ) ) THEN * * --- block size for reduction to tridiagonal form --- * IF ( NEEDU ) THEN IF ( SINGLE ) THEN NBDFLT = ( ( B1 + 5 ) / 6 ) * 2 ELSE NBDFLT = ( ( B1 + 5 ) / 6 ) * 2 ENDIF IF ( NBDFLT .LT. 4 ) NBDFLT = 4 IF ( NBDFLT .GT. DELTAB ) NBDFLT = DELTAB ELSE NBDFLT = 1 ENDIF * ELSEIF ( ( ALGO .EQ. 'SYRDD' ) .AND. > ( LSAME( REQEST, 'Bandwidth' ) ) ) THEN * * --- intermediate bandwidth in the reduction driver --- * IF ( NEEDU ) THEN NBDFLT = 1 ELSE IF ( ( N .GE. 300 ) .OR. ( B2 .GT. 1 ) ) THEN IF ( SINGLE ) THEN NBDFLT = 32 ELSE NBDFLT = 32 ENDIF ELSE NBDFLT = 1 ENDIF ENDIF * ELSEIF ( ( ALGO .EQ. 'SBRDD' ) .AND. > ( LSAME( REQEST, 'Bandwidth' ) ) ) THEN * * --- intermediate bandwidth in the reduction driver --- * IF ( NEEDU ) THEN NBDFLT = 1 ELSE IF ( SINGLE ) THEN NBDFLT = 32 ELSE NBDFLT = 32 ENDIF ENDIF * ELSEIF ( ( ALGO .EQ. 'SBRDD' ) .AND. > ( LSAME( REQEST, 'CrossoverPoint' ) ) ) THEN * * --- crossover point from SBRDT to SBTRD --- * IF ( NEEDU ) THEN IF ( SINGLE ) THEN NBDFLT = 8 ELSE NBDFLT = 8 ENDIF ELSE IF ( SINGLE ) THEN NBDFLT = 16 ELSE NBDFLT = 16 ENDIF ENDIF * ELSE NBDFLT = 1 ENDIF * RETURN END * * ********************************************************************** * SUBROUTINE SSYRDB( UPLO, JOB, N, B, A, LDA, DRPTOL, > U, LDU, NB, TAU, > WORK, LWORK, INFO ) * * ---------------------------------------------------------------------- * * Description: * * Given a symmetric n-times-n matrix A with either its lower or upper * triangle explicitly stored, ssyrdb reduces A to a symmetric banded * matrix B with b sub(super)diagonals by using a sequence of * orthogonal similarity transformations. If desired, the same * transformations are also applied from the right to the matrix U. * That is, if initially U was the identity, then the resulting banded * matrix B and the updated U fulfill the equation * * T * U * A * U = B . * * A must be given in full storage (with either its lower or upper * triangle explicitly stored) and will be overwritten with B and * the "mantissae" of the Householder vectors used for the reduction. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 UPLO, JOB INTEGER N, B, LDA, LDU, NB, LWORK, INFO REAL DRPTOL REAL A( LDA, * ), U( LDU, * ), TAU( * ), > WORK( * ) * * uplo (in) character*1 * Reduce the upper or lower triangle of A ? * uplo = 'U' : Upper triangle. * = 'L' : Lower triangle. * * job (in) character*1 * Specifies if U is required or not. * job = 'U' : Update U. * = 'N' : Do not update U. * * n (in) integer * The order of the matrix A. * n >= 0. * * b (in) integer * The number of sub(super-)diagonals of the reduced matrix B. * 1 <= b < n, if n > 1. * b = 0 , if n <= 1. * * a (in/out) real array, dimension ( lda, n ) * On entry, this array contains the symmetric matrix A with * either its lower (uplo = 'L') or upper (uplo = 'U') triangle * stored. * On exit, the main diagonal and the first b sub-(super-) * diagonals contain the banded matrix B, and the Householder * vectors that were used in the reduction are stored in the * remaining parts of the lower (upper) triangle. * * lda (in) integer * The leading dimension of the array a. * lda >= max( n, 1 ). * * drptol (in) real * Threshold for dropping the Householder transformations: if * the norm of the vector to be eliminated is already smaller * than drptol then the transform is skipped. * drptol >= 0.0. * If you do not know, use 0.0. * * u (in/out) real array, dimension ( ldu, n ) * On entry, u contains some n-by-n matrix U. * On exit, U is postmultiplied with all orthogonal transforms * that were used to reduce A to banded form. * Accessed only if the update of U is required. * * ldu (in) integer * The leading dimension of the array u. * ldu >= max( n, 1 ). * * nb (in) integer * The blocking factor, as suggested by the user, for the * reduction and the update of U. * 0 <= nb <= b. * nb = 0 : User does not know how many Householder transforms * should be blocked for reasonable performance. * Let the routine figure it out (depending on the * workspace available). * nb = 1 : Do not block. * nb > 1 : Try to block nb Housholder transforms * (if the workspace is not sufficient then a smaller * blocking factor will be used). * * tau (out) real array, dimension ( n ) * The scaling factors for the Householder transforms used in * the reduction. * * work (workspace) real array, dimension ( lwork ) * * lwork (in) integer * The size of the workspace (must be provided on entry). * lwork >= 3 * n - 2 * b. * * Workspace that small prevents blocking and may degrade * performance. For using nb-blocked transformations, provide * lwork >= nb * ( 3 * n - 2 * b ). * As a rule, lwork >= 50 * n should be fine. * * info (out) integer * On exit, info indicates the consistence of the arguments. * info = - 1 : uplo is none of 'U', 'L' (upper/lower case). * = - 2 : job is none of 'U', 'N' (upper/lower case). * = - 3 : n is out of range (negative). * = - 4 : b is out of range ( < 0, or = 0 while n > 1, * or >= n ). * = - 6 : lda is out of range ( < n or < 1 ). * = - 7 : drptol is out of range (negative). * = - 9 : ldu is out of range ( < n or < 1 ). * = -10 : nb is out of range (negative). * = -13 : lwork is too small (see above). * info >= 1 : All arguments are OK. * In this case, info returns the blocking factor * that was used in the reduction and in the * update of U. * * ---------------------------------------------------------------------- * * Local variables: * REAL ZERO PARAMETER ( ZERO = 0.0E0 ) * LOGICAL UPPER, NEEDU INTEGER NB0, NB1, NB2, J, J0, > LEN, IW, IY, IWORK * * upper reduce the upper triangle of A ? * needu update U ? * nb0 the final blocking factor for "full" block columns * nb1 width of the current block column to reduce (= nb0, except * for the last block column) * nb2 number of nonzero Householder vectors in the current * WY transform * j first column of the current block column * j0 last column of the current block column * len length of the current block column * iw points to the portion of the workspace where the block * transform W is stored * iy points to the location of Y in the workspace * iwork points to the portion of work that is used as workspace for * other routines * * The workspace is used as follows: * * - The first nb1 * len <= nb0 * ( n - b ) elements hold the block W * of the current block WY transform. * Here, nb1 <= nb0 denotes the width of the current block column and * len <= n - b denotes its height; nb0 is the final blocking factor. * - The next nb1 * len elements hold the block Y. * - Another ( len + nb1 ) * nb1 <= n * nb0 elements are used as * workspace in the routines sgeqrl, sgewyg, sgewy, and ssywy. * * Routines called: * LOGICAL LSAME INTEGER NBDFLT EXTERNAL LSAME, NBDFLT * * lsame case-insensitive character matching (BLAS) * nbdflt determine default blocking factor (SBR) * EXTERNAL SGEQRL, SGEWY, SGEWYG, SSYWY * * sgeqrl QR or QL factorization (SBR) * sgewy apply WY transform from one side (SBR) * sgewyg generate WY factors (SBRtoolbox) * ssywy apply two-sided WY transform to a symmetric matrix (SBR) * INTRINSIC MAX, MIN * * ---------------------------------------------------------------------- * * --- check for errors in input --- * UPPER = LSAME( UPLO, 'U' ) NEEDU = LSAME( JOB, 'U' ) * IF ( .NOT. ( UPPER .OR. LSAME( UPLO, 'L' ) ) ) THEN INFO = - 1 ELSEIF ( .NOT. ( NEEDU .OR. LSAME( JOB, 'N' ) ) ) THEN INFO = - 2 ELSEIF ( N .LT. 0 ) THEN INFO = - 3 ELSEIF ( ( ( N .LE. 1 ) .AND. ( B .NE. 0 ) ) .OR. > ( ( N .GT. 1 ) .AND. > ( ( B .LT. 1 ) .OR. ( B .GE. N ) ) ) ) THEN INFO = - 4 ELSEIF ( LDA .LT. MAX( N, 1 ) ) THEN INFO = - 6 ELSEIF ( DRPTOL .LT. ZERO ) THEN INFO = - 7 ELSEIF ( LDU .LT. MAX( N, 1 ) ) THEN INFO = - 9 ELSEIF ( NB .LT. 0 ) THEN INFO = -10 ELSEIF ( LWORK .LT. ( 3*N-2*B ) ) THEN INFO = -13 ELSE INFO = 1 ENDIF * IF ( INFO .NE. 1 ) GOTO 999 * * --- check for quick return --- * IF ( ( N .LE. 1 ) .OR. ( B .EQ. ( N-1 ) ) ) GOTO 999 * * --- compute the maximum blocking factor for the * given workspace --- * NB0 = LWORK / ( 3 * N - 2 * B ) * * --- adjust to the user-supplied or default value --- * IF ( NB .GT. 0 ) THEN NB0 = MIN( NB, B, NB0 ) ELSE NB0 = MIN( NBDFLT( 'SYRDB', 'SinglePrec', 'BlockingFactor', > N, N-1, B, NEEDU ), > B, NB0 ) ENDIF * * ...................................................................... * IW = 1 * IF ( UPPER ) THEN * * --- reduce the upper triangle --- * DO 100 J0 = N, B+2, - NB0 * LEN = J0 - B NB1 = MIN( NB0, LEN-1 ) J = J0 - NB1 + 1 IY = IW + NB1 * LEN IWORK = IY + NB1 * LEN * CALL SGEQRL( 'L', LEN, NB1, A( 1, J ), LDA, DRPTOL, > TAU( J ), WORK( IWORK ) ) CALL SGEWYG( 'Upper', LEN, NB1, A( 1, J ), LDA, TAU( J ), > WORK( IW ), LEN, WORK( IY ), LEN, NB2, > WORK( IWORK ) ) CALL SGEWY( 'Left', LEN, B - NB1, NB2, A( 1, LEN+1 ), LDA, > WORK( IW ), LEN, WORK( IY ), LEN, > WORK( IWORK ) ) CALL SSYWY( 'Upper', LEN, NB2, A( 1, 1 ), LDA, > WORK( IW ), LEN, WORK( IY ), LEN, > WORK( IWORK ) ) * IF ( NEEDU ) THEN CALL SGEWY( 'Right', N, LEN, NB2, U( 1, 1 ), LDU, > WORK( IW ), LEN, WORK( IY ), LEN, > WORK( IWORK ) ) ENDIF * 100 CONTINUE * TAU( B+1 ) = ZERO * ELSE * * --- reduce the lower triangle --- * DO 200 J = 1, N-B-1, NB0 * LEN = N - ( J + B ) + 1 NB1 = MIN( NB0, LEN - 1 ) IY = IW + NB1 * LEN IWORK = IY + NB1 * LEN * CALL SGEQRL( 'R', LEN, NB1, A( J+B, J ), LDA, DRPTOL, > TAU( J ), WORK( IWORK ) ) CALL SGEWYG( 'Lower', LEN, NB1, A( J+B, J ), LDA, TAU( J ), > WORK( IW ), LEN, WORK( IY ), LEN, NB2, > WORK( IWORK ) ) CALL SGEWY( 'Left', LEN, B - NB1, NB2, A( J+B, J+NB1 ), LDA, > WORK( IW ), LEN, WORK( IY ), LEN, > WORK( IWORK ) ) CALL SSYWY( 'Lower', LEN, NB2, A( J+B, J+B ), LDA, > WORK( IW ), LEN, WORK( IY ), LEN, > WORK( IWORK ) ) * IF ( NEEDU ) THEN CALL SGEWY( 'Right', N, LEN, NB2, U( 1, J+B ), LDU, > WORK( IW ), LEN, WORK( IY ), LEN, > WORK( IWORK ) ) ENDIF > 200 CONTINUE * TAU( N-B ) = ZERO * ENDIF * * --- return the blocking factor --- * INFO = NB0 * 999 RETURN END * * ********************************************************************** * SUBROUTINE SSYGTR( UPLO, N, B, A, LDA, TAU, WORK, LWORK, INFO ) * * ---------------------------------------------------------------------- * * Description: * * ssygtr generates a real orthogonal matrix U of size n, defined as * the product of n - b Householder transformations, as returned by * ssyrdb. * * If uplo = 'U' then * * U = H( n ) * ... * H( b + 2 ), * * where the "mantissa" of the length-( k - b ) Householder * transformation H( k ) is stored in a( 1:k-b-1, k ) and its scaling * factor is stored in tau( k ), * * if uplo = 'L' then * * U = H( 1 ) * ... * H( n - b - 1 ), * * where the "mantiassa" of the length-(n - b - k - 1) Householder * transformation H( k ) is stored in a( b+k+1:n, k ) and its scaling * factor is stored in tau( k ). * * On exit, a is overwritten with the orthogonal matrix U. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 UPLO INTEGER N, B, LDA, LWORK, INFO REAL A( LDA, * ), TAU( * ), WORK( * ) * * uplo (in) character*1 * Are the Householder vectors stored in the upper or lower * triangle of A ? * uplo = 'U' : Upper triangle. * = 'L' : Lower triangle. * * n (in) integer * The dimension of the reduced matrix A (and of the requested * orthogonal matrix). * n >= 0. * * b (in) integer * The number of sub(super-)diagonals of the reduced matrix. * 1 <= b < n, if n > 1. * b = 0 , if n <= 1. * * a (in/out) real array, dimension ( lda, n ) * On entry, the columns of a hold the "mantissae" of the * Householder transformations, as returned from ssyrdb. * On exit, a is overwritten with the orthogonal matrix U. * * lda (in) integer * The leading dimension of the array a. * lda >= max( n, 1 ). * * tau (in) real array, dimension ( n ). * The scaling factors for the Householder transformations, as * returned by ssyrdb. * * work (workspace) real array, dimension ( lwork ) * * lwork (in) integer * The size of the workspace (must be provided on entry). * lwork >= n - b. * * Workspace that small prevents blocking and may degrade * performance. For using nb-blocked transformations, provide * lwork >= nb * ( n - b ). * As a rule, lwork >= 20 * n should be fine. * * info (out) integer * On exit, info indocates the consistence of the arguments. * info = 1 : All arguments were OK. * info = -1 : uplo is none of 'U', 'L' (upper/lower case). * = -2 : n is out of range (negative). * = -3 : b is out of range ( < 0, or = 0 while n > 1, * or >= n ). * = -5 : lda is out of range ( < n or < 1 ). * = -8 : lwork is out of range ( < n - b ). * * ---------------------------------------------------------------------- * * Local variables: * REAL ZERO, ONE PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0 ) * LOGICAL UPPER INTEGER B1, J * * upper are the Householder vectors stored in the upper triangle ? * b1 = b + 1 * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * EXTERNAL SCOPY, SLASET, SORGQL, SORGQR * * scopy vector copy (BLAS) * slaset initialize matrix (LAPACK) * sorgql build orthogonal matrix after QL factorization (LAPACK) * sorgqr build orthogonal matrix after QR factorization (LAPACK) * INTRINSIC MAX * * ---------------------------------------------------------------------- * * --- check for errors in the input --- * UPPER = LSAME( UPLO, 'U' ) B1 = B + 1 * IF ( .NOT. ( UPPER .OR. ( LSAME( UPLO, 'L' ) ) ) ) THEN INFO = - 1 ELSEIF ( N .LT. 0 ) THEN INFO = - 2 ELSEIF ( ( ( N .LE. 1 ) .AND. ( B .NE. 0 ) ) .OR. > ( ( N .GT. 1 ) .AND. > ( ( B .LT. 1 ) .OR. ( B .GE. N ) ) ) ) THEN INFO = - 3 ELSEIF ( LDA .LT. MAX( N, 1 ) ) THEN INFO = - 5 ELSEIF ( LWORK .LT. ( N-B ) ) THEN INFO = - 8 ELSE INFO = 1 ENDIF * IF ( INFO .NE. 1 ) GOTO 999 * * --- check for quick return --- * IF ( B1 .GE. N ) THEN CALL SLASET( 'All', N, N, ZERO, ONE, A, LDA ) GOTO 999 ENDIF * * ...................................................................... * IF ( UPPER ) THEN * * --- move the Householder vectors by b columns to * the left --- * DO 100 J = B+2, N CALL SCOPY( J-B1, A( 1, J ), 1, A( 1, J-B ), 1 ) 100 CONTINUE * * --- set the last b columns and rows to identity --- * CALL SLASET( 'All', B, N-B, ZERO, ZERO, A( N-B+1, 1 ), LDA ) CALL SLASET( 'All', N-B, B, ZERO, ZERO, A( 1, N-B+1 ), LDA ) CALL SLASET( 'All', B, B, ZERO, ONE, A( N-B+1, N-B+1 ), LDA ) * * --- generate the leading ( n-b )-by-( n-b ) * orthogonal matrix --- * CALL SORGQL( N-B, N-B, N-B, A, LDA, TAU( B+1 ), > WORK, LWORK, INFO ) * ELSE * * --- move the Householder vectors by b columns to * the right --- * DO 200 J = N-1, B1, -1 CALL SCOPY( N-J, A( J+1, J-B ), 1, A( J+1, J ), 1 ) 200 CONTINUE * * --- set the first b columns and rows to identity --- * CALL SLASET( 'All', N, B, ZERO, ONE, A, LDA ) CALL SLASET( 'All', B, N-B, ZERO, ZERO, A( 1, B1 ), LDA ) * * --- generate the trailing ( n-b )-by-( n-b ) * orthogonal matrix --- * CALL SORGQR( N-B, N-B, N-B, A( B1, B1 ), LDA, TAU, > WORK, LWORK, INFO ) * ENDIF * IF ( INFO .EQ. 0 ) INFO = 1 * 999 RETURN END * * ********************************************************************** * SUBROUTINE SSBRDB( JOB, N, B1, B2, A, LDA, DRPTOL, > U, LDU, NB, > WORK, LWORK, INFO ) * * ---------------------------------------------------------------------- * * Description: * * Given a symmetric n-times-n matrix A with b1 sub(or super-) * diagonals, ssbrdb reduces A to a narrower band with b2 sub(super) * diagonals by using a sequence of orthogonal similarity * transformations. If desired, the same transformations are also * applied from the right to the matrix U. That is, if initially U was * the identity, then the resulting banded matrix B and the updated U * fulfill the equation * * T * U * A * U = B . * * A must be given in the LAPACK packed storage scheme for lower * triangular banded matrices and will be overwritten with B. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 JOB INTEGER N, B1, B2, LDA, LDU, NB, LWORK, INFO REAL DRPTOL REAL A( LDA, * ), U( LDU, * ), WORK( * ) * * job (in) character*1 * Specifies whether U is required or not. * job = 'U' : Update U. * = 'N' : Do not update U. * * n (in) integer * The order of the matrix. * n >= 0. * * b1 (in) integer * The number of sub(super-)diagonals of A. * b1 >= 0 and b1 < n (if n > 0). * * b2 (in) integer * The number of sub(super-)diagonals of B. * 1 <= b2 <= b1 or b2 = b1 = 0. * * a (in/out) real array, dimension ( lda, n ) * On entry, this array contains the symmetric matrix A. The * leading ( b1+1 )-by-n part of a contains the lower triangle * of A with A( i, j ) stored in a( 1+i-j, j ), and the * strictly upper triangle is not referenced. * On exit, for i = 1, ..., b2+1, the first n - i + 1 elements * in the i-th row of a contain the reduced matrix B, * for i = b2 + 2, ..., b1+1, the first n - i + 1 elements in * the i-th row of a are zeroed, and * for i = b1 + 2, ..., min( b1+(b1-b2)+nb, n, lda ), the first * n - i + 1 elements in the i-th row of a are destroyed. * * lda (in) integer * The leading dimension of the array a. * lda >= min( b1 + 1, n ). * * To avoid unnecessary copying and therefore improve the * performance in the blocked case, we recommend * lda >= nb + b1 + ( b1 - b2 ). * * drptol (in) real * Threshold for dropping the Householder transformations: if * the norm of the vector to be eliminated is already smaller * than drptol then the transform is skipped. * drptol >= 0.0. * If you do not know, use 0.0. * * u (in/out) real array, dimension ( ldu, n ) * On entry, u contains some n-by-n matrix U. * On exit, U is postmultiplied by all orthogonal transforms * that were used to reduce the bandwidth of A. * Accessed only if the update of U is required. * * ldu (in) integer * The leading dimension of the array u. * ldu >= max( n, 1 ). * * nb (in) integer * The blocking factor nb, as suggested by the user, for the * reduction of A and the update of U. * 0 <= nb <= b2. * nb = 0 : User does not know how many Householder transforms * should be blocked for reasonable performance. Let * the routine figure it out (depending on the * workspace available). * = 1 : Do not block * > 1 : Try to block nb Householder transforms (if the * workspace is not sufficient then a smaller blocking * factor will be used). * * work (workspace) real array, dimension ( lwork ) * * lwork (in) integer * The size of the workspace (must be provided on entry). * lwork >= 3 * b1 + b2, if U is not required, and * >= n + 2 * b1 + 1, if U is required. * * Workspace that small enforces non-blocked transforms. * For using nb-blocked transforms, we need * lwork >= ( 3 * b1 + b2 ) * nb, if U is not required, and * >= ( n + 2 * b1 + 1 ) * nb, if U is required. * * If lda < b1 + ( b1 - b2 ) + nb, then ADDITIONAL workspace * is needed to buffer some of the intermediate fill-in during * the reduction. More precisely, we need * another ndiag * ( ndiag+1 ) / 2 elements to buffer one * ndiag-by-ndiag triangle of each diagonal block, where * ndiag = min( b1+(b1-b2)+nb, n ) - lda, and * another ( n / b1 ) * nsub * ( nsub+1 ) / 2 elements to * buffer an nsub-by-nsub triangle from each of the n / b1 * subdiagonal blocks, where * nsub = min( b1+(b1-b2), n ) - lda * Note that roughly n * ( b1 + (b1-b2) - lda ) / 2 elements * are sufficient, and that no buffer space is required if * lda >= b1 + ( b1 - b2 ) + nb. * * info (out) integer * On exit, info indicates the consistence of the arguments. * info = - 1 : job is none of 'U', 'N' (upper/lower case). * = - 2 : n is out of range (negative). * = - 3 : b1 is out of range (negative or >= n ). * = - 4 : b2 is out of range ( < 0, or = 0 while b1 >= 1, * or > b1 ). * = - 6 : lda is out of range ( < b1 + ( b1 - b2 ) + 1 * and < n ). * = - 7 : drptol is out of range ( < 0.0 ). * = - 9 : ldu is out of range ( < n ). * = -10 : nb is out of range (negative). * = -12 : lwork is too small (see above). * info >= 1 : All arguments are OK. * In this case, info returns the blocking factor * that was used in the reduction and in the * update of U. * * ---------------------------------------------------------------------- * * Local variables: * * --- constants --- * REAL ZERO PARAMETER ( ZERO = 0.0E0 ) * * --- for the reduction part --- * LOGICAL NEEDU INTEGER DELTAB, NB0, LDH, PREW, K, > L, NBLK, NB1, LDWY * * needu is U required ? * deltab = b1 - b2, the number of diagonals to remove * nb0 blocking factor that is ultimately used in the reduction * and in the update * ldh = min( deltab + nb0, n - b2 ), the size of the blocks * affected by each block transform * prew = b2 - nb0, the width of the block to be premultiplied * k numbers the "elimination steps" * l numbers the bulge chasing operations associated with each * elimination step * nblk number of the current block column * nb1 number of nonzero Householder vectors in the current block * transform * ldwy leading dimension of the arrays containing W and Y * * --- workspace management --- * INTEGER NSUB, SZSUB, LSUB, NSUB1, NDIAG, LDIAG, > NDIAG1, ISUB, IDIAG, IC, ID, ID1, IX, > IW, IY, IWORK, J * * nsub the dimension of the triangles from the subdiagonal blocks * that must be buffered in the workspace * (nsub <= b1 + ( b1 - b2 ) - lda) * szsub = nsub * ( nsub+1 ) / 2, the size of each such triangle * lsub = ( n / b ) * szsub, the total size of all these triangles * nsub1 the dimension of the current triangle, plus 1 * ndiag the dimension of the triangle from the main diagonal block * that must be buffered in the workspace * (ndiag <= b1 + ( b1 - b2 ) + nb0 - lda ) * ldiag = ndiag * ( ndiag+1 ) / 2, the size of this triangle * ndiag1 the dimension of the current triangle, plus 1 * isub points to the portion of the workspace that will hold the * triangles from all the subdiagonal blocks * idiag points to the portion of the workspace that will hold the * triangle from the current diagonal block * ic column position of the next element to be buffered * id diagonal position of the next element to be buffered * id1 = id + 1 * ix position in the workspace for this element * iw points to the portion of work that will hold the block * W of the WY tranform * iy points to the portion of work that will hold Y * iwork points to the portion of work that is used as workspace * in the routines sqrupd, ssywy, and sgewy * * The workspace is used as follows: * * - The first ( n / b1 ) * nsub * ( nsub+1 ) / 2 elements are used to * buffer nsub-by-nsub triangles of fill-in from the subdiagonal * blocks (see the discussion on lwork). * Here, nsub = min( b1+(b1-b2), n ) - lda <= b1 - b2 - 1. * These elements are needed only if nsub > 0. * - The next ndiag * ( ndiag+1 ) / 2 elements are used to buffer one * ndiag-by-ndiag triangle from the current diagonal block. * Here, ndiag = min( b1+(b1-b2)+nb0, n ) - lda <= b1 - 1. * These elements are needed only if ndiag > 0. * - The following ldh * nb0 elements hold the block W of the block WY * transform. * Here, ldh = min( b1-b2+nb0, n-b2 ) <= b1 - b2 + nb0 <= b1. * - The following ldh * nb0 elements hold the block Y. * - The remaining workspace is alternatively used by the routines * sqrupd (which needs ( n+1 )*nb0 elements if U is required and * ( ldh+1 )*nb0 elements otherwise), ssywy (( b1+1 )*nb0 elements), * and sgewy (b1*nb0 elements). * * Routines called: * LOGICAL LSAME INTEGER NBDFLT EXTERNAL LSAME, NBDFLT * * lsame case-insensitive character matching (BLAS) * nbdflt determine default blocking factor * EXTERNAL SGEWY, SQRUPD, SSYWY * * sgewy apply WY block transform (SBR) * sqrupd QR decomposition of a block of A, update of U, and premulti- * plication of another block of A (SBR) * ssywy apply two-sided block transform to a symmetric matrix (SBR) * INTRINSIC MAX, MIN * * ---------------------------------------------------------------------- * * --- check for errors in input --- * NEEDU = LSAME( JOB, 'U' ) * IF ( .NOT. ( NEEDU .OR. LSAME( JOB, 'N' ) ) ) THEN INFO = - 1 ELSEIF ( N .LT. 0 ) THEN INFO = - 2 ELSEIF ( ( B1 .LT. 0 ) .OR. > ( ( N .GT. 0 ) .AND. ( B1 .GE. N ) ) ) THEN INFO = - 3 ELSEIF ( ( B2 .LT. 0 ) .OR. > ( ( B1 .GE. 1 ) .AND. ( B2 .EQ. 0 ) ) .OR. > ( B2 .GT. B1 ) ) THEN INFO = - 4 ELSEIF ( LDA .LT. MIN( B1+1, N ) ) THEN INFO = - 6 ELSEIF ( DRPTOL .LT. ZERO ) THEN INFO = - 7 ELSEIF ( NEEDU .AND. ( LDU .LT. MAX( N, 1 ) ) ) THEN INFO = - 9 ELSEIF ( NB .LT. 0 ) THEN INFO = - 10 ELSE INFO = 1 ENDIF * IF ( INFO .NE. 1 ) GOTO 999 * * --- check for quick return --- * IF ( ( N .EQ. 0 ) .OR. ( B2 .EQ. B1 ) ) GOTO 999 * * --- determine blocking factor --- * IF ( NB .GT. 0 ) THEN NB0 = NB ELSE NB0 = NBDFLT( 'SBRDB', 'PrecString', 'BlockingFactor', > N, B1, B2, NEEDU ) ENDIF NB0 = MIN( NB0, B2 ) * * --- how many diagonals are eliminated, and how many must * be buffered ? --- * DELTAB = B1 - B2 NSUB = MAX( MIN( B1+DELTAB, N ) - LDA, 0 ) SZSUB = ( NSUB * ( NSUB + 1 ) ) / 2 LSUB = ( N / B1 ) * SZSUB * * --- reduce nb0 until workspace is sufficient --- * 10 CONTINUE * * --- how much of the diagonal blocks must be buffered ? --- * NDIAG = MAX( MIN( B1+DELTAB+NB0, N ) - LDA, 0 ) LDIAG = ( NDIAG * ( NDIAG + 1 ) ) / 2 IF ( NEEDU ) THEN IWORK = ( N + 2 * B1 + 1 ) * NB0 ELSE IWORK = ( 3 * B1 + B2 ) * NB0 ENDIF IF ( LWORK .LT. ( LSUB+LDIAG+IWORK ) ) THEN IF ( NB0 .GT. 1 ) THEN NB0 = NB0 - 1 GOTO 10 ELSE INFO = -12 GOTO 999 ENDIF ENDIF * * --- OK, now that we have nb0, set other constants --- * LDH = MIN( DELTAB+NB0, N-B2 ) PREW = MAX( B2-NB0, 0 ) * * --- set up pointers to the submatrices stored in work * (the data layout is pointed out above) --- * ISUB = 1 IDIAG = ISUB + LSUB IW = IDIAG + LDIAG IY = IW + LDH * NB0 IWORK = IY + LDH * NB0 * * --- make sure that the "bulge buffer" is empty --- * DO 30 K = B1+2, MIN( B1+NB0+DELTAB, LDA, N ) DO 20 J = 1, N-K+1 A( K, J ) = ZERO 20 CONTINUE 30 CONTINUE * DO 40 K = ISUB, IDIAG+LDIAG-1 WORK( K ) = ZERO 40 CONTINUE * * ...................................................................... * DO 400 K = 1, N - B2 - 1, NB0 * * --- QR decomposition to eliminate the leading nb0 * columns of the band --- * CALL SQRUPD( MIN( LDH, N-K-B2+1 ), NB0, DELTAB, > A( B2+1, K ), LDA - 1, DRPTOL, > NEEDU, N, U( 1, K+B2 ), LDU, > PREW, A( PREW+1, K+NB0 ), > NB1, WORK( IY ), WORK( IW ), LDWY, > WORK( IWORK ) ) * * --- bulge chasing --- * DO 300 L = K + B2, N - 1, B1 * NBLK = 1 + ( L - K - B2 ) / B1 IF ( NB1 .GT. 0 ) THEN * * --- symmetric update of diagonal block --- * CALL SSYWY( 'Lower', MIN( LDH, N-L+1 ), NB1, > A( 1, L ), LDA - 1, > WORK( IW ), LDWY, WORK( IY ), LDWY, > WORK( IWORK ) ) ENDIF * * --- if lda < b1 + ( b1 - b2 ) + nb0, then before * transforming the subdiagonal block, an * ndiag-by-ndiag triangle of the diagonal block * must be copied into the workspace ... --- * NDIAG = MIN( B1+LDH, N-L+1 ) - LDA NDIAG1 = NDIAG + 1 IX = IDIAG DO 120 J = 1, NDIAG IC = L + J DO 110 ID = 1, NDIAG1-J WORK( IX ) = A( ID, IC ) IX = IX + 1 110 CONTINUE 120 CONTINUE * * --- ... the bottommost rows of the subdiagonal block * must be set to zero --- * NSUB = MIN( MAX( N-L+1-LDA, 0 ), B1+(B1-B2)-LDA ) NSUB1 = NSUB + 1 DO 140 ID = NSUB1, NDIAG ID1 = ID + 1 DO 130 J = 1, ID A( ID1-J, L+J ) = ZERO 130 CONTINUE 140 CONTINUE * * --- ... and an nsub-by-nsub triangle of the * subdiagonal block must be restored from workspace --- * IX = ISUB + ( NBLK - 1 ) * SZSUB DO 160 J = 1, NSUB IC = L + J DO 150 ID = 1, NSUB1-J A( ID, IC ) = WORK( IX ) IX = IX + 1 150 CONTINUE 160 CONTINUE * IF ( NB1 .GT. 0 ) THEN * * --- postmultiply --- * IF ( N .GE. ( L+LDH ) ) THEN CALL SGEWY( 'Right', MIN( B1, N-L-LDH+1 ), > LDH, NB1, A( LDH+1, L ), LDA - 1, > WORK( IW ), LDWY, WORK( IY ), LDWY, > WORK( IWORK ) ) ENDIF ENDIF * IF ( N .GT. ( L+B1 ) ) THEN * * --- QR decomposition to eliminate the leading * nb0 columns of the bulge --- * CALL SQRUPD( MIN( LDH, N-L-B1+1 ), NB0, DELTAB, > A( B1+1, L ), LDA - 1, DRPTOL, > NEEDU, N, U( 1, L+B1 ), LDU, > B1 - NB0, A( B1-NB0+1, L+NB0 ), > NB1, WORK( IY ), WORK( IW ), LDWY, > WORK( IWORK ) ) ENDIF * * --- if lda < b1 + ( b1 - b2 ) + nb0, then an * nsub-by-nsub triangle of the subdiagonal block * must be copied into the workspace ... --- * NSUB = MIN( MAX( N-L-NB0+1-LDA, 0 ), B1+(B1-B2)-LDA ) NSUB1 = NSUB + 1 IX = ISUB + ( NBLK - 1 ) * SZSUB DO 220 J = 1, NSUB IC = L + J + NB0 DO 210 ID = 1, NSUB1-J WORK( IX ) = A( ID, IC ) IX = IX + 1 210 CONTINUE 220 CONTINUE * * --- ... and the ndiag-by-ndiag triangle of the * diagonal block must be restored from workspace --- * IX = IDIAG DO 240 J = 1, NDIAG IC = L + J DO 230 ID = 1, NDIAG1-J A( ID, IC ) = WORK( IX ) IX = IX + 1 230 CONTINUE 240 CONTINUE * 300 CONTINUE * 400 CONTINUE * INFO = NB0 * 999 RETURN END * * ********************************************************************** * SUBROUTINE SSBRDT( JOB, N, B, A, LDA, DRPTOL, > D, E, > U, LDU, NB, > WORK, LWORK, INFO ) * * ---------------------------------------------------------------------- * * Description: * * Given a symmetric n-by-n matrix A with b sub(or super-) diagonals, * ssbrdt reduces A to tridiagonal form using a sequence of orthogonal * similarity transformations. If desired, the same transformations are * also applied from the right to the matrix U. That is, if initially U * was the identity, then the resulting tridiagonal matrix T and the * updated U fulfill the equation * * T * U * A * U = T . * * A must be given in the LAPACK packed storage scheme for lower * triangular banded matrices. * * Author: Bruno Lang * Aachen University of technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 JOB INTEGER N, B, LDA, LDU, NB, LWORK, INFO REAL DRPTOL REAL A( LDA, * ), D( * ), E( * ), U( LDU, * ), > WORK( * ) * * job (in) character*1 * Specifies whether U is required or not. * job = 'U' : Update U. * = 'N' : Do not update U. * * n (in) integer * The order of the matrix A. * n >= 0. * * b (in) integer * The number of sub(super-)diagonals of A. * 0 <= b < n, if n >= 1. * b = 0 , if n = 0. * * a (in/out) real array, dimension ( lda, n ) * On entry, this array contains the symmetric matrix A. The * leading ( b+1 )-by-n part of a contains the lower triangle * of A with A( i, j ) stored in a( 1+i-j, j ), and the * strictly upper triangle is not referenced. * On exit, for i = 1, ..., min( 2*b, n, lda ), the first * n - i + 1 elements in the i-th row of a are destroyed. * * lda (in) integer * The leading dimension of the array a. * lda >= b+1. * For optimum performance, we recommend lda >= 2*b. * * drptol (in) real * The threshold for dropping Householder transformations: if * the norm of the vector to be eliminated is already smaller * than drptol then the transform is skipped. * drptol >= 0.0. * If you do not know, use 0.0. * * d (out) real array, dimension ( n ) * On exit, d( 1 .. n ) contains the main diagonal of the * reduced tridiagonal matrix. * * e (out) real array, dimension ( n-1 ) * On exit, e( 1 .. n-1 ) contains the sub(super-)diagonal of * the reduced tridiagonal matrix. * * u (in/out) real array, dimension ( ldu, n ) * On entry, u contains some n-by-n matrix U. * On exit, U is postmultiplied with all orthogonal transforms * that were used to reduce the bandwidth of A. * Accessed only if the update of U is required. * * ldu (in) integer * The leading dimension of the array u. * ldu >= max( n, 1 ). * * nb (in) integer * The blocking factor nb, as suggested by the user, for the * update of U (nb is accessed only if U is required). * nb >= 0. * = 0 : User does not know how many Householder transforms * should be blocked for reasonable performance. Let * the routine figure it out (depending on the * workspace available). * = 1 : Do not block the update of U. * > 1 : Try to block nb Householder transforms (if the * workspace is not sufficient then a smaller * blocking factor will be used). * * work (workspace) real array, dimension ( lwork ) * * lwork (in) integer * The size of the workspace (must be provided on entry). * If lda >= 2*b, then * lwork >= 2 * b, if U is not required. * lwork >= b + n, if U is required and is updated with * non-blocked Householder transforms. * lwork >= 2 * nb * ( n + b + nb - 1 ), if U is updated * with nb-blocked transforms. * If lda < 2*b, then ADDITIONAL ( n/b + 1 )*szsub + nsave * elements of workspace are needed to buffer * intermediate elements. Here, nsave = 2*b-lda, * and szsub = (nsave*(nsave-1))/2. * Note that this is roughly n*(2*b-lda)/2 * elements. * * info (out) integer * On exit, info indicates the consistence of the arguments. * info = - 1 : job is none of 'U', 'N' (upper/lower case). * = - 2 : n is out of range (negative). * = - 3 : b is out of range (negative or * >= n, while n > 0 ). * = - 5 : lda is too small ( < min( b+1, n ) ). * = - 6 : drptol is out of range (negative). * = -10 : ldu is too small ( < n or < 1 ). * = -11 : nb is out of range (negative). * = -13 : workspace is too small (see above). * info >= 1 : All arguments are OK. * In this case, info returns the blocking factor * that was used in the update of U (if job='U'), * or info = 1 (if job='N'). * * ---------------------------------------------------------------------- * * Local variables: * * --- constants --- * REAL ZERO, ONE PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0 ) * * --- for the reduction part --- * INTEGER NSAVE, NSAVE1, IDIAG, ISUB, SZSUB, ID, IC, > IX, NBLK, HEIGHT, WIDTH, K, J, I, J0 REAL TAU * * nsave the number of diagonals that must be saved * nsave1 = nsave + 1 * idiag points to the portion of the workspace that holds the part * of the current diagonal block of the band * isub points to the portion of the workspace that holds the part * of the subdiagonal blocks of the band * szsub number of elements that must be saved from each subdiagonal * block * id diagonal position of the element to save * ic column position of the element to save * ix position in the workspace for saving the element * nblk number of the block to process next * height height of the block to process next * width width of the subdiagonal block * k numbers the columns to be eliminated * j counter for the "progress" of the bulge chasing * tau scaling factor of the current Householder transform * * --- for updating U --- * LOGICAL NEEDU, BLOCK, ONFLY INTEGER NB0, IV, IY, IW, ITAU, IWORK, LDWY0, > K0, IFIRST, NB1, LDWY, NB2, V DOUBLE PRECISION BETA * * needu is U needed ? * block is U needed, and is there enough workspace for blocking the * updates ? * onfly is U needed, and is blocking prohibited by small workspace ? * nb0 blocking factor that is ultimately used in the update * iv points to the portion of work that will hold the Householder * vectors for nb consecutive "eliminate & chase" sweeps * (required size for this buffer : n * nb0) * iy points to the portion of work that will hold the block * transform Y in the WY representation (required size for this * buffer : ( b + nb0 - 1 ) * nb0) * iw points to the portion of work that will hold the block * transform W in the WY representation (required size for this * buffer : ( b + nb0 - 1 ) * nb0) * itau points to the portion of work that will hold the scaling * factors (required size for this buffer: nb0) * iwork points to the protion of work that may be used as working * space by the routines slarfx, ssyrf, and sgewy. * (required size for this buffer : n * nb0, if U is needed, * b otherwise) * ldwy0 = b + nb0 - 1, the leading dimension of "full" block * Householder reflectors W and Y, resp. * k0 number of the first sweep that contributed to the the * current block transform * ifirst first row affected by the current block transform * nb1 number of transforms in the current block update (usually * = nb0, except for the one at the bottom or the last sweeps) * ldwy size of the current block transform (usually = ldwy0, * except for the last block transform of the sweep) * nb2 number of nonzero transforms in the current block update * (usually = nb1, except for special matrices) * v points to the portion of work that holds the current * Householder vector * beta coefficient in the quadratic equation for determining the * maximum possible blocking factor * * The workspace is used as follows: * * If lda < 2 * b then some of the intermediate fill-in is held in the * workspace. More precisely, nsave = 2 * b - lda is the size of the * (triangular) blocks that extend beyond the array a. Then * nsave-by-nsave blocks of the band must be swapped between the array * a and the workspace. Note that actually only (nsave-1)-by-(nsave-1) * blocks of size szsub = ( ( nsave - 1 ) * nsave ) / 2 must be saved * as the remaining nsave elements are made zero by the algorithm. * - The first szsub + nsave elements of the workspace are used to * buffer a triangular portion of the current diagonal block, and * - the next ( n / b ) * szsub elements hold n / b triangular * (nsave-1)-by-(nsave-1) portions of the subdiagonal blocks. * If lda >= 2 * b then the whole fill-in fits into the array a, and * the above-mentioned buffers are not needed. * * If U is not needed (or U is needed, but its update is non-blocked) * then the next b places of work hold the current Householder vector * and the following b (or n, resp.) places are used as workspace for * applying the transformation. * * If U is updated via blocked Householder transforms (comprising nb0 * Householder transforms) * T * (affected part of) U = U * ( I + W * Y ) * then in the current implementation * - the next n * nb0 places hold the Householder vectors for * nb0 successive "eliminate & chase" sweeps down the band, * - the next ( b + nb0 - 1 ) * nb0 places hold the block Y, * - the next ( b + nb0 - 1 ) * nb0 places hold W, * - the next n * nb0 places are alternatively used as workspace for * the routines ssyrf (b elements), slarfx (b elements), and sgewyr * (n * nb0 elements), and * - the buffer for nb0 scaling factors is overlapped with the first * nb0 elements of the "multiuse" workspace. * * Routines called: * LOGICAL LSAME INTEGER NBDFLT EXTERNAL LSAME, NBDFLT * * lsame case-insensitive character matching (BLAS) * nbdflt determine default blocking factor * EXTERNAL SCOPY, SGBWYG, SGEWY, SLARFX, SLBRFG, > SSYRF * * scopy vector copy (BLAS) * sgbwyg generate WY block reflector (SBR) * sgewy apply WY block reflector (SBR) * slbrfg determine Householder vector (SBR) * ssyrf apply two-sided transform to a symmetric matrix (SBR) * slarfx apply Householder transform (LAPACK) * INTRINSIC DBLE, INT, MAX, MIN, MOD, SQRT * * ---------------------------------------------------------------------- * * --- check for errors in input --- * NEEDU = LSAME( JOB, 'U' ) * IF ( .NOT. ( NEEDU .OR. LSAME( JOB, 'N' ) ) ) THEN INFO = -1 ELSEIF ( N .LT. 0 ) THEN INFO = -2 ELSEIF ( ( B .LT. 0 ) .OR. ( ( N .GT. 0 ) .AND. ( B .GE. N ) ) ) > THEN INFO = -3 ELSEIF ( LDA .LT. ( B+1 ) ) THEN INFO = -5 ELSEIF ( DRPTOL .LT. ZERO ) THEN INFO = -6 ELSEIF ( LDU .LT. MAX( N, 1 ) ) THEN INFO = -10 ELSEIF ( NEEDU .AND. ( NB .LT. 0 ) ) THEN INFO = -11 ELSE INFO = 1 ENDIF * IF ( INFO .NE. 1 ) GOTO 999 * * --- check for quick return --- * IF ( N .EQ. 0 ) THEN GOTO 999 ELSEIF ( B .EQ. 0 ) THEN CALL SCOPY( N, A( 1, 1 ), LDA, D, 1 ) DO 10 J = 1, N-1 E( J ) = ZERO 10 CONTINUE GOTO 999 ELSEIF ( B .EQ. 1 ) THEN CALL SCOPY( N, A( 1, 1 ), LDA, D, 1 ) CALL SCOPY( N-1, A( 2, 1 ), LDA, E, 1 ) GOTO 999 ENDIF * * --- check if workspace is sufficient --- * NSAVE = 2 * B - LDA IF ( NSAVE .GT. 0 ) THEN SZSUB = ( ( NSAVE - 1 ) * NSAVE ) / 2 IX = SZSUB + NSAVE + ( N / B ) * SZSUB ELSE SZSUB = 0 IX = 0 ENDIF IF ( ( LWORK .LT. ( IX+2*B ) ) .OR. > ( NEEDU .AND. ( LWORK .LT. ( IX+B+N ) ) ) ) THEN INFO = -13 GOTO 999 ENDIF * * --- compute the final blocking factor for updating U --- * IF ( NEEDU ) THEN * * --- first determine the maximum possible value nb0 * (for blocking nb0 updates, we need * 2 * nb0 * ( n + b + nb0 - 1 ) workspace). --- * BETA = DBLE( N + B - 1 ) NB0 = INT( ( SQRT( BETA**2 + 2.0D0*( LWORK-IX ) ) - BETA ) > / 2.0D0 ) * * --- adjust to the user-supplied or default value --- * IF ( NB .GT. 0 ) THEN NB0 = MIN( NB, NB0, N-2 ) ELSE NB0 = MIN( NBDFLT( 'SBRDT', 'SinglePrec', 'BlockingFactor', > N, B, 1, .TRUE. ), > NB0 ) ENDIF * IF ( NB0 .LT. 1 ) NB0 = 1 * * --- OK, now we are done --- * BLOCK = ( NB0 .GT. 1 ) ONFLY = ( .NOT. BLOCK ) INFO = NB0 ELSE NB0 = 1 BLOCK = .FALSE. ONFLY = .FALSE. ENDIF * * --- set up pointers to the submatrices stored in work * (the data layout is pointed out above) --- * IF ( NSAVE .GT. 0 ) THEN IDIAG = 1 ISUB = IDIAG + ( SZSUB + NSAVE ) IV = ISUB + ( N / B ) * SZSUB ELSE IDIAG = -1 ISUB = -1 IV = 1 ENDIF * LDWY0 = B + NB0 - 1 IF ( BLOCK ) THEN IY = IV + N * NB0 IW = IY + LDWY0 * NB0 IWORK = IW + LDWY0 * NB0 ITAU = IWORK ELSE IY = -1 IW = -1 IWORK = IV + B ITAU = -1 ENDIF V = IV * * --- make sure that the "bulge buffer" is empty --- * DO 30 J = 2, N-B DO 20 K = B+2, MIN( 2*B, LDA, N-J+1 ) A( K, J ) = ZERO 20 CONTINUE 30 CONTINUE * DO 40 IX = 1, IV-1 WORK( IX ) = ZERO 40 CONTINUE * * ...................................................................... * K0 = 1 * * --- in the k-th pass of the following main loop, * the k-th column of the band is zeroed and the * resulting bulge is chased down the band --- * DO 700 K = 1, N-2 * * --- determine the length of the column and the * Householder vector --- * HEIGHT = MIN( B, N-K ) CALL SLBRFG( HEIGHT, A( 2, K ), A( 3, K ), 1, TAU, DRPTOL ) * * --- save the vector and zero column of A --- * IF ( BLOCK ) THEN V = IV + ( K - K0 ) * ( N - K0 + 1 ) ENDIF WORK( V ) = ONE CALL SCOPY( HEIGHT-1, A( 3, K ), 1, WORK( V+1 ), 1 ) DO 110 I = 3, HEIGHT+1 A( I, K ) = ZERO 110 CONTINUE * * --- save the new tridiagonal elements --- * D( K ) = A( 1, K ) E( K ) = A( 2, K ) * IF ( TAU .NE. ZERO ) THEN * * --- apply the Householder transform to both sides * of the first diagonal block --- * CALL SSYRF( 'Lower', HEIGHT, WORK( V ), 1, TAU, > A( 1, K+1 ), LDA - 1, WORK( IWORK ) ) * * --- if the transformations of U are not blocked * then apply them as they are generated --- * IF ( ONFLY ) THEN CALL SLARFX( 'Right', N, HEIGHT, WORK( V ), TAU, > U( 1, K+1 ), LDU, WORK( IWORK ) ) ENDIF ENDIF * * --- start the bulge chasing --- * DO 500 J = K+1, N-B, B NBLK = 1 + ( J - K - 1 ) / B * * --- determine the size of the subdiagonal block --- * WIDTH = HEIGHT HEIGHT = MIN( B, N-J-(B-1) ) * * --- if lda is too small then parts of the diagonal * block must be saved ... --- * NSAVE = B + HEIGHT - LDA NSAVE1 = NSAVE + 1 IX = IDIAG DO 220 J0 = 1, NSAVE IC = J + J0 DO 210 ID = 1, NSAVE1-J0 WORK( IX ) = A( ID, IC ) IX = IX + 1 210 CONTINUE 220 CONTINUE * * --- ... and the subdiagonal block must be restored --- * IX = ISUB + ( NBLK - 1 ) * SZSUB IF ( HEIGHT .EQ. B ) THEN DO 230 J0 = 1, NSAVE A( NSAVE1-J0, J+J0 ) = ZERO 230 CONTINUE DO 250 J0 = 2, NSAVE IC = J + J0 - 1 DO 240 ID = 1, NSAVE1-J0 A( ID, IC ) = WORK( IX ) IX = IX + 1 240 CONTINUE 250 CONTINUE ELSE DO 270 J0 = 1, NSAVE IC = J + J0 DO 260 ID = 1, NSAVE1-J0 A( ID, IC ) = WORK( IX ) IX = IX + 1 260 CONTINUE 270 CONTINUE ENDIF * IF ( TAU .NE. ZERO ) THEN * * --- apply the previous Householder transform * to the subdiagonal block (from the right) --- * CALL SLARFX( 'Right', HEIGHT, WIDTH, WORK( V ), TAU, > A( B+1, J ), LDA-1, WORK( IWORK ) ) ENDIF * * --- save the previous scaling factor --- * WORK( V ) = TAU * * --- generate a new Householder transform to * zero the first column of the subdiagonal block --- * CALL SLBRFG( HEIGHT, A( B+1, J ), A( B+2, J ), 1, > TAU, DRPTOL ) * IF ( BLOCK ) THEN V = IV + ( K - K0 ) * ( N - K0 + 1 ) + NBLK * B ENDIF WORK( V ) = ONE CALL SCOPY( HEIGHT-1, A( B+2, J ), 1, WORK( V+1 ), 1 ) DO 310 I = B+2, B+HEIGHT A( I, J ) = ZERO 310 CONTINUE * IF ( TAU .NE. ZERO ) THEN * * --- apply the transform to the subdiagonal block * (from the left) --- * CALL SLARFX( 'Left', HEIGHT, WIDTH-1, WORK( V ), TAU, > A( B, J+1 ), LDA-1, WORK( IWORK ) ) ENDIF * * --- if lda is too small then the subdiagonal block * must be saved ... --- * IX = ISUB + ( NBLK - 1 ) * SZSUB DO 420 J0 = 2, NSAVE IC = J + J0 DO 410 ID = 1, NSAVE1-J0 WORK( IX ) = A( ID, IC ) IX = IX + 1 410 CONTINUE 420 CONTINUE * * --- ... and the diagonal block must be restored --- * IX = IDIAG DO 440 J0 = 1, NSAVE IC = J + J0 DO 430 ID = 1, NSAVE1-J0 A( ID, IC ) = WORK( IX ) IX = IX + 1 430 CONTINUE 440 CONTINUE IF ( TAU .NE. ZERO ) THEN * * --- apply the transform to the diagonal block * (two-sided) --- * CALL SSYRF( 'Lower', HEIGHT, WORK( V ), 1, TAU, > A( 1, J+B ), LDA-1, WORK( IWORK ) ) * * --- if the transformations of U are not blocked * then apply them as they are generated --- * IF ( ONFLY ) THEN CALL SLARFX( 'Right', N, HEIGHT, WORK( V ), TAU, > U( 1, J+B ), LDU, WORK( IWORK ) ) ENDIF ENDIF * 500 CONTINUE * * --- save the last scaling factor --- * WORK( V ) = TAU * * ...................................................................... * IF ( BLOCK ) THEN * * --- (delayed) update of the transformation matrix U. * To allow blocked operations, the update is only * done in every nb0-th pass through the k loop --- * IF ( ( MOD( K, NB0 ) .EQ. 0 ) .OR. ( K .EQ. ( N-2 ) ) ) > THEN * * --- the following loop applies block transforms * reversely to their generation, e.g., starting * at the bottom and working up. * First, determine which columns ifirst ... * are affected by the block transform and * how many (nb1) transforms it contains --- * DO 600 IFIRST = N-MOD( N-K0-1, B ), K0+1, -B * * --- how many Householder transforms contribute * to the current block transform ? --- * NB1 = MIN( K-K0+1, N-IFIRST+1 ) LDWY = MIN( LDWY0, N-IFIRST+1 ) * * --- determine the block Householder reflector * corresponding to these nb1 vectors --- * V = IFIRST - K0 - 1 + IV CALL SCOPY( NB1, WORK( V ), N-K0+1, WORK( ITAU ), 1 ) CALL SGBWYG( LDWY, NB1, B-1, > WORK( V ), N-K0, WORK( ITAU ), > WORK( IW ), LDWY, WORK( IY ), LDWY, NB2 ) * * --- update U by postmultiplying --- * CALL SGEWY( 'Right', N, LDWY, NB2, > U( 1, IFIRST ), LDU, > WORK( IW ), LDWY, WORK( IY ), LDWY, > WORK( IWORK ) ) * 600 CONTINUE * K0 = K0 + NB0 * ENDIF ENDIF * * ...................................................................... * 700 CONTINUE * * --- end of the main loop: cleanup for the very tail * of the band --- * D( N-1 ) = A( 1, N-1 ) E( N-1 ) = A( 2, N-1 ) * D( N ) = A( 1, N ) * 999 RETURN END * * ********************************************************************** * SUBROUTINE SSY2BC( UPLO, N, B, AFULL, LDFULL, ABAND, LDBAND, > INFO ) * * ---------------------------------------------------------------------- * * Description: * * ssy2bc copies a symmetric banded A matrix from (upper or lower) * symmetric (full) storage to lower banded storage. * * Note that afull and aband must refer to different memory locations, * i.e., A may NOT be repacked within the same array. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 UPLO INTEGER N, B, LDFULL, LDBAND, INFO REAL AFULL( LDFULL, * ), ABAND( LDBAND, * ) * * uplo (in) character*1 * Is the matrix A stored in the upper or lower triangle of the * array afull ? * uplo = 'U' : Upper triangle. * = 'L' : Lower triangle. * * n (in) integer * The size of the matrix A. * n >= 0. * * b (in) integer * The (semi-)bandwidth of the matrix A. * 0 <= b < n, if n >= 1. * b = 0 , if n = 0. * * afull (in) real array, dimension ( ldfull, n ) * The symmetric banded matrix A in upper or lower symmetric * storage. * * ldfull (in) integer * The leading dimension of the array afull. * ldfull >= max( n, 1 ). * * aband (out) real array, dimension ( ldband, n ) * The symmetric banded matrix A in lower banded storage (upper * banded storage is not supported). * * ldband (in) * The leading dimension of the array aband. * ldband >= b + 1. * * info (out) integer * On exit, info indicates the consistency of the arguments. * info = -1 : uplo was none of 'U', 'L' (upper/lower case). * = -2 : n was out of range (negative). * = -3 : b was out of range (negative or >= n ). * = -5 : ldfull was out of range ( < n or < 1 ). * = -7 : ldband was out of range ( < b + 1 ). * info = 1 : All arguments were ok. * * ---------------------------------------------------------------------- * * Local variables: * LOGICAL UPPER INTEGER J, I * * upper is A given in upper symmetric storage ? * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * INTRINSIC MAX, MIN * * ---------------------------------------------------------------------- * * --- check for errors in the parameters --- * UPPER = LSAME( UPLO, 'U' ) * IF ( .NOT. ( UPPER .OR. ( LSAME( UPLO, 'L' ) ) ) ) THEN INFO = - 1 ELSEIF ( N .LT. 0 ) THEN INFO = - 2 ELSEIF ( ( B .LT. 0 ) .OR. > ( ( N .GT. 0 ) .AND. ( B .GE. N ) ) ) THEN INFO = - 3 ELSEIF ( LDFULL .LT. MAX( N, 1 ) ) THEN INFO = - 5 ELSEIF ( LDBAND .LT. ( B+1 ) ) THEN INFO = - 7 ELSE INFO = 1 ENDIF * IF ( INFO .NE. 1 ) GOTO 999 * * --- check for quick return --- * IF ( N .EQ. 0 ) GOTO 999 * * --- non-trivial case --- * IF ( UPPER ) THEN * * --- "upper to lower" --- * DO 110 J = 1, N DO 100 I = MAX( J-B, 1 ), J ABAND( 1+J-I, I ) = AFULL( I, J ) 100 CONTINUE 110 CONTINUE ELSE * * --- "lower to lower" --- * DO 210 J = 1, N DO 200 I = J, MIN( J+B, N ) ABAND( 1+I-J, J ) = AFULL( I, J ) 200 CONTINUE 210 CONTINUE ENDIF * 999 RETURN END * * ********************************************************************** * SUBROUTINE SSY2BI( UPLO, N, B, A, LDFULL, LDBAND, INFO ) * * ---------------------------------------------------------------------- * * Description: * * ssy2bi copies a symmetric banded A matrix from (upper or lower) * symmetric (full) storage to lower banded storage within the same * array a (i.e., in-place). * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 UPLO INTEGER N, B, LDFULL, LDBAND, INFO REAL A( * ) * * uplo (in) character*1 * Is the matrix A stored in the upper or lower triangle of the * array a ? * uplo = 'U' : Upper triangle. * = 'L' : Lower triangle. * * n (in) integer * The size of the matrix A. * n >= 0. * * b (in) integer * The (semi-)bandwidth of the matrix A. * 0 <= b < n, if n >= 1. * b = 0 , if n = 0. * * a (in/out) real array, * dimension ( max( ldfull, ldband), n ) * On entry, the symmetric banded matrix A in upper or lower * symmetric storage. * On exit, the symmetric banded matrix A in lower banded * storage (upper banded storage is not supported). * Note that this routine treats a as a one-dimensional array. * * ldfull (in) integer * The leading dimension of the array a (in full storage). * ldfull >= max( n, 1 ). * * ldband (in) * The leading dimension of the array a (in banded storage). * ldband >= b + 1. * * info (out) integer * On exit, info indicates the consistency of the arguments. * info = -1 : uplo was none of 'U', 'L' (upper/lower case). * = -2 : n was out of range (negative). * = -3 : b was out of range (negative or >= n ). * = -5 : ldfull was out of range ( < n or < 1 ). * = -6 : ldband was out of range ( < b + 1 ). * info = 1 : All arguments were ok. * * ---------------------------------------------------------------------- * * Local variables: * LOGICAL UPPER INTEGER B1, IBAND, IFULL, J, I * * upper is A given in upper symmetric storage ? * b1 = b + 1 * iband iband + i points to the next entry in a (banded storage) * ifull ifull + i points to the next entry in a (full storage) * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * EXTERNAL SSB2BI * * ssb2bi in-place repacking from banded to banded storage (SBR) * INTRINSIC MAX, MIN * * ---------------------------------------------------------------------- * * --- check for errors in the parameters --- * UPPER = LSAME( UPLO, 'U' ) B1 = B + 1 * IF ( .NOT. ( UPPER .OR. ( LSAME( UPLO, 'L' ) ) ) ) THEN INFO = - 1 ELSEIF ( N .LT. 0 ) THEN INFO = - 2 ELSEIF ( ( B .LT. 0 ) .OR. > ( ( N .GT. 0 ) .AND. ( B .GE. N ) ) ) THEN INFO = - 3 ELSEIF ( LDFULL .LT. MAX( N, 1 ) ) THEN INFO = - 5 ELSEIF ( LDBAND .LT. B1 ) THEN INFO = - 6 ELSE INFO = 1 ENDIF * IF ( INFO .NE. 1 ) GOTO 999 * * --- check for quick return --- * IF ( N .EQ. 0 ) GOTO 999 * * --- non-trivial case --- * IF ( UPPER ) THEN * * --- "upper to lower"; avoid overwriting by first * packing the band as tight as possible (i.e., * leading dimension b + 1) and then "stretching" * to leading dimension ldband --- * DO 110 J = 1, N IBAND = ( J - 1 ) * B1 + 1 - J DO 100 I = J, MIN( J+B, N ) A( IBAND+I ) = A( (I-1)*LDFULL+J ) 100 CONTINUE 110 CONTINUE * IF ( LDBAND .GT. B1 ) THEN CALL SSB2BI( 'Lower', N, B, A, B1, LDBAND, INFO ) ENDIF * ELSE * * --- "lower to lower"; avoid overwriting by * copying the columns in the "safe" order --- * IF ( LDBAND .LE. ( LDFULL+1 ) ) THEN DO 210 J = 1, N IBAND = ( J - 1 ) * LDBAND + 1 - J IFULL = ( J - 1 ) * LDFULL DO 200 I = J, MIN( J+B, N ) A( IBAND+I ) = A( IFULL+I ) 200 CONTINUE 210 CONTINUE ELSE DO 310 J = N, 1, -1 IBAND = ( J - 1 ) * LDBAND + 1 - J IFULL = ( J - 1 ) * LDFULL DO 300 I = MIN( J+B, N ), J, -1 A( IBAND+I ) = A( IFULL+I ) 300 CONTINUE 310 CONTINUE ENDIF * ENDIF * 999 RETURN END * * ********************************************************************** * SUBROUTINE SSB2BC( UPLO, N, B, ASRC, LDSRC, ADST, LDDST, INFO ) * * ---------------------------------------------------------------------- * * Description: * * ssb2bc copies a symmetric banded A matrix from upper or lower * banded storage to lower banded storage. It may be used to pack the * matrix tightly by setting lddst accordingly. * * Note that asrc and adst must refer to different memory locations, * i.e., A may NOT be repacked within the same array. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 UPLO INTEGER N, B, LDSRC, LDDST, INFO REAL ASRC( LDSRC, * ), ADST( LDDST, * ) * * uplo (in) character*1 * Is the matrix A given in upper or lower banded storage ? * uplo = 'U' : Upper banded storage. * = 'L' : Lower banded storage. * * n (in) integer * The size of the matrix A. * n >= 0. * * b (in) integer * The (semi-)bandwidth of the matrix A. * 0 <= b < n, if n >= 1. * b = 0 , if n = 0. * * asrc (in) real array, dimension ( ldsrc, n ) * The symmetric banded matrix A in upper or lower banded * storage. * * ldsrc (in) integer * The leading dimension of the array asrc. * ldsrc >= b + 1. * * adst (out) real array, dimension ( lddst, n ) * The symmetric banded matrix A in lower banded storage. * * lddst (in) integer * The leading dimension of the array adst. * lddst >= b + 1. * * info (out) integer * On exit, info indicates the consistency of the arguments. * info = -1 : uplo was none of 'U', 'L' (upper/lower case). * = -2 : n was out of range (negative). * = -3 : b was out of range (negative or >= n ). * = -5 : ldsrc was out of range ( < b + 1 ). * = -7 : lddst was out of range ( < b + 1 ). * info = 1 : All arguments were ok. * * ---------------------------------------------------------------------- * * Local variables: * LOGICAL UPPER INTEGER B1, J, I * * upper is A given in upper banded storage ? * b1 = b + 1 * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * INTRINSIC MIN * * ---------------------------------------------------------------------- * * --- check for errors in the parameters --- * UPPER = LSAME( UPLO, 'U' ) B1 = B + 1 * IF ( .NOT. ( UPPER .OR. ( LSAME( UPLO, 'L' ) ) ) ) THEN INFO = - 1 ELSEIF ( N .LT. 0 ) THEN INFO = - 2 ELSEIF ( ( B .LT. 0 ) .OR. > ( ( N .GT. 0 ) .AND. ( B .GE. N ) ) ) THEN INFO = - 3 ELSEIF ( LDSRC .LT. B1 ) THEN INFO = - 5 ELSEIF ( LDDST .LT. B1 ) THEN INFO = - 7 ELSE INFO = 1 ENDIF * IF ( INFO .NE. 1 ) GOTO 999 * * --- check for quick return --- * IF ( N .EQ. 0 ) GOTO 999 * * --- non-trivial case --- * IF ( UPPER ) THEN * * --- "upper to lower" --- * DO 110 J = 1, N DO 100 I = 1, MIN( B1, N-J+1 ) ADST( I, J ) = ASRC( B+2-I, J+I-1 ) 100 CONTINUE 110 CONTINUE ELSE * * --- "lower to lower" --- * DO 210 J = 1, N DO 200 I = 1, MIN( B1, N-J+1 ) ADST( I, J ) = ASRC( I, J ) 200 CONTINUE 210 CONTINUE * ENDIF * 999 RETURN END * * ********************************************************************** * SUBROUTINE SSB2BI( UPLO, N, B, A, LDSRC, LDDST, INFO ) * * ---------------------------------------------------------------------- * * Description: * * ssb2bi copies a symmetric banded A matrix from upper or lower banded * storage to lower banded storage within the same array a (i.e., * in-place). It may be used to pack the matrix tightly by setting * lddst accordingly. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 UPLO INTEGER N, B, LDSRC, LDDST, INFO REAL A( * ) * * uplo (in) character*1 * Is the matrix A given in the upper or lower banded storage ? * uplo = 'U' : Upper banded storage. * = 'L' : Lower banded storage. * * n (in) integer * The size of the matrix A. * n >= 0. * * b (in) integer * The (semi-)bandwidth of the matrix A. * 0 <= b < n. * * a (in/out) real array, * dimension ( max( ldsrc, lddst ), n ) * On entry, the symmetric banded matrix A in upper or lower * banded storage. * On exit, the symmetric banded matrix A in lower banded * storage (upper banded storage is not supported). * Note that this routine treats a as a one-dimensional array. * * ldsrc (in) integer * The leading dimension of the array a (input storage scheme). * ldsrc >= b + 1. * * lddst (in) integer * The leading dimension of the array a (output storage * scheme). * lddst >= b + 1. * * info (out) integer * On exit, info indicates the consistency of the arguments. * info = -1 : uplo was none of 'U', 'L' (upper/lower case). * = -2 : n was out of range (negative). * = -3 : b was out of range (negative or >= n ). * = -5 : ldsrc was out of range ( < b + 1 ). * = -6 : lddst was out of range ( < b + 1 ). * info = 1 : All arguments were ok. * * ---------------------------------------------------------------------- * * Local variables: * LOGICAL UPPER INTEGER B1, LDSRC1, ISRC, IDST, J, I * * upper is A given in upper banded storage ? * b1 = b + 1 * ldsrc1 leading dimension of the current source, minus 1 * isrc isrc + i points to the next source element in a * idst idst + something points to the next destination element in a * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * INTRINSIC MAX, MIN * * ---------------------------------------------------------------------- * * --- check for errors in the parameters --- * UPPER = LSAME( UPLO, 'U' ) B1 = B + 1 * IF ( .NOT. ( UPPER .OR. ( LSAME( UPLO, 'L' ) ) ) ) THEN INFO = - 1 ELSEIF ( N .LT. 0 ) THEN INFO = - 2 ELSEIF ( ( B .LT. 0 ) .OR. > ( ( N .GT. 0 ) .AND. ( B .GE. N ) ) ) THEN INFO = - 3 ELSEIF ( LDSRC .LT. B1 ) THEN INFO = - 5 ELSEIF ( LDDST .LT. B1 ) THEN INFO = - 6 ELSE INFO = 1 ENDIF * IF ( INFO .NE. 1 ) GOTO 999 * * --- check for quick return --- * IF ( N .EQ. 0 ) GOTO 999 * * --- non-trivial case --- * IF ( UPPER ) THEN * * --- "upper to lower" --- * IF ( LDDST .LE. LDSRC ) THEN * * --- no danger of overwriting --- * LDSRC1 = LDSRC - 1 DO 110 J = 1, N IDST = ( J - 1 ) * LDDST ISRC = ( J - 2 ) * LDSRC + B + 2 DO 100 I = 1, MIN( B1, N-J+1 ) A( IDST+I ) = A( ISRC+I*LDSRC1 ) 100 CONTINUE 110 CONTINUE ELSE * * --- first copy to upper storage, then transpose --- * DO 210 J = N, 1, -1 IDST = ( J - 1 ) * LDDST ISRC = ( J - 1 ) * LDSRC DO 200 I = B1, MAX( B1-J+1, 1 ), -1 A( IDST+I ) = A( ISRC+I ) 200 CONTINUE 210 CONTINUE * LDSRC1 = LDDST - 1 DO 230 J = 1, N IDST = ( J - 1 ) * LDDST ISRC = ( J - 2 ) * LDDST + B + 2 DO 220 I = 1, MIN( B1, N-J+1 ) A( IDST+I ) = A( ISRC+I*LDSRC1 ) 220 CONTINUE 230 CONTINUE ENDIF * ELSE * * --- "lower to lower"; avoid overwriting by * copying the columns in the "safe" order --- * IF ( LDDST .LE. LDSRC ) > THEN DO 310 J = 1, N IDST = ( J - 1 ) * LDDST ISRC = ( J - 1 ) * LDSRC DO 300 I = 1, MIN( B1, N-J+1 ) A( IDST+I ) = A( ISRC+I ) 300 CONTINUE 310 CONTINUE ELSE DO 410 J = N, 1, -1 IDST = ( J - 1 ) * LDDST ISRC = ( J - 1 ) * LDSRC DO 400 I = MIN( B1, N-J+1 ), 1, -1 A( IDST+I ) = A( ISRC+I ) 400 CONTINUE 410 CONTINUE ENDIF * ENDIF * 999 RETURN END * * ********************************************************************** * SUBROUTINE SSBRDD( JOBU, UPLO, N, B1, B2, A, LDA, DRPTOL, D, E, > U, LDU, NSTEPS, B, NB, > WORK, LWORK, STEP, INFO ) * * Description: * * Driver routine for the multi-step reduction of symmetric banded * matrices to narrower banded form. * Given a symmetric n-by-n matrix A with b1 sub(or super-) diagonals, * ssbrdd reduces A to a symmetric banded matrix B with b2 sub(or * super-) diagonals using a sequence of orthogonal transformations. * If desired, the same transformations are also applied from the right * to the matrix U. That is, if initially U was the identity, then the * resulting banded matrix B and the updated U fulfill the equation * * T * U * A * U = B . * * A must be given in the LAPACK packed storage scheme for upper or * lower banded matrices and is returned in lower banded storage (upper * banded is not supported for output). * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 JOBU, UPLO INTEGER N, B1, B2, LDA, LDU, NSTEPS, LWORK, STEP, > INFO INTEGER B( * ), NB( * ) REAL DRPTOL REAL A( LDA, * ), D( * ), E( * ), U( LDU, * ), > WORK( * ) * * jobu (in) character*1 * Specifies whether U is required or not. * jobu = 'U' : Update U. * = 'N' : Do not update U. * * uplo (in) character*1 * Is the matrix A given in the upper or lower banded storage ? * uplo = 'U' : Upper banded storage. * = 'L' : Lower banded storage. * * n (in) integer * The size of the matrix A. * n >= 0. * * b1 (in) integer * The number of sub(super-)diagonals of A. * 0 <= b1 < n, if n > 0. * b1 = 0, if n = 0. * * b2 (in) integer * The number of sub(super-)diagonals of B. * 1 <= b2 <= b1 or b2 = b1 = 0. * * a (in/out) real array, dimension ( lda, n ) * On entry, the leading (b1+1)-by-n portion of a contains the * symmetric banded matrix A in upper or lower banded storage. * If uplo='U' then for i = 1, ..., n, the matrix elements * A( i, j ), j = i, ..., min( i+b1, n ), are stored at * position a( b1+1+i-j, j ), whereas for uplo='L', the matrix * elements A( i, j ), j = max( i-b, 1 ), ..., i, are stored at * position a( 1+i-j, j ). * On exit, the leading (b2+1)-by-n portion of a contains the * reduced matrix B in lower (!) banded storage. * * lda (in) integer * The leading dimension of the array a. * lda >= min( b1+1, n ) and lda > 0. * * drptol (in) real * Threshold for dropping the Householder transformations: if * the norm of the vector to be eliminated is already smaller * than drptol then the transform is skipped. * drptol >= 0.0. * If you do not know, use 0.0. * * d (out) real array, dimension ( n ) * If b2 = 1 then, on exit, d( 1 .. n ) contains the main * diagonal of the resulting tridiagonal matrix B. * * e (out) real array, dimension ( n-1 ) * If b2 = 1 then, on exit, e( 1 .. n-1 ) contains the * subdiagonal of the resulting tridiagonal matrix B. * * u (in/out) real array, dimension ( ldu, n ) * On entry, u contains some n-by-n matrix U. * On exit, U is postmultiplied with all orthogonal transforms * that were used to reduce the bandwidth of A. * Accessed only if the update of U is required. * * ldu (in) integer * The leading dimension of the array u. * ldu >= max( n, 1 ). * * nsteps (in) integer * The number of reduction steps. * nsteps >= 0. * * If nsteps > 0 then the reduction from b1 to b2 is done in * exactly nsteps steps with user-specified intermediate * bandwidths and blocking factors (see paramaters b and nb, * below). * If nsteps = 0 then the routine tries to determine these * parameters on its own. * If you do not know or if you do not care, use 0. * * b (in) integer array, dimension ( nsteps-1 ) * The sequence of intermediate bandwidths. The nsteps * bandwidth reduction steps are * b1 --> b( 1 ), * b( 1 ) --> b( 2 ), * ... * b( nsteps-1 ) --> b2. * This array is accessed only if nsteps > 1. * * nb (in) integer array, dimension ( nsteps ) * The blocking factors nb, as suggested by the user, for the * reduction and/or the accumulation of the transformations * in each of the nb reduction steps. * Note that the automatic selection of suitable blocking * factors is enabled by setting nb( i ) = 0 for some steps i. * This array is accessed only if nsteps > 0. * * work (workspace) real array, dimension ( lwork ) * * lwork (in) integer * The length of the workspace array. * The exact amount of workspace required depends on the * sequence of intermediate bandwidths (i.e., b), on the * leading dimension of the array a (i.e., lda), and on the * blocking factors for the reduction steps (i.e., nb). * lwork >= maximum workspace requirement for any of the * reduction steps. * As a rule, lwork >= b1 * n should work fine. * * step (out) integer * On exit, step returns the number of the last reduction step * that was performed (or tried). * * info (out) integer * On exit, info indicates the status of the reduction. * info = 1 : All arguments were OK, and the reduction went * without problems. * = -1 : jobu is none of 'U', 'N' (upper/lower case). * = -2 : uplo is none of 'U', 'L' (upper/lower case). * = -3 : n is out of range (negative). * = -4 : b1 is out of range ( < 0 or >= n ). * = -5 : b2 is out of range ( < 0, or = 0 while b1 >= 1, * or > b1 ). * = -7 : lda is too small (see above). * = -8 : drptol is out of range (negative). * = -12 : ldu is out of range ( < n ). * = -13 : nsteps is out of range (negative). * = -14 : the sequence of bandwidths b1, b( 1 ), b( 2 ), * ..., b( nsteps-1 ), b2 is not monotonically * decreasing * = -15 : nb contains negative entries * = -17 : lwork is too small (see above). * If info < 0 and step > 0 then the parameter for the step-th * reduction step was not OK. * * Local constants and variables: * REAL ZERO PARAMETER ( ZERO = 0.0E0 ) * LOGICAL NEEDU, UPPER INTEGER BCURR, LDCURR, NBCURR, BNEXT, LDNEXT, NX CHARACTER*1 ULCURR * * needu is U needed ? * upper is A given in upper or lower banded storage ? * bcurr current bandwidth * ldcurr current leading dimension of the band * nbcurr blocking factor for the current step * bnext bandwidth after the next reduction step * ldnext leading dimension of the band after repacking * nx cross-over point from LAPACK to SBR code, and block size * ulcurr is the current band in upper or lower storage ? * * Routines called: * LOGICAL LSAME INTEGER NBDFLT EXTERNAL LSAME, NBDFLT * * lsame case-insensitive character matching (BLAS) * nbdflt determine default crossover point from LAPACK to SBR code * or default intermediate bandwidth (SBR) * EXTERNAL SSB2BI, SSBRDB, SSBRDT, SSBTRD * * ssb2bi in-place repacking of banded matrices (SBR) * ssbrdb one-step reduction banded -> banded (SBR) * ssbrdt one-step reduction banded -> tridiagonal (SBR) * ssbtrd one-step reduction banded -> tridiagonal (LAPACK) * INTRINSIC MAX, MIN * * ---------------------------------------------------------------------- * * --- check for errors in input --- * NEEDU = LSAME( JOBU, 'U' ) UPPER = LSAME( UPLO, 'U' ) * IF ( .NOT. ( NEEDU .OR. LSAME( JOBU, 'N' ) ) ) THEN INFO = -1 ELSEIF ( .NOT. ( UPPER .OR. LSAME( UPLO, 'Lower' ) ) ) THEN INFO = -2 ELSEIF ( N .LT. 0 ) THEN INFO = -3 ELSEIF ( ( B1 .LT. 0 ) .OR. > ( ( N .GT. 0 ) .AND. ( B1 .GE. N ) ) ) THEN INFO = -4 ELSEIF ( ( B2 .LT. 0 ) .OR. > ( ( B2 .EQ. 0 ) .AND. ( B1 .GE. 1 ) ) .OR. > ( B2 .GT. B1 ) ) THEN INFO = -5 ELSEIF ( LDA .LT. ( B1+1 ) ) THEN INFO = -7 ELSEIF ( DRPTOL .LT. ZERO ) THEN INFO = -8 ELSEIF ( NEEDU .AND. ( LDU .LT. MAX( N, 1 ) ) ) THEN INFO = -12 ELSEIF ( NSTEPS .LT. 0 ) THEN INFO = -13 ELSE INFO = 0 ENDIF IF ( INFO .LT. 0 ) GOTO 999 * IF ( NSTEPS .GT. 1 ) THEN IF ( ( B( 1 ) .GT. B1 ) .OR. ( B2 .GT. B( NSTEPS-1 ) ) ) THEN INFO = -14 ELSE DO 10 STEP = 1, NSTEPS-2 IF ( B( STEP+1 ) .GT. B( STEP ) ) INFO = -14 10 CONTINUE ENDIF ENDIF IF ( INFO .LT. 0 ) GOTO 999 * IF ( NSTEPS .GT. 0 ) THEN DO 20 STEP = 1, NSTEPS IF ( NB( STEP ) .LT. 0 ) INFO = -15 20 CONTINUE ENDIF IF ( INFO .LT. 0 ) GOTO 999 * * --- set current bandwidth, leading dimension, etc. --- * ULCURR = UPLO BCURR = B1 LDCURR = LDA STEP = 0 * * --- while bandwidth is too large do next reduction step --- * 100 IF ( BCURR .GT. B2 ) THEN STEP = STEP + 1 * * --- determine target bandwidth and blocking factor * for the next reduction step --- * IF ( STEP .LT. NSTEPS ) THEN BNEXT = B( STEP ) NBCURR = NB( STEP ) ELSEIF ( STEP .EQ. NSTEPS ) THEN BNEXT = B2 NBCURR = NB( STEP ) ELSE * * --- automatic bandwidth selection --- * BNEXT = NBDFLT( 'SBRDD', 'SinglePrec', 'Bandwidth', > N, BCURR, B2, NEEDU ) * * --- if the proposed intermediate bandwidth is out * of range then do a one-step reduction --- * IF ( ( BNEXT .GE. BCURR ) .OR. ( BNEXT .LT. B2 ) ) THEN BNEXT = B2 ENDIF NBCURR = 0 ENDIF * IF ( BNEXT .EQ. 1 ) THEN * * --- reduction to tridiagonal form; * use SBR or LAPACK code ? --- * NX = NBDFLT( 'SBRDD', 'SinglePrec', 'CrossoverPoint', > N, BCURR, B2, NEEDU ) IF ( BCURR .LT. NX ) THEN * * --- LAPACK tridiagonalization; first repack the * band to improve performance --- * LDNEXT = BCURR + 1 IF ( LDCURR .NE. LDNEXT ) THEN CALL SSB2BI( ULCURR, N, BCURR, A, LDCURR, LDNEXT, INFO ) LDCURR = LDNEXT ULCURR = 'Lower' ENDIF * IF ( LWORK .LT. N ) THEN INFO = -17 ELSE CALL SSBTRD( JOBU, ULCURR, N, BCURR, A, LDCURR, D, E, > U, LDU, WORK, INFO ) ENDIF ELSE * * --- SBR tridiagonalization; first repack the band * to improve performance --- * LDNEXT = MIN( 2*BCURR, LDA ) IF ( ( LDCURR .NE. LDNEXT ) .OR. > LSAME( ULCURR, 'Upper' ) ) THEN CALL SSB2BI( ULCURR, N, BCURR, A, LDCURR, LDNEXT, INFO ) LDCURR = LDNEXT ULCURR = 'Lower' ENDIF * CALL SSBRDT( JOBU, N, BCURR, A, LDCURR, DRPTOL, D, E, > U, LDU, NBCURR, WORK, LWORK, INFO ) IF ( INFO .EQ. -13 ) INFO = -17 ENDIF * ELSE * * --- SBR reduction to narrower banded form; first * repack the band to improve performance (optimum * leading dimension depends on the blocking * factor - so determine that one first) --- * IF ( NBCURR .EQ. 0 ) THEN NX = NBDFLT( 'SBRDB', 'SinglePrec', 'BlockingFactor', > N, BCURR, BNEXT, NEEDU ) ELSE NX = NBCURR ENDIF IF ( NX .GT. BNEXT ) NX = BNEXT IF ( NX .LT. 1 ) NX = 1 LDNEXT = MIN( BCURR+(BCURR-BNEXT)+NX, LDA ) IF ( ( LDCURR .NE. LDNEXT ) .OR. > LSAME( ULCURR, 'Upper' ) ) THEN CALL SSB2BI( ULCURR, N, BCURR, A, LDCURR, LDNEXT, INFO ) LDCURR = LDNEXT ULCURR = 'Lower' ENDIF * CALL SSBRDB( JOBU, N, BCURR, BNEXT, A, LDCURR, DRPTOL, > U, LDU, NBCURR, WORK, LWORK, INFO ) IF ( INFO .EQ. -12 ) INFO = -17 ENDIF * BCURR = BNEXT IF ( INFO .GE. 0 ) GOTO 100 * ENDIF * * --- after the reduction, repack the band to leading * dimension lda and lower banded storage scheme --- * IF ( ( INFO .GE. 0 ) .AND. > ( ( LDCURR .NE. LDA ) .OR. LSAME( ULCURR, 'Upper' ) ) ) > THEN CALL SSB2BI( ULCURR, N, BCURR, A, LDCURR, LDA, INFO ) ENDIF * IF ( INFO .GE. 0 ) INFO = 1 * 999 RETURN END * * ********************************************************************** * SUBROUTINE SSYRDD( JOBU, UPLO, N, B2, A, LDA, DRPTOL, > ABAND, LDBAND, D, E, NSTEPS, B, NB, > WORK, LWORK, STEP, INFO ) * * Description: * * Driver routine for the multi-step reduction of symmetric matrices to * banded form. * Given a symmetric n-by-n matrix A, ssyrdd reduces A to a symmetric * banded matrix B with b2 sub(or super-) diagonals using a sequence of * orthogonal transformations. * If desired, the same transformations are also accumulated in an * orthogonal matrix U. That is, the resulting banded matrix B and the * accumulated matrix U fulfill the equation * * T * U * A * U = B . * * A must be given in the LAPACK symmetric storage scheme with either * the upper or lower triangle stored explicitly, and B is returned in * lower banded storage (upper banded is not supported for output). * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Parameters: * CHARACTER*1 JOBU, UPLO INTEGER N, B2, LDA, LDBAND, NSTEPS, LWORK, STEP, > INFO INTEGER B( * ), NB( * ) REAL DRPTOL REAL A( LDA, * ), ABAND( LDBAND, * ), > D( * ), E( * ), WORK( * ) * * jobu (in) character*1 * Specifies whether U is required or not. * jobu = 'U' : Build U. * = 'N' : Do not build U. * * uplo (in) character*1 * Is the matrix A stored in the upper or lower triangle of a ? * uplo = 'U' : Upper triangle. * = 'L' : Lower triangle. * * n (in) integer * The size of the matrix A. * n >= 0. * * b2 (in) integer * The number of sub(super-)diagonals of B. * 1 <= b2 < n, if n > 1. * b2 = 0 , if n <= 1. * * a (in/out) real array, dimension ( lda, n ) * On entry, the leading n-by-n portion of a contains the * symmetric matrix A in upper or lower symmetric storage. * If uplo='U' then the upper triangle of A is stored in * the upper triangle of the leading n-by-n portion of a; * if uplo='L' then the lower triangle of A is stored in * the lower triangle of the leading n-by-n portion of a. * On exit, A is destroyed. * If jobu='U' then the leading n-by-n portion of a holds * the orthogonal matrix U. * * lda (in) integer * The leading dimension of the array a. * lda >= max( n, 1 ). * * drptol (in) real * Threshold for dropping the Householder transformations: if * the norm of the vector to be eliminated is already smaller * than drptol then the transform is skipped. * drptol >= 0.0. * If you do not know, use 0.0. * * aband (out) real array, dimension ( ldband, n ) * On exit, the leading (b2+1)-by-n portion of aband holds the * symmetric banded matrix B in lower banded storage (i.e., for * j = 1, ..., n and i = j, ..., min( j+b2, n ), the matrix * element B( i, j ) is stored in location aband( i-j+1, j ). * * ldband (in) integer * The leading dimension of the array aband. * ldband >= b( 1 ) + 1, if nsteps > 1. * >= b2 + 1 , otherwise. * For reasonable performance, set ldband >= 2 * b( 1 ) if * nsteps > 1, and ldband >= 50 if nsteps = 0. * * d (out) real array, dimension ( n ) * If b2 = 1 then, on exit, d( 1 .. n ) contains the main * diagonal of the resulting tridiagonal matrix B. * * e (out) real array, dimension ( n-1 ) * If b2 = 1 then, on exit, e( 1 .. n-1 ) contains the * subdiagonal of the resulting tridiagonal matrix B. * * nsteps (in) integer * The number of reduction steps. * nsteps >= 0. * * If nsteps > 0 then the reduction from full to b2 diagonals * is done in exactly nsteps steps with user-specified * intermediate bandwidths and blocking factors (see paramaters * b and nb, below). * If nsteps = 0 then the routine tries to determine these * parameters on its own. * If you do not know or if you do not care, use 0. * * b (in) integer array, dimension ( nsteps-1 ) * The sequence of intermediate bandwidths. The nsteps * bandwidth reduction steps are * n-1 --> b( 1 ), * b( 1 ) --> b( 2 ), * ... * b( nsteps-1 ) --> b2. * This array is accessed only if nsteps > 1. * * nb (in) integer array, dimension ( nsteps ) * The blocking factors nb, as suggested by the user, for the * reduction and/or the accumulation of the transformations * in each of the nb reduction steps. * Note that the automatic selection of suitable blocking * factors is enabled by setting nb( i ) = 0 for some steps i. * This array is accessed only if nsteps > 0. * * work (workspace) real array, dimension ( lwork ) * * lwork (in) integer * The length of the workspace array. * The exact amount of workspace required depends on the * sequence of intermediate bandwidths (i.e., b), on the * leading dimension of the array a (i.e., lda), and on the * blocking factors for the reduction steps (i.e., nb). * lwork >= maximum workspace requirement for any of the * reduction steps. * Minimum requirement is 4 * n, but setting lwork this low may * severely degrade performance. * As a rule, lwork >= 50 * n should work fine; if you can * spare it, use lwork >= 100 * n. * * step (out) integer * On exit, step returns the number of the last reduction step * that was performed (or tried). * * info (out) integer * On exit, info indicates the status of the reduction. * info = 1 : All arguments were OK, and the reduction went * without problems. * = -1 : jobu is none of 'U', 'N' (upper/lower case). * = -2 : uplo is none of 'U', 'L' (upper/lower case). * = -3 : n is out of range (negative). * = -4 : b2 is out of range ( < 0, * or < 1 or >= n while n > 1 ). * = -6 : lda is too small (see above). * = -7 : drptol is out of range (negative). * = -9 : ldband is out of range ( < b(1)+1 ). * = -12 : nsteps is out of range (negative). * = -13 : the sequence of bandwidths n-1, b( 1 ), b( 2 ), * ..., b( nsteps-1 ), b2 is not monotonically * decreasing * = -14 : nb contains negative entries * = -16 : lwork is too small (see above). * If info < 0 and step > 0 then the parameter for the step-th * reduction step was not OK. * * Local constants and variables: * REAL ZERO PARAMETER ( ZERO = 0.0E0 ) * LOGICAL NEEDU, UPPER INTEGER BNEXT, NBCURR * * needu is U needed ? * upper is the upper triangle of A stored ? * nbcurr blocking factor for the current step * bnext bandwidth after the next reduction step * * Routines called: * LOGICAL LSAME INTEGER NBDFLT EXTERNAL LSAME, NBDFLT * * lsame case-insensitive character matching (BLAS) * nbdflt determine intermediate bandwidth (SBR) * EXTERNAL SORGTR, SSBRDD, SSY2BC, SSYGTR, SSYRDB, > SSYTRD * * sorgtr accumulation of the transformations (LAPACK) * ssbrdd bandwidth reduction for banded matrices (SBR) * ssy2bc repacking from full to banded storage (SBR) * ssygtr accumulation of the transformations (SBR) * ssyrdb reduction full -> banded (SBR) * ssytrd one-step reduction full -> tridiagonal (LAPACK) * INTRINSIC MAX * * ---------------------------------------------------------------------- * STEP = 1 * * --- check for errors in input --- * NEEDU = LSAME( JOBU, 'U' ) UPPER = LSAME( UPLO, 'U' ) * IF ( .NOT. ( NEEDU .OR. LSAME( JOBU, 'N' ) ) ) THEN INFO = -1 ELSEIF ( .NOT. ( UPPER .OR. LSAME( UPLO, 'Lower' ) ) ) THEN INFO = -2 ELSEIF ( N .LT. 0 ) THEN INFO = -3 ELSEIF ( ( B2 .LT. 0 ) .OR. > ( ( N .GT. 1 ) .AND. > ( ( B2 .LT. 1 ) .OR. ( B2 .GT. N-1 ) ) ) ) THEN INFO = -4 ELSEIF ( LDA .LT. MAX( N, 1 ) ) THEN INFO = -6 ELSEIF ( DRPTOL .LT. ZERO ) THEN INFO = -7 ELSEIF ( ( LDBAND .LE. B2 ) .OR. > ( ( NSTEPS .GT. 1 ) .AND. ( LDBAND .LE. B( 1 ) ) ) ) > THEN INFO = -9 ELSEIF ( NSTEPS .LT. 0 ) THEN INFO = -12 ELSEIF ( LWORK .LT. 4*N ) THEN INFO = -16 ELSE INFO = 0 ENDIF IF ( INFO .LT. 0 ) GOTO 999 * IF ( NSTEPS .GT. 1 ) THEN IF ( ( B( 1 ) .GT. ( N-1 ) ) .OR. > ( B2 .GT. B( NSTEPS-1 ) ) ) THEN INFO = -13 ELSE DO 10 STEP = 1, NSTEPS-2 IF ( B( STEP+1 ) .GT. B( STEP ) ) INFO = -13 10 CONTINUE ENDIF ENDIF IF ( INFO .LT. 0 ) GOTO 999 * IF ( NSTEPS .GT. 0 ) THEN DO 20 STEP = 1, NSTEPS IF ( NB( STEP ) .LT. 0 ) INFO = -14 20 CONTINUE ENDIF IF ( INFO .LT. 0 ) GOTO 999 * * --- check for quick return --- * IF ( N .EQ. 0 ) GOTO 999 * STEP = 1 * * --- determine first intermediate bandwidth and blocking * factor --- * IF ( NSTEPS .GT. 0 ) THEN IF ( NSTEPS .EQ. 1 ) THEN BNEXT = B2 ELSE BNEXT = B( 1 ) ENDIF NBCURR = NB( 1 ) ELSE * * --- automatic bandwidth selection --- * BNEXT = NBDFLT( 'SYRDD', 'SinglePrec', 'Bandwidth', > N, N - 1, B2, NEEDU ) * * --- if the proposed intermediate bandwidth is out * of range then do a one-step reduction --- * IF ( ( BNEXT .GT. N-1 ) .OR. ( BNEXT .LT. B2 ) .OR. > ( LDBAND .LT. 2*BNEXT ) ) THEN BNEXT = B2 ENDIF NBCURR = 0 ENDIF * IF ( BNEXT .EQ. 1 ) THEN * * --- use LAPACK code for direct tridiagonalization --- * CALL SSYTRD( UPLO, N, A, LDA, D, E, WORK( 1 ), > WORK( N ), LWORK-N+1, INFO ) IF ( NEEDU ) THEN CALL SORGTR( UPLO, N, A, LDA, WORK( 1 ), > WORK( N ), LWORK-N+1, INFO ) ENDIF ELSE * * --- reduction to bandwidth > 1 width ssyrdb --- * CALL SSYRDB( UPLO, 'NoU', N, BNEXT, A, LDA, DRPTOL, > WORK( 1 ), N, NBCURR, WORK( 1 ), > WORK( N+1 ), LWORK-N, INFO ) * * --- repack the reduced matrix to banded storage --- * CALL SSY2BC( UPLO, N, BNEXT, A, LDA, ABAND, LDBAND, INFO ) * * --- accumulation of the transformations, if required --- * IF ( NEEDU ) THEN CALL SSYGTR( UPLO, N, BNEXT, A, LDA, WORK( 1 ), > WORK( N+1 ), LWORK-N, INFO ) ENDIF * * --- further reduce the banded matrix, if required --- * IF ( ( BNEXT .GT. B2 ) .AND. ( INFO .GE. 0 ) ) THEN IF ( NSTEPS .EQ. 0 ) THEN CALL SSBRDD( JOBU, 'Lower', N, BNEXT, B2, ABAND, LDBAND, > DRPTOL, D, E, A, LDA, 0, B, NB, > WORK, LWORK, STEP, INFO ) ELSE CALL SSBRDD( JOBU, 'Lower', N, BNEXT, B2, ABAND, LDBAND, > DRPTOL, D, E, A, LDA, NSTEPS-1, B( 2 ), > NB( 2 ), WORK, LWORK, STEP, INFO ) ENDIF STEP = STEP + 1 ENDIF ENDIF * 999 IF ( INFO .GE. 0 ) INFO = 1 * RETURN END * * ********************************************************************** * SUBROUTINE SLBRFG( N, ALPHA, X, INCX, TAU, DRPTOL ) * * ---------------------------------------------------------------------- * * Description: * * slbrfg generates an elementary reflector H of order n, such that * * T * H * ( alpha ) = ( beta ) , H * H = I , * ( x ) ( 0 ) * * where alpha and beta are scalars, and x is an ( n - 1 )-element * vector. H is represented in the form * * T * H = I - tau * ( 1 ) * ( 1 v ) , * ( v ) * * where tau is a scalar and v is an ( n - 1 )-element vector. * * If the elements of x are all zero, or the 2-norm of x does not * exceed drptol, then x is simply zeroed out, tau is set to 0, * indicating that H is the identity matrix. In this case, the * transformation is effectively skipped. * * Otherwise 1 <= tau <= 2. * * This routine is a modified version of slbrfg by Bischof/Sun which * in turn is a modified version of the LAPACK routine slarfg. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * Parameters: * INTEGER N, INCX REAL ALPHA, TAU, DRPTOL REAL X( * ) * * n (in) integer * The order of the elementary reflector. * n >= 0. * * alpha (in/out) real * On entry, the value alpha. * On exit, it is overwritten with the value beta. * * x (in/out) real array, dimension ( 1+(n-2)*incx ) * On entry, the vector x. * On exit, the "x elements" are overwritten with the vector v. * * incx (in) integer * The increment between elements of x. * incx > 0. * * tau (out) real * The scaling factor tau. * * drptol (in) real * Threshold for dropping Householder transforms. * If the norm of the vector to eliminate is already <= drptol * then the transform is skipped. * drptol >= 0.0. * If you do not know, use 0.0. * * ---------------------------------------------------------------------- * * Local variables: * REAL ZERO, ONE PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0 ) * REAL XNORM, BETA, SAFMIN, RSAFMN INTEGER CNT, J * * xnorm 2-norm of x * beta the computed value beta * safmin safe minimum (such that relative accuracy can be guaranteed) * rsafmn 1 / safmin * cnt counts the rescaling steps * * Routines called: * REAL SLAMCH, SLAPY2, SNRM2 EXTERNAL SLAMCH, SLAPY2, SNRM2, SSCAL * * slamch determine machine parameters (LAPACK) * slapy2 stable 2-norm of 2-vector (LAPACK) * snrm2 2-norm of a vector (BLAS) * sscal vector scaling (BLAS) * INTRINSIC SIGN, ABS * * ---------------------------------------------------------------------- * * --- check for quick exit --- * IF ( N .LE. 1 ) THEN TAU = ZERO ELSE * XNORM = SNRM2( N-1, X, INCX ) * IF ( XNORM .LE. DRPTOL ) THEN * * --- H = I --- * TAU = ZERO DO 10 J = 1, N-1 X( 1+(J-1)*INCX ) = ZERO 10 CONTINUE * 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 CNT = 0 * 100 CONTINUE CNT = CNT + 1 ALPHA = ALPHA * RSAFMN CALL SSCAL( N-1, RSAFMN, X, INCX ) BETA = BETA * RSAFMN IF ( ABS( BETA ) .LT. SAFMIN ) GOTO 100 * * --- now abs( beta ) is 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 110 J = 1, CNT ALPHA = ALPHA * SAFMIN 110 CONTINUE * ELSE * TAU = ( BETA - ALPHA ) / BETA CALL SSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX ) ALPHA = BETA * ENDIF * ENDIF * ENDIF * RETURN END * * ********************************************************************** * SUBROUTINE SSYRF( UPLO, N, V, INCV, TAU, > A, LDA, WORK ) * * ---------------------------------------------------------------------- * * Description: * * T * Apply the Householder transform H = I - tau * v * v from both * sides to the symmetric matrix A, i.e., update * * T * A := H * A * H ( = H * A * H ) . * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * ---------------------------------------------------------------------- * * Parameters: * CHARACTER*1 UPLO INTEGER N, INCV, LDA REAL TAU REAL V( * ), A( LDA, * ), WORK( * ) * * uplo (in) character*1 * Is the upper or lower triangle of A stored ? * uplo = 'U' : Upper triangle. * = 'L' : Lower triangle. * * n (in) integer * The dimension of the matrix A. * n >= 0. * * v (in) real array, dimension ( 1+(n-1)*incv ) * The Householder vector associated with H. * Usually, v( 1 ) = 1, and v( 2:n ) contains the "mantissa" of * the transform. * * incv (in) integer * The increment between the elements of v. * incv > 0. * * tau (in) real * The scaling factor for the transform. * * a (in/out) real array, dimension ( lda, n ) * On entry, an n-by-n symmetric matrix A with either the lower * or the upper triangle stored. * On exit, the leading A is overwritten with H * A * H. * * lda (in) integer * The leading dimension of the array a. * lda >= max( n, 1 ). * * work (workspace) real array, dimension ( n ) * * ---------------------------------------------------------------------- * * Local variables: * REAL ZERO, ONE PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0 ) * REAL ALPHA * * alpha auxiliary factor * * Routines called: * REAL SDOT EXTERNAL SAXPY, SDOT, SSYMV, SSYR2 * * saxpy add multiple of a vector to another vector (BLAS) * sdot dot product of two vectors (BLAS) * ssymv symmetric matrix-vector product (BLAS) * ssyr2 symmetric rank-2 update (BLAS) * * ---------------------------------------------------------------------- * IF ( ( N .GT. 0 ) .AND. ( TAU .NE. ZERO ) ) THEN * * --- work( 1:n ) := x = tau * A * v --- * CALL SSYMV( UPLO, N, TAU, A, LDA, V, INCV, ZERO, WORK, 1 ) * * T * --- work( 1:n ) := w = x - 1/2 * tau * ( x * v ) * v --- * ALPHA = -0.5E0 * TAU * SDOT( N, WORK, 1, V, INCV ) CALL SAXPY( N, ALPHA, V, INCV, WORK, 1 ) * * T T * --- A := A - v * w - w * v --- * CALL SSYR2( UPLO, N, -ONE, V, INCV, WORK, 1, A, LDA ) * ENDIF * RETURN END * * ********************************************************************** * SUBROUTINE SGBQR2( M, N, D, A, LDA, TAU, DRPTOL, WORK ) * * ---------------------------------------------------------------------- * * Description: * * Given an m-by-n matrix A with d subdiagonals, sgeqr2 computes * a QR factorization of A. * * The matrix Q is represented as a product of elementary reflectors * * Q = H( 1 ) * ... * H( k ) , where k = min( m, n ). * * Each H( j ) has the form * * T * H( j ) = I - tau * v * v * * where tau is a scalar, and v is a vector of length m with * v( 1:j-1 ) = 0 and v( j ) = 1. * On exit, v( j+1:m ) is stored in a( j+1:m, j ) and tau in tau( j ). * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * Parameters: * INTEGER M, N, D, LDA REAL DRPTOL REAL A( LDA, * ), TAU( * ), WORK( * ) * * m (in) integer * The number of rows in the matrix A. * m >= 0. * * n (in) integer * The number of columns in the matrix A. * n >= 0. * * d (in) integer * The number of subdiagonals of the matrix A. * 0 <= d <= m - 1, if m > 0. * d = 0 , if m = 0. * * a (in/out) real array, dimension ( lda, n ) * On entry, the m-by-n matrix A with lower bandwidth b. * On exit, the elements on and above the diagonal contain the * min( m, n )-by-n upper trapezoidal matrix R (R is upper * triangular if m >= n); the elements below the diagonal, * together with the array tau, represent the orthogonal * matrix Q as a product of Householder transformations. * * lda (in) integer * The leading dimension of the array a. * lda >= min( m, 1 ). * * tau (out) real array, dimension ( min( m-1, n ) ) * The scaling factors of the Householder transformations. * * drptol (in) real * Threshold for dropping Householder transforms. * If the norm of the vector to be zeroed is already less than * drptol then the transform is skipped. * drptol >= 0.0. * * work (workspace) real array, dimension ( n ) * * ---------------------------------------------------------------------- * * Local variables: * REAL ZERO, ONE PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0 ) * INTEGER J, LEN REAL AJJ * * len length of the current transform * ajj temporary buffer for the element a( j, j ) * * Routines called: * EXTERNAL SLARFX, SLBRFG * * slarfx apply Householder transformation (LAPACK) * slbrfg generate Householder vector (SBR) * INTRINSIC MIN * * ---------------------------------------------------------------------- * DO 100 J = 1, MIN( M-1, N ) * LEN = MIN( D+1, M-J+1 ) * * --- generate Householder reflector H( j ) to zero * A( j+1:j+d, j ) --- * CALL SLBRFG( LEN, A( J, J ), A( J+1, J ), 1, > TAU( J ), DRPTOL ) * * --- apply the transform --- * IF ( TAU( J ) .NE. ZERO ) THEN * AJJ = A( J, J ) A( J, J ) = ONE CALL SLARFX( 'Left', LEN, N-J, A( J, J ), TAU( J ), > A( J, J+1 ), LDA, WORK ) A( J, J ) = AJJ * ENDIF * 100 CONTINUE * RETURN END * * ********************************************************************** * SUBROUTINE SGEQRL( DECOMP, M, N, A, LDA, DRPTOL, > TAU, WORK ) * * ---------------------------------------------------------------------- * * Description: * * Compute the QR or QL factorization of the m-by-n matrix A, * where m >= n. * * The matrix Q is represented as a product of elementary reflectors * * Q = H( 1 ) * ... * H( n ) (QR decomposition) * * or * * Q = H( n ) * ... * H( 1 ) (QL decomposition). * * Each H( j ) has the form * * T * H( j ) = I - tau * v * v * * where tau is a scalar, and v is a vector of length m. * * In the QR case, * v( 1:j-1 ) = 0 and v( j ) = 1 and, on exit, v( j+1:m ) is * stored in a( j+1:m, j ) and tau in tau( j ). * * In the QL case, * v( m-n+j+1:m ) = 0 and v( m-n+j ) = 1 and, on exit, * v( 1:m-n+j-1 ) is stored in a( 1:m-n+j-1, j ) and tau in tau( j ). * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * Parameters: * CHARACTER*1 DECOMP INTEGER M, N, LDA REAL DRPTOL REAL A( LDA, * ), TAU( * ), WORK( * ) * * decomp (in) character*1 * Which decomposition is required ? * decomp = 'L' : QL decomposition. * = 'R' : QR decomposition. * * m (in) integer * The number of rows of the matrix A. * m >= 0. * * n (in) integer * The number of columns of the matrix A. * 0 <= n <= m. * * a (in/out) real array, dimension ( lda, n ) * On entry, the m-by-n matrix A. * If decomp = 'R' then, on exit, the elements on and above the * diagonal contain the 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 * Householder transformations. * If decomp = 'L' then, on exit, the n-by-n matrix L is stored * in the lower triangle at the "bottom" of A, and the * Householder vectors are stored in the remaining trapezoid. * * lda (in) integer * The leading dimension of the array a. * lda >= min( m, 1 ). * * tau (out) real array, dimension ( n ) * The scaling factors of the Householder transformations. * * drptol (in) real * Threshold for dropping Householder transforms. * If the norm of the vector to be zeroed is already less than * drptol then the transform is skipped. * drptol >= 0.0. * * work (workspace) real array, dimension ( n ) * * ---------------------------------------------------------------------- * * Local variables: * REAL ONE PARAMETER ( ONE = 1.0E0 ) * INTEGER I, J REAL TMP * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * EXTERNAL SLARFX, SLBRFG * * slarfx apply Householder transform (LAPACK) * slbrfg generate Householder vector (SBR) * INTRINSIC MIN * * ---------------------------------------------------------------------- * IF ( N .GT. 0 ) THEN * IF ( LSAME( DECOMP, 'L' ) ) THEN * * --- QL factorization --- * DO 100 J = N, 1, -1 * * --- generate Householder vector to zero out * A( 1:m-n+j, j) --- * I = M - N + J CALL SLBRFG( I, A( I, J ), A( 1, J ), 1, TAU( J ), > DRPTOL ) * * --- apply transformation from the left --- * TMP = A( I, J ) A( I, J ) = ONE CALL SLARFX( 'Left', I, J-1, A( 1, J ), TAU( J ), > A, LDA, WORK ) A( I, J ) = TMP * 100 CONTINUE * ELSE * * --- QR factorization --- * DO 200 J = 1, N * * --- generate Householder vector to zero out * A( j+1:m, j ) --- * CALL SLBRFG( M-J+1, A( J, J ), > A( MIN( J+1, M ), J ), 1, TAU( J ), > DRPTOL ) * * --- apply transformation from the left --- * TMP = A( J, J ) A( J, J ) = ONE CALL SLARFX( 'Left', M-J+1, N-J, A( J, J ), TAU( J ), > A( J, J+1 ), LDA, WORK ) A( J, J ) = TMP * 200 CONTINUE * ENDIF * ENDIF * RETURN END * * ********************************************************************** * SUBROUTINE SGBWYG( M, N, D, A, LDA, TAU, > W, LDW, Y, LDY, K ) * * ---------------------------------------------------------------------- * * Description: * * Given a set of Householder vectors as returned by sgbqr2, this * routine returns W and Y such that * * T * Q = I + W * Y * * where Q is the product of the Householder matrices. * * Each Householder transformation is represented by a vector vj and * a scalar tau( j ) such that * T T T * H( j ) = I - tau( j ) * ( 1, vj ) * ( 1, vj ) . * * The matrix Q is accumulated as * T * Q( j + 1 ) = I + W( j + 1 ) * Y( j + 1 ) = Q( j ) * H( j ) * * where * T T * Y( j + 1 ) = [ Y( j ), y ] with y = [ 0, vj ] and * * W( j + 1 ) = [ W( j ), w ] with w = - tau( j ) * Q( j ) * y. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * Parameters: * INTEGER M, N, D, LDA, LDW, LDY, K REAL A( LDA, * ), TAU( * ), > W( LDW, * ), Y( LDY, * ) * * m (in) integer * The number of rows of the matrix A. * m >= 0. * * n (in) integer * The number of columns of the matrix A. * n >= 0. * * d (in) integer * The number of subdiagonals of the matrix A (as the vectors * vj are stored in these subdiagonals, d is the length of * these transforms, minus 1). * 0 <= d <= m - 1, if m > 0. * d = 0 , if m = 0. * * a (in/out) real array, dimension ( lda, n ) * On entry, the d subdiagonals of the m-by-n matrix A contain * the Householder vectors vj. * On exit, A is zero below the main diagonal. * * lda (in) integer * The leading dimension of the array A. * lda >= max( m, 1 ). * * tau (in/out) real array, dimension ( n ) * On entry, tau contains the scaling factors for the * Householder transforms. * On exit, tau is destroyed. * * w (out) real array, dimension ( ldw, n ) * On exit, the first k columns of w contain the block * reflector W (zero below the d-th subdiagonal). * * ldw (in) integer * The leading dimension of the array w. * ldw >= max( m, 1 ). * * y (out) real array, dimension ( ldy, n ) * On exit, the first k columns of y contain the block * reflector Y (zero above the main diagonal and below the d-th * subdiagonal). * * ldy (in) integer * The leading dimension of the array y. * ldy >= max( m, 1 ). * * k (out) integer * On exit, k is the "active blocksize" * = the number of valid columns in W and Y * = the number of nontrivial Householder transforms contained * in W and Y * = the number of nonzero tau entries in the input. * 0 <= k <= n. * * ---------------------------------------------------------------------- * * Local variables: * REAL ZERO, ONE PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0 ) * INTEGER I, J, LEN * * len length of the vector v( j ) * * Routines called: * EXTERNAL SGEMV, SSWAP * * sgemv matrix-vector product (BLAS) * sswap swap two vectors (BLAS) * INTRINSIC MIN * * ---------------------------------------------------------------------- * K = 0 * DO 200 J = 1, MIN( M-1, N ) * IF ( TAU( J ) .NE. ZERO ) THEN * * --- W and Y grow --- * K = K + 1 LEN = MIN( M-J, D ) * * --- copy vj to Y( :, k ) and zero A( j+1:j+d, j ) --- * DO 110 I = 1, M Y( I, K ) = ZERO 110 CONTINUE Y( J, K ) = ONE CALL SSWAP( LEN, A( J+1, J ), 1, Y( J+1, K ), 1 ) * * --- W( :, k ) = - tau( j ) * Y( :, k ) --- * DO 120 I = 1, J-1 W( I, K ) = ZERO 120 CONTINUE DO 130 I = J, J+LEN W( I, K ) = -TAU( J ) * Y( I, K ) 130 CONTINUE DO 140 I = J+LEN+1, M W( I, K ) = ZERO 140 CONTINUE * * --- W( :, k ) = - tau( j ) * Q( j-1 ) * y( j ) * T * = ( I + W( j-1 ) * Y( k-1 ) ) * W( :, k ) --- * CALL SGEMV( 'Transpose', LEN+J, K-1, > ONE, Y, LDY, W( 1, K ), 1, ZERO, TAU, 1 ) CALL SGEMV( 'NoTranspose', LEN+J, K-1, > ONE, W, LDW, TAU, 1, ONE, W( 1, K ), 1 ) * ENDIF * 200 CONTINUE * RETURN END * * ********************************************************************** * SUBROUTINE SGEWYG( UPLO, M, N, A, LDA, TAU, > W, LDW, Y, LDY, K, > WORK ) * * ---------------------------------------------------------------------- * * Description: * * Given a set of Householder vectors as returned by sgeqrl, this * routine returns W and Y such that * * T * Q = I + W * Y * * where Q is the product of the Householder matrices. * * Each Householder transformation is represented by a vector vj and * a scalar tau( j ) such that * T T T * H( j ) = I - tau( j ) * ( 1, vj ) * ( 1, vj ) . * * The matrix Q is accumulated as * T * Q( j + 1 ) = I + W( j + 1 ) * Y( j + 1 ) = Q( j ) * H( j ) * * where * T T * Y( j + 1 ) = [ Y( j ), y ] with y = [ 0, vj ] and * * W( j + 1 ) = [ W( j ), w ] with w = - tau( j ) * Q( j ) * y. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * Parameters: * CHARACTER*1 UPLO INTEGER M, N, LDA, LDW, LDY, K REAL A( LDA, * ), TAU( * ), > W( LDW, * ), Y( LDY, * ), WORK( * ) * * uplo (in) character*1 * Are the Housholder vectors stored in the upper or lower * triangle of A ? * uplo = 'U' : Upper triangle. * = 'L' : Lower triangle. * * m (in) integer * The row dimension of the matrix A. * m >= 0. * * n (in) integer * The column dimension of A. * 0 <= n <= m. * * a (in) real array, dimension ( lda, n ) * The matrix containing the Householder vectors. * * lda (in) integer * The leading dimension of the array a. * lda >= max( m, 1 ). * * tau (in) real array, dimension ( n ) * The scaling factors for the Householder transformations. * * w (out) real array, dimension ( ldw, n ) * On exit, the first k columns of w contain the block * reflector W. * * ldw (in) integer * The leading dimension of the array w. * ldw >= max( m, 1 ). * * y (out) real array, dimension ( ldy, n ) * On exit, the first k columns of y contain the block * reflector Y. * * ldy (in) integer * The leading dimension of the array y. * ldy >= max( m, 1 ). * * k (out) integer * On exit, k is the "active blocksize" * = the number of valid columns in W and Y * = the number of nontrivial Householder transforms contained * in W and Y * = the number of nonzero tau entries in the input. * 0 <= k <= n. * * work (workspace) real array, dimension ( n-1 ) * * ---------------------------------------------------------------------- * * Local variables: * REAL ZERO, ONE PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0 ) * INTEGER J, I REAL TMP * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * EXTERNAL SCOPY, SGEMV * * scopy BLAS * sgemv BLAS * * ---------------------------------------------------------------------- * K = 0 * IF ( ( M .GT. 0 ) .AND. ( N .GT. 0 ) ) THEN * IF ( LSAME( UPLO, 'Lower' ) ) THEN * * --- vectors come from a QR decomposition --- * DO 200 J = 1, N * TMP = - TAU( J ) * IF ( TMP .NE. ZERO ) THEN K = K + 1 * * --- Y( :, k ) := vj --- * DO 110 I = 1, J-1 Y( I, K ) = ZERO 110 CONTINUE Y( J, K ) = ONE CALL SCOPY( M-J, A( J+1, J ), 1, Y( J+1, K ), 1 ) * * --- W( :, k ) := - tau( j ) * vj --- * DO 120 I = 1, J-1 W( I, K ) = ZERO 120 CONTINUE DO 130 I = J, M W( I, K ) = TMP * Y( I, K ) 130 CONTINUE * * --- apply previous transformations --- * IF ( K .GT. 1 ) THEN CALL SGEMV( 'Transpose', M, K-1, > ONE, Y, LDY, W( 1, K ), 1, ZERO, WORK, 1 ) CALL SGEMV( 'NoTranspose', M, K-1, > ONE, W, LDW, WORK, 1, ONE, W( 1, K ), 1 ) ENDIF ENDIF * 200 CONTINUE * ELSE * * --- vectors come from a QL decomposition --- * DO 400 J = N, 1, -1 * TMP = - TAU( J ) * IF ( TMP .NE. ZERO ) THEN K = K + 1 * * --- Y( :, k ) := vj --- * DO 310 I = M-N+J+1, M Y( I, K ) = ZERO 310 CONTINUE Y( M-N+J, K ) = ONE CALL SCOPY( M-N+J-1, A( 1, J ), 1, Y( 1, K ), 1 ) * * --- W( :, k ) := - tau( j ) * vj --- * DO 320 I = M-N+J+1, M W( I, K ) = ZERO 320 CONTINUE DO 330 I = 1, M-N+J W( I, K ) = TMP * Y( I, K ) 330 CONTINUE * * --- apply previous transformations --- * IF ( K .GT. 1 ) THEN CALL SGEMV( 'Transpose', M, K-1, > ONE, Y, LDY, W( 1, K ), 1, ZERO, WORK, 1 ) CALL SGEMV( 'NoTranspose', M, K-1, > ONE, W, LDW, WORK, 1, ONE, W( 1, K ), 1 ) ENDIF ENDIF * 400 CONTINUE * ENDIF * ENDIF * RETURN END * * ********************************************************************** * SUBROUTINE SGEWY( SIDE, M, N, K, A, LDA, > W, LDW, Y, LDY, > WORK ) * * ---------------------------------------------------------------------- * * Description: * * Apply a WY block transform to the matrix A (from the left or from * the right), i.e., update A as * * T T * A := ( I + W * Y ) * A , or * * T * A := A * ( I + W * Y ) , resp. * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * Parameters: * CHARACTER*1 SIDE INTEGER M, N, K, LDA, LDW, LDY REAL A( LDA, * ), W( LDW, * ), Y( LDY, * ), > WORK( * ) * * side (in) character*1 * Apply the transforms from the left or from the right ? * side = 'L' : From the left. * = 'R' : From the right. * * m (in) integer * The number of rows of the matrix A. * m >= 0. * * n (in) integer * The number of columns of the matrix A. * n >= 0. * * k (in) integer * The number of columns of the matrices W and Y. * k >= 0. * * a (in/out) real array, dimension ( lda, n ) * On entry, the matrix A. * T T * On exit, ( I + W * Y ) * A, if side = 'L', or * T * A * ( I + W * Y ), if side = 'R'. * * lda (in) integer * The leading dimension of the array a. * lda >= max( m, 1 ). * * w (in) real array, dimension ( ldw, k ) * The matrix W. * * ldw (in) integer * The leading dimension of the array w. * ldw >= max( m, 1 ), if side = 'L'. * >= max( n, 1 ), if side = 'R'. * (W has row dimension m or n, resp.) * * y (in) real array, dimension ( ldy, k ) * The matrix Y. * * ldy (in) integer * The leading dimension of the array y. * ldy >= max( m, 1 ), if side = 'L'. * >= max( n, 1 ), if side = 'R'. * (Y has row dimension m or n, resp.) * * work (workspace) real array, * dimension ( n*k ), if side = 'L'. * ( m*k ), if side = 'R'. * * ---------------------------------------------------------------------- * * Local variables: * REAL ZERO, ONE PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0 ) * * Routines called: * LOGICAL LSAME EXTERNAL LSAME * * lsame case-insensitive character matching (BLAS) * EXTERNAL SGEMM * * sgemm matrix-matrix product (BLAS) * * ---------------------------------------------------------------------- * IF ( ( K .GT. 0 ) .AND. ( M .GT. 0 ) .AND. ( N .GT. 0 ) ) THEN * IF ( LSAME( SIDE, 'L' ) ) THEN * * T * --- work = W * A --- * CALL SGEMM( 'Transpose', 'NoTranspose', K, N, M, > ONE, W, LDW, A, LDA, ZERO, WORK, K ) * * --- A = Y * work + A --- * CALL SGEMM( 'NoTranspose', 'NoTranspose', M, N, K, > ONE, Y, LDY, WORK, K, ONE, A, LDA ) * ELSE * * --- work = A * W --- * CALL SGEMM( 'NoTranspose', 'NoTranspose', M, K, N, > ONE, A, LDA, W, LDW, ZERO, WORK, M ) * * T * --- A = A + work * Y --- * CALL SGEMM( 'NoTranspose', 'Transpose', M, N, K, > ONE, WORK, M, Y, LDY, ONE, A, LDA ) * ENDIF ENDIF * RETURN END * * ********************************************************************** * SUBROUTINE SQRUPD( M, N, B, A, LDA, DRPTOL, > NEEDA1, M1, A1, LDA1, N2, A2, > NB, Y, W, LDWY, WORK ) * * ---------------------------------------------------------------------- * * Description: * * sqrupd forms the QR factorization * * A = Q * R * * of the m-by-n block A and overwrites A by R. * In addition, the matrices W and Y in the block representation * * T * Q = I + W * Y * * are built from the Householder transforms that were used in the * QR decomposition, a matrix A1 may be updated via * * A1 := A1 * Q , * * and another matrix A2 is updated via * * T * A2 := Q * A2 . * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * Parameters: * INTEGER M, N, B, LDA, M1, LDA1, N2, NB, LDWY REAL DRPTOL LOGICAL NEEDA1 REAL A( LDA, * ), A1( LDA1, * ), A2( LDA, * ), > Y( * ), W( * ), WORK( * ) * * m (in) integer * The number of rows in the block A, for which a QR * decomposition is sought. * m > 0. * * n (in) integer * The number of columns in that block. * n > 0. * * b (in) integer * The number of nonzero subdiagonals in the block (the * subdiagonals below the b-th are supposed to be zero and are * not accessed.) * b > 0. * * a (in/out) real array, dimension ( lda, n ) * On entry, A is a m-by-n matrix with lower bandwidth <= b. * Because of the banded storage scheme used in the calling * routine, the zero elements below the b-th subdiagonal may * not be explicitly stored. Therefore, they are not accessed * in this routine. * On exit, the subdiagonals 1, ..., b of A are zeroed out, and * the upper triangle of A is overwritten with the matrix R of * the factorization A = Q * R. * * lda (in) integer * The leading dimension of the array a. * lda >= m. * * drptol (in) real * Threshold for dropping the Householder transformations: if * the norm of the vector to be eliminated is already smaller * than drptol then the transformation is skipped. * drptol >= 0.0. * * needa1 (in) logical * Is A1 required or not ? * needa1 = .true. : Update A1. * = .false. : Do not update A1. * * m1 (in) integer * The number of rows of the matrix A1 (the number of columns * must be m). Accessed only if A1 is required. * m1 >= 0. * * a1 (in/out) real array, dimension ( lda1, m ) * On entry, the m1-by-m matrix A1. * On exit, A1 may be overwritten with A1 * Q. * * lda1 (in) integer * The leading dimension of the array a1. Accessed only if A1 * is required. * lda1 >= max( m1, 1 ). * * n2 (in) integer * The number of columns in the block A2. * 0 <= n2 <= lda. * * a2 (in/out) real array, dimension ( lda, n2 ) * On entry, the m-by-n2 matrix A2. * T * On exit, A2 is overwritten with Q * A2. * * nb (out) integer * The number of non-zero Householder vectors contributing to * Q. * 0 <= nb <= min( m-1, n ). * * y (out) real array, dimension ( ldwy, n ) T * The m-by-nb matrix Y in the representation Q = I + W * Y . * * w (out) real array, dimension ( ldwy, n ) T * The m-by-nb matrix W in the representation Q = I + W * Y . * * ldwy (out) integer * The leading dimension of the arrays w and y. * ldwy = m. * * work (workspace) real array, * dimension ( max( m1, m )*n + n ), if A1 is required. * ( m*n + n ) , otherwise. * * ---------------------------------------------------------------------- * * Local variables : * INTEGER ITAU, IWORK * * itau points to the portion of work that will hold the scaling * values tau for the blocked transforms (required size for * this buffer : n elements) * iwork points to the portion of work that will be used as workspace * for the routines sgbqr2 (n elements) and sgewy * ( max( m1, m ) * nb elements). * * Routines called: * EXTERNAL SGBQR2, SGBWYG, SGEWY * * sgbqr2 QR factorization of a banded matrix (SBR) * sgbwyg generate WY factors (SBR) * sgewy apply WY transform (SBR) * * ---------------------------------------------------------------------- * * --- set pointers to subdivide workspace --- * ITAU = 1 IWORK = ITAU + N * * --- factorize A = Q * R --- * CALL SGBQR2( M, N, B, A, LDA, WORK( ITAU ), DRPTOL, > WORK( IWORK ) ) * * --- build W and Y factors --- * LDWY = M CALL SGBWYG( M, N, B, A, LDA, WORK( ITAU ), > W, LDWY, Y, LDWY, NB ) * IF ( NB .GT. 0 ) THEN * * --- update A1 --- * IF ( NEEDA1 ) THEN CALL SGEWY( 'Right', M1, M, NB, A1, LDA1, > W, LDWY, Y, LDWY, WORK( IWORK ) ) ENDIF * * --- premultiply A2 --- * IF ( N2 .GT. 0 ) THEN CALL SGEWY( 'Left', M, N2, NB, A2, LDA, > W, LDWY, Y, LDWY, WORK( IWORK ) ) ENDIF ENDIF * RETURN END * * ********************************************************************** * SUBROUTINE SSYWY( UPLO, N, K, A, LDA, W, LDW, Y, LDY, WORK ) * * ---------------------------------------------------------------------- * * Description: * * Apply a two-sided WY block transform to the symmetric matrix A, * T T T * i.e., replace A with ( I + W * Y ) * A * ( I + W * Y ). * * Author: Bruno Lang * Aachen University of Technology * na.blang@na-net.ornl.gov * Date: May 17, 2000 * Version: SBR Toolbox, Rev. 1.4.1 * * Note: >>> This routine performs no sanity checks on its arguments. <<< * * Parameters: * CHARACTER*1 UPLO INTEGER N, K, LDA, LDW, LDY REAL A( LDA, * ), W( LDW, * ), Y( LDY, * ), > WORK( * ) * * uplo (in) character*1 * Is the upper or lower triangle of A stored ? * uplo = 'U' : Upper triangle. * = 'L' : Lower triangle. * * n (in) integer * The size of the block to transform. * n >= 0. * * k (in) integer * The number of nontrivial Householder transforms in the * block WY transform. * k >= 0. * * a (in/out) real array, dimension ( lda, n ) * On entry, the n-by-n symmetric matrix A. * T T T * On exit, A is overwritten with ( I+WY ) * A * ( I+WY ). * * lda (in) integer * The leading dimension of the array a. * lda >= max( n, 1 ). * * w (in) real array, dimension ( ldw, k ) * Contains the block reflector W. * * ldw (in) integer * The leading dimension of the array w. * ldw >= max( n, 1 ). * * y (in) real array, dimension ( ldy, k ) * Contains the block reflector Y. * * ldy (in) integer * The leading dimension of the array y. * ldy >= max( n, 1 ). * * work (workspace) real array, dimension ( (n+k)*k ) * * ---------------------------------------------------------------------- * * Local variables: * REAL ZERO, ONE PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0 ) * * Routines called: * EXTERNAL SGEMM, SSYMM, SSYR2K * * sgemm matrix-matrix product (BLAS) * ssymm symmetric matrix-matrix product (BLAS) * ssyr2k symmetric rank-2 update (BLAS) * * ---------------------------------------------------------------------- * IF ( ( N .GT. 0 ) .AND. ( K .GT. 0 ) ) THEN * * --- work( 1 .. n*k ) := X1 = A * W --- * CALL SSYMM( 'Left', UPLO, N, K, > ONE, A, LDA, W, LDW, ZERO, WORK, N ) * * T * --- work( n*k+1 .. n*k+k*k ) := X2 = 1/2 * X1 * W --- * CALL SGEMM( 'Transpose', 'NoTranspose', K, K, N, > 0.5E0, WORK, N, W, LDW, ZERO, WORK( N*K+1 ), K ) * * --- work( 1 .. n*k ) := X3 = X1 + Y * X2 --- * CALL SGEMM( 'NoTranspose', 'NoTranspose', N, K, K, > ONE, Y, LDY, WORK( N*K+1 ), K, ONE, WORK, N ) * * T T * --- A := A + X3 * Y + Y * X3 --- * CALL SSYR2K( UPLO, 'NoTranspose', N, K, > ONE, WORK, N, Y, LDY, ONE, A, LDA ) * ENDIF * RETURN END SHAR_EOF fi # end of overwriting check cd .. cd .. cd .. # End of shell archive exit 0