OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
dget22.f
Go to the documentation of this file.
1*> \brief \b DGET22
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8* Definition:
9* ===========
10*
11* SUBROUTINE DGET22( TRANSA, TRANSE, TRANSW, N, A, LDA, E, LDE, WR,
12* WI, WORK, RESULT )
13*
14* .. Scalar Arguments ..
15* CHARACTER TRANSA, TRANSE, TRANSW
16* INTEGER LDA, LDE, N
17* ..
18* .. Array Arguments ..
19* DOUBLE PRECISION A( LDA, * ), E( LDE, * ), RESULT( 2 ), WI( * ),
20* $ WORK( * ), WR( * )
21* ..
22*
23*
24*> \par Purpose:
25* =============
26*>
27*> \verbatim
28*>
29*> DGET22 does an eigenvector check.
30*>
31*> The basic test is:
32*>
33*> RESULT(1) = | A E - E W | / ( |A| |E| ulp )
34*>
35*> using the 1-norm. It also tests the normalization of E:
36*>
37*> RESULT(2) = max | m-norm(E(j)) - 1 | / ( n ulp )
38*> j
39*>
40*> where E(j) is the j-th eigenvector, and m-norm is the max-norm of a
41*> vector. If an eigenvector is complex, as determined from WI(j)
42*> nonzero, then the max-norm of the vector ( er + i*ei ) is the maximum
43*> of
44*> |er(1)| + |ei(1)|, ... , |er(n)| + |ei(n)|
45*>
46*> W is a block diagonal matrix, with a 1 by 1 block for each real
47*> eigenvalue and a 2 by 2 block for each complex conjugate pair.
48*> If eigenvalues j and j+1 are a complex conjugate pair, so that
49*> WR(j) = WR(j+1) = wr and WI(j) = - WI(j+1) = wi, then the 2 by 2
50*> block corresponding to the pair will be:
51*>
52*> ( wr wi )
53*> ( -wi wr )
54*>
55*> Such a block multiplying an n by 2 matrix ( ur ui ) on the right
56*> will be the same as multiplying ur + i*ui by wr + i*wi.
57*>
58*> To handle various schemes for storage of left eigenvectors, there are
59*> options to use A-transpose instead of A, E-transpose instead of E,
60*> and/or W-transpose instead of W.
61*> \endverbatim
62*
63* Arguments:
64* ==========
65*
66*> \param[in] TRANSA
67*> \verbatim
68*> TRANSA is CHARACTER*1
69*> Specifies whether or not A is transposed.
70*> = 'N': No transpose
71*> = 'T': Transpose
72*> = 'C': Conjugate transpose (= Transpose)
73*> \endverbatim
74*>
75*> \param[in] TRANSE
76*> \verbatim
77*> TRANSE is CHARACTER*1
78*> Specifies whether or not E is transposed.
79*> = 'N': No transpose, eigenvectors are in columns of E
80*> = 'T': Transpose, eigenvectors are in rows of E
81*> = 'C': Conjugate transpose (= Transpose)
82*> \endverbatim
83*>
84*> \param[in] TRANSW
85*> \verbatim
86*> TRANSW is CHARACTER*1
87*> Specifies whether or not W is transposed.
88*> = 'N': No transpose
89*> = 'T': Transpose, use -WI(j) instead of WI(j)
90*> = 'C': Conjugate transpose, use -WI(j) instead of WI(j)
91*> \endverbatim
92*>
93*> \param[in] N
94*> \verbatim
95*> N is INTEGER
96*> The order of the matrix A. N >= 0.
97*> \endverbatim
98*>
99*> \param[in] A
100*> \verbatim
101*> A is DOUBLE PRECISION array, dimension (LDA,N)
102*> The matrix whose eigenvectors are in E.
103*> \endverbatim
104*>
105*> \param[in] LDA
106*> \verbatim
107*> LDA is INTEGER
108*> The leading dimension of the array A. LDA >= max(1,N).
109*> \endverbatim
110*>
111*> \param[in] E
112*> \verbatim
113*> E is DOUBLE PRECISION array, dimension (LDE,N)
114*> The matrix of eigenvectors. If TRANSE = 'N', the eigenvectors
115*> are stored in the columns of E, if TRANSE = 'T' or 'C', the
116*> eigenvectors are stored in the rows of E.
117*> \endverbatim
118*>
119*> \param[in] LDE
120*> \verbatim
121*> LDE is INTEGER
122*> The leading dimension of the array E. LDE >= max(1,N).
123*> \endverbatim
124*>
125*> \param[in] WR
126*> \verbatim
127*> WR is DOUBLE PRECISION array, dimension (N)
128*> \endverbatim
129*>
130*> \param[in] WI
131*> \verbatim
132*> WI is DOUBLE PRECISION array, dimension (N)
133*>
134*> The real and imaginary parts of the eigenvalues of A.
135*> Purely real eigenvalues are indicated by WI(j) = 0.
136*> Complex conjugate pairs are indicated by WR(j)=WR(j+1) and
137*> WI(j) = - WI(j+1) non-zero; the real part is assumed to be
138*> stored in the j-th row/column and the imaginary part in
139*> the (j+1)-th row/column.
140*> \endverbatim
141*>
142*> \param[out] WORK
143*> \verbatim
144*> WORK is DOUBLE PRECISION array, dimension (N*(N+1))
145*> \endverbatim
146*>
147*> \param[out] RESULT
148*> \verbatim
149*> RESULT is DOUBLE PRECISION array, dimension (2)
150*> RESULT(1) = | A E - E W | / ( |A| |E| ulp )
151*> RESULT(2) = max | m-norm(E(j)) - 1 | / ( n ulp )
152*> j
153*> \endverbatim
154*
155* Authors:
156* ========
157*
158*> \author Univ. of Tennessee
159*> \author Univ. of California Berkeley
160*> \author Univ. of Colorado Denver
161*> \author NAG Ltd.
162*
163*> \ingroup double_eig
164*
165* =====================================================================
166 SUBROUTINE dget22( TRANSA, TRANSE, TRANSW, N, A, LDA, E, LDE, WR,
167 $ WI, WORK, RESULT )
168*
169* -- LAPACK test routine --
170* -- LAPACK is a software package provided by Univ. of Tennessee, --
171* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
172*
173* .. Scalar Arguments ..
174 CHARACTER TRANSA, TRANSE, TRANSW
175 INTEGER LDA, LDE, N
176* ..
177* .. Array Arguments ..
178 DOUBLE PRECISION A( LDA, * ), E( LDE, * ), RESULT( 2 ), WI( * ),
179 $ work( * ), wr( * )
180* ..
181*
182* =====================================================================
183*
184* .. Parameters ..
185 DOUBLE PRECISION ZERO, ONE
186 parameter( zero = 0.0d0, one = 1.0d0 )
187* ..
188* .. Local Scalars ..
189 CHARACTER NORMA, NORME
190 INTEGER IECOL, IEROW, INCE, IPAIR, ITRNSE, J, JCOL,
191 $ jvec
192 DOUBLE PRECISION ANORM, ENORM, ENRMAX, ENRMIN, ERRNRM, TEMP1,
193 $ ulp, unfl
194* ..
195* .. Local Arrays ..
196 DOUBLE PRECISION WMAT( 2, 2 )
197* ..
198* .. External Functions ..
199 LOGICAL LSAME
200 DOUBLE PRECISION DLAMCH, DLANGE
201 EXTERNAL lsame, dlamch, dlange
202* ..
203* .. External Subroutines ..
204 EXTERNAL daxpy, dgemm, dlaset
205* ..
206* .. Intrinsic Functions ..
207 INTRINSIC abs, dble, max, min
208* ..
209* .. Executable Statements ..
210*
211* Initialize RESULT (in case N=0)
212*
213 result( 1 ) = zero
214 result( 2 ) = zero
215 IF( n.LE.0 )
216 $ RETURN
217*
218 unfl = dlamch( 'Safe minimum' )
219 ulp = dlamch( 'precision' )
220*
221 ITRNSE = 0
222 INCE = 1
223 NORMA = 'o'
224 NORME = 'o'
225*
226 IF( LSAME( TRANSA, 't.OR.' ) LSAME( TRANSA, 'c' ) ) THEN
227 NORMA = 'i'
228 END IF
229 IF( LSAME( TRANSE, 't.OR.' ) LSAME( TRANSE, 'c' ) ) THEN
230 NORME = 'i'
231 ITRNSE = 1
232 INCE = LDE
233 END IF
234*
235* Check normalization of E
236*
237 ENRMIN = ONE / ULP
238 ENRMAX = ZERO
239.EQ. IF( ITRNSE0 ) THEN
240*
241* Eigenvectors are column vectors.
242*
243 IPAIR = 0
244 DO 30 JVEC = 1, N
245 TEMP1 = ZERO
246.EQ..AND..LT..AND..NE. IF( IPAIR0 JVECN WI( JVEC )ZERO )
247 $ IPAIR = 1
248.EQ. IF( IPAIR1 ) THEN
249*
250* Complex eigenvector
251*
252 DO 10 J = 1, N
253 TEMP1 = MAX( TEMP1, ABS( E( J, JVEC ) )+
254 $ ABS( E( J, JVEC+1 ) ) )
255 10 CONTINUE
256 ENRMIN = MIN( ENRMIN, TEMP1 )
257 ENRMAX = MAX( ENRMAX, TEMP1 )
258 IPAIR = 2
259.EQ. ELSE IF( IPAIR2 ) THEN
260 IPAIR = 0
261 ELSE
262*
263* Real eigenvector
264*
265 DO 20 J = 1, N
266 TEMP1 = MAX( TEMP1, ABS( E( J, JVEC ) ) )
267 20 CONTINUE
268 ENRMIN = MIN( ENRMIN, TEMP1 )
269 ENRMAX = MAX( ENRMAX, TEMP1 )
270 IPAIR = 0
271 END IF
272 30 CONTINUE
273*
274 ELSE
275*
276* Eigenvectors are row vectors.
277*
278 DO 40 JVEC = 1, N
279 WORK( JVEC ) = ZERO
280 40 CONTINUE
281*
282 DO 60 J = 1, N
283 IPAIR = 0
284 DO 50 JVEC = 1, N
285.EQ..AND..LT..AND..NE. IF( IPAIR0 JVECN WI( JVEC )ZERO )
286 $ IPAIR = 1
287.EQ. IF( IPAIR1 ) THEN
288 WORK( JVEC ) = MAX( WORK( JVEC ),
289 $ ABS( E( J, JVEC ) )+ABS( E( J,
290 $ JVEC+1 ) ) )
291 WORK( JVEC+1 ) = WORK( JVEC )
292.EQ. ELSE IF( IPAIR2 ) THEN
293 IPAIR = 0
294 ELSE
295 WORK( JVEC ) = MAX( WORK( JVEC ),
296 $ ABS( E( J, JVEC ) ) )
297 IPAIR = 0
298 END IF
299 50 CONTINUE
300 60 CONTINUE
301*
302 DO 70 JVEC = 1, N
303 ENRMIN = MIN( ENRMIN, WORK( JVEC ) )
304 ENRMAX = MAX( ENRMAX, WORK( JVEC ) )
305 70 CONTINUE
306 END IF
307*
308* Norm of A:
309*
310 ANORM = MAX( DLANGE( NORMA, N, N, A, LDA, WORK ), UNFL )
311*
312* Norm of E:
313*
314 ENORM = MAX( DLANGE( NORME, N, N, E, LDE, WORK ), ULP )
315*
316* Norm of error:
317*
318* Error = AE - EW
319*
320 CALL DLASET( 'full', N, N, ZERO, ZERO, WORK, N )
321*
322 IPAIR = 0
323 IEROW = 1
324 IECOL = 1
325*
326 DO 80 JCOL = 1, N
327.EQ. IF( ITRNSE1 ) THEN
328 IEROW = JCOL
329 ELSE
330 IECOL = JCOL
331 END IF
332*
333.EQ..AND..NE. IF( IPAIR0 WI( JCOL )ZERO )
334 $ IPAIR = 1
335*
336.EQ. IF( IPAIR1 ) THEN
337 WMAT( 1, 1 ) = WR( JCOL )
338 WMAT( 2, 1 ) = -WI( JCOL )
339 WMAT( 1, 2 ) = WI( JCOL )
340 WMAT( 2, 2 ) = WR( JCOL )
341 CALL DGEMM( TRANSE, TRANSW, N, 2, 2, ONE, E( IEROW, IECOL ),
342 $ LDE, WMAT, 2, ZERO, WORK( N*( JCOL-1 )+1 ), N )
343 IPAIR = 2
344.EQ. ELSE IF( IPAIR2 ) THEN
345 IPAIR = 0
346*
347 ELSE
348*
349 CALL DAXPY( N, WR( JCOL ), E( IEROW, IECOL ), INCE,
350 $ WORK( N*( JCOL-1 )+1 ), 1 )
351 IPAIR = 0
352 END IF
353*
354 80 CONTINUE
355*
356 CALL DGEMM( TRANSA, TRANSE, N, N, N, ONE, A, LDA, E, LDE, -ONE,
357 $ WORK, N )
358*
359 ERRNRM = DLANGE( 'one', N, N, WORK, N, WORK( N*N+1 ) ) / ENORM
360*
361* Compute RESULT(1) (avoiding under/overflow)
362*
363.GT. IF( ANORMERRNRM ) THEN
364 RESULT( 1 ) = ( ERRNRM / ANORM ) / ULP
365 ELSE
366.LT. IF( ANORMONE ) THEN
367 RESULT( 1 ) = ONE / ULP
368 ELSE
369 RESULT( 1 ) = MIN( ERRNRM / ANORM, ONE ) / ULP
370 END IF
371 END IF
372*
373* Compute RESULT(2) : the normalization error in E.
374*
375 RESULT( 2 ) = MAX( ABS( ENRMAX-ONE ), ABS( ENRMIN-ONE ) ) /
376 $ ( DBLE( N )*ULP )
377*
378 RETURN
379*
380* End of DGET22
381*
382 END
subroutine dlaset(uplo, m, n, alpha, beta, a, lda)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
Definition dlaset.f:110
subroutine daxpy(n, da, dx, incx, dy, incy)
DAXPY
Definition daxpy.f:89
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM
Definition dgemm.f:187
subroutine dget22(transa, transe, transw, n, a, lda, e, lde, wr, wi, work, result)
DGET22
Definition dget22.f:168
#define min(a, b)
Definition macros.h:20
#define max(a, b)
Definition macros.h:21