# p?dttrsv

Computes an LU factorization of a general band matrix, using partial pivoting with row interchanges. The routine is called by p?dttrs.

## Syntax

call psdttrsv(uplo, trans, n, nrhs, dl, d, du, ja, desca, b, ib, descb, af, laf, work, lwork, info)

call pddttrsv(uplo, trans, n, nrhs, dl, d, du, ja, desca, b, ib, descb, af, laf, work, lwork, info)

call pcdttrsv(uplo, trans, n, nrhs, dl, d, du, ja, desca, b, ib, descb, af, laf, work, lwork, info)

call pzdttrsv(uplo, trans, n, nrhs, dl, d, du, ja, desca, b, ib, descb, af, laf, work, lwork, info)

## Description

This routine solves a tridiagonal triangular system of linear equations

`A(1 :n, `ja:ja+n-1)`*X = B(ib:ib+n-1, 1 :nrhs)` or

`A(1 :n, `ja:ja+n-1)`T * X = B(ib:ib+n-1, 1 :nrhs)` for real flavors; `A(1 :n, `ja:ja+n-1)`H * X = B(ib:ib+n-1, 1 :nrhs)` for complex flavors,

where `A(1 :n, `ja:ja+n-1)`` is a tridiagonal matrix factor produced by the Gaussian elimination code PS@(dom_pre)TTRF and is stored in `A(1 :n, `ja:ja+n-1)`` and af.

The matrix stored in `A(1 :n, `ja:ja+n-1)`` is either upper or lower triangular according to uplo, and the choice of solving `A(1 :n, `ja:ja+n-1)`` or `A(1 :n, `ja:ja+n-1)`T` is dictated by the user by the parameter trans.

Routine p?dttrf must be called first.

## Input Parameters

uplo

  (global) CHARACTER.

  If `uplo='U'`, the upper triangle of `A(1:n, `ja:ja+n-1)`` is stored,

  if `uplo = 'L'`, the lower triangle of A(1:n, `ja:ja+n-1)` is stored.

trans

  (global) CHARACTER.

  If `trans = 'N'`, solve with `A(1:n, `ja:ja+n-1)``,

  if `trans = 'C'`, solve with conjugate transpose `A(1:n, `ja:ja+n-1)``.

n

  (global) INTEGER. The order of the distributed submatrix `A;(n≥ 0)`.

nrhs

  (global) INTEGER. The number of right-hand sides; the number of columns of the distributed submatrix `B(ib:ib+n-1, 1:nrhs)`. `(nrhs≥ 0)`.

dl

  (local).

  REAL for psdttrsv

  DOUBLE PRECISION for pddttrsv

  COMPLEX for pcdttrsv

  COMPLEX*16 for pzdttrsv.

  Pointer to local part of global vector storing the lower diagonal of the matrix.

  Globally, `dl(1)` is not referenced, and dl must be aligned with d.

  Must be of size `≥desca( nb_ ).`

d

  (local).

  REAL for psdttrsv

  DOUBLE PRECISION for pddttrsv

  COMPLEX for pcdttrsv

  COMPLEX*16 for pzdttrsv.

  Pointer to local part of global vector storing the main diagonal of the matrix.

du

  (local).

  REAL for psdttrsv

  DOUBLE PRECISION for pddttrsv

  COMPLEX for pcdttrsv

  COMPLEX*16 for pzdttrsv.

  Pointer to local part of global vector storing the upper diagonal of the matrix.

  Globally, du(n) is not referenced, and du must be aligned with d.

ja

  (global) INTEGER. The index in the global array a that points to the start of the matrix to be operated on (which may be either all of A or a submatrix of A).

desca

  (global and local). INTEGER array of DIMENSION (dlen_).

  if 1d type `(dtype_a = 501 or 502)`, `dlen≥ 7`;

  if 2d type `(dtype_a = 1)`, `dlen≥ 9`.

  The array descriptor for the distributed matrix A. Contains information of mapping of A to memory.

b

  (local)

  REAL for psdttrsv

  DOUBLE PRECISION for pddttrsv

  COMPLEX for pcdttrsv

  COMPLEX*16 for pzdttrsv.

  Pointer into the local memory to an array of local lead DIMENSION lld_b≥nb. On entry, this array contains the local pieces of the right-hand sides `B(ib:ib+n-1, 1 :nrhs)`.

ib

  (global). INTEGER. The row index in the global array b that points to the first row of the matrix to be operated on (which may be either all of b or a submatrix of B).

descb

  (global and local).INTEGER array of DIMENSION (dlen_).

  if 1d type `(dtype_b = 502)`, `dlen≥7`;

  if 2d type `(dtype_b = 1)`, `dlen≥ 9`.

  The array descriptor for the distributed matrix B. Contains information of mapping B to memory.

laf

  (local).

  INTEGER.

  Size of user-input Auxiliary Filling space af.

  laf must be `≥ 2*(nb+2)`. If laf is not large enough, an error code is returned and the minimum acceptable size will be returned in `af(1)`.

work

  (local).

  REAL for psdttrsv

  DOUBLE PRECISION for pddttrsv

  COMPLEX for pcdttrsv

  COMPLEX*16 for pzdttrsv.

  Temporary workspace. This space may be overwritten in between calls to routines.

  work must be the size given in lwork.

lwork

  (local or global).INTEGER.

  Size of user-input workspace work. If lwork is too small, the minimal acceptable size will be returned in `work(1)` and an error code is returned.

  `lwork≥ 10*npcol+4*nrhs`.

## Output Parameters

dl

  (local).

  On exit, this array contains information containing the factors of the matrix.

d

  On exit, this array contains information containing the factors of the matrix. Must be of size ≥desca (nb_ ).

b

  On exit, this contains the local piece of the solutions distributed matrix X.

af

  (local).

  REAL for psdttrsv

  DOUBLE PRECISION for pddttrsv

  COMPLEX for pcdttrsv

  COMPLEX*16 for pzdttrsv.

  Auxiliary Filling Space. Filling is created during the factorization routine p?dttrf and this is stored in af. If a linear system is to be solved using p?dttrs after the factorization routine, af must not be altered after the factorization.

work

  On exit, `work(1)` contains the minimal lwork.

info

  (local). INTEGER.

  If info=0, the execution is successful.

  if info< 0: If the i-th argument is an array and the j-entry had an illegal value, then info = - (i*100+j), if the i-th argument is a scalar and had an illegal value, then `info = -i`.

Parent topic: Auxiliary Routines