1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
     100
     101
     102
     103
     104
     105
     106
     107
     108
     109
     110
     111
     112
     113
     114
     115
     116
     117
     118
     119
     120
     121
     122
     123
     124
     125
     126
     127
     128
     129
     130
     131
     132
     133
     134
     135
     136
     137
     138
     139
     140
     141
     142
     143
     144
     145
     146
     147
     148
     149
     150
     151
     152
     153
     154
     155
     156
     157
     158
     159
     160
     161
     162
     163
     164
     165
     166
     167
     168
     169
     170
     171
     172
     173
     174
     175
     176
     177
     178
     179
     180
     181
     182
     183
     184
     185
     186
     187
     188
     189
     190
     191
     192
     193
     194
     195
     196
     197
     198
     199
     200
     201
     202
     203
     204
     205
     206
     207
     208
     209
     210
     211
     212
     213
     214
     215
     216
     217
     218
     219
     220
     221
     222
     223
     224
     225
     226
     227
     228
     229
     230
     231
     232
     233
     234
     235
     236
     237
     238
     239
     240
     241
     242
     243
     244
     245
     246
     247
     248
     249
     250
     251
     252
     253
     254
     255
     256
     257
     258
     259
     260
     261
     262
     263
     264
     265
     266
     267
     268
     269
     270
     271
     272
     273
     274
     275
     276
     277
     278
     279
     280
     281
     282
     283
     284
     285
     286
     287
     288
     289
     290
     291
     292
     293
     294
     295
     296
     297
     298
      SUBROUTINE DDRVRF3NOUTNNNVALTHRESHALDAARFB1B2,
     +                    D_WORK_DLANGED_WORK_DGEQRFTAU )
*
*  -- LAPACK test routine (version 3.2.0) --
*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
*     November 2008
*
*     .. Scalar Arguments ..
      INTEGER            LDANNNOUT
      DOUBLE PRECISION   THRESH
*     ..
*     .. Array Arguments ..
      INTEGER            NVALNN )
      DOUBLE PRECISION   ALDA* ), ARF* ), B1LDA* ),
     +                   B2LDA* ), D_WORK_DGEQRF* ),
     +                   D_WORK_DLANGE* ), TAU* )
*     ..
*
*  Purpose
*  =======
*
*  DDRVRF3 tests the LAPACK RFP routines:
*      DTFSM
*
*  Arguments
*  =========
*
*  NOUT          (input) INTEGER
*                The unit number for output.
*
*  NN            (input) INTEGER
*                The number of values of N contained in the vector NVAL.
*
*  NVAL          (input) INTEGER array, dimension (NN)
*                The values of the matrix dimension N.
*
*  THRESH        (input) DOUBLE PRECISION
*                The threshold value for the test ratios.  A result is
*                included in the output file if RESULT >= THRESH.  To have
*                every test ratio printed, use THRESH = 0.
*
*  A             (workspace) DOUBLE PRECISION array, dimension (LDA,NMAX)
*
*  LDA           (input) INTEGER
*                The leading dimension of the array A.  LDA >= max(1,NMAX).
*
*  ARF           (workspace) DOUBLE PRECISION array, dimension ((NMAX*(NMAX+1))/2).
*
*  B1            (workspace) DOUBLE PRECISION array, dimension (LDA,NMAX)
*
*  B2            (workspace) DOUBLE PRECISION array, dimension (LDA,NMAX)
*
*  D_WORK_DLANGE (workspace) DOUBLE PRECISION array, dimension (NMAX)
*
*  D_WORK_DGEQRF (workspace) DOUBLE PRECISION array, dimension (NMAX)
*
*  TAU           (workspace) DOUBLE PRECISION array, dimension (NMAX)
*
*  =====================================================================
*     ..
*     .. Parameters ..
      DOUBLE PRECISION   ZEROONE
      PARAMETER          ( ZERO = ( 0.0D+00.0D+0 ) ,
     +                     ONE  = ( 1.0D+00.0D+0 ) )
      INTEGER            NTESTS
      PARAMETER          ( NTESTS = 1 )
