3
4
5
6
7
8
9
10 INTEGER IA, ISEED, JA, M, N, SCALE
11 DOUBLE PRECISION NORMA
12
13
14 INTEGER DESCA( * )
15 DOUBLE PRECISION WORK( * )
16 DOUBLE PRECISION 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 DOUBLE PRECISION ONE
136 parameter( one = 1.0d0 )
137
138
139 INTEGER I, IACOL, IAROW, ICOFFA, ICTXT, IIA, INFO,
140 $ IROFFA, J, JJA, MP, MYCOL, MYROW, NPCOL,
141 $ NPROW, NQ
142 DOUBLE PRECISION AJJ, ASUM, BIGNUM, SMLNUM
143
144
145 INTEGER NUMROC
146 DOUBLE PRECISION PDLAMCH, PDLANGE
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 pdmatgen( 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 pdasum( m, asum, a, ia, j, desca, 1 )
186 CALL pdelget(
'Column',
' ', ajj, a, i, j, desca )
187 ajj = ajj + sign( asum, ajj )
188 CALL pdelset( a, i, j, desca, ajj )
189 END IF
190 10 CONTINUE
191
192
193
194 IF( scale.NE.1 ) THEN
195
196 norma =
pdlange(
'M', m, n, a, ia, ja, desca, work )
197 smlnum =
pdlamch( ictxt,
'Safe minimum' )
198 bignum = one / smlnum
199 CALL pdlabad( ictxt, smlnum, bignum )
200 smlnum = smlnum /
pdlamch( ictxt,
'Epsilon' )
201 bignum = one / smlnum
202
203 IF( scale.EQ.2 ) THEN
204
205
206
207 CALL pdlascl(
'General', norma, bignum, m, n, a, ia,
208 $ ja, desca, info )
209
210 ELSE IF( scale.EQ.3 ) THEN
211
212
213
214 CALL pdlascl(
'General', norma, smlnum, m, n, a, ia,
215 $ ja, desca, info )
216
217 END IF
218
219 END IF
220
221 norma =
pdlange(
'One-norm', m, n, a, ia, ja, desca, work )
222
223 RETURN
224
225
226
subroutine pdmatgen(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)
double precision function pdlamch(ictxt, cmach)
subroutine pdelget(scope, top, alpha, a, ia, ja, desca)
subroutine pdelset(a, ia, ja, desca, alpha)
subroutine pdlabad(ictxt, small, large)
double precision function pdlange(norm, m, n, a, ia, ja, desca, work)
subroutine pdlascl(type, cfrom, cto, m, n, a, ia, ja, desca, info)