File: TMB03ZD.f

package info (click to toggle)
slicot 5.0%2B20101122-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, buster
  • size: 21,816 kB
  • sloc: fortran: 122,030; makefile: 1,098
file content (134 lines) | stat: -rwxr-xr-x 6,194 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
*     MB03ZD EXAMPLE PROGRAM TEXT
*     Copyright (c) 2002-2010 NICONET e.V.
*
*     .. Parameters ..
      DOUBLE PRECISION ZERO, ONE
      PARAMETER        ( ZERO = 0.0D0, ONE = 1.0D0 )
      INTEGER          NIN, NOUT
      PARAMETER        ( NIN = 5, NOUT = 6 )
      INTEGER          NMAX
      PARAMETER        ( NMAX = 200 )
      INTEGER          LDG, LDRES, LDS, LDT, LDU1, LDU2, LDUS, LDUU,
     $                 LDV1, LDV2, LDWORK
      PARAMETER        ( LDG = NMAX, LDRES = 2*NMAX, LDS = NMAX,
     $                   LDT = NMAX, LDU1 = NMAX, LDU2 = NMAX,
     $                   LDUS = 2*NMAX, LDUU = 2*NMAX, LDV1 = NMAX,
     $                   LDV2 = NMAX, LDWORK = 3*NMAX*NMAX + 7*NMAX )
*     .. Local Scalars ..
      CHARACTER*1      BALANC, METH, ORTBAL, STAB, WHICH
      INTEGER          I, ILO, INFO, J, M, N
*     .. Local Arrays ..
      LOGICAL          LWORK(2*NMAX), SELECT(NMAX)
      INTEGER          IWORK(2*NMAX)
      DOUBLE PRECISION DWORK(LDWORK), G(LDG, NMAX), RES(LDRES,NMAX),
     $                 S(LDS, NMAX), SCALE(NMAX), T(LDT,NMAX),
     $                 U1(LDU1,NMAX), U2(LDU2, NMAX), US(LDUS,2*NMAX),
     $                 UU(LDUU,2*NMAX), V1(LDV1,NMAX), V2(LDV2, NMAX),
     $                 WI(NMAX), WR(NMAX)
*     .. External Functions ..
      EXTERNAL         DLANGE, LSAME
      LOGICAL          LSAME
      DOUBLE PRECISION DLANGE
*     .. External Subroutines ..
      EXTERNAL         MB03ZD
*     .. Executable Statements ..
      WRITE ( NOUT, FMT = 99999 )
*     Skip the heading in the data file and read the data.
      READ ( NIN, FMT = '()' )
      READ ( NIN, FMT = * )  N, ILO, WHICH, METH, STAB, BALANC, ORTBAL
      IF ( N.LE.0 .OR. N.GT.NMAX ) THEN
         WRITE ( NOUT, FMT = 99992 ) N
      ELSE
*
         IF ( LSAME( WHICH, 'S' ) )
     $      READ ( NIN, FMT = * ) ( SELECT(I), I = 1,N )
         READ ( NIN, FMT = * ) ( ( S(I,J), J = 1,N ), I = 1,N )
         READ ( NIN, FMT = * ) ( ( T(I,J), J = 1,N ), I = 1,N )
         IF ( LSAME( WHICH, 'A' ).AND.LSAME( METH, 'L' ) )
     $      READ ( NIN, FMT = * ) ( ( G(I,J), J = 1,N ), I = 1,N )
         IF ( LSAME( BALANC, 'P' ).OR.LSAME( BALANC, 'S' ).OR.
     $        LSAME( BALANC, 'B' ) )
     $      READ ( NIN, FMT = * ) ( SCALE(I), I = 1,N )
         READ ( NIN, FMT = * ) ( ( U1(I,J), J = 1,N ), I = 1,N )
         READ ( NIN, FMT = * ) ( ( U2(I,J), J = 1,N ), I = 1,N )
         READ ( NIN, FMT = * ) ( ( V1(I,J), J = 1,N ), I = 1,N )
         READ ( NIN, FMT = * ) ( ( V2(I,J), J = 1,N ), I = 1,N )
*
         CALL MB03ZD( WHICH, METH, STAB, BALANC, ORTBAL, SELECT, N, 2*N,
     $                ILO, SCALE, S, LDS, T, LDT, G, LDG, U1, LDU1, U2,
     $                LDU2, V1, LDV1, V2, LDV2, M, WR, WI, US, LDUS,
     $                UU, LDUU, LWORK, IWORK, DWORK, LDWORK, INFO )
