18 & MYID, INODE, N, IOLDPS,
19 & HF, NFRONT, NFRONT_EFF, PERM,
20 & NASS1, NASS, NUMSTK, NUMORG, IWPOSCB, IWPOS,
21 & IFSON, STEP, PIMASTER, PTRIST, PTRAIW, NELT,
23 & INTARR, LINTARR, ITLOC,
25 & KEEP, SON_LEVEL2, NIV1, IFLAG,
26 & DAD, PROCNODE_STEPS, SLAVEF,
27 & FRT_PTR, FRT_ELT, Pos_First_NUMORG,
28 & SONROWS_PER_ROW, LSONROWS_PER_ROW
29 & , MUMPS_TPS_ARR, L0_OMP_MAPPING
33 INTEGER NELT, INODE, N, IOLDPS, HF, NFRONT, NASS1, LIW, NASS,
34 & NUMSTK, NUMORG, IFSON, MYID, IFLAG,
38 INTEGER(8),
INTENT(IN) :: PTRAIW(NELT+1)
39 INTEGER STEP(N), PIMASTER(KEEP(28)), (KEEP(28)),
40 & ITLOC(N+(253)), FILS(N), FRERE_STEPS(KEEP(28)),
42 INTEGER,
TARGET :: IW(LIW)
43 INTEGER,
INTENT(IN),
TARGET :: IWPOSCB
44 INTEGER,
INTENT(IN) :: IWPOS
45 INTEGER(8),
INTENT(IN) :: LINTARR
46 INTEGER :: INTARR(LINTARR)
47 LOGICAL,
intent(in) :: NIV1
48 LOGICAL,
intent(out) :: SON_LEVEL2
49 INTEGER,
intent(out) :: NFRONT_EFF
50 INTEGER,
intent(in) :: DAD (KEEP(28))
51 INTEGER,
intent(in) :: PROCNODE_STEPS(KEEP(28)), SLAVEF
52 TYPE (),
TARGET,
OPTIONAL :: MUMPS_TPS_ARR(:)
53 INTEGER,
intent(in),
OPTIONAL :: L0_OMP_MAPPING(:)
54 INTEGER,
intent(in) :: FRT_PTR(N+1), FRT_ELT(NELT)
55 INTEGER,
intent(out) :: Pos_First_NUMORG
56 INTEGER,
intent(in) :: LSONROWS_PER_ROW
57 INTEGER,
intent(out) :: SONROWS_PER_ROW(LSONROWS_PER_ROW)
58 INTEGER NEWEL, IOLDP2, INEW, INEW1,
59 & in, ntotfs, ict11, nelim, npivs, nslson, ncols,
60 & itrans, j, jt1, ison, iell, lstk,
61 & nrows, hs, ip1, ip2, ibrot,
62 & i, iloc, newel_save, newel1_save,
63 & last_j_ass, jmin, min_perm
64 INTEGER :: K, K1, K2, K3, KK
65 INTEGER(8) :: JJ8, J18, J28
67 INTEGER INBPROCFILS_SON
69 INTEGER ELTI, NUMELT_IBROT
70 include
'mumps_headers.h'
72 INTEGER,
POINTER :: SON_IWPOSCB
73 INTEGER,
POINTER,
DIMENSION(:) :: SON_IW
74 INTEGER,
POINTER,
DIMENSION(:) :: PTTRI, PTLAST
75 INTEGER :: LREQ, allocok
76 INTEGER,
ALLOCATABLE,
TARGET :: TMP_ALLOC_ARRAY(:)
77 INTEGER MUMPS_TYPESPLIT, MUMPS_TYPENODE
78 EXTERNAL mumps_typesplit, mumps_typenode
81 typesplit = mumps_typesplit(procnode_steps(step(inode)),
84 ioldp2 = ioldps + hf - 1
85 ict11 = ioldp2 + nfront
88 IF ( (typesplit.EQ.5).OR.(typesplit.EQ.6) )
THEN
89 k2 = pimaster(step(ifson))
90 lstk = iw(k2 +keep(ixsz))
91 nelim = iw(k2 + 1+keep(ixsz))
92 npivs = iw(k2 + 3+keep(ixsz))
93 IF (npivs.LT.0) npivs = 0
94 nslson = iw(k2 + 5+keep(ixsz))
95 IF( nslson.GT.0) son_level2 = .true.
96 level1_son = nslson.EQ.0
101 write(6,*) myid,
':',
102 &
' Internal error 2 in MUMPS_ELT_BUILD_SORT ',
103 &
' interior split node of type 1 '
106 i= mumps_typenode(procnode_steps(step(ifson)),keep(199))
107 j= mumps_typesplit(procnode_steps(step(ifson)),
109 IF (level1_son.or.j.LT.4)
THEN
110 write(6,*) myid,
':',
111 &
' Internal error 3 in MUMPS_ELT_BUILD_SORT ',
113 &
' of interior split node', inode,
' of type 1 ',
114 &
' NSLSON =', nslson,
' TYPE_SON=', i,
'TYPESPLIT_SON=', j
118 son_iwposcb => iwposcb
119 IF (keep(400) .GT. 0 )
THEN
120 IF (
present( l0_omp_mapping ))
THEN
121 ithread=l0_omp_mapping(step(ifson))
122 IF (ithread .GT. 0)
THEN
123 son_iw => mumps_tps_arr(ithread)%IW
124 son_iwposcb => mumps_tps_arr(ithread)%IWPOSCB
128 IF (k2 .GT. son_iwposcb)
THEN
129 inbprocfils_son = k2 + xxnbpr
131 inbprocfils_son = ptrist(step(ifson))+xxnbpr
133 iw(ioldps+xxnbpr)=nslson
134 son_iw(inbprocfils_son) = nslson
135 sonrows_per_row(1:nfront-nass1) = 1
136 IF ( k2.GT. iwposcb )
THEN
137 nrows = iw(k2 + 2+keep(ixsz))
138 itrans = npivs + nrows
140 hs = nslson + 6 + keep(ixsz)
141 k1 = k2 + hs + nrows + npivs
148 iw(ict11 + ntotfs) = jt1
150 iw(ioldp2 + ntotfs) = iw(kk - itrans)
158 iw(ict11 + ntotfs) = jt1
159 iw(ioldp2 + ntotfs) = jt1
163 elti = list_elt(iell)
165 j28= ptraiw(elti+1)-1
168 intarr(jj8) = itloc(j)
171 pos_first_numorg = itloc(inode)
173 DO kk=k1+nelim,k1+nfront_eff-1
179 IF ((iwpos + lreq -1) .GT. iwposcb)
THEN
180 ALLOCATE(tmp_alloc_array(lreq), stat=allocok)
181 IF (allocok .GT. 0)
THEN
185 pttri => tmp_alloc_array(1:numstk)
188 pttri => iw(iwpos:iwpos+numstk-1)
189 ptlast => iw(iwpos+numstk:iwpos+lreq)
191 IF (.NOT. niv1) sonrows_per_row(1:nfront-nass1) = 0
204 IF (numstk .NE. 0)
THEN
207 k2 = pimaster(step(ison))
209 son_iwposcb => iwposcb
210 IF ( keep(400) .GT. 0 )
THEN
211 IF (
present( l0_omp_mapping ))
THEN
212 ithread=l0_omp_mapping(step(ison))
213 IF (ithread .GT. 0)
THEN
214 son_iw => mumps_tps_arr(ithread)%IW
215 son_iwposcb => mumps_tps_arr(ithread)%IWPOSCB
219 lstk = son_iw(k2 +keep(ixsz))
220 nelim = son_iw(k2 + 1+keep(ixsz))
221 npivs = son_iw(k2 + 3+keep(ixsz))
222 IF (npivs.LT.0) npivs = 0
223 nslson = son_iw(k2 + 5+keep(ixsz))
224 IF( nslson.GT.0) son_level2 = .true.
225 level1_son = nslson.EQ.0
229 IF (k2 .GT. son_iwposcb)
THEN
230 inbprocfils_son = k2+xxnbpr
232 inbprocfils_son = ptrist(step(ison))+xxnbpr
235 son_iw(inbprocfils_son) = nslson
236 iw(ioldps+xxnbpr) = iw(ioldps+xxnbpr) + nslson
239 son_iw(inbprocfils_son) = 1
241 son_iw(inbprocfils_son) = nslson
243 iw(ioldps+xxnbpr) = iw(ioldps+xxnbpr) +
244 & son_iw(inbprocfils_son)
246 IF (k2.GT.son_iwposcb)
THEN
247 nrows = son_iw(k2 + 2+keep(ixsz))
248 itrans = npivs + nrows
250 hs = nslson + 6 + keep(ixsz)
251 k1 = k2 + hs + nrows + npivs
252 k2 = k1 + lstk - 1 - keep(253)
254 IF (nelim .NE. 0)
THEN
258 iw(ict11 + ntotfs) = jt1
261 iw(ioldp2 + ntotfs) = son_iw(kk - itrans)
267 IF (nass1 .NE. nfront - keep(253))
THEN
270 IF (itloc(j) .EQ. 0)
THEN
277 son_iw(kk) = itloc(son_iw(kk))
279 DO kk=k2+1, k2+keep(253)
280 son_iw(kk)=nfront-keep(253)+kk-k2
283 ison = frere_steps(step(ison))
286 IF (nfront-keep(253).EQ.nass1)
GOTO 500
288 IF (keep(400) .GT. 0)
THEN
294 IF ( keep(400) .GT. 0 )
THEN
295 IF (
present( mumps_tps_arr ))
THEN
296 ithread = l0_omp_mapping(step(ison))
297 IF (ithread .GT. 0)
THEN
298 son_iw => mumps_tps_arr(ithread)%IW
303 IF ( iloc .LE. ptlast( iell ) )
THEN
304 IF ( perm( son_iw( iloc ) ) .LT. min_perm )
THEN
305 jmin = son_iw( iloc )
306 min_perm = perm( jmin )
309 IF (keep(400) .GT. 0)
THEN
310 ison = frere_steps(step(ison))
313 newel = ioldp2 + nass1 + nfront
314 DO WHILE ( min_perm .NE. n + 1 )
316 nfront_eff = nfront_eff + 1
318 itloc( jmin ) = nfront_eff
321 IF (keep(400) .GT. 0)
THEN
326 IF (keep(400) .GT. 0)
THEN
327 IF (
present( mumps_tps_arr ))
THEN
328 ithread=l0_omp_mapping(step(ison))
329 IF (ithread .GT. 0)
THEN
330 son_iw => mumps_tps_arr(ithread)%IW
334 IF ( pttri( iell ) .LE. ptlast( iell ) )
THEN
335 IF ( son_iw( pttri( iell ) ) .eq. last_j_ass )
336 & pttri( iell ) = pttri( iell ) + 1
338 IF ( pttri( iell ) .LE. ptlast( iell ) )
THEN
339 IF ( perm(son_iw( pttri( iell )) ) .LT. min_perm )
THEN
340 jmin = son_iw( pttri( iell ) )
341 min_perm = perm( jmin )
344 IF (keep(400).GT.0)
THEN
345 ison = frere_steps(step(ison))
350 newel1_save = nfront_eff
351 IF (newel1_save.LT.nfront - keep(253))
THEN
353 elti = list_elt(iell)
355 j28= ptraiw(elti+1)-1_8
358 IF ( itloc( j ) .eq. 0 )
THEN
360 nfront_eff = nfront_eff + 1
362 itloc( j ) = nfront_eff
366 IF ( (typesplit.EQ.4).AND.
367 & (nfront_eff.LT.nfront-keep(253)) )
THEN
372 & (procnode_steps(step(dad(step(ibrot)))),keep(199))
377 & (procnode_steps(step(dad(step(ibrot)))),keep(199))
381 ibrot = dad(step(ibrot))
382 numelt_ibrot = frt_ptr(ibrot+1) - frt_ptr(ibrot)
383 IF (numelt_ibrot.EQ.0) cycle
384 DO iell = frt_ptr(ibrot), frt_ptr(ibrot+1)
387 j28= ptraiw(elti+1)-1
390 IF ( itloc( j ) .eq. 0 )
THEN
392 nfront_eff = nfront_eff + 1
394 itloc( j ) = nfront_eff
398 IF (nfront_eff.EQ.nfront-keep(253))
EXIT
400 IF (nfront_eff.NE.nfront-keep(253) .AND.
401 & .NOT. (keep(376).EQ.1 .AND. keep(79) .GE.1))
THEN
402 write(6,*) myid,
': INODE', inode,
' of type 4 ',
403 &
' not yet fully assembled ',
404 &
' NFRONT_EFF, NFRONT =', nfront_eff, nfront
409 IF ( newel1_save .eq. nfront_eff )
THEN
410 DO kk=nass1+1, nfront_eff
411 iw( ioldp2+kk ) = iw( ict11+kk )
415 & iw( newel_save + 1 ), nfront_eff - newel1_save )
417 & iw( newel_save + 1), nfront_eff - newel1_save,
418 & iw( ict11 + nass1 + 1 ), newel1_save - nass1,
419 & iw( ioldp2 + nass1 + 1 ), nfront_eff - nass1 )
420 DO kk = nass1+1, nfront_eff
421 iw(ict11 + kk) = iw(ioldp2+kk)
425 IF ( keep(253).GT.0)
THEN
426 ip1 = ioldps + hf + nfront_eff
427 ip2 = ioldps + hf + nfront + nfront_eff
431 itloc(n+i) = nfront_eff + i
433 nfront_eff = nfront_eff + keep(253)
435 IF (nfront.GT.nfront_eff)
THEN
436 ip1 = ioldps + nfront + hf
437 ip2 = ioldps + nfront_eff + hf
439 iw(ip2+i-1)=iw(ip1+i-1)
441 ELSE IF (nfront .LT. nfront_eff)
THEN
442 WRITE(*,*)
"Internal error in MUMPS_ELT_BUILD_SORT",
448 & .AND. (nfront-keep(253).GT.nass1 )
452 k2 = pimaster(step(ison))
454 son_iwposcb => iwposcb
455 IF (keep(400).GT.0)
THEN
456 IF (
present( mumps_tps_arr ))
THEN
457 ithread=l0_omp_mapping(step(ison))
458 IF (ithread .GT. 0)
THEN
459 son_iw => mumps_tps_arr(ithread)%IW
460 son_iwposcb => mumps_tps_arr(ithread)%IWPOSCB
464 lstk = son_iw(k2+keep(ixsz))
465 nelim = son_iw(k2 + 1 +keep(ixsz))
466 npivs = son_iw(k2 + 3 +keep(ixsz))
467 IF (npivs.LT.0) npivs = 0
468 nslson = son_iw(k2 + 5 +keep(ixsz))
469 level1_son = (nslson .EQ. 0)
472 IF (k2.GT.son_iwposcb)
THEN
473 nrows = son_iw(k2 + 2+keep(ixsz))
475 hs = nslson + 6 +keep(ixsz)
476 k1 = k2 + hs + nrows + npivs
480 IF (nfront-keep(253).GT.nass1)
THEN
483 son_iw(kk) = itloc(j)
484 IF (niv1 .AND. nslson.EQ.0)
THEN
486 IF (son_iw(kk) .LE. nass1 .OR. niv1)
THEN
488 sonrows_per_row(son_iw(kk)-nass1) =
489 & sonrows_per_row(son_iw(kk)-nass1) + 1
495 WRITE(*,*)
"Internal error 1 in MUMPS_ELT_BUILD_SORT"
498 IF (.not.level1_son)
THEN
501 ison = frere_steps(step(ison))
505 elti = list_elt(iell)
507 j28 = ptraiw(elti+1)-1
510 intarr(jj8) = itloc(j)
513 k1 = ioldps + hf + numorg
514 k2 = k1 + nfront_eff - 1 + nass
520 IF (
allocated(tmp_alloc_array))
DEALLOCATE(tmp_alloc_array)