The TELEMAC-MASCARET system  trunk
flux_ef_vf_3.f
Go to the documentation of this file.
1 ! ***********************
2  SUBROUTINE flux_ef_vf_3
3 ! ***********************
4 !
5  &(phiel,nelem,nelmax,eltseg,oriseg,fxmatpar,nseg,ikle,npoin,
6  & fn,fi_i,su,hdfdt,teta,yaflulim,flulim,yaflulimebe,flulimebe)
7 !
8 !***********************************************************************
9 ! BIEF V7P3
10 !***********************************************************************
11 !
12 !brief Equivalent of FLUX_EF_VF, but only for PSI scheme, and the
13 !+ result is given in terms of contribution per point, not fluxes
14 !+ between points, and takes a derivative in time into account.
15 !
16 !warning When both YAFLULIM and YAFLULIMEBE are true only the latter is
17 !+ taken into account !
18 !
19 !history J-M HERVOUET & SARA PAVAN (EDF LAB, LNHE)
20 !+ 04/08/2015
21 !+ V7P1
22 !+ First version. The N and PSI versions are not different here.
23 !
24 !history J-M HERVOUET (EDF LAB, LNHE)
25 !+ 05/11/2016
26 !+ V7P3
27 !+ Now two options of flux limitation offered.
28 !
29 !history J-M HERVOUET (EDF LAB, LNHE)
30 !+ 09/09/2017
31 !+ V7P3
32 !+ Argument NELMAX added for correctly dimensioning arrays.
33 !
34 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
35 !| ELTSEG |-->| GIVES THE SEGMENTS IN A TRIANGLE
36 !| FI_I |<--| CONTRIBUTIONS TO POINTS
37 !| FLULIM |-->| LIMITATION OF FLUXES BY SEGMENT
38 !| FLULIMEBE |-->| LIMITATION OF FLUXES BY SEGMENT BUT EBE
39 !| FN |-->| TRACER AT TIME T(N)
40 !| FXMARPAR |-->| FLUXES ASSEMBLED IN //
41 !| HDFDT |-->| DEPTH*DH/DT
42 !| IKLE |-->| CONNECTIVITY TABLE
43 !| NELEM |-->| NUMBER OF ELEMENTS
44 !| NELEM |-->| MAXIMUM NUMBER OF ELEMENTS
45 !| NPOIN |-->| NUMBER OF POINTS
46 !| NSEG |-->| NUMBER OF SEGMENTS
47 !| ORISEG |-->| GIVES THE ORIENTATION OF SEGMENTS IN A TRIANGLE
48 !| PHIEL |-->| PER ELEMENT, FLUXES LEAVING POINTS
49 !| SU |-->| SURFACE OF TRIANGLES
50 !| TETA |-->| LOCAL IMPLICITATION
51 !| YAFLULIM |-->| IF YES, A LIMITATION OF FLUXES IS GIVEN BY SEGMENT
52 !| YAFLULIMEBE |-->| IF YES, AN EBE LIMITATION OF FLUXES IS GIVEN
53 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
54 !
56  USE bief, ex_flux_ef_vf_3 => flux_ef_vf_3
57 !
58  IMPLICIT NONE
59 !
60 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
61 !
62  INTEGER, INTENT(IN) :: NELEM,NELMAX,NPOIN,NSEG
63  INTEGER, INTENT(IN) :: IKLE(nelmax,3)
64  INTEGER, INTENT(IN) :: ELTSEG(nelmax,3)
65  INTEGER, INTENT(IN) :: ORISEG(nelmax,3)
66  LOGICAL, INTENT(IN) :: YAFLULIM,YAFLULIMEBE
67  DOUBLE PRECISION, INTENT(IN) :: PHIEL(nelmax,3),TETA(npoin)
68  DOUBLE PRECISION, INTENT(IN) :: FLULIMEBE(*)
69  DOUBLE PRECISION, INTENT(IN) :: FXMATPAR(nseg),FLULIM(*)
70  DOUBLE PRECISION, INTENT(INOUT) :: FI_I(npoin)
71  DOUBLE PRECISION, INTENT(IN) :: SU(nelem),HDFDT(npoin)
72  TYPE(bief_obj), INTENT(IN) :: FN
73 !
74 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
75 !
76  INTEGER IELEM,I1,I2,I3,I,ISEG1,ISEG2,ISEG3
77  DOUBLE PRECISION K1,K2,K3,FN1,FN2,FN3,BETA1,BETA2,BETA3
78  DOUBLE PRECISION FINCORR1,FINCORR2,FINCORR3,PHITCOR,COEF
79 ! PSI FLUXES WITH FN
80  DOUBLE PRECISION FP21,FP32,FP13,FP12,FP23,FP31
81  DOUBLE PRECISION MIN12,MIN23,MIN13,MT1,MT2,MT3
82 !
83  INTRINSIC min,max
84 !
85  DOUBLE PRECISION, PARAMETER :: EPSPHI=1.d-12
86  DOUBLE PRECISION, PARAMETER :: TIERS =1.d0/3.d0
87 !
88 !-----------------------------------------------------------------------
89 !
90  DO i=1,npoin
91  fi_i(i)=0.d0
92  ENDDO
93 !
94 ! DEPENDING ON THE FLUX LIMITATION...
95 !
96  IF(yaflulimebe) THEN
97 !
98 ! AS WHEN YAFLULIM=.TRUE., BUT WITH FLULIM ASSUMED TO BE 1
99 !
100  DO ielem = 1,nelem
101 !
102  k1 = -phiel(ielem,1)
103  k2 = -phiel(ielem,2)
104  k3 = -phiel(ielem,3)
105 !
106  i1=ikle(ielem,1)
107  i2=ikle(ielem,2)
108  i3=ikle(ielem,3)
109 !
110  iseg1=eltseg(ielem,1)
111  iseg2=eltseg(ielem,2)
112  iseg3=eltseg(ielem,3)
113 !
114 ! STARTS WITH N-SCHEME (EQUIVALENT TO LEO POSTMA'S IMPLEMENTATION)
115 ! FIJ HERE LIKE LAMBDA(I,J) IN BOOK
116 ! I.E. FIJ>0 MEANS FLUX FROM J TO I !!!!!
117 !
118  fp12=max(min(k1,-k2),0.d0)*flulimebe((1-1)*nelmax+ielem)
119  fp23=max(min(k2,-k3),0.d0)*flulimebe((2-1)*nelmax+ielem)
120  fp31=max(min(k3,-k1),0.d0)*flulimebe((3-1)*nelmax+ielem)
121  fp21=max(min(k2,-k1),0.d0)*flulimebe((1-1)*nelmax+ielem)
122  fp32=max(min(k3,-k2),0.d0)*flulimebe((2-1)*nelmax+ielem)
123  fp13=max(min(k1,-k3),0.d0)*flulimebe((3-1)*nelmax+ielem)
124 !
125 ! CORRECTING THE FLUXES WHEN THEIR SIGN IS NOT THE SAME
126 ! AS THE ASSEMBLED VALUE, KNOWING THAT ALL THE FPIJ ARE
127 ! POSITIVE BY CONSTRUCTION
128 !
129 ! SEGMENT 1
130 !
131  IF(oriseg(ielem,1).EQ.1) THEN
132  IF(fxmatpar(iseg1).GT.0.d0) THEN
133  fp12=0.d0
134  IF(fp21.GT. fxmatpar(iseg1)) fp21=fxmatpar(iseg1)
135  ELSE
136  fp21=0.d0
137  IF(fp12.GT.-fxmatpar(iseg1)) fp12=-fxmatpar(iseg1)
138  ENDIF
139  ELSE
140  IF(fxmatpar(iseg1).GT.0.d0) THEN
141  fp21=0.d0
142  IF(fp12.GT. fxmatpar(iseg1)) fp12=fxmatpar(iseg1)
143  ELSE
144  fp12=0.d0
145  IF(fp21.GT.-fxmatpar(iseg1)) fp21=-fxmatpar(iseg1)
146  ENDIF
147  ENDIF
148 !
149 ! SEGMENT 2
150 !
151  IF(oriseg(ielem,2).EQ.1) THEN
152  IF(fxmatpar(iseg2).GT.0.d0) THEN
153  fp23=0.d0
154  IF(fp32.GT. fxmatpar(iseg2)) fp32=fxmatpar(iseg2)
155  ELSE
156  fp32=0.d0
157  IF(fp23.GT.-fxmatpar(iseg2)) fp23=-fxmatpar(iseg2)
158  ENDIF
159  ELSE
160  IF(fxmatpar(iseg2).GT.0.d0) THEN
161  fp32=0.d0
162  IF(fp23.GT. fxmatpar(iseg2)) fp23=fxmatpar(iseg2)
163  ELSE
164  fp23=0.d0
165  IF(fp32.GT.-fxmatpar(iseg2)) fp32=-fxmatpar(iseg2)
166  ENDIF
167  ENDIF
168 !
169 ! SEGMENT 3
170 !
171  IF(oriseg(ielem,3).EQ.1) THEN
172  IF(fxmatpar(iseg3).GT.0.d0) THEN
173  fp31=0.d0
174  IF(fp13.GT. fxmatpar(iseg3)) fp13=fxmatpar(iseg3)
175  ELSE
176  fp13=0.d0
177  IF(fp31.GT.-fxmatpar(iseg3)) fp31=-fxmatpar(iseg3)
178  ENDIF
179  ELSE
180  IF(fxmatpar(iseg3).GT.0.d0) THEN
181  fp13=0.d0
182  IF(fp31.GT.fxmatpar(iseg3)) fp31=fxmatpar(iseg3)
183  ELSE
184  fp31=0.d0
185  IF(fp13.GT.-fxmatpar(iseg3)) fp13=-fxmatpar(iseg3)
186  ENDIF
187  ENDIF
188 !
189 ! END OF CORRECTION OF FLUXES
190 !
191  fn1=fn%R(i1)
192  fn2=fn%R(i2)
193  fn3=fn%R(i3)
194 !
195 ! MINIMUM OF THE 1-TETA
196 !
197  mt1=1.d0-teta(i1)
198  mt2=1.d0-teta(i2)
199  mt3=1.d0-teta(i3)
200  min12=min(mt1,mt2)
201  min13=min(mt1,mt3)
202  min23=min(mt2,mt3)
203 !
204 ! PART OF CONTRIBUTIONS THAT WILL NOT BE LIMITED, IMMEDIATELY ASSEMBLED
205 !
206  fi_i(i1)=fi_i(i1)+fp12*(fn1*(mt1-min12)-fn2*(mt2-min12))
207  & +fp13*(fn1*(mt1-min13)-fn3*(mt3-min13))
208  fi_i(i2)=fi_i(i2)+fp21*(fn2*(mt2-min12)-fn1*(mt1-min12))
209  & +fp23*(fn2*(mt2-min23)-fn3*(mt3-min23))
210  fi_i(i3)=fi_i(i3)+fp31*(fn3*(mt3-min13)-fn1*(mt1-min13))
211  & +fp32*(fn3*(mt3-min23)-fn2*(mt2-min23))
212 !
213 ! NOW PART OF CONTRIBUTIONS THAT WILL BE LIMITED
214 !
215  coef=su(ielem)*tiers
216 !
217 ! AS CLASSICAL N SCHEME, BUT WITH DERIVATIVE IN TIME ADDED
218 ! HDFDT MUST BE ((1.D0-TETA)*H+TETA*HN)*(FSTAR-F)/DDT
219 !
220  fincorr1=
221  & hdfdt(i1)*coef+fp12*(fn1-fn2)*min12+fp13*(fn1-fn3)*min13
222  fincorr2=
223  & hdfdt(i2)*coef+fp21*(fn2-fn1)*min12+fp23*(fn2-fn3)*min23
224  fincorr3=
225  & hdfdt(i3)*coef+fp31*(fn3-fn1)*min13+fp32*(fn3-fn2)*min23
226 !
227 ! PHITCOR IS THE NEW TOTAL RESIDUAL,
228 !
229  phitcor=fincorr1+fincorr2+fincorr3
230 !
231  IF(phitcor.GT.epsphi) THEN
232 ! PSI REDUCTION
233  beta1=max(fincorr1,0.d0)
234  beta2=max(fincorr2,0.d0)
235  beta3=max(fincorr3,0.d0)
236  coef=phitcor/(beta1+beta2+beta3)
237  fi_i(i1)=fi_i(i1)+beta1*coef
238  fi_i(i2)=fi_i(i2)+beta2*coef
239  fi_i(i3)=fi_i(i3)+beta3*coef
240  ELSEIF(phitcor.LT.-epsphi) THEN
241 ! PSI REDUCTION
242  beta1=min(fincorr1,0.d0)
243  beta2=min(fincorr2,0.d0)
244  beta3=min(fincorr3,0.d0)
245  coef=phitcor/(beta1+beta2+beta3)
246  fi_i(i1)=fi_i(i1)+beta1*coef
247  fi_i(i2)=fi_i(i2)+beta2*coef
248  fi_i(i3)=fi_i(i3)+beta3*coef
249  ELSE
250 ! NO REDUCTION
251  fi_i(i1)=fi_i(i1)+fincorr1
252  fi_i(i2)=fi_i(i2)+fincorr2
253  fi_i(i3)=fi_i(i3)+fincorr3
254  ENDIF
255 !
256  ENDDO
257 !
258  ELSEIF(yaflulim) THEN
259 !
260 ! THE SAME BUT WITH FLUX LIMITATION GIVEN
261 !
262  DO ielem = 1,nelem
263 !
264  k1 = -phiel(ielem,1)
265  k2 = -phiel(ielem,2)
266  k3 = -phiel(ielem,3)
267 !
268  i1=ikle(ielem,1)
269  i2=ikle(ielem,2)
270  i3=ikle(ielem,3)
271 !
272  iseg1=eltseg(ielem,1)
273  iseg2=eltseg(ielem,2)
274  iseg3=eltseg(ielem,3)
275 !
276 ! STARTS WITH N-SCHEME (EQUIVALENT TO LEO POSTMA'S IMPLEMENTATION)
277 ! FIJ HERE LIKE LAMBDA(I,J) IN BOOK
278 ! I.E. FIJ>0 MEANS FLUX FROM J TO I !!!!!
279 !
280  fp12=max(min(k1,-k2),0.d0)*flulim(iseg1)
281  fp23=max(min(k2,-k3),0.d0)*flulim(iseg2)
282  fp31=max(min(k3,-k1),0.d0)*flulim(iseg3)
283  fp21=max(min(k2,-k1),0.d0)*flulim(iseg1)
284  fp32=max(min(k3,-k2),0.d0)*flulim(iseg2)
285  fp13=max(min(k1,-k3),0.d0)*flulim(iseg3)
286 !
287 ! CORRECTING THE FLUXES WHEN THEIR SIGN IS NOT THE SAME
288 ! AS THE ASSEMBLED VALUE
289 !
290 ! SEGMENT 1
291 !
292  IF(oriseg(ielem,1).EQ.1) THEN
293  IF(fxmatpar(iseg1).GT.0.d0) THEN
294  fp12=0.d0
295  IF(fp21.GT. fxmatpar(iseg1)) fp21=fxmatpar(iseg1)
296  ELSE
297  fp21=0.d0
298  IF(fp12.GT.-fxmatpar(iseg1)) fp12=-fxmatpar(iseg1)
299  ENDIF
300  ELSE
301  IF(fxmatpar(iseg1).GT.0.d0) THEN
302  fp21=0.d0
303  IF(fp12.GT. fxmatpar(iseg1)) fp12=fxmatpar(iseg1)
304  ELSE
305  fp12=0.d0
306  IF(fp21.GT.-fxmatpar(iseg1)) fp21=-fxmatpar(iseg1)
307  ENDIF
308  ENDIF
309 !
310 ! SEGMENT 2
311 !
312  IF(oriseg(ielem,2).EQ.1) THEN
313  IF(fxmatpar(iseg2).GT.0.d0) THEN
314  fp23=0.d0
315  IF(fp32.GT. fxmatpar(iseg2)) fp32=fxmatpar(iseg2)
316  ELSE
317  fp32=0.d0
318  IF(fp23.GT.-fxmatpar(iseg2)) fp23=-fxmatpar(iseg2)
319  ENDIF
320  ELSE
321  IF(fxmatpar(iseg2).GT.0.d0) THEN
322  fp32=0.d0
323  IF(fp23.GT. fxmatpar(iseg2)) fp23=fxmatpar(iseg2)
324  ELSE
325  fp23=0.d0
326  IF(fp32.GT.-fxmatpar(iseg2)) fp32=-fxmatpar(iseg2)
327  ENDIF
328  ENDIF
329 !
330 ! SEGMENT 3
331 !
332  IF(oriseg(ielem,3).EQ.1) THEN
333  IF(fxmatpar(iseg3).GT.0.d0) THEN
334  fp31=0.d0
335  IF(fp13.GT. fxmatpar(iseg3)) fp13=fxmatpar(iseg3)
336  ELSE
337  fp13=0.d0
338  IF(fp31.GT.-fxmatpar(iseg3)) fp31=-fxmatpar(iseg3)
339  ENDIF
340  ELSE
341  IF(fxmatpar(iseg3).GT.0.d0) THEN
342  fp13=0.d0
343  IF(fp31.GT.fxmatpar(iseg3)) fp31=fxmatpar(iseg3)
344  ELSE
345  fp31=0.d0
346  IF(fp13.GT.-fxmatpar(iseg3)) fp13=-fxmatpar(iseg3)
347  ENDIF
348  ENDIF
349 !
350 ! END OF CORRECTION OF FLUXES
351 !
352  fn1=fn%R(i1)
353  fn2=fn%R(i2)
354  fn3=fn%R(i3)
355 !
356 ! MINIMUM OF THE 1-TETA
357 !
358  mt1=1.d0-teta(i1)
359  mt2=1.d0-teta(i2)
360  mt3=1.d0-teta(i3)
361  min12=min(mt1,mt2)
362  min13=min(mt1,mt3)
363  min23=min(mt2,mt3)
364 !
365 ! PART OF CONTRIBUTIONS THAT WILL NOT BE LIMITED, IMMEDIATELY ASSEMBLED
366 !
367  fi_i(i1)=fi_i(i1)+fp12*(fn1*(mt1-min12)-fn2*(mt2-min12))
368  & +fp13*(fn1*(mt1-min13)-fn3*(mt3-min13))
369  fi_i(i2)=fi_i(i2)+fp21*(fn2*(mt2-min12)-fn1*(mt1-min12))
370  & +fp23*(fn2*(mt2-min23)-fn3*(mt3-min23))
371  fi_i(i3)=fi_i(i3)+fp31*(fn3*(mt3-min13)-fn1*(mt1-min13))
372  & +fp32*(fn3*(mt3-min23)-fn2*(mt2-min23))
373 !
374 ! NOW PART OF CONTRIBUTIONS THAT WILL BE LIMITED
375 !
376  coef=su(ielem)*tiers
377 !
378 ! AS CLASSICAL N SCHEME, BUT WITH DERIVATIVE IN TIME ADDED
379 ! HDFDT MUST BE ((1.D0-TETA)*H+TETA*HN)*(FSTAR-F)/DDT
380 !
381  fincorr1=hdfdt(i1)*coef
382  & +fp12*(fn1-fn2)*min12+fp13*(fn1-fn3)*min13
383  fincorr2=hdfdt(i2)*coef
384  & +fp21*(fn2-fn1)*min12+fp23*(fn2-fn3)*min23
385  fincorr3=hdfdt(i3)*coef
386  & +fp31*(fn3-fn1)*min13+fp32*(fn3-fn2)*min23
387 !
388 ! PHITCOR IS THE NEW TOTAL RESIDUAL,
389 !
390  phitcor=fincorr1+fincorr2+fincorr3
391 !
392  IF(phitcor.GT.epsphi) THEN
393 ! PSI REDUCTION
394  beta1=max(fincorr1,0.d0)
395  beta2=max(fincorr2,0.d0)
396  beta3=max(fincorr3,0.d0)
397  coef=phitcor/(beta1+beta2+beta3)
398  fi_i(i1)=fi_i(i1)+beta1*coef
399  fi_i(i2)=fi_i(i2)+beta2*coef
400  fi_i(i3)=fi_i(i3)+beta3*coef
401  ELSEIF(phitcor.LT.-epsphi) THEN
402 ! PSI REDUCTION
403  beta1=min(fincorr1,0.d0)
404  beta2=min(fincorr2,0.d0)
405  beta3=min(fincorr3,0.d0)
406  coef=phitcor/(beta1+beta2+beta3)
407  fi_i(i1)=fi_i(i1)+beta1*coef
408  fi_i(i2)=fi_i(i2)+beta2*coef
409  fi_i(i3)=fi_i(i3)+beta3*coef
410  ELSE
411 ! NO REDUCTION
412  fi_i(i1)=fi_i(i1)+fincorr1
413  fi_i(i2)=fi_i(i2)+fincorr2
414  fi_i(i3)=fi_i(i3)+fincorr3
415  ENDIF
416 !
417  ENDDO
418 !
419  ELSE
420 !
421 ! HERE NO FLUX LIMITATION
422 !
423  DO ielem = 1,nelem
424 !
425  k1 = -phiel(ielem,1)
426  k2 = -phiel(ielem,2)
427  k3 = -phiel(ielem,3)
428 !
429  i1=ikle(ielem,1)
430  i2=ikle(ielem,2)
431  i3=ikle(ielem,3)
432 !
433  iseg1=eltseg(ielem,1)
434  iseg2=eltseg(ielem,2)
435  iseg3=eltseg(ielem,3)
436 !
437 ! STARTS WITH N-SCHEME (EQUIVALENT TO LEO POSTMA'S IMPLEMENTATION)
438 ! FIJ HERE LIKE LAMBDA(I,J) IN BOOK
439 ! I.E. FIJ>0 MEANS FLUX FROM J TO I !!!!!
440 !
441  fp12=max(min(k1,-k2),0.d0)
442  fp23=max(min(k2,-k3),0.d0)
443  fp31=max(min(k3,-k1),0.d0)
444  fp21=max(min(k2,-k1),0.d0)
445  fp32=max(min(k3,-k2),0.d0)
446  fp13=max(min(k1,-k3),0.d0)
447 !
448 ! CORRECTING THE FLUXES WHEN THEIR SIGN IS NOT THE SAME
449 ! AS THE ASSEMBLED VALUE, KNOWING THAT ALL THE FPIJ ARE
450 ! POSITIVE BY CONSTRUCTION
451 !
452 ! SEGMENT 1
453 !
454  IF(oriseg(ielem,1).EQ.1) THEN
455  IF(fxmatpar(iseg1).GT.0.d0) THEN
456  fp12=0.d0
457  IF(fp21.GT. fxmatpar(iseg1)) fp21=fxmatpar(iseg1)
458  ELSE
459  fp21=0.d0
460  IF(fp12.GT.-fxmatpar(iseg1)) fp12=-fxmatpar(iseg1)
461  ENDIF
462  ELSE
463  IF(fxmatpar(iseg1).GT.0.d0) THEN
464  fp21=0.d0
465  IF(fp12.GT. fxmatpar(iseg1)) fp12=fxmatpar(iseg1)
466  ELSE
467  fp12=0.d0
468  IF(fp21.GT.-fxmatpar(iseg1)) fp21=-fxmatpar(iseg1)
469  ENDIF
470  ENDIF
471 !
472 ! SEGMENT 2
473 !
474  IF(oriseg(ielem,2).EQ.1) THEN
475  IF(fxmatpar(iseg2).GT.0.d0) THEN
476  fp23=0.d0
477  IF(fp32.GT. fxmatpar(iseg2)) fp32=fxmatpar(iseg2)
478  ELSE
479  fp32=0.d0
480  IF(fp23.GT.-fxmatpar(iseg2)) fp23=-fxmatpar(iseg2)
481  ENDIF
482  ELSE
483  IF(fxmatpar(iseg2).GT.0.d0) THEN
484  fp32=0.d0
485  IF(fp23.GT. fxmatpar(iseg2)) fp23=fxmatpar(iseg2)
486  ELSE
487  fp23=0.d0
488  IF(fp32.GT.-fxmatpar(iseg2)) fp32=-fxmatpar(iseg2)
489  ENDIF
490  ENDIF
491 !
492 ! SEGMENT 3
493 !
494  IF(oriseg(ielem,3).EQ.1) THEN
495  IF(fxmatpar(iseg3).GT.0.d0) THEN
496  fp31=0.d0
497  IF(fp13.GT. fxmatpar(iseg3)) fp13=fxmatpar(iseg3)
498  ELSE
499  fp13=0.d0
500  IF(fp31.GT.-fxmatpar(iseg3)) fp31=-fxmatpar(iseg3)
501  ENDIF
502  ELSE
503  IF(fxmatpar(iseg3).GT.0.d0) THEN
504  fp13=0.d0
505  IF(fp31.GT.fxmatpar(iseg3)) fp31=fxmatpar(iseg3)
506  ELSE
507  fp31=0.d0
508  IF(fp13.GT.-fxmatpar(iseg3)) fp13=-fxmatpar(iseg3)
509  ENDIF
510  ENDIF
511 !
512 ! END OF CORRECTION OF FLUXES
513 !
514  fn1=fn%R(i1)
515  fn2=fn%R(i2)
516  fn3=fn%R(i3)
517 !
518 ! MINIMUM OF THE 1-TETA
519 !
520  mt1=1.d0-teta(i1)
521  mt2=1.d0-teta(i2)
522  mt3=1.d0-teta(i3)
523  min12=min(mt1,mt2)
524  min13=min(mt1,mt3)
525  min23=min(mt2,mt3)
526 !
527 ! PART OF CONTRIBUTIONS THAT WILL NOT BE LIMITED, IMMEDIATELY ASSEMBLED
528 !
529  fi_i(i1)=fi_i(i1)+fp12*(fn1*(mt1-min12)-fn2*(mt2-min12))
530  & +fp13*(fn1*(mt1-min13)-fn3*(mt3-min13))
531  fi_i(i2)=fi_i(i2)+fp21*(fn2*(mt2-min12)-fn1*(mt1-min12))
532  & +fp23*(fn2*(mt2-min23)-fn3*(mt3-min23))
533  fi_i(i3)=fi_i(i3)+fp31*(fn3*(mt3-min13)-fn1*(mt1-min13))
534  & +fp32*(fn3*(mt3-min23)-fn2*(mt2-min23))
535 !
536 ! NOW PART OF CONTRIBUTIONS THAT WILL BE LIMITED
537 !
538  coef=su(ielem)*tiers
539 !
540 ! AS CLASSICAL N SCHEME, BUT WITH DERIVATIVE IN TIME ADDED
541 ! HDFDT MUST BE ((1.D0-TETA)*H+TETA*HN)*(FSTAR-F)/DDT
542 !
543  fincorr1=
544  & hdfdt(i1)*coef+fp12*(fn1-fn2)*min12+fp13*(fn1-fn3)*min13
545  fincorr2=
546  & hdfdt(i2)*coef+fp21*(fn2-fn1)*min12+fp23*(fn2-fn3)*min23
547  fincorr3=
548  & hdfdt(i3)*coef+fp31*(fn3-fn1)*min13+fp32*(fn3-fn2)*min23
549 !
550 ! PHITCOR IS THE NEW TOTAL RESIDUAL,
551 !
552  phitcor=fincorr1+fincorr2+fincorr3
553 !
554  IF(phitcor.GT.epsphi) THEN
555 ! PSI REDUCTION
556  beta1=max(fincorr1,0.d0)
557  beta2=max(fincorr2,0.d0)
558  beta3=max(fincorr3,0.d0)
559  coef=phitcor/(beta1+beta2+beta3)
560  fi_i(i1)=fi_i(i1)+beta1*coef
561  fi_i(i2)=fi_i(i2)+beta2*coef
562  fi_i(i3)=fi_i(i3)+beta3*coef
563  ELSEIF(phitcor.LT.-epsphi) THEN
564 ! PSI REDUCTION
565  beta1=min(fincorr1,0.d0)
566  beta2=min(fincorr2,0.d0)
567  beta3=min(fincorr3,0.d0)
568  coef=phitcor/(beta1+beta2+beta3)
569  fi_i(i1)=fi_i(i1)+beta1*coef
570  fi_i(i2)=fi_i(i2)+beta2*coef
571  fi_i(i3)=fi_i(i3)+beta3*coef
572  ELSE
573 ! NO REDUCTION
574  fi_i(i1)=fi_i(i1)+fincorr1
575  fi_i(i2)=fi_i(i2)+fincorr2
576  fi_i(i3)=fi_i(i3)+fincorr3
577  ENDIF
578 !
579  ENDDO
580 !
581  ENDIF
582 !
583 !-----------------------------------------------------------------------
584 !
585  RETURN
586  END
587 
subroutine flux_ef_vf_3(PHIEL, NELEM, NELMAX, ELTSEG, ORISEG, FXMATPAR, NSEG, IKLE, NPOIN, FN, FI_I, SU, HDFDT, TETA, YAFLULIM, FLULIM, YAFLULIMEBE, FLULIMEBE)
Definition: flux_ef_vf_3.f:8
Definition: bief.f:3