1       SUBROUTINE DSYCONV( UPLO, WAY, N, A, LDA, IPIV, WORK, INFO )
  2 *
  3 *  -- LAPACK PROTOTYPE routine (version 3.3.0) --
  4 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
  5 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  6 *     November 2010
  7 *
  8 *  -- Written by Julie Langou of the Univ. of TN    --
  9 *
 10 *     .. Scalar Arguments ..
 11       CHARACTER          UPLO, WAY
 12       INTEGER            INFO, LDA, N
 13 *     ..
 14 *     .. Array Arguments ..
 15       INTEGER            IPIV( * )
 16       DOUBLE PRECISION   A( LDA, * ), WORK( * )
 17 *     ..
 18 *
 19 *  Purpose
 20 *  =======
 21 *
 22 *  DSYCONV convert A given by TRF into L and D and vice-versa.
 23 *  Get Non-diag elements of D (returned in workspace) and 
 24 *  apply or reverse permutation done in TRF.
 25 *
 26 *  Arguments
 27 *  =========
 28 *
 29 *  UPLO    (input) CHARACTER*1
 30 *          Specifies whether the details of the factorization are stored
 31 *          as an upper or lower triangular matrix.
 32 *          = 'U':  Upper triangular, form is A = U*D*U**T;
 33 *          = 'L':  Lower triangular, form is A = L*D*L**T.
 34 
 35 *  WAY     (input) CHARACTER*1
 36 *          = 'C': Convert 
 37 *          = 'R': Revert
 38 *
 39 *  N       (input) INTEGER
 40 *          The order of the matrix A.  N >= 0.
 41 *
 42 *  A       (input) DOUBLE PRECISION array, dimension (LDA,N)
 43 *          The block diagonal matrix D and the multipliers used to
 44 *          obtain the factor U or L as computed by DSYTRF.
 45 *
 46 *  LDA     (input) INTEGER
 47 *          The leading dimension of the array A.  LDA >= max(1,N).
 48 *
 49 *  IPIV    (input) INTEGER array, dimension (N)
 50 *          Details of the interchanges and the block structure of D
 51 *          as determined by DSYTRF.
 52 *
 53 * WORK     (workspace) DOUBLE PRECISION array, dimension (N)
 54 *
 55 * LWORK    (input) INTEGER
 56 *          The length of WORK.  LWORK >=1. 
 57 *          LWORK = N
 58 *
 59 *          If LWORK = -1, then a workspace query is assumed; the routine
 60 *          only calculates the optimal size of the WORK array, returns
 61 *          this value as the first entry of the WORK array, and no error
 62 *          message related to LWORK is issued by XERBLA.
 63 *
 64 *  INFO    (output) INTEGER
 65 *          = 0:  successful exit
 66 *          < 0:  if INFO = -i, the i-th argument had an illegal value
 67 *
 68 *  =====================================================================
 69 *
 70 *     .. Parameters ..
 71       DOUBLE PRECISION   ZERO
 72       PARAMETER          ( ZERO = 0.0D+0 )
 73 *     ..
 74 *     .. External Functions ..
 75       LOGICAL            LSAME
 76       EXTERNAL           LSAME
 77 *
 78 *     .. External Subroutines ..
 79       EXTERNAL           XERBLA
 80 *     .. Local Scalars ..
 81       LOGICAL            UPPER, CONVERT
 82       INTEGER            I, IP, J
 83       DOUBLE PRECISION   TEMP
 84 *     ..
 85 *     .. Executable Statements ..
 86 *
 87       INFO = 0
 88       UPPER = LSAME( UPLO, 'U' )
 89       CONVERT = LSAME( WAY, 'C' )
 90       IF.NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
 91          INFO = -1
 92       ELSE IF.NOT.CONVERT .AND. .NOT.LSAME( WAY, 'R' ) ) THEN
 93          INFO = -2
 94       ELSE IF( N.LT.0 ) THEN
 95          INFO = -3
 96       ELSE IF( LDA.LT.MAX1, N ) ) THEN
 97          INFO = -5
 98 
 99       END IF
