OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
zmumps_load Module Reference

Functions/Subroutines

subroutine, public mumps_load_enable ()
subroutine, public mumps_load_disable ()
subroutine, public zmumps_load_set_inicost (cost_subtree_arg, k64, dk15, k375, maxs)
subroutine, public zmumps_split_prep_partition (inode, step, n, slavef, procnode_steps, keep, dad, fils, cand, icntl, copy_cand, nbsplit, numorg_split, slaves_list, size_slaves_list)
subroutine, public zmumps_split_post_partition (inode, step, n, slavef, nbsplit, ncb, procnode_steps, keep, dad, fils, icntl, tab_pos, nslaves_node)
subroutine, public zmumps_split_propagate_parti (inode, typesplit, ifson, cand, size_cand, son_slave_list, nslson, step, n, slavef, procnode_steps, keep, dad, fils, icntl, istep_to_iniv2, iniv2, tab_pos_in_pere, nslaves_node, slaves_list, size_slaves_list)
subroutine, public zmumps_load_set_partition (ncbson_max, slavef, keep, keep8, icntl, cand_of_node, mem_distrib, ncb, nfront, nslaves_node, tab_pos, slaves_list, size_slaves_list, inode)
subroutine zmumps_load_parti_regular (slavef, keep, keep8, cand_of_node, mem_distrib, ncb, nfront, nslaves_node, tab_pos, slaves_list, size_slaves_list)
subroutine, public zmumps_load_init (id, memory_md_arg, maxs)
subroutine, public zmumps_load_update (check_flops, process_bande, inc_load, keep, keep8)
subroutine, public zmumps_load_mem_update (ssarbr, process_bande_arg, mem_value, new_lu, inc_mem_arg, keep, keep8, lrlus)
integer function, public zmumps_load_less (k69, mem_distrib, msg_size)
subroutine, public zmumps_load_set_slaves (mem_distrib, msg_size, dest, nslaves)
subroutine, public zmumps_load_end (info1, nslaves, ierr)
recursive subroutine, public zmumps_load_recv_msgs (comm)
recursive subroutine, public zmumps_load_process_message (msgsou, bufr, lbufr, lbufr_bytes)
integer function, public zmumps_load_less_cand (mem_distrib, cand, k69, slavef, msg_size, nmb_of_cand)
subroutine, public zmumps_load_set_slaves_cand (mem_distrib, cand, slavef, nslaves_inode, dest)
subroutine zmumps_init_alpha_beta (k69)
subroutine zmumps_archgenwload (mem_distrib, msg_size, array_adm, len)
subroutine, public zmumps_load_master_2_all (myid, slavef, comm, tab_pos, nass, keep, keep8, list_slaves, nslaves, inode)
subroutine, public zmumps_load_pool_upd_new_pool (pool, lpool, procnode, keep, keep8, slavef, comm, myid, step, n, nd, fils)
subroutine, public zmumps_load_sbtr_upd_new_pool (ok, inode, pool, lpool, myid, slavef, comm, keep, keep8)
subroutine zmumps_set_parti_actv_mem (slavef, keep, keep8, procs, mem_distrib, ncb, nfront, nslaves_node, tab_pos, slaves_list, size_slaves_list, myid)
subroutine zmumps_set_parti_flop_irr (ncbson_max, slavef, keep, keep8, procs, mem_distrib, ncb, nfront, nslaves_node, tab_pos, slaves_list, size_slaves_list, myid, inode, mp, lp)
subroutine, public zmumps_load_pool_check_mem (inode, upper, slavef, keep, keep8, step, pool, lpool, procnode, n)
subroutine, public zmumps_load_set_sbtr_mem (what)
double precision function zmumps_load_get_mem (inode)
recursive subroutine zmumps_next_node (flag, cost, comm)
subroutine, public zmumps_upper_predict (inode, step, nsteps, procnode, frere, ne, comm, slavef, myid, keep, keep8, n)
subroutine, public zmumps_remove_node (inode, num_call)
recursive subroutine zmumps_process_niv2_mem_msg (inode)
recursive subroutine zmumps_process_niv2_flops_msg (inode)
double precision function zmumps_load_get_flops_cost (inode)
integer function zmumps_load_get_cb_freed (inode)
subroutine, public zmumps_load_send_md_info (slavef, nmb_of_cand, list_of_cand, tab_pos, nass, keep, keep8, list_slaves, nslaves, inode)
subroutine zmumps_load_get_estim_mem_cost (inode, fct_cost, mem_cost, nslaves, nelim)
subroutine, public zmumps_load_clean_meminfo_pool (inode)
subroutine, public zmumps_load_chk_memcst_pool (flag)
subroutine, public zmumps_check_sbtr_cost (nbinsubtree, insubtree, nbtop, min_cost, sbtr)
subroutine, public zmumps_load_comp_maxmem_pool (inode, max_mem, proc)
subroutine, public zmumps_find_best_node_for_mem (min_proc, pool, lpool, inode)
subroutine, public zmumps_load_init_sbtr_struct (pool, lpool, keep, keep8)

Variables

double precision, dimension(:), allocatable, save, private load_flops
integer, dimension(:), allocatable, save, private buf_load_recv
integer, save, private lbuf_load_recv
integer, save, private lbuf_load_recv_bytes
integer, save, private k50
integer, save, private k69
integer, save, private k35
integer(8), save, private max_surf_master
logical, save, private bdc_mem
logical, save, private bdc_pool
logical, save, private bdc_sbtr
logical, save, private bdc_pool_mng
logical, save, private bdc_m2_mem
logical, save, private bdc_m2_flops
logical, save, private bdc_md
logical, save, private remove_node_flag
logical, save, private remove_node_flag_mem
double precision, save, private remove_node_cost
double precision, save, private remove_node_cost_mem
integer, save, private sbtr_which_m
double precision, dimension(:), allocatable, target, save, private wload
double precision, save, private delta_load
double precision, save, private delta_mem
logical, save, private is_mumps_load_enabled
integer(8), save, private check_mem
integer, dimension(:), allocatable, target, save, private idwload
double precision, save, private cost_subtree
double precision, save, private alpha
double precision, save, private beta
integer, save, private myid
integer, save, private nprocs
integer, save, private comm_ld
integer, save, private comm_nodes
double precision, dimension(:), allocatable, save, private pool_mem
double precision, dimension(:), allocatable, save, private sbtr_mem
double precision, dimension(:), allocatable, save, private sbtr_cur
integer, dimension(:), allocatable, save, private nb_son
double precision, save, private sbtr_cur_local
double precision, save, private peak_sbtr_cur_local
double precision, save, private max_peak_stk
double precision, save, private pool_last_cost_sent
double precision, save, private min_diff
integer, save, public pos_id
integer, save, public pos_mem
integer, dimension(:), allocatable, save, public cb_cost_id
integer(8), dimension(:), allocatable, save, public cb_cost_mem
double precision, dimension(:), allocatable lu_usage
integer(8), dimension(:), allocatable, save, private md_mem
integer(8), dimension(:), allocatable, save, private tab_maxs
double precision, dimension(:), allocatable, save, public mem_subtree
integer, public nb_subtrees
integer, public niv1_flag
integer, private indice_sbtr
integer, private indice_sbtr_array
integer pool_niv2_size
integer, save, public inside_subtree
double precision, save, private dm_sumlu
double precision, save, private dm_thres_mem
double precision, dimension(:), allocatable, save, private dm_mem
integer, save, private pool_size
integer, save, private id_max_m2
double precision, save, private max_m2
double precision, save, private tmp_m2
integer, dimension(:), allocatable, save, private pool_niv2
double precision, dimension(:), allocatable, save, private pool_niv2_cost
double precision, dimension(:), allocatable, save, private niv2
double precision, save, private chk_ld
integer, dimension(:), pointer, save, private procnode_load
integer, dimension(:), pointer, save, private step_to_niv2_load
integer, dimension(:), pointer, save, private keep_load
integer, save, private n_load
integer(8), dimension(:), pointer, save, private keep8_load
integer, dimension(:), pointer, save, public fils_load
integer, dimension(:), pointer, save, public step_load
integer, dimension(:), pointer, save, public frere_load
integer, dimension(:), pointer, save, public nd_load
integer, dimension(:), pointer, save, public ne_load
integer, dimension(:), pointer, save, public dad_load
integer, dimension(:,:), pointer, save, private cand_load
integer, dimension(:), pointer, save, private my_first_leaf
integer, dimension(:), pointer, save, private my_nb_leaf
integer, dimension(:), pointer, save, private my_root_sbtr
integer, dimension(:), allocatable, save, private sbtr_first_pos_in_pool
double precision, dimension(:), allocatable, save, private sbtr_peak_array
double precision, dimension(:), allocatable, save, private sbtr_cur_array
double precision, dimension(:), pointer, save, public cost_trav
integer, dimension(:), pointer, save, public depth_first_load
integer, dimension(:), pointer, save, public depth_first_seq_load
integer, dimension(:), pointer, save, public sbtr_id_load
integer, save, public root_current_subtree
integer, save, public current_best
integer, save, public second_current_best

Function/Subroutine Documentation

◆ mumps_load_disable()

subroutine, public zmumps_load::mumps_load_disable

Definition at line 134 of file zmumps_load.F.

135 IMPLICIT NONE
136 is_mumps_load_enabled = .false.
137 RETURN

◆ mumps_load_enable()

subroutine, public zmumps_load::mumps_load_enable

Definition at line 129 of file zmumps_load.F.

130 IMPLICIT NONE
131 is_mumps_load_enabled = .true.
132 RETURN

◆ zmumps_archgenwload()

subroutine zmumps_load::zmumps_archgenwload ( integer, dimension(0:nprocs-1) mem_distrib,
double precision msg_size,
integer, dimension(len) array_adm,
integer len )

Definition at line 1620 of file zmumps_load.F.

1621 IMPLICIT NONE
1622 INTEGER i,LEN
1623 INTEGER, DIMENSION(0:NPROCS-1) :: MEM_DISTRIB
1624 DOUBLE PRECISION MSG_SIZE,FORBIGMSG
1625 INTEGER ARRAY_ADM(LEN)
1626 DOUBLE PRECISION MY_LOAD
1627 forbigmsg = 1.0d0
1628 IF (k69 .lt.2) THEN
1629 RETURN
1630 ENDIF
1631 IF(bdc_m2_flops)THEN
1632 my_load=load_flops(myid)+niv2(myid+1)
1633 ELSE
1634 my_load=load_flops(myid)
1635 ENDIF
1636 IF((msg_size * dble(k35) ) .gt. 3200000.0d0) THEN
1637 forbigmsg = 2.0d0
1638 ENDIF
1639 IF (k69 .le. 4) THEN
1640 DO i = 1,len
1641 IF ((mem_distrib(array_adm(i)) .EQ. 1) .AND.
1642 & wload(i) .LT. my_load ) THEN
1643 wload(i) = wload(i)/my_load
1644 ELSE
1645 IF ( mem_distrib(array_adm(i)) .NE. 1 ) THEN
1646 wload(i) = wload(i) *
1647 & dble(mem_distrib(array_adm(i)))
1648 & * forbigmsg
1649 & + dble(2)
1650 ENDIF
1651 ENDIF
1652 ENDDO
1653 RETURN
1654 ENDIF
1655 DO i = 1,len
1656 IF ((mem_distrib(array_adm(i)) .EQ. 1) .AND.
1657 & wload(i) .LT. my_load ) THEN
1658 wload(i) = wload(i) / my_load
1659 ELSE
1660 IF(mem_distrib(array_adm(i)) .NE. 1) THEN
1661 wload(i) = (wload(i) +
1662 & alpha * msg_size * dble(k35) +
1663 & beta) * forbigmsg
1664 ENDIF
1665 ENDIF
1666 ENDDO
1667 RETURN
#define alpha
Definition eval.h:35

◆ zmumps_check_sbtr_cost()

subroutine, public zmumps_load::zmumps_check_sbtr_cost ( integer nbinsubtree,
integer insubtree,
integer nbtop,
double precision min_cost,
logical sbtr )

Definition at line 5278 of file zmumps_load.F.

5280 IMPLICIT NONE
5281 INTEGER NBINSUBTREE,INSUBTREE,NBTOP
5282 DOUBLE PRECISION MIN_COST
5283 LOGICAL SBTR
5284 INTEGER i
5285 DOUBLE PRECISION TMP_COST,TMP_MIN
5286 tmp_min=huge(tmp_min)
5287 DO i=0,nprocs-1
5288 IF(i.NE.myid)THEN
5289 IF(bdc_sbtr)THEN
5290 tmp_min=min(tmp_min,dble(tab_maxs(i))-(dm_mem(i)+
5291 & lu_usage(i))-(sbtr_mem(i)-sbtr_cur(i)))
5292 ELSE
5293 tmp_min=min(tmp_min,dble(tab_maxs(i))-
5294 & (dm_mem(i)+lu_usage(i)))
5295 ENDIF
5296 ENDIF
5297 ENDDO
5298 IF(nbinsubtree.GT.0)THEN
5299 IF(insubtree.EQ.1)THEN
5300 tmp_cost=dble(tab_maxs(myid))-(dm_mem(myid)+
5301 & lu_usage(myid))
5302 & -(sbtr_mem(myid)-sbtr_cur(myid))
5303 ELSE
5304 sbtr=.false.
5305 GOTO 777
5306 ENDIF
5307 ENDIF
5308 tmp_min=min(tmp_cost,tmp_min)
5309 IF(tmp_min.GT.min_cost) sbtr=.true.
5310 777 CONTINUE
#define min(a, b)
Definition macros.h:20

◆ zmumps_find_best_node_for_mem()

subroutine, public zmumps_load::zmumps_find_best_node_for_mem ( integer min_proc,
integer, dimension(lpool) pool,
integer lpool,
integer inode )

Definition at line 5443 of file zmumps_load.F.

5445 IMPLICIT NONE
5446 INTEGER INODE,LPOOL,MIN_PROC
5447 INTEGER POOL(LPOOL)
5448 EXTERNAL mumps_procnode
5449 INTEGER MUMPS_PROCNODE
5450 INTEGER i,NBTOP,INSUBTREE,NBINSUBTREE,NODE,FATHER,SON,J
5451 INTEGER SBTR_NB_LEAF,POS,K,allocok,L
5452 INTEGER, ALLOCATABLE, DIMENSION (:) :: TMP_SBTR
5453 nbinsubtree = pool(lpool)
5454 nbtop = pool(lpool - 1)
5455 insubtree = pool(lpool - 2)
5456 IF((keep_load(47).EQ.4).AND.
5457 & ((nbinsubtree.NE.0)))THEN
5458 DO j=indice_sbtr,nb_subtrees
5459 node=my_root_sbtr(j)
5460 father=dad_load(step_load(node))
5461 i=father
5462 110 CONTINUE
5463 IF ( i > 0 ) THEN
5464 i = fils_load(i)
5465 GOTO 110
5466 ENDIF
5467 son=-i
5468 i=son
5469 120 CONTINUE
5470 IF ( i > 0 ) THEN
5471 IF( mumps_procnode(procnode_load(step_load(i)),
5472 & keep_load(199)) .EQ. min_proc ) THEN
5473 sbtr_nb_leaf=my_nb_leaf(j)
5474 pos=sbtr_first_pos_in_pool(j)
5475 IF(pool(pos+sbtr_nb_leaf).NE.my_first_leaf(j))THEN
5476 WRITE(*,*)myid,': The first leaf is not ok'
5477 CALL mumps_abort()
5478 ENDIF
5479 ALLOCATE (tmp_sbtr(sbtr_nb_leaf), stat=allocok)
5480 IF (allocok > 0 ) THEN
5481 WRITE(*,*)myid,': Not enough space
5482 & for allocation'
5483 CALL mumps_abort()
5484 ENDIF
5485 pos=sbtr_first_pos_in_pool(j)
5486 DO k=1,sbtr_nb_leaf
5487 tmp_sbtr(k)=pool(pos+k-1)
5488 ENDDO
5489 DO k=pos+1,nbinsubtree-sbtr_nb_leaf
5490 pool(k)=pool(k+sbtr_nb_leaf)
5491 ENDDO
5492 pos=1
5493 DO k=nbinsubtree-sbtr_nb_leaf+1,nbinsubtree
5494 pool(k)=tmp_sbtr(pos)
5495 pos=pos+1
5496 ENDDO
5497 DO k=indice_sbtr,j
5498 sbtr_first_pos_in_pool(k)=sbtr_first_pos_in_pool(k)
5499 & -sbtr_first_pos_in_pool(j)
5500 ENDDO
5501 sbtr_first_pos_in_pool(j)=nbinsubtree-sbtr_nb_leaf
5502 pos=my_first_leaf(j)
5503 l=my_nb_leaf(j)
5504 DO k=indice_sbtr,j
5505 my_first_leaf(j)=my_first_leaf(j+1)
5506 my_nb_leaf(j)=my_nb_leaf(j+1)
5507 ENDDO
5508 my_first_leaf(indice_sbtr)=pos
5509 my_nb_leaf(indice_sbtr)=l
5510 inode=pool(nbinsubtree)
5511 DEALLOCATE(tmp_sbtr)
5512 RETURN
5513 ENDIF
5514 i = frere_load(step_load(i))
5515 GOTO 120
5516 ENDIF
5517 ENDDO
5518 ENDIF
5519 DO j=nbtop,1,-1
5520 node=pool(lpool-2-j)
5521 father=dad_load(step_load(node))
5522 i=father
5523 11 CONTINUE
5524 IF ( i > 0 ) THEN
5525 i = fils_load(i)
5526 GOTO 11
5527 ENDIF
5528 son=-i
5529 i=son
5530 12 CONTINUE
5531 IF ( i > 0 ) THEN
5532 IF( mumps_procnode(procnode_load(step_load(i)),
5533 & keep_load(199)) .EQ. min_proc ) THEN
5534 inode=node
5535 RETURN
5536 ENDIF
5537 i = frere_load(step_load(i))
5538 GOTO 12
5539 ENDIF
5540 ENDDO
#define mumps_abort
Definition VE_Metis.h:25
integer function father(nn, ixc, ipartc, ipart, sontype)
integer function mumps_procnode(procinfo_inode, k199)

◆ zmumps_init_alpha_beta()

subroutine zmumps_load::zmumps_init_alpha_beta ( integer k69)

Definition at line 1568 of file zmumps_load.F.

1569 IMPLICIT NONE
1570 INTEGER K69
1571 IF (k69 .LE. 4) THEN
1572 alpha = 0.0d0
1573 beta = 0.0d0
1574 RETURN
1575 ENDIF
1576 IF (k69 .EQ. 5) THEN
1577 alpha = 0.5d0
1578 beta = 50000.0d0
1579 RETURN
1580 ENDIF
1581 IF (k69 .EQ. 6) THEN
1582 alpha = 0.5d0
1583 beta = 100000.0d0
1584 RETURN
1585 ENDIF
1586 IF (k69 .EQ. 7) THEN
1587 alpha = 0.5d0
1588 beta = 150000.0d0
1589 RETURN
1590 ENDIF
1591 IF (k69 .EQ. 8) THEN
1592 alpha = 1.0d0
1593 beta = 50000.0d0
1594 RETURN
1595 ENDIF
1596 IF (k69 .EQ. 9) THEN
1597 alpha = 1.0d0
1598 beta = 100000.0d0
1599 RETURN
1600 ENDIF
1601 IF (k69 .EQ. 10) THEN
1602 alpha = 1.0d0
1603 beta = 150000.0d0
1604 RETURN
1605 ENDIF
1606 IF (k69 .EQ. 11) THEN
1607 alpha = 1.5d0
1608 beta = 50000.0d0
1609 RETURN
1610 ENDIF
1611 IF (k69 .EQ. 12) THEN
1612 alpha = 1.5d0
1613 beta = 100000.0d0
1614 RETURN
1615 ENDIF
1616 alpha = 1.5d0
1617 beta = 150000.0d0
1618 RETURN

◆ zmumps_load_chk_memcst_pool()

subroutine, public zmumps_load::zmumps_load_chk_memcst_pool ( logical flag)

Definition at line 5260 of file zmumps_load.F.

5261 IMPLICIT NONE
5262 LOGICAL FLAG
5263 INTEGER i
5264 DOUBLE PRECISION MEM
5265 flag=.false.
5266 DO i=0,nprocs-1
5267 mem=dm_mem(i)+lu_usage(i)
5268 IF(bdc_sbtr)THEN
5269 mem=mem+sbtr_mem(i)-sbtr_cur(i)
5270 ENDIF
5271 IF((mem/dble(tab_maxs(i))).GT.0.8d0)THEN
5272 flag=.true.
5273 GOTO 666
5274 ENDIF
5275 ENDDO
5276 666 CONTINUE

◆ zmumps_load_clean_meminfo_pool()

subroutine, public zmumps_load::zmumps_load_clean_meminfo_pool ( integer inode)

Definition at line 5194 of file zmumps_load.F.

5196 IMPLICIT NONE
5197 INTEGER INODE
5198 INTEGER i,J,SON,NSLAVES_TEMP,POS_TEMP,K
5199 INTEGER MUMPS_PROCNODE
5200 EXTERNAL mumps_procnode
5201 IF((inode.LT.0).OR.(inode.GT.n_load))THEN
5202 RETURN
5203 ENDIF
5204 IF(pos_id.GT.1)THEN
5205 i=inode
5206 10 CONTINUE
5207 IF ( i > 0 ) THEN
5208 i = fils_load(i)
5209 GOTO 10
5210 ENDIF
5211 son=-i
5212 IF(pos_id.LT.ne_load(step_load(inode))*3)THEN
5213 i=1
5214 ENDIF
5215 DO i=1, ne_load(step_load(inode))
5216 j=1
5217 DO WHILE (j.LT.pos_id)
5218 IF(cb_cost_id(j).EQ.son)GOTO 295
5219 j=j+3
5220 ENDDO
5221 295 CONTINUE
5222 IF(j.GE.pos_id)THEN
5223 IF ( mumps_procnode(
5224 & procnode_load(step_load(inode)),
5225 & keep_load(199) ) .EQ. myid ) THEN
5226 IF(inode.EQ.keep_load(38))THEN
5227 GOTO 666
5228 ELSE
5229 IF(future_niv2(myid+1).NE.0)THEN
5230 WRITE(*,*)myid,': i did not find ',son
5231 CALL mumps_abort()
5232 ENDIF
5233 GOTO 666
5234 ENDIF
5235 ELSE
5236 GOTO 666
5237 ENDIF
5238 ENDIF
5239 nslaves_temp=cb_cost_id(j+1)
5240 pos_temp=cb_cost_id(j+2)
5241 DO k=j,pos_id-1
5242 cb_cost_id(k)=cb_cost_id(k+3)
5243 ENDDO
5244 k=pos_temp
5245 DO WHILE (k.LE.pos_mem-1)
5246 cb_cost_mem(k)=cb_cost_mem(k+2*nslaves_temp)
5247 k=k+1
5248 ENDDO
5249 pos_mem=pos_mem-2*nslaves_temp
5250 pos_id=pos_id-3
5251 IF((pos_mem.LT.1).OR.(pos_id.LT.1))THEN
5252 WRITE(*,*)myid,': negative pos_mem or pos_id'
5253 CALL mumps_abort()
5254 ENDIF
5255 666 CONTINUE
5256 son=frere_load(step_load(son))
5257 ENDDO
5258 ENDIF
integer, dimension(:), allocatable, public future_niv2

◆ zmumps_load_comp_maxmem_pool()

subroutine, public zmumps_load::zmumps_load_comp_maxmem_pool ( integer inode,
double precision max_mem,
integer proc )

Definition at line 5312 of file zmumps_load.F.

5314 IMPLICIT NONE
5315 INTEGER INODE,PROC
5316 INTEGER i,POS,NSLAVES,SLAVE,NCAND,J,NELIM,NCB,NFRONT,SON,K
5317 INTEGER allocok
5318 EXTERNAL mumps_typenode
5319 INTEGER MUMPS_TYPENODE
5320 DOUBLE PRECISION MAX_MEM
5321 DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: MEM_ON_PROCS,
5322 & RECV_BUF
5323 LOGICAL, DIMENSION(:), ALLOCATABLE :: CONCERNED
5324 DOUBLE PRECISION MAX_SENT_MSG
5325 IF((frere_load(step_load(inode)).EQ.0)
5326 & .AND.(inode.EQ.keep_load(38)))THEN
5327 RETURN
5328 ENDIF
5329 ALLOCATE( mem_on_procs(0:nprocs-1), stat=allocok)
5330 IF ( allocok > 0 ) THEN
5331 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_COMP_MAXMEM_POOL'
5332 CALL mumps_abort()
5333 ENDIF
5334 ALLOCATE( concerned(0:nprocs-1), stat=allocok)
5335 IF ( allocok > 0 ) THEN
5336 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_COMP_MAXMEM_POOL'
5337 CALL mumps_abort()
5338 ENDIF
5339 ALLOCATE( recv_buf(0:nprocs-1), stat=allocok)
5340 IF ( allocok > 0 ) THEN
5341 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_COMP_MAXMEM_POOL'
5342 CALL mumps_abort()
5343 ENDIF
5344 recv_buf=dble(0)
5345 max_sent_msg=dble(0)
5346 i = inode
5347 nelim = 0
5348 10 CONTINUE
5349 IF ( i > 0 ) THEN
5350 nelim = nelim + 1
5351 i = fils_load(i)
5352 GOTO 10
5353 ENDIF
5354 son=-i
5355 nfront=nd_load(step_load(inode)) + keep_load(253)
5356 ncb=nfront-nelim
5357 IF(mumps_typenode(procnode_load(step_load(inode)),
5358 & keep_load(199)).EQ.2)THEN
5359 ncand=cand_load(nprocs+1, step_to_niv2_load(step_load(inode)))
5360 ENDIF
5361 DO i=0,nprocs-1
5362 IF(i.EQ.myid)THEN
5363 mem_on_procs(i)=dble(tab_maxs(i))-(dm_mem(i)+
5364 & lu_usage(i)+
5365 & zmumps_load_get_mem(inode))
5366 IF(bdc_sbtr)THEN
5367 mem_on_procs(i)=mem_on_procs(i)-(sbtr_mem(i)-sbtr_cur(i))
5368 ENDIF
5369 concerned(i)=.true.
5370 ELSE
5371 mem_on_procs(i)=dble(tab_maxs(i))-(dm_mem(i)+lu_usage(i))
5372 IF(bdc_sbtr)THEN
5373 mem_on_procs(i)=mem_on_procs(i)-(sbtr_mem(i)-sbtr_cur(i))
5374 ENDIF
5375 IF(bdc_m2_mem)THEN
5376 mem_on_procs(i)=mem_on_procs(i)-niv2(i+1)
5377 ENDIF
5378 ENDIF
5379 IF(mumps_typenode(procnode_load(step_load(inode)),
5380 & keep_load(199)).EQ.2)THEN
5381 IF(bdc_md.AND.(keep_load(48).EQ.5))THEN
5382 DO j=1,ncand
5383 IF(cand_load(j, step_to_niv2_load(step_load(inode)))
5384 & .EQ.i)THEN
5385 mem_on_procs(i)=mem_on_procs(i)-
5386 & ((dble(nfront)*dble(ncb))/dble(ncand))
5387 concerned(i)=.true.
5388 GOTO 666
5389 ENDIF
5390 ENDDO
5391 ENDIF
5392 ENDIF
5393 666 CONTINUE
5394 ENDDO
5395 DO k=1, ne_load(step_load(inode))
5396 i=1
5397 DO WHILE (i.LE.pos_id)
5398 IF(cb_cost_id(i).EQ.son)GOTO 295
5399 i=i+3
5400 ENDDO
5401 295 CONTINUE
5402 IF(i.GE.pos_id)THEN
5403 IF(future_niv2(myid+1).NE.0)THEN
5404 WRITE(*,*)myid,': ',son,'has not been found
5405 & in ZMUMPS_LOAD_COMP_MAXMEM_POOL'
5406 CALL mumps_abort()
5407 ENDIF
5408 GOTO 777
5409 ENDIF
5410 nslaves=cb_cost_id(i+1)
5411 pos=cb_cost_id(i+2)
5412 DO i=1,nslaves
5413 slave=int(cb_cost_mem(pos))
5414 IF(.NOT.concerned(slave))THEN
5415 mem_on_procs(slave)=mem_on_procs(slave)+
5416 & dble(cb_cost_mem(pos+1))
5417 ENDIF
5418 DO j=0,nprocs-1
5419 IF(concerned(j))THEN
5420 IF(slave.NE.j)THEN
5421 recv_buf(j)=max(recv_buf(j),
5422 & dble(cb_cost_mem(pos+1)))
5423 ENDIF
5424 ENDIF
5425 ENDDO
5426 pos=pos+2
5427 ENDDO
5428 777 CONTINUE
5429 son=frere_load(step_load(son))
5430 ENDDO
5431 max_mem=huge(max_mem)
5432 WRITE(*,*)'NPROCS=',nprocs,max_mem
5433 DO i=0,nprocs-1
5434 IF(max_mem.GT.mem_on_procs(i))THEN
5435 proc=i
5436 ENDIF
5437 max_mem=min(mem_on_procs(i),max_mem)
5438 ENDDO
5439 DEALLOCATE(mem_on_procs)
5440 DEALLOCATE(concerned)
5441 DEALLOCATE(recv_buf)
#define max(a, b)
Definition macros.h:21
integer function mumps_typenode(procinfo_inode, k199)

◆ zmumps_load_end()

subroutine, public zmumps_load::zmumps_load_end ( integer, intent(in) info1,
integer, intent(in) nslaves,
integer, intent(out) ierr )

Definition at line 1104 of file zmumps_load.F.

1105 USE zmumps_buf
1107 IMPLICIT NONE
1108 INTEGER, INTENT(IN) :: INFO1
1109 INTEGER, INTENT(IN) :: NSLAVES
1110 INTEGER, INTENT(OUT) :: IERR
1111 INTEGER :: DUMMY_COMMUNICATOR
1112 ierr=0
1113 dummy_communicator = -999
1114 CALL zmumps_clean_pending( info1, keep_load(1), buf_load_recv(1),
1115 & lbuf_load_recv,
1116 & lbuf_load_recv_bytes, dummy_communicator, comm_ld,
1117 & nslaves,
1118 & .false.,
1119 & .true.
1120 & )
1121 DEALLOCATE( load_flops )
1122 DEALLOCATE( wload )
1123 DEALLOCATE( idwload )
1124 DEALLOCATE(future_niv2)
1125 IF(bdc_md)THEN
1126 DEALLOCATE(md_mem)
1127 DEALLOCATE(lu_usage)
1128 DEALLOCATE(tab_maxs)
1129 ENDIF
1130 IF ( bdc_mem ) DEALLOCATE( dm_mem )
1131 IF ( bdc_pool) DEALLOCATE( pool_mem )
1132 IF ( bdc_sbtr) THEN
1133 DEALLOCATE( sbtr_mem )
1134 DEALLOCATE( sbtr_cur )
1135 DEALLOCATE(sbtr_first_pos_in_pool)
1136 NULLIFY(my_first_leaf)
1137 NULLIFY(my_nb_leaf)
1138 NULLIFY(my_root_sbtr)
1139 ENDIF
1140 IF(keep_load(76).EQ.4)THEN
1141 NULLIFY(depth_first_load)
1142 ENDIF
1143 IF(keep_load(76).EQ.5)THEN
1144 NULLIFY(cost_trav)
1145 ENDIF
1146 IF((keep_load(76).EQ.4).OR.(keep_load(76).EQ.6))THEN
1147 NULLIFY(depth_first_load)
1148 NULLIFY(depth_first_seq_load)
1149 NULLIFY(sbtr_id_load)
1150 ENDIF
1151 IF (bdc_m2_mem.OR.bdc_m2_flops) THEN
1152 DEALLOCATE(nb_son,pool_niv2,pool_niv2_cost, niv2)
1153 END IF
1154 IF((keep_load(81).EQ.2).OR.(keep_load(81).EQ.3))THEN
1155 DEALLOCATE(cb_cost_mem)
1156 DEALLOCATE(cb_cost_id)
1157 ENDIF
1158 NULLIFY(nd_load)
1159 NULLIFY(keep_load)
1160 NULLIFY(keep8_load)
1161 NULLIFY(fils_load)
1162 NULLIFY(frere_load)
1163 NULLIFY(procnode_load)
1164 NULLIFY(step_load)
1165 NULLIFY(ne_load)
1166 NULLIFY(cand_load)
1167 NULLIFY(step_to_niv2_load)
1168 NULLIFY(dad_load)
1169 IF (bdc_sbtr.OR.bdc_pool_mng) THEN
1170 DEALLOCATE(mem_subtree)
1171 DEALLOCATE(sbtr_peak_array)
1172 DEALLOCATE(sbtr_cur_array)
1173 ENDIF
1174 CALL zmumps_buf_deall_load_buffer( ierr )
1175 DEALLOCATE(buf_load_recv)
1176 RETURN
subroutine, public zmumps_buf_deall_load_buffer(ierr)
subroutine zmumps_clean_pending(info1, keep, bufr, lbufr, lbufr_bytes, comm_nodes, comm_load, slavef, clean_comm_nodes, clean_comm_load)

◆ zmumps_load_get_cb_freed()

integer function zmumps_load::zmumps_load_get_cb_freed ( integer inode)

Definition at line 5057 of file zmumps_load.F.

5058 IMPLICIT NONE
5059 INTEGER INODE,NELIM,NFR,SON,IN,i
5060 INTEGER COST_CB
5061 cost_cb=0
5062 i = inode
5063 10 CONTINUE
5064 IF ( i > 0 ) THEN
5065 i = fils_load(i)
5066 GOTO 10
5067 ENDIF
5068 son=-i
5069 DO i=1, ne_load(step_load(inode))
5070 nfr = nd_load( step_load(son) ) + keep_load(253)
5071 in=son
5072 nelim = 0
5073 20 CONTINUE
5074 IF ( in > 0 ) THEN
5075 nelim = nelim + 1
5076 in = fils_load(in)
5077 GOTO 20
5078 ENDIF
5079 cost_cb=cost_cb+((nfr-nelim)*(nfr-nelim))
5080 son=frere_load(step_load(son))
5081 ENDDO
5082 zmumps_load_get_cb_freed=cost_cb
5083 RETURN

◆ zmumps_load_get_estim_mem_cost()

