![]() |
LAPACK
3.4.0
LAPACK: Linear Algebra PACKage
|
00001 *> \brief \b ZCKCSD 00002 * 00003 * =========== DOCUMENTATION =========== 00004 * 00005 * Online html documentation available at 00006 * http://www.netlib.org/lapack/explore-html/ 00007 * 00008 * Definition: 00009 * =========== 00010 * 00011 * SUBROUTINE ZCKCSD( NM, MVAL, PVAL, QVAL, NMATS, ISEED, THRESH, 00012 * MMAX, X, XF, U1, U2, V1T, V2T, THETA, IWORK, 00013 * WORK, RWORK, NIN, NOUT, INFO ) 00014 * 00015 * .. Scalar Arguments .. 00016 * INTEGER INFO, NIN, NM, NMATS, MMAX, NOUT 00017 * DOUBLE PRECISION THRESH 00018 * .. 00019 * .. Array Arguments .. 00020 * INTEGER ISEED( 4 ), IWORK( * ), MVAL( * ), PVAL( * ), 00021 * $ QVAL( * ) 00022 * DOUBLE PRECISION RWORK( * ), THETA( * ) 00023 * COMPLEX*16 U1( * ), U2( * ), V1T( * ), V2T( * ), 00024 * $ WORK( * ), X( * ), XF( * ) 00025 * .. 00026 * 00027 * 00028 *> \par Purpose: 00029 * ============= 00030 *> 00031 *> \verbatim 00032 *> 00033 *> ZCKCSD tests ZUNCSD: 00034 *> the CSD for an M-by-M unitary matrix X partitioned as 00035 *> [ X11 X12; X21 X22 ]. X11 is P-by-Q. 00036 *> \endverbatim 00037 * 00038 * Arguments: 00039 * ========== 00040 * 00041 *> \param[in] NM 00042 *> \verbatim 00043 *> NM is INTEGER 00044 *> The number of values of M contained in the vector MVAL. 00045 *> \endverbatim 00046 *> 00047 *> \param[in] MVAL 00048 *> \verbatim 00049 *> MVAL is INTEGER array, dimension (NM) 00050 *> The values of the matrix row dimension M. 00051 *> \endverbatim 00052 *> 00053 *> \param[in] PVAL 00054 *> \verbatim 00055 *> PVAL is INTEGER array, dimension (NM) 00056 *> The values of the matrix row dimension P. 00057 *> \endverbatim 00058 *> 00059 *> \param[in] QVAL 00060 *> \verbatim 00061 *> QVAL is INTEGER array, dimension (NM) 00062 *> The values of the matrix column dimension Q. 00063 *> \endverbatim 00064 *> 00065 *> \param[in] NMATS 00066 *> \verbatim 00067 *> NMATS is INTEGER 00068 *> The number of matrix types to be tested for each combination 00069 *> of matrix dimensions. If NMATS >= NTYPES (the maximum 00070 *> number of matrix types), then all the different types are 00071 *> generated for testing. If NMATS < NTYPES, another input line 00072 *> is read to get the numbers of the matrix types to be used. 00073 *> \endverbatim 00074 *> 00075 *> \param[in,out] ISEED 00076 *> \verbatim 00077 *> ISEED is INTEGER array, dimension (4) 00078 *> On entry, the seed of the random number generator. The array 00079 *> elements should be between 0 and 4095, otherwise they will be 00080 *> reduced mod 4096, and ISEED(4) must be odd. 00081 *> On exit, the next seed in the random number sequence after 00082 *> all the test matrices have been generated. 00083 *> \endverbatim 00084 *> 00085 *> \param[in] THRESH 00086 *> \verbatim 00087 *> THRESH is DOUBLE PRECISION 00088 *> The threshold value for the test ratios. A result is 00089 *> included in the output file if RESULT >= THRESH. To have 00090 *> every test ratio printed, use THRESH = 0. 00091 *> \endverbatim 00092 *> 00093 *> \param[in] MMAX 00094 *> \verbatim 00095 *> MMAX is INTEGER 00096 *> The maximum value permitted for M, used in dimensioning the 00097 *> work arrays. 00098 *> \endverbatim 00099 *> 00100 *> \param[out] X 00101 *> \verbatim 00102 *> X is COMPLEX*16 array, dimension (MMAX*MMAX) 00103 *> \endverbatim 00104 *> 00105 *> \param[out] XF 00106 *> \verbatim 00107 *> XF is COMPLEX*16 array, dimension (MMAX*MMAX) 00108 *> \endverbatim 00109 *> 00110 *> \param[out] U1 00111 *> \verbatim 00112 *> U1 is COMPLEX*16 array, dimension (MMAX*MMAX) 00113 *> \endverbatim 00114 *> 00115 *> \param[out] U2 00116 *> \verbatim 00117 *> U2 is COMPLEX*16 array, dimension (MMAX*MMAX) 00118 *> \endverbatim 00119 *> 00120 *> \param[out] V1T 00121 *> \verbatim 00122 *> V1T is COMPLEX*16 array, dimension (MMAX*MMAX) 00123 *> \endverbatim 00124 *> 00125 *> \param[out] V2T 00126 *> \verbatim 00127 *> V2T is COMPLEX*16 array, dimension (MMAX*MMAX) 00128 *> \endverbatim 00129 *> 00130 *> \param[out] THETA 00131 *> \verbatim 00132 *> THETA is DOUBLE PRECISION array, dimension (MMAX) 00133 *> \endverbatim 00134 *> 00135 *> \param[out] IWORK 00136 *> \verbatim 00137 *> IWORK is INTEGER array, dimension (MMAX) 00138 *> \endverbatim 00139 *> 00140 *> \param[out] WORK 00141 *> \verbatim 00142 *> WORK is COMPLEX*16 array 00143 *> \endverbatim 00144 *> 00145 *> \param[out] RWORK 00146 *> \verbatim 00147 *> RWORK is DOUBLE PRECISION array 00148 *> \endverbatim 00149 *> 00150 *> \param[in] NIN 00151 *> \verbatim 00152 *> NIN is INTEGER 00153 *> The unit number for input. 00154 *> \endverbatim 00155 *> 00156 *> \param[in] NOUT 00157 *> \verbatim 00158 *> NOUT is INTEGER 00159 *> The unit number for output. 00160 *> \endverbatim 00161 *> 00162 *> \param[out] INFO 00163 *> \verbatim 00164 *> INFO is INTEGER 00165 *> = 0 : successful exit 00166 *> > 0 : If ZLAROR returns an error code, the absolute value 00167 *> of it is returned. 00168 *> \endverbatim 00169 * 00170 * Authors: 00171 * ======== 00172 * 00173 *> \author Univ. of Tennessee 00174 *> \author Univ. of California Berkeley 00175 *> \author Univ. of Colorado Denver 00176 *> \author NAG Ltd. 00177 * 00178 *> \date November 2011 00179 * 00180 *> \ingroup complex16_eig 00181 * 00182 * ===================================================================== 00183 SUBROUTINE ZCKCSD( NM, MVAL, PVAL, QVAL, NMATS, ISEED, THRESH, 00184 $ MMAX, X, XF, U1, U2, V1T, V2T, THETA, IWORK, 00185 $ WORK, RWORK, NIN, NOUT, INFO ) 00186 * 00187 * -- LAPACK test routine (version 3.4.0) -- 00188 * -- LAPACK is a software package provided by Univ. of Tennessee, -- 00189 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 00190 * November 2011 00191 * 00192 * .. Scalar Arguments .. 00193 INTEGER INFO, NIN, NM, NMATS, MMAX, NOUT 00194 DOUBLE PRECISION THRESH 00195 * .. 00196 * .. Array Arguments .. 00197 INTEGER ISEED( 4 ), IWORK( * ), MVAL( * ), PVAL( * ), 00198 $ QVAL( * ) 00199 DOUBLE PRECISION RWORK( * ), THETA( * ) 00200 COMPLEX*16 U1( * ), U2( * ), V1T( * ), V2T( * ), 00201 $ WORK( * ), X( * ), XF( * ) 00202 * .. 00203 * 00204 * ===================================================================== 00205 * 00206 * .. Parameters .. 00207 INTEGER NTESTS 00208 PARAMETER ( NTESTS = 9 ) 00209 INTEGER NTYPES 00210 PARAMETER ( NTYPES = 3 ) 00211 DOUBLE PRECISION GAPDIGIT, ORTH, PIOVER2, TEN 00212 PARAMETER ( GAPDIGIT = 18.0D0, ORTH = 1.0D-12, 00213 $ PIOVER2 = 1.57079632679489662D0, 00214 $ TEN = 10.0D0 ) 00215 COMPLEX*16 ZERO, ONE 00216 PARAMETER ( ZERO = (0.0D0,0.0D0), ONE = (1.0D0,0.0D0) ) 00217 * .. 00218 * .. Local Scalars .. 00219 LOGICAL FIRSTT 00220 CHARACTER*3 PATH 00221 INTEGER I, IINFO, IM, IMAT, J, LDU1, LDU2, LDV1T, 00222 $ LDV2T, LDX, LWORK, M, NFAIL, NRUN, NT, P, Q, R 00223 * .. 00224 * .. Local Arrays .. 00225 LOGICAL DOTYPE( NTYPES ) 00226 DOUBLE PRECISION RESULT( NTESTS ) 00227 * .. 00228 * .. External Subroutines .. 00229 EXTERNAL ALAHDG, ALAREQ, ALASUM, ZCSDTS, ZLACSG, ZLAROR, 00230 $ ZLASET 00231 * .. 00232 * .. Intrinsic Functions .. 00233 INTRINSIC ABS, MIN 00234 * .. 00235 * .. External Functions .. 00236 DOUBLE PRECISION DLARND 00237 EXTERNAL DLARND 00238 * .. 00239 * .. Executable Statements .. 00240 * 00241 * Initialize constants and the random number seed. 00242 * 00243 PATH( 1: 3 ) = 'CSD' 00244 INFO = 0 00245 NRUN = 0 00246 NFAIL = 0 00247 FIRSTT = .TRUE. 00248 CALL ALAREQ( PATH, NMATS, DOTYPE, NTYPES, NIN, NOUT ) 00249 LDX = MMAX 00250 LDU1 = MMAX 00251 LDU2 = MMAX 00252 LDV1T = MMAX 00253 LDV2T = MMAX 00254 LWORK = MMAX*MMAX 00255 * 00256 * Do for each value of M in MVAL. 00257 * 00258 DO 30 IM = 1, NM 00259 M = MVAL( IM ) 00260 P = PVAL( IM ) 00261 Q = QVAL( IM ) 00262 * 00263 DO 20 IMAT = 1, NTYPES 00264 * 00265 * Do the tests only if DOTYPE( IMAT ) is true. 00266 * 00267 IF( .NOT.DOTYPE( IMAT ) ) 00268 $ GO TO 20 00269 * 00270 * Generate X 00271 * 00272 IF( IMAT.EQ.1 ) THEN 00273 CALL ZLAROR( 'L', 'I', M, M, X, LDX, ISEED, WORK, IINFO ) 00274 IF( M .NE. 0 .AND. IINFO .NE. 0 ) THEN 00275 WRITE( NOUT, FMT = 9999 ) M, IINFO 00276 INFO = ABS( IINFO ) 00277 GO TO 20 00278 END IF 00279 ELSE IF( IMAT.EQ.2 ) THEN 00280 R = MIN( P, M-P, Q, M-Q ) 00281 DO I = 1, R 00282 THETA(I) = PIOVER2 * DLARND( 1, ISEED ) 00283 END DO 00284 CALL ZLACSG( M, P, Q, THETA, ISEED, X, LDX, WORK ) 00285 DO I = 1, M 00286 DO J = 1, M 00287 X(I+(J-1)*LDX) = X(I+(J-1)*LDX) + 00288 $ ORTH*DLARND(2,ISEED) 00289 END DO 00290 END DO 00291 ELSE 00292 R = MIN( P, M-P, Q, M-Q ) 00293 DO I = 1, R+1 00294 THETA(I) = TEN**(-DLARND(1,ISEED)*GAPDIGIT) 00295 END DO 00296 DO I = 2, R+1 00297 THETA(I) = THETA(I-1) + THETA(I) 00298 END DO 00299 DO I = 1, R 00300 THETA(I) = PIOVER2 * THETA(I) / THETA(R+1) 00301 END DO 00302 CALL ZLACSG( M, P, Q, THETA, ISEED, X, LDX, WORK ) 00303 END IF 00304 * 00305 NT = 9 00306 * 00307 CALL ZCSDTS( M, P, Q, X, XF, LDX, U1, LDU1, U2, LDU2, V1T, 00308 $ LDV1T, V2T, LDV2T, THETA, IWORK, WORK, LWORK, 00309 $ RWORK, RESULT ) 00310 * 00311 * Print information about the tests that did not 00312 * pass the threshold. 00313 * 00314 DO 10 I = 1, NT 00315 IF( RESULT( I ).GE.THRESH ) THEN 00316 IF( NFAIL.EQ.0 .AND. FIRSTT ) THEN 00317 FIRSTT = .FALSE. 00318 CALL ALAHDG( NOUT, PATH ) 00319 END IF 00320 WRITE( NOUT, FMT = 9998 )M, P, Q, IMAT, I, 00321 $ RESULT( I ) 00322 NFAIL = NFAIL + 1 00323 END IF 00324 10 CONTINUE 00325 NRUN = NRUN + NT 00326 20 CONTINUE 00327 30 CONTINUE 00328 * 00329 * Print a summary of the results. 00330 * 00331 CALL ALASUM( PATH, NOUT, NFAIL, NRUN, 0 ) 00332 * 00333 9999 FORMAT( ' ZLAROR in ZCKCSD: M = ', I5, ', INFO = ', I15 ) 00334 9998 FORMAT( ' M=', I4, ' P=', I4, ', Q=', I4, ', type ', I2, 00335 $ ', test ', I2, ', ratio=', G13.6 ) 00336 RETURN 00337 * 00338 * End of ZCKCSD 00339 * 00340 END 00341 * 00342 * 00343 * 00344 SUBROUTINE ZLACSG( M, P, Q, THETA, ISEED, X, LDX, WORK ) 00345 IMPLICIT NONE 00346 * 00347 INTEGER LDX, M, P, Q 00348 INTEGER ISEED( 4 ) 00349 DOUBLE PRECISION THETA( * ) 00350 COMPLEX*16 WORK( * ), X( LDX, * ) 00351 * 00352 COMPLEX*16 ONE, ZERO 00353 PARAMETER ( ONE = (1.0D0,0.0D0), ZERO = (0.0D0,0.0D0) ) 00354 * 00355 INTEGER I, INFO, R 00356 * 00357 R = MIN( P, M-P, Q, M-Q ) 00358 * 00359 CALL ZLASET( 'Full', M, M, ZERO, ZERO, X, LDX ) 00360 * 00361 DO I = 1, MIN(P,Q)-R 00362 X(I,I) = ONE 00363 END DO 00364 DO I = 1, R 00365 X(MIN(P,Q)-R+I,MIN(P,Q)-R+I) = DCMPLX( COS(THETA(I)), 0.0D0 ) 00366 END DO 00367 DO I = 1, MIN(P,M-Q)-R 00368 X(P-I+1,M-I+1) = -ONE 00369 END DO 00370 DO I = 1, R 00371 X(P-(MIN(P,M-Q)-R)+1-I,M-(MIN(P,M-Q)-R)+1-I) = 00372 $ DCMPLX( -SIN(THETA(R-I+1)), 0.0D0 ) 00373 END DO 00374 DO I = 1, MIN(M-P,Q)-R 00375 X(M-I+1,Q-I+1) = ONE 00376 END DO 00377 DO I = 1, R 00378 X(M-(MIN(M-P,Q)-R)+1-I,Q-(MIN(M-P,Q)-R)+1-I) = 00379 $ DCMPLX( SIN(THETA(R-I+1)), 0.0D0 ) 00380 END DO 00381 DO I = 1, MIN(M-P,M-Q)-R 00382 X(P+I,Q+I) = ONE 00383 END DO 00384 DO I = 1, R 00385 X(P+(MIN(M-P,M-Q)-R)+I,Q+(MIN(M-P,M-Q)-R)+I) = 00386 $ DCMPLX( COS(THETA(I)), 0.0D0 ) 00387 END DO 00388 CALL ZLAROR( 'Left', 'No init', P, M, X, LDX, ISEED, WORK, INFO ) 00389 CALL ZLAROR( 'Left', 'No init', M-P, M, X(P+1,1), LDX, 00390 $ ISEED, WORK, INFO ) 00391 CALL ZLAROR( 'Right', 'No init', M, Q, X, LDX, ISEED, 00392 $ WORK, INFO ) 00393 CALL ZLAROR( 'Right', 'No init', M, M-Q, 00394 $ X(1,Q+1), LDX, ISEED, WORK, INFO ) 00395 * 00396 END 00397