415
416
417
418
419 USE spmd_comm_world_mod, ONLY : spmd_comm_world
420#include "implicit_f.inc"
421
422
423
424#include "spmd.inc"
425
426
427
428#include "com01_c.inc"
429#include "com04_c.inc"
430#include "task_c.inc"
431
432
433
434 INTEGER NSTRF(*), WEIGHT(*), FR_SEC(NSPMD+1,*), IAD_SEC(4,*),
435 . , LSEND2, LRECV1, LRECV2,WEIGHT_MD(*)
437 . x(3,*), ms(*), xsec(4,3,*)
438
439
440
441#ifdef MPI
442 INTEGER ,A_AR,N,L,I,J,II,K,M,JJ, LEN,A_AR2,
443 . MSGTYP,MSGOFF,MSGOFF2,SIZ,IDEBR,IDEBS,ICC,IFRAM,
444 . IERROR, NBIRECV, NBISEND, INDEX, NBRBY, NBNOD,
445 . PMAIN, IDEB, LENS, LENR, K0, K2, N1, N2, N3, NNOD,
446 . NELSEG,,NB,
447 . IAD_SEND(+1),IAD_RECV(NSPMD+1),
448 . REQ_R(NSPMD), REQ_S(NSPMD),
449 . IRINDEX(NSPMD), ISINDEX(NSPMD),
450 . STATUS(MPI_STATUS_SIZE),IAD_STMP(NSPMD)
451 DATA msgoff/4001/
452 DATA msgoff2/4002/
453 parameter(a_ar = 5)
454 parameter(a_ar2 = 13)
456 . mas, xxc, yyc ,zzc, dsec(nsect),
457 . sbuf(a_ar*lsend1),sbuf2(a_ar2*lsend2),
458 . rbuf(a_ar*lrecv1),rbuf2(a_ar2*lrecv2)
459
460
461
462 loc_proc = ispmd + 1
463
464 nbirecv = 0
465 nbisend = 0
466 idebr = 1
467 idebs = 1
468 DO i = 1, nspmd
469 iad_recv(i) = idebr
470 IF(iad_sec(2,i)>0) THEN
471 msgtyp = msgoff
472 nbirecv = nbirecv + 1
473 irindex(nbirecv) = i
474 siz = iad_sec(2,i)*a_ar
476 s rbuf(idebr),siz,real,it_spmd(i),msgtyp,
477 g spmd_comm_world,req_r(nbirecv),ierror)
478 idebr = idebr + siz
479 ENDIF
480 iad_send(i) = idebs
481 IF(iad_sec(1,i)>0) THEN
482 nbisend = nbisend + 1
483 isindex(nbisend) = i
484 siz = iad_sec(1,i)*a_ar
485 idebs = idebs + siz
486 iad_stmp(i)=iad_send(i)
487 ENDIF
488 ENDDO
489 iad_recv(nspmd+1) = idebr
490
491 ideb = 0
492
493 k0=nstrf(25)
494 DO i=1,nsect
495 pmain = fr_sec(nspmd+1,i)
496 n1 = nstrf(k0+3)
497 n2 = nstrf(k0+4)
498 n3 = nstrf(k0+5)
499 nnod = nstrf(k0+6)
500 k2 = k0+30+nstrf(k0+14)
501 nelseg = nstrf(k0+7)+nstrf(k0+8)+nstrf(k0+9)+nstrf(k0+10)+
502 + nstrf(k0+11)+nstrf(k0+12)+nstrf(k0+13)
503 ifram = nstrf(k0+26)
504 IF(pmain>0.AND.loc_proc/=pmain) THEN
505 l = iad_stmp(pmain)
506 IF (ifram<=10.OR.n1/=0) THEN
507 IF(n1>0) THEN
508 IF(weight(n1)==1) THEN
509 sbuf(l) = 1
510 sbuf(l+1) = x(1,n1)
511 sbuf(l+2) = x(2,n1)
512 sbuf(l+3) = x(3,n1)
513 sbuf(l+4) = zero
514 l = l + a_ar
515 END IF
516 END IF
517 IF(n2>0) THEN
518 IF(weight(n2)==1) THEN
519 sbuf(l) = 2
520 sbuf(l+1) = x(1,n2)
521 sbuf(l+2) = x(2,n2)
522 sbuf(l+3) = x(3,n2)
523 sbuf(l+4) = zero
524 l = l + a_ar
525 END IF
526 END IF
527 IF(n3>0) THEN
528 IF(weight(n3)==1) THEN
529 sbuf(l) = 3
530 sbuf(l+1) = x(1,n3)
531 sbuf(l+2) = x(2,n3)
532 sbuf(l+3) = x(3,n3)
533 sbuf(l+4) = zero
534 l = l + a_ar
535 END IF
536 END IF
537 END IF
538 IF(mod(ifram,10)==1) THEN
539 xxc = zero
540 yyc = zero
541 zzc = zero
542 icc = 0
543 DO nn = 1, nnod
544 n = nstrf(k2+nn-1)
545 IF (weight_md(n)==1) THEN
546 xxc=xxc+x(1,n)
547 yyc=yyc+x(2,n)
548 zzc=zzc+x(3,n)
549 icc = icc + 1
550 END IF
551 END DO
552 IF(icc>0) THEN
553 sbuf(l) = 4
554 sbuf(l+1) = xxc
555 sbuf(l+2) = yyc
556 sbuf(l+3) = zzc
557 sbuf(l+4) = icc
558 l = l + a_ar
559 END IF
560 ELSEIF(mod(ifram,10)==2) THEN
561 xxc = zero
562 yyc = zero
563 zzc = zero
564 mas = zero
565 icc = 0
566 DO nn = 1, nnod
567 n = nstrf(k2+nn-1)
568 IF (weight_md(n)==1) THEN
569 xxc=xxc+x(1,n)*ms(n)
570 yyc=yyc+x(2,n)*ms(n)
571 zzc=zzc+x(3,n)*ms(n)
572 mas=mas+ms(n)
573 icc = icc + 1
574 END IF
575 END DO
576 IF(icc>0) THEN
577 sbuf(l) = 5
578 sbuf(l+1) = xxc
579 sbuf(l+2) = yyc
580 sbuf(l+3) = zzc
581 sbuf(l+4) = mas
582 l = l + a_ar
583 END IF
584 END IF
585 iad_stmp(pmain)=l
586 ELSE
587
588 IF (ifram<=10.OR.n1/=0) THEN
589 IF(n1>0) THEN
590 IF(weight(n1)==1) THEN
591 xsec(1,1,i) = x(1,n1)
592 xsec(1,2,i) = x(2,n1)
593 xsec(1,3,i) = x(3,n1)
594 END IF
595 END IF
596 IF(n2>0) THEN
597 IF(weight(n2)==1) THEN
598 xsec(2,1,i) = x(1,n2)
599 xsec(2,2,i) = x(2,n2)
600 xsec(2,3,i) = x(3,n2)
601 END IF
602 END IF
603 IF(n3>0) THEN
604 IF(weight(n3)==1) THEN
605 xsec(3,1,i) = x(1,n3)
606 xsec(3,2,i) = x(2,n3)
607 xsec(3,3,i) = x(3,n3)
608 END IF
609 END IF
610 END IF
611 IF(mod(ifram,10)==1) THEN
612 xxc = zero
613 yyc = zero
614 zzc = zero
615 icc = 0
616 DO nn = 1, nnod
617 n = nstrf(k2+nn-1)
618 IF (weight_md(n)==1) THEN
619 xxc=xxc+x(1,n)
620 yyc=yyc+x(2,n)
621 zzc=zzc+x(3,n)
622 icc = icc + 1
623 END IF
624 END DO
625
626 xsec(4,1,i) = xxc
627 xsec(4,2,i) = yyc
628 xsec(4,3,i) = zzc
629 dsec(i) = icc
630 ELSEIF(mod(ifram,10)==2) THEN
631 xxc = zero
632 yyc = zero
633 zzc = zero
634 mas = zero
635 icc = 0
636 DO nn = 1, nnod
637 n = nstrf(k2+nn-1)
638 IF (weight_md(n)==1) THEN
639 xxc=xxc+x(1,n)*ms(n)
640 yyc=yyc+x(2,n)*ms(n)
641 zzc=zzc+x(3,n)*ms(n)
642 mas=mas+ms(n)
643 icc = icc + 1
644 END IF
645 END DO
646
647 xsec(4,1,i) = xxc
648 xsec(4,2,i) = yyc
649 xsec(4,3,i) = zzc
650 dsec(i) = mas
651 END IF
652 END IF
653 k0=nstrf(k0+24)
654 END DO
655
656 DO l = 1, nbisend
657 i = isindex(l)
658 siz = iad_stmp(i)-iad_send(i)
659 idebs = iad_send(i)
660 msgtyp = msgoff
662 s sbuf(idebs),siz,real,it_spmd(i),msgtyp,
663 g spmd_comm_world,req_s(i),ierror)
664 ENDDO
665
666 DO ii = 1, nbirecv
667 CALL mpi_waitany(nbirecv,req_r,index,status,ierror)
668 i = irindex(index)
669 ideb = iad_recv(i)
670 DO n = 1, nsect
671 pmain = fr_sec(nspmd+1,n)
672 IF(loc_proc==pmain) THEN
673 nb = fr_sec(i,n)
674 IF(nb>0) THEN
675 DO k = 1, nb
676 nn = nint(rbuf(ideb+(k-1)*a_ar ))
677 IF(nn==1) THEN
678 xsec(1,1,n) = rbuf(ideb+(k-1)*a_ar+1)
679 xsec(1,2,n) = rbuf(ideb+(k-1)*a_ar+2)
680 xsec(1,3,n) = rbuf(ideb+(k-1)*a_ar+3)
681 ELSEIF(nn==2) THEN
682 xsec(2,1,n) = rbuf(ideb+(k-1)*a_ar+1)
683 xsec(2,2,n) = rbuf(ideb+(k-1)*a_ar+2)
684 xsec(2,3,n) = rbuf(ideb+(k-1)*a_ar+3)
685 ELSEIF(nn==3) THEN
686 xsec(3,1,n) = rbuf(ideb+(k-1)*a_ar+1)
687 xsec(3,2,n) = rbuf(ideb+(k-1)*a_ar+2)
688 xsec(3,3,n) = rbuf(ideb+(k-1)*a_ar+3)
689 ELSEIF(nn==4.OR.nn==5) THEN
690 xsec(4,1,n) = xsec(4,1,n)+rbuf(ideb+(k-1)*a_ar+1)
691 xsec(4,2,n) = xsec(4,2,n)+rbuf(ideb+(k-1)*a_ar+2)
692 xsec(4,3,n) = xsec(4,3,n)+rbuf(ideb+(k-1)*a_ar+3)
693 dsec(n) = dsec(n) + rbuf(ideb+(k-1)*a_ar+4)
694 END IF
695 END DO
696 ideb = ideb + a_ar*nb
697 END IF
698 END IF
699 END DO
700 END DO
701 DO l = 1, nbisend
702 i = isindex(l)
703 CALL mpi_wait(req_s(i),status,ierror)
704 END DO
705
706
707
708 k0=nstrf(25)
709 DO n = 1, nsect
710 pmain = fr_sec(nspmd+1,n)
711 ifram = nstrf(k0+26)
712 IF(loc_proc==pmain) THEN
713 IF(mod(ifram,10)==1.OR.mod(ifram,10)==2)THEN
714 IF(dsec(n)/=0) THEN
715 xsec(4,1,n) = xsec(4,1,n)/dsec(n)
716 xsec(4,2,n) = xsec(4,2,n)/dsec(n)
717 xsec(4,3,n) = xsec(4,3,n)/dsec(n)
718 END IF
719 END IF
720 END IF
721 k0=nstrf(k0+24)
722 END DO
723
724 nbirecv = 0
725 idebr = 1
726 DO i = 1, nspmd
727 iad_recv(i) = idebr
728 IF(iad_sec(4,i)>0) THEN
729 msgtyp = msgoff2
730 nbirecv = nbirecv + 1
731 irindex(nbirecv) = i
732 siz = iad_sec(4,i)*a_ar2
734 s rbuf2(idebr),siz,real,it_spmd(i),msgtyp,
735 g spmd_comm_world,req_r(nbirecv),ierror)
736 idebr = idebr + siz
737 ENDIF
738 ENDDO
739
740 nbisend = 0
741 IF(iad_sec(3,nspmd+1)>0) THEN
742 l = 0
743 k0=nstrf(25)
744 DO n = 1, nsect
745 pmain = fr_sec(nspmd+1,n)
746 n1 = nstrf(k0+3)
747 n2 = nstrf(k0+4)
748 n3 = nstrf(k0+5)
749 ifram = nstrf(k0+26)
750 IF(loc_proc==pmain) THEN
751 sbuf2(l+1) = n
752 IF (ifram<=10.OR.n1/=0) THEN
753 sbuf2(l+2) = xsec(1,1,n)
754 sbuf2(l+3) = xsec(1,2,n)
755 sbuf2(l+4) = xsec(1,3,n)
756 sbuf2(l+5) = xsec(2,1,n)
757 sbuf2(l+6) = xsec(2,2,n
758
759 sbuf2(l+8) = xsec(3,1,n)
760 sbuf2(l+9) = xsec(3,2,n)
761 sbuf2(l+10)= xsec(3,3,n)
762 ELSE
763 sbuf2(l+2) = zero
764 sbuf2(l+3) = zero
765 sbuf2(l+4) = zero
766 sbuf2(l+5) = zero
767 sbuf2(l+6) = zero
768 sbuf2(l+7) = zero
769 sbuf2(l+8) = zero
770 sbuf2(l+9) = zero
771 sbuf2(l+10)= zero
772 END IF
773 IF(mod(ifram,10)==1.OR.mod(ifram,10)==2) THEN
774 sbuf2(l+11) = xsec(4,1,n)
775 sbuf2(l+12) = xsec(4,2,n)
776 sbuf2(l+13) = xsec(4,3,n)
777 ELSE
778 sbuf2(l+11) = zero
779 sbuf2(l+12) = zero
780 sbuf2(l+13) = zero
781 END IF
782 l = l + a_ar2
783 END IF
784 k0=nstrf(k0+24)
785 END DO
786
787 DO i = 1, nspmd
788 IF(iad_sec(3,i)>0) THEN
789 msgtyp = msgoff2
790 nbisend = nbisend + 1
791 isindex(nbisend) = i
793 s sbuf2,l,real,it_spmd(i),msgtyp,
794 g spmd_comm_world,req_s(i),ierror)
795 END IF
796 END DO
797 END IF
798
799 DO ii = 1, nbirecv
800 CALL mpi_waitany(nbirecv,req_r,index,status,ierror)
801 i = irindex(index)
802 l = iad_recv(i)
803 nbnod = iad_sec(4,i)
804 DO j = 1, nbnod
805 n = nint(rbuf2(l))
806 xsec(1,1,n) = rbuf2(l+1)
807 xsec(1,2,n) = rbuf2(l+2)
808 xsec(1,3,n) = rbuf2(l+3)
809 xsec(2,1,n) = rbuf2(l+4)
810 xsec(2,2,n) = rbuf2(l+5)
811 xsec(2,3,n) = rbuf2(l+6)
812 xsec(3,1,n) = rbuf2(l+7)
813 xsec(3,2,n) = rbuf2(l+8)
814 xsec(3,3,n) = rbuf2(l+9)
815 xsec(4,1,n) = rbuf2(l+10)
816 xsec(4,2,n) = rbuf2(l+11)
817 xsec(4,3,n) = rbuf2(l+12)
818 l = l + a_ar2
819 END DO
820 END DO
821
822 DO l = 1, nbisend
823 i = isindex(l)
824 CALL mpi_wait(req_s(i),status,ierror)
825 END DO
826
827#endif
828 RETURN
subroutine mpi_waitany(cnt, array_of_requests, index, status, ierr)