LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches

◆ zpftri()

subroutine zpftri ( character transr,
character uplo,
integer n,
complex*16, dimension( 0: * ) a,
integer info )

ZPFTRI

Download ZPFTRI + dependencies [TGZ] [ZIP] [TXT]

Purpose:
!>
!> ZPFTRI computes the inverse of a complex Hermitian positive definite
!> matrix A using the Cholesky factorization A = U**H*U or A = L*L**H
!> computed by ZPFTRF.
!> 
Parameters
[in]TRANSR
!>          TRANSR is CHARACTER*1
!>          = 'N':  The Normal TRANSR of RFP A is stored;
!>          = 'C':  The Conjugate-transpose TRANSR of RFP A is stored.
!> 
[in]UPLO
!>          UPLO is CHARACTER*1
!>          = 'U':  Upper triangle of A is stored;
!>          = 'L':  Lower triangle of A is stored.
!> 
[in]N
!>          N is INTEGER
!>          The order of the matrix A.  N >= 0.
!> 
[in,out]A
!>          A is COMPLEX*16 array, dimension ( N*(N+1)/2 );
!>          On entry, the Hermitian matrix A in RFP format. RFP format is
!>          described by TRANSR, UPLO, and N as follows: If TRANSR = 'N'
!>          then RFP A is (0:N,0:k-1) when N is even; k=N/2. RFP A is
!>          (0:N-1,0:k) when N is odd; k=N/2. IF TRANSR = 'C' then RFP is
!>          the Conjugate-transpose of RFP A as defined when
!>          TRANSR = 'N'. The contents of RFP A are defined by UPLO as
!>          follows: If UPLO = 'U' the RFP A contains the nt elements of
!>          upper packed A. If UPLO = 'L' the RFP A contains the elements
!>          of lower packed A. The LDA of RFP A is (N+1)/2 when TRANSR =
!>          'C'. When TRANSR is 'N' the LDA is N+1 when N is even and N
!>          is odd. See the Note below for more details.
!>
!>          On exit, the Hermitian inverse of the original matrix, in the
!>          same storage format.
!> 
[out]INFO
!>          INFO is INTEGER
!>          = 0:  successful exit
!>          < 0:  if INFO = -i, the i-th argument had an illegal value
!>          > 0:  if INFO = i, the (i,i) element of the factor U or L is
!>                zero, and the inverse could not be computed.
!> 
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Further Details:
!>
!>  We first consider Standard Packed Format when N is even.
!>  We give an example where N = 6.
!>
!>      AP is Upper             AP is Lower
!>
!>   00 01 02 03 04 05       00
!>      11 12 13 14 15       10 11
!>         22 23 24 25       20 21 22
!>            33 34 35       30 31 32 33
!>               44 45       40 41 42 43 44
!>                  55       50 51 52 53 54 55
!>
!>
!>  Let TRANSR = 'N'. RFP holds AP as follows:
!>  For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last
!>  three columns of AP upper. The lower triangle A(4:6,0:2) consists of
!>  conjugate-transpose of the first three columns of AP upper.
!>  For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first
!>  three columns of AP lower. The upper triangle A(0:2,0:2) consists of
!>  conjugate-transpose of the last three columns of AP lower.
!>  To denote conjugate we place -- above the element. This covers the
!>  case N even and TRANSR = 'N'.
!>
!>         RFP A                   RFP A
!>
!>                                -- -- --
!>        03 04 05                33 43 53
!>                                   -- --
!>        13 14 15                00 44 54
!>                                      --
!>        23 24 25                10 11 55
!>
!>        33 34 35                20 21 22
!>        --
!>        00 44 45                30 31 32
!>        -- --
!>        01 11 55                40 41 42
!>        -- -- --
!>        02 12 22                50 51 52
!>
!>  Now let TRANSR = 'C'. RFP A in both UPLO cases is just the conjugate-
!>  transpose of RFP A above. One therefore gets:
!>
!>
!>           RFP A                   RFP A
!>
!>     -- -- -- --                -- -- -- -- -- --
!>     03 13 23 33 00 01 02    33 00 10 20 30 40 50
!>     -- -- -- -- --                -- -- -- -- --
!>     04 14 24 34 44 11 12    43 44 11 21 31 41 51
!>     -- -- -- -- -- --                -- -- -- --
!>     05 15 25 35 45 55 22    53 54 55 22 32 42 52
!>
!>
!>  We next  consider Standard Packed Format when N is odd.
!>  We give an example where N = 5.
!>
!>     AP is Upper                 AP is Lower
!>
!>   00 01 02 03 04              00
!>      11 12 13 14              10 11
!>         22 23 24              20 21 22
!>            33 34              30 31 32 33
!>               44              40 41 42 43 44
!>
!>
!>  Let TRANSR = 'N'. RFP holds AP as follows:
!>  For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last
!>  three columns of AP upper. The lower triangle A(3:4,0:1) consists of
!>  conjugate-transpose of the first two   columns of AP upper.
!>  For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first
!>  three columns of AP lower. The upper triangle A(0:1,1:2) consists of
!>  conjugate-transpose of the last two   columns of AP lower.
!>  To denote conjugate we place -- above the element. This covers the
!>  case N odd  and TRANSR = 'N'.
!>
!>         RFP A                   RFP A
!>
!>                                   -- --
!>        02 03 04                00 33 43
!>                                      --
!>        12 13 14                10 11 44
!>
!>        22 23 24                20 21 22
!>        --
!>        00 33 34                30 31 32
!>        -- --
!>        01 11 44                40 41 42
!>
!>  Now let TRANSR = 'C'. RFP A in both UPLO cases is just the conjugate-
!>  transpose of RFP A above. One therefore gets:
!>
!>
!>           RFP A                   RFP A
!>
!>     -- -- --                   -- -- -- -- -- --
!>     02 12 22 00 01             00 10 20 30 40 50
!>     -- -- -- --                   -- -- -- -- --
!>     03 13 23 33 11             33 11 21 31 41 51
!>     -- -- -- -- --                   -- -- -- --
!>     04 14 24 34 44             43 44 22 32 42 52
!> 

