29 IMPLICIT NONE
30
31 include 'mpif.h'
32 include 'mumps_tags.h'
33 INTEGER IERR, MASTER
34 parameter( master = 0 )
35
36
37
38
39
40
41
42
43
44
45
46 TYPE(ZMUMPS_STRUC), TARGET :: id
47
48
49
50
51
52
53 INTEGER IKEEP, NE, NA
54 INTEGER I, allocok
55
56 INTEGER NB_NIV2, IDEST
57 INTEGER :: STATUS(MPI_STATUS_SIZE)
58 INTEGER LOCAL_M, LOCAL_N
59 INTEGER numroc
61 INTEGER IRANK
62 INTEGER MP, LP, MPG
63 LOGICAL PROK, PROKG, LISTVAR_SCHUR_2BE_FREED, LPOK
64 INTEGER SIZE_SCHUR_PASSED
65 INTEGER SBUF_SEND_FR, SBUF_REC_FR
66 INTEGER SBUF_SEND_LR, SBUF_REC_LR
67 INTEGER TOTAL_MBYTES
68 INTEGER(8) SUM_KEEP811_THIS_NODE, MAX_SUM_KEEP811_THIS_NODE
69 INTEGER SUM_INFO15_THIS_NODE, MAX_SUM_INFO15_THIS_NODE
70 INTEGER SUM_INFO17_THIS_NODE, MAX_SUM_INFO17_THIS_NODE
71 INTEGER(8) SBUF_RECOLD8, MIN_BUF_SIZE8
72 LOGICAL UPDATE_BUFFER
73 INTEGER MIN_BUF_SIZE
74 INTEGER(8) MAX_SIZE_FACTOR_TMP
75 INTEGER LEAF, INODE, ISTEP, INN,
76 INTEGER NBLEAF, NBROOT, MYROW_CHECK, INIV2
77 DOUBLE PRECISION TIMEG
78 INTEGER :: TOTAL_MBYTES_UNDER_L0
79 INTEGER(8) :: TOTAL_BYTES_UNDER_L0
80 INTEGER :: NBSTATS_I4, NBSTATS_I8
81 parameter(nbstats_i4=4, nbstats_i8=24)
82 INTEGER, ALLOCATABLE, TARGET, DIMENSION(:) :: TNSTK_afterL0
83 INTEGER, ALLOCATABLE, DIMENSION(:) :: FLAGGED_LEAVES
84 INTEGER(8) :: PEAK_UNDER_L0,
85 INTEGER(8) :: SUM_NRLADU, MAX_NRLADU, MIN_NRLADU,
86 & ,
87 & SUM_NRLADULR_UD, SUM_NRLADULR_WC,
88 & SUM_NRLNEC, SUM_NRLNEC_ACTIVE,
89 & MIN_NRLNEC
90 INTEGER :: ,
91 & SUM_NIRADU_OOC,
92 & SUM_NIRNEC, SUM_NIRNEC_OOC
93 INTEGER :: LIPOOL_local
94 INTEGER(8) :: MAX_FRONT_SURFACE_LOCAL_L0,
95 & MAX_SIZE_FACTOR_L0,
96 & ENTRIES_IN_FACTORS_UNDER_L0,
97 & ENTRIES_IN_FACTORS_MASTERS_LO
98 INTEGER :: MAXFR_UNDER_L0
99 DOUBLE PRECISION :: COST_SUBTREES_UNDER_L0, OPSA_UNDER_L0
100
101
102 DOUBLE PRECISION :: PEAK
103 INTEGER(8):: SIZECB_UNDER_L0, SIZECB_UNDER_L0_IF_LRCB
104 LOGICAL :: ABOVE_L0
105
106
107
108 INTEGER, ALLOCATABLE, DIMENSION(:):: IPOOL
109 INTEGER :: LIPOOL
110 INTEGER, ALLOCATABLE, TARGET, DIMENSION(:) :: PAR2_NODES
111 INTEGER, DIMENSION(:), POINTER :: PAR2_NODESPTR
112 INTEGER, ALLOCATABLE, DIMENSION(:) :: PROCNODE
113 INTEGER, DIMENSION(:), ALLOCATABLE :: IWtemp
114 INTEGER, DIMENSION(:), ALLOCATABLE :: XNODEL, NODEL
115 INTEGER, DIMENSION(:), POINTER :: SSARBR
116
117 INTEGER, POINTER :: NELT, LELTVAR
118 INTEGER, DIMENSION(:), POINTER :: KEEP, INFO, INFOG
119 INTEGER(8), DIMENSION(:), POINTER :: KEEP8
120 INTEGER(8) :: ENTRIES_IN_FACTORS_LOC_MASTERS
121 DOUBLE PRECISION, DIMENSION(:), POINTER :: RINFO
122 DOUBLE PRECISION, DIMENSION(:), POINTER :: RINFOG
123 INTEGER, DIMENSION(:), POINTER :: ICNTL
124 LOGICAL :: I_AM_SLAVE, PERLU_ON, COND
125 INTEGER :: OOC_STRAT, BLR_STRAT
126 INTEGER :: IDUMMY
127 INTEGER, TARGET :: IDUMMY_ARRAY(1)
128 INTEGER, POINTER, DIMENSION(:) :: IRN_loc_PTR
129 INTEGER, POINTER, DIMENSION(:) :: JCN_loc_PTR
130 INTEGER, POINTER, DIMENSION(:) :: IRN_PTR
131 INTEGER, POINTER, DIMENSION(:) :: JCN_PTR
132 INTEGER, POINTER, DIMENSION(:) :: SIZEOFBLOCKS_PTR
133 INTEGER, POINTER, DIMENSION(:) :: UNS_PERM_PTR
134 LOGICAL :: BDUMMY
135 INTEGER(8) :: K8_33relaxed, K8_34relaxed, ,
136 & K8_50relaxed
137 LOGICAL ::
138 INTEGER , MUMPS_PROCNODE
140 INTEGER, EXTERNAL :: MUMPS_ENCODE_TPN_IPROC
141 INTEGER :: PROCNODE_VALUE
142 INTEGER K,J, IFS
143 INTEGER SIZE_TEMP_MEM,SIZE_DEPTH_FIRST,SIZE_COST_TRAV
144 LOGICAL IS_BUILD_LOAD_MEM_CALLED
145 LOGICAL PRINT_MAXAVG, PRINT_NODEINFO
146 DOUBLE PRECISION, DIMENSION (:,:), ALLOCATABLE :: TEMP_MEM
147 INTEGER, DIMENSION (:,:), ALLOCATABLE :: TEMP_ROOT
148 INTEGER, DIMENSION (:,:), ALLOCATABLE :: TEMP_LEAF
149 INTEGER, DIMENSION (:,:), ALLOCATABLE :: TEMP_SIZE
150 INTEGER, DIMENSION (:), ALLOCATABLE :: DEPTH_FIRST
151 INTEGER, DIMENSION (:), ALLOCATABLE ::
152 INTEGER, DIMENSION (:), ALLOCATABLE :: SBTR_ID
153 DOUBLE PRECISION, DIMENSION (:), ALLOCATABLE :: COST_TRAV_TMP
154 INTEGER(8) :: TOTAL_BYTES, ITMP8
155 INTEGER :: SIZE_PAR2_NODESPTR
156 INTEGER :: LSIZEOFBLOCKS_PTR
157 LOGICAL :: READY_FOR_ANA_F
158 INTEGER, ALLOCATABLE, DIMENSION(:) :: MAPCOL
159 LOGICAL :: BLKPTR_ALLOCATED, BLKVAR_ALLOCATED
160 INTEGER :: IB, BLKSIZE
161 INTEGER :: IBcurrent, IPOS, IPOSB, II
162
163
164
165 INTEGER, TARGET, DIMENSION(:), allocatable:: SIZEOFBLOCKS
166 INTEGER, DIMENSION(:), allocatable:: DOF2BLOCK
167 INTEGER :: NBRECORDS
168 INTEGER(8) :: NSEND8, NLOCAL8
169
170
171
172
173
174
175
176
177
178
179
180
181
182C
183 TYPE(LMATRIX_T)
184LOGICAL :: GCOMP_PROVIDED
185 TYPE(COMPACT_GRAPH_T) :: GCOMP
186 TYPE(COMPACT_GRAPH_T) :: GCOMP_DIST
187 INTEGER(4) :: I4
188 INTEGER, POINTER, DIMENSION(:) ::
189 & NFSIZPTR,
190 & FILSPTR,
191 & FREREPTR, NE_STEPSPTR,
192 & IKEEP1, IKEEP2, IKEEP3,
193 & STEPPTR, LRGROUPSPTR
194 INTEGER, ALLOCATABLE, DIMENSION(:), TARGET :: IKEEPALLOC
195 INTEGER, ALLOCATABLE, DIMENSION(:) ::
196 ! Used because of multithreaded SIM_NP_
197 INTEGER :: locMYID, locMYID_NODES
198 LOGICAL, POINTER :: locI_AM_CAND(:)
199 INTEGER(kind=8) :: NZ8, LIW8
200
201 INTEGER :: NBLK
202 INTEGER :: LIW_ELT
203
204
205
206 LOGICAL :: GATHER_MATRIX_ALLOCATED
207C
208 INTERFACE
211 TYPE (ZMUMPS_STRUC), TARGET :: id
213
215 & id_BLRARRAY_ENCODING, KEEP8, K34)
216# if defined(MUMPS_F2003)
217 CHARACTER, DIMENSION(:), POINTER, intent(inout) ::
218 & id_blrarray_encoding
219 CHARACTER, DIMENSION(:), POINTER, intent(inout) ::
220 & id_fdm_f_encoding
221# else
222 CHARACTER, DIMENSION(:), POINTER :: id_BLRARRAY_ENCODING
223 CHARACTER, DIMENSION(:), POINTER :: id_FDM_F_ENCODING
224# endif
225 INTEGER(8), intent(inout) :: KEEP8(150)
226 INTEGER, intent(in) :: K34
228 END INTERFACE
229
230
231
232
233
234
236 is_build_load_mem_called=.false.
245 leltvar =>
id%LELTVAR
246 keep(264) = 0
247 keep(265) = 0
248 print_maxavg = .NOT.(
id%NSLAVES.EQ.1 .AND. keep(46).EQ.1)
249
250
251 print_nodeinfo = print_maxavg .AND.
id%NPROCS .NE.
id%KEEP(412)
252 gather_matrix_allocated = .false.
253 NULLIFY ( nfsizptr,
254 & filsptr,
255 & frereptr, ne_stepsptr,
256 & ikeep1, ikeep2, ikeep3, stepptr, lrgroupsptr,
257 & ssarbr, sizeofblocks_ptr, irn_loc_ptr, jcn_loc_ptr,
258 & irn_ptr, jcn_ptr,
259 & par2_nodesptr )
260 IF (
associated(
id%UNS_PERM))
DEALLOCATE(
id%UNS_PERM)
262 idummy = 1
263 bdummy = .false.
264
265
267 gcomp_provided = .false.
268 blkptr_allocated = .false.
269 blkvar_allocated = .false.
270
271
272
273
274
275 i_am_slave = (
id%MYID .ne. master .OR.
276 & (
id%MYID .eq. master .AND.
277 &
id%KEEP(46) .eq. 1 ) )
281
282
283 lpok = ((
lp.GT.0).AND.(
id%ICNTL(4).GE.1))
284 prok = ((
mp .GT. 0 ).AND.(icntl(4).GE.2))
285 prokg = (
mpg .GT. 0 .and.
id%MYID .eq. master )
288 IF ( keep(50) .eq. 0 ) THEN
289 WRITE(
mp,
'(A)')
'L U Solver for unsymmetric matrices'
290 ELSE IF ( keep(50) .eq. 1 ) THEN
292 & 'L D L^T Solver for symmetric positive definite matrices'
293 ELSE
295 & 'L D L^T Solver for general symmetric matrices'
296 END IF
297 IF ( keep(46) .eq. 1 ) THEN
298 WRITE(
mp,
'(A)')
'Type of parallelism: Working host'
299 ELSE
300 WRITE(
mp,
'(A)')
'Type of parallelism: Host not working'
301 END IF
302 END IF
304 IF ( keep(50) .eq. 0 ) THEN
305 WRITE(
mpg,
'(A)')
'L U Solver for unsymmetric matrices'
306 ELSE IF ( keep(50) .eq. 1 ) THEN
308 & 'L D L^T Solver for symmetric positive definite matrices'
309 ELSE
311 & 'L D L^T Solver for general symmetric matrices'
312 END IF
313 IF ( keep(46) .eq. 1 ) THEN
314 WRITE(
mpg,
'(A)')
'Type of parallelism: Working host'
315 ELSE
316 WRITE(
mpg,
'(A)')
'Type of parallelism: Host not working'
317 END IF
318 END IF
319 IF (
prok)
WRITE(
mp, 110 )
321
322
323
324
325
326
327
328
329 IF (
id%KEEP8(24).EQ.0_8)
THEN
330
331 IF (
associated(
id%S))
THEN
334 ENDIF
335 ENDIF
337 keep8(24) = 0_8
338 IF (
associated(
id%IS))
THEN
341 ENDIF
342
343
344
346 &
id%BLRARRAY_ENCODING,
id%KEEP8(1),
id%KEEP(34))
347 IF (
associated(
id%root%RG2L_ROW))
THEN
348 DEALLOCATE(
id%root%RG2L_ROW)
349 NULLIFY(
id%root%RG2L_ROW)
350 ENDIF
351 IF (
associated(
id%root%RG2L_COL))
THEN
352 DEALLOCATE(
id%root%RG2L_COL)
353 NULLIFY(
id%root%RG2L_COL)
354 ENDIF
355 IF (
associated(
id%PTLUST_S ))
THEN
356 DEALLOCATE(
id%PTLUST_S)
358 ENDIF
359 IF (
associated(
id%PTRFAC))
THEN
360 DEALLOCATE(
id%PTRFAC)
362 END IF
363 IF (
associated(
id%RHSCOMP))
THEN
364 DEALLOCATE(
id%RHSCOMP)
367 ENDIF
368 IF (
associated(
id%POSINRHSCOMP_ROW))
THEN
369 DEALLOCATE(
id%POSINRHSCOMP_ROW)
370 NULLIFY(
id%POSINRHSCOMP_ROW)
371 ENDIF
372 IF (
id%POSINRHSCOMP_COL_ALLOC)
THEN
373 DEALLOCATE(
id%POSINRHSCOMP_COL)
374 NULLIFY(
id%POSINRHSCOMP_COL)
375 id%POSINRHSCOMP_COL_ALLOC = .false.
376 ENDIF
377
378
379
380
381
382
383 IF (
associated(
id%Step2node))
THEN
384 DEALLOCATE(
id%Step2node)
385 NULLIFY(
id%Step2node)
386 ENDIF
387 IF (
associated(
id%IPOOL_B_L0_OMP))
THEN
388 DEALLOCATE(
id%IPOOL_B_L0_OMP)
389 NULLIFY(
id%IPOOL_B_L0_OMP)
390 ENDIF
391 IF (
associated(
id%IPOOL_A_L0_OMP))
THEN
392 DEALLOCATE(
id%IPOOL_A_L0_OMP)
393 NULLIFY(
id%IPOOL_A_L0_OMP)
394 ENDIF
395 IF (
associated(
id%PHYS_L0_OMP))
THEN
396 DEALLOCATE(
id%PHYS_L0_OMP)
397 NULLIFY(
id%PHYS_L0_OMP)
398 ENDIF
399 IF (
associated(
id%VIRT_L0_OMP))
THEN
400 DEALLOCATE(
id%VIRT_L0_OMP)
401 NULLIFY(
id%VIRT_L0_OMP)
402 ENDIF
403 IF (
associated(
id%VIRT_L0_OMP_MAPPING))
THEN
404 DEALLOCATE(
id%VIRT_L0_OMP_MAPPING)
405 NULLIFY(
id%VIRT_L0_OMP_MAPPING)
406 ENDIF
407 IF (
associated(
id%PERM_L0_OMP))
THEN
408 DEALLOCATE(
id%PERM_L0_OMP)
409 NULLIFY(
id%PERM_L0_OMP)
410 ENDIF
411 IF (
associated(
id%PTR_LEAFS_L0_OMP))
THEN
412 DEALLOCATE(
id%PTR_LEAFS_L0_OMP )
413 NULLIFY(
id%PTR_LEAFS_L0_OMP)
414 ENDIF
415 IF (
associated(
id%I4_L0_OMP))
THEN
416 DEALLOCATE(
id%I4_L0_OMP)
417 NULLIFY(
id%I4_L0_OMP)
418 ENDIF
419 IF (
associated(
id%I8_L0_OMP))
THEN
420 DEALLOCATE(
id%I8_L0_OMP)
421 NULLIFY(
id%I8_L0_OMP)
422 ENDIF
423 IF (.NOT.i_am_slave) THEN
424 ALLOCATE(
id%I4_L0_OMP(1,1),
id%I8_L0_OMP(1,1), stat=allocok)
425 IF (allocok.gt.0) THEN
426 info(1)= -7
427 info(2)= 2
428 ENDIF
429 ENDIF
430 IF (
associated(
id%L0_OMP_MAPPING))
THEN
431 DEALLOCATE(
id%L0_OMP_MAPPING)
432 NULLIFY(
id%L0_OMP_MAPPING)
433 ENDIF
434 IF (
associated(
id%L0_OMP_FACTORS))
THEN
436 END IF
437
438
439
440
441
442
446 IF ( info(1) .LT. 0 ) GOTO 500
447
448
449
450
451 CALL mpi_bcast( keep(60), 1, mpi_integer, master,
id%COMM, ierr )
452
453 IF (
id%KEEP(60) .NE. 0 )
THEN
454 CALL mpi_bcast( keep(116), 1, mpi_integer, master,
456 ENDIF
457 IF (
id%KEEP(60) .EQ. 2 .or.
id%KEEP(60). eq. 3)
THEN
459 & mpi_integer, master,
id%COMM, ierr )
461 & mpi_integer, master,
id%COMM, ierr )
463 & mpi_integer, master,
id%COMM, ierr )
465 & mpi_integer, master,
id%COMM, ierr )
466
467
468 ENDIF
469
470
471
472
473
474
475
476 CALL mpi_bcast( keep(54), 2, mpi_integer, master,
id%COMM, ierr )
477
478
479
480
481 CALL mpi_bcast( keep(69), 1, mpi_integer, master,
id%COMM, ierr )
482
483
484
485 CALL mpi_bcast( keep(201), 1, mpi_integer, master,
id%COMM, ierr )
486
487
488
489 CALL mpi_bcast( keep(244), 1, mpi_integer, master,
id%COMM, ierr )
490
491
492
493 CALL mpi_bcast( keep(251), 3, mpi_integer,master,
id%COMM,ierr)
494
495 CALL mpi_bcast( keep(400), 1, mpi_integer,master,
id%COMM,ierr)
496 CALL mpi_bcast(
id%KEEP(490), 5, mpi_integer, master,
498
499
500
501 CALL mpi_bcast(
id%N, 1, mpi_integer, master,
id%COMM, ierr )
502
503
504
505 IF ( keep(55) .EQ. 0) THEN
506 IF ( keep(54) .eq. 3 ) THEN
507
509 & mpi_integer8,
510 & mpi_sum,
id%COMM, ierr )
511 ELSE
512
513 CALL mpi_bcast(
id%KEEP8(28), 1, mpi_integer8, master,
515 END IF
516 ELSE
517
518 CALL mpi_bcast(
id%KEEP8(30), 1, mpi_integer8, master,
520 ENDIF
521 IF(
id%KEEP(54).EQ.3)
THEN
522
523 IF (i_am_slave .AND.
id%KEEP8(29).GT.0 .AND.
524 & ( (.NOT.
associated(
id%IRN_loc)) .OR.
525 & (.NOT.
associated(
id%JCN_loc)) )
526 & ) THEN
529 ENDIF
530 ENDIF
531 IF (
associated(
id%MEM_DIST) )
THEN
532 DEALLOCATE(
id%MEM_DIST )
533 ENDIF
534 allocate(
id%MEM_DIST( 0:
id%NSLAVES-1 ), stat=ierr )
535 IF ( ierr .GT. 0 ) THEN
536 info(1) = -7
539 WRITE(
lp, 150)
'MEM_DIST'
540 END IF
541 END IF
544 IF ( info(1) .LT. 0 ) GOTO 500
545 id%MEM_DIST(0:
id%NSLAVES-1) = 0
547 &
id%COMM,
id%COMM_NODES,keep(69),keep(46),
548 &
id%NSLAVES,
id%MEM_DIST,info)
549
550
551
552
554 IF (
id%INFO(1) .LT. 0 )
GOTO 500
555
556
557
558 IF (
id%MYID .EQ. master )
THEN
559 IF (keep(13).NE.0) THEN
560
561
562
563 IF (.NOT.
associated(
id%BLKVAR))
THEN
564
565 keep(14) = 0
566 ELSE
567 IF (
size(
id%BLKVAR).EQ.
id%N)
THEN
568
569 keep(14) = 0
570 ELSE
571
572 keep(14) = 1
575 & " ERROR with centralized matrix. Size of id%BLKVAR ",
576 & "should be equal to id%N instead of ",
578 ENDIF
581 ENDIF
582 ENDIF
583 IF (keep(13).GE.1) THEN
584
585
586 IF ( .NOT.
associated(
id%BLKPTR))
THEN
589 & " id%BLKPTR should be provided by user on host "
590 ENDIF
593 ENDIF
594 IF ( (
id%NBLK.LE.0).OR.(
id%NBLK.GT.
id%N)
595 & .OR. (
id%NBLK+1.NE.
size(
id%BLKPTR))
596 & ) THEN
599 &
" ERROR incorrect value of id%NBLK:",
id%NBLK
600 ENDIF
603 ENDIF
605 IF (
id%BLKPTR(
id%NBLK+1)-1.NE.
id%N)
THEN
608 & " ERROR id%BLKPTR(id%NBLK+1)-1 ",
609 & "should be equal to id%N instead of ",
610 &
id%BLKPTR(
id%NBLK+1)-1
611 ENDIF
614 ENDIF
615 IF (
id%BLKPTR(1).NE.1)
THEN
618 & " ERROR id%BLKPTR(1)",
619 & "should be equal to 1 instead of ",
621 ENDIF
624 ENDIF
625 ELSE IF (keep(13).LT.0) THEN
626
627
628 nblk =
id%N/(-keep(13))
629 ENDIF
630
631 ENDIF
632
633 ENDIF
636 IF (
id%INFO(1) .LT. 0 )
GOTO 500
637
638
639 CALL mpi_bcast( keep(13), 2, mpi_integer, master,
id%COMM, ierr )
640 CALL mpi_bcast( nblk, 1, mpi_integer, master,
id%COMM, ierr )
641
642
643 IF (keep(13).NE.0) THEN
644
645
646 IF ( ( (keep(54).NE.3).AND.(
id%MYID.EQ.master) )
647 & .OR. (keep(54).EQ.3) ) THEN
648
649
650
651 IF (allocated(sizeofblocks)) DEALLOCATE(sizeofblocks)
652 IF (allocated(dof2block)) DEALLOCATE(dof2block)
653 allocate(sizeofblocks(nblk), dof2block(
id%N),
654 & stat=allocok)
655
656 IF (allocok.NE.0) THEN
658 id%INFO( 2 ) =
id%N+nblk
659 IF (
lpok )
WRITE(
lp, 150)
' SIZEOFBLOCKS, DOF2BLOCK'
660 ENDIF
661
662 IF (
id%MYID.EQ.master.AND.allocok.EQ.0)
THEN
663
664
665 IF (.NOT.
associated(
id%BLKPTR))
THEN
666 blkptr_allocated = .true.
667 allocate(
id%BLKPTR(nblk+1), stat=allocok)
668 IF (allocok.NE.0) THEN
669 blkptr_allocated = .true.
671 id%INFO( 2 ) = nblk+1
672 IF (
lpok )
WRITE(
lp, 150)
' id%BLKPTR '
673 ENDIF
674 ENDIF
675 IF (.NOT.
associated(
id%BLKVAR).AND.allocok.EQ.0)
THEN
676 allocate(
id%BLKVAR(
id%N), stat=allocok)
677 blkvar_allocated = .true.
678 IF (allocok.NE.0) THEN
679 blkvar_allocated = .false.
682 IF (
lpok )
WRITE(
lp, 150)
' id%BLKVAR '
683 ENDIF
684 ENDIF
685 ENDIF
686 ENDIF
689 IF (info(1).LT.0) GOTO 500
690 IF (
id%MYID .EQ. master )
THEN
691
692
693
694
695
696
697 IF (blkvar_allocated) THEN
698
701 ENDDO
702 ENDIF
703 IF (blkptr_allocated) THEN
704 ib=0
705 blksize=-keep(13)
706 DO i=1,
id%N, blksize
707 ib=ib+1
709 ENDDO
710 id%BLKPTR(nblk+1) =
id%N+1
711 ENDIF
712
714 & nblk,
id%N,
id%BLKPTR(1),
id%BLKVAR(1),
715 & sizeofblocks, dof2block)
716 ENDIF
717
718 IF (keep(54).NE.3) THEN
719
720
721
722
723
724 keep(14) = 0
725 IF (
id%MYID.EQ.master)
THEN
726
727
728 IF (
id%KEEP8(28) .EQ. 0_8)
THEN
729 irn_ptr => idummy_array
730 jcn_ptr => idummy_array
731 ELSE
734 ENDIF
736 & nblk,
id%N,
id%KEEP8(28), irn_ptr(1), jcn_ptr(1),
737 & dof2block,
738 & info(1), info(2),
lp,
lpok,
739 & lmat_block )
740 ENDIF
743 IF ( info(1) .LT. 0 ) GOTO 500
744
745 IF (
id%MYID.EQ.master)
THEN
746
747
749 & .true.,
750 & lmat_block, gcomp,
751 & info(1), icntl(1))
752 gcomp_provided = .true.
753 IF (keep(494).EQ.0) THEN
755 ENDIF
756 ENDIF
759 IF ( info(1) .LT. 0 ) GOTO 500
760
761
762 ELSE
763
764
765
766
767
768
769 IF (.NOT. i_am_slave .OR.
770 &
id%KEEP8(29) .EQ. 0_8)
THEN
771
772 irn_loc_ptr => idummy_array
773 jcn_loc_ptr => idummy_array
775 ELSE
776 irn_loc_ptr =>
id%IRN_loc
777 jcn_loc_ptr =>
id%JCN_loc
778 ENDIF
779
780
781
782
783
784 IF (
id%NPROCS.EQ.1)
THEN
785
786 ready_for_ana_f = .true.
788 &
id%MYID,
id%NPROCS,
id%COMM,
791 & irn_loc_ptr(1), jcn_loc_ptr(1),
792 & dof2block(1),
793 &
id%ICNTL(1),
id%INFO(1),
id%KEEP(1),
794 & lumat, gcomp, ready_for_ana_f)
795 gcomp_provided = .true.
796 ELSE
797 ready_for_ana_f = .false.
799 &
id%MYID,
id%NPROCS,
id%COMM,
802 & irn_loc_ptr(1), jcn_loc_ptr(1),
803 & dof2block(1),
804 &
id%ICNTL(1),
id%INFO(1),
id%KEEP(1),
805 & lumat, gcomp_dist, ready_for_ana_f)
806 ENDIF
807
808
811 IF ( info(1) .LT. 0 ) GOTO 500
812
813
814 ENDIF
815
816 IF (allocated(dof2block)) THEN
817
818 IF ( (
id%MYID.EQ.master).AND. (keep(256) .NE. 1))
THEN
819 DEALLOCATE(dof2block)
820 ENDIF
821 ENDIF
822
823 ENDIF
824
825
826
827
828
829 IF ( (keep(244).EQ.1) .AND. (keep(54) .eq. 3) ) THEN
830
831
832
833
834
835
836 IF (keep(13).NE.0) THEN
837 IF (
id%NPROCS.NE.1)
THEN
839 &
id%ICNTL(1), keep(1),
id%COMM,
id%MYID,
id%NPROCS,
841 & gcomp_dist, gcomp)
842 gcomp_provided = .true.
843
845 ENDIF
846 ELSE
848 gather_matrix_allocated = .true.
851 ENDIF
852 IF ( info(1) .LT. 0 ) GOTO 500
853 ENDIF
854 1234 CONTINUE
855 IF (keep(244) .EQ. 1) THEN
856
857 IF (
id%MYID .eq. master )
THEN
858
859
860
861
862
863 IF ( .NOT.
associated(
id%LISTVAR_SCHUR ) )
THEN
864 size_schur_passed = 1
865 listvar_schur_2be_freed=.true.
866 allocate(
id%LISTVAR_SCHUR( 1 ), stat=allocok )
867 IF ( allocok .GT. 0 ) THEN
868 WRITE(*,*)
869 & 'PB allocating an array of size 1 for Schur!! '
870 info(1)=-7
871 info(2)=1
872 END IF
873 ELSE
874 size_schur_passed=
id%SIZE_SCHUR
875 listvar_schur_2be_freed = .false.
876 END IF
877 ENDIF
880 IF ( info(1) < 0 ) GOTO 500
881 ENDIF
882
883 IF ((
id%MYID.EQ.master).AND.(keep(244) .EQ. 1)
884 & .AND. (
id%N.EQ.nblk)
885 & ) THEN
886
887 IF ((keep(50).NE.1).AND.
888 & .NOT.((keep(23).EQ.7).AND.keep(50).EQ.0)
889 & ) THEN
890
891
892
893
894
895 IF ( ( keep(23) .NE. 0 ) .OR.
896
897
898
899 & keep(52) .EQ. -2 ) THEN
900
901
902
903
904
905
906
907
908
909
910
911 ALLOCATE(
id%UNS_PERM(
id%N),ikeepalloc(3*
id%N),
912 & work2alloc(
id%N), stat=ierr)
913 IF (ierr.GT.0) THEN
914 info(1)=-7
916 ELSE
918 &
id%UNS_PERM, ikeepalloc,
id%IRN,
id%JCN,
id%A,
919 &
id%ROWSCA,
id%COLSCA,
920 & work2alloc,
id%KEEP,
id%ICNTL,
id%INFO,
id%INFOG)
921 IF (allocated(work2alloc)) DEALLOCATE(work2alloc)
922 IF (keep(23).EQ.0) THEN
923
924 IF (
associated(
id%UNS_PERM ))
925 &
DEALLOCATE(
id%UNS_PERM)
927 ENDIF
928
929 IF (keep(23).EQ.0.AND.(keep(95).EQ.1)) THEN
930 IF (allocated(ikeepalloc)) DEALLOCATE(ikeepalloc)
931 ENDIF
932 ENDIF
933 IF (info(1) .LT. 0) THEN
934
935
936 keep(23) = 0
937 ELSE
938 ENDIF
939 ELSE
940 keep(23) = 0
941
942
944 END IF
945 ENDIF
946
947 ENDIF
949 IF ( info(1) < 0 ) GOTO 500
950
951 IF ( keep(244) .EQ. 1) THEN
952
953 IF (
id%MYID.EQ.master)
THEN
954
955
956
957
958 IF (allocated(ikeepalloc)) THEN
959 ALLOCATE( filsptr(nblk), frereptr(nblk),
960 & nfsizptr(nblk), stat=ierr)
961 IF (ierr.GT.0) THEN
962 info(1)=-7
963 info(2)=3*nblk
964 ENDIF
965 ELSE
966 ALLOCATE(ikeepalloc(nblk+2*
id%N),
967 & filsptr(nblk), frereptr(nblk),
968 & nfsizptr(nblk), stat=ierr)
969 IF (ierr.GT.0) THEN
970 info(1)=-7
971 info(2)=4*nblk+2*
id%N
972 ENDIF
973 ENDIF
974 ENDIF
976 IF ( info(1) < 0 ) GOTO 500
977 ENDIF
978
979 IF (keep(244) .EQ. 1) THEN
980
981 IF (
id%MYID .eq. master )
THEN
982
983
984
985
986
987
988
989
990 IF (keep(55) .EQ. 0) THEN
991
992
993
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009 IF (keep(13).NE.0) THEN
1010
1011
1012 ENDIF
1013 IF (nz8.EQ.0_8) THEN
1014 liw8 = 0_8
1015 ELSE
1016 liw8 = 2_8 * nz8 + int(nblk,8) + 1_8
1017 ENDIF
1018
1019 ELSE
1020
1021
1022
1023
1024#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
1025 cond = (keep(60) .NE. 0) .OR. (keep(256) .EQ. 5)
1026#else
1027 cond = (keep(60) .NE. 0)
1028#endif
1029 IF( cond ) THEN
1030
1031
1032
1033
1034
1035 liw_elt =
id%N +
id%N + 1
1036 ELSE
1037
1038 liw_elt =
id%N +
id%N +
id%N + 3 +
id%N + 1
1039 ENDIF
1040
1041 ENDIF
1042
1043
1044 IF (keep(55) .EQ. 0) THEN
1045 IF (liw8.LT.3_8*int(nblk,8)) liw8 = 3_8*int(nblk,8)
1046 ELSE
1047 IF (liw_elt.LT.3*
id%N) liw_elt = 3*
id%N
1048 ENDIF
1049
1050 IF ( keep(256) .EQ. 1 ) THEN
1051
1052
1053
1054
1055 ikeep2 => ikeepalloc(nblk+1:nblk+
id%N)
1056
1058 ikeep2(i) = 0
1059 ENDDO
1061 IF (
id%PERM_IN(i) .LT.1 .OR.
1062 &
id%PERM_IN(i) .GT.
id%N )
THEN
1063
1064 info(1) = -4
1065 info(2) = i
1066 GOTO 10
1067 ELSE IF ( ikeep2(
id%PERM_IN(i)) .NE. 0 )
THEN
1068
1069 info(1) = -4
1070 info(2) = i
1071 GOTO 10
1072 ELSE
1073
1074 ikeep2(
id%PERM_IN( i )) = i
1075 ENDIF
1076 ENDDO
1077 IF ((keep(55) .EQ. 0).AND.(keep(13).NE.0)
1078 & .AND.(keep(13).NE.-1)
1079 & ) THEN
1080
1081
1082
1083 iposb = 0
1084 ipos = 1
1085 DO WHILE (ipos.LE.
id%N)
1086 iposb = iposb+1
1087 i = ikeep2(ipos)
1088 ibcurrent = dof2block(i)
1089 blksize = sizeofblocks(ibcurrent)
1090 ikeepalloc(ibcurrent) = iposb
1091 IF (blksize.GT.1) THEN
1092 DO ii = 1, blksize-1
1093 ipos = ipos+1
1094 i = ikeep2(ipos)
1095 ib = dof2block(i)
1096 IF (ib.NE.ibcurrent) THEN
1097 info(1)= -4
1098 info(2)= i
1099 GOTO 10
1100 ENDIF
1101 ENDDO
1102 ENDIF
1103 ipos = ipos+1
1104 ENDDO
1105
1106
1107 IF (iposb.NE.nblk) THEN
1108 info(1)= -4
1109
1111 GOTO 10
1112 ENDIF
1113 ELSE
1115 ikeepalloc( i ) =
id%PERM_IN( i )
1116 END DO
1117 ENDIF
1118 IF (allocated(dof2block)) DEALLOCATE(dof2block)
1119 END IF
1120 infog(1) = 0
1121 infog(2) = 0
1122
1123 infog(8) = -1
1124 IF (keep(55) .EQ. 0) THEN
1125 ikeep1 => ikeepalloc(1:nblk)
1126 ikeep2 => ikeepalloc(nblk+1:nblk+
id%N)
1127 ikeep3 => ikeepalloc(nblk+
id%N+1:nblk+2*
id%N)
1128
1129
1130
1131 IF (
associated(
id%UNS_PERM))
THEN
1132 uns_perm_ptr =>
id%UNS_PERM
1133 ELSE
1134 uns_perm_ptr => idummy_array
1135 ENDIF
1136 IF (keep(13).EQ.0) THEN
1139 & liw8, ikeep1, ikeep2, ikeep3,
1140 & keep(256), nfsizptr,
1141 & filsptr, frereptr,
1142 &
id%LISTVAR_SCHUR, size_schur_passed,
1143 &
id%ICNTL,
id%INFOG,
id%KEEP,
id%KEEP8,
id%NSLAVES,
1144 & uns_perm_ptr,
1145 &
id%CNTL(4),
id%COLSCA,
id%ROWSCA
1146#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
1147 & ,
id%METIS_OPTIONS(1)
1148#endif
1149 & )
1150 ELSE
1151 irn_loc_ptr => idummy_array
1152 jcn_loc_ptr => idummy_array
1154 & irn_loc_ptr, jcn_loc_ptr,
1155 & liw8, ikeep1, ikeep2, ikeep3,
1156 & keep(256), nfsizptr,
1157 & filsptr, frereptr,
1158 &
id%LISTVAR_SCHUR, size_schur_passed,
1159 &
id%ICNTL,
id%INFOG,
id%KEEP,
id%KEEP8,
id%NSLAVES,
1160 & uns_perm_ptr,
1161 &
id%CNTL(4),
id%COLSCA,
id%ROWSCA
1162#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
1163 & ,
id%METIS_OPTIONS(1)
1164#endif
1165 & ,
id%N, sizeofblocks, gcomp_provided, gcomp
1166 & )
1168
1169 ENDIF
1170 infog(7) = keep(256)
1171
1172
1173 NULLIFY(uns_perm_ptr)
1174 ELSE
1175 allocate( xnodel(
id%N+1 ), stat = ierr )
1176 IF ( ierr .GT. 0 ) THEN
1177 info( 1 ) = -7
1178 info( 2 ) =
id%N + 1
1180 WRITE(
lp, 150)
'XNODEL'
1181 END IF
1182 GOTO 10
1183 ENDIF
1184 IF (leltvar.ne.
id%ELTPTR(nelt+1)-1)
THEN
1185
1186 info(1) = -2002
1187 info(2) =
id%ELTPTR(nelt+1)-1
1188 GOTO 10
1189 ENDIF
1190 allocate( nodel( leltvar ), stat = ierr )
1191 IF ( ierr .GT. 0 ) THEN
1192 info( 1 ) = -7
1193 info( 2 ) = leltvar
1195 WRITE(
lp, 150)
'NODEL'
1196 END IF
1197 GOTO 10
1198 ENDIF
1200 &
id%ELTPTR(1),
id%ELTVAR(1), liw_elt,
1201 & ikeepalloc(1),
1202 & keep(256), nfsizptr(1), filsptr(1),
1203 & frereptr(1),
id%LISTVAR_SCHUR(1),
1204 & size_schur_passed,
1205 & icntl(1), infog(1), keep(1),keep8(1),
1207 & xnodel(1), nodel(1)
1208#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
1209 & ,
id%METIS_OPTIONS(1)
1210#endif
1211 & )
1212 infog(7)=keep(256)
1213
1214
1215
1216
1217
1218 ENDIF
1219 IF ( listvar_schur_2be_freed ) THEN
1220
1221
1222 DEALLOCATE(
id%LISTVAR_SCHUR )
1223 NULLIFY (
id%LISTVAR_SCHUR )
1224 listvar_schur_2be_freed = .true.
1225 ENDIF
1226
1227
1228
1229
1230 info(1)=infog(1)
1231 info(2)=infog(2)
1232
1233 keep(28) = infog(6)
1234 ikeep = 1
1236 ne = ikeep + 2 *
id%N
1237
1238 ENDIF
1239
1240 ENDIF
1241
1242 10 CONTINUE
1243 IF (keep(244).EQ.1) THEN
1245 IF ( info(1) < 0 ) GOTO 500
1246 ENDIF
1247 IF ((keep(244).EQ.1).AND.(keep(55).EQ.0)) THEN
1248
1249
1250 CALL mpi_bcast(keep(23),1,mpi_integer,master,
id%COMM,ierr)
1251 IF ( (keep(23).LE.-1).AND.(keep(23).GE.-6) ) THEN
1252
1253 keep(23) = -keep(23)
1254 IF (
id%MYID.EQ.master)
THEN
1255 IF (.NOT.
associated(
id%A)) keep(23) = 1
1256 IF (
associated(
id%UNS_PERM))
DEALLOCATE(
id%UNS_PERM)
1257 NULLIFY(
id%UNS_PERM)
1258 IF (allocated(ikeepalloc)) DEALLOCATE(ikeepalloc)
1259 IF (associated(filsptr) ) THEN
1260 DEALLOCATE(filsptr)
1261 NULLIFY(filsptr)
1262 ENDIF
1263 IF (associated(frereptr) ) THEN
1264 DEALLOCATE(frereptr)
1265 NULLIFY(frereptr)
1266 ENDIF
1267 IF (associated(nfsizptr) ) THEN
1268 DEALLOCATE(nfsizptr)
1269 NULLIFY(nfsizptr)
1270 ENDIF
1271 ENDIF
1272 GOTO 1234
1273 ENDIF
1274 ENDIF
1275 IF (
id%MYID.EQ.master)
THEN
1276 IF ((keep(244).EQ.1).AND. (keep(55).EQ.0)) THEN
1277
1278 IF ((keep(54).EQ.3).AND.keep(494).EQ.0) THEN
1279 IF (gather_matrix_allocated) THEN
1280 IF (
associated(
id%IRN))
THEN
1283 ENDIF
1284 IF (
associated(
id%JCN))
THEN
1287 ENDIF
1288 gather_matrix_allocated= .false.
1289 ENDIF
1290 ENDIF
1291 ENDIF
1292 ENDIF
1293 IF (keep(244).NE.1) THEN
1294
1295 ikeep = 1
1297 ne = ikeep + 2 *
id%N
1298 IF (
id%MYID .EQ. master)
THEN
1299 ALLOCATE( ikeepalloc(3*
id%N), work2alloc(4*
id%N),
1300 & filsptr(
id%N), frereptr(
id%N), nfsizptr(
id%N),
1301 & stat=ierr)
1302 ELSE
1303
1304
1305 ALLOCATE(ikeepalloc(3*
id%N),work2alloc(4*
id%N), stat=ierr )
1306 ENDIF
1307 IF (ierr.GT.0) THEN
1308 info(1) = -7
1309 IF (
id%MYID .EQ. master)
THEN
1311 ELSE
1313 ENDIF
1314 ENDIF
1316 IF ( info(1) < 0 ) GOTO 500
1318 & ikeepalloc,
1319 & work2alloc,
1320 & nfsizptr,
1321 & filsptr,
1322 & frereptr)
1323 DEALLOCATE(work2alloc)
1324 IF(
id%MYID .NE. master)
THEN
1325 DEALLOCATE(ikeepalloc)
1326 ENDIF
1327 keep(28) = infog(6)
1328 END IF
1329
1330 IF (
id%MYID.EQ.master)
THEN
1331 allocok = 0
1332 allocate(procnode(nblk), stat=allocok)
1333 IF (allocok .ne. 0) THEN
1334 info(1) = -7
1335 info(2) = nblk
1336 ENDIF
1337 ENDIF
1339 IF ( info(1) < 0 ) GOTO 500
1340 IF(
id%MYID .EQ. master)
THEN
1341
1343 & keep(50),keep(54),icntl(6),keep(52))
1345 & ikeepalloc(ne), ikeepalloc(na))
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356 IF (
id%NSLAVES .EQ. 1
1357 & ) THEN
1359 IF ( (
id%KEEP(60).EQ.0).
1360 & and.(
id%KEEP(53).EQ.0))
THEN
1361
1362
1363
1364
1366
1368 ENDIF
1369
1371
1372
1374 DO i = 1, nblk
1375 procnode(i) = procnode_value
1376 END DO
1377
1378
1379
1380
1381 IF (
id%KEEP(60) .EQ. 2 .OR.
id%KEEP(60).EQ.3)
THEN
1384 & procnode_value, filsptr(1), nblk)
1385 ENDIF
1386
1387
1388
1389 ELSE
1390
1391
1392
1393
1394
1395
1396
1397 peak = dble(
id%INFOG(5))*dble(
id%INFOG(5)) +
1398 & dble(
id%KEEP(2))*dble(
id%KEEP(2))
1399
1400
1401 ssarbr => ikeepalloc(ikeep:ikeep+nblk-1)
1402
1403
1404
1405 IF ((keep(13).NE.0).AND.(nblk.NE.
id%N))
THEN
1406 sizeofblocks_ptr => sizeofblocks(1:nblk)
1407 lsizeofblocks_ptr = nblk
1408 ELSE
1409 sizeofblocks_ptr => idummy_array
1410 lsizeofblocks_ptr = 1
1411 idummy_array(1) = -1
1412 ENDIF
1414 & nblk,
id%NSLAVES,icntl(1),
1415 & infog(1),
1416 & ikeepalloc(ne),
1417 & nfsizptr(1),
1418 & frereptr(1),
1419 & filsptr(1),
1420 & keep(1),keep8(1),procnode(1),
1421 & ssarbr(1),
id%NBSA,peak,ierr
1422 & , sizeofblocks_ptr(1), lsizeofblocks_ptr
1423 & )
1424 NULLIFY(ssarbr)
1425 if(ierr.eq.-999) then
1426 write(6,*) ' Internal error during static mapping '
1427 info(1) = ierr
1428 GOTO 11
1429 ENDIF
1430 IF(ierr.NE.0) THEN
1431 info(1) = -135
1432 info(2) = ierr
1433 GOTO 11
1434 ENDIF
1436 & frereptr(1), ikeepalloc(ne),
1437 & ikeepalloc(na))
1438 ENDIF
1439 11 CONTINUE
1440 ENDIF
1442 IF ( info(1) < 0 ) GOTO 500
1443
1446 IF (keep(55) .EQ. 0) THEN
1447
1448
1449
1450
1451 if (
associated(
id%FRTPTR))
DEALLOCATE(
id%FRTPTR)
1452 if (
associated(
id%FRTELT))
DEALLOCATE(
id%FRTELT)
1453 allocate(
id%FRTPTR(1),
id%FRTELT(1) ,stat=allocok)
1454 IF (allocok .GT. 0) THEN
1456 WRITE(
lp, 150)
'FRTPTR,FRTELT'
1457 END IF
1458 info(1)= -7
1459 info(2)= 2
1460 END IF
1461 ELSE
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477 lptrar =
id%NELT+
id%NELT+2
1479 & force=.true., string='id%PTRAR (Analysis)', errcode=-7)
1481 & force=.true., string='id%FRTPTR (Analysis)', errcode=-7)
1483 & force=.true., string='id%FRTELT (Analysis)', errcode=-7)
1485 IF ( info(1) < 0 ) GOTO 500
1486 IF(
id%MYID .EQ. master)
THEN
1487
1488
1490 &
id%N, nelt,
id%ELTPTR(nelt+1)-1, frereptr(1),
1491 & filsptr(1),
1492 & ikeepalloc(na), ikeepalloc(ne), xnodel,
1493 & nodel,
id%FRTPTR(1),
id%FRTELT(1),
id%ELTPROC(1))
1495
1496 id%PTRAR(
id%NELT+i+1)=int(
id%ELTPTR(i),8)
1497 ENDDO
1498 DEALLOCATE(xnodel)
1499 DEALLOCATE(nodel)
1500 END IF
1502 & master,
id%COMM, ierr )
1504 & master,
id%COMM, ierr )
1506 & master,
id%COMM, ierr
1507 ENDIF
1509 IF ( info(1) < 0 ) GOTO 500
1510
1511 IF(
id%MYID .EQ. master)
THEN
1512 IF ( info( 1 ) .LT. 0 ) GOTO 12
1513 IF ( keep(55) .ne. 0 ) THEN
1514
1515
1516
1517
1518
1519
1521 & procnode(1),
id%KEEP(1))
1522 END IF
1523 nb_niv2 = keep(56)
1524 IF ( nb_niv2.GT.0 ) THEN
1525
1526 allocate(par2_nodes(nb_niv2),
1527 & stat=allocok)
1528 IF (allocok .GT.0) then
1529 info(1)= -7
1530 info(2)= nb_niv2
1532 WRITE(
lp, 150)
'PAR2_NODES'
1533 END IF
1534 GOTO 12
1535 END IF
1536 ENDIF
1537 IF ((nb_niv2.GT.0) .AND. (keep(24).EQ.0)) THEN
1538 iniv2 = 0
1539 DO 777 inode = 1, nblk
1540 IF ( ( frereptr(inode) .NE. nblk ) .AND.
1542 & .eq. 2) ) THEN
1543 iniv2 = iniv2 + 1
1544 par2_nodes(iniv2) = inode
1545 END IF
1546 777 CONTINUE
1547 IF ( iniv2 .NE. nb_niv2 ) THEN
1548 WRITE(*,*) "Internal Error 2 in ZMUMPS_ANA_DRIVER",
1549 & iniv2, nb_niv2
1551 ENDIF
1552 ENDIF
1553 IF ( (keep(24) .NE. 0) .AND. (nb_niv2.GT.0) ) THEN
1554
1555
1556 IF (
associated(
id%CANDIDATES))
DEALLOCATE(
id%CANDIDATES)
1557 allocate(
id%CANDIDATES(
id%NSLAVES+1,nb_niv2),
1558 & stat=allocok)
1559 if (allocok .gt.0) then
1560 info(1)= -7
1561 info(2)= nb_niv2*(
id%NSLAVES+1)
1563 WRITE(
lp, 150)
'CANDIDATES'
1564 END IF
1565 GOTO 12
1566 END IF
1568 & (par2_nodes,
id%CANDIDATES,
1569 & ierr)
1570 IF(ierr.NE.0) THEN
1571 info(1) = -2002
1572 GOTO 12
1573 ENDIF
1574
1576 IF(ierr.NE.0) THEN
1577 info(1) = -2002
1578 GOTO 12
1579 ENDIF
1580 ELSE
1581 IF (
associated(
id%CANDIDATES))
DEALLOCATE(
id%CANDIDATES)
1582 allocate(
id%CANDIDATES(1,1), stat=allocok)
1583 IF (allocok .NE. 0) THEN
1584 info(1)= -7
1585 info(2)= 1
1587 WRITE(
lp, 150)
'CANDIDATES'
1588 END IF
1589 GOTO 12
1590 ENDIF
1591 ENDIF
1592
1593
1594 12 CONTINUE
1595
1596
1597
1598
1599
1600
1601 END IF
1603 IF ( info(1) < 0 ) GOTO 500
1604
1605
1606
1607
1608
1609 CALL mpi_bcast(
id%KEEP8(101), 1, mpi_integer8, master,
1611
1612
1613
1614
1615
1616 CALL mpi_bcast(
id%KEEP(1), 110, mpi_integer, master,
1618
1619 CALL mpi_bcast(
id%KEEP8(21), 1, mpi_integer8, master,
1621
1622
1623
1624
1625 CALL mpi_bcast(
id%KEEP(205), 1, mpi_integer, master,
1627
1628
1631
1632
1633
1634
1635
1636 IF (
id%MYID==master) keep(127)=infog(5)
1637 CALL mpi_bcast(
id%KEEP(127), 1, mpi_integer, master,
1639
1640
1641 CALL mpi_bcast(
id%KEEP(226), 1, mpi_integer, master,
1643
1644 CALL mpi_bcast(
id%KEEP(464), 2, mpi_integer, master,
1646 CALL mpi_bcast(
id%KEEP(471), 2, mpi_integer, master,
1648 CALL mpi_bcast(
id%KEEP(475), 1, mpi_integer, master,
1650 CALL mpi_bcast(
id%KEEP(482), 1, mpi_integer, master,
1652 CALL mpi_bcast(
id%KEEP(487), 2, mpi_integer, master,
1654
1655
1656 CALL mpi_bcast(
id%KEEP(262), 2, mpi_integer, master,
1658
1659
1660
1661 IF (
id%MYID.EQ.master)
THEN
1662
1663
1664
1666 & string='id%STEP (Analysis)', errcode=-7)
1667 ELSE
1668
1669
1671 & string='id%STEP (Analysis)', errcode=-7)
1672 ENDIF
1673 IF(info(1).LT.0) GOTO 94
1675 & force=.true.,
1676 & string='id%PROCNODE_STEPS (Analysis)', errcode=-7)
1677 IF(info(1).LT.0) GOTO 94
1679 & force=.true.,
1680 & string='id%NE_STEPS (Analysis)', errcode=-7)
1681 IF(info(1).LT.0) GOTO 94
1683 & force=.true.,
1684 & string='id%ND_STEPS (Analysis)', errcode=-7)
1685 IF(info(1).LT.0) GOTO 94
1687 & force=.true.,
1688 & string='
id%FRERE_STEPS (analysis)
', ERRCODE=-7)
1689.LT. IF(INFO(1)0) GOTO 94
1690 CALL MUMPS_REALLOC(id%DAD_STEPS, id%KEEP(28), id%INFO, LP,
1691 & FORCE=.TRUE.,
1692 & STRING='id%DAD_STEPS (analysis)
', ERRCODE=-7)
1693.LT. IF(INFO(1)0) GOTO 94
1694
1695.EQ. IF (KEEP(55) 0) THEN
1696 LPTRAR = id%N+id%N
1697 CALL MUMPS_I8REALLOC(id%PTRAR, LPTRAR, id%INFO, LP,
1698 & FORCE=.TRUE., STRING='id%PTRAR (analysis)
', ERRCODE=-7)
1699.LT. IF(INFO(1)0) GOTO 94
1700 ENDIF
1701.EQ. IF (id%MYIDMASTER) THEN
1702 CALL MUMPS_REALLOC(id%LRGROUPS, NBLK, id%INFO, LP,
1703 & FORCE=.TRUE.
1704 & ,STRING='id%LRGROUPS (analysis)
', ERRCODE=-7)
1705 ELSE
1706 CALL MUMPS_REALLOC(id%LRGROUPS, id%N, id%INFO, LP,
1707 & FORCE=.TRUE.
1708 & ,STRING='id%LRGROUPS (analysis)
', ERRCODE=-7)
1709 ENDIF
1710.LT. IF(INFO(1)0) GOTO 94
1711
1712
1713
1714
1715
1716.NE..OR..EQ. IF ( id%MYID MASTER id%KEEP(23) 0 ) THEN
1717 IF ( associated( id%UNS_PERM ) ) THEN
1718 DEALLOCATE(id%UNS_PERM)
1719 ENDIF
1720 ENDIF
1721 94 CONTINUE
1722 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
1723 & id%COMM, id%MYID )
1724.EQ. IF ( id%MYID MASTER ) THEN
1725
1726
1727
1728.eq. IF (NBLK1) THEN
1729 NBROOT = 1
1730 NBLEAF = 1
1731.LT. ELSE IF (IKEEPALLOC(NA+NBLK-1) 0) THEN
1732 NBLEAF= NBLK
1733 NBROOT= NBLK
1734.LT. ELSE IF (IKEEPALLOC(NA+NBLK-2) 0) THEN
1735 NBLEAF = NBLK-1
1736 NBROOT = IKEEPALLOC(NA+NBLK-1)
1737 ELSE
1738 NBLEAF = IKEEPALLOC(NA+NBLK-2)
1739 NBROOT = IKEEPALLOC(NA+NBLK-1)
1740 ENDIF
1741 id%LNA = 2+NBLEAF+NBROOT
1742 ENDIF
1743 CALL MPI_BCAST( id%LNA, 1, MPI_INTEGER,
1744 & MASTER, id%COMM, IERR )
1745 CALL MUMPS_REALLOC(id%NA, id%LNA, id%INFO, LP, FORCE=.TRUE.,
1746 & STRING='id%NA (analysis)
', ERRCODE=-7)
1747 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
1748 & id%COMM, id%MYID )
1749.LT. IF ( INFO(1)0 ) GOTO 500
1750.EQ. IF (id%MYID MASTER ) THEN
1751
1752
1753
1754
1755
1756 id%NA(1) = NBLEAF
1757 id%NA(2) = NBROOT
1758
1759
1760 LEAF = 3
1761 IF ( NBLK == 1 ) THEN
1762 id%NA(LEAF) = 1
1763 LEAF = LEAF + 1
1764 ELSE IF (IKEEPALLOC(NA+NBLK-1) < 0) THEN
1765 id%NA(LEAF) = - IKEEPALLOC(NA+NBLK-1)-1
1766 LEAF = LEAF + 1
1767 DO I = 1, NBLEAF - 1
1768 id%NA(LEAF) = IKEEPALLOC(NA+I-1)
1769 LEAF = LEAF + 1
1770 ENDDO
1771 ELSE IF (IKEEPALLOC(NA+NBLK-2) < 0 ) THEN
1772 INODE = - IKEEPALLOC(NA+NBLK-2) - 1
1773 id%NA(LEAF) = INODE
1774 LEAF =LEAF + 1
1775 IF ( NBLEAF > 1 ) THEN
1776 DO I = 1, NBLEAF - 1
1777 id%NA(LEAF) = IKEEPALLOC(NA+I-1)
1778 LEAF = LEAF + 1
1779 ENDDO
1780 ENDIF
1781 ELSE
1782 DO I = 1, NBLEAF
1783 id%NA(LEAF) = IKEEPALLOC(NA+I-1)
1784 LEAF = LEAF + 1
1785 ENDDO
1786 END IF
1787
1788
1789
1790
1791
1792 ISTEP = 0
1793 DO I = 1, NBLK
1794.ne. IF ( FREREPTR(I) NBLK + 1 ) THEN
1795
1796
1797
1798
1799 ISTEP = ISTEP + 1
1800 id%STEP(I)=ISTEP
1801 INN = FILSPTR(I)
1802.GT. DO WHILE ( INN 0 )
1803 id%STEP(INN) = - ISTEP
1804 INN = FILSPTR(INN)
1805 END DO
1806.eq. IF (FREREPTR(I) 0) THEN
1807
1808 id%NA(LEAF) = I
1809 LEAF = LEAF + 1
1810 ENDIF
1811 ENDIF
1812 END DO
1813.NE. IF ( LEAF - 1 2+NBROOT + NBLEAF ) THEN
1815 CALL MUMPS_ABORT()
1816 ENDIF
1817.NE. IF ( ISTEP id%KEEP(28) ) THEN
1819 & ISTEP, id%KEEP(28)
1820 CALL MUMPS_ABORT()
1821 ENDIF
1822
1823
1824
1825
1826 DO I = 1, NBLK
1827.NE. IF (FREREPTR(I) NBLK+1) THEN
1828 id%PROCNODE_STEPS(id%STEP(I)) = PROCNODE( I )
1829 id%FRERE_STEPS(id%STEP(I)) = FREREPTR(I)
1830 id%NE_STEPS(id%STEP(I)) = IKEEPALLOC(NE+I-1)
1831 id%ND_STEPS(id%STEP(I)) = NFSIZPTR(I)
1832 ENDIF
1833 ENDDO
1834
1835
1836
1837
1838
1839
1840
1841 DO I = 1, NBLK
1842
1843.LE. IF ( id%STEP(I) 0) CYCLE
1844
1845.eq. IF (FREREPTR(I) 0) THEN
1846
1847 id%DAD_STEPS(id%STEP(I)) = 0
1848 ENDIF
1849
1850 IFS = FILSPTR(I)
1851.GT. DO WHILE ( IFS 0 )
1852 IFS= FILSPTR(IFS)
1853 END DO
1854
1855
1856 IFS = -IFS
1857.GT. DO WHILE (IFS0)
1858
1859 id%DAD_STEPS(id%STEP(IFS)) = I
1860 IFS = FREREPTR(IFS)
1861 ENDDO
1862 END DO
1863
1864
1865
1866
1867 IF (allocated(PROCNODE)) DEALLOCATE(PROCNODE)
1868 IF (allocated(IKEEPALLOC)) DEALLOCATE(IKEEPALLOC)
1869 IF (associated(FREREPTR)) DEALLOCATE(FREREPTR)
1870 NULLIFY(FREREPTR)
1871 IF (associated(NFSIZPTR)) DEALLOCATE(NFSIZPTR)
1872 NULLIFY(NFSIZPTR)
1873 ENDIF
1874.NE. IF (KEEP(494)0) THEN
1875
1876.EQ. IF (id%MYIDMASTER) THEN
1877 IF (PROKG) THEN
1878 CALL MUMPS_SECDEB(TIMEG)
1879 END IF
1880 ENDIF
1881
1882
1883
1884
1885
1886
1887.EQ..AND..NE. IF ((KEEP(54)3)(KEEP(13)0)) THEN
1888
1889.NE. IF (KEEP(487)1) CALL MUMPS_ABORT()
1890 ALLOCATE(MAPCOL(id%KEEP(28)), stat=allocok)
1891.ne. IF (allocok 0) then
1892 INFO(1)= -7
1893 INFO(2)= id%KEEP(28)
1894 ENDIF
1895
1896 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
1897 & id%COMM, id%MYID )
1898.LT. IF ( INFO(1)0 ) GOTO 500
1899
1900 CALL MUMPS_INIALIZE_REDIST_LUMAT (
1901 & id%INFO, id%ICNTL, id%KEEP, id%COMM, id%MYID, NBLK,
1902 & LUMAT, id%PROCNODE_STEPS(1), id%KEEP(28), MAPCOL,
1903 & LUMAT_REMAP, NBRECORDS, id%STEP(1))
1904
1905.LT. IF ( id%INFO(1)0 ) GOTO 500
1906
1907
1908 CALL MUMPS_AB_DIST_LMAT_TO_LUMAT (
1909 & .FALSE., ! do not UNFOLD
1910 & .TRUE., ! MAPCOL in NSTEPS=> STEP array needed
1911 & id%INFO, id%ICNTL, id%COMM, id%MYID, NBLK, id%NPROCS,
1912 & LUMAT, MAPCOL, id%KEEP(28), id%STEP(1), NBLK,
1913 & LUMAT_REMAP, NBRECORDS, NSEND8, NLOCAL8
1914 & )
1915 CALL MUMPS_AB_FREE_LMAT(LUMAT)
1916
1917 CALL MPI_BCAST( SIZEOFBLOCKS, NBLK, MPI_INTEGER, MASTER,
1918 & id%COMM, IERR )
1919
1920.NE..AND..NE. ELSE IF ((KEEP(54)3)(KEEP(13)0)
1921.AND..EQ. & (KEEP(487)1) ) THEN
1922
1923
1924.EQ. IF (id%MYIDMASTER) THEN
1925 CALL MUMPS_AB_LMAT_TO_LUMAT (
1926 & LMAT_BLOCK, LUMAT_REMAP,
1927 & INFO(1), ICNTL(1))
1928
1929 CALL MUMPS_AB_FREE_LMAT(LMAT_BLOCK)
1930 ENDIF
1931
1932 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
1933 & id%COMM, id%MYID )
1934.LT. IF ( INFO(1)0 ) GOTO 500
1935
1936.EQ..AND..EQ. ELSE IF ((KEEP(54)3)(KEEP(13)0)
1937.AND..EQ. & KEEP(487)1) THEN
1938
1939
1940
1941
1942
1943
1944
1945 IF (GATHER_MATRIX_ALLOCATED) THEN
1946 IF (associated(id%IRN)) THEN
1947 DEALLOCATE(id%IRN)
1948 NULLIFY(id%IRN)
1949 ENDIF
1950 IF (associated(id%JCN)) THEN
1951 DEALLOCATE(id%JCN)
1952 NULLIFY(id%JCN)
1953 ENDIF
1954 GATHER_MATRIX_ALLOCATED= .FALSE.
1955 ENDIF
1956.NOT..OR. IF ( I_AM_SLAVE ! non-working master
1957.EQ. & id%KEEP8(29) 0_8) THEN ! NNZ_loc or NZ_loc
1958
1959 IRN_loc_PTR => IDUMMY_ARRAY
1960 JCN_loc_PTR => IDUMMY_ARRAY
1961 ELSE
1962 IRN_loc_PTR => id%IRN_loc
1963 JCN_loc_PTR => id%JCN_loc
1964 ENDIF
1965 ALLOCATE(MAPCOL(id%KEEP(28)), stat=allocok)
1966.ne. IF (allocok 0) then
1967 INFO(1)= -7
1968 INFO(2)= id%KEEP(28)
1969 ENDIF
1970
1971 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
1972 & id%COMM, id%MYID )
1973.LT. IF ( INFO(1)0 ) GOTO 500
1974
1975
1976
1977 CALL MUMPS_AB_DCOORD_TO_DTREE_LUMAT (
1978 & id%MYID, id%NPROCS, id%COMM,
1979 & NBLK, id%N,
1980 & id%KEEP8(29), ! => NNZ_loc or NZ_loc
1981 & IRN_loc_PTR(1), JCN_loc_PTR(1),
1982 & id%PROCNODE_STEPS(1), id%KEEP(28), id%STEP(1),
1983 & id%ICNTL(1), id%INFO(1), id%KEEP(1),
1984 & MAPCOL, LUMAT_REMAP )
1985.GE. IF (INFO(1)0) THEN
1986
1987 ALLOCATE(SIZEOFBLOCKS(NBLK), stat=allocok)
1988.ne. IF (allocok 0) then
1989 INFO(1)= -7
1990 INFO(2)= NBLK
1991 ENDIF
1992 DO I=1, NBLK
1993 SIZEOFBLOCKS(I) = 1
1994 ENDDO
1995 ENDIF
1996
1997 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
1998 & id%COMM, id%MYID )
1999.LT. IF ( INFO(1)0 ) GOTO 500
2000.EQ..AND..EQ. ELSE IF ((KEEP(54)3) (KEEP(244)2)
2001.AND..NE. & (KEEP(487)1)
2002 & ) THEN
2003
2004
2005
2006
2007
2008 CALL ZMUMPS_GATHER_MATRIX(id)
2009 GATHER_MATRIX_ALLOCATED = .TRUE.
2010 ENDIF
2011
2012
2013
2014
2015.EQ..AND..EQ. IF ((KEEP(54)3)(KEEP(487)1)) THEN
2016
2017
2018.NE. IF (id%MYIDMASTER) THEN
2019 ALLOCATE(FILSPTR(NBLK), stat=IERR)
2020.GT. IF (IERR0) THEN
2021 INFO(1)=-7
2022 INFO(2)=NBLK
2023 ENDIF
2024 ENDIF
2025
2026 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2027 & id%COMM, id%MYID )
2028.LT. IF ( INFO(1)0 ) GOTO 500
2029
2030
2031
2032 CALL ZMUMPS_AB_LR_MPI_GROUPING(NBLK,
2033 & MAPCOL, id%KEEP(28),
2034 & id%KEEP(28), LUMAT_REMAP, FILSPTR,
2035 & id%FRERE_STEPS,
2036 & id%DAD_STEPS, id%STEP, id%NA,
2037 & id%LNA, id%LRGROUPS, SIZEOFBLOCKS(1), id%KEEP(50),
2038 & id%ICNTL(1), id%KEEP(487), id%KEEP(488),
2039 & id%KEEP(490), id%KEEP(38), id%KEEP(20), id%KEEP(60),
2040 & id%INFO(1), id%INFO(2),
2041 & id%KEEP(264), id%KEEP(265), id%KEEP(482), id%KEEP(472),
2042 & id%KEEP(127), id%KEEP(469), id%KEEP(10),
2043 & id%KEEP(54), id%KEEP(142),
2044 & LPOK, LP, id%COMM, id%MYID, id%NPROCS)
2045 IF (allocated(MAPCOL)) DEALLOCATE(MAPCOL)
2046.NE. IF (id%MYIDMASTER) THEN
2047 DEALLOCATE(FILSPTR)
2048 NULLIFY(FILSPTR)
2049 ENDIF
2050
2051.EQ. ELSE IF (id%MYIDMASTER) THEN
2052.NE..AND..NE. IF ((KEEP(54)3)(KEEP(13)0)
2053.AND..EQ. & (KEEP(487)1) ) THEN
2054
2055
2056
2057
2058
2059 IDUMMY_ARRAY(1) = -1
2060 CALL ZMUMPS_AB_LR_GROUPING(NBLK,
2061 & IDUMMY_ARRAY, 1,
2062 & id%KEEP(28), LUMAT_REMAP, FILSPTR,
2063 & id%FRERE_STEPS,
2064 & id%DAD_STEPS, id%STEP, id%NA,
2065 & id%LNA, id%LRGROUPS, SIZEOFBLOCKS(1), id%KEEP(50),
2066 & id%ICNTL(1), id%KEEP(487), id%KEEP(488),
2067 & id%KEEP(490), id%KEEP(38), id%KEEP(20), id%KEEP(60),
2068 & id%INFO(1), id%INFO(2),
2069 & id%KEEP(264), id%KEEP(265), id%KEEP(482), id%KEEP(472),
2070 & id%KEEP(127), id%KEEP(469), id%KEEP(10),
2071 & id%KEEP(54), id%KEEP(142),
2072 & LPOK, LP, id%MYID, id%COMM)
2073 ELSE
2074
2075.EQ. IF (KEEP(469)0) THEN
2076 CALL ZMUMPS_LR_GROUPING(id%N, id%KEEP8(28), id%KEEP(28),
2077 & id%IRN,
2078 & id%JCN, FILSPTR, id%FRERE_STEPS,
2079 & id%DAD_STEPS, id%NE_STEPS, id%STEP, id%NA,
2080 & id%LNA, id%LRGROUPS,
2081 & id%KEEP(50),
2082 & id%ICNTL(1), id%KEEP(487), id%KEEP(488),
2083 & id%KEEP(490), id%KEEP(38), id%KEEP(20), id%KEEP(60),
2084 & id%INFO(1), id%INFO(2),
2085 & id%KEEP(264), id%KEEP(265), id%KEEP(482), id%KEEP(472),
2086 & id%KEEP(127), id%KEEP(10),
2087 & id%KEEP(54), id%KEEP(142),
2088 & LPOK, LP, GATHER_MATRIX_ALLOCATED)
2089 ELSE
2090 CALL ZMUMPS_LR_GROUPING_NEW(id%N, id%KEEP8(28),
2091 & id%KEEP(28), id%IRN,
2092 & id%JCN, FILSPTR, id%FRERE_STEPS,
2093 & id%DAD_STEPS, id%STEP, id%NA,
2094 & id%LNA, id%LRGROUPS, id%KEEP(50),
2095 & id%ICNTL(1), id%KEEP(487), id%KEEP(488),
2096 & id%KEEP(490), id%KEEP(38), id%KEEP(20), id%KEEP(60),
2097 & id%INFO(1), id%INFO(2),
2098 & id%KEEP(264), id%KEEP(265), id%KEEP(482), id%KEEP(472),
2099 & id%KEEP(127), id%KEEP(469), id%KEEP(10),
2100 & id%KEEP(54), id%KEEP(142),
2101 & LPOK, LP, GATHER_MATRIX_ALLOCATED)
2102 ENDIF
2103 ENDIF
2104 ENDIF
2105 CALL MPI_BCAST( KEEP(142), 1, MPI_INTEGER, MASTER,
2106 & id%COMM, IERR )
2107
2108
2109
2110
2111 CALL MUMPS_AB_FREE_LMAT(LUMAT_REMAP)
2112 IF (allocated(MAPCOL)) DEALLOCATE(MAPCOL)
2113 IF (allocated(SIZEOFBLOCKS)) DEALLOCATE(SIZEOFBLOCKS)
2114.EQ..AND..EQ..AND. IF ( (KEEP(54)3) (KEEP(244)2)
2115.NE. & (KEEP(487)1) ) THEN
2116
2117
2118
2119 IF (GATHER_MATRIX_ALLOCATED) THEN
2120 IF (associated(id%IRN)) THEN
2121 DEALLOCATE(id%IRN)
2122 NULLIFY(id%IRN)
2123 ENDIF
2124 IF (associated(id%JCN)) THEN
2125 DEALLOCATE(id%JCN)
2126 NULLIFY(id%JCN)
2127 ENDIF
2128 GATHER_MATRIX_ALLOCATED= .FALSE.
2129 ENDIF
2130 END IF
2131 IF (PROKG) THEN
2132 CALL MUMPS_SECFIN(TIMEG)
2133 WRITE(MPG,145) TIMEG
2134 END IF
2135
2136 ENDIF
2137.NE. IF (id%MYID MASTER) THEN
2138 CALL MUMPS_REALLOC(id%FILS, id%N, id%INFO, LP, FORCE=.TRUE.,
2139 & STRING='id%FILS (analysis)
', ERRCODE=-7)
2140.LT. IF(INFO(1)0) GOTO 97
2141 ENDIF
2142
2143.EQ..AND..NE. IF ((id%MYIDMASTER) (KEEP(13)0)) THEN
2144
2145
2146
2147
2148
2149
2150.LT..OR..NOT. IF (NBLKid%N(BLKVAR_ALLOCATED)) THEN
2151
2152
2153
2154
2155
2156 ALLOCATE(STEPPTR(id%N), LRGROUPSPTR(id%N), stat=IERR)
2157.GT. IF (IERR0) THEN
2158 INFO(1)=-7
2159 INFO(2)=id%N
2160 GOTO 97
2161 ENDIF
2162.EQ. IF (NB_NIV20) THEN
2163 IDUMMY_ARRAY(1) = -9999
2164 PAR2_NODESPTR => IDUMMY_ARRAY(1:1)
2165 SIZE_PAR2_NODESPTR=1
2166 ELSE
2167 PAR2_NODESPTR => PAR2_NODES(1:NB_NIV2)
2168 SIZE_PAR2_NODESPTR=NB_NIV2
2169 ENDIF
2170 CALL MUMPS_REALLOC(id%FILS, id%N, id%INFO, LP,
2171 & FORCE=.TRUE.,
2172 & STRING='id%FILS (analysis)
', ERRCODE=-7)
2173.LT. IF(INFO(1)0) GOTO 97
2174 CALL ZMUMPS_EXPAND_TREE_STEPS (id%ICNTL,
2175 & id%N, NBLK, id%BLKPTR(1), id%BLKVAR(1),
2176 & FILSPTR(1), id%FILS(1), id%KEEP(28),
2177 & id%STEP(1), STEPPTR(1),
2178 & PAR2_NODESPTR(1), SIZE_PAR2_NODESPTR,
2179 & id%DAD_STEPS(1), id%FRERE_STEPS(1),
2180 & id%NA(1), id%LNA, id%LRGROUPS(1), LRGROUPSPTR(1),
2181 & id%KEEP(20), id%KEEP(38)
2182 & )
2183 NULLIFY(PAR2_NODESPTR)
2184 DEALLOCATE(id%STEP)
2185 id%STEP=>STEPPTR
2186 NULLIFY(STEPPTR)
2187 DEALLOCATE(id%LRGROUPS)
2188 id%LRGROUPS=>LRGROUPSPTR
2189 NULLIFY(LRGROUPSPTR)
2190 DEALLOCATE(FILSPTR)
2191 NULLIFY(FILSPTR)
2192 ELSE
2193 if (associated(id%FILS)) DEALLOCATE(id%FILS)
2194 id%FILS=>FILSPTR
2195 NULLIFY(FILSPTR)
2196 ENDIF
2197
2198 ENDIF
2199.EQ..AND. IF ((id%NNBLK)associated(FILSPTR)) THEN
2200
2201 if (associated(id%FILS)) DEALLOCATE(id%FILS)
2202 id%FILS=>FILSPTR
2203 NULLIFY(FILSPTR)
2204 ENDIF
2205 97 CONTINUE
2206 CALL MUMPS_REALLOC(id%SYM_PERM, id%N, id%INFO, LP,
2207 & FORCE=.TRUE.,
2208 & STRING='id%SYM_PERM (analysis)
', ERRCODE=-7)
2209 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1), id%COMM, id%MYID )
2210 IF ( INFO(1) < 0 ) GOTO 500
2211.EQ. IF (id%MYIDMASTER) THEN
2212
2213
2214
2215
2216
2217 CALL ZMUMPS_REORDER_TREE(id%N, id%FRERE_STEPS(1),
2218 & id%STEP(1),id%FILS(1), id%NA(1), id%LNA,
2219 & id%NE_STEPS(1), id%ND_STEPS(1), id%DAD_STEPS(1),
2220 & id%KEEP(28), .TRUE., id%KEEP(28), id%KEEP(70),
2221 & id%KEEP(50), id%INFO(1), id%ICNTL(1),id%KEEP(215),
2222 & id%KEEP(234), id%KEEP(55), id%KEEP(199),
2223 & id%PROCNODE_STEPS(1),id%NSLAVES,PEAK,id%KEEP(90)
2224 & )
2225.EQ. IF(id%KEEP(261)1)THEN
2226 CALL MUMPS_SORT_STEP(id%N, id%FRERE_STEPS(1),
2227 & id%STEP(1),id%FILS(1), id%NA(1), id%LNA,
2228 & id%NE_STEPS(1), id%ND_STEPS(1), id%DAD_STEPS(1),
2229 & id%KEEP(28), .TRUE., id%KEEP(28), id%INFO(1),
2230 & id%ICNTL(1),id%PROCNODE_STEPS(1),id%NSLAVES
2231 & )
2232 ENDIF
2233
2234
2235
2236.GE..OR..GE..OR. IF ((id%KEEP(76)4)(id%KEEP(76)6)
2237.EQ..OR..GT. & (id%KEEP(47)4)((id%KEEP(81)0)
2238.AND..GE. & (id%KEEP(47)2)))THEN
2239 IS_BUILD_LOAD_MEM_CALLED=.TRUE.
2240.EQ..OR. IF ((id%KEEP(47) 4)
2241.GT..AND..GE. & (( id%KEEP(81) 0)(id%KEEP(47)2))) THEN
2242.GT. IF(id%NSLAVES1) THEN
2243
2244
2245
2246 SIZE_TEMP_MEM = id%NBSA
2247 ELSE
2248
2249 SIZE_TEMP_MEM = id%NA(2)
2250 ENDIF
2251 ELSE
2252 SIZE_TEMP_MEM = 1
2253 ENDIF
2254.EQ..OR..EQ. IF((id%KEEP(76)4)(id%KEEP(76)6))THEN
2255 SIZE_DEPTH_FIRST=id%KEEP(28)
2256 ELSE
2257 SIZE_DEPTH_FIRST=1
2258 ENDIF
2259 allocate(TEMP_MEM(SIZE_TEMP_MEM,id%NSLAVES),STAT=allocok)
2260.NE. IF (allocok 0) THEN
2261 INFO(1)= -7
2262 INFO(2)= SIZE_TEMP_MEM*id%NSLAVES
2263 IF ( LPOK ) THEN
2264 WRITE(LP, 150) 'temp_mem'
2265 END IF
2266 GOTO 80 !! FIXME propagate error
2267 END IF
2268 allocate(TEMP_LEAF(SIZE_TEMP_MEM,id%NSLAVES),
2269 & stat=allocok)
2270.ne. IF (allocok 0) then
2271 IF ( LPOK ) THEN
2272 WRITE(LP, 150) 'temp_leaf'
2273 END IF
2274 INFO(1)= -7
2275 INFO(2)= SIZE_TEMP_MEM*id%NSLAVES
2276 GOTO 80 !! FIXME propagate error
2277 end if
2278 allocate(TEMP_SIZE(SIZE_TEMP_MEM,id%NSLAVES),
2279 & stat=allocok)
2280.ne. IF (allocok 0) then
2281 IF ( LPOK ) THEN
2282 WRITE(LP, 150) 'temp_size'
2283 END IF
2284 INFO(1)= -7
2285 INFO(2)= SIZE_TEMP_MEM*id%NSLAVES
2286 GOTO 80
2287 end if
2288 allocate(TEMP_ROOT(SIZE_TEMP_MEM,id%NSLAVES),
2289 & stat=allocok)
2290.ne. IF (allocok 0) then
2291 IF ( LPOK ) THEN
2292 WRITE(LP, 150) 'temp_root'
2293 END IF
2294 INFO(1)= -7
2295 INFO(2)= SIZE_TEMP_MEM*id%NSLAVES
2296 GOTO 80
2297 end if
2298 allocate(DEPTH_FIRST(SIZE_DEPTH_FIRST),stat=allocok)
2299.ne. IF (allocok 0) then
2300 IF ( LPOK ) THEN
2301 WRITE(LP, 150) 'depth_first'
2302 END IF
2303 INFO(1)= -7
2304 INFO(2)= SIZE_DEPTH_FIRST
2305 GOTO 80
2306 end if
2307 ALLOCATE(DEPTH_FIRST_SEQ(SIZE_DEPTH_FIRST),stat=allocok)
2308.ne. IF (allocok 0) then
2309 IF ( LPOK ) THEN
2310 WRITE(LP, 150) 'depth_first_seq'
2311 END IF
2312 INFO(1)= -7
2313 INFO(2)= SIZE_DEPTH_FIRST
2314 GOTO 80
2315 end if
2316 ALLOCATE(SBTR_ID(SIZE_DEPTH_FIRST),stat=allocok)
2317.ne. IF (allocok 0) then
2318 IF ( LPOK ) THEN
2319 WRITE(LP, 150) 'sbtr_id'
2320 END IF
2321 INFO(1)= -7
2322 INFO(2)= SIZE_DEPTH_FIRST
2323 GOTO 80
2324 end if
2325.EQ. IF(id%KEEP(76)5)THEN
2326
2327 SIZE_COST_TRAV=id%KEEP(28)
2328 ELSE
2329 SIZE_COST_TRAV=1
2330 ENDIF
2331 allocate(COST_TRAV_TMP(SIZE_COST_TRAV),stat=allocok)
2332.ne. IF (allocok 0) then
2333 IF ( LPOK ) THEN
2334 WRITE(LP, 150) 'cost_trav_tmp'
2335 END IF
2336 INFO(1)= -7
2337 INFO(2)= SIZE_COST_TRAV
2338 GOTO 80
2339 END IF
2340.EQ. IF(id%KEEP(76)5)THEN
2341.EQ. IF(id%KEEP(70)0)THEN
2342 id%KEEP(70)=5
2343 ENDIF
2344.EQ. IF(id%KEEP(70)1)THEN
2345 id%KEEP(70)=6
2346 ENDIF
2347 ENDIF
2348.EQ. IF(id%KEEP(76)4)THEN
2349.EQ. IF(id%KEEP(70)0)THEN
2350 id%KEEP(70)=3
2351 ENDIF
2352.EQ. IF(id%KEEP(70)1)THEN
2353 id%KEEP(70)=4
2354 ENDIF
2355 ENDIF
2356 CALL ZMUMPS_BUILD_LOAD_MEM_INFO(id%N, id%FRERE_STEPS(1),
2357 & id%STEP(1),id%FILS(1), id%NA(1), id%LNA,
2358 & id%NE_STEPS(1), id%ND_STEPS(1), id%DAD_STEPS(1),
2359 & id%KEEP(28), .TRUE., id%KEEP(28), id%KEEP(70),
2360 & id%KEEP(50), id%INFO(1), id%ICNTL(1),id%KEEP(47),
2361 & id%KEEP(81),id%KEEP(76),id%KEEP(215),
2362 & id%KEEP(234), id%KEEP(55), id%KEEP(199),
2363 & id%PROCNODE_STEPS(1),TEMP_MEM,id%NSLAVES,
2364 & SIZE_TEMP_MEM, PEAK,id%KEEP(90),SIZE_DEPTH_FIRST,
2365 & SIZE_COST_TRAV,DEPTH_FIRST(1),DEPTH_FIRST_SEQ(1),
2366 & COST_TRAV_TMP(1),
2367 & TEMP_LEAF,TEMP_SIZE,TEMP_ROOT,SBTR_ID(1)
2368 & )
2369 END IF
2370 ENDIF
2371.EQ. IF (id%MYIDMASTER) THEN
2372 CALL ZMUMPS_SORT_PERM(id%N, id%NA(1), id%LNA,
2373 & id%NE_STEPS(1), id%SYM_PERM(1),
2374 & id%FILS(1), id%DAD_STEPS(1),
2375 & id%STEP(1), id%KEEP(28),
2376 & id%KEEP(60), id%KEEP(20), id%KEEP(38),
2377 & id%INFO(1) )
2378 ENDIF
2379
2380
2381
2382
2383
2384
2385.NE..OR..NE. IF ( KEEP(494)0 KEEP(13)0 ) THEN
2386
2387
2388
2389.NE. IF (KEEP(38) 0) THEN
2390 CALL MPI_BCAST( id%KEEP(38), 1, MPI_INTEGER, MASTER,
2391 & id%COMM, IERR )
2392 ENDIF
2393.NE. IF (KEEP(20) 0) THEN
2394 CALL MPI_BCAST( id%KEEP(20), 1, MPI_INTEGER, MASTER,
2395 & id%COMM, IERR )
2396 ENDIF
2397 ENDIF
2398 80 CONTINUE
2399
2400 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2401 & id%COMM, id%MYID )
2402.LT. IF ( INFO(1)0 ) GOTO 500
2403
2404
2405
2406
2407
2408
2409
2410 CALL MPI_BCAST( id%FILS(1), id%N, MPI_INTEGER,
2411 & MASTER, id%COMM, IERR )
2412 CALL MPI_BCAST( id%NA(1), id%LNA, MPI_INTEGER,
2413 & MASTER, id%COMM, IERR )
2414 CALL MPI_BCAST( id%STEP(1), id%N, MPI_INTEGER,
2415 & MASTER, id%COMM, IERR )
2416 CALL MPI_BCAST( id%PROCNODE_STEPS(1), id%KEEP(28), MPI_INTEGER,
2417 & MASTER, id%COMM, IERR )
2418 CALL MPI_BCAST( id%DAD_STEPS(1), id%KEEP(28), MPI_INTEGER,
2419 & MASTER, id%COMM, IERR )
2420 CALL MPI_BCAST( id%FRERE_STEPS(1), id%KEEP(28), MPI_INTEGER,
2421 & MASTER, id%COMM, IERR)
2422 CALL MPI_BCAST( id%NE_STEPS(1), id%KEEP(28), MPI_INTEGER,
2423 & MASTER, id%COMM, IERR )
2424 CALL MPI_BCAST( id%ND_STEPS(1), id%KEEP(28), MPI_INTEGER,
2425 & MASTER, id%COMM, IERR )
2426 CALL MPI_BCAST( id%SYM_PERM(1), id%N, MPI_INTEGER,
2427 & MASTER, id%COMM, IERR )
2428.NE. IF(KEEP(494)0) THEN
2429 CALL MPI_BCAST( id%LRGROUPS(1), id%N, MPI_INTEGER,
2430 & MASTER, id%COMM, IERR )
2431 END IF
2432.EQ. IF (KEEP(55) 0) THEN
2433
2434
2435
2436
2437
2438 CALL ZMUMPS_ANA_N_DIST(id, id%PTRAR)
2439.EQ. IF(id%MYID MASTER) THEN
2440
2441
2442
2443
2444
2445.EQ..AND..EQ. IF ( (KEEP(244) 1) (KEEP(54) 3) ) THEN
2446
2447 IF (GATHER_MATRIX_ALLOCATED) THEN
2448 IF (associated(id%IRN)) THEN
2449 DEALLOCATE(id%IRN)
2450 NULLIFY(id%IRN)
2451 ENDIF
2452 IF (associated(id%JCN)) THEN
2453 DEALLOCATE(id%JCN)
2454 NULLIFY(id%JCN)
2455 ENDIF
2456 GATHER_MATRIX_ALLOCATED= .FALSE.
2457 ENDIF
2458 END IF
2459 END IF
2460 ENDIF
2461
2462
2463
2464.EQ..OR..EQ. IF((id%KEEP(76)4)(id%KEEP(76)6))THEN
2465 IF(associated(id%DEPTH_FIRST)) THEN
2466 DEALLOCATE(id%DEPTH_FIRST)
2467 ENDIF
2468 allocate(id%DEPTH_FIRST(id%KEEP(28)),stat=allocok)
2469.ne. IF (allocok 0) then
2470 INFO(1)= -7
2471 INFO(2)= id%KEEP(28)
2472 IF ( LPOK ) THEN
2473 WRITE(LP, 150) 'id%DEPTH_FIRST
'
2474 END IF
2475 GOTO 87
2476 END IF
2477 IF(associated(id%DEPTH_FIRST_SEQ)) THEN
2478 DEALLOCATE(id%DEPTH_FIRST_SEQ)
2479 ENDIF
2480 ALLOCATE(id%DEPTH_FIRST_SEQ(id%KEEP(28)),stat=allocok)
2481.ne. IF (allocok 0) then
2482 INFO(1)= -7
2483 INFO(2)= id%KEEP(28)
2484 IF ( LPOK ) THEN
2485 WRITE(LP, 150) 'id%DEPTH_FIRST_SEQ
'
2486 END IF
2487 GOTO 87
2488 END IF
2489 IF(associated(id%SBTR_ID)) THEN
2490 DEALLOCATE(id%SBTR_ID)
2491 ENDIF
2492 ALLOCATE(id%SBTR_ID(id%KEEP(28)),stat=allocok)
2493.ne. IF (allocok 0) then
2494 INFO(1)= -7
2495 INFO(2)= id%KEEP(28)
2496 IF ( LPOK ) THEN
2497 WRITE(LP, 150) 'id%DEPTH_FIRST_SEQ
'
2498 END IF
2499 GOTO 87
2500 END IF
2501.EQ. IF(id%MYIDMASTER)THEN
2502 id%DEPTH_FIRST(1:id%KEEP(28))=DEPTH_FIRST(1:id%KEEP(28))
2503 id%DEPTH_FIRST_SEQ(1:id%KEEP(28))=
2504 & DEPTH_FIRST_SEQ(1:id%KEEP(28))
2505 id%SBTR_ID(1:KEEP(28))=SBTR_ID(1:KEEP(28))
2506 ENDIF
2507 CALL MPI_BCAST( id%DEPTH_FIRST(1), id%KEEP(28), MPI_INTEGER,
2508 & MASTER, id%COMM, IERR )
2509 CALL MPI_BCAST( id%DEPTH_FIRST_SEQ(1), id%KEEP(28),
2510 & MPI_INTEGER,MASTER, id%COMM, IERR )
2511 CALL MPI_BCAST( id%SBTR_ID(1), id%KEEP(28),
2512 & MPI_INTEGER,MASTER, id%COMM, IERR )
2513 ELSE
2514 IF(associated(id%DEPTH_FIRST)) THEN
2515 DEALLOCATE(id%DEPTH_FIRST)
2516 ENDIF
2517 allocate(id%DEPTH_FIRST(1),stat=allocok)
2518.ne. IF (allocok 0) then
2519 INFO(1)= -7
2520 INFO(2)= 1
2521 IF ( LPOK ) THEN
2522 WRITE(LP, 150) 'id%DEPTH_FIRST
'
2523 END IF
2524 GOTO 87
2525 END IF
2526 IF(associated(id%DEPTH_FIRST_SEQ)) THEN
2527 DEALLOCATE(id%DEPTH_FIRST_SEQ)
2528 ENDIF
2529 ALLOCATE(id%DEPTH_FIRST_SEQ(1),stat=allocok)
2530.ne. IF (allocok 0) then
2531 INFO(1)= -7
2532 INFO(2)= 1
2533 IF ( LPOK ) THEN
2534 WRITE(LP, 150) 'id%DEPTH_FIRST_SEQ
'
2535 END IF
2536 GOTO 87
2537 END IF
2538 IF(associated(id%SBTR_ID)) THEN
2539 DEALLOCATE(id%SBTR_ID)
2540 ENDIF
2541 ALLOCATE(id%SBTR_ID(1),stat=allocok)
2542.ne. IF (allocok 0) then
2543 INFO(1)= -7
2544 INFO(2)= 1
2545 IF ( LPOK ) THEN
2546 WRITE(LP, 150) 'id%DEPTH_FIRST_SEQ
'
2547 END IF
2548 GOTO 87
2549 END IF
2550 id%SBTR_ID(1)=0
2551 id%DEPTH_FIRST(1)=0
2552 id%DEPTH_FIRST_SEQ(1)=0
2553 ENDIF
2554.EQ. IF(id%KEEP(76)5)THEN
2555 IF(associated(id%COST_TRAV)) THEN
2556 DEALLOCATE(id%COST_TRAV)
2557 ENDIF
2558 allocate(id%COST_TRAV(id%KEEP(28)),stat=allocok)
2559.ne. IF (allocok 0) then
2560 IF ( LPOK ) THEN
2561 WRITE(LP, 150) 'id%COST_TRAV
'
2562 END IF
2563 INFO(1)= -7
2564 INFO(2)= id%KEEP(28)
2565 GOTO 87
2566 END IF
2567.EQ. IF(id%MYIDMASTER)THEN
2568 id%COST_TRAV(1:id%KEEP(28))=
2569 & dble(COST_TRAV_TMP(1:id%KEEP(28)))
2570 ENDIF
2571 CALL MPI_BCAST( id%COST_TRAV(1), id%KEEP(28),
2572 & MPI_DOUBLE_PRECISION,MASTER, id%COMM, IERR )
2573 ELSE
2574 IF(associated(id%COST_TRAV)) THEN
2575 DEALLOCATE(id%COST_TRAV)
2576 ENDIF
2577 allocate(id%COST_TRAV(1),stat=allocok)
2578.ne. IF (allocok 0) then
2579 IF ( LPOK ) THEN
2580 WRITE(LP, 150) 'id%COST_TRAV(1)
'
2581 END IF
2582 INFO(1)= -7
2583 INFO(2)= 1
2584 GOTO 87
2585 END IF
2586 id%COST_TRAV(1)=0.0d0
2587 ENDIF
2588.EQ..OR. IF (id%KEEP(47) 4
2589.GT..AND..GE. & ((id%KEEP(81) 0)(id%KEEP(47)2))) THEN
2590.EQ. IF(id%MYID MASTER)THEN
2591 DO K=1,id%NSLAVES
2592 DO J=1,SIZE_TEMP_MEM
2593 IF(TEMP_MEM(J,K) < 0.0D0) GOTO 666
2594 ENDDO
2595 666 CONTINUE
2596 J=J-1
2597 IF (id%KEEP(46) == 1) THEN
2598 IDEST = K - 1
2599 ELSE
2600 IDEST = K
2601 ENDIF
2602.NE. IF (IDEST MASTER) THEN
2603 CALL MPI_SEND(J,1,MPI_INTEGER,IDEST,0,
2604 & id%COMM,IERR)
2605 CALL MPI_SEND(TEMP_MEM(1,K),J,MPI_DOUBLE_PRECISION,
2606 & IDEST, 0, id%COMM,IERR)
2607 CALL MPI_SEND(TEMP_LEAF(1,K),J,MPI_INTEGER,
2608 & IDEST, 0, id%COMM,IERR)
2609 CALL MPI_SEND(TEMP_SIZE(1,K),J,MPI_INTEGER,
2610 & IDEST, 0, id%COMM,IERR)
2611 CALL MPI_SEND(TEMP_ROOT(1,K),J,MPI_INTEGER,
2612 & IDEST, 0, id%COMM,IERR)
2613 ELSE
2614 IF(associated(id%MEM_SUBTREE)) THEN
2615 DEALLOCATE(id%MEM_SUBTREE)
2616 ENDIF
2617 allocate(id%MEM_SUBTREE(J),stat=allocok)
2618.ne. IF (allocok 0) then
2619 IF ( LPOK ) THEN
2620 WRITE(LP, 150) 'id%MEM_SUBTREE
'
2621 END IF
2622 INFO(1)= -7
2623 INFO(2)= J
2624 GOTO 87
2625 END IF
2626 id%NBSA_LOCAL = J
2627 id%MEM_SUBTREE(1:J)=TEMP_MEM(1:J,1)
2628 IF(associated(id%MY_ROOT_SBTR)) THEN
2629 DEALLOCATE(id%MY_ROOT_SBTR)
2630 ENDIF
2631 allocate(id%MY_ROOT_SBTR(J),stat=allocok)
2632.ne. IF (allocok 0) then
2633 IF ( LPOK ) THEN
2634 WRITE(LP, 150) 'id%MY_ROOT_SBTR
'
2635 END IF
2636 INFO(1)= -7
2637 INFO(2)= J
2638 GOTO 87
2639 END IF
2640 id%MY_ROOT_SBTR(1:J)=TEMP_ROOT(1:J,1)
2641 IF(associated(id%MY_FIRST_LEAF)) THEN
2642 DEALLOCATE(id%MY_FIRST_LEAF)
2643 ENDIF
2644 allocate(id%MY_FIRST_LEAF(J),stat=allocok)
2645.ne. IF (allocok 0) then
2646 IF ( LPOK ) THEN
2647 WRITE(LP, 150) 'id%MY_FIRST_LEAF
'
2648 END IF
2649 INFO(1)= -7
2650 INFO(2)= J
2651 GOTO 87
2652 END IF
2653 id%MY_FIRST_LEAF(1:J)=TEMP_LEAF(1:J,1)
2654 IF(associated(id%MY_NB_LEAF)) THEN
2655 DEALLOCATE(id%MY_NB_LEAF)
2656 ENDIF
2657 allocate(id%MY_NB_LEAF(J),stat=allocok)
2658.ne. IF (allocok 0) then
2659 IF ( LPOK ) THEN
2660 WRITE(LP, 150) 'id%MY_NB_LEAF
'
2661 END IF
2662 INFO(1)= -7
2663 INFO(2)= J
2664 GOTO 87
2665 END IF
2666 id%MY_NB_LEAF(1:J)=TEMP_SIZE(1:J,1)
2667 ENDIF
2668 ENDDO
2669 ELSE
2670 CALL MPI_RECV(id%NBSA_LOCAL,1,MPI_INTEGER,
2671 & MASTER,0,id%COMM,STATUS, IERR)
2672 IF(associated(id%MEM_SUBTREE)) THEN
2673 DEALLOCATE(id%MEM_SUBTREE)
2674 ENDIF
2675 allocate(id%MEM_SUBTREE(id%NBSA_LOCAL),stat=allocok)
2676.ne. IF (allocok 0) then
2677 IF ( LPOK ) THEN
2678 WRITE(LP, 150) 'id%MEM_SUBTREE
'
2679 END IF
2680 INFO(1)= -7
2681 INFO(2)= id%NBSA_LOCAL
2682 GOTO 87
2683 END IF
2684 IF(associated(id%MY_ROOT_SBTR)) THEN
2685 DEALLOCATE(id%MY_ROOT_SBTR)
2686 ENDIF
2687 allocate(id%MY_ROOT_SBTR(id%NBSA_LOCAL),stat=allocok)
2688.ne. IF (allocok 0) then
2689 IF ( LPOK ) THEN
2690 WRITE(LP, 150) 'id%MY_ROOT_SBTR
'
2691 END IF
2692 INFO(1)= -7
2693 INFO(2)= id%NBSA_LOCAL
2694 GOTO 87
2695 END IF
2696 IF(associated(id%MY_FIRST_LEAF)) THEN
2697 DEALLOCATE(id%MY_FIRST_LEAF)
2698 ENDIF
2699 allocate(id%MY_FIRST_LEAF(id%NBSA_LOCAL),stat=allocok)
2700.ne. IF (allocok 0) then
2701 IF ( LPOK ) THEN
2703 END IF
2704 INFO(1)= -7
2705 INFO(2)= id%NBSA_LOCAL
2706 GOTO 87
2707 END IF
2708 IF(associated(id%MY_NB_LEAF)) THEN
2709 DEALLOCATE(id%MY_NB_LEAF)
2710 ENDIF
2711 allocate(id%MY_NB_LEAF(id%NBSA_LOCAL),stat=allocok)
2712.ne. IF (allocok 0) then
2713 IF ( LPOK ) THEN
2715 END IF
2716 INFO(1)= -7
2717 INFO(2)= id%NBSA_LOCAL
2718 GOTO 87
2719 END IF
2720 CALL MPI_RECV(id%MEM_SUBTREE(1),id%NBSA_LOCAL,
2721 & MPI_DOUBLE_PRECISION,MASTER,0,
2722 & id%COMM,STATUS,IERR)
2723 CALL MPI_RECV(id%MY_FIRST_LEAF(1),id%NBSA_LOCAL,
2724 & MPI_INTEGER,MASTER,0,
2725 & id%COMM,STATUS,IERR)
2726 CALL MPI_RECV(id%MY_NB_LEAF(1),id%NBSA_LOCAL,
2727 & MPI_INTEGER,MASTER,0,
2728 & id%COMM,STATUS,IERR)
2729 CALL MPI_RECV(id%MY_ROOT_SBTR(1),id%NBSA_LOCAL,
2730 & MPI_INTEGER,MASTER,0,
2731 & id%COMM,STATUS,IERR)
2732 ENDIF
2733 ELSE
2734 id%NBSA_LOCAL = -999999
2735 IF(associated(id%MEM_SUBTREE)) THEN
2736 DEALLOCATE(id%MEM_SUBTREE)
2737 ENDIF
2738 allocate(id%MEM_SUBTREE(1),stat=allocok)
2739.ne. IF (allocok 0) then
2740 IF ( LPOK ) THEN
2741 WRITE(LP, 150) 'id%MEM_SUBTREE(1)
'
2742 END IF
2743 INFO(1)= -7
2744 INFO(2)= 1
2745 GOTO 87
2746 END IF
2747 IF(associated(id%MY_ROOT_SBTR)) THEN
2748 DEALLOCATE(id%MY_ROOT_SBTR)
2749 ENDIF
2750 allocate(id%MY_ROOT_SBTR(1),stat=allocok)
2751.ne. IF (allocok 0) then
2752 IF ( LPOK ) THEN
2753 WRITE(LP, 150) 'id%MY_ROOT_SBTR(1)
'
2754 END IF
2755 INFO(1)= -7
2756 INFO(2)= 1
2757 GOTO 87
2758 END IF
2759 IF(associated(id%MY_FIRST_LEAF)) THEN
2760 DEALLOCATE(id%MY_FIRST_LEAF)
2761 ENDIF
2762 allocate(id%MY_FIRST_LEAF(1),stat=allocok)
2763.ne. IF (allocok 0) then
2764 IF ( LPOK ) THEN
2765 WRITE(LP, 150) 'id%MY_FIRST_LEAF(1)
'
2766 END IF
2767 INFO(1)= -7
2768 INFO(2)= 1
2769 GOTO 87
2770 END IF
2771 IF(associated(id%MY_NB_LEAF)) THEN
2772 DEALLOCATE(id%MY_NB_LEAF)
2773 ENDIF
2774 allocate(id%MY_NB_LEAF(1),stat=allocok)
2775.ne. IF (allocok 0) then
2776 IF ( LPOK ) THEN
2777 WRITE(LP, 150) 'id%MY_NB_LEAF(1)
'
2778 END IF
2779 INFO(1)= -7
2780 INFO(2)= 1
2781 GOTO 87
2782 END IF
2783 ENDIF
2784.EQ. IF(id%MYIDMASTER)THEN
2785 IF(IS_BUILD_LOAD_MEM_CALLED)THEN
2786 DEALLOCATE(TEMP_MEM)
2787 DEALLOCATE(TEMP_SIZE)
2788 DEALLOCATE(TEMP_ROOT)
2789 DEALLOCATE(TEMP_LEAF)
2790 DEALLOCATE(COST_TRAV_TMP)
2791 DEALLOCATE(DEPTH_FIRST)
2792 DEALLOCATE(DEPTH_FIRST_SEQ)
2793 DEALLOCATE(SBTR_ID)
2794 ENDIF
2795 ENDIF
2796 87 CONTINUE
2797 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2798 & id%COMM, id%MYID )
2799.LT. IF ( INFO(1)0 ) GOTO 500
2800
2801 NB_NIV2 = KEEP(56) ! KEEP(1:110) was broadcast earlier
2802
2803.GT. IF ( NB_NIV20 ) THEN
2804
2805.ne. if (id%MYIDMASTER) then
2806 IF (associated(id%CANDIDATES)) THEN
2807 DEALLOCATE(id%CANDIDATES)
2808 ENDIF
2809 allocate(PAR2_NODES(NB_NIV2),
2810 & id%CANDIDATES(id%NSLAVES+1,NB_NIV2),
2811 & STAT=allocok)
2812.ne. IF (allocok 0) then
2813 INFO(1)= -7
2814 INFO(2)= NB_NIV2*(id%NSLAVES+1)
2815 IF ( LPOK ) THEN
2816 WRITE(LP, 150) 'par2_nodes/
id%CANDIDATES
'
2817 END IF
2818 end if
2819 end if
2820 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2821 & id%COMM, id%MYID )
2822.LT. IF ( INFO(1)0 ) GOTO 500
2823 CALL MPI_BCAST(PAR2_NODES(1),NB_NIV2,
2824 & MPI_INTEGER, MASTER, id%COMM, IERR )
2825.NE. IF (KEEP(24) 0 ) THEN
2826 CALL MPI_BCAST(id%CANDIDATES(1,1),
2827 & (NB_NIV2*(id%NSLAVES+1)),
2828 & MPI_INTEGER, MASTER, id%COMM, IERR )
2829 ENDIF
2830 ENDIF
2831 IF ( associated(id%ISTEP_TO_INIV2)) THEN
2832 DEALLOCATE(id%ISTEP_TO_INIV2)
2833 NULLIFY(id%ISTEP_TO_INIV2)
2834 ENDIF
2835 IF ( associated(id%I_AM_CAND)) THEN
2836 DEALLOCATE(id%I_AM_CAND)
2837 NULLIFY(id%I_AM_CAND)
2838 ENDIF
2839.EQ. IF (NB_NIV20) THEN
2840
2841
2842
2843
2844 id%KEEP(71) = 1
2845 ELSE
2846 id%KEEP(71) = id%KEEP(28)
2847 ENDIF
2848 allocate(id%ISTEP_TO_INIV2(id%KEEP(71)),
2849 & id%I_AM_CAND(max(NB_NIV2,1)),
2850 & stat=allocok)
2851.gt. IF (allocok 0) THEN
2852 IF ( LPOK ) THEN
2853 WRITE(LP, 150) 'id%ISTEP_TO_INIV2
'
2854 WRITE(LP, 150) 'id%TAB_POS_IN_PERE
'
2855 END IF
2856 INFO(1)= -7
2857.EQ. IF (NB_NIV20) THEN
2858 INFO(2)= 2
2859 ELSE
2860 INFO(2)= id%KEEP(28)+NB_NIV2*(id%NSLAVES+2)
2861 END IF
2862 GOTO 321
2863 ENDIF
2864.GT. IF ( NB_NIV2 0 ) THEN
2865
2866
2867
2868
2869 id%ISTEP_TO_INIV2 = -9999
2870 DO INIV2 = 1, NB_NIV2
2871 INN = PAR2_NODES(INIV2)
2872 id%ISTEP_TO_INIV2(abs(id%STEP(INN))) = INIV2
2873 END DO
2874 CALL ZMUMPS_BUILD_I_AM_CAND( id%NSLAVES, KEEP(79),
2875 & NB_NIV2, id%MYID_NODES,
2876 & id%CANDIDATES(1,1), id%I_AM_CAND(1) )
2877 ENDIF
2878 IF ( I_AM_SLAVE ) THEN
2879 IF (associated(id%FUTURE_NIV2)) THEN
2880 DEALLOCATE(id%FUTURE_NIV2)
2881 NULLIFY(id%FUTURE_NIV2)
2882 ENDIF
2883 allocate(id%FUTURE_NIV2(id%NSLAVES), stat=allocok)
2884.gt. IF (allocok 0) THEN
2885 IF ( LPOK ) THEN
2886 WRITE(LP, 150) 'future_niv2'
2887 END IF
2888 INFO(1)= -7
2889 INFO(2)= id%NSLAVES
2890 GOTO 321
2891 ENDIF
2892 id%FUTURE_NIV2=0
2893 DO INIV2 = 1, NB_NIV2
2894 IDEST = MUMPS_PROCNODE(
2895 & id%PROCNODE_STEPS(abs(id%STEP(PAR2_NODES(INIV2)))),
2896 & id%KEEP(199))
2897 id%FUTURE_NIV2(IDEST+1)=id%FUTURE_NIV2(IDEST+1)+1
2898 ENDDO
2899
2900
2901
2902 IF ( associated(id%TAB_POS_IN_PERE)) THEN
2903 DEALLOCATE(id%TAB_POS_IN_PERE)
2904 NULLIFY(id%TAB_POS_IN_PERE)
2905 ENDIF
2906 allocate(id%TAB_POS_IN_PERE(id%NSLAVES+2,max(NB_NIV2,1)),
2907 & stat=allocok)
2908.gt. IF (allocok 0) THEN
2909 IF ( LPOK ) THEN
2910 WRITE(LP, 150) 'id%ISTEP_TO_INIV2
'
2911 WRITE(LP, 150) 'id%TAB_POS_IN_PERE
'
2912 END IF
2913 INFO(1)= -7
2914.EQ. IF (NB_NIV20) THEN
2915 INFO(2)= 2
2916 ELSE
2917 INFO(2)= id%KEEP(28)+NB_NIV2*(id%NSLAVES+2)
2918 END IF
2919 GOTO 321
2920 ENDIF
2921 END IF
2922
2923
2924.GT. IF (NB_NIV20) DEALLOCATE (PAR2_NODES)
2925 321 CONTINUE
2926
2927
2928
2929 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2930 & id%COMM, id%MYID )
2931.LT. IF ( INFO(1)0 ) GOTO 500
2932
2933.NE. IF ( KEEP(38) 0 ) THEN
2934
2935
2936
2937 CALL ZMUMPS_INIT_ROOT_ANA( id%MYID,
2938 & id%NSLAVES, id%N, id%root,
2939 & id%COMM_NODES, KEEP( 38 ), id%FILS(1),
2940 & id%KEEP(50), id%KEEP(46),
2941 & id%KEEP(51)
2942 & , id%KEEP(60), id%NPROW, id%NPCOL, id%MBLOCK, id%NBLOCK
2943 & )
2944 ELSE
2945 id%root%yes = .FALSE.
2946 END IF
2947.NE..and. IF ( KEEP(38) 0 I_AM_SLAVE ) THEN
2948
2949
2950
2951
2952
2953
2954 CALL MPI_ALLREDUCE(id%root%MYROW, MYROW_CHECK, 1,
2955 & MPI_INTEGER, MPI_MAX, id%COMM_NODES, IERR)
2956.eq. IF ( MYROW_CHECK -1) THEN
2957 INFO(1) = -25
2958 INFO(2) = 0
2959 END IF
2960.LT..OR. IF ( id%root%MYROW -1
2961.LT. & id%root%MYCOL -1 ) THEN
2962 INFO(1) = -25
2963 INFO(2) = 0
2964 END IF
2965.AND. IF ( LPOK INFO(1) == -25 ) THEN
2966 WRITE(LP, '(a)')
2967 & 'problem with your version of
the blacs.
'
2968 WRITE(LP, '(a)') 'try using a blacs version from netlib.'
2969 ENDIF
2970 END IF
2971
2972
2973
2974 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2975 & id%COMM, id%MYID )
2976.LT. IF ( INFO(1)0 ) GOTO 500
2977 IF ( I_AM_SLAVE ) THEN
2978
2979
2980
2981.EQ. IF (KEEP(55) 0) THEN
2982 CALL ZMUMPS_ANA_DIST_ARROWHEADS( id%MYID,
2983 & id%NSLAVES, id%N, id%PROCNODE_STEPS(1),
2984 & id%STEP(1), id%PTRAR(1),
2985 & id%PTRAR(id%N +1),
2986 & id%ISTEP_TO_INIV2(1), id%I_AM_CAND(1),
2987 & KEEP(1),KEEP8(1), ICNTL(1), id )
2988 ELSE
2989 CALL ZMUMPS_ANA_DIST_ELEMENTS( id%MYID,
2990 & id%NSLAVES, id%N, id%PROCNODE_STEPS(1),
2991 & id%STEP(1),
2992 & id%PTRAR(1),
2993 & id%PTRAR(id%NELT+2 ),
2994 & id%NELT,
2995 & id%FRTPTR(1), id%FRTELT(1),
2996 & KEEP(1), KEEP8(1), ICNTL(1), id%KEEP(50) )
2997 ENDIF
2998
2999 ENDIF
3000
3001
3002
3003
3004
3005 IF ( I_AM_SLAVE ) THEN
3006
3007 locI_AM_CAND => id%I_AM_CAND
3008 locMYID_NODES = id%MYID_NODES
3009 locMYID = id%MYID
3010
3011
3012
3013
3014
3015
3016
3017 IF ( id%root%yes ) THEN
3018 LOCAL_M = numroc( id%ND_STEPS(id%STEP(KEEP(38))),
3019 & id%root%MBLOCK, id%root%MYROW, 0,
3020 & id%root%NPROW )
3021 LOCAL_M = max(1, LOCAL_M)
3022 LOCAL_N = numroc( id%ND_STEPS(id%STEP(KEEP(38))),
3023 & id%root%NBLOCK, id%root%MYCOL, 0,
3024 & id%root%NPCOL )
3025 ELSE
3026 LOCAL_M = 0
3027 LOCAL_N = 0
3028 END IF
3029.EQ..OR..EQ. IF ( KEEP(60) 2 KEEP(60) 3 ) THEN
3030
3031 id%SCHUR_MLOC=LOCAL_M
3032 id%SCHUR_NLOC=LOCAL_N
3033
3034 id%root%SCHUR_MLOC=LOCAL_M
3035 id%root%SCHUR_NLOC=LOCAL_N
3036 ENDIF
3037.NOT. IF ( associated(id%CANDIDATES)) THEN
3038 ALLOCATE(id%CANDIDATES(id%NSLAVES+1,1), stat=allocok)
3039.gt. IF (allocok 0) THEN
3040 IF ( LPOK ) THEN
3041 WRITE(LP, 150) 'candidates'
3042 END IF
3043 INFO(1)= -7
3044 INFO(2)= id%NSLAVES+1
3045 ENDIF
3046 ENDIF
3047
3048 ENDIF
3049 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3050 & id%COMM, id%MYID )
3051.LT. IF ( INFO(1)0 ) GOTO 500
3052.GT. IF (KEEP(400) 0 ) THEN ! L0 activated
3053
3054 IF ( I_AM_SLAVE ) THEN
3055
3056
3057
3058
3059
3060
3061
3062 CALL MUMPS_ANA_L0_OMP(
3063 & KEEP(400), id%N, KEEP(28),
3064 & KEEP(50), id%NSLAVES, id%DAD_STEPS, id%FRERE_STEPS,
3065 & id%FILS, id%NE_STEPS, id%ND_STEPS, id%STEP,
3066 & id%PROCNODE_STEPS, KEEP, KEEP8, locMYID_NODES,
3067 & id%NA, id%LNA, "ZMUMPS"(1:1),
3068 & id%LPOOL_B_L0_OMP, id%IPOOL_B_L0_OMP,
3069 & id%LPOOL_A_L0_OMP, id%IPOOL_A_L0_OMP,
3070 & id%L_VIRT_L0_OMP,id%VIRT_L0_OMP, id%VIRT_L0_OMP_MAPPING,
3071 & id%L_PHYS_L0_OMP,id%PHYS_L0_OMP, id%PERM_L0_OMP,
3072 & id%PTR_LEAFS_L0_OMP, id%THREAD_LA, id%INFO, id%ICNTL)
3073.GE. IF (id%INFO(1) 0) THEN
3074 ALLOCATE(
3075 & id%I4_L0_OMP(NBSTATS_I4, KEEP(400)),
3076 & id%I8_L0_OMP(NBSTATS_I8, KEEP(400)),
3077 & TNSTK_afterL0(KEEP(28)),
3078 & stat=allocok)
3079.gt. IF (allocok 0) THEN
3080 IF ( LPOK ) THEN
3081 WRITE(LP, 150) 'l0_omp stats'
3082 END IF
3083 INFO(1)= -7
3084 INFO(2)= NBSTATS_I4* KEEP(400) +
3085 & NBSTATS_I8* KEEP(400)*KEEP(10)
3086 & + KEEP(28)
3087 ENDIF
3088 ENDIF
3089
3090 ENDIF
3091 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3092 & id%COMM, id%MYID )
3093.LT. IF ( INFO(1)0 ) GOTO 500
3094 IF ( I_AM_SLAVE ) THEN
3095 CALL ZMUMPS_ANA_DISTM_UNDERL0OMP(
3096 & id%LPOOL_B_L0_OMP, id%IPOOL_B_L0_OMP(1),
3097 & id%L_VIRT_L0_OMP,
3098 & id%VIRT_L0_OMP(1), id%VIRT_L0_OMP_MAPPING(1),
3099 & id%L_PHYS_L0_OMP, id%PHYS_L0_OMP(1), id%PERM_L0_OMP(1),
3100 & id%PTR_LEAFS_L0_OMP(1),
3101 & id%KEEP(1), id%N, id%NE_STEPS(1), id%STEP(1),
3102 & id%FRERE_STEPS(1), id%FILS(1), id%DAD_STEPS(1),
3103 & id%ND_STEPS(1),
3104 & locMYID_NODES, id%PROCNODE_STEPS(1),
3105 & id%I4_L0_OMP(1,1), NBSTATS_I4,
3106 & id%I8_L0_OMP(1,1), NBSTATS_I8, KEEP(400),
3107
3108 & SIZECB_UNDER_L0, SIZECB_UNDER_L0_IF_LRCB,
3109 & TNSTK_afterL0, MAXFR_UNDER_L0,
3110 & MAX_FRONT_SURFACE_LOCAL_L0, MAX_SIZE_FACTOR_L0,
3111 & ENTRIES_IN_FACTORS_UNDER_L0,
3112 & ENTRIES_IN_FACTORS_MASTERS_LO,
3113 & COST_SUBTREES_UNDER_L0, OPSA_UNDER_L0,
3114
3115 & INFO(1), INFO(2)
3116 & )
3117 ENDIF
3118
3119 ELSE
3120
3121 IF ( I_AM_SLAVE ) THEN
3122 id%LPOOL_B_L0_OMP = 1
3123 id%LPOOL_A_L0_OMP = 1
3124 id%L_VIRT_L0_OMP = 1
3125 id%L_PHYS_L0_OMP = 1
3126 id%THREAD_LA = -1_8
3127 ALLOCATE ( id%VIRT_L0_OMP ( id%L_VIRT_L0_OMP ),
3128 & id%VIRT_L0_OMP_MAPPING ( id%L_VIRT_L0_OMP ),
3129 & id%PERM_L0_OMP ( id%L_PHYS_L0_OMP ),
3130 & id%PTR_LEAFS_L0_OMP ( id%L_PHYS_L0_OMP + 1 ),
3131 & id%IPOOL_B_L0_OMP ( id%LPOOL_B_L0_OMP ),
3132 & id%IPOOL_A_L0_OMP ( id%LPOOL_A_L0_OMP ),
3133 & id%PHYS_L0_OMP( id%L_PHYS_L0_OMP ),
3134 & id%I4_L0_OMP(1,1), id%I8_L0_OMP(1,1), stat=allocok)
3135.gt. IF (allocok 0) THEN
3136 IF ( LPOK ) THEN
3137 WRITE(LP, 150) 'allocation error in multicore'
3138 END IF
3139 INFO(1)= -7
3140 INFO(2)= id%L_VIRT_L0_OMP
3141 & + id%L_PHYS_L0_OMP
3142 & + id%L_PHYS_L0_OMP + 1
3143 & + id%LPOOL_B_L0_OMP
3144 & + id%LPOOL_A_L0_OMP
3145 & + id%L_PHYS_L0_OMP + 1 + KEEP(10)
3146 ENDIF
3147 ENDIF
3148
3149 ENDIF
3150 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3151 & id%COMM, id%MYID )
3152.LT. IF ( INFO(1)0 ) GOTO 500
3153
3154
3155 IF ( I_AM_SLAVE ) THEN
3156
3157.GT. IF (KEEP(400)0) THEN
3158
3159.GT. IF (id%NSLAVES 1) THEN
3160
3161
3162 ALLOCATE (FLAGGED_LEAVES(KEEP(28)),
3163 & stat=allocok)
3164.gt. IF (allocok 0) THEN
3165 IF ( LPOK ) THEN
3166 WRITE(LP, 150) 'l0_omp flagged leaves'
3167 END IF
3168 INFO(1)= -7
3169 INFO(2)= KEEP(28)
3170 ENDIF
3171 ENDIF
3172
3173 ENDIF
3174
3175 ENDIF
3176 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3177 & id%COMM, id%MYID )
3178.LT. IF ( INFO(1)0 ) GOTO 500
3179 IF ( I_AM_SLAVE ) THEN
3180
3181.GT. IF (KEEP(400)0) THEN
3182
3183.GT. IF (id%NSLAVES 1) THEN
3184 ! LIPOOL_local can be 0
3185 LIPOOL_local=
3186 & id%IPOOL_A_L0_OMP(id%LPOOL_A_L0_OMP)
3187
3188
3189
3190
3191 CALL ZMUMPS_PREP_ANA_DISTM_ABOVEL0(
3192 & id%N, id%NSLAVES, id%COMM_NODES, id%MYID_NODES,
3193 & id%STEP(1), id%DAD_STEPS(1),id%ICNTL,LP,LPOK,
3194 & id%INFO,
3195 & id%PHYS_L0_OMP(1), id%L_PHYS_L0_OMP,
3196 & id%IPOOL_A_L0_OMP(1), LIPOOL_local,
3197 & id%KEEP, TNSTK_afterL0,
3198 & FLAGGED_LEAVES
3199 & )
3200
3201.LT. IF ( INFO(1)0 ) GOTO 75
3202
3203 LIPOOL= 0
3204 DO ISTEP=1,KEEP(28)
3205
3206.GT. IF (FLAGGED_LEAVES(ISTEP)0) LIPOOL=LIPOOL+1
3207 ENDDO
3208 ELSE
3209
3210 LIPOOL = id%IPOOL_A_L0_OMP(id%LPOOL_A_L0_OMP)
3211 ENDIF
3212
3213 ELSE
3214 LIPOOL = id%NA(1)
3215 ENDIF
3216
3217
3218 ALLOCATE( IPOOL(max(LIPOOL,1)),
3219 & stat=allocok)
3220.gt. IF (allocok 0) THEN
3221 IF ( LPOK ) THEN
3222 WRITE(LP, 150) 'allocation ipool'
3223 END IF
3224 INFO(1)= -7
3225 INFO(2)= LIPOOL
3226 ENDIF
3227
3228 ENDIF
3229 75 CONTINUE
3230 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3231 & id%COMM, id%MYID )
3232.LT. IF ( INFO(1)0 ) GOTO 500
3233
3234 IF ( I_AM_SLAVE ) THEN
3235
3236.GT. IF (KEEP(400) 0 ) THEN ! L0 activated
3237
3238.GT. IF (LIPOOL0) THEN
3239.GT. IF (id%NSLAVES 1) THEN
3240
3241 I =LIPOOL
3242 DO ISTEP=1, KEEP(28)
3243.GT. IF (FLAGGED_LEAVES(ISTEP)0) THEN
3244
3245
3246
3247
3248 IPOOL(I) = FLAGGED_LEAVES(ISTEP)
3249 I=I-1
3250 ENDIF
3251
3252.EQ. IF (I0) CYCLE
3253 ENDDO
3254 DEALLOCATE(FLAGGED_LEAVES)
3255 ELSE
3256 DO I=1, LIPOOL
3257 IPOOL(I) = id%IPOOL_A_L0_OMP(I)
3258 ENDDO
3259 ENDIF
3260 ENDIF
3261
3262 ABOVE_L0 =.TRUE.
3263 NE_STEPSPTR => TNSTK_afterL0(1:KEEP(28))
3264
3265 ELSE
3266
3267 DO I=1, LIPOOL
3268 IPOOL(I) = id%NA(3+I-1)
3269 ENDDO
3270 ABOVE_L0 =.FALSE.
3271 SIZECB_UNDER_L0 = 0_8
3272 SIZECB_UNDER_L0_IF_LRCB = 0_8
3273 MAX_FRONT_SURFACE_LOCAL_L0 = 0_8
3274 MAX_SIZE_FACTOR_L0 = 0_8
3275 ENTRIES_IN_FACTORS_UNDER_L0= 0_8
3276 ENTRIES_IN_FACTORS_MASTERS_LO = 0_8
3277 MAXFR_UNDER_L0 = 0
3278 COST_SUBTREES_UNDER_L0 = 0.0D0
3279 OPSA_UNDER_L0 = 0.0D0
3280
3281 NE_STEPSPTR => id%NE_STEPS
3282 ENDIF
3283 KEEP(139) = MAXFR_UNDER_L0
3284
3285 CALL ZMUMPS_ANA_DISTM( locMYID_NODES, id%N, id%STEP(1),
3286 & id%FRERE_STEPS(1), id%FILS(1), IPOOL, LIPOOL, NE_STEPSPTR(1),
3287 & id%DAD_STEPS(1), id%ND_STEPS(1), id%PROCNODE_STEPS(1),
3288 & id%NSLAVES, ABOVE_L0,SIZECB_UNDER_L0,SIZECB_UNDER_L0_IF_LRCB,
3289 & MAXFR_UNDER_L0, MAX_FRONT_SURFACE_LOCAL_L0, MAX_SIZE_FACTOR_L0,
3290 & ENTRIES_IN_FACTORS_UNDER_L0, ENTRIES_IN_FACTORS_MASTERS_LO,
3291 & COST_SUBTREES_UNDER_L0, OPSA_UNDER_L0, KEEP8(53), KEEP8(54),
3292 & KEEP8(11), KEEP(26), KEEP(15), KEEP8(12), KEEP8(14),
3293 & KEEP8(32), KEEP8(33), KEEP8(34), KEEP8(35), KEEP8(50),
3294 & KEEP8(36), KEEP8(47), KEEP8(37), KEEP8(38), KEEP8(39),
3295 & KEEP8(40), KEEP8(41), KEEP8(42), KEEP8(43), KEEP8(44), KEEP8(45),
3296 & KEEP8(46), KEEP8(51), KEEP8(52), KEEP(224),KEEP(225),KEEP(27),
3297 & RINFO(1),id%CNTL(1), KEEP(1), KEEP8(1), LOCAL_M, LOCAL_N,
3298 & SBUF_RECOLD8, SBUF_SEND_FR, SBUF_REC_FR, SBUF_SEND_LR,
3299 & SBUF_REC_LR, id%COST_SUBTREES, KEEP(28), locI_AM_CAND(1),
3300 & max(KEEP(56),1), id%ISTEP_TO_INIV2(1), id%CANDIDATES(1,1),
3301 & INFO(1), INFO(2), KEEP8(15),MAX_SIZE_FACTOR_TMP,
3302 & KEEP8(9), ENTRIES_IN_FACTORS_LOC_MASTERS,
3303 & id%root%yes, id%root%NPROW, id%root%NPCOL
3304 & )
3305 IF (ALLOCATED(IPOOL)) DEALLOCATE(IPOOL)
3306 NULLIFY(NE_STEPSPTR)
3307.GT. IF (KEEP(400) 0) THEN ! L0 activated
3308
3309 DEALLOCATE (TNSTK_afterL0)
3310
3311
3312
3313
3314 SUM_NIRNEC = 0
3315 SUM_NIRADU = 0
3316 SUM_NIRADU_OOC = 0
3317 SUM_NIRNEC_OOC = 0
3318 DO I=1, KEEP(400)
3319 SUM_NIRADU = SUM_NIRADU + id%I4_L0_OMP(1,I)
3320 SUM_NIRNEC = SUM_NIRNEC + id%I4_L0_OMP(2,I)
3321 SUM_NIRADU_OOC = SUM_NIRADU_OOC+ id%I4_L0_OMP(3,I)
3322 SUM_NIRNEC_OOC = SUM_NIRNEC_OOC+ id%I4_L0_OMP(4,I)
3323 ENDDO
3324
3325 KEEP(26) = KEEP(26) + SUM_NIRADU
3326
3327 KEEP(224) = KEEP(224) + SUM_NIRADU_OOC
3328
3329 KEEP(15) = max(KEEP(15),KEEP(26))
3330
3331
3332 KEEP(225) = max(KEEP(225),KEEP(224))
3333
3334 KEEP(137) = SUM_NIRNEC
3335
3336 KEEP(138) = SUM_NIRNEC_OOC
3337
3338 SUM_NIRNEC = int(
3339 & (dble(SUM_NIRNEC)*dble(KEEP(34)))/dble(KEEP(35))
3340 & )
3341 SUM_NIRNEC_OOC = int(
3342 & (dble(SUM_NIRNEC_OOC)*dble(KEEP(34)))/dble(KEEP(35))
3343 & )
3344
3345
3346
3347 MAX_NRLADU = 0_8
3348 MIN_NRLADU = id%I8_L0_OMP(1,1)
3349 SUM_NRLADU = 0_8
3350 SUM_NRLNEC = 0_8
3351 MIN_NRLNEC = huge(MIN_NRLNEC)
3352 SUM_NRLNEC_ACTIVE = 0_8
3353 SUM_NRLADU_if_LR_LU = 0_8
3354 SUM_NRLADULR_UD = 0_8
3355 SUM_NRLADULR_WC = 0_8
3356 DO I=1, KEEP(400)
3357 MIN_NRLADU = min(MIN_NRLADU, id%I8_L0_OMP(1,I))
3358 MAX_NRLADU = max(MAX_NRLADU, id%I8_L0_OMP(1,I))
3359 SUM_NRLADU = SUM_NRLADU + id%I8_L0_OMP(1,I)
3360 SUM_NRLNEC = SUM_NRLNEC + id%I8_L0_OMP(2,I)
3361 MIN_NRLNEC = min(MIN_NRLNEC, id%I8_L0_OMP(2,I))
3362 SUM_NRLNEC_ACTIVE = SUM_NRLNEC_ACTIVE +
3363 & id%I8_L0_OMP(3,I)
3364 SUM_NRLADU_if_LR_LU = SUM_NRLADU_if_LR_LU +
3365 & id%I8_L0_OMP(4,I)
3366 SUM_NRLADULR_UD = SUM_NRLADULR_UD +
3367 & id%I8_L0_OMP(9,I)
3368 SUM_NRLADULR_WC = SUM_NRLADULR_WC +
3369 & id%I8_L0_OMP(10,I)
3370 ENDDO
3371
3372
3373
3374 KEEP8(81) = KEEP8(11)
3375 KEEP8(11) = KEEP8(11) + SUM_NRLADU
3376
3377
3378
3379 KEEP8(82) = KEEP8(32)
3380 KEEP8(32) = KEEP8(32) + SUM_NRLADU_if_LR_LU
3381
3382
3383
3384 PEAK_UNDER_L0 = SUM_NRLNEC + MIN_NRLNEC +
3385 & int(
3386 & (dble(id%N*KEEP(400))*dble(KEEP(34)))/dble(KEEP(35)),
3387 & 8)
3388
3389
3390
3391
3392
3393 PEAK_ABOVE_L0 = KEEP8(53)+ SUM_NRLADU +
3394 & ! SEND buffer
3395 & max ( int(
3396 & (dble(SBUF_SEND_FR)*dble(KEEP(34)))/dble(KEEP(35))
3397 & , 8), 100000_8 ) +
3398 & ! MAXIS_above :
3399 & int(
3400 & (dble(KEEP(15))*dble(KEEP(34)))/dble(KEEP(35)),
3401 & 8)
3402
3403
3404
3405
3406
3407
3408
3409 KEEP8(53) = KEEP8(53)+ SUM_NRLADU
3410 KEEP8(40) = KEEP8(40)+
3411 & SUM_NRLADU_if_LR_LU + SUM_NRLADULR_UD
3412 KEEP8(41) = KEEP8(41)+ SUM_NRLADULR_UD
3413 KEEP8(42) = KEEP8(42)+ SUM_NRLADULR_WC
3414 KEEP8(43) = KEEP8(43)+
3415 & SUM_NRLADU_if_LR_LU + SUM_NRLADULR_UD
3416 KEEP8(44) = KEEP8(44)+
3417 & SUM_NRLADU_if_LR_LU + SUM_NRLADULR_WC
3418 KEEP8(45) = KEEP8(45)+ SUM_NRLADULR_UD
3419 KEEP8(46) = KEEP8(46)+ SUM_NRLADULR_WC
3420 KEEP8(51) = KEEP8(51)+ SUM_NRLADU
3421 KEEP8(52) = KEEP8(52)+ SUM_NRLADULR_UD
3422
3423 ELSE
3424
3425 KEEP(137)=0
3426
3427 KEEP(138)=0
3428 ENDIF
3429
3430
3431
3432 id%DKEEP(15) = RINFO(1)/1000000.0
3433 IF(ASSOCIATED(locI_AM_CAND)) NULLIFY(locI_AM_CAND)
3434 id%MAX_SURF_MASTER = KEEP8(15)
3435
3436 KEEP8(19)=MAX_SIZE_FACTOR_TMP
3437 KEEP( 29 ) = KEEP(15) + 3* max(KEEP(12),10)
3438 & * ( KEEP(15) / 100 + 1)
3439
3440
3441 INFO( 19 ) = KEEP(225) + 3* max(KEEP(12),10)
3442 & * ( KEEP(225) / 100 + 1)
3443
3444
3445
3446
3447
3448 KEEP8(13) = KEEP8(12) + int(KEEP(12),8) *
3449 & ( KEEP8(12) / 100_8 + 1_8 )
3450
3451 KEEP8(17) = KEEP8(14) + int(KEEP(12),8) *
3452 & ( KEEP8(14) /100_8 +1_8)
3453
3454 K8_33relaxed = KEEP8(33) + int(KEEP(12),8) *
3455 & ( KEEP8(33) /100_8 +1_8)
3456
3457 K8_34relaxed = KEEP8(34) + int(KEEP(12),8) *
3458 & ( KEEP8(34) /100_8 +1_8)
3459
3460 K8_35relaxed = KEEP8(35) + int(KEEP(12),8) *
3461 & ( KEEP8(35) /100_8 +1_8)
3462
3463 K8_50relaxed = KEEP8(50) + int(KEEP(12),8) *
3464 & ( KEEP8(50) /100_8 +1_8)
3465
3466
3467
3468
3469
3470
3471 CALL MUMPS_ALLREDUCEI8 ( SBUF_RECOLD8, KEEP8(22), MPI_MAX,
3472 & id%COMM_NODES )
3473
3474
3475
3476 SBUF_SEND_FR = max(SBUF_SEND_FR,KEEP(27))
3477 SBUF_SEND_LR = max(SBUF_SEND_LR,KEEP(27))
3478 SBUF_REC_FR = max(SBUF_REC_FR ,KEEP(27))
3479 SBUF_REC_LR = max(SBUF_REC_LR ,KEEP(27))
3480 CALL MPI_ALLREDUCE (SBUF_REC_FR, KEEP(44), 1,
3481 & MPI_INTEGER, MPI_MAX,
3482 & id%COMM_NODES, IERR)
3483 CALL MPI_ALLREDUCE (SBUF_REC_LR, KEEP(380), 1,
3484 & MPI_INTEGER, MPI_MAX,
3485 & id%COMM_NODES, IERR)
3486 IF (KEEP(48)==5) THEN
3487 KEEP(43) = KEEP(44)
3488 KEEP(379) = KEEP(380)
3489 ELSE
3490 KEEP(43)=SBUF_SEND_FR
3491 KEEP(379)=SBUF_SEND_LR
3492 ENDIF
3493
3494 UPDATE_BUFFER = .TRUE.
3495
3496 MIN_BUF_SIZE8 = KEEP8(22) / int(KEEP(238),8)
3497 MIN_BUF_SIZE8 = min(MIN_BUF_SIZE8,int(huge(I4),8))
3498 MIN_BUF_SIZE = int( MIN_BUF_SIZE8 )
3499 IF (UPDATE_BUFFER) THEN
3500
3501 KEEP(43) = max(KEEP(43), MIN_BUF_SIZE)
3502 KEEP(379) = max(KEEP(379), MIN_BUF_SIZE)
3503 ENDIF
3504.NE..OR. IF ( (KEEP(38)0) UPDATE_BUFFER) THEN
3505
3506
3507 KEEP(380) = max(KEEP(380), MIN_BUF_SIZE)
3508 KEEP(44) = max(KEEP(44), MIN_BUF_SIZE)
3509 ENDIF
3510 IF ( PROK ) THEN
3511 WRITE(MP,'(a,i16) ')
3512 & ' estimated INTEGER space for factors :',
3513 & KEEP(26)
3514 WRITE(MP,'(A,I16) ')
3515 & ' INFO(3), est. complex space to store factors:',
3516 & KEEP8(11)
3517 WRITE(MP,'(A,I16) ')
3518 & ' Estimated number of entries in factors :',
3519 & KEEP8(9)
3520 WRITE(MP,'(A,I16) ')
3521 & ' Current value of space relaxation parameter :',
3522 & KEEP(12)
3523 WRITE(MP,'(A,I16) ')
3524 & ' Estimated size of IS (In Core factorization):',
3525 & KEEP(29)
3526 WRITE(MP,'(A,I16) ')
3527 & ' Estimated size of S (In Core factorization):',
3528 & KEEP8(13)
3529 WRITE(MP,'(A,I16) ')
3530 & ' Estimated size of S (OOC factorization) :',
3531 & KEEP8(17)
3532 END IF
3533
3534 ELSE
3535
3536
3537
3538 ENTRIES_IN_FACTORS_LOC_MASTERS = 0_8
3539 KEEP8(13) = 0_8
3540 KEEP(29) = 0
3541 KEEP8(17)= 0_8
3542 INFO(19) = 0
3543 KEEP8(11) = 0_8
3544 KEEP8(81) = 0_8
3545 KEEP8(82) = 0_8
3546 KEEP(26) = 0
3547 KEEP(27) = 0
3548 RINFO(1) = 0.0D0
3549 K8_33relaxed = 0_8
3550 K8_34relaxed = 0_8
3551 K8_35relaxed = 0_8
3552 K8_50relaxed = 0_8
3553.GT. IF (KEEP(400) 0) THEN
3554 SUM_NIRNEC = 0
3555 SUM_NIRADU = 0
3556 SUM_NIRADU_OOC = 0
3557 SUM_NIRNEC_OOC = 0
3558 MAX_NRLADU = 0_8
3559 MIN_NRLADU = 0_8
3560 SUM_NRLADU = 0_8
3561 SUM_NRLNEC = 0_8
3562 SUM_NRLNEC_ACTIVE = 0_8
3563 SUM_NRLADU_if_LR_LU = 0_8
3564 SUM_NRLADULR_UD = 0_8
3565 SUM_NRLADULR_WC = 0_8
3566 ENDIF
3567 END IF
3568 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3569 & id%COMM, id%MYID )
3570.LT. IF ( INFO(1) 0 ) GOTO 500
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585 CALL MUMPS_ALLREDUCEI8( ENTRIES_IN_FACTORS_LOC_MASTERS,
3586 & KEEP8(109), MPI_SUM, id%COMM)
3587 CALL MUMPS_ALLREDUCEI8( KEEP8(19), KEEP8(119),
3588 & MPI_MAX, id%COMM)
3589 CALL MPI_ALLREDUCE( KEEP(27), KEEP(127), 1,
3590 & MPI_INTEGER, MPI_MAX,
3591 & id%COMM, IERR)
3592 CALL MPI_ALLREDUCE( KEEP(26), KEEP(126), 1,
3593 & MPI_INTEGER, MPI_SUM,
3594 & id%COMM, IERR)
3595
3596 CALL MUMPS_REDUCEI8( KEEP8(11),
3597 & KEEP8(111), MPI_SUM,
3598 & MASTER, id%COMM )
3599 CALL MUMPS_SETI8TOI4( KEEP8(111), INFOG(3) )
3600
3601
3602
3603 RINFO(5) = dble(KEEP8(32)
3604 & *int(KEEP(35),8))/1D6
3605 CALL MUMPS_REDUCEI8( KEEP8(32),
3606 & ITMP8, MPI_SUM,
3607 & MASTER, id%COMM )
3608
3609.EQ. IF (id%MYIDMASTER) THEN
3610 RINFOG(15) = dble(ITMP8*int(KEEP(35),8))/1D6
3611 ENDIF
3612
3613
3614
3615 CALL MPI_ALLREDUCE( RINFO(1), RINFOG(1), 1,
3616 & MPI_DOUBLE_PRECISION, MPI_SUM,
3617 & id%COMM, IERR)
3618
3619 CALL MUMPS_SETI8TOI4( KEEP8(11), INFO(3) )
3620 INFO ( 4 ) = KEEP( 26 )
3621 INFO ( 5 ) = KEEP( 27 )
3622 INFO ( 7 ) = KEEP( 29 )
3623 CALL MUMPS_SETI8TOI4( KEEP8(13), INFO(8) )
3624 CALL MUMPS_SETI8TOI4( KEEP8(17), INFO(20) )
3625 CALL MUMPS_SETI8TOI4( KEEP8(9), INFO(24) )
3626
3627 CALL MUMPS_SETI8TOI4( K8_33relaxed, INFO(29) )
3628 CALL MUMPS_SETI8TOI4( K8_34relaxed, INFO(32) )
3629 CALL MUMPS_SETI8TOI4( K8_35relaxed, INFO(33) )
3630 CALL MUMPS_SETI8TOI4( K8_50relaxed, INFO(36) )
3631 INFOG( 4 ) = KEEP( 126 )
3632 INFOG( 5 ) = KEEP( 127 )
3633 CALL MUMPS_SETI8TOI4( KEEP8(109), INFOG(20) )
3634 CALL ZMUMPS_DIAG_ANA(id%MYID, id%COMM, KEEP(1), KEEP8(1),
3635 & INFO(1), INFOG(1), RINFO(1), RINFOG(1), ICNTL(1),
3636 & id%SIZE_SCHUR )
3637
3638
3639 IF (PROK) WRITE( MP, 112 )
3640.AND..NE. IF (PROKG (MPGMP)) WRITE( MPG, 112 )
3641
3642
3643
3644
3645
3646 SUM_KEEP811_THIS_NODE=0_8
3647 CALL MPI_REDUCE( KEEP8(11), SUM_KEEP811_THIS_NODE, 1,
3648 & MPI_INTEGER8,
3649 & MPI_SUM, 0, id%KEEP(411), IERR )
3650 CALL MPI_REDUCE( SUM_KEEP811_THIS_NODE, MAX_SUM_KEEP811_THIS_NODE,
3651 & 1, MPI_INTEGER8, MPI_MAX, 0, id%COMM, IERR )
3652.AND. IF (PROKG PRINT_NODEINFO) THEN
3653 WRITE(MPG,'(A,I12)')
3654 & ' Max. estimated space for factors per compute node :',
3655 & MAX_SUM_KEEP811_THIS_NODE ! * KEEP(35)/1000000_8
3656 ENDIF
3657
3658 OOC_STRAT = KEEP(201)
3659 BLR_STRAT = 0 ! no BLR compression
3660.NE. IF (KEEP(201) -1) OOC_STRAT=0 ! We want in-core statistics
3661 PERLU_ON = .FALSE. ! switch off PERLU to compute KEEP8(2)
3662 CALL ZMUMPS_MAX_MEM( KEEP(1), KEEP8(1),
3663 & id%MYID, id%N, id%NELT, id%NA(1), id%LNA, id%KEEP8(28),
3664 & id%KEEP8(30),
3665 & id%NSLAVES, TOTAL_MBYTES, .FALSE.,
3666 & OOC_STRAT, BLR_STRAT, PERLU_ON, TOTAL_BYTES,
3667 & IDUMMY, BDUMMY, .FALSE.,
3668 & .FALSE. ! UNDER_L0_OMP
3669 & , id%I8_L0_OMP(1,1), size(id%I8_L0_OMP,1),
3670 & size(id%I8_L0_OMP,2)
3671 & )
3672.GT. IF (KEEP(400) 0 ) THEN ! L0 activated
3673 CALL ZMUMPS_MAX_MEM( KEEP(1), KEEP8(1),
3674 & id%MYID, id%N, id%NELT, id%NA(1), id%LNA, id%KEEP8(28),
3675 & id%KEEP8(30),
3676 & id%NSLAVES, TOTAL_MBYTES_UNDER_L0, .FALSE.,
3677 & OOC_STRAT, BLR_STRAT, PERLU_ON, TOTAL_BYTES_UNDER_L0,
3678 & IDUMMY, BDUMMY, .FALSE.,
3679 & .TRUE. ! UNDER_L0_OMP
3680 & , id%I8_L0_OMP(1,1), size(id%I8_L0_OMP,1),
3681 & size(id%I8_L0_OMP,2)
3682 & )
3683 TOTAL_MBYTES = max (TOTAL_MBYTES,TOTAL_MBYTES_UNDER_L0)
3684 TOTAL_BYTES = max (TOTAL_BYTES, TOTAL_BYTES_UNDER_L0)
3685 ENDIF
3686 KEEP8(2) = TOTAL_BYTES
3687
3688
3689 PERLU_ON = .TRUE.
3690 CALL ZMUMPS_MAX_MEM( KEEP(1), KEEP8(1),
3691 & id%MYID, id%N, id%NELT, id%NA(1), id%LNA, id%KEEP8(28),
3692 & id%KEEP8(30),
3693 & id%NSLAVES, TOTAL_MBYTES, .FALSE.,
3694 & OOC_STRAT, BLR_STRAT, PERLU_ON, TOTAL_BYTES,
3695 & IDUMMY, BDUMMY, .FALSE.,
3696 & .FALSE. ! UNDER_L0_OMP
3697 & , id%I8_L0_OMP(1,1), size(id%I8_L0_OMP,1),
3698 & size(id%I8_L0_OMP,2)
3699 & )
3700.GT. IF (KEEP(400) 0 ) THEN ! L0 activated
3701 CALL ZMUMPS_MAX_MEM( KEEP(1), KEEP8(1),
3702 & id%MYID, id%N, id%NELT, id%NA(1), id%LNA,
3703 & id%KEEP8(28),
3704 & id%KEEP8(30),
3705 & id%NSLAVES, TOTAL_MBYTES_UNDER_L0, .FALSE.,
3706 & OOC_STRAT, BLR_STRAT, PERLU_ON, TOTAL_BYTES_UNDER_L0,
3707 & IDUMMY, BDUMMY, .FALSE.,
3708 & .TRUE. ! UNDER_L0_OMP
3709 & , id%I8_L0_OMP(1,1), size(id%I8_L0_OMP,1),
3710 & size(id%I8_L0_OMP,2)
3711 & )
3712 TOTAL_MBYTES = max (TOTAL_MBYTES,TOTAL_MBYTES_UNDER_L0)
3713 TOTAL_BYTES = max (TOTAL_BYTES, TOTAL_BYTES_UNDER_L0)
3714 ENDIF
3715 IF ( PROK ) THEN
3716 WRITE(MP,'(A,I12) ')
3717 & ' Estimated space in MBytes for IC factorization (INFO(15)):',
3718 & TOTAL_MBYTES
3719 END IF
3720 id%INFO(15) = TOTAL_MBYTES
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730 CALL MUMPS_MEM_CENTRALIZE( id%MYID, id%COMM,
3731 & id%INFO(15), id%INFOG(16), IRANK )
3732 IF ( PROKG ) THEN
3733 IF (PRINT_MAXAVG) THEN
3734 WRITE( MPG,'(A,I12) ')
3735 & ' Maximum estim. space in Mbytes, IC facto. (INFOG(16)):',
3736 & id%INFOG(16)
3737 ENDIF
3738 WRITE(MPG,'(A,I12) ')
3739 & ' Total space in MBytes, IC factorization ((17)):'
3740 & ,id%INFOG(17)
3741 END IF
3742
3743 SUM_INFO15_THIS_NODE=0
3744 CALL MPI_REDUCE( INFO(15), SUM_INFO15_THIS_NODE, 1, MPI_INTEGER,
3745 & MPI_SUM, 0, id%KEEP(411), IERR )
3746 CALL MPI_REDUCE( SUM_INFO15_THIS_NODE, MAX_SUM_INFO15_THIS_NODE,
3747 & 1, MPI_INTEGER, MPI_MAX, 0, id%COMM, IERR )
3748.AND. IF ( PROKG PRINT_NODEINFO ) THEN
3749 WRITE(MPG,'(A,I12)')
3750 & ' Max. estim. space per compute node, in MBytes, IC fact :',
3751 & MAX_SUM_INFO15_THIS_NODE
3752 ENDIF
3753
3754
3755
3756
3757
3758
3759
3760 OOC_STRAT = KEEP(201)
3761 BLR_STRAT = 0 ! no BLR compression
3762#if defined(OLD_OOC_NOPANEL)
3763.NE. IF (OOC_STRAT -1) OOC_STRAT=2
3764#else
3765.NE. IF (OOC_STRAT -1) OOC_STRAT=1
3766#endif
3767 PERLU_ON = .FALSE. ! PERLU NOT taken into account
3768
3769 CALL ZMUMPS_MAX_MEM( KEEP(1), KEEP8(1),
3770 & id%MYID, id%N, id%NELT, id%NA(1), id%LNA, id%KEEP8(28),
3771 & id%KEEP8(30),
3772 & id%NSLAVES, TOTAL_MBYTES, .FALSE.,
3773 & OOC_STRAT, BLR_STRAT, PERLU_ON, TOTAL_BYTES,
3774 & IDUMMY, BDUMMY, .FALSE.,
3775 & .FALSE. ! UNDER_L0_OMP
3776 & , id%I8_L0_OMP(1,1), size(id%I8_L0_OMP,1),
3777 & size(id%I8_L0_OMP,2)
3778 & )
3779.GT. IF (KEEP(400) 0 ) THEN ! L0 activated
3780 CALL ZMUMPS_MAX_MEM( KEEP(1), KEEP8(1),
3781 & id%MYID, id%N, id%NELT, id%NA(1), id%LNA, id%KEEP8(28),
3782 & id%KEEP8(30),
3783 & id%NSLAVES, TOTAL_MBYTES_UNDER_L0, .FALSE.,
3784 & OOC_STRAT, BLR_STRAT, PERLU_ON, TOTAL_BYTES_UNDER_L0,
3785 & IDUMMY, BDUMMY, .FALSE.,
3786 & .TRUE. ! UNDER_L0_OMP
3787 & , id%I8_L0_OMP(1,1), size(id%I8_L0_OMP,1),
3788 & size(id%I8_L0_OMP,2)
3789 & )
3790 TOTAL_MBYTES = max (TOTAL_MBYTES,TOTAL_MBYTES_UNDER_L0)
3791 TOTAL_BYTES = max (TOTAL_BYTES, TOTAL_BYTES_UNDER_L0)
3792 ENDIF
3793 KEEP8(3) = TOTAL_BYTES
3794
3795 PERLU_ON = .TRUE. ! PERLU taken into account
3796 CALL ZMUMPS_MAX_MEM( KEEP(1), KEEP8(1),
3797 & id%MYID, id%N, id%NELT, id%NA(1), id%LNA, id%KEEP8(28),
3798 & id%KEEP8(30),
3799 & id%NSLAVES, TOTAL_MBYTES, .FALSE.,
3800 & OOC_STRAT, BLR_STRAT, PERLU_ON, TOTAL_BYTES,
3801 & IDUMMY, BDUMMY, .FALSE.,
3802 & .FALSE. ! UNDER_L0_OMP
3803 & , id%I8_L0_OMP(1,1), size(id%I8_L0_OMP,1),
3804 & size(id%I8_L0_OMP,2)
3805 & )
3806.GT. IF (KEEP(400) 0 ) THEN ! L0 activated
3807 CALL ZMUMPS_MAX_MEM( KEEP(1), KEEP8(1),
3808 & id%MYID, id%N, id%NELT, id%NA(1), id%LNA, id%KEEP8(28),
3809 & id%KEEP8(30),
3810 & id%NSLAVES, TOTAL_MBYTES_UNDER_L0, .FALSE.,
3811 & OOC_STRAT, BLR_STRAT, PERLU_ON, TOTAL_BYTES_UNDER_L0,
3812 & IDUMMY, BDUMMY, .FALSE.,
3813 & .TRUE. ! UNDER_L0_OMP
3814 & , id%I8_L0_OMP(1,1), size(id%I8_L0_OMP,1),
3815 & size(id%I8_L0_OMP,2)
3816 & )
3817 TOTAL_MBYTES = max (TOTAL_MBYTES,TOTAL_MBYTES_UNDER_L0)
3818 TOTAL_BYTES = max (TOTAL_BYTES, TOTAL_BYTES_UNDER_L0)
3819 ENDIF
3820 id%INFO(17) = TOTAL_MBYTES
3821
3822 CALL MUMPS_MEM_CENTRALIZE( id%MYID, id%COMM,
3823 & id%INFO(17), id%INFOG(26), IRANK )
3824 IF ( PROKG ) THEN
3825 IF (PRINT_MAXAVG) THEN
3826 WRITE( MPG,'(A,I12) ')
3827 & ' Maximum estim. space in Mbytes, OOC facto. (INFOG(26)):',
3828 & id%INFOG(26)
3829 ENDIF
3830 WRITE(MPG,'(A,I12) ')
3831 & ' Total space in MBytes, OOC factorization (INFOG(27)):'
3832 & ,id%INFOG(27)
3833 END IF
3834 SUM_INFO17_THIS_NODE=0
3835 CALL MPI_REDUCE( INFO(17), SUM_INFO17_THIS_NODE, 1, MPI_INTEGER,
3836 & MPI_SUM, 0, id%KEEP(411), IERR )
3837 CALL MPI_REDUCE( SUM_INFO17_THIS_NODE, MAX_SUM_INFO17_THIS_NODE,
3838 & 1, MPI_INTEGER, MPI_MAX, 0, id%COMM, IERR )
3839.AND. IF (PROKG PRINT_NODEINFO) THEN
3840 WRITE(MPG,'(A,I12)')
3841 & ' Max. estim. space per compute node, in MBytes, OOC fact :',
3842 & MAX_SUM_INFO17_THIS_NODE
3843 ENDIF
3844.NE. IF (KEEP(494)0) THEN
3845
3846
3847
3848 SUM_OF_PEAKS = .TRUE.
3849 CALL ZMUMPS_MEM_ESTIM_BLR_ALL( SUM_OF_PEAKS,
3850 & KEEP(1), KEEP8(1),
3851 & id%MYID, id%COMM,
3852 & id%N, id%NELT, id%NA(1), id%LNA, id%KEEP8(28),
3853 & id%KEEP8(30), id%NSLAVES,
3854 & id%INFO, id%INFOG, PROK, MP, PROKG, MPG
3855 & , id%I8_L0_OMP(1,1), size(id%I8_L0_OMP,1),
3856 & size(id%I8_L0_OMP,2)
3857 & )
3858
3859 END IF
3860
3861
3862
3863
3864.AND..eq. IF ( id%MYID. eq. MASTER KEEP(54) 1 ) THEN
3865 IF (associated( id%MAPPING)) THEN
3866 DEALLOCATE( id%MAPPING)
3867 ENDIF
3868 allocate( id%MAPPING(id%KEEP8(28)), stat=allocok)
3869.GT. IF ( allocok 0 ) THEN
3870 INFO(1) = -7
3871 CALL MUMPS_SETI8TOI4(id%KEEP8(28), INFO(2))
3872 IF ( LPOK ) THEN
3873 WRITE(LP, 150) 'id%MAPPING'
3874 END IF
3875 GOTO 92
3876 END IF
3877 allocate(IWtemp( id%N ), stat=allocok)
3878.GT. IF ( allocok 0 ) THEN
3879 INFO(1)=-7
3880 INFO(2)=id%N
3881 IF ( LPOK ) THEN
3882 WRITE(LP, 150) 'IWtemp(N)'
3883 END IF
3884 GOTO 92
3885 END IF
3886.EQ. IF ( id%KEEP8(28) 0_8 ) THEN
3887 IRN_PTR => IDUMMY_ARRAY
3888 JCN_PTR => IDUMMY_ARRAY
3889 ELSE
3890 IRN_PTR => id%IRN
3891 JCN_PTR => id%JCN
3892 ENDIF
3893 CALL ZMUMPS_BUILD_MAPPING(
3894 & id%N, id%MAPPING(1), id%KEEP8(28),
3895 & IRN_PTR(1),JCN_PTR(1), id%PROCNODE_STEPS(1),
3896 & id%STEP(1),
3897 & id%NSLAVES, id%SYM_PERM(1),
3898 & id%FILS(1), IWtemp, id%KEEP(1),id%KEEP8(1),
3899 & id%root%MBLOCK, id%root%NBLOCK,
3900 & id%root%NPROW, id%root%NPCOL )
3901 DEALLOCATE( IWtemp )
3902 92 CONTINUE
3903 END IF
3904 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3905 & id%COMM, id%MYID )
3906.LT. IF ( INFO(1) 0 ) GOTO 500
3907
3908 500 CONTINUE
3909
3910 IF (allocated(PROCNODE)) DEALLOCATE(PROCNODE)
3911 IF (allocated(XNODEL)) DEALLOCATE(XNODEL)
3912 IF (allocated(NODEL)) DEALLOCATE(NODEL)
3913 IF (allocated(IPOOL)) DEALLOCATE(IPOOL)
3914 IF (allocated(TNSTK_afterL0)) DEALLOCATE(TNSTK_afterL0)
3915 IF (allocated(FLAGGED_LEAVES)) DEALLOCATE(FLAGGED_LEAVES)
3916 IF (allocated(SIZEOFBLOCKS)) DEALLOCATE(SIZEOFBLOCKS)
3917 IF (allocated(DOF2BLOCK)) DEALLOCATE(DOF2BLOCK)
3918 CALL MUMPS_AB_FREE_LMAT(LMAT_BLOCK)
3919 CALL MUMPS_AB_FREE_LMAT(LUMAT)
3920 CALL MUMPS_AB_FREE_LMAT(LUMAT_REMAP)
3921 CALL MUMPS_AB_FREE_GCOMP(GCOMP)
3922 CALL MUMPS_AB_FREE_GCOMP(GCOMP_DIST)
3923.LT. IF (INFO(1) 0) THEN
3924
3925
3926 IF (associated(id%IPOOL_B_L0_OMP)) THEN
3927 DEALLOCATE(id%IPOOL_B_L0_OMP)
3928 NULLIFY(id%IPOOL_B_L0_OMP)
3929 ENDIF
3930 IF (associated(id%IPOOL_A_L0_OMP)) THEN
3931 DEALLOCATE(id%IPOOL_A_L0_OMP)
3932 NULLIFY(id%IPOOL_A_L0_OMP)
3933 ENDIF
3934 IF (associated(id%VIRT_L0_OMP)) THEN
3935 DEALLOCATE(id%VIRT_L0_OMP)
3936 NULLIFY(id%VIRT_L0_OMP)
3937 ENDIF
3938 IF (associated(id%VIRT_L0_OMP_MAPPING)) THEN
3939 DEALLOCATE(id%VIRT_L0_OMP_MAPPING)
3940 NULLIFY(id%VIRT_L0_OMP_MAPPING)
3941 ENDIF
3942 IF (associated(id%PERM_L0_OMP)) THEN
3943 DEALLOCATE(id%PERM_L0_OMP)
3944 NULLIFY(id%PERM_L0_OMP)
3945 ENDIF
3946 IF (associated(id%PTR_LEAFS_L0_OMP)) THEN
3947 DEALLOCATE(id%PTR_LEAFS_L0_OMP)
3948 NULLIFY(id%PTR_LEAFS_L0_OMP)
3949 ENDIF
3950 ENDIF
3951
3952 IF (associated(NFSIZPTR)) DEALLOCATE(NFSIZPTR)
3953 IF (associated(FREREPTR)) DEALLOCATE(FREREPTR)
3954 IF (associated(FILSPTR)) DEALLOCATE(FILSPTR)
3955.AND. IF (associated(id%BLKPTR)BLKPTR_ALLOCATED) THEN
3956 DEALLOCATE(id%BLKPTR)
3957 nullify(id%BLKPTR)
3958 ENDIF
3959.AND. IF (associated(id%BLKVAR)BLKVAR_ALLOCATED) THEN
3960 DEALLOCATE(id%BLKVAR)
3961 nullify(id%BLKVAR)
3962 ENDIF
3963 KEEP8(26)=max(1_8,KEEP8(26))
3964 KEEP8(27)=max(1_8,KEEP8(27))
3965 RETURN
3966 110 FORMAT(/' ****** ANALYSIS STEP ********'/)
3967 112 FORMAT(/' MEMORY ESTIMATIONS ... '/
3968 & ' Estimations with standard Full-Rank (FR) factorization:')
3969 145 FORMAT(' ELAPSED TIME SPENT IN BLR CLUSTERING =',F12.4)
3970 150 FORMAT(
3972 & A30)
subroutine mumps_ab_lmat_to_clean_g(myid, unfold, ready_for_ana_f, lmat, gcomp, info, icntl)
subroutine mumps_ab_compute_sizeofblock(nblk, ndof, blkptr, blkvar, sizeofblocks, dof2block)
subroutine mumps_ab_gather_graph(icntl, keep, comm, myid, nprocs, info, gcomp_dist, gcomp)
subroutine mumps_ab_free_gcomp(gcomp)
subroutine mumps_ab_coord_to_lmat(myid, nblk, ndof, nnz, irn, jcn, dof2block, iflag, ierror, lp, lpok, lmat)
subroutine mumps_ab_dcoord_to_dcompg(myid, nprocs, comm, nblk, ndof, nnz, irn, jcn, dof2block, icntl, info, keep, lumat, gcomp, ready_for_ana_f)
subroutine mumps_ab_free_lmat(lmat)
subroutine mumps_propinfo(icntl, info, comm, id)
end diagonal values have been computed in the(sparse) matrix id.SOL
subroutine mpi_allreduce(sendbuf, recvbuf, cnt, datatype, operation, comm, ierr)
subroutine mpi_bcast(buffer, cnt, datatype, root, comm, ierr)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine mumps_i8realloc(array, minsize, info, lp, force, copy, string, memcnt, errcode)
subroutine, public mumps_end_arch_cv()
subroutine, public mumps_init_arch_parameters(total_comm, working_comm, keep69, par, nbslaves, mem_distrib, informerr)
subroutine, public mumps_return_candidates(par2_nodes, cand, istat)
subroutine zmumps_ana_f(n, nz8, irn, icn, liwalloc, ikeep1, ikeep2, ikeep3, iord, nfsiz, fils, frere, listvar_schur, size_schur, icntl, info, keep, keep8, nslaves, piv, cntl4, colsca, rowsca, norig_arg, sizeofblocks, gcomp_provided_in, gcomp)
subroutine zmumps_ana_o(n, nz, mtrans, perm, ikeepalloc, idirn, idjcn, ida, idrowsca, idcolsca, work2, keep, icntl, info, infog)
subroutine, public zmumps_free_l0_omp_factors(id_l0_omp_factors)
integer, dimension(:), pointer, save, private my_nb_leaf
integer, dimension(:), pointer, save, private my_first_leaf
subroutine zmumps_ana_r(n, fils, frere, nstk, na)
subroutine zmumps_set_procnode(inode, procnode, value, fils, n)
subroutine zmumps_dist_avoid_copies(n, nslaves, icntl, infog, ne, nfsiz, frere, fils, keep, keep8, procnode, ssarbr, nbsa, peak, ierr, sizeofblocks, lsizeofblocks)
subroutine zmumps_eltproc(n, nelt, eltproc, slavef, procnode, keep)
subroutine zmumps_frtelt(n, nelt, nelnod, frere, fils, na, ne, xnodel, nodel, frtptr, frtelt, eltnod)
subroutine zmumps_ana_f_elt(n, nelt, eltptr, eltvar, liw, ikeep, iord, nfsiz, fils, frere, listvar_schur, size_schur, icntl, info, keep, keep8, nslaves, xnodel, nodel)
subroutine zmumps_dump_problem(id)
subroutine zmumps_gather_matrix(id)
subroutine zmumps_ana_check_keep(id, i_am_slave)
subroutine zmumps_free_onentry_ana_driver(id)
subroutine zmumps_ana_driver(id)
subroutine zmumps_free_id_data_modules(id_fdm_f_encoding, id_blrarray_encoding, keep8, k34)