5 &(t1,t2,t3,t4,h,hn,mesh,flodel,compute_flodel,flbor,dt,
6 & unsv2d,npoin,gloseg1,gloseg2,nbor,nptfr,
7 & smh,yasmh,pluie,rain,optsou,limpro,hbor,kdir,info,
8 & flopoint,namecode,nitmax,makeflulimebe,flulimebe)
78 INTEGER,
INTENT(IN) :: NPOIN,NPTFR,OPTSOU,KDIR
79 INTEGER,
INTENT(IN) :: NITMAX
80 INTEGER,
INTENT(IN) :: GLOSEG1(*),GLOSEG2(*)
81 INTEGER,
INTENT(IN) :: NBOR(nptfr)
82 INTEGER,
INTENT(IN) :: LIMPRO(nptfr)
83 DOUBLE PRECISION,
INTENT(IN) :: DT,HBOR(nptfr)
84 TYPE(bief_mesh),
INTENT(INOUT) :: MESH
85 DOUBLE PRECISION,
INTENT(INOUT) :: FLOPOINT(mesh%nelmax,3)
86 TYPE(bief_obj),
INTENT(INOUT) :: T1,T2,T3,T4,FLODEL,H,FLBOR
87 TYPE(bief_obj),
INTENT(INOUT) :: PLUIE
88 TYPE(bief_obj),
INTENT(IN) :: UNSV2D,HN,SMH
89 LOGICAL,
INTENT(IN) :: YASMH,INFO,RAIN
90 LOGICAL,
INTENT(IN) :: COMPUTE_FLODEL
91 CHARACTER(LEN=24) :: NAMECODE
92 LOGICAL,
INTENT(IN) :: MAKEFLULIMEBE
93 DOUBLE PRECISION,
INTENT(INOUT) :: FLULIMEBE(mesh%nelmax,3)
97 INTEGER I,I1,I2,I3,IPTFR,REMAIN,NEWREMAIN,IR,NITER
98 INTEGER NELEM,NELMAX,NSEG,IELEM,OPTPRE
99 DOUBLE PRECISION C,CPREV,CINIT,VOL1,VOL2,VOL3,HFL1,F1,F2,F3
100 DOUBLE PRECISION DTLIM1,DTLIM2,DTLIM3,FP1,FP2,FP3,DT1,DT2,DT3
101 DOUBLE PRECISION SURDT,A1,A2,A3
102 DOUBLE PRECISION,
PARAMETER :: TIERS=1.d0/3.d0
104 DOUBLE PRECISION,
PARAMETER :: EPS_FLUX = 1.d-15
105 LOGICAL,
PARAMETER :: TESTING = .false.
138 cinit=min(cinit,hn%R(i))
144 WRITE(
lu,*)
'AVANT TRAITEMENT HAUTEURS NEGATIVES, H MIN=',c
145 WRITE(
lu,*)
'AVANT TRAITEMENT HAUTEURS NEGATIVES, HN MIN=',cinit
150 c =c +h%R(i) *mesh%IFAC%I(i)/unsv2d%R(i)
151 cinit=cinit+hn%R(i)*mesh%IFAC%I(i)/unsv2d%R(i)
157 c =c +h%R(i) /unsv2d%R(i)
158 cinit=cinit+hn%R(i)/unsv2d%R(i)
161 WRITE(
lu,*)
'AVANT TRAITEMENT MASSE INITIALE=',cinit
162 WRITE(
lu,*)
'AVANT TRAITEMENT MASSE FINALE =',c
168 IF(compute_flodel)
THEN 170 CALL flux_ef_vf(flodel%R,flopoint,nseg,nelem,nelmax,
171 & mesh%ELTSEG%I,mesh%ORISEG%I,
172 & mesh%IKLE%I,.true.,2)
179 & nseg,1,2,1,mesh,1,11)
184 a1 = abs(flopoint(ielem,1))
185 a2 = abs(flopoint(ielem,2))
186 a3 = abs(flopoint(ielem,3))
187 IF(a1.GE.a2.AND.a1.GE.a3)
THEN 189 flopoint(ielem,1)=-flopoint(ielem,2)
190 flopoint(ielem,2)=0.d0
192 ELSEIF(a2.GE.a1.AND.a2.GE.a3)
THEN 195 flopoint(ielem,2)=-flopoint(ielem,3)
196 flopoint(ielem,3)=0.d0
199 flopoint(ielem,3)=-flopoint(ielem,1)
200 flopoint(ielem,1)=0.d0
207 IF(makeflulimebe)
THEN 209 flulimebe(ielem,1)=flopoint(ielem,1)
210 flulimebe(ielem,2)=flopoint(ielem,2)
211 flulimebe(ielem,3)=flopoint(ielem,3)
225 h%R(i)=hn%R(i)+dt*max(smh%R(i),0.d0)
227 ELSEIF(optsou.EQ.2)
THEN 229 h%R(i)=hn%R(i)+dt*max(smh%R(i),0.d0)*unsv2d%R(i)
242 h%R(i)=h%R(i)+dt*max(pluie%R(i),0.d0)
253 IF(ncsize.GT.1)
CALL os(
'X=0 ',x=t2)
254 CALL osdb(
'X=Y ' ,t2,flbor,flbor,0.d0,mesh)
256 IF(ncsize.GT.1)
CALL parcom(t2,2,mesh)
259 h%R(i)=h%R(i)-dt*unsv2d%R(i)*min(t2%R(i),0.d0)
275 cprev=cprev+abs(flopoint(ir,1))
276 & +abs(flopoint(ir,2))
277 & +abs(flopoint(ir,3))
279 IF(ncsize.GT.1) cprev=
p_sum(cprev)
280 IF(testing)
WRITE(
lu,*)
'INITIAL SUM OF FLUXES=',cprev
305 i2=mesh%IKLE%I(i +nelmax)
306 i3=mesh%IKLE%I(i+2*nelmax)
308 vol1=mesh%SURFAC%R(i)*h%R(i1)*tiers
309 vol2=mesh%SURFAC%R(i)*h%R(i2)*tiers
310 vol3=mesh%SURFAC%R(i)*h%R(i3)*tiers
312 f1= flopoint(i,1)-flopoint(i,3)
313 f2=-flopoint(i,1)+flopoint(i,2)
314 f3=-flopoint(i,2)+flopoint(i,3)
316 IF(f1*dt.GT.vol1)
THEN 317 t1%R(i1)=t1%R(i1)+f1*dt-vol1
319 t3%R(i1)=t3%R(i1)+min(vol1,vol1-f1*dt)
321 IF(f2*dt.GT.vol2)
THEN 322 t1%R(i2)=t1%R(i2)+f2*dt-vol2
324 t3%R(i2)=t3%R(i2)+min(vol2,vol2-f2*dt)
326 IF(f3*dt.GT.vol3)
THEN 327 t1%R(i3)=t1%R(i3)+f3*dt-vol3
329 t3%R(i3)=t3%R(i3)+min(vol3,vol3-f3*dt)
332 ELSEIF(optpre.EQ.2)
THEN 336 i2=mesh%IKLE%I(i +nelmax)
337 i3=mesh%IKLE%I(i+2*nelmax)
339 vol1=mesh%SURFAC%R(i)*h%R(i1)*tiers
340 vol2=mesh%SURFAC%R(i)*h%R(i2)*tiers
341 vol3=mesh%SURFAC%R(i)*h%R(i3)*tiers
343 f1= flopoint(i,1)-flopoint(i,3)
344 f2=-flopoint(i,1)+flopoint(i,2)
345 f3=-flopoint(i,2)+flopoint(i,3)
347 IF(f1.GT.0.d0) t1%R(i1)=t1%R(i1)+f1
348 IF(f2.GT.0.d0) t1%R(i2)=t1%R(i2)+f2
349 IF(f3.GT.0.d0) t1%R(i3)=t1%R(i3)+f3
350 t3%R(i1)=t3%R(i1)+vol1
351 t3%R(i2)=t3%R(i2)+vol2
352 t3%R(i3)=t3%R(i3)+vol3
365 i2=mesh%IKLE%I(i +nelmax)
366 i3=mesh%IKLE%I(i+2*nelmax)
370 vol1=mesh%SURFAC%R(i)*h%R(i1)*tiers
371 vol2=mesh%SURFAC%R(i)*h%R(i2)*tiers
372 vol3=mesh%SURFAC%R(i)*h%R(i3)*tiers
376 f1= flopoint(i,1)-flopoint(i,3)
377 f2=-flopoint(i,1)+flopoint(i,2)
378 f3=-flopoint(i,2)+flopoint(i,3)
383 IF(f1*dt.GT.vol1)
THEN 384 IF(t1%R(i1).GT.t3%R(i1))
THEN 385 vol1=vol1+(f1*dt-vol1)*(t3%R(i1)/t1%R(i1))
390 IF(t3%R(i1).GT.t1%R(i1))
THEN 391 vol1=vol1-min(vol1,vol1-f1*dt)*(t1%R(i1)/t3%R(i1))
396 IF(f2*dt.GT.vol2)
THEN 397 IF(t1%R(i2).GT.t3%R(i2))
THEN 398 vol2=vol2+(f2*dt-vol2)*(t3%R(i2)/t1%R(i2))
403 IF(t3%R(i2).GT.t1%R(i2))
THEN 404 vol2=vol2-min(vol2,vol2-f2*dt)*(t1%R(i2)/t3%R(i2))
409 IF(f3*dt.GT.vol3)
THEN 410 IF(t1%R(i3).GT.t3%R(i3))
THEN 411 vol3=vol3+(f3*dt-vol3)*(t3%R(i3)/t1%R(i3))
416 IF(t3%R(i3).GT.t1%R(i3))
THEN 417 vol3=vol3-min(vol3,vol3-f3*dt)*(t1%R(i3)/t3%R(i3))
422 ELSEIF(optpre.EQ.2)
THEN 423 IF(t1%R(i1).GT.1.d-30)
THEN 425 vol1=t3%R(i1)*(max(f1,0.d0)/t1%R(i1))
427 vol1=mesh%SURFAC%R(i)*h%R(i1)*tiers
429 IF(t1%R(i2).GT.1.d-30)
THEN 430 vol2=t3%R(i2)*(max(f2,0.d0)/t1%R(i2))
432 vol2=mesh%SURFAC%R(i)*h%R(i2)*tiers
434 IF(t1%R(i3).GT.1.d-30)
THEN 435 vol3=t3%R(i3)*(max(f3,0.d0)/t1%R(i3))
437 vol3=mesh%SURFAC%R(i)*h%R(i3)*tiers
443 IF(f1*dt.GT.vol1)
THEN 444 dt1=dt*(vol1/(f1*dt))
448 IF(f2*dt.GT.vol2)
THEN 449 dt2=dt*(vol2/(f2*dt))
453 IF(f3*dt.GT.vol3)
THEN 454 dt3=dt*(vol3/(f3*dt))
465 fp1=flopoint(i,1)*dtlim1
466 fp2=flopoint(i,2)*dtlim2
467 fp3=flopoint(i,3)*dtlim3
471 t4%R(i1)=t4%R(i1)-( fp1-fp3)
472 t4%R(i2)=t4%R(i2)-(-fp1+fp2)
473 t4%R(i3)=t4%R(i3)-(-fp2+fp3)
477 IF(dtlim1.EQ.dt.AND.dtlim2.EQ.dt.AND.dtlim3.EQ.dt)
THEN 482 newremain=newremain+1
486 flopoint(i,1)=flopoint(i,1)*(1.d0-dtlim1*surdt)
487 flopoint(i,2)=flopoint(i,2)*(1.d0-dtlim2*surdt)
488 flopoint(i,3)=flopoint(i,3)*(1.d0-dtlim3*surdt)
489 c=c+abs(flopoint(i,1))+abs(flopoint(i,2))
490 & +abs(flopoint(i,3))
501 IF(ncsize.GT.1)
CALL parcom(t4,2,mesh)
502 CALL os(
'X=XY ',x=t4,y=unsv2d)
503 CALL os(
'X=X+Y ',x=h,y=t4)
505 h%R(i)=max(h%R(i),0.d0)
507 IF(ncsize.GT.1) c=
p_sum(c)
508 IF(testing)
WRITE(
lu,*)
'FLUX NON PRIS EN COMPTE=',c
512 IF(c.NE.cprev.AND.abs(c-cprev).GT.cinit*1.d-9
513 & .AND.c.NE.0.d0)
THEN 515 IF(niter.LT.nitmax)
GO TO 777
524 h%R(i)=h%R(i)+dt*min(smh%R(i),0.d0)
526 ELSEIF(optsou.EQ.2)
THEN 528 h%R(i)=h%R(i)+dt*min(smh%R(i),0.d0)*unsv2d%R(i)
537 IF(-dt*pluie%R(i).LT.h%R(i))
THEN 538 h%R(i)=h%R(i)+dt*min(pluie%R(i),0.d0)
540 pluie%R(i)=-h%R(i)/dt
553 hfl1=dt*unsv2d%R(i)*max(t2%R(i),0.d0)
554 IF(hfl1.GT.h%R(i))
THEN 556 flbor%R(iptfr)=flbor%R(iptfr)*h%R(i)/hfl1
561 IF(limpro(iptfr).EQ.kdir)
THEN 562 IF(hbor(iptfr).LT.0.d0)
THEN 563 WRITE(
lu,*)
'NEGATIVE DEPTH PRESCRIBED ON BOUNDARY' 564 WRITE(
lu,*)
'CHECK YOUR SPECIFIC SUBROUTINE:' 565 IF(namecode(1:7).EQ.
'SISYPHE')
THEN 566 WRITE(
lu,*)
'BEDLOAD_SOLVS_FE' 567 ELSEIF(namecode(1:4).EQ.
'GAIA')
THEN 568 WRITE(
lu,*)
'BEDLOAD_SOLVS_FE' 569 ELSEIF(namecode(1:9).EQ.
'TELEMAC2D')
THEN 571 ELSEIF(namecode(1:9).EQ.
'TELEMAC3D')
THEN 578 flbor%R(iptfr)=flbor%R(iptfr)
579 & +(h%R(i)-hbor(iptfr))/(dt*unsv2d%R(i))
589 IF(ncsize.GT.1) c=
p_min(c)
590 WRITE(
lu,*)
'APRES TRAITEMENT HAUTEURS NEGATIVES, HMIN=',c
594 c=c+h%R(i)*mesh%IFAC%I(i)/unsv2d%R(i)
599 c=c+h%R(i)/unsv2d%R(i)
602 WRITE(
lu,*)
'APRES TRAITEMENT MASSE FINALE =',c
619 IF(abs(flulimebe(i,1)).GT.1.d-30)
THEN 620 flulimebe(i,1)=(flulimebe(i,1)-flopoint(i,1))
625 IF(abs(flulimebe(i,2)).GT.1.d-30)
THEN 626 flulimebe(i,2)=(flulimebe(i,2)-flopoint(i,2))
631 IF(abs(flulimebe(i,3)).GT.1.d-30)
THEN 632 flulimebe(i,3)=(flulimebe(i,3)-flopoint(i,3))
651 t1%R(i1)=t1%R(i1)-dt*unsv2d%R(i1)*flodel%R(i)
652 t1%R(i2)=t1%R(i2)+dt*unsv2d%R(i2)*flodel%R(i)
656 t1%R(i)=t1%R(i)-dt*unsv2d%R(i)*flbor%R(iptfr)
658 IF(ncsize.GT.1)
CALL parcom(t1,2,mesh)
660 t1%R(i)=t1%R(i)+hn%R(i)-h%R(i)
662 WRITE(
lu,*)
'ERREUR POSITIVE_DEPTHS=',
p_dots(t1,t1,mesh)
668 IF(namecode(1:7).EQ.
'SISYPHE'.OR.namecode(1:4).EQ.
'GAIA')
THEN 675 IF(niter.EQ.nitmax)
THEN 676 IF(namecode(1:7).EQ.
'SISYPHE'.OR.namecode(1:4).EQ.
'GAIA')
THEN 683 102
FORMAT(
' BEDLOAD EQUATION SOLVED IN ',1i5,
' ITERATIONS')
684 202
FORMAT(
' POSITIVE DEPTHS OBTAINED IN ',1i5,
' ITERATIONS')
685 103
FORMAT(
' BEDLOAD EQUATION SOLVED IN ',1i5,
' ITERATIONS = MAXIMUM',
686 & /,
'INCREASE MAXIMUM NUMBER OF ITERATIONS FOR ADVECTION SCHEMES')
687 203
FORMAT(
' POSITIVE DEPTHS SOLVED IN ',1i5,
' ITERATIONS = MAXIMUM',
688 & /,
'INCREASE MAXIMUM NUMBER OF ITERATIONS FOR ADVECTION SCHEMES')
subroutine positive_depths_eria(T1, T2, T3, T4, H, HN, MESH, FLODEL, COMPUTE_FLODEL, FLBOR, DT, UNSV2D, NPOIN, GLOSEG1, GLOSEG2, NBOR, NPTFR, SMH, YASMH, PLUIE, RAIN, OPTSOU, LIMPRO, HBOR, KDIR, INFO, FLOPOINT, NAMECODE, NITMAX, MAKEFLULIMEBE, FLULIMEBE)
subroutine parcom2_seg(X1, X2, X3, NSEG, NPLAN, ICOM, IAN, MESH, OPT, IELM)
subroutine osdb(OP, X, Y, Z, C, MESH)
subroutine flux_ef_vf(FLOW, PHIEL, NSEG, NELEM, NELMAX, ELTSEG, ORISEG, IKLE, INIFLO, IOPT, FN, YAFLULIM, FLULIM, YAFLULIMEBE, FLULIMEBE)
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
subroutine parcom(X, ICOM, MESH)
integer, dimension(:), allocatable indic_pdept_eria
double precision function p_dots(X, Y, MESH)