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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
121 $ LLD_, MB_, M_, NB_, N_, RSRC_
122 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
123 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
124 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
125 DOUBLE PRECISION ONE
126 parameter( one = 1.0d+0 )
127
128
129 INTEGER I, J, JB, JN
130
131
132 EXTERNAL pdgemm,
pdlauu2, pdtrmm, pdsyrk
133
134
135 LOGICAL LSAME
136 INTEGER ICEIL
138
139
141
142
143
144
145
146 IF( n.EQ.0 )
147 $ RETURN
148
149 jn =
min(
iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
150 IF(
lsame( uplo,
'U' ) )
THEN
151
152
153
154
155
156 jb = jn-ja+1
157 CALL pdlauu2(
'Upper', jb, a, ia, ja, desca )
158 IF( jb.LE.n-1 ) THEN
159 CALL pdsyrk( 'Upper', 'No transpose', jb, n-jb, one, a, ia,
160 $ ja+jb, desca, one, a, ia, ja, desca )
161 END IF
162
163
164
165 DO 10 j = jn+1, ja+n-1, desca( nb_ )
166 jb =
min( n-j+ja, desca( nb_ ) )
167 i = ia + j - ja
168 CALL pdtrmm( 'Right', 'Upper', 'Transpose', 'Non-unit',
169 $ j-ja, jb, one, a, i, j, desca, a, ia, j,
170 $ desca )
171 CALL pdlauu2(
'Upper', jb, a, i, j, desca )
172 IF( j+jb.LE.ja+n-1 ) THEN
173 CALL pdgemm( 'No transpose', 'Transpose', j-ja, jb,
174 $ n-j-jb+ja, one, a, ia, j+jb, desca, a, i,
175 $ j+jb, desca, one, a, ia, j, desca )
176 CALL pdsyrk( 'Upper', 'No transpose', jb, n-j-jb+ja, one,
177 $ a, i, j+jb, desca, one, a, i, j, desca )
178 END IF
179 10 CONTINUE
180 ELSE
181
182
183
184
185
186 jb = jn-ja+1
187 CALL pdlauu2(
'Lower', jb, a, ia, ja, desca )
188 IF( jb.LE.n-1 ) THEN
189 CALL pdsyrk( 'Lower', 'Transpose', jb, n-jb, one, a, ia+jb,
190 $ ja, desca, one, a, ia, ja, desca )
191 END IF
192
193
194
195 DO 20 j = jn+1, ja+n-1, desca( nb_ )
196 jb =
min( n-j+ja, desca( nb_ ) )
197 i = ia + j - ja
198 CALL pdtrmm( 'Left', 'Lower', 'Transpose', 'Non-unit', jb,
199 $ j-ja, one, a, i, j, desca, a, i, ja, desca )
200 CALL pdlauu2(
'Lower', jb, a, i, j, desca )
201 IF( j+jb.LE.ja+n-1 ) THEN
202 CALL pdgemm( 'Transpose', 'No transpose', jb, j-ja,
203 $ n-j-jb+ja, one, a, i+jb, j, desca, a, i+jb,
204 $ ja, desca, one, a, i, ja, desca )
205 CALL pdsyrk( 'Lower', 'Transpose', jb, n-j-jb+ja, one,
206 $ a, i+jb, j, desca, one, a, i, j, desca )
207 END IF
208 20 CONTINUE
209 END IF
210
211 RETURN
212
213
214
integer function iceil(inum, idenom)
subroutine pdlauu2(uplo, n, a, ia, ja, desca)