The TELEMAC-MASCARET system  trunk
segbor.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE segbor
3 ! *****************
4 !
5  &(nsegbor,ikles,nelem,npoin)
6 !
7 !***********************************************************************
8 ! BIEF V6P3 21/08/2010
9 !***********************************************************************
10 !
11 !brief DETERMINES THE NUMBER OF BOUNDARY SEGMENTS OF THE MESH
12 !+ (INCLUDES INTERNAL BOUNDARIES IN PARALLEL MODE).
13 !+
14 !+ BASED UPON THE PRINCIPLE OF VOISIN,
15 !+ WHICH WILL BE CALLED LATER.
16 !
17 !history J-M HERVOUET (LNHE)
18 !+ 19/06/2008
19 !+ V5P9
20 !+
21 !
22 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
23 !+ 13/07/2010
24 !+ V6P0
25 !+ Translation of French comments within the FORTRAN sources into
26 !+ English comments
27 !
28 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
29 !+ 21/08/2010
30 !+ V6P0
31 !+ Creation of DOXYGEN tags for automated documentation and
32 !+ cross-referencing of the FORTRAN sources
33 !
34 !history J-M HERVOUET (EDF R&D, LNHE)
35 !+ 07/02/2013
36 !+ V6P3
37 !+ Removing argument NELMAX.
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 !| IKLES |-->| LIKE CONNECTIVITY TABLE BUT IN SELAFIN FORMAT
46 !| | | IKLES(3,NELEM) INSTEAD OF IKLE(NELEM,3)
47 !| NELEM |-->| NUMBER OF ELEMENTS
48 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS
49 !| NPOIN |-->| NUMBER OF POINTS
50 !| NSEGBOR |<--| NUMBER OF BOUNDARY SEGMENTS
51 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
52 !
53  USE bief, ex_segbor => segbor
54 !
56  IMPLICIT NONE
57 !
58 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
59 !
60  INTEGER, INTENT(IN) :: NPOIN,NELEM
61  INTEGER, INTENT(OUT) :: NSEGBOR
62  INTEGER, INTENT(IN) :: IKLES(3,nelem)
63 !
64 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
65 !
66  INTEGER NFACE,NDP,KEL,IMAX,IFACE,IELEM,M1,M2,IV,IELEM2,IFACE2
67  INTEGER I,ERR,I1,I2,IDIMAT
68  INTEGER :: SOMFAC(2,4,2)
69  parameter( somfac = reshape( (/
70  & 1,2 , 2,3 , 3,1 , 0,0 ,
71  & 1,2 , 2,3 , 3,4 , 4,1 /), shape=(/ 2,4,2 /) ) )
72 !
73 ! DYNAMICALLY ALLOCATES WORKING ARRAYS
74 !
75  INTEGER, ALLOCATABLE :: IFABOR(:,:),MAT1(:),MAT2(:),MAT3(:)
76  INTEGER, ALLOCATABLE :: NVOIS(:),IADR(:)
77 !
78 !-----------------------------------------------------------------------
79 !
80  nface = 3
81 ! NUMBER OF POINTS PER ELEMENT
82  ndp = 3
83 ! ADDRESS IN SOMFAC
84  kel = 1
85 !
86 ! IDIMAT IS BIGGER THAN THE SUM OF THE NUMBER OF NEIGHBOURS FOR
87 ! ALL THE POINTS (NEIGHBOUR = LINKED BY A SEGMENT)
88 !
89  idimat = ndp*2*nelem
90 !
91  ALLOCATE(mat1(idimat),stat=err)
92  ALLOCATE(mat2(idimat),stat=err)
93  ALLOCATE(mat3(idimat),stat=err)
94  ALLOCATE(ifabor(nelem,3),stat=err)
95  ALLOCATE(nvois(npoin),stat=err)
96  ALLOCATE(iadr(npoin),stat=err)
97 !
98  IF(err.NE.0) THEN
99  WRITE(lu,2000) err
100 2000 FORMAT(1x,'SEGBOR: ERROR DURING ALLOCATION OF MEMORY: ',/,1x,
101  & 'ERROR CODE: ',1i6)
102  CALL plante(1)
103  stop
104  ENDIF
105 !
106 !-----------------------------------------------------------------------
107 !
108 ! COMPUTES THE ARRAY NVOIS FOR EACH POINT
109 ! BEWARE : NVOIS IS BIGGER THAN THE NUMBER OF NEIGHBOURS
110 ! THE SUM OF NVOIS FOR ALL THE POINTS WILL GIVE IDIMAT
111 !
112  DO i=1,npoin
113  nvois(i) = 0
114  ENDDO
115 !
116  DO iface = 1,nface
117  DO ielem=1,nelem
118  i1 = ikles( somfac(1,iface,kel) , ielem )
119  i2 = ikles( somfac(2,iface,kel) , ielem )
120  nvois(i1) = nvois(i1) + 1
121  nvois(i2) = nvois(i2) + 1
122  ENDDO
123  ENDDO
124 !
125 !-----------------------------------------------------------------------
126 !
127 ! COMPUTES THE ADDRESSES OF EACH POINT IN A STRUCTURE OF TYPE
128 ! COMPACT MATRIX
129 !
130  iadr(1) = 1
131  DO i= 2,npoin
132  iadr(i) = iadr(i-1) + nvois(i-1)
133  ENDDO ! I
134 !
135  imax = iadr(npoin) + nvois(npoin) - 1
136  IF(imax.GT.idimat) THEN
137  WRITE(lu,52) idimat,imax
138 52 FORMAT(1x,'SEGBOR: SIZE OF MAT1,2,3 (',1i9,') TOO SHORT',/,
139  & 1x,'MINIMUM SIZE: ',1i9)
140  CALL plante(1)
141  stop
142  ENDIF
143 !
144 !-----------------------------------------------------------------------
145 !
146 ! INITIALISES THE COMPACT MATRIX TO 0
147 !
148  DO i=1,imax
149  mat1(i) = 0
150  ENDDO
151 !
152 !-----------------------------------------------------------------------
153 !
154 ! LOOP ON THE SIDES OF EACH ELEMENT:
155 !
156  DO iface = 1 , nface
157  DO ielem = 1 , nelem
158 !
159  ifabor(ielem,iface) = 0
160 !
161 ! GLOBAL NUMBERS OF THE POINTS OF THE SIDE:
162 !
163  i1 = ikles( somfac(1,iface,kel) , ielem )
164  i2 = ikles( somfac(2,iface,kel) , ielem )
165 !
166 ! ORDERED GLOBAL NUMBERS :
167 !
168  m1 = min(i1,i2)
169  m2 = max(i1,i2)
170 !
171  DO iv = 1,nvois(m1)
172 !
173  IF(mat1(iadr(m1)+iv-1).EQ.0) THEN
174  mat1(iadr(m1)+iv-1)=m2
175  mat2(iadr(m1)+iv-1)=ielem
176  mat3(iadr(m1)+iv-1)=iface
177  GO TO 81
178  ELSEIF(mat1(iadr(m1)+iv-1).EQ.m2) THEN
179  ielem2 = mat2(iadr(m1)+iv-1)
180  iface2 = mat3(iadr(m1)+iv-1)
181  ifabor(ielem,iface) = ielem2
182  ifabor(ielem2,iface2) = ielem
183  GO TO 81
184  ENDIF
185 !
186  ENDDO ! IV
187 !
188  WRITE(lu,83)
189 83 FORMAT(1x,'SEGBOR : ERROR IN THE MESH ',/,1x,
190  & ' MAYBE SUPERIMPOSED POINTS ')
191  CALL plante(1)
192  stop
193 !
194 81 CONTINUE
195 !
196  ENDDO ! IELEM
197  ENDDO ! IFACE
198 !
199  nsegbor = 0
200  DO iface=1,nface
201  DO ielem=1,nelem
202  IF(ifabor(ielem,iface).EQ.0) nsegbor=nsegbor+1
203  ENDDO
204  ENDDO
205 !
206  WRITE(lu,501) nsegbor
207 501 FORMAT(1x,'SEGBOR (BIEF) : NUMBER OF BOUNDARY SEGMENTS = ',1i6,/,
208  & 1x,'INCLUDING THOSE DUE TO DOMAIN DECOMPOSITION')
209 !
210 !-----------------------------------------------------------------------
211 !
212  DEALLOCATE(mat1)
213  DEALLOCATE(mat2)
214  DEALLOCATE(mat3)
215  DEALLOCATE(ifabor)
216  DEALLOCATE(nvois)
217  DEALLOCATE(iadr)
218 !
219 !-----------------------------------------------------------------------
220 !
221  RETURN
222  END
subroutine segbor(NSEGBOR, IKLES, NELEM, NPOIN)
Definition: segbor.f:7
Definition: bief.f:3