The TELEMAC-MASCARET system  trunk
paracoi.f
Go to the documentation of this file.
1 ! ******************
2  SUBROUTINE paracoi
3 ! ******************
4 !
5  &(v1,v2,v3,npoin,icom,ian,nplan,nb_neighb,nb_neighb_pt,list_send,
6  & nh_com,dimnhcom,buf_send,buf_recv,dimbuf)
7 !
8 !***********************************************************************
9 ! BIEF V7P0 21/08/2010
10 !***********************************************************************
11 !
12 !brief ASSEMBLES INTEGER DATA SHARED BY SEVERAL PROCESSORS.
13 !
14 !history J-M HERVOUET (EDF R&D, LNHE)
15 !+ 19/11/2013
16 !+ V7P0
17 !+ A mere copy of PARACO by Pascal Vezolles for integers.
18 !
19 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20 !| BUF_RECV |<->| BUFFER FOR RECEIVING DATA
21 !| BUF_SEND |<->| BUFFER FOR SENDING DATA
22 !| DIMBUF |-->| FIRST DIMENSION OF BUFFERS
23 !| DIMNHCOM |---|
24 !| IAN |-->| NUMBER OF VECTORS TO BE CONDIDERED (1, 2 OR 3)
25 !| ICOM |-->| OPTION OF COMMUNICATION :
26 !| | | = 1 : VALUE WITH MAXIMUM ABSOLUTE VALUE
27 !| | | = 2 : CONTRIBUTIONS ADDED
28 !| | | = 3 : MAXIMUM CONTRIBUTION RETAINED
29 !| | | = 4 : MINIMUM CONTRIBUTION RETAINED
30 !| LIST_SEND |-->| LIST OF PROCESSORS NUMBERS
31 !| NB_NEIGHB |-->| NUMBER OF NEIGHBOURING SUB-DOMAINS
32 !| NB_NEIGHB_PT |-->| NUMBER OF POINTS SHARED WITH A SUB-DOMAIN
33 !| NH_COM |-->| NH_COM(I,IL) : GLOBAL NUMBER IN THIS
34 !| | | SUB-DOMAIN OF THE POINT NUMBER I IN THE LIST
35 !| | | OF POINTS SHARED WITH PROCESSOR NUMBER IL
36 !| | | WHOSE REAL NUMBER IS LIST_SEND(IL)
37 !| NPLAN |-->| SECOND DIMENSION OF V1,V2,V3
38 !| NPOIN |-->| FIRST DIMENSION OF V1,V2,V3
39 !| V1 |<->| INTEGER VECTOR TO BE COMPLETED
40 !| V2 |<->| INTEGER VECTOR TO BE COMPLETED
41 !| V3 |<->| INTEGER VECTOR TO BE COMPLETED
42 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
43 !
44  USE bief_def
47 !
49  IMPLICIT NONE
50 !
51 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
52 !
53  INTEGER, INTENT(IN) :: NPOIN,ICOM,IAN,NPLAN,NB_NEIGHB
54  INTEGER, INTENT(IN) :: DIMNHCOM,DIMBUF
55  INTEGER, INTENT(IN) :: NB_NEIGHB_PT(nb_neighb)
56  INTEGER, INTENT(IN) :: LIST_SEND(nb_neighb),NH_COM(dimnhcom,*)
57 !
58  INTEGER, INTENT(INOUT) :: BUF_SEND(dimbuf,*)
59  INTEGER, INTENT(INOUT) :: BUF_RECV(dimbuf,*)
60  INTEGER, INTENT(INOUT) :: V1(npoin,nplan)
61  INTEGER, INTENT(INOUT) :: V2(npoin,nplan)
62  INTEGER, INTENT(INOUT) :: V3(npoin,nplan)
63 !
64 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
65 !
66  INTEGER IKA,IL,II,I,J,K,IPA
67 !
68  INTRINSIC abs
69 !
70  INTEGER SEND_REQ(100),RECV_REQ(100)
71 !
72 !----------------------------------------------------------------------
73 !
74  IF(ian.NE.1.AND.ian.NE.2.AND.ian.NE.3) THEN
75  WRITE(lu,*) 'FALSCHE FREIWERTZAHL BEI KOMMUNIKATION',ian,
76  & ' AUF PROZESSOR',ipid
77  CALL plante(1)
78  stop
79  ENDIF
80 !
81 ! MESSAGE TAG UPDATE
82 !
83  IF(paracoi_msg_tag.LT.1000000) THEN
85  ELSE
86  paracoi_msg_tag = 5001
87  ENDIF
88 !
89 !== RECEIVE STEP
90 !
91  DO il=1,nb_neighb
92  ika = nb_neighb_pt(il)
93  ipa = list_send(il)
94  CALL p_read(buf_recv(1:dimbuf,il),ian*ika*nplan,
95  & ipa,paracoi_msg_tag,recv_req(il))
96  ENDDO
97 !
98 !== SEND STEP
99 !
100  DO il=1,nb_neighb
101  ika = nb_neighb_pt(il)
102  ipa = list_send(il)
103 !
104 !** INITIALISES THE COMMUNICATION ARRAYS
105 !
106  k = 1
107  IF(ian.EQ.3) THEN
108  DO j=1,nplan
109  DO i=1,ika
110  ii=nh_com(i,il)
111  buf_send(k,il) =v1(ii,j)
112  buf_send(k+1,il)=v2(ii,j)
113  buf_send(k+2,il)=v3(ii,j)
114  k=k+3
115  ENDDO
116  ENDDO
117  ELSEIF(ian.EQ.2) THEN
118  DO j=1,nplan
119  DO i=1,ika
120  ii=nh_com(i,il)
121  buf_send(k,il) =v1(ii,j)
122  buf_send(k+1,il)=v2(ii,j)
123  k=k+2
124  ENDDO
125  ENDDO
126  ELSEIF(ian.EQ.1) THEN
127  DO j=1,nplan
128  DO i=1,ika
129  ii=nh_com(i,il)
130  buf_send(k,il) =v1(ii,j)
131  k=k+1
132  ENDDO
133  ENDDO
134  ENDIF
135 !
136  CALL p_write(buf_send(1:dimbuf,il),ian*ika*nplan,
137  & ipa,paracoi_msg_tag,send_req(il))
138 !
139  ENDDO
140 !
141 !== WAIT RECEIVED MESSAGES (POSSIBILITY OF COVERING)
142 !
143  DO il=1,nb_neighb
144  ika = nb_neighb_pt(il)
145  ipa = list_send(il)
146  CALL p_wait_paraco(recv_req(il),1)
147 !
148  k=1
149 !
150  IF(icom.EQ.1) THEN
151  IF(ian.EQ.3) THEN
152  DO j=1,nplan
153  DO i=1,ika
154  ii=nh_com(i,il)
155  IF(abs(buf_recv(k,il)).GT.abs(v1(ii,j)))
156  & v1(ii,j)=buf_recv(k ,il)
157  IF(abs(buf_recv(k+1,il)).GT.abs(v2(ii,j)))
158  & v2(ii,j)=buf_recv(k+1,il)
159  IF(abs(buf_recv(k+2,il)).GT.abs(v3(ii,j)))
160  & v3(ii,j)=buf_recv(k+2,il)
161  k=k+3
162  ENDDO
163  ENDDO
164  ELSEIF(ian.EQ.2) THEN
165  DO j=1,nplan
166  DO i=1,ika
167  ii=nh_com(i,il)
168  IF(abs(buf_recv(k,il)).GT.abs(v1(ii,j)))
169  & v1(ii,j)=buf_recv(k ,il)
170  IF(abs(buf_recv(k+1,il)).GT.abs(v2(ii,j)))
171  & v2(ii,j)=buf_recv(k+1,il)
172  k=k+2
173  ENDDO
174  ENDDO
175  ELSEIF(ian.EQ.1) THEN
176  DO j=1,nplan
177  DO i=1,ika
178  ii=nh_com(i,il)
179  IF(abs(buf_recv(k,il)).GT.abs(v1(ii,j)))
180  & v1(ii,j)=buf_recv(k ,il)
181  k=k+1
182  ENDDO
183  ENDDO
184  ENDIF
185  ELSEIF(icom.EQ.2) THEN
186  IF(ian.EQ.3) THEN
187  DO j=1,nplan
188  DO i=1,ika
189  ii=nh_com(i,il)
190  v1(ii,j)=v1(ii,j)+buf_recv(k ,il)
191  v2(ii,j)=v2(ii,j)+buf_recv(k+1,il)
192  v3(ii,j)=v3(ii,j)+buf_recv(k+2,il)
193  k=k+3
194  ENDDO
195  ENDDO
196  ELSEIF(ian.EQ.2) THEN
197  DO j=1,nplan
198  DO i=1,ika
199  ii=nh_com(i,il)
200  v1(ii,j)=v1(ii,j)+buf_recv(k ,il)
201  v2(ii,j)=v2(ii,j)+buf_recv(k+1,il)
202  k=k+2
203  ENDDO
204  ENDDO
205  ELSEIF(ian.EQ.1) THEN
206  DO j=1,nplan
207  DO i=1,ika
208  ii=nh_com(i,il)
209  v1(ii,j)=v1(ii,j)+buf_recv(k ,il)
210  k=k+1
211  ENDDO
212  ENDDO
213  ENDIF
214  ELSEIF(icom.EQ.3) THEN
215  IF(ian.EQ.3) THEN
216  DO j=1,nplan
217  DO i=1,ika
218  ii=nh_com(i,il)
219  IF(buf_recv(k ,il).GT.v1(ii,j))
220  & v1(ii,j)=buf_recv(k ,il)
221  IF(buf_recv(k+1,il).GT.v2(ii,j))
222  & v2(ii,j)=buf_recv(k+1,il)
223  IF(buf_recv(k+2,il).GT.v3(ii,j))
224  & v3(ii,j)=buf_recv(k+2,il)
225  k=k+3
226  ENDDO
227  ENDDO
228  ELSEIF(ian.EQ.2) THEN
229  DO j=1,nplan
230  DO i=1,ika
231  ii=nh_com(i,il)
232  IF(buf_recv(k ,il).GT.v1(ii,j))
233  & v1(ii,j)=buf_recv(k ,il)
234  IF(buf_recv(k+1,il).GT.v2(ii,j))
235  & v2(ii,j)=buf_recv(k+1,il)
236  k=k+2
237  ENDDO
238  ENDDO
239  ELSEIF(ian.EQ.1) THEN
240  DO j=1,nplan
241  DO i=1,ika
242  ii=nh_com(i,il)
243  IF(buf_recv(k ,il).GT.v1(ii,j))
244  & v1(ii,j)=buf_recv(k ,il)
245  k=k+1
246  ENDDO
247  ENDDO
248  ENDIF
249  ELSEIF(icom.EQ.4) THEN
250  IF(ian.EQ.3) THEN
251  DO j=1,nplan
252  DO i=1,ika
253  ii=nh_com(i,il)
254  IF(buf_recv(k ,il).LT.v1(ii,j))
255  & v1(ii,j)=buf_recv(k ,il)
256  IF(buf_recv(k+1,il).LT.v2(ii,j))
257  & v2(ii,j)=buf_recv(k+1,il)
258  IF(buf_recv(k+2,il).LT.v3(ii,j))
259  & v3(ii,j)=buf_recv(k+2,il)
260  k=k+3
261  ENDDO
262  ENDDO
263  ELSEIF(ian.EQ.2) THEN
264  DO j=1,nplan
265  DO i=1,ika
266  ii=nh_com(i,il)
267  IF(buf_recv(k ,il).LT.v1(ii,j))
268  & v1(ii,j)=buf_recv(k ,il)
269  IF(buf_recv(k+1,il).LT.v2(ii,j))
270  & v2(ii,j)=buf_recv(k+1,il)
271  k=k+2
272  ENDDO
273  ENDDO
274  ELSEIF(ian.EQ.1) THEN
275  DO j=1,nplan
276  DO i=1,ika
277  ii=nh_com(i,il)
278  IF(buf_recv(k ,il).LT.v1(ii,j))
279  & v1(ii,j)=buf_recv(k ,il)
280  k=k+1
281  ENDDO
282  ENDDO
283  ENDIF
284  ENDIF
285 !
286  ENDDO
287 !
288 !== WAIT SENT MESSAGES
289 !
290  CALL p_wait_paraco(send_req,nb_neighb)
291 !
292 !-----------------------------------------------------------------------
293 !
294  RETURN
295  END
subroutine paracoi(V1, V2, V3, NPOIN, ICOM, IAN, NPLAN, NB_NEIGHB, NB_NEIGHB_PT, LIST_SEND, NH_COM, DIMNHCOM, BUF_SEND, BUF_RECV, DIMBUF)
Definition: paracoi.f:8
integer ipid
Definition: bief_def.f:49
subroutine p_wait_paraco(IBUF, NB)
Definition: p_wait_paraco.F:7