176 lines
5.2 KiB
Fortran
176 lines
5.2 KiB
Fortran
SUBROUTINE IB01OY( NS, NMAX, N, SV, 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 ask for user's confirmation of the system order found by
|
|
C SLICOT Library routine IB01OD. This routine may be modified,
|
|
C but its interface must be preserved.
|
|
C
|
|
C ARGUMENTS
|
|
C
|
|
C Input/Output Parameters
|
|
C
|
|
C NS (input) INTEGER
|
|
C The number of singular values. NS > 0.
|
|
C
|
|
C NMAX (input) INTEGER
|
|
C The maximum value of the system order. 0 <= NMAX <= NS.
|
|
C
|
|
C N (input/output) INTEGER
|
|
C On entry, the estimate of the system order computed by
|
|
C IB01OD routine. 0 <= N <= NS.
|
|
C On exit, the user's estimate of the system order, which
|
|
C could be identical with the input value of N.
|
|
C Note that the output value of N should be less than
|
|
C or equal to NMAX.
|
|
C
|
|
C SV (input) DOUBLE PRECISION array, dimension ( NS )
|
|
C The singular values, in descending order, used for
|
|
C determining the system order.
|
|
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 CONTRIBUTORS
|
|
C
|
|
C V. Sima, Research Institute for Informatics, Bucharest, Aug. 1999.
|
|
C
|
|
C REVISIONS
|
|
C
|
|
C -
|
|
C
|
|
C KEYWORDS
|
|
C
|
|
C Identification, parameter estimation, singular values, structure
|
|
C identification.
|
|
C
|
|
C *********************************************************************
|
|
C
|
|
C .. Parameters ..
|
|
INTEGER INTRMN, OUTRMN
|
|
PARAMETER ( INTRMN = 5, OUTRMN = 6 )
|
|
C INTRMN is the unit number for the (terminal) input device.
|
|
C OUTRMN is the unit number for the (terminal) output device.
|
|
C ..
|
|
C .. Scalar Arguments ..
|
|
INTEGER INFO, N, NMAX, NS
|
|
C ..
|
|
C .. Array Arguments ..
|
|
DOUBLE PRECISION SV( * )
|
|
C ..
|
|
C .. Local Scalars ..
|
|
LOGICAL YES
|
|
INTEGER I
|
|
CHARACTER ANS
|
|
C ..
|
|
C .. External Functions ..
|
|
LOGICAL LSAME
|
|
EXTERNAL LSAME
|
|
C ..
|
|
C .. External Subroutines ..
|
|
EXTERNAL XERBLA
|
|
C
|
|
C .. Executable Statements ..
|
|
C
|
|
C Check the scalar input parameters.
|
|
C
|
|
INFO = 0
|
|
IF( NS.LE.0 ) THEN
|
|
INFO = -1
|
|
ELSE IF( NMAX.LT.0 .OR. NMAX.GT.NS ) THEN
|
|
INFO = -2
|
|
ELSE IF( N.LT.0 .OR. N.GT.NS ) THEN
|
|
INFO = -3
|
|
END IF
|
|
C
|
|
IF( INFO.NE.0 ) THEN
|
|
CALL XERBLA( 'IB01OY', -INFO )
|
|
RETURN
|
|
END IF
|
|
C
|
|
WRITE( OUTRMN, '(/'' Singular values (in descending order) used'',
|
|
$ '' to estimate the system order:'', //
|
|
$ (5D15.8) )' ) ( SV(I), I = 1, NS )
|
|
WRITE( OUTRMN, '(/'' Estimated order of the system, n = '', I5 )'
|
|
$ ) N
|
|
WRITE( OUTRMN, '(/'' Do you want this value of n to be used'',
|
|
$ '' to determine the system matrices?'' )' )
|
|
C
|
|
10 CONTINUE
|
|
WRITE( OUTRMN, '(/'' Type "yes" or "no": '' )' )
|
|
READ ( INTRMN, '( A )' ) ANS
|
|
YES = LSAME( ANS, 'Y' )
|
|
IF( YES ) THEN
|
|
IF( N.LE.NMAX ) THEN
|
|
C
|
|
C The value of n is adequate and has been confirmed.
|
|
C
|
|
RETURN
|
|
ELSE
|
|
C
|
|
C The estimated value of n is not acceptable.
|
|
C
|
|
WRITE( OUTRMN, '(/'' n should be less than or equal'',
|
|
$ '' to '', I5 )' ) NMAX
|
|
WRITE( OUTRMN, '( '' (It may be useful to restart'',
|
|
$ '' with a larger tolerance.)'' )' )
|
|
GO TO 20
|
|
END IF
|
|
C
|
|
ELSE IF( LSAME( ANS, 'N' ) ) THEN
|
|
GO TO 20
|
|
ELSE
|
|
C
|
|
C Wrong answer should be re-entered.
|
|
C
|
|
GO TO 10
|
|
END IF
|
|
C
|
|
C Enter the desired value of n.
|
|
C
|
|
20 CONTINUE
|
|
WRITE( OUTRMN,'(/'' Enter the desired value of n (n <= '', I5,
|
|
$ ''); n = '' )' ) NMAX
|
|
READ ( INTRMN, * ) N
|
|
IF ( N.LT.0 ) THEN
|
|
C
|
|
C The specified value of n is not acceptable.
|
|
C
|
|
WRITE( OUTRMN, '(/'' n should be larger than zero.'' )' )
|
|
GO TO 20
|
|
ELSE IF ( N.GT.NMAX ) THEN
|
|
C
|
|
C The specified value of n is not acceptable.
|
|
C
|
|
WRITE( OUTRMN, '(/'' n should be less than or equal to '',
|
|
$ I5 )' ) NMAX
|
|
GO TO 20
|
|
END IF
|
|
C
|
|
RETURN
|
|
C
|
|
C *** Last line of IB01OY ***
|
|
END
|