*     ..
*     .. Local Scalars ..
      CHARACTER          UPLOCFORMDIAGTRANSSIDE
      INTEGER            IIFORMIIMIININFOIUPLOJMNNA,
     +                   NFAILNRUNISIDEIDIAGIALPHAITRANS
      DOUBLE PRECISION   EPSALPHA
*     ..
*     .. Local Arrays ..
      CHARACTER          UPLOS2 ), FORMS2 ), TRANSS2 ),
     +                   DIAGS2 ), SIDES2 )
      INTEGER            ISEED4 ), ISEEDY4 )
      DOUBLE PRECISION   RESULTNTESTS )
*     ..
*     .. External Functions ..
      DOUBLE PRECISION   DLAMCHDLANGEDLARND
      EXTERNAL           DLAMCHDLANGEDLARND
*     ..
*     .. External Subroutines ..
      EXTERNAL           DTRTTFDGEQRFDGEQLFDTFSMDTRSM
*     ..
*     .. Intrinsic Functions ..
      INTRINSIC          MAXSQRT
*     ..
*     .. Scalars in Common ..
      CHARACTER*32       SRNAMT
*     ..
*     .. Common blocks ..
      COMMON             / SRNAMC / SRNAMT
*     ..
*     .. Data statements ..
      DATA               ISEEDY / 1988198919901991 /
      DATA               UPLOS  / 'U''L' /
      DATA               FORMS  / 'N''T' /
      DATA               SIDES  / 'L''R' /
      DATA               TRANSS / 'N''T' /
      DATA               DIAGS  / 'N''U' /
*     ..
*     .. Executable Statements ..
*
*     Initialize constants and the random number seed.
*
      NRUN = 0
      NFAIL = 0
      INFO = 0
      DO 10 I = 14
         ISEEDI ) = ISEEDYI )
   10 CONTINUE
      EPS = DLAMCH'Precision' )
*
      DO 170 IIM = 1NN
*
         M = NVALIIM )
*
         DO 160 IIN = 1NN
*
            N = NVALIIN )
*
            DO 150 IFORM = 12
*
               CFORM = FORMSIFORM )
*
               DO 140 IUPLO = 12
*
                  UPLO = UPLOSIUPLO )
*
                  DO 130 ISIDE = 12
*
                     SIDE = SIDESISIDE )
*
                     DO 120 ITRANS = 12
*
                        TRANS = TRANSSITRANS )
*
                        DO 110 IDIAG = 12
*
                           DIAG = DIAGSIDIAG )
*
                           DO 100 IALPHA = 13
*
                              IF ( IALPHA.EQ. 1THEN
                                 ALPHA = ZERO
                              ELSE IF ( IALPHA.EQ. 1THEN
                                 ALPHA = ONE
                              ELSE
                                 ALPHA = DLARND2ISEED )
                              END IF
*
*                             All the parameters are set:
*                                CFORM, SIDE, UPLO, TRANS, DIAG, M, N,
*                                and ALPHA
*                             READY TO TEST!
*
                              NRUN = NRUN + 1
*
                              IF ( ISIDE.EQ.1 ) THEN
*
*                                The case ISIDE.EQ.1 is when SIDE.EQ.'L'
*                                -> A is M-by-M ( B is M-by-N )
*
                                 NA = M
*
                              ELSE
*
*                                The case ISIDE.EQ.2 is when SIDE.EQ.'R'
*                                -> A is N-by-N ( B is M-by-N )
*
                                 NA = N
*
                              END IF
*
*                             Generate A our NA--by--NA triangular
*                             matrix. 
*                             Our test is based on forward error so we
*                             do want A to be well conditionned! To get
*                             a well-conditionned triangular matrix, we
*                             take the R factor of the QR/LQ factorization
*                             of a random matrix. 
*
                              DO J = 1NA
                                 DO I = 1NA
                                    AIJ= DLARND2ISEED )
                                 END DO
                              END DO
