35
36
37
38 USE spmd_comm_world_mod, ONLY : spmd_comm_world
39#include "implicit_f.inc"
40
41
42
43#include "spmd.inc"
44
45
46
47#include "com01_c.inc"
48#include "task_c.inc"
49
50
51
52 INTEGER LCOMM, ISIZE, FR_M(*), IAD_M(*)
53 double precision
54 . a(isize,6,*)
55
56
57
58#ifdef MPI
59 INTEGER MSGTYP,LOC_PROC,NOD,I,J,L,IDEB,IAD,LEN,
60 . NBINDEX,INDEX,MSGOFF,SIZ,IERROR,K,M,
61 . STATUS(MPI_STATUS_SIZE),ISIZE6,
62 . REQ_S(NSPMD),REQ_R(NSPMD),INDEXI(NSPMD),IROT
63 DATA msgoff/212/
64 double precision
65 . sbuf(lcomm*isize*6), rbuf(lcomm*isize*6)
66
67
68
69 loc_proc = ispmd + 1
70 isize6=isize*6
71
72 ideb = 1
73 l = 0
74 DO i = 1, nspmd
75 len = iad_m(i+1)-iad_m(i)
76 IF(len>0) THEN
77 siz = len*isize6
78 l=l+1
79 indexi(l)=i
80 msgtyp = msgoff
82 s rbuf(ideb),siz,mpi_double_precision,it_spmd(i),msgtyp,
83 g spmd_comm_world,req_r(l),ierror)
84 ideb = ideb + siz
85 ENDIF
86 ENDDO
87 nbindex = l
88
89 ideb = 1
90 DO l = 1, nbindex
91 i = indexi(l)
92 len = iad_m(i+1) - iad_m(i)
93 iad = iad_m(i)-1
94#include "vectorize.inc"
95 DO j = 1, len
96 nod = fr_m(iad+j)
97 DO k = 1, 6
98 DO m=1,isize
99 sbuf(ideb) = a(m,k,nod)
100 ideb = ideb + 1
101 END DO
102 ENDDO
103 ENDDO
104 ENDDO
105
106 ideb = 1
107 DO l=1,nbindex
108 i = indexi(l)
109 len = iad_m(i+1)-iad_m(i)
110 siz = len*isize6
111 msgtyp = msgoff
113 s sbuf(ideb),siz,mpi_double_precision,it_spmd(i),msgtyp,
114 g spmd_comm_world,req_s(l),ierror)
115 ideb = ideb + siz
116 ENDDO
117
118 DO l=1,nbindex
119 CALL mpi_waitany(nbindex,req_r,index,status,ierror)
120 i = indexi(index)
121 ideb = 1+(iad_m(i)-1)*isize6
122 len = iad_m(i+1)-iad_m(i)
123 iad = iad_m(i)-1
124#include "vectorize.inc"
125 DO j = 1, len
126 nod = fr_m(iad+j)
127 DO k = 1, 6
128 DO m=1,isize
129 a(m,k,nod) = a(m,k,nod) + rbuf(ideb)
130 ideb = ideb + 1
131 ENDDO
132 ENDDO
133 ENDDO
134 ENDDO
135
136 DO l=1,nbindex
137 CALL mpi_waitany(nbindex,req_s,index,status,ierror)
138 ENDDO
139
140#endif
141 RETURN
subroutine mpi_isend(buf, cnt, datatype, dest, tag, comm, ireq, ierr)
subroutine mpi_waitany(cnt, array_of_requests, index, status, ierr)
subroutine mpi_irecv(buf, cnt, datatype, source, tag, comm, ireq, ierr)