File: UE01MD.f

package info (click to toggle)
dynare 4.3.0-2
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 40,640 kB
  • sloc: fortran: 82,231; cpp: 72,734; ansic: 28,874; pascal: 13,241; sh: 4,300; objc: 3,281; yacc: 2,833; makefile: 1,288; lex: 1,162; python: 162; lisp: 54; xml: 8
file content (266 lines) | stat: -rw-r--r-- 9,502 bytes parent folder | download
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
      INTEGER FUNCTION UE01MD( ISPEC, NAME, OPTS, N1, N2, N3 )
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 provide an extension of the LAPACK routine ILAENV to
C     machine-specific parameters for SLICOT routines.
C
C     The default values in this version aim to give good performance on
C     a wide range of computers. For optimal performance, however, the
C     user is advised to modify this routine. Note that an optimized
C     BLAS is a crucial prerequisite for any speed gains. For further
C     details, see ILAENV.
C
C     FUNCTION VALUE
C
C     UE01MD  INTEGER
C             The function value set according to ISPEC.
C
C     ARGUMENTS
C
C     Input/Output Parameters
C
C     ISPEC   (input) INTEGER
C             Specifies the parameter to be returned as the value of
C             UE01MD, as follows:
C             = 1: the optimal blocksize; if the returned value is 1, an
C                  unblocked algorithm will give the best performance;
C             = 2: the minimum block size for which the block routine
C                  should be used; if the usable block size is less than
C                  this value, an unblocked routine should be used;
C             = 3: the crossover point (in a block routine, for N less
C                  than this value, an unblocked routine should be used)
C             = 4: the number of shifts, used in the product eigenvalue
C                  routine;
C             = 8: the crossover point for the multishift QR method for
C                  product eigenvalue problems.
C
C     NAME    (input) CHARACTER*(*)
C             The name of the calling subroutine, in either upper case
C             or lower case.
C
C     OPTS    (input) CHARACTER*(*)
C             The character options to the subroutine NAME, concatenated
C             into a single character string.
C
C     N1      (input) INTEGER
C     N2      (input) INTEGER
C     N3      (input) INTEGER
C             Problem dimensions for the subroutine NAME; these may not
C             all be required.
C
C     CONTRIBUTORS
C
C     D. Kressner, Technical Univ. Berlin, Germany, and
C     P. Benner, Technical Univ. Chemnitz, Germany, December 2003.
C
C     REVISIONS
C
C     V. Sima, June 2008 (SLICOT version of the HAPACK routine ILAHAP).
C
C     ******************************************************************
C
C     .. Scalar Arguments ..
      CHARACTER*( * )    NAME, OPTS
      INTEGER            ISPEC, N1, N2, N3
C
C     .. Local Scalars ..
      LOGICAL            CNAME, SNAME
      CHARACTER*1        C1, C3
      CHARACTER*2        C2
      CHARACTER*6        SUBNAM
      INTEGER            I, IC, IZ, NB, NBMIN, NX
C     .. External Functions ..
      INTEGER            ILAENV
      EXTERNAL           ILAENV
C     .. Intrinsic Functions ..
      INTRINSIC          CHAR, ICHAR, MAX
C
C     .. Executable Statements ..
C
      IF ( ISPEC.EQ.1 .OR. ISPEC.EQ.2 .OR. ISPEC.EQ.3 ) THEN
C
C        Convert NAME to upper case if the first character is lower
C        case.
C
         UE01MD = 1
         SUBNAM = NAME
         IC = ICHAR( SUBNAM( 1:1 ) )
         IZ = ICHAR( 'Z' )
         IF ( IZ.EQ.90 .OR. IZ.EQ.122 ) THEN
C
C           ASCII character set.
C
            IF ( IC.GE.97 .AND. IC.LE.122 ) THEN
               SUBNAM( 1:1 ) = CHAR( IC-32 )
               DO 10 I = 2, 6
                  IC = ICHAR( SUBNAM( I:I ) )
                  IF( IC.GE.97 .AND. IC.LE.122 )
     $               SUBNAM( I:I ) = CHAR( IC-32 )
   10          CONTINUE
            END IF
C
         ELSE IF ( IZ.EQ.233 .OR. IZ.EQ.169 ) THEN
C
C           EBCDIC character set.
C
            IF ( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
     $           ( IC.GE.145 .AND. IC.LE.153 ) .OR.
     $           ( IC.GE.162 .AND. IC.LE.169 ) ) THEN
               SUBNAM( 1:1 ) = CHAR( IC+64 )
               DO 20 I = 2, 6
                  IC = ICHAR( SUBNAM( I:I ) )
                  IF ( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
     $                 ( IC.GE.145 .AND. IC.LE.153 ) .OR.
     $                 ( IC.GE.162 .AND. IC.LE.169 ) )
     $               SUBNAM( I:I ) = CHAR( IC+64 )
   20          CONTINUE
            END IF
C
         ELSE IF ( IZ.EQ.218 .OR. IZ.EQ.250 ) THEN
C
C           Prime machines:  ASCII+128.
C
            IF ( IC.GE.225 .AND. IC.LE.250 ) THEN
               SUBNAM( 1:1 ) = CHAR( IC-32 )
               DO 30 I = 2, 6
                  IC = ICHAR( SUBNAM( I:I ) )
                  IF ( IC.GE.225 .AND. IC.LE.250 )
     $               SUBNAM( I:I ) = CHAR( IC-32 )
   30          CONTINUE
            END IF
         END IF
C
         C1 = SUBNAM( 1:1 )
         SNAME = C1.EQ.'S' .OR. C1.EQ.'D'
         CNAME = C1.EQ.'C' .OR. C1.EQ.'Z'
         IF ( .NOT.( CNAME .OR. SNAME ) )
     $      RETURN
         C2 = SUBNAM( 4:5 )
         C3 = SUBNAM( 6:6 )