*
                              IF ( IUPLO.EQ.1 ) THEN
*
*                                The case IUPLO.EQ.1 is when SIDE.EQ.'U'
*                                -> QR factorization.
*
                                 SRNAMT = 'DGEQRF'
                                 CALL DGEQRFNANAALDATAU,
     +                                        D_WORK_DGEQRFLDA,
     +                                        INFO )
                              ELSE
*
*                                The case IUPLO.EQ.2 is when SIDE.EQ.'L'
*                                -> QL factorization.
*
                                 SRNAMT = 'DGELQF'
                                 CALL DGELQF( NANAALDATAU,
     +                                        D_WORK_DGEQRFLDA,
     +                                        INFO )
                              END IF
*
*                             Store a copy of A in RFP format (in ARF).
*
                              SRNAMT = 'DTRTTF'
                              CALL DTRTTFCFORMUPLONAALDAARF,
     +                                     INFO )
*
*                             Generate B1 our M--by--N right-hand side
*                             and store a copy in B2.
*
                              DO J = 1N
                                 DO I = 1M
                                    B1IJ= DLARND2ISEED )
                                    B2IJ= B1IJ)
                                 END DO
                              END DO
*
*                             Solve op( A ) X = B or X op( A ) = B
*                             with DTRSM
*
                              SRNAMT = 'DTRSM'
                              CALL DTRSMSIDEUPLOTRANSDIAGMN,
     +                               ALPHAALDAB1LDA )
*
*                             Solve op( A ) X = B or X op( A ) = B
*                             with DTFSM
*
                              SRNAMT = 'DTFSM'
                              CALL DTFSMCFORMSIDEUPLOTRANS,
     +                                    DIAGMNALPHAARFB2,
     +                                    LDA )
*
*                             Check that the result agrees.
*
                              DO J = 1N
                                 DO I = 1M
                                    B1IJ= B2IJ ) - B1IJ )
                                 END DO
                              END DO
*
                              RESULT(1= DLANGE'I'MNB1LDA,
     +                                            D_WORK_DLANGE )
*
                              RESULT(1= RESULT(1/ SQRTEPS )
     +                                    / MAX ( MAXMN), 1 )
*
                              IFRESULT(1).GE.THRESH ) THEN
                                 IFNFAIL.EQ.0 ) THEN
                                    WRITENOUT* )
                                    WRITENOUT, FMT = 9999 )
                                 END IF
                                 WRITENOUT, FMT = 9997 ) 'DTFSM'
     +                              CFORM, SIDE, UPLO, TRANS, DIAG, M,
     +                              N, RESULT(1)
                                 NFAIL = NFAIL + 1
                              END IF
*
  100                      CONTINUE
  110                   CONTINUE
  120                CONTINUE
  130             CONTINUE
  140          CONTINUE
  150       CONTINUE
  160    CONTINUE
  170 CONTINUE
*
*     Print a summary of the results.
*
      IF ( NFAIL.EQ.0 ) THEN
         WRITENOUT, FMT = 9996 ) 'DTFSM', NRUN
      ELSE
         WRITENOUT, FMT = 9995 ) 'DTFSM', NFAIL, NRUN
      END IF
*
 9999 FORMAT( 1X, ' *** Error(s) or Failure(s) while testing DTFSM 
     +         ***')
 9997 FORMAT( 1X, '     Failure in ',A5,', CFORM=''',A1,''',',
     + ' SIDE=''',A1,''',',' UPLO=''',A1,''',',' TRANS=''',A1,''',',
     + ' DIAG=''',A1,''',',' M=',I3,', N =', I3,', test=',G12.5)
 9996 FORMAT( 1X, 'All tests for ',A5,' auxiliary routine passed the ',
     +        'threshold (',I5,' tests run)')
 9995 FORMAT( 1X, A6, ' auxiliary routine:',I5,' out of ',I5,
     +        ' tests failed to pass the threshold')
*
      RETURN
*
*     End of DDRVRF3
*
      END