OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
cfac_sol_pool.F
Go to the documentation of this file.
1C
2C This file is part of MUMPS 5.5.1, released
3C on Tue Jul 12 13:17:24 UTC 2022
4C
5C
6C Copyright 1991-2022 CERFACS, CNRS, ENS Lyon, INP Toulouse, Inria,
7C Mumps Technologies, University of Bordeaux.
8C
9C This version of MUMPS is provided to you free of charge. It is
10C released under the CeCILL-C license
11C (see doc/CeCILL-C_V1-en.txt, doc/CeCILL-C_V1-fr.txt, and
12C https://cecill.info/licences/Licence_CeCILL-C_V1-en.html)
13C
14 SUBROUTINE cmumps_init_pool_last3(IPOOL, LPOOL, LEAF)
15 USE cmumps_load
16 IMPLICIT NONE
17 INTEGER LPOOL, LEAF
18 INTEGER IPOOL(LPOOL)
19 ipool(lpool-2) = 0
20 ipool(lpool-1) = 0
21 ipool(lpool) = leaf-1
22 RETURN
23 END SUBROUTINE cmumps_init_pool_last3
25 & (n, pool, lpool, procnode, slavef, keep199,
26 & k28, k76, k80, k47, step, inode)
27 USE cmumps_load
28 IMPLICIT NONE
29 INTEGER N, INODE, 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 NBINSUBTREE, NBTOP, INODE_EFF,POS_TO_INSERT
34 INTEGER IPOS1, IPOS2, ISWAP
35 INTEGER NODE,J,I
36 atm_current_node = ( k76 == 2 .OR. k76 ==3 .OR.
37 & k76==4 .OR. k76==5)
38 nbinsubtree = pool(lpool)
39 nbtop = pool(lpool - 1)
40 IF (inode > n ) THEN
41 inode_eff = inode - n
42 ELSE IF (inode < 0) THEN
43 inode_eff = - inode
44 ELSE
45 inode_eff = inode
46 ENDIF
47 IF(((inode.GT.0).AND.(inode.LE.n)).AND.(.NOT.
48 & mumps_in_or_root_ssarbr(procnode(step(inode_eff)),
49 & keep199))
50 & ) THEN
51 IF ((k80 == 1 .AND. k47 .GE. 1) .OR.
52 & (( k80 == 2 .OR. k80==3 ) .AND.
53 & ( k47 == 4 ))) THEN
54 CALL cmumps_remove_node(inode,1)
55 ENDIF
56 ENDIF
57 IF ( mumps_in_or_root_ssarbr(procnode(step(inode_eff)),
58 & keep199) ) THEN
59 pool(nbinsubtree + 1 ) = inode
60 nbinsubtree = nbinsubtree + 1
61 ELSE
62 pos_to_insert=nbtop+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
65 DO j=nbtop,1,-1
66 IF((pool(lpool-2-j).GT.0)
67 & .AND.(pool(lpool-2-j).LE.n))THEN
68 GOTO 333
69 ENDIF
70 IF ( pool(lpool-2-j) < 0 ) THEN
71 node=-pool(lpool-2-j)
72 ELSE IF ( pool(lpool-2-j) > n ) THEN
73 node = pool(lpool-2-j) - n
74 ELSE
75 node = pool(lpool-2-j)
76 ENDIF
77 IF((k76.EQ.4).OR.(k76.EQ.6))THEN
78 IF(depth_first_load(step(node)).GE.
79 & depth_first_load(step(inode_eff)))THEN
80 GOTO 333
81 ENDIF
82 ENDIF
83 IF(k76.EQ.5)THEN
84 IF(cost_trav(step(node)).LE.
85 & cost_trav(step(inode_eff)))THEN
86 GOTO 333
87 ENDIF
88 ENDIF
89 pos_to_insert=pos_to_insert-1
90 ENDDO
91 IF(j.EQ.0) j=1
92 333 CONTINUE
93 DO i=nbtop,pos_to_insert,-1
94 pool(lpool-2-i-1)=pool(lpool-2-i)
95 ENDDO
96 pool(lpool-2-pos_to_insert)=inode
97 nbtop = nbtop + 1
98 GOTO 20
99 ENDIF
100 DO j=nbtop,1,-1
101 IF((pool(lpool-2-j).GT.0).AND.(pool(lpool-2-j).LE.n))THEN
102 GOTO 888
103 ENDIF
104 pos_to_insert=pos_to_insert-1
105 ENDDO
106 888 CONTINUE
107 DO i=j,1,-1
108 node=pool(lpool-2-i)
109 IF((k76.EQ.4).OR.(k76.EQ.6))THEN
110 IF(depth_first_load(step(node)).GE.
111 & depth_first_load(step(inode_eff)))THEN
112 GOTO 999
113 ENDIF
114 ENDIF
115 IF(k76.EQ.5)THEN
116 IF(cost_trav(step(node)).LE.
117 & cost_trav(step(inode_eff)))THEN
118 GOTO 999
119 ENDIF
120 ENDIF
121 pos_to_insert=pos_to_insert-1
122 ENDDO
123 IF(i.EQ.0) i=1
124 999 CONTINUE
125 DO j=nbtop,pos_to_insert,-1
126 pool(lpool-2-j-1)=pool(lpool-2-j)
127 ENDDO
128 pool(lpool-2-pos_to_insert)=inode
129 nbtop = nbtop + 1
130 GOTO 20
131 ENDIF
132 pool( lpool - 2 - ( nbtop + 1 ) ) = inode
133 nbtop = nbtop + 1
134 ipos1 = lpool - 2 - nbtop
135 ipos2 = lpool - 2 - nbtop + 1
136 10 CONTINUE
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
143 END IF
144 GOTO 20
145 30 CONTINUE
146 iswap = pool(ipos1)
147 pool(ipos1) = pool(ipos2)
148 pool(ipos2) = iswap
149 ipos1 = ipos1 + 1
150 ipos2 = ipos2 + 1
151 GOTO 10
152 20 CONTINUE
153 ENDIF
154 pool(lpool) = nbinsubtree
155 pool(lpool - 1) = nbtop
156 RETURN
157 END SUBROUTINE cmumps_insert_pool_n
158 LOGICAL FUNCTION cmumps_pool_empty(POOL, LPOOL)
159 IMPLICIT NONE
160 INTEGER lpool
161 INTEGER pool(lpool)
162 INTEGER nbinsubtree, nbtop
163 nbinsubtree = pool(lpool)
164 nbtop = pool(lpool - 1)
165 cmumps_pool_empty = (nbinsubtree + nbtop == 0)
166 RETURN
167 END FUNCTION cmumps_pool_empty
168 SUBROUTINE cmumps_extract_pool( N, POOL, LPOOL, PROCNODE, SLAVEF,
169 & STEP, INODE, KEEP,KEEP8, MYID, ND,
170 & FORCE_EXTRACT_TOP_SBTR )
171 USE cmumps_load
172 IMPLICIT NONE
173 INTEGER INODE, LPOOL, SLAVEF, N
174 INTEGER KEEP(500)
175 INTEGER(8) KEEP8(150)
176 INTEGER STEP(N), POOL(LPOOL), PROCNODE(KEEP(28)),
177 & nd(keep(28))
179 LOGICAL MUMPS_INSSARBR, MUMPS_ROOTSSARBR, CMUMPS_POOL_EMPTY
180 EXTERNAL mumps_procnode
181 INTEGER MUMPS_PROCNODE
182 INTEGER NBINSUBTREE, NBTOP, INSUBTREE, INODE_EFF, MYID
183 LOGICAL LEFT, ATOMIC_SUBTREE,UPPER,FLAG_MEM,SBTR_FLAG,PROC_FLAG
184 LOGICAL FORCE_EXTRACT_TOP_SBTR
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"
191 CALL mumps_abort()
192 ENDIF
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"
196 CALL mumps_abort()
197 ENDIF
198 IF ( .NOT. atomic_subtree ) THEN
199 left = (nbtop == 0)
200 IF(.NOT.left)THEN
201 IF((keep(76).EQ.4).OR.(keep(76).EQ.5))THEN
202 IF(nbinsubtree.EQ.0)THEN
203 left=.false.
204 ELSE
205 IF ( pool(nbinsubtree) < 0 ) THEN
206 i = -pool(nbinsubtree)
207 ELSE IF ( pool(nbinsubtree) > n ) THEN
208 i = pool(nbinsubtree) - n
209 ELSE
210 i = pool(nbinsubtree)
211 ENDIF
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
216 ELSE
217 j = pool(lpool-2-nbtop)
218 ENDIF
219 IF(keep(76).EQ.4)THEN
220 IF(depth_first_load(step(j)).GE.
221 & depth_first_load(step(i)))THEN
222 left=.true.
223 ELSE
224 left=.false.
225 ENDIF
226 ENDIF
227 IF(keep(76).EQ.5)THEN
228 IF(cost_trav(step(j)).LE.
229 & cost_trav(step(i)))THEN
230 left=.true.
231 ELSE
232 left=.false.
233 ENDIF
234 ENDIF
235 ENDIF
236 ENDIF
237 ENDIF
238 ELSE
239 IF ( insubtree == 1 ) THEN
240 IF (nbinsubtree == 0) THEN
241 WRITE(*,*) "Error 3 in CMUMPS_EXTRACT_POOL"
242 CALL mumps_abort()
243 ENDIF
244 left = .true.
245 ELSE
246 left = ( nbtop == 0)
247 ENDIF
248 ENDIF
249 222 CONTINUE
250 IF ( left ) THEN
251 inode = pool( nbinsubtree )
252 IF(keep(81).EQ.2)THEN
253 IF((inode.GE.0).AND.(inode.LE.n))THEN
254 CALL cmumps_mem_node_select(inode,pool,lpool,n,
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'
259 left=.false.
260 GOTO 222
261 ENDIF
262 ENDIF
263 ELSEIF(keep(81).EQ.3)THEN
264 IF((inode.GE.0).AND.(inode.LE.n))THEN
265 node_to_extract=inode
266 flag_mem=.false.
267 CALL cmumps_load_chk_memcst_pool(flag_mem)
268 IF(flag_mem)THEN
269 CALL cmumps_mem_node_select(inode,pool,lpool,n,
270 & step,keep,keep8,
271 & procnode,slavef,myid,sbtr_flag,
272 & proc_flag,min_proc)
273 IF(.NOT.sbtr_flag)THEN
274 left=.false.
275 WRITE(*,*)myid,': ca a change pour moi (2)'
276 GOTO 222
277 ENDIF
278 ENDIF
279 ENDIF
280 ENDIF
281 nbinsubtree = nbinsubtree - 1
282 IF ( inode < 0 ) THEN
283 inode_eff = -inode
284 ELSE IF ( inode > n ) THEN
285 inode_eff = inode - n
286 ELSE
287 inode_eff = inode
288 ENDIF
289 IF ( mumps_inssarbr( procnode(step(inode_eff)),
290 & keep(199)) ) THEN
291 IF((keep(47).GE.2.AND.keep(81).EQ.1).AND.
292 & (insubtree.EQ.0))THEN
293 CALL cmumps_load_set_sbtr_mem(.true.)
294 ENDIF
295 insubtree = 1
296 ELSE IF ( mumps_rootssarbr( procnode(step(inode_eff)),
297 & keep(199))) THEN
298 IF((keep(47).GE.2.AND.keep(81).EQ.1).AND.
299 & (insubtree.EQ.1))THEN
300 CALL cmumps_load_set_sbtr_mem(.false.)
301 ENDIF
302 insubtree = 0
303 END IF
304 ELSE
305 IF (nbtop < 1 ) THEN
306 WRITE(*,*) "Error 5 in CMUMPS_EXTRACT_POOL", nbtop
307 CALL mumps_abort()
308 ENDIF
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)
314 IF(upper)THEN
315 GOTO 666
316 ELSE
317 nbinsubtree=nbinsubtree-1
318 IF ( mumps_inssarbr( procnode(step(inode)),
319 & keep(199)) ) THEN
320 insubtree = 1
321 ELSE IF ( mumps_rootssarbr( procnode(step(inode)),
322 & keep(199))) THEN
323 insubtree = 0
324 ENDIF
325 GOTO 777
326 ENDIF
327 ENDIF
328 IF(keep(81).EQ.2)THEN
329 CALL cmumps_mem_node_select(inode,pool,lpool,n,step,
330 & keep,keep8,
331 & procnode,slavef,myid,sbtr_flag,proc_flag,min_proc)
332 IF(sbtr_flag)THEN
333 left=.true.
334 WRITE(*,*)myid,': ca a change pour moi (3)'
335 GOTO 222
336 ENDIF
337 ELSE
338 IF(keep(81).EQ.3)THEN
339 IF((inode.GE.0).AND.(inode.LE.n))THEN
340 node_to_extract=inode
341 flag_mem=.false.
342 CALL cmumps_load_chk_memcst_pool(flag_mem)
343 IF(flag_mem)THEN
344 CALL cmumps_mem_node_select(inode,pool,lpool,n,
345 & step,keep,keep8,
346 & procnode,slavef,myid,sbtr_flag,
347 & proc_flag,min_proc)
348 IF(sbtr_flag)THEN
349 left=.true.
350 WRITE(*,*)myid,': ca a change pour moi (4)'
351 GOTO 222
352 ENDIF
353 ELSE
355 ENDIF
356 ENDIF
357 ENDIF
358 ENDIF
359 666 CONTINUE
360 nbtop = nbtop - 1
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
364 CALL cmumps_remove_node(inode,2)
365 ENDIF
366 ENDIF
367 IF ( inode < 0 ) THEN
368 inode_eff = -inode
369 ELSE IF ( inode > n ) THEN
370 inode_eff = inode - n
371 ELSE
372 inode_eff = inode
373 ENDIF
374 END IF
375 777 CONTINUE
376 pool(lpool) = nbinsubtree
377 pool(lpool - 1) = nbtop
378 pool(lpool - 2) = insubtree
379 RETURN
380 END SUBROUTINE cmumps_extract_pool
381 SUBROUTINE cmumps_mem_cons_mng(INODE,POOL,LPOOL,N,STEP,
382 & KEEP,KEEP8,
383 & PROCNODE,SLAVEF,MYID,SBTR,FLAG_SAME_PROC,MIN_PROC)
384 USE cmumps_load
385 IMPLICIT NONE
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,
393 & nbinsubtree
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.
401 sbtr=.false.
402 min_proc=-9999
403 IF((inode.GT.0).AND.(inode.LE.n))THEN
404 pos_to_extract=-1
405 node_to_extract=-1
406 DO i=nbtop,1,-1
407 IF(node_to_extract.LT.0)THEN
408 pos_to_extract=i
409 node_to_extract=pool(lpool-2-i)
410 CALL cmumps_load_comp_maxmem_pool(node_to_extract,
411 & tmp_cost,proc)
412 min_cost=tmp_cost
413 min_proc=proc
414 ELSE
415 CALL cmumps_load_comp_maxmem_pool(pool(lpool-2-i),
416 & tmp_cost,proc)
417 IF((proc.NE.min_proc).OR.(tmp_cost.NE.min_cost))THEN
418 flag_same_proc=.true.
419 ENDIF
420 IF(tmp_cost.GT.min_cost)THEN
421 pos_to_extract=i
422 node_to_extract=pool(lpool-2-i)
423 min_cost=tmp_cost
424 min_proc=proc
425 ENDIF
426 ENDIF
427 ENDDO
428 IF((keep(47).EQ.4).AND.(nbinsubtree.NE.0))THEN
429 CALL cmumps_check_sbtr_cost(nbinsubtree,insubtree,nbtop,
430 & min_cost,sbtr)
431 IF(sbtr)THEN
432 WRITE(*,*)myid,': selecting from subtree'
433 RETURN
434 ENDIF
435 ENDIF
436 IF((.NOT.sbtr).AND.(.NOT.flag_same_proc))THEN
437 WRITE(*,*)myid,': I must search for a task
438 & to save My friend'
439 RETURN
440 ENDIF
441 inode = node_to_extract
442 DO i=pos_to_extract,nbtop
443 IF(i.NE.nbtop)THEN
444 pool(lpool-2-i)=pool(lpool-2-i-1)
445 ENDIF
446 ENDDO
447 pool(lpool-2-nbtop)=inode
449 ELSE
450 ENDIF
451 END SUBROUTINE cmumps_mem_cons_mng
452 SUBROUTINE cmumps_mem_node_select(INODE,POOL,LPOOL,N,STEP,
453 & KEEP,KEEP8,
454 & PROCNODE,SLAVEF,MYID,SBTR_FLAG,PROC_FLAG,MIN_PROC)
455 USE cmumps_load
456 IMPLICIT NONE
457 INTEGER INODE,LPOOL,N,SLAVEF,MYID,MIN_PROC
458 INTEGER POOL(LPOOL),KEEP(500),PROCNODE(KEEP(28)),STEP(N)
459 INTEGER(8) KEEP8(150)
460 LOGICAL SBTR_FLAG,PROC_FLAG
461 EXTERNAL mumps_inssarbr
462 LOGICAL MUMPS_INSSARBR
463 INTEGER NODE_TO_EXTRACT,I,POS_TO_EXTRACT,NBTOP,NBINSUBTREE
464 nbtop= pool(lpool - 1)
465 nbinsubtree = pool(lpool)
466 IF(nbtop.GT.0)THEN
467 WRITE(*,*)myid,': NBTOP=',nbtop
468 ENDIF
469 sbtr_flag=.false.
470 proc_flag=.false.
471 CALL cmumps_mem_cons_mng(inode,pool,lpool,n,step,keep,keep8,
472 & procnode,slavef,myid,sbtr_flag,proc_flag,min_proc)
473 IF(sbtr_flag)THEN
474 RETURN
475 ENDIF
476 IF(min_proc.EQ.-9999)THEN
477 IF((inode.GT.0).AND.(inode.LT.n))THEN
478 sbtr_flag=(nbinsubtree.NE.0)
479 ENDIF
480 RETURN
481 ENDIF
482 IF(.NOT.proc_flag)THEN
483 node_to_extract=inode
484 IF((inode.GE.0).AND.(inode.LE.n))THEN
485 CALL cmumps_find_best_node_for_mem(min_proc,pool,
486 & lpool,inode)
487 IF(mumps_inssarbr(procnode(step(inode)),
488 & keep(199)))THEN
489 WRITE(*,*)myid,': Extracting from a subtree
490 & for helping',min_proc
491 sbtr_flag=.true.
492 RETURN
493 ELSE
494 IF(node_to_extract.NE.inode)THEN
495 WRITE(*,*)myid,': Extracting from top
496 & inode=',inode,'for helping',min_proc
497 ENDIF
499 ENDIF
500 ENDIF
501 DO i=1,nbtop
502 IF (pool(lpool-2-i).EQ.inode)THEN
503 GOTO 452
504 ENDIF
505 ENDDO
506 452 CONTINUE
507 pos_to_extract=i
508 DO i=pos_to_extract,nbtop-1
509 pool(lpool-2-i)=pool(lpool-2-i-1)
510 ENDDO
511 pool(lpool-2-nbtop)=inode
512 ENDIF
513 END SUBROUTINE cmumps_mem_node_select
515 & ( ipool, lpool, iii, leaf,
516 & inode, strategie )
517 IMPLICIT NONE
518 INTEGER, INTENT(IN) :: STRATEGIE, LPOOL
519 INTEGER IPOOL (LPOOL)
520 INTEGER III,LEAF
521 INTEGER, INTENT(OUT) :: INODE
522 leaf = leaf - 1
523 inode = ipool( leaf )
524 RETURN
525 END SUBROUTINE cmumps_get_inode_from_pool
#define mumps_abort
Definition VE_Metis.h:25
subroutine cmumps_init_pool_last3(ipool, lpool, leaf)
subroutine cmumps_insert_pool_n(n, pool, lpool, procnode, slavef, keep199, k28, k76, k80, k47, step, inode)
subroutine cmumps_mem_cons_mng(inode, pool, lpool, n, step, keep, keep8, procnode, slavef, myid, sbtr, flag_same_proc, min_proc)
subroutine cmumps_mem_node_select(inode, pool, lpool, n, step, keep, keep8, procnode, slavef, myid, sbtr_flag, proc_flag, min_proc)
subroutine cmumps_extract_pool(n, pool, lpool, procnode, slavef, step, inode, keep, keep8, myid, nd, force_extract_top_sbtr)
logical function cmumps_pool_empty(pool, lpool)
subroutine cmumps_get_inode_from_pool(ipool, lpool, iii, leaf, inode, strategie)
subroutine, public cmumps_load_comp_maxmem_pool(inode, max_mem, proc)
subroutine, public cmumps_load_set_sbtr_mem(what)
subroutine, public cmumps_find_best_node_for_mem(min_proc, pool, lpool, inode)
subroutine, public cmumps_check_sbtr_cost(nbinsubtree, insubtree, nbtop, min_cost, sbtr)
subroutine, public cmumps_load_chk_memcst_pool(flag)
double precision, dimension(:), pointer, save, public cost_trav
integer, dimension(:), pointer, save, public depth_first_load
subroutine, public cmumps_remove_node(inode, num_call)
subroutine, public cmumps_load_pool_check_mem(inode, upper, slavef, keep, keep8, step, pool, lpool, procnode, n)
subroutine, public cmumps_load_clean_meminfo_pool(inode)
logical function mumps_in_or_root_ssarbr(procinfo_inode, k199)
logical function mumps_rootssarbr(procinfo_inode, k199)
logical function mumps_inssarbr(procinfo_inode, k199)
integer function mumps_procnode(procinfo_inode, k199)