summaryrefslogtreecommitdiff
path: root/tests/examplefiles/ahcon.f
diff options
context:
space:
mode:
Diffstat (limited to 'tests/examplefiles/ahcon.f')
-rw-r--r--tests/examplefiles/ahcon.f340
1 files changed, 0 insertions, 340 deletions
diff --git a/tests/examplefiles/ahcon.f b/tests/examplefiles/ahcon.f
deleted file mode 100644
index 48ae920b..00000000
--- a/tests/examplefiles/ahcon.f
+++ /dev/null
@@ -1,340 +0,0 @@
- SUBROUTINE AHCON (SIZE,N,M,A,B,OLEVR,OLEVI,CLEVR,CLEVI, TRUNCATED
- & SCR1,SCR2,IPVT,JPVT,CON,WORK,ISEED,IERR) !Test inline comment
-C
-C FUNCTION:
-CF
-CF Determines whether the pair (A,B) is controllable and flags
-CF the eigenvalues corresponding to uncontrollable modes.
-CF this ad-hoc controllability calculation uses a random matrix F
-CF and computes whether eigenvalues move from A to the controlled
-CF system A+B*F.
-CF
-C USAGE:
-CU
-CU CALL AHCON (SIZE,N,M,A,B,OLEVR,OLEVI,CLEVR,CLEVI,SCR1,SCR2,IPVT,
-CU JPVT,CON,WORK,ISEED,IERR)
-CU
-CU since AHCON generates different random F matrices for each
-CU call, as long as iseed is not re-initialized by the main
-CU program, and since this code has the potential to be fooled
-CU by extremely ill-conditioned problems, the cautious user
-CU may wish to call it multiple times and rely, perhaps, on
-CU a 2-of-3 vote. We believe, but have not proved, that any
-CU errors this routine may produce are conservative--i.e., that
-CU it may flag a controllable mode as uncontrollable, but
-CU not vice-versa.
-CU
-C INPUTS:
-CI
-CI SIZE integer - first dimension of all 2-d arrays.
-CI
-CI N integer - number of states.
-CI
-CI M integer - number of inputs.
-CI
-CI A double precision - SIZE by N array containing the
-CI N by N system dynamics matrix A.
-CI
-CI B double precision - SIZE by M array containing the
-CI N by M system input matrix B.
-CI
-CI ISEED initial seed for random number generator; if ISEED=0,
-CI then AHCON will set ISEED to a legal value.
-CI
-C OUTPUTS:
-CO
-CO OLEVR double precision - N dimensional vector containing the
-CO real parts of the eigenvalues of A.
-CO
-CO OLEVI double precision - N dimensional vector containing the
-CO imaginary parts of the eigenvalues of A.
-CO
-CO CLEVR double precision - N dimensional vector work space
-CO containing the real parts of the eigenvalues of A+B*F,
-CO where F is the random matrix.
-CO
-CO CLEVI double precision - N dimensional vector work space
-CO containing the imaginary parts of the eigenvalues of
-CO A+B*F, where F is the random matrix.
-CO
-CO SCR1 double precision - N dimensional vector containing the
-CO magnitudes of the corresponding eigenvalues of A.
-CO
-CO SCR2 double precision - N dimensional vector containing the
-CO damping factors of the corresponding eigenvalues of A.
-CO
-CO IPVT integer - N dimensional vector; contains the row pivots
-CO used in finding the nearest neighbor eigenvalues between
-CO those of A and of A+B*F. The IPVT(1)th eigenvalue of
-CO A and the JPVT(1)th eigenvalue of A+B*F are the closest
-CO pair.
-CO
-CO JPVT integer - N dimensional vector; contains the column
-CO pivots used in finding the nearest neighbor eigenvalues;
-CO see IPVT.
-CO
-CO CON logical - N dimensional vector; flagging the uncontrollable
-CO modes of the system. CON(I)=.TRUE. implies the
-CO eigenvalue of A given by DCMPLX(OLEVR(IPVT(I)),OLEVI(IPVT(i)))
-CO corresponds to a controllable mode; CON(I)=.FALSE.
-CO implies an uncontrollable mode for that eigenvalue.
-CO
-CO WORK double precision - SIZE by N dimensional array containing
-CO an N by N matrix. WORK(I,J) is the distance between
-CO the open loop eigenvalue given by DCMPLX(OLEVR(I),OLEVI(I))
-CO and the closed loop eigenvalue of A+B*F given by
-CO DCMPLX(CLEVR(J),CLEVI(J)).
-CO
-CO IERR integer - IERR=0 indicates normal return; a non-zero
-CO value indicates trouble in the eigenvalue calculation.
-CO see the EISPACK and EIGEN documentation for details.
-CO
-C ALGORITHM:
-CA
-CA Calculate eigenvalues of A and of A+B*F for a randomly
-CA generated F, and see which ones change. Use a full pivot
-CA search through a matrix of euclidean distance measures
-CA between each pair of eigenvalues from (A,A+BF) to
-CA determine the closest pairs.
-CA
-C MACHINE DEPENDENCIES:
-CM
-CM NONE
-CM
-C HISTORY:
-CH
-CH written by: Birdwell & Laub
-CH date: May 18, 1985
-CH current version: 1.0
-CH modifications: made machine independent and modified for
-CH f77:bb:8-86.
-CH changed cmplx -> dcmplx: 7/27/88 jdb
-CH
-C ROUTINES CALLED:
-CC
-CC EIGEN,RAND
-CC
-C COMMON MEMORY USED:
-CM
-CM none
-CM
-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 37B-7685 S13
-C organization: The University of Tennessee
-C----------------------------------------------------------------------
-C THIS SOFTWARE IS IN THE PUBLIC DOMAIN
-C NO RESTRICTIONS ON ITS USE ARE IMPLIED
-C----------------------------------------------------------------------
-C
-C--global variables:
-C
- INTEGER SIZE
- INTEGER N
- INTEGER M
- INTEGER IPVT(1)
- INTEGER JPVT(1)
- INTEGER IERR
-C
- DOUBLE PRECISION A(SIZE,N)
- DOUBLE PRECISION B(SIZE,M)
- DOUBLE PRECISION WORK(SIZE,N)
- DOUBLE PRECISION CLEVR(N)
- DOUBLE PRECISION CLEVI(N)
- DOUBLE PRECISION OLEVR(N)
- DOUBLE PRECISION OLEVI(N)
- DOUBLE PRECISION SCR1(N)
- DOUBLE PRECISION SCR2(N)
-C
- LOGICAL CON(N)
-C
-C--local variables:
-C
- INTEGER ISEED
- INTEGER ITEMP
- INTEGER K1
- INTEGER K2
- INTEGER I
- INTEGER J
- INTEGER K
- INTEGER IMAX
- INTEGER JMAX
-C
- DOUBLE PRECISION VALUE
- DOUBLE PRECISION EPS
- DOUBLE PRECISION EPS1
- DOUBLE PRECISION TEMP
- DOUBLE PRECISION CURR
- DOUBLE PRECISION ANORM
- DOUBLE PRECISION BNORM
- DOUBLE PRECISION COLNRM
- DOUBLE PRECISION RNDMNO
-C
- DOUBLE COMPLEX DCMPLX
-C
-C--compute machine epsilon
-C
- EPS = 1.D0
-100 CONTINUE
- EPS = EPS / 2.D0
- EPS1 = 1.D0 + EPS
- IF (EPS1 .NE. 1.D0) GO TO 100
- EPS = EPS * 2.D0
-C
-C--compute the l-1 norm of a
-C
- ANORM = 0.0D0
- DO 120 J = 1, N
- COLNRM = 0.D0
- DO 110 I = 1, N
- COLNRM = COLNRM + ABS(A(I,J))
-110 CONTINUE
- IF (COLNRM .GT. ANORM) ANORM = COLNRM
-120 CONTINUE
-C
-C--compute the l-1 norm of b
-C
- BNORM = 0.0D0
- DO 140 J = 1, M
- COLNRM = 0.D0
- DO 130 I = 1, N
- COLNRM = COLNRM + ABS(B(I,J))
-130 CONTINUE
- IF (COLNRM .GT. BNORM) BNORM = COLNRM
-140 CONTINUE
-C
-C--compute a + b * f
-C
- DO 160 J = 1, N
- DO 150 I = 1, N
- WORK(I,J) = A(I,J)
-150 CONTINUE
-160 CONTINUE
-C
-C--the elements of f are random with uniform distribution
-C--from -anorm/bnorm to +anorm/bnorm
-C--note that f is not explicitly stored as a matrix
-C--pathalogical floating point notes: the if (bnorm .gt. 0.d0)
-C--test should actually be if (bnorm .gt. dsmall), where dsmall
-C--is the smallest representable number whose reciprocal does
-C--not generate an overflow or loss of precision.
-C
- IF (ISEED .EQ. 0) ISEED = 86345823
- IF (ANORM .EQ. 0.D0) ANORM = 1.D0
- IF (BNORM .GT. 0.D0) THEN
- TEMP = 2.D0 * ANORM / BNORM
- ELSE
- TEMP = 2.D0
- END IF
- DO 190 K = 1, M
- DO 180 J = 1, N
- CALL RAND(ISEED,ISEED,RNDMNO)
- VALUE = (RNDMNO - 0.5D0) * TEMP
- DO 170 I = 1, N
- WORK(I,J) = WORK(I,J) + B(I,K)*VALUE
-170 CONTINUE
-180 CONTINUE
-190 CONTINUE
-C
-C--compute the eigenvalues of a + b*f, and several other things
-C
- CALL EIGEN (0,SIZE,N,WORK,CLEVR,CLEVI,WORK,SCR1,SCR2,IERR)
- IF (IERR .NE. 0) RETURN
-C
-C--copy a so it is not destroyed
-C
- DO 210 J = 1, N
- DO 200 I = 1, N
- WORK(I,J) = A(I,J)
-200 CONTINUE
-210 CONTINUE
-C
-C--compute the eigenvalues of a, and several other things
-C
- CALL EIGEN (0,SIZE,N,WORK,OLEVR,OLEVI,WORK,SCR1,SCR2,IERR)
- IF (IERR .NE. 0) RETURN
-C
-C--form the matrix of distances between eigenvalues of a and
-C--EIGENVALUES OF A+B*F
-C
- DO 230 J = 1, N
- DO 220 I = 1, N
- WORK(I,J) =
- & ABS(DCMPLX(OLEVR(I),OLEVI(I))-DCMPLX(CLEVR(J),CLEVI(J)))
-220 CONTINUE
-230 CONTINUE
-C
-C--initialize row and column pivots
-C
- DO 240 I = 1, N
- IPVT(I) = I
- JPVT(I) = I
-240 CONTINUE
-C
-C--a little bit messy to avoid swapping columns and
-C--rows of work
-C
- DO 270 I = 1, N-1
-C
-C--find the minimum element of each lower right square
-C--submatrix of work, for submatrices of size n x n
-C--through 2 x 2
-C
- CURR = WORK(IPVT(I),JPVT(I))
- IMAX = I
- JMAX = I
- TEMP = CURR
-C
-C--find the minimum element
-C
- DO 260 K1 = I, N
- DO 250 K2 = I, N
- IF (WORK(IPVT(K1),JPVT(K2)) .LT. TEMP) THEN
- TEMP = WORK(IPVT(K1),JPVT(K2))
- IMAX = K1
- JMAX = K2
- END IF
-250 CONTINUE
-260 CONTINUE
-C
-C--update row and column pivots for indirect addressing of work
-C
- ITEMP = IPVT(I)
- IPVT(I) = IPVT(IMAX)
- IPVT(IMAX) = ITEMP
-C
- ITEMP = JPVT(I)
- JPVT(I) = JPVT(JMAX)
- JPVT(JMAX) = ITEMP
-C
-C--do next submatrix
-C
-270 CONTINUE
-C
-C--this threshold for determining when an eigenvalue has
-C--not moved, and is therefore uncontrollable, is critical,
-C--and may require future changes with more experience.
-C
- EPS1 = SQRT(EPS)
-C
-C--for each eigenvalue pair, decide if it is controllable
-C
- DO 280 I = 1, N
-C
-C--note that we are working with the "pivoted" work matrix
-C--and are looking at its diagonal elements
-C
- IF (WORK(IPVT(I),JPVT(I))/ANORM .LE. EPS1) THEN
- CON(I) = .FALSE.
- ELSE
- CON(I) = .TRUE.
- END IF
-280 CONTINUE
-C
-C--finally!
-C
- RETURN
- END