32 include
'mumps_tags.h'
34 parameter( master = 0 )
46 TYPE(dmumps_struc),
TARGET :: id
56 INTEGER NB_NIV2, IDEST
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,
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,
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,
137 LOGICAL :: SUM_OF_PEAKS
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
150INTEGER,
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::
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,
192 & IKEEP1, IKEEP2, IKEEP3,
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 (DMUMPS_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.eq.
IF ( KEEP(46) 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.eq.
ELSE IF ( KEEP(50) 1 ) THEN
308 & 'l d l^t solver
for symmetric positive definite matrices
'
311 & 'l d l^t solver
for general symmetric matrices
'
313.eq.
IF ( KEEP(46) 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.AND..NE.
IF (PROKG (MPGMP)) WRITE( MPG, 110 )
329.EQ.
IF (id%KEEP8(24)0_8) THEN
331 IF (associated(id%S)) THEN
337 KEEP8(24) = 0_8 ! reinitialize last used size of WK_USER
338 IF (associated(id%IS)) THEN
345 CALL DMUMPS_FREE_ID_DATA_MODULES(id%FDM_F_ENCODING,
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.NOT.
IF (I_AM_SLAVE) THEN
424 ALLOCATE(id%I4_L0_OMP(1,1), id%I8_L0_OMP(1,1), stat=allocok)
425.gt.
IF (allocok0) 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
435 CALL DMUMPS_FREE_L0_OMP_FACTORS(id%L0_OMP_FACTORS)
443 CALL DMUMPS_ANA_CHECK_KEEP(id, I_AM_SLAVE)
444 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
446.LT.
IF ( INFO(1) 0 ) GOTO 500
451 CALL MPI_BCAST( KEEP(60), 1, MPI_INTEGER, MASTER, id%COMM, IERR )
453.NE.
IF (id%KEEP(60) 0 ) THEN
454 CALL MPI_BCAST( KEEP(116), 1, MPI_INTEGER, MASTER,
457.EQ..or.
IF (id%KEEP(60) 2 id%KEEP(60). EQ. 3) THEN
458 CALL MPI_BCAST( id%NPROW, 1,
459 & MPI_INTEGER, MASTER, id%COMM, IERR )
460 CALL MPI_BCAST( id%NPCOL, 1,
461 & MPI_INTEGER, MASTER, id%COMM, IERR )
462 CALL MPI_BCAST( id%MBLOCK, 1,
463 & MPI_INTEGER, MASTER, id%COMM, IERR )
464 CALL MPI_BCAST( id%NBLOCK, 1,
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.EQ.
IF ( KEEP(55) 0) THEN
506.eq.
IF ( KEEP(54) 3 ) THEN
508 CALL MPI_ALLREDUCE( id%KEEP8(29), id%KEEP8(28), 1,
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.EQ.
IF( id%KEEP(54)3) THEN
523.AND..GT..AND.
IF (I_AM_SLAVE id%KEEP8(29)0
524.NOT..OR.
& ( ( associated(id%IRN_loc))
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.GT.
IF ( IERR 0 ) THEN
539 WRITE(LP, 150) 'mem_dist
'
542 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
544.LT.
IF ( INFO(1) 0 ) GOTO 500
545 id%MEM_DIST(0:id%NSLAVES-1) = 0
546 CALL MUMPS_INIT_ARCH_PARAMETERS(
547 & id%COMM,id%COMM_NODES,KEEP(69),KEEP(46),
548 & id%NSLAVES,id%MEM_DIST,INFO)
553 CALL DMUMPS_DUMP_PROBLEM(id)
554.LT.
IF ( id%INFO(1) 0 ) GOTO 500
558.EQ.
IF ( id%MYID MASTER ) THEN
559.NE.
IF (KEEP(13)0) THEN
563.NOT.
IF (associated(id%BLKVAR)) THEN
567.EQ.
IF (size(id%BLKVAR)id%N) THEN
575 & " ERROR with centralized matrix. Size of id%BLKVAR ",
576 & "should be equal to id%N instead of ",
583.GE.
IF (KEEP(13)1) THEN
586.NOT.
IF ( associated(id%BLKPTR)) THEN
589 & " id%BLKPTR should be provided by user on host "
594.LE..OR..GT.
IF ( (id%NBLK0)(id%NBLKid%N)
595.OR..NE.
& (id%NBLK+1size(id%BLKPTR))
599 & " ERROR incorrect value of id%NBLK:", id%NBLK
605.NE.
IF (id%BLKPTR(id%NBLK+1)-1id%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.NE.
IF (id%BLKPTR(1)1) THEN
618 & " ERROR id%BLKPTR(1)",
619 & "should be equal to 1 instead of ",
625.LT.
ELSE IF (KEEP(13)0) THEN
628 NBLK = id%N/(-KEEP(13))
634 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
636.LT.
IF ( id%INFO(1) 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.NE.
IF (KEEP(13)0) THEN
646.NE..AND..EQ.
IF ( ( (KEEP(54)3)(id%MYIDMASTER) )
647.OR..EQ.
& (KEEP(54)3) ) THEN
651 IF (allocated(SIZEOFBLOCKS)) DEALLOCATE(SIZEOFBLOCKS)
652 IF (allocated(DOF2BLOCK)) DEALLOCATE(DOF2BLOCK)
653 allocate(SIZEOFBLOCKS(NBLK), DOF2BLOCK(id%N),
656.NE.
IF (allocok0) THEN
658 id%INFO( 2 ) = id%N+NBLK
659 IF ( LPOK ) WRITE(LP, 150) ' sizeofblocks, dof2block
'
662.EQ..AND..EQ.
IF (id%MYIDMASTERallocok0) THEN
665.NOT.
IF (associated(id%BLKPTR)) THEN
666 BLKPTR_ALLOCATED = .TRUE.
667 allocate(id%BLKPTR(NBLK+1), STAT=allocok)
668.NE.
IF (allocok0) THEN
669 BLKPTR_ALLOCATED = .TRUE.
671 id%INFO( 2 ) = NBLK+1
672 IF ( LPOK ) WRITE(LP, 150) ' id%BLKPTR
'
675.NOT..AND..EQ.
IF (associated(id%BLKVAR)allocok0) THEN
676 allocate(id%BLKVAR(id%N), STAT=allocok)
677 BLKVAR_ALLOCATED = .TRUE.
678.NE.
IF (allocok0) THEN
679 BLKVAR_ALLOCATED = .FALSE.
682 IF ( LPOK ) WRITE(LP, 150) ' id%BLKVAR
'
687 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
689.LT.
IF (INFO(1)0) GOTO 500
690.EQ.
IF ( id%MYID 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
713 CALL MUMPS_AB_COMPUTE_SIZEOFBLOCK (
714 & NBLK, id%N, id%BLKPTR(1), id%BLKVAR(1),
715 & SIZEOFBLOCKS, DOF2BLOCK)
718.NE.
IF (KEEP(54)3) THEN
725.EQ.
IF (id%MYIDMASTER) THEN
728.EQ.
IF (id%KEEP8(28) 0_8) THEN
729 IRN_PTR => IDUMMY_ARRAY
730 JCN_PTR => IDUMMY_ARRAY
735 CALL MUMPS_AB_COORD_TO_LMAT ( id%MYID,
736 & NBLK, id%N, id%KEEP8(28), IRN_PTR(1), JCN_PTR(1),
738 & INFO(1), INFO(2), LP, LPOK,
741 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
743.LT.
IF ( INFO(1) 0 ) GOTO 500
745.EQ.
IF (id%MYIDMASTER) THEN
748 CALL MUMPS_AB_LMAT_TO_CLEAN_G ( id%MYID, .TRUE.,
749 & .TRUE., ! not relevant because unfold is true
752 GCOMP_PROVIDED = .TRUE.
753.EQ.
IF (KEEP(494)0) THEN
754 CALL MUMPS_AB_FREE_LMAT(LMAT_BLOCK)
757 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
759.LT.
IF ( INFO(1) 0 ) GOTO 500
769.NOT..OR.
IF ( I_AM_SLAVE ! non-working master
770.EQ.
& id%KEEP8(29) 0_8) THEN ! NNZ_loc or NZ_loc
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.EQ.
IF (id%NPROCS1) THEN
786 READY_FOR_ANA_F = .TRUE.
787 CALL MUMPS_AB_DCOORD_TO_DCOMPG (
788 & id%MYID, id%NPROCS, id%COMM,
790 & id%KEEP8(29), ! => NNZ_loc or NZ_loc
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.
798 CALL MUMPS_AB_DCOORD_TO_DCOMPG (
799 & id%MYID, id%NPROCS, id%COMM,
801 & id%KEEP8(29), ! => NNZ_loc or NZ_loc
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)
809 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
811.LT.
IF ( INFO(1) 0 ) GOTO 500
816 IF (allocated(DOF2BLOCK)) THEN
818.EQ..AND..NE.
IF ( (id%MYIDMASTER) (KEEP(256) 1)) THEN
819 DEALLOCATE(DOF2BLOCK)
829.EQ..AND..eq.
IF ( (KEEP(244)1) (KEEP(54) 3) ) THEN
836.NE.
IF (KEEP(13)0) THEN
837.NE.
IF (id%NPROCS1) THEN
838 CALL MUMPS_AB_GATHER_GRAPH(
839 & id%ICNTL(1), KEEP(1), id%COMM, id%MYID, id%NPROCS,
842 GCOMP_PROVIDED = .TRUE.
844 CALL MUMPS_AB_FREE_GCOMP(GCOMP_DIST)
847 CALL DMUMPS_GATHER_MATRIX(id)
848 GATHER_MATRIX_ALLOCATED = .TRUE.
849 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
852.LT.
IF ( INFO(1) 0 ) GOTO 500
855.EQ.
IF (KEEP(244) 1) THEN
857.eq.
IF ( id%MYID MASTER ) THEN
863.NOT.
IF ( 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.GT.
IF ( allocok 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.
880 IF ( info(1) < 0 )
GOTO 500
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 500
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 DMUMPS_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
1777 id%NA(leaf) = ikeepalloc(na+i-1)
1783 id%NA(leaf) = ikeepalloc
1794 IF ( frereptr(i) .ne. nblk + 1 )
THEN
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 DMUMPS_ANA_DRIVER'
1817 IF ( istep .NE. id%KEEP(28) )
THEN
1818 write(*,*)
'Internal error 3 in DMUMPS_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
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
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
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
2390 CALL mpi_bcast( id%KEEP(38), 1, mpi_integer, master,
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
2603 CALL mpi_send(j,1,mpi_integer,idest,0,
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
2684 IF(
associated(id%MY_ROOT_SBTR))
THEN
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 IF(id%MYID.EQ.master)
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)
2798 & id%COMM, id%MYID )
2799 IF ( info(1).LT.0 )
GOTO 500
2803 IF ( nb_niv2.GT.0 )
THEN
2805 if (id%MYID.ne.master)
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 IF (allocok .ne.0)
then
2814 info(2)= nb_niv2*(id%NSLAVES+1)
2816 WRITE(lp, 150)
'PAR2_NODES/id%CANDIDATES'
2821 & id%COMM, id%MYID )
2822 IF ( info(1).LT.0 )
GOTO 500
2824 & mpi_integer, master, id%COMM, ierr )
2825 IF (keep(24) .NE.0 )
THEN
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 IF (nb_niv2.EQ.0)
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 IF (allocok .gt.0)
THEN
2853 WRITE(lp, 150)
'id%ISTEP_TO_INIV2'
2854 WRITE(lp, 150)
'id%TAB_POS_IN_PERE'
2857 IF (nb_niv2.EQ.0)
THEN
2860 info(2)= id%KEEP(28)+nb_niv2*(id%NSLAVES+2)
2864 IF ( nb_niv2 .GT.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
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 IF (allocok .gt.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 IF (allocok .gt.0)
THEN
2910 WRITE(lp, 150)
'id%ISTEP_TO_INIV2'
2911 WRITE(lp, 150)
'id%TAB_POS_IN_PERE'
2914 IF (nb_niv2.EQ.0)
THEN
2917 info(2)= id%KEEP(28)+nb_niv2*(id%NSLAVES+2)
2924 IF (nb_niv2.GT.0)
DEALLOCATE (par2_nodes)
2930 & id%COMM, id%MYID )
2931 IF ( info(1).LT.0 )
GOTO 500
2933 IF ( keep(38) .NE. 0 )
THEN
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 IF ( keep(38) .NE. 0 .and. i_am_slave )
THEN
2955 & mpi_integer, mpi_max, id%COMM_NODES, ierr)
2956 IF ( myrow_check .eq. -1)
THEN
2960 IF ( id%root%MYROW .LT. -1 .OR.
2961 & id%root%MYCOL .LT. -1 )
THEN
2965 IF ( lpok .AND. info(1) == -25 )
THEN
2967 &
'Problem with your version of the BLACS.'
2968 WRITE(lp,
'(A)')
'Try using a BLACS version from netlib.'
2975 & id%COMM, id%MYID )
2976 IF ( info(1).LT.0 )
GOTO 500
2977 IF ( i_am_slave )
THEN
2981 IF (keep(55) .EQ. 0)
THEN
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 )
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 IF ( keep(60) .EQ. 2 .OR. keep(60) .EQ. 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 IF ( .NOT.
associated(id%CANDIDATES))
THEN
3038 ALLOCATE(id%CANDIDATES(id%NSLAVES+1,1), stat=allocok)
3039 IF (allocok .gt.0)
THEN
3041 WRITE(lp, 150)
'CANDIDATES'
3044 info(2)= id%NSLAVES+1
3050 & id%COMM, id%MYID )
3051 IF ( info(1).LT.0 )
GOTO 500
3052 IF (keep(400) .GT. 0 )
THEN
3054 IF ( i_am_slave )
THEN
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,
"DMUMPS"(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 IF (id%INFO(1) .GE. 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 IF (allocok .gt.0)
THEN
3081 WRITE(lp, 150)
'L0_OMP stats'
3084 info(2)= nbstats_i4* keep(400) +
3085 & nbstats_i8* keep(400)*keep(10)
3092 & id%COMM, id%MYID )
3093 IF ( info(1).LT.0 )
GOTO 500
3094 IF ( i_am_slave )
THEN
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 IF (allocok .gt.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)
3151 & id%COMM, id%MYID )
3152 IF ( info(1).LT.0 )
GOTO 500
3155 IF ( i_am_slave )
THEN
3157 IF (keep(400).GT.0)
THEN
3159 IF (id%NSLAVES .GT.1)
THEN
3162 ALLOCATE (flagged_leaves(keep(28)),
3164 IF (allocok .gt.0)
THEN
3166 WRITE(lp, 150)
'L0_OMP FLAGGED LEAVES'
3177 & id%COMM, id%MYID )
3178 IF ( info(1).LT.0 )
GOTO 500
3179 IF ( i_am_slave )
THEN
3181 IF (keep(400).GT.0)
THEN
3183 IF (id%NSLAVES .GT.1)
THEN
3186 & id%IPOOL_A_L0_OMP(id%LPOOL_A_L0_OMP)
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 IF ( info(1).LT.0 )
GOTO 75
3206 IF (flagged_leaves(istep).GT.0) lipool=lipool+1
3210 lipool = id%IPOOL_A_L0_OMP(id%LPOOL_A_L0_OMP)
3218 ALLOCATE( ipool(
max(lipool,1)),
3220 IF (allocok .gt.0)
THEN
3222 WRITE(lp, 150)
'Allocation IPOOL'
3231 & id%COMM, id%MYID )
3232 IF ( info(1).LT.0 )
GOTO 500
3234 IF ( i_am_slave )
THEN
3236 IF (keep(400) .GT. 0 )
THEN
3238 IF (lipool.GT.0)
THEN
3239 IF (id%NSLAVES .GT.1)
THEN
3242 DO istep=1, keep(28)
3243 IF (flagged_leaves(istep).GT.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
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 IF (keep(400) .GT. 0)
THEN
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)))
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
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)
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))
3481 & mpi_integer, mpi_max,
3482 & id%COMM_NODES, ierr)
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)
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 IF ( (keep(38).NE.0) .OR. 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. real space to store factors :',
3518 & ' estimated number of entries in factors :
',
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 IF (keep(400) .GT.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
3569 & id%COMM, id%MYID )
3570 IF ( info(1) .LT. 0 )
GOTO 500
3586 & keep8(109), mpi_sum, id%COMM)
3590 & mpi_integer, mpi_max,
3593 & mpi_integer, mpi_sum,
3597 & keep8(111), mpi_sum,
3603 rinfo(5) = dble(keep8(32)
3604 & *int(keep(35),8))/1d6
3609 IF (id%MYID.EQ.master)
THEN
3610 rinfog(15) = dble(itmp8*int(keep(35),8))/1d6
3616 & mpi_double_precision, mpi_sum,
3620 info( 4 ) = keep( 26 )
3621 info( 5 ) = keep( 27 )
3622 info( 7 ) = keep( 29 )
3631 infog( 4 ) = keep( 126 )
3632 infog( 5 ) = keep( 127 )
3635 & info(1), infog(1), rinfo(1), rinfog(1), icntl(1),
3639 IF (prok)
WRITE( mp, 112 )
3640 IF (prokg .AND. (mpg.NE.mp))
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 IF (prokg .AND. print_nodeinfo)
THEN
3653 WRITE(mpg,
'(A,I12)')
3654 &
' Max. estimated space for factors per compute node :',
3655 & max_sum_keep811_this_node
3658 ooc_strat = keep(201)
3660 IF (keep(201) .NE. -1) ooc_strat=0
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.,
3669 & , id%I8_L0_OMP(1,1),
size(id%I8_L0_OMP,1),
3670 &
size(id%I8_L0_OMP,2)
3672 IF (keep(400) .GT. 0 )
THEN
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.,
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
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.,
3697 & , id%I8_L0_OMP(1,1),
size(id%I8_L0_OMP,1),
3698 &
size(id%I8_L0_OMP,2)
3700 IF (keep(400) .GT. 0 )
THEN
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.,
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
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 IF ( prokg .AND. 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)
3762#if defined(OLD_OOC_NOPANEL)
3763 IF (ooc_strat .NE. -1) ooc_strat=2
3765 IF (ooc_strat .NE. -1) ooc_strat=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.,
3776 & , id%I8_L0_OMP(1,1),
size(id%I8_L0_OMP
3777 &
size(id%I8_L0_OMP,2)
3779 IF (keep(400) .GT. 0 )
THEN
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.,
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
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.,
3803 & , id%I8_L0_OMP(1,1),
size(id%I8_L0_OMP,1),
3804 &
size(id%I8_L0_OMP,2)
3806 IF (keep(400) .GT. 0 )
THEN
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.,
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
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 IF (prokg .AND. 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 IF (keep(494).NE.0)
THEN
3848 sum_of_peaks = .true.
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 IF ( id%MYID. eq. master .AND. keep(54) .eq. 1 )
THEN
3865 IF (
associated( id%MAPPING))
THEN
3866 DEALLOCATE( id%MAPPING)
3868 allocate( id%MAPPING(id%KEEP8(28)), stat=allocok)
3869 IF ( allocok .GT. 0 )
THEN
3873 WRITE(lp, 150)
'id%MAPPING'
3877 allocate(iwtemp( id%N ), stat=allocok)
3878 IF ( allocok .GT. 0 )
THEN
3882 WRITE(lp, 150)
'IWtemp(N)'
3886 IF ( id%KEEP8(28) .EQ. 0_8 )
THEN
3887 irn_ptr => idummy_array
3888 jcn_ptr => idummy_array
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 )
3905 & id%COMM, id%MYID )
3906 IF ( info(1) .LT. 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
3915 IF (
allocated(flagged_leaves))
DEALLOCATE(flagged_leaves)
3916 IF (
allocated(sizeofblocks))
DEALLOCATE(sizeofblocks)
3917 IF (
allocated(dof2block))
DEALLOCATE(dof2block)
3923 IF (info(1) .LT. 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 IF (
associated(id%BLKPTR).AND.blkptr_allocated)
THEN
3956 DEALLOCATE(id%BLKPTR)
3959 IF (
associated(id%BLKVAR).AND.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)