subroutine zmumps_load::zmumps_load_get_estim_mem_cost ( integer inode,
double precision fct_cost,
double precision mem_cost,
integer nslaves,
integer nelim )

Definition at line 5182 of file zmumps_load.F.

5184 IMPLICIT NONE
5185 INTEGER INODE,NSLAVES,NFR,NELIM,IN
5186 DOUBLE PRECISION MEM_COST,FCT_COST
5187 nfr=nd_load(step_load(inode)) + keep_load(253)
5188 in = inode
5189 fct_cost=dble(int(dble(nfr-nelim)/dble(nslaves))+1)*
5190 & dble(nelim)
5191 mem_cost=dble(int(dble(nfr-nelim)/dble(nslaves))+1)*
5192 & dble(nfr)

◆ zmumps_load_get_flops_cost()

double precision function zmumps_load::zmumps_load_get_flops_cost ( integer inode)

Definition at line 5033 of file zmumps_load.F.

5035 INTEGER INODE
5036 INTEGER NFRONT,NELIM,i,LEVEL
5037 EXTERNAL mumps_typenode
5038 INTEGER MUMPS_TYPENODE
5039 DOUBLE PRECISION COST
5040 i = inode
5041 nelim = 0
5042 10 CONTINUE
5043 IF ( i > 0 ) THEN
5044 nelim = nelim + 1
5045 i = fils_load(i)
5046 GOTO 10
5047 ENDIF
5048 nfront = nd_load( step_load(inode) ) + keep_load(253)
5049 level = mumps_typenode( procnode_load(step_load(inode)),
5050 & keep_load(199) )
5051 cost=dble(0)
5052 CALL mumps_get_flops_cost(nfront,nelim,nelim,
5053 & keep_load(50),level,cost)
5054 zmumps_load_get_flops_cost=cost
5055 RETURN
subroutine mumps_get_flops_cost(nfront, npiv, nass, keep50, level, cost)
Definition estim_flops.F:74

◆ zmumps_load_get_mem()

double precision function zmumps_load::zmumps_load_get_mem ( integer inode)

Definition at line 4729 of file zmumps_load.F.

4730 IMPLICIT NONE
4731 INTEGER INODE,LEVEL,i,NELIM,NFR
4732 DOUBLE PRECISION COST
4733 EXTERNAL mumps_typenode
4734 INTEGER MUMPS_TYPENODE
4735 i = inode
4736 nelim = 0
4737 10 CONTINUE
4738 IF ( i > 0 ) THEN
4739 nelim = nelim + 1
4740 i = fils_load(i)
4741 GOTO 10
4742 ENDIF
4743 nfr = nd_load( step_load(inode) ) + keep_load(253)
4744 level = mumps_typenode( procnode_load(step_load(inode)),
4745 & keep_load(199) )
4746 IF (level .EQ. 1) THEN
4747 cost = dble(nfr) * dble(nfr)
4748 ELSE
4749 IF ( k50 == 0 ) THEN
4750 cost = dble(nfr) * dble(nelim)
4751 ELSE
4752 cost = dble(nelim) * dble(nelim)
4753 ENDIF
4754 ENDIF
4755 zmumps_load_get_mem=cost
4756 RETURN

◆ zmumps_load_init()

subroutine, public zmumps_load::zmumps_load_init ( type(zmumps_struc), target id,
integer(8), intent(in) memory_md_arg,
integer(8), intent(in) maxs )

Definition at line 461 of file zmumps_load.F.

462 USE zmumps_buf
465 IMPLICIT NONE
466 TYPE(ZMUMPS_STRUC), TARGET :: id
467 INTEGER(8), intent(in) :: MEMORY_MD_ARG
468 INTEGER(8), intent(in) :: MAXS
469 INTEGER K34_LOC
470 INTEGER(8) :: I8SIZE
471 INTEGER allocok, IERR, IERR_MPI, i, BUF_LOAD_SIZE
472 DOUBLE PRECISION :: MAX_SBTR
473 DOUBLE PRECISION ZERO
474 DOUBLE PRECISION MEMORY_SENT
475 parameter( zero=0.0d0 )
476 DOUBLE PRECISION SIZE_DBLE(2)
477 INTEGER WHAT
478 INTEGER(8) MEMORY_MD, LA
479 CALL mumps_load_enable()
480 step_to_niv2_load=>id%ISTEP_TO_INIV2
481 cand_load=>id%CANDIDATES
482 nd_load=>id%ND_STEPS
483 keep_load=>id%KEEP
484 keep8_load=>id%KEEP8
485 fils_load=>id%FILS
486 frere_load=>id%FRERE_STEPS
487 dad_load=>id%DAD_STEPS
488 procnode_load=>id%PROCNODE_STEPS
489 step_load=>id%STEP
490 ne_load=>id%NE_STEPS
491 n_load=id%N
492 root_current_subtree=-9999
493 memory_md=memory_md_arg
494 la=maxs
495 max_surf_master=id%MAX_SURF_MASTER+
496 & (int(id%KEEP(12),8)*int(id%MAX_SURF_MASTER,8)/int(100,8))
497 comm_ld = id%COMM_LOAD
498 comm_nodes = id%COMM_NODES
499 max_peak_stk = 0.0d0
500 k69 = id%KEEP(69)
501 IF ( id%KEEP(47) .le. 0 .OR. id%KEEP(47) .gt. 4 ) THEN
502 write(*,*) "Internal error 1 in ZMUMPS_LOAD_INIT"
503 CALL mumps_abort()
504 END IF
505 chk_ld=dble(0)
506 bdc_mem = ( id%KEEP(47) >= 2 )
507 bdc_pool = ( id%KEEP(47) >= 3 )
508 bdc_sbtr = ( id%KEEP(47) >= 4 )
509 bdc_m2_mem = ( ( id%KEEP(80) == 2 .OR. id%KEEP(80) == 3 )
510 & .AND. id%KEEP(47) == 4 )
511 bdc_m2_flops = ( id%KEEP(80) == 1
512 & .AND. id%KEEP(47) .GE. 1 )
513 bdc_md = (id%KEEP(86)==1)
514 sbtr_which_m = id%KEEP(90)
515 remove_node_flag=.false.
516 remove_node_flag_mem=.false.
517 remove_node_cost_mem=dble(0)
518 remove_node_cost=dble(0)
519 IF (id%KEEP(80) .LT. 0 .OR. id%KEEP(80)>3) THEN
520 WRITE(*,*) "Unimplemented KEEP(80) Strategy"
521 CALL mumps_abort()
522 ENDIF
523 IF ((id%KEEP(80) == 2 .OR. id%KEEP(80)==3).AND. id%KEEP(47).NE.4)
524 & THEN
525 WRITE(*,*) "Internal error 3 in ZMUMPS_LOAD_INIT"
526 CALL mumps_abort()
527 END IF
528 IF (id%KEEP(81) == 1 .AND. id%KEEP(47) < 2) THEN
529 WRITE(*,*) "Internal error 2 in ZMUMPS_LOAD_INIT"
530 CALL mumps_abort()
531 ENDIF
532 bdc_pool_mng = ((id%KEEP(81) == 1).AND.(id%KEEP(47) >= 2))
533 IF(id%KEEP(76).EQ.4)THEN
534 depth_first_load=>id%DEPTH_FIRST
535 ENDIF
536 IF(id%KEEP(76).EQ.5)THEN
537 cost_trav=>id%COST_TRAV
538 ENDIF
539 IF(id%KEEP(76).EQ.6)THEN
540 depth_first_load=>id%DEPTH_FIRST
541 depth_first_seq_load=>id%DEPTH_FIRST_SEQ
542 sbtr_id_load=>id%SBTR_ID
543 ENDIF
544 IF (bdc_m2_mem.OR.bdc_m2_flops) THEN
545 pool_niv2_size=max(1,min(id%NBSA+id%KEEP(262),id%NA(1)))
546 ALLOCATE(niv2(id%NSLAVES), nb_son(id%KEEP(28)),
547 & pool_niv2(pool_niv2_size),
548 & pool_niv2_cost(pool_niv2_size),
549 & stat=allocok)
550 DO i = 1, id%KEEP(28)
551 nb_son(i)=id%NE_STEPS(i)
552 ENDDO
553 niv2=dble(0)
554 IF (allocok > 0) THEN
555 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
556 id%INFO(1) = -13
557 id%INFO(2) = id%NSLAVES + id%KEEP(28) + 200
558 RETURN
559 ENDIF
560 ENDIF
561 k50 = id%KEEP(50)
562 CALL mpi_comm_rank( comm_ld, myid, ierr_mpi )
563 nprocs = id%NSLAVES
564 dm_sumlu=zero
565 pool_size=0
566 IF(bdc_md)THEN
567 IF ( allocated(md_mem) ) DEALLOCATE(md_mem)
568 ALLOCATE( md_mem( 0: nprocs - 1 ), stat=allocok )
569 IF ( allocok .gt. 0 ) THEN
570 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
571 id%INFO(1) = -13
572 id%INFO(2) = nprocs
573 RETURN
574 END IF
575 IF ( allocated(tab_maxs) ) DEALLOCATE(tab_maxs)
576 ALLOCATE( tab_maxs( 0: nprocs - 1 ), stat=allocok )
577 IF ( allocok .gt. 0 ) THEN
578 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
579 id%INFO(1) = -13
580 id%INFO(2) = nprocs
581 RETURN
582 END IF
583 tab_maxs=0_8
584 IF ( allocated(lu_usage) ) DEALLOCATE(lu_usage)
585 ALLOCATE( lu_usage( 0: nprocs - 1 ), stat=allocok )
586 IF ( allocok .gt. 0 ) THEN
587 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
588 id%INFO(1) = -13
589 id%INFO(2) = nprocs
590 RETURN
591 END IF
592 lu_usage=dble(0)
593 md_mem=int(0,8)
594 ENDIF
595 IF((id%KEEP(81).EQ.2).OR.(id%KEEP(81).EQ.3))THEN
596 ALLOCATE(cb_cost_mem(2*2000*id%NSLAVES),
597 & stat=allocok)
598 IF (allocok > 0) THEN
599 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
600 id%INFO(1) = -13
601 id%INFO(2) = id%NSLAVES
602 RETURN
603 ENDIF
604 cb_cost_mem=int(0,8)
605 ALLOCATE(cb_cost_id(2000*3),
606 & stat=allocok)
607 IF (allocok > 0) THEN
608 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
609 id%INFO(1) = -13
610 id%INFO(2) = id%NSLAVES
611 RETURN
612 ENDIF
613 cb_cost_id=0
614 pos_mem=1
615 pos_id=1
616 ENDIF
617 ALLOCATE(future_niv2(nprocs), stat=allocok)
618 IF (allocok > 0 ) THEN
619 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
620 id%INFO(1) = -13
621 id%INFO(2) = nprocs
622 RETURN
623 ENDIF
624 DO i = 1, nprocs
625 future_niv2(i) = id%FUTURE_NIV2(i)
626 IF(bdc_md)THEN
627 IF(future_niv2(i).EQ.0)THEN
628 md_mem(i-1)=999999999_8
629 ENDIF
630 ENDIF
631 ENDDO
632 delta_mem=zero
633 delta_load=zero
634 check_mem=0_8
635 IF(bdc_sbtr.OR.bdc_pool_mng)THEN
636 nb_subtrees=id%NBSA_LOCAL
637 IF (allocated(mem_subtree)) DEALLOCATE(mem_subtree)
638 ALLOCATE(mem_subtree(id%NBSA_LOCAL),stat=allocok)
639 IF (allocok > 0 ) THEN
640 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
641 id%INFO(1) = -13
642 id%INFO(2) = id%NBSA_LOCAL
643 RETURN
644 ENDIF
645 DO i=1,id%NBSA_LOCAL
646 mem_subtree(i)=id%MEM_SUBTREE(i)
647 ENDDO
648 my_first_leaf=>id%MY_FIRST_LEAF
649 my_nb_leaf=>id%MY_NB_LEAF
650 my_root_sbtr=>id%MY_ROOT_SBTR
651 IF (allocated(sbtr_first_pos_in_pool))
652 & DEALLOCATE(sbtr_first_pos_in_pool)
653 ALLOCATE(sbtr_first_pos_in_pool(id%NBSA_LOCAL),stat=allocok)
654 IF (allocok > 0 ) THEN
655 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
656 id%INFO(1) = -13
657 id%INFO(2) = id%NBSA_LOCAL
658 RETURN
659 ENDIF
660 inside_subtree=0
661 peak_sbtr_cur_local = dble(0)
662 sbtr_cur_local = dble(0)
663 IF (allocated(sbtr_peak_array)) DEALLOCATE(sbtr_peak_array)
664 ALLOCATE(sbtr_peak_array(id%NBSA_LOCAL),stat=allocok)
665 IF (allocok > 0 ) THEN
666 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
667 id%INFO(1) = -13
668 id%INFO(2) = id%NBSA_LOCAL
669 RETURN
670 ENDIF
671 sbtr_peak_array=dble(0)
672 IF (allocated(sbtr_cur_array)) DEALLOCATE(sbtr_cur_array)
673 ALLOCATE(sbtr_cur_array(id%NBSA_LOCAL),stat=allocok)
674 IF (allocok > 0 ) THEN
675 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
676 id%INFO(1) = -13
677 id%INFO(2) = id%NBSA_LOCAL
678 RETURN
679 ENDIF
680 sbtr_cur_array=dble(0)
681 indice_sbtr_array=1
682 niv1_flag=0
683 indice_sbtr=1
684 ENDIF
685 IF ( allocated(load_flops) ) DEALLOCATE( load_flops )
686 ALLOCATE( load_flops( 0: nprocs - 1 ), stat=allocok )
687 IF ( allocok .gt. 0 ) THEN
688 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
689 id%INFO(1) = -13
690 id%INFO(2) = nprocs
691 RETURN
692 END IF
693 IF ( allocated(wload) ) DEALLOCATE( wload )
694 ALLOCATE( wload( nprocs ), stat=allocok )
695 IF ( allocok .gt. 0 ) THEN
696 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
697 id%INFO(1) = -13
698 id%INFO(2) = nprocs
699 RETURN
700 END IF
701 IF ( allocated(idwload) ) DEALLOCATE( idwload )
702 ALLOCATE( idwload( nprocs ), stat=allocok )
703 IF ( allocok .gt. 0 ) THEN
704 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
705 id%INFO(1) = -13
706 id%INFO(2) = nprocs
707 RETURN
708 END IF
709 IF ( bdc_mem ) THEN
710 IF ( allocated(dm_mem) ) DEALLOCATE( dm_mem )
711 ALLOCATE( dm_mem( 0:nprocs-1 ), stat=allocok )
712 IF ( allocok .gt. 0 ) THEN
713 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
714 id%INFO(1) = -13
715 id%INFO(2) = nprocs
716 RETURN
717 END IF
718 END IF
719 IF ( bdc_pool ) THEN
720 IF ( allocated(pool_mem) ) DEALLOCATE(pool_mem)
721 ALLOCATE( pool_mem(0: nprocs -1), stat=allocok)
722 IF ( allocok .gt. 0 ) THEN
723 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
724 id%INFO(1) = -13
725 id%INFO(2) = nprocs
726 RETURN
727 END IF
728 pool_mem = dble(0)
729 pool_last_cost_sent = dble(0)
730 END IF
731 IF ( bdc_sbtr ) THEN
732 IF ( allocated(sbtr_mem) ) DEALLOCATE(sbtr_mem)
733 ALLOCATE( sbtr_mem(0: nprocs -1), stat=allocok)
734 IF ( allocok .gt. 0 ) THEN
735 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
736 id%INFO(1) = -13
737 id%INFO(2) = nprocs
738 RETURN
739 END IF
740 IF ( allocated(sbtr_cur) ) DEALLOCATE(sbtr_cur)
741 ALLOCATE( sbtr_cur(0: nprocs -1), stat=allocok)
742 IF ( allocok .gt. 0 ) THEN
743 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
744 id%INFO(1) = -13
745 id%INFO(2) = nprocs
746 RETURN
747 END IF
748 sbtr_cur = dble(0)
749 sbtr_mem = dble(0)
750 END IF
751 k34_loc=id%KEEP(34)
752 CALL mumps_size_c(size_dble(1),size_dble(2),i8size)
753 k35 = int(i8size)
754 buf_load_size = k34_loc * 2 * ( nprocs - 1 ) +
755 & nprocs * ( k35 + k34_loc )
756 IF (bdc_mem) THEN
757 buf_load_size = buf_load_size + nprocs * k35
758 END IF
759 IF (bdc_sbtr)THEN
760 buf_load_size = buf_load_size + nprocs * k35
761 ENDIF
762 lbuf_load_recv = (buf_load_size+k34_loc)/k34_loc
763 lbuf_load_recv_bytes = lbuf_load_recv * k34_loc
764 IF ( allocated(buf_load_recv) ) DEALLOCATE(buf_load_recv)
765 ALLOCATE( buf_load_recv( lbuf_load_recv), stat=allocok)
766 IF ( allocok > 0 ) THEN
767 WRITE(*,*) 'PB allocation in ZMUMPS_LOAD_INIT'
768 id%INFO(1) = -13
769 id%INFO(2) = lbuf_load_recv
770 RETURN
771 ENDIF
772 buf_load_size = buf_load_size * 20
773 CALL zmumps_buf_alloc_load_buffer( buf_load_size, ierr )
774 IF ( ierr .LT. 0 ) THEN
775 id%INFO(1) = -13
776 id%INFO(2) = buf_load_size
777 RETURN
778 END IF
779 DO i = 0, nprocs - 1
780 load_flops( i ) = zero
781 END DO
782 IF ( bdc_mem ) THEN
783 DO i = 0, nprocs - 1
784 dm_mem( i )=zero
785 END DO
786 ENDIF
787 CALL zmumps_init_alpha_beta(id%KEEP(69))
788 IF(bdc_md)THEN
789 max_sbtr=0.0d0
790 IF(bdc_sbtr)THEN
791 DO i=1,id%NBSA_LOCAL
792 max_sbtr=max(id%MEM_SUBTREE(i),max_sbtr)
793 ENDDO
794 ENDIF
795 md_mem(myid)=memory_md
796 what=8
797 CALL zmumps_buf_broadcast( what,
798 & comm_ld, nprocs,
799 & future_niv2,
800 & dble(memory_md),dble(0) ,myid, id%KEEP, ierr )
801 what=9
802 memory_sent = dble(la-max_surf_master)-max_sbtr
803 & - max( dble(la) * dble(3) / dble(100),
804 & dble(2) *
805 & dble(max(id%KEEP(5),id%KEEP(6))) * dble(id%KEEP(127)))
806 IF (id%KEEP(12) > 25) THEN
807 memory_sent = memory_sent -
808 & dble(id%KEEP(12))*0.2d0*dble(la)/100.0d0
809 ENDIF
810 IF (id%KEEP(375).EQ.1) THEN
811 memory_sent=dble(la)
812 ENDIF
813 tab_maxs(myid)=int(memory_sent,8)
814 CALL zmumps_buf_broadcast( what,
815 & comm_ld, nprocs,
816 & future_niv2,
817 & memory_sent,
818 & dble(0),myid, id%KEEP, ierr )
819 ENDIF
820 RETURN
subroutine mpi_comm_rank(comm, rank, ierr)
Definition mpi.f:254
initmumps id
subroutine, public zmumps_buf_broadcast(what, comm, nprocs, future_niv2, load, upd_load, myid, keep, ierr)
subroutine, public zmumps_buf_alloc_load_buffer(size, ierr)

◆ zmumps_load_init_sbtr_struct()

subroutine, public zmumps_load::zmumps_load_init_sbtr_struct ( integer, dimension(lpool) pool,
integer lpool,
integer, dimension(500) keep,
integer(8), dimension(150) keep8 )

Definition at line 5542 of file zmumps_load.F.

5543 IMPLICIT NONE
5544 INTEGER LPOOL,POOL(LPOOL),KEEP(500)
5545 INTEGER(8) KEEP8(150)
5546 INTEGER i,POS
5547 EXTERNAL mumps_rootssarbr
5548 LOGICAL MUMPS_ROOTSSARBR
5549 IF(.NOT.bdc_sbtr) RETURN
5550 pos=0
5551 DO i=nb_subtrees,1,-1
5552 DO WHILE(mumps_rootssarbr(
5553 & procnode_load(step_load(pool(pos+1))),
5554 & keep(199)))
5555 pos=pos+1
5556 ENDDO
5557 sbtr_first_pos_in_pool(i)=pos+1
5558 pos=pos+my_nb_leaf(i)
5559 ENDDO
logical function mumps_rootssarbr(procinfo_inode, k199)

◆ zmumps_load_less()

integer function, public zmumps_load::zmumps_load_less ( integer k69,
integer, dimension(0:nprocs-1) mem_distrib,
double precision msg_size )

Definition at line 1035 of file zmumps_load.F.

1036 IMPLICIT NONE
1037 INTEGER i, NLESS, K69
1038 INTEGER, DIMENSION(0:NPROCS-1) :: MEM_DISTRIB
1039 DOUBLE PRECISION LREF
1040 DOUBLE PRECISION MSG_SIZE
1041 nless = 0
1042 DO i=1,nprocs
1043 idwload(i) = i - 1
1044 ENDDO
1045 wload(1:nprocs) = load_flops(0:nprocs-1)
1046 IF(bdc_m2_flops)THEN
1047 DO i=1,nprocs
1048 wload(i)=wload(i)+niv2(i)
1049 ENDDO
1050 ENDIF
1051 IF(k69 .gt. 1) THEN
1052 CALL zmumps_archgenwload(mem_distrib,msg_size,idwload,nprocs)
1053 ENDIF
1054 lref = load_flops(myid)
1055 DO i=1, nprocs
1056 IF (wload(i).LT.lref) nless=nless+1
1057 ENDDO
1058 zmumps_load_less = nless
1059 RETURN

◆ zmumps_load_less_cand()

integer function, public zmumps_load::zmumps_load_less_cand ( integer, dimension(0:nprocs - 1), intent(in) mem_distrib,
integer, dimension(slavef+1), intent(in) cand,
integer, intent(in) k69,
integer, intent(in) slavef,
double precision msg_size,
integer, intent(out) nmb_of_cand )

Definition at line 1493 of file zmumps_load.F.

1498 implicit none
1499 integer, intent(in) :: K69, SLAVEF
1500 INTEGER, intent(in) :: CAND(SLAVEF+1)
1501 INTEGER, DIMENSION(0:NPROCS - 1), intent(in) :: MEM_DISTRIB
1502 INTEGER, intent(out) :: NMB_OF_CAND
1503 integer i,nless
1504 DOUBLE PRECISION lref
1505 DOUBLE PRECISION MSG_SIZE
1506 nless = 0
1507 nmb_of_cand=cand(slavef+1)
1508 do i=1,nmb_of_cand
1509 wload(i)=load_flops(cand(i))
1510 IF(bdc_m2_flops)THEN
1511 wload(i)=wload(i)+niv2(cand(i)+1)
1512 ENDIF
1513 end do
1514 IF(k69 .gt. 1) THEN
1515 CALL zmumps_archgenwload(mem_distrib,msg_size,
1516 & cand,nmb_of_cand)
1517 ENDIF
1518 lref = load_flops(myid)
1519 do i=1, nmb_of_cand
1520 if (wload(i).lt.lref) nless=nless+1
1521 end do
1522 zmumps_load_less_cand = nless
1523 return

◆ zmumps_load_master_2_all()

subroutine, public zmumps_load::zmumps_load_master_2_all ( integer, intent(in) myid,
integer, intent(in) slavef,
integer, intent(in) comm,
integer, dimension(slavef+2), intent(in) tab_pos,
integer, intent(in) nass,
integer, dimension(500) keep,
integer(8), dimension(150) keep8,
integer, dimension( nslaves ), intent(in) list_slaves,
integer, intent(in) nslaves,
integer inode )

Definition at line 1669 of file zmumps_load.F.

1671 USE zmumps_buf
1673 IMPLICIT NONE
1674 INTEGER, INTENT (IN) :: MYID, SLAVEF, COMM, NASS, NSLAVES
1675 INTEGER, INTENT (IN) :: TAB_POS(SLAVEF+2)
1676 INTEGER, INTENT (IN) :: LIST_SLAVES( NSLAVES )
1677 INTEGER KEEP(500)
1678 INTEGER(8) KEEP8(150)
1679 INTEGER NCB, NFRONT, NBROWS_SLAVE
1680 INTEGER i, IERR,WHAT,INODE, allocok
1681 LOGICAL :: EXIT_FLAG
1682 DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: MEM_INCREMENT
1683 DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: FLOPS_INCREMENT
1684 DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: CB_BAND
1685 ALLOCATE(mem_increment(nslaves), stat=allocok)
1686 if(allocok.ne.0) then
1687 WRITE(6,*) ' Allocation error of MEM_INCREMENT '
1688 & // 'in routine ZMUMPS_LOAD_MASTER_2_ALL'
1689 CALL mumps_abort()
1690 endif
1691 ALLOCATE(flops_increment(nslaves), stat=allocok)
1692 if(allocok.ne.0) then
1693 WRITE(6,*) ' Allocation error of FLOPS_INCREMENT '
1694 & // 'in routine ZMUMPS_LOAD_MASTER_2_ALL'
1695 CALL mumps_abort()
1696 endif
1697 ALLOCATE(cb_band(nslaves), stat=allocok)
1698 if(allocok.ne.0) then
1699 WRITE(6,*) ' Allocation error of CB_BAND '
1700 & // 'in routine ZMUMPS_LOAD_MASTER_2_ALL'
1701 CALL mumps_abort()
1702 endif
1703 IF((keep(81).NE.2).AND.(keep(81).NE.3))THEN
1704 what=1
1705 ELSE
1706 what=19
1707 ENDIF
1708 future_niv2(myid+1) = future_niv2(myid+1) - 1
1709 IF ( future_niv2(myid+1) < 0 ) THEN
1710 WRITE(*,*) "Internal error in ZMUMPS_LOAD_MASTER_2_ALL"
1711 CALL mumps_abort()
1712 ENDIF
1713 IF ( future_niv2(myid + 1) == 0 ) THEN
1714 112 CONTINUE
1715 CALL zmumps_buf_send_not_mstr(comm,myid,slavef,
1716 & dble(max_surf_master),keep,ierr)
1717 IF (ierr == -1 ) THEN
1718 CALL zmumps_load_recv_msgs(comm_ld)
1719 CALL mumps_check_comm_nodes(comm_nodes, exit_flag)
1720 IF (exit_flag) THEN
1721 GOTO 100
1722 ELSE
1723 GOTO 112
1724 ENDIF
1725 ELSE IF ( ierr .NE. 0 ) THEN
1726 WRITE(*,*) "Internal Error in ZMUMPS_LOAD_MASTER_2_ALL",
1727 & ierr
1728 CALL mumps_abort()
1729 ENDIF
1730 tab_maxs(myid) = tab_maxs(myid) + int(max_surf_master,8)
1731 ENDIF
1732 IF ( nslaves /= tab_pos(slavef + 2) ) THEN
1733 write(*,*) "Error 1 in ZMUMPS_LOAD_MASTER_2_ALL",
1734 & nslaves, tab_pos(slavef+2)
1735 CALL mumps_abort()
1736 ENDIF
1737 ncb = tab_pos(nslaves+1) - 1
1738 nfront = ncb + nass
1739 DO i = 1, nslaves
1740 nbrows_slave = tab_pos(i+1) - tab_pos(i)
1741 IF ( keep(50) == 0 ) THEN
1742 flops_increment( i ) = (dble(nbrows_slave)*dble( nass ))+
1743 & dble(nbrows_slave) * dble(nass) *
1744 & dble(2*nfront-nass-1)
1745 ELSE
1746 flops_increment( i ) = dble(nbrows_slave) * dble(nass ) *
1747 & dble( 2 * ( nass + tab_pos(i+1) - 1 )
1748 & - nbrows_slave - nass + 1 )
1749 ENDIF
1750 IF ( bdc_mem ) THEN
1751 IF ( keep(50) == 0 ) THEN
1752 mem_increment( i ) = dble(nbrows_slave) *
1753 & dble(nfront)
1754 ELSE
1755 mem_increment( i ) = dble(nbrows_slave) *
1756 & dble( nass + tab_pos(i+1) - 1 )
1757 END IF
1758 ENDIF
1759 IF((keep(81).NE.2).AND.(keep(81).NE.3))THEN
1760 cb_band(i)=dble(-999999)
1761 ELSE
1762 IF ( keep(50) == 0 ) THEN
1763 cb_band( i ) = dble(nbrows_slave) *
1764 & dble(nfront-nass)
1765 ELSE
1766 cb_band( i ) = dble(nbrows_slave) *
1767 & dble(tab_pos(i+1)-1)
1768 END IF
1769 ENDIF
1770 END DO
1771 IF((keep(81).EQ.2).OR.(keep(81).EQ.3))THEN
1772 cb_cost_id(pos_id)=inode
1773 cb_cost_id(pos_id+1)=nslaves
1774 cb_cost_id(pos_id+2)=pos_mem
1775 pos_id=pos_id+3
1776 DO i=1,nslaves
1777 cb_cost_mem(pos_mem)=int(list_slaves(i),8)
1778 pos_mem=pos_mem+1
1779 cb_cost_mem(pos_mem)=int(cb_band(i),8)
1780 pos_mem=pos_mem+1
1781 ENDDO
1782 ENDIF
1783 111 CONTINUE
1784 CALL zmumps_buf_bcast_array(bdc_mem, comm, myid, slavef,
1785 & future_niv2,
1786 & nslaves, list_slaves,inode,
1787 & mem_increment,
1788 & flops_increment,cb_band, what, keep, ierr)
1789 IF ( ierr == -1 ) THEN
1790 CALL zmumps_load_recv_msgs(comm_ld)
1791 CALL mumps_check_comm_nodes(comm_nodes, exit_flag)
1792 IF (exit_flag) THEN
1793 GOTO 100
1794 ELSE
1795 GOTO 111
1796 ENDIF
1797 ELSE IF ( ierr .NE. 0 ) THEN
1798 WRITE(*,*) "Internal Error in ZMUMPS_LOAD_MASTER_2_ALL",
1799 & ierr
1800 CALL mumps_abort()
1801 ENDIF
1802 IF (future_niv2(myid+1) .NE. 0) THEN
1803 DO i = 1, nslaves
1804 load_flops(list_slaves(i)) = load_flops(list_slaves(i))
1805 & + flops_increment(i)
1806 IF ( bdc_mem ) THEN
1807 dm_mem(list_slaves(i)) = dm_mem(list_slaves(i))
1808 & + mem_increment(i)
1809 END IF
1810 ENDDO
1811 ENDIF
1812 100 CONTINUE
1813 DEALLOCATE(mem_increment,flops_increment,cb_band)
1814 RETURN
subroutine, public zmumps_buf_send_not_mstr(comm, myid, nprocs, max_surf_master, keep, ierr)
subroutine, public zmumps_buf_bcast_array(bdc_mem, comm, myid, nprocs, future_niv2, nslaves, list_slaves, inode, mem_increment, flops_increment, cb_band, what, keep, ierr)
subroutine mumps_check_comm_nodes(comm_nodes, exit_flag)

◆ zmumps_load_mem_update()

subroutine, public zmumps_load::zmumps_load_mem_update ( logical, intent(in) ssarbr,
logical, intent(in) process_bande_arg,
integer(8), intent(in) mem_value,
integer(8), intent(in) new_lu,
integer(8), intent(in) inc_mem_arg,
integer, dimension(500) keep,
integer(8), dimension(150) keep8,
integer(8), intent(in) lrlus )

Definition at line 917 of file zmumps_load.F.

920 USE zmumps_buf
922 IMPLICIT NONE
923 INTEGER(8), INTENT(IN) :: MEM_VALUE, INC_MEM_ARG, NEW_LU,LRLUS
924 LOGICAL, INTENT(IN) :: PROCESS_BANDE_ARG, SSARBR
925 INTEGER IERR, KEEP(500)
926 INTEGER(8) KEEP8(150)
927 DOUBLE PRECISION ZERO, SEND_MEM, SBTR_TMP
928 parameter( zero=0.0d0 )
929 INTRINSIC max, abs
930 INTEGER(8) :: INC_MEM
931 LOGICAL PROCESS_BANDE
932 LOGICAL :: EXIT_FLAG
933 IF (.NOT. is_mumps_load_enabled) RETURN
934 process_bande=process_bande_arg
935 inc_mem = inc_mem_arg
936 IF ( process_bande .AND. new_lu .NE. 0_8) THEN
937 WRITE(*,*) " Internal Error in ZMUMPS_LOAD_MEM_UPDATE."
938 WRITE(*,*) " NEW_LU must be zero if called from PROCESS_BANDE"
939 CALL mumps_abort()
940 ENDIF
941 dm_sumlu = dm_sumlu + dble(new_lu)
942 IF(keep_load(201).EQ.0)THEN
943 check_mem = check_mem + inc_mem
944 ELSE
945 check_mem = check_mem + inc_mem - new_lu
946 ENDIF
947 IF ( mem_value .NE. check_mem ) THEN
948 WRITE(*,*)myid,
949 & ':Problem with increments in ZMUMPS_LOAD_MEM_UPDATE',
950 & check_mem, mem_value, inc_mem,new_lu
951 CALL mumps_abort()
952 ENDIF
953 IF (process_bande) THEN
954 RETURN
955 ENDIF
956 IF(bdc_pool_mng) THEN
957 IF(sbtr_which_m.EQ.0)THEN
958 IF (ssarbr) sbtr_cur_local = sbtr_cur_local+
959 & dble(inc_mem-new_lu)
960 ELSE
961 IF (ssarbr) sbtr_cur_local = sbtr_cur_local+
962 & dble(inc_mem)
963 ENDIF
964 ENDIF
965 IF ( .NOT. bdc_mem ) THEN
966 RETURN
967 ENDIF
968 IF (bdc_sbtr .AND. ssarbr) THEN
969 IF((sbtr_which_m.EQ.0).AND.(keep(201).NE.0))THEN
970 sbtr_cur(myid) = sbtr_cur(myid)+dble(inc_mem-new_lu)
971 ELSE
972 sbtr_cur(myid) = sbtr_cur(myid)+dble(inc_mem)
973 ENDIF
974 sbtr_tmp = sbtr_cur(myid)
975 ELSE
976 sbtr_tmp=dble(0)
977 ENDIF
978 IF ( new_lu > 0_8 ) THEN
979 inc_mem = inc_mem - new_lu
980 ENDIF
981 dm_mem( myid ) = dm_mem(myid) + dble(inc_mem)
982 max_peak_stk=max(max_peak_stk,dm_mem(myid))
983 IF(bdc_m2_mem.AND.remove_node_flag_mem)THEN
984 IF(dble(inc_mem).NE.remove_node_cost_mem)THEN
985 IF(dble(inc_mem).GT.remove_node_cost_mem)THEN
986 delta_mem = delta_mem +
987 & (dble(inc_mem)-remove_node_cost_mem)
988 GOTO 888
989 ELSE
990 delta_mem = delta_mem -
991 & (remove_node_cost_mem-dble(inc_mem))
992 GOTO 888
993 ENDIF
994 ENDIF
995 GOTO 333
996 ENDIF
997 delta_mem = delta_mem + dble(inc_mem)
998 888 CONTINUE
999 IF ((keep(48).NE.5).OR.
1000 & ((keep(48).EQ.5).AND.(abs(delta_mem)
1001 & .GE.0.2d0*dble(lrlus))))THEN
1002 IF ( abs(delta_mem) > dm_thres_mem ) THEN
1003 send_mem = delta_mem
1004 111 CONTINUE
1006 & bdc_sbtr,
1007 & bdc_mem,bdc_md, comm_ld,
1008 & nprocs,
1009 & delta_load,
1010 & send_mem,sbtr_tmp,
1011 & dm_sumlu,
1012 & future_niv2,
1013 & myid, keep, ierr )
1014 IF ( ierr == -1 )THEN
1015 CALL zmumps_load_recv_msgs(comm_ld)
1016 CALL mumps_check_comm_nodes(comm_nodes, exit_flag)
1017 IF (exit_flag) THEN
1018 GOTO 333
1019 ELSE
1020 GOTO 111
1021 ENDIF
1022 ELSE IF ( ierr .NE. 0 ) THEN
1023 WRITE(*,*) "Internal Error in ZMUMPS_LOAD_MEM_UPDATE",ierr
1024 CALL mumps_abort()
1025 ENDIF
1026 delta_load = zero
1027 delta_mem = zero
1028 ENDIF
1029 ENDIF
1030 333 CONTINUE
1031 IF(remove_node_flag_mem)THEN
1032 remove_node_flag_mem=.false.
1033 ENDIF
subroutine, public zmumps_buf_send_update_load(bdc_sbtr, bdc_mem, bdc_md, comm, nprocs, load, mem, sbtr_cur, lu_usage, future_niv2, myid, keep, ierr)

