3
4
5
6
7
8
9
10 CHARACTER TRANS
11 INTEGER IA, IB, INFO, JA, JB, N, NRHS
12
13
14 INTEGER DESCA( * ), DESCB( * ), IPIV( * )
15 REAL A( * ), B( * )
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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
153 $ LLD_, MB_, M_, NB_, N_, RSRC_
154 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
155 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
156 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
157 REAL ONE
158 parameter( one = 1.0e+0 )
159
160
161 LOGICAL NOTRAN
162 INTEGER IAROW, IBROW, ICOFFA, ICTXT, IROFFA, IROFFB,
163 $ MYCOL, MYROW, NPCOL, NPROW
164
165
166 INTEGER DESCIP( DLEN_ ), IDUM1( 1 ), IDUM2( 1 )
167
168
171
172
173 LOGICAL LSAME
174 INTEGER INDXG2P, NUMROC
176
177
178 INTRINSIC ichar, mod
179
180
181
182
183
184 ictxt = desca( ctxt_ )
185 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
186
187
188
189 info = 0
190 IF( nprow.EQ.-1 ) THEN
191 info = -(700+ctxt_)
192 ELSE
193 notran =
lsame( trans,
'N' )
194 CALL chk1mat( n, 2, n, 2, ia, ja, desca, 7, info )
195 CALL chk1mat( n, 2, nrhs, 3, ib, jb, descb, 12, info )
196 IF( info.EQ.0 ) THEN
197 iarow =
indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
198 $ nprow )
199 ibrow =
indxg2p( ib, descb( mb_ ), myrow, descb( rsrc_ ),
200 $ nprow )
201 iroffa = mod( ia-1, desca( mb_ ) )
202 icoffa = mod( ja-1, desca( nb_ ) )
203 iroffb = mod( ib-1, descb( mb_ ) )
204 IF( .NOT.notran .AND. .NOT.
lsame( trans,
'T' ) .AND. .NOT.
205 $
lsame( trans,
'C' ) )
THEN
206 info = -1
207 ELSE IF( iroffa.NE.0 ) THEN
208 info = -5
209 ELSE IF( icoffa.NE.0 ) THEN
210 info = -6
211 ELSE IF( desca( mb_ ).NE.desca( nb_ ) ) THEN
212 info = -(700+nb_)
213 ELSE IF( iroffb.NE.0 .OR. ibrow.NE.iarow ) THEN
214 info = -10
215 ELSE IF( descb( mb_ ).NE.desca( nb_ ) ) THEN
216 info = -(1200+nb_)
217 ELSE IF( ictxt.NE.descb( ctxt_ ) ) THEN
218 info = -(1200+ctxt_)
219 END IF
220 END IF
221 IF( notran ) THEN
222 idum1( 1 ) = ichar( 'N' )
223 ELSE IF(
lsame( trans,
'T' ) )
THEN
224 idum1( 1 ) = ichar( 'T' )
225 ELSE
226 idum1( 1 ) = ichar( 'C' )
227 END IF
228 idum2( 1 ) = 1
229 CALL pchk2mat( n, 2, n, 2, ia, ja, desca, 7, n, 2, nrhs, 3,
230 $ ib, jb, descb, 12, 1, idum1, idum2, info )
231 END IF
232
233 IF( info.NE.0 ) THEN
234 CALL pxerbla( ictxt,
'PSGETRS', -info )
235 RETURN
236 END IF
237
238
239
240 IF( n.EQ.0 .OR. nrhs.EQ.0 )
241 $ RETURN
242
243 CALL descset( descip, desca( m_ ) + desca( mb_ )*nprow, 1,
244 $ desca( mb_ ), 1, desca( rsrc_ ), mycol, ictxt,
245 $ desca( mb_ ) +
numroc( desca( m_ ), desca( mb_ ),
246 $ myrow, desca( rsrc_ ), nprow ) )
247
248 IF( notran ) THEN
249
250
251
252
253
254 CALL pslapiv(
'Forward',
'Row',
'Col', n, nrhs, b, ib, jb,
255 $ descb, ipiv, ia, 1, descip, idum1 )
256
257
258
259 CALL pstrsm( 'Left', 'Lower', 'No transpose', 'Unit', n, nrhs,
260 $ one, a, ia, ja, desca, b, ib, jb, descb )
261
262
263
264 CALL pstrsm( 'Left', 'Upper', 'No transpose', 'Non-unit', n,
265 $ nrhs, one, a, ia, ja, desca, b, ib, jb, descb )
266 ELSE
267
268
269
270
271
272 CALL pstrsm( 'Left', 'Upper', 'Transpose', 'Non-unit', n, nrhs,
273 $ one, a, ia, ja, desca, b, ib, jb, descb )
274
275
276
277 CALL pstrsm( 'Left', 'Lower', 'Transpose', 'Unit', n, nrhs,
278 $ one, a, ia, ja, desca, b, ib, jb, descb )
279
280
281
282 CALL pslapiv(
'Backward',
'Row',
'Col', n, nrhs, b, ib, jb,
283 $ descb, ipiv, ia, 1, descip, idum1 )
284
285 END IF
286
287 RETURN
288
289
290
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
subroutine descset(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pchk2mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, mb, mbpos0, nb, nbpos0, ib, jb, descb, descbpos0, nextra, ex, expos, info)
subroutine pslapiv(direc, rowcol, pivroc, m, n, a, ia, ja, desca, ipiv, ip, jp, descip, iwork)
subroutine pxerbla(ictxt, srname, info)