25 & (n, pool, lpool, procnode, slavef, keep199,
26 & k28, k76, k80, k47, step, inode)
29 INTEGER N, , LPOOL, K28, SLAVEF, K76, K80, K47, KEEP199
30 INTEGER STEP(N), POOL(LPOOL), PROCNODE(K28)
32 LOGICAL MUMPS_IN_OR_ROOT_SSARBR, ATM_CURRENT_NODE
33 INTEGER , NBTOP, INODE_EFF,POS_TO_INSERT
34 INTEGER IPOS1, IPOS2, ISWAP
36 atm_current_node = ( k76 == 2 .OR. k76 ==3 .OR.
38 nbinsubtree = pool(lpool)
39 nbtop = pool(lpool - 1)
42 ELSE IF (inode < 0)
THEN
47 IF(((inode.GT.0).AND.(inode.LE.n)).AND.(.NOT.
48 & mumps_in_or_root_ssarbr(procnode(step(inode_eff)),
51 IF ((k80 == 1 .AND. k47 .GE. 1) .OR.
52 & (( k80 == 2 .OR. k80==3 ) .AND.
57 IF ( mumps_in_or_root_ssarbr(procnode(step(inode_eff)),
59 pool(nbinsubtree + 1 ) = inode
60 nbinsubtree = nbinsubtree + 1
63 IF((k76.EQ.4).OR.(k76.EQ.5).OR.(k76.EQ.6))
THEN
64 IF((inode.GT.n).OR.(inode.LE.0))
THEN
66 IF((pool(lpool-2-j).GT.0)
67 & .AND.(pool(lpool-2-j).LE.n))
THEN
70 IF ( pool(lpool-2-j) < 0 )
THEN
72 ELSE IF ( pool(lpool-2-j) > n )
THEN
73 node = pool(lpool-2-j) - n
75 node = pool(lpool-2-j)
77 IF((k76.EQ.4).OR.(k76.EQ.6))
THEN
89 pos_to_insert=pos_to_insert-1
93 DO i=nbtop,pos_to_insert,-1
94 pool(lpool-2-i-1)=pool(lpool-2-i)
96 pool(lpool-2-pos_to_insert)=inode
101 IF((pool(lpool-2-j).GT.0).AND.(pool(lpool-2-j).LE.n))
THEN
104 pos_to_insert=pos_to_insert-1
109 IF((k76.EQ.4).OR.(k76.EQ.6))
THEN
121 pos_to_insert=pos_to_insert-1
125 DO j=nbtop,pos_to_insert,-1
126 pool(lpool-2-j-1)=pool(lpool-2-j)
128 pool(lpool-2-pos_to_insert)=inode
132 pool( lpool - 2 - ( nbtop + 1 ) ) = inode
134 ipos1 = lpool - 2 - nbtop
135 ipos2 = lpool - 2 - nbtop + 1
137 IF ( ipos2 == lpool - 2 )
GOTO 20
138 IF ( pool(ipos1) < 0 )
GOTO 20
139 IF ( pool(ipos2) < 0 )
GOTO 30
140 IF ( atm_current_node )
THEN
141 IF ( pool(ipos1) > n )
GOTO 20
142 IF ( pool(ipos2) > n )
GOTO 30
147 pool(ipos1) = pool(ipos2)
154 pool(lpool) = nbinsubtree
155 pool(lpool - 1) = nbtop
169 & STEP, INODE, KEEP,KEEP8, MYID, ND,
170 & FORCE_EXTRACT_TOP_SBTR )
173 INTEGER INODE, LPOOL, SLAVEF, N
175 INTEGER(8) KEEP8(150)
176 INTEGER STEP(N), POOL(LPOOL), PROCNODE(KEEP(28)),
179 LOGICAL MUMPS_INSSARBR, MUMPS_ROOTSSARBR, CMUMPS_POOL_EMPTY
181 INTEGER MUMPS_PROCNODE
182 INTEGER NBINSUBTREE, NBTOP, INSUBTREE, INODE_EFF, MYID
183 LOGICAL LEFT, ATOMIC_SUBTREE,UPPER,FLAG_MEM,SBTR_FLAG,PROC_FLAG
185 INTEGER NODE_TO_EXTRACT,I,J,MIN_PROC
186 nbinsubtree = pool(lpool)
187 nbtop = pool(lpool - 1)
188 insubtree = pool(lpool - 2)
189 IF ( keep(76) > 6 .OR. keep(76) < 0 )
THEN
190 WRITE(*,*)
"Error 2 in CMUMPS_EXTRACT_POOL: unknown strategy"
193 atomic_subtree = ( keep(76) == 1 .OR. keep(76) == 3)
194 IF ( cmumps_pool_empty(pool, lpool) )
THEN
195 WRITE(*,*)
"Error 1 in CMUMPS_EXTRACT_POOL"
198 IF ( .NOT. atomic_subtree )
THEN
201 IF((keep(76).EQ.4).OR.(keep(76).EQ.5))
THEN
202 IF(nbinsubtree.EQ.0)
THEN
205 IF ( pool(nbinsubtree) < 0 )
THEN
206 i = -pool(nbinsubtree)
207 ELSE IF ( pool(nbinsubtree) > n )
THEN
208 i = pool(nbinsubtree) - n
210 i = pool(nbinsubtree)
212 IF ( pool(lpool-2-nbtop) < 0 )
THEN
213 j = -pool(lpool-2-nbtop)
214 ELSE IF ( pool(lpool-2-nbtop) > n )
THEN
215 j = pool(lpool-2-nbtop) - n
217 j = pool(lpool-2-nbtop)
219 IF(keep(76).EQ.4)
THEN
227 IF(keep(76).EQ.5)
THEN
239 IF ( insubtree == 1 )
THEN
240 IF (nbinsubtree == 0)
THEN
241 WRITE(*,*)
"Error 3 in CMUMPS_EXTRACT_POOL"
251 inode = pool( nbinsubtree )
252 IF(keep(81).EQ.2)
THEN
253 IF((inode.GE.0).AND.(inode.LE.n))
THEN
255 & step,keep,keep8,procnode,slavef,myid,sbtr_flag,
256 & proc_flag,min_proc)
257 IF(.NOT.sbtr_flag)
THEN
258 WRITE(*,*)myid,
': ca a change pour moi'
263 ELSEIF(keep(81).EQ.3)
THEN
264 IF((inode.GE.0).AND.(inode.LE.n))
THEN
265 node_to_extract=inode
271 & procnode,slavef,myid,sbtr_flag,
272 & proc_flag,min_proc)
273 IF(.NOT.sbtr_flag)
THEN
275 WRITE(*,*)myid,
': ca a change pour moi (2)'
281 nbinsubtree = nbinsubtree - 1
282 IF ( inode < 0 )
THEN
284 ELSE IF ( inode > n )
THEN
285 inode_eff = inode - n
289 IF ( mumps_inssarbr( procnode(step(inode_eff)),
291 IF((keep(47).GE.2.AND.keep(81).EQ.1).AND.
292 & (insubtree.EQ.0))
THEN
296 ELSE IF ( mumps_rootssarbr( procnode(step(inode_eff)),
298 IF((keep(47).GE.2.AND.keep(81).EQ.1).AND.
299 & (insubtree.EQ.1))
THEN
306 WRITE(*,*)
"Error 5 in CMUMPS_EXTRACT_POOL", nbtop
309 inode = pool( lpool - 2 - nbtop )
310 IF(keep(81).EQ.1)
THEN
312 & (inode,upper,slavef,keep,keep8,
313 & step,pool,lpool,procnode,n)
317 nbinsubtree=nbinsubtree-1
318 IF ( mumps_inssarbr( procnode(step(inode)),
321 ELSE IF ( mumps_rootssarbr( procnode(step(inode)),
328 IF(keep(81).EQ.2)
THEN
331 & procnode,slavef,myid,sbtr_flag,proc_flag,min_proc)
334 WRITE(*,*)myid,
': ca a change pour moi (3)'
338 IF(keep(81).EQ.3)
THEN
339 IF((inode.GE.0).AND.(inode.LE.n))
THEN
340 node_to_extract=inode
346 & procnode,slavef,myid,sbtr_flag,
347 & proc_flag,min_proc)
350 WRITE(*,*)myid,
': ca a change pour moi (4)'
361 IF((inode.GT.0).AND.(inode.LE.n))
THEN
362 IF ((( keep(80) == 2 .OR. keep(80)==3 ) .AND.
363 & ( keep(47) == 4 )))
THEN
367 IF ( inode < 0 )
THEN
369 ELSE IF ( inode > n )
THEN
370 inode_eff = inode - n
376 pool(lpool) = nbinsubtree
377 pool(lpool - 1) = nbtop
378 pool(lpool - 2) = insubtree
383 & PROCNODE,SLAVEF,MYID,SBTR,FLAG_SAME_PROC,MIN_PROC)
386 INTEGER INODE,LPOOL,N,MYID,SLAVEF,PROC,MIN_PROC
387 INTEGER POOL(LPOOL),KEEP(500),STEP(N),PROCNODE(KEEP(28))
388 INTEGER(8) KEEP8(150)
389 INTEGER MUMPS_PROCNODE
390 EXTERNAL mumps_procnode
391 LOGICAL SBTR,FLAG_SAME_PROC
392 INTEGER POS_TO_EXTRACT,NODE_TO_EXTRACT,NBTOP,I,INSUBTREE,
394 DOUBLE PRECISION MIN_COST, TMP_COST
395 nbinsubtree = pool(lpool)
396 nbtop = pool(lpool - 1)
397 insubtree = pool(lpool - 2)
398 min_cost=huge(min_cost)
399 tmp_cost=huge(tmp_cost)
400 flag_same_proc=.false.
403 IF((inode.GT.0).AND.(inode.LE.n))
THEN
407 IF(node_to_extract.LT.0)
THEN
409 node_to_extract=pool(lpool-2-i)
417 IF((proc.NE.min_proc).OR.(tmp_cost.NE.min_cost
THEN
418 flag_same_proc=.true.
420 IF(tmp_cost.GT.min_cost)
THEN
422 node_to_extract=pool(lpool-2-i)
428 IF((keep(47).EQ.4).AND.(nbinsubtree.NE.0))
THEN
432 WRITE(*,*)myid,
': selecting from subtree'
436 IF((.NOT.sbtr).AND.(.NOT.flag_same_proc))
THEN
437 WRITE(*,*)myid,
': I must search for a task
441 inode = node_to_extract
442 DO i=pos_to_extract,nbtop
444 pool(lpool-2-i)=pool(lpool-2-i-1)
447 pool(lpool-2-nbtop)=inode
454 & PROCNODE,SLAVEF,MYID,SBTR_FLAG,PROC_FLAG,MIN_PROC)
457 INTEGER INODE,LPOOL,N,,MYID,MIN_PROC
458 INTEGER POOL(LPOOL),KEEP(500),(KEEP(28)),STEP(N)
459 INTEGER(8) KEEP8(150)
460 LOGICAL SBTR_FLAG,PROC_FLAG
462 LOGICAL MUMPS_INSSARBR
463 INTEGER NODE_TO_EXTRACT,I,POS_TO_EXTRACT,NBTOP,NBINSUBTREE
464 nbtop= pool(lpool - 1)
465 nbinsubtree = pool(lpool)
467 WRITE(*,*)myid,
': NBTOP=',nbtop
472 & procnode,slavef,myid,sbtr_flag,proc_flag,min_proc)
476 IF(min_proc.EQ.-9999)
THEN
477 IF((inode.GT.0).AND.(inode.LT.n))
THEN
478 sbtr_flag=(nbinsubtree.NE.0)
482 IF(.NOT.proc_flag
THEN
483 node_to_extract=inode
484 IF((inode.GE.0).AND.(inode.LE.n))
THEN
487 IF(mumps_inssarbr(procnode(step(inode)),
489 WRITE(*,*)myid,
': Extracting from a subtree
490 & for helping',min_proc
494 IF(node_to_extract.NE.inode)
THEN
495 WRITE(*,*)myid,
': Extracting from top
496 & inode=',inode,
'for helping',min_proc
502 IF (pool(lpool-2-i).EQ.inode)
THEN
508 DO i=pos_to_extract,nbtop-1
509 pool(lpool-2-i)=pool(lpool-2-i-1)
511 pool(lpool-2-nbtop)=inode