The TELEMAC-MASCARET system  trunk
flux_ef_vf_3d.f
Go to the documentation of this file.
1 ! ************************
2  SUBROUTINE flux_ef_vf_3d
3 ! ************************
4 !
5  &(flow,w2d,w3d,nseg2d,nelem2,nelmax2,mesh2d,iniflo,
6  & iopt,sens,ielm3,nplan,ikle,nelmax,knolg)
7 !
8 !***********************************************************************
9 ! BIEF V7P3
10 !***********************************************************************
11 !
12 !brief The 3D Element By Element fluxes leaving points are grouped
13 !+ on every plane (one contribution from below, one from above).
14 !+ Then every plane is considered like a 2D mesh, and the 2D
15 !+ EBE fluxes are transformed into horizontal fluxes between
16 !+ points (with a call to flux_ef_vf). This gives all the 3D
17 !+ horizontal fluxes between points.
18 !+
19 !+
20 !warning For element 51 the result is summed on the vertical, and is
21 !+ a 2D result (see correction_depth_3d where flux_ef_vf_3d is
22 !+ called, otherwise this routine should not be called for
23 !+ tetrahedra).
24 !+
25 !
26 !history
27 !+ 15/05/2009
28 !+ V6P0
29 !+ INSPIRED FROM LEO POSTMA (DELTARES)
30 !
31 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
32 !+ 13/07/2010
33 !+ V6P0
34 !+ Translation of French comments within the FORTRAN sources into
35 !+ English comments
36 !
37 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
38 !+ 21/08/2010
39 !+ V6P0
40 !+ Creation of DOXYGEN tags for automated documentation and
41 !+ cross-referencing of the FORTRAN sources
42 !
43 !history J.-M. HERVOUET (LNHE)
44 !+ 26/08/2011
45 !+ V6P2
46 !+ Adaptation to element 51 (prisms cut into tetrahedrons)
47 !
48 !history J.-M. HERVOUET (LNHE)
49 !+ 24/08/2012
50 !+ V6P2
51 !+ Computation of fluxes and assembly swapped in intermediate planes.
52 !
53 !history J.-M. HERVOUET (LNHE)
54 !+ 11/09/2017
55 !+ V7P3
56 !+ Argument NELMAX2 added for dimensioning arrays.
57 !
58 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
59 !| FLOW |<--| FLUX
60 !| IELM3 |-->| DISCRETISATION IN 3D
61 !| | | (41: PRISMS 51:PRISMS CUT INTO TETRAHEDRONS)
62 !| IKLE |-->| CONNECTIVITY TABLE
63 !| INIFLO |-->| IF(YES) FLOW WILL BE INITIALISED AT 0.
64 !| IOPT |-->| CHOICE OF THE CONSTANT IN FLUX_EF_VF
65 !| KNOLG |-->| GIVES THE ORIGINAL GLOBAL NUMBER OF POINTS
66 !| | | IN SCALAR MODE (SIZE NPOIN3 BUT FILLED ONLY
67 !| | | UP TO NPOIN2)
68 !| MESH2D |-->| 2D MESH
69 !| NELEM2 |-->| NUMBER OF ELEMENTS IN 2D
70 !| NELMAX2 |-->| MAXIMUM NUMBER OF ELEMENTS IN 2D
71 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS (SEE IKLE)
72 !| NPLAN |-->| NUMBER OF PLANES IN THE 3D MESH
73 !| NSEG2D |-->| NUMBER OF SEGMENTS IN 2D
74 !| SENS |-->| IF 1: HORIZONTAL FLUXES FROM BOTTOM TO TOP
75 !| | | IF 2: HORIZONTAL FLUXES FROM TOP TO BOTTOM
76 !| W2D |<--| NON ASSEMBLED FLUXES LEAVING POINTS,PER TRIANGLE
77 !| W3D |-->| NON ASSEMBLED FLUXES LEAVING POINTS,PER PRISM
78 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
79 !
80  USE bief, ex_flux_ef_vf_3d => flux_ef_vf_3d
81  USE declarations_telemac, ONLY : tetra
82 !
84  IMPLICIT NONE
85 !
86 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
87 !
88  INTEGER, INTENT(IN) :: NSEG2D,NELEM2
89 ! *=NSEG2D*NPLAN+NPOIN2*NETAGE
90  INTEGER, INTENT(IN) :: IOPT,SENS,IELM3,NPLAN,NELMAX
91  INTEGER, INTENT(IN) :: NELMAX2
92 ! 6 IF IELM3=41
93 ! 4 IF IELM3=51
94  INTEGER, INTENT(IN) :: IKLE(nelmax,*),KNOLG(*)
95  DOUBLE PRECISION, INTENT(INOUT) :: FLOW(*)
96 ! 6 IF IELM3=41
97 ! 4 IF IELM3=51
98  DOUBLE PRECISION, INTENT(IN) :: W3D(nelmax,*)
99  DOUBLE PRECISION, INTENT(INOUT) :: W2D(nelmax2,3)
100  LOGICAL, INTENT(IN) :: INIFLO
101  TYPE(bief_mesh), INTENT(INOUT) :: MESH2D
102 !
103 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
104 !
105  INTEGER IPLAN,N1,N2,N3,N4,IELEM,I1,I2,I3,S1,S2,S3,IT,IELEM3D,K,L
106 !
107 ! TETRA : WILL GIVE THE LOCAL NUMBERS OF POINTS IN THE PRISM
108 ! THE 0 CORRESPOND TO SITUATIONS
109 ! THAT NEVER HAPPEN (TETRA(1,1,1,... OR TETRA(2,2,2,...)
110 ! INTEGER TETRA(2,2,2,3,4)
111 ! DATA TETRA / 0,1,1,1,1,1,1,0,0,4,4,4,4,4,4,0,0,6,4,5,5,4,6,0,
112 ! & 0,2,2,2,2,2,2,0,0,6,6,6,6,6,6,0,0,3,1,2,2,1,3,0,
113 ! & 0,3,3,3,3,3,3,0,0,5,5,5,5,5,5,0,0,2,3,4,1,6,5,0,
114 ! & 0,4,5,4,6,6,5,0,0,2,3,3,1,2,1,0,0,4,5,3,6,2,1,0 /
115 !
116 !-----------------------------------------------------------------------
117 !
118  IF(sens.NE.1.AND.sens.NE.2) THEN
119  WRITE(lu,*) 'FLUX_EF_VF_3D: UNKNOWN SENS = ',sens
120  CALL plante(1)
121  stop
122  ENDIF
123 !
124  IF(sens.EQ.2.AND..NOT.iniflo) THEN
125  WRITE(lu,*) 'FLUX_EF_VF_3D: SENS = 2 AND INIFLO = .FALSE.'
126  WRITE(lu,*) ' INCOMPATIBLE OPTIONS'
127  CALL plante(1)
128  stop
129  ENDIF
130 !
131 !-----------------------------------------------------------------------
132 !
133  IF(ielm3.EQ.41) THEN
134 !
135 ! CASE OF PRISMS
136 !
137 ! ADDS FLUXES ON HORIZONTAL SEGMENTS (FOR SEGMENT NUMBERING IN 3D
138 ! SEE STOSEG41 IN BIEF)
139 !
140 ! FOR INTERMEDIATE PLANES
141 ! HERE WE HAVE THE CHOICE OF COMPUTING THE FLUXES BEFORE OR AFTER
142 ! ASSEMBLING ON VERTICAL. UP TO VERSION 6.1, ASSEMBLY WAS DONE FIRST
143 ! FROM VERSION 6.2 ON WE COMPUTE THE FLUXES FIRST AND ASSEMBLE AFTER
144 ! THIS IS MORE COMPATIBLE WITH DISTRIBUTIVE SCHEMES THAT COMPUTE
145 ! THEIR FLUXES AT ELEMENT LEVEL. THEN THE FLUX LIMITATION DONE
146 ! IN NA_FLUX3D_LIM WILL BE COMPATIBLE.
147 !
148  DO iplan=1,nplan
149 !
150  IF(sens.EQ.1) THEN
151  n1=(iplan-1 )*nseg2d+1
152  n2= iplan *nseg2d
153  ELSE
154  n1=( nplan-iplan)*nseg2d+1
155  n2=(1+nplan-iplan)*nseg2d
156  ENDIF
157 !
158 ! POINTS 1, 2 AND 3 OF UPPER LEVEL
159  IF(iplan.EQ.1) THEN
160 ! FIRST PLANE: ONLY POINTS 1, 2 AND 3 OF UPPER LEVEL
161  DO ielem=1,nelem2
162  w2d(ielem,1)=w3d(ielem,1)
163  w2d(ielem,2)=w3d(ielem,2)
164  w2d(ielem,3)=w3d(ielem,3)
165  ENDDO
166  CALL flux_ef_vf(flow(n1:n2),w2d,nseg2d,nelem2,mesh2d%NELMAX,
167  & mesh2d%ELTSEG%I,mesh2d%ORISEG%I,
168  & mesh2d%IKLE%I,iniflo,iopt)
169  ELSEIF(iplan.EQ.nplan) THEN
170 ! LAST PLANE: ONLY POINTS 4, 5 AND 6 OF LOWER LEVEL
171  n3=nelem2*(iplan-2)
172  DO ielem=1,nelem2
173  w2d(ielem,1)=w3d(n3+ielem,4)
174  w2d(ielem,2)=w3d(n3+ielem,5)
175  w2d(ielem,3)=w3d(n3+ielem,6)
176  ENDDO
177  CALL flux_ef_vf(flow(n1:n2),w2d,nseg2d,nelem2,mesh2d%NELMAX,
178  & mesh2d%ELTSEG%I,mesh2d%ORISEG%I,
179  & mesh2d%IKLE%I,iniflo,iopt)
180  ELSE
181 ! INTERMEDIATE PLANE
182 ! POINTS 4, 5 AND 6 OF LOWER LEVEL
183  n3=nelem2*(iplan-2)
184  DO ielem=1,nelem2
185  w2d(ielem,1)=w3d(n3+ielem,4)
186  w2d(ielem,2)=w3d(n3+ielem,5)
187  w2d(ielem,3)=w3d(n3+ielem,6)
188  ENDDO
189  CALL flux_ef_vf(flow(n1:n2),w2d,nseg2d,nelem2,mesh2d%NELMAX,
190  & mesh2d%ELTSEG%I,mesh2d%ORISEG%I,
191  & mesh2d%IKLE%I,iniflo,iopt)
192 ! POINTS 1, 2, 3 OF UPPER LEVEL
193  n4=n3+nelem2
194  DO ielem=1,nelem2
195  w2d(ielem,1)=w3d(n4+ielem,1)
196  w2d(ielem,2)=w3d(n4+ielem,2)
197  w2d(ielem,3)=w3d(n4+ielem,3)
198  ENDDO
199  CALL flux_ef_vf(flow(n1:n2),w2d,nseg2d,nelem2,mesh2d%NELMAX,
200  & mesh2d%ELTSEG%I,mesh2d%ORISEG%I,
201  & mesh2d%IKLE%I,.false.,iopt)
202 ! !!!!!!!
203  ENDIF
204 !
205  ENDDO
206 !
207 !-----------------------------------------------------------------------
208 !
209  ELSEIF(ielm3.EQ.51) THEN
210 !
211 ! CASE OF PRISMS CUT INTO TETRAHEDRONS
212 !
213 ! ADDS FLUXES ON HORIZONTAL SEGMENTS (FOR SEGMENT NUMBERING IN 3D
214 ! SEE STOSEG51 IN BIEF)
215 !
216 !
217 ! INITIALISING
218 !
219  DO ielem=1,nelem2
220  w2d(ielem,1)=0.d0
221  w2d(ielem,2)=0.d0
222  w2d(ielem,3)=0.d0
223  ENDDO
224 !
225 ! LOOP ON PLANES
226 !
227  DO iplan=1,nplan
228 !
229 ! LOOP ON TRIANGLES
230 !
231  DO ielem=1,nelem2
232 !
233 ! HERE LOWER LEVEL OF ELEMENTS ALWAYS TAKEN
234 ! TO FIND THE WAY THE PRISM HAS BEEN CUT BY LOOKING
235 ! AT GLOBAL NUMBERS OF POINTS
236 ! THIS PART IS THUS COMMON TO ALL PLANES
237 ! IKLE 3D IS TAKEN, COULD BE IKLE 2D AS WELL
238 ! SO NO DEPENDENCE ON LEVEL IPLAN
239  i1=ikle(ielem,1)
240  i2=ikle(ielem,2)
241  i3=ikle(ielem,3)
242 ! IN PARALLELISM BACK TO ORIGINAL GLOBAL NUMBERS
243  IF(ncsize.GT.1) THEN
244  i1=knolg(i1)
245  i2=knolg(i2)
246  i3=knolg(i3)
247  ENDIF
248 ! THIS IS DONE LIKE IN CPIKLE3 TO USE ARRAY TETRA
249  IF(i1.GT.i2) THEN
250  s1=1
251  ELSE
252  s1=2
253  ENDIF
254  IF(i2.GT.i3) THEN
255  s2=1
256  ELSE
257  s2=2
258  ENDIF
259  IF(i3.GT.i1) THEN
260  s3=1
261  ELSE
262  s3=2
263  ENDIF
264 !
265 ! NOW TAKING CONTRIBUTIONS OF TETRAHEDRON K= 1, 2 AND 3
266 ! OF LOWER AND UPPER LEVEL
267 !
268 ! LOWER LEVEL : POINTS 4,5,6 OF ORIGINAL PRISM CONTRIBUTE
269 !
270  IF(iplan.GT.1) THEN
271 ! LOOP ON 3 TETRAHEDRONS
272  DO k=1,3
273  ielem3d=3*(iplan-2)*nelem2+ielem+(k-1)*nelem2
274 ! POINTS 1 TO 4
275  DO l=1,4
276 ! ORIGINAL NUMBER IN THE PRISM
277  it=tetra(s1,s2,s3,k,l)
278  IF(it.GE.4) THEN
279  w2d(ielem,it-3)=w2d(ielem,it-3)+w3d(ielem3d,l)
280  ENDIF
281  ENDDO
282  ENDDO
283  ENDIF
284 !
285 ! UPPER LEVEL : POINTS 1,2,3 OF ORIGINAL PRISM CONTRIBUTE
286 !
287  IF(iplan.LT.nplan) THEN
288 ! LOOP ON 3 TETRAHEDRONS
289  DO k=1,3
290  ielem3d=3*(iplan-1)*nelem2+ielem+(k-1)*nelem2
291 ! POINTS 1 TO 4
292  DO l=1,4
293 ! ORIGINAL NUMBER IN THE PRISM
294  it=tetra(s1,s2,s3,k,l)
295  IF(it.LE.3) THEN
296  w2d(ielem,it)=w2d(ielem,it)+w3d(ielem3d,l)
297  ENDIF
298  ENDDO
299  ENDDO
300  ENDIF
301 !
302  ENDDO
303 !
304  IF(sens.EQ.1) THEN
305  n1=(iplan-1 )*nseg2d+1
306  n2= iplan *nseg2d
307  ELSE
308  n1=( nplan-iplan)*nseg2d+1
309  n2=(1+nplan-iplan)*nseg2d
310  ENDIF
311 !
312  ENDDO
313 !
314 ! HERE 2D FLUXES !!!!!!!!!!!!!
315 !
316  CALL flux_ef_vf(flow,w2d,nseg2d,nelem2,mesh2d%NELMAX,
317  & mesh2d%ELTSEG%I,mesh2d%ORISEG%I,
318  & mesh2d%IKLE%I,iniflo,iopt)
319 !
320 !-----------------------------------------------------------------------
321 !
322  ELSE
323  WRITE(lu,*) 'UNEXPECTED ELEMENT TYPE IN FLUX_EF_VF_3D'
324  CALL plante(1)
325  stop
326  ENDIF
327 !
328 !-----------------------------------------------------------------------
329 !
330  RETURN
331  END
subroutine flux_ef_vf_3d(FLOW, W2D, W3D, NSEG2D, NELEM2, NELMAX2, MESH2D, INIFLO, IOPT, SENS, IELM3, NPLAN, IKLE, NELMAX, KNOLG)
Definition: flux_ef_vf_3d.f:8
integer, dimension(2, 2, 2, 3, 4) tetra
subroutine flux_ef_vf(FLOW, PHIEL, NSEG, NELEM, NELMAX, ELTSEG, ORISEG, IKLE, INIFLO, IOPT, FN, YAFLULIM, FLULIM, YAFLULIMEBE, FLULIMEBE)
Definition: flux_ef_vf.f:8
Definition: bief.f:3