2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097 COMPLEX*16 ZERO, HALF, ONE
2098 parameter( zero = ( 0.0d0, 0.0d0 ),
2099 $ half = ( 0.5d0, 0.0d0 ),
2100 $ one = ( 1.0d0, 0.0d0 ) )
2101 DOUBLE PRECISION RZERO
2102 parameter( rzero = 0.0d0 )
2103
2104 DOUBLE PRECISION EPS, THRESH
2105 INTEGER INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA
2106 LOGICAL FATAL, REWI, TRACE
2107 CHARACTER*6 SNAME
2108
2109 COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
2110 $ AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),
2111 $ XX( NMAX*INCMAX ), Y( NMAX ),
2112 $ YS( NMAX*INCMAX ), YT( NMAX ),
2113 $ YY( NMAX*INCMAX ), Z( NMAX, 2 )
2114 DOUBLE PRECISION G( NMAX )
2115 INTEGER IDIM( NIDIM ), INC( NINC )
2116
2117 COMPLEX*16 ALPHA, ALS, TRANSL
2118 DOUBLE PRECISION ERR, ERRMAX
2119 INTEGER I, IA, IC, IN, INCX, INCXS, INCY, INCYS, IX,
2120 $ IY, J, JA, JJ, LAA, LDA, LDAS, LJ, LX, LY, N,
2121 $ NARGS, NC, NS
2122 LOGICAL FULL, NULL, PACKED, RESET, SAME, UPPER
2123 CHARACTER*1 UPLO, UPLOS
2124 CHARACTER*2 ICH
2125
2126 COMPLEX*16 W( 2 )
2127 LOGICAL ISAME( 13 )
2128
2129 LOGICAL LZE, LZERES
2131
2133
2134 INTRINSIC abs, dconjg, max
2135
2136 INTEGER INFOT, NOUTC
2137 LOGICAL LERR, OK
2138
2139 COMMON /infoc/infot, noutc, ok, lerr
2140
2141 DATA ich/'UL'/
2142
2143 full = sname( 3: 3 ).EQ.'E'
2144 packed = sname( 3: 3 ).EQ.'P'
2145
2146 IF( full )THEN
2147 nargs = 9
2148 ELSE IF( packed )THEN
2149 nargs = 8
2150 END IF
2151
2152 nc = 0
2153 reset = .true.
2154 errmax = rzero
2155
2156 DO 140 in = 1, nidim
2157 n = idim( in )
2158
2159 lda = n
2160 IF( lda.LT.nmax )
2161 $ lda = lda + 1
2162
2163 IF( lda.GT.nmax )
2164 $ GO TO 140
2165 IF( packed )THEN
2166 laa = ( n*( n + 1 ) )/2
2167 ELSE
2168 laa = lda*n
2169 END IF
2170
2171 DO 130 ic = 1, 2
2172 uplo = ich( ic: ic )
2173 upper = uplo.EQ.'U'
2174
2175 DO 120 ix = 1, ninc
2176 incx = inc( ix )
2177 lx = abs( incx )*n
2178
2179
2180
2181 transl = half
2182 CALL zmake(
'GE',
' ',
' ', 1, n, x, 1, xx, abs( incx ),
2183 $ 0, n - 1, reset, transl )
2184 IF( n.GT.1 )THEN
2185 x( n/2 ) = zero
2186 xx( 1 + abs( incx )*( n/2 - 1 ) ) = zero
2187 END IF
2188
2189 DO 110 iy = 1, ninc
2190 incy = inc( iy )
2191 ly = abs( incy )*n
2192
2193
2194
2195 transl = zero
2196 CALL zmake(
'GE',
' ',
' ', 1, n, y, 1, yy,
2197 $ abs( incy ), 0, n - 1, reset, transl )
2198 IF( n.GT.1 )THEN
2199 y( n/2 ) = zero
2200 yy( 1 + abs( incy )*( n/2 - 1 ) ) = zero
2201 END IF
2202
2203 DO 100 ia = 1, nalf
2204 alpha = alf( ia )
2205 null = n.LE.0.OR.alpha.EQ.zero
2206
2207
2208
2209 transl = zero
2210 CALL zmake( sname( 2: 3 ), uplo,
' ', n, n, a,
2211 $ nmax, aa, lda, n - 1, n - 1, reset,
2212 $ transl )
2213
2214 nc = nc + 1
2215
2216
2217
2218 uplos = uplo
2219 ns = n
2220 als = alpha
2221 DO 10 i = 1, laa
2222 as( i ) = aa( i )
2223 10 CONTINUE
2224 ldas = lda
2225 DO 20 i = 1, lx
2226 xs( i ) = xx( i )
2227 20 CONTINUE
2228 incxs = incx
2229 DO 30 i = 1, ly
2230 ys( i ) = yy( i )
2231 30 CONTINUE
2232 incys = incy
2233
2234
2235
2236 IF( full )THEN
2237 IF( trace )
2238 $ WRITE( ntra, fmt = 9993 )nc, sname, uplo, n,
2239 $ alpha, incx, incy, lda
2240 IF( rewi )
2241 $ rewind ntra
2242 CALL zher2( uplo, n, alpha, xx, incx, yy, incy,
2243 $ aa, lda )
2244 ELSE IF( packed )THEN
2245 IF( trace )
2246 $ WRITE( ntra, fmt = 9994 )nc, sname, uplo, n,
2247 $ alpha, incx, incy
2248 IF( rewi )
2249 $ rewind ntra
2250 CALL zhpr2( uplo, n, alpha, xx, incx, yy, incy,
2251 $ aa )
2252 END IF
2253
2254
2255
2256 IF( .NOT.ok )THEN
2257 WRITE( nout, fmt = 9992 )
2258 fatal = .true.
2259 GO TO 160
2260 END IF
2261
2262
2263
2264 isame( 1 ) = uplo.EQ.uplos
2265 isame( 2 ) = ns.EQ.n
2266 isame( 3 ) = als.EQ.alpha
2267 isame( 4 ) =
lze( xs, xx, lx )
2268 isame( 5 ) = incxs.EQ.incx
2269 isame( 6 ) =
lze( ys, yy, ly )
2270 isame( 7 ) = incys.EQ.incy
2271 IF( null )THEN
2272 isame( 8 ) =
lze( as, aa, laa )
2273 ELSE
2274 isame( 8 ) =
lzeres( sname( 2: 3 ), uplo, n, n,
2275 $ as, aa, lda )
2276 END IF
2277 IF( .NOT.packed )THEN
2278 isame( 9 ) = ldas.EQ.lda
2279 END IF
2280
2281
2282
2283 same = .true.
2284 DO 40 i = 1, nargs
2285 same = same.AND.isame( i )
2286 IF( .NOT.isame( i ) )
2287 $ WRITE( nout, fmt = 9998 )i
2288 40 CONTINUE
2289 IF( .NOT.same )THEN
2290 fatal = .true.
2291 GO TO 160
2292 END IF
2293
2294 IF( .NOT.null )THEN
2295
2296
2297
2298 IF( incx.GT.0 )THEN
2299 DO 50 i = 1, n
2300 z( i, 1 ) = x( i )
2301 50 CONTINUE
2302 ELSE
2303 DO 60 i = 1, n
2304 z( i, 1 ) = x( n - i + 1 )
2305 60 CONTINUE
2306 END IF
2307 IF( incy.GT.0 )THEN
2308 DO 70 i = 1, n
2309 z( i, 2 ) = y( i )
2310 70 CONTINUE
2311 ELSE
2312 DO 80 i = 1, n
2313 z( i, 2 ) = y( n - i + 1 )
2314 80 CONTINUE
2315 END IF
2316 ja = 1
2317 DO 90 j = 1, n
2318 w( 1 ) = alpha*dconjg( z( j, 2 ) )
2319 w( 2 ) = dconjg( alpha )*dconjg( z( j, 1 ) )
2320 IF( upper )THEN
2321 jj = 1
2322 lj = j
2323 ELSE
2324 jj = j
2325 lj = n - j + 1
2326 END IF
2327 CALL zmvch(
'N', lj, 2, one, z( jj, 1 ),
2328 $ nmax, w, 1, one, a( jj, j ), 1,
2329 $ yt, g, aa( ja ), eps, err, fatal,
2330 $ nout, .true. )
2331 IF( full )THEN
2332 IF( upper )THEN
2333 ja = ja + lda
2334 ELSE
2335 ja = ja + lda + 1
2336 END IF
2337 ELSE
2338 ja = ja + lj
2339 END IF
2340 errmax = max( errmax, err )
2341
2342 IF( fatal )
2343 $ GO TO 150
2344 90 CONTINUE
2345 ELSE
2346
2347 IF( n.LE.0 )
2348 $ GO TO 140
2349 END IF
2350
2351 100 CONTINUE
2352
2353 110 CONTINUE
2354
2355 120 CONTINUE
2356
2357 130 CONTINUE
2358
2359 140 CONTINUE
2360
2361
2362
2363 IF( errmax.LT.thresh )THEN
2364 WRITE( nout, fmt = 9999 )sname, nc
2365 ELSE
2366 WRITE( nout, fmt = 9997 )sname, nc, errmax
2367 END IF
2368 GO TO 170
2369
2370 150 CONTINUE
2371 WRITE( nout, fmt = 9995 )j
2372
2373 160 CONTINUE
2374 WRITE( nout, fmt = 9996 )sname
2375 IF( full )THEN
2376 WRITE( nout, fmt = 9993 )nc, sname, uplo, n, alpha, incx,
2377 $ incy, lda
2378 ELSE IF( packed )THEN
2379 WRITE( nout, fmt = 9994 )nc, sname, uplo, n, alpha, incx, incy
2380 END IF
2381
2382 170 CONTINUE
2383 RETURN
2384
2385 9999 FORMAT( ' ', a6, ' PASSED THE COMPUTATIONAL TESTS (', i6, ' CALL',
2386 $ 'S)' )
2387 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', i2, ' WAS CH',
2388 $ 'ANGED INCORRECTLY *******' )
2389 9997 FORMAT( ' ', a6, ' COMPLETED THE COMPUTATIONAL TESTS (', i6, ' C',
2390 $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', f8.2,
2391 $ ' - SUSPECT *******' )
2392 9996 FORMAT( ' ******* ', a6, ' FAILED ON CALL NUMBER:' )
2393 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', i3 )
2394 9994 FORMAT( 1x, i6, ': ', a6, '(''', a1, ''',', i3, ',(', f4.1, ',',
2395 $ f4.1, '), X,', i2, ', Y,', i2, ', AP) ',
2396 $ ' .' )
2397 9993 FORMAT( 1x, i6, ': ', a6, '(''', a1, ''',', i3, ',(', f4.1, ',',
2398 $ f4.1, '), X,', i2, ', Y,', i2, ', A,', i3, ') ',
2399 $ ' .' )
2400 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
2401 $ '******' )
2402
2403
2404
subroutine zhpr2(UPLO, N, ALPHA, X, INCX, Y, INCY, AP)
ZHPR2
subroutine zher2(UPLO, N, ALPHA, X, INCX, Y, INCY, A, LDA)
ZHER2
subroutine zmvch(TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y, INCY, YT, G, YY, EPS, ERR, FATAL, NOUT, MV)
logical function lzeres(TYPE, UPLO, M, N, AA, AS, LDA)
subroutine zmake(TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL, KU, RESET, TRANSL)
logical function lze(RI, RJ, LR)