IBM Books

Engineering and Scientific Subroutine Library for AIX Version 3 Release 3: Guide and Reference

DBSTRF--Symmetric Indefinite Matrix Factorization

DBSTRF factors a real symmetric indefinite matrix A. The matrix A, stored in upper- or lower-packed storage mode, is factored using the Bunch-Kaufman diagonal pivoting method, where A is expressed as:

A = UDUT or
A = LDLT

where:

U is a product of permutation and unit upper triangular matrices.
L is a product of permutation and unit lower triangular matrices.
D is a symmetric block diagonal matrix, consisting of 1 × 1 and 2 × 2 diagonal blocks.

To solve a system of equations with one or more right-hand sides, follow the call to this subroutine with one or more calls to DBSTRS.

Table 98. Data Types

A ipvt Subroutine
Long-precision real Integer DBSTRF
Note:
The output from DBSTRF should be used only as input to DBSTRS, for performing a solve.

Syntax

Fortran CALL DBSTRF (uplo, n, ap, ipvt, nsinfo)
C and C++ dbstrf (uplo, n, ap, ipvt, nsinfo);
PL/I CALL DBSTRF (uplo, n, ap, ipvt, nsinfo);

On Entry

uplo
indicates whether matrix A is stored in upper- or lower-packed storage mode, where:

If uplo = 'U', A is stored in upper-packed storage mode.

If uplo = 'L', A is stored in lower-packed storage mode.

Specified as: a single character. It must be 'U' or 'L'.

n
is the order n of matrix A.

Specified as: a fullword integer; n >= 0.

ap
is array, referred to as AP, in which matrix A, to be factored, is stored in upper- or lower-packed storage mode.

Specified as: a one-dimensional array of length nsinfo, containing numbers of the data type indicated in Table 98. See Notes.

ipvt
See On Return.

nsinfo
is the number of elements in array, AP.

If n <= nco, nsinfo = n(n + 1) / 2

Where:



Math Graphic

ics is the size in doublewords of the data cache. The data cache size can be obtained by utilizing the following C language code fragment:
#include <sys/systemcfg.h>
int ics;
     .
     .
     .
ics=_system_configuration.dcache_size/8;

Otherwise, to determine a sufficient amount of storage, use the following processor-independent formula:

n0 = 100
ns = (n + n0) (n + n0 + 1) / 2 + n(n0)
For uplo = 'L',
nsinfo >= ns
For uplo = 'U',
n1 = (n + 1) / 2
nt = n((n + 1) / 2)
nt1 = n1(n1 + 1)
ns1 = nt + nt1
nsinfo >= max(ns, ns1)

To determine the minimal amount of storage see Notes.

Specified as: a fullword integer; nsinfo > 0.

On Return

ap
is the transformed matrix A of order n, containing the results of the factorization.

If nsinfo >= 0 and n > nco, additional information that can be used to obtain a minimum nsinfo is stored in AP(1). See Notes and Function.

Returned as: a one-dimensional array, containing numbers of the data type indicated in Table 98.

ipvt
is an integer vector of length n, containing the pivot information necessary to construct the factored form of A.

Returned as: a one-dimensional array of (at least) length n, containing numbers of the data type indicated in Table 98.

nsinfo
indicates the result of the computation.

Specified as: a fullword integer.

Notes
  1. This subroutine accepts lowercase letters for the uplo argument.
  2. In your C program, argument nsinfo must be passed by reference.
  3. In the input array specified for ap, the first n(n+1)/2 elements are matrix elements. The additional locations, required in the array, are used for working storage.
  4. The array specified for ap should not be altered between calls to the factorization and solve subroutines; otherwise, unpredictable results may occur.
  5. On return, if nsinfo >= 0 and n > nco, ap contains additional information in AP(1) that can be used to obtain the minimal required nsinfo. This information can be accessed using the following code fragment:
    REAL*8	AP(NSINFO)
    INTEGER	API(2)
    EQUIVALENCE(API, AP)
              .
              .
              .
    NSINFOMIN = API(2)
    
  6. For a description of how a symmetric matrix is stored in upper- or lower-packed storage mode in an array, see Symmetric Matrix.

Function

A real symmetric indefinite matrix A, stored in upper- or lower-packed storage mode, is factored using the Bunch-Kaufman diagonal pivoting method, where A is expressed as:

A = UDUT or
A = LDLT

where:

