The TELEMAC-MASCARET system  trunk
vc13tt.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE vc13tt
3 ! *****************
4 !
5  &(xmul,sf,f,x,y,z,ikle1,ikle2,ikle3,ikle4,nelem,nelmax,
6  & w1,w2,w3,w4,icoord,formul)
7 !
8 !***********************************************************************
9 ! BIEF V6P2 21/08/2010
10 !***********************************************************************
11 !
12 !brief COMPUTES THE FOLLOWING VECTOR IN FINITE ELEMENTS:
13 !code
14 !+ (EXAMPLE OF THE X COMPONENT, WHICH CORRESPONDS TO ICOORD=1)
15 !+
16 !+ / DF
17 !+ VEC(I) = XMUL / ( P *( -- )) D(OMEGA)
18 !+ /OMEGA I DX
19 !+
20 !+ P IS A LINEAR BASE
21 !+ I
22 !+
23 !+ F IS A VECTOR OF TYPE P1 OR OTHER
24 !+
25 !+ IN THIS CASE THE ELEMENT IS A LINEAR TETRAHEDRON
26 !
27 !note IMPORTANT : IF F IS OF TYPE P0, THE RESULT IS 0.
28 !+ HERE, IF F IS P0, IT REALLY MEANS THAT F IS
29 !+ P1, BUT GIVEN BY ELEMENTS.
30 !+ THE SIZE OF F SHOULD THEN BE : F(NELMAX,3).
31 !
32 !warning THE JACOBIAN MUST BE POSITIVE
33 !warning THE RESULT IS IN W IN NOT ASSEMBLED FORM - REAL MESH
34 !
35 !history J-M HERVOUET (LNH)
36 !+ 25/03/02
37 !+ V5P3
38 !+
39 !
40 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
41 !+ 13/07/2010
42 !+ V6P0
43 !+ TRANSLATION OF FRENCH COMMENTS WITHIN THE FORTRAN SOURCES INTO
44 !+ ENGLISH COMMENTS
45 !
46 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
47 !+ 21/08/2010
48 !+ V6P0
49 !+ CREATION OF DOXYGEN TAGS FOR AUTOMATED DOCUMENTATION AND
50 !+ CROSS-REFERENCING OF THE FORTRAN SOURCES
51 !
52 !history J-M HERVOUET (LNH)
53 !+ 06/12/2011
54 !+ V6P2
55 !+ Treating crushed elements and securing options which are not
56 !+ implemented.
57 !
58 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
59 !| F |-->| FUNCTION USED IN THE VECTOR FORMULA
60 !| FORMUL |-->| SEE AT THE END OF THE SUBROUTINE
61 !| ICOORD |-->| 1: DERIVATIVE ALONG X, 2: ALONG Y
62 !| IKLE1 |-->| FIRST POINT OF TETRAHEDRA
63 !| IKLE2 |-->| SECOND POINT OF TETRAHEDRA
64 !| IKLE3 |-->| THIRD POINT OF TETRAHEDRA
65 !| IKLE4 |-->| FOURTH POINT OF TETRAHEDRA
66 !| NELEM |-->| NUMBER OF ELEMENTS
67 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS
68 !| SF |-->| BIEF_OBJ STRUCTURE OF F
69 !| SURFAC |-->| AREA OF TRIANGLES
70 !| W1 |<--| RESULT IN NON ASSEMBLED FORM
71 !| W2 |<--| RESULT IN NON ASSEMBLED FORM
72 !| W3 |<--| RESULT IN NON ASSEMBLED FORM
73 !| W4 |<--| RESULT IN NON ASSEMBLED FORM
74 !| XEL |-->| ABSCISSAE OF POINTS IN THE MESH, PER ELEMENT
75 !| XMUL |-->| MULTIPLICATION COEFFICIENT
76 !| YEL |-->| ORDINATES OF POINTS IN THE MESH, PER ELEMENT
77 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
78 !
79  USE bief, ex_vc13tt => vc13tt
80 !
82  IMPLICIT NONE
83 !
84 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
85 !
86  INTEGER, INTENT(IN) :: NELEM,NELMAX,ICOORD
87  INTEGER, INTENT(IN) :: IKLE1(nelmax),IKLE2(nelmax)
88  INTEGER, INTENT(IN) :: IKLE3(nelmax),IKLE4(nelmax)
89 !
90  DOUBLE PRECISION, INTENT(IN) :: X(*),Y(*),Z(*)
91  DOUBLE PRECISION, INTENT(INOUT) :: W1(nelmax),W2(nelmax)
92  DOUBLE PRECISION, INTENT(INOUT) :: W3(nelmax),W4(nelmax)
93  DOUBLE PRECISION, INTENT(IN) :: XMUL
94 !
95 ! STRUCTURE OF F AND REAL DATA
96 !
97  TYPE(bief_obj), INTENT(IN) :: SF
98  DOUBLE PRECISION, INTENT(IN) :: F(*)
99  CHARACTER(LEN=16), INTENT(IN) :: FORMUL
100 !
101 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
102 !
103  INTEGER IELEM,IELMF
104  DOUBLE PRECISION X2,X3,X4,Y2,Y3,Y4,Z2,Z3,Z4,XSUR24,SUR6
105  DOUBLE PRECISION VOL
106  INTEGER I1,I2,I3,I4
107 !
108 !-----------------------------------------------------------------------
109 !
110  sur6=1.d0/6.d0
111  xsur24 = xmul/24.d0
112 !
113 !-----------------------------------------------------------------------
114 !
115  ielmf=sf%ELM
116 !
117 !=======================================================================
118 !
119 ! FILTERING OPTIONS NOT TREATED
120 !
121  IF(formul(6:6).EQ.'2') THEN
122  WRITE(lu,*) 'VC13TT: FORMUL=',formul
123  WRITE(lu,*) ' OPTION NOT TREATED'
124  CALL plante(1)
125  stop
126  ENDIF
127 !
128 !-----------------------------------------------------------------------
129 !
130 ! F IS LINEAR
131 !
132  IF(ielmf.EQ.31.OR.ielmf.EQ.51) THEN
133 !
134  IF(icoord.EQ.1) THEN
135 !
136 !-----------------------------------------------------------------------
137 !
138 ! DERIVATIVE WITH RESPECT TO X
139 !
140  DO ielem = 1 , nelem
141 !
142  i1 = ikle1(ielem)
143  i2 = ikle2(ielem)
144  i3 = ikle3(ielem)
145  i4 = ikle4(ielem)
146 !
147 ! REAL COORDINATES OF THE POINTS OF THE ELEMENT (ORIGIN IN 1)
148 !
149  y2 = y(i2) - y(i1)
150  y3 = y(i3) - y(i1)
151  y4 = y(i4) - y(i1)
152  z2 = z(i2) - z(i1)
153  z3 = z(i3) - z(i1)
154  z4 = z(i4) - z(i1)
155 !
156  w1(ielem)=( (f(i2)-f(i1))*(y3*z4-y4*z3)
157  & +(f(i3)-f(i1))*(z2*y4-y2*z4)
158  & +(f(i4)-f(i1))*(y2*z3-z2*y3) )*xsur24
159 !
160  w2(ielem)=w1(ielem)
161  w3(ielem)=w1(ielem)
162  w4(ielem)=w1(ielem)
163 !
164  ENDDO ! IELEM
165 !
166  ELSEIF(icoord.EQ.2) THEN
167 !
168 !-----------------------------------------------------------------------
169 !
170 ! DERIVATIVE WITH RESPECT TO Y
171 !
172  DO ielem = 1 , nelem
173 !
174  i1 = ikle1(ielem)
175  i2 = ikle2(ielem)
176  i3 = ikle3(ielem)
177  i4 = ikle4(ielem)
178 !
179 ! REAL COORDINATES OF THE POINTS OF THE ELEMENT (ORIGIN IN 1)
180 !
181  x2 = x(i2) - x(i1)
182  x3 = x(i3) - x(i1)
183  x4 = x(i4) - x(i1)
184  z2 = z(i2) - z(i1)
185  z3 = z(i3) - z(i1)
186  z4 = z(i4) - z(i1)
187 !
188  w1(ielem)=( (f(i2)-f(i1))*(x4*z3-x3*z4)
189  & +(f(i3)-f(i1))*(x2*z4-z2*x4)
190  & +(f(i4)-f(i1))*(z2*x3-x2*z3) )*xsur24
191 !
192  w2(ielem)=w1(ielem)
193  w3(ielem)=w1(ielem)
194  w4(ielem)=w1(ielem)
195 !
196  ENDDO
197 !
198  ELSEIF(icoord.EQ.3) THEN
199 !
200 !-----------------------------------------------------------------------
201 !
202 ! DERIVATIVE WITH RESPECT TO Z
203 !
204  DO ielem = 1 , nelem
205 !
206  i1 = ikle1(ielem)
207  i2 = ikle2(ielem)
208  i3 = ikle3(ielem)
209  i4 = ikle4(ielem)
210 !
211 ! REAL COORDINATES OF THE POINTS OF THE ELEMENT (ORIGIN IN 1)
212 !
213  x2 = x(i2) - x(i1)
214  x3 = x(i3) - x(i1)
215  x4 = x(i4) - x(i1)
216  y2 = y(i2) - y(i1)
217  y3 = y(i3) - y(i1)
218  y4 = y(i4) - y(i1)
219 !
220  w1(ielem)=( (f(i2)-f(i1))*(x3*y4-x4*y3)
221  & +(f(i3)-f(i1))*(y2*x4-x2*y4)
222  & +(f(i4)-f(i1))*(x2*y3-y2*x3) )*xsur24
223 !
224  w2(ielem)=w1(ielem)
225  w3(ielem)=w1(ielem)
226  w4(ielem)=w1(ielem)
227 !
228  ENDDO ! IELEM
229 !
230  ELSE
231 !
232 !-----------------------------------------------------------------------
233 !
234  WRITE(lu,201) icoord
235 201 FORMAT(1x,'VC13TT (BIEF) : IMPOSSIBLE COMPONENT ',
236  & 1i6,' CHECK ICOORD')
237  CALL plante(1)
238  stop
239 !
240  ENDIF
241 !
242 !=======================================================================
243 !
244  ELSE
245 !
246 !=======================================================================
247 !
248  WRITE(lu,102) ielmf,sf%NAME
249 102 FORMAT(1x,'VC13TT (BIEF) :',/,
250  & 1x,'DISCRETISATION OF F : ',1i6,' NOT IMPLEMENTED',/,
251  & 1x,'REAL NAME OF F: ',a6)
252  CALL plante(1)
253  stop
254 !
255  ENDIF
256 !
257 !=======================================================================
258 !
259 ! FILTER FOR PARTLY CRUSHED ELEMENTS (ON THE VERTICAL)
260 !
261  IF(formul(7:7).EQ.'2') THEN
262 !
263  DO ielem = 1 , nelem
264  i1 = ikle1(ielem)
265  i2 = ikle2(ielem)
266  i3 = ikle3(ielem)
267  i4 = ikle4(ielem)
268 !
269  x2=x(i2)-x(i1)
270  y2=y(i2)-y(i1)
271  z2=z(i2)-z(i1)
272  x3=x(i3)-x(i1)
273  y3=y(i3)-y(i1)
274  z3=z(i3)-z(i1)
275  x4=x(i4)-x(i1)
276  y4=y(i4)-y(i1)
277  z4=z(i4)-z(i1)
278 !
279  vol=(z2*(x3*y4-x4*y3)+y2*(x4*z3-x3*z4)+x2*(y3*z4-y4*z3))*sur6
280 !
281 ! TEST DE VC13PP
282 ! IF(Z(I4)-Z(I1).LT.1.D-3.OR.
283 ! & Z(I5)-Z(I2).LT.1.D-3.OR.
284 ! & Z(I6)-Z(I3).LT.1.D-3 ) THEN
285 !
286 ! HIDDEN PARAMETER !!!!!!!!!!!!!!!!!!!
287 !
288  IF(vol.LT.1.d-6) THEN
289  w1(ielem)=0.d0
290  w2(ielem)=0.d0
291  w3(ielem)=0.d0
292  w4(ielem)=0.d0
293  ENDIF
294  ENDDO
295 !
296  ELSEIF(formul(7:7).NE.' ') THEN
297  WRITE(lu,*) 'VC13TT: FORMUL=',formul
298  WRITE(lu,*) ' OPTION NOT TREATED'
299  CALL plante(1)
300  stop
301  ENDIF
302 !
303 !=======================================================================
304 !
305  RETURN
306  END
subroutine vc13tt(XMUL, SF, F, X, Y, Z, IKLE1, IKLE2, IKLE3, IKLE4, NELEM, NELMAX, W1, W2, W3, W4, ICOORD, FORMUL)
Definition: vc13tt.f:8
Definition: bief.f:3