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