The TELEMAC-MASCARET system  trunk
mt14tt.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE mt14tt
3 ! *****************
4 !
5  &(t,xm,lego,xmul,sw,w,h,
6  & x,y,ikle,nelem,nelmax,nplan,npoin2)
7 !
8 !***********************************************************************
9 ! BIEF V6P2 21/08/2010
10 !***********************************************************************
11 !
12 !brief BUILDS COEFFICIENTS LAMBDA(I,J) FOR N-TYPE MURD SCHEME.
13 !+
14 !+ THE ELEMENT IS THE P1 TETRAHEDRON.
15 !
16 !warning THE JACOBIAN MUST BE POSITIVE
17 !+ Only for prisms cut into tetrahedra so far.
18 !
19 !reference J-M HERVOUET THESIS OR BOOK: MURD SCHEME IN 3 DIMENSIONS
20 !+ CHAPTER 6.
21 !+
22 !+ Computational Fluid dynamics '92 volume 1. Multidimensional
23 !+ upwind schemes for scalar advection on tetrahedral meshes.
24 !+ G. Bourgois, H. Deconinck, P.L. Roe and R. Struijs
25 !
26 !history J-M HERVOUET (LNHE)
27 !+ 18/09/2011
28 !+ V6P1
29 !+
30 !
31 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
32 !| H |-->| FUNCTION USED IN THE FORMULA
33 !| IKLE |-->| CONNECTIVITY TABLE
34 !| LEGO |-->| LOGICAL. IF YES RESULT ASSEMBLED.
35 !| NELEM |-->| NUMBER OF ELEMENTS
36 !| NELEM2 |-->| NUMBER OF TRIANGLES IN THE UNDERLYING 2D MESH
37 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS
38 !| NPLAN |-->| NUMBER OF PLANES IN THE MESH
39 !| NPOIN2 |-->| NUMBER OF POINTS IN THE UNDERLYING 2D MESH
40 !| SW |-->| BIEF_OBJ STRUCTURE OF W
41 !| T |<->| WORK ARRAY FOR ELEMENT BY ELEMENT DIAGONAL
42 !| W |-->| FUNCTION USED IN THE FORMULA
43 !| X |-->| ABSCISSAE OF POINTS IN THE MESH
44 !| Y |-->| ORDINATES OF POINTS IN THE MESH
45 !| XM |<->| OFF-DIAGONAL TERMS
46 !| XMUL |-->| COEFFICIENT FOR MULTIPLICATION
47 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
48 !
49  USE bief !, EX_MT14TT => MT14TT
50  USE declarations_telemac, ONLY : isegt
51 !
53  IMPLICIT NONE
54 !
55 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56 !
57  INTEGER, INTENT(IN) :: NELEM,NELMAX,NPLAN,NPOIN2
58  INTEGER, INTENT(IN) :: IKLE(nelmax,4)
59 !
60  DOUBLE PRECISION, INTENT(INOUT) :: T(nelmax,4),XM(12,nelmax)
61 !
62  DOUBLE PRECISION, INTENT(IN) :: XMUL
63  DOUBLE PRECISION, INTENT(IN) :: W(*)
64  DOUBLE PRECISION, INTENT(IN) :: H(nelmax,4)
65 !
66  LOGICAL, INTENT(IN) :: LEGO
67 !
68 ! STRUCTURES DE U,V,W
69 !
70  TYPE(bief_obj), INTENT(IN) :: SW
71 !
72  DOUBLE PRECISION, INTENT(IN) :: X(*),Y(*)
73 !
74 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
75 !
76 ! DECLARATIONS SPECIFIC TO THIS SUBROUTINE
77 !
78  INTEGER IELEM,IPLAN,J1,J2,ISEG,II1,II2,II3,IELEM3D,NELEM2
79 !
80  DOUBLE PRECISION X2,X3,Y2,Y3
81  DOUBLE PRECISION L12,L13,L14,L23,L24,L34,L21,L31,L41,L32,L42,L43
82  DOUBLE PRECISION ALFA(4),SURFSUR3,SUMMAXK
83 !
84  INTEGER IL1,IL2,I1,I2,I3,I4,I5,I6,I
85 !
86 !-----------------------------------------------------------------------
87 !
88 ! THE SIX SEGMENTS IN A TETRAHEDRON
89 ! ISEGT(ISEG,1 OR 2) : FIRST OR SECOND POINT OF SEGMENT ISEG
90 ! INTEGER ISEGT(6,2)
91 ! DATA ISEGT/1,2,3,1,2,3,2,3,1,4,4,4/
92 !
93 !=======================================================================
94 !
95 ! RETRIEVING THE NUMBER OF ELEMENTS THE 2D MESH
96 !
97  nelem2=nelmax/3/(nplan-1)
98 ! * *
99 ! COMPUTES THE COEFFICIENTS A(I) (INTEGRAL OF H U.GRAD(PSI), ONLY
100 ! CONSIDERING THE HORIZONTAL PART OF U). SEE JMH THESIS
101 !
102 ! NOTE: THIS VC04TT CALL IS ALREADY DONE BY FLUX3D IN TELEMAC-3D
103 ! THROUGH A CALL TO VECTOR. THE EQUIVALENT OF T HAS BEEN
104 ! SAVED IN WHAT IS HERE H
105 !
106 ! FORMUL=' HOR'
107 ! CALL VC04TT(XMUL,SU,SV,SW,U,V,W,SF,SG,SH,F,G,H,X,Y,Z,
108 ! * IKLE(1,1),IKLE(1,2),IKLE(1,3),IKLE(1,4),
109 ! * NELEM,NELMAX,T(1,1),T(1,2),T(1,3),T(1,4),
110 ! * SPECAD,FORMUL,NPLAN)
111 !
112 ! NOW T IS RETRIEVED BY STORAGE DONE INTO FLUX3D
113 ! FUNCTION H MUST CONTAIN THE EQUIVALENT OF T ABOVE, WHICH IS
114 ! THE NON ASSEMBLED VALUE OF FLUINT
115 !
116 ! DO IELEM=1,NELEM
117 ! T(IELEM,1)=H( IELEM)
118 ! T(IELEM,2)=H( NELMAX+IELEM)
119 ! T(IELEM,3)=H(2*NELMAX+IELEM)
120 ! T(IELEM,4)=H(3*NELMAX+IELEM)
121 ! ENDDO
122 !
123 ! FORMUL NORMALLY STARTS WITH VGRADP OR VGRADP2, OR VGRADP22 TO KNOW
124 ! SIGMAG AND SPECAD, USELESS HERE.
125 !
126 !-----------------------------------------------------------------------
127 !
128  IF(sw%ELM.NE.51) THEN
129  WRITE(lu,*) 'MT14TT DISCRETISATION NON PREVUE'
130  CALL plante(1)
131  stop
132  ENDIF
133 !
134 !-----------------------------------------------------------------------
135 !
136  DO iplan=1,nplan-1
137  DO ielem=1,nelem2
138 !
139 ! THE SIX GLOBAL NUMBERS OF POINTS IN THE PRISM
140 ! IKLE HAS BEEN BUILT SO THAT IT COINCIDES WITH IKLE2D ON THE
141 ! FIRST LAYER (SEE CPIKLE3).
142 !
143  ii1=ikle(ielem,1)
144  ii2=ikle(ielem,2)
145  ii3=ikle(ielem,3)
146  i1=ii1+(iplan-1)*npoin2
147  i2=ii2+(iplan-1)*npoin2
148  i3=ii3+(iplan-1)*npoin2
149  i4=i1+npoin2
150  i5=i2+npoin2
151  i6=i3+npoin2
152 !
153  x2=x(ii2)-x(ii1)
154  x3=x(ii3)-x(ii1)
155  y2=y(ii2)-y(ii1)
156  y3=y(ii3)-y(ii1)
157  surfsur3=xmul*(x2*y3-x3*y2)/6.d0
158 !
159 ! EVERY TETRAHEDRON IN THE PRISM
160 !
161  DO i=1,3
162 !
163  ielem3d=3*nelem2*(iplan-1)+(i-1)*nelem2+ielem
164 !
165 ! CONTRIBUTION OF HORIZONTAL GRADIENTS
166 !
167  alfa(1)=xmul*h(ielem3d,1)
168  alfa(2)=xmul*h(ielem3d,2)
169  alfa(3)=xmul*h(ielem3d,3)
170  alfa(4)=xmul*h(ielem3d,4)
171 !
172 ! CONTRIBUTION OF VERTICAL GRADIENTS
173 ! ONLY FOR VERTICAL SEGMENTS
174 !
175 ! LOOP ON EVERY SEGMENT IN THE PRISM
176 !
177  DO iseg=1,6
178 ! SEE NUMBERING OF TETRAHEDRONS IN CPIKLE3
179  il1=isegt(iseg,1)
180  il2=isegt(iseg,2)
181  j1=ikle(ielem3d,il1)
182  j2=ikle(ielem3d,il2)
183 ! VERTICAL SEGMENTS
184  IF(j1.EQ.i1.AND.j2.EQ.i4) THEN
185  alfa(il1)=alfa(il1)-w(i1)*surfsur3
186  alfa(il2)=alfa(il2)+w(i1)*surfsur3
187  ELSEIF(j1.EQ.i4.AND.j2.EQ.i1) THEN
188  alfa(il1)=alfa(il1)+w(i1)*surfsur3
189  alfa(il2)=alfa(il2)-w(i1)*surfsur3
190  ELSEIF(j1.EQ.i2.AND.j2.EQ.i5) THEN
191  alfa(il1)=alfa(il1)-w(i2)*surfsur3
192  alfa(il2)=alfa(il2)+w(i2)*surfsur3
193  ELSEIF(j1.EQ.i5.AND.j2.EQ.i2) THEN
194  alfa(il1)=alfa(il1)+w(i2)*surfsur3
195  alfa(il2)=alfa(il2)-w(i2)*surfsur3
196  ELSEIF(j1.EQ.i3.AND.j2.EQ.i6) THEN
197  alfa(il1)=alfa(il1)-w(i3)*surfsur3
198  alfa(il2)=alfa(il2)+w(i3)*surfsur3
199  ELSEIF(j1.EQ.i6.AND.j2.EQ.i3) THEN
200  alfa(il1)=alfa(il1)+w(i3)*surfsur3
201  alfa(il2)=alfa(il2)-w(i3)*surfsur3
202  ENDIF
203  ENDDO
204 !
205 ! N-SCHEME (SEE REFERENCE 2 PAGE 3, BOTTOM RIGHT)
206 !
207  summaxk=max(0.d0,alfa(1))
208  & +max(0.d0,alfa(2))
209  & +max(0.d0,alfa(3))
210  & +max(0.d0,alfa(4))
211  IF(summaxk.GT.1.d-10) THEN
212  summaxk=-1.d0/summaxk
213  l12=summaxk*max(0.d0,alfa(1))*min(0.d0,alfa(2))
214  l13=summaxk*max(0.d0,alfa(1))*min(0.d0,alfa(3))
215  l14=summaxk*max(0.d0,alfa(1))*min(0.d0,alfa(4))
216  l23=summaxk*max(0.d0,alfa(2))*min(0.d0,alfa(3))
217  l24=summaxk*max(0.d0,alfa(2))*min(0.d0,alfa(4))
218  l34=summaxk*max(0.d0,alfa(3))*min(0.d0,alfa(4))
219  l21=summaxk*max(0.d0,alfa(2))*min(0.d0,alfa(1))
220  l31=summaxk*max(0.d0,alfa(3))*min(0.d0,alfa(1))
221  l41=summaxk*max(0.d0,alfa(4))*min(0.d0,alfa(1))
222  l32=summaxk*max(0.d0,alfa(3))*min(0.d0,alfa(2))
223  l42=summaxk*max(0.d0,alfa(4))*min(0.d0,alfa(2))
224  l43=summaxk*max(0.d0,alfa(4))*min(0.d0,alfa(3))
225  ELSE
226 ! A SIMPLE SOLUTION, WITHOUT DIVISION
227 ! PRINCIPLE : POINTS 1, 2, 3 GIVE THEIR CONTRIBUTION
228 ! TO POINT 4, IT WORKS BECAUSE ALFA(4)=-ALFA(1)-ALFA(2)-ALFA(3)
229 ! BUT IT IS NOT THE N-SCHEME
230 ! BETTER THAN PUTTING 0 FOR MASS ERROR ?
231 ! COULD BE USELESS DEPENDING ON FLUX CLIPPING AFTER
232  l12 = 0.d0
233  l13 = 0.d0
234  l14 = max(alfa(1),0.d0)
235  l23 = 0.d0
236  l24 = max(alfa(2),0.d0)
237  l34 = max(alfa(3),0.d0)
238  l21 = 0.d0
239  l31 = 0.d0
240  l41 = - min(alfa(1),0.d0)
241  l32 = 0.d0
242  l42 = - min(alfa(2),0.d0)
243  l43 = - min(alfa(3),0.d0)
244  ENDIF
245 !
246  xm(01,ielem3d) = l12
247  xm(02,ielem3d) = l13
248  xm(03,ielem3d) = l14
249  xm(04,ielem3d) = l23
250  xm(05,ielem3d) = l24
251  xm(06,ielem3d) = l34
252  xm(07,ielem3d) = l21
253  xm(08,ielem3d) = l31
254  xm(09,ielem3d) = l41
255  xm(10,ielem3d) = l32
256  xm(11,ielem3d) = l42
257  xm(12,ielem3d) = l43
258 !
259  ENDDO
260 !
261 ! END OF LOOP ON THE 3 TETRAHEDRONS
262 !
263  ENDDO
264  ENDDO
265 !
266 !-----------------------------------------------------------------------
267 !
268 ! COMPUTES THE SUM OF EACH ROW (WITH A - SIGN)
269 ! THE DIAGONAL TERMS ARE 0
270 !
271  IF(lego) THEN
272 !
273  DO ielem = 1,nelem
274  t(ielem,1) = -xm(01,ielem)-xm(02,ielem)-xm(03,ielem)
275  t(ielem,2) = -xm(04,ielem)-xm(05,ielem)-xm(07,ielem)
276  t(ielem,3) = -xm(06,ielem)-xm(08,ielem)-xm(10,ielem)
277  t(ielem,4) = -xm(09,ielem)-xm(11,ielem)-xm(12,ielem)
278  ENDDO
279 !
280  ENDIF
281 !
282 !-----------------------------------------------------------------------
283 !
284  RETURN
285  END
integer, dimension(6, 2) isegt
subroutine mt14tt(T, XM, LEGO, XMUL, SW, W, H, X, Y, IKLE, NELEM, NELMAX, NPLAN, NPOIN2)
Definition: mt14tt.f:8
Definition: bief.f:3