LAPACK 3.3.0
|
00001 SUBROUTINE CDRVRFP( NOUT, NN, NVAL, NNS, NSVAL, NNT, NTVAL, 00002 + THRESH, A, ASAV, AFAC, AINV, B, 00003 + BSAV, XACT, X, ARF, ARFINV, 00004 + C_WORK_CLATMS, C_WORK_CPOT02, 00005 + C_WORK_CPOT03, S_WORK_CLATMS, S_WORK_CLANHE, 00006 + S_WORK_CPOT01, S_WORK_CPOT02, S_WORK_CPOT03 ) 00007 * 00008 * -- LAPACK test routine (version 3.2.0) -- 00009 * Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. 00010 * November 2008 00011 * 00012 * .. Scalar Arguments .. 00013 INTEGER NN, NNS, NNT, NOUT 00014 REAL THRESH 00015 * .. 00016 * .. Array Arguments .. 00017 INTEGER NVAL( NN ), NSVAL( NNS ), NTVAL( NNT ) 00018 COMPLEX A( * ) 00019 COMPLEX AINV( * ) 00020 COMPLEX ASAV( * ) 00021 COMPLEX B( * ) 00022 COMPLEX BSAV( * ) 00023 COMPLEX AFAC( * ) 00024 COMPLEX ARF( * ) 00025 COMPLEX ARFINV( * ) 00026 COMPLEX XACT( * ) 00027 COMPLEX X( * ) 00028 COMPLEX C_WORK_CLATMS( * ) 00029 COMPLEX C_WORK_CPOT02( * ) 00030 COMPLEX C_WORK_CPOT03( * ) 00031 REAL S_WORK_CLATMS( * ) 00032 REAL S_WORK_CLANHE( * ) 00033 REAL S_WORK_CPOT01( * ) 00034 REAL S_WORK_CPOT02( * ) 00035 REAL S_WORK_CPOT03( * ) 00036 * .. 00037 * 00038 * Purpose 00039 * ======= 00040 * 00041 * CDRVRFP tests the LAPACK RFP routines: 00042 * CPFTRF, CPFTRS, and CPFTRI. 00043 * 00044 * This testing routine follow the same tests as CDRVPO (test for the full 00045 * format Symmetric Positive Definite solver). 00046 * 00047 * The tests are performed in Full Format, convertion back and forth from 00048 * full format to RFP format are performed using the routines CTRTTF and 00049 * CTFTTR. 00050 * 00051 * First, a specific matrix A of size N is created. There is nine types of 00052 * different matrixes possible. 00053 * 1. Diagonal 6. Random, CNDNUM = sqrt(0.1/EPS) 00054 * 2. Random, CNDNUM = 2 7. Random, CNDNUM = 0.1/EPS 00055 * *3. First row and column zero 8. Scaled near underflow 00056 * *4. Last row and column zero 9. Scaled near overflow 00057 * *5. Middle row and column zero 00058 * (* - tests error exits from CPFTRF, no test ratios are computed) 00059 * A solution XACT of size N-by-NRHS is created and the associated right 00060 * hand side B as well. Then CPFTRF is called to compute L (or U), the 00061 * Cholesky factor of A. Then L (or U) is used to solve the linear system 00062 * of equations AX = B. This gives X. Then L (or U) is used to compute the 00063 * inverse of A, AINV. The following four tests are then performed: 00064 * (1) norm( L*L' - A ) / ( N * norm(A) * EPS ) or 00065 * norm( U'*U - A ) / ( N * norm(A) * EPS ), 00066 * (2) norm(B - A*X) / ( norm(A) * norm(X) * EPS ), 00067 * (3) norm( I - A*AINV ) / ( N * norm(A) * norm(AINV) * EPS ), 00068 * (4) ( norm(X-XACT) * RCOND ) / ( norm(XACT) * EPS ), 00069 * where EPS is the machine precision, RCOND the condition number of A, and 00070 * norm( . ) the 1-norm for (1,2,3) and the inf-norm for (4). 00071 * Errors occur when INFO parameter is not as expected. Failures occur when 00072 * a test ratios is greater than THRES. 00073 * 00074 * Arguments 00075 * ========= 00076 * 00077 * NOUT (input) INTEGER 00078 * The unit number for output. 00079 * 00080 * NN (input) INTEGER 00081 * The number of values of N contained in the vector NVAL. 00082 * 00083 * NVAL (input) INTEGER array, dimension (NN) 00084 * The values of the matrix dimension N. 00085 * 00086 * NNS (input) INTEGER 00087 * The number of values of NRHS contained in the vector NSVAL. 00088 * 00089 * NSVAL (input) INTEGER array, dimension (NNS) 00090 * The values of the number of right-hand sides NRHS. 00091 * 00092 * NNT (input) INTEGER 00093 * The number of values of MATRIX TYPE contained in the vector NTVAL. 00094 * 00095 * NTVAL (input) INTEGER array, dimension (NNT) 00096 * The values of matrix type (between 0 and 9 for PO/PP/PF matrices). 00097 * 00098 * THRESH (input) REAL 00099 * The threshold value for the test ratios. A result is 00100 * included in the output file if RESULT >= THRESH. To have 00101 * every test ratio printed, use THRESH = 0. 00102 * 00103 * A (workspace) COMPLEX array, dimension (NMAX*NMAX) 00104 * 00105 * ASAV (workspace) COMPLEX array, dimension (NMAX*NMAX) 00106 * 00107 * AFAC (workspace) COMPLEX array, dimension (NMAX*NMAX) 00108 * 00109 * AINV (workspace) COMPLEX array, dimension (NMAX*NMAX) 00110 * 00111 * B (workspace) COMPLEX array, dimension (NMAX*MAXRHS) 00112 * 00113 * BSAV (workspace) COMPLEX array, dimension (NMAX*MAXRHS) 00114 * 00115 * XACT (workspace) COMPLEX array, dimension (NMAX*MAXRHS) 00116 * 00117 * X (workspace) COMPLEX array, dimension (NMAX*MAXRHS) 00118 * 00119 * ARF (workspace) COMPLEX array, dimension ((NMAX*(NMAX+1))/2) 00120 * 00121 * ARFINV (workspace) COMPLEX array, dimension ((NMAX*(NMAX+1))/2) 00122 * 00123 * C_WORK_CLATMS (workspace) COMPLEX array, dimension ( 3*NMAX ) 00124 * 00125 * C_WORK_CPOT02 (workspace) COMPLEX array, dimension ( NMAX*MAXRHS ) 00126 * 00127 * C_WORK_CPOT03 (workspace) COMPLEX array, dimension ( NMAX*NMAX ) 00128 * 00129 * S_WORK_CLATMS (workspace) REAL array, dimension ( NMAX ) 00130 * 00131 * S_WORK_CLANHE (workspace) REAL array, dimension ( NMAX ) 00132 * 00133 * S_WORK_CPOT01 (workspace) REAL array, dimension ( NMAX ) 00134 * 00135 * S_WORK_CPOT02 (workspace) REAL array, dimension ( NMAX ) 00136 * 00137 * S_WORK_CPOT03 (workspace) REAL array, dimension ( NMAX ) 00138 * 00139 * ===================================================================== 00140 * 00141 * .. Parameters .. 00142 REAL ONE, ZERO 00143 PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) 00144 INTEGER NTESTS 00145 PARAMETER ( NTESTS = 4 ) 00146 * .. 00147 * .. Local Scalars .. 00148 LOGICAL ZEROT 00149 INTEGER I, INFO, IUPLO, LDA, LDB, IMAT, NERRS, NFAIL, 00150 + NRHS, NRUN, IZERO, IOFF, K, NT, N, IFORM, IIN, 00151 + IIT, IIS 00152 CHARACTER DIST, CTYPE, UPLO, CFORM 00153 INTEGER KL, KU, MODE 00154 REAL ANORM, AINVNM, CNDNUM, RCONDC 00155 * .. 00156 * .. Local Arrays .. 00157 CHARACTER UPLOS( 2 ), FORMS( 2 ) 00158 INTEGER ISEED( 4 ), ISEEDY( 4 ) 00159 REAL RESULT( NTESTS ) 00160 * .. 00161 * .. External Functions .. 00162 REAL CLANHE 00163 EXTERNAL CLANHE 00164 * .. 00165 * .. External Subroutines .. 00166 EXTERNAL ALADHD, ALAERH, ALASVM, CGET04, CTFTTR, CLACPY, 00167 + CLAIPD, CLARHS, CLATB4, CLATMS, CPFTRI, CPFTRF, 00168 + CPFTRS, CPOT01, CPOT02, CPOT03, CPOTRI, CPOTRF, 00169 + CTRTTF 00170 * .. 00171 * .. Scalars in Common .. 00172 CHARACTER*32 SRNAMT 00173 * .. 00174 * .. Common blocks .. 00175 COMMON / SRNAMC / SRNAMT 00176 * .. 00177 * .. Data statements .. 00178 DATA ISEEDY / 1988, 1989, 1990, 1991 / 00179 DATA UPLOS / 'U', 'L' / 00180 DATA FORMS / 'N', 'C' / 00181 * .. 00182 * .. Executable Statements .. 00183 * 00184 * Initialize constants and the random number seed. 00185 * 00186 NRUN = 0 00187 NFAIL = 0 00188 NERRS = 0 00189 DO 10 I = 1, 4 00190 ISEED( I ) = ISEEDY( I ) 00191 10 CONTINUE 00192 * 00193 DO 130 IIN = 1, NN 00194 * 00195 N = NVAL( IIN ) 00196 LDA = MAX( N, 1 ) 00197 LDB = MAX( N, 1 ) 00198 * 00199 DO 980 IIS = 1, NNS 00200 * 00201 NRHS = NSVAL( IIS ) 00202 * 00203 DO 120 IIT = 1, NNT 00204 * 00205 IMAT = NTVAL( IIT ) 00206 * 00207 * If N.EQ.0, only consider the first type 00208 * 00209 IF( N.EQ.0 .AND. IIT.GT.1 ) GO TO 120 00210 * 00211 * Skip types 3, 4, or 5 if the matrix size is too small. 00212 * 00213 IF( IMAT.EQ.4 .AND. N.LE.1 ) GO TO 120 00214 IF( IMAT.EQ.5 .AND. N.LE.2 ) GO TO 120 00215 * 00216 * Do first for UPLO = 'U', then for UPLO = 'L' 00217 * 00218 DO 110 IUPLO = 1, 2 00219 UPLO = UPLOS( IUPLO ) 00220 * 00221 * Do first for CFORM = 'N', then for CFORM = 'C' 00222 * 00223 DO 100 IFORM = 1, 2 00224 CFORM = FORMS( IFORM ) 00225 * 00226 * Set up parameters with CLATB4 and generate a test 00227 * matrix with CLATMS. 00228 * 00229 CALL CLATB4( 'CPO', IMAT, N, N, CTYPE, KL, KU, 00230 + ANORM, MODE, CNDNUM, DIST ) 00231 * 00232 SRNAMT = 'CLATMS' 00233 CALL CLATMS( N, N, DIST, ISEED, CTYPE, 00234 + S_WORK_CLATMS, 00235 + MODE, CNDNUM, ANORM, KL, KU, UPLO, A, 00236 + LDA, C_WORK_CLATMS, INFO ) 00237 * 00238 * Check error code from CLATMS. 00239 * 00240 IF( INFO.NE.0 ) THEN 00241 CALL ALAERH( 'CPF', 'CLATMS', INFO, 0, UPLO, N, 00242 + N, -1, -1, -1, IIT, NFAIL, NERRS, 00243 + NOUT ) 00244 GO TO 100 00245 END IF 00246 * 00247 * For types 3-5, zero one row and column of the matrix to 00248 * test that INFO is returned correctly. 00249 * 00250 ZEROT = IMAT.GE.3 .AND. IMAT.LE.5 00251 IF( ZEROT ) THEN 00252 IF( IIT.EQ.3 ) THEN 00253 IZERO = 1 00254 ELSE IF( IIT.EQ.4 ) THEN 00255 IZERO = N 00256 ELSE 00257 IZERO = N / 2 + 1 00258 END IF 00259 IOFF = ( IZERO-1 )*LDA 00260 * 00261 * Set row and column IZERO of A to 0. 00262 * 00263 IF( IUPLO.EQ.1 ) THEN 00264 DO 20 I = 1, IZERO - 1 00265 A( IOFF+I ) = ZERO 00266 20 CONTINUE 00267 IOFF = IOFF + IZERO 00268 DO 30 I = IZERO, N 00269 A( IOFF ) = ZERO 00270 IOFF = IOFF + LDA 00271 30 CONTINUE 00272 ELSE 00273 IOFF = IZERO 00274 DO 40 I = 1, IZERO - 1 00275 A( IOFF ) = ZERO 00276 IOFF = IOFF + LDA 00277 40 CONTINUE 00278 IOFF = IOFF - IZERO 00279 DO 50 I = IZERO, N 00280 A( IOFF+I ) = ZERO 00281 50 CONTINUE 00282 END IF 00283 ELSE 00284 IZERO = 0 00285 END IF 00286 * 00287 * Set the imaginary part of the diagonals. 00288 * 00289 CALL CLAIPD( N, A, LDA+1, 0 ) 00290 * 00291 * Save a copy of the matrix A in ASAV. 00292 * 00293 CALL CLACPY( UPLO, N, N, A, LDA, ASAV, LDA ) 00294 * 00295 * Compute the condition number of A (RCONDC). 00296 * 00297 IF( ZEROT ) THEN 00298 RCONDC = ZERO 00299 ELSE 00300 * 00301 * Compute the 1-norm of A. 00302 * 00303 ANORM = CLANHE( '1', UPLO, N, A, LDA, 00304 + S_WORK_CLANHE ) 00305 * 00306 * Factor the matrix A. 00307 * 00308 CALL CPOTRF( UPLO, N, A, LDA, INFO ) 00309 * 00310 * Form the inverse of A. 00311 * 00312 CALL CPOTRI( UPLO, N, A, LDA, INFO ) 00313 * 00314 * Compute the 1-norm condition number of A. 00315 * 00316 AINVNM = CLANHE( '1', UPLO, N, A, LDA, 00317 + S_WORK_CLANHE ) 00318 RCONDC = ( ONE / ANORM ) / AINVNM 00319 * 00320 * Restore the matrix A. 00321 * 00322 CALL CLACPY( UPLO, N, N, ASAV, LDA, A, LDA ) 00323 * 00324 END IF 00325 * 00326 * Form an exact solution and set the right hand side. 00327 * 00328 SRNAMT = 'CLARHS' 00329 CALL CLARHS( 'CPO', 'N', UPLO, ' ', N, N, KL, KU, 00330 + NRHS, A, LDA, XACT, LDA, B, LDA, 00331 + ISEED, INFO ) 00332 CALL CLACPY( 'Full', N, NRHS, B, LDA, BSAV, LDA ) 00333 * 00334 * Compute the L*L' or U'*U factorization of the 00335 * matrix and solve the system. 00336 * 00337 CALL CLACPY( UPLO, N, N, A, LDA, AFAC, LDA ) 00338 CALL CLACPY( 'Full', N, NRHS, B, LDB, X, LDB ) 00339 * 00340 SRNAMT = 'CTRTTF' 00341 CALL CTRTTF( CFORM, UPLO, N, AFAC, LDA, ARF, INFO ) 00342 SRNAMT = 'CPFTRF' 00343 CALL CPFTRF( CFORM, UPLO, N, ARF, INFO ) 00344 * 00345 * Check error code from CPFTRF. 00346 * 00347 IF( INFO.NE.IZERO ) THEN 00348 * 00349 * LANGOU: there is a small hick here: IZERO should 00350 * always be INFO however if INFO is ZERO, ALAERH does not 00351 * complain. 00352 * 00353 CALL ALAERH( 'CPF', 'CPFSV ', INFO, IZERO, 00354 + UPLO, N, N, -1, -1, NRHS, IIT, 00355 + NFAIL, NERRS, NOUT ) 00356 GO TO 100 00357 END IF 00358 * 00359 * Skip the tests if INFO is not 0. 00360 * 00361 IF( INFO.NE.0 ) THEN 00362 GO TO 100 00363 END IF 00364 * 00365 SRNAMT = 'CPFTRS' 00366 CALL CPFTRS( CFORM, UPLO, N, NRHS, ARF, X, LDB, 00367 + INFO ) 00368 * 00369 SRNAMT = 'CTFTTR' 00370 CALL CTFTTR( CFORM, UPLO, N, ARF, AFAC, LDA, INFO ) 00371 * 00372 * Reconstruct matrix from factors and compute 00373 * residual. 00374 * 00375 CALL CLACPY( UPLO, N, N, AFAC, LDA, ASAV, LDA ) 00376 CALL CPOT01( UPLO, N, A, LDA, AFAC, LDA, 00377 + S_WORK_CPOT01, RESULT( 1 ) ) 00378 CALL CLACPY( UPLO, N, N, ASAV, LDA, AFAC, LDA ) 00379 * 00380 * Form the inverse and compute the residual. 00381 * 00382 IF(MOD(N,2).EQ.0)THEN 00383 CALL CLACPY( 'A', N+1, N/2, ARF, N+1, ARFINV, 00384 + N+1 ) 00385 ELSE 00386 CALL CLACPY( 'A', N, (N+1)/2, ARF, N, ARFINV, 00387 + N ) 00388 END IF 00389 * 00390 SRNAMT = 'CPFTRI' 00391 CALL CPFTRI( CFORM, UPLO, N, ARFINV , INFO ) 00392 * 00393 SRNAMT = 'CTFTTR' 00394 CALL CTFTTR( CFORM, UPLO, N, ARFINV, AINV, LDA, 00395 + INFO ) 00396 * 00397 * Check error code from CPFTRI. 00398 * 00399 IF( INFO.NE.0 ) 00400 + CALL ALAERH( 'CPO', 'CPFTRI', INFO, 0, UPLO, N, 00401 + N, -1, -1, -1, IMAT, NFAIL, NERRS, 00402 + NOUT ) 00403 * 00404 CALL CPOT03( UPLO, N, A, LDA, AINV, LDA, 00405 + C_WORK_CPOT03, LDA, S_WORK_CPOT03, 00406 + RCONDC, RESULT( 2 ) ) 00407 * 00408 * Compute residual of the computed solution. 00409 * 00410 CALL CLACPY( 'Full', N, NRHS, B, LDA, 00411 + C_WORK_CPOT02, LDA ) 00412 CALL CPOT02( UPLO, N, NRHS, A, LDA, X, LDA, 00413 + C_WORK_CPOT02, LDA, S_WORK_CPOT02, 00414 + RESULT( 3 ) ) 00415 * 00416 * Check solution from generated exact solution. 00417 * 00418 CALL CGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC, 00419 + RESULT( 4 ) ) 00420 NT = 4 00421 * 00422 * Print information about the tests that did not 00423 * pass the threshold. 00424 * 00425 DO 60 K = 1, NT 00426 IF( RESULT( K ).GE.THRESH ) THEN 00427 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) 00428 + CALL ALADHD( NOUT, 'CPF' ) 00429 WRITE( NOUT, FMT = 9999 )'CPFSV ', UPLO, 00430 + N, IIT, K, RESULT( K ) 00431 NFAIL = NFAIL + 1 00432 END IF 00433 60 CONTINUE 00434 NRUN = NRUN + NT 00435 100 CONTINUE 00436 110 CONTINUE 00437 120 CONTINUE 00438 980 CONTINUE 00439 130 CONTINUE 00440 * 00441 * Print a summary of the results. 00442 * 00443 CALL ALASVM( 'CPF', NOUT, NFAIL, NRUN, NERRS ) 00444 * 00445 9999 FORMAT( 1X, A6, ', UPLO=''', A1, ''', N =', I5, ', type ', I1, 00446 + ', test(', I1, ')=', G12.5 ) 00447 * 00448 RETURN 00449 * 00450 * End of CDRVRFP 00451 * 00452 END