C
C SPDX-License-Identifier: BSD-3-Clause
C
      SUBROUTINE IB01OY( NS, NMAX, N, SV, INFO )
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