◆ zmumps_load_parti_regular()

subroutine zmumps_load::zmumps_load_parti_regular ( integer, intent(in) slavef,
integer, dimension(500), intent(in) keep,
integer(8), dimension(150) keep8,
integer, dimension(slavef+1), intent(in) cand_of_node,
integer, dimension(0:slavef-1), intent(in) mem_distrib,
integer, intent(in) ncb,
integer, intent(in) nfront,
integer, intent(out) nslaves_node,
integer, dimension(slavef+2), intent(out) tab_pos,
integer, dimension(size_slaves_list), intent(out) slaves_list,
integer, intent(in) size_slaves_list )

Definition at line 396 of file zmumps_load.F.

402 IMPLICIT NONE
403 INTEGER, intent(in) :: KEEP(500),SIZE_SLAVES_LIST
404 INTEGER(8) KEEP8(150)
405 INTEGER, intent(in) :: SLAVEF, NFRONT, NCB
406 INTEGER, intent(in) :: CAND_OF_NODE(SLAVEF+1)
407 INTEGER, intent(in) :: MEM_DISTRIB(0:SLAVEF-1)
408 INTEGER, intent(out):: SLAVES_LIST(SIZE_SLAVES_LIST)
409 INTEGER, intent(out):: TAB_POS(SLAVEF+2)
410 INTEGER, intent(out):: NSLAVES_NODE
411 INTEGER ITEMP, NMB_OF_CAND, NSLAVES_LESS
412 DOUBLE PRECISION MSG_SIZE
413 LOGICAL FORCE_CAND
414 INTEGER MUMPS_REG_GET_NSLAVES
415 EXTERNAL mumps_reg_get_nslaves
416 IF ( keep(48) == 0 .AND. keep(50) .NE. 0) THEN
417 write(*,*) "Internal error 2 in ZMUMPS_LOAD_PARTI_REGULAR."
418 CALL mumps_abort()
419 END IF
420 IF ( keep(48) == 3 .AND. keep(50) .EQ. 0) THEN
421 write(*,*) "Internal error 3 in ZMUMPS_LOAD_PARTI_REGULAR."
422 CALL mumps_abort()
423 END IF
424 msg_size = dble( nfront - ncb ) * dble(ncb)
425 IF ( keep(24) == 0 .OR. keep(24) == 1 ) THEN
426 force_cand = .false.
427 ELSE
428 force_cand = (mod(keep(24),2).eq.0)
429 END IF
430 IF (force_cand) THEN
431 itemp=zmumps_load_less_cand
432 & (mem_distrib,
433 & cand_of_node,
434 &
435 & keep(69), slavef, msg_size,
436 & nmb_of_cand )
437 ELSE
438 itemp=zmumps_load_less(keep(69),mem_distrib,msg_size)
439 nmb_of_cand = slavef - 1
440 END IF
441 nslaves_less = max(itemp,1)
442 nslaves_node = mumps_reg_get_nslaves(keep8(21), keep(48),
443 & keep(50),slavef,
444 & ncb, nfront, nslaves_less, nmb_of_cand,
445 & keep(375), keep(119))
447 & keep,keep8, slavef,
448 & tab_pos,
449 & nslaves_node, nfront, ncb
450 & )
451 IF (force_cand) THEN
452 CALL zmumps_load_set_slaves_cand(mem_distrib(0),
453 & cand_of_node, slavef, nslaves_node,
454 & slaves_list)
455 ELSE
456 CALL zmumps_load_set_slaves(mem_distrib(0),
457 & msg_size, slaves_list, nslaves_node)
458 ENDIF
459 RETURN
integer function mumps_reg_get_nslaves(k821, k48, k50, slavef, ncb, nfront, nslaves_less, nmb_of_cand, k375, k119)
subroutine mumps_bloc2_setpartition(keep, keep8, slavef, tab_pos_in_pere, nslaves, nfront, ncb)

◆ zmumps_load_pool_check_mem()

subroutine, public zmumps_load::zmumps_load_pool_check_mem ( integer inode,
logical upper,
integer slavef,
integer, dimension(500) keep,
integer(8), dimension(150) keep8,
integer, dimension(keep(28)) step,
integer, dimension(lpool) pool,
integer lpool,
integer, dimension(keep(28)) procnode,
integer n )

Definition at line 4647 of file zmumps_load.F.

4650 IMPLICIT NONE
4651 INTEGER INODE, LPOOL, SLAVEF, N
4652 INTEGER KEEP(500)
4653 INTEGER(8) KEEP8(150)
4654 INTEGER STEP(KEEP(28)), POOL(LPOOL), PROCNODE(KEEP(28))
4655 LOGICAL UPPER
4656 INTEGER J
4657 DOUBLE PRECISION MEM_COST
4658 INTEGER NBINSUBTREE,i,NBTOP
4659 EXTERNAL zmumps_pool_empty,
4661 LOGICAL ZMUMPS_POOL_EMPTY,
4662 & MUMPS_IN_OR_ROOT_SSARBR
4663 nbinsubtree = pool(lpool)
4664 nbtop = pool(lpool - 1)
4665 IF(keep(47).LT.2)THEN
4666 WRITE(*,*)'ZMUMPS_LOAD_POOL_CHECK_MEM must
4667 & be called with K47>=2'
4668 CALL mumps_abort()
4669 ENDIF
4670 IF((inode.GT.0).AND.(inode.LE.n))THEN
4671 mem_cost=zmumps_load_get_mem(inode)
4672 IF((dm_mem(myid)+dble(mem_cost)+ peak_sbtr_cur_local-
4673 & sbtr_cur_local)
4674 & .GT.max_peak_stk)THEN
4675 DO i=nbtop-1,1,-1
4676 inode = pool( lpool - 2 - i)
4677 mem_cost=zmumps_load_get_mem(inode)
4678 IF((inode.LT.0).OR.(inode.GT.n)) THEN
4679 DO j=i+1,nbtop,-1
4680 pool(j-1)=pool(j)
4681 ENDDO
4682 upper=.true.
4683 RETURN
4684 ENDIF
4685 IF((dm_mem(myid)+dble(mem_cost)+peak_sbtr_cur_local-
4686 & sbtr_cur_local).LE.
4687 & max_peak_stk) THEN
4688 DO j=i+1,nbtop,-1
4689 pool(j-1)=pool(j)
4690 ENDDO
4691 upper=.true.
4692 RETURN
4693 ENDIF
4694 ENDDO
4695 IF(nbinsubtree.NE.0)THEN
4696 inode = pool( nbinsubtree )
4697 IF(.NOT.mumps_in_or_root_ssarbr(procnode(step(inode)),
4698 & keep(199)))THEN
4699 WRITE(*,*)
4700 & 'Internal error 1 in ZMUMPS_LOAD_POOL_CHECK_MEM'
4701 CALL mumps_abort()
4702 ENDIF
4703 upper=.false.
4704 RETURN
4705 ENDIF
4706 inode=pool(lpool-2-nbtop)
4707 upper=.true.
4708 RETURN
4709 ENDIF
4710 ENDIF
4711 upper=.true.
logical function mumps_in_or_root_ssarbr(procinfo_inode, k199)
logical function zmumps_pool_empty(pool, lpool)

◆ zmumps_load_pool_upd_new_pool()

subroutine, public zmumps_load::zmumps_load_pool_upd_new_pool ( integer, dimension( lpool ) pool,
integer lpool,
integer, dimension( keep(28) ) procnode,
integer, dimension(500) keep,
integer(8), dimension(150) keep8,
integer slavef,
integer comm,
integer myid,
integer, dimension( n ) step,
integer n,
integer, dimension( keep(28) ) nd,
integer, dimension( n ) fils )

Definition at line 1816 of file zmumps_load.F.

1820 USE zmumps_buf
1822 IMPLICIT NONE
1823 INTEGER LPOOL, SLAVEF, COMM, MYID
1824 INTEGER N, KEEP(500)
1825 INTEGER(8) KEEP8(150)
1826 INTEGER POOL( LPOOL ), PROCNODE( KEEP(28) ), STEP( N )
1827 INTEGER ND( KEEP(28) ), FILS( N )
1828 INTEGER i, INODE, NELIM, NFR, LEVEL, IERR, WHAT
1829 DOUBLE PRECISION COST
1830 LOGICAL :: EXIT_FLAG
1831 INTEGER NBINSUBTREE,NBTOP,INSUBTREE
1832 INTEGER MUMPS_TYPENODE
1833 EXTERNAL mumps_typenode
1834 nbinsubtree = pool(lpool)
1835 nbtop = pool(lpool - 1)
1836 insubtree = pool(lpool - 2)
1837 IF(bdc_md)THEN
1838 RETURN
1839 ENDIF
1840 IF((keep(76).EQ.0).OR.(keep(76).EQ.2))THEN
1841 IF(nbtop.NE.0)THEN
1842 DO i = lpool-nbtop-2, min(lpool-3,lpool-nbtop-2+3)
1843 inode = pool( i )
1844 IF (inode .LE. n .AND. inode .GE. 1 ) THEN
1845 GOTO 20
1846 END IF
1847 END DO
1848 cost=dble(0)
1849 GOTO 30
1850 ELSE
1851 DO i = nbinsubtree, max(1,nbinsubtree-3), -1
1852 inode = pool( i )
1853 IF (inode .LE. n .AND. inode .GE. 1 ) THEN
1854 GOTO 20
1855 END IF
1856 END DO
1857 cost=dble(0)
1858 GOTO 30
1859 ENDIF
1860 ELSE
1861 IF(keep(76).EQ.1)THEN
1862 IF(insubtree.EQ.1)THEN
1863 DO i = nbinsubtree, max(1,nbinsubtree-3), -1
1864 inode = pool( i )
1865 IF (inode .LE. n .AND. inode .GE. 1 ) THEN
1866 GOTO 20
1867 END IF
1868 END DO
1869 cost=dble(0)
1870 GOTO 30
1871 ELSE
1872 DO i = lpool-nbtop-2, min(lpool-3,lpool-nbtop-2+3)
1873 inode = pool( i )
1874 IF (inode .LE. n .AND. inode .GE. 1 ) THEN
1875 GOTO 20
1876 END IF
1877 END DO
1878 cost=dble(0)
1879 GOTO 30
1880 ENDIF
1881 ELSE
1882 WRITE(*,*)
1883 & 'Internal error: Unknown pool management strategy'
1884 CALL mumps_abort()
1885 ENDIF
1886 ENDIF
1887 20 CONTINUE
1888 i = inode
1889 nelim = 0
1890 10 CONTINUE
1891 IF ( i > 0 ) THEN
1892 nelim = nelim + 1
1893 i = fils(i)
1894 GOTO 10
1895 ENDIF
1896 nfr = nd( step(inode) )
1897 level = mumps_typenode( procnode(step(inode)), keep(199) )
1898 IF (level .EQ. 1) THEN
1899 cost = dble( nfr ) * dble( nfr )
1900 ELSE
1901 IF ( keep(50) == 0 ) THEN
1902 cost = dble( nfr ) * dble( nelim )
1903 ELSE
1904 cost = dble( nelim ) * dble( nelim )
1905 ENDIF
1906 ENDIF
1907 30 CONTINUE
1908 IF ( abs(pool_last_cost_sent-cost).GT.dm_thres_mem ) THEN
1909 what = 2
1910 111 CONTINUE
1911 CALL zmumps_buf_broadcast( what,
1912 & comm, slavef,
1913 & future_niv2,
1914 & cost, dble(0), myid, keep, ierr )
1915 pool_last_cost_sent = cost
1916 pool_mem(myid)=cost
1917 IF ( ierr == -1 )THEN
1918 CALL zmumps_load_recv_msgs(comm_ld)
1919 CALL mumps_check_comm_nodes(comm_nodes, exit_flag)
1920 IF (exit_flag) THEN
1921 ELSE
1922 GOTO 111
1923 ENDIF
1924 ELSE IF ( ierr .NE. 0 ) THEN
1925 WRITE(*,*) "Internal Error in ZMUMPS_LOAD_POOL_UPD_NEW_POOL",
1926 & ierr
1927 CALL mumps_abort()
1928 ENDIF
1929 ENDIF
1930 RETURN

◆ zmumps_load_process_message()

recursive subroutine, public zmumps_load::zmumps_load_process_message ( integer msgsou,
integer, dimension( lbufr ) bufr,
integer lbufr,
integer lbufr_bytes )

Definition at line 1213 of file zmumps_load.F.

1216 IMPLICIT NONE
1217 INTEGER MSGSOU, LBUFR, LBUFR_BYTES
1218 INTEGER BUFR( LBUFR )
1219 include 'mpif.h'
1220 INTEGER POSITION, WHAT, NSLAVES, i
1221 INTEGER IERR_MPI
1222 DOUBLE PRECISION LOAD_RECEIVED
1223 INTEGER INODE_RECEIVED,NCB_RECEIVED
1224 DOUBLE PRECISION SURF
1225 INTEGER, POINTER, DIMENSION (:) :: LIST_SLAVES
1226 DOUBLE PRECISION, POINTER, DIMENSION (:) :: LOAD_INCR
1227 EXTERNAL mumps_typenode
1228 INTEGER MUMPS_TYPENODE
1229 position = 0
1230 CALL mpi_unpack( bufr, lbufr_bytes, position,
1231 & what, 1, mpi_integer,
1232 & comm_ld, ierr_mpi )
1233 IF ( what == 0 ) THEN
1234 CALL mpi_unpack( bufr, lbufr_bytes, position,
1235 & load_received, 1,
1236 & mpi_double_precision,
1237 & comm_ld, ierr_mpi )
1238 load_flops( msgsou ) = load_flops(msgsou) + load_received
1239 IF ( bdc_mem ) THEN
1240 CALL mpi_unpack( bufr, lbufr_bytes, position,
1241 & load_received, 1, mpi_double_precision,
1242 & comm_ld, ierr_mpi )
1243 dm_mem(msgsou) = dm_mem(msgsou) + load_received
1244 max_peak_stk=max(max_peak_stk,dm_mem(msgsou))
1245 END IF
1246 IF(bdc_sbtr)THEN
1247 CALL mpi_unpack( bufr, lbufr_bytes, position,
1248 & load_received, 1, mpi_double_precision,
1249 & comm_ld, ierr_mpi )
1250 sbtr_cur(msgsou)=load_received
1251 ENDIF
1252 IF(bdc_md)THEN
1253 CALL mpi_unpack( bufr, lbufr_bytes, position,
1254 & load_received, 1, mpi_double_precision,
1255 & comm_ld, ierr_mpi )
1256 IF(keep_load(201).EQ.0)THEN
1257 lu_usage(msgsou)=load_received
1258 ENDIF
1259 ENDIF
1260 ELSEIF (( what == 1).OR.(what.EQ.19)) THEN
1261 CALL mpi_unpack( bufr, lbufr_bytes, position,
1262 & nslaves, 1, mpi_integer,
1263 & comm_ld, ierr_mpi )
1264 CALL mpi_unpack( bufr, lbufr_bytes, position,
1265 & inode_received, 1, mpi_integer,
1266 & comm_ld, ierr_mpi )
1267 list_slaves => idwload
1268 load_incr => wload
1269 CALL mpi_unpack( bufr, lbufr_bytes, position,
1270 & list_slaves(1), nslaves, mpi_integer,
1271 & comm_ld, ierr_mpi)
1272 CALL mpi_unpack( bufr, lbufr_bytes, position,
1273 & load_incr(1), nslaves, mpi_double_precision,
1274 & comm_ld, ierr_mpi)
1275 DO i = 1, nslaves
1276 load_flops(list_slaves(i)) =
1277 & load_flops(list_slaves(i)) +
1278 & load_incr(i)
1279 END DO
1280 IF ( bdc_mem ) THEN
1281 CALL mpi_unpack( bufr, lbufr_bytes, position,
1282 & load_incr(1), nslaves, mpi_double_precision,
1283 & comm_ld, ierr_mpi)
1284 DO i = 1, nslaves
1285 dm_mem(list_slaves(i)) = dm_mem(list_slaves(i)) +
1286 & load_incr(i)
1287 max_peak_stk=max(max_peak_stk,dm_mem(list_slaves(i)))
1288 END DO
1289 END IF
1290 IF(what.EQ.19)THEN
1291 CALL mpi_unpack( bufr, lbufr_bytes, position,
1292 & load_incr(1), nslaves, mpi_double_precision,
1293 & comm_ld, ierr_mpi)
1294 CALL zmumps_load_clean_meminfo_pool(inode_received)
1295 cb_cost_id(pos_id)=inode_received
1296 cb_cost_id(pos_id+1)=nslaves
1297 cb_cost_id(pos_id+2)=pos_mem
1298 pos_id=pos_id+3
1299 DO i=1,nslaves
1300 WRITE(*,*)myid,':',list_slaves(i),'->',load_incr(i)
1301 cb_cost_mem(pos_mem)=int(list_slaves(i),8)
1302 pos_mem=pos_mem+1
1303 cb_cost_mem(pos_mem)=int(load_incr(i),8)
1304 pos_mem=pos_mem+1
1305 ENDDO
1306 ENDIF
1307 NULLIFY( list_slaves )
1308 NULLIFY( load_incr )
1309 ELSE IF (what == 2 ) THEN
1310 IF ( .not. bdc_pool ) THEN
1311 WRITE(*,*) "Internal error 2 in ZMUMPS_LOAD_PROCESS_MESSAGE"
1312 CALL mumps_abort()
1313 END IF
1314 CALL mpi_unpack( bufr, lbufr_bytes, position,
1315 & load_received, 1,
1316 & mpi_double_precision,
1317 & comm_ld, ierr_mpi )
1318 pool_mem(msgsou)=load_received
1319 ELSE IF ( what == 3 ) THEN
1320 IF ( .NOT. bdc_sbtr) THEN
1321 WRITE(*,*) "Internal error 3 in ZMUMPS_LOAD_PROCESS_MESSAGE"
1322 CALL mumps_abort()
1323 ENDIF
1324 CALL mpi_unpack( bufr, lbufr_bytes, position,
1325 & load_received, 1,
1326 & mpi_double_precision,
1327 & comm_ld, ierr_mpi )
1328 sbtr_mem(msgsou)=sbtr_mem(msgsou)+load_received
1329 ELSE IF (what == 4) THEN
1330 future_niv2(msgsou+1)=0
1331 IF(bdc_md)THEN
1332 CALL mpi_unpack( bufr, lbufr_bytes, position,
1333 & surf, 1, mpi_double_precision,
1334 & comm_ld, ierr_mpi )
1335 md_mem(msgsou)=999999999_8
1336 tab_maxs(msgsou)=tab_maxs(msgsou)+int(surf,8)
1337 ENDIF
1338 IF(bdc_m2_mem.OR.bdc_m2_flops)THEN
1339 ENDIF
1340 ELSE IF (what == 5) THEN
1341 IF((.NOT.bdc_m2_mem).AND.(.NOT.bdc_m2_flops))THEN
1342 WRITE(*,*) "Internal error 7 in ZMUMPS_LOAD_PROCESS_MESSAGE"
1343 CALL mumps_abort()
1344 ENDIF
1345 CALL mpi_unpack( bufr, lbufr_bytes, position,
1346 & inode_received, 1,
1347 & mpi_integer,
1348 & comm_ld, ierr_mpi )
1349 IF(bdc_m2_mem) THEN
1350 CALL zmumps_process_niv2_mem_msg(inode_received)
1351 ELSEIF(bdc_m2_flops) THEN
1352 CALL zmumps_process_niv2_flops_msg(inode_received)
1353 ENDIF
1354 IF((keep_load(81).EQ.2).OR.(keep_load(81).EQ.3))THEN
1355 CALL mpi_unpack( bufr, lbufr_bytes, position,
1356 & inode_received, 1,
1357 & mpi_integer,
1358 & comm_ld, ierr_mpi )
1359 CALL mpi_unpack( bufr, lbufr_bytes, position,
1360 & ncb_received, 1,
1361 & mpi_integer,
1362 & comm_ld, ierr_mpi )
1363 IF(
1364 & mumps_typenode(procnode_load(step_load(inode_received)),
1365 & keep_load(199)).EQ.1
1366 & )THEN
1367 cb_cost_id(pos_id)=inode_received
1368 cb_cost_id(pos_id+1)=1
1369 cb_cost_id(pos_id+2)=pos_mem
1370 pos_id=pos_id+3
1371 cb_cost_mem(pos_mem)=int(msgsou,8)
1372 pos_mem=pos_mem+1
1373 cb_cost_mem(pos_mem)=int(ncb_received,8)*
1374 & int(ncb_received,8)
1375 pos_mem=pos_mem+1
1376 ENDIF
1377 ENDIF
1378 ELSE IF ( what == 6 ) THEN
1379 IF((.NOT.bdc_m2_mem).AND.(.NOT.bdc_m2_flops))THEN
1380 WRITE(*,*) "Internal error 8 in ZMUMPS_LOAD_PROCESS_MESSAGE"
1381 CALL mumps_abort()
1382 ENDIF
1383 CALL mpi_unpack( bufr, lbufr_bytes, position,
1384 & load_received, 1,
1385 & mpi_double_precision,
1386 & comm_ld, ierr_mpi )
1387 IF(bdc_m2_mem) THEN
1388 niv2(msgsou+1) = load_received
1389 ELSEIF(bdc_m2_flops) THEN
1390 niv2(msgsou+1) = niv2(msgsou+1) + load_received
1391 IF(niv2(msgsou+1).LT.0.0d0)THEN
1392 IF(abs(niv2(msgsou+1)) .LE. 1.0d-3) THEN
1393 niv2(msgsou+1)=0.0d0
1394 ELSE
1395 WRITE(*,*)'problem with NIV2_FLOPS message',
1396 & niv2(msgsou+1),msgsou,load_received
1397 CALL mumps_abort()
1398 ENDIF
1399 ENDIF
1400 ENDIF
1401 ELSEIF(what == 17)THEN
1402 CALL mpi_unpack( bufr, lbufr_bytes, position,
1403 & load_received, 1,
1404 & mpi_double_precision,
1405 & comm_ld, ierr_mpi )
1406 IF(bdc_m2_mem) THEN
1407 niv2(msgsou+1) = load_received
1408 CALL mpi_unpack( bufr, lbufr_bytes, position,
1409 & load_received, 1,
1410 & mpi_double_precision,
1411 & comm_ld, ierr_mpi )
1412 IF(bdc_md)THEN
1413 dm_mem(myid)=dm_mem(myid)+load_received
1414 ELSEIF(bdc_pool)THEN
1415 pool_mem(msgsou)=load_received
1416 ENDIF
1417 ELSEIF(bdc_m2_flops) THEN
1418 niv2(msgsou+1) = niv2(msgsou+1) + load_received
1419 IF(niv2(msgsou+1).LT.0.0d0)THEN
1420 IF(abs(niv2(msgsou+1)) .LE. 1.0d-3) THEN
1421 niv2(msgsou+1)=0.0d0
1422 ELSE
1423 WRITE(*,*)'problem with NIV2_FLOPS message',
1424 & niv2(msgsou+1),msgsou,load_received
1425 CALL mumps_abort()
1426 ENDIF
1427 ENDIF
1428 CALL mpi_unpack( bufr, lbufr_bytes, position,
1429 & load_received, 1,
1430 & mpi_double_precision,
1431 & comm_ld, ierr_mpi )
1432 load_flops( msgsou ) = load_flops(msgsou) + load_received
1433 ENDIF
1434 ELSEIF ( what == 7 ) THEN
1435 IF(.NOT.bdc_md)THEN
1436 WRITE(*,*)myid,': Internal error 4
1437 &in ZMUMPS_LOAD_PROCESS_MESSAGE'
1438 CALL mumps_abort()
1439 ENDIF
1440 CALL mpi_unpack( bufr, lbufr_bytes, position,
1441 & nslaves, 1, mpi_integer,
1442 & comm_ld, ierr_mpi )
1443 CALL mpi_unpack( bufr, lbufr_bytes, position,
1444 & inode_received, 1, mpi_integer,
1445 & comm_ld, ierr_mpi )
1446 list_slaves => idwload
1447 load_incr => wload
1448 CALL mpi_unpack( bufr, lbufr_bytes, position,
1449 & list_slaves(1), nslaves, mpi_integer,
1450 & comm_ld, ierr_mpi )
1451 CALL mpi_unpack( bufr, lbufr_bytes, position,
1452 & load_incr(1), nslaves, mpi_double_precision,
1453 & comm_ld, ierr_mpi )
1454 DO i = 1, nslaves
1455 md_mem(list_slaves(i)) =
1456 & md_mem(list_slaves(i)) +
1457 & int(load_incr(i),8)
1458 IF(future_niv2(list_slaves(i)+1).EQ.0)THEN
1459 md_mem(list_slaves(i))=999999999_8
1460 ENDIF
1461 END DO
1462 ELSEIF ( what == 8 ) THEN
1463 IF(.NOT.bdc_md)THEN
1464 WRITE(*,*)myid,': Internal error 5
1465 &in ZMUMPS_LOAD_PROCESS_MESSAGE'
1466 CALL mumps_abort()
1467 ENDIF
1468 CALL mpi_unpack( bufr, lbufr_bytes, position,
1469 & load_received, 1,
1470 & mpi_double_precision,
1471 & comm_ld, ierr_mpi )
1472 md_mem(msgsou)=md_mem(msgsou)+int(load_received,8)
1473 IF(future_niv2(msgsou+1).EQ.0)THEN
1474 md_mem(msgsou)=999999999_8
1475 ENDIF
1476 ELSEIF ( what == 9 ) THEN
1477 IF(.NOT.bdc_md)THEN
1478 WRITE(*,*)myid,': Internal error 6
1479 &in ZMUMPS_LOAD_PROCESS_MESSAGE'
1480 CALL mumps_abort()
1481 ENDIF
1482 CALL mpi_unpack( bufr, lbufr_bytes, position,
1483 & load_received, 1,
1484 & mpi_double_precision,
1485 & comm_ld, ierr_mpi )
1486 tab_maxs(msgsou)=int(load_received,8)
1487 ELSE
1488 WRITE(*,*) "Internal error 1 in ZMUMPS_LOAD_PROCESS_MESSAGE"
1489 CALL mumps_abort()
1490 END IF
1491 RETURN
subroutine mpi_unpack(inbuf, insize, position, outbuf, outcnt, datatype, comm, ierr)
Definition mpi.f:514

◆ zmumps_load_recv_msgs()

recursive subroutine, public zmumps_load::zmumps_load_recv_msgs ( integer comm)

Definition at line 1178 of file zmumps_load.F.

1179 IMPLICIT NONE
1180 include 'mpif.h'
1181 include 'mumps_tags.h'
1182 INTEGER MSGTAG, MSGLEN, MSGSOU,COMM
1183 INTEGER IERR_MPI
1184 INTEGER :: STATUS(MPI_STATUS_SIZE)
1185 LOGICAL FLAG
1186 10 CONTINUE
1187 CALL mpi_iprobe( mpi_any_source, mpi_any_tag, comm,
1188 & flag, status, ierr_mpi )
1189 IF (flag) THEN
1190 keep_load(65)=keep_load(65)+1
1191 keep_load(267)=keep_load(267)-1
1192 msgtag = status( mpi_tag )
1193 msgsou = status( mpi_source )
1194 IF ( msgtag .NE. update_load) THEN
1195 write(*,*) "Internal error 1 in ZMUMPS_LOAD_RECV_MSGS",
1196 & msgtag
1197 CALL mumps_abort()
1198 ENDIF
1199 CALL mpi_get_count(status, mpi_packed, msglen, ierr_mpi)
1200 IF ( msglen > lbuf_load_recv_bytes ) THEN
1201 write(*,*) "Internal error 2 in ZMUMPS_LOAD_RECV_MSGS",
1202 & msglen, lbuf_load_recv_bytes
1203 CALL mumps_abort()
1204 ENDIF
1205 CALL mpi_recv( buf_load_recv, lbuf_load_recv_bytes,
1206 & mpi_packed, msgsou, msgtag, comm_ld, status, ierr_mpi)
1207 CALL zmumps_load_process_message( msgsou, buf_load_recv,
1208 & lbuf_load_recv, lbuf_load_recv_bytes )
1209 GOTO 10
1210 ENDIF
1211 RETURN
subroutine mpi_recv(buf, cnt, datatype, source, tag, comm, status, ierr)
Definition mpi.f:461
subroutine mpi_iprobe(source, tag, comm, flag, status, ierr)
Definition mpi.f:360
subroutine mpi_get_count(status, datatype, cnt, ierr)
Definition mpi.f:296

◆ zmumps_load_sbtr_upd_new_pool()

subroutine, public zmumps_load::zmumps_load_sbtr_upd_new_pool ( logical ok,
integer inode,
integer, dimension(lpool) pool,
integer lpool,
integer myid,
integer slavef,
integer comm,
integer, dimension(500) keep,
integer(8), dimension(150) keep8 )

Definition at line 1932 of file zmumps_load.F.

1934 USE zmumps_buf
1936 IMPLICIT NONE
1937 INTEGER LPOOL,MYID,SLAVEF,COMM,INODE
1938 INTEGER POOL(LPOOL),KEEP(500)
1939 INTEGER(8) KEEP8(150)
1940 INTEGER WHAT,IERR
1941 LOGICAL OK
1942 DOUBLE PRECISION COST
1943 LOGICAL FLAG, EXIT_FLAG
1945 LOGICAL MUMPS_ROOTSSARBR,MUMPS_IN_OR_ROOT_SSARBR
1946 IF((inode.LE.0).OR.(inode.GT.n_load)) THEN
1947 RETURN
1948 ENDIF
1949 IF (.NOT.mumps_in_or_root_ssarbr(
1950 & procnode_load(step_load(inode)), keep(199))
1951 & ) THEN
1952 RETURN
1953 ENDIF
1954 IF(mumps_rootssarbr(procnode_load(step_load(inode)),
1955 & keep(199)))THEN
1956 IF(ne_load(step_load(inode)).EQ.0)THEN
1957 RETURN
1958 ENDIF
1959 ENDIF
1960 flag=.false.
1961 IF(indice_sbtr.LE.nb_subtrees)THEN
1962 IF(inode.EQ.my_first_leaf(indice_sbtr))THEN
1963 flag=.true.
1964 ENDIF
1965 ENDIF
1966 IF(flag)THEN
1967 sbtr_peak_array(indice_sbtr_array)=mem_subtree(indice_sbtr)
1968 sbtr_cur_array(indice_sbtr_array)=sbtr_cur(myid)
1969 indice_sbtr_array=indice_sbtr_array+1
1970 what = 3
1971 IF(dble(mem_subtree(indice_sbtr)).GE.dm_thres_mem)THEN
1972 111 CONTINUE
1974 & what, comm, slavef,
1975 & future_niv2,
1976 & dble(mem_subtree(indice_sbtr)), dble(0),
1977 & myid, keep, ierr )
1978 IF ( ierr == -1 )THEN
1979 CALL zmumps_load_recv_msgs(comm_ld)
1980 CALL mumps_check_comm_nodes(comm_nodes, exit_flag)
1981 IF (exit_flag) THEN
1982 ELSE
1983 GOTO 111
1984 ENDIF
1985 ELSE IF ( ierr .NE. 0 ) THEN
1986 WRITE(*,*)
1987 & "Internal Error 1 in ZMUMPS_LOAD_SBTR_UPD_NEW_POOL",
1988 & ierr
1989 CALL mumps_abort()
1990 ENDIF
1991 ENDIF
1992 sbtr_mem(myid)=sbtr_mem(myid)+
1993 & dble(mem_subtree(indice_sbtr))
1994 indice_sbtr=indice_sbtr+1
1995 IF(inside_subtree.EQ.0)THEN
1996 inside_subtree=1
1997 ENDIF
1998 ELSE
1999 IF(inode.EQ.my_root_sbtr(indice_sbtr-1))THEN
2000 what = 3
2001 cost=-sbtr_peak_array(indice_sbtr_array-1)
2002 IF(abs(cost).GE.dm_thres_mem)THEN
2003 112 CONTINUE
2005 & what, comm, slavef,
2006 & future_niv2,
2007 & cost, dble(0), myid, keep, ierr )
2008 IF ( ierr == -1 )THEN
2009 CALL zmumps_load_recv_msgs(comm_ld)
2010 CALL mumps_check_comm_nodes(comm_nodes, exit_flag)
2011 IF (exit_flag) THEN
2012 ELSE
2013 GOTO 112
2014 ENDIF
2015 ELSE IF ( ierr .NE. 0 ) THEN
2016 WRITE(*,*)
2017 & "Internal Error 3 in ZMUMPS_LOAD_SBTR_UPD_NEW_POOL",
2018 & ierr
2019 CALL mumps_abort()
2020 ENDIF
2021 ENDIF
2022 indice_sbtr_array=indice_sbtr_array-1
2023 sbtr_mem(myid)=sbtr_mem(myid)-
2024 & sbtr_peak_array(indice_sbtr_array)
2025 sbtr_cur(myid)=sbtr_cur_array(indice_sbtr_array)
2026 IF(indice_sbtr_array.EQ.1)THEN
2027 sbtr_cur(myid)=dble(0)
2028 inside_subtree=0
2029 ENDIF
2030 ENDIF
2031 ENDIF
2032 RETURN

