## MB02OD

### Solution of matrix equations A X = alpha B, or X A = alpha B, A triangular

[Specification] [Arguments] [Method] [References] [Comments] [Example]

Purpose

      To solve (if well-conditioned) one of the matrix equations

         op( A )*X = alpha*B,   or   X*op( A ) = alpha*B,

      where alpha is a scalar, X and B are m-by-n matrices, A is a unit,
      or non-unit, upper or lower triangular matrix and op( A ) is one
      of

         op( A ) = A   or   op( A ) = A'.

      An estimate of the reciprocal of the condition number of the
      triangular matrix A, in either the 1-norm or the infinity-norm, is
      also computed as

         RCOND = 1 / ( norm(A) * norm(inv(A)) ).

      and the specified matrix equation is solved only if RCOND is
      larger than a given tolerance TOL.  In that case, the matrix X is
      overwritten on B.

Specification

          SUBROUTINE MB02OD( SIDE, UPLO, TRANS, DIAG, NORM, M, N, ALPHA, A,
         $                   LDA, B, LDB, RCOND, TOL, IWORK, DWORK, INFO )
    C     .. Scalar Arguments ..
          CHARACTER          DIAG, NORM, SIDE, TRANS, UPLO
          INTEGER            INFO, LDA, LDB, M, N
          DOUBLE PRECISION   ALPHA, RCOND, TOL
    C     .. Array Arguments ..
          INTEGER            IWORK(*)
          DOUBLE PRECISION   A(LDA,*), B(LDB,*), DWORK(*)

Arguments

Mode Parameters

      SIDE    CHARACTER*1
              Specifies whether op( A ) appears on the left or right
              of X as follows:
              = 'L':  op( A )*X = alpha*B;
              = 'R':  X*op( A ) = alpha*B.

      UPLO    CHARACTER*1
              Specifies whether the matrix A is an upper or lower
              triangular matrix as follows:
              = 'U':  A is an upper triangular matrix;
              = 'L':  A is a lower triangular matrix.

      TRANS   CHARACTER*1
              Specifies the form of op( A ) to be used in the matrix
              multiplication as follows:
              = 'N':  op( A ) = A;
              = 'T':  op( A ) = A';
              = 'C':  op( A ) = A'.

      DIAG    CHARACTER*1
              Specifies whether or not A is unit triangular as follows:
              = 'U':  A is assumed to be unit triangular;
              = 'N':  A is not assumed to be unit triangular.

      NORM    CHARACTER*1
              Specifies whether the 1-norm condition number or the
              infinity-norm condition number is required:
              = '1' or 'O':  1-norm;
              = 'I':         Infinity-norm.

Input/Output Parameters

      M       (input) INTEGER
              The number of rows of B.  M >= 0.

      N       (input) INTEGER
              The number of columns of B.  N >= 0.

      ALPHA   (input) DOUBLE PRECISION
              The scalar  alpha. When alpha is zero then A is not
              referenced and B need not be set before entry.

      A       (input) DOUBLE PRECISION array, dimension (LDA,k),
              where k is M when SIDE = 'L' and is N when SIDE = 'R'.
              On entry with UPLO = 'U', the leading k-by-k upper
              triangular part of this array must contain the upper
              triangular matrix and the strictly lower triangular part
              of A is not referenced.
              On entry with UPLO = 'L', the leading k-by-k lower
              triangular part of this array must contain the lower
              triangular matrix and the strictly upper triangular part
              of A is not referenced.
              Note that when DIAG = 'U', the diagonal elements of A are
              not referenced either, but are assumed to be unity.

      LDA     INTEGER
              The leading dimension of array A.
              LDA >= max(1,M) when SIDE = 'L';
              LDA >= max(1,N) when SIDE = 'R'.

      B       (input/output) DOUBLE PRECISION array, dimension (LDB,N)
              On entry, the leading M-by-N part of this array must
              contain the right-hand side matrix B.
              On exit, if INFO = 0, the leading M-by-N part of this
              array contains the solution matrix X.
              Otherwise, this array is not modified by the routine.

      LDB     INTEGER
              The leading dimension of array B.  LDB >= max(1,M).

      RCOND   (output) DOUBLE PRECISION
              The reciprocal of the condition number of the matrix A,
              computed as RCOND = 1/(norm(A) * norm(inv(A))).

Tolerances

      TOL     DOUBLE PRECISION
              The tolerance to be used to test for near singularity of
              the matrix A. If the user sets TOL > 0, then the given
              value of TOL is used as a lower bound for the reciprocal
              condition number of that matrix; a matrix whose estimated
              condition number is less than 1/TOL is considered to be
              nonsingular. If the user sets TOL <= 0, then an implicitly
              computed, default tolerance, defined by TOLDEF = k*k*EPS,
              is used instead, where EPS is the machine precision (see
              LAPACK Library routine DLAMCH).

Workspace

      IWORK   INTEGER array, dimension (k)

      DWORK   DOUBLE PRECISION array, dimension (3*k)

Error Indicator

      INFO    INTEGER
              = 0:  successful exit;
              < 0:  if INFO = -i, the i-th argument had an illegal
                    value;
              = 1:  the matrix A is numerically singular, i.e. the
                    condition number estimate of A (in the specified
                    norm) exceeds 1/TOL.

Method

      An estimate of the reciprocal of the condition number of the
      triangular matrix A (in the specified norm) is computed, and if
      this estimate is larger then the given (or default) tolerance,
      the specified matrix equation is solved using Level 3 BLAS
      routine DTRSM.

References

      None.

Numerical Aspects

                              2
      The algorithm requires k N/2 operations.

Further Comments

      None

Example

Program Text

      None

Program Data

      None

Program Results

      None

Return to index