The TELEMAC-MASCARET system  trunk
bedload_solvs_vf.f
Go to the documentation of this file.
1 ! ***************************
2  SUBROUTINE bedload_solvs_vf
3 ! ***************************
4 !
5  &(mesh,qsx,qsy,limtec,unsv2d,ebor,breach,nseg,nptfr,npoin,
6  & kent,kdir,kddl,dt,zfcl,flux,csf_sable,flbcla,ava,liqbor,qbor,
7  & nubo,vnoin)
8 !
9 !***********************************************************************
10 ! SISYPHE V7P0 03/06/2014
11 !***********************************************************************
12 !
13 !brief SOLVES EXNER EQUATION WITH THE FINITE VOLUME METHOD.
14 !
15 !history M. GONZALES DE LINARES
16 !+ 07/05/2002
17 !+ V5P5
18 !+ First version.
19 !
20 !history J-M HERVOUET (EDF, LNHE)
21 !+ 30/10/2007
22 !+ V5P8
23 !+ UNSV2D +DIRICL DELETED
24 !
25 !history JMH
26 !+ 15/09/2009
27 !+
28 !+ KDIR KDDL ADDED (WERE HARD-CODED BEFORE !!!)
29 !
30 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
31 !+ 13/07/2010
32 !+ V6P0
33 !+ Translation of French comments within the FORTRAN sources into
34 !+ English comments
35 !
36 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
37 !+ 21/08/2010
38 !+ V6P0
39 !+ Creation of DOXYGEN tags for automated documentation and
40 !+ cross-referencing of the FORTRAN sources
41 !
42 !history C.VILLARET (EDF-LNHE), P.TASSI (EDF-LNHE)
43 !+ 19/07/2011
44 !+ V6P1
45 !+ Name of variables
46 !+
47 !
48 !history J-M HERVOUET (EDF-LNHE)
49 !+ 21/02/2012
50 !+ V6P2
51 !+ Corrections for a perfect mass balance: FLBTRA built to be used in
52 !+ bilan_sisyphe, coefficient AVA added in Dirichlet value, QBOR
53 !+ dealt with.
54 !
55 !history R.ATA (EDF-LNHE)
56 !+ 02/06/2014
57 !+ V7P0
58 !+ Corrections of normals and nubo tables
59 !+ after changes in FV data structure of Telemac2d
60 !+
61 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
62 !| AVA |-->| PERCENTAGE OF CLASS IN SEDIMENT
63 !| BREACH |<->| INDICATOR FOR NON ERODIBLE BED
64 !| DT |-->| TIME STEP
65 !| EBOR |<->| BOUNDARY CONDITION FOR BED EVOLUTION (DIRICHLET)
66 !| FLBCLA |<->| FLUXES AT BOUNDARY FOR THE CLASS
67 !| FLUX |<->| SEDIMENT FLUX
68 !| KDIR |-->| CONVENTION FOR DIRICHLET VALUE
69 !| KDDL |-->| CONVENTION FOR DEGREE OF FREEDOM
70 !| KENT |-->| CONVENTION FOR PRESCRIBED VALUE AT ENTRANCE
71 !| LIMTEC |-->| TECHNICAL BOUNDARY CONDITIONS FOR BED EVOLUTION
72 !| LIQBOR |-->| TYPE OF BOUNDARY CONDITIONS FOR BEDLOAD DISCHARGE
73 !| MESH |<->| MESH STRUCTURE
74 !| NPOIN |-->| NUMBER OF POINTS
75 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
76 !| NSEG |-->| NUMBER OF SEGMENTS
77 !| NUBO |-->| GLOBAL NUMBER OF EDGE EXTREMITIES
78 !| QBOR |-->| PRESCRIBED BEDLOAD DISCHARGES
79 !| QSX |<->| BEDLOAD TRANSPORT RATE X-DIRECTION
80 !| QSY |<->| BEDLOAD TRANSPORT RATE Y-DIRECTION
81 !| UNSV2D |-->| INVERSE OF INTEGRALS OF TEST FUNCTIONS
82 !| VNOIN |-->| OUTWARD UNIT NORMALS
83 !| ZFCL |<->| BEDLOAD EVOLUTION FOR EACH SEDIMENT CLASS
84 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
85 !
86  USE interface_sisyphe, ex_bedload_solvs_vf => bedload_solvs_vf
87  USE bief
89  IMPLICIT NONE
90 !
91 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
92 !
93  TYPE(bief_mesh), INTENT(INOUT) :: MESH
94  TYPE(bief_obj), INTENT(IN) :: QSX,QSY,LIMTEC,UNSV2D,EBOR
95  TYPE(bief_obj), INTENT(IN) :: BREACH,LIQBOR,QBOR
96  INTEGER, INTENT(IN) :: NSEG,NPTFR,NPOIN,KENT,KDIR,KDDL
97  DOUBLE PRECISION, INTENT(IN) :: DT,CSF_SABLE
98  DOUBLE PRECISION, INTENT(IN) :: AVA(npoin)
99  TYPE(bief_obj), INTENT(INOUT) :: FLBCLA,ZFCL,FLUX
100  INTEGER, INTENT(IN) :: NUBO(2,nseg)
101  DOUBLE PRECISION, INTENT(IN) :: VNOIN(3,nseg)
102 !
103 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
104 !
105  INTEGER :: ISEGIN,K,N,IEL,IEL1,IEL2,IELEM,NELEM,ERR
106  DOUBLE PRECISION :: QSMOY1,QSMOY2,QSP,VNOIN1,VNOIN2,RNORM,XN,YN
107  DOUBLE PRECISION :: ZFCLDIR,PROD_SCAL
108  LOGICAL, ALLOCATABLE :: YESNO(:)
109 !
110 !======================================================================!
111 !======================================================================!
112 ! PROGRAM !
113 !======================================================================!
114 !======================================================================!
115 !
116  nelem = mesh%NELEM
117  ALLOCATE(yesno(nseg),stat=err)
118 ! INITIALIZATION OF YESNO
119  DO k=1,nseg
120  yesno(k)=.false.
121  ENDDO
122 !
123 ! INITIALISES THE DIVERGENCE
124 !
125  CALL os('X=0 ', x=flux)
126 !
127 ! DETERMINES THE OUTGOING FLUX FOR EACH CELL
128 !
129  DO ielem=1,nelem
130  DO k=1,3
131  isegin = mesh%ELTSEG%I(ielem+(k-1)*nelem)
132  IF(.NOT.yesno(isegin)) THEN
133  iel1 = nubo(1,isegin)
134  iel2 = nubo(2,isegin)
135  ! II.1 - SEGMENT LENGTH (RNORM)
136  ! -----------------------------
137  vnoin1 = vnoin(1,isegin)
138  vnoin2 = vnoin(2,isegin)
139  rnorm = vnoin(3,isegin)
140  prod_scal= (mesh%X%R(iel2)-mesh%X%R(iel1))*vnoin1+
141  & (mesh%Y%R(iel2)-mesh%Y%R(iel1))*vnoin2
142  IF(prod_scal.LT.0.d0) THEN
143  iel1 = nubo(2,isegin)
144  iel2 = nubo(1,isegin)
145  ENDIF
146  ! II.2 - QS FOR THE SEGMENT, BROKEN UP ACCORDING TO X AND Y
147  ! ---------------------------------------------------------
148  qsmoy1 = 0.5d0*(qsx%R(iel1) + qsx%R(iel2))
149  qsmoy2 = 0.5d0*(qsy%R(iel1) + qsy%R(iel2))
150  ! II.3 - PROJECTS QS FOR THE SEGMENT ONTO THE SEGMENT NORMAL
151  ! ----------------------------------------------------------
152  qsp = vnoin1*qsmoy1 + vnoin2*qsmoy2
153  ! II.4 - UPWIND SCHEME ON NODES WITH A "PROBLEM"
154  ! ----------------------------------------------
155  IF(breach%I(iel1).EQ.1.AND.qsp.GT.0.d0) THEN
156  qsmoy1 = qsx%R(iel1)
157  qsmoy2 = qsy%R(iel1)
158  ENDIF
159  IF(breach%I(iel2).EQ.1.AND.qsp.LT.0.d0) THEN
160  qsmoy1 = qsx%R(iel2)
161  qsmoy2 = qsy%R(iel2)
162  ENDIF
163  qsp = vnoin1*qsmoy1 + vnoin2*qsmoy2
164  ! II.5 - INTEGRATES BY THE SEGMENT LENGTH
165  ! ---------------------------------------
166  IF(mesh%IFABOR%I(ielem+(k-1)*nelem).NE.-2) THEN
167  flux%R(iel1) = flux%R(iel1) + rnorm*qsp
168  flux%R(iel2) = flux%R(iel2) - rnorm*qsp
169  ELSE
170 ! IF IT IS AN INTERFACE EDGE IN PARALLEL, ONLY HALF
171  flux%R(iel1) = flux%R(iel1) + 0.5d0*rnorm*qsp
172  flux%R(iel2) = flux%R(iel2) - 0.5d0*rnorm*qsp
173  ENDIF
174  yesno(isegin)=.true.
175  ENDIF
176  ENDDO
177  ENDDO
178 !
179 ! BOUNDARIES
180 !
181  IF(ncsize.LE.1) THEN
182  DO k = 1 , nptfr
183  iel = mesh%NBOR%I(k)
184 ! VECTOR NORMAL TO A BOUNDARY NODE
185 ! VERSION WHICH IS NOT NORMED
186  xn = mesh%XNEBOR%R(k+nptfr)
187  yn = mesh%YNEBOR%R(k+nptfr)
188 !
189 ! ADDING BOUNDARY FLUX AT OPEN BOUNDARIES
190 ! QBOR HAS PRIORITY HERE, SO IN CASE OF LIQBOR=KENT
191 ! LIMTEC=KDIR WILL NOT BE CONSIDERED, SEE BEDLOAD_SOLVS_FE
192 ! FOR MORE EXPLANATIONS
193 !
194  IF(liqbor%I(k).EQ.kent) THEN
195  flbcla%R(k) = qbor%R(k)
196  flux%R(iel) = flux%R(iel) + flbcla%R(k)
197  ELSEIF(limtec%I(k).EQ.kddl.OR.limtec%I(k).EQ.kdir) THEN
198 ! IF KDIR WILL BE UPDATED LATER
199  flbcla%R(k)= qsx%R(iel)*xn + qsy%R(iel)*yn
200 ! ADDS THE CONTRIBUTION OF THE FLUX ON THE BOUNDARY SEGMENT
201  flux%R(iel) = flux%R(iel) + flbcla%R(k)
202  ELSE
203 ! NO SEDIMENT FLUX ACCROSS SOLID BOUNDARIES
204  flbcla%R(k)=0.d0
205  ENDIF
206  ENDDO
207  ELSE
208 ! COMPUTED ONLY ONCE WHEN THE LIQUID BOUNDARY NODE BELONGS TO
209 ! 2 SUBDDOMAINS
210  DO k = 1 , nptfr
211  iel = mesh%NBOR%I(k)
212 ! VECTOR NORMAL TO A BOUNDARY NODE
213 ! VERSION WHICH IS NOT NORMED
214  xn = mesh%XNEBOR%R(k+nptfr)
215  yn = mesh%YNEBOR%R(k+nptfr)
216 !
217 ! ADDING BOUNDARY FLUX AT OPEN BOUNDARIES
218 ! QBOR HAS PRIORITY HERE, SO IN CASE OF LIQBOR=KENT
219 ! LIMTEC=KDIR WILL NOT BE CONSIDERED, SEE BEDLOAD_SOLVS_FE
220 ! FOR MORE EXPLANATIONS
221 !
222  IF(liqbor%I(k).EQ.kent) THEN
223  flbcla%R(k) = qbor%R(k)
224  flux%R(iel) = flux%R(iel) + flbcla%R(k)*mesh%IFAC%I(iel)
225  ELSEIF(limtec%I(k).EQ.kddl.OR.limtec%I(k).EQ.kdir) THEN
226 ! IF KDIR WILL BE UPDATED LATER
227  flbcla%R(k)= qsx%R(iel)*xn + qsy%R(iel)*yn
228 ! ADDS THE CONTRIBUTION OF THE FLUX ON THE BOUNDARY SEGMENT
229  flux%R(iel) = flux%R(iel) + flbcla%R(k)*mesh%IFAC%I(iel)
230  ELSE
231 ! NO SEDIMENT FLUX ACCROSS SOLID BOUNDARIES
232  flbcla%R(k)=0.d0
233  ENDIF
234  ENDDO
235  ENDIF
236 !
237 ! ASSEMBLING IN PARALLEL
238 !
239  IF(ncsize.GT.1) CALL parcom(flux, 2, mesh)
240 !
241 ! SOLVING, NEGATIVE SIGN BECAUSE OUTGOING FLUX IS POSITIVE
242 ! TODO: NOTE JMH: FLUX MUST BE HERE DIV(QS)
243 !
244  CALL os('X=CYZ ', x=zfcl, y=flux, z=unsv2d, c=-dt)
245 !
246  DO k=1,nptfr
247 ! PRIORITY OF LIQBOR, SEE ABOVE
248  IF(limtec%I(k).EQ.kdir.AND.liqbor%I(k).NE.kent) THEN
249  n = mesh%NBOR%I(k)
250 ! ZFCLDIR: DIRICHLET VALUE OF EVOLUTION, ZFCL WILL BE DIVIDED BY
251 ! CSF_SABLE AFTER, AND THEN IT WILL BE AVA(N)*EBOR...
252  zfcldir = ava(n)*ebor%R(k)*csf_sable
253 ! CORRECTION OF BOUNDARY FLUX TO GET ZFCLDIR
254  flbcla%R(k)=flbcla%R(k)-(zfcldir-zfcl%R(n))/(dt*unsv2d%R(n))
255 ! ZFCLDIR FINALLY IMPOSED
256  zfcl%R(n) = zfcldir
257  ENDIF
258 !
259  ENDDO
260 !
261  DEALLOCATE(yesno)
262 !
263 !======================================================================!
264 !======================================================================!
265 !
266  RETURN
267  END
subroutine breach
Definition: breach.f:4
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
Definition: os.f:7
subroutine parcom(X, ICOM, MESH)
Definition: parcom.f:7
subroutine bedload_solvs_vf(MESH, QSX, QSY, LIMTEC, UNSV2D, EBOR, BREACH, NSEG, NPTFR, NPOIN, KENT, KDIR, KDDL, DT, ZFCL, FLUX, CSF_SABLE, FLBCLA, AVA, LIQBOR, QBOR, NUBO, VNOIN)
Definition: bief.f:3