◆ zmumps_load_send_md_info()

subroutine, public zmumps_load::zmumps_load_send_md_info ( integer, intent(in) slavef,
integer, intent(in) nmb_of_cand,
integer, dimension(nmb_of_cand), intent(in) list_of_cand,
integer, dimension(slavef+2), intent(in) tab_pos,
integer, intent(in) nass,
integer, dimension(500) keep,
integer(8), dimension(150) keep8,
integer, dimension(nslaves), intent(in) list_slaves,
integer, intent(in) nslaves,
integer inode )

Definition at line 5085 of file zmumps_load.F.

5089 USE zmumps_buf
5091 IMPLICIT NONE
5092 INTEGER, INTENT (IN) :: SLAVEF, NASS, NSLAVES
5093 INTEGER, INTENT (IN) :: NMB_OF_CAND
5094 INTEGER, INTENT (IN) :: LIST_OF_CAND(NMB_OF_CAND)
5095 INTEGER, INTENT (IN) :: TAB_POS(SLAVEF+2)
5096 INTEGER, INTENT (IN) :: LIST_SLAVES(NSLAVES)
5097 INTEGER KEEP(500),INODE
5098 INTEGER(8) KEEP8(150)
5099 INTEGER allocok
5100 DOUBLE PRECISION MEM_COST,FCT_COST
5101 DOUBLE PRECISION, DIMENSION(:),ALLOCATABLE :: DELTA_MD
5102 INTEGER, DIMENSION(:), ALLOCATABLE :: IPROC2POSINDELTAMD
5103 INTEGER, DIMENSION(:), ALLOCATABLE :: P_TO_UPDATE
5104 INTEGER NBROWS_SLAVE,i,WHAT,IERR
5105 INTEGER :: NP_TO_UPDATE, K
5106 LOGICAL FORCE_CAND
5107 LOGICAL :: EXIT_FLAG
5108 mem_cost=dble(0)
5109 fct_cost=dble(0)
5110 IF ( keep(24) == 0 .OR. keep(24) == 1 ) THEN
5111 force_cand = .false.
5112 ELSE
5113 force_cand = (mod(keep(24),2).eq.0)
5114 END IF
5115 CALL zmumps_load_get_estim_mem_cost(inode,fct_cost,
5116 & mem_cost,nmb_of_cand,nass)
5117 ALLOCATE(iproc2posindeltamd(0:slavef-1),
5118 & delta_md(min(slavef, nmb_of_cand+nslaves)),
5119 & p_to_update(min(slavef, nmb_of_cand+nslaves)),
5120 & stat=allocok)
5121 IF (allocok > 0 ) THEN
5122 WRITE(*,*) "PB ALLOC IN ZMUMPS_LOAD_SEND_MD_INFO",
5123 & slavef, nmb_of_cand, nslaves
5124 CALL mumps_abort()
5125 ENDIF
5126 iproc2posindeltamd = -99
5127 np_to_update = 0
5128 DO i = 1, nslaves
5129 np_to_update = np_to_update + 1
5130 iproc2posindeltamd(list_slaves(i)) = np_to_update
5131 nbrows_slave = tab_pos(i+1) - tab_pos(i)
5132 delta_md(np_to_update)=-dble(nbrows_slave)*
5133 & dble(nass)
5134 p_to_update(np_to_update) = list_slaves(i)
5135 ENDDO
5136 DO i = 1, nmb_of_cand
5137 k = iproc2posindeltamd(list_of_cand(i))
5138 IF ( k > 0 ) THEN
5139 delta_md(k)=delta_md(k)+fct_cost
5140 ELSE
5141 np_to_update = np_to_update + 1
5142 iproc2posindeltamd(list_of_cand(i)) = np_to_update
5143 delta_md(np_to_update) = fct_cost
5144 p_to_update(np_to_update) = list_of_cand(i)
5145 ENDIF
5146 ENDDO
5147 what=7
5148 111 CONTINUE
5149 CALL zmumps_buf_bcast_array(.false., comm_ld, myid, slavef,
5150 & future_niv2,
5151 & np_to_update, p_to_update,0,
5152 & delta_md,
5153 & delta_md,
5154 & delta_md,
5155 & what, keep, ierr)
5156 IF ( ierr == -1 ) THEN
5157 CALL zmumps_load_recv_msgs(comm_ld)
5158 CALL mumps_check_comm_nodes(comm_nodes, exit_flag)
5159 IF (exit_flag) THEN
5160 GOTO 100
5161 ELSE
5162 GOTO 111
5163 ENDIF
5164 ELSE IF ( ierr .NE. 0 ) THEN
5165 WRITE(*,*) "Internal Error 2 in ZMUMPS_LOAD_SEND_MD_INFO",
5166 & ierr
5167 CALL mumps_abort()
5168 ENDIF
5169 IF (future_niv2(myid+1) .NE. 0) THEN
5170 DO i = 1, np_to_update
5171 md_mem(p_to_update(i))=md_mem(p_to_update(i))+
5172 & int(delta_md( i ),8)
5173 IF(future_niv2(p_to_update(i)+1).EQ.0)THEN
5174 md_mem(p_to_update(i))=999999999_8
5175 ENDIF
5176 ENDDO
5177 ENDIF
5178 100 CONTINUE
5179 DEALLOCATE(delta_md,p_to_update,iproc2posindeltamd)
5180 RETURN

◆ zmumps_load_set_inicost()

subroutine, public zmumps_load::zmumps_load_set_inicost ( double precision cost_subtree_arg,
integer, intent(in) k64,
double precision, intent(in) dk15,
integer, intent(in) k375,
integer(8) maxs )

Definition at line 139 of file zmumps_load.F.

141 IMPLICIT NONE
142 DOUBLE PRECISION COST_SUBTREE_ARG
143 INTEGER, INTENT(IN) :: K64, K375
144 DOUBLE PRECISION, INTENT(IN) :: DK15
145 INTEGER(8)::MAXS
146 DOUBLE PRECISION :: T64, T66
147 LOGICAL :: AVOID_LOAD_MESSAGES
148 t64 = max( dble(k64), dble(1) )
149 t64 = min( t64, dble(1000) )
150 t66 = max(dble(dk15), dble(100))
151 min_diff = ( t64 / dble(1000) )*
152 & t66 * dble(1000000)
153 dm_thres_mem = dble(maxs/300_8)
154 cost_subtree = cost_subtree_arg
155 avoid_load_messages = .false.
156 IF (k375.EQ.1) THEN
157 avoid_load_messages = .true.
158 ENDIF
159 IF (avoid_load_messages) THEN
160 min_diff = min_diff * 1000.d0
161 dm_thres_mem = dm_thres_mem * 1000_8
162 ENDIF
163 RETURN

◆ zmumps_load_set_partition()

subroutine, public zmumps_load::zmumps_load_set_partition ( integer, intent(in) ncbson_max,
integer, intent(in) slavef,
integer, dimension(500), intent(in) keep,
integer(8), dimension(150) keep8,
integer, dimension(60), intent(in) icntl,
integer, dimension(slavef+1), intent(in) cand_of_node,
integer, dimension(0:slavef-1), intent(in) mem_distrib,
integer, intent(inout) ncb,
integer, intent(in) nfront,
integer, intent(out) nslaves_node,
integer, dimension(slavef+2), intent(out) tab_pos,
integer, dimension(size_slaves_list), intent(out) slaves_list,
integer, intent(in) size_slaves_list,
integer, intent(in) inode )

Definition at line 309 of file zmumps_load.F.

316 IMPLICIT NONE
317 INTEGER, intent(in) :: KEEP(500),SIZE_SLAVES_LIST
318 INTEGER(8) KEEP8(150)
319 INTEGER, intent(in) :: ICNTL(60)
320 INTEGER, intent(in) :: SLAVEF, NFRONT
321 INTEGER, intent (inout) ::NCB
322 INTEGER, intent(in) :: CAND_OF_NODE(SLAVEF+1)
323 INTEGER, intent(in) :: MEM_DISTRIB(0:SLAVEF-1),INODE
324 INTEGER, intent(in) :: NCBSON_MAX
325 INTEGER, intent(out):: SLAVES_LIST(SIZE_SLAVES_LIST)
326 INTEGER, intent(out):: TAB_POS(SLAVEF+2)
327 INTEGER, intent(out):: NSLAVES_NODE
328 INTEGER i
329 INTEGER LP,MP
330 INTEGER(8) DUMMY1
331 INTEGER DUMMY2
332 INTEGER TMP_ARRAY(2)
333 lp=icntl(4)
334 mp=icntl(2)
335 IF ( keep(48) == 0 .OR. keep(48) .EQ. 3 ) THEN
336 CALL zmumps_load_parti_regular(
337 & slavef,
338 & keep,keep8,
339 & cand_of_node,
340 & mem_distrib, ncb, nfront, nslaves_node,
341 & tab_pos, slaves_list, size_slaves_list)
342 ELSE IF ( keep(48) == 4 ) THEN
343 CALL zmumps_set_parti_actv_mem(
344 & slavef,
345 & keep,keep8,
346 & cand_of_node,
347 & mem_distrib, ncb, nfront, nslaves_node,
348 & tab_pos, slaves_list, size_slaves_list,myid)
349 DO i=1,nslaves_node
350 IF(tab_pos(i+1)-tab_pos(i).LE.0)THEN
351 WRITE(*,*)'probleme de partition dans
352 &ZMUMPS_LOAD_SET_PARTI_ACTV_MEM'
353 CALL mumps_abort()
354 ENDIF
355 ENDDO
356 ELSE IF ( keep(48) == 5 ) THEN
357 IF (keep(375).EQ.1) THEN
358 GOTO 458
359 ENDIF
360 CALL zmumps_set_parti_flop_irr(
361 & ncbson_max,
362 & slavef,
363 & keep,keep8,
364 & cand_of_node,
365 & mem_distrib, ncb, nfront, nslaves_node,
366 & tab_pos, slaves_list, size_slaves_list,myid,inode,
367 & mp,lp)
368 DO i=1,nslaves_node
369 IF(tab_pos(i+1)-tab_pos(i).LE.0)THEN
370 WRITE(*,*)'problem with partition in
371 &ZMUMPS_SET_PARTI_FLOP_IRR'
372 CALL mumps_abort()
373 ENDIF
374 ENDDO
375 GOTO 457
376 458 CONTINUE
377 IF ( keep(375).EQ.1 )THEN
378 tmp_array(1)=0
379 tmp_array(2)=0
380 ENDIF
382 & slavef,
383 & keep,keep8,
384 & cand_of_node,
385 & mem_distrib, ncb, nfront, nslaves_node,
386 & tab_pos, slaves_list, size_slaves_list,myid,inode,
387 & tab_maxs,tmp_array,dummy1,dummy2
388 & )
389 ELSE
390 WRITE(*,*) "Strategy 6 not implemented"
391 CALL mumps_abort()
392 ENDIF
393 457 CONTINUE
394 RETURN
subroutine mumps_set_parti_regular(slavef, keep, keep8, procs, mem_distrib, ncb, nfront, nslaves_node, tab_pos, slaves_list, size_slaves_list, myid, inode, tab_maxs_arg, sup_proc_arg, max_surf, nb_row_max)

◆ zmumps_load_set_sbtr_mem()

subroutine, public zmumps_load::zmumps_load_set_sbtr_mem ( logical what)

Definition at line 4713 of file zmumps_load.F.

4714 IMPLICIT NONE
4715 LOGICAL WHAT
4716 IF(.NOT.bdc_pool_mng)THEN
4717 WRITE(*,*)'ZMUMPS_LOAD_SET_SBTR_MEM
4718 & should be called when K81>0 and K47>2'
4719 ENDIF
4720 IF(what)THEN
4721 peak_sbtr_cur_local=peak_sbtr_cur_local+
4722 & dble(mem_subtree(indice_sbtr))
4723 IF(.NOT.bdc_sbtr) indice_sbtr=indice_sbtr+1
4724 ELSE
4725 peak_sbtr_cur_local=dble(0)
4726 sbtr_cur_local=dble(0)
4727 ENDIF

◆ zmumps_load_set_slaves()

subroutine, public zmumps_load::zmumps_load_set_slaves ( integer, dimension(0:nprocs - 1) mem_distrib,
double precision msg_size,
integer, dimension(nslaves) dest,
integer nslaves )

Definition at line 1061 of file zmumps_load.F.

1063 IMPLICIT NONE
1064 INTEGER NSLAVES
1065 INTEGER DEST(NSLAVES)
1066 INTEGER, DIMENSION(0:NPROCS - 1) :: MEM_DISTRIB
1067 INTEGER i,J,NBDEST
1068 DOUBLE PRECISION MSG_SIZE
1069 IF ( nslaves.eq.nprocs-1 ) THEN
1070 j = myid+1
1071 DO i=1,nslaves
1072 j=j+1
1073 IF (j.GT.nprocs) j=1
1074 dest(i) = j - 1
1075 ENDDO
1076 ELSE
1077 DO i=1,nprocs
1078 idwload(i) = i - 1
1079 ENDDO
1080 CALL mumps_sort_doubles(nprocs, wload, idwload)
1081 nbdest = 0
1082 DO i=1, nslaves
1083 j = idwload(i)
1084 IF (j.NE.myid) THEN
1085 nbdest = nbdest+1
1086 dest(nbdest) = j
1087 ENDIF
1088 ENDDO
1089 IF (nbdest.NE.nslaves) THEN
1090 dest(nslaves) = idwload(nslaves+1)
1091 ENDIF
1092 IF(bdc_md)THEN
1093 j=nslaves+1
1094 do i=nslaves+1,nprocs
1095 IF(idwload(i).NE.myid)THEN
1096 dest(j)= idwload(i)
1097 j=j+1
1098 ENDIF
1099 end do
1100 ENDIF
1101 ENDIF
1102 RETURN
subroutine mumps_sort_doubles(n, val, id)

◆ zmumps_load_set_slaves_cand()

subroutine, public zmumps_load::zmumps_load_set_slaves_cand ( integer, dimension(0:nprocs - 1), intent(in) mem_distrib,
integer, dimension(slavef+1), intent(in) cand,
integer, intent(in) slavef,
integer, intent(in) nslaves_inode,
integer, dimension(cand(slavef+1)), intent(out) dest )

Definition at line 1525 of file zmumps_load.F.

1530 implicit none
1531 integer, intent(in) :: nslaves_inode, SLAVEF
1532 integer, intent(in) :: CAND(SLAVEF+1)
1533 integer, dimension(0:NPROCS - 1), intent(in) :: MEM_DISTRIB
1534 integer, intent(out) :: DEST(CAND(SLAVEF+1))
1535 integer i,j,NMB_OF_CAND
1536 external MUMPS_SORT_DOUBLES
1537 nmb_of_cand = cand(slavef+1)
1538 if(nslaves_inode.ge.nprocs .or.
1539 & nslaves_inode.gt.nmb_of_cand) then
1540 write(*,*)'Internal error in ZMUMPS_LOAD_SET_SLAVES_CAND',
1541 & nslaves_inode, nprocs, nmb_of_cand
1542 CALL mumps_abort()
1543 end if
1544 if (nslaves_inode.eq.nprocs-1) then
1545 j=myid+1
1546 do i=1,nslaves_inode
1547 if(j.ge.nprocs) j=0
1548 dest(i)=j
1549 j=j+1
1550 end do
1551 else
1552 do i=1,nmb_of_cand
1553 idwload(i)=i
1554 end do
1555 call mumps_sort_doubles(nmb_of_cand,
1556 & wload(1),idwload(1) )
1557 do i=1,nslaves_inode
1558 dest(i)= cand(idwload(i))
1559 end do
1560 IF(bdc_md)THEN
1561 do i=nslaves_inode+1,nmb_of_cand
1562 dest(i)= cand(idwload(i))
1563 end do
1564 ENDIF
1565 end if
1566 return

◆ zmumps_load_update()

subroutine, public zmumps_load::zmumps_load_update ( integer check_flops,
logical process_bande,
double precision inc_load,
integer, dimension(500) keep,
integer(8), dimension(150) keep8 )

Definition at line 822 of file zmumps_load.F.

824 USE zmumps_buf
826 IMPLICIT NONE
827 DOUBLE PRECISION INC_LOAD
828 INTEGER KEEP(500)
829 INTEGER(8) KEEP8(150)
830 LOGICAL PROCESS_BANDE
831 LOGICAL :: EXIT_FLAG
832 INTEGER CHECK_FLOPS
833 INTEGER IERR
834 DOUBLE PRECISION ZERO, SEND_MEM, SEND_LOAD,SBTR_TMP
835 parameter( zero=0.0d0 )
836 INTRINSIC max
837 IF (.NOT. is_mumps_load_enabled) RETURN
838 IF (inc_load == 0.0d0) THEN
839 IF(remove_node_flag)THEN
840 remove_node_flag=.false.
841 ENDIF
842 RETURN
843 ENDIF
844 IF((check_flops.NE.0).AND.
845 & (check_flops.NE.1).AND.(check_flops.NE.2))THEN
846 WRITE(*,*)myid,': Bad value for CHECK_FLOPS'
847 CALL mumps_abort()
848 ENDIF
849 IF(check_flops.EQ.1)THEN
850 chk_ld=chk_ld+inc_load
851 ELSE
852 IF(check_flops.EQ.2)THEN
853 RETURN
854 ENDIF
855 ENDIF
856 IF ( process_bande ) THEN
857 RETURN
858 ENDIF
859 load_flops( myid ) = max( load_flops( myid ) + inc_load, zero)
860 IF(bdc_m2_flops.AND.remove_node_flag)THEN
861 IF(inc_load.NE.remove_node_cost)THEN
862 IF(inc_load.GT.remove_node_cost)THEN
863 delta_load = delta_load +
864 & (inc_load-remove_node_cost)
865 GOTO 888
866 ELSE
867 delta_load = delta_load -
868 & (remove_node_cost-inc_load)
869 GOTO 888
870 ENDIF
871 ENDIF
872 GOTO 333
873 ENDIF
874 delta_load = delta_load + inc_load
875 888 CONTINUE
876 IF ( delta_load > min_diff .OR. delta_load < -min_diff) THEN
877 send_load = delta_load
878 IF (bdc_mem) THEN
879 send_mem = delta_mem
880 ELSE
881 send_mem = zero
882 END IF
883 IF(bdc_sbtr)THEN
884 sbtr_tmp=sbtr_cur(myid)
885 ELSE
886 sbtr_tmp=dble(0)
887 ENDIF
888 111 CONTINUE
889 CALL zmumps_buf_send_update_load( bdc_sbtr,bdc_mem,
890 & bdc_md,comm_ld, nprocs,
891 & send_load,
892 & send_mem,sbtr_tmp,
893 & dm_sumlu,
894 & future_niv2,
895 & myid, keep, ierr )
896 IF ( ierr == -1 )THEN
897 CALL zmumps_load_recv_msgs(comm_ld)
898 CALL mumps_check_comm_nodes(comm_nodes, exit_flag)
899 IF (exit_flag) THEN
900 GOTO 333
901 ELSE
902 GOTO 111
903 ENDIF
904 ELSE IF ( ierr .NE.0 ) THEN
905 WRITE(*,*) "Internal Error in ZMUMPS_LOAD_UPDATE",ierr
906 CALL mumps_abort()
907 ENDIF
908 delta_load = zero
909 IF (bdc_mem) delta_mem = zero
910 ENDIF
911 333 CONTINUE
912 IF(remove_node_flag)THEN
913 remove_node_flag=.false.
914 ENDIF
915 RETURN

◆ zmumps_next_node()

recursive subroutine zmumps_load::zmumps_next_node ( logical flag,
double precision cost,
integer comm )

Definition at line 4758 of file zmumps_load.F.

4759 USE zmumps_buf
4761 IMPLICIT NONE
4762 INTEGER COMM,WHAT,IERR
4763 LOGICAL FLAG, EXIT_FLAG
4764 DOUBLE PRECISION COST
4765 DOUBLE PRECISION TO_BE_SENT
4766 EXTERNAL mumps_typenode
4767 INTEGER MUMPS_TYPENODE
4768 IF(flag)THEN
4769 what=17
4770 IF(bdc_m2_flops)THEN
4771 to_be_sent=delta_load-cost
4772 delta_load=dble(0)
4773 ELSE IF(bdc_m2_mem)THEN
4774 IF(bdc_pool.AND.(.NOT.bdc_md))THEN
4775 to_be_sent=max(tmp_m2,pool_last_cost_sent)
4776 pool_last_cost_sent=to_be_sent
4777 ELSE IF(bdc_md)THEN
4778 delta_mem=delta_mem+tmp_m2
4779 to_be_sent=delta_mem
4780 ELSE
4781 to_be_sent=dble(0)
4782 ENDIF
4783 ENDIF
4784 ELSE
4785 what=6
4786 to_be_sent=dble(0)
4787 ENDIF
4788 111 CONTINUE
4789 CALL zmumps_buf_broadcast( what,
4790 & comm, nprocs,
4791 & future_niv2,
4792 & cost,
4793 & to_be_sent,
4794 & myid, keep_load, ierr )
4795 IF ( ierr == -1 )THEN
4796 CALL zmumps_load_recv_msgs(comm_ld)
4797 CALL mumps_check_comm_nodes(comm_nodes, exit_flag)
4798 IF (exit_flag) THEN
4799 GOTO 100
4800 ELSE
4801 GOTO 111
4802 ENDIF
4803 ELSE IF ( ierr .NE. 0 ) THEN
4804 WRITE(*,*) "Internal Error in ZMUMPS_LOAD_POOL_UPD_NEW_POOL",
4805 & ierr
4806 CALL mumps_abort()
4807 ENDIF
4808 100 CONTINUE
4809 RETURN

◆ zmumps_process_niv2_flops_msg()

recursive subroutine zmumps_load::zmumps_process_niv2_flops_msg ( integer inode)

Definition at line 4993 of file zmumps_load.F.

4994 IMPLICIT NONE
4995 INTEGER INODE
4996 EXTERNAL mumps_typenode
4997 INTEGER MUMPS_TYPENODE
4998 IF((inode.EQ.keep_load(20)).OR.
4999 & (inode.EQ.keep_load(38)))THEN
5000 RETURN
5001 ENDIF
5002 IF(nb_son(step_load(inode)).EQ.-1)THEN
5003 RETURN
5004 ELSE
5005 IF(nb_son(step_load(inode)).LT.0)THEN
5006 WRITE(*,*)
5007 & 'Internal error 1 in ZMUMPS_PROCESS_NIV2_FLOPS_MSG'
5008 CALL mumps_abort()
5009 ENDIF
5010 ENDIF
5011 nb_son(step_load(inode))=
5012 & nb_son(step_load(inode))-1
5013 IF(nb_son(step_load(inode)).EQ.0)THEN
5014 IF(pool_size.EQ.pool_niv2_size)THEN
5015 WRITE(*,*)myid,': Internal Error 2 in
5016 &ZMUMPS_PROCESS_NIV2_FLOPS_MSG',pool_niv2_size,
5017 & pool_size
5018 CALL mumps_abort()
5019 ENDIF
5020 pool_niv2(pool_size+1)=inode
5021 pool_niv2_cost(pool_size+1)=
5022 & zmumps_load_get_flops_cost(inode)
5023 pool_size=pool_size+1
5024 max_m2=pool_niv2_cost(pool_size)
5025 id_max_m2=pool_niv2(pool_size)
5026 CALL zmumps_next_node(remove_node_flag,
5027 & pool_niv2_cost(pool_size),
5028 & comm_ld)
5029 niv2(myid+1)=pool_niv2_cost(pool_size)+niv2(myid+1)
5030 ENDIF
5031 RETURN

◆ zmumps_process_niv2_mem_msg()

recursive subroutine zmumps_load::zmumps_process_niv2_mem_msg ( integer inode)

Definition at line 4954 of file zmumps_load.F.

4955 IMPLICIT NONE
4956 INTEGER INODE
4957 EXTERNAL mumps_typenode
4958 INTEGER MUMPS_TYPENODE
4959 IF((inode.EQ.keep_load(20)).OR.
4960 & (inode.EQ.keep_load(38)))THEN
4961 RETURN
4962 ENDIF
4963 IF(nb_son(step_load(inode)).EQ.-1)THEN
4964 RETURN
4965 ELSE
4966 IF(nb_son(step_load(inode)).LT.0)THEN
4967 WRITE(*,*)
4968 & 'Internal error 1 in ZMUMPS_PROCESS_NIV2_MEM_MSG'
4969 CALL mumps_abort()
4970 ENDIF
4971 ENDIF
4972 nb_son(step_load(inode))=
4973 & nb_son(step_load(inode))-1
4974 IF(nb_son(step_load(inode)).EQ.0)THEN
4975 IF(pool_size.EQ.pool_niv2_size)THEN
4976 WRITE(*,*)myid,': Internal Error 2 in
4977 &ZMUMPS_PROCESS_NIV2_MEM_MSG'
4978 CALL mumps_abort()
4979 ENDIF
4980 pool_niv2(pool_size+1)=inode
4981 pool_niv2_cost(pool_size+1)=
4982 & zmumps_load_get_mem(inode)
4983 pool_size=pool_size+1
4984 IF(pool_niv2_cost(pool_size).GT.max_m2)THEN
4985 max_m2=pool_niv2_cost(pool_size)
4986 id_max_m2=pool_niv2(pool_size)
4987 CALL zmumps_next_node(remove_node_flag_mem,max_m2,comm_ld)
4988 niv2(1+myid)=max_m2
4989 ENDIF
4990 ENDIF
4991 RETURN

◆ zmumps_remove_node()

subroutine, public zmumps_load::zmumps_remove_node ( integer inode,
integer num_call )

Definition at line 4899 of file zmumps_load.F.

4900 IMPLICIT NONE
4901 DOUBLE PRECISION MAXI
4902 INTEGER i,J,IND_MAXI
4903 INTEGER INODE,NUM_CALL
4904 IF(bdc_m2_mem)THEN
4905 IF(((num_call.EQ.1).AND.(bdc_md)).OR.
4906 & ((num_call.EQ.2).AND.(.NOT.bdc_md)))THEN
4907 RETURN
4908 ENDIF
4909 ENDIF
4910 IF((frere_load(step_load(inode)).EQ.0).AND.
4911 & ((inode.EQ.keep_load(38)).OR.
4912 & (inode.EQ.keep_load(20)))) THEN
4913 RETURN
4914 ENDIF
4915 DO i=pool_size,1,-1
4916 IF(pool_niv2(i).EQ.inode) GOTO 666
4917 ENDDO
4918 nb_son(step_load(inode))=-1
4919 RETURN
4920 666 CONTINUE
4921 IF(bdc_m2_mem)THEN
4922 IF(pool_niv2_cost(i).EQ.max_m2)THEN
4923 tmp_m2=max_m2
4924 maxi=dble(0)
4925 ind_maxi=-9999
4926 DO j=pool_size,1,-1
4927 IF(j.NE.i) THEN
4928 IF(pool_niv2_cost(j).GT.maxi)THEN
4929 maxi=pool_niv2_cost(j)
4930 ind_maxi=j
4931 ENDIF
4932 ENDIF
4933 ENDDO
4934 max_m2=maxi
4935 j=ind_maxi
4936 remove_node_flag_mem=.true.
4937 remove_node_cost_mem=tmp_m2
4938 CALL zmumps_next_node(remove_node_flag,max_m2,comm_ld)
4939 niv2(myid+1)=max_m2
4940 ENDIF
4941 ELSEIF(bdc_m2_flops)THEN
4942 remove_node_cost=pool_niv2_cost(i)
4943 remove_node_flag=.true.
4944 CALL zmumps_next_node(remove_node_flag,
4945 & -pool_niv2_cost(i),comm_ld)
4946 niv2(myid+1)=niv2(myid+1)-pool_niv2_cost(i)
4947 ENDIF
4948 DO j=i+1,pool_size
4949 pool_niv2(j-1)=pool_niv2(j)
4950 pool_niv2_cost(j-1)=pool_niv2_cost(j)
4951 ENDDO
4952 pool_size=pool_size-1

◆ zmumps_set_parti_actv_mem()

subroutine zmumps_load::zmumps_set_parti_actv_mem ( integer, intent(in) slavef,
integer, dimension(500), intent(in) keep,
integer(8), dimension(150) keep8,
integer, dimension(slavef+1), intent(in) procs,
integer, dimension(0:slavef-1), intent(in) mem_distrib,
integer, intent(in) ncb,
integer, intent(in) nfront,
integer, intent(out) nslaves_node,
integer, dimension(slavef+2), intent(out) tab_pos,
integer, dimension(size_slaves_list), intent(out) slaves_list,
integer, intent(in) size_slaves_list,
integer, intent(in) myid )

Definition at line 2034 of file zmumps_load.F.

