The TELEMAC-MASCARET system  trunk
maxslope.f
Go to the documentation of this file.
1 ! *******************
2  SUBROUTINE maxslope
3 ! *******************
4 !
5  &(slope,zf,zr,xel,yel,nelem,nelmax,npoin,ikle,evol,unsv2d,mesh,
6  & zfcl_ms,avail,nomblay,nsicla)
7 !
8 !***********************************************************************
9 ! SISYPHE V7P2 14/11/2016
10 !***********************************************************************
11 !
12 !brief COLLAPSE OF SAND WITH A SLOPE GREATER THAN A
13 !+ STABILITY CRITERION.
14 !+ For more explanation see release notes 5.8
15 !
16 !history J-M HERVOUET (LNH)
17 !+ 16/11/2007
18 !+ V5P8
19 !+
20 !
21 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
22 !+ 13/07/2010
23 !+ V6P0
24 !+ Translation of French comments within the FORTRAN sources into
25 !+ English comments
26 !
27 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
28 !+ 21/08/2010
29 !+ V6P0
30 !+ Creation of DOXYGEN tags for automated documentation and
31 !+ cross-referencing of the FORTRAN sources
32 !
33 !history J-M HERVOUET (EDF R&D, LNHE)
34 !+ 08/03/2013
35 !+ V6P3
36 !+ Now possible with several classes of sediment.
37 !
38 !history MICHIEL KNAAPEN (HRW)
39 !+ 08/12/2016
40 !+ V7P2
41 !+ Improvements of the implementation of the morphological factor
42 !+ in the subroutine. Solution of stability issues. For futher
43 !+ details see the documentation.
44 !+
45 !history R KOPMANN (BAW)
46 !+ 18/05/2018
47 !+ V7P3
48 !+ Angle will reduced to avoid changes below active layer only in case
49 !+ of multi grain
50 !
51 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
52 !| EVOL |<->| WORK ARRAY, THEN EVOLUTION DUE TO SLIDE
53 !| IKLE |-->| CONNECTIVITY TABLE
54 !| MESH |-->| MESH STRUCTURE
55 !| NELEM |-->| NUMBER OF ELEMENTS
56 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS
57 !| NPOIN |-->| NUMBER OF POINTS IN THE MESH
58 !| SLOPE |-->| MAXIMUM SLOPE IN DEGREES
59 !| UNSV2D |-->| INVERSE OF INTEGRAL OF BASES
60 !| XEL,YEL |-->| MESH COORDINATES PER ELEMENT
61 !| ZF |<->| BOTTOM THAT WILL BE MODIFIED
62 !| ZR |-->| NON ERODABLE BED
63 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
64 !
65  USE bief
66  USE declarations_sisyphe, ONLY : mofac
67 !
68  USE interface_sisyphe, ex_maxslope => maxslope
69 !
70  USE declarations_sisyphe, ONLY : es
72  IMPLICIT NONE
73 !
74 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
75 !
76  INTEGER, INTENT(IN) :: NELEM,NELMAX,NPOIN,NOMBLAY,NSICLA
77  INTEGER, INTENT(IN) :: IKLE(nelmax,3)
78 !
79  DOUBLE PRECISION, INTENT(IN ) :: SLOPE
80  DOUBLE PRECISION, INTENT(INOUT) :: ZF(npoin)
81  DOUBLE PRECISION, INTENT(IN) :: ZR(npoin)
82  DOUBLE PRECISION, INTENT(IN) :: XEL(nelmax,3),YEL(nelmax,3)
83  DOUBLE PRECISION, INTENT(INOUT) :: AVAIL(npoin,nomblay,nsicla)
84 !
85  TYPE(bief_obj), INTENT(INOUT) :: EVOL,ZFCL_MS
86  TYPE(bief_obj), INTENT(IN) :: UNSV2D
87  TYPE(bief_mesh) :: MESH
88 !
89 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
90 !
91  INTEGER IELEM,I1,I2,I3,I,IG1,IG2,IR1,IR2,J
92  DOUBLE PRECISION X2,X3,Y2,Y3,Z2,Z3,A,B,L,ZC,DEUXSURF,TANSL
93  DOUBLE PRECISION Q(3),QG1,QG2,QR1,QR2
94  DOUBLE PRECISION PI
95  DOUBLE PRECISION EZ1,EZ2,EZ3
96 !
97  LOGICAL CASE2
98 !
99  INTRINSIC sqrt,min,max,tan
100 !
101 !-----------------------------------------------------------------------
102 !
103  pi = 4.d0 * atan( 1.d0 )
104  tansl = tan( pi*slope/180.d0 )
105 !
106 ! INITIALISES THE RIGHT-HAND SIDE EVOL TO ZERO
107 !
108  CALL cpstvc(unsv2d,evol)
109  CALL os('X=0 ',x=evol)
110 !
111 ! ONE CLASS VERSION
112 !
113  IF(nsicla.EQ.1) THEN
114 !
115 ! LOOP ON ELEMENTS
116 !
117  DO ielem=1,nelem
118 !
119  i1=ikle(ielem,1)
120  i2=ikle(ielem,2)
121  i3=ikle(ielem,3)
122 !
123  x2=xel(ielem,2)
124  x3=xel(ielem,3)
125  y2=yel(ielem,2)
126  y3=yel(ielem,3)
127  z2=zf(i2)-zf(i1)
128  z3=zf(i3)-zf(i1)
129 !
130 ! TWICE THE TRIANGLE AREA
131 !
132  deuxsurf=x2*y3-x3*y2
133 !
134 ! AVERAGE BOTTOM IN THE ELEMENT
135 !
136  zc=(zf(i1)+zf(i2)+zf(i3))/3.d0
137 !
138 ! COMPONENTS OF BOTTOM GRADIENT
139 !
140  a=(z2*y3-z3*y2)/deuxsurf
141  b=(z3*x2-z2*x3)/deuxsurf
142 !
143 ! CORRECTING FACTOR ON SLOPE
144 !
145  l=min(1.d0,tansl/max(sqrt(a**2+b**2),1.d-8))
146 !
147 ! L LIMITED DUE TO NON-ERODABLE BEDS : ZF MUST NOT GO BELOW ZR
148 !
149  IF(zf(i1).GT.zc) l=max(l,(zr(i1)-zc)/max(zf(i1)-zc,1.d-8))
150  IF(zf(i2).GT.zc) l=max(l,(zr(i2)-zc)/max(zf(i2)-zc,1.d-8))
151  IF(zf(i3).GT.zc) l=max(l,(zr(i3)-zc)/max(zf(i3)-zc,1.d-8))
152 !
153 ! BUILDS THE RIGHT-HAND SIDE
154 !
155 ! HERE THE EVOLUTIONS ARE MULTIPLIED BY SURFAC/3
156 ! BECAUSE THE REAL EVOLUTION TAKING INTO ACCOUNT OTHER ELEMENTS
157 ! WILL NEED A FACTOR (SURFAC/3)/(INTEGRAL OF BASIS)
158 !
159  evol%R(i1)=evol%R(i1)+(1.d0-l)*(zc-zf(i1))*deuxsurf/6.d0
160  evol%R(i2)=evol%R(i2)+(1.d0-l)*(zc-zf(i2))*deuxsurf/6.d0
161  evol%R(i3)=evol%R(i3)+(1.d0-l)*(zc-zf(i3))*deuxsurf/6.d0
162 !
163  ENDDO
164 !
165  ELSE
166 !
167 ! MULTI-CLASS VERSION
168 !
169 ! INITIALING TO 0. THE EVOLUTIONS DUE TO SLIDE FOR EACH CLASS
170 !
171  DO i=1,nsicla
172  CALL os('X=0 ',x=zfcl_ms%ADR(i)%P)
173  ENDDO
174 !
175 ! LOOP ON ELEMENTS
176 !
177  DO ielem=1,nelem
178 !
179  i1=ikle(ielem,1)
180  i2=ikle(ielem,2)
181  i3=ikle(ielem,3)
182 !
183  x2=xel(ielem,2)
184  x3=xel(ielem,3)
185  y2=yel(ielem,2)
186  y3=yel(ielem,3)
187  z2=zf(i2)-zf(i1)
188  z3=zf(i3)-zf(i1)
189 !
190 ! TWICE THE TRIANGLE AREA
191 !
192  deuxsurf=x2*y3-x3*y2
193 !
194 ! AVERAGE BOTTOM IN THE ELEMENT
195 !
196  zc=(zf(i1)+zf(i2)+zf(i3))/3.d0
197 !
198 ! COMPONENTS OF BOTTOM GRADIENT
199 !
200  a=(z2*y3-z3*y2)/deuxsurf
201  b=(z3*x2-z2*x3)/deuxsurf
202 !
203 ! CORRECTING FACTOR ON SLOPE
204 !
205  l=min(1.d0,tansl/max(sqrt(a**2+b**2),1.d-8))
206 !
207 ! L LIMITED DUE TO NON-ERODABLE BEDS AND ACTIVE LAYER THICKNESS:
208 ! ZF MUST NOT GO BELOW ZR OR ACTIVE LAYER
209 !
210 ! IF(ZF(I1).GT.ZC) L=MAX(L,(ZR(I1)-ZC)/MAX(ZF(I1)-ZC,1.D-8))
211 ! IF(ZF(I2).GT.ZC) L=MAX(L,(ZR(I2)-ZC)/MAX(ZF(I2)-ZC,1.D-8))
212 ! IF(ZF(I3).GT.ZC) L=MAX(L,(ZR(I3)-ZC)/MAX(ZF(I3)-ZC,1.D-8))
213  ez1 = max(zr(i1),zf(i1)-es(i1,1))
214  ez2 = max(zr(i2),zf(i2)-es(i2,1))
215  ez3 = max(zr(i3),zf(i3)-es(i3,1))
216  IF(zf(i1).GT.zc) l=max(l,(ez1-zc)/max(zf(i1)-zc,1.d-8))
217  IF(zf(i2).GT.zc) l=max(l,(ez2-zc)/max(zf(i2)-zc,1.d-8))
218  IF(zf(i3).GT.zc) l=max(l,(ez3-zc)/max(zf(i3)-zc,1.d-8))
219 !
220 ! BUILDS THE RIGHT-HAND SIDE
221 !
222 ! HERE THE EVOLUTIONS ARE MULTIPLIED BY SURFAC/3
223 ! BECAUSE THE REAL EVOLUTION TAKING INTO ACCOUNT OTHER ELEMENTS
224 ! WILL NEED A FACTOR (SURFAC/3)/(INTEGRAL OF BASIS)
225 !
226 ! FIRST IN TERMS OF QUANTITIES BROUGHT TO POINTS
227 !
228  q(1)=(1.d0-l)*(zc-zf(i1))*deuxsurf/6.d0
229  q(2)=(1.d0-l)*(zc-zf(i2))*deuxsurf/6.d0
230  q(3)=(1.d0-l)*(zc-zf(i3))*deuxsurf/6.d0
231 !
232  evol%R(i1)=evol%R(i1)+q(1)
233  evol%R(i2)=evol%R(i2)+q(2)
234  evol%R(i3)=evol%R(i3)+q(3)
235 !
236 ! TAKING INTO ACCOUNT THE QUANTITIES TO UPDATE ZFCL_MS
237 ! IG1 AND IG2 : POINTS THAT GIVE
238 ! IR1 AND IR2 : POINTS THAT RECEIVE
239 ! CASE2: TWO POINTS GIVE TO THE THIRD ONE (THE OTHER CASE IS
240 ! ONE POINT GIVES TO THE TWO OTHERS)
241  case2=.false.
242 !
243 ! PARAMETERISING TO REDUCE THE 6 CASES TO 2
244 !
245  IF(q(1).GE.0.d0) THEN
246  IF(q(2).GE.0.d0) THEN
247 ! 3 GIVES TO 1 AND 2
248  ig1=i3
249  qg1=q(3)
250  ir1=i1
251  qr1=q(1)
252  ir2=i2
253  qr2=q(2)
254  ELSE
255  IF(q(3).GE.0.d0) THEN
256 ! 2 GIVES TO 1 AND 3
257  ig1=i2
258  qg1=q(2)
259  ir1=i1
260  qr1=q(1)
261  ir2=i3
262  qr2=q(3)
263  ELSE
264 ! 2 AND 3 GIVE TO 1
265  ig1=i2
266  qg1=q(2)
267  ig2=i3
268  qg2=q(3)
269  ir1=i1
270  qr1=q(1)
271  case2=.true.
272  ENDIF
273  ENDIF
274  ELSE
275  IF(q(2).GT.0.d0) THEN
276  IF(q(3).GT.0.d0) THEN
277 ! 1 GIVES TO 2 AND 3
278  ig1=i1
279  qg1=q(1)
280  ir1=i2
281  qr1=q(2)
282  ir2=i3
283  qr2=q(3)
284  ELSE
285 ! 1 AND 3 GIVE TO 2
286  ig1=i1
287  qg1=q(1)
288  ig2=i3
289  qg2=q(3)
290  ir1=i2
291  qr1=q(2)
292  case2=.true.
293  ENDIF
294  ELSE
295 ! 1 AND 2 GIVE TO 3
296  ig1=i1
297  qg1=q(1)
298  ig2=i2
299  qg2=q(2)
300  ir1=i3
301  qr1=q(3)
302  case2=.true.
303  ENDIF
304  ENDIF
305 !
306  IF(case2) THEN
307 !
308 ! THE TWO DONNORS CASE : IG1 AND IG2 GIVE TO IR1
309 ! ZFCL_MS IS HERE VOLUMES
310 !
311  DO i=1,nsicla
312  zfcl_ms%ADR(i)%P%R(ig1)=zfcl_ms%ADR(i)%P%R(ig1)
313  & +qg1*avail(ig1,1,i)
314  zfcl_ms%ADR(i)%P%R(ig2)=zfcl_ms%ADR(i)%P%R(ig2)
315  & +qg2*avail(ig2,1,i)
316  zfcl_ms%ADR(i)%P%R(ir1)=zfcl_ms%ADR(i)%P%R(ir1)
317  & -qg1*avail(ig1,1,i)
318  & -qg2*avail(ig2,1,i)
319  ENDDO
320 !
321  ELSE
322 !
323 ! THE ONE DONNOR CASE : IG1 GIVES TO IR1 AND IR2
324 ! ZFCL_MS IS HERE VOLUMES
325 !
326  DO i=1,nsicla
327  zfcl_ms%ADR(i)%P%R(ig1)=zfcl_ms%ADR(i)%P%R(ig1)
328  & +qg1*avail(ig1,1,i)
329  zfcl_ms%ADR(i)%P%R(ir1)=zfcl_ms%ADR(i)%P%R(ir1)
330  & +qr1*avail(ig1,1,i)
331  zfcl_ms%ADR(i)%P%R(ir2)=zfcl_ms%ADR(i)%P%R(ir2)
332  & +qr2*avail(ig1,1,i)
333  ENDDO
334 !
335  ENDIF
336 !
337  ENDDO
338 !
339 ! ADDING VOLUMES IN PARALLEL
340 !
341  IF(ncsize.GT.1) THEN
342  DO i=1,nsicla
343  CALL parcom(zfcl_ms%ADR(i)%P,2,mesh)
344  ENDDO
345  ENDIF
346 !
347 ! FINAL DIVISION BY THE INTEGRAL OF BASES: VOLUMES CHANGED INTO
348 ! BED VARIATIONS (LIKE EVOL BELOW)
349 !
350  DO i=1,nsicla
351  DO j=1,npoin
352  zfcl_ms%ADR(i)%P%R(j)=zfcl_ms%ADR(i)%P%R(j)*
353  & unsv2d%R(j)/mofac/10.d0
354  ENDDO
355  ENDDO
356 !
357  ENDIF
358 !
359 !-----------------------------------------------------------------------
360 !
361 ! FINAL RESOLUTION
362 !
363  IF(ncsize.GT.1) THEN
364  CALL parcom(evol,2,mesh)
365  ENDIF
366 !
367 ! FINAL DIVISION BY THE INTEGRAL OF BASES: QUANTITIES CHANGED INTO
368 ! ELEVATIONS
369 !
370  DO i=1,npoin
371  evol%R(i)=evol%R(i)*unsv2d%R(i)/mofac/10.d0
372  ENDDO
373 !
374 !-----------------------------------------------------------------------
375 !
376  RETURN
377  END
subroutine maxslope(SLOPE, ZF, ZR, XEL, YEL, NELEM, NELMAX, NPOIN, IKLE, EVOL, UNSV2D, MESH, ZFCL_MS, AVAIL, NOMBLAY, NSICLA)
Definition: maxslope.f:8
subroutine cpstvc(X, Y)
Definition: cpstvc.f:7
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
Definition: os.f:7
subroutine parcom(X, ICOM, MESH)
Definition: parcom.f:7
double precision, dimension(:,:), allocatable, target es
Definition: bief.f:3