100       IF( INFO.NE.0 ) THEN
101          CALL XERBLA( 'DSYCONV'-INFO )
102          RETURN
103       END IF
104 *
105 *     Quick return if possible
106 *
107       IF( N.EQ.0 )
108      $   RETURN
109 *
110       IF( UPPER ) THEN
111 *
112 *      A is UPPER
113 *
114 *      Convert A (A is upper)
115 *
116 *        Convert VALUE
117 *
118          IF ( CONVERT ) THEN
119             I=N
120             WORK(1)=ZERO
121             DO WHILE ( I .GT. 1 )
122                IF( IPIV(I) .LT. 0 ) THEN
123                   WORK(I)=A(I-1,I)
124                   A(I-1,I)=ZERO
125                   I=I-1
126                ELSE
127                   WORK(I)=ZERO
128                ENDIF
129                I=I-1
130             END DO
131 *
132 *        Convert PERMUTATIONS
133 *  
134          I=N
135          DO WHILE ( I .GE. 1 )
136             IF( IPIV(I) .GT. 0THEN
137                IP=IPIV(I)
138                IF( I .LT. N) THEN
139                   DO 12 J= I+1,N
140                     TEMP=A(IP,J)
141                     A(IP,J)=A(I,J)
142                     A(I,J)=TEMP
143  12            CONTINUE
144                ENDIF
145             ELSE
146               IP=-IPIV(I)
147                IF( I .LT. N) THEN
148              DO 13 J= I+1,N
149                  TEMP=A(IP,J)
150                  A(IP,J)=A(I-1,J)
151                  A(I-1,J)=TEMP
152  13            CONTINUE
153                 ENDIF
154                 I=I-1
155            ENDIF
156            I=I-1
157         END DO
158 
159          ELSE
160 *
161 *      Revert A (A is upper)
162 *
163 *
164 *        Revert PERMUTATIONS
165 *  
166             I=1
167             DO WHILE ( I .LE. N )
168                IF( IPIV(I) .GT. 0 ) THEN
169                   IP=IPIV(I)
170                   IF( I .LT. N) THEN
171                   DO J= I+1,N
172                     TEMP=A(IP,J)
173                     A(IP,J)=A(I,J)
174                     A(I,J)=TEMP
175                   END DO
176                   ENDIF
177                ELSE
178                  IP=-IPIV(I)
179                  I=I+1
180                  IF( I .LT. N) THEN
181                     DO J= I+1,N
182                        TEMP=A(IP,J)
183                        A(IP,J)=A(I-1,J)
184                        A(I-1,J)=TEMP
185                     END DO
186                  ENDIF
187                ENDIF
188                I=I+1
189             END DO
190 *
191 *        Revert VALUE
192 *
193             I=N
194             DO WHILE ( I .GT. 1 )
195                IF( IPIV(I) .LT. 0 ) THEN
196                   A(I-1,I)=WORK(I)
197                   I=I-1
198                ENDIF
199                I=I-1
200             END DO
201          END IF
202       ELSE
203 *
204 *      A is LOWER
205 *
206          IF ( CONVERT ) THEN
207 *
208 *      Convert A (A is lower)
209 *
210 *
211 *        Convert VALUE
212 *
213             I=1
214             WORK(N)=ZERO
215             DO WHILE ( I .LE. N )
216                IF( I.LT..AND. IPIV(I) .LT. 0 ) THEN
217                   WORK(I)=A(I+1,I)
218                   A(I+1,I)=ZERO
219                   I=I+1
220                ELSE
221                   WORK(I)=ZERO
222                ENDIF
223                I=I+1
224             END DO
225 *
226 *        Convert PERMUTATIONS
227 *
228          I=1
229          DO WHILE ( I .LE. N )
230             IF( IPIV(I) .GT. 0 ) THEN
231                IP=IPIV(I)
232                IF (I .GT. 1THEN
233                DO 22 J= 1,I-1
234                  TEMP=A(IP,J)
235                  A(IP,J)=A(I,J)
236                  A(I,J)=TEMP
237  22            CONTINUE
238                ENDIF
239             ELSE
240               IP=-IPIV(I)
241               IF (I .GT. 1THEN
242               DO 23 J= 1,I-1
243                  TEMP=A(IP,J)
244                  A(IP,J)=A(I+1,J)
245                  A(I+1,J)=TEMP
246  23           CONTINUE
247               ENDIF
248               I=I+1
249            ENDIF
250            I=I+1
251         END DO
252          ELSE
253 *
254 *      Revert A (A is lower)
255 *
256 *
257 *        Revert PERMUTATIONS
258 *
259             I=N
260             DO WHILE ( I .GE. 1 )
261                IF( IPIV(I) .GT. 0 ) THEN
262                   IP=IPIV(I)
263                   IF (I .GT. 1THEN
264                      DO J= 1,I-1
265                         TEMP=A(I,J)
266                         A(I,J)=A(IP,J)
267                         A(IP,J)=TEMP
268                      END DO
269                   ENDIF
270                ELSE
271                   IP=-IPIV(I)
272                   I=I-1
273                   IF (I .GT. 1THEN
274                      DO J= 1,I-1
275                         TEMP=A(I+1,J)
276                         A(I+1,J)=A(IP,J)
277                         A(IP,J)=TEMP
278                      END DO
279                   ENDIF
280                ENDIF
281                I=I-1
282             END DO
283 *
284 *        Revert VALUE
285 *
286             I=1
287             DO WHILE ( I .LE. N-1 )
288                IF( IPIV(I) .LT. ZERO ) THEN
289                   A(I+1,I)=WORK(I)
290                   I=I+1
291                ENDIF
292                I=I+1
293             END DO
294          END IF
295       END IF
296 
297       RETURN
298 *
299 *     End of DSYCONV
300 *
301       END