3
4
5
6
7
8
9 IMPLICIT NONE
10
11
12 LOGICAL
13 CHARACTER RANGE
14 INTEGER IL, , MAXSIZE, N, VALSIZE, VECSIZE
15 REAL VL, VU
16
17
18
19 INTEGER DESCA( * ), ISEED( 4 )
20 REAL WIN( * )
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 INTEGER CTXT_, MB_
104 parameter( ctxt_ = 2, mb_ = 5 )
105 REAL TWENTY
106 parameter( twenty = 20.0e0 )
107
108
109
110 INTEGER ILMIN, IUMAX,
111 $ MQ0, MYCOL, MYIL, MYIU, MYROW, NB, NEIG, NN,
112 $ NP0, NPCOL, NPROW
113 REAL ANORM, EPS, SAFMIN
114
115
116 LOGICAL LSAME
117 INTEGER ICEIL, NUMROC
118 REAL SLARAN, PSLAMCH
120
121
123
124
125 INTRINSIC abs, real, int,
max
126
127
128
129
131 eps =
pslamch( desca( ctxt_ ),
'Precision' )
132 safmin =
pslamch( desca( ctxt_ ),
'Safe Minimum' )
133 nb = desca( mb_ )
135 np0 =
numroc( nn, nb, 0, 0, nprow )
136
137 valsize = 3 + 5*n +
max( 12*nn, nb*( np0+1 ) )
138
139 IF( wknown ) THEN
140 anorm = safmin / eps
141 IF( n.GE.1 )
142 $ anorm =
max( abs( win( 1 ) ), abs( win( n ) ), anorm )
143 IF(
lsame( range,
'I' ) )
THEN
144 IF( il.LT.0 )
145 $ il = int(
slaran( iseed )*real( n ) ) + 1
146 IF( iu.LT.0 )
147 $ iu = int(
slaran( iseed )*real( n-il ) ) + il
148 IF( n.EQ.0 )
149 $ iu = 0
150 ELSE IF(
lsame( range,
'V' ) )
THEN
151 IF( vl.GT.vu ) THEN
152 myil = int(
slaran( iseed )*real( n ) ) + 1
153 myiu = int(
slaran( iseed )*real( n-myil ) ) + myil
154 vl = win( myil ) - twenty*eps*abs( win( myil ) )
155 vu = win( myiu ) + twenty*eps*abs( win( myiu ) )
156 vu =
max( vu, vl+eps*twenty*abs( vl )+safmin )
157 END IF
158 END IF
159
160 END IF
161 IF(
lsame( range,
'V' ) )
THEN
162
163 ilmin = 1
164 iumax = n
165 ELSE IF(
lsame( range,
'I' ) )
THEN
166 ilmin = il
167 iumax = iu
168 ELSE IF(
lsame( range,
'A' ) )
THEN
169 ilmin = 1
170 iumax = n
171 END IF
172
173 neig = iumax - ilmin + 1
174
175 mq0 =
numroc(
max( neig, nb, 2 ), nb, 0, 0, npcol )
176
177 vecsize = 3 + 5*n +
max( 18*nn, np0*mq0+2*nb*nb ) +
178 $ (2 +
iceil( neig, nprow*npcol ))*nn
179
180 valsize =
max(3, valsize)
181 vecsize =
max(3, vecsize)
182 maxsize = vecsize
183
184 RETURN
185
186
187
logical function lsame(ca, cb)
LSAME
real function slaran(iseed)
SLARAN
integer function iceil(inum, idenom)
subroutine blacs_gridinfo(cntxt, nprow, npcol, myrow, mycol)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
real function pslamch(ictxt, cmach)