The TELEMAC-MASCARET system  trunk
vc00tt.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE vc00tt
3 ! *****************
4 !
5  &(xmul,x,y,z,ikle1,ikle2,ikle3,ikle4,
6  & nelem,nelmax,w1,w2,w3,w4,formul,npoin2,nelem2,ielm1)
7 !
8 !***********************************************************************
9 ! BIEF V6P2 21/08/2010
10 !***********************************************************************
11 !
12 !brief COMPUTES THE FOLLOWING VECTOR IN FINITE ELEMENTS:
13 !code
14 !+ /
15 !+ VEC(I) = XMUL / PSI(I) D(OMEGA)
16 !+ /OMEGA
17 !+
18 !+ PSI(I) IS A BASE OF TYPE P1 TETRAHEDRON
19 !
20 !warning THE JACOBIAN MUST BE POSITIVE
21 !warning THE RESULT IS IN W IN NOT ASSEMBLED FORM
22 !
23 !history J-M HERVOUET (LNH)
24 !+ 22/03/02
25 !+ V5P3
26 !+
27 !
28 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
29 !+ 13/07/2010
30 !+ V6P0
31 !+ Translation of French comments within the FORTRAN sources into
32 !+ English comments
33 !
34 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
35 !+ 21/08/2010
36 !+ V6P0
37 !+ Creation of DOXYGEN tags for automated documentation and
38 !+ cross-referencing of the FORTRAN sources
39 !
40 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
41 !| FORMUL |-->| STRING WITH THE FORMULA DESCRIBING THE VECTOR
42 !| IELM1 |-->| TYPE OF ELEMENT
43 !| IKLE1 |-->| FIRST POINT OF TETRAHEDRA
44 !| IKLE2 |-->| SECOND POINT OF TETRAHEDRA
45 !| IKLE3 |-->| THIRD POINT OF TETRAHEDRA
46 !| IKLE4 |-->| FOURTH POINT OF TETRAHEDRA
47 !| NELEM |-->| NUMBER OF ELEMENTS
48 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS
49 !| NPOIN2 |-->| NUMBER OF POINTS IN THE UNDERLYING 2D MESH
50 !| W1 |<--| RESULT IN NON ASSEMBLED FORM
51 !| W2 |<--| RESULT IN NON ASSEMBLED FORM
52 !| W3 |<--| RESULT IN NON ASSEMBLED FORM
53 !| W4 |<--| RESULT IN NON ASSEMBLED FORM
54 !| X |-->| ABSCISSAE OF POINTS IN THE MESH
55 !| XMUL |-->| MULTIPLICATION COEFFICIENT
56 !| Y |-->| ORDINATES OF POINTS IN THE MESH
57 !| Z |-->| ELEVATIONS OF POINTS IN THE MESH
58 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
59 !
61  IMPLICIT NONE
62 !
63 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
64 !
65  INTEGER, INTENT(IN) :: NELEM,NELMAX,NPOIN2,NELEM2,IELM1
66  INTEGER, INTENT(IN) :: IKLE1(nelmax),IKLE2(nelmax)
67  INTEGER, INTENT(IN) :: IKLE3(nelmax),IKLE4(nelmax)
68 !
69  DOUBLE PRECISION, INTENT(IN) :: X(*),Y(*),Z(*)
70  DOUBLE PRECISION, INTENT(INOUT) :: W1(nelmax)
71  DOUBLE PRECISION, INTENT(INOUT) :: W2(nelmax)
72  DOUBLE PRECISION, INTENT(INOUT) :: W3(nelmax)
73  DOUBLE PRECISION, INTENT(INOUT) :: W4(nelmax)
74  DOUBLE PRECISION, INTENT(IN) :: XMUL
75 !
76  CHARACTER(LEN=16), INTENT(IN) :: FORMUL
77 !
78 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
79 !
80  DOUBLE PRECISION XSUR24,X2,X3,X4,Y2,Y3,Y4,Z2,Z3,Z4,H1,H2,H3,H4
81  DOUBLE PRECISION COEF
82  INTEGER I1,I2,I3,I4,IELEM,IP,I12D,I22D,I32D,I42D,IELEM2D
83  INTEGER IT1,IT2,IT3
84 !
85 !-----------------------------------------------------------------------
86 !
87  xsur24 = xmul/24.d0
88 !
89 !-----------------------------------------------------------------------
90 !
91  IF(formul(1:7).EQ.'MASBAS ') THEN
92 !
93 ! STANDARD FORMULA
94 !
95  DO ielem = 1 , nelem
96 !
97  i1 = ikle1(ielem)
98  i2 = ikle2(ielem)
99  i3 = ikle3(ielem)
100  i4 = ikle4(ielem)
101 !
102  x2 = x(i2)-x(i1)
103  x3 = x(i3)-x(i1)
104  x4 = x(i4)-x(i1)
105 !
106  y2 = y(i2)-y(i1)
107  y3 = y(i3)-y(i1)
108  y4 = y(i4)-y(i1)
109 !
110  z2 = z(i2)-z(i1)
111  z3 = z(i3)-z(i1)
112  z4 = z(i4)-z(i1)
113 !
114  w1(ielem) =
115  & (x2*(y3*z4-y4*z3)+y2*(x4*z3-x3*z4)+z2*(x3*y4-x4*y3))*xsur24
116  w2(ielem) = w1(ielem)
117  w3(ielem) = w1(ielem)
118  w4(ielem) = w1(ielem)
119 !
120  ENDDO
121 !
122 !-----------------------------------------------------------------------
123 !
124  ELSEIF(formul(1:7).EQ.'MASBAS2'.AND.ielm1.EQ.51) THEN
125 !
126 ! FORMULA WITH MASS-LUMPING
127 !
128 ! LOOP ON THE ELEMENTS
129 !
130  DO ielem = 1 , nelem
131 !
132  i1 = ikle1(ielem)
133  i2 = ikle2(ielem)
134  i3 = ikle3(ielem)
135  i4 = ikle4(ielem)
136 !
137 ! RETRIEVING THE LOWER PLANE NUMBER
138 !
139  ip=(min(i1,i2,i3,i4)-1)/npoin2 +1
140 !
141 ! RETRIEVING THE 2D POINTS NUMBERS ON THE SAME VERTICAL
142 !
143  i12d=mod(i1-1,npoin2)+1
144  i22d=mod(i2-1,npoin2)+1
145  i32d=mod(i3-1,npoin2)+1
146  i42d=mod(i4-1,npoin2)+1
147 !
148 ! RETRIEVING THE ORIGINAL PRISM HEIGHTS ON THE VERTICAL
149 ! TWO OF THE FOUR HEIGHTS WILL BE EQUAL, THE TWO CORRESPONDING
150 ! POINTS OF THE TETRAHEDRON BEING ON THE SAME VERTICAL
151 !
152  h1=z(ip*npoin2+i12d)-z((ip-1)*npoin2+i12d)
153  h2=z(ip*npoin2+i22d)-z((ip-1)*npoin2+i22d)
154  h3=z(ip*npoin2+i32d)-z((ip-1)*npoin2+i32d)
155  h4=z(ip*npoin2+i42d)-z((ip-1)*npoin2+i42d)
156 !
157  x2 = x(i2)-x(i1)
158  x3 = x(i3)-x(i1)
159  x4 = x(i4)-x(i1)
160 !
161  y2 = y(i2)-y(i1)
162  y3 = y(i3)-y(i1)
163  y4 = y(i4)-y(i1)
164 !
165  z2 = z(i2)-z(i1)
166  z3 = z(i3)-z(i1)
167  z4 = z(i4)-z(i1)
168 !
169 ! RETRIEVING THE CORRESPONDING TRIANGLE
170  ielem2d=mod(ielem-1,nelem2)+1
171 ! IT1,IT2 AND IT3 FORM THE PROJECTION OF THE TETRAHEDRON ON THE
172 ! PLANE BELOW IT, IT IS A TRIANGLE
173  it1=ikle1(ielem2d)+(ip-1)*npoin2
174  it2=ikle2(ielem2d)+(ip-1)*npoin2
175  it3=ikle3(ielem2d)+(ip-1)*npoin2
176  x2 = x(it2)-x(it1)
177  x3 = x(it3)-x(it1)
178  y2 = y(it2)-y(it1)
179  y3 = y(it3)-y(it1)
180 !
181 ! HERE COEF SHOULD BE PROPORTIONNAL TO THE VOLUME OF THE ELEMENT
182 ! BUT THE 3 TETRAHEDRONS IN A PRISM DO NOT HAVE THE SAME VOLUME
183 ! THEN THE SUM OF 3D VOLUMES ON THE VERTICAL DO NOT SUM CORRECTLY
184 ! TO GIVE DEPTH * VOLU2D. THE FORMULA BELOW ENSURES THIS PROPERTY
185 !
186  coef=(x2*y3-x3*y2)*xsur24
187 !
188  w1(ielem) = coef*h1
189  w2(ielem) = coef*h2
190  w3(ielem) = coef*h3
191  w4(ielem) = coef*h4
192 !
193  ENDDO
194 !
195 !-----------------------------------------------------------------------
196 !
197  ELSE
198 !
199  WRITE(lu,*) ' '
200  WRITE(lu,*) 'UNKNOWN FORMULA IN VC00TT:',formul
201  WRITE(lu,*) 'WITH ELEMENT:',ielm1
202  CALL plante(1)
203  stop
204 !
205  ENDIF
206 !
207 !-----------------------------------------------------------------------
208 !
209  RETURN
210  END
subroutine vc00tt(XMUL, X, Y, Z, IKLE1, IKLE2, IKLE3, IKLE4, NELEM, NELMAX, W1, W2, W3, W4, FORMUL, NPOIN2, NELEM2, IELM1)
Definition: vc00tt.f:8