3
4
5
6
7
8
9 IMPLICIT NONE
10
11
12 LOGICAL WKNOWN
13 CHARACTER RANGE
14 INTEGER IL, IU, 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
122 EXTERNAL blacs_gridinfo
123
124
125 INTRINSIC abs, real, int,
max
126
127
128
129
130 CALL blacs_gridinfo( desca( ctxt_ ), nprow, npcol, myrow, mycol )
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
integer function iceil(inum, idenom)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
real function pslamch(ictxt, cmach)
real function slaran(iseed)