2038 IMPLICIT NONE
2039 INTEGER, intent(in) :: KEEP(500),SIZE_SLAVES_LIST
2040 INTEGER(8) KEEP8(150)
2041 INTEGER, intent(in) :: SLAVEF, NFRONT, NCB,MYID
2042 INTEGER, intent(in) :: PROCS(SLAVEF+1)
2043 INTEGER, intent(in) :: MEM_DISTRIB(0:SLAVEF-1)
2044 INTEGER, intent(out):: SLAVES_LIST(SIZE_SLAVES_LIST)
2045 INTEGER, intent(out):: TAB_POS(SLAVEF+2)
2046 INTEGER, intent(out):: NSLAVES_NODE
2047 INTEGER NUMBER_OF_PROCS,K47, K48, K50
2048 INTEGER(8) :: K821
2049 DOUBLE PRECISION DK821
2050 INTEGER J
2051 INTEGER KMIN, KMAX
2052 INTEGER OTHERS,CHOSEN,SMALL_SET,ACC
2053 DOUBLE PRECISION SOMME,TMP_SUM
2054 INTEGER AFFECTED
2055 INTEGER ADDITIONNAL_ROWS,i,X,REF,POS
2056 INTEGER(8)::TOTAL_MEM
2057 LOGICAL FORCE_CAND
2058 DOUBLE PRECISION TEMP(SLAVEF),PEAK
2059 INTEGER TEMP_ID(SLAVEF),NB_ROWS(SLAVEF)
2060 EXTERNAL mpi_wtime
2061 DOUBLE PRECISION MPI_WTIME
2062 IF (keep8(21) .GT. 0_8) THEN
2063 write(*,*)myid,
2064 & ": Internal Error 1 in ZMUMPS_SET_PARTI_ACTV_MEM"
2065 CALL mumps_abort()
2066 ENDIF
2067 k821=abs(keep8(21))
2068 dk821=dble(k821)
2069 k50=keep(50)
2070 k48=keep(48)
2071 k47=keep(47)
2072 IF ( keep(24) == 0 .OR. keep(24) == 1 ) THEN
2073 force_cand = .false.
2074 ELSE
2075 force_cand = (mod(keep(24),2).eq.0)
2076 END IF
2077 IF(k48.NE.4)THEN
2078 WRITE(*,*)'ZMUMPS_COMPUTE_PARTI_ACTV_MEM_K821
2079 & should be called with KEEP(48) different from 4'
2080 CALL mumps_abort()
2081 ENDIF
2082 kmin=1
2083 kmax=int(k821/int(nfront,8))
2084 IF(force_cand)THEN
2085 DO i=1,procs(slavef+1)
2086 wload(i)=dm_mem(procs(i))
2087 idwload(i)=procs(i)
2088 ENDDO
2089 number_of_procs=procs(slavef+1)
2090 others=number_of_procs
2091 ELSE
2092 number_of_procs=slavef
2093 wload(1:slavef) = dm_mem(0:number_of_procs-1)
2094 DO i=1,number_of_procs
2095 idwload(i) = i - 1
2096 ENDDO
2097 others=number_of_procs-1
2098 ENDIF
2099 nb_rows=0
2100 CALL mumps_sort_doubles(number_of_procs, wload, idwload)
2101 total_mem=int(ncb,8)*int(nfront,8)
2102 somme=dble(0)
2103 j=1
2104 peak=dble(0)
2105 DO i=1,number_of_procs
2106 IF((idwload(i).NE.myid))THEN
2107 peak=max(peak,wload(i))
2108 temp_id(j)=idwload(i)
2109 temp(j)=wload(i)
2110 IF(bdc_sbtr)THEN
2111 temp(j)=temp(j)+sbtr_mem(idwload(i))-
2112 & sbtr_cur(idwload(i))
2113 ENDIF
2114 IF(bdc_pool)THEN
2115 temp(j)=temp(j)+pool_mem(temp_id(j))
2116 ENDIF
2117 IF(bdc_m2_mem)THEN
2118 temp(j)=temp(j)+niv2(temp_id(j)+1)
2119 ENDIF
2120 j=j+1
2121 ENDIF
2122 ENDDO
2123 number_of_procs=j-1
2124 CALL mumps_sort_doubles(number_of_procs, temp, temp_id)
2125 IF(k50.EQ.0)THEN
2126 peak=max(peak,
2127 & dm_mem(myid)+dble(nfront)*dble(nfront-ncb))
2128 ELSE
2129 peak=max(peak,
2130 & dm_mem(myid)+dble(nfront-ncb)*dble(nfront-ncb))
2131 ENDIF
2132 peak=max(peak,temp(others))
2133 somme=dble(0)
2134 DO i=1,number_of_procs
2135 somme=somme+temp(others)-temp(i)
2136 ENDDO
2137 IF(somme.LE.dble(total_mem)) THEN
2138 GOTO 096
2139 ENDIF
2140 096 CONTINUE
2141 somme=dble(0)
2142 DO i=1,others
2143 somme=somme+temp(others)-temp(i)
2144 ENDDO
2145 IF(dble(total_mem).GE.somme) THEN
2146 affected=0
2147 chosen=0
2148 acc=0
2149 DO i=1,others
2150 IF(k50.EQ.0)THEN
2151 IF((temp(others)-temp(i)).GT.dk821)THEN
2152 tmp_sum=dk821
2153 ELSE
2154 tmp_sum=temp(others)-temp(i)
2155 ENDIF
2156 x=int(tmp_sum/dble(nfront))
2157 IF((acc+x).GT.ncb) x=ncb-acc
2158 ENDIF
2159 IF(k50.NE.0)THEN
2160 IF((temp(others)-temp(i)).GT.dk821)THEN
2161 tmp_sum=dk821
2162 ELSE
2163 tmp_sum=temp(others)-temp(i)
2164 ENDIF
2165 x=int((-dble(nfront-ncb+acc)
2166 & +sqrt(((dble(nfront-ncb+acc)*
2167 & dble(nfront-ncb+acc))+dble(4)*
2168 & (tmp_sum))))/
2169 & dble(2))
2170 IF((acc+x).GT.ncb) x=ncb-acc
2171 IF(x.LE.0) THEN
2172 WRITE(*,*)"Internal Error 2 in
2173 & ZMUMPS_SET_PARTI_ACTV_MEM"
2174 CALL mumps_abort()
2175 ENDIF
2176 ENDIF
2177 nb_rows(i)=x
2178 chosen=chosen+1
2179 acc=acc+x
2180 IF(ncb-acc.LT.kmin) GOTO 111
2181 IF(ncb.EQ.acc) GOTO 111
2182 ENDDO
2183 111 CONTINUE
2184 IF((acc.GT.ncb))THEN
2185 x=0
2186 DO i=1,others
2187 x=x+nb_rows(i)
2188 ENDDO
2189 WRITE(*,*)'NCB=',ncb,',SOMME=',x
2190 WRITE(*,*)myid,
2191 & ": Internal Error 3 in ZMUMPS_SET_PARTI_ACTV_MEM"
2192 CALL mumps_abort()
2193 ENDIF
2194 IF((ncb.NE.acc))THEN
2195 IF(k50.NE.0)THEN
2196 IF(chosen.NE.0)THEN
2197 additionnal_rows=ncb-acc
2198 nb_rows(chosen)=nb_rows(chosen)+additionnal_rows
2199 ELSE
2200 tmp_sum=dble(total_mem)/dble(number_of_procs)
2201 chosen=0
2202 acc=0
2203 DO i=1,others
2204 x=int((-dble(nfront-ncb+acc)
2205 & +sqrt(((dble(nfront-ncb+acc)*
2206 & dble(nfront-ncb+acc))+dble(4)*
2207 & (tmp_sum))))/
2208 & dble(2))
2209 IF((acc+x).GT.ncb) x=ncb-acc
2210 nb_rows(i)=x
2211 chosen=chosen+1
2212 acc=acc+x
2213 IF(ncb-acc.LT.kmin) GOTO 002
2214 IF(ncb.EQ.acc) GOTO 002
2215 ENDDO
2216 002 CONTINUE
2217 IF(acc.LT.ncb)THEN
2218 nb_rows(chosen)=nb_rows(chosen)+(ncb-acc)
2219 ENDIF
2220 ENDIF
2221 GOTO 333
2222 ENDIF
2223 additionnal_rows=ncb-acc
2224 DO i=chosen,1,-1
2225 IF(int(dble(additionnal_rows)/
2226 & dble(i)).NE.0)THEN
2227 GOTO 222
2228 ENDIF
2229 ENDDO
2230 222 CONTINUE
2231 x=int(dble(additionnal_rows)/dble(i))
2232 DO j=1,i
2233 nb_rows(j)=nb_rows(j)+x
2234 additionnal_rows=additionnal_rows-x
2235 ENDDO
2236 IF(additionnal_rows.NE.0) THEN
2237 nb_rows(1)=nb_rows(1)+additionnal_rows
2238 ENDIF
2239 ENDIF
2240 333 CONTINUE
2241 IF(nb_rows(chosen).EQ.0) chosen=chosen-1
2242 GOTO 889
2243 ELSE
2244 DO i=others,1,-1
2245 somme=dble(0)
2246 DO j=1,i
2247 somme=somme+temp(j)
2248 ENDDO
2249 somme=(dble(i)*temp(i))-somme
2250 IF(dble(total_mem).GE.somme) GOTO 444
2251 ENDDO
2252 444 CONTINUE
2253 ref=i
2254 DO j=1,i
2255 IF(temp(j).EQ.temp(i)) THEN
2256 small_set=j
2257 GOTO 123
2258 ENDIF
2259 ENDDO
2260 123 CONTINUE
2261 IF(i.EQ.1)THEN
2262 nb_rows(i)=ncb
2263 chosen=1
2264 GOTO 666
2265 ENDIF
2266 323 CONTINUE
2267 affected=0
2268 chosen=0
2269 acc=0
2270 DO i=1,small_set
2271 IF(k50.EQ.0)THEN
2272 IF((temp(small_set)-temp(i)).GT.dk821)THEN
2273 tmp_sum=dk821
2274 ELSE
2275 tmp_sum=temp(small_set)-temp(i)
2276 ENDIF
2277 x=int(tmp_sum/dble(nfront))
2278 IF((acc+x).GT.ncb) x=ncb-acc
2279 ENDIF
2280 IF(k50.NE.0)THEN
2281 IF((temp(small_set)-temp(i)).GT.dk821)THEN
2282 tmp_sum=dk821
2283 ELSE
2284 tmp_sum=temp(small_set)-temp(i)
2285 ENDIF
2286 x=int((-dble(nfront-ncb+acc)
2287 & +sqrt(((dble(nfront-ncb+acc)*
2288 & dble(nfront-ncb+acc))+dble(4)*
2289 & (tmp_sum))))/
2290 & dble(2))
2291 IF(x.LT.0)THEN
2292 WRITE(*,*)myid,
2293 & ': Internal error 4 in ZMUMPS_SET_PARTI_ACTV_MEM'
2294 CALL mumps_abort()
2295 ENDIF
2296 IF((acc+x).GT.ncb) x=ncb-acc
2297 ENDIF
2298 nb_rows(i)=x
2299 acc=acc+x
2300 chosen=chosen+1
2301 IF(ncb-acc.LT.kmin) GOTO 888
2302 IF(ncb.EQ.acc) GOTO 888
2303 IF(acc.GT.ncb) THEN
2304 WRITE(*,*)myid,
2305 & ': Internal error 5 in ZMUMPS_SET_PARTI_ACTV_MEM'
2306 CALL mumps_abort()
2307 ENDIF
2308 ENDDO
2309 888 CONTINUE
2310 somme=dble(0)
2311 x=nfront-ncb
2312 IF((acc.GT.ncb))THEN
2313 WRITE(*,*)myid,
2314 & ':Internal error 6 in ZMUMPS_SET_PARTI_ACTV_MEM'
2315 CALL mumps_abort()
2316 ENDIF
2317 IF((acc.LT.ncb))THEN
2318 IF(k50.NE.0)THEN
2319 IF(small_set.LT.others)THEN
2320 small_set=ref+1
2321 ref=small_set
2322 GOTO 323
2323 ELSE
2324 nb_rows(chosen)=nb_rows(chosen)+ncb-acc
2325 GOTO 666
2326 ENDIF
2327 ENDIF
2328 additionnal_rows=ncb-acc
2329 i=chosen+1
2330 DO WHILE ((additionnal_rows.NE.0)
2331 & .AND.(i.LE.number_of_procs))
2332 j=1
2333 x=int(additionnal_rows/(i-1))
2334 IF((x.EQ.0).AND.(additionnal_rows.NE.0))THEN
2335 DO WHILE ((j.LT.i).AND.(additionnal_rows.GT.0))
2336 nb_rows(j)=nb_rows(j)+1
2337 additionnal_rows=additionnal_rows-1
2338 j=j+1
2339 ENDDO
2340 IF(additionnal_rows.NE.0)THEN
2341 WRITE(*,*)myid,
2342 & ':Internal error 7 in ZMUMPS_SET_PARTI_ACTV_MEM'
2343 CALL mumps_abort()
2344 ENDIF
2345 GOTO 047
2346 ENDIF
2347 IF((temp(1)+dble((nb_rows(1)+x)*nfront)).LE.
2348 & temp(i))THEN
2349 DO WHILE ((additionnal_rows.NE.0)
2350 & .AND.(j.LT.i))
2351 affected=x
2352 IF((affected+nb_rows(j)).GT.
2353 & kmax)THEN
2354 affected=kmax-nb_rows(j)
2355 ENDIF
2356 nb_rows(j)=nb_rows(j)+affected
2357 additionnal_rows=additionnal_rows-
2358 & affected
2359 j=j+1
2360 ENDDO
2361 ELSE
2362 DO WHILE ((additionnal_rows.NE.0)
2363 & .AND.(j.LE.i))
2364 affected=int((temp(i)-(temp(j)+
2365 & (dble(nb_rows(j))*dble(nfront))))
2366 & /dble(nfront))
2367 IF((affected+nb_rows(j)).GT.kmax)THEN
2368 affected=kmax-nb_rows(j)
2369 ENDIF
2370 IF(affected.GT.additionnal_rows)THEN
2371 affected=additionnal_rows
2372 ENDIF
2373 nb_rows(j)=nb_rows(j)+affected
2374 additionnal_rows=additionnal_rows-affected
2375 j=j+1
2376 ENDDO
2377 ENDIF
2378 i=i+1
2379 ENDDO
2380 047 CONTINUE
2381 IF((additionnal_rows.EQ.0).AND.
2382 & (i.LT.number_of_procs))THEN
2383 chosen=i-1
2384 ELSE
2385 chosen=i-2
2386 ENDIF
2387 IF((chosen.EQ.number_of_procs-1).AND.
2388 & (additionnal_rows.NE.0))THEN
2389 DO i=1,chosen
2390 nb_rows(i)=nb_rows(i)+1
2391 additionnal_rows=additionnal_rows-1
2392 IF(additionnal_rows.EQ.0) GOTO 048
2393 ENDDO
2394 048 CONTINUE
2395 ENDIF
2396 IF((chosen.EQ.number_of_procs-1).AND.
2397 & (additionnal_rows.NE.0))THEN
2398 i=chosen+1
2399 DO WHILE ((additionnal_rows.NE.0)
2400 & .AND.(i.LE.number_of_procs))
2401 j=1
2402 DO WHILE ((additionnal_rows.NE.0)
2403 & .AND.(j.LE.i))
2404 affected=int((temp(i)-(temp(j)+
2405 & (dble(nb_rows(j))*
2406 & dble(nfront))))/dble(nfront))
2407 IF(affected.GT.additionnal_rows)THEN
2408 affected=additionnal_rows
2409 ENDIF
2410 nb_rows(j)=nb_rows(j)+affected
2411 additionnal_rows=additionnal_rows-affected
2412 j=j+1
2413 ENDDO
2414 i=i+1
2415 ENDDO
2416 chosen=i-2
2417 ENDIF
2418 CONTINUE
2419 ENDIF
2420 666 CONTINUE
2421 somme=dble(0)
2422 x=0
2423 pos=0
2424 DO i=1,chosen
2425 IF(k50.NE.0) THEN
2426 IF((temp(i)+dble(nb_rows(i))
2427 & *dble(x+nb_rows(i)+nfront-ncb))
2428 & .GT.peak)THEN
2429 small_set=small_set+1
2430 ENDIF
2431 ENDIF
2432 IF(k50.EQ.0) THEN
2433 IF((temp(i)+dble(nb_rows(i))*dble(nfront))
2434 & .GT.peak)THEN
2435 small_set=small_set+1
2436 ENDIF
2437 ENDIF
2438 x=x+nb_rows(i)
2439 somme=somme+ dble(nb_rows(i))
2440 ENDDO
2441 ENDIF
2442 889 CONTINUE
2443 j=chosen
2444 x=0
2445 DO i=j,1,-1
2446 IF(nb_rows(i).EQ.0)THEN
2447 IF(x.EQ.1)THEN
2448 WRITE(*,*)myid,
2449 & ':Internal error 12 in ZMUMPS_SET_PARTI_ACTV_MEM'
2450 CALL mumps_abort()
2451 ENDIF
2452 chosen=chosen-1
2453 ELSE
2454 IF(nb_rows(i).GT.0)THEN
2455 x=1
2456 ELSE
2457 WRITE(*,*)
2458 & 'Internal error 13 in ZMUMPS_SET_PARTI_ACTV_MEM'
2459 CALL mumps_abort()
2460 ENDIF
2461 ENDIF
2462 ENDDO
2463 nslaves_node=chosen
2464 tab_pos(nslaves_node+1)= ncb+1
2465 tab_pos(slavef+2) = chosen
2466 pos=1
2467 DO i=1,chosen
2468 slaves_list(i)=temp_id(i)
2469 tab_pos(i)=pos
2470 pos=pos+nb_rows(i)
2471 IF(nb_rows(i).LE.0)THEN
2472 WRITE(*,*)
2473 & 'Internal error 14 in ZMUMPS_SET_PARTI_ACTV_MEM'
2474 CALL mumps_abort()
2475 ENDIF
2476 ENDDO
2477 DO i=chosen+1,number_of_procs
2478 slaves_list(i)=temp_id(i)
2479 ENDDO
2480 IF(pos.NE.(ncb+1))THEN
2481 WRITE(*,*)
2482 & 'Internal error 15 in ZMUMPS_SET_PARTI_ACTV_MEM'
2483 CALL mumps_abort()
2484 ENDIF
double precision function mpi_wtime()
Definition mpi.f:561

◆ zmumps_set_parti_flop_irr()

subroutine zmumps_load::zmumps_set_parti_flop_irr ( integer, intent(in) ncbson_max,
integer, intent(in) slavef,
integer, dimension(500), intent(in) keep,
integer(8), dimension(150) keep8,
integer, dimension(slavef+1), intent(in) procs,
integer, dimension(0:slavef-1), intent(in) mem_distrib,
integer, intent(in) ncb,
integer, intent(in) nfront,
integer, intent(out) nslaves_node,
integer, dimension(slavef+2), intent(out) tab_pos,
integer, dimension(size_slaves_list), intent(out) slaves_list,
integer, intent(in) size_slaves_list,
integer, intent(in) myid,
integer, intent(in) inode,
integer, intent(in) mp,
integer, intent(in) lp )

Definition at line 2486 of file zmumps_load.F.

