Lots of trailing whitespaces in the files of Syd. Cleaning this. No big deal.
[platform/upstream/lapack.git] / SRC / zhetrs_aasen.f
1 *> \brief \b ZHETRS_AASEN
2 *
3 *  =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 *            http://www.netlib.org/lapack/explore-html/
7 *
8 *> \htmlonly
9 *> Download ZHETRS_AASEN + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zhetrs_aasen.f">
11 *> [TGZ]</a>
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zhetrs_aasen.f">
13 *> [ZIP]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zhetrs_aasen.f">
15 *> [TXT]</a>
16 *> \endhtmlonly
17 *
18 *  Definition:
19 *  ===========
20 *
21 *       SUBROUTINE ZHETRS_AASEN( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
22 *                                WORK, LWORK, INFO )
23 *
24 *       .. Scalar Arguments ..
25 *       CHARACTER          UPLO
26 *       INTEGER            N, NRHS, LDA, LDB, LWORK, INFO
27 *       ..
28 *       .. Array Arguments ..
29 *       INTEGER            IPIV( * )
30 *       COMPLEX*16   A( LDA, * ), B( LDB, * ), WORK( * )
31 *       ..
32 *
33 *
34 *> \par Purpose:
35 *  =============
36 *>
37 *> \verbatim
38 *>
39 *> ZHETRS_AASEN solves a system of linear equations A*X = B with a real
40 *> hermitian matrix A using the factorization A = U*T*U**T or
41 *> A = L*T*L**T computed by ZHETRF_AASEN.
42 *> \endverbatim
43 *
44 *  Arguments:
45 *  ==========
46 *
47 *> \param[in] UPLO
48 *> \verbatim
49 *>          UPLO is CHARACTER*1
50 *>          Specifies whether the details of the factorization are stored
51 *>          as an upper or lower triangular matrix.
52 *>          = 'U':  Upper triangular, form is A = U*T*U**T;
53 *>          = 'L':  Lower triangular, form is A = L*T*L**T.
54 *> \endverbatim
55 *>
56 *> \param[in] N
57 *> \verbatim
58 *>          N is INTEGER
59 *>          The order of the matrix A.  N >= 0.
60 *> \endverbatim
61 *>
62 *> \param[in] NRHS
63 *> \verbatim
64 *>          NRHS is INTEGER
65 *>          The number of right hand sides, i.e., the number of columns
66 *>          of the matrix B.  NRHS >= 0.
67 *> \endverbatim
68 *>
69 *> \param[in,out] A
70 *> \verbatim
71 *>          A is COMPLEX*16 array, dimension (LDA,N)
72 *>          Details of factors computed by ZHETRF_AASEN.
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 as computed by ZHETRF_AASEN.
85 *> \endverbatim
86 *>
87 *> \param[in,out] B
88 *> \verbatim
89 *>          B is COMPLEX*16 array, dimension (LDB,NRHS)
90 *>          On entry, the right hand side matrix B.
91 *>          On exit, the solution matrix X.
92 *> \endverbatim
93 *>
94 *> \param[in] LDB
95 *> \verbatim
96 *>          LDB is INTEGER
97 *>          The leading dimension of the array B.  LDB >= max(1,N).
98 *> \endverbatim
99 *>
100 *> \param[in] WORK
101 *> \verbatim
102 *>          WORK is DOUBLE array, dimension (MAX(1,LWORK))
103 *> \endverbatim
104 *>
105 *> \param[in] LWORK
106 *> \verbatim
107 *>          LWORK is INTEGER, LWORK >= 3*N-2.
108 *>
109 *> \param[out] INFO
110 *> \verbatim
111 *>          INFO is INTEGER
112 *>          = 0:  successful exit
113 *>          < 0:  if INFO = -i, the i-th argument had an illegal value
114 *> \endverbatim
115 *
116 *  Authors:
117 *  ========
118 *
119 *> \author Univ. of Tennessee
120 *> \author Univ. of California Berkeley
121 *> \author Univ. of Colorado Denver
122 *> \author NAG Ltd.
123 *
124 *> \date November 2016
125 *
126 *> \ingroup complex16SYcomputational
127 *
128 *  @precisions fortran z -> c
129 *
130 *  =====================================================================
131       SUBROUTINE ZHETRS_AASEN( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
132      $                         WORK, LWORK, INFO )
133 *
134 *  -- LAPACK computational routine (version 3.4.0) --
135 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
136 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
137 *     November 2016
138 *
139       IMPLICIT NONE
140 *
141 *     .. Scalar Arguments ..
142       CHARACTER          UPLO
143       INTEGER            N, NRHS, LDA, LDB, LWORK, INFO
144 *     ..
145 *     .. Array Arguments ..
146       INTEGER            IPIV( * )
147       COMPLEX*16   A( LDA, * ), B( LDB, * ), WORK( * )
148 *     ..
149 *
150 *  =====================================================================
151 *
152       COMPLEX*16   ONE
153       PARAMETER          ( ONE = 1.0D+0 )
154 *     ..
155 *     .. Local Scalars ..
156       LOGICAL            UPPER
157       INTEGER            K, KP
158 *     ..
159 *     .. External Functions ..
160       LOGICAL            LSAME
161       EXTERNAL           LSAME
162 *     ..
163 *     .. External Subroutines ..
164       EXTERNAL           ZGTSV, ZSWAP, ZTRSM, XERBLA
165 *     ..
166 *     .. Intrinsic Functions ..
167       INTRINSIC          MAX
168 *     ..
169 *     .. Executable Statements ..
170 *
171       INFO = 0
172       UPPER = LSAME( UPLO, 'U' )
173       IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
174          INFO = -1
175       ELSE IF( N.LT.0 ) THEN
176          INFO = -2
177       ELSE IF( NRHS.LT.0 ) THEN
178          INFO = -3
179       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
180          INFO = -5
181       ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
182          INFO = -8
183       ELSE IF( LWORK.LT.(3*N-2) ) THEN
184          INFO = -10
185       END IF
186       IF( INFO.NE.0 ) THEN
187          CALL XERBLA( 'ZHETRS_AASEN', -INFO )
188          RETURN
189       END IF
190 *
191 *     Quick return if possible
192 *
193       IF( N.EQ.0 .OR. NRHS.EQ.0 )
194      $   RETURN
195 *
196       IF( UPPER ) THEN
197 *
198 *        Solve A*X = B, where A = U*T*U**T.
199 *
200 *        Pivot, P**T * B
201 *
202          DO K = 1, N
203             KP = IPIV( K )
204             IF( KP.NE.K )
205      $          CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
206          END DO
207 *
208 *        Compute (U \P**T * B) -> B    [ (U \P**T * B) ]
209 *
210          CALL ZTRSM('L', 'U', 'C', 'U', N-1, NRHS, ONE, A( 1, 2 ), LDA,
211      $               B( 2, 1 ), LDB)
212 *
213 *        Compute T \ B -> B   [ T \ (U \P**T * B) ]
214 *
215          CALL ZLACPY( 'F', 1, N, A(1, 1), LDA+1, WORK(N), 1)
216          IF( N.GT.1 ) THEN
217              CALL ZLACPY( 'F', 1, N-1, A( 1, 2 ), LDA+1, WORK( 2*N ), 1)
218              CALL ZLACPY( 'F', 1, N-1, A( 1, 2 ), LDA+1, WORK( 1 ), 1)
219              CALL ZLACGV( N-1, WORK( 1 ), 1 )
220          END IF
221          CALL ZGTSV(N, NRHS, WORK(1), WORK(N), WORK(2*N), B, LDB,
222      $              INFO)
223 *
224 *        Compute (U**T \ B) -> B   [ U**T \ (T \ (U \P**T * B) ) ]
225 *
226          CALL ZTRSM( 'L', 'U', 'N', 'U', N-1, NRHS, ONE, A( 1, 2 ), LDA,
227      $               B(2, 1), LDB)
228 *
229 *        Pivot, P * B  [ P * (U**T \ (T \ (U \P**T * B) )) ]
230 *
231          DO K = N, 1, -1
232             KP = IPIV( K )
233             IF( KP.NE.K )
234      $         CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
235          END DO
236 *
237       ELSE
238 *
239 *        Solve A*X = B, where A = L*T*L**T.
240 *
241 *        Pivot, P**T * B
242 *
243          DO K = 1, N
244             KP = IPIV( K )
245             IF( KP.NE.K )
246      $         CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
247          END DO
248 *
249 *        Compute (L \P**T * B) -> B    [ (L \P**T * B) ]
250 *
251          CALL ZTRSM( 'L', 'L', 'N', 'U', N-1, NRHS, ONE, A( 2, 1 ), LDA,
252      $               B(2, 1), LDB)
253 *
254 *        Compute T \ B -> B   [ T \ (L \P**T * B) ]
255 *
256          CALL ZLACPY( 'F', 1, N, A(1, 1), LDA+1, WORK(N), 1)
257          IF( N.GT.1 ) THEN
258              CALL ZLACPY( 'F', 1, N-1, A( 2, 1 ), LDA+1, WORK( 1 ), 1)
259              CALL ZLACPY( 'F', 1, N-1, A( 2, 1 ), LDA+1, WORK( 2*N ), 1)
260              CALL ZLACGV( N-1, WORK( 2*N ), 1 )
261          END IF
262          CALL ZGTSV(N, NRHS, WORK(1), WORK(N), WORK(2*N), B, LDB,
263      $              INFO)
264 *
265 *        Compute (L**T \ B) -> B   [ L**T \ (T \ (L \P**T * B) ) ]
266 *
267          CALL ZTRSM( 'L', 'L', 'C', 'U', N-1, NRHS, ONE, A( 2, 1 ), LDA,
268      $              B( 2, 1 ), LDB)
269 *
270 *        Pivot, P * B  [ P * (L**T \ (T \ (L \P**T * B) )) ]
271 *
272          DO K = N, 1, -1
273             KP = IPIV( K )
274             IF( KP.NE.K )
275      $         CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
276          END DO
277 *
278       END IF
279 *
280       RETURN
281 *
282 *     End of ZHETRS_AASEN
283 *
284       END