35
37
38
39
40
41
42
44 USE intbufdef_mod
47
48
49
50#include "implicit_f.inc"
51
52
53
54#include "spmd.inc"
55
56
57
58#include "com01_c.inc"
59#include "com04_c.inc"
60#include "task_c.inc"
61
62
63
64 INTEGER, INTENT(in) :: NIN
65 INTEGER, DIMENSION(NINTER+1,NSPMD+1), INTENT(in) :: ISENDTO,IRCVFROM
66 TYPE(sorting_comm_type), DIMENSION(NINTER), INTENT(inout) :: SORT_COMM
67
68#ifdef MPI
69 INTEGER :: I,J,NOD,L,L2,KK,KKK,IJK
70 INTEGER :: P,P_LOC
71
72 INTEGER IERROR1,STATUS(MPI_STATUS_SIZE),IERROR
73
74 INTEGER :: LOC_PROC
75
76
77
78
79 loc_proc = ispmd + 1
80 sort_comm(nin)%NBIRECV = 0
81 sort_comm(nin)%NSNR = 0
82 IF(ircvfrom(nin,loc_proc)==0.AND.isendto(nin,loc_proc)==0) RETURN
83 IF(isendto(nin,loc_proc)/=0) THEN
84 DO l=1,sort_comm(nin)%NBSEND_NB
86 . sort_comm(nin)%REQUEST_NB_S,p_loc,status,ierror)
87 ENDDO
88 ENDIF
89
90
91
92
93 IF(ircvfrom(nin,loc_proc)/=0) THEN
94 ijk = 0
95
96 CALL mpi_waitall(sort_comm(nin)%NBRECV_NB,sort_comm(nin)%REQUEST_NB_R,mpi_statuses_ignore,ierror)
97
98 l = 0
99 sort_comm(nin)%NSNR = 0
100 DO p = 1, nspmd
101 IF(isendto(nin,p)/=0) THEN
102 IF(.NOT.ALLOCATED(sort_comm(nin)%ISINDEXI)) THEN
103 ALLOCATE(sort_comm(nin)%ISINDEXI(sort_comm(nin)%PROC_NUMBER) )
104 ENDIF
105
106 IF(loc_proc/=p) THEN
107 IF(
nsnfi(nin)%P(p)>0)
THEN
108 l=l+1
109 sort_comm(nin)%ISINDEXI(l)=p
110 sort_comm(nin)%NSNR = sort_comm(nin)%NSNR +
nsnfi(nin)%P(p)
111 ENDIF
112 ENDIF
113 ENDIF
114 ENDDO
115 sort_comm(nin)%NBIRECV=l
116 ENDIF
117
118
119#endif
120 RETURN
subroutine mpi_waitall(cnt, array_of_requests, status, ierr)
subroutine mpi_waitany(cnt, array_of_requests, index, status, ierr)
type(int_pointer), dimension(:), allocatable nsnfi
subroutine spmd_wait_nb(ircvfrom, isendto, nin, sort_comm)