33
34
35
37
38
39
40 USE spmd_comm_world_mod, ONLY : spmd_comm_world
41#include "implicit_f.inc"
42
43
44
45#include "spmd.inc"
46
47
48
49#include "com01_c.inc"
50#include "com04_c.inc"
51#include "task_c.inc"
52#include "param_c.inc"
53
54
55
56 my_real ,
INTENT(IN) :: buf_exch(n_anchor_remote_send,4)
57 my_real ,
INTENT(INOUT) :: a(3,numnod),stifn(numnod)
58
59
60
61#ifdef MPI
62 INTEGER MSGTYP,I,NOD,LOC_PROC,IERROR,
63 . SIZ,J,K,L,NB_NOD,
64 . STATUS(MPI_STATUS_SIZE),
65 . IAD_SEND(NSPMD+1),IAD_RECV(NSPMD+1),
66 . REQ_R(NSPMD),REQ_S(NSPMD),OFFSET
68 . rbuf(4*n_anchor_remote),sbuf(4*n_anchor_remote_send)
69
70
71
72 loc_proc = ispmd + 1
73
74 IF (n_anchor_remote > 0) THEN
75 l = 1
76 iad_recv(1) = 1
77 DO i=1,nspmd
79 IF(siz/=0)THEN
80 msgtyp = 10000 + nspmd*(i-1) + loc_proc
82 s rbuf(l),siz,real,it_spmd(i),msgtyp,
83 g spmd_comm_world,req_r(i),ierror)
84 l = l + siz
85 ENDIF
86 iad_recv(i+1) = l
87 END DO
88 ENDIF
89
90 IF (n_anchor_remote_send > 0) THEN
91 l = 1
92 iad_send(1) = 1
93 DO i=1,nspmd
94
95#include "vectorize.inc"
98 sbuf(l ) = buf_exch(nod,1)
99 sbuf(l+1) = buf_exch(nod,2)
100 sbuf(l+2) = buf_exch(nod,3)
101 sbuf(l+3) = buf_exch(nod,4)
102 l = l + 4
103 END DO
104 iad_send(i+1) = l
105 ENDDO
106
107
108
109 DO i=1,nspmd
110
111
113 msgtyp = 10000 + nspmd*(loc_proc-1) + i
114 siz = iad_send(i+1)-iad_send(i)
115 l = iad_send(i)
117 s sbuf(l),siz,real,it_spmd(i),msgtyp,
118 g spmd_comm_world,req_s(i),ierror)
119 ENDIF
120
121 ENDDO
122
123 ENDIF
124
125
126
127 IF (n_anchor_remote > 0) THEN
128 DO i = 1, nspmd
130 IF(nb_nod>0)THEN
131 CALL mpi_wait(req_r(i),status,ierror)
132 l = iad_recv(i)
133#include "vectorize.inc"
136 a(1,nod) = a(1,nod) + rbuf(l)
137 a(2,nod) = a(2,nod) + rbuf(l+1)
138 a(3,nod) = a(3,nod) + rbuf(l+2)
139 stifn(nod) = stifn(nod) + rbuf(l+3)
140 l = l + 4
141 END DO
142
143 ENDIF
144 END DO
145 ENDIF
146
147
148
149 IF (n_anchor_remote_send > 0) THEN
150 DO i = 1, nspmd
152 CALL mpi_wait(req_s(i),status,ierror)
153 ENDIF
154 ENDDO
155 ENDIF
156
157#endif
158 RETURN
subroutine mpi_isend(buf, cnt, datatype, dest, tag, comm, ireq, ierr)
subroutine mpi_wait(ireq, status, ierr)
subroutine mpi_irecv(buf, cnt, datatype, source, tag, comm, ireq, ierr)
type(seatbelt_remote_nodes_struct) anchor_remote_send
type(seatbelt_remote_nodes_struct) anchor_remote