Definition at line 209 of file zpftri.f.

210*
211* -- LAPACK computational routine --
212* -- LAPACK is a software package provided by Univ. of Tennessee, --
213* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
214*
215* .. Scalar Arguments ..
216 CHARACTER TRANSR, UPLO
217 INTEGER INFO, N
218* .. Array Arguments ..
219 COMPLEX*16 A( 0: * )
220* ..
221*
222* =====================================================================
223*
224* .. Parameters ..
225 DOUBLE PRECISION ONE
226 COMPLEX*16 CONE
227 parameter( one = 1.d0, cone = ( 1.d0, 0.d0 ) )
228* ..
229* .. Local Scalars ..
230 LOGICAL LOWER, NISODD, NORMALTRANSR
231 INTEGER N1, N2, K
232* ..
233* .. External Functions ..
234 LOGICAL LSAME
235 EXTERNAL lsame
236* ..
237* .. External Subroutines ..
238 EXTERNAL xerbla, ztftri, zlauum, ztrmm,
239 $ zherk
240* ..
241* .. Intrinsic Functions ..
242 INTRINSIC mod
243* ..
244* .. Executable Statements ..
245*
246* Test the input parameters.
247*
248 info = 0
249 normaltransr = lsame( transr, 'N' )
250 lower = lsame( uplo, 'L' )
251 IF( .NOT.normaltransr .AND. .NOT.lsame( transr, 'C' ) ) THEN
252 info = -1
253 ELSE IF( .NOT.lower .AND. .NOT.lsame( uplo, 'U' ) ) THEN
254 info = -2
255 ELSE IF( n.LT.0 ) THEN
256 info = -3
257 END IF
258 IF( info.NE.0 ) THEN
259 CALL xerbla( 'ZPFTRI', -info )
260 RETURN
261 END IF
262*
263* Quick return if possible
264*
265 IF( n.EQ.0 )
266 $ RETURN
267*
268* Invert the triangular Cholesky factor U or L.
269*
270 CALL ztftri( transr, uplo, 'N', n, a, info )
271 IF( info.GT.0 )
272 $ RETURN
273*
274* If N is odd, set NISODD = .TRUE.
275* If N is even, set K = N/2 and NISODD = .FALSE.
276*
277 IF( mod( n, 2 ).EQ.0 ) THEN
278 k = n / 2
279 nisodd = .false.
280 ELSE
281 nisodd = .true.
282 END IF
283*
284* Set N1 and N2 depending on LOWER
285*
286 IF( lower ) THEN
287 n2 = n / 2
288 n1 = n - n2
289 ELSE
290 n1 = n / 2
291 n2 = n - n1
292 END IF
293*
294* Start execution of triangular matrix multiply: inv(U)*inv(U)^C or
295* inv(L)^C*inv(L). There are eight cases.
296*
297 IF( nisodd ) THEN
298*
299* N is odd
300*
301 IF( normaltransr ) THEN
302*
303* N is odd and TRANSR = 'N'
304*
305 IF( lower ) THEN
306*
307* SRPA for LOWER, NORMAL and N is odd ( a(0:n-1,0:N1-1) )
308* T1 -> a(0,0), T2 -> a(0,1), S -> a(N1,0)
309* T1 -> a(0), T2 -> a(n), S -> a(N1)
310*
311 CALL zlauum( 'L', n1, a( 0 ), n, info )
312 CALL zherk( 'L', 'C', n1, n2, one, a( n1 ), n, one,
313 $ a( 0 ), n )
314 CALL ztrmm( 'L', 'U', 'N', 'N', n2, n1, cone, a( n ),
315 $ n,
316 $ a( n1 ), n )
317 CALL zlauum( 'U', n2, a( n ), n, info )
318*
319 ELSE
320*
321* SRPA for UPPER, NORMAL and N is odd ( a(0:n-1,0:N2-1)
322* T1 -> a(N1+1,0), T2 -> a(N1,0), S -> a(0,0)
323* T1 -> a(N2), T2 -> a(N1), S -> a(0)
324*
325 CALL zlauum( 'L', n1, a( n2 ), n, info )
326 CALL zherk( 'L', 'N', n1, n2, one, a( 0 ), n, one,
327 $ a( n2 ), n )
328 CALL ztrmm( 'R', 'U', 'C', 'N', n1, n2, cone, a( n1 ),
329 $ n,
330 $ a( 0 ), n )
331 CALL zlauum( 'U', n2, a( n1 ), n, info )
332*
333 END IF
334*
335 ELSE
336*
337* N is odd and TRANSR = 'C'
338*
339 IF( lower ) THEN
340*
341* SRPA for LOWER, TRANSPOSE, and N is odd
342* T1 -> a(0), T2 -> a(1), S -> a(0+N1*N1)
343*
344 CALL zlauum( 'U', n1, a( 0 ), n1, info )
345 CALL zherk( 'U', 'N', n1, n2, one, a( n1*n1 ), n1,
346 $ one,
347 $ a( 0 ), n1 )
348 CALL ztrmm( 'R', 'L', 'N', 'N', n1, n2, cone, a( 1 ),
349 $ n1,
350 $ a( n1*n1 ), n1 )
351 CALL zlauum( 'L', n2, a( 1 ), n1, info )
352*
353 ELSE
354*
355* SRPA for UPPER, TRANSPOSE, and N is odd
356* T1 -> a(0+N2*N2), T2 -> a(0+N1*N2), S -> a(0)
357*
358 CALL zlauum( 'U', n1, a( n2*n2 ), n2, info )
359 CALL zherk( 'U', 'C', n1, n2, one, a( 0 ), n2, one,
360 $ a( n2*n2 ), n2 )
361 CALL ztrmm( 'L', 'L', 'C', 'N', n2, n1, cone,
362 $ a( n1*n2 ),
363 $ n2, a( 0 ), n2 )
364 CALL zlauum( 'L', n2, a( n1*n2 ), n2, info )
365*
366 END IF
367*
368 END IF
369*
370 ELSE
371*
372* N is even
373*
374 IF( normaltransr ) THEN
375*
376* N is even and TRANSR = 'N'
377*
378 IF( lower ) THEN
379*
380* SRPA for LOWER, NORMAL, and N is even ( a(0:n,0:k-1) )
381* T1 -> a(1,0), T2 -> a(0,0), S -> a(k+1,0)
382* T1 -> a(1), T2 -> a(0), S -> a(k+1)
383*
384 CALL zlauum( 'L', k, a( 1 ), n+1, info )
385 CALL zherk( 'L', 'C', k, k, one, a( k+1 ), n+1, one,
386 $ a( 1 ), n+1 )
387 CALL ztrmm( 'L', 'U', 'N', 'N', k, k, cone, a( 0 ),
388 $ n+1,
389 $ a( k+1 ), n+1 )
390 CALL zlauum( 'U', k, a( 0 ), n+1, info )
391*
392 ELSE
393*
394* SRPA for UPPER, NORMAL, and N is even ( a(0:n,0:k-1) )
395* T1 -> a(k+1,0) , T2 -> a(k,0), S -> a(0,0)
396* T1 -> a(k+1), T2 -> a(k), S -> a(0)
397*
398 CALL zlauum( 'L', k, a( k+1 ), n+1, info )
399 CALL zherk( 'L', 'N', k, k, one, a( 0 ), n+1, one,
400 $ a( k+1 ), n+1 )
401 CALL ztrmm( 'R', 'U', 'C', 'N', k, k, cone, a( k ),
402 $ n+1,
403 $ a( 0 ), n+1 )
404 CALL zlauum( 'U', k, a( k ), n+1, info )
405*
406 END IF
407*
408 ELSE
409*
410* N is even and TRANSR = 'C'
411*
412 IF( lower ) THEN
413*
414* SRPA for LOWER, TRANSPOSE, and N is even (see paper)
415* T1 -> B(0,1), T2 -> B(0,0), S -> B(0,k+1),
416* T1 -> a(0+k), T2 -> a(0+0), S -> a(0+k*(k+1)); lda=k
417*
418 CALL zlauum( 'U', k, a( k ), k, info )
419 CALL zherk( 'U', 'N', k, k, one, a( k*( k+1 ) ), k,
420 $ one,
421 $ a( k ), k )
422 CALL ztrmm( 'R', 'L', 'N', 'N', k, k, cone, a( 0 ), k,
423 $ a( k*( k+1 ) ), k )
424 CALL zlauum( 'L', k, a( 0 ), k, info )
425*
426 ELSE
427*
428* SRPA for UPPER, TRANSPOSE, and N is even (see paper)
429* T1 -> B(0,k+1), T2 -> B(0,k), S -> B(0,0),
430* T1 -> a(0+k*(k+1)), T2 -> a(0+k*k), S -> a(0+0)); lda=k
431*
432 CALL zlauum( 'U', k, a( k*( k+1 ) ), k, info )
433 CALL zherk( 'U', 'C', k, k, one, a( 0 ), k, one,
434 $ a( k*( k+1 ) ), k )
435 CALL ztrmm( 'L', 'L', 'C', 'N', k, k, cone, a( k*k ),
436 $ k,
437 $ a( 0 ), k )
438 CALL zlauum( 'L', k, a( k*k ), k, info )
439*
440 END IF
441*
442 END IF
443*
444 END IF
445*
446 RETURN
447*
448* End of ZPFTRI
449*
subroutine xerbla(srname, info)
Definition cblat2.f:3285
subroutine zherk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
ZHERK
Definition zherk.f:173
subroutine zlauum(uplo, n, a, lda, info)
ZLAUUM computes the product UUH or LHL, where U and L are upper or lower triangular matrices (blocked...
Definition zlauum.f:100
logical function lsame(ca, cb)
LSAME
Definition lsame.f:48
subroutine ztftri(transr, uplo, diag, n, a, info)
ZTFTRI
Definition ztftri.f:219
subroutine ztrmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
ZTRMM
Definition ztrmm.f:177
Here is the call graph for this function:
Here is the caller graph for this function: