3
4
5
6
7
8
9
10 INTEGER IA, ISEED, JA, M, N, SCALE
11 REAL NORMA
12
13
14 INTEGER DESCA( * )
15 REAL WORK( * )
16 COMPLEX A( * )
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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
131 $ LLD_, MB_, M_, NB_, N_, RSRC_
132 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
133 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
134 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
135 REAL ONE
136 parameter( one = 1.0e0 )
137
138
139 INTEGER I, IACOL, IAROW, ICOFFA, ICTXT, IIA, INFO,
140 $ IROFFA, J, JJA, MP, MYCOL, MYROW, NPCOL,
141 $ NPROW, NQ
142 REAL ASUM, BIGNUM, SMLNUM
143 COMPLEX AJJ
144
145
146 INTEGER NUMROC
147 REAL PCLANGE, PSLAMCH
149
150
154
155
156 INTRINSIC cmplx, mod, real, sign
157
158
159
160 ictxt = desca( ctxt_ )
161 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
162
163 IF( m.LE.0 .OR. n.LE.0 )
164 $ RETURN
165
166
167
168 iroffa = mod( ia-1, desca( mb_ ) )
169 icoffa = mod( ja-1, desca( nb_ ) )
170 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia,
171 $ jja, iarow, iacol )
172 mp =
numroc( m+iroffa, desca( mb_ ), myrow, iarow, nprow )
173 nq =
numroc( n+icoffa, desca( nb_ ), mycol, iacol, npcol )
174 IF( myrow.EQ.iarow )
175 $ mp = mp - iroffa
176 IF( mycol.EQ.iacol )
177 $ nq = nq - icoffa
178
179 CALL pcmatgen( ictxt,
'N',
'N', desca( m_ ), desca( n_ ),
180 $ desca( mb_ ), desca( nb_ ), a, desca( lld_ ),
181 $ desca( rsrc_ ), desca( csrc_ ), iseed, iia-1, mp,
182 $ jja-1, nq, myrow, mycol, nprow, npcol )
183
184 DO 10 j = ja, ja+n-1
185 i = ia + j - ja
186 IF( i.LE.ia+m-1 ) THEN
187 CALL pscasum( m, asum, a, ia, j, desca, 1 )
188 CALL pcelget(
'Column',
' ', ajj, a, i, j, desca )
189 ajj = ajj +
cmplx( sign( asum, real( ajj ) ) )
190 CALL pcelset( a, i, j, desca, ajj )
191 END IF
192 10 CONTINUE
193
194
195
196 IF( scale.NE.1 ) THEN
197
198 norma =
pclange(
'M', m, n, a, ia, ja, desca, work )
199 smlnum =
pslamch( ictxt,
'Safe minimum' )
200 bignum = one / smlnum
201 CALL pslabad( ictxt, smlnum, bignum )
202 smlnum = smlnum /
pslamch( ictxt,
'Epsilon' )
203 bignum = one / smlnum
204
205 IF( scale.EQ.2 ) THEN
206
207
208
209 CALL pclascl(
'General', norma, bignum, m, n, a, ia,
210 $ ja, desca, info )
211
212 ELSE IF( scale.EQ.3 ) THEN
213
214
215
216 CALL pclascl(
'General', norma, smlnum, m, n, a, ia,
217 $ ja, desca, info )
218
219 END IF
220
221 END IF
222
223 norma =
pclange(
'One-norm', m, n, a, ia, ja, desca, work )
224
225 RETURN
226
227
228
subroutine pcmatgen(ictxt, aform, diag, m, n, mb, nb, a, lda, iarow, iacol, iseed, iroff, irnum, icoff, icnum, myrow, mycol, nprow, npcol)
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)
subroutine pcelget(scope, top, alpha, a, ia, ja, desca)
subroutine pcelset(a, ia, ja, desca, alpha)
real function pclange(norm, m, n, a, ia, ja, desca, work)
subroutine pclascl(type, cfrom, cto, m, n, a, ia, ja, desca, info)
subroutine pslabad(ictxt, small, large)