17 & MYID, INODE, N, IOLDPS, HF, LP, LPOK,
18 & NFRONT, NFRONT_EFF, PERM, DAD,
19 & NASS1, NASS, NUMSTK, NUMORG, IWPOSCB, IWPOS,
20 & IFSON, STEP, PIMASTER, PTRIST, PTRAIW, IW, LIW,
21 & INTARR, LINTARR, ITLOC, FILS, FRERE_STEPS,
22 & SON_LEVEL2, NIV1, KEEP,KEEP8, IFLAG,
23 & ISON_IN_PLACE, PROCNODE_STEPS, SLAVEF,
24 & SONROWS_PER_ROW, LSONROWS_PER_ROW
25 & , MUMPS_TPS_ARR, L0_OMP_MAPPING
29 INTEGER INODE, N, IOLDPS, HF, NFRONT, NASS1, LIW, ,
30 & NUMSTK, NUMORG, IFSON, MYID, LP
31 LOGICAL,
intent(in) :: LPOK
32 INTEGER,
intent(in) :: ISON_IN_PLACE
35 INTEGER(8),
INTENT(IN) :: PTRAIW(N)
36 INTEGER (N), PIMASTER(KEEP(28)), PTRIST(KEEP(28)),
37 & itloc(n+keep(253)), fils(n), frere_steps(keep(28)),
39 INTEGER,
TARGET :: IW(LIW)
40 INTEGER,
INTENT(IN),
TARGET :: IWPOSCB
41 INTEGER,
INTENT(IN) :: IWPOS
42 INTEGER(8),
INTENT(IN) :: LINTARR
43 INTEGER :: INTARR(LINTARR)
44 LOGICAL,
intent(in) :: NIV1
45 INTEGER,
intent(inout) :: IFLAG
46 LOGICAL,
intent(out) :: SON_LEVEL2
47 INTEGER,
intent(out) :: NFRONT_EFF
48 INTEGER,
intent(in) :: DAD (KEEP(28))
49 INTEGER,
intent(in) :: PROCNODE_STEPS(KEEP(28)), SLAVEF
50 TYPE (MUMPS_TPS_T),
TARGET,
OPTIONAL :: MUMPS_TPS_ARR(:)
51 INTEGER,
intent(in),
OPTIONAL :: L0_OMP_MAPPING(:)
52 INTEGER,
intent(in) :: LSONROWS_PER_ROW
53 INTEGER,
intent(out) :: SONROWS_PER_ROW(LSONROWS_PER_ROW)
54 INTEGER NELIM_SON_IN_PLACE
55 INTEGER NEWEL, IOLDP2, INEW, INEW1,
56 & in, ntotfs, ict11, nelim, npivs, nslson, ncols,
57 & itrans, j, jt1, ison, iell, lstk,
58 & nrows, hs, ip1, ip2, ibrot, iorg,
59 & i, k, iloc, newel_save, newel1_save,
60 & last_j_ass, jmin, min_perm
62 INTEGER :: K1, K2, K3, KK
63 INTEGER(8) :: J18, J28, JJ8, JDEBROW8
64 INTEGER INBPROCFILS_SON
66 INCLUDE
'mumps_headers.h'
68 INTEGER,
POINTER :: SON_IWPOSCB
69 INTEGER,
POINTER,
DIMENSION(:) :: SON_IW
70 INTEGER,
POINTER,
DIMENSION(:) :: , PTLAST
71 INTEGER :: LREQ, allocok
72 INTEGER,
ALLOCATABLE,
TARGET :: TMP_ALLOC_ARRAY(:)
73 INTEGER MUMPS_TYPESPLIT, MUMPS_TYPENODE
74 EXTERNAL mumps_typesplit, mumps_typenode
76 typesplit = mumps_typesplit(procnode_steps(step(inode)),
79 ioldp2 = ioldps + hf - 1
80 ict11 = ioldp2 + nfront
82 nelim_son_in_place = 0
83 IF ( (typesplit.EQ.5).OR.(typesplit.EQ.6) )
THEN
84 k2 = pimaster(step(ifson))
85 lstk = iw(k2 +keep(ixsz))
86 nelim = iw(k2 + 1+keep(ixsz))
87 IF ( ison_in_place > 0 )
THEN
88 IF (ison_in_place.NE.ifson)
THEN
90 &
' Internal error 1 in MUMPS_BUILD_SORT_INDEX ',
91 &
' in place node is not the first son a interior split node '
94 nelim_son_in_place = nelim
96 npivs = iw(k2 + 3+keep(ixsz))
97 IF (npivs.LT.0) npivs = 0
98 nslson = iw(k2 + 5+keep(ixsz))
99 IF( nslson.GT.0) son_level2 = .true.
100 level1_son = nslson.EQ.0
105 write(6,*) myid,
':',
106 &
' Internal error 2 in MUMPS_BUILD_SORT_INDEX ',
107 &
' interior split node of type 1 '
110 i= mumps_typenode(procnode_steps(step(ifson)),keep(199))
111 j= mumps_typesplit(procnode_steps(step(ifson)),
113 IF (level1_son.or.j.LT.4)
THEN
114 write(6,*) myid,
':',
115 &
' Internal error 3 in MUMPS_BUILD_SORT_INDEX ',
117 &
' of interior split node', inode,
' of type 1 ',
118 &
' NSLSON =', nslson,
' TYPE_SON=', i,
'TYPESPLIT_SON=', j
122 son_iwposcb => iwposcb
123 IF (keep(400) .GT. 0 )
THEN
124 IF (
present( l0_omp_mapping ))
THEN
125 ithread=l0_omp_mapping(step(ifson))
126 IF (ithread .GT. 0)
THEN
127 son_iw => mumps_tps_arr(ithread)%IW
128 son_iwposcb => mumps_tps_arr(ithread)%IWPOSCB
132 IF (k2 .GT. son_iwposcb)
THEN
133 inbprocfils_son = k2 + xxnbpr
135 inbprocfils_son = ptrist(step(ifson))+xxnbpr
137 iw(ioldps+xxnbpr)=nslson
138 son_iw(inbprocfils_son) = nslson
139 sonrows_per_row(1:nfront-nass1) = 1
140 IF ( k2.GT. iwposcb )
THEN
141 nrows = iw(k2 + 2+keep(ixsz))
142 itrans = npivs + nrows
144 hs = nslson + 6 + keep(ixsz)
145 k1 = k2 + hs + nrows + npivs
152 iw(ict11 + ntotfs) = jt1
154 iw(ioldp2 + ntotfs) = iw(kk - itrans)
157 DO kk =k3+1, k3+numorg
162 iw(ict11 + ntotfs) = jt1
163 iw(ioldp2 + ntotfs) = jt1
165 DO kk =k3+numorg+1, k2
170 iw(ict11 + ntotfs) = jt1
171 iw(ioldp2 + ntotfs) = jt1
176 j18 = ptraiw(ibrot) + 2
178 intarr(j18) = itloc(jt1)
180 j28 = j18 + intarr(j18 - 2) - intarr(j18 - 1)
182 IF (j18 .LE. j28)
THEN
185 intarr(jj8) = itloc(j)
190 DO kk=k1+nelim,k1+nfront_eff-1
196 IF ((iwpos + lreq -1) .GT. iwposcb)
THEN
197 ALLOCATE(tmp_alloc_array(lreq), stat=allocok)
198 IF (allocok .GT. 0)
THEN
202 pttri => tmp_alloc_array(1:numstk+1)
203 ptlast => tmp_alloc_array(numstk+2:lreq)
205 pttri => iw(iwpos:iwpos+numstk)
206 ptlast => iw(iwpos+numstk+1:iwpos+lreq-1)
209 IF ( ison_in_place > 0 )
THEN
211 k2 = pimaster(step(ison))
212 lstk = iw(k2 +keep(ixsz))
213 nelim = iw(k2 + 1+keep(ixsz))
214 npivs = iw(k2 + 3+keep(ixsz))
215 IF (npivs.LT.0) npivs = 0
216 nslson = iw(k2 + 5+keep(ixsz))
220 IF ( k2 .GT. iwposcb )
THEN
221 nrows = iw(k2 + 2+keep(ixsz))
222 itrans = npivs + nrows
224 hs = nslson + 6 + keep(ixsz)
225 k1 = k2 + hs + nrows + npivs
231 iw(ict11 + ntotfs) = jt1
234 iw(ioldp2 + ntotfs) = iw(kk - itrans)
236 nelim_son_in_place = ntotfs
238 IF (.NOT. niv1) sonrows_per_row(1:nfront-nass1) = 0
240 inew = ioldps + hf + ntotfs
242 jdebrow8 = ptraiw(inode)+3
244 ptlast(numstk+1) = 0 + intarr(jdebrow8-3) - 1
251 iw(inew+nfront) = jt1
255 IF (in .GT. 0)
GOTO 50
256 ntotfs = ntotfs + numorg
257 IF (numstk .NE. 0)
THEN
260 k2 = pimaster(step(ison))
262 son_iwposcb => iwposcb
263 IF ( keep(400) .GT. 0 )
THEN
264 IF (
present( l0_omp_mapping ))
THEN
265 ithread=l0_omp_mapping(step(ison))
266 IF (ithread .GT. 0)
THEN
267 son_iw => mumps_tps_arr(ithread)%IW
268 son_iwposcb => mumps_tps_arr(ithread)%IWPOSCB
272 lstk = son_iw(k2 +keep(ixsz))
273 nelim = son_iw(k2 + 1+keep(ixsz))
274 npivs = son_iw(k2 + 3+keep(ixsz))
275 IF (npivs.LT.0) npivs = 0
276 nslson = son_iw(k2 + 5+keep(ixsz))
277 IF( nslson.GT.0) son_level2 = .true.
278 level1_son = nslson.EQ.0
282 IF ( k2 .GT. son_iwposcb )
THEN
283 inbprocfils_son = k2+xxnbpr
285 inbprocfils_son = ptrist(step(ison))+xxnbpr
288 son_iw(inbprocfils_son) = nslson
289 iw(ioldps+xxnbpr) = iw(ioldps+xxnbpr) + nslson
292 son_iw(inbprocfils_son) = 1
294 son_iw(inbprocfils_son) = nslson
296 iw(ioldps+xxnbpr) = iw(ioldps+xxnbpr) +
297 & son_iw(inbprocfils_son)
299 IF (k2.GT.son_iwposcb)
THEN
300 nrows = son_iw(k2 + 2+keep(ixsz))
301 itrans = npivs + nrows
303 hs = nslson + 6 + keep(ixsz)
304 k1 = k2 + hs + nrows + npivs
305 k2 = k1 + lstk - 1 - keep(253)
307 IF (nelim .NE. 0 .AND. ison.NE.ison_in_place)
THEN
311 iw(ict11 + ntotfs) = jt1
314 iw(ioldp2 + ntotfs) = son_iw(kk - itrans)
320 IF (nass1 .NE. nfront - keep(253))
THEN
323 IF (itloc(j) .EQ. 0)
THEN
330 son_iw(kk) = itloc(son_iw(kk))
332 DO kk=k2+1, k2+keep(253)
333 son_iw(kk)=nfront-keep(253)+kk-k2
336 ison = frere_steps(step(ison))
339 IF (nfront-keep(253).EQ.nass1)
GOTO 500
341 IF ( pttri( numstk + 1 ) .LE. ptlast( numstk + 1 ) )
THEN
342 IF ( itloc( intarr( jdebrow8+pttri( numstk + 1 ) ) ) .NE. 0 )
THEN
343 pttri( numstk + 1 ) = pttri( numstk + 1 ) + 1
348 IF (keep(400) .GT. 0)
THEN
353 IF ( keep(400) .GT. 0 )
THEN
354 IF (
present( mumps_tps_arr ))
THEN
355 ithread = l0_omp_mapping(step(ison))
356 IF (ithread .GT. 0)
THEN
357 son_iw => mumps_tps_arr(ithread
362 IF ( iloc .LE. ptlast( iell ) )
THEN
363 IF ( perm( son_iw( iloc ) ) .LT. min_perm )
THEN
364 jmin = son_iw( iloc )
368 IF (keep(400) .GT. 0)
THEN
369 ison = frere_steps(step(ison))
374 IF ( iloc .LE. ptlast( iell ) )
THEN
375 IF ( perm( intarr( jdebrow8+iloc ) ) .LT. min_perm )
THEN
376 jmin = intarr( jdebrow8+iloc )
377 min_perm = perm( jmin )
380 newel = ioldp2 + nass1 + nfront
381 DO WHILE ( min_perm .NE. n + 1 )
383 nfront_eff = nfront_eff + 1
385 itloc( jmin ) = nfront_eff
388 IF (keep(400) .GT. 0)
THEN
393 IF (keep(400) .GT. 0)
THEN
394 IF (
present( mumps_tps_arr ))
THEN
395 ithread=l0_omp_mapping(step(ison)
396 IF (ithread .GT. 0)
THEN
397 son_iw => mumps_tps_arr(ithread)%IW
401 IF ( pttri( iell ) .LE. ptlast( iell ) )
THEN
402 IF ( son_iw( pttri( iell ) ) .eq. last_j_ass )
403 & pttri( iell ) = pttri( iell ) + 1
405 IF ( pttri( iell ) .LE. ptlast( iell ) )
THEN
406 IF ( perm(son_iw( pttri( iell )) ) .LT. min_perm )
THEN
407 jmin = son_iw( pttri( iell ) )
408 min_perm = perm( jmin )
411 IF (keep(400).GT.0)
THEN
412 ison = frere_steps(step(ison))
417 IF ( pttri( iell ) .LE. ptlast( iell ) )
THEN
418 IF ( intarr( jdebrow8+pttri( iell ) ) .eq. last_j_ass )
THEN
419 pttri( iell ) = pttri( iell ) + 1
423 IF ( pttri( iell ) .LE. ptlast( iell ) )
THEN
424 IF (perm(intarr( jdebrow8+pttri(iell) )) .LT. min_perm)
THEN
425 jmin = intarr( jdebrow8+pttri(iell) )
426 min_perm = perm( jmin )
431 newel1_save = nfront_eff
432 IF (newel1_save.LT.nfront - keep(253))
THEN
435 j18 = ptraiw(ibrot) + 2
436 j28 = j18 + intarr(j18 - 2) - intarr(j18-1)
437 ibrot = fils( ibrot )
438 IF ( iorg.EQ. 1)
THEN
439 IF ( keep(50).NE.0 ) cycle
440 j18 = j18 + 1 + intarr(j18-2)
446 IF ( itloc( j ) .eq. 0 )
THEN
448 nfront_eff = nfront_eff + 1
450 itloc( j ) = nfront_eff
454 IF ( (typesplit.EQ.4).AND.
455 & (nfront_eff.LT.nfront-keep(253)) )
THEN
460 & (procnode_steps(step(dad(step(ibrot)))),keep(199))
465 & (procnode_steps(step(dad(step(ibrot)))),keep(199))
469 ibrot = dad(step(ibrot))
471 DO WHILE (in.GT.0.AND.nfront_eff.LT.nfront-keep(253))
473 j28 = j18 + intarr(j18 - 2) - intarr(j18-1)
477 IF ( itloc( j ) .eq. 0 )
THEN
479 nfront_eff = nfront_eff + 1
481 itloc( j ) = nfront_eff
485 IF (nfront_eff.EQ.nfront-keep(253))
EXIT
487 IF (nfront_eff.NE.nfront-keep(253) .AND.
488 & .NOT. (keep(376).EQ.1 .AND. keep(79) .GE.1))
THEN
489 write(6,*) myid,
': INODE', inode,
' of type 4 ',
490 &
' not yet fully assembled ',
491 &
' NFRONT_EFF, NFRONT =', nfront_eff, nfront
496 IF ( newel1_save .eq. nfront_eff )
THEN
497 DO kk=nass1+1, nfront_eff
498 iw( ioldp2+kk ) = iw( ict11+kk )
502 & iw( newel_save + 1 ), nfront_eff - newel1_save )
504 & iw( newel_save + 1), nfront_eff - newel1_save,
505 & iw( ict11 + nass1 + 1 ), newel1_save - nass1,
506 & iw( ioldp2 + nass1 + 1 ), nfront_eff - nass1 )
507 DO kk = nass1+1, nfront_eff
508 iw(ict11 + kk) = iw(ioldp2+kk)
512 IF ( keep(253).GT.0)
THEN
513 ip1 = ioldps + hf + nfront_eff
514 ip2 = ioldps + hf + nfront + nfront_eff
518 itloc(n+i) = nfront_eff + i
520 nfront_eff = nfront_eff + keep(253)
522 IF (nfront.GT.nfront_eff)
THEN
523 ip1 = ioldps + nfront + hf
524 ip2 = ioldps + nfront_eff + hf
526 iw(ip2+i-1)=iw(ip1+i-1)
528 ELSE IF (nfront .LT. nfront_eff)
THEN
530 WRITE(lp,*)
" Error in MUMPS_BUILD_SORT_INDEX:",
531 &
" matrix structure might have changed,",
532 &
" analysis (JOB=1) should be performed again ",
533 &
" NFRONTexpected, NFRONTeffective=", nfront, nfront_eff
539 & .AND. (nfront-keep(253).GT.nass1)
543 k2 = pimaster(step(ison))
545 son_iwposcb => iwposcb
546 IF (keep(400).GT.0)
THEN
547 IF (
present( mumps_tps_arr ))
THEN
548 ithread=l0_omp_mapping(step(ison))
549 IF (ithread .GT. 0)
THEN
550 son_iw => mumps_tps_arr(ithread)%IW
551 son_iwposcb => mumps_tps_arr(ithread)%IWPOSCB
555 lstk = son_iw(k2+keep(ixsz))
556 nelim = son_iw(k2 + 1 +keep(ixsz))
557 npivs = son_iw(k2 + 3 +keep(ixsz))
558 IF (npivs.LT.0) npivs = 0
559 nslson = son_iw(k2 + 5 +keep(ixsz))
560 level1_son = (nslson .EQ. 0)
563 IF (k2.GT.son_iwposcb)
THEN
564 nrows = son_iw(k2 + 2+keep(ixsz))
566 hs = nslson + 6 +keep(ixsz)
567 k1 = k2 + hs + nrows + npivs
571 IF (nfront-keep(253).GT.nass1)
THEN
574 son_iw(kk) = itloc(j)
575 IF (niv1 .AND. nslson.EQ.0)
THEN
577 IF (son_iw(kk) .LE. nass1 .OR. niv1)
THEN
579 sonrows_per_row(son_iw(kk)-nass1) =
580 & sonrows_per_row(son_iw(kk)-nass1) + 1
586 WRITE(*,*)
"Internal error 1 in MUMPS_BUILD_SORT_INDEX"
589 IF (.not.level1_son)
THEN
592 ison = frere_steps(step(ison))
597 j18 = ptraiw(ibrot) + 2
599 j28 = j18 + intarr(j18 - 2) - intarr(j18 - 1)
603 intarr(jj8) = itloc(j)
607 k2 = k1 + nfront_eff -1
608 IF (keep(50).EQ.0) k2 = k2 + nelim_son_in_place
613 IF (keep(50).EQ.0)
THEN
614 k1 = ioldps+hf+nfront_eff+nelim_son_in_place+numorg
615 k2 = k1 + nass -nelim_son_in_place - 1
622 IF (
allocated(tmp_alloc_array))
DEALLOCATE(tmp_alloc_array)