LAPACK 3.3.0

sget31.f

Go to the documentation of this file.
00001       SUBROUTINE SGET31( RMAX, LMAX, NINFO, KNT )
00002 *
00003 *  -- LAPACK test routine (version 3.1) --
00004 *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
00005 *     November 2006
00006 *
00007 *     .. Scalar Arguments ..
00008       INTEGER            KNT, LMAX
00009       REAL               RMAX
00010 *     ..
00011 *     .. Array Arguments ..
00012       INTEGER            NINFO( 2 )
00013 *     ..
00014 *
00015 *  Purpose
00016 *  =======
00017 *
00018 *  SGET31 tests SLALN2, a routine for solving
00019 *
00020 *     (ca A - w D)X = sB
00021 *
00022 *  where A is an NA by NA matrix (NA=1 or 2 only), w is a real (NW=1) or
00023 *  complex (NW=2) constant, ca is a real constant, D is an NA by NA real
00024 *  diagonal matrix, and B is an NA by NW matrix (when NW=2 the second
00025 *  column of B contains the imaginary part of the solution).  The code
00026 *  returns X and s, where s is a scale factor, less than or equal to 1,
00027 *  which is chosen to avoid overflow in X.
00028 *
00029 *  If any singular values of ca A-w D are less than another input
00030 *  parameter SMIN, they are perturbed up to SMIN.
00031 *
00032 *  The test condition is that the scaled residual
00033 *
00034 *      norm( (ca A-w D)*X - s*B ) /
00035 *            ( max( ulp*norm(ca A-w D), SMIN )*norm(X) )
00036 *
00037 *  should be on the order of 1.  Here, ulp is the machine precision.
00038 *  Also, it is verified that SCALE is less than or equal to 1, and that
00039 *  XNORM = infinity-norm(X).
00040 *
00041 *  Arguments
00042 *  ==========
00043 *
00044 *  RMAX    (output) REAL
00045 *          Value of the largest test ratio.
00046 *
00047 *  LMAX    (output) INTEGER
00048 *          Example number where largest test ratio achieved.
00049 *
00050 *  NINFO   (output) INTEGER array, dimension (3)
00051 *          NINFO(1) = number of examples with INFO less than 0
00052 *          NINFO(2) = number of examples with INFO greater than 0
00053 *
00054 *  KNT     (output) INTEGER
00055 *          Total number of examples tested.
00056 *
00057 *  =====================================================================
00058 *
00059 *     .. Parameters ..
00060       REAL               ZERO, HALF, ONE
00061       PARAMETER          ( ZERO = 0.0E0, HALF = 0.5E0, ONE = 1.0E0 )
00062       REAL               TWO, THREE, FOUR
00063       PARAMETER          ( TWO = 2.0E0, THREE = 3.0E0, FOUR = 4.0E0 )
00064       REAL               SEVEN, TEN
00065       PARAMETER          ( SEVEN = 7.0E0, TEN = 10.0E0 )
00066       REAL               TWNONE
00067       PARAMETER          ( TWNONE = 21.0E0 )
00068 *     ..
00069 *     .. Local Scalars ..
00070       INTEGER            IA, IB, ICA, ID1, ID2, INFO, ISMIN, ITRANS,
00071      $                   IWI, IWR, NA, NW
00072       REAL               BIGNUM, CA, D1, D2, DEN, EPS, RES, SCALE, SMIN,
00073      $                   SMLNUM, TMP, UNFL, WI, WR, XNORM
00074 *     ..
00075 *     .. Local Arrays ..
00076       LOGICAL            LTRANS( 0: 1 )
00077       REAL               A( 2, 2 ), B( 2, 2 ), VAB( 3 ), VCA( 5 ),
00078      $                   VDD( 4 ), VSMIN( 4 ), VWI( 4 ), VWR( 4 ),
00079      $                   X( 2, 2 )
00080 *     ..
00081 *     .. External Functions ..
00082       REAL               SLAMCH
00083       EXTERNAL           SLAMCH
00084 *     ..
00085 *     .. External Subroutines ..
00086       EXTERNAL           SLABAD, SLALN2
00087 *     ..
00088 *     .. Intrinsic Functions ..
00089       INTRINSIC          ABS, MAX, SQRT
00090 *     ..
00091 *     .. Data statements ..
00092       DATA               LTRANS / .FALSE., .TRUE. /
00093 *     ..
00094 *     .. Executable Statements ..
00095 *
00096 *     Get machine parameters
00097 *
00098       EPS = SLAMCH( 'P' )
00099       UNFL = SLAMCH( 'U' )
00100       SMLNUM = SLAMCH( 'S' ) / EPS
00101       BIGNUM = ONE / SMLNUM
00102       CALL SLABAD( SMLNUM, BIGNUM )
00103 *
00104 *     Set up test case parameters
00105 *
00106       VSMIN( 1 ) = SMLNUM
00107       VSMIN( 2 ) = EPS
00108       VSMIN( 3 ) = ONE / ( TEN*TEN )
00109       VSMIN( 4 ) = ONE / EPS
00110       VAB( 1 ) = SQRT( SMLNUM )
00111       VAB( 2 ) = ONE
00112       VAB( 3 ) = SQRT( BIGNUM )
00113       VWR( 1 ) = ZERO
00114       VWR( 2 ) = HALF
00115       VWR( 3 ) = TWO
00116       VWR( 4 ) = ONE
00117       VWI( 1 ) = SMLNUM
00118       VWI( 2 ) = EPS
00119       VWI( 3 ) = ONE
00120       VWI( 4 ) = TWO
00121       VDD( 1 ) = SQRT( SMLNUM )
00122       VDD( 2 ) = ONE
00123       VDD( 3 ) = TWO
00124       VDD( 4 ) = SQRT( BIGNUM )
00125       VCA( 1 ) = ZERO
00126       VCA( 2 ) = SQRT( SMLNUM )
00127       VCA( 3 ) = EPS
00128       VCA( 4 ) = HALF
00129       VCA( 5 ) = ONE
00130 *
00131       KNT = 0
00132       NINFO( 1 ) = 0
00133       NINFO( 2 ) = 0
00134       LMAX = 0
00135       RMAX = ZERO
00136 *
00137 *     Begin test loop
00138 *
00139       DO 190 ID1 = 1, 4
00140          D1 = VDD( ID1 )
00141          DO 180 ID2 = 1, 4
00142             D2 = VDD( ID2 )
00143             DO 170 ICA = 1, 5
00144                CA = VCA( ICA )
00145                DO 160 ITRANS = 0, 1
00146                   DO 150 ISMIN = 1, 4
00147                      SMIN = VSMIN( ISMIN )
00148 *
00149                      NA = 1
00150                      NW = 1
00151                      DO 30 IA = 1, 3
00152                         A( 1, 1 ) = VAB( IA )
00153                         DO 20 IB = 1, 3
00154                            B( 1, 1 ) = VAB( IB )
00155                            DO 10 IWR = 1, 4
00156                               IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND. CA.EQ.
00157      $                            ONE ) THEN
00158                                  WR = VWR( IWR )*A( 1, 1 )
00159                               ELSE
00160                                  WR = VWR( IWR )
00161                               END IF
00162                               WI = ZERO
00163                               CALL SLALN2( LTRANS( ITRANS ), NA, NW,
00164      $                                     SMIN, CA, A, 2, D1, D2, B, 2,
00165      $                                     WR, WI, X, 2, SCALE, XNORM,
00166      $                                     INFO )
00167                               IF( INFO.LT.0 )
00168      $                           NINFO( 1 ) = NINFO( 1 ) + 1
00169                               IF( INFO.GT.0 )
00170      $                           NINFO( 2 ) = NINFO( 2 ) + 1
00171                               RES = ABS( ( CA*A( 1, 1 )-WR*D1 )*
00172      $                              X( 1, 1 )-SCALE*B( 1, 1 ) )
00173                               IF( INFO.EQ.0 ) THEN
00174                                  DEN = MAX( EPS*( ABS( ( CA*A( 1,
00175      $                                 1 )-WR*D1 )*X( 1, 1 ) ) ),
00176      $                                 SMLNUM )
00177                               ELSE
00178                                  DEN = MAX( SMIN*ABS( X( 1, 1 ) ),
00179      $                                 SMLNUM )
00180                               END IF
00181                               RES = RES / DEN
00182                               IF( ABS( X( 1, 1 ) ).LT.UNFL .AND.
00183      $                            ABS( B( 1, 1 ) ).LE.SMLNUM*
00184      $                            ABS( CA*A( 1, 1 )-WR*D1 ) )RES = ZERO
00185                               IF( SCALE.GT.ONE )
00186      $                           RES = RES + ONE / EPS
00187                               RES = RES + ABS( XNORM-ABS( X( 1, 1 ) ) )
00188      $                               / MAX( SMLNUM, XNORM ) / EPS
00189                               IF( INFO.NE.0 .AND. INFO.NE.1 )
00190      $                           RES = RES + ONE / EPS
00191                               KNT = KNT + 1
00192                               IF( RES.GT.RMAX ) THEN
00193                                  LMAX = KNT
00194                                  RMAX = RES
00195                               END IF
00196    10                      CONTINUE
00197    20                   CONTINUE
00198    30                CONTINUE
00199 *
00200                      NA = 1
00201                      NW = 2
00202                      DO 70 IA = 1, 3
00203                         A( 1, 1 ) = VAB( IA )
00204                         DO 60 IB = 1, 3
00205                            B( 1, 1 ) = VAB( IB )
00206                            B( 1, 2 ) = -HALF*VAB( IB )
00207                            DO 50 IWR = 1, 4
00208                               IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND. CA.EQ.
00209      $                            ONE ) THEN
00210                                  WR = VWR( IWR )*A( 1, 1 )
00211                               ELSE
00212                                  WR = VWR( IWR )
00213                               END IF
00214                               DO 40 IWI = 1, 4
00215                                  IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND.
00216      $                               CA.EQ.ONE ) THEN
00217                                     WI = VWI( IWI )*A( 1, 1 )
00218                                  ELSE
00219                                     WI = VWI( IWI )
00220                                  END IF
00221                                  CALL SLALN2( LTRANS( ITRANS ), NA, NW,
00222      $                                        SMIN, CA, A, 2, D1, D2, B,
00223      $                                        2, WR, WI, X, 2, SCALE,
00224      $                                        XNORM, INFO )
00225                                  IF( INFO.LT.0 )
00226      $                              NINFO( 1 ) = NINFO( 1 ) + 1
00227                                  IF( INFO.GT.0 )
00228      $                              NINFO( 2 ) = NINFO( 2 ) + 1
00229                                  RES = ABS( ( CA*A( 1, 1 )-WR*D1 )*
00230      $                                 X( 1, 1 )+( WI*D1 )*X( 1, 2 )-
00231      $                                 SCALE*B( 1, 1 ) )
00232                                  RES = RES + ABS( ( -WI*D1 )*X( 1, 1 )+
00233      $                                 ( CA*A( 1, 1 )-WR*D1 )*X( 1, 2 )-
00234      $                                 SCALE*B( 1, 2 ) )
00235                                  IF( INFO.EQ.0 ) THEN
00236                                     DEN = MAX( EPS*( MAX( ABS( CA*A( 1,
00237      $                                    1 )-WR*D1 ), ABS( D1*WI ) )*
00238      $                                    ( ABS( X( 1, 1 ) )+ABS( X( 1,
00239      $                                    2 ) ) ) ), SMLNUM )
00240                                  ELSE
00241                                     DEN = MAX( SMIN*( ABS( X( 1,
00242      $                                    1 ) )+ABS( X( 1, 2 ) ) ),
00243      $                                    SMLNUM )
00244                                  END IF
00245                                  RES = RES / DEN
00246                                  IF( ABS( X( 1, 1 ) ).LT.UNFL .AND.
00247      $                               ABS( X( 1, 2 ) ).LT.UNFL .AND.
00248      $                               ABS( B( 1, 1 ) ).LE.SMLNUM*
00249      $                               ABS( CA*A( 1, 1 )-WR*D1 ) )
00250      $                               RES = ZERO
00251                                  IF( SCALE.GT.ONE )
00252      $                              RES = RES + ONE / EPS
00253                                  RES = RES + ABS( XNORM-
00254      $                                 ABS( X( 1, 1 ) )-
00255      $                                 ABS( X( 1, 2 ) ) ) /
00256      $                                 MAX( SMLNUM, XNORM ) / EPS
00257                                  IF( INFO.NE.0 .AND. INFO.NE.1 )
00258      $                              RES = RES + ONE / EPS
00259                                  KNT = KNT + 1
00260                                  IF( RES.GT.RMAX ) THEN
00261                                     LMAX = KNT
00262                                     RMAX = RES
00263                                  END IF
00264    40                         CONTINUE
00265    50                      CONTINUE
00266    60                   CONTINUE
00267    70                CONTINUE
00268 *
00269                      NA = 2
00270                      NW = 1
00271                      DO 100 IA = 1, 3
00272                         A( 1, 1 ) = VAB( IA )
00273                         A( 1, 2 ) = -THREE*VAB( IA )
00274                         A( 2, 1 ) = -SEVEN*VAB( IA )
00275                         A( 2, 2 ) = TWNONE*VAB( IA )
00276                         DO 90 IB = 1, 3
00277                            B( 1, 1 ) = VAB( IB )
00278                            B( 2, 1 ) = -TWO*VAB( IB )
00279                            DO 80 IWR = 1, 4
00280                               IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND. CA.EQ.
00281      $                            ONE ) THEN
00282                                  WR = VWR( IWR )*A( 1, 1 )
00283                               ELSE
00284                                  WR = VWR( IWR )
00285                               END IF
00286                               WI = ZERO
00287                               CALL SLALN2( LTRANS( ITRANS ), NA, NW,
00288      $                                     SMIN, CA, A, 2, D1, D2, B, 2,
00289      $                                     WR, WI, X, 2, SCALE, XNORM,
00290      $                                     INFO )
00291                               IF( INFO.LT.0 )
00292      $                           NINFO( 1 ) = NINFO( 1 ) + 1
00293                               IF( INFO.GT.0 )
00294      $                           NINFO( 2 ) = NINFO( 2 ) + 1
00295                               IF( ITRANS.EQ.1 ) THEN
00296                                  TMP = A( 1, 2 )
00297                                  A( 1, 2 ) = A( 2, 1 )
00298                                  A( 2, 1 ) = TMP
00299                               END IF
00300                               RES = ABS( ( CA*A( 1, 1 )-WR*D1 )*
00301      $                              X( 1, 1 )+( CA*A( 1, 2 ) )*
00302      $                              X( 2, 1 )-SCALE*B( 1, 1 ) )
00303                               RES = RES + ABS( ( CA*A( 2, 1 ) )*
00304      $                              X( 1, 1 )+( CA*A( 2, 2 )-WR*D2 )*
00305      $                              X( 2, 1 )-SCALE*B( 2, 1 ) )
00306                               IF( INFO.EQ.0 ) THEN
00307                                  DEN = MAX( EPS*( MAX( ABS( CA*A( 1,
00308      $                                 1 )-WR*D1 )+ABS( CA*A( 1, 2 ) ),
00309      $                                 ABS( CA*A( 2, 1 ) )+ABS( CA*A( 2,
00310      $                                 2 )-WR*D2 ) )*MAX( ABS( X( 1,
00311      $                                 1 ) ), ABS( X( 2, 1 ) ) ) ),
00312      $                                 SMLNUM )
00313                               ELSE
00314                                  DEN = MAX( EPS*( MAX( SMIN / EPS,
00315      $                                 MAX( ABS( CA*A( 1,
00316      $                                 1 )-WR*D1 )+ABS( CA*A( 1, 2 ) ),
00317      $                                 ABS( CA*A( 2, 1 ) )+ABS( CA*A( 2,
00318      $                                 2 )-WR*D2 ) ) )*MAX( ABS( X( 1,
00319      $                                 1 ) ), ABS( X( 2, 1 ) ) ) ),
00320      $                                 SMLNUM )
00321                               END IF
00322                               RES = RES / DEN
00323                               IF( ABS( X( 1, 1 ) ).LT.UNFL .AND.
00324      $                            ABS( X( 2, 1 ) ).LT.UNFL .AND.
00325      $                            ABS( B( 1, 1 ) )+ABS( B( 2, 1 ) ).LE.
00326      $                            SMLNUM*( ABS( CA*A( 1,
00327      $                            1 )-WR*D1 )+ABS( CA*A( 1,
00328      $                            2 ) )+ABS( CA*A( 2,
00329      $                            1 ) )+ABS( CA*A( 2, 2 )-WR*D2 ) ) )
00330      $                            RES = ZERO
00331                               IF( SCALE.GT.ONE )
00332      $                           RES = RES + ONE / EPS
00333                               RES = RES + ABS( XNORM-
00334      $                              MAX( ABS( X( 1, 1 ) ), ABS( X( 2,
00335      $                              1 ) ) ) ) / MAX( SMLNUM, XNORM ) /
00336      $                              EPS
00337                               IF( INFO.NE.0 .AND. INFO.NE.1 )
00338      $                           RES = RES + ONE / EPS
00339                               KNT = KNT + 1
00340                               IF( RES.GT.RMAX ) THEN
00341                                  LMAX = KNT
00342                                  RMAX = RES
00343                               END IF
00344    80                      CONTINUE
00345    90                   CONTINUE
00346   100                CONTINUE
00347 *
00348                      NA = 2
00349                      NW = 2
00350                      DO 140 IA = 1, 3
00351                         A( 1, 1 ) = VAB( IA )*TWO
00352                         A( 1, 2 ) = -THREE*VAB( IA )
00353                         A( 2, 1 ) = -SEVEN*VAB( IA )
00354                         A( 2, 2 ) = TWNONE*VAB( IA )
00355                         DO 130 IB = 1, 3
00356                            B( 1, 1 ) = VAB( IB )
00357                            B( 2, 1 ) = -TWO*VAB( IB )
00358                            B( 1, 2 ) = FOUR*VAB( IB )
00359                            B( 2, 2 ) = -SEVEN*VAB( IB )
00360                            DO 120 IWR = 1, 4
00361                               IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND. CA.EQ.
00362      $                            ONE ) THEN
00363                                  WR = VWR( IWR )*A( 1, 1 )
00364                               ELSE
00365                                  WR = VWR( IWR )
00366                               END IF
00367                               DO 110 IWI = 1, 4
00368                                  IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND.
00369      $                               CA.EQ.ONE ) THEN
00370                                     WI = VWI( IWI )*A( 1, 1 )
00371                                  ELSE
00372                                     WI = VWI( IWI )
00373                                  END IF
00374                                  CALL SLALN2( LTRANS( ITRANS ), NA, NW,
00375      $                                        SMIN, CA, A, 2, D1, D2, B,
00376      $                                        2, WR, WI, X, 2, SCALE,
00377      $                                        XNORM, INFO )
00378                                  IF( INFO.LT.0 )
00379      $                              NINFO( 1 ) = NINFO( 1 ) + 1
00380                                  IF( INFO.GT.0 )
00381      $                              NINFO( 2 ) = NINFO( 2 ) + 1
00382                                  IF( ITRANS.EQ.1 ) THEN
00383                                     TMP = A( 1, 2 )
00384                                     A( 1, 2 ) = A( 2, 1 )
00385                                     A( 2, 1 ) = TMP
00386                                  END IF
00387                                  RES = ABS( ( CA*A( 1, 1 )-WR*D1 )*
00388      $                                 X( 1, 1 )+( CA*A( 1, 2 ) )*
00389      $                                 X( 2, 1 )+( WI*D1 )*X( 1, 2 )-
00390      $                                 SCALE*B( 1, 1 ) )
00391                                  RES = RES + ABS( ( CA*A( 1,
00392      $                                 1 )-WR*D1 )*X( 1, 2 )+
00393      $                                 ( CA*A( 1, 2 ) )*X( 2, 2 )-
00394      $                                 ( WI*D1 )*X( 1, 1 )-SCALE*
00395      $                                 B( 1, 2 ) )
00396                                  RES = RES + ABS( ( CA*A( 2, 1 ) )*
00397      $                                 X( 1, 1 )+( CA*A( 2, 2 )-WR*D2 )*
00398      $                                 X( 2, 1 )+( WI*D2 )*X( 2, 2 )-
00399      $                                 SCALE*B( 2, 1 ) )
00400                                  RES = RES + ABS( ( CA*A( 2, 1 ) )*
00401      $                                 X( 1, 2 )+( CA*A( 2, 2 )-WR*D2 )*
00402      $                                 X( 2, 2 )-( WI*D2 )*X( 2, 1 )-
00403      $                                 SCALE*B( 2, 2 ) )
00404                                  IF( INFO.EQ.0 ) THEN
00405                                     DEN = MAX( EPS*( MAX( ABS( CA*A( 1,
00406      $                                    1 )-WR*D1 )+ABS( CA*A( 1,
00407      $                                    2 ) )+ABS( WI*D1 ),
00408      $                                    ABS( CA*A( 2,
00409      $                                    1 ) )+ABS( CA*A( 2,
00410      $                                    2 )-WR*D2 )+ABS( WI*D2 ) )*
00411      $                                    MAX( ABS( X( 1,
00412      $                                    1 ) )+ABS( X( 2, 1 ) ),
00413      $                                    ABS( X( 1, 2 ) )+ABS( X( 2,
00414      $                                    2 ) ) ) ), SMLNUM )
00415                                  ELSE
00416                                     DEN = MAX( EPS*( MAX( SMIN / EPS,
00417      $                                    MAX( ABS( CA*A( 1,
00418      $                                    1 )-WR*D1 )+ABS( CA*A( 1,
00419      $                                    2 ) )+ABS( WI*D1 ),
00420      $                                    ABS( CA*A( 2,
00421      $                                    1 ) )+ABS( CA*A( 2,
00422      $                                    2 )-WR*D2 )+ABS( WI*D2 ) ) )*
00423      $                                    MAX( ABS( X( 1,
00424      $                                    1 ) )+ABS( X( 2, 1 ) ),
00425      $                                    ABS( X( 1, 2 ) )+ABS( X( 2,
00426      $                                    2 ) ) ) ), SMLNUM )
00427                                  END IF
00428                                  RES = RES / DEN
00429                                  IF( ABS( X( 1, 1 ) ).LT.UNFL .AND.
00430      $                               ABS( X( 2, 1 ) ).LT.UNFL .AND.
00431      $                               ABS( X( 1, 2 ) ).LT.UNFL .AND.
00432      $                               ABS( X( 2, 2 ) ).LT.UNFL .AND.
00433      $                               ABS( B( 1, 1 ) )+
00434      $                               ABS( B( 2, 1 ) ).LE.SMLNUM*
00435      $                               ( ABS( CA*A( 1, 1 )-WR*D1 )+
00436      $                               ABS( CA*A( 1, 2 ) )+ABS( CA*A( 2,
00437      $                               1 ) )+ABS( CA*A( 2,
00438      $                               2 )-WR*D2 )+ABS( WI*D2 )+ABS( WI*
00439      $                               D1 ) ) )RES = ZERO
00440                                  IF( SCALE.GT.ONE )
00441      $                              RES = RES + ONE / EPS
00442                                  RES = RES + ABS( XNORM-
00443      $                                 MAX( ABS( X( 1, 1 ) )+ABS( X( 1,
00444      $                                 2 ) ), ABS( X( 2,
00445      $                                 1 ) )+ABS( X( 2, 2 ) ) ) ) /
00446      $                                 MAX( SMLNUM, XNORM ) / EPS
00447                                  IF( INFO.NE.0 .AND. INFO.NE.1 )
00448      $                              RES = RES + ONE / EPS
00449                                  KNT = KNT + 1
00450                                  IF( RES.GT.RMAX ) THEN
00451                                     LMAX = KNT
00452                                     RMAX = RES
00453                                  END IF
00454   110                         CONTINUE
00455   120                      CONTINUE
00456   130                   CONTINUE
00457   140                CONTINUE
00458   150             CONTINUE
00459   160          CONTINUE
00460   170       CONTINUE
00461   180    CONTINUE
00462   190 CONTINUE
00463 *
00464       RETURN
00465 *
00466 *     End of SGET31
00467 *
00468       END
 All Files Functions