83
87 IMPLICIT NONE
88 INTEGER, intent(in) :: N, NELT, LIW, IOLDPS, INODE
89 INTEGER(8), intent(in) :: LA, POSELT, LINTARR, LDBLARR
90 INTEGER, intent(in) :: IW(LIW)
91 INTEGER, intent(in) :: KEEP(500)
92 INTEGER(8), intent(in) :: KEEP8(150)
93 INTEGER, intent(inout) :: ITLOC(+KEEP(253))
94 REAL, intent(inout) :: A(LA)
95 REAL, intent(in) :: RHS_MUMPS(KEEP(255))
96 INTEGER, intent(in) :: INTARR(LINTARR)
97 REAL, intent(in) :: DBLARR(LDBLARR)
98 INTEGER, intent(in) :: (N+1), FRT_ELT(NELT)
99 INTEGER, intent(in) :: FILS(N)
100 INTEGER(8), intent(in) :: PTRAIW(NELT+1), PTRARW(NELT+1)
101 INTEGER, INTENT(IN) :: LRGROUPS(N)
102
103
104
105 include 'mumps_headers.h'
106 INTEGER :: HF, NBROWF, NBCOLF, NASS, NSLAVES
107 INTEGER :: ILOC, IELL, ELTI, ELBEG, NUMELT
108 INTEGER(8) :: SIZE_ELTI8
109 INTEGER :: I, J, K, K1, K2
110 INTEGER :: IPOS, IPOS1, IPOS2, JPOS, IJROW
111 INTEGER :: IN
112 INTEGER(8) :: II8, JJ8, J18, J28
113 INTEGER(8) :: AINPUT8
114 INTEGER(8) :: AII8
115 INTEGER(8) :: APOS, APOS2, ICT12
116 INTEGER, POINTER, DIMENSION(:) ::
117 INTEGER :: NB_BLR_LS, NPARTSCB, NPARTSASS, MAXI_CLUSTER,
118 & IBCKSZ2, MINSIZE, TOPDIAG
119 INTEGER(8) :: JJ3
120 INTEGER :: K1RHS, K2RHS, JFirstRHS
121 REAL ZERO
122 parameter( zero = 0.0e0 )
123 nbcolf = iw(ioldps+keep(ixsz))
124 nbrowf = iw(ioldps+2+keep(ixsz))
125 nass = iw(ioldps+1+keep(ixsz))
126 nslaves= iw(ioldps+5 + keep(ixsz))
127 hf = 6 + nslaves + keep(ixsz)
128
129 IF (keep(50) .EQ. 0 .OR. nbrowf .LT. keep(63)) THEN
130
131
132
133
134 DO jj8=poselt, poselt+int(nbrowf,8)*int(nbcolf,8)-1_8
135 a(jj8) = zero
136 ENDDO
137
138 ELSE
139 topdiag = 0
140 IF (iw(ioldps+xxlr).GE.1) THEN
141 CALL get_cut(iw(ioldps+hf:ioldps+hf+nbrowf-1), 0,
142 & nbrowf, lrgroups, npartscb,
143 & npartsass, begs_blr_ls)
144 nb_blr_ls = npartscb
145 call max_cluster(begs_blr_ls,nb_blr_ls+1,maxi_cluster)
146 DEALLOCATE(begs_blr_ls)
148 minsize = int(ibcksz2 / 2)
149 topdiag =
max(2*minsize + maxi_cluster-1, topdiag)
150 ENDIF
151
152
153
154
155 DO jj8 = 0_8, int(nbrowf-1,8)
156 apos = poselt+ jj8*int(nbcolf,8)
157 jj3 =
min( int(nbcolf,8) - 1_8,
158 & jj8 + int(nbcolf-nbrowf,8) + topdiag )
159 a(apos: apos+jj3) = zero
160 ENDDO
161
162 ENDIF
163 k1 = ioldps + hf + nbrowf
164 k2 = k1 + nbcolf - 1
165 jpos = 1
166 DO k = k1, k2
167 j = iw(k)
168 itloc(j) = -jpos
169 jpos = jpos + 1
170 END DO
171 k1 = ioldps + hf
172 k2 = k1 + nbrowf - 1
173 jpos = 1
174 IF ((keep(253).GT.0).AND.(keep(50).NE.0)) THEN
175 k1rhs = 0
176 k2rhs = -1
177 DO k = k1, k2
178 j = iw(k)
179 itloc(j) = -itloc(j)*nbcolf + jpos
180 IF ((k1rhs.EQ.0).AND.(j.GT.n)) THEN
181 k1rhs = k
182 jfirstrhs=j-n
183 ENDIF
184 jpos = jpos + 1
185 ENDDO
186 IF (k1rhs.GT.0) k2rhs=k2
187 IF ( k2rhs.GE.k1rhs ) THEN
188 in = inode
189 DO WHILE (in.GT.0)
190 ijrow = -itloc(in)
191 DO k = k1rhs, k2rhs
192 j = iw(k)
193 i = itloc(j)
194 iloc = mod(i,nbcolf)
195 apos = poselt+int(iloc-1,8)*int(nbcolf,8) +
196 & int(ijrow-1,8)
197 a(apos) = a(apos) + rhs_mumps(
198 & (jfirstrhs+(k-k1rhs)-1)*keep(254)+ in)
199 ENDDO
200 in = fils(in)
201 ENDDO
202 ENDIF
203 ELSE
204 DO k = k1, k2
205 j = iw(k)
206 itloc(j) = -itloc(j)*nbcolf + jpos
207 jpos = jpos + 1
208 END DO
209 ENDIF
210 elbeg = frt_ptr(inode)
211 numelt = frt_ptr(inode+1) - elbeg
212 DO iell=elbeg,elbeg+numelt-1
213 elti = frt_elt(iell)
214 j18= ptraiw(elti)
215 j28= ptraiw(elti+1)-1_8
216 aii8 = ptrarw(elti)
217 size_elti8 = j28 - j18 + 1_8
218 DO ii8=j18,j28
219 i = itloc(intarr(ii8))
220 IF (keep(50).EQ.0) THEN
221 IF (i.LE.0) cycle
222 ainput8 = aii8 + ii8 - j18
223 ipos = mod(i,nbcolf)
224 ict12 = poselt + int(ipos-1,8) * int(nbcolf,8)
225 DO jj8 = j18, j28
226 jpos = itloc(intarr(jj8))
227 IF (jpos.LE.0) THEN
228 jpos = -jpos
229 ELSE
230 jpos = jpos/nbcolf
231 END IF
232 apos2 = ict12 + int(jpos - 1,8)
233 a(apos2) = a(apos2) + dblarr(ainput8)
234 ainput8 = ainput8 + size_elti8
235 END DO
236 ELSE
237 IF ( i .EQ. 0 ) THEN
238 aii8 = aii8 + j28 - ii8 + 1_8
239 cycle
240 ENDIF
241 IF ( i .LE. 0 ) THEN
242 ipos1 = -i
243 ipos2 = 0
244 ELSE
245 ipos1 = i/nbcolf
246 ipos2 = mod(i,nbcolf)
247 END IF
248 ict12 = poselt + int(ipos2-1,8)*int(nbcolf,8)
249 DO jj8=ii8,j28
250 aii8 = aii8 + 1_8
251 j = itloc(intarr(jj8))
252 IF ( j .EQ. 0 ) cycle
253 IF ( ipos2.EQ.0 .AND. j.LE.0) cycle
254 IF ( j .LE. 0 ) THEN
255 jpos = -j
256 ELSE
257 jpos = j/nbcolf
258 END IF
259 IF ( (ipos1.GE.jpos) .AND. (ipos2.GT.0) ) THEN
260 apos2 = ict12 + int(jpos - 1,8)
261 a(apos2) = a(apos2) + dblarr(aii8-1_8)
262 END IF
263 IF ( (ipos1.LT.jpos) .AND. (j.GT.0) ) THEN
264 ipos = mod(j,nbcolf)
265 jpos = ipos1
266 apos2 = poselt + int(ipos-1,8)*int(nbcolf,8)
267 & + int(jpos
268 a(apos2) = a(apos2) + dblarr(aii8-1_8)
269 END IF
270 END DO
271 END IF
272 END DO
273 END DO
274 k1 = ioldps + hf + nbrowf
275 k2 = k1 + nbcolf - 1
276 DO k = k1, k2
277 j = iw(k)
278 itloc(j) = 0
279 END DO
subroutine compute_blr_vcs(k472, ibcksz, maxsize, nass)
subroutine get_cut(iwr, nass, ncb, lrgroups, npartscb, npartsass, cut)
subroutine max_cluster(cut, cut_size, maxi_cluster)