*
         IF ( INFO.NE.0 ) THEN
            WRITE ( NOUT, FMT = 99998 ) INFO
         ELSE
            WRITE ( NOUT, FMT = 99997 )
            DO 20  I = 1, N
               WRITE ( NOUT, FMT = 99996 ) I, WR(I), WI(I)
20          CONTINUE
*
            IF ( LSAME( STAB, 'S' ).OR.LSAME( STAB, 'B' ) ) THEN
               WRITE ( NOUT, FMT = 99995 )
               DO 30  I = 1, 2*N
                  WRITE ( NOUT, FMT = 99993 ) ( US(I,J), J = 1,M )
30             CONTINUE
               IF ( LSAME( ORTBAL, 'B' ).OR.LSAME( BALANC, 'N' ).OR.
     $            LSAME( BALANC, 'P' ) ) THEN
                  CALL DGEMM( 'Transpose', 'No Transpose', M, M, 2*N,
     $                        ONE, US, LDUS, US, LDUS, ZERO, RES,
     $                        LDRES )
                  DO 40  I = 1, M
                     RES(I,I) = RES(I,I) - ONE
40                CONTINUE
                  WRITE ( NOUT, FMT = 99991 ) DLANGE( 'Frobenius', M, M,
     $                    RES, LDRES, DWORK )
               END IF
               CALL DGEMM( 'Transpose', 'No Transpose', M, M, N, ONE,
     $                     US, LDUS, US(N+1,1), LDUS, ZERO, RES, LDRES )
               CALL DGEMM( 'Transpose', 'No Transpose', M, M, N, -ONE,
     $                     US(N+1,1), LDUS, US, LDUS, ONE, RES, LDRES )
               WRITE ( NOUT, FMT = 99990 ) DLANGE( 'Frobenius', M, M,
     $                 RES, LDRES, DWORK )
            END IF
*
            IF ( LSAME( STAB, 'U' ).OR.LSAME( STAB, 'B' ) ) THEN
               WRITE ( NOUT, FMT = 99994 )
               DO 50  I = 1, 2*N
                  WRITE ( NOUT, FMT = 99993 ) ( UU(I,J), J = 1,M )
50             CONTINUE
               IF ( LSAME( ORTBAL, 'B' ).OR.LSAME( BALANC, 'N' ).OR.
     $            LSAME( BALANC, 'P' ) ) THEN
                  CALL DGEMM( 'Transpose', 'No Transpose', M, M, 2*N,
     $                        ONE, UU, LDUU, UU, LDUU, ZERO, RES,
     $                        LDRES )
                  DO 60  I = 1, M
                     RES(I,I) = RES(I,I) - ONE
60                CONTINUE
                  WRITE ( NOUT, FMT = 99989 ) DLANGE( 'Frobenius', M, M,
     $                    RES, LDRES, DWORK )
               END IF
               CALL DGEMM( 'Transpose', 'No Transpose', M, M, N, ONE,
     $                     UU, LDUU, UU(N+1,1), LDUU, ZERO, RES, LDRES )
               CALL DGEMM( 'Transpose', 'No Transpose', M, M, N, -ONE,
     $                     UU(N+1,1), LDUU, UU, LDUU, ONE, RES, LDRES )
               WRITE ( NOUT, FMT = 99988 ) DLANGE( 'Frobenius', M, M,
     $                 RES, LDRES, DWORK )
            END IF
         END IF
      END IF
*
99999 FORMAT (' MB03ZD EXAMPLE PROGRAM RESULTS',/1X)
99998 FORMAT (' INFO on exit from MB03ZD = ',I2)
99997 FORMAT (' The stable eigenvalues are',//'   i',6X,
     $        'WR(i)',6X,'WI(i)',/)
99996 FORMAT (I4,3X,F8.4,3X,F8.4)
99995 FORMAT (/' A basis for the stable invariant subspace is')
99994 FORMAT (/' A basis for the unstable invariant subspace is')
99993 FORMAT (20(1X,F9.3))
99992 FORMAT (/' N is out of range.',/' N = ',I5)
99991 FORMAT (/' Orthogonality of US: || US''*US - I ||_F = ',G7.2)
99990 FORMAT (/' Symplecticity of US: || US''*J*US   ||_F = ',G7.2)
99989 FORMAT (/' Orthogonality of UU: || UU''*UU - I ||_F = ',G7.2)
99988 FORMAT (/' Symplecticity of UU: || UU''*J*UU   ||_F = ',G7.2)

      END