U is a product of permutation and unit upper triangular matrices.
L is a product of permutation and unit lower triangular matrices.
D is a symmetric block diagonal matrix, consisting of 1 × 1 and 2 × 2 diagonal blocks.

If n is 0, no computation is performed and the subroutine returns after doing some parameter checking.

See references [8] and [65].

Error Conditions

Resource Errors

None.

Computational Errors

Matrix A is singular.

Input-Argument Errors
  1. uplo <> 'U' or 'L'
  2. n < 0
  3. nsinfo < (minimum value).

Example 1

This example shows a factorization of a symmetric indefinite matrix A of order 8, stored in lower-packed storage mode, where on input matrix A is:

             *                                                *
             |  3.0   5.0  -2.0   2.0   3.0  -5.0  -2.0  -3.0 |
             |  5.0   3.0   2.0  -2.0   5.0  -3.0   2.0  -5.0 |
             | -2.0   2.0   0.0   0.0  -2.0   2.0   0.0   6.0 |
             |  2.0  -2.0   0.0   8.0  -6.0 -10.0  -8.0 -14.0 |
             |  3.0   5.0  -2.0  -6.0  12.0   6.0   8.0   6.0 |
             | -5.0  -3.0   2.0 -10.0   6.0  16.0   8.0  20.0 |
             | -2.0   2.0   0.0  -8.0   8.0   8.0   6.0  18.0 |
             | -3.0  -5.0   6.0 -14.0   6.0  20.0  18.0  34.0 |
             *                                                *

Note:
The AP array is formatted in a triangular arrangement for readability; however, it is stored in lower-packed storage mode.

Call Statement and Input
              UPLO  N   AP  IPVT  NSINFO
               |    |    |   |       |
CALL DBSTRF ( 'L',  8,  AP, IPVT,   36  )
AP = ( 3.0,  5.0, -2.0,  2.0,  3.0, -5.0, -2.0, -3.0,
       3.0,  2.0, -2.0,  5.0, -3.0,  2.0, -5.0,
       0.0,  0.0, -2.0,  2.0,  0.0,  6.0,
       8.0, -6.0,-10.0, -8.0,-14.0,
      12.0,  6.0,  8.0,  6.0,
      16.0,  8.0, 20.0,
       6.0, 18.0,
      34.0 )

Output

NSINFO = 0

Note:
AP and IPVT are stored in an internal format and must be passed unchanged to the solve subroutine.

Example 2

This example shows a factorization of a symmetric indefinite matrix A of order 8, stored in upper-packed storage mode, where on input matrix A is:

             *                                                *
             | 34.0  18.0  17.0   6.0 -14.0   6.0  -5.0  -3.0 |
             | 18.0   6.0   6.0   8.0  -8.0   0.0   2.0  -2.0 |
             | 17.0   6.0   9.0   9.0  -8.0   0.0   2.0  -2.0 |
             |  6.0   8.0   9.0  12.0  -6.0  -2.0   5.0   3.0 |
             |-14.0  -8.0  -8.0  -6.0   8.0   0.0  -2.0   2.0 |
             |  6.0   0.0   0.0  -2.0   0.0   0.0   2.0  -2.0 |
             | -5.0   2.0   2.0   5.0  -2.0   2.0   3.0   5.0 |
             | -3.0  -2.0  -2.0   3.0   2.0  -2.0   5.0   3.0 |
             *                                                *

Note:
The AP array is formatted in a triangular arrangement for readability; however, it is stored in upper-packed storage mode.

Call Statement and Input
              UPLO  N   AP  IPVT  NSINFO
               |    |    |   |       |
CALL DBSTRF ( 'U',  8,  AP, IPVT,   36  )
AP = ( 34.0,
       18.0,  6.0,
       17.0,  6.0,  9.0,
        6.0,  8.0,  9.0, 12.0,
      -14.0, -8.0, -8.0, -6.0,  8.0,
        6.0,  0.0,  0.0, -2.0,  0.0,  0.0,
       -5.0,  2.0,  2.0,  5.0, -2.0,  2.0,  3.0,
       -3.0, -2.0, -2.0,  3.0,  2.0, -2.0,  5.0,  3.0 )

Output

NSINFO = 0

Note:
AP and IPVT are stored in an internal format and must be passed unchanged to the solve subroutine.


[ Top of Page | Previous Page | Next Page | Table of Contents | Index ]