The TELEMAC-MASCARET system  trunk
centre_mass_seg.f
Go to the documentation of this file.
1 ! **************************
2  SUBROUTINE centre_mass_seg
3 ! **************************
4 !
5  &(x,y,coord_g,ikle,npoin,eltseg,oriseg,nelem,nseg,jmi,cmi,gloseg,
6  & ifabor,mesh)
7 !
8 !***********************************************************************
9 ! BIEF V6P3 18/12/2012
10 !***********************************************************************
11 !
12 !brief GIVES COORDINATES OF CENTRE OF GRAVITY OF TRIANGLES RIGHT AND
13 ! LEFT OF SEGMENTS I.E. FOR A SEGMENT ISEG:
14 ! - COORD_G(1,ISEG) AND COORD_G(2,ISEG) ARE THE COORDINATES OF
15 ! THE CENTRE OF GRAVITY OF THE FIRST NEIGHBORING TRIANGLE
16 ! - COORD_G(3,ISEG) AND COORD_G(4,ISEG) ARE THE COORDINATES OF
17 ! THE CENTRE OF GRAVITY OF THE SECOND NEIGHBORING TRIANGLE
18 ! GIVES COORDINATES OF THE MIDDLE POINT OF SEGMENT G1G2 (STOCKED
19 ! AT CMI(1,ISEG) AND CMI(2,ISEG)) AND THE ELEMENT NUMBER TO
20 ! TO WHICH BELONGS CMI
21 !
22 !history R.ATA
23 !+ 18/12/12
24 !+ V6P3
25 !+
26 !history R. ATA & J-M HERVOUET
27 !+ 19/11/2013
28 !+ V6P3
29 !+ Optimisation and simplification.
30 !
31 !history R. ATA & J-M HERVOUET
32 !+ 01/12/2013
33 !+ V6P3
34 !+ add verification tests
35 !
36 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
37 !| CMI |<--| COORDINATES OF MID-INTERFACE POINTS
38 !| COORD_G |<--| CENTER OF MASS OF ELEMENTS NEIGHBORS OF AN EDGE
39 !| | | COORD_G(1,ISEG) AND COORD_G(2,ISEG) ARE X1 AND Y1
40 !| | | COORD_G(3,ISEG) AND COORD_G(4,ISEG) ARE X2 AND Y2
41 !| ELTSEG |-->| SEGMENTS FORMING AN ELEMENT
42 !| GLOSEG |-->| GLOBAL NUMBERS OF VERTICES OF SEGMENTS
43 !| IKLE |-->| CONNECTIVITY TABLE.
44 !| IFABOR |-->| IFABOR(IEL,I) IS THE ELEMENT BEHIND THE EDGE I OF
45 !| |---| ELEMENT IEL, OTHERWISE
46 !| |---| IFABOR(IEL,I) = -2 : THIS IS INTERFACE EDGE
47 !| |---| IFABOR(IEL,I) = 0 : THIS IS BOUNDARY EDGE
48 !| |---| IFABOR(IEL,I) = -1 : THIS IS LIQUID BOUNDARY EDGE
49 !| JMI |<--| NUMBER OF TRIANGLE TO WHICH BELONGS THE
50 !| | | MID-INTERFACE POINT.
51 !| MESH |-->| MESH STRUCTURE
52 !| NELEM |-->| NUMBER OF ELEMENTS
53 !| NPOIN |-->| NUMBER OF POINTS
54 !| NSEG |-->| NUMBER OF SEGMENTS
55 !| |---|
56 !| ORISEG |-->| ORIENTATION OF SEGMENTS FORMING AN
57 !| | | ELEMENT 1:ANTI 2:CLOCKWISE
58 !| X |-->| ABSCISSAE OF POINTS IN THE MESH
59 !| Y |-->| ORDINATES OF POINTS IN THE MESH
60 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
61 !
62  USE bief, ONLY : inpoly
63  USE bief_def
64  IMPLICIT NONE
65 !
66 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
67 !
68  INTEGER, INTENT(IN) :: NSEG,NELEM,NPOIN
69  INTEGER, INTENT(IN) :: IKLE(nelem,3)
70  INTEGER, INTENT(IN) :: ELTSEG(nelem,3)
71  INTEGER, INTENT(IN) :: ORISEG(nelem,3)
72  INTEGER, INTENT(INOUT) :: JMI(nseg)
73  INTEGER, INTENT(IN) :: GLOSEG(nseg,2)
74  DOUBLE PRECISION, INTENT(INOUT) :: CMI(2,nseg)
75  DOUBLE PRECISION, INTENT(INOUT) :: COORD_G(nseg,4)
76  DOUBLE PRECISION, INTENT(IN) :: X(npoin),Y(npoin)
77  INTEGER, INTENT(IN) :: IFABOR(nelem,3)
78  TYPE(bief_mesh), INTENT(INOUT) :: MESH
79 !
80 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
81 !
82  INTEGER ISEG,NB1,NB2,IELEM,I,I1,I2,I3
83  DOUBLE PRECISION XEL,YEL,XG1,XG2,YG1,YG2,XSOM(3),YSOM(3)
84  DOUBLE PRECISION X_MIDPOINT,Y_MIDPOINT,DET
85  DOUBLE PRECISION, ALLOCATABLE :: TMP_CMI1(:), TMP_CMI2(:)
86 !
87 !-----------------------------------------------------------------------
88 ! INITIALIZATION OF VARIABLES
89 !
90  DO i=1,nseg
91  coord_g(i,1) = 0.d0
92  coord_g(i,2) = 0.d0
93  coord_g(i,3) = 0.d0
94  coord_g(i,4) = 0.d0
95  cmi(1,i) = 0.d0
96  cmi(2,i) = 0.d0
97  jmi(i) = 0
98  ENDDO
99  IF(ncsize.GT.1)THEN
100  DO i=1,nseg
101  mesh%MSEG%X%R(i)=0.d0
102  ENDDO
103  ENDIF
104 ! RECUPERATE THE COORDINATES OF CENTER OF GRAVITY OF THE TRIANGLES
105 ! AT THE RIGHT AND AT THE LEFT OF THE SEGMENT BETWEEN TWO NODES
106 !
107  DO ielem=1, nelem
108  i1 = ikle(ielem,1)
109  i2 = ikle(ielem,2)
110  i3 = ikle(ielem,3)
111  xel = (x(i1)+x(i2)+x(i3))/3.0d0
112  yel = (y(i1)+y(i2)+y(i3))/3.0d0
113  DO i = 1,3
114  iseg = eltseg(ielem,i)
115  IF(oriseg(ielem,i).EQ.1)THEN ! G IS LEFT OF THE EDGE
116  coord_g(iseg,1) =xel
117  coord_g(iseg,2) =yel
118  ELSEIF(oriseg(ielem,i).EQ.2)THEN !G IS RIGHT OF THE EDGE
119  coord_g(iseg,3) =xel
120  coord_g(iseg,4) =yel
121  ENDIF
122  ENDDO
123  ENDDO
124 !
125  IF(ncsize.GT.1) THEN
126  CALL parcom2_seg(coord_g(1,1),
127  & coord_g(1,2),
128  & coord_g(1,2), ! NO EFFECT FOR THIS ONE
129  & nseg,1,1,2,mesh,1,11)
130 !
131  CALL parcom2_seg(coord_g(1,3),
132  & coord_g(1,4),
133  & coord_g(1,4), ! NO EFFECT FOR THIS ONE
134  & nseg,1,1,2,mesh,1,11)
135 
136  ENDIF
137 !
138 ! SECOND PART:
139 ! RETRIEVE CMI: CMI(1,ISEG) AND CMI(2,ISEG) ARE X AND Y OF THE
140 ! MID-POINT G1G2
141 ! RETRIEVE JMI: JMI(ISEG) IS THE NUMBER IF TRIANGLE TO WHICH
142 ! BELONGS CMI
143 !
144  DO ielem=1,nelem
145  DO i = 1,3
146  iseg = eltseg(ielem,i)
147  nb1 = gloseg(iseg,1)
148  nb2 = gloseg(iseg,2)
149  xg1 = coord_g(iseg,1)
150  yg1 = coord_g(iseg,2)
151  xg2 = coord_g(iseg,3)
152  yg2 = coord_g(iseg,4)
153  ! CENTER OF SEGMENT G1G2
154  x_midpoint = 0.5d0*(xg1+xg2)
155  y_midpoint = 0.5d0*(yg1+yg2)
156  cmi(1,iseg) = x_midpoint
157  cmi(2,iseg) = y_midpoint
158  ! JMI: IN WHICH ELEMENT IS CMI
159  ! WE USE CROSS PRODUCT
160  xsom(1)=x(nb1)
161  xsom(2)=x(nb2)
162  ysom(1)=y(nb1)
163  ysom(2)=y(nb2)
164 
165  det = (xsom(2)-xsom(1))*(y_midpoint-ysom(1))
166  & -(ysom(2)-ysom(1))*(x_midpoint-xsom(1))
167 
168  IF(oriseg(ielem,i).EQ.2) det = -det
169 ! BE CARREFUL FIXME:
170 ! - IN CASE OF ISEG IS AT THE INTERFACE OF THE TRIANGLE
171 ! EACH SUBDOMAIN WILL SEE IT
172  IF(det.GE.0.d0) THEN
173  jmi(iseg) = ielem
174  ENDIF
175  ENDDO
176  ENDDO
177 !
178 ! FOR PARALLELISM
179 !
180  IF(ncsize.GT.1) THEN
181 ! TODO: Manually creating temporary array
182  ALLOCATE(tmp_cmi1(nseg))
183  ALLOCATE(tmp_cmi2(nseg))
184  tmp_cmi1 = cmi(1,1:nseg)
185  tmp_cmi2 = cmi(2,1:nseg)
186  CALL parcom2_seg(tmp_cmi1,
187  & tmp_cmi2,
188  & cmi,
189  & nseg,1,1,2,mesh,1,11)
190  cmi(1,1:nseg) = tmp_cmi1
191  cmi(2,1:nseg) = tmp_cmi2
192  DEALLOCATE(tmp_cmi1)
193  DEALLOCATE(tmp_cmi2)
194  ENDIF
195 !
196 ! BOUNDARY SEGMENTS
197 !
198  DO ielem=1,nelem
199  i1 = ikle(ielem,1)
200  i2 = ikle(ielem,2)
201  i3 = ikle(ielem,3)
202  DO i = 1,3
203  iseg = eltseg(ielem,i)
204  IF(ifabor(ielem,i).EQ.-1.OR. ifabor(ielem,i).EQ. 0) THEN
205 ! BOUNDARY SEGMENT
206  nb1=gloseg(iseg,1)
207  nb2=gloseg(iseg,2)
208 ! CMI
209  cmi(1,iseg)=0.5d0*(x(nb1)+x(nb2))
210  cmi(2,iseg)=0.5d0*(y(nb1)+y(nb2))
211 ! JMI
212  jmi(iseg)=ielem
213 ! ISEG HAS BEEN TREATED
214  ENDIF
215  ENDDO
216  ENDDO
217 !
218 ! TO VERIFY THAT IT IS WELL DONE
219 !
220  IF(ncsize.LE.1)THEN
221  DO iseg=1,nseg
222  IF(jmi(iseg).EQ.0)THEN
223  WRITE(lu,*)'CENTRE_MASS_SEG: PROBLEM JMI NOT GOOD'
224  WRITE(lu,*)'FOR SEGMENT :',iseg
225  WRITE(lu,*)'PTS SEG',gloseg(iseg,1),gloseg(iseg,2)
226  CALL plante(1)
227  stop
228  ENDIF
229  ENDDO
230  ENDIF
231 !
232 !---------------------------------------------------------------------
233 !
234  RETURN
235  END
236 
subroutine parcom2_seg(X1, X2, X3, NSEG, NPLAN, ICOM, IAN, MESH, OPT, IELM)
Definition: parcom2_seg.f:7
integer ncsize
Definition: bief_def.f:49
logical function inpoly(X, Y, XSOM, YSOM, NSOM)
Definition: inpoly.f:7
subroutine centre_mass_seg(X, Y, COORD_G, IKLE, NPOIN, ELTSEG, ORISEG, NELEM, NSEG, JMI, CMI, GLOSEG, IFABOR, MESH)
Definition: bief.f:3