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, NASS,
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 STEP(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(:) :: PTTRI, 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.EQ..OR..EQ.
IF ( (TYPESPLIT5)(TYPESPLIT6) ) 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.NE.
IF (ISON_IN_PLACEIFSON) THEN
90 & ' Internal error 1 in MUMPS_BUILD_SORT_INDEX
',
91 & ' in place node is not the first son interior split node
'
94 NELIM_SON_IN_PLACE = NELIM
96 NPIVS = IW(K2 + 3+KEEP(IXSZ))
97.LT.
IF (NPIVS0) NPIVS = 0
98 NSLSON = IW(K2 + 5+KEEP(IXSZ))
99.GT.
IF( NSLSON0) SON_LEVEL2 = .TRUE.
100.EQ.
LEVEL1_SON = NSLSON0
105 write(6,*) MYID, ':
',
106 & ' Internal error 2 in
',
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.or..LT.
IF (LEVEL1_SONJ4) 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.GT.
IF (KEEP(400) 0 ) THEN
124 IF (present( L0_OMP_MAPPING )) THEN
125 ITHREAD=L0_OMP_MAPPING(STEP(IFSON))
126.GT.
IF (ITHREAD 0) THEN
127 SON_IW => MUMPS_TPS_ARR(ITHREAD)%IW
128 SON_IWPOSCB => MUMPS_TPS_ARR(ITHREAD)%IWPOSCB
132.GT.
IF (K2 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.GT.
IF ( K2 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.LE.
IF (J18 J28) THEN
185 INTARR(JJ8) = ITLOC(J)
190 DO KK=K1+NELIM,K1+NFRONT_EFF-1
196.GT.
IF ((IWPOS + LREQ -1) IWPOSCB) THEN
197 ALLOCATE(TMP_ALLOC_ARRAY(LREQ), stat=allocok)
198.GT.
IF (allocok 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.LT.
IF (NPIVS0) NPIVS = 0
216 NSLSON = IW(K2 + 5+KEEP(IXSZ))
220.GT.
IF ( K2 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.NOT.
IF ( 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.GT.
IF (IN 0) GOTO 50
256 NTOTFS = NTOTFS + NUMORG
257.NE.
IF (NUMSTK 0) THEN
260 K2 = PIMASTER(STEP(ISON))
262 SON_IWPOSCB => IWPOSCB
263.GT.
IF ( KEEP(400) 0 ) THEN
264 IF (present( L0_OMP_MAPPING )) THEN
265 ITHREAD=L0_OMP_MAPPING(STEP(ISON))
266.GT.
IF (ITHREAD 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.LT.
IF (NPIVS0) NPIVS = 0
276 NSLSON = SON_IW(K2 + 5+KEEP(IXSZ))
277.GT.
IF( NSLSON0) SON_LEVEL2 = .TRUE.
278.EQ.
LEVEL1_SON = NSLSON0
282.GT.
IF ( K2 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.GT.
IF (K2SON_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.NE..AND..NE.
IF (NELIM 0 ISONISON_IN_PLACE) THEN
311 IW(ICT11 + NTOTFS) = JT1
314 IW(IOLDP2 + NTOTFS) = SON_IW(KK - ITRANS)
320.NE.
IF (NASS1 NFRONT - KEEP(253)) THEN
323.EQ.
IF (ITLOC(J) 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.EQ.
IF (NFRONT-KEEP(253)NASS1) GOTO 500
341.LE.
IF ( PTTRI( NUMSTK + 1 ) PTLAST( NUMSTK + 1 ) ) THEN
342.NE.
IF ( ITLOC( INTARR( JDEBROW8+PTTRI( NUMSTK + 1 ) ) ) 0 ) THEN
343 PTTRI( NUMSTK + 1 ) = PTTRI( NUMSTK + 1 ) + 1
348.GT.
IF (KEEP(400) 0) THEN
353.GT.
IF ( KEEP(400) 0 ) THEN
354 IF (present( MUMPS_TPS_ARR )) THEN
355 ITHREAD = L0_OMP_MAPPING(STEP(ISON))
356.GT.
IF (ITHREAD 0) THEN
357 SON_IW => MUMPS_TPS_ARR(ITHREAD)%IW
362.LE.
IF ( ILOC PTLAST( IELL ) ) THEN
363.LT.
IF ( PERM( SON_IW( ILOC ) ) MIN_PERM ) THEN
364 JMIN = SON_IW( ILOC )
365 MIN_PERM = PERM( JMIN )
368.GT.
IF (KEEP(400) 0) THEN
369 ISON = FRERE_STEPS(STEP(ISON))
374.LE.
IF ( ILOC PTLAST( IELL ) ) THEN
375.LT.
IF ( PERM( INTARR( JDEBROW8+ILOC ) ) MIN_PERM ) THEN
376 JMIN = INTARR( JDEBROW8+ILOC )
377 MIN_PERM = PERM( JMIN )
380 NEWEL = IOLDP2 + NASS1 + NFRONT
381.NE.
DO WHILE ( MIN_PERM N + 1 )
383 NFRONT_EFF = NFRONT_EFF + 1
385 ITLOC( JMIN ) = NFRONT_EFF
388.GT.
IF (KEEP(400) 0) THEN
393.GT.
IF (KEEP(400) 0) THEN
394 IF (present( MUMPS_TPS_ARR )) THEN
395 ITHREAD=L0_OMP_MAPPING(STEP(ISON))
396.GT.
IF (ITHREAD 0) THEN
397 SON_IW => MUMPS_TPS_ARR(ITHREAD)%IW
401.LE.
IF ( PTTRI( IELL ) PTLAST( IELL ) ) THEN
402.eq.
IF ( SON_IW( PTTRI( IELL ) ) LAST_J_ASS )
403 & PTTRI( IELL ) = PTTRI( IELL ) + 1
405.LE.
IF ( PTTRI( IELL ) PTLAST( IELL ) ) THEN
406.LT.
IF ( PERM(SON_IW( PTTRI( IELL )) ) MIN_PERM ) THEN
407 JMIN = SON_IW( PTTRI( IELL ) )
408 MIN_PERM = PERM( JMIN )
411.GT.
IF (KEEP(400)0) THEN
412 ISON = FRERE_STEPS(STEP(ISON))
417.LE.
IF ( PTTRI( IELL ) PTLAST( IELL ) ) THEN
418.eq.
IF ( INTARR( JDEBROW8+PTTRI( IELL ) ) LAST_J_ASS ) THEN
419 PTTRI( IELL ) = PTTRI( IELL ) + 1
423.LE.
IF ( PTTRI( IELL ) PTLAST( IELL ) ) THEN
424.LT.
IF (PERM(INTARR( JDEBROW8+PTTRI(IELL) )) MIN_PERM) THEN
425 JMIN = INTARR( JDEBROW8+PTTRI(IELL) )
426 MIN_PERM = PERM( JMIN )
431 NEWEL1_SAVE = NFRONT_EFF
432.LT.
IF (NEWEL1_SAVENFRONT - KEEP(253)) THEN
435 J18 = PTRAIW(IBROT) + 2
436 J28 = J18 + INTARR(J18 - 2) - INTARR(J18-1)
437 IBROT = FILS( IBROT )
438.EQ.
IF ( IORG 1) THEN
439.NE.
IF ( KEEP(50)0 ) CYCLE
440 J18 = J18 + 1 + INTARR(J18-2)
446.eq.
IF ( ITLOC( J ) 0 ) THEN
448 NFRONT_EFF = NFRONT_EFF + 1
450 ITLOC( J ) = NFRONT_EFF
454.EQ..AND.
IF ( (TYPESPLIT4)
455.LT.
& (NFRONT_EFFNFRONT-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.GT..AND..LT.
DO WHILE (IN0NFRONT_EFFNFRONT-KEEP(253))
473 J28 = J18 + INTARR(J18 - 2) - INTARR(J18-1)
477.eq.
IF ( ITLOC( J ) 0 ) THEN
479 NFRONT_EFF = NFRONT_EFF + 1
481 ITLOC( J ) = NFRONT_EFF
485.EQ.
IF (NFRONT_EFFNFRONT-KEEP(253)) EXIT
487.NE..AND.
IF (NFRONT_EFFNFRONT-KEEP(253)
488.NOT..EQ..AND..GE.
& (KEEP(376)1 KEEP(79) 1)) THEN
489 write(6,*) MYID, ': inode
', INODE, ' of
type 4
',
490 & ' not yet fully assembled
',
491 & ' nfront_eff, nfront =
', NFRONT_EFF, NFRONT
496.eq.
IF ( NEWEL1_SAVE NFRONT_EFF ) THEN
497 DO KK=NASS1+1, NFRONT_EFF
498 IW( IOLDP2+KK ) = IW( ICT11+KK )
501 CALL MUMPS_SORT( N, PERM,
502 & IW( NEWEL_SAVE + 1 ), NFRONT_EFF - NEWEL1_SAVE )
503 CALL MUMPS_SORTED_MERGE( N, NASS1, PERM, ITLOC,
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.GT.
IF ( KEEP(253)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.GT.
IF (NFRONTNFRONT_EFF) THEN
523 IP1 = IOLDPS + NFRONT + HF
524 IP2 = IOLDPS + NFRONT_EFF + HF
526 IW(IP2+I-1)=IW(IP1+I-1)
528.LT.
ELSE IF (NFRONT 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..GT.
& (NFRONT-KEEP(253)NASS1)
543 K2 = PIMASTER(STEP(ISON))
545 SON_IWPOSCB => IWPOSCB
546.GT.
IF (KEEP(400)0) THEN
547 IF (present( MUMPS_TPS_ARR )) THEN
548 ITHREAD=L0_OMP_MAPPING(STEP(ISON))
549.GT.
IF (ITHREAD 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.LT.
IF (NPIVS0) NPIVS = 0
559 NSLSON = SON_IW(K2 + 5 +KEEP(IXSZ))
560.EQ.
LEVEL1_SON = (NSLSON 0)
563.GT.
IF (K2SON_IWPOSCB) THEN
564 NROWS = SON_IW(K2 + 2+KEEP(IXSZ))
566 HS = NSLSON + 6 +KEEP(IXSZ)
567 K1 = K2 + HS + NROWS + NPIVS
571.GT.
IF (NFRONT-KEEP(253)NASS1) THEN
574 SON_IW(KK) = ITLOC(J)
575.AND..EQ.
IF (NIV1 NSLSON0) THEN
577.LE..OR.
IF (SON_IW(KK) NASS1 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.not.
IF (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.EQ.
IF (KEEP(50)0) K2 = K2 + NELIM_SON_IN_PLACE
613.EQ.
IF (KEEP(50)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)
subroutine mumps_build_sort_index(myid, inode, n, ioldps, hf, lp, lpok, nfront, nfront_eff, perm, dad, nass1, nass, numstk, numorg, iwposcb, iwpos, ifson, step, pimaster, ptrist, ptraiw, iw, liw, intarr, lintarr, itloc, fils, frere_steps, son_level2, niv1, keep, keep8, iflag, ison_in_place, procnode_steps, slavef, sonrows_per_row, lsonrows_per_row, mumps_tps_arr, l0_omp_mapping)