The TELEMAC-MASCARET system  trunk
elebd.f
Go to the documentation of this file.
1 ! ****************
2  SUBROUTINE elebd
3 ! ****************
4 !
5  &(nelbor,nulone,kp1bor,ifabor,nbor,ikle,sizikl,iklbor,nelem,nelmax,
6  & npoin,nptfr,ielm,lihbor,klog,iseg,t1,t2,t3,nelebx,
7  & neleb)
8 !
9 !***********************************************************************
10 ! BIEF V7P2
11 !***********************************************************************
12 !
13 !brief BUILDING DATA STRUCTURES TO NAVIGATE IN A 2D MESH.
14 !+
15 !+ 1) ARRAYS NELBOR AND NULONE,
16 !+
17 !+ 2) ARRAY KP1BOR,
18 !+
19 !+ 3) DISTINGUISHES IN THE ARRAY IFABOR FOR
20 !+ SOLID BOUNDARY FACES OR LIQUID FACES,
21 !+
22 !+ 4) IKLBOR, CONNECTIVITY TABLE OF BOUNDARY ELEMENTS
23 !
24 !history J-M HERVOUET (LNHE)
25 !+ 23/06/2008
26 !+ V5P9
27 !+
28 !
29 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
30 !+ 13/07/2010
31 !+ V6P0
32 !+ Translation of French comments within the FORTRAN sources into
33 !+ English comments
34 !
35 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
36 !+ 21/08/2010
37 !+ V6P0
38 !+ Creation of DOXYGEN tags for automated documentation and
39 !+ cross-referencing of the FORTRAN sources
40 !
41 !history J-M HERVOUET (LNHE)
42 !+ 18/03/2013
43 !+ V6P3
44 !+ Error messages more accurate.
45 !
46 !history J-M HERVOUET (EDF LAB, LNHE)
47 !+ 13/03/2014
48 !+ V7P0
49 !+ Now written to enable different numbering of boundary points and
50 !+ boundary segments.
51 !
52 !history J-M HERVOUET (EDF LAB, LNHE)
53 !+ 16/06/2014
54 !+ V7P0
55 !+ New possible errors in the mesh now stopped.
56 !
57 !history J-M HERVOUET (EDF LAB, LNHE)
58 !+ 25/04/2016
59 !+ V7P2
60 !+ Checking wrong meshes where a point appears on several different
61 !+ boundaries.
62 !
63 !history S.E.BOURBAN (HRW)
64 !+ 21/03/2017
65 !+ V7P3
66 !+ Replacement of the DATA declarations by the PARAMETER associates
67 !
68 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
69 !| IELM |-->| TYPE D'ELEMENT.
70 !| | | 11 : TRIANGLES.
71 !| | | 21 : QUADRILATERES.
72 !| IFABOR |-->| TABLEAU DES VOISINS DES FACES.
73 !| IKLBOR |<--| CONNECTIVITY TABLE OF BOUNDARY ELEMENTS
74 !| IKLE |-->| NUMEROS GLOBAUX DES POINTS DE CHAQUE ELEMENT.
75 !| ISEG |---|
76 !| KLOG |-->| CONVENTION POUR LA CONDITION LIMITE DE PAROI
77 !| KP1BOR |<--| NUMERO DU POINT SUIVANT LE POINT DE BORD K.
78 !| LIHBOR |-->| TYPES DE CONDITIONS AUX LIMITES SUR H
79 !| NBOR |-->| NUMERO GLOBAL DU POINT DE BORD K.
80 !| NELBOR |<--| NUMERO DE L'ELEMENT ADJACENT AU KIEME SEGMENT
81 !| NELEM |-->| NOMBRE TOTAL D'ELEMENTS DANS LE MAILLAGE.
82 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS
83 !| NPOIN |-->| NOMBRE TOTAL DE POINTS DU DOMAINE.
84 !| NPTFR |-->| NOMBRE DE POINTS FRONTIERES.
85 !| NULONE |<--| NUMERO LOCAL D'UN POINT DE BORD DANS
86 !| | | L'ELEMENT ADJACENT DONNE PAR NELBOR
87 !| SIZIKL |-->| FIRST DIMENSION OF IKLE
88 !| T2 |---|
89 !| T3 |---|
90 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
91 !
92  USE bief, ex_elebd => elebd
93 !
95  IMPLICIT NONE
96 !
97 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
98 !
99  INTEGER, INTENT(IN) :: KLOG,NELMAX,NELEM,SIZIKL,NELEBX
100  INTEGER, INTENT(INOUT) :: NELEB
101  INTEGER, INTENT(IN) :: NPOIN,NPTFR,IELM
102  INTEGER, INTENT(INOUT) :: NELBOR(nelebx),NULONE(nelebx,2)
103  INTEGER, INTENT(INOUT) :: KP1BOR(nptfr,2)
104  INTEGER, INTENT(INOUT) :: NBOR(*)
105  INTEGER, INTENT(INOUT) :: IFABOR(nelmax,*)
106  INTEGER, INTENT(IN) :: IKLE(sizikl,*)
107  INTEGER, INTENT(IN) :: LIHBOR(nptfr)
108  INTEGER, INTENT(INOUT) :: IKLBOR(nelebx,2)
109  INTEGER, INTENT(IN) :: ISEG(*)
110  INTEGER, INTENT(INOUT) :: T1(npoin),T2(npoin),T3(npoin)
111 !
112 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
113 !
114  INTEGER IELEM,NFACE,NPT,KEL,IPOIN
115  INTEGER K,IFACE,I1,I2,N1,N2,IPT,IEL,I,K1,K2
116 !
117  INTEGER :: SOMFAC(2,4,2)
118  parameter( somfac = reshape( (/
119  & 1,2 , 2,3 , 3,1 , 0,0 ,
120  & 1,2 , 2,3 , 3,4 , 4,1 /), shape=(/ 2,4,2 /) ) )
121 !
122 !-----------------------------------------------------------------------
123 !
124  IF(ielm.EQ.11.OR.ielm.EQ.41.OR.ielm.EQ.51) THEN
125 ! TRIANGLES
126  nface = 3
127  npt = 3
128  kel = 1
129  ELSE
130  WRITE(lu,901) ielm
131 901 FORMAT(1x,'ELEBD: IELM=',1i6,' UNKNOWN TYPE OF ELEMENT')
132  CALL plante(1)
133  stop
134  ENDIF
135 !
136 ! INITIALISES T1,2,3 TO 0
137 !
138  DO ipoin=1,npoin
139  t1(ipoin) = 0
140  t2(ipoin) = 0
141  t3(ipoin) = 0
142  ENDDO
143 !
144 ! STORES K IN TRAV(*,3), ADDRESS NBOR(K)
145 ! GIVES CORRESPONDENCE GLOBAL --> BOUNDARY NUMBER
146 ! FINDS POINTS WITH MORE THAN ONE BOUNDARY
147 !
148  DO k = 1, nptfr
149  t3(nbor(k)) = k
150  t1(nbor(k)) = t1(nbor(k)) +1
151  ENDDO
152  DO i = 1, npoin
153  IF(t1(i).GT.1) THEN
154  WRITE(lu,*) 'ELEBD: POINT ',i
155  WRITE(lu,*) 'APPEARS ON ',t1(i)
156  WRITE(lu,*) 'DIFFERENT BOUNDARIES'
157  WRITE(lu,*) 'WRONG MESH'
158  CALL plante(1)
159  stop
160  ENDIF
161  ENDDO
162 !
163 ! REINITIALISES T1 TO 0 (IS THIS USEFUL ??)
164 !
165  DO ipoin=1,npoin
166  t1(ipoin) = 0
167  ENDDO
168 !
169 ! LOOP ON ALL THE FACES OF ALL THE ELEMENTS:
170 !
171  DO iface = 1 , nface
172  DO ielem = 1 , nelem
173  IF(ifabor(ielem,iface).EQ.-1) THEN
174 ! THIS IS A TRUE BOUNDARY FACE
175 ! INTERNAL FACES ARE MARKED WITH -2 IN PARALLELE MODE
176 ! GLOBAL NUMBERS OF THE FACE POINTS :
177  i1 = ikle( ielem , somfac(1,iface,kel) )
178  i2 = ikle( ielem , somfac(2,iface,kel) )
179 ! STORES IN T1 AND T2 (ADDRESS I1) : I2 AND IELEM
180  t1(i1) = i2
181  t2(i1) = ielem
182 ! A LIQUID FACE IS RECOGNIZED BY THE BOUNDARY CONDITION ON H
183  IF(nptfr.GT.0) THEN
184  IF(t3(i1).NE.0.AND.t3(i2).NE.0) THEN
185  IF(lihbor(t3(i1)).NE.klog.AND.
186  & lihbor(t3(i2)).NE.klog) THEN
187 ! LIQUID FACE : IFABOR=0 SOLID FACE : IFABOR=-1
188  ifabor(ielem,iface)=0
189  ENDIF
190  ELSE
191  IF(t3(i1).EQ.0) THEN
192  WRITE(lu,*) 'POINT ',i1,' IS ON A BOUNDARY'
193  ENDIF
194  IF(t3(i2).EQ.0) THEN
195  WRITE(lu,*) 'POINT ',i2,' IS ON A BOUNDARY'
196  ENDIF
197  WRITE(lu,*) 'BUT NOT IN THE LIST OF BOUNDARY POINTS'
198  WRITE(lu,*) 'OR THE NUMBER OF LINES IN THE BOUNDARY'
199  WRITE(lu,*) 'CONDITIONS FILE IS GREATER THAN:',nptfr
200  WRITE(lu,*) 'NUMBER TAKEN IN THE GEOMETRY FILE'
201  CALL plante(1)
202  stop
203  ENDIF
204  ENDIF
205 !
206  ENDIF
207  ENDDO ! IELEM
208  ENDDO ! IFACE
209 !
210 ! LOOP ON ALL THE BOUNDARY POINTS TO BUILD KP1BOR:
211 !
212  IF(nptfr.GT.0) THEN
213  DO i = 1 , npoin
214  IF(t1(i).NE.0) THEN
215 ! FOLLOWING POINT
216  kp1bor(t3(i),1)=t3(t1(i))
217 ! PRECEDING POINT
218  kp1bor(t3(t1(i)),2)=t3(i)
219  nelbor(t3(i))=t2(i)
220  ENDIF
221  ENDDO
222  ENDIF
223 !
224 ! DUMMY VALUES IN KP1BOR WHEN THE FOLLOWING POINT IS IN ANOTHER SUB-DOMAIN
225 ! NELBOR AND NULONE SET TO 0
226 !
227  IF(ncsize.GT.1) THEN
228  DO k1=1,nptfr
229  IF(iseg(k1).GT.0) THEN
230  kp1bor(k1,1)=k1
231  nelbor(k1)=0
232  nulone(k1,1)=0
233  nulone(k1,2)=0
234  ELSEIF(iseg(k1).EQ.-9999) THEN
235  kp1bor(k1,1)=k1
236  kp1bor(k1,2)=k1
237  nelbor(k1) =0
238  nulone(k1,1)=0
239  nulone(k1,2)=0
240  ELSEIF(iseg(k1).LT.0) THEN
241  kp1bor(k1,2)=k1
242  ENDIF
243  ENDDO
244  ENDIF
245 !
246 ! COMPUTES ARRAY NULONE
247 !
248  DO k1=1,nptfr
249 !
250  IF(ncsize.GT.1) THEN
251  IF(iseg(k1).GT.0.OR.iseg(k1).EQ.-9999) cycle
252  ENDIF
253 !
254  k2=kp1bor(k1,1)
255  iel = nelbor(k1)
256  n1 = nbor(k1)
257  IF(k2.LT.0.OR.k2.GT.nptfr) print*,'K2=',k2,' K1=',k1
258  n2 = nbor(k2)
259 !
260  i1 = 0
261  i2 = 0
262 !
263  DO ipt=1,npt
264  IF(ikle(iel,ipt).EQ.n1) THEN
265  nulone(k1,1) = ipt
266  i1 = 1
267  ENDIF
268  IF(ikle(iel,ipt).EQ.n2) THEN
269  nulone(k1,2) = ipt
270  i2 = 1
271  ENDIF
272  ENDDO
273 !
274  IF(i1.EQ.0.OR.i2.EQ.0) THEN
275  WRITE(lu,811) ipt,k1,iel
276 811 FORMAT(1x,'ELEBD: ERROR AT POINT:', i10 ,/,
277  & 1x,' THE BOUNDARY POINT:',i10 ,/,
278  & 1x,' DOES NOT BELONG TO ELEMENT : ',i10 ,/,
279  & 1x,' POSSIBLE REASONS:' ,/,
280  & 1x,' THE BOUNDARY CONDITION FILE IS NOT ' ,/,
281  & 1x,' RELEVANT TO THE GEOMETRY FILE ' ,/,
282  & 1x,' OR THE MESH HAS A WRONG TOPOLOGY')
283  CALL plante(1)
284  stop
285  ENDIF
286 !
287  ENDDO ! K1
288 !
289 ! COMPUTES IKLBOR : LIKE IKLE FOR BOUNDARY POINTS, WITH BOUNDARY
290 ! POINTS NUMBERING
291 !
292 ! IN 3D WILL BE REDONE IN OTHER ELEB.. ROUTINES
293 !
294 ! IF(IELM.NE.41.AND.IELM.NE.51) THEN
295  DO k=1,nptfr
296  iklbor(k,1) = k
297  iklbor(k,2) = kp1bor(k,1)
298  ENDDO
299 ! ENDIF
300 !
301 !-----------------------------------------------------------------------
302 !
303 ! VERSION 7.0: NOW RENUMBERING IN PARALLEL TO AVOID HOLES IN SEGMENT
304 ! NUMBERING. NELEB BECOMES THE REAL NUMBER OF BOUNDARY
305 ! ELEMENTS
306 !
307  IF(ncsize.GT.1) THEN
308  neleb=0
309  DO k=1,nptfr
310  IF(kp1bor(k,1).NE.k) THEN
311  neleb=neleb+1
312  nelbor(neleb) =nelbor(k)
313  nulone(neleb,1)=nulone(k,1)
314  nulone(neleb,2)=nulone(k,2)
315  iklbor(neleb,1)=iklbor(k,1)
316  iklbor(neleb,2)=iklbor(k,2)
317  ENDIF
318  ENDDO
319  ELSE
320  neleb=nptfr
321  ENDIF
322 !
323 !-----------------------------------------------------------------------
324 !
325  RETURN
326  END
327 
subroutine elebd(NELBOR, NULONE, KP1BOR, IFABOR, NBOR, IKLE, SIZIKL, IKLBOR, NELEM, NELMAX, NPOIN, NPTFR, IELM, LIHBOR, KLOG, ISEG, T1, T2, T3, NELEBX, NELEB)
Definition: elebd.f:9
Definition: bief.f:3