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 REAL 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 AJJ, ASUM, BIGNUM, SMLNUM
143
144
145 INTEGER NUMROC
146 REAL PSLAMCH, PSLANGE
148
149
152
153
154 INTRINSIC mod, sign
155
156
157
158 ictxt = desca( ctxt_ )
159 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
160
161 IF( m.LE.0 .OR. n.LE.0 )
162 $ RETURN
163
164
165
166 iroffa = mod( ia-1, desca( mb_ ) )
167 icoffa = mod( ja-1, desca( nb_ ) )
168 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia,
169 $ jja, iarow, iacol )
170 mp =
numroc( m+iroffa, desca( mb_ ), myrow, iarow, nprow )
171 nq =
numroc( n+icoffa, desca( nb_ ), mycol, iacol, npcol )
172 IF( myrow.EQ.iarow )
173 $ mp = mp - iroffa
174 IF( mycol.EQ.iacol )
175 $ nq = nq - icoffa
176
177 CALL psmatgen( ictxt,
'N',
'N', desca( m_ ), desca( n_ ),
178 $ desca( mb_ ), desca( nb_ ), a, desca( lld_ ),
179 $ desca( rsrc_ ), desca( csrc_ ), iseed, iia-1, mp,
180 $ jja-1, nq, myrow, mycol, nprow, npcol )
181
182 DO 10 j = ja, ja+n-1
183 i = ia + j - ja
184 IF( i.LE.ia+m-1 ) THEN
185 CALL psasum( m, asum, a, ia, j, desca, 1 )
186 CALL pselget(
'Column',
' ', ajj, a, i, j, desca )
187 ajj = ajj + sign( asum, ajj )
188 CALL pselset( a, i, j, desca, ajj )
189 END IF
190 10 CONTINUE
191
192
193
194 IF( scale.NE.1 ) THEN
195
196 norma =
pslange(
'M', m, n, a, ia, ja, desca, work )
197 smlnum =
pslamch( ictxt,
'Safe minimum' )
198 bignum = one / smlnum
199 CALL pslabad( ictxt, smlnum, bignum )
200 smlnum = smlnum /
pslamch( ictxt,
'Epsilon' )
201 bignum = one / smlnum
202
203 IF( scale.EQ.2 ) THEN
204
205
206
207 CALL pslascl(
'General', norma, bignum, m, n, a, ia,
208 $ ja, desca, info )
209
210 ELSE IF( scale.EQ.3 ) THEN
211
212
213
214 CALL pslascl(
'General', norma, smlnum, m, n, a, ia,
215 $ ja, desca, info )
216
217 END IF
218
219 END IF
220
221 norma =
pslange(
'One-norm', m, n, a, ia, ja, desca, work )
222
223 RETURN
224
225
226
subroutine psmatgen(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 pselget(scope, top, alpha, a, ia, ja, desca)
subroutine pselset(a, ia, ja, desca, alpha)
subroutine pslabad(ictxt, small, large)
real function pslange(norm, m, n, a, ia, ja, desca, work)
subroutine pslascl(type, cfrom, cto, m, n, a, ia, ja, desca, info)