19 IMPLICIT NONE
20 INTEGER N,PERM,SYM, NSTEPS, , LP,LDAD
21 INTEGER FRERE(NSTEPS), FILS(N), STEP()
22 INTEGER (LNA), NE(NSTEPS), ND(NSTEPS)
23 INTEGER K215,K234,K55,K199
24 INTEGER DAD(LDAD)
25 LOGICAL USE_DAD
26 INTEGER INFO(80)
27 INTEGER SLAVEF,PROCNODE(NSTEPS)
28 INTEGER :: SBTR_WHICH_M
30 INTEGER MUMPS_PROCNODE
31 DOUBLE PRECISION PEAK
32 DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: COST_TRAV
33 INTEGER, DIMENSION (:), ALLOCATABLE :: DEPTH
34 INTEGER IFATH,IN,NSTK,INODE,I,allocok,LOCAL_PERM
35 INTEGER(8) NCB
36 INTEGER(8) NELIM,NFR
37 INTEGER NFR4,NELIM4
38 INTEGER LEAF,NBLEAF,NBROOT, SIZE_TAB
39 INTEGER, DIMENSION (:), ALLOCATABLE :: IPOOL,TNSTK
40 INTEGER, DIMENSION (:), ALLOCATABLE,TARGET :: SON,TEMP
41 INTEGER(8), DIMENSION (:), ALLOCATABLE :: M,M_TOTAL, fact
42 INTEGER(8), DIMENSION (:), ALLOCATABLE :: TAB1,TAB2
43 INTEGER, DIMENSION (:), POINTER :: TAB
44 INTEGER dernier,fin
45 INTEGER cour,II
46 INTEGER CB_current,CB_MAX,ROOT_OF_CUR_SBTR
47 INTEGER(8), DIMENSION (:), ALLOCATABLE :: T1,T2
48 INTEGER, DIMENSION (:), ALLOCATABLE :: RESULT
49 INTEGER(8) MEM_SIZE,FACT_SIZE,SUM,MEM_SEC_PERM,FACT_SIZE_T,
50 & MEM_SIZE_T,TOTAL_MEM_SIZE,TMP_TOTAL_MEM_SIZE,TMP_SUM,
51 & SIZECB, SIZECB_LASTSON
52 INTEGER(8) TMP8
53 LOGICAL SBTR_M
54 INTEGER FIRST_LEAF,SIZE_SBTR
56 LOGICAL MUMPS_IN_OR_ROOT_SSARBR,MUMPS_INSSARBR
57 DOUBLE PRECISION COST_NODE
58 include 'mumps_headers.h'
59 total_mem_size=0_8
60 root_of_cur_sbtr=0
61 IF((perm.EQ.0).OR.(perm.EQ.1).OR.
62 & (perm.EQ.2).OR.(perm.EQ.3).OR.(perm.EQ.4).OR.
63 & (perm.EQ.5).OR.(perm.EQ.6))THEN
64 local_perm=0
65 ENDIF
66 sbtr_m=.false.
67 mem_size=0_8
68 fact_size=0_8
69 IF ((perm.LT.0 .OR. perm.GT.7)) THEN
70 WRITE(*,*) "Internal Error in ZMUMPS_REORDER_TREE",perm
72 END IF
73 nbleaf = na(1)
74 nbroot = na(2)
75 IF((perm.EQ.0).AND.(nbroot.EQ.nbleaf)) RETURN
76 IF ((perm.NE.7).AND.(sbtr_m.OR.(perm.EQ.2))) THEN
77 IF((sbtr_which_m.EQ.1).AND.(perm.NE.1))THEN
78 ALLOCATE(m_total(nsteps), stat=allocok )
79 IF (allocok > 0) THEN
80 IF ( lp .GT. 0 )
81 & WRITE(lp,*)'Memory allocation error in
82 & ZMUMPS_REORDER_TREE'
83 info(1)=-7
84 info(2)=nsteps
85 RETURN
86 ENDIF
87 ENDIF
88 ENDIF
89 IF(perm.NE.7)THEN
90 ALLOCATE(m(nsteps),stat=allocok )
91 IF (allocok > 0) THEN
92 IF ( lp .GT. 0 )
93 & WRITE(lp,*)'Memory allocation error
94 &in ZMUMPS_REORDER_TREE'
95 info(1)=-7
96 info(2)=nsteps
97 RETURN
98 ENDIF
99 ENDIF
100 ALLOCATE( ipool(nbleaf), fact(nsteps),tnstk(nsteps),
101 & stat=allocok )
102 IF (allocok > 0) THEN
103 IF ( lp .GT. 0 )
104 & WRITE(lp,*)'Memory allocation error in ZMUMPS_REORDER_TREE'
105 info(1)=-7
106 info(2)=nsteps
107 RETURN
108 ENDIF
109 ii=0
110 DO i=1,nsteps
111 tnstk(i) = ne(i)
112 IF(ne(i).GE.ii) ii=ne(i)
113 ENDDO
114 size_tab=
max(ii,nbroot)
115 ALLOCATE(son(ii), temp(ii),
116 & tab1(size_tab), tab2(size_tab), stat=allocok )
117 IF (allocok > 0) THEN
118 IF ( lp .GT. 0 )
119 & WRITE(lp,*)'Memory allocation error in ZMUMPS_REORDER_TREE'
120 info(1)=-7
121 info(2)=nsteps
122 RETURN
123 ENDIF
124 ALLOCATE(t1(size_tab),t2(size_tab),
125 & result(size_tab),stat=allocok)
126 IF (allocok > 0) THEN
127 IF ( lp .GT. 0 )
128 & WRITE(lp,*)'Memory allocation error in ZMUMPS_REORDER_TREE'
129 info(1)=-7
130 info(2)=size_tab
131 RETURN
132 ENDIF
133 IF(perm.EQ.7) THEN
134 GOTO 001
135 ENDIF
136 IF((perm.EQ.5).OR.(perm.EQ.6))THEN
137 ALLOCATE(cost_trav(nsteps), stat=allocok )
138 IF (allocok > 0) THEN
139 IF ( lp .GT. 0 )
140 & WRITE(lp,*)'Memory allocation error
141 & in ZMUMPS_REORDER_TREE'
142 info(1)=-7
143 info(2)=nsteps
144 RETURN
145 ENDIF
146 cost_trav=0.0d0
147 cost_node=0.0d0
148 ENDIF
149 IF(nbroot.EQ.nbleaf)THEN
150 IF((perm.NE.1).OR.(perm.EQ.4).OR.(perm.EQ.6))THEN
151 WRITE(*,*)'Internal Error in reordertree:'
152 WRITE(*,*)' problem with perm parameter in reordertree'
154 ENDIF
155 DO i=1,nbroot
156 tab1(i)=int(nd(step(na(i+2+nbleaf))),8)
157 ipool(i)=na(i+2+nbleaf)
158 m(step(ipool(i)))=tab1(i)*tab1(i)
159 ENDDO
161 & result,t1,t2)
162 GOTO 789
163 ENDIF
164 IF((perm.EQ.3).OR.(perm.EQ.4))THEN
165 ALLOCATE(depth(nsteps),stat=allocok)
166 IF (allocok > 0) THEN
167 IF ( lp .GT. 0 )
168 & WRITE(lp,*)'Memory allocation error in
169 & ZMUMPS_REORDER_TREE'
170 info(1)=-7
171 info(2)=nsteps
172 RETURN
173 ENDIF
174 depth=0
175 nbroot = na(2)
176 ipool(1:nbroot) = na(3+nbleaf:2+nbleaf+nbroot)
177 fin=nbroot
178 leaf=na(1)
179 499 CONTINUE
180 inode=ipool(fin)
181 IF(inode.LT.0)THEN
182 WRITE(*,*)'Internal Error in reordertree INODE < 0 !'
184 ENDIF
185 in=inode
186 4602 in = fils(in)
187 IF (in .GT. 0 ) THEN
188 GOTO 4602
189 ENDIF
190 in=-in
191 DO i=1,ne(step(inode))
192 son(i)=in
193 in=frere(step(in))
194 ENDDO
195 DO i=1,ne(step(inode))
196 ipool(fin)=son(i)
197 depth(step(son(i)))=depth(step(inode))+1
198 son(i)=0
199 fin=fin+1
200 ENDDO
201 IF(ne(step(inode)).EQ.0)THEN
202 leaf=leaf-1
203 ELSE
204 fin=fin-1
205 GOTO 499
206 ENDIF
207 fin=fin-1
208 IF(fin.EQ.0) GOTO 489
209 GOTO 499
210 489 CONTINUE
211 ENDIF
212 DO i=1,nsteps
213 m(i)=0_8
214 IF (sbtr_m.OR.(perm.EQ.2)) THEN
215 IF((sbtr_which_m.EQ.1).AND.(perm.NE.1))THEN
216 m_total(i)=0_8
217 ENDIF
218 ENDIF
219 ENDDO
220 DO i=1,nsteps
221 fact(i)=0_8
222 ENDDO
223 ipool(1:nbleaf)=na(3:2+nbleaf)
224 leaf = nbleaf + 1
225 91 CONTINUE
226 IF (leaf.NE.1) THEN
227 leaf = leaf -1
228 inode = ipool(leaf)
229 ENDIF
230 96 CONTINUE
231 nfr = int(nd(step(inode)),8)
232 nstk = ne(step(inode))
233 nelim4 = 0
234 in = inode
235 101 nelim4 = nelim4 + 1
236 in = fils(in)
237 IF (in .GT. 0 ) GOTO 101
238 nelim=int(nelim4,8)
239 IF(ne(step(inode)).EQ.0) THEN
240 m(step(inode))=nfr*nfr
241 IF (sbtr_m.OR.(perm.EQ.2)) THEN
242 m_total(step(inode))=nfr*nfr
243 ENDIF
244 ENDIF
245 IF((perm.EQ.4).OR.(perm.EQ.3))THEN
247 & k199))THEN
248 depth(step(inode))=0
249 ENDIF
250 ENDIF
251 IF ( sym .eq. 0 ) THEN
252 fact(step(inode))=fact(step(inode))+
253 & (2_8*nfr*nelim)-(nelim*nelim)
254 ELSE
255 fact(step(inode))=fact(step(inode))
256 ENDIF
257 IF (use_dad) THEN
258 ifath = dad( step(inode) )
259 ELSE
260 in = inode
261 113 in = frere(in)
262 IF (in.GT.0) GO TO 113
263 ifath = -in
264 ENDIF
265 IF (ifath.EQ.0) THEN
266 nbroot = nbroot - 1
267 IF (nbroot.EQ.0) GOTO 116
268 GOTO 91
269 ELSE
270 fact(step(ifath))=fact(step(ifath))+fact(step(inode))
271 IF((perm.EQ.3).OR.(perm.EQ.4))THEN
272 depth(step(ifath))=
max(depth(step(inode)),
273 & depth(step(ifath)))
274 ENDIF
275 ENDIF
276 tnstk(step(ifath)) = tnstk(step(ifath)) - 1
277 IF ( tnstk(step(ifath)) .EQ. 0 ) THEN
278 inode = ifath
279 in=inode
280 dernier=in
281 i=1
282 5700 in = fils(in)
283 IF (in .GT. 0 ) THEN
284 dernier=in
285 i=i+1
286 GOTO 5700
287 ENDIF
288 ncb=int(nd(step(inode))-i,8)
289 in=-in
290 IF(perm.NE.7)THEN
291 DO i=1,ne(step(inode))
292 son(i)=in
293 temp(i)=in
294 IF(in.GT.0) in=frere(step(in))
295 ENDDO
296 ELSE
297 DO i=ne(step(inode)),1,-1
298 son(i)=in
299 temp(i)=in
300 IF(in.GT.0) in=frere(step(in))
301 ENDDO
302 ENDIF
303 nfr = int(nd(step(inode)),8)
304 DO ii=1,ne(step(inode))
305 tab1(ii)=0_8
306 tab2(ii)=0_8
307 cour=son(ii)
308 nelim4=1
309 151 cour=fils(cour)
310 IF(cour.GT.0) THEN
311 nelim4=nelim4+1
312 GOTO 151
313 ENDIF
314 nelim=int(nelim4,8)
315 IF((sym.EQ.0).OR.(k215.NE.0)) THEN
316 sizecb=(int(nd(step(son(ii))),8)-nelim)
317 & *(int(nd(step(son(ii))),8)-nelim)
318 ELSE
319 sizecb=(int(nd(step(son(ii))),8)-nelim)
320 & *(int(nd(step(son(ii))),8)-
321 & nelim+1_8)/2_8
322 ENDIF
323 IF((perm.EQ.0).OR.(perm.EQ.5))THEN
324 IF (k234 .NE. 0 .AND. k55.EQ.0 ) THEN
325 tmp8=nfr
326 tmp8=tmp8*tmp8
327 tab1(ii)=
max(tmp8, m(step(son(ii)))) - sizecb
328 tab2(ii)=sizecb
329 ELSE
330 tab1(ii)=m(step(son(ii)))- sizecb
331 tab2(ii)=sizecb
332 ENDIF
333 ENDIF
334 IF((perm.EQ.1).OR.(perm.EQ.6)) THEN
335 tab1(ii)=m(step(son(ii)))-sizecb
336 tab1(ii)=tab1(ii)-fact(step(son(ii)))
337 tab2(ii)=sizecb+fact(step(son(ii)))
338 ENDIF
339 IF(perm.EQ.2)THEN
341 & k199))THEN
342 tab1(ii)=m_total(step(son(ii)))-sizecb
343 & -fact(step(son(ii)))
344 tab2(ii)=sizecb
345 ELSE
346 tab1(ii)=m(step(son(ii)))-sizecb
347 tab2(ii)=sizecb
348 ENDIF
349 ENDIF
350 IF(perm.EQ.3)THEN
352 & k199))THEN
353 tab1(ii)=m(step(son(ii)))-sizecb
354 tab2(ii)=sizecb
355 ELSE
356 tab1(ii)=int(depth(step(son(ii))),8)
357 tab2(ii)=m(step(son(ii)))
358 ENDIF
359 ENDIF
360 IF(perm.EQ.4)THEN
362 & k199))THEN
363 tab1(ii)=m(step(son(ii)))-
364 & sizecb-fact(step(son(ii)))
365 tab2(ii)=sizecb
366 ELSE
367 tab1(ii)=int(depth(step(son(ii))),8)
368 tab2(ii)=m(step(son(ii)))
369 ENDIF
370 ENDIF
371 ENDDO
373 & local_perm
374 & ,result,t1,t2)
375 IF(perm.EQ.0) THEN
376 DO ii=1,ne(step(inode))
377 cour=temp(ii)
378 nelim4=1
379 153 cour=fils(cour)
380 IF(cour.GT.0) THEN
381 nelim4=nelim4+1
382 GOTO 153
383 ENDIF
384 nelim=int(nelim4,8)
385 IF((sym.EQ.0).OR.(k215.NE.0))THEN
386 sizecb=(int(nd(step(temp(ii))),8)-nelim)*
387 & (int(nd(step(temp(ii))),8)-nelim)
388 ELSE
389 sizecb=(int(nd(step(temp(ii))),8)-nelim)*
390 & (int(nd(step(temp(ii))),8)-nelim+1_8)/2_8
391 ENDIF
392 tab1(ii)=sizecb
393 ENDDO
395 & result,t1,t2)
396 ENDIF
397 IF(perm.EQ.1) THEN
398 DO ii=1,ne(step(inode))
399 cour=temp(ii)
400 nelim4=1
401 187 cour=fils(cour)
402 IF(cour.GT.0) THEN
403 nelim4=nelim4+1
404 GOTO 187
405 ENDIF
406 nelim=int(nelim4,8)
407 IF((sym.EQ.0).OR.(k215.NE.0))THEN
408 sizecb=(int(nd(step(temp(ii))),8)-nelim)*
409 & (int(nd(step(temp(ii))),8)-nelim)
410 ELSE
411 sizecb=(int(nd(step(temp(ii))),8)-nelim)*
412 & (int(nd(step(temp(ii))),8)-nelim+1_8)/2_8
413 ENDIF
414 tab1(ii)=sizecb+fact(step(temp(ii)))
415 ENDDO
417 & result,t1,t2)
418 ENDIF
419 CONTINUE
420 ifath=inode
421 DO ii=1,2
422 sum=0_8
423 fact_size=0_8
424 fact_size_t=0_8
425 mem_size=0_8
426 mem_size_t=0_8
427 cb_max=0
428 cb_current=0
429 tmp_sum=0_8
430 IF(ii.EQ.1) tab=>son
431 IF(ii.EQ.2) tab=>temp
432 DO i=1,ne(step(inode))
433 cour=tab(i)
434 nelim4=1
435 149 cour=fils(cour)
436 IF(cour.GT.0) THEN
437 nelim4=nelim4+1
438 GOTO 149
439 ENDIF
440 nelim=int(nelim4, 8)
441 nfr=int(nd(step(tab(i))),8)
442 IF((sym.EQ.0).OR.(k215.NE.0))THEN
443 sizecb=(nfr-nelim)*(nfr-nelim)
444 ELSE
445 sizecb=(nfr-nelim)*(nfr-nelim+1_8)/2_8
446 ENDIF
447 mem_size=
max(mem_size,(m(step(tab(i)))+sum+fact_size))
448 IF (sbtr_m.OR.(perm.EQ.2)) THEN
449 mem_size_t=
max(mem_size_t,(m_total(step(tab(i)))+
450 & sum+
451 & fact_size_t))
452 fact_size_t=fact_size_t+fact(step(tab(i)))
453 ENDIF
454 total_mem_size=
max(total_mem_size,
455 & (m(step(tab(i)))+sum+fact_size))
456 tmp_sum=tmp_sum+fact(step(tab(i)))
457 sum=sum+sizecb
458 sizecb_lastson = sizecb
459 IF((perm.EQ.1).OR.(perm.EQ.4))THEN
460 fact_size=fact_size+fact(step(tab(i)))
461 ENDIF
462 ENDDO
463 IF((sym.EQ.0).OR.(k215.NE.0))THEN
464 sizecb=ncb*ncb
465 ELSE
466 sizecb=(ncb*(ncb+1_8))/2_8
467 ENDIF
468 IF (k234.NE.0 .AND. k55.EQ.0) THEN
469 total_mem_size=
max(total_mem_size,
470 & ( ( int(nd(step(ifath)),8)
471 & * int(nd(step(ifath)),8) )
472 & + sum-sizecb_lastson+tmp_sum )
473 & )
474 ELSE IF (k234.NE.0 .AND. k55.NE.0) THEN
475 total_mem_size=
max(total_mem_size,
476 & ( ( int(nd(step(ifath)),8)
477 & * int(nd(step(ifath)),8) )
478 & + sum + tmp_sum )
479 & )
480 ELSE
481 total_mem_size=
max(total_mem_size,
482 & ( ( int(nd(step(ifath)),8)
483 & * int(nd(step(ifath)),8))
484 & +
max(sum,sizecb) + tmp_sum )
485 & )
486 ENDIF
487 IF(ii.EQ.1)THEN
488 tmp_total_mem_size=total_mem_size
489 ENDIF
490 IF(ii.EQ.1)THEN
491 IF (k234.NE.0 .AND. k55.EQ.0) THEN
492 m(step(ifath))=
max(mem_size,((int(nd(step(ifath)),8)
493 & *int(nd(step(ifath)),8))+sum-sizecb_lastson+
494 & fact_size))
495 ELSE IF (k234.NE.0 .AND. k55.NE.0) THEN
496 m(step(ifath))=
max(mem_size,((int(nd(step(ifath)),8)
497 & *int(nd(step(ifath)),8))+sum+fact_size))
498 ELSE
499 m(step(ifath))=
max(mem_size,((int(nd(step(ifath)),8)
500 & *int(nd(step(ifath)),8))+
max(sum,sizecb)+fact_size))
501 ENDIF
502 IF (sbtr_m.OR.(perm.EQ.2)) THEN
503 m_total(step(ifath))=
max(mem_size_t,
504 & ((int(nd(step(ifath)),8)
505 & *int(nd(step(ifath)),8))+
max(sum,sizecb)+
506 & fact_size_t))
507 ENDIF
508 ENDIF
509 IF((ii.EQ.2).AND.(perm.EQ.1).OR.(perm.EQ.0).OR.
510 & (perm.EQ.5).OR.(perm.EQ.6).OR.
511 & (.NOT.sbtr_m.OR.(sbtr_which_m.NE.1)))THEN
512 mem_sec_perm=
max(mem_size,((int(nd(step(ifath)),8)
513 & *int(nd(step(ifath)),8))+
max(sum,sizecb)+fact_size))
514 ENDIF
515 IF((perm.EQ.2).OR.(perm.EQ.3).OR.(perm.EQ.4))THEN
516 mem_sec_perm=huge(mem_sec_perm)
517 ENDIF
518 ENDDO
519 IF(mem_sec_perm.EQ.m(step(ifath))) THEN
520 tab=>temp
521 ELSE IF (mem_sec_perm.LT.m(step(ifath))) THEN
522 WRITE(*,*)'Internal error 1 in ZMUMPS_REORDER_TREE',
523 & mem_sec_perm, m(step(ifath))
525 ELSE
526 total_mem_size=tmp_total_mem_size
527 tab=>son
528 ENDIF
529 DO i=ne(step(inode)),1,-1
530 IF(i.EQ.ne(step(inode))) THEN
531 fils(dernier)=-tab(i)
532 dernier=tab(i)
533 GOTO 222
534 ENDIF
535 IF(i.EQ.1) THEN
536 frere(step(dernier))=tab(i)
537 frere(step(tab(i)))=-inode
538 GOTO 222
539 ENDIF
540 IF(i.GT.1) THEN
541 frere(step(dernier))=tab(i)
542 dernier=tab(i)
543 GOTO 222
544 ENDIF
545 222 CONTINUE
546 ENDDO
547 GOTO 96
548 ELSE
549 GOTO 91
550 ENDIF
551 116 CONTINUE
552 nbroot = na(2)
553 ipool(1:nbroot) = na(3+nbleaf:2+nbleaf+nbroot)
554 IF (perm.eq.1) THEN
555 DO i=1,nbroot
556 tab1(i)=m(step(na(i+2+nbleaf)))-fact(step(na(i+2+nbleaf)))
557 tab1(i)=-tab1(i)
558 ENDDO
560 & result,t1,t2)
561 ipool(1:nbroot) = na(3+nbleaf:2+nbleaf+nbroot)
562 ENDIF
563 001 CONTINUE
564 fin=nbroot
565 leaf=na(1)
566 first_leaf=-9999
567 size_sbtr=0
568 999 CONTINUE
569 inode=ipool(fin)
570 IF(inode.LT.0)THEN
571 WRITE(*,*)'Internal Error in reordertree INODE < 0 !'
573 ENDIF
574 in=inode
575 5602 in = fils(in)
576 IF (in .GT. 0 ) THEN
577 dernier=in
578 GOTO 5602
579 ENDIF
580 in=-in
581 IF((perm.EQ.5).OR.(perm.EQ.6))THEN
582 IF(slavef.NE.1)THEN
583 IF (use_dad) THEN
584 ifath=dad(inode)
585 ELSE
586 in = inode
587 395 in = frere(in)
588 IF (in.GT.0) GO TO 395
589 ifath = -in
590 ENDIF
591 nfr4 = nd(step(inode))
592 nfr = int(nfr4,8)
593 nelim4 = 0
594 in = inode
595 396 nelim4 = nelim4 + 1
596 in = fils(in)
597 IF (in .GT. 0 ) GOTO 396
598 nelim=int(nelim4,8)
599 IF((sym.EQ.0).OR.(k215.NE.0))THEN
600 sizecb=(nfr-nelim)*(nfr-nelim)
601 ELSE
602 sizecb=(nfr-nelim)*(nfr-nelim+1_8)/2_8
603 ENDIF
605 & sym,1,cost_node)
606 IF(ifath.NE.0)THEN
608 cost_trav(step(inode))=cost_trav(step(
609 & root_of_cur_sbtr))
610 ELSE
611 cost_trav(step(inode))=dble(cost_node)+
612 & cost_trav(step(ifath))+
613 & dble(sizecb*18_8)
614 ENDIF
615 ELSE
616 cost_trav(step(inode))=dble(cost_node)
617 ENDIF
618 ENDIF
619 ENDIF
620 DO i=1,ne(step(inode))
621 temp(i)=in
622 IF((perm.EQ.5).OR.(perm.EQ.6))THEN
624 & procnode(step(inode)),k199)))THEN
625 nfr4 = nd(step(inode))
626 nfr = int(nfr4,8)
627 nelim4 = 0
628 ii = temp(i)
629 845 nelim4 = nelim4 + 1
630 ii = fils(ii)
631 IF (ii .GT. 0 ) GOTO 845
632 nelim=int(nelim4,8)
634 & sym,1,cost_node)
635 tab1(i)=int(dble(cost_node)+
636 & cost_trav(step(inode)),8)
637 tab2(i)=0_8
638 ELSE
639 son(i)=in
640 ENDIF
641 ELSE
642 son(i)=in
643 ENDIF
644 in=frere(step(in))
645 ENDDO
646 IF((perm.EQ.5).OR.(perm.EQ.6))THEN
648 & procnode(step(inode)),k199)))THEN
650 & local_perm
651 & ,result,t1,t2)
652 tab=>temp
653 DO i=ne(step(inode)),1,-1
654 IF(i.EQ.ne(step(inode))) THEN
655 fils(dernier)=-tab(i)
656 dernier=tab(i)
657 GOTO 221
658 ENDIF
659 IF(i.EQ.1) THEN
660 frere(step(dernier))=tab(i)
661 frere(step(tab(i)))=-inode
662 GOTO 221
663 ENDIF
664 IF(i.GT.1) THEN
665 frere(step(dernier))=tab(i)
666 dernier=tab(i)
667 GOTO 221
668 ENDIF
669 221 CONTINUE
670 son(ne(step(inode))-i+1)=tab(i)
671 ENDDO
672 ENDIF
673 ENDIF
674 DO i=1,ne(step(inode))
675 ipool(fin)=son(i)
676 son(i)=0
677 fin=fin+1
678 ENDDO
679 IF(ne(step(inode)).EQ.0)THEN
680 IF(perm.NE.7)THEN
681 na(leaf+2)=inode
682 ENDIF
683 leaf=leaf-1
684 ELSE
685 fin=fin-1
686 GOTO 999
687 ENDIF
688 fin=fin-1
689 IF(fin.EQ.0) THEN
690 GOTO 789
691 ENDIF
692 GOTO 999
693 789 CONTINUE
694 IF(perm.EQ.7) GOTO 5483
695 nbroot=na(2)
696 nbleaf=na(1)
697 peak=0.0d0
698 fact_size=0_8
699 DO i=1,nbroot
700 peak=
max(peak,dble(m(step(na(2+nbleaf+i)))))
701 fact_size=fact_size+fact(step(na(2+nbleaf+i)))
702 ENDDO
703 5483 CONTINUE
704 DEALLOCATE(ipool)
705 DEALLOCATE(fact)
706 DEALLOCATE(tnstk)
707 DEALLOCATE(son)
708 DEALLOCATE(tab2)
709 DEALLOCATE(tab1)
710 DEALLOCATE(t1)
711 DEALLOCATE(t2)
712 DEALLOCATE(result)
713 DEALLOCATE(temp)
714 IF(perm.NE.7)THEN
715 DEALLOCATE(m)
716 ENDIF
717 IF((perm.EQ.3).OR.(perm.EQ.4))THEN
718 DEALLOCATE(depth)
719 ENDIF
720 IF((perm.EQ.5).OR.(perm.EQ.6))THEN
721 DEALLOCATE(cost_trav)
722 ENDIF
723 IF ((perm.NE.7).AND.(sbtr_m.OR.(perm.EQ.2))) THEN
724 IF((sbtr_which_m.EQ.1).AND.(perm.NE.1).OR.(perm.EQ.2))THEN
725 DEALLOCATE(m_total)
726 ENDIF
727 ENDIF
728 RETURN