2
3
4
5
6
7
8
9 CHARACTER UPLO
10 INTEGER IA, JA, N
11
12
13 INTEGER DESCA( * )
14 DOUBLE PRECISION A( * )
15
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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
123 $ LLD_, MB_, M_, NB_, N_, RSRC_
124 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
125 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
126 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
127 DOUBLE PRECISION ONE
128 parameter( one = 1.0d+0 )
129
130
131 INTEGER IACOL, IAROW, ICURR, IDIAG, IIA, IOFFA, JJA,
132 $ LDA, MYCOL, MYROW, NA, NPCOL, NPROW
133 DOUBLE PRECISION AII
134
135
136 EXTERNAL blacs_gridinfo,
infog2l, dgemv, dscal
137
138
139 LOGICAL LSAME
140 DOUBLE PRECISION DDOT
142
143
144
145
146
147 IF( n.EQ.0 )
148 $ RETURN
149
150
151
152 CALL blacs_gridinfo( desca( ctxt_ ), nprow, npcol, myrow, mycol )
153 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
154 $ iarow, iacol )
155
156 IF( myrow.EQ.iarow .AND. mycol.EQ.iacol ) THEN
157
158 lda = desca( lld_ )
159 idiag = iia + ( jja - 1 ) * lda
160 ioffa = idiag
161
162 IF(
lsame( uplo,
'U' ) )
THEN
163
164
165
166 DO 10 na = n-1, 1, -1
167 aii = a( idiag )
168 icurr = idiag + lda
169 a( idiag ) = aii*aii + ddot( na, a( icurr ), lda,
170 $ a( icurr ), lda )
171 CALL dgemv( 'No transpose', n-na-1, na, one,
172 $ a( ioffa+lda ), lda, a( icurr ), lda, aii,
173 $ a( ioffa ), 1 )
174 idiag = idiag + lda + 1
175 ioffa = ioffa + lda
176 10 CONTINUE
177 aii = a( idiag )
178 CALL dscal( n, aii, a( ioffa ), 1 )
179
180 ELSE
181
182
183
184 DO 20 na = 1, n-1
185 aii = a( idiag )
186 icurr = idiag + 1
187 a(idiag) = aii*aii + ddot( n-na, a( icurr ), 1,
188 $ a( icurr ), 1 )
189 CALL dgemv( 'Transpose', n-na, na-1, one, a( ioffa+1 ),
190 $ lda, a( icurr ), 1, aii, a( ioffa ), lda )
191 idiag = idiag + lda + 1
192 ioffa = ioffa + 1
193 20 CONTINUE
194 aii = a( idiag )
195 CALL dscal( n, aii, a( ioffa ), lda )
196
197 END IF
198
199 END IF
200
201 RETURN
202
203
204
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)