406
407
408
410 USE intbufdef_mod
411 USE int8_mod
412
413
414
415#include "implicit_f.inc"
416
417
418
419#include "param_c.inc"
420
421
422
423#include "com01_c.inc"
424#include "com04_c.inc"
425
426
427
428 INTEGER IPARI(NPARI,*)
429 TYPE() :: INTERCEP(3,NINTER)
430 TYPE(INTBUF_STRUCT_) INTBUF_TAB(*)
431 TYPE(INT8_STRUCT_) :: T8(NSPMD,NBT8)
432 INTEGER :: NBT8,ITAB(*)
433
434
435
436 INTEGER NI,K,I,PROC,P,Q,NB
437 INTEGER N1,N2,N3,N4
438 INTEGER ITY,NMN,NRTM,NM_SHARED
439 INTEGER, DIMENSION(:,:), ALLOCATABLE :: TAG,INDEX_IN_COMM
440 INTEGER, DIMENSION(:), ALLOCATABLE :: INDEX_IN_FRONT
441 INTEGER :: S_FRONT8(NSPMD,NSPMD),IDX(NSPMD)
442 INTEGER :: LOCAL_ID,II,JJ,KK,NSN
443
444
445
446 nbt8 = 1
447 DO ni=1,ninter
448
449 ity = ipari(7,ni)
450 nmn = ipari(6,ni)
451 nrtm = ipari(4,ni)
452 nsn = ipari(5,ni)
453
454 local_id = 0
455 IF(ity == 8) THEN
456 ALLOCATE(index_in_front(nmn))
457 index_in_front(1:nmn) = 0
458 ALLOCATE(tag(nspmd,nmn))
459 ALLOCATE(index_in_comm(nspmd,nmn))
460 tag(1:nspmd,1:nmn) = 0
461 DO k=1,nrtm
462 n1 = intbuf_tab(ni)%IRECTM(4*(k-1)+1)
463 n2 = intbuf_tab(ni)%IRECTM(4*(k-1)+2)
464 n3 = intbuf_tab(ni)%IRECTM(4*(k-1)+3)
465 n4 = intbuf_tab(ni)%IRECTM(4*(k-1)+4)
466 proc = intercep(1,ni)%P(k)
467 tag(proc,n1) = 1
468 tag(proc,n2) = 1
469 tag(proc,n3) = 1
470 tag(proc,n4) = 1
471 ENDDO
472
473
474
475 s_front8 = 0
476 DO p = 1,nspmd
477 DO q = p+1,nspmd
478 DO k = 1,nmn
479 IF(tag(p,k) == 1 .AND. tag(q,k) == 1) THEN
480
481 local_id = local_id + 1
482 s_front8(p,q) = s_front8(p,q) + 1
483 s_front8(q,p) = s_front8(q,p) + 1
484
485 IF( index_in_front(k) == 0) THEN
486 index_in_front(k) = local_id
487 ENDIF
488 ENDIF
489 ENDDO
490 ENDDO
491 ENDDO
492 idx(1:nspmd) = 0
493 index_in_comm(1:nspmd,1:nmn) = 0
494
495
496
497 DO k = 1,nmn
498 q = 0
499 DO p = 1,nspmd
500 q = q + tag(p,k)
501 ENDDO
502 IF(q > 1) THEN
503 DO p = 1,nspmd
504 IF(tag(p,k) /= 0) THEN
505 idx(p) = idx(p) + 1
506 index_in_comm(p,k)=idx(p)
507 ENDIF
508 ENDDO
509 ENDIF
510 ENDDO
511
512
513 DO p = 1,nspmd
514 DO q = p+1,nspmd
515 nm_shared = s_front8(p,q)
516 t8(p,nbt8)%BUFFER(q)%NBMAIN = 0
517 ALLOCATE(t8(p,nbt8)%BUFFER(q)%MAIN_ID(nm_shared))
518 ALLOCATE(t8(p,nbt8)%BUFFER(q)%MAIN_UID(nm_shared))
519 ALLOCATE(t8(p,nbt8)%BUFFER(q)%NBSECND(nm_shared))
520 t8(p,nbt8)%BUFFER(q)%NBSECND(1:nm_shared) = 0
521 t8(q,nbt8)%BUFFER(p)%NBMAIN = 0
522 ALLOCATE(t8(q,nbt8)%BUFFER(p)%MAIN_ID(nm_shared))
523 ALLOCATE(t8(q,nbt8)%BUFFER(p)%MAIN_UID(nm_shared))
524 ALLOCATE(t8(q,nbt8)%BUFFER(p)%NBSECND(nm_shared))
525 t8(q,nbt8)%BUFFER(p)%NBSECND(1:nm_shared) = 0
526 ENDDO
527 ENDDO
528
529
530
531
532 DO p = 1,nspmd
533 k = idx(p)
534 t8(p,nbt8)%S_COMM = k
535 ALLOCATE(t8(p,nbt8)%SPMD_COMM_PATTERN(k))
536 DO q = 1,k
537 t8(p,nbt8)%SPMD_COMM_PATTERN(q)%NUMLOC = 0
538 t8(p,nbt8)%SPMD_COMM_PATTERN(q)%NBCOM = 0
539 ALLOCATE(t8(p,nbt8)%SPMD_COMM_PATTERN(q)%PROCLIST(nspmd))
540 t8(p,nbt8)%SPMD_COMM_PATTERN(q)%PROCLIST(1:nspmd) = 0
541 ALLOCATE(t8(p,nbt8)%SPMD_COMM_PATTERN(q)%BUF_INDEX(nspmd))
542 t8(p,nbt8)%SPMD_COMM_PATTERN(q)%BUF_INDEX(1:nspmd) = 0
543 ENDDO
544 ENDDO
545
546
547
548
549
550
551
552
553
554
555
556 idx(1:nspmd) = 1
557 s_front8(1:nspmd,1:nspmd) = 0
558 DO p = 1,nspmd
559 DO k = 1,nmn
560
561 IF(index_in_comm(p,k) > 0) THEN
562 DO q = p+1,nspmd
563 IF(index_in_comm(q,k)/=0) THEN
564
565 local_id = index_in_comm(p,k)
566 nb = t8(p,nbt8)%SPMD_COMM_PATTERN(local_id)%NBCOM +1
567 t8(p,nbt8)%SPMD_COMM_PATTERN(local_id)%PROCLIST(nb) = q
568 ii = s_front8(p,q) + 1
569 t8(p,nbt8)%SPMD_COMM_PATTERN(local_id)%BUF_INDEX(nb) = ii
570 jj = t8(p,nbt8)%BUFFER(q)%NBMAIN+1
571 t8(p,nbt8)%BUFFER(q)%MAIN_ID(ii) = k
572 t8(p,nbt8)%BUFFER(q)%MAIN_UID(ii) =
573 . itab(intbuf_tab(ni)%MSR(k))
574
575 s_front8(p,q) = ii
576 t8(p,nbt8)%BUFFER(q)%NBMAIN = jj
577 t8(p,nbt8)%SPMD_COMM_PATTERN(local_id)%NBCOM=nb
578 t8(p,nbt8)%SPMD_COMM_PATTERN(local_id)%NUMLOC = k
579
580
581 local_id = index_in_comm(q,k)
582 nb = t8(q,nbt8)%SPMD_COMM_PATTERN(local_id)%NBCOM +1
583 t8(q,nbt8)%SPMD_COMM_PATTERN(local_id)%PROCLIST(nb) = p
584 ii = s_front8(q,p) + 1
585 t8(q,nbt8)%SPMD_COMM_PATTERN(local_id)%BUF_INDEX(nb) = ii
586 jj = t8(q,nbt8)%BUFFER(p)%NBMAIN+1
587 t8(q,nbt8)%BUFFER(p)%MAIN_ID(ii) = k
588 t8(q,nbt8)%BUFFER(p)%MAIN_UID(ii) =
589 . itab(intbuf_tab(ni)%MSR(k))
590 s_front8(q,p) = ii
591 t8(q,nbt8)%BUFFER(p)%NBMAIN = jj
592 t8(q,nbt8)%SPMD_COMM_PATTERN(local_id)%NBCOM=nb
593 t8(q,nbt8)%SPMD_COMM_PATTERN(local_id)%NUMLOC = k
594 ENDIF
595 ENDDO
596 ENDIF
597 ENDDO
598 ENDDO
599
600
601 DO p =1,nspmd
602
603
604 DO i = 1,nsn
605 IF(index_in_comm(p,intbuf_tab(ni)%ILOCS(i)) > 0) THEN
606 local_id = index_in_comm(p,intbuf_tab(ni)%ILOCS(i))
607 nb = t8(p,nbt8)%SPMD_COMM_PATTERN(local_id)%NBCOM
608 DO k =1,nb
609 ii = t8(p,nbt8)%SPMD_COMM_PATTERN(local_id)%BUF_INDEX(k)
610 q = t8(p,nbt8)%SPMD_COMM_PATTERN(local_id)%PROCLIST(k)
611 t8(p,nbt8)%BUFFER(q)%NBSECND(ii) =
612 . t8(p,nbt8)%BUFFER(q)%NBSECND(ii) + 1
613 t8(p,nbt8)%BUFFER(q)%NBSECND_TOT =
614 . t8(p,nbt8)%BUFFER(q)%NBSECND_TOT + 1
615 ENDDO
616 ENDIF
617 ENDDO
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634 .
635 .
636
637
638
639
640
641
642
643
644
645
646
647
648
649 ! jj = t8(p,nbt8)%BUFFER(q)%BUFI(ii)
650
651
652
653
654
655
656
657 ENDDO
658
659! useful debug print
660
661
662
663! nb = t8(p,nbt8)%SPMD_COMM_PATTERN(local_id)%NBCOM
664
665
666
667
668
669
670
671
672
673
674
675
676! WRITE(6,*) "EXCH",p,q,ii,t8(p,nbt8)%BUFFER(q)%MAIN_UID(ii)
677
678
679
680
681
682
683
684
685
686
687
688
689
690 DEALLOCATE(tag)
691 DEALLOCATE(index_in_comm)
692 DEALLOCATE(index_in_front)
693 nbt8 = nbt8 + 1
694 ENDIF
695 ENDDO
696
697
698