The TELEMAC-MASCARET system  trunk
voisin.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE voisin
3 ! *****************
4 !
5  &(ifabor,nelem,nelmax,ielm,ikle,sizikl,
6  & npoin,nachb,nbor,nptfr,iadr,nvois)
7 !
8 !***********************************************************************
9 ! BIEF V6P1 21/08/2010
10 !***********************************************************************
11 !
12 !brief BUILDS THE ARRAY IFABOR, WHERE IFABOR(IELEM, IFACE) IS
13 !+ THE GLOBAL NUMBER OF THE NEIGHBOUR OF SIDE IFACE OF
14 !+ ELEMENT IELEM (IF THIS NEIGHBOUR EXISTS) AND 0 IF THE
15 !+ SIDE IS ON THE DOMAIN BOUNDARY.
16 !
17 !history OLIVIER BOITEAU (SINETICS)
18 !+ 19/02/08
19 !+
20 !+ SIZE OF NACHB
21 !
22 !history J-M HERVOUET (LNHE)
23 !+ 16/06/08
24 !+ V5P9
25 !+ MODIFICATION TO THE MAX NUMBER OF NEIGHBOURS
26 !
27 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
28 !+ 13/07/2010
29 !+ V6P0
30 !+ Translation of French comments within the FORTRAN sources into
31 !+ English comments
32 !
33 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
34 !+ 21/08/2010
35 !+ V6P0
36 !+ Creation of DOXYGEN tags for automated documentation and
37 !+ cross-referencing of the FORTRAN sources
38 !
39 !history S.E.BOURBAN (HRW)
40 !+ 21/03/2017
41 !+ V7P3
42 !+ Replacement of the DATA declarations by the PARAMETER associates
43 !
44 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
45 !| IADR |<->| WORK ARRAY
46 !| IELM |-->| 11: TRIANGLES
47 !| | | 21: QUADRILATERALS
48 !| IFABOR |-->| ELEMENTS BEHIND THE EDGES OF A TRIANGLE
49 !| | | IF NEGATIVE OR ZERO, THE EDGE IS A LIQUID
50 !| | | BOUNDARY
51 !| IKLE |-->| CONNECTIVITY TABLE.
52 !| NACHB |-->| SUB-DOMAINS NEIGHBOURS OF INTERFACE POINTS IN PARALLEL
53 !| NBOR |-->| GLOBAL NUMBER OF BOUNDARY POINTS
54 !| NELEM |-->| NUMBER OF ELEMENTS
55 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS
56 !| NPOIN |-->| NUMBER OF POINTS
57 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
58 !| NVOIS |<--| NUMBER OF NEIGHBOURS OF POINTS
59 !| SIZIKL |-->| FIRST DIMENSION OF IKLE
60 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
61 !
62  USE bief, ex_voisin => voisin
63 !
65  IMPLICIT NONE
66 !
67 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
68 !
69  INTEGER, INTENT(IN) :: NPTFR,SIZIKL,NELEM,NELMAX,IELM,NPOIN
70  INTEGER, INTENT(IN) :: NBOR(nptfr),NACHB(nbmaxnshare,nptir)
71  INTEGER, INTENT(IN) :: IKLE(sizikl,*)
72  INTEGER, INTENT(INOUT) :: IFABOR(nelmax,*)
73  INTEGER, INTENT(INOUT) :: NVOIS(npoin),IADR(npoin)
74 !
75 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
76 !
77  INTEGER NFACE,NDP,KEL,IMAX,IFACE,IELEM,M1,M2,IV,IELEM2,IFACE2
78  INTEGER I,J,ERR,IR1,IR2,IR3,IR4,I1,I2,IDIMAT
79 !
80  INTEGER :: SOMFAC(2,4,2)
81  parameter( somfac = reshape( (/
82  & 1,2 , 2,3 , 3,1 , 0,0 ,
83  & 1,2 , 2,3 , 3,4 , 4,1 /), shape=(/ 2,4,2 /) ) )
84 !
85 ! DYNAMICALLY ALLOCATES THE WORKING ARRAYS
86 !
87  INTEGER, DIMENSION(:), ALLOCATABLE :: MAT1,MAT2,MAT3
88 !
89 !-----------------------------------------------------------------------
90 !
91  IF(ielm.EQ.21) THEN
92 ! QUADRILATERALS
93  nface = 4
94 ! NUMBER OF POINTS PER ELEMENT
95  ndp = 4
96 ! ADDRESS IN SOMFAC
97  kel = 2
98  ELSEIF(ielm.EQ.11.OR.ielm.EQ.41.OR.ielm.EQ.51) THEN
99 ! TRIANGLES
100  nface = 3
101 ! NUMBER OF POINTS PER ELEMENT
102  ndp = 3
103 ! ADDRESS IN SOMFAC
104  kel = 1
105  ELSE
106  WRITE(lu,99) ielm
107 99 FORMAT(1x,'VOISIN: IELM=',1i6,' TYPE OF ELEMENT NOT AVAILABLE')
108  CALL plante(1)
109  stop
110  ENDIF
111 !
112 ! IDIMAT IS BIGGER THAN THE SUM OF THE NUMBER OF NEIGHBOURS OF
113 ! ALL THE POINTS (NEIGHBOUR = CONNECTED BY A SEGMENT)
114 !
115  idimat = ndp*2*nelem
116 !
117  ALLOCATE(mat1(idimat),stat=err)
118  ALLOCATE(mat2(idimat),stat=err)
119  ALLOCATE(mat3(idimat),stat=err)
120 !
121  IF(err.NE.0) THEN
122  WRITE(lu,2000) err
123 2000 FORMAT(1x,'VOISIN: ERROR DURING ALLOCATION OF MEMORY: ',/,1x,
124  & 'ERROR CODE: ',1i6)
125  CALL plante(1)
126  stop
127  ENDIF
128 !
129 !-----------------------------------------------------------------------
130 !
131 ! ARRAY NVOIS FOR EACH POINT
132 ! BEWARE : NVOIS IS BIGGER THAN THE ACTUAL NUMBER OF NEIGHBOURS
133 ! THE SUM OF NVOIS WILL GIVE IDIMAT
134 !
135  DO i=1,npoin
136  nvois(i) = 0
137  ENDDO
138 !
139  DO iface = 1,nface
140  DO ielem=1,nelem
141  i1 = ikle( ielem , somfac(1,iface,kel) )
142  i2 = ikle( ielem , somfac(2,iface,kel) )
143  nvois(i1) = nvois(i1) + 1
144  nvois(i2) = nvois(i2) + 1
145  ENDDO
146  ENDDO
147 !
148 !-----------------------------------------------------------------------
149 !
150 ! ADDRESSES OF EACH POINT IN A STRUCTURE OF TYPE COMPACT MATRIX
151 !
152 !
153  iadr(1) = 1
154  DO i= 2,npoin
155  iadr(i) = iadr(i-1) + nvois(i-1)
156  ENDDO ! I
157 !
158  imax = iadr(npoin) + nvois(npoin) - 1
159  IF(imax.GT.idimat) THEN
160  WRITE(lu,52) idimat,imax
161 52 FORMAT(1x,'VOISIN: SIZE OF MAT1,2,3 (',1i9,') TOO SHORT',/,
162  & 1x,'MINIMUM SIZE: ',1i9)
163  CALL plante(1)
164  stop
165  ENDIF
166 !
167 !-----------------------------------------------------------------------
168 !
169 ! INITIALISES THE COMPACT MATRIX TO 0
170 !
171  DO i=1,imax
172  mat1(i) = 0
173  ENDDO
174 !
175 !-----------------------------------------------------------------------
176 !
177 ! LOOP ON THE SIDES OF EACH ELEMENT:
178 !
179  DO iface = 1 , nface
180  DO ielem = 1 , nelem
181 !
182  ifabor(ielem,iface) = -1
183 !
184 ! GLOBAL NODE NUMBERS FOR THE SIDE:
185 !
186  i1 = ikle( ielem , somfac(1,iface,kel) )
187  i2 = ikle( ielem , somfac(2,iface,kel) )
188 !
189 ! ORDERED GLOBAL NUMBERS:
190 !
191  m1 = min0(i1,i2)
192  m2 = max0(i1,i2)
193 !
194  DO iv = 1,nvois(m1)
195 !
196  IF(mat1(iadr(m1)+iv-1).EQ.0) THEN
197  mat1(iadr(m1)+iv-1)=m2
198  mat2(iadr(m1)+iv-1)=ielem
199  mat3(iadr(m1)+iv-1)=iface
200  GO TO 81
201  ELSEIF(mat1(iadr(m1)+iv-1).EQ.m2) THEN
202  ielem2 = mat2(iadr(m1)+iv-1)
203  iface2 = mat3(iadr(m1)+iv-1)
204  ifabor(ielem,iface) = ielem2
205  ifabor(ielem2,iface2) = ielem
206  GO TO 81
207  ENDIF
208 !
209  ENDDO ! IV
210 !
211  WRITE(lu,83)
212 83 FORMAT(1x,'VOISIN : ERROR IN THE MESH ',/,1x,
213  & ' MAYBE SUPERIMPOSED POINTS ')
214  CALL plante(1)
215  stop
216 !
217 81 CONTINUE
218 !
219  ENDDO ! IELEM
220  ENDDO ! IFACE
221 !
222 ! COULD TRY SOMETHING A BIT LIGHTER
223 ! USING INDPU FOR EXAMPLE
224 !
225  IF(ncsize.GT.1) THEN
226 !
227  DO iface=1,nface
228  DO ielem=1,nelem
229 !
230 ! SOME BOUNDARY SIDES ARE INTERFACES BETWEEN SUB-DOMAINS IN
231 ! ACTUAL FACT: THEY ARE ASSIGNED A VALUE -2 INSTEAD OF -1
232 !
233  IF(ifabor(ielem,iface).EQ.-1) THEN
234 !
235  i1 = ikle( ielem , somfac(1,iface,kel) )
236  i2 = ikle( ielem , somfac(2,iface,kel) )
237 !
238  ir1=0
239  ir2=0
240 !
241  IF(nptir.GT.0) THEN
242  DO j=1,nptir
243  IF(i1.EQ.nachb(1,j)) ir1=1
244  IF(i2.EQ.nachb(1,j)) ir2=1
245  ENDDO ! J
246  ENDIF
247 !
248  IF(ir1.EQ.1.AND.ir2.EQ.1) THEN
249 ! INTERFACE SEGMENT DETECTED, CHECKS WHETHER IT IS NOT
250 ! ALSO A TRUE BOUNDARY SIDE
251  ir3=0
252  ir4=0
253  DO j=1,nptfr
254  IF(i1.EQ.nbor(j)) ir3=1
255  IF(i2.EQ.nbor(j)) ir4=1
256  ENDDO ! J
257 ! PRIORITY TO THE TRUE BOUNDARY SIDES
258  IF(ir3.EQ.0.OR.ir4.EQ.0) THEN
259  ifabor(ielem,iface)=-2
260  ENDIF
261  ENDIF
262 !
263  ENDIF
264 !
265  ENDDO ! IELEM
266  ENDDO ! IFACE
267 !
268  ENDIF
269 !
270 !-----------------------------------------------------------------------
271 !
272  DEALLOCATE(mat1)
273  DEALLOCATE(mat2)
274  DEALLOCATE(mat3)
275 !
276 !-----------------------------------------------------------------------
277 !
278  RETURN
279  END
subroutine voisin(IFABOR, NELEM, NELMAX, IELM, IKLE, SIZIKL, NPOIN, NACHB, NBOR, NPTFR, IADR, NVOIS)
Definition: voisin.f:8
Definition: bief.f:3