3
4
5
6
7
8
9
10 CHARACTER EQUED
11 INTEGER IA, JA, M, N
12 REAL AMAX, COLCND, ROWCND
13
14
15 INTEGER DESCA( * )
16 REAL C( * ), R( * )
17 COMPLEX A( * )
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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
157 $ LLD_, MB_, M_, NB_, N_, RSRC_
158 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
159 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
160 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
161 REAL ONE, THRESH
162 parameter( one = 1.0e+0, thresh = 0.1e+0 )
163
164
165 INTEGER I, IACOL, IAROW, ICOFF, ICTXT, IIA, IOFFA,
166 $ IROFF, J, JJA, LDA, MP, MYCOL, MYROW, NPCOL,
167 $ NPROW, NQ
168 REAL CJ, LARGE, SMALL
169
170
171 EXTERNAL blacs_gridinfo,
infog2l
172
173
174 INTEGER NUMROC
175 REAL PSLAMCH
177
178
179 INTRINSIC mod
180
181
182
183
184
185 IF( m.LE.0 .OR. n.LE.0 ) THEN
186 equed = 'N'
187 RETURN
188 END IF
189
190
191
192 ictxt = desca( ctxt_ )
193 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
194 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
195 $ iarow, iacol )
196 iroff = mod( ia-1, desca( mb_ ) )
197 icoff = mod( ja-1, desca( nb_ ) )
198 mp =
numroc( m+iroff, desca( mb_ ), myrow, iarow, nprow )
199 nq =
numroc( n+icoff, desca( nb_ ), mycol, iacol, npcol )
200 IF( myrow.EQ.iarow )
201 $ mp = mp - iroff
202 IF( mycol.EQ.iacol )
203 $ nq = nq - icoff
204 lda = desca( lld_ )
205
206
207
208 small =
pslamch( ictxt,
'Safe minimum' ) /
209 $
pslamch( ictxt,
'Precision' )
210 large = one / small
211
212 IF( rowcnd.GE.thresh .AND. amax.GE.small .AND. amax.LE.large )
213 $ THEN
214
215
216
217 IF( colcnd.GE.thresh ) THEN
218
219
220
221 equed = 'N'
222
223 ELSE
224
225
226
227 ioffa = (jja-1)*lda
228 DO 20 j = jja, jja+nq-1
229 cj = c( j )
230 DO 10 i = iia, iia+mp-1
231 a( ioffa + i ) = cj*a( ioffa + i )
232 10 CONTINUE
233 ioffa = ioffa + lda
234 20 CONTINUE
235 equed = 'C'
236 END IF
237
238 ELSE IF( colcnd.GE.thresh ) THEN
239
240
241
242 ioffa = (jja-1)*lda
243 DO 40 j = jja, jja+nq-1
244 DO 30 i = iia, iia+mp-1
245 a( ioffa + i ) = r( i )*a( ioffa + i )
246 30 CONTINUE
247 ioffa = ioffa + lda
248 40 CONTINUE
249 equed = 'R'
250
251 ELSE
252
253
254
255 ioffa = (jja-1)*lda
256 DO 60 j = jja, jja+nq-1
257 cj = c( j )
258 DO 50 i = iia, iia+mp-1
259 a( ioffa + i ) = cj*r( i )*a( ioffa + i )
260 50 CONTINUE
261 ioffa = ioffa + lda
262 60 CONTINUE
263 equed = 'B'
264
265 END IF
266
267 RETURN
268
269
270
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
real function pslamch(ictxt, cmach)