2
3
4
5
6
7
8
9 CHARACTER UPLO
10 INTEGER IA, JA, N
11
12
13 INTEGER DESCA( * )
14 COMPLEX*16 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 COMPLEX*16 CONE
128 parameter( cone = 1.0d+0 )
129
130
131 INTEGER I, J, JB, JN
132
133
134 EXTERNAL pzgemm, pzherk,
pzlauu2, pztrmm
135
136
137 LOGICAL LSAME
138 INTEGER ICEIL
140
141
143
144
145
146
147
148 IF( n.EQ.0 )
149 $ RETURN
150
151 jn =
min(
iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
152 IF(
lsame( uplo,
'U' ) )
THEN
153
154
155
156
157
158 jb = jn-ja+1
159 CALL pzlauu2(
'Upper', jb, a, ia, ja, desca )
160 IF( jb.LE.n-1 ) THEN
161 CALL pzherk( 'Upper', 'No transpose', jb, n-jb, one, a, ia,
162 $ ja+jb, desca, one, a, ia, ja, desca )
163 END IF
164
165
166
167 DO 10 j = jn+1, ja+n-1, desca( nb_ )
168 jb =
min( n-j+ja, desca( nb_ ) )
169 i = ia + j - ja
170 CALL pztrmm( 'Right', 'Upper', 'Conjugate transpose',
171 $ 'Non-unit', j-ja, jb, cone, a, i, j, desca,
172 $ a, ia, j, desca )
173 CALL pzlauu2(
'Upper', jb, a, i, j, desca )
174 IF( j+jb.LE.ja+n-1 ) THEN
175 CALL pzgemm( 'No transpose', 'Conjugate transpose',
176 $ j-ja, jb, n-j-jb+ja, cone, a, ia, j+jb,
177 $ desca, a, i, j+jb, desca, cone, a, ia,
178 $ j, desca )
179 CALL pzherk( 'Upper', 'No transpose', jb, n-j-jb+ja, one,
180 $ a, i, j+jb, desca, one, a, i, j, desca )
181 END IF
182 10 CONTINUE
183 ELSE
184
185
186
187
188
189 jb = jn-ja+1
190 CALL pzlauu2(
'Lower', jb, a, ia, ja, desca )
191 IF( jb.LE.n-1 ) THEN
192 CALL pzherk( 'Lower', 'Conjugate transpose', jb, n-jb, one,
193 $ a, ia+jb, ja, desca, one, a, ia, ja, desca )
194 END IF
195
196
197
198 DO 20 j = jn+1, ja+n-1, desca( nb_ )
199 jb =
min( n-j+ja, desca( nb_ ) )
200 i = ia + j - ja
201 CALL pztrmm( 'Left', 'Lower', 'Conjugate Transpose',
202 $ 'Non-unit', jb, j-ja, cone, a, i, j, desca, a,
203 $ i, ja, desca )
204 CALL pzlauu2(
'Lower', jb, a, i, j, desca )
205 IF( j+jb.LE.ja+n-1 ) THEN
206 CALL pzgemm( 'Conjugate transpose', 'No transpose', jb,
207 $ j-ja, n-j-jb+ja, cone, a, i+jb, j, desca,
208 $ a, i+jb, ja, desca, cone, a, i, ja, desca )
209 CALL pzherk( 'Lower', 'Conjugate transpose', jb,
210 $ n-j-jb+ja, one, a, i+jb, j, desca, one,
211 $ a, i, j, desca )
212 END IF
213 20 CONTINUE
214 END IF
215
216 RETURN
217
218
219
integer function iceil(inum, idenom)
subroutine pzlauu2(uplo, n, a, ia, ja, desca)