2491 IMPLICIT NONE
2492 INTEGER, intent(in) :: KEEP(500),SIZE_SLAVES_LIST
2493 INTEGER(8) KEEP8(150)
2494 INTEGER, intent(in) :: SLAVEF, NFRONT, NCB,MYID
2495 INTEGER, intent(in) :: NCBSON_MAX
2496 INTEGER, intent(in) :: PROCS(SLAVEF+1)
2497 INTEGER, intent(in) :: MEM_DISTRIB(0:SLAVEF-1),INODE
2498 INTEGER, intent(in) :: MP,LP
2499 INTEGER, intent(out):: SLAVES_LIST(SIZE_SLAVES_LIST)
2500 INTEGER, intent(out):: TAB_POS(SLAVEF+2)
2501 INTEGER, intent(out):: NSLAVES_NODE
2502 INTEGER NUMBER_OF_PROCS,K47,K48, K50,K83,K69
2503 INTEGER(8) :: K821
2504 INTEGER J
2505 INTEGER KMIN, KMAX
2506 INTEGER OTHERS,CHOSEN,SMALL_SET,ACC
2507 DOUBLE PRECISION SOMME,TMP_SUM,DELTA,A,B,C,MASTER_WORK
2508 INTEGER AFFECTED
2509 INTEGER ADDITIONNAL_ROWS,i,X,REF,POS,NELIM
2510 INTEGER(8) X8
2511 LOGICAL FORCE_CAND,SMP
2512 DOUBLE PRECISION BANDE_K821
2513 INTEGER NB_SAT,NB_ZERO
2514 DOUBLE PRECISION TEMP(SLAVEF),TOTAL_COST, MAX_MEM_ALLOW
2515 INTEGER TEMP_ID(SLAVEF),NB_ROWS(SLAVEF)
2516 INTEGER NSLAVES_REF,NCB_FILS
2517 EXTERNAL mpi_wtime,mumps_getkmin
2518 INTEGER MUMPS_GETKMIN
2519 INTEGER POS_MIN_LOAD,SIZE_MY_SMP,WHAT
2520 LOGICAL HAVE_TYPE1_SON
2521 DOUBLE PRECISION MIN_LOAD,MAX_LOAD,TEMP_MAX_LOAD
2522 DOUBLE PRECISION MPI_WTIME
2523 DOUBLE PRECISION BUF_SIZE,NELIM_MEM_SIZE
2524 DOUBLE PRECISION MEM_SIZE_STRONG(SLAVEF),MEM_SIZE_WEAK(SLAVEF)
2525 k821=abs(keep8(21))
2526 temp_max_load=dble(0)
2527 k50=keep(50)
2528 k48=keep(48)
2529 k47=keep(47)
2530 k83=keep(83)
2531 k69=0
2532 ncb_fils=ncbson_max
2533 IF(int(ncb_fils,8)*int(min(ncb,ncb_fils),8).GT.k821)THEN
2534 have_type1_son=.true.
2535 ELSE
2536 have_type1_son=.false.
2537 ENDIF
2538 smp=(k69.NE.0)
2539 IF ( keep(24) == 0 .OR. keep(24) == 1 ) THEN
2540 force_cand = .false.
2541 ELSE
2542 force_cand = (mod(keep(24),2).eq.0)
2543 END IF
2544 nelim=nfront-ncb
2545 kmax=int(k821/int(ncb,8))
2546 IF(force_cand)THEN
2547 DO i=1,procs(slavef+1)
2548 wload(i)=load_flops(procs(i))
2549 idwload(i)=procs(i)
2550 wload(i)=max(wload(i),0.0d0)
2551 ENDDO
2552 number_of_procs=procs(slavef+1)
2553 others=number_of_procs
2554 ELSE
2555 number_of_procs=slavef
2556 wload(1:slavef) = load_flops(0:number_of_procs-1)
2557 DO i=1,number_of_procs
2558 idwload(i) = i - 1
2559 IF (wload(i) < -0.5d0 ) THEN
2560 IF((mp.GT.0).AND.(lp.GE.2))THEN
2561 WRITE(mp,*)myid,': Negative load ',
2562 & wload(i)
2563 ENDIF
2564 ENDIF
2565 wload(i)=max(wload(i),0.0d0)
2566 ENDDO
2567 others=number_of_procs-1
2568 ENDIF
2569 kmax=int(ncb/others)
2570 kmin=mumps_getkmin(int(ncb,8)*int(kmax,8),k50,kmax,ncb)
2571 nb_rows=0
2572 CALL mumps_sort_doubles(number_of_procs, wload, idwload)
2573 IF(k50.EQ.0)THEN
2574 total_cost=dble( nelim ) * dble( ncb ) +
2575 & dble(ncb) * dble(nelim)*dble(2*nfront-nelim-1)
2576 ELSE
2577 total_cost=dble(nelim) * dble( ncb ) *
2578 & dble(nfront+1)
2579 ENDIF
2580 CALL mumps_get_flops_cost(nfront,nelim,nelim,k50,
2581 & 2,master_work)
2582 somme=dble(0)
2583 j=1
2584 IF(force_cand.AND.(number_of_procs.GT.k83))THEN
2585 master_work=dble(keep(88))*master_work/dble(100)
2586 ENDIF
2587 IF(force_cand.AND.(number_of_procs.LE.k83))THEN
2588 master_work=dble(keep(87))*master_work/dble(100)
2589 ENDIF
2590 IF(master_work.LT.dble(1))THEN
2591 master_work=dble(1)
2592 ENDIF
2593 nslaves_ref=int(total_cost/master_work)+1
2594 IF(force_cand)THEN
2595 nslaves_ref=min(nslaves_ref,number_of_procs)
2596 ELSE
2597 nslaves_ref=min(nslaves_ref,number_of_procs-1)
2598 ENDIF
2599 DO i=1,number_of_procs
2600 IF((idwload(i).NE.myid))THEN
2601 temp_id(j)=idwload(i)
2602 temp(j)=wload(i)
2603 IF(bdc_m2_flops)THEN
2604 temp(j)=temp(j)+niv2(temp_id(j)+1)
2605 ENDIF
2606 j=j+1
2607 ENDIF
2608 ENDDO
2609 number_of_procs=j-1
2610 CALL mumps_sort_doubles(number_of_procs, temp, temp_id)
2611 somme=dble(0)
2612 tmp_sum=dble(0)
2613 DO i=1,others
2614 somme=somme+temp(others)-temp(i)
2615 tmp_sum=tmp_sum+temp(i)
2616 ENDDO
2617 tmp_sum=(tmp_sum/dble(others))+
2618 & (total_cost/dble(others))
2619 size_my_smp=others
2620 min_load=temp(1)
2621 pos_min_load=1
2622 IF(.NOT.smp) max_load=temp(others)
2623 IF(smp)THEN
2624 j=1
2625 DO i=1,others
2626 IF(mem_distrib(temp_id(i)).EQ.1)THEN
2627 IF(temp(i).LE.tmp_sum)THEN
2628 wload(j)=temp(i)
2629 idwload(j)=temp_id(i)
2630 j=j+1
2631 ELSE
2632 ENDIF
2633 ENDIF
2634 ENDDO
2635 max_load=wload(j-1)
2636 size_my_smp=j-1
2637 DO i=1,others
2638 IF((mem_distrib(temp_id(i)).NE.1).OR.
2639 & ((mem_distrib(temp_id(i)).EQ.1).AND.
2640 & (temp(i).GE.tmp_sum)))THEN
2641 wload(j)=temp(i)
2642 idwload(j)=temp_id(i)
2643 j=j+1
2644 ENDIF
2645 ENDDO
2646 temp=wload
2647 temp_id=idwload
2648 ENDIF
2649 IF(bdc_md)THEN
2650 buf_size=dble(k821)
2651 IF (keep(201).EQ.2) THEN
2652 a=dble(int((dble(keep(100))/dble(2))/dble(nelim)))
2653 IF(k50.EQ.0)THEN
2654 buf_size=min(buf_size,a*dble(ncb))
2655 ELSE
2656 buf_size=min(buf_size,a*a)
2657 ENDIF
2658 ENDIF
2659 buf_size=dble(k821)
2660 DO i=1,number_of_procs
2661 a=dble(md_mem(temp_id(i)))/
2662 & dble(nelim)
2663 a=a*dble(nfront)
2664 IF(k50.EQ.0)THEN
2665 b=dble(int(dble(ncb)/dble(number_of_procs))+1)*
2666 & dble(nfront)
2667 ELSE
2668 what = 5
2669 CALL mumps_max_surfcb_nbrows(what, keep,keep8, ncb,
2670 & nfront, min(ncb,others), j, x8)
2671 b=dble(x8)+(dble(j)*dble(nelim))
2672 ENDIF
2673 nelim_mem_size=a+b
2674 mem_size_weak(i)=nelim_mem_size
2675 IF((sbtr_which_m.EQ.0).OR.(.NOT.bdc_sbtr))THEN
2676 IF(bdc_m2_mem)THEN
2677 mem_size_strong(i)=
2678 & dble(tab_maxs(temp_id(i)))-dm_mem(temp_id(i))-
2679 & lu_usage(temp_id(i))-niv2(temp_id(i)+1)
2680 ELSE
2681 mem_size_strong(i)=
2682 & dble(tab_maxs(temp_id(i)))-dm_mem(temp_id(i))-
2683 & lu_usage(temp_id(i))
2684 ENDIF
2685 ELSE
2686 IF(bdc_sbtr)THEN
2687 IF(bdc_m2_mem)THEN
2688 mem_size_strong(i)=
2689 & dble(tab_maxs(temp_id(i)))-dm_mem(temp_id(i))-
2690 & lu_usage(temp_id(i))-niv2(temp_id(i)+1)-
2691 & (sbtr_mem(temp_id(i))-sbtr_cur(temp_id(i)))
2692 ELSE
2693 mem_size_strong(i)=
2694 & dble(tab_maxs(temp_id(i)))-dm_mem(temp_id(i))-
2695 & lu_usage(temp_id(i))-
2696 & (sbtr_mem(temp_id(i))-sbtr_cur(temp_id(i)))
2697 ENDIF
2698 ENDIF
2699 ENDIF
2700 IF(min(mem_size_strong(i),mem_size_weak(i)).LT.dble(0))THEN
2701 IF(mem_size_strong(i).LT.0.0d0)THEN
2702 mem_size_strong(i)=dble(0)
2703 ELSE
2704 mem_size_weak(i)=dble(0)
2705 ENDIF
2706 ENDIF
2707 ENDDO
2708 ELSE
2709 buf_size=dble(k821)
2710 DO i=1,number_of_procs
2711 IF((sbtr_which_m.EQ.0).OR.(.NOT.bdc_sbtr))THEN
2712 IF(bdc_m2_mem)THEN
2713 mem_size_strong(i)=
2714 & dble(tab_maxs(temp_id(i)))-dm_mem(temp_id(i))-
2715 & lu_usage(temp_id(i))-niv2(temp_id(i)+1)
2716 ELSE
2717 mem_size_strong(i)=
2718 & dble(tab_maxs(temp_id(i)))-dm_mem(temp_id(i))-
2719 & lu_usage(temp_id(i))
2720 ENDIF
2721 ELSE
2722 IF(bdc_sbtr)THEN
2723 IF(bdc_m2_mem)THEN
2724 mem_size_strong(i)=
2725 & dble(tab_maxs(temp_id(i)))-dm_mem(temp_id(i))-
2726 & lu_usage(temp_id(i))-niv2(temp_id(i)+1)-
2727 & (sbtr_mem(temp_id(i))-sbtr_cur(temp_id(i)))
2728 ELSE
2729 mem_size_strong(i)=
2730 & dble(tab_maxs(temp_id(i)))-dm_mem(temp_id(i))-
2731 & lu_usage(temp_id(i))-
2732 & (sbtr_mem(temp_id(i))-sbtr_cur(temp_id(i)))
2733 ENDIF
2734 ENDIF
2735 ENDIF
2736 mem_size_strong(i)=max(dble(0),mem_size_strong(i))
2737 mem_size_weak(i)=huge(mem_size_weak(i))
2738 ENDDO
2739 ENDIF
2740 IF((((number_of_procs.LE.k83).AND.force_cand).AND.
2741 & (total_cost.GE.somme)).OR.
2742 & (.NOT.force_cand).OR.
2743 & (((number_of_procs+1).GT.k83).AND.force_cand))THEN
2744 ref=nslaves_ref
2745 small_set=nslaves_ref
2746 IF(.NOT.smp)THEN
2747 DO i=nslaves_ref,1,-1
2748 somme=dble(0)
2749 DO j=1,i
2750 somme=somme+temp(j)
2751 ENDDO
2752 somme=(dble(i)*temp(i))-somme
2753 IF(total_cost.GE.somme) GOTO 444
2754 ENDDO
2755 444 CONTINUE
2756 ref=i
2757 small_set=ref
2758 max_load=temp(small_set)
2759 ELSE
2760 x=min(size_my_smp,nslaves_ref)
2761 450 CONTINUE
2762 somme=dble(0)
2763 DO j=1,x
2764 somme=somme+(temp(x)-temp(j))
2765 ENDDO
2766 IF(somme.GT.total_cost)THEN
2767 x=x-1
2768 GOTO 450
2769 ELSE
2770 IF(x.LT.size_my_smp) THEN
2771 ref=x
2772 small_set=ref
2773 max_load=temp(small_set)
2774 ELSE
2775 x=min(size_my_smp,nslaves_ref)
2776 j=x+1
2777 max_load=temp(x)
2778 tmp_sum=max_load
2779 DO i=x+1,others
2780 IF(temp(i).GT.max_load)THEN
2781 somme=somme+(dble(i-1)*(temp(i)-max_load))
2782 tmp_sum=max_load
2783 max_load=temp(i)
2784 ELSE
2785 somme=somme+(max_load-temp(i))
2786 ENDIF
2787 IF(i.EQ.nslaves_ref)THEN
2788 small_set=nslaves_ref
2789 ref=small_set
2790 GOTO 323
2791 ENDIF
2792 IF(somme.GT.total_cost)THEN
2793 ref=i-1
2794 small_set=i-1
2795 max_load=tmp_sum
2796 GOTO 323
2797 ENDIF
2798 ENDDO
2799 ENDIF
2800 ENDIF
2801 ENDIF
2802 323 CONTINUE
2803 max_load=dble(0)
2804 DO i=1,small_set
2805 max_load=max(max_load,temp(i))
2806 ENDDO
2807 temp_max_load=max_load
2808 nb_rows=0
2809 tmp_sum=dble(0)
2810 chosen=0
2811 acc=0
2812 nb_sat=0
2813 nb_zero=0
2814 DO i=1,small_set
2815 IF(k50.EQ.0)THEN
2816 x=int(buf_size/dble(ncb+1))-1
2817 bande_k821=dble(x)*dble(nfront)
2818 ELSE
2819 a=dble(1)
2820 b=dble(acc+2)
2821 c=-buf_size+dble(acc+nelim)
2822 delta=(b*b)-(dble(4)*a*c)
2823 x=int((-b+sqrt(delta))/(dble(2)*a))
2824 IF(x.GT.ncb-acc) x=ncb-acc
2825 bande_k821=dble(x)*dble(nelim+acc+x)
2826 ENDIF
2827 IF(have_type1_son)THEN
2828 IF(k50.EQ.0)THEN
2829 x=int((buf_size-dble(nfront))/dble(nfront+1))
2830 bande_k821=dble(x)*dble(nfront)
2831 ELSE
2832 a=dble(1)
2833 b=dble(acc+2+nelim)
2834 c=-buf_size+dble(acc+nelim)
2835 delta=(b*b)-(dble(4)*a*c)
2836 x=int((-b+sqrt(delta))/(dble(2)*a))
2837 IF(x.GT.ncb-acc) x=ncb-acc
2838 bande_k821=dble(x)*dble(nelim+acc+x)
2839 ENDIF
2840 ENDIF
2841 max_mem_allow=bande_k821
2842 IF(bdc_md)THEN
2843 max_mem_allow=min(
2844 & min(mem_size_weak(i),mem_size_strong(i)),
2845 & bande_k821)
2846 max_mem_allow=max(dble(0),max_mem_allow)
2847 ENDIF
2848 IF(k50.EQ.0)THEN
2849 kmax=int(max_mem_allow/dble(nfront))
2850 x=int((max_load-temp(i))/
2851 & (dble(nelim)*dble(2*nfront-nelim)))
2852 IF(x.GE.kmax)THEN
2853 IF(kmax.GE.kmin)THEN
2854 x=kmax
2855 nb_sat=nb_sat+1
2856 ELSE
2857 x=0
2858 ENDIF
2859 ELSE
2860 IF(x.LT.kmin)THEN
2861 x=0
2862 ENDIF
2863 ENDIF
2864 IF((acc+x).GT.ncb) x=ncb-acc
2865 ENDIF
2866 IF(k50.NE.0)THEN
2867 a=dble(1)
2868 b=dble(acc+nelim)
2869 c=dble(-max_mem_allow)
2870 delta=((b*b)-(dble(4)*a*c))
2871 kmax=int((-b+sqrt(delta))/(dble(2)*a))
2872 a=dble(nelim)
2873 b=dble(nelim)*(dble(nelim)+dble(2*acc+1))
2874 c=-(max_load-temp(i))
2875 delta=(b*b-(dble(4)*a*c))
2876 x=int((-b+sqrt(delta))/(dble(2)*a))
2877 IF(x.LT.0) THEN
2878 WRITE(*,*)myid,
2879 & ': Internal error 1 in ZMUMPS_SET_PARTI_FLOP_IRR'
2880 CALL mumps_abort()
2881 ENDIF
2882 IF(x.GE.kmax)THEN
2883 IF(kmax.GE.kmin)THEN
2884 x=kmax
2885 nb_sat=nb_sat+1
2886 ELSE
2887 x=0
2888 ENDIF
2889 ELSE
2890 IF(x.LT.kmin)THEN
2891 x=0
2892 ENDIF
2893 ENDIF
2894 IF((acc+x).GT.ncb) x=ncb-acc
2895 ENDIF
2896 nb_rows(i)=x
2897 acc=acc+x
2898 chosen=chosen+1
2899 IF(smp)THEN
2900 IF(min_load.GT.temp(i))THEN
2901 min_load=temp(i)
2902 pos_min_load=i
2903 ENDIF
2904 ENDIF
2905 tmp_sum=max_load
2906 IF(k50.EQ.0)THEN
2907 max_load=max(max_load,
2908 & (temp(i)+(dble(nelim) *
2909 & dble(nb_rows(i)))+
2910 & (dble(nb_rows(i))*dble(nelim)*
2911 & dble(2*nfront-nelim-1))))
2912 ELSE
2913 max_load=max(max_load,
2914 & temp(i)+(dble(nelim) * dble(nb_rows(i)))*
2915 & dble(2*(nelim+acc)-nb_rows(i)
2916 & -nelim+1))
2917 ENDIF
2918 IF(tmp_sum.LT.max_load)THEN
2919 ENDIF
2920 IF(ncb-acc.LT.kmin) GOTO 888
2921 IF(ncb.EQ.acc) GOTO 888
2922 IF(acc.GT.ncb) THEN
2923 WRITE(*,*)myid,
2924 & ': Internal error 2 in ZMUMPS_SET_PARTI_FLOP_IRR'
2925 CALL mumps_abort()
2926 ENDIF
2927 ENDDO
2928 888 CONTINUE
2929 somme=dble(0)
2930 x=nfront-ncb
2931 IF((acc.GT.ncb))THEN
2932 WRITE(*,*)myid,
2933 & ': Internal error 3 in ZMUMPS_SET_PARTI_FLOP_IRR'
2934 CALL mumps_abort()
2935 ENDIF
2936 IF((acc.LT.ncb))THEN
2937 IF(k50.NE.0)THEN
2938 IF(small_set.LE.others)THEN
2939 IF((nb_sat.EQ.small_set).AND.(small_set.LT.
2940 & nslaves_ref))THEN
2941 small_set=ref+1
2942 ref=ref+1
2943 nb_rows=0
2944 GOTO 323
2945 ENDIF
2946 DO i=1,small_set
2947 max_load=temp_max_load
2948 additionnal_rows=ncb-acc
2949 somme=dble(nelim)*
2950 & dble(additionnal_rows)*
2951 & dble(2*nfront-additionnal_rows-nelim
2952 & +1)
2953 somme=somme/dble(small_set-nb_sat)
2954 nb_rows=0
2955 nb_zero=0
2956 acc=0
2957 chosen=0
2958 nb_sat=0
2959 IF(smp)THEN
2960 min_load=temp(1)
2961 pos_min_load=1
2962 ENDIF
2963 DO j=1,small_set
2964 a=dble(1)
2965 b=dble(acc+2)
2966 c=-buf_size+dble(acc+nelim)
2967 delta=(b*b)-(dble(4)*a*c)
2968 x=int((-b+sqrt(delta))/(dble(2)*a))
2969 IF(x.GT.ncb-acc) x=ncb-acc
2970 bande_k821=dble(x)*dble(nelim+acc+x)
2971 IF(have_type1_son)THEN
2972 a=dble(1)
2973 b=dble(acc+2+nelim)
2974 c=-buf_size+dble(acc+nelim)
2975 delta=(b*b)-(dble(4)*a*c)
2976 x=int((-b+sqrt(delta))/(dble(2)*a))
2977 IF(x.GT.ncb-acc) x=ncb-acc
2978 bande_k821=dble(x)*dble(nelim+acc+x)
2979 ENDIF
2980 max_mem_allow=bande_k821
2981 IF(bdc_md)THEN
2982 max_mem_allow=min(
2983 & min(mem_size_weak(j),mem_size_strong(j)),
2984 & bande_k821)
2985 max_mem_allow=max(dble(0),
2986 & max_mem_allow)
2987 ENDIF
2988 a=dble(1)
2989 b=dble(acc+nelim)
2990 c=dble(-max_mem_allow)
2991 delta=((b*b)-(dble(4)*a*c))
2992 kmax=int((-b+sqrt(delta))/(dble(2)*a))
2993 a=dble(nelim)
2994 b=(dble(nelim)*dble(nelim+2*acc+1))
2995 c=-(max_load-temp(j)+somme)
2996 delta=(b*b-(dble(4)*a*c))
2997 x=int((-b+sqrt(delta))/(dble(2)*a))
2998 x=x+1
2999 IF(x.LT.0) THEN
3000 WRITE(*,*)myid,
3001 & ': Internal error 4 in ZMUMPS_SET_PARTI_FLOP_IRR'
3002 CALL mumps_abort()
3003 ENDIF
3004 IF(x.GE.kmax)THEN
3005 IF(kmax.GE.kmin)THEN
3006 x=kmax
3007 nb_sat=nb_sat+1
3008 ELSE
3009 nb_zero=nb_zero+1
3010 x=0
3011 ENDIF
3012 ELSE
3013 IF(x.LT.min(kmin,kmax))THEN
3014 nb_zero=nb_zero+1
3015 x=0
3016 ENDIF
3017 ENDIF
3018 IF((acc+x).GT.ncb) x=ncb-acc
3019 nb_rows(j)=x
3020 IF(smp)THEN
3021 IF(min_load.GT.temp(j))THEN
3022 min_load=temp(j)
3023 pos_min_load=i
3024 ENDIF
3025 ENDIF
3026 chosen=chosen+1
3027 acc=acc+x
3028 tmp_sum=max_load
3029 temp_max_load=max(temp_max_load,
3030 & temp(j)+(dble(nelim) *
3031 & dble(nb_rows(j)))*
3032 & dble(2*(nelim+
3033 & acc)-nb_rows(j)
3034 & -nelim+1))
3035 IF(ref.LE.number_of_procs-1)THEN
3036 IF(temp_max_load.GT.temp(ref+1))THEN
3037 IF(small_set.LT.nslaves_ref)THEN
3038 small_set=ref+1
3039 ref=ref+1
3040 nb_rows=0
3041 GOTO 323
3042 ENDIF
3043 ENDIF
3044 ENDIF
3045 IF(ncb.EQ.acc) GOTO 666
3046 ENDDO
3047 IF(nb_sat.EQ.small_set)THEN
3048 IF(small_set.LT.nslaves_ref)THEN
3049 small_set=ref+1
3050 ref=ref+1
3051 nb_rows=0
3052 GOTO 323
3053 ELSE
3054 GOTO 434
3055 ENDIF
3056 ENDIF
3057 IF(nb_zero.EQ.small_set)THEN
3058 IF(small_set.LT.nslaves_ref)THEN
3059 small_set=ref+1
3060 ref=ref+1
3061 nb_rows=0
3062 GOTO 323
3063 ELSE
3064 GOTO 434
3065 ENDIF
3066 ENDIF
3067 IF((nb_sat+nb_zero).EQ.small_set)THEN
3068 IF(small_set.LT.nslaves_ref)THEN
3069 small_set=ref+1
3070 ref=ref+1
3071 nb_rows=0
3072 GOTO 323
3073 ELSE
3074 GOTO 434
3075 ENDIF
3076 ENDIF
3077 ENDDO
3078 434 CONTINUE
3079 additionnal_rows=ncb-acc
3080 IF(additionnal_rows.NE.0)THEN
3081 IF(additionnal_rows.LT.kmin)THEN
3082 i=chosen
3083 j=acc
3084 436 CONTINUE
3085 IF(nb_rows(i).NE.0)THEN
3086 j=j-nb_rows(i)
3087 a=dble(1)
3088 b=dble(j+2)
3089 c=-buf_size+dble(j+nelim)
3090 delta=(b*b)-(dble(4)*a*c)
3091 x=int((-b+sqrt(delta))/(dble(2)*a))
3092 IF(x.GT.ncb-j) x=ncb-j
3093 bande_k821=dble(x)*dble(nelim+j+x)
3094 IF(have_type1_son)THEN
3095 a=dble(1)
3096 b=dble(j+2+nelim)
3097 c=-buf_size+dble(j+nelim)
3098 delta=(b*b)-(dble(4)*a*c)
3099 x=int((-b+sqrt(delta))/(dble(2)*a))
3100 IF(x.GT.ncb-j) x=ncb-j
3101 bande_k821=dble(x)*dble(nelim+j+x)
3102 ENDIF
3103 max_mem_allow=bande_k821
3104 IF(bdc_md)THEN
3105 max_mem_allow=min(
3106 & min(mem_size_weak(i),mem_size_strong(i)),
3107 & bande_k821)
3108 max_mem_allow=max(dble(0),
3109 & max_mem_allow)
3110 ENDIF
3111 a=dble(1)
3112 b=dble(j+nelim)
3113 c=dble(-max_mem_allow)
3114 delta=((b*b)-(dble(4)*a*c))
3115 kmax=int((-b+sqrt(delta))/(dble(2)*a))
3116 IF(nb_rows(i).NE.kmax)THEN
3117 IF(ncb-j.LE.kmax)THEN
3118 nb_rows(i)=+ncb-j
3119 additionnal_rows=0
3120 ENDIF
3121 ENDIF
3122 temp_max_load=max(temp_max_load,
3123 & temp(i)+
3124 & (dble(nelim) * dble(nb_rows(i)))*
3125 & dble(2*(nelim+
3126 & acc)-nb_rows(i)
3127 & -nelim+1))
3128 IF(ref.LE.number_of_procs-1)THEN
3129 IF(temp_max_load.GT.temp(ref+1))THEN
3130 IF(small_set.LT.nslaves_ref)THEN
3131 small_set=ref+1
3132 ref=ref+1
3133 nb_rows=0
3134 GOTO 323
3135 ENDIF
3136 ENDIF
3137 ENDIF
3138 ELSE
3139 i=i-1
3140 IF(i.NE.0)GOTO 436
3141 ENDIF
3142 IF(additionnal_rows.NE.0)THEN
3143 i=chosen
3144 IF(i.NE.small_set)THEN
3145 i=i+1
3146 IF(nb_rows(i).NE.0)THEN
3147 WRITE(*,*)myid,
3148 & ': Internal error 5 in ZMUMPS_SET_PARTI_FLOP_IRR'
3149 CALL mumps_abort()
3150 ENDIF
3151 ENDIF
3152 nb_rows(i)=nb_rows(i)+additionnal_rows
3153 additionnal_rows=0
3154 ENDIF
3155 chosen=i
3156 ENDIF
3157 ENDIF
3158 i=chosen+1
3159 DO WHILE ((additionnal_rows.NE.0)
3160 & .AND.(i.LE.number_of_procs))
3161 IF((temp(i).LE.max_load))THEN
3162 a=dble(1)
3163 b=dble(acc+2)
3164 c=-buf_size+dble(acc+nelim)
3165 delta=(b*b)-(dble(4)*a*c)
3166 x=int((-b+sqrt(delta))/(dble(2)*a))
3167 IF(x.GT.ncb-acc) x=ncb-acc
3168 bande_k821=dble(x)*dble(nelim+acc+x)
3169 IF(have_type1_son)THEN
3170 a=dble(1)
3171 b=dble(acc+2+nelim)
3172 c=-buf_size+dble(acc+nelim)
3173 delta=(b*b)-(dble(4)*a*c)
3174 x=int((-b+sqrt(delta))/(dble(2)*a))
3175 IF(x.GT.ncb-acc) x=ncb-acc
3176 bande_k821=dble(x)*dble(nelim+acc+x)
3177 ENDIF
3178 max_mem_allow=bande_k821
3179 IF(bdc_md)THEN
3180 max_mem_allow=min(
3181 & min(mem_size_weak(i),mem_size_strong(i)),
3182 & bande_k821)
3183 max_mem_allow=max(dble(0),
3184 & max_mem_allow)
3185 ENDIF
3186 a=dble(1)
3187 b=dble(acc+nelim)
3188 c=dble(-max_mem_allow)
3189 delta=((b*b)-(dble(4)*a*c))
3190 kmax=int((-b+sqrt(delta))/(dble(2)*a))
3191 a=dble(nelim)
3192 b=dble(nelim)*dble(nelim+2*acc+1)
3193 c=-(max_load-temp(i))
3194 delta=(b*b-(dble(4)*a*c))
3195 x=int((-b+sqrt(delta))/(dble(2)*a))
3196 IF(x.GE.kmax)THEN
3197 IF(kmax.GE.kmin)THEN
3198 x=kmax
3199 ELSE
3200 x=0
3201 ENDIF
3202 ELSE
3203 IF(x.LT.kmin)THEN
3204 x=0
3205 ENDIF
3206 ENDIF
3207 IF((acc+x).GT.ncb) x=ncb-acc
3208 nb_rows(i)=x
3209 acc=acc+x
3210 additionnal_rows=ncb-acc
3211 ELSE IF((temp(i).GT.max_load))THEN
3212 max_load=temp(i)
3213 nb_sat=0
3214 acc=0
3215 nb_rows=0
3216 DO j=1,i
3217 a=dble(1)
3218 b=dble(acc+2)
3219 c=-buf_size+dble(acc+nelim)
3220 delta=(b*b)-(dble(4)*a*c)
3221 x=int((-b+sqrt(delta))/(dble(2)*a))
3222 IF(x.GT.ncb-acc) x=ncb-acc
3223 bande_k821=dble(x)*dble(nelim+acc+x)
3224 IF(have_type1_son)THEN
3225 a=dble(1)
3226 b=dble(acc+2+nelim)
3227 c=-buf_size+dble(acc+nelim)
3228 delta=(b*b)-(dble(4)*a*c)
3229 x=int((-b+sqrt(delta))/(dble(2)*a))
3230 IF(x.GT.ncb-acc) x=ncb-acc
3231 bande_k821=dble(x)*dble(nelim+acc+x)
3232 ENDIF
3233 max_mem_allow=bande_k821
3234 IF(bdc_md)THEN
3235 max_mem_allow=min(
3236 & min(mem_size_weak(j),mem_size_strong(j)),
3237 & bande_k821)
3238 max_mem_allow=max(dble(0),
3239 & max_mem_allow)
3240 ENDIF
3241 a=dble(1)
3242 b=dble(acc+nelim)
3243 c=dble(-max_mem_allow)
3244 delta=((b*b)-(dble(4)*a*c))
3245 kmax=int((-b+sqrt(delta))/(dble(2)*a))
3246 a=dble(nelim)
3247 b=dble(nelim)*dble(nelim+2*acc+1)
3248 c=-(max_load-temp(j))
3249 delta=(b*b-(dble(4)*a*c))
3250 x=int((-b+sqrt(delta))/(dble(2)*a))
3251 IF(x.LT.0) THEN
3252 WRITE(*,*)myid,
3253 & ': Internal error 6 in ZMUMPS_SET_PARTI_FLOP_IRR'
3254 CALL mumps_abort()
3255 ENDIF
3256 IF(x.GE.kmax)THEN
3257 IF(kmax.GE.kmin)THEN
3258 x=kmax
3259 nb_sat=nb_sat+1
3260 ELSE
3261 x=0
3262 ENDIF
3263 ELSE
3264 IF(x.LT.min(kmin,kmax))THEN
3265 x=0
3266 ENDIF
3267 ENDIF
3268 IF((acc+x).GT.ncb) x=ncb-acc
3269 nb_rows(j)=x
3270 IF(smp)THEN
3271 IF(min_load.GT.temp(j))THEN
3272 min_load=temp(j)
3273 pos_min_load=i
3274 ENDIF
3275 ENDIF
3276 acc=acc+x
3277 max_load=max(max_load,
3278 & temp(j)+
3279 & (dble(nelim)*dble(nb_rows(j)))*
3280 & dble(2*(nelim+
3281 & acc)-nb_rows(j)
3282 & -nelim+1))
3283 IF(ncb.EQ.acc) GOTO 741
3284 IF(ncb-acc.LT.kmin) GOTO 210
3285 ENDDO
3286 210 CONTINUE
3287 ENDIF
3288 741 CONTINUE
3289 i=i+1
3290 additionnal_rows=ncb-acc
3291 ENDDO
3292 chosen=i-1
3293 IF(additionnal_rows.NE.0)THEN
3294 additionnal_rows=ncb-acc
3295 somme=dble(nelim)*dble(additionnal_rows)*
3296 & dble(2*nfront-additionnal_rows-
3297 & nelim+1)
3298 somme=somme/dble(number_of_procs)
3299 nb_rows=0
3300 acc=0
3301 chosen=0
3302 IF(smp)THEN
3303 min_load=temp(1)
3304 pos_min_load=1
3305 ENDIF
3306 DO i=1,others
3307 a=dble(1)
3308 b=dble(acc+2)
3309 c=-buf_size+dble(acc+nelim)
3310 delta=(b*b)-(dble(4)*a*c)
3311 x=int((-b+sqrt(delta))/(dble(2)*a))
3312 IF(x.GT.ncb-acc) x=ncb-acc
3313 bande_k821=dble(x)*dble(nelim+acc+x)
3314 IF(have_type1_son)THEN
3315 a=dble(1)
3316 b=dble(acc+2+nelim)
3317 c=-buf_size+dble(acc+nelim)
3318 delta=(b*b)-(dble(4)*a*c)
3319 x=int((-b+sqrt(delta))/(dble(2)*a))
3320 IF(x.GT.ncb-acc) x=ncb-acc
3321 bande_k821=dble(x)*dble(nelim+acc+x)
3322 ENDIF
3323 max_mem_allow=bande_k821
3324 IF(bdc_md)THEN
3325 max_mem_allow=min(
3326 & min(mem_size_weak(i),mem_size_strong(i)),
3327 & bande_k821)
3328 max_mem_allow=max(dble(0),
3329 & max_mem_allow)
3330 ENDIF
3331 a=dble(1)
3332 b=dble(acc+nelim)
3333 c=dble(-max_mem_allow)
3334 delta=((b*b)-(dble(4)*a*c))
3335 kmax=int((-b+sqrt(delta))/(dble(2)*a))
3336 a=dble(nelim)
3337 b=dble(nelim)*dble(nelim+2*acc+1)
3338 c=-(max_load-temp(i)+somme)
3339 delta=(b*b-(dble(4)*a*c))
3340 x=int((-b+sqrt(delta))/(dble(2)*a))
3341 IF(x.LT.0) THEN
3342 WRITE(*,*)myid,
3343 & ': Internal error 7 in ZMUMPS_SET_PARTI_FLOP_IRR'
3344 CALL mumps_abort()
3345 ENDIF
3346 IF(x.GE.kmax)THEN
3347 IF(kmax.GE.kmin)THEN
3348 x=kmax
3349 ELSE
3350 x=0
3351 ENDIF
3352 ELSE
3353 IF(x.LT.min(kmin,kmax))THEN
3354 x=min(kmax,kmin)
3355 ENDIF
3356 ENDIF
3357 IF((acc+x).GT.ncb) x=ncb-acc
3358 nb_rows(i)=x
3359 IF(smp)THEN
3360 IF(min_load.GT.temp(i))THEN
3361 min_load=temp(i)
3362 pos_min_load=i
3363 ENDIF
3364 ENDIF
3365 chosen=chosen+1
3366 acc=acc+x
3367 IF(ncb.EQ.acc) GOTO 666
3368 IF(ncb-acc.LT.kmin) GOTO 488
3369 ENDDO
3370 488 CONTINUE
3371 additionnal_rows=ncb-acc
3372 somme=dble(nelim)*
3373 & dble(additionnal_rows)*
3374 & dble(2*nfront-additionnal_rows-
3375 & nelim+1)
3376 somme=somme/dble(number_of_procs)
3377 nb_rows=0
3378 acc=0
3379 chosen=0
3380 IF(smp)THEN
3381 min_load=temp(1)
3382 pos_min_load=1
3383 ENDIF
3384 DO i=1,others
3385 a=dble(1)
3386 b=dble(acc+2)
3387 c=-buf_size+dble(acc+nelim)
3388 delta=(b*b)-(dble(4)*a*c)
3389 x=int((-b+sqrt(delta))/(dble(2)*a))
3390 IF(x.GT.ncb-acc) x=ncb-acc
3391 bande_k821=dble(x)*dble(nelim+acc+x)
3392 IF(have_type1_son)THEN
3393 a=dble(1)
3394 b=dble(acc+2+nelim)
3395 c=-buf_size+dble(acc+nelim)
3396 delta=(b*b)-(dble(4)*a*c)
3397 x=int((-b+sqrt(delta))/(dble(2)*a))
3398 IF(x.GT.ncb-acc) x=ncb-acc
3399 bande_k821=dble(x)*dble(nelim+acc+x)
3400 ENDIF
3401 max_mem_allow=bande_k821
3402 IF(bdc_md)THEN
3403 max_mem_allow=min(bande_k821,
3404 & mem_size_strong(i))
3405 max_mem_allow=max(dble(0),
3406 & max_mem_allow)
3407 ENDIF
3408 a=dble(1)
3409 b=dble(acc+nelim)
3410 c=dble(-max_mem_allow)
3411 delta=((b*b)-(dble(4)*a*c))
3412 kmax=int((-b+sqrt(delta))/(dble(2)*a))
3413 a=dble(nelim)
3414 b=dble(nelim)*dble(nelim+2*acc+1)
3415 c=-(max_load-temp(i)+somme)
3416 delta=(b*b-(dble(4)*a*c))
3417 x=int((-b+sqrt(delta))/(dble(2)*a))
3418 IF(x.LT.0) THEN
3419 WRITE(*,*)myid,
3420 & ': Internal error 8 in ZMUMPS_SET_PARTI_FLOP_IRR'
3421 CALL mumps_abort()
3422 ENDIF
3423 IF(x.GE.kmax)THEN
3424 x=kmax
3425 ELSE
3426 IF(x.LT.kmin)THEN
3427 x=kmin
3428 ENDIF
3429 ENDIF
3430 IF((acc+x).GT.ncb) x=ncb-acc
3431 nb_rows(i)=x
3432 IF(smp)THEN
3433 IF(min_load.GT.temp(i))THEN
3434 min_load=temp(i)
3435 pos_min_load=i
3436 ENDIF
3437 ENDIF
3438 chosen=chosen+1
3439 acc=acc+x
3440 IF(ncb.EQ.acc) GOTO 666
3441 IF(ncb-acc.LT.kmin) GOTO 477
3442 ENDDO
3443 477 CONTINUE
3444 IF(acc.NE.ncb)THEN
3445 nb_sat=0
3446 acc=0
3447 chosen=0
3448 IF(smp)THEN
3449 min_load=temp(1)
3450 pos_min_load=1
3451 ENDIF
3452 DO i=1,others
3453 a=dble(1)
3454 b=dble(acc+2)
3455 c=-buf_size+dble(acc+nelim)
3456 delta=(b*b)-(dble(4)*a*c)
3457 x=int((-b+sqrt(delta))/(dble(2)*a))
3458 IF(x.GT.ncb-acc) x=ncb-acc
3459 bande_k821=dble(x)*dble(nelim+acc+x)
3460 IF(have_type1_son)THEN
3461 a=dble(1)
3462 b=dble(acc+2+nelim)
3463 c=-buf_size+dble(acc+nelim)
3464 delta=(b*b)-(dble(4)*a*c)
3465 x=int((-b+sqrt(delta))/(dble(2)*a))
3466 IF(x.GT.ncb-acc) x=ncb-acc
3467 bande_k821=dble(x)*dble(nelim+acc+x)
3468 ENDIF
3469 max_mem_allow=bande_k821
3470 IF(bdc_md)THEN
3471 max_mem_allow=min(bande_k821,
3472 & mem_size_strong(i))
3473 max_mem_allow=max(dble(0),
3474 & max_mem_allow)
3475 ENDIF
3476 a=dble(1)
3477 b=dble(acc+nelim)
3478 c=dble(-max_mem_allow)
3479 delta=((b*b)-(dble(4)*a*c))
3480 kmax=int((-b+sqrt(delta))/(dble(2)*a))
3481 x=kmax-nb_rows(i)
3482 IF((acc+nb_rows(i)+x).GT.ncb)
3483 & x=ncb-(acc+nb_rows(i))
3484 nb_rows(i)=nb_rows(i)+x
3485 IF((dble(nb_rows(i))*
3486 & dble(nb_rows(i)+acc)).EQ.
3487 & bande_k821)THEN
3488 nb_sat=nb_sat+1
3489 ENDIF
3490 acc=acc+nb_rows(i)
3491 IF(smp)THEN
3492 IF(min_load.GT.temp(i))THEN
3493 min_load=temp(i)
3494 pos_min_load=i
3495 ENDIF
3496 ENDIF
3497 chosen=chosen+1
3498 IF(ncb.EQ.acc) GOTO 666
3499 IF(ncb-acc.LT.kmin) GOTO 834
3500 ENDDO
3501 834 CONTINUE
3502 ENDIF
3503 IF(acc.NE.ncb)THEN
3504 additionnal_rows=ncb-acc
3505 somme=dble(nelim)*
3506 & dble(additionnal_rows)*
3507 & dble(2*nfront-additionnal_rows-
3508 & nelim+1)
3509 somme=somme/dble(number_of_procs-nb_sat)
3510 acc=0
3511 DO i=1,chosen
3512 a=dble(1)
3513 b=dble(acc+2)
3514 c=-buf_size+dble(acc+nelim)
3515 delta=(b*b)-(dble(4)*a*c)
3516 x=int((-b+sqrt(delta))/(dble(2)*a))
3517 IF(x.GT.ncb-acc) x=ncb-acc
3518 bande_k821=dble(x)*dble(nelim+acc+x)
3519 IF(have_type1_son)THEN
3520 a=dble(1)
3521 b=dble(acc+2+nelim)
3522 c=-buf_size+dble(acc+nelim)
3523 delta=(b*b)-(dble(4)*a*c)
3524 x=int((-b+sqrt(delta))/(dble(2)*a))
3525 IF(x.GT.ncb-acc) x=ncb-acc
3526 bande_k821=dble(x)*dble(nelim+acc+x)
3527 ENDIF
3528 IF((dble(nb_rows(i))*
3529 & dble(nb_rows(i)+acc)).EQ.
3530 & bande_k821)THEN
3531 GOTO 102
3532 ENDIF
3533 a=dble(nelim)
3534 b=dble(nelim)*
3535 & dble(nelim+2*(acc+nb_rows(i))+1)
3536 c=-(somme)
3537 delta=(b*b-(dble(4)*a*c))
3538 x=int((-b+sqrt(delta))/(dble(2)*a))
3539 a=dble(1)
3540 b=dble(acc+nelim)
3541 c=dble(-bande_k821)
3542 delta=((b*b)-(dble(4)*a*c))
3543 kmax=int((-b+sqrt(delta))/(dble(2)*a))
3544 IF(x.LT.0) THEN
3545 WRITE(*,*)myid,
3546 & ': Internal error 9 in ZMUMPS_SET_PARTI_FLOP_IRR'
3547 CALL mumps_abort()
3548 ENDIF
3549 IF((acc+x+nb_rows(i)).GT.ncb)THEN
3550 IF((ncb-acc).GT.kmax)THEN
3551 nb_rows(i)=kmax
3552 ELSE
3553 nb_rows(i)=ncb-acc
3554 ENDIF
3555 ELSE
3556 IF((nb_rows(i)+x).GT.kmax)THEN
3557 nb_rows(i)=kmax
3558 ELSE
3559 nb_rows(i)=nb_rows(i)+x
3560 ENDIF
3561 ENDIF
3562 102 CONTINUE
3563 acc=acc+nb_rows(i)
3564 IF(ncb.EQ.acc) THEN
3565 chosen=i
3566 GOTO 666
3567 ENDIF
3568 IF(ncb-acc.LT.kmin) THEN
3569 chosen=i
3570 GOTO 007
3571 ENDIF
3572 ENDDO
3573 007 CONTINUE
3574 DO i=1,chosen
3575 nb_rows(i)=nb_rows(i)+1
3576 acc=acc+1
3577 IF(acc.EQ.ncb)GOTO 666
3578 ENDDO
3579 IF(acc.LT.ncb)THEN
3580 IF(smp)THEN
3581 nb_rows(1)=nb_rows(1)+ncb-acc
3582 ELSE
3583 nb_rows(pos_min_load)=
3584 & nb_rows(pos_min_load)+ncb-acc
3585 ENDIF
3586 ENDIF
3587 ENDIF
3588 GOTO 666
3589 ENDIF
3590 ENDIF
3591 GOTO 666
3592 ENDIF
3593 additionnal_rows=ncb-acc
3594 i=chosen+1
3595 IF(nb_sat.EQ.small_set) GOTO 777
3596 DO i=1,small_set
3597 idwload(i)=i
3598 affected=int(buf_size/dble(ncb+1))-1
3599 bande_k821=dble(affected)*dble(nfront)
3600 IF(have_type1_son)THEN
3601 affected=int((buf_size-dble(nfront))/
3602 & (dble(nfront+1)))
3603 bande_k821=dble(affected)*dble(nfront)
3604 ENDIF
3605 max_mem_allow=bande_k821
3606 IF(bdc_md)THEN
3607 max_mem_allow=min(
3608 & min(mem_size_weak(i),mem_size_strong(i)),
3609 & bande_k821)
3610 max_mem_allow=max(dble(0),max_mem_allow)
3611 ENDIF
3612 wload(i)=max_mem_allow
3613 ENDDO
3614 CALL mumps_sort_doubles(small_set, wload, idwload)
3615 nb_zero=0
3616 IF((nb_sat.EQ.small_set).AND.
3617 & (small_set.LT.nslaves_ref))THEN
3618 small_set=ref+1
3619 ref=ref+1
3620 nb_rows=0
3621 GOTO 323
3622 ENDIF
3623 IF((nb_sat.EQ.small_set).AND.
3624 & (small_set.LE.number_of_procs))GOTO 777
3625 affected=int(additionnal_rows/(small_set-nb_sat))
3626 affected=max(affected,1)
3627 DO i=1,small_set
3628 kmax=int(wload(i)/dble(nfront))
3629 IF(nb_rows(idwload(i)).EQ.kmax)THEN
3630 GOTO 912
3631 ENDIF
3632 IF((nb_rows(idwload(i))+min(affected,
3633 & additionnal_rows)).GT.kmax)THEN
3634 IF(nb_rows(idwload(i)).GT.kmax)THEN
3635 ENDIF
3636 additionnal_rows=additionnal_rows-
3637 & (kmax-nb_rows(idwload(i)))
3638 nb_rows(idwload(i))=kmax
3639 nb_sat=nb_sat+1
3640 IF(nb_sat.EQ.small_set)THEN
3641 IF(small_set.NE.nslaves_ref)THEN
3642 small_set=ref+1
3643 ref=ref+1
3644 nb_rows=0
3645 GOTO 323
3646 ELSE
3647 max_load=max(max_load,
3648 & (temp(idwload(i))+(dble(nelim) *
3649 & dble(nb_rows(idwload(i))))+
3650 & (dble(nb_rows(idwload(i)))*
3651 & dble(nelim))*
3652 & dble(2*nfront-nelim-1)))
3653 GOTO 777
3654 ENDIF
3655 ENDIF
3656 affected=int(additionnal_rows/(small_set-nb_sat))
3657 affected=max(affected,1)
3658 ELSE
3659 IF((nb_rows(idwload(i))+min(affected,
3660 & additionnal_rows)).GE.kmin)THEN
3661 x=min(affected,additionnal_rows)
3662 nb_rows(idwload(i))=nb_rows(idwload(i))+
3663 & x
3664 additionnal_rows=additionnal_rows-x
3665 ELSE
3666 x=int((max_load-temp(idwload(i)))/
3667 & (dble(nelim)*dble(2*nfront-nelim)))
3668 IF(x+affected.GT.additionnal_rows)THEN
3669 x=additionnal_rows
3670 ELSE
3671 x=affected+x
3672 ENDIF
3673 IF(x.GE.kmin)THEN
3674 nb_rows(idwload(i))=nb_rows(idwload(i))+
3675 & x
3676 additionnal_rows=additionnal_rows-
3677 & x
3678 ELSE
3679 nb_zero=nb_zero+1
3680 ENDIF
3681 ENDIF
3682 ENDIF
3683 912 CONTINUE
3684 max_load=max(max_load,
3685 & (temp(idwload(i))+(dble(nelim)*
3686 & dble(nb_rows(idwload(i))))+
3687 & (dble(nb_rows(idwload(i)))*dble(nelim))*
3688 & dble(2*nfront-nelim-1)))
3689 IF(small_set.LT.number_of_procs)THEN
3690 IF(max_load.GT.temp(small_set+1))THEN
3691 IF(small_set.LT.nslaves_ref)THEN
3692 small_set=ref+1
3693 ref=ref+1
3694 nb_rows=0
3695 GOTO 323
3696 ENDIF
3697 ENDIF
3698 ENDIF
3699 IF(small_set.EQ.nb_sat)GOTO 777
3700 IF(additionnal_rows.EQ.0)THEN
3701 chosen=small_set
3702 GOTO 049
3703 ENDIF
3704 ENDDO
3705 777 CONTINUE
3706 IF((nb_zero.NE.0).AND.(additionnal_rows.GE.kmin))THEN
3707 j=nb_zero
3708 732 CONTINUE
3709 x=int(additionnal_rows/(j))
3710 IF(x.LT.kmin)THEN
3711 j=j-1
3712 GOTO 732
3713 ENDIF
3714 IF(x*j.LT.additionnal_rows)THEN
3715 x=x+1
3716 ENDIF
3717 DO i=1,small_set
3718 affected=int(buf_size/dble(ncb+1))-1
3719 bande_k821=dble(affected)*dble(nfront)
3720 IF(have_type1_son)THEN
3721 affected=int((buf_size-dble(nfront))/
3722 & dble(nfront+1))
3723 bande_k821=dble(affected)*dble(nfront)
3724 ENDIF
3725 max_mem_allow=bande_k821
3726 IF(bdc_md)THEN
3727 max_mem_allow=min(
3728 & min(mem_size_weak(i),mem_size_strong(i)),
3729 & dble(bande_k821))
3730 max_mem_allow=max(dble(0),max_mem_allow)
3731 ENDIF
3732 kmax=int(max_mem_allow/dble(nfront))
3733 IF(nb_rows(i).EQ.0)THEN
3734 IF(x.GT.additionnal_rows)THEN
3735 x=additionnal_rows
3736 ENDIF
3737 IF(x.GT.kmax)THEN
3738 x=kmax
3739 ENDIF
3740 IF(x.GT.kmin)THEN
3741 nb_rows(i)=x
3742 additionnal_rows=additionnal_rows-x
3743 max_load=max(max_load,
3744 & (temp(i)+(dble(nelim) *
3745 & dble(nb_rows(i)))+
3746 & (dble(nb_rows(i))*dble(nelim))*
3747 & dble(2*nfront-nelim-1)))
3748 ENDIF
3749 ENDIF
3750 ENDDO
3751 ENDIF
3752 i=chosen+1
3753 DO WHILE ((additionnal_rows.NE.0)
3754 & .AND.(i.LE.number_of_procs))
3755 IF((temp(i).LE.max_load))THEN
3756 affected=int(buf_size/dble(ncb+1))-1
3757 bande_k821=dble(affected)*dble(nfront)
3758 IF(have_type1_son)THEN
3759 affected=int((buf_size-dble(nfront))/
3760 & dble(nfront+1))
3761 bande_k821=dble(affected)*dble(nfront)
3762 ENDIF
3763 max_mem_allow=bande_k821
3764 IF(bdc_md)THEN
3765 max_mem_allow=min(
3766 & min(mem_size_weak(i),mem_size_strong(i)),
3767 & bande_k821)
3768 max_mem_allow=max(dble(0),max_mem_allow)
3769 ENDIF
3770 kmax=int(max_mem_allow/dble(nfront))
3771 affected=int((max_load-temp(i))/
3772 & (dble(nelim)*dble(2*nfront-nelim)))
3773 IF(affected.GT.additionnal_rows)THEN
3774 affected=additionnal_rows
3775 ENDIF
3776 IF(nb_rows(i).LT.kmax)THEN
3777 IF((affected+nb_rows(i)).GT.kmax)THEN
3778 affected=kmax-nb_rows(i)
3779 nb_sat=nb_sat+1
3780 ELSE
3781 IF((affected+nb_rows(i)).LT.
3782 & kmin)THEN
3783 affected=0
3784 ENDIF
3785 ENDIF
3786 nb_rows(i)=nb_rows(i)+affected
3787 additionnal_rows=additionnal_rows-affected
3788 ENDIF
3789 ELSE IF((temp(i).GT.max_load))THEN
3790 IF(nb_sat.EQ.i-1) GOTO 218
3791 x=(additionnal_rows/(i-1-nb_sat))
3792 acc=1
3793 DO j=1,i-1
3794 tmp_sum=((dble(nelim) * dble(nb_rows(j)+x))
3795 & +(dble(nb_rows(j)+x)*dble(nelim))*
3796 & dble(2*nfront-nelim-1))
3797 IF((temp(j)+tmp_sum).GT.max_load)THEN
3798 acc=0
3799 ENDIF
3800 ENDDO
3801 IF(acc.EQ.1)THEN
3802 max_load=temp(i)
3803 j=1
3804 DO WHILE ((additionnal_rows.NE.0)
3805 & .AND.(j.LT.i))
3806 affected=int(buf_size/dble(ncb+1))-1
3807 bande_k821=dble(affected)*dble(nfront)
3808 IF(have_type1_son)THEN
3809 affected=int((buf_size-dble(nfront))/
3810 & dble(nfront+1))
3811 bande_k821=dble(affected)*dble(nfront)
3812 ENDIF
3813 affected=x
3814 max_mem_allow=bande_k821
3815 IF(bdc_md)THEN
3816 max_mem_allow=min(
3817 & min(mem_size_weak(j),mem_size_strong(j)),
3818 & bande_k821)
3819 max_mem_allow=max(dble(0),
3820 & max_mem_allow)
3821 ENDIF
3822 kmax=int(max_mem_allow/dble(nfront))
3823 IF(affected.GT.additionnal_rows)THEN
3824 affected=additionnal_rows
3825 ENDIF
3826 IF(nb_rows(j).LT.kmax)THEN
3827 IF((affected+nb_rows(j)).GT.kmax)THEN
3828 affected=kmax-nb_rows(j)
3829 nb_sat=nb_sat+1
3830 ELSE
3831 IF((affected+nb_rows(j)).LT.
3832 & kmin)THEN
3833 affected=0
3834 ENDIF
3835 ENDIF
3836 nb_rows(j)=nb_rows(j)+affected
3837 additionnal_rows=additionnal_rows-
3838 & affected
3839 ENDIF
3840 j=j+1
3841 ENDDO
3842 ELSE
3843 max_load=temp(i)
3844 j=1
3845 DO WHILE ((additionnal_rows.NE.0)
3846 & .AND.(j.LT.i))
3847 affected=int(buf_size/dble(ncb+1))-1
3848 bande_k821=dble(affected)*dble(nfront)
3849 IF(have_type1_son)THEN
3850 affected=int((buf_size-dble(nfront))/
3851 & dble(nfront+1))
3852 bande_k821=dble(affected)*dble(nfront)
3853 ENDIF
3854 tmp_sum=((dble(nelim)* dble(nb_rows(j)))
3855 & +(dble(nb_rows(j))*dble(nelim))*
3856 & dble(2*nfront-nelim-1))
3857 x=int((max_load-(temp(j)+tmp_sum))/
3858 & (dble(nelim)*dble(2*nfront-nelim)))
3859 IF(x.LT.0)THEN
3860 WRITE(*,*)myid,
3861 & ': Internal error 10 in ZMUMPS_SET_PARTI_FLOP_IRR'
3862 CALL mumps_abort()
3863 ENDIF
3864 affected=x
3865 max_mem_allow=bande_k821
3866 IF(bdc_md)THEN
3867 max_mem_allow=min(
3868 & min(mem_size_weak(j),mem_size_strong(j)),
3869 & bande_k821)
3870 max_mem_allow=max(dble(0),
3871 & max_mem_allow)
3872 ENDIF
3873 kmax=int(max_mem_allow/dble(nfront))
3874 IF(affected.GT.additionnal_rows)THEN
3875 affected=additionnal_rows
3876 ENDIF
3877 IF(nb_rows(j).LT.kmax)THEN
3878 IF((affected+nb_rows(j)).GT.kmax)THEN
3879 affected=kmax-nb_rows(j)
3880 nb_sat=nb_sat+1
3881 ELSE
3882 IF((affected+nb_rows(j)).LT.
3883 & kmin)THEN
3884 affected=0
3885 ENDIF
3886 ENDIF
3887 nb_rows(j)=nb_rows(j)+affected
3888 additionnal_rows=additionnal_rows-
3889 & affected
3890 ENDIF
3891 j=j+1
3892 ENDDO
3893 ENDIF
3894 ENDIF
3895 218 CONTINUE
3896 i=i+1
3897 ENDDO
3898 chosen=i-1
3899 IF((chosen.EQ.number_of_procs-1).AND.
3900 & (additionnal_rows.NE.0))THEN
3901 DO i=1,chosen
3902 IF(nb_rows(i)+1.GE.kmin)THEN
3903 nb_rows(i)=nb_rows(i)+1
3904 additionnal_rows=additionnal_rows-1
3905 ENDIF
3906 max_load=max(max_load,
3907 & (temp(i)+(dble(nelim) *
3908 & dble(nb_rows(i)))+
3909 & (dble(nb_rows(i))*dble(nelim))*
3910 & dble(2*nfront-nelim-1)))
3911 IF(additionnal_rows.EQ.0) GOTO 048
3912 ENDDO
3913 048 CONTINUE
3914 ENDIF
3915 IF((additionnal_rows.NE.0))THEN
3916 IF(chosen.LT.number_of_procs)THEN
3917 i=chosen+1
3918 ELSE
3919 IF(chosen.NE.number_of_procs)THEN
3920 WRITE(*,*)myid,
3921 & ': Internal error 11 in ZMUMPS_SET_PARTI_FLOP_IRR'
3922 CALL mumps_abort()
3923 ENDIF
3924 i=chosen
3925 ENDIF
3926 DO WHILE ((additionnal_rows.NE.0)
3927 & .AND.(i.LE.number_of_procs))
3928 IF(temp(i).LE.max_load)THEN
3929 affected=int(buf_size/dble(ncb+1))-1
3930 bande_k821=dble(affected)*dble(nfront)
3931 IF(have_type1_son)THEN
3932 affected=int((buf_size-dble(nfront))/
3933 & dble(nfront+1))
3934 bande_k821=dble(affected)*dble(nfront)
3935 ENDIF
3936 max_mem_allow=bande_k821
3937 IF(bdc_md)THEN
3938 max_mem_allow=min(
3939 & min(mem_size_weak(i),mem_size_strong(i)),
3940 & bande_k821)
3941 max_mem_allow=max(dble(0),max_mem_allow)
3942 ENDIF
3943 kmax=int(max_mem_allow/dble(nfront))
3944 tmp_sum=((dble(nelim) * dble(nb_rows(i)))
3945 & +(dble(nb_rows(i))*dble(nelim))*
3946 & dble(2*nfront-nelim-1))
3947 x=int((max_load-(temp(i)+tmp_sum))/
3948 & (dble(nelim)*dble(2*nfront-nelim)))
3949 affected=x
3950 IF(x.LT.0)THEN
3951 WRITE(*,*)myid,
3952 & ': Internal error 12 in ZMUMPS_SET_PARTI_FLOP_IRR'
3953 CALL mumps_abort()
3954 ENDIF
3955 IF(affected.GT.additionnal_rows)THEN
3956 affected=additionnal_rows
3957 ENDIF
3958 IF(nb_rows(i).LT.kmax)THEN
3959 IF((affected+nb_rows(i)).GT.kmax)THEN
3960 affected=kmax-nb_rows(i)
3961 ELSE
3962 IF((affected+nb_rows(i)).LT.
3963 & kmin)THEN
3964 affected=0
3965 ENDIF
3966 ENDIF
3967 nb_rows(i)=nb_rows(i)+affected
3968 additionnal_rows=additionnal_rows-affected
3969 ENDIF
3970 IF(i.NE.number_of_procs) GOTO 624
3971 ELSE IF((temp(i).GT.max_load))THEN
3972 x=int(additionnal_rows/i-1)
3973 x=max(x,1)
3974 IF((max_load+((dble(nelim)*
3975 & dble(x))+(dble(
3976 & x)*dble(nelim))*dble(
3977 & (2*nfront-nelim-1)))).LE.temp(i))THEN
3978 affected=x
3979 pos=1
3980 ELSE
3981 pos=0
3982 ENDIF
3983 max_load=temp(i)
3984 j=1
3985 DO WHILE ((additionnal_rows.NE.0)
3986 & .AND.(j.LT.i))
3987 x=int(buf_size/dble(ncb+1))-1
3988 bande_k821=dble(x)*dble(nfront)
3989 max_mem_allow=bande_k821
3990 IF(have_type1_son)THEN
3991 x=int((buf_size-dble(nfront))/
3992 & dble(nfront+1))
3993 bande_k821=dble(x)*dble(nfront)
3994 ENDIF
3995 IF(bdc_md)THEN
3996 max_mem_allow=min(
3997 & min(mem_size_weak(j),mem_size_strong(j)),
3998 & bande_k821)
3999 max_mem_allow=max(dble(0),
4000 & max_mem_allow)
4001 ENDIF
4002 kmax=int(max_mem_allow/dble(nfront))
4003 IF(pos.EQ.0)THEN
4004 tmp_sum=((dble(nelim) *
4005 & dble(nb_rows(j)))
4006 & +(dble(nb_rows(j))*dble(nelim))*
4007 & dble(2*nfront-nelim-1))
4008 x=int((temp(i)-(temp(j)+tmp_sum))/
4009 & (dble(nelim)*dble(2*nfront-
4010 & nelim)))
4011 ELSE
4012 x=int(tmp_sum)
4013 ENDIF
4014 IF(x.GT.additionnal_rows)THEN
4015 x=additionnal_rows
4016 ENDIF
4017 IF(nb_rows(j).LT.kmax)THEN
4018 IF((x+nb_rows(j)).GT.kmax)THEN
4019 x=kmax-nb_rows(j)
4020 ELSE
4021 IF((nb_rows(j)+x).LT.
4022 & kmin)THEN
4023 x=0
4024 ENDIF
4025 ENDIF
4026 nb_rows(j)=nb_rows(j)+x
4027 additionnal_rows=additionnal_rows-x
4028 ENDIF
4029 j=j+1
4030 ENDDO
4031 ENDIF
4032 624 CONTINUE
4033 i=i+1
4034 ENDDO
4035 chosen=i-1
4036 IF(additionnal_rows.NE.0)THEN
4037 acc=0
4038 DO i=1,chosen
4039 x=int(buf_size/dble(ncb+1))-1
4040 bande_k821=dble(x)*dble(nfront)
4041 IF(have_type1_son)THEN
4042 x=int((buf_size-dble(nfront))/
4043 & dble(nfront+1))
4044 bande_k821=dble(x)*dble(nfront)
4045 ENDIF
4046 max_mem_allow=bande_k821
4047 IF(bdc_md)THEN
4048 max_mem_allow=min(
4049 & min(mem_size_weak(i),mem_size_strong(i)),
4050 & bande_k821)
4051 max_mem_allow=max(dble(0),max_mem_allow)
4052 ENDIF
4053 kmax=int(max_mem_allow/dble(nfront))
4054 tmp_sum=((dble(nelim) * dble(nb_rows(i)))
4055 & +(dble(nb_rows(i))*dble(nelim))*
4056 & dble(2*nfront-nelim-1))
4057 x=int((max_load-
4058 & (temp(i)+tmp_sum))/
4059 & (dble(nelim)*dble(2*nfront-nelim)))
4060 IF(x.LT.0)THEN
4061 WRITE(*,*)myid,
4062 & ': Internal error 13 in ZMUMPS_SET_PARTI_FLOP_IRR'
4063 CALL mumps_abort()
4064 ENDIF
4065 IF(x.GT.additionnal_rows)THEN
4066 x=additionnal_rows
4067 ENDIF
4068 IF(nb_rows(i).LT.kmax)THEN
4069 IF((x+nb_rows(i)).GE.kmax)THEN
4070 additionnal_rows=additionnal_rows-
4071 & (kmax-nb_rows(i))
4072 nb_rows(i)=kmax
4073 ELSE
4074 IF((x+nb_rows(i)).GE.
4075 & kmin)THEN
4076 nb_rows(i)=nb_rows(i)+x
4077 additionnal_rows=additionnal_rows-x
4078 acc=acc+1
4079 ELSE
4080 acc=acc+1
4081 ENDIF
4082 ENDIF
4083 ENDIF
4084 IF(additionnal_rows.EQ.0)GOTO 049
4085 ENDDO
4086 IF(chosen.LT.number_of_procs)THEN
4087 chosen=chosen+1
4088 ENDIF
4089 IF(acc.EQ.0)THEN
4090 acc=1
4091 ENDIF
4092 x=int(additionnal_rows/acc)
4093 x=max(x,1)
4094 acc=0
4095 DO i=1,chosen
4096 j=int(buf_size/dble(ncb+1))-1
4097 bande_k821=dble(j)*dble(nfront)
4098 IF(have_type1_son)THEN
4099 j=int((buf_size-dble(nfront))/
4100 & dble(nfront+1))
4101 bande_k821=dble(j)*dble(nfront)
4102 ENDIF
4103 max_mem_allow=bande_k821
4104 IF(bdc_md)THEN
4105 max_mem_allow=min(
4106 & min(mem_size_weak(i),mem_size_strong(i)),
4107 & bande_k821)
4108 max_mem_allow=max(dble(0),max_mem_allow)
4109 ENDIF
4110 kmax=int(max_mem_allow/dble(nfront))
4111 tmp_sum=((dble(nelim) * dble(nb_rows(i)))
4112 & +(dble(nb_rows(i))*dble(nelim))*
4113 & dble(2*nfront-nelim-1))
4114 j=int((max_load-
4115 & (temp(i)+tmp_sum))/
4116 & (dble(nelim)*dble(2*nfront-nelim)))
4117 IF(nb_rows(i).LT.kmax)THEN
4118 IF((min(x,j)+nb_rows(i)).GE.kmax)THEN
4119 IF((kmax-nb_rows(i)).GT.
4120 & additionnal_rows)THEN
4121 nb_rows(i)=nb_rows(i)+
4122 & additionnal_rows
4123 additionnal_rows=0
4124 ELSE
4125 additionnal_rows=additionnal_rows-
4126 & (kmax-nb_rows(i))
4127 nb_rows(i)=kmax
4128 ENDIF
4129 ELSE
4130 IF((min(x,j)+nb_rows(i)).GE.
4131 & kmin)THEN
4132 nb_rows(i)=nb_rows(i)+min(x,j)
4133 additionnal_rows=additionnal_rows-
4134 & min(x,j)
4135 acc=acc+1
4136 ENDIF
4137 ENDIF
4138 ENDIF
4139 IF(additionnal_rows.EQ.0)GOTO 049
4140 ENDDO
4141 IF(acc.GT.0)THEN
4142 DO i=1,chosen
4143 x=int(buf_size/dble(ncb+1))-1
4144 bande_k821=dble(x)*dble(nfront)
4145 IF(have_type1_son)THEN
4146 x=int((buf_size-dble(nfront))/
4147 & dble(nfront+1))
4148 bande_k821=dble(x)*dble(nfront)
4149 ENDIF
4150 max_mem_allow=bande_k821
4151 IF(bdc_md)THEN
4152 max_mem_allow=min(
4153 & min(mem_size_weak(i),mem_size_strong(i)),
4154 & bande_k821)
4155 max_mem_allow=max(dble(0),
4156 & max_mem_allow)
4157 ENDIF
4158 kmax=int(max_mem_allow/dble(nfront))
4159 IF(kmax-nb_rows(i).LT.
4160 & additionnal_rows)THEN
4161 additionnal_rows=additionnal_rows-
4162 & (kmax-nb_rows(i))
4163 nb_rows(i)=kmax
4164 ELSE
4165 IF(nb_rows(i).EQ.0)THEN
4166 IF(min(kmin,kmax).LT.
4167 & additionnal_rows)THEN
4168 nb_rows(i)=min(kmin,kmax)
4169 additionnal_rows=
4170 & additionnal_rows-
4171 & min(kmin,kmax)
4172 ENDIF
4173 ELSE
4174 nb_rows(i)=nb_rows(i)+
4175 & additionnal_rows
4176 additionnal_rows=0
4177 ENDIF
4178 ENDIF
4179 IF(additionnal_rows.EQ.0)GOTO 049
4180 ENDDO
4181 ENDIF
4182 DO i=1,chosen
4183 idwload(i)=i
4184 affected=int(buf_size/dble(ncb+1))-1
4185 bande_k821=dble(affected)*dble(nfront)
4186 IF(have_type1_son)THEN
4187 affected=int((buf_size-dble(nfront))/
4188 & dble(nfront+1))
4189 bande_k821=dble(affected)*dble(nfront)
4190 ENDIF
4191 wload(i)=(bande_k821-dble(nb_rows(i)*nfront))
4192 ENDDO
4193 CALL mumps_sort_doubles(number_of_procs, wload,
4194 & idwload)
4195 nb_sat=0
4196 DO i=1,chosen
4197 x=int(additionnal_rows/(chosen-nb_sat))
4198 x=max(x,1)
4199 affected=int(buf_size/dble(ncb+1))-1
4200 bande_k821=dble(affected)*dble(nfront)
4201 IF(have_type1_son)THEN
4202 affected=int((buf_size-dble(nfront))/
4203 & dble(nfront+1))
4204 bande_k821=dble(affected)*dble(nfront)
4205 ENDIF
4206 IF(bdc_md)THEN
4207 max_mem_allow=min(bande_k821,
4208 & mem_size_strong(i))
4209 max_mem_allow=max(dble(0),max_mem_allow)
4210 ENDIF
4211 kmax=int(max_mem_allow/dble(nfront))
4212 IF(nb_rows(idwload(i)).LT.kmax)THEN
4213 IF((nb_rows(idwload(i))+x).LT.kmax)THEN
4214 nb_rows(idwload(i))=
4215 & nb_rows(idwload(i))+x
4216 additionnal_rows=additionnal_rows-x
4217 ELSE
4218 additionnal_rows=additionnal_rows-
4219 & (kmax-nb_rows(idwload(i)))
4220 nb_rows(idwload(i))=kmax
4221 ENDIF
4222 ENDIF
4223 IF(nb_rows(idwload(i)).EQ.kmax)THEN
4224 nb_sat=nb_sat+1
4225 ENDIF
4226 IF(additionnal_rows.EQ.0) GOTO 049
4227 ENDDO
4228 DO i=1,chosen
4229 x=int(buf_size/dble(ncb+1))-1
4230 bande_k821=dble(x)*dble(nfront)
4231 IF(have_type1_son)THEN
4232 x=int((buf_size-dble(nfront))/
4233 & dble(nfront+1))
4234 bande_k821=dble(x)*dble(nfront)
4235 ENDIF
4236 max_mem_allow=bande_k821
4237 IF(bdc_md)THEN
4238 max_mem_allow=min(bande_k821,
4239 & mem_size_strong(i))
4240 max_mem_allow=max(dble(0),max_mem_allow)
4241 ENDIF
4242 kmax=int(max_mem_allow/dble(nfront))
4243 IF(kmax-nb_rows(i).LT.additionnal_rows)THEN
4244 additionnal_rows=additionnal_rows-
4245 & (kmax-nb_rows(i))
4246 nb_rows(i)=kmax
4247 ELSE
4248 nb_rows(i)=nb_rows(i)+additionnal_rows
4249 additionnal_rows=0
4250 ENDIF
4251 IF(additionnal_rows.EQ.0)GOTO 049
4252 ENDDO
4253 x=int(additionnal_rows/chosen)
4254 x=max(x,1)
4255 DO i=1,chosen
4256 additionnal_rows=additionnal_rows-x
4257 nb_rows(i)=nb_rows(i)+x
4258 IF(additionnal_rows.EQ.0)GOTO 049
4259 ENDDO
4260 nb_rows(1)=nb_rows(1)+additionnal_rows
4261 ENDIF
4262 ENDIF
4263 049 CONTINUE
4264 ENDIF
4265 666 CONTINUE
4266 somme=dble(0)
4267 x=0
4268 pos=0
4269 DO i=1,chosen
4270 x=x+nb_rows(i)
4271 somme=somme+ dble(nb_rows(i))
4272 ENDDO
4273 GOTO 890
4274 ELSE IF((keep(83).GE.number_of_procs).AND.force_cand)THEN
4275 max_load=dble(0)
4276 DO i=1,others
4277 max_load=max(max_load,temp(i))
4278 ENDDO
4279 acc=0
4280 chosen=0
4281 x=1
4282 DO i=1,others
4283 ENDDO
4284 DO i=2,others
4285 IF(temp(i).EQ.temp(1))THEN
4286 x=x+1
4287 ELSE
4288 GOTO 329
4289 ENDIF
4290 ENDDO
4291 329 CONTINUE
4292 tmp_sum=total_cost/dble(x)
4293 temp_max_load=dble(0)
4294 DO i=1,others
4295 IF(k50.EQ.0)THEN
4296 x=int(buf_size/dble(ncb+1))-1
4297 bande_k821=dble(x)*dble(nfront)
4298 ELSE
4299 a=dble(1)
4300 b=dble(acc+2)
4301 c=-buf_size+dble(acc+nelim)
4302 delta=(b*b)-(dble(4)*a*c)
4303 x=int((-b+sqrt(delta))/(dble(2)*a))
4304 IF(x.GT.ncb-acc) x=ncb-acc
4305 bande_k821=dble(x)*dble(nelim+acc+x)
4306 ENDIF
4307 IF(have_type1_son)THEN
4308 IF(k50.EQ.0)THEN
4309 x=int((buf_size-dble(nfront))/dble(nfront+1))
4310 bande_k821=dble(x)*dble(nfront)
4311 ELSE
4312 a=dble(1)
4313 b=dble(acc+2+nelim)
4314 c=-buf_size+dble(acc+nelim)
4315 delta=(b*b)-(dble(4)*a*c)
4316 x=int((-b+sqrt(delta))/(dble(2)*a))
4317 IF(x.GT.ncb-acc) x=ncb-acc
4318 bande_k821=dble(x)*dble(nelim+acc+x)
4319 ENDIF
4320 ENDIF
4321 max_mem_allow=bande_k821
4322 IF(bdc_md)THEN
4323 max_mem_allow=min(bande_k821,
4324 & min(mem_size_weak(i),mem_size_strong(i)))
4325 max_mem_allow=max(dble(0),max_mem_allow)
4326 ENDIF
4327 IF(k50.EQ.0)THEN
4328 kmax=int(max_mem_allow/dble(nfront))
4329 IF(tmp_sum+temp(i).GT.max_load)THEN
4330 somme=max_load-temp(i)
4331 ELSE
4332 somme=tmp_sum
4333 ENDIF
4334 x=int(somme/
4335 & (dble(nelim)*dble(2*nfront-nelim)))
4336 IF(x.GT.kmax)THEN
4337 x=kmax
4338 ELSE
4339 IF(x.LT.kmin)THEN
4340 x=min(kmin,kmax)
4341 ENDIF
4342 ENDIF
4343 IF((acc+x).GT.ncb) x=ncb-acc
4344 ENDIF
4345 IF(k50.NE.0)THEN
4346 a=dble(1)
4347 b=dble(acc+nelim)
4348 c=dble(-max_mem_allow)
4349 delta=((b*b)-(dble(4)*a*c))
4350 kmax=int((-b+sqrt(delta))/(dble(2)*a))
4351 a=dble(nelim)
4352 b=dble(nelim)*dble(nelim+2*acc+1)
4353 IF(tmp_sum+temp(i).GT.max_load)THEN
4354 c=-(max_load-temp(i))
4355 ELSE
4356 c=-tmp_sum
4357 ENDIF
4358 delta=(b*b-(dble(4)*a*c))
4359 x=int((-b+sqrt(delta))/(dble(2)*a))
4360 IF(x.LT.0) THEN
4361 WRITE(*,*)myid,
4362 & ': Internal error 14 in ZMUMPS_SET_PARTI_FLOP_IRR'
4363 CALL mumps_abort()
4364 ENDIF
4365 IF(x.GE.kmax)THEN
4366 IF(kmax.GT.kmin)THEN
4367 x=kmax
4368 ELSE
4369 x=0
4370 ENDIF
4371 ELSE
4372 IF(x.LE.min(kmin,kmax))THEN
4373 IF(kmax.LT.kmin)THEN
4374 x=0
4375 ELSE
4376 x=min(kmin,kmax)
4377 ENDIF
4378 ENDIF
4379 ENDIF
4380 IF((acc+x).GT.ncb) x=ncb-acc
4381 ENDIF
4382 temp_max_load=max(temp_max_load,temp(i))
4383 nb_rows(i)=x
4384 chosen=chosen+1
4385 acc=acc+x
4386 IF(acc.EQ.ncb) GOTO 541
4387 ENDDO
4388 541 CONTINUE
4389 IF(acc.LT.ncb)THEN
4390 IF(k50.EQ.0)THEN
4391 additionnal_rows=ncb-acc
4392 DO j=1,chosen
4393 affected=int(buf_size/dble(ncb+1))-1
4394 bande_k821=dble(affected)*dble(nfront)
4395 IF(have_type1_son)THEN
4396 affected=int((buf_size-dble(nfront))/
4397 & dble(nfront+1))
4398 bande_k821=dble(affected)*dble(nfront)
4399 ENDIF
4400 max_mem_allow=bande_k821
4401 IF(bdc_md)THEN
4402 max_mem_allow=min(
4403 & min(mem_size_weak(j),mem_size_strong(j)),
4404 & dble(bande_k821))
4405 max_mem_allow=max(dble(0),max_mem_allow)
4406 ENDIF
4407 kmax=int(max_mem_allow/dble(nfront))
4408 IF((nb_rows(j)).LT.kmax)THEN
4409 IF(additionnal_rows.GT.(kmax-nb_rows(j)))THEN
4410 additionnal_rows=additionnal_rows-
4411 & (kmax-nb_rows(j))
4412 nb_rows(j)=kmax
4413 ELSE
4414 nb_rows(j)=nb_rows(j)+additionnal_rows
4415 additionnal_rows=0
4416 ENDIF
4417 ENDIF
4418 IF(additionnal_rows.EQ.0)GOTO 889
4419 ENDDO
4420 x=int(additionnal_rows/chosen)
4421 x=max(x,1)
4422 DO j=1,chosen
4423 affected=int(buf_size/dble(ncb+1))-1
4424 bande_k821=dble(affected)*dble(nfront)
4425 IF(have_type1_son)THEN
4426 affected=int((buf_size-dble(nfront))/
4427 & dble(nfront+1))
4428 bande_k821=dble(affected)*dble(nfront)
4429 ENDIF
4430 max_mem_allow=bande_k821
4431 IF(bdc_md)THEN
4432 max_mem_allow=min(bande_k821,
4433 & mem_size_strong(j))
4434 max_mem_allow=max(dble(0),max_mem_allow)
4435 ENDIF
4436 kmax=int(max_mem_allow/dble(nfront))
4437 IF((nb_rows(j)+x).GT.kmax)THEN
4438 additionnal_rows=additionnal_rows-
4439 & (kmax-nb_rows(j))
4440 nb_rows(j)=kmax
4441 ELSE
4442 additionnal_rows=additionnal_rows-x
4443 nb_rows(j)=nb_rows(j)+x
4444 ENDIF
4445 IF(additionnal_rows.EQ.0)GOTO 889
4446 ENDDO
4447 DO i=1,chosen
4448 x=int(buf_size/dble(ncb+1))-1
4449 bande_k821=dble(x)*dble(nfront)
4450 IF(have_type1_son)THEN
4451 x=int((buf_size-dble(nfront))/
4452 & dble(nfront+1))
4453 bande_k821=dble(x)*dble(nfront)
4454 ENDIF
4455 max_mem_allow=bande_k821
4456 IF(bdc_md)THEN
4457 max_mem_allow=min(bande_k821,
4458 & mem_size_strong(i))
4459 max_mem_allow=max(dble(0),max_mem_allow)
4460 ENDIF
4461 kmax=int(max_mem_allow/dble(nfront))
4462 IF(kmax-nb_rows(i).LT.additionnal_rows)THEN
4463 additionnal_rows=additionnal_rows-
4464 & (kmax-nb_rows(i))
4465 nb_rows(i)=kmax
4466 ELSE
4467 nb_rows(i)=nb_rows(i)+additionnal_rows
4468 additionnal_rows=0
4469 ENDIF
4470 IF(additionnal_rows.EQ.0)GOTO 889
4471 ENDDO
4472 DO i=1,number_of_procs
4473 idwload(i)=i
4474 affected=int(buf_size/dble(ncb+1))-1
4475 bande_k821=dble(affected)*dble(nfront)
4476 IF(have_type1_son)THEN
4477 affected=int((buf_size-dble(nfront))/
4478 & dble(nfront+1))
4479 bande_k821=dble(affected)*dble(nfront)
4480 ENDIF
4481 wload(i)=(bande_k821-(dble(nb_rows(i))*
4482 & dble(nfront)))
4483 ENDDO
4484 CALL mumps_sort_doubles(number_of_procs, wload,
4485 & idwload)
4486 nb_sat=0
4487 DO i=1,chosen
4488 x=int(additionnal_rows/(chosen-nb_sat))
4489 x=max(x,1)
4490 affected=int(buf_size/dble(ncb+1))-1
4491 bande_k821=dble(affected)*dble(nfront)
4492 IF(have_type1_son)THEN
4493 affected=int((buf_size-dble(nfront))/
4494 & dble(nfront+1))
4495 bande_k821=dble(affected)*dble(nfront)
4496 ENDIF
4497 max_mem_allow=bande_k821
4498 kmax=int(max_mem_allow/dble(nfront))
4499 IF(nb_rows(idwload(i)).LT.kmax)THEN
4500 IF((nb_rows(idwload(i))+x).LT.kmax)THEN
4501 nb_rows(idwload(i))=
4502 & nb_rows(idwload(i))+x
4503 additionnal_rows=additionnal_rows-x
4504 ELSE
4505 additionnal_rows=additionnal_rows-
4506 & (kmax-nb_rows(idwload(i)))
4507 nb_rows(idwload(i))=kmax
4508 ENDIF
4509 ENDIF
4510 IF(nb_rows(idwload(i)).EQ.kmax)THEN
4511 nb_sat=nb_sat+1
4512 ENDIF
4513 IF(additionnal_rows.EQ.0) GOTO 889
4514 ENDDO
4515 GOTO 994
4516 ELSE
4517 acc=0
4518 chosen=0
4519 DO i=1,others
4520 a=dble(1)
4521 b=dble(acc+2)
4522 c=-buf_size+dble(acc+nelim)
4523 delta=(b*b)-(dble(4)*a*c)
4524 x=int((-b+sqrt(delta))/(dble(2)*a))
4525 IF(x.GT.ncb-acc) x=ncb-acc
4526 bande_k821=dble(x)*dble(nelim+acc+x)
4527 IF(have_type1_son)THEN
4528 a=dble(1)
4529 b=dble(acc+2+nelim)
4530 c=-buf_size+dble(acc+nelim)
4531 delta=(b*b)-(dble(4)*a*c)
4532 x=int((-b+sqrt(delta))/(dble(2)*a))
4533 IF(x.GT.ncb-acc) x=ncb-acc
4534 bande_k821=dble(x)*dble(nelim+acc+x)
4535 ENDIF
4536 max_mem_allow=bande_k821
4537 IF(bdc_md)THEN
4538 max_mem_allow=min(bande_k821,
4539 & mem_size_strong(i))
4540 max_mem_allow=max(dble(0),max_mem_allow)
4541 ENDIF
4542 a=dble(1)
4543 b=dble(acc+nelim)
4544 c=dble(-max_mem_allow)
4545 delta=((b*b)-(dble(4)*a*c))
4546 kmax=int((-b+sqrt(delta))/(dble(2)*a))
4547 x=kmax-nb_rows(i)
4548 IF((acc+nb_rows(i)+x).GT.ncb)
4549 & x=ncb-(acc+nb_rows(i))
4550 nb_rows(i)=nb_rows(i)+x
4551 acc=acc+nb_rows(i)
4552 chosen=chosen+1
4553 IF(ncb.EQ.acc) GOTO 889
4554 ENDDO
4555 additionnal_rows=ncb-acc
4556 ENDIF
4557 acc=0
4558 chosen=0
4559 DO i=1,others
4560 a=dble(1)
4561 b=dble(acc+2)
4562 c=-buf_size+dble(acc+nelim)
4563 delta=(b*b)-(dble(4)*a*c)
4564 x=int((-b+sqrt(delta))/(dble(2)*a))
4565 IF(x.GT.ncb-acc) x=ncb-acc
4566 bande_k821=dble(x)*dble(nelim+acc+x)
4567 IF(have_type1_son)THEN
4568 a=dble(1)
4569 b=dble(acc+2+nelim)
4570 c=-buf_size+dble(acc+nelim)
4571 delta=(b*b)-(dble(4)*a*c)
4572 x=int((-b+sqrt(delta))/(dble(2)*a))
4573 IF(x.GT.ncb-acc) x=ncb-acc
4574 bande_k821=dble(x)*dble(nelim+acc+x)
4575 ENDIF
4576 max_mem_allow=bande_k821
4577 a=dble(1)
4578 b=dble(acc+nelim)
4579 c=dble(-max_mem_allow)
4580 delta=((b*b)-(dble(4)*a*c))
4581 kmax=int((-b+sqrt(delta))/(dble(2)*a))
4582 x=kmax-nb_rows(i)
4583 IF((acc+nb_rows(i)+x).GT.ncb)
4584 & x=ncb-(acc+nb_rows(i))
4585 nb_rows(i)=nb_rows(i)+x
4586 acc=acc+nb_rows(i)
4587 chosen=chosen+1
4588 IF(ncb.EQ.acc) GOTO 889
4589 ENDDO
4590 additionnal_rows=ncb-acc
4591 994 CONTINUE
4592 x=int(dble(additionnal_rows)/dble(others))
4593 IF((x*others).LT.additionnal_rows)THEN
4594 x=x+1
4595 ENDIF
4596 DO i=1,others
4597 nb_rows(i)=nb_rows(i)+x
4598 additionnal_rows=additionnal_rows-x
4599 IF(additionnal_rows.LT.x)x=additionnal_rows
4600 ENDDO
4601 chosen=others
4602 ENDIF
4603 ENDIF
4604 889 CONTINUE
4605 max_load=temp_max_load
4606 890 CONTINUE
4607 j=chosen
4608 x=0
4609 DO i=j,1,-1
4610 IF(nb_rows(i).EQ.0)THEN
4611 chosen=chosen-1
4612 ELSE
4613 IF(nb_rows(i).GT.0)THEN
4614 x=1
4615 ELSE
4616 WRITE(*,*)myid,
4617 & ': Internal error 15 in ZMUMPS_SET_PARTI_FLOP_IRR'
4618 CALL mumps_abort()
4619 ENDIF
4620 ENDIF
4621 ENDDO
4622 nslaves_node=chosen
4623 tab_pos(nslaves_node+1)= ncb+1
4624 tab_pos(slavef+2) = chosen
4625 pos=1
4626 x=1
4627 DO i=1,j
4628 IF(nb_rows(i).NE.0)THEN
4629 slaves_list(x)=temp_id(i)
4630 tab_pos(x)=pos
4631 pos=pos+nb_rows(i)
4632 IF(nb_rows(i).LE.0)THEN
4633 WRITE(*,*)myid,
4634 & ': Internal error 16 in ZMUMPS_SET_PARTI_FLOP_IRR'
4635 CALL mumps_abort()
4636 ENDIF
4637 x=x+1
4638 ENDIF
4639 ENDDO
4640 IF(pos.NE.(ncb+1))THEN
4641 WRITE(*,*)myid,
4642 & ': Internal error 17 in ZMUMPS_SET_PARTI_FLOP_IRR',
4643 & pos,ncb+1
4644 CALL mumps_abort()
4645 ENDIF
integer function mumps_getkmin(k821, k50, kmax, ncb)
subroutine mumps_max_surfcb_nbrows(what, keep, keep8, ncb, nfr, slavef, nbrowmax, maxsurfcb8)

