32 include
'mumps_tags.h'
34 parameter( master = 0 )
46 TYPE(zmumps_struc),
TARGET :: id
57 INTEGER :: STATUS(MPI_STATUS_SIZE)
58 INTEGER LOCAL_M, LOCAL_N
63 LOGICAL PROK, PROKG, LISTVAR_SCHUR_2BE_FREED, LPOK
64 INTEGER SIZE_SCHUR_PASSED
66 INTEGER SBUF_SEND_LR, SBUF_REC_LR
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
74 INTEGER(8) MAX_SIZE_FACTOR_TMP
75 INTEGER LEAF, INODE, ISTEP, INN, LPTRAR
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, PEAK_ABOVE_L0
85 INTEGER(8) :: SUM_NRLADU, MAX_NRLADU, MIN_NRLADU,
86 & SUM_NRLADU_if_LR_LU,
87 & SUM_NRLADULR_UD, SUM_NRLADULR_WC,
88 & SUM_NRLNEC, SUM_NRLNEC_ACTIVE,
90 INTEGER :: SUM_NIRADU,
92 & SUM_NIRNEC, SUM_NIRNEC_OOC
93 INTEGER :: LIPOOL_local
94 INTEGER(8) :: MAX_FRONT_SURFACE_LOCAL_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
102 DOUBLE PRECISION :: PEAK
103 INTEGER(8):: SIZECB_UNDER_L0, SIZECB_UNDER_L0_IF_LRCB
108 INTEGER,
ALLOCATABLE,
DIMENSION(:):: IPOOL
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
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
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
135 INTEGER(8) :: K8_33relaxed, K8_34relaxed, K8_35relaxed,
138 INTEGER MUMPS_TYPENODE, MUMPS_PROCNODE
139 EXTERNAL mumps_typenode, mumps_procnode
140 INTEGER,
EXTERNAL :: MUMPS_ENCODE_TPN_IPROC
141 INTEGER :: PROCNODE_VALUE
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 :: DEPTH_FIRST_SEQ
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
165 INTEGER,
TARGET,
DIMENSION(:),
allocatable:: SIZEOFBLOCKS
166 INTEGER,
DIMENSION(:),
allocatable:: DOF2BLOCK
168 INTEGER(8) :: NSEND8, NLOCAL8
183 TYPE(
lmatrix_t) :: LMAT_BLOCK, LUMAT, LUMAT_REMAP
184 LOGICAL :: GCOMP_PROVIDED
188 INTEGER,
POINTER,
DIMENSION(:) ::
191 & FREREPTR, NE_STEPSPTR,
193 & STEPPTR, LRGROUPSPTR
194 INTEGER,
ALLOCATABLE,
DIMENSION(:),
TARGET :: IKEEPALLOC
195 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: WORK2ALLOC
197 INTEGER :: locMYID, locMYID_NODES
198 LOGICAL,
POINTER :: locI_AM_CAND(:)
199 INTEGER(kind=8) :: NZ8, LIW8
206 LOGICAL :: GATHER_MATRIX_ALLOCATED
211 TYPE (ZMUMPS_STRUC),
TARGET :: id
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) ::
222 CHARACTER,
DIMENSION(:),
POINTER :: id_BLRARRAY_ENCODING
223 CHARACTER,
DIMENSION(:),
POINTER :: id_FDM_F_ENCODING
225 INTEGER(8),
intent(inout) :: KEEP8(150)
226 INTEGER,
intent(in) :: K34
236 is_build_load_mem_called=.false.
245 leltvar => id%LELTVAR
248 print_maxavg = .NOT.(id%NSLAVES.EQ.1 .AND. keep(46).EQ.1)
251 print_nodeinfo = print_maxavg .AND. id%NPROCS .NE. id%KEEP(412)
252 gather_matrix_allocated = .false.
255 & frereptr, ne_stepsptr,
256 & ikeep1, ikeep2, ikeep3, stepptr, lrgroupsptr,
257 & ssarbr, sizeofblocks_ptr, irn_loc_ptr, jcn_loc_ptr,
260 IF (
associated(id%UNS_PERM))
DEALLOCATE(id%UNS_PERM)
267 gcomp_provided = .false.
268 blkptr_allocated = .false.
269 blkvar_allocated = .false.
275 i_am_slave = ( id%MYID .ne. master .OR.
276 & ( id%MYID .eq. master .AND.
277 & id%KEEP(46) .eq. 1 ) )
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 )
286 prokg = (prokg.AND.(icntl(4).GE.2))
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'
295 &
'L D L^T Solver for general symmetric matrices'
297 IF ( keep(46) .eq. 1 )
THEN
298 WRITE(mp,
'(A)')
'Type of parallelism: Working host'
300 WRITE(mp, '(a)
') 'Type of parallelism: host not working
'
303.AND..NE.
IF ( PROKG (MPMPG)) THEN
304.eq.
IF ( KEEP(50) 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'
311 &
'L D L^T Solver for general symmetric matrices'
313 IF ( keep(46) .eq. 1 )
THEN
314 WRITE(mpg,
'(A)')
'Type of parallelism: Working host'
316 WRITE(mpg,
'(A)')
'Type of parallelism: Host not working'
319 IF (prok)
WRITE( mp, 110 )
320 IF (prokg .AND. (mpg.NE.mp))
WRITE( mpg, 110 )
329 IF (id%KEEP8(24).EQ.0_8)
THEN
331 IF (
associated(id%S))
THEN
338 IF (
associated(id%IS))
THEN
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)
351 IF (
associated(id%root%RG2L_COL))
THEN
352 DEALLOCATE(id%root%RG2L_COL)
353 NULLIFY(id%root%RG2L_COL)
355 IF (
associated( id%PTLUST_S ))
THEN
356 DEALLOCATE(id%PTLUST_S)
359 IF (
associated(id%PTRFAC))
THEN
360 DEALLOCATE(id%PTRFAC)
363 IF (
associated(id%RHSCOMP))
THEN
364 DEALLOCATE(id%RHSCOMP)
368 IF (
associated(id%POSINRHSCOMP_ROW))
THEN
369 DEALLOCATE(id%POSINRHSCOMP_ROW)
370 NULLIFY(id%POSINRHSCOMP_ROW)
372 IF (id%POSINRHSCOMP_COL_ALLOC)
THEN
373 DEALLOCATE(id%POSINRHSCOMP_COL)
374 NULLIFY(id%POSINRHSCOMP_COL)
375 id%POSINRHSCOMP_COL_ALLOC = .false.
383 IF (
associated(id%Step2node))
THEN
384 DEALLOCATE(id%Step2node)
385 NULLIFY(id%Step2node)
387 IF (
associated(id%IPOOL_B_L0_OMP))
THEN
388 DEALLOCATE(id%IPOOL_B_L0_OMP)
389 NULLIFY(id%IPOOL_B_L0_OMP)
391 IF (
associated(id%IPOOL_A_L0_OMP))
THEN
392 DEALLOCATE(id%IPOOL_A_L0_OMP)
393 NULLIFY(id%IPOOL_A_L0_OMP)
395 IF (
associated(id%PHYS_L0_OMP))
THEN
396 DEALLOCATE(id%PHYS_L0_OMP)
397 NULLIFY(id%PHYS_L0_OMP)
399 IF (
associated(id%VIRT_L0_OMP))
THEN
400 DEALLOCATE(id%VIRT_L0_OMP)
401 NULLIFY(id%VIRT_L0_OMP)
403 IF (
associated(id%VIRT_L0_OMP_MAPPING))
THEN
404 DEALLOCATE(id%VIRT_L0_OMP_MAPPING)
405 NULLIFY(id%VIRT_L0_OMP_MAPPING)
407 IF (
associated(id%PERM_L0_OMP))
THEN
408 DEALLOCATE(id%PERM_L0_OMP)
409 NULLIFY(id%PERM_L0_OMP)
411 IF (
associated(id%PTR_LEAFS_L0_OMP))
THEN
412 DEALLOCATE(id%PTR_LEAFS_L0_OMP )
413 NULLIFY(id%PTR_LEAFS_L0_OMP)
415 IF (
associated(id%I4_L0_OMP))
THEN
416 DEALLOCATE(id%I4_L0_OMP)
417 NULLIFY(id%I4_L0_OMP)
419 IF (
associated(id%I8_L0_OMP))
THEN
420 DEALLOCATE(id%I8_L0_OMP)
421 NULLIFY(id%I8_L0_OMP)
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
430 IF (
associated(id%L0_OMP_MAPPING))
THEN
431 DEALLOCATE(id%L0_OMP_MAPPING)
432 NULLIFY(id%L0_OMP_MAPPING)
434 IF (
associated(id%L0_OMP_FACTORS))
THEN
446 IF ( info(1) .LT. 0 )
GOTO 500
451 CALL mpi_bcast( keep(60), 1, mpi_integer, master, id%COMM, ierr )
453 IF (id%KEEP(60) .NE. 0 )
THEN
454 CALL mpi_bcast( keep(116), 1, mpi_integer, master,
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 )
476 CALL mpi_bcast( keep(54), 2, mpi_integer, master, id%COMM, ierr )
481 CALL mpi_bcast( keep(69), 1, mpi_integer, master, id%COMM, ierr )
485 CALL mpi_bcast( keep(201), 1, mpi_integer, master, id%COMM, ierr )
489 CALL mpi_bcast( keep(244), 1, mpi_integer, master, id%COMM, ierr )
493 CALL mpi_bcast( keep(251), 3, mpi_integer,master,id%COMM,ierr)
495 CALL mpi_bcast( keep(400), 1, mpi_integer,master,id%COMM,ierr)
496 CALL mpi_bcast( id%KEEP(490), 5, mpi_integer, master,
501 CALL mpi_bcast( id%N, 1, mpi_integer, master, id%COMM, ierr )
505 IF ( keep(55) .EQ. 0)
THEN
506 IF ( keep(54) .eq. 3 )
THEN
510 & mpi_sum, id%COMM, ierr )
513 CALL mpi_bcast( id%KEEP8(28), 1, mpi_integer8, master,
518 CALL mpi_bcast( id%KEEP8(30), 1, mpi_integer8, master,
521 IF( id%KEEP(54).EQ.3)
THEN
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)) )
531 IF (
associated(id%MEM_DIST) )
THEN
532 DEALLOCATE( id%MEM_DIST )
534 allocate( id%MEM_DIST( 0:id%NSLAVES-1 ), stat=ierr )
535 IF ( ierr .GT. 0 )
THEN
539 WRITE(lp, 150)
'MEM_DIST'
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)
554 IF ( id%INFO(1) .LT. 0 )
GOTO 500
558 IF ( id%MYID .EQ. master )
THEN
559 IF (keep(13).NE.0)
THEN
563 IF (.NOT.
associated(id%BLKVAR))
THEN
567 IF (
size(id%BLKVAR).EQ.id%N)
THEN
575 &
" ERROR with centralized matrix. Size of id%BLKVAR ",
576 &
"should be equal to id%N instead of ",
583 IF (keep(13).GE.1)
THEN
586 IF ( .NOT.
associated(id%BLKPTR))
THEN
589 &
" id%BLKPTR should be provided by user on host "
594 IF ( (id%NBLK.LE.0).OR.(id%NBLK.GT.id%N)
595 & .OR. (id%NBLK+1.NE.
size(id%BLKPTR))
599 &
" ERROR incorrect value of id%NBLK:", id%NBLK
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
615 IF (id%BLKPTR(1).NE.1)
THEN
618 &
" ERROR id%BLKPTR(1)",
619 &
"should be equal to 1 instead of ",
625 ELSE IF (keep(13).LT.0)
THEN
628 nblk = id%N/(-keep(13))
636 IF ( id%INFO(1) .LT. 0 )
GOTO 500
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 )
643 IF (keep(13).NE.0)
THEN
646 IF ( ( (keep(54).NE.3).AND.(id%MYID.EQ.master) )
647 & .OR. (keep(54).EQ.3) )
THEN
651 IF (
allocated(sizeofblocks))
DEALLOCATE(sizeofblocks)
652 IF (
allocated(dof2block))
DEALLOCATE(dof2block)
653 allocate(sizeofblocks(nblk), dof2block(id%N),
656 IF (allocok.NE.0)
THEN
658 id%INFO( 2 ) = id%N+nblk
659 IF ( lpok )
WRITE(lp, 150)
' SIZEOFBLOCKS, DOF2BLOCK'
662 IF (id%MYID.EQ.master.AND.allocok.EQ.0)
THEN
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.
672 IF ( lpok )
WRITE(lp, 150)
' id%BLKPTR '
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 '
689 IF (info(1).LT.0)
GOTO 500
690 IF ( id%MYID .EQ. master )
THEN
697 IF (blkvar_allocated)
THEN
703 IF (blkptr_allocated)
THEN
706 DO i=1, id%N, blksize
710 id%BLKPTR(nblk+1) = id%N+1
714 & nblk, id%N, id%BLKPTR(1), id%BLKVAR(1),
715 & sizeofblocks, dof2block)
718 IF (keep(54).NE.3)
THEN
725 IF (id%MYID.EQ.master)
THEN
728 IF (id%KEEP8(28) .EQ. 0_8)
THEN
729 irn_ptr => idummy_array
730 jcn_ptr => idummy_array
738 & info(1), info(2), lp, lpok,
743 IF ( info(1) .LT. 0 )
GOTO 500
745 IF (id%MYID.EQ.master)
THEN
752 gcomp_provided = .true.
753 IF (keep(494).EQ.0)
THEN
759 IF ( info(1) .LT. 0 )
GOTO 500
769 IF (.NOT. i_am_slave .OR.
770 & id%KEEP8(29) .EQ. 0_8)
THEN
772 irn_loc_ptr => idummy_array
773 jcn_loc_ptr => idummy_array
776 irn_loc_ptr => id%IRN_loc
777 jcn_loc_ptr => id%JCN_loc
784 IF (id%NPROCS.EQ.1)
THEN
786 ready_for_ana_f = .true.
788 & id%MYID, id%NPROCS, id%COMM,
791 & irn_loc_ptr(1), jcn_loc_ptr(1),
793 & id%ICNTL(1), id%INFO(1), id%KEEP(1),
794 & lumat, gcomp, ready_for_ana_f)
795 gcomp_provided = .true.
797 ready_for_ana_f = .false.
799 & id%MYID, id%NPROCS, id%COMM,
802 & irn_loc_ptr(1), jcn_loc_ptr(1),
804 & id%ICNTL(1), id%INFO(1), id%KEEP(1),
805 & lumat, gcomp_dist, ready_for_ana_f)
816 IF (
allocated(dof2block))
THEN
818 IF ( (id%MYID.EQ.master).AND. (keep(256) .NE. 1))
THEN
819 DEALLOCATE(dof2block)
829 IF ( (keep(244).EQ.1) .AND. (keep(54) .eq. 3) )
THEN
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,
842 gcomp_provided = .true.
848 gather_matrix_allocated = .true.
852 IF ( info(1) .LT. 0 )
GOTO 500
855 IF (keep(244) .EQ. 1)
THEN
857 IF ( id%MYID .eq. master )
THEN
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
869 &
'PB allocating an array of size 1 for Schur!! '
874 size_schur_passed=id%SIZE_SCHUR
875 listvar_schur_2be_freed = .false.
883 IF ((id%MYID.EQ.master).AND.(keep(244) .EQ. 1)
884 & .AND. (id%N.EQ.nblk)
887 IF ((keep(50).NE.1).AND.
888 & .NOT.((keep(23).EQ.7).AND.keep(50).EQ.0)
895 IF ( ( keep(23) .NE. 0 ) .OR.
899 & keep(52) .EQ. -2 )
THEN
911 ALLOCATE(id%UNS_PERM(id%N),ikeepalloc(3*id%N),
912 & work2alloc(id%N), stat=ierr)
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
924 IF (
associated( id%UNS_PERM
925 &
DEALLOCATE(id%UNS_PERM)
929 IF (keep(23).EQ.0.AND.(keep(95).EQ.1))
THEN
930 IF (
allocated(ikeepalloc))
DEALLOCATE(ikeepalloc)
933 IF (info(1) .LT. 0)
THEN
949 IF ( info(1) < 0 )
GOTO
951 IF ( keep(244) .EQ. 1)
THEN
953 IF (id%MYID.EQ.master)
THEN
958 IF (
allocated(ikeepalloc))
THEN
959 ALLOCATE( filsptr(nblk), frereptr(nblk),
960 & nfsizptr(nblk), stat=ierr)
966 ALLOCATE(ikeepalloc(nblk+2*id%N),
967 & filsptr(nblk), frereptr(nblk),
968 & nfsizptr(nblk), stat=ierr)
971 info(2)=4*nblk+2*id%N
976 IF ( info(1) < 0 )
GOTO 500
979 IF (keep(244) .EQ. 1)
THEN
981 IF ( id%MYID .eq. master )
THEN
990 IF (keep(55) .EQ. 0)
THEN
1009 IF (keep(13).NE.0)
THEN
1013 IF (nz8.EQ.0_8)
THEN
1016 liw8 = 2_8 * nz8 + int(nblk,8) + 1_8
1024#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
1025 cond = (keep(60) .NE. 0) .OR. (keep(256) .EQ. 5)
1027 cond = (keep(60) .NE. 0)
1035 liw_elt = id%N + id%N + 1
1038 liw_elt = id%N + id%N + id%N + 3 + id%N + 1
1044 IF (keep(55) .EQ. 0)
THEN
1045 IF (liw8.LT.3_8*int(nblk,8)) liw8 = 3_8*int(nblk,8)
1047 IF (liw_elt.LT.3*id%N) liw_elt = 3*id%N
1050 IF ( keep(256) .EQ. 1 )
THEN
1055 ikeep2 => ikeepalloc(nblk+1:nblk+id%N)
1061 IF ( id%PERM_IN(i) .LT.1 .OR.
1062 & id%PERM_IN(i) .GT. id%N )
THEN
1067 ELSE IF ( ikeep2(id%PERM_IN(i)) .NE. 0 )
THEN
1074 ikeep2(id%PERM_IN( i )) = i
1077 IF ((keep(55) .EQ. 0).AND.(keep(13).NE.0)
1078 & .AND.(keep(13).NE.-1)
1085 DO WHILE (ipos.LE.id%N)
1088 ibcurrent = dof2block(i)
1089 blksize = sizeofblocks(ibcurrent)
1090 ikeepalloc(ibcurrent) = iposb
1091 IF (blksize.GT.1)
THEN
1092 DO ii = 1, blksize-1
1096 IF (ib.NE.ibcurrent)
THEN
1107 IF (iposb.NE.nblk)
THEN
1115 ikeepalloc( i ) = id%PERM_IN( i )
1118 IF (
allocated(dof2block))
DEALLOCATE(dof2block)
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)
1131 IF (
associated(id%UNS_PERM))
THEN
1132 uns_perm_ptr => id%UNS_PERM
1134 uns_perm_ptr => idummy_array
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,
1145 & id%CNTL(4), id%COLSCA, id%ROWSCA
1146#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
1147 & , id%METIS_OPTIONS(1)
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,
1161 & id%CNTL(4), id%COLSCA, id%ROWSCA
1162#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
1163 & , id%METIS_OPTIONS(1)
1165 & , id%N, sizeofblocks, gcomp_provided, gcomp
1170 infog(7) = keep(256)
1173 NULLIFY(uns_perm_ptr)
1175 allocate( xnodel( id%N+1 ), stat = ierr )
1176 IF ( ierr .GT. 0 )
THEN
1178 info( 2 ) = id%N + 1
1180 WRITE(lp, 150)
'XNODEL'
1184 IF (leltvar.ne.id%ELTPTR(nelt+1)-1)
THEN
1187 info(2) = id%ELTPTR(nelt+1)-1
1190 allocate( nodel( leltvar ), stat = ierr )
1191 IF ( ierr .GT. 0 )
THEN
1195 WRITE(lp, 150)
'NODEL'
1200 & id%ELTPTR(1), id%ELTVAR(1), liw_elt,
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)
1219 IF ( listvar_schur_2be_freed )
THEN
1222 DEALLOCATE( id%LISTVAR_SCHUR )
1223 NULLIFY ( id%LISTVAR_SCHUR )
1224 listvar_schur_2be_freed = .true.
1236 ne = ikeep + 2 * id%N
1243 IF (keep(244).EQ.1)
THEN
1245 IF ( info(1) < 0 )
GOTO 500
1247 IF ((keep(244).EQ.1).AND.(keep(55).EQ.0))
THEN
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
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
1263 IF (
associated(frereptr) )
THEN
1264 DEALLOCATE(frereptr)
1267 IF (
associated(nfsizptr) )
THEN
1268 DEALLOCATE(nfsizptr)
1275 IF (id%MYID.EQ.master)
THEN
1276 IF ((keep(244).EQ.1).AND. (keep(55).EQ.0))
THEN
1278 IF ((keep(54).EQ.3).AND.keep(494).EQ.0)
THEN
1279 IF (gather_matrix_allocated)
THEN
1280 IF (
associated(id%IRN))
THEN
1284 IF (
associated(id%JCN))
THEN
1288 gather_matrix_allocated= .false.
1293 IF (keep(244).NE.1)
THEN
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),
1305 ALLOCATE(ikeepalloc(3*id%N),work2alloc(4*id%N), stat=ierr )
1309 IF (id%MYID .EQ. master)
THEN
1316 IF ( info(1) < 0 )
GOTO 500
1323 DEALLOCATE(work2alloc)
1324 IF(id%MYID .NE. master)
THEN
1325 DEALLOCATE(ikeepalloc)
1330 IF (id%MYID.EQ.master)
THEN
1332 allocate(procnode(nblk), stat=allocok)
1333 IF (allocok .ne. 0)
THEN
1339 IF ( info(1) < 0 )
GOTO 500
1340 IF(id%MYID .EQ. master)
THEN
1343 & keep(50),keep(54),icntl(6),keep(52))
1345 & ikeepalloc(ne), ikeepalloc(na))
1356 IF (id%NSLAVES .EQ. 1
1359 IF ( (id%KEEP(60).EQ.0).
1360 & and.(id%KEEP(53).EQ.0))
THEN
1373 procnode_value = mumps_encode_tpn_iproc(0, 0, keep(199))
1375 procnode(i) = procnode_value
1381 IF (id%KEEP(60) .EQ. 2 .OR. id%KEEP(60).EQ.3)
THEN
1382 procnode_value = mumps_encode_tpn_iproc(3, 0, keep(199))
1384 & procnode_value, filsptr(1), nblk)
1397 peak = dble(id%INFOG(5))*dble(id%INFOG(5)) +
1398 & dble(id%KEEP(2))*dble(id%KEEP(2))
1401 ssarbr => ikeepalloc(ikeep:ikeep+nblk-1)
1405 IF ((keep(13).NE.0).AND.(nblk.NE.id%N))
THEN
1406 sizeofblocks_ptr => sizeofblocks(1:nblk)
1407 lsizeofblocks_ptr = nblk
1409 sizeofblocks_ptr => idummy_array
1410 lsizeofblocks_ptr = 1
1411 idummy_array(1) = -1
1414 & nblk,id%NSLAVES,icntl(1),
1420 & keep(1),keep8(1),procnode(1),
1421 & ssarbr(1),id%NBSA,peak,ierr
1422 & , sizeofblocks_ptr(1), lsizeofblocks_ptr
1425 if(ierr.eq.-999)
then
1426 write(6,*)
' Internal error during static mapping '
1436 & frereptr(1), ikeepalloc(ne),
1442 IF ( info(1) < 0 )
GOTO 500
1444 CALL mpi_bcast( id%NELT, 1, mpi_integer, master,
1446 IF (keep(55) .EQ. 0)
THEN
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'
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
1490 & id%N, nelt, id%ELTPTR(nelt+1)-1, frereptr(1),
1492 & ikeepalloc(na), ikeepalloc(ne), xnodel,
1493 & nodel, id%FRTPTR(1), id%FRTELT(1), id%ELTPROC(1))
1496 id%PTRAR(id%NELT+i+1)=int(id%ELTPTR(i),8)
1501 CALL mpi_bcast( id%PTRAR(id%NELT+2), id%NELT+1, mpi_integer8,
1502 & master, id%COMM, ierr )
1503 CALL mpi_bcast( id%FRTPTR(1), id%N+1, mpi_integer,
1504 & master, id%COMM, ierr )
1505 CALL mpi_bcast( id%FRTELT(1), id%NELT, mpi_integer,
1506 & master, id%COMM, ierr )
1509 IF ( info(1) < 0 )
GOTO 500
1511 IF(id%MYID .EQ. master)
THEN
1512 IF ( info( 1 ) .LT. 0 )
GOTO 12
1513 IF ( keep(55) .ne. 0 )
THEN
1521 & procnode(1), id%KEEP(1))
1524 IF ( nb_niv2.GT.0 )
THEN
1526 allocate(par2_nodes(nb_niv2),
1528 IF (allocok .GT.0)
then
1532 WRITE(lp, 150)
'PAR2_NODES'
1537 IF ((nb_niv2.GT.0) .AND. (keep(24).EQ.0))
THEN
1539 DO 777 inode = 1, nblk
1540 IF ( ( frereptr(inode) .NE. nblk ) .AND.
1541 & ( mumps_typenode(procnode(inode),id%KEEP(199))
1544 par2_nodes(iniv2) = inode
1547 IF ( iniv2 .NE. nb_niv2 )
THEN
1548 WRITE(*,*)
"Internal Error 2 in ZMUMPS_ANA_DRIVER",
1553 IF ( (keep(24) .NE. 0) .AND. (nb_niv2.GT.0) )
THEN
1556 IF (
associated(id%CANDIDATES))
DEALLOCATE(id%CANDIDATES)
1557 allocate( id%CANDIDATES(id%NSLAVES+1,nb_niv2),
1559 if (allocok .gt.0)
then
1561 info(2)= nb_niv2*(id%NSLAVES+1)
1563 WRITE(lp, 150)
'CANDIDATES'
1568 & (par2_nodes,id%CANDIDATES,
1581 IF (
associated(id%CANDIDATES))
DEALLOCATE(id%CANDIDATES)
1582 allocate(id%CANDIDATES(1,1), stat=allocok)
1583 IF (allocok .NE. 0)
THEN
1587 WRITE(lp, 150)
'CANDIDATES'
1603 IF ( info(1) < 0 )
GOTO 500
1609 CALL mpi_bcast( id%KEEP8(101), 1, mpi_integer8, master,
1616 CALL mpi_bcast( id%KEEP(1), 110, mpi_integer, master,
1619 CALL mpi_bcast( id%KEEP8(21), 1, mpi_integer8, master,
1625 CALL mpi_bcast( id%KEEP(205), 1, mpi_integer, master,
1629 CALL mpi_bcast( id%NBSA, 1, mpi_integer, master,
1636 IF (id%MYID==master) keep(127)=infog(5)
1637 CALL mpi_bcast( id%KEEP(127), 1, mpi_integer, master,
1641 CALL mpi_bcast( id%KEEP(226), 1, mpi_integer, master,
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,
1656 CALL mpi_bcast( id%KEEP(262), 2, mpi_integer, master,
1661 IF (id%MYID.EQ.master)
THEN
1665 CALL mumps_realloc(id%STEP, nblk, id%INFO, lp, force=.true.,
1666 & string=
'id%STEP (Analysis)', errcode=-7)
1670 CALL mumps_realloc(id%STEP, id%N, id%INFO, lp, force=.true.,
1671 & string=
'id%STEP (Analysis)', errcode=-7)
1673 IF(info(1).LT.0)
GOTO 94
1674 CALL mumps_realloc(id%PROCNODE_STEPS, id%KEEP(28), id%INFO, lp,
1676 & string=
'id%PROCNODE_STEPS (Analysis)', errcode=-7)
1677 IF(info(1).LT.0)
GOTO 94
1680 & string=
'id%NE_STEPS (Analysis)', errcode=-7)
1681 IF(info(1).LT.0)
GOTO 94
1684 & string=
'id%ND_STEPS (Analysis)', errcode=-7)
1685 IF(info(1).LT.0)
GOTO 94
1686 CALL mumps_realloc(id%FRERE_STEPS, id%KEEP(28), id%INFO, lp,
1688 & string=
'id%FRERE_STEPS (Analysis)', errcode=-7)
1689 IF(info(1).LT.0)
GOTO 94
1692 & string=
'id%DAD_STEPS (Analysis)', errcode=-7)
1693 IF(info(1).LT.0)
GOTO 94
1695 IF (keep(55) .EQ. 0)
THEN
1698 & force=.true., string=
'id%PTRAR (Analysis)', errcode=-7)
1699 IF(info(1).LT.0)
GOTO 94
1701 IF (id%MYID.EQ.master)
THEN
1704 & ,string=
'id%LRGROUPS (Analysis)', errcode=-7)
1708 & ,string=
'id%LRGROUPS (Analysis)', errcode=-7)
1710 IF(info(1).LT.0)
GOTO 94
1716 IF ( id%MYID .NE. master .OR. id%KEEP(23) .EQ. 0 )
THEN
1717 IF (
associated( id%UNS_PERM ) )
THEN
1718 DEALLOCATE(id%UNS_PERM)
1723 & id%COMM, id%MYID )
1724 IF ( id%MYID .EQ. master )
THEN
1731 ELSE IF (ikeepalloc(na+nblk-1) .LT.0)
THEN
1734 ELSE IF (ikeepalloc(na+nblk-2) .LT.0)
THEN
1736 nbroot = ikeepalloc(na+nblk-1)
1738 nbleaf = ikeepalloc(na+nblk-2)
1739 nbroot = ikeepalloc(na+nblk-1)
1741 id%LNA = 2+nbleaf+nbroot
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)
1748 & id%COMM, id%MYID )
1749 IF ( info(1).LT.0 )
GOTO 500
1750 IF (id%MYID .EQ.master )
THEN
1761 IF ( nblk == 1 )
THEN
1764 ELSE IF (ikeepalloc(na+nblk-1) < 0)
THEN
1765 id%NA(leaf) = - ikeepalloc(na+nblk-1)-1
1767 DO i = 1, nbleaf - 1
1768 id%NA(leaf) = ikeepalloc(na+i-1)
1771 ELSE IF (ikeepalloc(na+nblk-2) < 0 )
THEN
1772 inode = - ikeepalloc(na+nblk-2) - 1
1775 IF ( nbleaf > 1 )
THEN
1776 DO i = 1, nbleaf - 1
1777 id%NA(leaf) = ikeepalloc(na+i-1)
1783 id%NA(leaf) = ikeepalloc(na+i-1)
1794 IF ( frereptr(i) .ne. nblk + 1 )
THEN
1802 DO WHILE ( inn .GT. 0 )
1803 id%STEP(inn) = - istep
1806 IF (frereptr(i) .eq. 0)
THEN
1813 IF ( leaf - 1 .NE. 2+nbroot + nbleaf )
THEN
1814 WRITE(*,*)
'Internal error 2 in ZMUMPS_ANA_DRIVER'
1817 IF ( istep .NE. id%KEEP(28) )
THEN
1818 write(*,*)
'Internal error 3 in ZMUMPS_ANA_DRIVER',
1819 & istep, id%KEEP(28)
1827 IF (frereptr(i) .NE. 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)
1843 IF ( id%STEP(i) .LE. 0) cycle
1845 IF (frereptr(i) .eq. 0)
THEN
1847 id%DAD_STEPS(id%STEP(i)) = 0
1851 DO WHILE ( ifs .GT. 0 )
1859 id%DAD_STEPS(id%STEP(ifs)) = i
1867 IF (
allocated(procnode))
DEALLOCATE(procnode)
1868 IF (
allocated(ikeepalloc))
DEALLOCATE(ikeepalloc)
1869 IF (
associated(frereptr))
DEALLOCATE(frereptr)
1871 IF (
associated(nfsizptr))
DEALLOCATE(nfsizptr)
1874 IF (keep(494).NE.0)
THEN
1876 IF (id%MYID.EQ.master)
THEN
1887 IF ((keep(54).EQ.3).AND.(keep(13).NE.0))
THEN
1890 ALLOCATE(mapcol(id%KEEP(28)), stat=allocok)
1891 IF (allocok .ne.0)
then
1893 info(2)= id%KEEP(28)
1897 & id%COMM, id%MYID )
1898 IF ( info(1).LT.0 )
GOTO 500
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))
1905 IF ( id%INFO(1).LT.0 )
GOTO 500
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
1917 CALL mpi_bcast( sizeofblocks, nblk, mpi_integer, master,
1920 ELSE IF ((keep(54).NE.3).AND.(keep(13).NE.0)
1921 & .AND. (keep(487).EQ.1) )
THEN
1924 IF (id%MYID.EQ.master)
THEN
1926 & lmat_block, lumat_remap,
1927 & info(1), icntl(1))
1933 & id%COMM, id%MYID )
1934 IF ( info(1).LT.0 )
GOTO 500
1936 ELSE IF ((keep(54).EQ.3).AND.(keep(13).EQ.0)
1937 & .AND. keep(487).EQ.1)
THEN
1945 IF (gather_matrix_allocated)
THEN
1946 IF (
associated(id%IRN))
THEN
1950 IF (
associated(id%JCN))
THEN
1954 gather_matrix_allocated= .false.
1956 IF (.NOT. i_am_slave .OR.
1957 & id%KEEP8(29) .EQ. 0_8)
THEN
1959 irn_loc_ptr => idummy_array
1960 jcn_loc_ptr => idummy_array
1962 irn_loc_ptr => id%IRN_loc
1963 jcn_loc_ptr => id%JCN_loc
1965 ALLOCATE(mapcol(id%KEEP(28)), stat=allocok)
1966 IF (allocok .ne.0)
then
1968 info(2)= id%KEEP(28)
1972 & id%COMM, id%MYID )
1973 IF ( info(1).LT.0 )
GOTO 500
1978 & id%MYID, id%NPROCS, id%COMM,
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 IF (info(1).GE.0)
THEN
1987 ALLOCATE(sizeofblocks(nblk), stat=allocok)
1988 IF (allocok .ne.0)
then
1998 & id%COMM, id%MYID )
1999 IF ( info(1).LT.0 )
GOTO 500
2000 ELSE IF ((keep(54).EQ.3) .AND. (keep(244).EQ.2)
2001 & .AND. (keep(487).NE.1)
2009 gather_matrix_allocated = .true.
2015 IF ((keep(54).EQ.3).AND.(keep(487).EQ.1))
THEN
2018 IF (id%MYID.NE.master)
THEN
2019 ALLOCATE(filsptr(nblk), stat=ierr)
2027 & id%COMM, id%MYID )
2028 IF ( info(1).LT.0 )
GOTO 500
2033 & mapcol, id%KEEP(28),
2034 & id%KEEP(28), lumat_remap, filsptr,
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 IF (id%MYID.NE.master)
THEN
2051 ELSE IF (id%MYID.EQ.master)
THEN
2052 IF ((keep(54).NE.3).AND.(keep(13).NE.0)
2053 & .AND. (keep(487).EQ.1) )
THEN
2059 idummy_array(1) = -1
2062 & id%KEEP(28), lumat_remap, filsptr,
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)
2075 IF (keep(469).EQ.0)
THEN
2078 & id%JCN, filsptr, id%FRERE_STEPS,
2079 & id%DAD_STEPS, id%NE_STEPS, id%STEP, id%NA,
2080 & id%LNA, id%LRGROUPS,
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)
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)
2105 CALL mpi_bcast( keep(142), 1, mpi_integer, master,
2112 IF (
allocated(mapcol))
DEALLOCATE(mapcol)
2113 IF (
allocated(sizeofblocks))
DEALLOCATE(sizeofblocks)
2114 IF ( (keep(54).EQ.3) .AND. (keep(244).EQ.2).AND.
2115 & (keep(487).NE.1) )
THEN
2119 IF (gather_matrix_allocated)
THEN
2120 IF (
associated(id%IRN))
THEN
2124 IF (
associated(id%JCN))
THEN
2128 gather_matrix_allocated= .false.
2133 WRITE(mpg,145) timeg
2137 IF (id%MYID.NE. master)
THEN
2138 CALL mumps_realloc(id%FILS, id%N, id%INFO, lp, force=.true.,
2139 & string=
'id%FILS (Analysis)', errcode=-7)
2140 IF(info(1).LT.0)
GOTO 97
2143 IF ((id%MYID.EQ.master) .AND.(keep(13).NE.0))
THEN
2150 IF (nblk.LT.id%N.OR.(.NOT.blkvar_allocated))
THEN
2156 ALLOCATE(stepptr(id%N), lrgroupsptr(id%N), stat=ierr)
2162 IF (nb_niv2.EQ.0)
THEN
2163 idummy_array(1) = -9999
2164 par2_nodesptr => idummy_array(1:1)
2165 size_par2_nodesptr=1
2167 par2_nodesptr => par2_nodes(1:nb_niv2)
2168 size_par2_nodesptr=nb_niv2
2172 & string=
'id%FILS (Analysis)', errcode=-7)
2173 IF(info(1).LT.0)
GOTO 97
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)
2183 NULLIFY(par2_nodesptr)
2187 DEALLOCATE(id%LRGROUPS)
2188 id%LRGROUPS=>lrgroupsptr
2189 NULLIFY(lrgroupsptr)
2193 if (
associated(id%FILS))
DEALLOCATE(id%FILS)
2199 IF ((id%N.EQ.nblk).AND.
associated(filsptr))
THEN
2201 if (
associated(id%FILS))
DEALLOCATE(id%FILS)
2208 & string=
'id%SYM_PERM (Analysis)', errcode=-7)
2210 IF ( info(1) < 0 )
GOTO 500
2211 IF (id%MYID.EQ.master)
THEN
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)
2225 IF(id%KEEP(261).EQ.1)
THEN
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
2236 IF ((id%KEEP(76).GE.4).OR.(id%KEEP(76).GE.6).OR.
2237 & (id%KEEP(47).EQ.4).OR.((id%KEEP(81).GT.0)
2238 & .AND.(id%KEEP(47).GE.2)))
THEN
2239 is_build_load_mem_called=.true.
2240 IF ((id%KEEP(47) .EQ. 4).OR.
2241 & (( id%KEEP(81) .GT. 0).AND.(id%KEEP(47).GE.2)))
THEN
2242 IF(id%NSLAVES.GT.1)
THEN
2246 size_temp_mem = id%NBSA
2249 size_temp_mem = id%NA(2)
2254 IF((id%KEEP(76).EQ.4).OR.(id%KEEP(76).EQ.6))
THEN
2255 size_depth_first=id%KEEP(28)
2259 allocate(temp_mem(size_temp_mem,id%NSLAVES),stat=allocok)
2260 IF (allocok .NE.0)
THEN
2262 info(2)= size_temp_mem*id%NSLAVES
2264 WRITE(lp, 150)
'TEMP_MEM'
2268 allocate(temp_leaf(size_temp_mem,id%NSLAVES),
2270 IF (allocok .ne.0)
then
2272 WRITE(lp, 150)
'TEMP_LEAF'
2275 info(2)= size_temp_mem*id%NSLAVES
2278 allocate(temp_size(size_temp_mem,id%NSLAVES),
2280 IF (allocok .ne.0)
then
2282 WRITE(lp, 150)
'TEMP_SIZE'
2285 info(2)= size_temp_mem*id%NSLAVES
2288 allocate(temp_root(size_temp_mem,id%NSLAVES),
2290 IF (allocok .ne.0)
then
2292 WRITE(lp, 150)
'TEMP_ROOT'
2295 info(2)= size_temp_mem*id%NSLAVES
2298 allocate(depth_first(size_depth_first),stat=allocok)
2299 IF (allocok .ne.0)
then
2301 WRITE(lp, 150)
'DEPTH_FIRST'
2304 info(2)= size_depth_first
2307 ALLOCATE(depth_first_seq(size_depth_first),stat=allocok)
2308 IF (allocok .ne.0)
then
2310 WRITE(lp, 150)
'DEPTH_FIRST_SEQ'
2313 info(2)= size_depth_first
2316 ALLOCATE(sbtr_id(size_depth_first),stat=allocok)
2317 IF (allocok .ne.0)
then
2319 WRITE(lp, 150)
'SBTR_ID'
2322 info(2)= size_depth_first
2325 IF(id%KEEP(76).EQ.5)
THEN
2327 size_cost_trav=id%KEEP(28)
2331 allocate(cost_trav_tmp(size_cost_trav),stat=allocok)
2332 IF (allocok .ne.0)
then
2334 WRITE(lp, 150)
'COST_TRAV_TMP'
2337 info(2)= size_cost_trav
2340 IF(id%KEEP(76).EQ.5)
THEN
2341 IF(id%KEEP(70).EQ.0)
THEN
2344 IF(id%KEEP(70).EQ.1)
THEN
2348 IF(id%KEEP(76).EQ.4)
THEN
2349 IF(id%KEEP(70).EQ.0)
THEN
2352 IF(id%KEEP(70).EQ.1)
THEN
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),
2367 & temp_leaf,temp_size,temp_root,sbtr_id(1)
2371 IF (id%MYID.EQ.master)
THEN
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),
2385 IF ( keep(494).NE.0 .OR. keep(13).NE.0 )
THEN
2389 IF (keep(38) .NE. 0)
THEN
2393 IF (keep(20) .NE. 0)
THEN
2394 CALL mpi_bcast( id%KEEP(20), 1, mpi_integer, master,
2401 & id%COMM, id%MYID )
2402 IF ( info(1).LT.0 )
GOTO 500
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 IF(keep(494).NE.0)
THEN
2429 CALL mpi_bcast( id%LRGROUPS(1), id%N, mpi_integer,
2430 & master, id%COMM, ierr )
2432 IF (keep(55) .EQ. 0)
THEN
2439 IF(id%MYID .EQ. master)
THEN
2445 IF ( (keep(244) .EQ. 1) .AND. (keep(54) .EQ. 3) )
THEN
2447 IF (gather_matrix_allocated)
THEN
2448 IF (
associated(id%IRN))
THEN
2452 IF (
associated(id%JCN))
THEN
2456 gather_matrix_allocated= .false.
2464 IF((id%KEEP(76).EQ.4).OR.(id%KEEP(76).EQ.6))
THEN
2465 IF(
associated(id%DEPTH_FIRST))
THEN
2466 DEALLOCATE(id%DEPTH_FIRST)
2468 allocate(id%DEPTH_FIRST(id%KEEP(28)),stat=allocok)
2469 IF (allocok .ne.0)
then
2471 info(2)= id%KEEP(28)
2473 WRITE(lp, 150)
'id%DEPTH_FIRST'
2477 IF(
associated(id%DEPTH_FIRST_SEQ))
THEN
2478 DEALLOCATE(id%DEPTH_FIRST_SEQ)
2480 ALLOCATE(id%DEPTH_FIRST_SEQ(id%KEEP(28)),stat=allocok)
2481 IF (allocok .ne.0)
then
2483 info(2)= id%KEEP(28)
2485 WRITE(lp, 150)
'id%DEPTH_FIRST_SEQ'
2489 IF(
associated(id%SBTR_ID))
THEN
2490 DEALLOCATE(id%SBTR_ID)
2492 ALLOCATE(id%SBTR_ID(id%KEEP(28)),stat=allocok)
2493 IF (allocok .ne.0)
then
2495 info(2)= id%KEEP(28)
2497 WRITE(lp, 150)
'id%DEPTH_FIRST_SEQ'
2501 IF(id%MYID.EQ.master)
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))
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 )
2514 IF(
associated(id%DEPTH_FIRST))
THEN
2515 DEALLOCATE(id%DEPTH_FIRST)
2517 allocate(id%DEPTH_FIRST(1),stat=allocok)
2518 IF (allocok .ne.0)
then
2522 WRITE(lp, 150)
'id%DEPTH_FIRST'
2526 IF(
associated(id%DEPTH_FIRST_SEQ))
THEN
2527 DEALLOCATE(id%DEPTH_FIRST_SEQ)
2529 ALLOCATE(id%DEPTH_FIRST_SEQ(1),stat=allocok)
2530 IF (allocok .ne.0)
then
2534 WRITE(lp, 150)
'id%DEPTH_FIRST_SEQ'
2538 IF(
associated(id%SBTR_ID))
THEN
2539 DEALLOCATE(id%SBTR_ID)
2541 ALLOCATE(id%SBTR_ID(1),stat=allocok)
2542 IF (allocok .ne.0)
then
2546 WRITE(lp, 150)
'id%DEPTH_FIRST_SEQ'
2552 id%DEPTH_FIRST_SEQ(1)=0
2554 IF(id%KEEP(76).EQ.5)
THEN
2555 IF(
associated(id%COST_TRAV))
THEN
2556 DEALLOCATE(id%COST_TRAV)
2558 allocate(id%COST_TRAV(id%KEEP(28)),stat=allocok)
2559 IF (allocok .ne.0)
then
2561 WRITE(lp, 150)
'id%COST_TRAV'
2564 info(2)= id%KEEP(28)
2567 IF(id%MYID.EQ.master)
THEN
2568 id%COST_TRAV(1:id%KEEP(28))=
2569 & dble(cost_trav_tmp(1:id%KEEP(28)))
2571 CALL mpi_bcast( id%COST_TRAV(1), id%KEEP(28),
2572 & mpi_double_precision,master, id%COMM, ierr )
2574 IF(
associated(id%COST_TRAV))
THEN
2575 DEALLOCATE(id%COST_TRAV)
2577 allocate(id%COST_TRAV(1),stat=allocok)
2578 IF (allocok .ne.0)
then
2580 WRITE(lp, 150)
'id%COST_TRAV(1)'
2586 id%COST_TRAV(1)=0.0d0
2588 IF (id%KEEP(47) .EQ. 4 .OR.
2589 & ((id%KEEP(81) .GT. 0).AND.(id%KEEP(47).GE.2)))
THEN
2590 IF(id%MYID .EQ. master)
THEN
2592 DO j=1,size_temp_mem
2593 IF(temp_mem(j,k) < 0.0d0)
GOTO 666
2597 IF (id%KEEP(46) == 1)
THEN
2602 IF (idest .NE. master)
THEN
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)
2614 IF(
associated(id%MEM_SUBTREE))
THEN
2615 DEALLOCATE(id%MEM_SUBTREE)
2617 allocate(id%MEM_SUBTREE(j),stat=allocok)
2618 IF (allocok .ne.0)
then
2620 WRITE(lp, 150)
'id%MEM_SUBTREE'
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)
2631 allocate(id%MY_ROOT_SBTR(j),stat=allocok)
2632 IF (allocok .ne.0)
then
2634 WRITE(lp, 150)
'id%MY_ROOT_SBTR'
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)
2644 allocate(id%MY_FIRST_LEAF(j),stat=allocok)
2645 IF (allocok .ne.0)
then
2647 WRITE(lp, 150)
'id%MY_FIRST_LEAF'
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)
2657 allocate(id%MY_NB_LEAF(j),stat=allocok)
2658 IF (allocok .ne.0)
then
2660 WRITE(lp, 150)
'id%MY_NB_LEAF'
2666 id%MY_NB_LEAF(1:j)=temp_size(1:j,1)
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)
2675 allocate(id%MEM_SUBTREE(id%NBSA_LOCAL),stat=allocok)
2676 IF (allocok .ne.0)
then
2678 WRITE(lp, 150)
'id%MEM_SUBTREE'
2681 info(2)= id%NBSA_LOCAL
2685 DEALLOCATE(id%MY_ROOT_SBTR)
2687 allocate(id%MY_ROOT_SBTR(id%NBSA_LOCAL),stat=allocok)
2688 IF (allocok .ne.0)
then
2690 WRITE(lp, 150)
'id%MY_ROOT_SBTR'
2693 info(2)= id%NBSA_LOCAL
2696 IF(
associated(id%MY_FIRST_LEAF))
THEN
2697 DEALLOCATE(id%MY_FIRST_LEAF)
2699 allocate(id%MY_FIRST_LEAF(id%NBSA_LOCAL),stat=allocok)
2700 IF (allocok .ne.0)
then
2702 WRITE(lp, 150)
'MY_FIRST_LEAF'
2705 info(2)= id%NBSA_LOCAL
2708 IF(
associated(id%MY_NB_LEAF))
THEN
2709 DEALLOCATE(id%MY_NB_LEAF)
2711 allocate(id%MY_NB_LEAF(id%NBSA_LOCAL),stat=allocok)
2712 IF (allocok .ne.0)
then
2714 WRITE(lp, 150)
'MY_NB_LEAF'
2717 info(2)= id%NBSA_LOCAL
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)
2734 id%NBSA_LOCAL = -999999
2735 IF(
associated(id%MEM_SUBTREE))
THEN
2736 DEALLOCATE(id%MEM_SUBTREE)
2738 allocate(id%MEM_SUBTREE(1),stat=allocok)
2739 IF (allocok .ne.0)
then
2741 WRITE(lp, 150)
'id%MEM_SUBTREE(1)'
2747 IF(
associated(id%MY_ROOT_SBTR))
THEN
2748 DEALLOCATE(id%MY_ROOT_SBTR)
2750 allocate(id%MY_ROOT_SBTR(1),stat=allocok)
2751 IF (allocok .ne.0)
then
2753 WRITE(lp, 150)
'id%MY_ROOT_SBTR(1)'
2759 IF(
associated(id%MY_FIRST_LEAF))
THEN
2760 DEALLOCATE(id%MY_FIRST_LEAF)
2762 allocate(id%MY_FIRST_LEAF(1),stat=allocok)
2763 IF (allocok .ne.0)
then
2765 WRITE(lp, 150)
'id%MY_FIRST_LEAF(1)'
2771 IF(
associated(id%MY_NB_LEAF))
THEN
2772 DEALLOCATE(id%MY_NB_LEAF)
2774 allocate(id%MY_NB_LEAF(1),stat=allocok)
2775 IF (allocok .ne.0)
then
2777 WRITE(lp, 150) 'id%MY_NB_LEAF(1)
'
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)
2797 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2798 & id%COMM, id%MYID )
2799.LT.
IF ( INFO(1)0 ) GOTO 500
2801 NB_NIV2 = KEEP(56) ! KEEP(1:110) was broadcast earlier
2803.GT.
IF ( NB_NIV20 ) THEN
2805.ne.
if (id%MYIDMASTER) then
2806 IF (associated(id%CANDIDATES)) THEN
2807 DEALLOCATE(id%CANDIDATES)
2809 allocate(PAR2_NODES(NB_NIV2),
2810 & id%CANDIDATES(id%NSLAVES+1,NB_NIV2),
2812.ne.
IF (allocok 0) then
2814 INFO(2)= NB_NIV2*(id%NSLAVES+1)
2816 WRITE(LP, 150) 'par2_nodes/id%CANDIDATES
'
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 )
2831 IF ( associated(id%ISTEP_TO_INIV2)) THEN
2832 DEALLOCATE(id%ISTEP_TO_INIV2)
2833 NULLIFY(id%ISTEP_TO_INIV2)
2835 IF ( associated(id%I_AM_CAND)) THEN
2836 DEALLOCATE(id%I_AM_CAND)
2837 NULLIFY(id%I_AM_CAND)
2839.EQ.
IF (NB_NIV20) THEN
2846 id%KEEP(71) = id%KEEP(28)
2848 allocate(id%ISTEP_TO_INIV2(id%KEEP(71)),
2849 & id%I_AM_CAND(max(NB_NIV2,1)),
2851.gt.
IF (allocok 0) THEN
2853 WRITE(LP, 150) 'id%ISTEP_TO_INIV2
'
2854 WRITE(LP, 150) 'id%TAB_POS_IN_PERE
'
2857.EQ.
IF (NB_NIV20) THEN
2860 INFO(2)= id%KEEP(28)+NB_NIV2*(id%NSLAVES+2)
2864.GT.
IF ( NB_NIV2 0 ) THEN
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
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) )
2878 IF ( I_AM_SLAVE ) THEN
2879 IF (associated(id%FUTURE_NIV2)) THEN
2880 DEALLOCATE(id%FUTURE_NIV2)
2881 NULLIFY(id%FUTURE_NIV2)
2883 allocate(id%FUTURE_NIV2(id%NSLAVES), stat=allocok)
2884.gt.
IF (allocok 0) THEN
2886 WRITE(LP, 150) 'future_niv2
'
2893 DO INIV2 = 1, NB_NIV2
2894 IDEST = MUMPS_PROCNODE(
2895 & id%PROCNODE_STEPS(abs(id%STEP(PAR2_NODES(INIV2)))),
2897 id%FUTURE_NIV2(IDEST+1)=id%FUTURE_NIV2(IDEST+1)+1
2902 IF ( associated(id%TAB_POS_IN_PERE)) THEN
2903 DEALLOCATE(id%TAB_POS_IN_PERE)
2904 NULLIFY(id%TAB_POS_IN_PERE)
2906 allocate(id%TAB_POS_IN_PERE(id%NSLAVES+2,max(NB_NIV2,1)),
2908.gt.
IF (allocok 0) THEN
2910 WRITE(LP, 150) 'id%ISTEP_TO_INIV2
'
2911 WRITE(LP, 150) 'id%TAB_POS_IN_PERE
'
2914.EQ.
IF (NB_NIV20) THEN
2917 INFO(2)= id%KEEP(28)+NB_NIV2*(id%NSLAVES+2)
2924.GT.
IF (NB_NIV20) DEALLOCATE (PAR2_NODES)
2929 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2930 & id%COMM, id%MYID )
2931.LT.
IF ( INFO(1)0 ) GOTO 500
2933.NE.
IF ( KEEP(38) 0 ) THEN
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),
2942 & , id%KEEP(60), id%NPROW, id%NPCOL, id%MBLOCK, id%NBLOCK
2945 id%root%yes = .FALSE.
2947.NE..and.
IF ( KEEP(38) 0 I_AM_SLAVE ) THEN
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
2960.LT..OR.
IF ( id%root%MYROW -1
2961.LT.
& id%root%MYCOL -1 ) THEN
2965.AND.
IF ( LPOK INFO(1) == -25 ) THEN
2967 & 'problem with your version of
the blacs.
'
2968 WRITE(LP, '(a)
') 'try using a blacs version from netlib.
'
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
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 )
2989 CALL ZMUMPS_ANA_DIST_ELEMENTS( id%MYID,
2990 & id%NSLAVES, id%N, id%PROCNODE_STEPS(1),
2993 & id%PTRAR(id%NELT+2 ),
2995 & id%FRTPTR(1), id%FRTELT(1),
2996 & KEEP(1), KEEP8(1), ICNTL(1), id%KEEP(50) )
3005 IF ( I_AM_SLAVE ) THEN
3007 locI_AM_CAND => id%I_AM_CAND
3008 locMYID_NODES = id%MYID_NODES
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,
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,
3029.EQ..OR..EQ.
IF ( KEEP(60) 2 KEEP(60) 3 ) THEN
3031 id%SCHUR_MLOC=LOCAL_M
3032 id%SCHUR_NLOC=LOCAL_N
3034 id%root%SCHUR_MLOC=LOCAL_M
3035 id%root%SCHUR_NLOC=LOCAL_N
3037.NOT.
IF ( associated(id%CANDIDATES)) THEN
3038 ALLOCATE(id%CANDIDATES(id%NSLAVES+1,1), stat=allocok)
3039.gt.
IF (allocok 0) THEN
3041 WRITE(LP, 150) 'candidates
'
3044 INFO(2)= id%NSLAVES+1
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
3054 IF ( I_AM_SLAVE ) THEN
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
3075 & id%I4_L0_OMP(NBSTATS_I4, KEEP(400)),
3076 & id%I8_L0_OMP(NBSTATS_I8, KEEP(400)),
3077 & TNSTK_afterL0(KEEP(28)),
3079.gt.
IF (allocok 0) THEN
3081 WRITE(LP, 150) 'l0_omp stats
'
3084 INFO(2)= NBSTATS_I4* KEEP(400) +
3085 & NBSTATS_I8* KEEP(400)*KEEP(10)
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),
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),
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),
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,
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
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
3137 WRITE(LP, 150) 'allocation error in multicore
'
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)
3150 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3151 & id%COMM, id%MYID )
3152.LT.
IF ( INFO(1)0 ) GOTO 500
3155 IF ( I_AM_SLAVE ) THEN
3157.GT.
IF (KEEP(400)0) THEN
3159.GT.
IF (id%NSLAVES 1) THEN
3162 ALLOCATE (FLAGGED_LEAVES(KEEP(28)),
3164.gt.
IF (allocok 0) THEN
3166 WRITE(LP, 150) 'l0_omp flagged leaves
'
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
3181.GT.
IF (KEEP(400)0) THEN
3183.GT.
IF (id%NSLAVES 1) THEN
3184 ! LIPOOL_local can be 0
3186 & id%IPOOL_A_L0_OMP(id%LPOOL_A_L0_OMP)
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,
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,
3201.LT.
IF ( INFO(1)0 ) GOTO 75
3206.GT.
IF (FLAGGED_LEAVES(ISTEP)0) LIPOOL=LIPOOL+1
3210 LIPOOL = id%IPOOL_A_L0_OMP(id%LPOOL_A_L0_OMP)
3218 ALLOCATE( IPOOL(max(LIPOOL,1)),
3220.gt.
IF (allocok 0) THEN
3222 WRITE(LP, 150) 'allocation ipool
'
3230 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3231 & id%COMM, id%MYID )
3232.LT.
IF ( INFO(1)0 ) GOTO 500
3234 IF ( I_AM_SLAVE ) THEN
3236.GT.
IF (KEEP(400) 0 ) THEN ! L0 activated
3238.GT.
IF (LIPOOL0) THEN
3239.GT.
IF (id%NSLAVES 1) THEN
3242 DO ISTEP=1, KEEP(28)
3243.GT.
IF (FLAGGED_LEAVES(ISTEP)0) THEN
3248 IPOOL(I) = FLAGGED_LEAVES(ISTEP)
3254 DEALLOCATE(FLAGGED_LEAVES)
3257 IPOOL(I) = id%IPOOL_A_L0_OMP(I)
3263 NE_STEPSPTR => TNSTK_afterL0(1:KEEP(28))
3268 IPOOL(I) = id%NA(3+I-1)
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
3278 COST_SUBTREES_UNDER_L0 = 0.0D0
3279 OPSA_UNDER_L0 = 0.0D0
3281 NE_STEPSPTR => id%NE_STEPS
3283 KEEP(139) = MAXFR_UNDER_L0
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
3305 IF (ALLOCATED(IPOOL)) DEALLOCATE(IPOOL)
3306 NULLIFY(NE_STEPSPTR)
3307.GT.
IF (KEEP(400) 0) THEN ! L0 activated
3309 DEALLOCATE (TNSTK_afterL0)
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)
3325 KEEP(26) = KEEP(26) + SUM_NIRADU
3327 KEEP(224) = KEEP(224) + SUM_NIRADU_OOC
3329 KEEP(15) = max(KEEP(15),KEEP(26))
3332 KEEP(225) = max(KEEP(225),KEEP(224))
3334 KEEP(137) = SUM_NIRNEC
3336 KEEP(138) = SUM_NIRNEC_OOC
3339 & (dble(SUM_NIRNEC)*dble(KEEP(34)))/dble(KEEP(35))
3341 SUM_NIRNEC_OOC = int(
3342 & (dble(SUM_NIRNEC_OOC)*dble(KEEP(34)))/dble(KEEP(35))
3348 MIN_NRLADU = id%I8_L0_OMP(1,1)
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
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 +
3364 SUM_NRLADU_if_LR_LU = SUM_NRLADU_if_LR_LU +
3366 SUM_NRLADULR_UD = SUM_NRLADULR_UD +
3368 SUM_NRLADULR_WC = SUM_NRLADULR_WC +
3369 & id%I8_L0_OMP(10,I)
3374 KEEP8(81) = KEEP8(11)
3375 KEEP8(11) = KEEP8(11) + SUM_NRLADU
3379 KEEP8(82) = KEEP8(32)
3380 KEEP8(32) = KEEP8(32) + SUM_NRLADU_if_LR_LU
3384 PEAK_UNDER_L0 = SUM_NRLNEC + MIN_NRLNEC +
3386 & (dble(id%N*KEEP(400))*dble(KEEP(34)))/dble(KEEP(35)),
3393 PEAK_ABOVE_L0 = KEEP8(53)+ SUM_NRLADU +
3396 & (dble(SBUF_SEND_FR)*dble(KEEP(34)))/dble(KEEP(35))
3397 & , 8), 100000_8 ) +
3400 & (dble(KEEP(15))*dble(KEEP(34)))/dble(KEEP(35)),
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
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)
3436 KEEP8(19)=MAX_SIZE_FACTOR_TMP
3437 KEEP( 29 ) = KEEP(15) + 3* max(KEEP(12),10)
3438 & * ( KEEP(15) / 100 + 1)
3441 INFO( 19 ) = KEEP(225) + 3* max(KEEP(12),10)
3442 & * ( KEEP(225) / 100 + 1)
3448 KEEP8(13) = KEEP8(12) + int(KEEP(12),8) *
3449 & ( KEEP8(12) / 100_8 + 1_8 )
3451 KEEP8(17) = KEEP8(14) + int(KEEP(12),8) *
3452 & ( KEEP8(14) /100_8 +1_8)
3454 K8_33relaxed = KEEP8(33) + int(KEEP(12),8) *
3455 & ( KEEP8(33) /100_8 +1_8)
3457 K8_34relaxed = KEEP8(34) + int(KEEP(12),8) *
3458 & ( KEEP8(34) /100_8 +1_8)
3460 K8_35relaxed = KEEP8(35) + int(KEEP(12),8) *
3461 & ( KEEP8(35) /100_8 +1_8)
3463 K8_50relaxed = KEEP8(50) + int(KEEP(12),8) *
3464 & ( KEEP8(50) /100_8 +1_8)
3471 CALL MUMPS_ALLREDUCEI8 ( SBUF_RECOLD8, KEEP8(22), MPI_MAX,
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
3488 KEEP(379) = KEEP(380)
3490 KEEP(43)=SBUF_SEND_FR
3491 KEEP(379)=SBUF_SEND_LR
3494 UPDATE_BUFFER = .TRUE.
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
3501 KEEP(43) = max(KEEP(43), MIN_BUF_SIZE)
3502 KEEP(379) = max(KEEP(379), MIN_BUF_SIZE)
3504.NE..OR.
IF ( (KEEP(38)0) UPDATE_BUFFER) THEN
3507 KEEP(380) = max(KEEP(380), MIN_BUF_SIZE)
3508 KEEP(44) = max(KEEP(44), MIN_BUF_SIZE)
3511 WRITE(MP,'(a,i16)
')
3512 & ' estimated
INTEGER space for factors :
',
3514 WRITE(MP,'(A,I16)
')
3515 & ' INFO(3), est.
complex space to store factors:
',
3517 WRITE(MP,'(A,I16)
')
3518 & ' Estimated number
',
3520 WRITE(MP,'(A,I16)
')
3521 & ' Current
value of space relaxation
parameter :
',
3523 WRITE(MP,'(A,I16)
')
3524 & ' Estimated size of IS (In Core factorization):
',
3526 WRITE(MP,'(A,I16)
')
3527 & ' Estimated size of S (In Core factorization):
',
3529 WRITE(MP,'(A,I16)
')
3530 & ' Estimated size of S (OOC factorization) :
',
3538 ENTRIES_IN_FACTORS_LOC_MASTERS = 0_8
3553.GT.
IF (KEEP(400) 0) THEN
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
3568 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3569 & id%COMM, id%MYID )
3570.LT.
IF ( INFO(1) 0 ) GOTO 500
3585 CALL MUMPS_ALLREDUCEI8( ENTRIES_IN_FACTORS_LOC_MASTERS,
3586 & KEEP8(109), MPI_SUM, id%COMM)
3587 CALL MUMPS_ALLREDUCEI8( KEEP8(19), KEEP8(119),
3589 CALL MPI_ALLREDUCE( KEEP(27), KEEP(127), 1,
3590 & MPI_INTEGER, MPI_MAX,
3592 CALL MPI_ALLREDUCE( KEEP(26), KEEP(126), 1,
3593 & MPI_INTEGER, MPI_SUM,
3596 CALL MUMPS_REDUCEI8( KEEP8(11),
3597 & KEEP8(111), MPI_SUM,
3599 CALL MUMPS_SETI8TOI4( KEEP8(111), INFOG(3) )
3603 RINFO(5) = dble(KEEP8(32)
3604 & *int(KEEP(35),8))/1D6
3605 CALL MUMPS_REDUCEI8( KEEP8(32),
3609.EQ.
IF (id%MYIDMASTER) THEN
3610 RINFOG(15) = dble(ITMP8*int(KEEP(35),8))/1D6
3615 CALL MPI_ALLREDUCE( RINFO(1), RINFOG(1), 1,
3616 & MPI_DOUBLE_PRECISION, MPI_SUM,
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) )
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),
3639 IF (PROK) WRITE( MP, 112 )
3640.AND..NE.
IF (PROKG (MPGMP)) WRITE( MPG, 112 )
3646 SUM_KEEP811_THIS_NODE=0_8
3647 CALL MPI_REDUCE( KEEP8(11), SUM_KEEP811_THIS_NODE, 1,
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
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),
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)
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),
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)
3683 TOTAL_MBYTES = max (TOTAL_MBYTES,TOTAL_MBYTES_UNDER_L0)
3684 TOTAL_BYTES = max (TOTAL_BYTES, TOTAL_BYTES_UNDER_L0)
3686 KEEP8(2) = TOTAL_BYTES
3690 CALL ZMUMPS_MAX_MEM( KEEP(1), KEEP8(1),
3691 & id%MYID, id%N, id%NELT, id%NA(1), id%LNA, id%KEEP8(28),
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)
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,
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)
3712 TOTAL_MBYTES = max (TOTAL_MBYTES,TOTAL_MBYTES_UNDER_L0)
3713 TOTAL_BYTES = max (TOTAL_BYTES, TOTAL_BYTES_UNDER_L0)
3716 WRITE(MP,'(A,I12)
')
3717 & ' Estimated space in MBytes for IC factorization (INFO(15))
',
3720 id%INFO(15) = TOTAL_MBYTES
3730 CALL MUMPS_MEM_CENTRALIZE( id%MYID, id%COMM,
3731 & id%INFO(15), id%INFOG(16), IRANK )
3733 IF (PRINT_MAXAVG) THEN
3734 WRITE( MPG,'(A,I12)
')
3735 & ' Maximum estim. space in Mbytes, IC facto. (INFOG(16)):
',
3738 WRITE(MPG,'(A,I12)
')
3739 & ' Total space in MBytes, IC factorization (INFOG(17)):
'
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
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
3765.NE.
IF (OOC_STRAT -1) OOC_STRAT=1
3767 PERLU_ON = .FALSE. ! PERLU NOT taken into account
3769 CALL ZMUMPS_MAX_MEM( KEEP(1), KEEP8(1),
3770 & id%MYID, id%N, id%NELT, id%NA(1), id%LNA, id%KEEP8(28),
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)
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),
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)
3790 TOTAL_MBYTES = max (TOTAL_MBYTES,TOTAL_MBYTES_UNDER_L0)
3791 TOTAL_BYTES = max (TOTAL_BYTES, TOTAL_BYTES_UNDER_L0)
3793 KEEP8(3) = TOTAL_BYTES
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),
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)
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),
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)
3817 TOTAL_MBYTES = max (TOTAL_MBYTES,TOTAL_MBYTES_UNDER_L0)
3818 TOTAL_BYTES = max (TOTAL_BYTES, TOTAL_BYTES_UNDER_L0)
3820 id%INFO(17) = TOTAL_MBYTES
3822 CALL MUMPS_MEM_CENTRALIZE( id%MYID, id%COMM,
3823 & id%INFO(17), id%INFOG(26), IRANK )
3825 IF (PRINT_MAXAVG) THEN
3826 WRITE( MPG,'(A,I12)
')
3827 & ' Maximum estim. space in Mbytes, OOC facto. (INFOG(26)):
',
3830 WRITE(MPG,'(A,I12)
')
3831 & ' Total space in MBytes, OOC factorization (INFOG(27)):
'
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
3844.NE.
IF (KEEP(494)0) THEN
3848 SUM_OF_PEAKS = .TRUE.
3849 CALL ZMUMPS_MEM_ESTIM_BLR_ALL( SUM_OF_PEAKS,
3850 & KEEP(1), KEEP8(1),
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)
3864.AND..eq.
IF ( id%MYID. eq. MASTER KEEP(54) 1 ) THEN
3865 IF (associated( id%MAPPING)) THEN
3866 DEALLOCATE( id%MAPPING)
3868 allocate( id%MAPPING(id%KEEP8(28)), stat=allocok)
3869.GT.
IF ( allocok 0 ) THEN
3871 CALL MUMPS_SETI8TOI4(id%KEEP8(28), INFO(2))
3873 WRITE(LP, 150) 'id%MAPPING
'
3877 allocate(IWtemp( id%N ), stat=allocok)
3878.GT.
IF ( allocok 0 ) THEN
3882 WRITE(LP, 150) 'IWtemp(N)
'
3886.EQ.
IF ( id%KEEP8(28) 0_8 ) THEN
3887 IRN_PTR => IDUMMY_ARRAY
3888 JCN_PTR => IDUMMY_ARRAY
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),
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 )
3904 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3905 & id%COMM, id%MYID )
3906.LT.
IF ( INFO(1) 0 ) GOTO 500
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
3926 IF (associated(id%IPOOL_B_L0_OMP)) THEN
3927 DEALLOCATE(id%IPOOL_B_L0_OMP)
3928 NULLIFY(id%IPOOL_B_L0_OMP)
3930 IF (associated(id%IPOOL_A_L0_OMP)) THEN
3931 DEALLOCATE(id%IPOOL_A_L0_OMP)
3932 NULLIFY(id%IPOOL_A_L0_OMP)
3934 IF (associated(id%VIRT_L0_OMP)) THEN
3935 DEALLOCATE(id%VIRT_L0_OMP)
3936 NULLIFY(id%VIRT_L0_OMP)
3938 IF (associated(id%VIRT_L0_OMP_MAPPING)) THEN
3939 DEALLOCATE(id%VIRT_L0_OMP_MAPPING)
3940 NULLIFY(id%VIRT_L0_OMP_MAPPING)
3942 IF (associated(id%PERM_L0_OMP)) THEN
3943 DEALLOCATE(id%PERM_L0_OMP)
3944 NULLIFY(id%PERM_L0_OMP)
3946 IF (associated(id%PTR_LEAFS_L0_OMP)) THEN
3947 DEALLOCATE(id%PTR_LEAFS_L0_OMP)
3948 NULLIFY(id%PTR_LEAFS_L0_OMP)
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)
3959.AND.
IF (associated(id%BLKVAR)BLKVAR_ALLOCATED) THEN
3960 DEALLOCATE(id%BLKVAR)
3963 KEEP8(26)=max(1_8,KEEP8(26))
3964 KEEP8(27)=max(1_8,KEEP8(27))
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)