170 lines
4.8 KiB
Fortran
170 lines
4.8 KiB
Fortran
SUBROUTINE MB02SZ( N, H, LDH, IPIV, INFO )
|
|
C
|
|
C SLICOT RELEASE 5.0.
|
|
C
|
|
C Copyright (c) 2002-2009 NICONET e.V.
|
|
C
|
|
C This program is free software: you can redistribute it and/or
|
|
C modify it under the terms of the GNU General Public License as
|
|
C published by the Free Software Foundation, either version 2 of
|
|
C the License, or (at your option) any later version.
|
|
C
|
|
C This program is distributed in the hope that it will be useful,
|
|
C but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
C GNU General Public License for more details.
|
|
C
|
|
C You should have received a copy of the GNU General Public License
|
|
C along with this program. If not, see
|
|
C <http://www.gnu.org/licenses/>.
|
|
C
|
|
C PURPOSE
|
|
C
|
|
C To compute an LU factorization of a complex n-by-n upper
|
|
C Hessenberg matrix H using partial pivoting with row interchanges.
|
|
C
|
|
C ARGUMENTS
|
|
C
|
|
C Input/Output Parameters
|
|
C
|
|
C N (input) INTEGER
|
|
C The order of the matrix H. N >= 0.
|
|
C
|
|
C H (input/output) COMPLEX*16 array, dimension (LDH,N)
|
|
C On entry, the n-by-n upper Hessenberg matrix to be
|
|
C factored.
|
|
C On exit, the factors L and U from the factorization
|
|
C H = P*L*U; the unit diagonal elements of L are not stored,
|
|
C and L is lower bidiagonal.
|
|
C
|
|
C LDH INTEGER
|
|
C The leading dimension of the array H. LDH >= max(1,N).
|
|
C
|
|
C IPIV (output) INTEGER array, dimension (N)
|
|
C The pivot indices; for 1 <= i <= N, row i of the matrix
|
|
C was interchanged with row IPIV(i).
|
|
C
|
|
C Error Indicator
|
|
C
|
|
C INFO INTEGER
|
|
C = 0: successful exit;
|
|
C < 0: if INFO = -i, the i-th argument had an illegal
|
|
C value;
|
|
C > 0: if INFO = i, U(i,i) is exactly zero. The
|
|
C factorization has been completed, but the factor U
|
|
C is exactly singular, and division by zero will occur
|
|
C if it is used to solve a system of equations.
|
|
C
|
|
C METHOD
|
|
C
|
|
C The factorization has the form
|
|
C H = P * L * U
|
|
C where P is a permutation matrix, L is lower triangular with unit
|
|
C diagonal elements (and one nonzero subdiagonal), and U is upper
|
|
C triangular.
|
|
C
|
|
C This is the right-looking Level 2 BLAS version of the algorithm
|
|
C (adapted after ZGETF2).
|
|
C
|
|
C REFERENCES
|
|
C
|
|
C -
|
|
C
|
|
C NUMERICAL ASPECTS
|
|
C 2
|
|
C The algorithm requires 0( N ) complex operations.
|
|
C
|
|
C CONTRIBUTOR
|
|
C
|
|
C Release 3.0: V. Sima, Katholieke Univ. Leuven, Belgium, Dec. 1996.
|
|
C Supersedes Release 2.0 routine TB01FX by A.J. Laub, University of
|
|
C Southern California, United States of America, May 1980.
|
|
C
|
|
C REVISIONS
|
|
C
|
|
C V. Sima, Research Institute for Informatics, Bucharest, Oct. 2000,
|
|
C Jan. 2005.
|
|
C
|
|
C KEYWORDS
|
|
C
|
|
C Frequency response, Hessenberg form, matrix algebra.
|
|
C
|
|
C ******************************************************************
|
|
C
|
|
C .. Parameters ..
|
|
COMPLEX*16 ZERO
|
|
PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ) )
|
|
C .. Scalar Arguments ..
|
|
INTEGER INFO, LDH, N
|
|
C .. Array Arguments ..
|
|
INTEGER IPIV(*)
|
|
COMPLEX*16 H(LDH,*)
|
|
C .. Local Scalars ..
|
|
INTEGER J, JP
|
|
C .. External Functions ..
|
|
DOUBLE PRECISION DCABS1
|
|
EXTERNAL DCABS1
|
|
C .. External Subroutines ..
|
|
EXTERNAL XERBLA, ZAXPY, ZSWAP
|
|
C .. Intrinsic Functions ..
|
|
INTRINSIC MAX
|
|
C ..
|
|
C .. Executable Statements ..
|
|
C
|
|
C Check the scalar input parameters.
|
|
C
|
|
INFO = 0
|
|
IF( N.LT.0 ) THEN
|
|
INFO = -1
|
|
ELSE IF( LDH.LT.MAX( 1, N ) ) THEN
|
|
INFO = -3
|
|
END IF
|
|
IF( INFO.NE.0 ) THEN
|
|
CALL XERBLA( 'MB02SZ', -INFO )
|
|
RETURN
|
|
END IF
|
|
C
|
|
C Quick return if possible.
|
|
C
|
|
IF( N.EQ.0 )
|
|
$ RETURN
|
|
C
|
|
DO 10 J = 1, N
|
|
C
|
|
C Find pivot and test for singularity.
|
|
C
|
|
JP = J
|
|
IF ( J.LT.N ) THEN
|
|
IF ( DCABS1( H( J+1, J ) ).GT.DCABS1( H( J, J ) ) )
|
|
$ JP = J + 1
|
|
END IF
|
|
IPIV( J ) = JP
|
|
IF( H( JP, J ).NE.ZERO ) THEN
|
|
C
|
|
C Apply the interchange to columns J:N.
|
|
C
|
|
IF( JP.NE.J )
|
|
$ CALL ZSWAP( N-J+1, H( J, J ), LDH, H( JP, J ), LDH )
|
|
C
|
|
C Compute element J+1 of J-th column.
|
|
C
|
|
IF( J.LT.N )
|
|
$ H( J+1, J ) = H( J+1, J )/H( J, J )
|
|
C
|
|
ELSE IF( INFO.EQ.0 ) THEN
|
|
C
|
|
INFO = J
|
|
END IF
|
|
C
|
|
IF( J.LT.N ) THEN
|
|
C
|
|
C Update trailing submatrix.
|
|
C
|
|
CALL ZAXPY( N-J, -H( J+1, J ), H( J, J+1 ), LDH,
|
|
$ H( J+1, J+1 ), LDH )
|
|
END IF
|
|
10 CONTINUE
|
|
RETURN
|
|
C *** Last line of MB02SZ ***
|
|
END
|