SUBROUTINE AUGSQR(NARGS,SYSFIL,NEWFIL,SEEDDM,ERROR,ERRMSG)
C
C FUNCTION:
Cf
Cf This routine augments the input-output structure of
Cf a linear system to make it square, i.e., the system
Cf output from this program has the matrices B and D
Cf or C and D transformed into square matrices. If the
Cf number of outputs is greater than the number of inputs
Cf then matrices B and D are augmented. If the number of
Cf outputs is less than the number of inputs then the
Cf matrices C and D are augmented. If the number of inputs
Cf equals the number of outputs, nothing is done.
Cf The matrices are augmented by introducing rows or columns
Cf of random numbers for B or C, and rows or columns of
Cf zeroes for D.
C
C BUGS:
Cb Currently there is nothing to prevent the introduction
Cb of non-minimum phase zeroes into the system.
C
C USAGE:
Cu This routine is used to square a system for application
Cu of the Loop Transfer Recovery part of the design.
Cu
C
C INPUTS:
Ci The inputs to the routine are the file name of a
Ci system container file for the input system and
Ci the file name of a system container file for
Ci the output. The input system container file must conform
Ci to the format for system container files (See the
Ci Tool Specifications). Also the value of the seed for
Ci the random number generator must be supplied.
C
C OUTPUTS:
Co The output of the program is the augmented system, now
Co square, which is stored in the file determined by the
Co variable NEWFIL. This file will conform the the system
Co container file format. Also output is the integer CERR
Co which is non-zero if an error occurs in the routine.
C
C MACHINE DEPENDENCIES:
Cm
Cm 'INCLUDE' statement is machine dependent. There
Cm are no other dependencies.
Cm
C
C HISTORY:
Ch Orginally written by Bobby Bodenheimer July 1986.
CH added dpcom: 7/16/88 jdb
C
C ROUTINES CALLED:
Cc INSYS, OUTSYS, RAND.
C COMMON MEMORY USED:
CM
CM DPCOM -- see dpcommon.f and dpcom.f
CM
C
C--------------------------------------------------------------------
C written for: The CASCADE Project
C Oak Ridge National Laboratory
C U.S. Department of Energy
C contract number DE-AC05-840R21400
C subcontract number ##########
C organization: xxxxxx
C----------------------------------------------------------------------
C THIS SOFTWARE IS IN THE PUBLIC DOMAIN
C NO RESTRICTIONS ON ITS USE ARE IMPLIED
C----------------------------------------------------------------------
C
INCLUDE 'Parameter.f'
C
INTEGER SEEDDM
INTEGER SEED
C
INTEGER NINPS, NOUTS, NSTATS, ERROR
C
DOUBLE PRECISION A(SIZE,SIZE)
DOUBLE PRECISION B(SIZE,SIZE)
DOUBLE PRECISION C(SIZE,SIZE)
DOUBLE PRECISION D(SIZE,SIZE)
C
DOUBLE PRECISION RND
DOUBLE PRECISION BNORM
DOUBLE PRECISION BNORM2
DOUBLE PRECISION CNORM
DOUBLE PRECISION CNORM2
DOUBLE PRECISION D1NRM
C
CHARACTER*(*) SYSFIL, NEWFIL, ERRMSG
C
INCLUDE 'dpcom.f'
C
C If SEED equals 0 then set seed to 99991 for reproducible
C results.
C
IF (NARGS.GE.4) THEN
IF (SEEDDM.LE.0) THEN
SEED = 99991
ELSE
SEED = SEEDDM
END IF
ELSE
SEED = 99991
END IF
C
C Check that SEED is odd. If it isn't add one to it.
C
IF (MOD(SEED,2) .NE. 1) THEN
SEED=SEED+1
END IF
C
ERROR = 0
C
C Read in the System file.
C
CALL INSYS(SYSFIL,
1 NINPS,NOUTS,NSTATS,
2 SIZE,SIZE,SIZE,A,B,C,D,ERROR)
C
CLOSE(UNIT=UNIT1)
C
IF (ERROR.NE.0) THEN
ERRMSG = ' AUGSQR: Error from INSYS reading '//SYSFIL
RETURN
END IF
C
C Do the augmentation.
C
IF (NINPS.EQ.NOUTS) THEN
C
C No augmentation necessary.
C
ERROR=1
ERRMSG = 'AUGSQR: Number of inputs = Number of outputs.'//
1 ' No augmentation necessary.'
RETURN
ELSE IF (NINPS.LT.NOUTS) THEN
C
C Augment B
C
BNORM = D1NRM(SIZE,NSTATS,NINPS,B)
IF (BNORM .EQ. 0.0D0) BNORM = 1.0D0
BNORM2 = 2.0D0 * BNORM
DO 10 I=1,NOUTS-NINPS
DO 10 J=1,NSTATS
CALL RAND(SEED,SEED,RND)
B(J,NINPS+I) = BNORM2 * RND - BNORM
D(J,NINPS+I) = 0.0D0
10 CONTINUE
CALL OUTSYS(NEWFIL,
1 NOUTS,NOUTS,NSTATS,SIZE,SIZE,SIZE,A,B,C,D,ERROR)
ELSE
C
C Augment C
C
CNORM = D1NRM(SIZE,NOUTS,NSTATS,C)
IF (CNORM .EQ. 0.0D0) CNORM = 1.0D0
CNORM2 = 2.0D0 * CNORM
DO 20 I=1,NINPS-NOUTS
DO 20 J=1,NSTATS
CALL RAND(SEED,SEED,RND)
C(NOUTS+I,J) = CNORM2 * RND - CNORM
D(NOUTS+I,J) = 0.0D0
20 CONTINUE
CALL OUTSYS(NEWFIL,
1 NINPS,NINPS,NSTATS,SIZE,SIZE,SIZE,A,B,C,D,ERROR)
END IF
C
IF (ERROR.NE.0) THEN
ERRMSG = 'AUGSQR: Error from OUTSYS writing '//NEWFIL
END IF
RETURN
END