The TELEMAC-MASCARET system  trunk
bedload_nerbed_vf.f
Go to the documentation of this file.
1 ! ******************************
2  SUBROUTINE bedload_nerbed_vf !
3 ! ******************************
4 !
5  &(mesh,liebor,ksort,elay,v2dpar,qsx,qsy,ava,npoin,nseg,nptfr,
6  & dt,qs,t1,t2,t3,breach,csf_sable,nubo,vnoin)
7 !
8 !***********************************************************************
9 ! SISYPHE V7P0 03/06/2014
10 !***********************************************************************
11 !
12 !brief NON ERODABLE METHOD FOR FINITE VOLUMES.
13 !
14 !history M. GONZALES DE LINARES
15 !+ 07/05/2002
16 !+ V5P3
17 !+ First version.
18 !
19 !history J-M HERVOUET (EDF,LNHE)
20 !+ 31/01/2008
21 !+ V6P0
22 !+ CORRECTED INITIALISATION ERROR FOR T1 AND T2
23 !
24 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
25 !+ 13/07/2010
26 !+ V6P0
27 !+ Translation of French comments within the FORTRAN sources into
28 !+ English comments
29 !
30 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
31 !+ 21/08/2010
32 !+ V6P0
33 !+ Creation of DOXYGEN tags for automated documentation and
34 !+ cross-referencing of the FORTRAN sources
35 !
36 !history C.VILLARET (EDF-LNHE), P.TASSI (EDF-LNHE)
37 !+ 19/07/2011
38 !+ V6P1
39 !+ Names of variables .
40 !+
41 !history R.ATA (EDF-LNHE)
42 !+ 02/06/2014
43 !+ V7P0
44 !+ Corrections of normals and nubo tables
45 !+ after changes in FV data structure of Telemac-2D.
46 !+
47 !
48 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
49 !| AVA |-->| PERCENT AVAILABLE
50 !| BREACH |<->| INDICATOR FOR NON ERODIBLE BED (FINITE VOLUMES SCHEMES)
51 !| DT |-->| TIME STEP
52 !| ELAY |<->| THICKNESS OF SURFACE LAYER
53 !| KSORT |-->| CONVENTION FOR FREE OUTPUT
54 !| LIEBOR |<->| PHYSICAL BOUNDARY CONDITIONS FOR BED EVOLUTION
55 !| MESH |<->| MESH STRUCTURE
56 !| NPOIN |-->| NUMBER OF POINTS
57 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
58 !| NSEG |-->| NUMBER OF SEGMENTS PER CONTROL SECTION
59 !| NUBO |-->| GLOBAL NUMBER OF EDGE EXTREMITIES
60 !| QS |<->| BEDLOAD TRANSPORT RATE
61 !| QSX |-->| SOLID DISCHARGE X
62 !| QSY |-->| SOLID DISCHARGE Y
63 !| T1 |<->| WORK BIEF_OBJ STRUCTURE
64 !| T2 |<->| WORK BIEF_OBJ STRUCTURE
65 !| T3 |<->| WORK BIEF_OBJ STRUCTURE
66 !| V2DPAR |-->| INTEGRAL OF TEST FUNCTIONS, ASSEMBLED IN PARALLEL
67 !| VNOIN |-->| OUTWARD UNIT NORMALS
68 !| CSF_SABLE |-->| VOLUME CONCENTRATION OF SAND (1-POROSITY)
69 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
70 !
71  USE interface_sisyphe, ex_bedload_nerbed_vf => bedload_nerbed_vf
72  USE bief
74  IMPLICIT NONE
75 !
76 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
77 !
78  TYPE(bief_mesh), INTENT(INOUT) :: MESH
79  TYPE(bief_obj), INTENT(IN) :: LIEBOR
80  TYPE(bief_obj), INTENT(IN) :: QSX, QSY
81  INTEGER, INTENT(IN) :: NPOIN, NSEG, NPTFR,KSORT
82  DOUBLE PRECISION, INTENT(IN) :: DT
83  TYPE(bief_obj), INTENT(INOUT) :: QS, T1, T2, T3
84  TYPE(bief_obj), INTENT(INOUT) :: BREACH
85  DOUBLE PRECISION, INTENT(IN) :: ELAY(npoin),V2DPAR(npoin)
86  DOUBLE PRECISION, INTENT(IN) :: AVA(npoin), CSF_SABLE
87 ! RA
88  INTEGER, INTENT(IN) :: NUBO(2,nseg)
89  DOUBLE PRECISION, INTENT(IN) :: VNOIN(3,nseg)
90 !
91 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
92 !
93  INTEGER :: I, K
94  INTEGER :: IEL, IEL1, IEL2, ISEGIN
95  DOUBLE PRECISION :: QSP1, QSP2, QSPC
96  DOUBLE PRECISION :: XN, YN, TEMP,PROD_SCAL
97  DOUBLE PRECISION :: VNOIN1, VNOIN2, RNORM
98 !
99 !======================================================================!
100 !======================================================================!
101 ! PROGRAM !
102 !======================================================================!
103 !======================================================================!
104 !
105  ! ****************** !
106  ! I - INITIALISES !
107  ! ****************** !
108 !
109  ! BREACH INDICATES IF NON ERODABLE BED WILL BE REACHED
110  ! DURING TIME STEP FOR THIS POINT
111  ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
112 !
113 ! GIVE T1 AND T2 THE SAME STRUCTURE AS QS
114 !
115  CALL cpstvc(qs,t1)
116  CALL cpstvc(qs,t2)
117 !
118  DO iel = 1, npoin
119  breach%I(iel) = 0
120  t1%R(iel)=0.d0
121  t2%R(iel)=0.d0
122  ENDDO
123 !
124  ! ************************************************* !
125  ! II - DETERMINES THE OUTGOING FLUX FOR EACH CELL ! (_IMP_)
126  ! ************************************************* !
127  ! THE PRINCIPLE IS THAT QS IS CALCULATED FOR EACH SEGMENT AS
128  ! HALF THE SUM OF THE QS AT THE CENTERS OF THE ELEMENTS WHICH
129  ! SEGMENT FORMS THE BOUNDARY. IT IS THEN PROJECTED ON THE NORMAL
130  ! TO THE SEGMENT, MULTIPLIED BY THE LENGTH OF THE SEGMENT, AND
131  ! THIS FLUX TERM IS ADDED (OR SUBTRACTED) TO THE TWO ELEMENTS.
132 !
133  DO isegin = 1, nseg
134 !
135  iel1 = nubo(1,isegin)
136  iel2 = nubo(2,isegin)
137 !
138  ! II.1 - SEGMENT LENGTH (RNORM)
139  ! ----------------------------------
140  vnoin1 = vnoin(1,isegin)
141  vnoin2 = vnoin(2,isegin)
142  rnorm = vnoin(3,isegin)
143  prod_scal= (mesh%X%R(iel2)-mesh%X%R(iel1))*vnoin1+
144  & (mesh%Y%R(iel2)-mesh%Y%R(iel1))*vnoin2
145  IF(prod_scal.LT.0.d0)THEN
146  iel1 = nubo(2,isegin)
147  iel2 = nubo(1,isegin)
148  ENDIF
149 !
150  ! II.2 - PROJECTS QS FOR THE SEGMENT ONTO THE SEGMENT NORMAL
151  ! ------------------------------------------------------------
152  qsp1 = vnoin1*qsx%R(iel1) + vnoin2*qsy%R(iel1)
153  qsp2 = vnoin1*qsx%R(iel2) + vnoin2*qsy%R(iel2)
154  qspc = (qsp1+qsp2)*0.5d0
155 !
156  ! II.3 - QS SUCH AS THE OUTGOING FLUX IS MAXIMUM
157  ! ----------------------------------------------
158  t1%R(iel1) = t1%R(iel1) + rnorm*max(qspc,qsp1,0.d0)
159  t1%R(iel2) = t1%R(iel2) - rnorm*min(qspc,qsp2,0.d0)
160 !
161  IF(qspc > 0.d0) THEN
162  t2%R(iel1) = t2%R(iel1) + rnorm*qsp1
163  ELSEIF(qspc < 0.d0) THEN
164  t2%R(iel2) = t2%R(iel2) - rnorm*qsp2
165  ENDIF
166 !
167  ENDDO
168 !
169  ! ************************************** !
170  ! III - LOOP ON THE BOUNDARY NODES !
171  ! ************************************** !
172 !
173  DO k = 1, nptfr
174  iel = mesh%NBOR%I(k)
175 !
176  ! III.1 - FREE EVOLUTION: SEDIMENTS ARE FREE TO LEAVE
177  ! ---------------------------------------------------------
178  IF (liebor%I(k) == ksort) THEN
179 !
180  ! XNEBOR (*+NPTFR) AND YNEBOR (*+NPTFR)
181  ! CONTAIN THE VECTOR NORMAL TO A BOUNDARY NODE
182  ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
183  xn = mesh%XNEBOR%R(k+nptfr)
184  yn = mesh%YNEBOR%R(k+nptfr)
185  temp = qsx%R(iel)*xn + qsy%R(iel)*yn
186  IF (temp > 0.d0) THEN
187  t1%R(iel) = t1%R(iel) + temp
188  t2%R(iel) = t2%R(iel) + temp
189  ENDIF
190 !
191  ENDIF
192 !
193  ! III.2 - FOR A SOLID BOUNDARY: NOTHING TO PROGRAM
194  ! BECAUSE THE SEDIMENT FLUX IS ZERO HERE
195  ! FOR IMPOSED EVOLUTION : SEE BEDLOAD_SOLVS_VF.F
196  ! --------------------------------------------------------
197  ENDDO
198 !
199  IF(ncsize > 1) THEN
200  CALL parcom(t1, 2, mesh)
201  CALL parcom(t2, 2, mesh)
202  ENDIF
203 !
204  ! ************************************************ !
205  ! IV - COMPUTES THE MAXIMUM FLUX AUTHORISED PER CELL!
206  ! ************************************************ !
207 !
208  DO i = 1, npoin
209 !
210  t3%R(i)=elay(i)*v2dpar(i)*ava(i)* csf_sable/dt
211  IF (t3%R(i) < 0.d0) t3%R(i) = 0.d0
212 !
213  ! IF THE OUTGOING FLUX IS TOO LARGE, QS IS CAPPED AT THE NODE
214  ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
215  IF(t1%R(i) > t3%R(i)) THEN
216  breach%I(i) = 1
217  IF(t2%R(i) > t3%R(i)) THEN
218  qs%R(i) = qs%R(i)*t3%R(i)/t2%R(i)
219  ENDIF
220  ENDIF
221 !
222  ENDDO
223 !
224 !======================================================================!
225 !======================================================================!
226 !
227  RETURN
228  END
229 
subroutine bedload_nerbed_vf
subroutine breach
Definition: breach.f:4
subroutine cpstvc(X, Y)
Definition: cpstvc.f:7
subroutine parcom(X, ICOM, MESH)
Definition: parcom.f:7
Definition: bief.f:3