The TELEMAC-MASCARET system  trunk
stoseg.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE stoseg
3 ! *****************
4 !
5  &(ifabor,nelem,nelmax,nelmax2,ielm,ikle,nbor,nptfr,
6  & gloseg,maxseg,eltseg,oriseg,nseg,nelbor,nulone,knolg,
7  & iklbor,nelebx,neleb)
8 !
9 !***********************************************************************
10 ! BIEF V7P0 21/08/2010
11 !***********************************************************************
12 !
13 !brief BUILDS THE DATA STRUCTURE FOR EDGE-BASED STORAGE.
14 !
15 !history J-M HERVOUET (LNH)
16 !+ 02/10/08
17 !+ V5P9
18 !+
19 !
20 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
21 !+ 13/07/2010
22 !+ V6P0
23 !+ Translation of French comments within the FORTRAN sources into
24 !+ English comments
25 !
26 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
27 !+ 21/08/2010
28 !+ V6P0
29 !+ Creation of DOXYGEN tags for automated documentation and
30 !+ cross-referencing of the FORTRAN sources
31 !
32 !history J-M HERVOUET (EDF LAB, LNHE)
33 !+ 13/03/2014
34 !+ V7P0
35 !+ Now written to enable different numbering of boundary points and
36 !+ boundary segments.
37 !
38 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
39 !| ELTSEG |<--| SEGMENTS OF EVERY TRIANGLE.
40 !| GLOSEG |<--| GLOBAL NUMBERS OF POINTS OF SEGMENTS.
41 !| IELM |-->| 11: TRIANGLES.
42 !| | | 21: QUADRILATERALS.
43 !| IFABOR |-->| ELEMENTS BEHIND THE EDGES OF A TRIANGLE
44 !| | | IF NEGATIVE OR ZERO, THE EDGE IS A LIQUID
45 !| | | BOUNDARY
46 !| IKLE |-->| CONNECTIVITY TABLE.
47 !| KNOLG |-->| GLOBAL NUMBER OF A LOCAL POINT IN PARALLEL
48 !| MAXSEG |<--| MAXIMUM NUMBER OF SEGMENTS
49 !| NBOR |-->| GLOBAL NUMBERS OF BOUNDARY POINTS.
50 !| NELBOR |-->| NUMBER OF ELEMENT CONTAINING SEGMENT K OF
51 !| | | THE BOUNDARY.
52 !| NELEM |-->| NUMBER OF ELEMENTS IN THE MESH
53 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS IN 3D
54 !| NELMAX2 |-->| MAXIMUM NUMBER OF ELEMENTS IN 2D
55 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS.
56 !| NSEG |<--| NUMBER OF SEGMENTS OF THE MESH.
57 !| NULONE |-->| LOCAL NUMBER OF BOUNDARY POINTS IN A BOUNDARY
58 !| | | ELEMENT.
59 !| ORISEG |<--| ORIENTATION OF SEGMENTS OF EVERY TRIANGLE.
60 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
61 !
62  USE bief, ex_stoseg => stoseg
63 !
65  IMPLICIT NONE
66 !
67 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
68 !
69  INTEGER, INTENT(IN) :: NELMAX,NELMAX2,NPTFR,NSEG,MAXSEG,IELM
70  INTEGER, INTENT(IN) :: NELEM,NELEBX,NELEB
71  INTEGER, INTENT(IN) :: NBOR(nptfr)
72  INTEGER, INTENT(IN) :: IFABOR(nelmax2,*),IKLE(nelmax,*)
73  INTEGER, INTENT(IN) :: NELBOR(*),NULONE(*)
74  INTEGER, INTENT(IN) :: IKLBOR(nelebx,2)
75  INTEGER, INTENT(INOUT) :: GLOSEG(maxseg,2)
76  INTEGER, INTENT(INOUT) :: ELTSEG(nelmax,*),ORISEG(nelmax,3)
77  INTEGER, INTENT(IN) :: KNOLG(*)
78 !
79 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
80 !
81  INTEGER NSE,IELEB
82 !
83  INTEGER NEL,IFA,I1,I2,J1,J2,IFACE,JFACE,IG1,IG2
84  INTEGER IELEM,IELEM1,IELEM2
85 !
86  INTEGER :: NEXT(3)
87  parameter( next = (/ 2,3,1 /) )
88 !
89 !-----------------------------------------------------------------------
90 !
91  IF(ielm.NE.11.AND.ielm.NE.12.AND.ielm.NE.13.AND.ielm.NE.14) THEN
92  WRITE(lu,501) ielm
93 501 FORMAT(1x,'STOSEG (BIEF) : UNEXPECTED ELEMENT: ',1i6)
94  CALL plante(1)
95  stop
96  ENDIF
97 !
98 ! INITIALISES ELTSEG
99 !
100  DO ielem = 1 , nelem
101  eltseg(ielem,1) = 0
102  eltseg(ielem,2) = 0
103  eltseg(ielem,3) = 0
104  ENDDO
105 !
106 !-----------------------------------------------------------------------
107 !
108 ! LOOP ON BOUNDARY POINTS :
109 !
110  DO ieleb = 1 , neleb
111 !
112 ! NOTE: ON BOUNDARIES, SEGMENTS ARE NOT ORIENTED LOWER RANK
113 ! TO HIGHER RANK, AS IS DONE FOR INTERNAL SEGMENTS
114  gloseg(ieleb,1) = nbor(iklbor(ieleb,1))
115  gloseg(ieleb,2) = nbor(iklbor(ieleb,2))
116  nel = nelbor(ieleb)
117  ifa = nulone(ieleb)
118  eltseg(nel,ifa) = ieleb
119  oriseg(nel,ifa) = 1
120 !
121  ENDDO
122 !
123  nse=neleb
124 !
125 !-----------------------------------------------------------------------
126 !
127 ! LOOP ON ELEMENTS FOR NUMBERING INTERNAL SEGMENTS AND FILLING:
128 ! GLOSEG, ELTSEG, ORISEG
129 !
130  DO ielem1 = 1 , nelem
131  DO iface = 1 , 3
132  IF(eltseg(ielem1,iface).EQ.0) THEN
133 ! NEW SEGMENT (HENCE INTERNAL SO IFABOR<>0)
134  nse = nse + 1
135 ! BOTH NEIGHBOURING ELEMENTS ARE TREATED FOR THIS SEGMENT
136  i1 = ikle(ielem1, iface)
137  i2 = ikle(ielem1,next(iface))
138  IF(i1.EQ.i2) THEN
139  WRITE(lu,*) 'STOSEG: EDGE MADE OF ONLY ONE POINT'
140  WRITE(lu,*) ' ELEMENT ',ielem1,' FACE ',iface
141  CALL plante(1)
142  stop
143  ENDIF
144  eltseg(ielem1,iface) = nse
145  IF(ncsize.GT.1) THEN
146  ig1=knolg(i1)
147  ig2=knolg(i2)
148  ELSE
149  ig1=i1
150  ig2=i2
151  ENDIF
152 ! SEGMENT ORIENTED LOWER RANK TO HIGHER RANK
153  IF(ig1.LT.ig2) THEN
154  gloseg(nse,1) = i1
155  gloseg(nse,2) = i2
156  oriseg(ielem1,iface) = 1
157  ELSE
158  gloseg(nse,1) = i2
159  gloseg(nse,2) = i1
160  oriseg(ielem1,iface) = 2
161  ENDIF
162 ! OTHER ELEMENT NEIGHBOURING THIS SEGMENT
163  ielem2 = ifabor(ielem1,iface)
164 ! IELEM2 = 0 OR -1 MAY OCCUR IN PARALLEL MODE
165  IF(ielem2.GT.0) THEN
166 ! LOOKS FOR THE RIGHT SIDE OF ELEMENT IELEM2
167  DO jface = 1,3
168  j1 = ikle(ielem2, jface)
169  j2 = ikle(ielem2,next(jface))
170 ! ALL ELEMENTS HAVE A COUNTER-CLOCKWISE NUMBERING
171  IF(i1.EQ.j2.AND.i2.EQ.j1) THEN
172  eltseg(ielem2,jface) = nse
173  oriseg(ielem2,jface) = 3-oriseg(ielem1,iface)
174 ! SIDE FOUND, NO NEED TO GO ON
175  GO TO 1000
176  ELSEIF(i1.EQ.j1.AND.i2.EQ.j2) THEN
177 ! SIDE BADLY ORIENTED
178  WRITE(lu,*) 'STOSEG: WRONG MESH'
179  WRITE(lu,*) ' FACE ',jface
180  WRITE(lu,*) ' OF ELEMENT ',ielem2
181  WRITE(lu,*) ' IS NOT WELL ORIENTED'
182  WRITE(lu,*) ' (POINTS ',i1,' AND ',i2,')'
183  CALL plante(1)
184  stop
185  ENDIF
186  ENDDO
187 ! SIDE NOT FOUND, THIS IS AN ERROR
188  WRITE(lu,*) 'STOSEG: WRONG MESH'
189  WRITE(lu,*) ' ELEMENTS ',ielem1,' AND ',ielem2
190  WRITE(lu,*) ' LINKED BY POINTS ',i1,' AND ',i2
191  WRITE(lu,*) ' BUT THESE POINTS ARE NOT AN EDGE'
192  WRITE(lu,*) ' OF ELEMENT ',ielem2
193  CALL plante(1)
194  stop
195  ENDIF
196 1000 CONTINUE
197  ENDIF
198  ENDDO
199  ENDDO
200 !
201 !-----------------------------------------------------------------------
202 !
203 ! CHECKS
204 !
205  IF(nseg.NE.nse) THEN
206  WRITE(lu,503) nse,nseg
207 503 FORMAT(1x,'STOSEG (BIEF): WRONG NUMBER OF SEGMENTS : ',1i6,
208  & ' INSTEAD OF ',1i6,' EXPECTED')
209  CALL plante(1)
210  stop
211  ENDIF
212 !
213 !-----------------------------------------------------------------------
214 !
215  RETURN
216  END
subroutine stoseg(IFABOR, NELEM, NELMAX, NELMAX2, IELM, IKLE, NBOR, NPTFR, GLOSEG, MAXSEG, ELTSEG, ORISEG, NSEG, NELBOR, NULONE, KNOLG, IKLBOR, NELEBX, NELEB)
Definition: stoseg.f:9
Definition: bief.f:3