◆ zmumps_split_post_partition()

subroutine, public zmumps_load::zmumps_split_post_partition ( integer, intent(in) inode,
integer, dimension(n), intent(in) step,
integer, intent(in) n,
integer, intent(in) slavef,
integer, intent(in) nbsplit,
integer, intent(in) ncb,
integer, dimension(keep(28)), intent(in) procnode_steps,
integer, dimension(500), intent(in) keep,
integer, dimension (keep(28)), intent(in) dad,
integer, dimension(n), intent(in) fils,
integer, dimension(60), intent(in) icntl,
integer, dimension ( slavef+2 ), intent(inout) tab_pos,
integer, intent(inout) nslaves_node )

Definition at line 215 of file zmumps_load.F.

220 IMPLICIT NONE
221 INTEGER, intent(in) :: INODE, N, SLAVEF, NCB,
222 & KEEP(500), NBSPLIT
223 INTEGER, intent(in) :: STEP(N), DAD (KEEP(28)), ICNTL(60),
224 & PROCNODE_STEPS(KEEP(28)),
225 & FILS(N)
226 INTEGER, intent(inout) :: TAB_POS ( SLAVEF+2 ), NSLAVES_NODE
227 INTEGER :: IN, LP, II, NUMORG, NBSPLIT_LOC, I
228 INTEGER MUMPS_TYPESPLIT
229 EXTERNAL mumps_typesplit
230 DO i= nslaves_node+1, 1, -1
231 tab_pos(i+nbsplit) = tab_pos(i)
232 END DO
233 lp = icntl(1)
234 in = inode
235 nbsplit_loc = 0
236 numorg = 0
237 tab_pos(1) = 1
238 DO WHILE
239 & (
240 & ( mumps_typesplit
241 & (procnode_steps(step(dad(step(in)))),keep(199))
242 & .EQ.5
243 & )
244 & .OR.
245 & ( mumps_typesplit
246 & (procnode_steps(step(dad(step(in)))),keep(199))
247 & .EQ.6
248 & )
249 & )
250 nbsplit_loc = nbsplit_loc + 1
251 in = dad(step(in))
252 ii = in
253 DO WHILE (ii.GT.0)
254 numorg = numorg + 1
255 ii = fils(ii)
256 ENDDO
257 tab_pos(nbsplit_loc+1) = numorg + 1
258 END DO
259 DO i = nbsplit+2, nbsplit+nslaves_node+1
260 tab_pos(i) = tab_pos(i) + numorg
261 ENDDO
262 nslaves_node = nslaves_node + nbsplit
263 tab_pos(nslaves_node+2:slavef+1) = -9999
264 tab_pos( slavef+2 ) = nslaves_node
265 RETURN
integer function mumps_typesplit(procinfo_inode, k199)

