38
39
40
41 USE spmd_comm_world_mod, ONLY : spmd_comm_world
42#include "implicit_f.inc"
43
44
45
46#include "spmd.inc"
47
48
49
50#include "task_c.inc"
51#include "com01_c.inc"
52
53
54
55 INTEGER LENR,LENS,ITAG(*),
56 . IAD_ELEM(2,*), FR_ELEM(*), ISDSIZ(*), IRCSIZ(*),
57 . ADSKYT(0:*)
59 . fskyt(3,*)
60
61
62
63#ifdef MPI
64 INTEGER I ,J ,N1, N2, N3, N4,IERROR, IAD, IAD1, IAD2, SIZ, NB,
65 . MSGTYP, LOC_PROC, CC, MSGOFF,
66 . STATUS(MPI_STATUS_SIZE),(NSPMD)
67
69 . bufr(lenr), bufs(lens)
70 DATA msgoff/195/
71
72
73 loc_proc = ispmd+1
74
75 iad = 1
76 DO i=1,nspmd
77 siz = ircsiz(i)
78 IF(siz>0)THEN
79 siz = siz*3+iad_elem(1,i+1)-iad_elem(1,i)
80 msgtyp = msgoff
82 s bufr(iad),siz,real,it_spmd(i),msgtyp,
83 g spmd_comm_world,req_r(i),ierror)
84 iad = iad + siz
85 ENDIF
86 END DO
87
88 DO i=1,nspmd
89 IF(isdsiz(i)>0)THEN
90 iad = 0
91#include "vectorize.inc"
92 DO j=iad_elem(1,i),iad_elem(1,i+1)-1
93 n1 = fr_elem(j)
94 iad1 = itag(n1)
95 iad2 = adskyt(n1)-1
96 nb = iad2-iad1+1
97 iad = iad + 1
98 bufs(iad) = nb
99 DO cc = iad1, iad2
100 iad = iad + 1
101 bufs(iad) = fskyt(1,cc)
102 iad = iad + 1
103 bufs(iad) = fskyt(2,cc)
104 iad = iad + 1
105 bufs(iad) = fskyt(3,cc)
106 END DO
107 END DO
108
109 siz = 3*isdsiz(i)+iad_elem(1,i+1)-iad_elem(1,i)
110 msgtyp = msgoff
112 s bufs,siz,real,it_spmd(i),msgtyp,
113 g spmd_comm_world,ierror)
114 END IF
115 END DO
116
117 iad = 0
118 DO i = 1, nspmd
119 IF(ircsiz(i)>0)THEN
120 CALL mpi_wait(req_r(i),status,ierror)
121 DO j=iad_elem(1,i),iad_elem(1,i+1)-1
122 n1 = fr_elem(j)
123 iad = iad + 1
124 nb = nint(bufr(iad))
125 DO cc = 1, nb
126 iad1 = adskyt(n1)
127 adskyt(n1) = adskyt(n1)+1
128 iad = iad + 1
129 fskyt(1,iad1) = bufr(iad)
130 iad = iad + 1
131 fskyt(2,iad1) = bufr(iad)
132 iad = iad + 1
133 fskyt(3,iad1) = bufr(iad)
134 END DO
135 END DO
136 END IF
137 END DO
138
139#endif
140 RETURN
subroutine mpi_wait(ireq, status, ierr)
subroutine mpi_send(buf, cnt, datatype, dest, tag, comm, ierr)
subroutine mpi_irecv(buf, cnt, datatype, source, tag, comm, ireq, ierr)