85
86
87
88
89
90
91 INTEGER KNT, LMAX, NIN
92 DOUBLE PRECISION RMAX
93
94
95 INTEGER NINFO( 2 )
96
97
98
99
100
101 DOUBLE PRECISION ZERO, ONE
102 parameter( zero = 0.0d0, one = 1.0d0 )
103 INTEGER LDT, LWORK
104 parameter( ldt = 10, lwork = 100 + 4*ldt + 16 )
105
106
107 INTEGER I, IFST, IFST1, IFST2, IFSTSV, ILST, ILST1,
108 $ ILST2, ILSTSV, J, LOC, N
109 DOUBLE PRECISION EPS, RES
110
111
112 DOUBLE PRECISION Q( LDT, LDT ), Z( LDT, LDT ), RESULT( 4 ),
113 $ T( LDT, LDT ), T1( LDT, LDT ), T2( LDT, LDT ),
114 $ S( LDT, LDT ), S1( LDT, LDT ), S2( LDT, LDT ),
115 $ TMP( LDT, LDT ), WORK( LWORK )
116
117
118 DOUBLE PRECISION DLAMCH
120
121
123
124
125 INTRINSIC abs, sign
126
127
128
130 rmax = zero
131 lmax = 0
132 knt = 0
133 ninfo( 1 ) = 0
134 ninfo( 2 ) = 0
135
136
137
138 10 CONTINUE
139 READ( nin, fmt = * )n, ifst, ilst
140 IF( n.EQ.0 )
141 $ RETURN
142 knt = knt + 1
143 DO 20 i = 1, n
144 READ( nin, fmt = * )( tmp( i, j ), j = 1, n )
145 20 CONTINUE
146 CALL dlacpy(
'F', n, n, tmp, ldt, t, ldt )
147 CALL dlacpy(
'F', n, n, tmp, ldt, t1, ldt )
148 CALL dlacpy(
'F', n, n, tmp, ldt, t2, ldt )
149 DO 25 i = 1, n
150 READ( nin, fmt = * )( tmp( i, j ), j = 1, n )
151 25 CONTINUE
152 CALL dlacpy(
'F', n, n, tmp, ldt, s, ldt )
153 CALL dlacpy(
'F', n, n, tmp, ldt, s1, ldt )
154 CALL dlacpy(
'F', n, n, tmp, ldt, s2, ldt )
155 ifstsv = ifst
156 ilstsv = ilst
157 ifst1 = ifst
158 ilst1 = ilst
159 ifst2 = ifst
160 ilst2 = ilst
161 res = zero
162
163
164
165 CALL dlaset(
'Full', n, n, zero, one, q, ldt )
166 CALL dlaset(
'Full', n, n, zero, one, z, ldt )
167 CALL dtgexc( .false., .false., n, t1, ldt, s1, ldt, q, ldt,
168 $ z, ldt, ifst1, ilst1, work, lwork, ninfo( 1 ) )
169 DO 40 i = 1, n
170 DO 30 j = 1, n
171 IF( i.EQ.j .AND. q( i, j ).NE.one )
172 $ res = res + one / eps
173 IF( i.NE.j .AND. q( i, j ).NE.zero )
174 $ res = res + one / eps
175 IF( i.EQ.j .AND. z( i, j ).NE.one )
176 $ res = res + one / eps
177 IF( i.NE.j .AND. z( i, j ).NE.zero )
178 $ res = res + one / eps
179 30 CONTINUE
180 40 CONTINUE
181
182
183
184 CALL dlaset(
'Full', n, n, zero, one, q, ldt )
185 CALL dlaset(
'Full', n, n, zero, one, z, ldt )
186 CALL dtgexc( .true., .true., n, t2, ldt, s2, ldt, q, ldt,
187 $ z, ldt, ifst2, ilst2, work, lwork, ninfo( 2 ) )
188
189
190
191 DO 60 i = 1, n
192 DO 50 j = 1, n
193 IF( t1( i, j ).NE.t2( i, j ) )
194 $ res = res + one / eps
195 IF( s1( i, j ).NE.s2( i, j ) )
196 $ res = res + one / eps
197 50 CONTINUE
198 60 CONTINUE
199 IF( ifst1.NE.ifst2 )
200 $ res = res + one / eps
201 IF( ilst1.NE.ilst2 )
202 $ res = res + one / eps
203 IF( ninfo( 1 ).NE.ninfo( 2 ) )
204 $ res = res + one / eps
205
206
207
208 CALL dget51( 1, n, t, ldt, t2, ldt, q, ldt, z, ldt, work,
209 $ result( 1 ) )
210 CALL dget51( 1, n, s, ldt, s2, ldt, q, ldt, z, ldt, work,
211 $ result( 2 ) )
212 CALL dget51( 3, n, t, ldt, t2, ldt, q, ldt, q, ldt, work,
213 $ result( 3 ) )
214 CALL dget51( 3, n, t, ldt, t2, ldt, z, ldt, z, ldt, work,
215 $ result( 4 ) )
216 res = res + result( 1 ) + result( 2 ) + result( 3 ) + result( 4 )
217
218
219
220 GO TO 10
221
222
223
subroutine dget51(itype, n, a, lda, b, ldb, u, ldu, v, ldv, work, result)
DGET51
subroutine dhst01(n, ilo, ihi, a, lda, h, ldh, q, ldq, work, lwork, result)
DHST01
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
double precision function dlamch(cmach)
DLAMCH
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.
subroutine dtgexc(wantq, wantz, n, a, lda, b, ldb, q, ldq, z, ldz, ifst, ilst, work, lwork, info)
DTGEXC