The TELEMAC-MASCARET system  trunk
flux_ef_vf_2.f
Go to the documentation of this file.
1 ! ***********************
2  SUBROUTINE flux_ef_vf_2
3 ! ***********************
4 !
5  &(phiel,nelem,nelmax,ikle,iopt,npoin,fn,fi_i,fstar,hn,h,su,teta,
6  & dfdt)
7 !
8 !***********************************************************************
9 ! BIEF V7P3
10 !***********************************************************************
11 !
12 !brief Equivalent of FLUX_EF_VF, the result is given in terms of
13 !+ contribution per point, and it takes a derivative in time
14 !+ into account, as well of a TETA between FN and FSTAR.
15 !
16 !history J-M HERVOUET & SARA PAVAN (EDF LAB, LNHE)
17 !+ 29/04/2014
18 !+ V7P0
19 !+ First version, after Mario Ricchiuto's (INRIA Bordeaux) theory.
20 !
21 !history J-M HERVOUET & SARA PAVAN (EDF LAB, LNHE)
22 !+ 20/10/2016
23 !+ V7P2
24 !+ Simplification, N fluxes taken instead of PSI fluxes to be
25 !+ added to the derivative in time when option PSI is asked. IOPT
26 !+ is thus no longer used here.
27 !
28 !history J-M HERVOUET (jubilado)
29 !+ 09/09/2017
30 !+ V7P3
31 !+ Argument NELMAX added, for dimensioning arrays IKLE and PHIEL.
32 !
33 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
34 !| FI_I |<--| ASSEMBLED CONTRIBUTIONS
35 !| FN |-->| F AT TIME N
36 !| FSTAR |-->| ESTIMATION OF F AT TIME N+1
37 !| H |-->| DEPTH AT TIME N+1
38 !| HN |-->| DEPTH AT TIME N
39 !| IKLE |-->| CONNECTIVITY TABLE
40 !| IOPT |-->| OPTION (2:N 3:PSI BUT NOT USED)
41 !| NELEM |-->| NUMBER OF ELEMENTS
42 !| NPOIN |-->| NUMBER OF POINTS
43 !| PHIEL |-->| PER ELEMENT, FLUXES LEAVING POINTS
44 !| SU |-->| PER ELEMENT, AREA OF ELEMENT
45 !| TETA |-->| CRANK-NICHOLSON COEFFICIENT
46 !| DFDT |-->| ESTIMATION OF DERIVATIVE IN TIME OF F
47 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
48 !
49  USE bief, ex_flux_ef_vf_2 => flux_ef_vf_2
50 !
52 !
53  IMPLICIT NONE
54 !
55 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56 !
57  INTEGER, INTENT(IN) :: IOPT,NELEM,NELMAX
58  INTEGER, INTENT(IN) :: IKLE(nelmax,3)
59  INTEGER, INTENT(IN) :: NPOIN
60  DOUBLE PRECISION, INTENT(IN) :: PHIEL(nelmax,3)
61  TYPE(bief_obj), INTENT(IN) :: FN
62  DOUBLE PRECISION, INTENT(INOUT) :: FI_I(npoin)
63  DOUBLE PRECISION, INTENT(INOUT) :: FSTAR(npoin),H(npoin),HN(npoin)
64  DOUBLE PRECISION, INTENT(IN) :: SU(nelem),DFDT(npoin),TETA
65 !
66 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
67 !
68  INTEGER IELEM,I1,I2,I3,I
69  DOUBLE PRECISION K1,K2,K3,TIERS,FN1,FN2,FN3,FS1,FS2,FS3
70  DOUBLE PRECISION BETA1,BETA2,BETA3,BETA1PSI,BETA2PSI,BETA3PSI
71  DOUBLE PRECISION FINCORR1,FINCORR2,FINCORR3
72  DOUBLE PRECISION PHITCOR,SUMAX,H1,H2,H3,COEF
73 ! N FLUXES
74  DOUBLE PRECISION FP21,FP32,FP13,FP12,FP23,FP31
75 !
76  INTRINSIC min,max,abs
77 !
78  DOUBLE PRECISION, PARAMETER :: EPSPHI = 1.d-12
79 !
80 !-----------------------------------------------------------------------
81 !
82  tiers=1.d0/3.d0
83 !
84 !-----------------------------------------------------------------------
85 !
86  IF(iopt.EQ.2.OR.iopt.EQ.3) THEN
87 !
88 ! N-SCHEME, CORRECTOR
89 !
90  DO i=1,npoin
91  fi_i(i)=0.d0
92  ENDDO
93 !
94  DO ielem = 1,nelem
95 !
96  k1 = -phiel(ielem,1)
97  k2 = -phiel(ielem,2)
98  k3 = -phiel(ielem,3)
99 !
100  i1=ikle(ielem,1)
101  i2=ikle(ielem,2)
102  i3=ikle(ielem,3)
103 !
104 ! STARTS WITH N-SCHEME (EQUIVALENT TO LEO POSTMA'S IMPLEMENTATION)
105 ! FIJ HERE LIKE LAMBDA(I,J) IN BOOK
106 !
107  fp12=max(min(k1,-k2),0.d0)
108  fp23=max(min(k2,-k3),0.d0)
109  fp31=max(min(k3,-k1),0.d0)
110  fp21=max(min(k2,-k1),0.d0)
111  fp32=max(min(k3,-k2),0.d0)
112  fp13=max(min(k1,-k3),0.d0)
113 !
114  fn1=fn%R(i1)
115  fn2=fn%R(i2)
116  fn3=fn%R(i3)
117  fs1=fstar(i1)
118  fs2=fstar(i2)
119  fs3=fstar(i3)
120 !
121 ! COMPUTE THE NEW RESIDUAL AND NEW DISTRIBUTION
122 !
123  coef=tiers*su(ielem)
124  h1=((1.d0-teta)*h(i1)+teta*hn(i1))*coef
125  h2=((1.d0-teta)*h(i2)+teta*hn(i2))*coef
126  h3=((1.d0-teta)*h(i3)+teta*hn(i3))*coef
127 !
128 ! AS CLASSICAL N SCHEME, BUT WITH DERIVATIVE IN TIME ADDED
129 !
130  fincorr1=h1*dfdt(i1)
131  & +(1.d0-teta)*(fp12*(fn1-fn2)+fp13*(fn1-fn3))
132  & + teta *(fp12*(fs1-fs2)+fp13*(fs1-fs3))
133  fincorr2=h2*dfdt(i2)
134  & +(1.d0-teta)*(fp21*(fn2-fn1)+fp23*(fn2-fn3))
135  & + teta *(fp21*(fs2-fs1)+fp23*(fs2-fs3))
136  fincorr3=h3*dfdt(i3)
137  & +(1.d0-teta)*(fp31*(fn3-fn1)+fp32*(fn3-fn2))
138  & + teta *(fp31*(fs3-fs1)+fp32*(fs3-fs2))
139 !
140 ! PHITCOR IS THE NEW TOTAL RESIDUAL,
141 !
142  phitcor=fincorr1+fincorr2+fincorr3
143 !
144  IF(abs(phitcor).GT.epsphi) THEN
145 ! BETA OF N-SCHEME
146  beta1=fincorr1/phitcor
147  beta2=fincorr2/phitcor
148  beta3=fincorr3/phitcor
149 ! NOW THE PSI REDUCTION
150  sumax=max(0.d0,beta1)+max(0.d0,beta2)+max(0.d0,beta3)
151  IF(sumax.GT.1.d-20) THEN
152  beta1psi=max(0.d0,beta1)/sumax
153  beta2psi=max(0.d0,beta2)/sumax
154  beta3psi=max(0.d0,beta3)/sumax
155  fi_i(i1)=fi_i(i1)+beta1psi*phitcor
156  fi_i(i2)=fi_i(i2)+beta2psi*phitcor
157  fi_i(i3)=fi_i(i3)+beta3psi*phitcor
158  ENDIF
159  ENDIF
160 !
161  ENDDO
162 !
163 !-----------------------------------------------------------------------
164 !
165  ELSE
166 !
167  WRITE(lu,*) 'FLUX_EF_VF_2:'
168  WRITE(lu,*) 'UNKNOWN OPTION: ',iopt
169  CALL plante(1)
170  stop
171 !
172  ENDIF
173 !
174 !-----------------------------------------------------------------------
175 !
176  RETURN
177  END
178 
subroutine flux_ef_vf_2(PHIEL, NELEM, NELMAX, IKLE, IOPT, NPOIN, FN, FI_I, FSTAR, HN, H, SU, TETA, DFDT)
Definition: flux_ef_vf_2.f:8
Definition: bief.f:3