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