OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
dchkgk.f
Go to the documentation of this file.
1*> \brief \b DCHKGK
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 DCHKGK( NIN, NOUT )
12*
13* .. Scalar Arguments ..
14* INTEGER NIN, NOUT
15* ..
16*
17*
18*> \par Purpose:
19* =============
20*>
21*> \verbatim
22*>
23*> DCHKGK tests DGGBAK, a routine for backward balancing of
24*> a matrix pair (A, B).
25*> \endverbatim
26*
27* Arguments:
28* ==========
29*
30*> \param[in] NIN
31*> \verbatim
32*> NIN is INTEGER
33*> The logical unit number for input. NIN > 0.
34*> \endverbatim
35*>
36*> \param[in] NOUT
37*> \verbatim
38*> NOUT is INTEGER
39*> The logical unit number for output. NOUT > 0.
40*> \endverbatim
41*
42* Authors:
43* ========
44*
45*> \author Univ. of Tennessee
46*> \author Univ. of California Berkeley
47*> \author Univ. of Colorado Denver
48*> \author NAG Ltd.
49*
50*> \ingroup double_eig
51*
52* =====================================================================
53 SUBROUTINE dchkgk( NIN, NOUT )
54*
55* -- LAPACK test routine --
56* -- LAPACK is a software package provided by Univ. of Tennessee, --
57* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
58*
59* .. Scalar Arguments ..
60 INTEGER NIN, NOUT
61* ..
62*
63* =====================================================================
64*
65* .. Parameters ..
66 INTEGER LDA, LDB, LDVL, LDVR
67 parameter( lda = 50, ldb = 50, ldvl = 50, ldvr = 50 )
68 INTEGER LDE, LDF, LDWORK
69 parameter( lde = 50, ldf = 50, ldwork = 50 )
70 DOUBLE PRECISION ZERO, ONE
71 parameter( zero = 0.0d+0, one = 1.0d+0 )
72* ..
73* .. Local Scalars ..
74 INTEGER I, IHI, ILO, INFO, J, KNT, M, N, NINFO
75 DOUBLE PRECISION ANORM, BNORM, EPS, RMAX, VMAX
76* ..
77* .. Local Arrays ..
78 INTEGER LMAX( 4 )
79 DOUBLE PRECISION A( LDA, LDA ), AF( LDA, LDA ), B( LDB, LDB ),
80 $ BF( LDB, LDB ), E( LDE, LDE ), F( LDF, LDF ),
81 $ LSCALE( LDA ), RSCALE( LDA ), VL( LDVL, LDVL ),
82 $ VLF( LDVL, LDVL ), VR( LDVR, LDVR ),
83 $ VRF( LDVR, LDVR ), WORK( LDWORK, LDWORK )
84* ..
85* .. External Functions ..
86 DOUBLE PRECISION DLAMCH, DLANGE
87 EXTERNAL dlamch, dlange
88* ..
89* .. External Subroutines ..
90 EXTERNAL dgemm, dggbak, dggbal, dlacpy
91* ..
92* .. Intrinsic Functions ..
93 INTRINSIC abs, max
94* ..
95* .. Executable Statements ..
96*
97* Initialization
98*
99 lmax( 1 ) = 0
100 lmax( 2 ) = 0
101 lmax( 3 ) = 0
102 lmax( 4 ) = 0
103 ninfo = 0
104 knt = 0
105 rmax = zero
106*
107 eps = dlamch( 'Precision' )
108*
109 10 CONTINUE
110 READ( nin, fmt = * )n, m
111 IF( n.EQ.0 )
112 $ GO TO 100
113*
114 DO 20 i = 1, n
115 READ( nin, fmt = * )( a( i, j ), j = 1, n )
116 20 CONTINUE
117*
118 DO 30 i = 1, n
119 READ( nin, fmt = * )( b( i, j ), j = 1, n )
120 30 CONTINUE
121*
122 DO 40 i = 1, n
123 READ( nin, fmt = * )( vl( i, j ), j = 1, m )
124 40 CONTINUE
125*
126 DO 50 i = 1, n
127 READ( nin, fmt = * )( vr( i, j ), j = 1, m )
128 50 CONTINUE
129*
130 knt = knt + 1
131*
132 anorm = dlange( 'M', n, n, a, lda, work )
133 bnorm = dlange( 'M', n, n, b, ldb, work )
134*
135 CALL dlacpy( 'FULL', n, n, a, lda, af, lda )
136 CALL dlacpy( 'FULL', n, n, b, ldb, bf, ldb )
137*
138 CALL dggbal( 'B', n, a, lda, b, ldb, ilo, ihi, lscale, rscale,
139 $ work, info )
140 IF( info.NE.0 ) THEN
141 ninfo = ninfo + 1
142 lmax( 1 ) = knt
143 END IF
144*
145 CALL dlacpy( 'FULL', n, m, vl, ldvl, vlf, ldvl )
146 CALL dlacpy( 'FULL', n, m, vr, ldvr, vrf, ldvr )
147*
148 CALL dggbak( 'B', 'l', N, ILO, IHI, LSCALE, RSCALE, M, VL, LDVL,
149 $ INFO )
150.NE. IF( INFO0 ) THEN
151 NINFO = NINFO + 1
152 LMAX( 2 ) = KNT
153 END IF
154*
155 CALL DGGBAK( 'b', 'r', N, ILO, IHI, LSCALE, RSCALE, M, VR, LDVR,
156 $ INFO )
157.NE. IF( INFO0 ) THEN
158 NINFO = NINFO + 1
159 LMAX( 3 ) = KNT
160 END IF
161*
162* Test of DGGBAK
163*
164* Check tilde(VL)'*A*tilde(VR) - VL'*tilde(A)*VR
165* where tilde(A) denotes the transformed matrix.
166*
167 CALL DGEMM( 'n', 'n', N, M, N, ONE, AF, LDA, VR, LDVR, ZERO, WORK,
168 $ LDWORK )
169 CALL DGEMM( 't', 'n', M, M, N, ONE, VL, LDVL, WORK, LDWORK, ZERO,
170 $ E, LDE )
171*
172 CALL DGEMM( 'n', 'n', N, M, N, ONE, A, LDA, VRF, LDVR, ZERO, WORK,
173 $ LDWORK )
174 CALL DGEMM( 't', 'n', M, M, N, ONE, VLF, LDVL, WORK, LDWORK, ZERO,
175 $ F, LDF )
176*
177 VMAX = ZERO
178 DO 70 J = 1, M
179 DO 60 I = 1, M
180 VMAX = MAX( VMAX, ABS( E( I, J )-F( I, J ) ) )
181 60 CONTINUE
182 70 CONTINUE
183 VMAX = VMAX / ( EPS*MAX( ANORM, BNORM ) )
184.GT. IF( VMAXRMAX ) THEN
185 LMAX( 4 ) = KNT
186 RMAX = VMAX
187 END IF
188*
189* Check tilde(VL)'*B*tilde(VR) - VL'*tilde(B)*VR
190*
191 CALL DGEMM( 'n', 'n', N, M, N, ONE, BF, LDB, VR, LDVR, ZERO, WORK,
192 $ LDWORK )
193 CALL DGEMM( 't', 'n', M, M, N, ONE, VL, LDVL, WORK, LDWORK, ZERO,
194 $ E, LDE )
195*
196 CALL DGEMM( 'n', 'n', N, M, N, ONE, B, LDB, VRF, LDVR, ZERO, WORK,
197 $ LDWORK )
198 CALL DGEMM( 't', 'n', M, M, N, ONE, VLF, LDVL, WORK, LDWORK, ZERO,
199 $ F, LDF )
200*
201 VMAX = ZERO
202 DO 90 J = 1, M
203 DO 80 I = 1, M
204 VMAX = MAX( VMAX, ABS( E( I, J )-F( I, J ) ) )
205 80 CONTINUE
206 90 CONTINUE
207 VMAX = VMAX / ( EPS*MAX( ANORM, BNORM ) )
208.GT. IF( VMAXRMAX ) THEN
209 LMAX( 4 ) = KNT
210 RMAX = VMAX
211 END IF
212*
213 GO TO 10
214*
215 100 CONTINUE
216*
217 WRITE( NOUT, FMT = 9999 )
218 9999 FORMAT( 1X, '.. test output of dggbak .. ' )
219*
220 WRITE( NOUT, FMT = 9998 )RMAX
221 9998 FORMAT( ' value of largest test error =', D12.3 )
222 WRITE( NOUT, FMT = 9997 )LMAX( 1 )
223 9997 FORMAT( ' example number where dggbal info is not 0 =', I4 )
224 WRITE( NOUT, FMT = 9996 )LMAX( 2 )
225 9996 FORMAT( ' example number where dggbak(l) info is not 0 =', I4 )
226 WRITE( NOUT, FMT = 9995 )LMAX( 3 )
227 9995 FORMAT( ' example number where dggbak(r) info is not 0 =', I4 )
228 WRITE( NOUT, FMT = 9994 )LMAX( 4 )
229 9994 FORMAT( ' example number having largest error =', I4 )
230 WRITE( NOUT, FMT = 9993 )NINFO
231 9993 FORMAT( ' number of examples where info is not 0 =', I4 )
232 WRITE( NOUT, FMT = 9992 )KNT
233 9992 FORMAT( ' total number of examples tested =', I4 )
234*
235 RETURN
236*
237* End of DCHKGK
238*
239 END
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
Definition dlacpy.f:103
subroutine dggbal(job, n, a, lda, b, ldb, ilo, ihi, lscale, rscale, work, info)
DGGBAL
Definition dggbal.f:177
subroutine dggbak(job, side, n, ilo, ihi, lscale, rscale, m, v, ldv, info)
DGGBAK
Definition dggbak.f:147
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM
Definition dgemm.f:187
subroutine dchkgk(nin, nout)
DCHKGK
Definition dchkgk.f:54
#define max(a, b)
Definition macros.h:21