15 &MYID,N,IOLDPS,TYPE,IW, LIW, A, LA,
16 &POSFAC, LRLU, LRLUS, IWPOS, PTRAST, PTRFAC, STEP, KEEP,KEEP8,
26 INTEGER IOLDPS,
TYPE, LIW, N, KEEP(500)
27 INTEGER(8) :: SIZE_INPLACE, LA, POSFAC, LRLU, LRLUS
28 INTEGER(8) :: PTRAST(KEEP(28))
31 DOUBLE PRECISION A( LA )
34 INTEGER (8) :: PTRFAC(KEEP(28))
36 INTEGER IOLDSHIFT, IPSSHIFT
37 INTEGER LRGROUPS(N), NASS
38 include
'mumps_headers.h'
39 INTEGER LCONT, NELIM, NROW, NPIV, INTSIZ
40 INTEGER NFRONT, NSLAVES
42 INTEGER(8) :: SIZELU, SIZECB, IAPOS, I, SIZESHIFT, ITMP8
45 LOGICAL LRCOMPRESS_PANEL
49 ioldshift = ioldps + keep(ixsz)
50 IF ( iw( ioldshift ) < 0 )
THEN
51 write(*,*)
' ERROR 1 compressLU:Should not point to a band.'
53 ELSE IF ( iw( ioldshift + 2 ) < 0 )
THEN
54 write(*,*)
' ERROR 2 compressLU:Stack not performed yet',
58 lcont = iw( ioldshift )
59 nelim = iw( ioldshift + 1 )
60 nrow = iw( ioldshift + 2 )
61 npiv = iw( ioldshift + 3 )
62 iapos = ptrfac(iw( ioldshift + 4 ))
63 nslaves= iw( ioldshift + 5 )
65 intsiz = iw(ioldps+xxi)
66 lrcompress_panel = (iw(ioldps+xxlr).GE.2)
67 IF ( (nslaves > 0 .AND.
TYPE .NE. 2) .OR.
68 & (nslaves .eq. 0 .AND.
TYPE .EQ. 2 ) ) then
69 WRITE(*,*)
' ERROR 3 compressLU: problem with level of inode'
72 IF ( keep(50) .EQ. 0 )
THEN
73 sizelu = int(lcont + nrow, 8) * int(npiv,8)
75 IF ( keep(459) .GT. 1 )
THEN
77 & iw(ioldshift+6+nslaves+nfront), sizelu)
78 sizelu = sizelu + int( nrow - npiv, 8 ) * int( npiv, 8 )
80 sizelu = int(nrow,8) * int(npiv,8)
84 sizecb = sizexxr - sizelu
87 & .OR.(lrcompress_panel.AND.keep(486).EQ.2)
92 IF (sizecb.EQ.0_8)
THEN
96 IF (keep(201).EQ.2)
THEN
97 IF (keep(405) .EQ. 0)
THEN
98 keep8(31)=keep8(31)+sizelu
103 keep8(31)=keep8(31)+sizelu
109 WRITE(*,*)myid,
': Internal error in DMUMPS_NEW_FACTOR'
113 IF ( ioldps + intsiz .NE. iwpos )
THEN
114 ips = ioldps + intsiz
116 DO WHILE ( ips .NE. iwpos )
118 ipsshift = ips + keep(ixsz)
119 IF ( ipsize .LE. 0 .OR. ips .GT. iwpos )
THEN
120 WRITE(*,*)
" Internal error 1 DMUMPS_COMPRESS_LU"
121 WRITE(*,*)
" IOLDPS, INTSIZ, IWPOS, LIW=",
122 & ioldps, intsiz, iwpos, liw
123 WRITE(*,*)
" IWPOS, IPS, IPSIZE =", iwpos, ips, ipsize
124 WRITE(*,*)
" Header at IOLDPS =",
125 & iw(ioldps:ioldps+keep
126 WRITE(*,*)
" Header at IPS =",
127 & iw(ips:ips+keep(ixsz)+5)
130 IF (ips+ipsize .GT. iwpos)
THEN
131 WRITE(*,*)
" Internal error 2 DMUMPS_COMPRESS_LU"
132 WRITE(*,*)
" IOLDPS, INTSIZ, IWPOS, LIW=",
133 & ioldps, intsiz, iwpos, liw
134 WRITE(*,*)
" IWPOS, IPS, IPSIZE =", iwpos, ips, ipsize
135 WRITE(*,*)
" Header at IOLDPS =",
136 & iw(ioldps:ioldps+keep(ixsz)+5)
137 WRITE(*,*)
" Header at IOLDPS+INTSIZ =",
138 & iw(ioldps+intsiz:ioldps+intsiz+keep(ixsz)+5)
139 WRITE(*,*)
" Header at IPS =",
140 & iw(ips:ips+keep(ixsz)+5)
141 WRITE(*,*)
" ========================== "
142 WRITE(*,*)
" Headers starting at IOLDPS:"
144 DO WHILE (ips .LE. iwpos)
145 WRITE(*,*)
" -> new IW header at position" , ips,
":",
146 & iw(ips:ips+keep(ixsz)+5)
147 ips = ips + iw(ips+xxi)
151 IF ( iw( ipsshift + 2 ) < 0 )
THEN
152 nfront = iw( ipsshift )
153 IF (iw(ipsshift+4) .LT. 0)
THEN
154 WRITE(*,*)
" Internal error 3 DMUMPS_COMPRESS_LU"
155 WRITE(*,*)
" IPS,IPSSHIFT,IWPOS=" ,ips,ipsshift,iwpos
156 WRITE(*,*)
" Header at IPS =", iw(ips:ips+keep(ixsz)+5)
158 ptrfac(iw(ipsshift+4))=ptrfac(iw(ipsshift+4)) -
161 ptrast(iw(ipsshift+4))=ptrast(iw(ipsshift+4))-sizecb
163 ELSE IF ( iw( ipsshift ) < 0 )
THEN
164 IF (iw(ipsshift+3) .LT. 0)
THEN
165 WRITE(*,*)
" Internal error 4 DMUMPS_COMPRESS_LU"
166 WRITE(*,*)
" IPS,IPSSHIFT,IWPOS=" ,ips,ipsshift,iwpos
167 WRITE(*,*)
" Header at IPS =", iw(ips:ips+keep(ixsz)+5)
169 ptrfac(iw(ipsshift+3)) = ptrfac(iw(ipsshift+3))
173 IF (iw(ipsshift+4) .LT. 0)
THEN
174 WRITE(*,*)
" Internal error 4 DMUMPS_COMPRESS_LU"
175 WRITE(*,*)
" IPS,IPSSHIFT,IWPOS=" ,ips,ipsshift,iwpos
176 WRITE(*,*)
" Header at IPS =", iw(ips:ips+keep(ixsz)+5)
178 ptrfac(iw( ipsshift + 4 )) =
179 & ptrfac(iw( ipsshift + 4 )) - sizecb - sizeshift
183 IF (sizecb+sizeshift .NE. 0_8)
THEN
184 DO i=iapos+sizelu-sizeshift, posfac-sizecb-sizeshift-1_8
185 a( i ) = a( i + sizecb + sizeshift)
189 posfac = posfac - (sizecb+sizeshift)
190 lrlu = lrlu + (sizecb+sizeshift)
191 itmp8 = (sizecb+sizeshift) - size_inplace
192 lrlus = lrlus + itmp8
193 IF (keep(405) .EQ. 0)
THEN
194 keep8(69) = keep8(69) - itmp8
197 keep8(69) = keep8(69) - itmp8
201 IF (lrcompress_panel.AND.keep(486).EQ.2)
THEN
203 & la-lrlus,sizelu-sizeshift,-(sizecb+sizeshift)+size_inplace,
207 & la-lrlus,sizelu,-sizecb+size_inplace,
213 & PTRIST, PTRAST, PTLUST_S, PTRFAC, IW, LIW, A, LA,
214 & LRLU, LRLUS, IWPOS, IWPOSCB, POSFAC, COMP,
215 & IPTRLU, OPELIW, STEP, PIMASTER, PAMASTER,
216 & IFLAG, IERROR, SLAVEF, PROCNODE_STEPS, DAD, MYID, COMM,
217 & KEEP, KEEP8, DKEEP, TYPE_SON
224 INTEGER(8) :: LA, LRLU, LRLUS, POSFAC, IPTRLU
225 INTEGER N, ISON, LIW, IWPOS, IWPOSCB,
226 & COMP, IFLAG, IERROR, SLAVEF, , COMM,
229 INTEGER(8) KEEP8(150)
230 DOUBLE PRECISION DKEEP(230)
231 INTEGER,
INTENT(IN) :: PROCNODE_STEPS(KEEP(28)), DAD(KEEP(28))
232 INTEGER(8) :: PTRAST(KEEP(28)), PAMASTER(KEEP(28))
233 INTEGER PTRIST(KEEP(28)), STEP(N),
234 & pimaster(keep(28)), iw(liw)
235 INTEGER PTLUST_S(KEEP(28))
236 INTEGER(8) :: PTRFAC(KEEP(28))
237 DOUBLE PRECISION OPELIW
238 DOUBLE PRECISION FLOP1, FLOP1_EFFECTIVE
239 DOUBLE PRECISION A( LA )
240 INTEGER(8) :: LREQA, POSA, , OLDPOS, JJ
241 INTEGER NFRONT, NCOL_L, NROW_L, LREQI, NSLAVES_L,
242 & posi, i, irow_l, icol_l, lda_band, nass
243 LOGICAL NONEED_TO_COPY_FACTORS
244 INTEGER(8) :: LREQA_HEADER
245 INTEGER LIWFAC, STRAT, TYPEFile, NextPivDummy,
248 TYPE(io_block) :: MonBloc
250 include
'mumps_headers.h'
251 DOUBLE PRECISION ZERO
252 parameter(zero=0.0d0)
253 DOUBLE PRECISION,
POINTER,
DIMENSION(:) :: SON_A
254 INTEGER(8) :: IACHK, SIZFR_SON_A, ITMP8
256 ncol_l = iw( ptrist(step( ison )) + 3 + keep(ixsz) )
257 nrow_l = iw( ptrist(step( ison )) + 2 + keep(ixsz) )
258 nslaves_l = iw( ptrist(step( ison )) + 5 + keep(ixsz) )
259 lrstatus = iw( ptrist(step( ison )) + xxlr)
260 lda_band = ncol_l + iw( ptrist(step( ison )) + keep(ixsz) )
261 IF ( keep(50) .eq. 0 )
THEN
264 nfront = iw( ptrist(step( ison )) + 7 + keep(ixsz) )
266 IF (keep(201).EQ.1)
THEN
267 ioldps_cb = ptrist(step( ison ))
268 liwfac = iw(ioldps_cb+xxi)
272 monbloc%MASTER = .false.
274 monbloc%NROW = nrow_l
275 monbloc%NCOL = lda_band
276 monbloc%NFS = iw(ioldps_cb+1+keep(ixsz))
277 monbloc%LastPiv = ncol_l
278 monbloc%LastPanelWritten_L=-9999
279 monbloc%LastPanelWritten_U=-9999
280 NULLIFY(monbloc%INDICES)
281 strat = strat_write_max
283 monbloc%Last = .true.
285 & a, la, ptrast(step(ison)),
286 & iw(ptrist(step(ison))+xxd),
287 & iw(ptrist(step(ison))+xxr),
288 & son_a, iachk, sizfr_son_a)
291 & son_a(iachk), sizfr_son_a, monbloc,
292 & nextpivdummy, nextpivdummy,
293 & iw(ioldps_cb), liwfac,
294 & myid, keep8(31), iflag,last_call )
295 IF ((ncol_l.EQ.0).OR.(nrow_l.EQ.0))
THEN
298 noneed_to_copy_factors = ((keep(201).EQ.1) .OR. (keep(201).EQ.-1)
299 & .OR. (lrstatus.GE.2.AND.keep(486).EQ.2)
301 IF ((ncol_l.EQ.0).OR.(nrow_l.EQ.0))
THEN
304 lreqi = 4 + ncol_l + nrow_l + keep(ixsz)
305 lreqa_header = int(ncol_l,8) * int(nrow_l,8)
306 IF (noneed_to_copy_factors)
THEN
311 IF ( lrlu .LT. lreqa .OR.
312 & iwpos + lreqi - 1 .GT. iwposcb )
THEN
313 IF ( lrlus .LT. lreqa )
THEN
320 & iwpos,iwposcb, ptrist, ptrast,
321 & step, pimaster, pamaster, lrlus,
322 & keep(ixsz), comp, dkeep(97),
323 & myid, slavef, procnode_steps, dad )
324 IF ( lrlu .NE. lrlus )
THEN
325 WRITE(*,*)
'PB compress DMUMPS_STACK_BAND:LRLU,LRLUS=',
331 IF ( iwpos + lreqi - 1 .GT. iwposcb )
THEN
333 ierror = iwpos + lreqi - 1 - iwposcb
337 IF (.NOT. noneed_to_copy_factors)
THEN
339 posfac = posfac + lreqa
341 lrlus = lrlus - lreqa
342 keep8(67) =
min(lrlus, keep8(67))
343 keep8(69) = keep8(69) + lreqa
344 keep8(68) =
max(keep8(69), keep8(68))
345 IF(keep(201).NE.2)
THEN
347 & la-lrlus,lreqa,lreqa,keep,keep8,lrlus)
350 & la-lrlus,0_8,lreqa,keep,keep8,lrlus)
354 iwpos = iwpos + lreqi
355 ptlust_s(step( ison )) = posi
356 iw(posi:posi+keep(ixsz)-1)=-99999
362 iw(posi+xxlr) = lrstatus
363 iw(posi+xxf) = iw(ptrist(step(ison))+xxf)
365 iw( posi ) = - ncol_l
366 iw( posi + 1 ) = nrow_l
367 iw( posi + 2 ) = nfront - ncol_l
368 iw( posi + 3 ) = step(ison)
369 IF (.NOT. noneed_to_copy_factors)
THEN
370 ptrfac(step(ison)) = posa
372 ptrfac(step(ison)) = -77777_8
374 irow_l = ptrist(step(ison)) + 6 + nslaves_l + keep(ixsz)
375 icol_l = ptrist(step(ison)) + 6 + nrow_l + nslaves_l + keep(ixsz)
377 iw( posi+3+i ) = iw( irow_l+i-1 )
380 iw( posi+nrow_l+3+i) = iw( icol_l+i-1 )
382 IF (.NOT.noneed_to_copy_factors)
THEN
384 & a, la, ptrast(step(ison)),
385 & iw(ptrist(step(ison))+xxd),
386 & iw(ptrist(step(ison))+xxr),
387 & son_a, iachk, sizfr_son_a)
390 oldpos = iachk + int(i-1,8)*int(lda_band,8)
391 DO jj = 0_8, int(ncol_l-1,8)
392 a( posaloc+jj ) = son_a( oldpos+jj )
394 posaloc = posaloc + int(ncol_l,8)
397 IF (keep(201).EQ.2)
THEN
398 keep8(31)=keep8(31)+lreqa
400 itmp8 = int(ncol_l,8) * int(nrow_l,8)
401 IF (keep(405) .EQ.1)
THEN
403 keep8(10) = keep8(10) + itmp8
406 keep8(10) = keep8(10) + itmp8
408 IF (keep(201).EQ.2)
THEN
411 WRITE(*,*)myid,
': Internal error in DMUMPS_NEW_FACTOR'
415 posfac = posfac - lreqa
417 lrlus = lrlus + lreqa
419 keep8(69) = keep8(69) - lreqa
422 & la-lrlus,lreqa,0_8,keep,keep8,lrlus)
425 IF (type_son == 1)
THEN
428 IF ( keep(50) .eq. 0 )
THEN
429 flop1 = dble( ncol_l * nrow_l) +
430 & dble(nrow_l*ncol_l)*dble(2*nfront-ncol_l-1)
432 flop1 = dble( ncol_l ) * dble( nrow_l )
433 & * dble( 2 * lda_band - nrow_l - ncol_l + 1)
435 opeliw = opeliw + flop1
436 flop1_effective = flop1
437 nass = iw( ptrist(step( ison )) + 4 + keep(ixsz) )
438 IF ( ncol_l .NE. nass )
THEN
439 IF ( keep(50).eq.0 )
THEN
440 flop1 = dble( nass * nrow_l) +
441 & dble(nrow_l*nass)*dble(2*nfront-nass-1)
443 flop1 = dble( nass ) * dble( nrow_l ) *
444 & dble( 2 * lda_band - nrow_l - nass + 1)