dynare/mex/sources/libslicot/IB01OY.f

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