 LAPACK  3.10.1 LAPACK: Linear Algebra PACKage

## ◆ zhetrs_3()

 subroutine zhetrs_3 ( character UPLO, integer N, integer NRHS, complex*16, dimension( lda, * ) A, integer LDA, complex*16, dimension( * ) E, integer, dimension( * ) IPIV, complex*16, dimension( ldb, * ) B, integer LDB, integer INFO )

ZHETRS_3

Purpose:
``` ZHETRS_3 solves a system of linear equations A * X = B with a complex
Hermitian matrix A using the factorization computed
by ZHETRF_RK or ZHETRF_BK:

A = P*U*D*(U**H)*(P**T) or A = P*L*D*(L**H)*(P**T),

where U (or L) is unit upper (or lower) triangular matrix,
U**H (or L**H) is the conjugate of U (or L), P is a permutation
matrix, P**T is the transpose of P, and D is Hermitian and block
diagonal with 1-by-1 and 2-by-2 diagonal blocks.

This algorithm is using Level 3 BLAS.```
Parameters
 [in] UPLO ``` UPLO is CHARACTER*1 Specifies whether the details of the factorization are stored as an upper or lower triangular matrix: = 'U': Upper triangular, form is A = P*U*D*(U**H)*(P**T); = 'L': Lower triangular, form is A = P*L*D*(L**H)*(P**T).``` [in] N ``` N is INTEGER The order of the matrix A. N >= 0.``` [in] NRHS ``` NRHS is INTEGER The number of right hand sides, i.e., the number of columns of the matrix B. NRHS >= 0.``` [in] A ``` A is COMPLEX*16 array, dimension (LDA,N) Diagonal of the block diagonal matrix D and factors U or L as computed by ZHETRF_RK and ZHETRF_BK: a) ONLY diagonal elements of the Hermitian block diagonal matrix D on the diagonal of A, i.e. D(k,k) = A(k,k); (superdiagonal (or subdiagonal) elements of D should be provided on entry in array E), and b) If UPLO = 'U': factor U in the superdiagonal part of A. If UPLO = 'L': factor L in the subdiagonal part of A.``` [in] LDA ``` LDA is INTEGER The leading dimension of the array A. LDA >= max(1,N).``` [in] E ``` E is COMPLEX*16 array, dimension (N) On entry, contains the superdiagonal (or subdiagonal) elements of the Hermitian block diagonal matrix D with 1-by-1 or 2-by-2 diagonal blocks, where If UPLO = 'U': E(i) = D(i-1,i),i=2:N, E(1) not referenced; If UPLO = 'L': E(i) = D(i+1,i),i=1:N-1, E(N) not referenced. NOTE: For 1-by-1 diagonal block D(k), where 1 <= k <= N, the element E(k) is not referenced in both UPLO = 'U' or UPLO = 'L' cases.``` [in] IPIV ``` IPIV is INTEGER array, dimension (N) Details of the interchanges and the block structure of D as determined by ZHETRF_RK or ZHETRF_BK.``` [in,out] B ``` B is COMPLEX*16 array, dimension (LDB,NRHS) On entry, the right hand side matrix B. On exit, the solution matrix X.``` [in] LDB ``` LDB is INTEGER The leading dimension of the array B. LDB >= max(1,N).``` [out] INFO ``` INFO is INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value```
Contributors:
```  June 2017,  Igor Kozachenko,
Computer Science Division,
University of California, Berkeley

September 2007, Sven Hammarling, Nicholas J. Higham, Craig Lucas,
School of Mathematics,
University of Manchester```

Definition at line 163 of file zhetrs_3.f.

