35
36
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 "com01_c.inc"
51#include "com04_c.inc"
52#include "task_c.inc"
53
54
55
56 INTEGER IAD_ELEM(2,*),FR_ELEM(*), (NLOADP_HYD_INTER,NUMNOD),LENR
57
58
59
60#ifdef MPI
61 INTEGER MSGTYP,I,NOD,IERROR,MSGOFF,IERROR2,
62 . SIZ,J,K,L,NB_NOD,NP,
63 . STATUS(MPI_STATUS_SIZE),
64 . IAD_SEND(NSPMD+1),IAD_RECV(NSPMD+1),
65 . REQ_R(NSPMD),REQ_S(NSPMD)
66 DATA msgoff/120/
67
68 INTEGER, DIMENSION(:), ALLOCATABLE :: RBUF,SBUF
69
70
71
72
73
74 ierror = 0
75 ALLOCATE( rbuf(nloadp_hyd_inter*lenr),stat=ierror2)
76 ierror = ierror + ierror2
77 ALLOCATE( sbuf(nloadp_hyd_inter*lenr),stat=ierror2)
78 ierror = ierror + ierror2
79
80 IF(ierror/=0) THEN
81 CALL ancmsg(msgid=20,anmode=aninfo)
83 END IF
84 l = 1
85 iad_recv(1) = 1
86 DO i=1,nspmd
87 siz = nloadp_hyd_inter*(iad_elem(1,i+1)-iad_elem(1,i))
88 IF(siz/=0)THEN
89 msgtyp = msgoff
91 s rbuf(l),siz,mpi_integer,it_spmd(i),msgtyp,
92 g spmd_comm_world,req_r(i),ierror)
93 l = l + siz
94 ENDIF
95 iad_recv(i+1) = l
96 END DO
97
98
99
100 l = 1
101 iad_send(1) = 1
102 DO i=1,nspmd
103 DO np=1,nloadp_hyd_inter
104#include "vectorize.inc"
105 DO j=iad_elem(1,i),iad_elem(1,i+1)-1
106 nod = fr_elem(j)
107 sbuf(l ) = tagncont(np,nod)
108 l = l + 1
109 END DO
110 ENDDO
111
112 iad_send(i+1) = l
113 ENDDO
114
115
116
117 DO i=1,nspmd
118
119
120
121 IF(iad_elem(1,i+1)-iad_elem(1,i)>0)THEN
122 msgtyp = msgoff
123 siz = iad_send(i+1)-iad_send(i)
124 l = iad_send(i)
126 s sbuf(l),siz,mpi_integer,it_spmd(i),msgtyp,
127 g spmd_comm_world,req_s(i),ierror)
128 ENDIF
129
130 ENDDO
131
132
133
134
135
136 DO i = 1, nspmd
137
138 nb_nod = iad_elem(1,i+1)-iad_elem(1,i)
139 IF(nb_nod>0)THEN
140 CALL mpi_wait(req_r(i),status,ierror)
141 l = iad_recv(i)
142
143 DO np=1,nloadp_hyd_inter
144#include "vectorize.inc"
145 DO j=iad_elem(1,i),iad_elem(1,i+1)-1
146 nod = fr_elem(j)
147 tagncont(np,nod) =
max(tagncont(np,nod), rbuf(l))
148 l = l + 1
149 END DO
150 ENDDO
151
152 ENDIF
153
154
155
156 END DO
157
158
159
160
161 DO i = 1, nspmd
162 IF(iad_elem(1,i+1)-iad_elem(1,i)>0)THEN
163 CALL mpi_wait(req_s(i),status,ierror)
164 ENDIF
165 ENDDO
166
167 DEALLOCATE(rbuf,sbuf)
168
169#endif
170 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)
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)