15 & MSGLEN, BUFR, LBUFR,
16 & LBUFR_BYTES, PROCNODE_STEPS,
17 & SLAVEF, IWPOS, IWPOSCB, IPTRLU, LRLU, LRLUS, POSFAC,
18 & N, IW, LIW, A, LA, PTRIST, PTLUST, PTRFAC, PTRAST,
19 & STEP, PIMASTER, PAMASTER, PERM,
20 & COMP, root, OPASSW, OPELIW, ITLOC, RHS_MUMPS, NSTK_S,
21 & FILS, DAD, PTRARW, PTRAIW, INTARR, DBLARR, NBFIN,
22 & MYID, COMM, ICNTL, KEEP,KEEP8,DKEEP, IFLAG, IERROR,
23 & IPOOL, LPOOL, LEAF, ND, FRERE_STEPS, LPTRAR, NELT,
25 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
37 TYPE (DMUMPS_ROOT_STRUC) :: root
38 INTEGER ICNTL( 60 ), KEEP(
40 DOUBLE PRECISION DKEEP(230)
41 INTEGER LBUFR, LBUFR_BYTES
42 INTEGER COMM_LOAD, ASS_IRECV, MSGLEN
44 INTEGER(8) :: LRLU, IPTRLU, LRLUS, LA, POSFAC
45 INTEGER N, SLAVEF, IWPOS, IWPOSCB, LIW
49 INTEGER PROCNODE_STEPS( KEEP(28) ), PTRIST(KEEP(28))
50 INTEGER(8) :: PTRAST(KEEP(28)), PAMASTER(KEEP(28))
51 INTEGER(8) :: PTRFAC(KEEP(28))
52 INTEGER STEP(N), PIMASTER(KEEP(28))
53 INTEGER PTLUST( KEEP(28) )
56 DOUBLE PRECISION A( LA )
57 INTEGER,
intent(in) :: LRGROUPS(N)
58 INTEGER ITLOC( N + KEEP(253)), NSTK_S( KEEP(28) )
59 INTEGER :: FILS( N ), DAD(KEEP(28))
60 DOUBLE PRECISION :: RHS_MUMPS(KEEP(255))
61 INTEGER ND(KEEP(28)), FRERE_STEPS( KEEP(28) )
62 INTEGER(8),
INTENT(IN) :: PTRARW( LPTRAR ), PTRAIW( LPTRAR )
63 INTEGER INTARR( KEEP8(27) )
64 DOUBLE PRECISION DBLARR( KEEP8(26) )
65 DOUBLE PRECISION OPASSW, OPELIW
66 INTEGER COMM, MYID, IFLAG, IERROR
68 INTEGER IPOOL( LPOOL )
69 INTEGER FRTPTR(N+1), FRTELT( NELT )
70 INTEGER ISTEP_TO_INIV2(KEEP(71)),
71 & tab_pos_in_pere(slavef+2,
max(1,keep(56)))
74 include
'mumps_tags.h'
75 INTEGER MUMPS_PROCNODE, MUMPS_TYPESPLIT
76 EXTERNAL mumps_procnode, mumps_typesplit
78 INTEGER NBROWS_ALREADY_SENT, NBROWS_PACKET
79 INTEGER I, INODE, ISON, POSITION, NBROW, LROW, IROW, INDCOL
81 INTEGER(8) :: LREQA, POSCONTRIB
88 INTEGER ISHIFT_BUFR, LBUFR_LOC,
91 INTEGER :: INBPROCFILS_SON
93 INTEGER :: CB_IS_LR_INT, NB_BLR_COLS, allocok,
94 & nbrows_packet_2pack, panel_beg_offset
96 DOUBLE PRECISION,
ALLOCATABLE :: A_TEMP(:)
97 TYPE (LRB_TYPE),
POINTER :: LRB
98 TYPE (LRB_TYPE),
ALLOCATABLE,
TARGET :: BLR_CB(:)
99 INTEGER(8) :: IACHK, SIZFR8, DYN_SIZE
100 DOUBLE PRECISION,
DIMENSION(:),
POINTER :: DYNPTR
101 INTEGER :: NSLAVES, NFRONT, NASS1, IOLDPS, PARPIV_T1
102 INTEGER :: NB_POSTPONED
103 LOGICAL :: LR_ACTIVATED
105 INTEGER :: XXG_STATUS
106 include
'mumps_headers.h'
108 CALL mpi_unpack( bufr, lbufr_bytes, position, inode, 1,
109 & mpi_integer, comm, ierr )
110 CALL mpi_unpack( bufr, lbufr_bytes, position, ison, 1,
111 & mpi_integer, comm, ierr )
112 CALL mpi_unpack( bufr, lbufr_bytes, position, nbrow, 1,
113 & mpi_integer, comm, ierr )
114 CALL mpi_unpack( bufr, lbufr_bytes, position, lrow, 1,
115 & mpi_integer, comm, ierr )
117 & nbrows_already_sent, 1,
118 & mpi_integer, comm, ierr )
121 & mpi_integer, comm, ierr )
124 & mpi_integer, comm, ierr )
125 cb_is_lr = (cb_is_lr_int.EQ.1)
126 master = mumps_procnode( procnode_steps(step(inode)),
128 slave_node = master .NE. myid
129 typesplit = mumps_typesplit( procnode_steps(step(inode)),
131 is_oftype5or6 = ((typesplit.EQ.5).OR.(typesplit.EQ.6))
132 IF (slave_node .AND. ptrist(step(inode)) ==0)
THEN
133 ishift_bufr = ( msglen + keep(34) ) / keep(34)
134 lbufr_loc = lbufr - ishift_bufr + 1
135 lbufr_bytes_loc = lbufr_loc * keep(34)
137 & bufr(ishift_bufr), lbufr_loc, lbufr_bytes_loc,
138 & procnode_steps, posfac,
139 & iwpos, iwposcb, iptrlu,
140 & lrlu, lrlus, n, iw, liw, a, la,
141 & ptrist, ptlust, ptrfac,
142 & ptrast, step, pimaster, pamaster, nstk_s, comp,
143 & iflag, ierror, comm,
144 & perm, ipool, lpool, leaf,
145 & nbfin, myid, slavef,
147 & root, opassw, opeliw, itloc, rhs_mumps, fils, dad,
149 & intarr, dblarr, icntl,keep,keep8,dkeep,nd, frere_steps,
150 & lptrar, nelt, frtptr, frtelt,
151 & istep_to_iniv2, tab_pos_in_pere, .true.
154 IF (iflag.LT.0)
RETURN
156 IF ( slave_node )
THEN
157 lreqi = lrow + nbrows_packet
159 lreqi = nbrows_packet
163 & lreqi, lreqa, .false.,
167 & iwpos, iwposcb, ptrist, ptrast,
168 & step, pimaster, pamaster, lrlus,
169 & keep(ixsz), comp, dkeep(97),
170 & myid, slavef, procnode_steps, dad,
177 lrlus = lrlus - lreqa
179 posfac = posfac + lreqa
180 keep8(67) =
min(lrlus, keep8(67))
181 keep8(69) = keep8(69) + lreqa
182 keep8(68) =
max(keep8(69), keep8(68))
184 & la-lrlus,0_8,lreqa,keep,keep8,lrlus)
185 IF ( slave_node )
THEN
187 indcol = iwpos + nbrows_packet
192 iwpos = iwpos + lreqi
193 IF ( slave_node )
THEN
195 & iw( indcol ), lrow, mpi_integer,
198 DO i = 1, nbrows_packet
200 & iw( irow + i - 1 ), 1, mpi_integer,
203 IF ( slave_node )
THEN
204 IF ( nbrows_already_sent + nbrows_packet == nbrow )
THEN
205 iw(ptrist(step(inode))+xxnbpr) =
206 & iw(ptrist(step(inode))+xxnbpr) - nbrow
208 IF ( keep(55) .eq. 0 )
THEN
210 & (n, inode, iw, liw, a, la,
212 & opassw, opeliw, step, ptrist, ptrast,
214 & fils, ptrarw, ptraiw, intarr, dblarr, icntl,
215 & keep,keep8, myid, lrgroups )
218 & nelt, frtptr, frtelt,
219 & n, inode, iw, liw, a, la,
221 & opassw, opeliw, step, ptrist, ptrast,
223 & fils, ptrarw, ptraiw, intarr, dblarr, icntl,
224 & keep,keep8, myid, lrgroups )
229 & mpi_integer, comm, ierr )
231 & panel_beg_offset, 1,
232 & mpi_integer, comm, ierr )
233 allocate(blr_cb(nb_blr_cols),stat=allocok)
234 IF (allocok.GT.0)
THEN
243 & lbufr_bytes, position, lrb, keep8,
244 & comm, iflag, ierror
247 nbrows_packet_2pack =
max(nbrows_packet,blr_cb(1)%M)
248 la_temp = nbrows_packet_2pack*lrow
250 & .false., keep8, iflag, ierror, .true., .true.)
251 allocate(a_temp(la_temp),stat=allocok)
252 IF (allocok.GT.0)
THEN
262 & lrow, lrow, .true., 1, 1,
263 & nb_blr_cols, blr_cb, 0,
'V', 3,
264 & cbasm_tofix_in=.true.,
265 & only_nelim_in=nbrows_packet_2pack-panel_beg_offset)
270 IF (keep(50).EQ.0)
THEN
280 & 1, row_length, iw( irow+i-1 ),iw(indcol),
281 & a_temp(1+(i-1+panel_beg_offset)*lrow),
282 & opassw, opeliw, step, ptrist, ptrast,
284 & fils, icntl, keep,keep8, myid, is_oftype5or6,
289 deallocate(a_temp, blr_cb)
291 & .false., keep8, iflag, ierror
295 IF(keep(50).NE.0)
THEN
307 & mpi_double_precision
310 & 1, row_length, iw( irow+i-1 ),iw(indcol),
312 & opassw, opeliw, step, ptrist, ptrast,
314 & fils, icntl, keep,keep8, myid, is_oftype5or6,
319 & (n, inode, iw, liw,
320 & nbrows_packet, step, ptrist,
321 & itloc, rhs_mumps,keep
326 & mpi_integer, comm, ierr )
328 & panel_beg_offset, 1,
329 & mpi_integer, comm, ierr )
330 allocate(blr_cb(nb_blr_cols),stat=allocok)
331 IF (allocok.GT.0)
THEN
340 & lbufr_bytes, position, lrb, keep8,
341 & comm, iflag, ierror
344 nbrows_packet_2pack =
max(nbrows_packet,blr_cb(1)%M)
345 la_temp = nbrows_packet_2pack*lrow
347 & .false., keep8, iflag, ierror, .true., .true.)
348 allocate(a_temp(la_temp),stat=allocok)
349 IF (allocok.GT.0)
THEN
359 & lrow, lrow, .true., 1, 1,
360 & nb_blr_cols, blr_cb, 0,
'V', 4,
361 & cbasm_tofix_in=.true.,
362 & only_nelim_in=nbrows_packet_2pack-panel_beg_offset)
367 IF(keep(50).NE.0)
THEN
377 & ison, 1, row_length, iw( irow+i-1 ),
378 & a_temp(1+(i-1+panel_beg_offset)*lrow),
380 & step, pimaster, opassw,
381 & iwposcb, myid, keep,keep8,
382 & is_oftype5or6, lrow
387 deallocate(a_temp, blr_cb)
389 & .false., keep8, iflag, ierror, .true., .true.)
393 IF(keep(50).NE.0)
THEN
405 & mpi_double_precision,
408 & ison, 1, row_length, iw( irow +i-1 ),
409 & a(poscontrib), ptlust, ptrast,
410 & step, pimaster, opassw,
411 & iwposcb, myid, keep,keep8,
412 & is_oftype5or6, row_length
416 IF (nbrows_already_sent .EQ. 0)
THEN
417 IF (keep(219).NE.0)
THEN
418 IF(keep(50) .EQ. 2)
THEN
424 IF(nfs4father .GT. 0)
THEN
426 IF (ierr .NE. 0)
THEN
435 & mpi_double_precision,
440 & step, pimaster, opassw,
441 & iwposcb, myid, keep,keep8)
446 IF (nbrows_already_sent + nbrows_packet == nbrow )
THEN
448 istchk = pimaster(step(ison))
449 same_proc = istchk .LT. iwposcb
450 iw(ptlust(step(inode))+xxnbpr) =
451 & iw(ptlust(step(inode))+xxnbpr) - decr
453 inbprocfils_son = ptrist(step(ison))+xxnbpr
455 inbprocfils_son = pimaster(step(ison))+xxnbpr
457 iw(inbprocfils_son) = iw(inbprocfils_son) - decr
458 IF ( iw(inbprocfils_son) .EQ. 0 )
THEN
461 & pimaster, ptlust, iw, liw, step, keep,keep8)
464 istchk = ptrist(step(ison))
465 ptrist(step( ison) ) = -99999999
467 pimaster(step( ison )) = -99999999
470 & pamaster(step(ison)), iw(istchk+xxd),
471 & iw(istchk+xxr), dynptr, iachk, sizfr8)
473 xxg_status = iw(istchk+xxg)
475 & .false., myid, n, istchk,
476 & iw, liw, lrlu, lrlus, iptrlu, iwposcb,
477 & la, keep,keep8, .false.
479 IF ( dyn_size .GT. 0_8 )
THEN
482 & keep(405).EQ.1, keep8 )
485 IF (iw(ptlust(step(inode))+xxnbpr) .EQ. 0)
THEN
486 ioldps = ptlust(step(inode))
487 nslaves= iw(ioldps+5+keep(ixsz))
488 IF (nslaves.EQ.0)
THEN
489 nfront = iw(ioldps+keep(ixsz))
490 nass1 = iabs(iw(ioldps + 2+keep(ixsz)))
491 poselt = ptrast(step(inode))
493 lr_activated = (iw(ioldps+xxlr).GT.0)
494 nb_postponed =
max(nfront - nd(step(inode)),0)
496 & n, inode, iw, liw, a, la, keep, perm,
498 & nfront, nass1, lr_activated, parpiv_t1,
503 & slavef, keep(199), keep(28), keep(76), keep(80),
504 & keep(47), step, inode+n )
505 IF (keep(47) .GE. 3)
THEN
508 & procnode_steps, keep,keep8, slavef, comm_load,
509 & myid, step, n, nd, fils )
514 iwpos = iwpos - lreqi
516 lrlus = lrlus + lreqa
517 keep8(69) = keep8(69) - lreqa
518 posfac = posfac - lreqa
520 & la-lrlus,0_8,-lreqa,keep,keep8,lrlus)