dynare/mex/sources/libslicot/TF01RD.f

231 lines
7.0 KiB
Fortran

SUBROUTINE TF01RD( NA, NB, NC, N, A, LDA, B, LDB, C, LDC, H, LDH,
$ DWORK, LDWORK, 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 N Markov parameters M(1), M(2),..., M(N) from the
C parameters (A,B,C) of a linear time-invariant system, where each
C M(k) is an NC-by-NB matrix and k = 1,2,...,N.
C
C All matrices are treated as dense, and hence TF01RD is not
C intended for large sparse problems.
C
C ARGUMENTS
C
C Input/Output Parameters
C
C NA (input) INTEGER
C The order of the matrix A. NA >= 0.
C
C NB (input) INTEGER
C The number of system inputs. NB >= 0.
C
C NC (input) INTEGER
C The number of system outputs. NC >= 0.
C
C N (input) INTEGER
C The number of Markov parameters M(k) to be computed.
C N >= 0.
C
C A (input) DOUBLE PRECISION array, dimension (LDA,NA)
C The leading NA-by-NA part of this array must contain the
C state matrix A of the system.
C
C LDA INTEGER
C The leading dimension of array A. LDA >= MAX(1,NA).
C
C B (input) DOUBLE PRECISION array, dimension (LDB,NB)
C The leading NA-by-NB part of this array must contain the
C input matrix B of the system.
C
C LDB INTEGER
C The leading dimension of array B. LDB >= MAX(1,NA).
C
C C (input) DOUBLE PRECISION array, dimension (LDC,NA)
C The leading NC-by-NA part of this array must contain the
C output matrix C of the system.
C
C LDC INTEGER
C The leading dimension of array C. LDC >= MAX(1,NC).
C
C H (output) DOUBLE PRECISION array, dimension (LDH,N*NB)
C The leading NC-by-N*NB part of this array contains the
C multivariable parameters M(k), where each parameter M(k)
C is an NC-by-NB matrix and k = 1,2,...,N. The Markov
C parameters are stored such that H(i,(k-1)xNB+j) contains
C the (i,j)-th element of M(k) for i = 1,2,...,NC and
C j = 1,2,...,NB.
C
C LDH INTEGER
C The leading dimension of array H. LDH >= MAX(1,NC).
C
C Workspace
C
C DWORK DOUBLE PRECISION array, dimension (LDWORK)
C
C LDWORK INTEGER
C The length of the array DWORK.
C LDWORK >= MAX(1, 2*NA*NC).
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
C METHOD
C
C For the linear time-invariant discrete-time system
C
C x(k+1) = A x(k) + B u(k)
C y(k) = C x(k) + D u(k),
C
C the transfer function matrix G(z) is given by
C -1
C G(z) = C(zI-A) B + D
C -1 -2 2 -3
C = D + CB z + CAB z + CA B z + ... (1)
C
C Using Markov parameters, G(z) can also be written as
C -1 -2 -3
C G(z) = M(0) + M(1)z + M(2)z + M(3)z + ... (2)
C
C k-1
C Equating (1) and (2), we find that M(0) = D and M(k) = C A B
C for k > 0, from which the Markov parameters M(1),M(2)...,M(N) are
C computed.
C
C REFERENCES
C
C [1] Chen, C.T.
C Introduction to Linear System Theory.
C H.R.W. Series in Electrical Engineering, Electronics and
C Systems, Holt, Rinehart and Winston Inc., London, 1970.
C
C NUMERICAL ASPECTS
C
C The algorithm requires approximately (NA + NB) x NA x NC x N
C multiplications and additions.
C
C CONTRIBUTOR
C
C Release 3.0: V. Sima, Katholieke Univ. Leuven, Belgium, Dec. 1996.
C Supersedes Release 2.0 routine TF01FD by S. Van Huffel, Katholieke
C Univ. Leuven, Belgium.
C
C REVISIONS
C
C -
C
C KEYWORDS
C
C Markov parameters, multivariable system, time-invariant system,
C transfer function, transfer matrix.
C
C ******************************************************************
C
C .. Parameters ..
DOUBLE PRECISION ZERO, ONE
PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 )
C .. Scalar Arguments ..
INTEGER INFO, LDA, LDB, LDC, LDH, LDWORK, N, NA, NB, NC
C .. Array Arguments ..
DOUBLE PRECISION A(LDA,*), B(LDB,*), C(LDC,*), DWORK(*), H(LDH,*)
C .. Local Scalars ..
INTEGER I, JWORK, K, LDW
C .. External Subroutines ..
EXTERNAL DGEMM, DLACPY, XERBLA
C .. Intrinsic Functions ..
INTRINSIC MAX, MIN
C .. Executable Statements ..
C
INFO = 0
C
C Test the input scalar arguments.
C
IF( NA.LT.0 ) THEN
INFO = -1
ELSE IF( NB.LT.0 ) THEN
INFO = -2
ELSE IF( NC.LT.0 ) THEN
INFO = -3
ELSE IF( N.LT.0 ) THEN
INFO = -4
ELSE IF( LDA.LT.MAX( 1, NA ) ) THEN
INFO = -6
ELSE IF( LDB.LT.MAX( 1, NA ) ) THEN
INFO = -8
ELSE IF( LDC.LT.MAX( 1, NC ) ) THEN
INFO = -10
ELSE IF( LDH.LT.MAX( 1, NC ) ) THEN
INFO = -12
ELSE IF( LDWORK.LT.MAX( 1, 2*NA*NC ) ) THEN
INFO = -14
END IF
C
IF ( INFO.NE.0 ) THEN
C
C Error return.
C
CALL XERBLA( 'TF01RD', -INFO )
RETURN
END IF
C
C Quick return if possible.
C
IF ( MIN( NA, NB, NC, N ).EQ.0 )
$ RETURN
C
JWORK = 1 + NC*NA
LDW = MAX( 1, NC )
I = 1
C
C Copy C in the workspace beginning from the position JWORK.
C This workspace will contain the product C*A**(K-1), K = 1,2,...,N.
C
CALL DLACPY( 'Full', NC, NA, C, LDC, DWORK(JWORK), LDW )
C
C Form M(1), M(2), ..., M(N).
C
DO 10 K = 1, N
CALL DLACPY( 'Full', NC, NA, DWORK(JWORK), LDW, DWORK, LDW )
C
C Form (C * A**(K-1)) * B = M(K).
C
CALL DGEMM( 'No transpose', 'No transpose', NC, NB, NA, ONE,
$ DWORK, LDW, B, LDB, ZERO, H(1,I), LDH )
C
IF ( K.NE.N ) THEN
C
C Form C * A**K.
C
CALL DGEMM( 'No transpose', 'No transpose', NC, NA, NA, ONE,
$ DWORK, LDW, A, LDA, ZERO, DWORK(JWORK), LDW )
C
I = I + NB
END IF
10 CONTINUE
C
RETURN
C *** Last line of TF01RD ***
END