OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
dsyconv.f
Go to the documentation of this file.
1*> \brief \b DSYCONV
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> \htmlonly
9*> Download DSYCONV + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dsyconv.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dsyconv.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dsyconv.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18* Definition:
19* ===========
20*
21* SUBROUTINE DSYCONV( UPLO, WAY, N, A, LDA, IPIV, E, INFO )
22*
23* .. Scalar Arguments ..
24* CHARACTER UPLO, WAY
25* INTEGER INFO, LDA, N
26* ..
27* .. Array Arguments ..
28* INTEGER IPIV( * )
29* DOUBLE PRECISION A( LDA, * ), E( * )
30* ..
31*
32*
33*> \par Purpose:
34* =============
35*>
36*> \verbatim
37*>
38*> DSYCONV convert A given by TRF into L and D and vice-versa.
39*> Get Non-diag elements of D (returned in workspace) and
40*> apply or reverse permutation done in TRF.
41*> \endverbatim
42*
43* Arguments:
44* ==========
45*
46*> \param[in] UPLO
47*> \verbatim
48*> UPLO is CHARACTER*1
49*> Specifies whether the details of the factorization are stored
50*> as an upper or lower triangular matrix.
51*> = 'U': Upper triangular, form is A = U*D*U**T;
52*> = 'L': Lower triangular, form is A = L*D*L**T.
53*> \endverbatim
54*>
55*> \param[in] WAY
56*> \verbatim
57*> WAY is CHARACTER*1
58*> = 'C': Convert
59*> = 'R': Revert
60*> \endverbatim
61*>
62*> \param[in] N
63*> \verbatim
64*> N is INTEGER
65*> The order of the matrix A. N >= 0.
66*> \endverbatim
67*>
68*> \param[in,out] A
69*> \verbatim
70*> A is DOUBLE PRECISION array, dimension (LDA,N)
71*> The block diagonal matrix D and the multipliers used to
72*> obtain the factor U or L as computed by DSYTRF.
73*> \endverbatim
74*>
75*> \param[in] LDA
76*> \verbatim
77*> LDA is INTEGER
78*> The leading dimension of the array A. LDA >= max(1,N).
79*> \endverbatim
80*>
81*> \param[in] IPIV
82*> \verbatim
83*> IPIV is INTEGER array, dimension (N)
84*> Details of the interchanges and the block structure of D
85*> as determined by DSYTRF.
86*> \endverbatim
87*>
88*> \param[out] E
89*> \verbatim
90*> E is DOUBLE PRECISION array, dimension (N)
91*> E stores the supdiagonal/subdiagonal of the symmetric 1-by-1
92*> or 2-by-2 block diagonal matrix D in LDLT.
93*> \endverbatim
94*>
95*> \param[out] INFO
96*> \verbatim
97*> INFO is INTEGER
98*> = 0: successful exit
99*> < 0: if INFO = -i, the i-th argument had an illegal value
100*> \endverbatim
101*
102* Authors:
103* ========
104*
105*> \author Univ. of Tennessee
106*> \author Univ. of California Berkeley
107*> \author Univ. of Colorado Denver
108*> \author NAG Ltd.
109*
110*> \ingroup doubleSYcomputational
111*
112* =====================================================================
113 SUBROUTINE dsyconv( UPLO, WAY, N, A, LDA, IPIV, E, INFO )
114*
115* -- LAPACK computational routine --
116* -- LAPACK is a software package provided by Univ. of Tennessee, --
117* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
118*
119* .. Scalar Arguments ..
120 CHARACTER UPLO, WAY
121 INTEGER INFO, LDA, N
122* ..
123* .. Array Arguments ..
124 INTEGER IPIV( * )
125 DOUBLE PRECISION A( LDA, * ), E( * )
126* ..
127*
128* =====================================================================
129*
130* .. Parameters ..
131 DOUBLE PRECISION ZERO
132 parameter( zero = 0.0d+0 )
133* ..
134* .. External Functions ..
135 LOGICAL LSAME
136 EXTERNAL lsame
137*
138* .. External Subroutines ..
139 EXTERNAL xerbla
140* .. Local Scalars ..
141 LOGICAL UPPER, CONVERT
142 INTEGER I, IP, J
143 DOUBLE PRECISION TEMP
144* ..
145* .. Executable Statements ..
146*
147 info = 0
148 upper = lsame( uplo, 'U' )
149 convert = lsame( way, 'c' )
150.NOT..AND..NOT. IF( UPPER LSAME( UPLO, 'l' ) ) THEN
151 INFO = -1
152.NOT..AND..NOT. ELSE IF( CONVERT LSAME( WAY, 'r' ) ) THEN
153 INFO = -2
154.LT. ELSE IF( N0 ) THEN
155 INFO = -3
156.LT. ELSE IF( LDAMAX( 1, N ) ) THEN
157 INFO = -5
158
159 END IF
160.NE. IF( INFO0 ) THEN
161 CALL XERBLA( 'dsyconv', -INFO )
162 RETURN
163 END IF
164*
165* Quick return if possible
166*
167.EQ. IF( N0 )
168 $ RETURN
169*
170 IF( UPPER ) THEN
171*
172* A is UPPER
173*
174* Convert A (A is upper)
175*
176* Convert VALUE
177*
178 IF ( CONVERT ) THEN
179 I=N
180 E(1)=ZERO
181.GT. DO WHILE ( I 1 )
182.LT. IF( IPIV(I) 0 ) THEN
183 E(I)=A(I-1,I)
184 E(I-1)=ZERO
185 A(I-1,I)=ZERO
186 I=I-1
187 ELSE
188 E(I)=ZERO
189 ENDIF
190 I=I-1
191 END DO
192*
193* Convert PERMUTATIONS
194*
195 I=N
196.GE. DO WHILE ( I 1 )
197.GT. IF( IPIV(I) 0) THEN
198 IP=IPIV(I)
199.LT. IF( I N) THEN
200 DO 12 J= I+1,N
201 TEMP=A(IP,J)
202 A(IP,J)=A(I,J)
203 A(I,J)=TEMP
204 12 CONTINUE
205 ENDIF
206 ELSE
207 IP=-IPIV(I)
208.LT. IF( I N) THEN
209 DO 13 J= I+1,N
210 TEMP=A(IP,J)
211 A(IP,J)=A(I-1,J)
212 A(I-1,J)=TEMP
213 13 CONTINUE
214 ENDIF
215 I=I-1
216 ENDIF
217 I=I-1
218 END DO
219
220 ELSE
221*
222* Revert A (A is upper)
223*
224*
225* Revert PERMUTATIONS
226*
227 I=1
228.LE. DO WHILE ( I N )
229.GT. IF( IPIV(I) 0 ) THEN
230 IP=IPIV(I)
231.LT. IF( I N) THEN
232 DO J= I+1,N
233 TEMP=A(IP,J)
234 A(IP,J)=A(I,J)
235 A(I,J)=TEMP
236 END DO
237 ENDIF
238 ELSE
239 IP=-IPIV(I)
240 I=I+1
241.LT. IF( I N) THEN
242 DO J= I+1,N
243 TEMP=A(IP,J)
244 A(IP,J)=A(I-1,J)
245 A(I-1,J)=TEMP
246 END DO
247 ENDIF
248 ENDIF
249 I=I+1
250 END DO
251*
252* Revert VALUE
253*
254 I=N
255.GT. DO WHILE ( I 1 )
256.LT. IF( IPIV(I) 0 ) THEN
257 A(I-1,I)=E(I)
258 I=I-1
259 ENDIF
260 I=I-1
261 END DO
262 END IF
263 ELSE
264*
265* A is LOWER
266*
267 IF ( CONVERT ) THEN
268*
269* Convert A (A is lower)
270*
271*
272* Convert VALUE
273*
274 I=1
275 E(N)=ZERO
276.LE. DO WHILE ( I N )
277.LT..AND..LT. IF( IN IPIV(I) 0 ) THEN
278 E(I)=A(I+1,I)
279 E(I+1)=ZERO
280 A(I+1,I)=ZERO
281 I=I+1
282 ELSE
283 E(I)=ZERO
284 ENDIF
285 I=I+1
286 END DO
287*
288* Convert PERMUTATIONS
289*
290 I=1
291.LE. DO WHILE ( I N )
292.GT. IF( IPIV(I) 0 ) THEN
293 IP=IPIV(I)
294.GT. IF (I 1) THEN
295 DO 22 J= 1,I-1
296 TEMP=A(IP,J)
297 A(IP,J)=A(I,J)
298 A(I,J)=TEMP
299 22 CONTINUE
300 ENDIF
301 ELSE
302 IP=-IPIV(I)
303.GT. IF (I 1) THEN
304 DO 23 J= 1,I-1
305 TEMP=A(IP,J)
306 A(IP,J)=A(I+1,J)
307 A(I+1,J)=TEMP
308 23 CONTINUE
309 ENDIF
310 I=I+1
311 ENDIF
312 I=I+1
313 END DO
314 ELSE
315*
316* Revert A (A is lower)
317*
318*
319* Revert PERMUTATIONS
320*
321 I=N
322.GE. DO WHILE ( I 1 )
323.GT. IF( IPIV(I) 0 ) THEN
324 IP=IPIV(I)
325.GT. IF (I 1) THEN
326 DO J= 1,I-1
327 TEMP=A(I,J)
328 A(I,J)=A(IP,J)
329 A(IP,J)=TEMP
330 END DO
331 ENDIF
332 ELSE
333 IP=-IPIV(I)
334 I=I-1
335.GT. IF (I 1) THEN
336 DO J= 1,I-1
337 TEMP=A(I+1,J)
338 A(I+1,J)=A(IP,J)
339 A(IP,J)=TEMP
340 END DO
341 ENDIF
342 ENDIF
343 I=I-1
344 END DO
345*
346* Revert VALUE
347*
348 I=1
349.LE. DO WHILE ( I N-1 )
350.LT. IF( IPIV(I) 0 ) THEN
351 A(I+1,I)=E(I)
352 I=I+1
353 ENDIF
354 I=I+1
355 END DO
356 END IF
357 END IF
358
359 RETURN
360*
361* End of DSYCONV
362*
363 END
subroutine xerbla(srname, info)
XERBLA
Definition xerbla.f:60
subroutine dsyconv(uplo, way, n, a, lda, ipiv, e, info)
DSYCONV
Definition dsyconv.f:114