The TELEMAC-MASCARET system  trunk
normab.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE normab
3 ! *****************
4 !
5  &(xnebor,ynebor,xsgbor,ysgbor,disbor,surfac,nelmax,
6  & nelbor,nulone,lgseg,nptfr,mesh,xel,yel,iklbor,nelebx,neleb)
7 !
8 !***********************************************************************
9 ! BIEF V7P0 21/08/2010
10 !***********************************************************************
11 !
12 !warning XSGBOR(*,2) and XSGBOR(*,4) should not be used anymore
13 !+ could be removed (with care...).
14 !
15 !brief 1) COMPUTES THE COMPONENTS OF THE OUTGOING NORMAL VECTOR
16 !+
17 !+ - FOR THE BOUNDARY POINTS (XNEBOR,YNEBOR)
18 !+
19 !+ - FOR THE BOUNDARY SEGMENTS (XSGBOR,YSGBOR)
20 !+
21 !+ 2) DISTANCE TO THE BOUNDARY OF THE FIRST ELEMENT POINTS
22 !+
23 !+ 3) LENGTH OF THE BOUNDARY SEGMENTS
24 !+
25 !+ 4) DISTANCE TO THE BOUNDARY OF THE FIRST INTERNAL POINTS
26 !code
27 !+ BEWARE: XSGBOR AND YSGBOR DIMENSION IS (NPTFR,4):
28 !+
29 !+ (K,1) : NORMALISED , SEGMENT FOLLOWING K
30 !+ (K,2) : NORMALISED , SEGMENT PRECEDING K
31 !+ (K,3) : NOT NORMALISED, SEGMENT FOLLOWING K
32 !+ (K,4) : NOT NORMALISED, SEGMENT PRECEDING K
33 !+
34 !+ XSGBOR(K,1) AND YSGBOR(K,1) ARE THE COMPONENTS
35 !+ FOR THE SEGMENT FOLLOWING POINT K.
36 !+
37 !+ XSGBOR(K,2) AND YSGBOR(K,2) ARE THE COMPONENTS
38 !+ FOR THE SEGMENT PRECEDING POINT K.
39 !
40 !history J-M HERVOUET (LNHE)
41 !+ 26/06/2008
42 !+ V5P9
43 !+ Modifications for parallelism.
44 !
45 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
46 !+ 13/07/2010
47 !+ V6P0
48 !+ Translation of French comments within the FORTRAN sources into
49 !+ English comments
50 !
51 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
52 !+ 21/08/2010
53 !+ V6P0
54 !+ Creation of DOXYGEN tags for automated documentation and
55 !+ cross-referencing of the FORTRAN sources
56 !
57 !history J-M HERVOUET (EDF R&D, LNHE)
58 !+ 10/01/2013
59 !+ V6P3
60 !+ LGSEG now computed with coordinates per element (XEL and YEL)
61 !+ This is important in spherical coordinates.
62 !
63 !history J-M HERVOUET (EDF LAB, LNHE)
64 !+ 13/03/2014
65 !+ V7P0
66 !+ Now written to enable different numbering of boundary points and
67 !+ boundary segments.
68 !
69 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
70 !| DISBOR |<--| DISTANCE FROM BOUNDARY POINT TO CLOSER
71 !| | | INNER POINT
72 !| IKLBOR |-->| CONNECTIVITY TABLE FOR BOUNDARY ELEMENTS
73 !| LGSEG |<--| LENGTH OF BOUNDARY SEGMENTS
74 !| MESH |-->| MESH STRUCTURE
75 !| NELBOR |-->| FOR THE KTH BOUNDARY EDGE, GIVES THE CORRESPONDING
76 !| | | ELEMENT.
77 !| NULONE |-->| NUMBER OF FIRST POINT OF SEGMENT IN ADJACENT ELEMENT
78 !| NELMAX |-->| NUMBER OF ELEMENTS
79 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
80 !| SURFAC |-->| AREA OF TRIANGLES
81 !| XEL |-->| ABSCISSAE OF POINTS IN THE MESH, PER ELEMENT
82 !| XNEBOR |<--| COMPONANT ALONG X OF VECTOR NORMAL TO POINT
83 !| XSGBOR |<--| COMPONANT ALONG X OF VECTOR NORMAL TO SEGMENT
84 !| YEL |-->| ORDINATES OF POINTS IN THE MESH, PER ELEMENT
85 !| XNEBOR |<--| COMPONANT ALONG Y OF VECTOR NORMAL TO POINT
86 !| YSGBOR |<--| COMPONANT ALONG Y OF VECTOR NORMAL TO SEGMENT
87 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
88 !
89  USE bief, ex_normab => normab
90 !
92  IMPLICIT NONE
93 !
94 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
95 !
96  INTEGER, INTENT(IN) :: NPTFR,NELMAX,NELEBX,NELEB
97  INTEGER, INTENT(IN) :: NELBOR(nelebx)
98  INTEGER, INTENT(IN) :: NULONE(nelebx,2),IKLBOR(nelebx,2)
99 !
100  DOUBLE PRECISION, INTENT(INOUT) :: XNEBOR(nptfr,2),YNEBOR(nptfr,2)
101  DOUBLE PRECISION, INTENT(INOUT) :: XSGBOR(nelebx,4)
102  DOUBLE PRECISION, INTENT(INOUT) :: YSGBOR(nelebx,4)
103  DOUBLE PRECISION, INTENT(INOUT) :: DISBOR(nptfr),LGSEG(nelebx)
104  DOUBLE PRECISION, INTENT(IN) :: SURFAC(nelmax)
105  DOUBLE PRECISION, INTENT(IN) :: XEL(nelmax,3),YEL(nelmax,3)
106 !
107  TYPE(bief_mesh), INTENT(INOUT) :: MESH
108 !
109 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
110 !
111  INTEGER K1,K2,IELEM,I1,I2,IELEB
112  DOUBLE PRECISION X12,Y12,XNORM,X1,X2,Y1,Y2,Z(1)
113 !
114  INTRINSIC sqrt
115 !
116 !-----------------------------------------------------------------------
117 !
118 ! COMPUTES THE NORMAL VECTORS AND SEGMENT LENGTHS
119 !
120 ! 0) INITIALISES LGSEG, XSGBOR AND YSGBOR TO 0
121 !
122  IF(nptfr.GT.0) THEN
123 !
124 ! TO START WITH XSGBOR AND YSGBOR IN BOUNDARY NODES NUMBERING
125 !
126  DO k1=1,nptfr
127  xsgbor(k1,1) = 0.d0
128  ysgbor(k1,1) = 0.d0
129  xsgbor(k1,2) = 0.d0
130  ysgbor(k1,2) = 0.d0
131  ENDDO
132 !
133 ! 1) NORMALS TO SEGMENTS AND LENGTH OF THE BOUNDARY SEGMENT
134 ! COMMON VERSION FOR SCALAR/PARALLEL MODES
135 ! STILL WITH BOUNDARY NODES NUMBERING
136 !
137  DO ieleb=1,neleb
138 !
139  k1=iklbor(ieleb,1)
140  k2=iklbor(ieleb,2)
141 !
142  ielem=nelbor(ieleb)
143  i1=nulone(ieleb,1)
144  i2=nulone(ieleb,2)
145  x1=xel(ielem,i1)
146  y1=yel(ielem,i1)
147  x2=xel(ielem,i2)
148  y2=yel(ielem,i2)
149  x12 = x2 - x1
150  y12 = y2 - y1
151 ! LENGTH OF THE BOUNDARY SEGMENT
152  lgseg(ieleb) = sqrt( x12**2 + y12**2 )
153 ! NORMAL TO THE SEGMENT FOLLOWING K1:
154  xsgbor(k1,1) = y12
155  ysgbor(k1,1) = -x12
156 ! NORMAL TO THE SEGMENT PRECEDING THE ONE FOLLOWING K1:
157  xsgbor(k2,2) = y12
158  ysgbor(k2,2) = -x12
159 !
160  ENDDO
161 !
162  ENDIF
163 !
164 ! 2) COMPLEMENT IN PARALLEL MODE, WITH PARCOM OPTION 1
165 ! (VALUE OF GREATER ABSOLUTE VALUE)
166 !
167  IF(ncsize.GT.1) THEN
168  IF(nptfr.GT.0) THEN
169 ! CALL PARCOM_BORD(LGSEG ,1,MESH)
170  CALL parcom_bord(xsgbor(1:nptfr,1),1,mesh)
171  CALL parcom_bord(xsgbor(1:nptfr,2),1,mesh)
172  CALL parcom_bord(ysgbor(1:nptfr,1),1,mesh)
173  CALL parcom_bord(ysgbor(1:nptfr,2),1,mesh)
174  ELSE
175 ! THIS DOES NOTHING FOR THE SUB-DOMAIN, BUT IS
176 ! NECESSARY TO THE PARALLEL COMMUNICATION
177 ! IN CASE OF CALL PARCOM_BORD, ALL PROCESSORS MUST CALL IT
178 ! CALL PARCOM_BORD(Z,1,MESH)
179  CALL parcom_bord(z,1,mesh)
180  CALL parcom_bord(z,1,mesh)
181  CALL parcom_bord(z,1,mesh)
182  CALL parcom_bord(z,1,mesh)
183  ENDIF
184  ENDIF
185 !
186 ! 3) NORMALS BY NODES, APPROXIMATE DISTANCE FROM THE BOUNDARY
187 ! THE VECTORS ARE THEN NORMALISED
188 !
189  IF(nptfr.GT.0) THEN
190 !
191  DO k1=1,nptfr
192 !
193 ! NORMAL AT THE POINT: AVERAGE OF 2 NOT NORMALISED NORMALS
194 ! ASSOCIATED WITH THE 2 ADJACENT SEGMENTS
195 !
196 ! NOT NORMALISED VERSION XNEBOR(*,2) AND YNEBOR(*,2)
197  xnebor(k1,2)=(xsgbor(k1,1)+xsgbor(k1,2))*0.5d0
198  ynebor(k1,2)=(ysgbor(k1,1)+ysgbor(k1,2))*0.5d0
199 !
200 ! NOT NORMALISED VERSION XSGBOR(*,3) AND XSGBOR(*,4)
201 ! YSGBOR(*,3) AND YSGBOR(*,4)
202  xsgbor(k1,3)=xsgbor(k1,1)
203  xsgbor(k1,4)=xsgbor(k1,2)
204  ysgbor(k1,3)=ysgbor(k1,1)
205  ysgbor(k1,4)=ysgbor(k1,2)
206 !
207 ! NORMALISED VERSION XNEBOR(*,1) AND YNEBOR(*,1)
208  xnorm=sqrt(xnebor(k1,2)**2+ynebor(k1,2)**2)
209  xnebor(k1,1)=xnebor(k1,2)/xnorm
210  ynebor(k1,1)=ynebor(k1,2)/xnorm
211 !
212 ! NORMALISED VERSION OF XSGBOR AND YSGBOR FOR FOLLOWING SEGMENT
213  xnorm=sqrt(xsgbor(k1,1)**2+ysgbor(k1,1)**2)
214  xsgbor(k1,1)=xsgbor(k1,1)/xnorm
215  ysgbor(k1,1)=ysgbor(k1,1)/xnorm
216 !
217 ! NORMALISED VERSION OF XSGBOR AND YSGBOR FOR PRECEDING SEGMENT
218  xnorm=sqrt(xsgbor(k1,2)**2+ysgbor(k1,2)**2)
219  xsgbor(k1,2)=xsgbor(k1,2)/xnorm
220  ysgbor(k1,2)=ysgbor(k1,2)/xnorm
221 !
222 ! INITIALISATION FOR NEXT LOOP
223 !
224  disbor(k1)=0.d0
225 !
226  ENDDO
227 !
228 ! DISTANCE TO BOUNDARY
229 !
230  DO ieleb=1,neleb
231 !
232  k1=iklbor(ieleb,1)
233 !
234 ! THIS CAN BE APPROXIMATION OF THE MESH SIZE AT THE BOUNDARY
235 ! AND IS USED FOR LOG LAW AT THE BOUNDARIES
236  disbor(k1) = 2.d0*surfac(nelbor(ieleb))/lgseg(ieleb)
237 !
238  ENDDO
239 !
240  ENDIF
241 !
242 ! DISBOR IS POSITIVE, CAN TAKE THE MAX
243  IF(ncsize.GT.1) THEN
244  CALL parcom_bord(disbor,3,mesh)
245  ENDIF
246 !
247 !-----------------------------------------------------------------------
248 !
249 ! NOW, XSGBOR, YSGBOR AND DISBOR ARE GIVEN THEIR SEGMENT NUMBERING
250 !
251 ! IN THIS LOOP IELEB ALWAYS SMALLER OR EQUAL TO K1
252 ! SO NOTHING IS ERASED PREMATURELY
253 !
254 ! IN SCALAR MODE THE NUMBERING IS THE SAME SO NOTHING TO DO
255 !
256  IF(ncsize.GT.1) THEN
257 !
258  DO ieleb=1,neleb
259 !
260  k1=iklbor(ieleb,1)
261 !
262  xsgbor(ieleb,1)= xsgbor(k1,1)
263  xsgbor(ieleb,2)= xsgbor(k1,2)
264  xsgbor(ieleb,3)= xsgbor(k1,3)
265  xsgbor(ieleb,4)= xsgbor(k1,4)
266  ysgbor(ieleb,1)= ysgbor(k1,1)
267  ysgbor(ieleb,2)= ysgbor(k1,2)
268  ysgbor(ieleb,3)= ysgbor(k1,3)
269  ysgbor(ieleb,4)= ysgbor(k1,4)
270 ! DISBOR(IELEB) = DISBOR(K1)
271 !
272  ENDDO
273 !
274  ENDIF
275 !
276 !-----------------------------------------------------------------------
277 !
278  RETURN
279  END
subroutine parcom_bord(X, ICOM, MESH)
Definition: parcom_bord.f:7
subroutine normab(XNEBOR, YNEBOR, XSGBOR, YSGBOR, DISBOR, SURFAC, NELMAX, NELBOR, NULONE, LGSEG, NPTFR, MESH, XEL, YEL, IKLBOR, NELEBX, NELEB)
Definition: normab.f:8
Definition: bief.f:3