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