◆ zmumps_split_prep_partition()

subroutine, public zmumps_load::zmumps_split_prep_partition ( integer, intent(in) inode,
integer, dimension(n), intent(in) step,
integer, intent(in) n,
integer, intent(in) slavef,
integer, dimension(keep(28)), intent(in) procnode_steps,
integer, dimension(500), intent(in) keep,
integer, dimension (keep(28)), intent(in) dad,
integer, dimension(n), intent(in) fils,
integer, dimension(slavef+1), intent(in) cand,
integer, dimension(60), intent(in) icntl,
integer, dimension(slavef+1), intent(inout) copy_cand,
integer, intent(out) nbsplit,
integer, intent(out) numorg_split,
integer, dimension(size_slaves_list), intent(inout) slaves_list,
integer, intent(in) size_slaves_list )

Definition at line 165 of file zmumps_load.F.

172 IMPLICIT NONE
173 INTEGER, intent(in) :: INODE, N, SIZE_SLAVES_LIST, SLAVEF,
174 & KEEP(500)
175 INTEGER, intent(in) :: STEP(N), DAD (KEEP(28)), ICNTL(60),
176 & PROCNODE_STEPS(KEEP(28)), CAND(SLAVEF+1),
177 & FILS(N)
178 INTEGER, intent(out) :: NBSPLIT, NUMORG_SPLIT
179 INTEGER, intent(inout) :: SLAVES_LIST(SIZE_SLAVES_LIST),
180 & COPY_CAND(SLAVEF+1)
181 INTEGER :: IN, LP, II
182 INTEGER MUMPS_TYPESPLIT
183 EXTERNAL mumps_typesplit
184 lp = icntl(1)
185 in = inode
186 nbsplit = 0
187 numorg_split = 0
188 DO WHILE
189 & (
190 & ( mumps_typesplit
191 & (procnode_steps(step(dad(step(in)))),keep(199))
192 & .EQ.5
193 & )
194 & .OR.
195 & ( mumps_typesplit
196 & (procnode_steps(step(dad(step(in)))),keep(199))
197 & .EQ.6
198 & )
199 & )
200 nbsplit = nbsplit + 1
201 in = dad(step(in))
202 ii = in
203 DO WHILE (ii.GT.0)
204 numorg_split = numorg_split + 1
205 ii = fils(ii)
206 ENDDO
207 END DO
208 slaves_list(1:nbsplit) = cand(1:nbsplit)
209 copy_cand(1:size_slaves_list-nbsplit) =
210 & cand(1+nbsplit:size_slaves_list)
211 copy_cand(size_slaves_list-nbsplit+1:slavef) = -1
212 copy_cand(slavef+1) = size_slaves_list-nbsplit
213 RETURN

◆ zmumps_split_propagate_parti()

subroutine, public zmumps_load::zmumps_split_propagate_parti ( integer, intent(in) inode,
integer, intent(in) typesplit,
integer, intent(in) ifson,
integer, dimension(size_cand), intent(in) cand,
integer, intent(in) size_cand,
integer, dimension (nslson), intent(in) son_slave_list,
integer, intent(in) nslson,
integer, dimension(n), intent(in) step,
integer, intent(in) n,
integer, intent(in) slavef,
integer, dimension(keep(28)), intent(in) procnode_steps,
integer, dimension(500), intent(in) keep,
integer, dimension (keep(28)), intent(in) dad,
integer, dimension(n), intent(in) fils,
integer, dimension(60), intent(in) icntl,
integer, dimension(keep(71)), intent(in) istep_to_iniv2,
integer, intent(in) iniv2,
integer, dimension(slavef+2,max(1,keep(56))), intent(inout) tab_pos_in_pere,
integer, intent(out) nslaves_node,
integer, dimension (size_slaves_list), intent(out) slaves_list,
integer, intent(in) size_slaves_list )

Definition at line 267 of file zmumps_load.F.

277 IMPLICIT NONE
278 INTEGER, intent(in) :: INODE, TYPESPLIT, IFSON, N, SLAVEF,
279 & KEEP(500),
280 & NSLSON, SIZE_SLAVES_LIST, SIZE_CAND
281 INTEGER, intent(in) :: STEP(N), DAD (KEEP(28)), ICNTL(60),
282 & PROCNODE_STEPS(KEEP(28)),
283 & FILS(N), INIV2,
284 & SON_SLAVE_LIST (NSLSON),
285 & ISTEP_TO_INIV2(KEEP(71)),
286 & CAND(SIZE_CAND)
287 INTEGER, intent(out) :: NSLAVES_NODE
288 INTEGER, intent(inout) ::
289 & TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
290 INTEGER, intent(out) :: SLAVES_LIST (SIZE_SLAVES_LIST)
291 INTEGER :: IN, LP, I, NSLAVES_SONS,
292 & INIV2_FILS, ISHIFT
293 lp = icntl(1)
294 in = inode
295 iniv2_fils = istep_to_iniv2( step( ifson ))
296 nslaves_sons = tab_pos_in_pere(slavef+2, iniv2_fils)
297 tab_pos_in_pere(1,iniv2) = 1
298 ishift = tab_pos_in_pere(2, iniv2_fils) -1
299 DO i = 2, nslaves_sons
300 tab_pos_in_pere(i,iniv2) =
301 & tab_pos_in_pere(i+1,iniv2_fils) - ishift
302 slaves_list(i-1) = son_slave_list(i)
303 END DO
304 tab_pos_in_pere(nslaves_sons+1:slavef+1,iniv2) = -9999
305 nslaves_node = nslaves_sons - 1
306 tab_pos_in_pere(slavef+2, iniv2) = nslaves_node
307 RETURN

◆ zmumps_upper_predict()

subroutine, public zmumps_load::zmumps_upper_predict ( integer inode,
integer, dimension(n) step,
integer nsteps,
integer, dimension(nsteps) procnode,
integer, dimension(nsteps) frere,
integer, dimension(nsteps) ne,
integer comm,
integer slavef,
integer myid,
integer, dimension(500) keep,
integer(8), dimension(150) keep8,
integer n )

Definition at line 4811 of file zmumps_load.F.

4813 USE zmumps_buf
4814 IMPLICIT NONE
4815 INTEGER INODE,NSTEPS,MYID,SLAVEF,COMM,N
4816 INTEGER KEEP(500)
4817 INTEGER(8) KEEP8(150)
4818 INTEGER FRERE(NSTEPS),NE(NSTEPS),STEP(N),PROCNODE(NSTEPS)
4820 LOGICAL MUMPS_IN_OR_ROOT_SSARBR
4821 INTEGER i,NCB,NELIM
4822 INTEGER MUMPS_PROCNODE
4823 INTEGER FATHER_NODE,FATHER,WHAT,IERR
4824 EXTERNAL mumps_typenode
4825 INTEGER MUMPS_TYPENODE
4826 LOGICAL :: EXIT_FLAG
4827 IF((.NOT.bdc_m2_mem).AND.(.NOT.bdc_m2_flops))THEN
4828 WRITE(*,*)myid,': Problem in ZMUMPS_UPPER_PREDICT'
4829 CALL mumps_abort()
4830 ENDIF
4831 IF((inode.LT.0).OR.(inode.GT.n)) THEN
4832 RETURN
4833 ENDIF
4834 i=inode
4835 nelim = 0
4836 10 CONTINUE
4837 IF ( i > 0 ) THEN
4838 nelim = nelim + 1
4839 i = fils_load(i)
4840 GOTO 10
4841 ENDIF
4842 ncb=nd_load(step_load(inode))-nelim + keep_load(253)
4843 what=5
4844 father_node=dad_load(step_load(inode))
4845 IF (father_node.EQ.0) THEN
4846 RETURN
4847 ENDIF
4848 IF((frere(step(father_node)).EQ.0).AND.
4849 & ((father_node.EQ.keep(38)).OR.
4850 & (father_node.EQ.keep(20))))THEN
4851 RETURN
4852 ENDIF
4853 IF(mumps_in_or_root_ssarbr(procnode(step(father_node)),
4854 & keep(199))) THEN
4855 RETURN
4856 ENDIF
4857 father=mumps_procnode(procnode(step(father_node)),keep(199))
4858 IF(father.EQ.myid)THEN
4859 IF(bdc_m2_mem)THEN
4860 CALL zmumps_process_niv2_mem_msg(father_node)
4861 ELSEIF(bdc_m2_flops)THEN
4862 CALL zmumps_process_niv2_flops_msg(father_node)
4863 ENDIF
4864 IF((keep(81).EQ.2).OR.(keep(81).EQ.3))THEN
4865 IF(mumps_typenode(procnode_load(step_load(inode)),
4866 & keep(199)).EQ.1)THEN
4867 cb_cost_id(pos_id)=inode
4868 cb_cost_id(pos_id+1)=1
4869 cb_cost_id(pos_id+2)=pos_mem
4870 pos_id=pos_id+3
4871 cb_cost_mem(pos_mem)=int(myid,8)
4872 pos_mem=pos_mem+1
4873 cb_cost_mem(pos_mem)=int(ncb,8)*int(ncb,8)
4874 pos_mem=pos_mem+1
4875 ENDIF
4876 ENDIF
4877 GOTO 666
4878 ENDIF
4879 111 CONTINUE
4880 CALL zmumps_buf_send_fils(what, comm, nprocs,
4881 & father_node,inode,ncb, keep,myid,
4882 & father, ierr)
4883 IF (ierr == -1 ) THEN
4884 CALL zmumps_load_recv_msgs(comm_ld)
4885 CALL mumps_check_comm_nodes(comm_nodes, exit_flag)
4886 IF (exit_flag) THEN
4887 GOTO 666
4888 ELSE
4889 GOTO 111
4890 ENDIF
4891 ELSE IF ( ierr .NE. 0 ) THEN
4892 WRITE(*,*) "Internal Error in ZMUMPS_UPPER_PREDICT",
4893 & ierr
4894 CALL mumps_abort()
4895 ENDIF
4896 666 CONTINUE
4897 RETURN
subroutine, public zmumps_buf_send_fils(what, comm, nprocs, father_node, inode, ncb, keep, myid, remote, ierr)

Variable Documentation

◆ alpha

double precision, save, private zmumps_load::alpha
private

Definition at line 55 of file zmumps_load.F.

55 DOUBLE PRECISION, SAVE, PRIVATE :: ALPHA

◆ bdc_m2_flops

logical, save, private zmumps_load::bdc_m2_flops
private

Definition at line 39 of file zmumps_load.F.

◆ bdc_m2_mem

logical, save, private zmumps_load::bdc_m2_mem
private

Definition at line 39 of file zmumps_load.F.

◆ bdc_md

logical, save, private zmumps_load::bdc_md
private

Definition at line 39 of file zmumps_load.F.

◆ bdc_mem

logical, save, private zmumps_load::bdc_mem
private

Definition at line 39 of file zmumps_load.F.

39 LOGICAL, SAVE, PRIVATE :: BDC_MEM, BDC_POOL, BDC_SBTR,
40 & BDC_POOL_MNG,
41 & BDC_M2_MEM,BDC_M2_FLOPS,BDC_MD,REMOVE_NODE_FLAG,
42 & REMOVE_NODE_FLAG_MEM

◆ bdc_pool

logical, save, private zmumps_load::bdc_pool
private

Definition at line 39 of file zmumps_load.F.

◆ bdc_pool_mng

logical, save, private zmumps_load::bdc_pool_mng
private

Definition at line 39 of file zmumps_load.F.

◆ bdc_sbtr

logical, save, private zmumps_load::bdc_sbtr
private

Definition at line 39 of file zmumps_load.F.

◆ beta

double precision, save, private zmumps_load::beta
private

Definition at line 56 of file zmumps_load.F.

56 DOUBLE PRECISION, SAVE, PRIVATE :: BETA

◆ buf_load_recv

integer, dimension(:), allocatable, save, private zmumps_load::buf_load_recv
private

Definition at line 35 of file zmumps_load.F.

35 INTEGER, DIMENSION(:), ALLOCATABLE, SAVE, PRIVATE :: BUF_LOAD_RECV

◆ cand_load

integer, dimension(:,:), pointer, save, private zmumps_load::cand_load
private

Definition at line 110 of file zmumps_load.F.

110 INTEGER, DIMENSION(:,:),POINTER, SAVE, PRIVATE :: CAND_LOAD

◆ cb_cost_id

integer, dimension(:), allocatable, save, public zmumps_load::cb_cost_id

Definition at line 78 of file zmumps_load.F.

78 INTEGER, DIMENSION(:), ALLOCATABLE, SAVE :: CB_COST_ID

◆ cb_cost_mem

integer(8), dimension(:), allocatable, save, public zmumps_load::cb_cost_mem

Definition at line 79 of file zmumps_load.F.

79 INTEGER(8), DIMENSION(:), ALLOCATABLE, SAVE
80 & :: CB_COST_MEM

◆ check_mem

integer(8), save, private zmumps_load::check_mem
private

Definition at line 51 of file zmumps_load.F.

51 INTEGER(8), SAVE, PRIVATE :: CHECK_MEM

◆ chk_ld

double precision, save, private zmumps_load::chk_ld
private

Definition at line 100 of file zmumps_load.F.

100 DOUBLE PRECISION, SAVE, PRIVATE :: CHK_LD

◆ comm_ld

integer, save, private zmumps_load::comm_ld
private

Definition at line 57 of file zmumps_load.F.

◆ comm_nodes

integer, save, private zmumps_load::comm_nodes
private

Definition at line 58 of file zmumps_load.F.

58 INTEGER, SAVE, PRIVATE :: COMM_NODES

◆ cost_subtree

double precision, save, private zmumps_load::cost_subtree
private

Definition at line 54 of file zmumps_load.F.

54 DOUBLE PRECISION, SAVE, PRIVATE :: COST_SUBTREE

◆ cost_trav

double precision, dimension(:), pointer, save, public zmumps_load::cost_trav

Definition at line 118 of file zmumps_load.F.

118 DOUBLE PRECISION,DIMENSION(:),POINTER, SAVE :: COST_TRAV

◆ current_best

integer, save, public zmumps_load::current_best

Definition at line 124 of file zmumps_load.F.

◆ dad_load

integer, dimension(:), pointer, save, public zmumps_load::dad_load

Definition at line 106 of file zmumps_load.F.

◆ delta_load

double precision, save, private zmumps_load::delta_load
private

Definition at line 48 of file zmumps_load.F.

48 DOUBLE PRECISION, SAVE, PRIVATE :: DELTA_LOAD, DELTA_MEM

◆ delta_mem

double precision, save, private zmumps_load::delta_mem
private

Definition at line 48 of file zmumps_load.F.

◆ depth_first_load

integer, dimension(:), pointer, save, public zmumps_load::depth_first_load

Definition at line 119 of file zmumps_load.F.

119 INTEGER, DIMENSION(:),POINTER, SAVE :: DEPTH_FIRST_LOAD,
120 & DEPTH_FIRST_SEQ_LOAD,SBTR_ID_LOAD

◆ depth_first_seq_load

integer, dimension(:), pointer, save, public zmumps_load::depth_first_seq_load

Definition at line 119 of file zmumps_load.F.

◆ dm_mem

double precision, dimension(:), allocatable, save, private zmumps_load::dm_mem
private

Definition at line 93 of file zmumps_load.F.

93 DOUBLE PRECISION, DIMENSION(:),
94 & ALLOCATABLE, SAVE , PRIVATE:: DM_MEM

◆ dm_sumlu

double precision, save, private zmumps_load::dm_sumlu
private

Definition at line 91 of file zmumps_load.F.

91 DOUBLE PRECISION, SAVE, PRIVATE :: DM_SUMLU,
92 & DM_THRES_MEM

◆ dm_thres_mem

double precision, save, private zmumps_load::dm_thres_mem
private

Definition at line 91 of file zmumps_load.F.

◆ fils_load

integer, dimension(:), pointer, save, public zmumps_load::fils_load

Definition at line 106 of file zmumps_load.F.

106 INTEGER, DIMENSION(:),POINTER, SAVE ::
107 & FILS_LOAD, STEP_LOAD,
108 & FRERE_LOAD, ND_LOAD,
109 & NE_LOAD,DAD_LOAD

◆ frere_load

integer, dimension(:), pointer, save, public zmumps_load::frere_load

Definition at line 106 of file zmumps_load.F.

◆ id_max_m2

integer, save, private zmumps_load::id_max_m2
private

Definition at line 95 of file zmumps_load.F.

◆ idwload

integer, dimension(:), allocatable, target, save, private zmumps_load::idwload
private

Definition at line 52 of file zmumps_load.F.

52 INTEGER, DIMENSION(:), ALLOCATABLE, SAVE, TARGET, PRIVATE ::
53 & IDWLOAD

◆ indice_sbtr

integer, private zmumps_load::indice_sbtr
private

Definition at line 87 of file zmumps_load.F.

87 INTEGER, PRIVATE :: INDICE_SBTR,INDICE_SBTR_ARRAY

◆ indice_sbtr_array

integer, private zmumps_load::indice_sbtr_array
private

Definition at line 87 of file zmumps_load.F.

◆ inside_subtree

integer, save, public zmumps_load::inside_subtree

Definition at line 89 of file zmumps_load.F.

89 INTEGER,SAVE :: INSIDE_SUBTREE

◆ is_mumps_load_enabled

logical, save, private zmumps_load::is_mumps_load_enabled
private

Definition at line 49 of file zmumps_load.F.

49 LOGICAL, SAVE, PRIVATE :: IS_MUMPS_LOAD_ENABLED

◆ k35

integer, save, private zmumps_load::k35
private

Definition at line 37 of file zmumps_load.F.

◆ k50

integer, save, private zmumps_load::k50
private

Definition at line 37 of file zmumps_load.F.

37 INTEGER, SAVE, PRIVATE :: K50, K69, K35

◆ k69

integer, save, private zmumps_load::k69
private

Definition at line 37 of file zmumps_load.F.

◆ keep8_load

integer(8), dimension(:), pointer, save, private zmumps_load::keep8_load
private

Definition at line 105 of file zmumps_load.F.

105 INTEGER(8), DIMENSION(:), POINTER, SAVE, PRIVATE:: KEEP8_LOAD

◆ keep_load

integer, dimension(:), pointer, save, private zmumps_load::keep_load
private

Definition at line 103 of file zmumps_load.F.

103 INTEGER, DIMENSION(:),POINTER, SAVE, PRIVATE :: KEEP_LOAD

◆ lbuf_load_recv

integer, save, private zmumps_load::lbuf_load_recv
private

Definition at line 36 of file zmumps_load.F.

36 INTEGER, SAVE, PRIVATE :: LBUF_LOAD_RECV, LBUF_LOAD_RECV_BYTES

◆ lbuf_load_recv_bytes

integer, save, private zmumps_load::lbuf_load_recv_bytes
private

Definition at line 36 of file zmumps_load.F.

◆ load_flops

double precision, dimension(:), allocatable, save, private zmumps_load::load_flops
private

Definition at line 33 of file zmumps_load.F.

33 DOUBLE PRECISION, DIMENSION(:),
34 & ALLOCATABLE, SAVE, PRIVATE :: LOAD_FLOPS

◆ lu_usage

double precision, dimension(:), allocatable zmumps_load::lu_usage

Definition at line 82 of file zmumps_load.F.

82 DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: LU_USAGE

◆ max_m2

double precision, save, private zmumps_load::max_m2
private

Definition at line 96 of file zmumps_load.F.

96 DOUBLE PRECISION, SAVE, PRIVATE :: MAX_M2,TMP_M2

◆ max_peak_stk

double precision, save, private zmumps_load::max_peak_stk
private

Definition at line 71 of file zmumps_load.F.

71 DOUBLE PRECISION,
72 & PRIVATE, SAVE :: MAX_PEAK_STK

◆ max_surf_master

integer(8), save, private zmumps_load::max_surf_master
private

Definition at line 38 of file zmumps_load.F.

38 INTEGER(8), SAVE, PRIVATE :: MAX_SURF_MASTER

◆ md_mem

integer(8), dimension(:), allocatable, save, private zmumps_load::md_mem
private

Definition at line 83 of file zmumps_load.F.

83 INTEGER(8), DIMENSION(:), ALLOCATABLE, SAVE,
84 & PRIVATE::MD_MEM, TAB_MAXS

◆ mem_subtree

double precision, dimension(:), allocatable, save, public zmumps_load::mem_subtree

Definition at line 85 of file zmumps_load.F.

85 DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE, SAVE ::MEM_SUBTREE

◆ min_diff

double precision, save, private zmumps_load::min_diff
private

Definition at line 75 of file zmumps_load.F.

75 DOUBLE PRECISION, SAVE,
76 & PRIVATE :: MIN_DIFF

◆ my_first_leaf

integer, dimension(:), pointer, save, private zmumps_load::my_first_leaf
private

Definition at line 111 of file zmumps_load.F.

111 INTEGER, DIMENSION(:),POINTER, SAVE,
112 & PRIVATE :: MY_FIRST_LEAF,MY_NB_LEAF, MY_ROOT_SBTR

◆ my_nb_leaf

integer, dimension(:), pointer, save, private zmumps_load::my_nb_leaf
private

Definition at line 111 of file zmumps_load.F.

◆ my_root_sbtr

integer, dimension(:), pointer, save, private zmumps_load::my_root_sbtr
private

Definition at line 111 of file zmumps_load.F.

◆ myid

integer, save, private zmumps_load::myid
private

Definition at line 57 of file zmumps_load.F.

57 INTEGER, SAVE, PRIVATE :: MYID, NPROCS, COMM_LD

◆ n_load

integer, save, private zmumps_load::n_load
private

Definition at line 104 of file zmumps_load.F.

104 INTEGER, SAVE, PRIVATE :: N_LOAD

◆ nb_son

integer, dimension(:), allocatable, save, private zmumps_load::nb_son
private

Definition at line 65 of file zmumps_load.F.

65 INTEGER, DIMENSION(:), ALLOCATABLE,
66 & PRIVATE, SAVE :: NB_SON

◆ nb_subtrees

integer, public zmumps_load::nb_subtrees

Definition at line 86 of file zmumps_load.F.

86 INTEGER :: NB_SUBTREES,NIV1_FLAG

◆ nd_load

integer, dimension(:), pointer, save, public zmumps_load::nd_load

Definition at line 106 of file zmumps_load.F.

◆ ne_load

integer, dimension(:), pointer, save, public zmumps_load::ne_load

Definition at line 106 of file zmumps_load.F.

◆ niv1_flag

integer, public zmumps_load::niv1_flag

Definition at line 86 of file zmumps_load.F.

◆ niv2

double precision, dimension(:), allocatable, save, private zmumps_load::niv2
private

Definition at line 98 of file zmumps_load.F.

◆ nprocs

integer, save, private zmumps_load::nprocs
private

Definition at line 57 of file zmumps_load.F.

◆ peak_sbtr_cur_local

double precision, save, private zmumps_load::peak_sbtr_cur_local
private

Definition at line 69 of file zmumps_load.F.

69 DOUBLE PRECISION,
70 & PRIVATE, SAVE :: PEAK_SBTR_CUR_LOCAL

◆ pool_last_cost_sent

double precision, save, private zmumps_load::pool_last_cost_sent
private

Definition at line 73 of file zmumps_load.F.

73 DOUBLE PRECISION, SAVE,
74 & PRIVATE :: POOL_LAST_COST_SENT

◆ pool_mem

double precision, dimension(:), allocatable, save, private zmumps_load::pool_mem
private

Definition at line 59 of file zmumps_load.F.

59 DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE, SAVE,
60 & PRIVATE :: POOL_MEM

◆ pool_niv2

integer, dimension(:), allocatable, save, private zmumps_load::pool_niv2
private

Definition at line 97 of file zmumps_load.F.

97 INTEGER, DIMENSION(:),ALLOCATABLE,SAVE, PRIVATE:: POOL_NIV2

◆ pool_niv2_cost

double precision, dimension(:), allocatable, save, private zmumps_load::pool_niv2_cost
private

Definition at line 98 of file zmumps_load.F.

98 DOUBLE PRECISION, DIMENSION(:),ALLOCATABLE,SAVE,
99 & PRIVATE :: POOL_NIV2_COST, NIV2

◆ pool_niv2_size

integer zmumps_load::pool_niv2_size

Definition at line 88 of file zmumps_load.F.

88 INTEGER :: POOL_NIV2_SIZE

◆ pool_size

integer, save, private zmumps_load::pool_size
private

Definition at line 95 of file zmumps_load.F.

95 INTEGER, SAVE, PRIVATE :: POOL_SIZE,ID_MAX_M2

◆ pos_id

integer, save, public zmumps_load::pos_id

Definition at line 77 of file zmumps_load.F.

77 INTEGER, SAVE :: POS_ID,POS_MEM

◆ pos_mem

integer, save, public zmumps_load::pos_mem

Definition at line 77 of file zmumps_load.F.

◆ procnode_load

integer, dimension(:), pointer, save, private zmumps_load::procnode_load
private

Definition at line 101 of file zmumps_load.F.

101 INTEGER, DIMENSION(:),POINTER, SAVE, PRIVATE ::
102 & PROCNODE_LOAD, STEP_TO_NIV2_LOAD

◆ remove_node_cost

double precision, save, private zmumps_load::remove_node_cost
private

Definition at line 43 of file zmumps_load.F.

43 DOUBLE PRECISION, SAVE, PRIVATE :: REMOVE_NODE_COST,
44 & REMOVE_NODE_COST_MEM

◆ remove_node_cost_mem

double precision, save, private zmumps_load::remove_node_cost_mem
private

Definition at line 43 of file zmumps_load.F.

◆ remove_node_flag

logical, save, private zmumps_load::remove_node_flag
private

Definition at line 39 of file zmumps_load.F.

◆ remove_node_flag_mem

logical, save, private zmumps_load::remove_node_flag_mem
private

Definition at line 39 of file zmumps_load.F.

◆ root_current_subtree

integer, save, public zmumps_load::root_current_subtree

Definition at line 124 of file zmumps_load.F.

124 INTEGER, SAVE :: ROOT_CURRENT_SUBTREE,CURRENT_BEST,
125 & SECOND_CURRENT_BEST

◆ sbtr_cur

double precision, dimension(:), allocatable, save, private zmumps_load::sbtr_cur
private

Definition at line 63 of file zmumps_load.F.

63 DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE,
64 & PRIVATE, SAVE :: SBTR_CUR

◆ sbtr_cur_array

double precision, dimension(:), allocatable, save, private zmumps_load::sbtr_cur_array
private

Definition at line 115 of file zmumps_load.F.

◆ sbtr_cur_local

double precision, save, private zmumps_load::sbtr_cur_local
private

Definition at line 67 of file zmumps_load.F.

67 DOUBLE PRECISION,
68 & PRIVATE, SAVE :: SBTR_CUR_LOCAL

◆ sbtr_first_pos_in_pool

integer, dimension(:), allocatable, save, private zmumps_load::sbtr_first_pos_in_pool
private

Definition at line 113 of file zmumps_load.F.

113 INTEGER, DIMENSION(:),ALLOCATABLE,SAVE,
114 & PRIVATE ::SBTR_FIRST_POS_IN_POOL

◆ sbtr_id_load

integer, dimension(:), pointer, save, public zmumps_load::sbtr_id_load

Definition at line 119 of file zmumps_load.F.

◆ sbtr_mem

double precision, dimension(:), allocatable, save, private zmumps_load::sbtr_mem
private

Definition at line 61 of file zmumps_load.F.

61 DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE, PRIVATE,
62 & SAVE :: SBTR_MEM

◆ sbtr_peak_array

double precision, dimension(:), allocatable, save, private zmumps_load::sbtr_peak_array
private

Definition at line 115 of file zmumps_load.F.

115 DOUBLE PRECISION, DIMENSION(:),ALLOCATABLE,SAVE,
116 & PRIVATE ::SBTR_PEAK_ARRAY,
117 & SBTR_CUR_ARRAY

◆ sbtr_which_m

integer, save, private zmumps_load::sbtr_which_m
private

Definition at line 45 of file zmumps_load.F.

45 INTEGER, SAVE, PRIVATE :: SBTR_WHICH_M

◆ second_current_best

integer, save, public zmumps_load::second_current_best

Definition at line 124 of file zmumps_load.F.

◆ step_load

integer, dimension(:), pointer, save, public zmumps_load::step_load

Definition at line 106 of file zmumps_load.F.

◆ step_to_niv2_load

integer, dimension(:), pointer, save, private zmumps_load::step_to_niv2_load
private

Definition at line 101 of file zmumps_load.F.

◆ tab_maxs

integer(8), dimension(:), allocatable, save, private zmumps_load::tab_maxs
private

Definition at line 83 of file zmumps_load.F.

◆ tmp_m2

double precision, save, private zmumps_load::tmp_m2
private

Definition at line 96 of file zmumps_load.F.

◆ wload

double precision, dimension(:), allocatable, target, save, private zmumps_load::wload
private

Definition at line 46 of file zmumps_load.F.

46 DOUBLE PRECISION, DIMENSION(:),
47 & ALLOCATABLE, TARGET, SAVE, PRIVATE :: WLOAD