33
34
35
36
37
38
39
40
41
42
43
44
45
46 USE spmd_comm_world_mod, ONLY : spmd_comm_world
47#include "implicit_f.inc"
48
49
50
51#include "spmd.inc"
52
53
54
55#include "com01_c.inc"
56#include "com04_c.inc"
57#include "task_c.inc"
58#include "tabsiz_c.inc"
59
60
61
62 INTEGER, DIMENSION(SNESDVOIS), INTENT(IN) :: NB_SEND_NEIGH
63 INTEGER, DIMENSION(SNERCVOIS), INTENT(IN) :: NB_RCV_NEIGH
64 INTEGER, DIMENSION(SLESDVOIS), INTENT(IN) :: INDEX_SEND_NEIGH
65 INTEGER, DIMENSION(SLERCVOIS), INTENT(IN) :: INDEX_RCV_NEIGH
66
67 INTEGER, DIMENSION(SNESDVOIS), INTENT(INOUT) :: TMP_NB_SEND_NEIGH
68 INTEGER, DIMENSION(SNERCVOIS), INTENT(INOUT) :: TMP_NB_RCV_NEIGH
69 INTEGER, DIMENSION(SLESDVOIS), INTENT(INOUT) :: TMP_INDEX_SEND_NEIGH
70 INTEGER, DIMENSION(SLERCVOIS), INTENT(INOUT) :: TMP_INDEX_RCV_NEIGH
71 INTEGER, INTENT(IN) :: LENCOM
72 LOGICAL, DIMENSION(NUMELS+NUMELQ+NUMELTG), INTENT(IN) :: ACTIVE_ELEMENT
73
74
75
76#ifdef MPI
77 INTEGER I, IDEB, IDEB2, MSGOFF, IERROR,MSGTYP,IAD_RECV(NSPMD),
78 . STATUS(MPI_STATUS_SIZE), REQ_S(NSPMD), REQ_R(NSPMD),
79 . LOC_PROC, N, NN, NBIRECV, IRINDEX(NSPMD), II, INDEX,
80 . LEN
81 DATA msgoff/3003/
82 LOGICAL, DIMENSION(:), ALLOCATABLE :: WA
83
84 ALLOCATE( wa(lencom) )
85
86
87
88 loc_proc = ispmd+1
89 ideb = 0
90 ideb2 = 0
91 nbirecv = 0
92 DO i = 1, nspmd
93 msgtyp = msgoff
94 iad_recv(i) = ideb2+1
95 IF(nb_rcv_neigh(i)>0) THEN
96 nbirecv = nbirecv + 1
97 irindex(nbirecv) = i
98 len = nb_rcv_neigh(i)
99 CALL mpi_irecv( wa(ideb2+1),len,mpi_logical,it_spmd(i),msgtyp,
100 . spmd_comm_world,req_r(nbirecv),ierror)
101 ideb2 = ideb2 + len
102 ENDIF
103 ENDDO
104
105
106
107
108 ideb = 0
109 DO i = 1, nspmd
110 msgtyp = msgoff
111 len = nb_send_neigh(i)
112 tmp_nb_send_neigh(i) = 0
113 IF(len>0) THEN
114 DO n = 1, len
115 nn = index_send_neigh(ideb+n)
116 wa(ideb2+n) = active_element(nn)
117 IF(wa(ideb2+n)) THEN
118 tmp_nb_send_neigh(i) = tmp_nb_send_neigh(i) + 1
119 tmp_index_send_neigh(ideb+tmp_nb_send_neigh(i)) = index_send_neigh(ideb+n)
120 ENDIF
121 ENDDO
122 CALL mpi_isend( wa(ideb2+1),len,mpi_logical,it_spmd(i),msgtyp,
123 . spmd_comm_world,req_s(i),ierror)
124 ideb = ideb + len
125 ideb2 = ideb2 + len
126 ENDIF
127 ENDDO
128
129
130
131
132 DO ii = 1, nbirecv
133 CALL mpi_waitany(nbirecv,req_r,index,status,ierror)
134 i = irindex(index)
135 tmp_nb_rcv_neigh(i) = 0
136 ideb = iad_recv(i)-1
137 DO n = 1, nb_rcv_neigh(i)
138 nn = index_rcv_neigh(ideb+n)
139 IF(wa(ideb+n)) THEN
140 tmp_nb_rcv_neigh(i) = tmp_nb_rcv_neigh(i) + 1
141 tmp_index_rcv_neigh(ideb+tmp_nb_rcv_neigh(i)) = index_rcv_neigh(ideb+n)
142 ENDIF
143 ENDDO
144 ENDDO
145
146
147
148
149 DO i = 1, nspmd
150 IF(nb_send_neigh(i)>0) THEN
151 CALL mpi_wait(req_s(i),status,ierror)
152 ENDIF
153 ENDDO
154
155 DEALLOCATE( wa )
156#endif
157 RETURN
subroutine mpi_isend(buf, cnt, datatype, dest, tag, comm, ireq, ierr)
subroutine mpi_wait(ireq, status, ierr)
subroutine mpi_waitany(cnt, array_of_requests, index, status, ierr)
subroutine mpi_irecv(buf, cnt, datatype, source, tag, comm, ireq, ierr)