203
205 IMPLICIT NONE
206 INTEGER :: N, COMM, NBRECORDS
207 INTEGER(8), INTENT(IN) :: NZ
208 INTEGER KEEP( 500 )
209 INTEGER(8) KEEP8(150)
210 REAL (NZ)
211 REAL COLSCA(*), ROWSCA(*)
212 INTEGER IRN(NZ), ICN(NZ)
213 INTEGER PERM(N), PROCNODE_STEPS(KEEP(28))
214 INTEGER RG2L( ), FILS( N )
215 INTEGER ISTEP_TO_INIV2(KEEP(71))
216 LOGICAL I_AM_CAND(max(1,KEEP(56)))
217 INTEGER LP, SLAVEF, MYID
218 INTEGER CANDIDATES(SLAVEF+1, max(1,KEEP(56)))
219 LOGICAL LSCAL
220 TYPE (SMUMPS_ROOT_STRUC) :: root
221 INTEGER(8), INTENT(IN) :: LA
222 INTEGER(8), INTENT(INOUT) :: PTRAIW( N ), PTRARW( N )
223 INTEGER :: FRERE_STEPS( KEEP(28) )
224 INTEGER :: STEP(N)
225 INTEGER(8) :: LINTARR, LDBLARR
226 INTEGER :: ( LINTARR )
227 REAL :: DBLARR( LDBLARR )
228 REAL :: A( LA )
229 INTEGER, DIMENSION(:,:), ALLOCATABLE :: BUFI
230 REAL, DIMENSION(:,:), ALLOCATABLE :: BUFR
231 INTEGER MUMPS_PROCNODE, MUMPS_TYPENODE, numroc,
232 & MUMPS_TYPESPLIT
235 REAL VAL, VAL_SHR
236 INTEGER IOLD,JOLD,ISEND,JSEND,DEST,I,IARR
237 INTEGER ISEND_SHR, JSEND_SHR, DEST_SHR
238 INTEGER IPOSROOT, JPOSROOT
239 INTEGER IROW_GRID, JCOL_GRID
240 INTEGER INODE, ISTEP
241 INTEGER NBUFS
242 INTEGER ARROW_ROOT, TAILLE
243 INTEGER LOCAL_M, LOCAL_N
244 INTEGER(8) :: PTR_ROOT
245 INTEGER TYPE_NODE, MASTER_NODE
246 LOGICAL I_AM_CAND_LOC, I_AM_SLAVE
247 INTEGER JARR, ILOCROOT, JLOCROOT
248 INTEGER allocok, INIV2, TYPESPLIT, T4MASTER
249 INTEGER(8) :: I1, IA, IS1, IAS, ISHIFT, K
250 INTEGER NCAND
251 LOGICAL T4_MASTER_CONCERNED, EARLYT3ROOTINS
252 REAL ZERO
253 parameter( zero = 0.0e0 )
254 INTEGER, ALLOCATABLE, DIMENSION(:,:) :: IW4
255 LOGICAL :: DOIT, OMP_FLAG, OMP_FLAG_P
256 INTEGER NOMP, NOMP_P, IOMP, P2
257 arrow_root = 0
258 earlyt3rootins = keep(200) .EQ. 0
259 & .OR. (keep(200) .LT. 0 .AND. keep(400) .EQ. 0)
260 i_am_slave=(myid.NE.0.OR.keep(46).EQ.1)
261 IF ( keep(46) .eq. 0 ) THEN
262 nbufs = slavef
263 ELSE
264 nbufs = slavef - 1
265 ALLOCATE( iw4( n, 2 ), stat = allocok )
266 IF ( allocok .GT. 0 ) THEN
267 WRITE(*,*) 'Error allocating IW4'
269 END IF
270#if defined(__ve__)
271
272#endif
273 DO i = 1, n
274 i1 = ptraiw( i )
275 ia = ptrarw( i )
276 IF ( ia .GT. 0 ) THEN
277 dblarr( ia ) = zero
278 iw4( i, 1 ) = intarr( i1 )
279 iw4( i, 2 ) = -intarr( i1 + 1 )
280 intarr( i1 + 2 ) = i
281 END IF
282 END DO
283 IF ( keep(38) .NE. 0 .AND. earlyt3rootins ) THEN
285 & ptr_root, la)
287 ELSE
288 local_m = -19999; local_n = -29999; ptr_root = -99999_8
289 END IF
290 END IF
291 IF (nbufs.GT.0) THEN
292 ALLOCATE( bufi(nbrecords*2+1,nbufs),stat=allocok )
293 IF ( allocok .GT. 0 ) THEN
294 WRITE(*,*) 'Error allocating BUFI'
296 END IF
297 ALLOCATE( bufr( nbrecords, nbufs ), stat=allocok )
298 IF ( allocok .GT. 0 ) THEN
299 WRITE(*,*) 'Error allocating BUFR'
301 END IF
302 DO i = 1, nbufs
303 bufi( 1, i ) = 0
304 ENDDO
305 ENDIF
306 inode = keep(38)
307 i = 1
308 DO WHILE ( inode .GT. 0 )
309 rg2l( inode ) = i
310 inode = fils( inode )
311 i = i + 1
312 END DO
313 nomp = 1
314
315 omp_flag = keep(399).EQ.1 .AND. nomp.GE.2 .AND. slavef.EQ.1
316 & .AND. keep(46) .EQ. 1
317
318
319
320
321
322
323
324
325
326 iomp=0
327
328 nomp_p=1
329
330 omp_flag_p = .false.
331
332 IF (omp_flag_p) THEN
333 IF ( nomp_p .GE. 16 ) THEN
334 nomp_p=16
335 p2 = 4
336 ELSE IF (nomp_p.GE.8) THEN
337 nomp_p=8
338 p2 = 3
339 ELSE IF (nomp_p.GE.4) THEN
340 nomp_p=4
341 p2 = 2
342 ELSE IF (nomp_p.GE.2) THEN
343 nomp_p=2
344 p2 = 1
345 ENDIF
346 ELSE
347 nomp_p = 1
348 p2 = 0
349 ENDIF
350 IF ( iomp .LT. nomp_p ) THEN
351 DO k=1, nz
352 iold = irn(k)
353 jold = icn(k)
354 IF ( (iold.GT.n).OR.(jold.GT.n).OR.(iold.LT.1)
355 & .OR.(jold.LT.1) ) THEN
356 cycle
357 END IF
358 IF (omp_flag_p) THEN
359 IF (iold.EQ.jold) THEN
360 iarr = iold
361 ELSE IF (perm(iold).LT.perm(jold)) THEN
362 iarr = iold
363 ELSE
364 iarr = jold
365 ENDIF
366 doit = ( iomp .EQ. ibits(iarr, p2-1, p2))
367 ELSE
368 doit = .true.
369 ENDIF
370 IF (doit) THEN
371 IF (iold.EQ.jold) THEN
372 isend = iold
373 jsend = jold
374 iarr = iold
375 ELSE IF (perm(iold).LT.perm(jold)) THEN
376 iarr = iold
377 IF ( keep(50) .NE. 0 ) THEN
378 isend = -iold
379 ELSE
380 isend = iold
381 ENDIF
382 jsend = jold
383 ELSE
384 iarr = jold
385 isend = -jold
386 jsend = iold
387 ENDIF
388 istep = abs( step(iarr) )
390 & procnode_steps(istep), keep(199) )
391 i_am_cand_loc = .false.
392 t4_master_concerned = .false.
393 t4master = -9999
394 IF ( type_node .EQ. 1 ) THEN
395 IF ( keep(46) .eq. 0 ) THEN
396 dest = master_node + 1
397 ELSE
398 dest = master_node
399 END IF
400 ELSE IF ( type_node .EQ. 2 ) THEN
401 IF ( isend .LT. 0 ) THEN
402 dest = -1
403 ELSE
404 IF ( keep( 46 ) .eq. 0 ) THEN
405 dest = master_node + 1
406 ELSE
407 dest = master_node
408 END IF
409 END IF
410 iniv2 = istep_to_iniv2(istep)
411 IF (i_am_slave) i_am_cand_loc = i_am_cand(iniv2)
412 IF ( keep(79) .GT. 0) THEN
414 & keep(199) )
415 IF ( (typesplit.EQ.5).OR.(typesplit.EQ.6)) THEN
416 t4_master_concerned = .true.
417 t4master=candidates(candidates(slavef+1,iniv2)+1,iniv2)
418 IF ( keep(46) .eq. 0 ) THEN
419 t4master=t4master+1
420 ENDIF
421 ENDIF
422 ENDIF
423 ELSE
424 arrow_root = arrow_root + 1
425 IF (earlyt3rootins) THEN
426 IF ( isend .LT. 0 ) THEN
427 iposroot = rg2l(jsend)
428 jposroot = rg2l(iarr)
429 ELSE
430 iposroot = rg2l( iarr )
431 jposroot = rg2l( jsend )
432 END IF
433 irow_grid = mod( ( iposroot-1 )/root%MBLOCK, root%NPROW )
434 jcol_grid = mod( ( jposroot-1 )/root%NBLOCK, root%NPCOL )
435 IF ( keep( 46 ) .eq. 0 ) THEN
436 dest = irow_grid * root%NPCOL + jcol_grid + 1
437 ELSE
438 dest = irow_grid * root%NPCOL + jcol_grid
439 END IF
440 ELSE
441 dest = -2
442 ENDIF
443 END IF
444 IF (lscal) THEN
445 val = aspk(k)*rowsca(iold)*colsca(jold)
446 ELSE
447 val = aspk(k)
448 ENDIF
449 IF ( dest .eq. 0
450 & .or.
451 & ( dest .eq. -1 .and. keep( 46 ) .eq. 1 .AND.
452 & ( i_am_cand_loc .OR. master_node .EQ. 0 ) )
453 & .or.
454 & ( t4master.EQ.0 )
455 & .or.
456 & ( dest .EQ. -2 .AND. keep( 46 ) .EQ. 1 )
457 & ) THEN
458 iarr = isend
459 jarr = jsend
460 IF ( type_node .eq. 3 .AND. earlyt3rootins ) THEN
461 IF ( irow_grid .EQ. root%MYROW .AND.
462 & jcol_grid .EQ. root%MYCOL ) THEN
463 ilocroot = root%MBLOCK * ( ( iposroot - 1 ) /
464 & ( root%MBLOCK * root%NPROW ) )
465 & + mod( iposroot - 1, root%MBLOCK ) + 1
466 jlocroot = root%NBLOCK * ( ( jposroot - 1 ) /
467 & ( root%NBLOCK * root%NPCOL ) )
468 & + mod( jposroot - 1, root%NBLOCK ) + 1
469 IF (keep(60)==0) THEN
470 a( ptr_root
471 & + int(jlocroot - 1,8) * int(local_m,8)
472 & + int(ilocroot - 1,8) )
473 & = a( ptr_root
474 & + int(jlocroot - 1,8) * int(local_m,8)
475 & + int(ilocroot - 1,8) )
476 & + val
477 ELSE
478 root%SCHUR_POINTER( int(jlocroot - 1,8)
479 & * int(root%SCHUR_LLD,8)
480 & + int(ilocroot,8) )
481 & = root%SCHUR_POINTER( int(jlocroot - 1,8)
482 & * int(root%SCHUR_LLD,8)
483 & + int(ilocroot,8))
484 & + val
485 ENDIF
486 ELSE
487 WRITE(*,*) myid,':INTERNAL Error: root arrowhead '
488 WRITE(*,*) myid,':is not belonging to me. IARR,JARR='
489 & ,iarr,jarr
491 END IF
492 ELSE IF ( iarr .GE. 0 ) THEN
493 IF ( iarr .eq. jarr ) THEN
494 ia = ptrarw( iarr )
495 dblarr( ia ) = dblarr( ia ) + val
496 ELSE
497 is1 = ptraiw(iarr)
498 ishift = int(intarr(is1) + iw4(iarr,2),8)
499 iw4(iarr,2) = iw4(iarr,2) - 1
500 intarr(is1 + ishift + 2_8) = jarr
501 dblarr(ptrarw(iarr)+ishift) = val
502 END IF
503 ELSE
504 iarr = -iarr
505 ishift = int(ptraiw(iarr)+iw4(iarr,1)+2,8)
506 intarr(ishift) = jarr
507 ias = ptrarw(iarr)+int(iw4(iarr,1),8)
508 iw4(iarr,1) = iw4(iarr,1) - 1
509 dblarr(ias) = val
510 IF ( iw4(iarr,1) .EQ. 0 .AND.
511 & step( iarr) > 0 ) THEN
512 IF ( master_node == myid) THEN
513 taille = intarr( ptraiw(iarr) )
515 & intarr( ptraiw(iarr) + 3 ),
516 & dblarr( ptrarw(iarr) + 1 ),
517 & taille, 1, taille )
518 END IF
519 END IF
520 END IF
521 END IF
522 IF ( dest.EQ. -1 ) THEN
523 iniv2 = istep_to_iniv2(istep)
524 ncand = candidates(slavef+1,iniv2)
525 IF (keep(79).GT.0) THEN
526 DO i=1, slavef
527 dest=candidates(i,iniv2)
528 IF (keep(46).EQ.0.AND.(dest.GE.0)) dest=dest+1
529 IF (dest.LT.0) EXIT
530 IF (i.EQ.ncand+1) cycle
531 IF (dest.NE.0) THEN
532 isend_shr=isend; jsend_shr=jsend
533 val_shr=val; dest_shr=dest
535 ENDIF
536 ENDDO
537 ELSE
538 DO i=1, ncand
539 dest=candidates(i,iniv2)
540 IF (keep(46).EQ.0) dest=dest+1
541 IF (dest.NE.0) THEN
542 isend_shr=isend; jsend_shr=jsend
543 val_shr=val; dest_shr=dest
545 ENDIF
546 ENDDO
547 ENDIF
548 dest = master_node
549 IF (keep(46).EQ.0) dest=dest+1
550 IF ( dest .NE. 0 ) THEN
551 isend_shr=isend; jsend_shr=jsend
552 val_shr=val; dest_shr=dest
554 ENDIF
555 IF ((t4_master_concerned).AND.(t4master.GT.0)) THEN
556 isend_shr=isend; jsend_shr=jsend
557 val_shr=val; dest_shr=t4master
559 ENDIF
560 ELSE IF ( dest .GT. 0 ) THEN
561 isend_shr=isend; jsend_shr=jsend
562 val_shr=val; dest_shr=dest
564 IF ( t4master.GT.0 ) THEN
565 isend_shr=isend; jsend_shr=jsend
566 val_shr=val; dest_shr=t4master
568 ENDIF
569 ELSE IF ( t4master.GT.0 ) THEN
570 isend_shr=isend; jsend_shr=jsend
571 val_shr=val; dest_shr=t4master
573 ELSE IF ( dest .EQ. -2 ) THEN
574 DO i = 0, slavef-1
575 dest = i
576 IF (keep(46) .EQ. 0) dest = dest + 1
577 IF (dest .NE. 0) THEN
578 isend_shr=isend; jsend_shr=jsend
579 val_shr=val; dest_shr=dest
581 ENDIF
582 ENDDO
583 ENDIF
584 ENDIF
585 ENDDO
586 ENDIF
587
588 keep(49) = arrow_root
589 IF (nbufs.GT.0) THEN
591 & bufi, bufr, nbrecords, nbufs,
592 & lp, comm, keep( 46 ) )
593 ENDIF
594 IF ( keep( 46 ) .NE. 0 ) DEALLOCATE( iw4 )
595 IF (nbufs.GT.0) THEN
596 DEALLOCATE( bufi )
597 DEALLOCATE( bufr )
598 ENDIF
599 RETURN
600 CONTAINS
602 IMPLICIT NONE
603 include 'mpif.h'
604 include 'mumps_tags.h'
605 INTEGER IERR
606 INTEGER TAILLE_SENDI, TAILLE_SENDR, IREQ
607 IF (bufi(1,dest_shr)+1.GT.nbrecords) THEN
608 taille_sendi = bufi(1,dest_shr) * 2 + 1
609 taille_sendr = bufi(1,dest_shr)
610 CALL mpi_send(bufi(1,dest_shr),taille_sendi,
611 & mpi_integer,
612 & dest_shr, arrowhead, comm, ierr )
613 CALL mpi_send( bufr(1,dest_shr), taille_sendr,
614 & mpi_real, dest_shr,
615 & arrowhead, comm, ierr )
616 bufi(1,dest_shr) = 0
617 ENDIF
618 ireq = bufi(1,dest_shr) + 1
619 bufi(1,dest_shr) = ireq
620 bufi( ireq * 2, dest_shr ) = isend_shr
621 bufi( ireq * 2 + 1, dest_shr ) = jsend_shr
622 bufr( ireq, dest_shr ) = val_shr
623 RETURN
subroutine smumps_arrow_finish_send_buf(bufi, bufr, nbrecords, nbufs, lp, comm, type_parall)
subroutine smumps_arrow_fill_send_buf()