165 *
166 * -- LAPACK computational routine --
167 * -- LAPACK is a software package provided by Univ. of Tennessee, --
168 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
169 *
170 * .. Scalar Arguments ..
171  CHARACTER UPLO
172  INTEGER INFO, LDA, LDB, N, NRHS
173 * ..
174 * .. Array Arguments ..
175  INTEGER IPIV( * )
176  COMPLEX*16 A( LDA, * ), B( LDB, * ), E( * )
177 * ..
178 *
179 * =====================================================================
180 *
181 * .. Parameters ..
182  COMPLEX*16 ONE
183  parameter( one = ( 1.0d+0,0.0d+0 ) )
184 * ..
185 * .. Local Scalars ..
186  LOGICAL UPPER
187  INTEGER I, J, K, KP
188  DOUBLE PRECISION S
189  COMPLEX*16 AK, AKM1, AKM1K, BK, BKM1, DENOM
190 * ..
191 * .. External Functions ..
192  LOGICAL LSAME
193  EXTERNAL lsame
194 * ..
195 * .. External Subroutines ..
196  EXTERNAL zdscal, zswap, ztrsm, xerbla
197 * ..
198 * .. Intrinsic Functions ..
199  INTRINSIC abs, dble, dconjg, max
200 * ..
201 * .. Executable Statements ..
202 *
203  info = 0
204  upper = lsame( uplo, 'U' )
205  IF( .NOT.upper .AND. .NOT.lsame( uplo, 'L' ) ) THEN
206  info = -1
207  ELSE IF( n.LT.0 ) THEN
208  info = -2
209  ELSE IF( nrhs.LT.0 ) THEN
210  info = -3
211  ELSE IF( lda.LT.max( 1, n ) ) THEN
212  info = -5
213  ELSE IF( ldb.LT.max( 1, n ) ) THEN
214  info = -9
215  END IF
216  IF( info.NE.0 ) THEN
217  CALL xerbla( 'ZHETRS_3', -info )
218  RETURN
219  END IF
220 *
221 * Quick return if possible
222 *
223  IF( n.EQ.0 .OR. nrhs.EQ.0 )
224  \$ RETURN
225 *
226  IF( upper ) THEN
227 *
228 * Begin Upper
229 *
230 * Solve A*X = B, where A = U*D*U**H.
231 *
232 * P**T * B
233 *
234 * Interchange rows K and IPIV(K) of matrix B in the same order
235 * that the formation order of IPIV(I) vector for Upper case.
236 *
237 * (We can do the simple loop over IPIV with decrement -1,
238 * since the ABS value of IPIV(I) represents the row index
239 * of the interchange with row i in both 1x1 and 2x2 pivot cases)
240 *
241  DO k = n, 1, -1
242  kp = abs( ipiv( k ) )
243  IF( kp.NE.k ) THEN
244  CALL zswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
245  END IF
246  END DO
247 *
248 * Compute (U \P**T * B) -> B [ (U \P**T * B) ]
249 *
250  CALL ztrsm( 'L', 'U', 'N', 'U', n, nrhs, one, a, lda, b, ldb )
251 *
252 * Compute D \ B -> B [ D \ (U \P**T * B) ]
253 *
254  i = n
255  DO WHILE ( i.GE.1 )
256  IF( ipiv( i ).GT.0 ) THEN
257  s = dble( one ) / dble( a( i, i ) )
258  CALL zdscal( nrhs, s, b( i, 1 ), ldb )
259  ELSE IF ( i.GT.1 ) THEN
260  akm1k = e( i )
261  akm1 = a( i-1, i-1 ) / akm1k
262  ak = a( i, i ) / dconjg( akm1k )
263  denom = akm1*ak - one
264  DO j = 1, nrhs
265  bkm1 = b( i-1, j ) / akm1k
266  bk = b( i, j ) / dconjg( akm1k )
267  b( i-1, j ) = ( ak*bkm1-bk ) / denom
268  b( i, j ) = ( akm1*bk-bkm1 ) / denom
269  END DO
270  i = i - 1
271  END IF
272  i = i - 1
273  END DO
274 *
275 * Compute (U**H \ B) -> B [ U**H \ (D \ (U \P**T * B) ) ]
276 *
277  CALL ztrsm( 'L', 'U', 'C', 'U', n, nrhs, one, a, lda, b, ldb )
278 *
279 * P * B [ P * (U**H \ (D \ (U \P**T * B) )) ]
280 *
281 * Interchange rows K and IPIV(K) of matrix B in reverse order
282 * from the formation order of IPIV(I) vector for Upper case.
283 *
284 * (We can do the simple loop over IPIV with increment 1,
285 * since the ABS value of IPIV(I) represents the row index
286 * of the interchange with row i in both 1x1 and 2x2 pivot cases)
287 *
288  DO k = 1, n, 1
289  kp = abs( ipiv( k ) )
290  IF( kp.NE.k ) THEN
291  CALL zswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
292  END IF
293  END DO
294 *
295  ELSE
296 *
297 * Begin Lower
298 *
299 * Solve A*X = B, where A = L*D*L**H.
300 *
301 * P**T * B
302 * Interchange rows K and IPIV(K) of matrix B in the same order
303 * that the formation order of IPIV(I) vector for Lower case.
304 *
305 * (We can do the simple loop over IPIV with increment 1,
306 * since the ABS value of IPIV(I) represents the row index
307 * of the interchange with row i in both 1x1 and 2x2 pivot cases)
308 *
309  DO k = 1, n, 1
310  kp = abs( ipiv( k ) )
311  IF( kp.NE.k ) THEN
312  CALL zswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
313  END IF
314  END DO
315 *
316 * Compute (L \P**T * B) -> B [ (L \P**T * B) ]
317 *
318  CALL ztrsm( 'L', 'L', 'N', 'U', n, nrhs, one, a, lda, b, ldb )
319 *
320 * Compute D \ B -> B [ D \ (L \P**T * B) ]
321 *
322  i = 1
323  DO WHILE ( i.LE.n )
324  IF( ipiv( i ).GT.0 ) THEN
325  s = dble( one ) / dble( a( i, i ) )
326  CALL zdscal( nrhs, s, b( i, 1 ), ldb )
327  ELSE IF( i.LT.n ) THEN
328  akm1k = e( i )
329  akm1 = a( i, i ) / dconjg( akm1k )
330  ak = a( i+1, i+1 ) / akm1k
331  denom = akm1*ak - one
332  DO j = 1, nrhs
333  bkm1 = b( i, j ) / dconjg( akm1k )
334  bk = b( i+1, j ) / akm1k
335  b( i, j ) = ( ak*bkm1-bk ) / denom
336  b( i+1, j ) = ( akm1*bk-bkm1 ) / denom
337  END DO
338  i = i + 1
339  END IF
340  i = i + 1
341  END DO
342 *
343 * Compute (L**H \ B) -> B [ L**H \ (D \ (L \P**T * B) ) ]
344 *
345  CALL ztrsm('L', 'L', 'C', 'U', n, nrhs, one, a, lda, b, ldb )
346 *
347 * P * B [ P * (L**H \ (D \ (L \P**T * B) )) ]
348 *
349 * Interchange rows K and IPIV(K) of matrix B in reverse order
350 * from the formation order of IPIV(I) vector for Lower case.
351 *
352 * (We can do the simple loop over IPIV with decrement -1,
353 * since the ABS value of IPIV(I) represents the row index
354 * of the interchange with row i in both 1x1 and 2x2 pivot cases)
355 *
356  DO k = n, 1, -1
357  kp = abs( ipiv( k ) )
358  IF( kp.NE.k ) THEN
359  CALL zswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
360  END IF
361  END DO
362 *
363 * END Lower
364 *
365  END IF
366 *
367  RETURN
368 *
369 * End of ZHETRS_3
370 *
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:60
logical function lsame(CA, CB)
LSAME
Definition: lsame.f:53
subroutine zswap(N, ZX, INCX, ZY, INCY)
ZSWAP
Definition: zswap.f:81
subroutine zdscal(N, DA, ZX, INCX)
ZDSCAL
Definition: zdscal.f:78
subroutine ztrsm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
ZTRSM
Definition: ztrsm.f:180
Here is the call graph for this function:
Here is the caller graph for this function: