2
3
4
5
6
7
8
9 CHARACTER UPLO
10 INTEGER IA, JA, N
11
12
13 INTEGER DESCA( * )
14 REAL 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 REAL ONE
126 parameter( one = 1.0e+0 )
127
128
129 INTEGER I, J, JB, JN
130
131
132 EXTERNAL psgemm,
pslauu2, pstrmm, pssyrk
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 pslauu2(
'Upper', jb, a, ia, ja, desca )
158 IF( jb.LE.n-1 ) THEN
159 CALL pssyrk( '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 pstrmm( 'Right', 'Upper', 'Transpose', 'Non-unit',
169 $ j-ja, jb, one, a, i, j, desca, a, ia, j,
170 $ desca )
171 CALL pslauu2(
'Upper', jb, a, i, j, desca )
172 IF( j+jb.LE.ja+n-1 ) THEN
173 CALL psgemm( '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 pssyrk( '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 pslauu2(
'Lower', jb, a, ia, ja, desca )
188 IF( jb.LE.n-1 ) THEN
189 CALL pssyrk( '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 pstrmm( 'Left', 'Lower', 'Transpose', 'Non-unit', jb,
199 $ j-ja, one, a, i, j, desca, a, i, ja, desca )
200 CALL pslauu2(
'Lower', jb, a, i, j, desca )
201 IF( j+jb.LE.ja+n-1 ) THEN
202 CALL psgemm( '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 pssyrk( '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 pslauu2(uplo, n, a, ia, ja, desca)