C
         IF ( ISPEC.EQ.1 ) THEN
C
C           Block size.
C
            NB = 1
            IF ( C2.EQ.'4S' .OR. C2.EQ.'4T' ) THEN
               IF ( C3.EQ.'B' ) THEN
                  NB = ILAENV( 1, 'DGEQRF', ' ', N1, N2, -1, -1 ) / 2
               ELSE IF ( C3.EQ.'T' ) THEN
                  NB = ILAENV( 1, 'DGEHRD', ' ', N1, N2, N1, -1 ) / 4
               END IF
            ELSE IF ( C2.EQ.'4P' ) THEN
               IF ( C3.EQ.'B' ) THEN
                  NB = ILAENV( 1, 'DGEHRD', ' ', N1, N2, N1, -1 ) / 2
               END IF
            ELSE IF ( C2.EQ.'4W' .OR. C2.EQ.'4Q' ) THEN
               IF ( C3.EQ.'D' ) THEN
                  NB = ILAENV( 1, 'DORGQR', ' ', N1, N2, N3, -1 ) / 2
               ELSE IF ( C3.EQ.'B' ) THEN
                  NB = ILAENV( 1, 'DORMQR', ' ', N1, N2, N3, -1 ) / 2
               END IF
**          ELSE IF ( C2.EQ.'SH' ) THEN
**             IF ( C3.EQ.'PVB' ) THEN
**                NB = ILAENV( 1, 'DGEHRD', ' ', N1, N2, N1, -1 ) / 2
**             END IF
            END IF
            UE01MD = NB
         ELSE IF ( ISPEC.EQ.2 ) THEN
C
C           Minimum block size.
C
            NBMIN = 2
            IF ( C2.EQ.'4S' .OR. C2.EQ.'4T' ) THEN
               IF ( C3.EQ.'B' ) THEN
                  NBMIN = MAX( 2, ILAENV( 2, 'DGEQRF', ' ', N1, N2, -1,
     $                                    -1 ) / 2 )
               ELSE IF ( C3.EQ.'T' ) THEN
                  NBMIN = MAX( 2, ILAENV( 2, 'DGEHRD', ' ', N1, N2, N1,
     $                                    -1 ) / 4 )
               END IF
            ELSE IF ( C2.EQ.'4P' ) THEN
               IF ( C3.EQ.'B' ) THEN
                  NBMIN = MAX( 2, ILAENV( 2, 'DGEHRD', ' ', N1, N2, N1,
     $                                    -1 ) / 4 )
               END IF
            ELSE IF ( C2.EQ.'4W' .OR. C2.EQ.'4Q' ) THEN
               IF ( C3.EQ.'D' ) THEN
                  NBMIN = MAX( 2, ILAENV( 2, 'DORGQR', ' ', N1, N2, N3,
     $                                    -1 ) / 2 )
               ELSE IF ( C3.EQ.'B' ) THEN
                  NBMIN = MAX( 2, ILAENV( 2, 'DORMQR', ' ', N1, N2, N3,
     $                                    -1 ) / 2 )
               END IF
**          ELSE IF ( C2.EQ.'SH' ) THEN
**             IF ( C3.EQ.'PVB' ) THEN
**                NBMIN = MAX( 2, ILAENV( 2, 'DGEHRD', ' ', N1, N2, N1,
**   $                                    -1 ) / 4 )
**             END IF
            END IF
            UE01MD = NBMIN
         ELSE IF ( ISPEC.EQ.3 ) THEN
C
C           Crossover point.
C
            NX = 0
            IF ( C2.EQ.'4S' .OR. C2.EQ.'4T' ) THEN
               IF ( C3.EQ.'B' ) THEN
                  NX = ILAENV( 3, 'DGEQRF', ' ', N1, N2, -1, -1 )
               ELSE IF ( C3.EQ.'T' ) THEN
                  NX = ILAENV( 3, 'DGEHRD', ' ', N1, N2, N1, -1 ) / 2
               END IF
            ELSE IF ( C2.EQ.'4P' ) THEN
               IF ( C3.EQ.'B' ) THEN
                  NX = ILAENV( 3, 'DGEHRD', ' ', N1, N2, N1, -1 ) / 2
               END IF
            ELSE IF ( C2.EQ.'4W' .OR. C2.EQ.'4Q' ) THEN
               IF ( C3.EQ.'D' ) THEN
                  NX = ILAENV( 3, 'DORGQR', ' ', N1, N2, N3, -1 )
               ELSE IF ( C3.EQ.'B' ) THEN
                  NX = ILAENV( 3, 'DORGQR', ' ', N1, N2, N3, -1 )
               END IF
**          ELSE IF ( C2.EQ.'SH' ) THEN
**             IF ( C3.EQ.'PVB' ) THEN
**                NX = ILAENV( 3, 'DGEHRD', ' ', N1, N2, N1, -1 ) / 2
**             END IF
            END IF
            UE01MD = NX
         END IF
      ELSE IF ( ISPEC.EQ.4 ) THEN
C
C        Number of shifts (used by MB03XP).
C
         UE01MD = ILAENV( 4, 'DHSEQR', OPTS, N1, N2, N3, -1 )
      ELSE IF ( ISPEC.EQ.8 ) THEN
C
C        Crossover point for multishift (used by MB03XP).
C
         UE01MD = ILAENV( 8, 'DHSEQR', OPTS, N1, N2, N3, -1 )
      ELSE
C
C        Invalid value for ISPEC.
C
         UE01MD = -1
      END IF
      RETURN
C *** Last line of UE01MD ***
      END