5 &(f1,f1n,f1scexp,f2,f2n,f2scexp,h,hn,hprop,udel,vdel,dm1,
6 & zconv,solsys,sm1,sm2,smh,yasmh,smi1,smi2,yasmi,
7 & f1bor,f2bor,masktr,mesh,t1,t2,t3,t4,t5,t6,t7,t8,ht,
8 & dt,entet,msk,maskel,optsou,
9 & limtra1,limtra2,kdir,kddl,nptfr,flbor,yaflbor,unsv2d,iopt,
10 & flbortra1,flbortra2,gloseg1,gloseg2,nbor,
11 & rain,pluie,train1,train2,nitmax)
151 INTEGER,
INTENT(IN) :: OPTSOU,KDIR,NPTFR,SOLSYS
152 INTEGER,
INTENT(IN) :: KDDL,IOPT,NITMAX
153 INTEGER,
INTENT(IN) :: GLOSEG1(*),GLOSEG2(*)
154 INTEGER,
INTENT(IN) :: LIMTRA1(nptfr),NBOR(nptfr)
155 INTEGER,
INTENT(IN) :: LIMTRA2(nptfr)
156 DOUBLE PRECISION,
INTENT(IN) :: DT
157 DOUBLE PRECISION,
INTENT(IN) :: TRAIN1,TRAIN2
158 LOGICAL,
INTENT(IN) :: YASMH,YAFLBOR,RAIN
159 LOGICAL,
INTENT(IN) :: MSK,ENTET,YASMI
160 TYPE(bief_obj),
INTENT(IN) :: MASKEL,H,HN,DM1,ZCONV
161 TYPE(bief_obj),
INTENT(IN) :: UNSV2D,HPROP
162 TYPE(bief_obj),
INTENT(INOUT) :: F1,SM1,F2,SM2,HT
163 TYPE(bief_obj),
INTENT(IN) :: F1BOR,UDEL,VDEL,F1N,SMI1,SMH
164 TYPE(bief_obj),
INTENT(IN) :: F2BOR,F2N,SMI2
165 TYPE(bief_obj),
INTENT(INOUT) :: FLBORTRA1,FLBORTRA2
166 TYPE(bief_obj),
INTENT(INOUT) :: T1,T2,T3,T4,T5,T6,T7,T8
167 TYPE(bief_obj),
INTENT(IN) :: F1SCEXP,F2SCEXP,MASKTR
168 TYPE(bief_obj),
INTENT(INOUT) :: FLBOR
169 TYPE(bief_obj),
INTENT(IN) :: PLUIE
170 TYPE(bief_mesh) :: MESH
174 INTEGER I,IOPT1,IOPT2,NPOIN,IPTFR,I1,I2,NITER,REMAIN_SEG,NEWREMAIN
179 DOUBLE PRECISION C,CPREV,CINIT,HFL1,HFL2,TET
180 DOUBLE PRECISION HSEG1,HSEG2
181 CHARACTER(LEN=16) FORMUL
182 DOUBLE PRECISION,
POINTER,
DIMENSION(:) :: FXMAT
183 LOGICAL,
PARAMETER :: TESTING = .false.
184 DOUBLE PRECISION,
PARAMETER :: EPS_FLUX = 1.d-15
197 fxmat=>mesh%MSEG%X%R(1:mesh%NSEG)
207 IF(iopt1.LT.0.OR.iopt1.GT.3)
THEN 208 WRITE(
lu,*)
'CVTRVF_NERD_2: OPTION IOPT1 UNKNOWN: ',iopt1
212 IF(iopt2.NE.0.AND.iopt2.NE.1)
THEN 213 WRITE(
lu,*)
'CVTRVF_NERD_2: OPTION IOPT2 UNKNOWN: ',iopt2
227 cinit=min(cinit,hn%R(i))
233 WRITE(
lu,*)
'AVANT TRAITEMENT HAUTEURS NEGATIVES, H MIN=',c
234 WRITE(
lu,*)
'AVANT TRAITEMENT HAUTEURS NEGATIVES, HN MIN=',cinit
240 IF(solsys.EQ.2) formul(8:8)=
'2' 241 CALL vector(t1,
'=',formul,h%ELM,-1.d0,
242 & hprop,dm1,zconv,udel,vdel,vdel,mesh,msk,maskel)
252 CALL flux_ef_vf(fxmat,mesh%W%R,mesh%NSEG,mesh%NELEM,mesh%NELMAX,
253 & mesh%ELTSEG%I,mesh%ORISEG%I,
254 & mesh%IKLE%I,.true.,iopt1)
262 CALL parcom2_seg(fxmat,fxmat,fxmat,mesh%NSEG,1,2,1,mesh,
265 & mesh%NH_COM_SEG%DIM1,
266 & mesh%NB_NEIGHB_SEG,
267 & mesh%NB_NEIGHB_PT_SEG%I,
268 & mesh%LIST_SEND_SEG%I,mesh%NSEG)
280 IF(ncsize.GT.1)
CALL os(
'X=0 ',x=t2)
284 CALL os(
'X=Y ',x=f1,y=f1n)
285 CALL os(
'X=Y ',x=f2,y=f2n)
289 cprev=cprev+abs(fxmat(i))
291 IF(ncsize.GT.1) cprev=
p_sum(cprev)
293 IF(testing)
WRITE(
lu,*)
'SOMME INITIALE DES FLUX=',cprev
302 ht%R(i)=hn%R(i)+dt*smh%R(i)
303 f1%R(i)=f1n%R(i)+dt/max(ht%R(i),1.d-4)*
304 & smh%R(i)*f1scexp%R(i)
305 f2%R(i)=f2n%R(i)+dt/max(ht%R(i),1.d-4)*
306 & smh%R(i)*f2scexp%R(i)
308 ELSEIF(optsou.EQ.2)
THEN 310 ht%R(i)=hn%R(i)+dt*smh%R(i)*unsv2d%R(i)
311 f1%R(i)=f1n%R(i)+dt/max(ht%R(i),1.d-4)*
312 & unsv2d%R(i)*smh%R(i)*f1scexp%R(i)
313 f2%R(i)=f2n%R(i)+dt/max(ht%R(i),1.d-4)*
314 & unsv2d%R(i)*smh%R(i)*f2scexp%R(i)
327 c=max(pluie%R(i),0.d0)
329 f1%R(i)=f1%R(i)+dt/max(ht%R(i),1.d-4)*c*(train1-f1%R(i))
330 f2%R(i)=f2%R(i)+dt/max(ht%R(i),1.d-4)*c*(train2-f2%R(i))
334 IF(.NOT.yaflbor)
THEN 336 CALL vector(flbor,
'=',
'FLUBDF ',1,1.d0,
338 & udel , vdel, vdel,mesh,.true.,masktr%ADR(8)%P)
343 CALL osdb(
'X=Y ' ,t2,flbor,flbor,0.d0,mesh)
345 IF(ncsize.GT.1)
CALL parcom(t2,2,mesh)
348 ht%R(i)=ht%R(i)-dt*unsv2d%R(i)*min(t2%R(i),0.d0)
351 IF(limtra1(iptfr).EQ.kdir)
THEN 352 f1%R(i)=f1n%R(i)-dt/max(ht%R(i),1.d-4)*
353 & unsv2d%R(i)*min(t2%R(i),0.d0)*(f1bor%R(iptfr)-f1n%R(i))
354 ELSEIF(limtra1(iptfr).EQ.kddl)
THEN 355 IF(t2%R(i).LE.0.d0)
THEN 357 flbortra1%R(iptfr)=flbor%R(iptfr)*f1n%R(i)
360 IF(limtra2(iptfr).EQ.kdir)
THEN 361 f2%R(i)=f2n%R(i)-dt/max(ht%R(i),1.d-4)*
362 & unsv2d%R(i)*min(t2%R(i),0.d0)*(f2bor%R(iptfr)-f2n%R(i))
363 ELSEIF(limtra2(iptfr).EQ.kddl)
THEN 364 IF(t2%R(i).LE.0.d0)
THEN 366 flbortra2%R(iptfr)=flbor%R(iptfr)*f1n%R(i)
402 t5%R(i)=ht%R(i)*f1%R(i)
403 t7%R(i)=ht%R(i)*f2%R(i)
407 i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
409 ht%R(i)=ht%R(i)*mesh%IFAC%I(i)
410 t5%R(i)=ht%R(i)*f1%R(i)
411 t7%R(i)=ht%R(i)*f2%R(i)
429 t5%R(i1)=ht%R(i1)*f1%R(i1)
430 t5%R(i2)=ht%R(i2)*f1%R(i2)
431 t7%R(i1)=ht%R(i1)*f2%R(i1)
432 t7%R(i2)=ht%R(i2)*f2%R(i2)
438 i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
445 ht%R(i)=ht%R(i)*mesh%IFAC%I(i)
446 t5%R(i)=ht%R(i)*f1%R(i)
447 t7%R(i)=ht%R(i)*f2%R(i)
455 IF(fxmat(i).GT.eps_flux)
THEN 456 t1%R(i1)=t1%R(i1)+fxmat(i)
460 ELSEIF(fxmat(i).LT.-eps_flux)
THEN 461 t1%R(i2)=t1%R(i2)-fxmat(i)
468 IF(ncsize.GT.1)
CALL parcom(t1,2,mesh)
474 i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
475 IF(t1%R(i).GT.eps_flux)
THEN 492 IF(fxmat(i).GT.eps_flux)
THEN 495 IF(t4%R(i1).GT.1.d-20)
THEN 496 hseg1=t4%R(i1)*fxmat(i)/t1%R(i1)
498 hfl1= dt*unsv2d%R(i1)*fxmat(i)
499 IF(hfl1.GT.hseg1)
THEN 502 hseg2=dt*unsv2d%R(i2)*fxmat(i)*tet
503 ht%R(i2)=ht%R(i2)+hseg2
505 t5%R(i2)=t5%R(i2)+hseg2*t6%R(i1)
506 t7%R(i2)=t7%R(i2)+hseg2*t8%R(i1)
510 f1%R(i2)=t5%R(i2)/ht%R(i2)
511 f2%R(i2)=t7%R(i2)/ht%R(i2)
512 fxmat(i)=fxmat(i)*(1.d0-tet)
514 newremain=newremain+1
518 hseg2=dt*unsv2d%R(i2)*fxmat(i)
519 ht%R(i2)=ht%R(i2)+hseg2
520 t5%R(i2)=t5%R(i2)+hseg2*t6%R(i1)
521 t7%R(i2)=t7%R(i2)+hseg2*t8%R(i1)
523 f1%R(i2)=t5%R(i2)/ht%R(i2)
524 f2%R(i2)=t7%R(i2)/ht%R(i2)
525 IF(hseg1.GT.0.d0)
THEN 526 ht%R(i1)=ht%R(i1)+hseg1
527 t5%R(i1)=t5%R(i1)+hseg1*t6%R(i1)
528 t7%R(i1)=t7%R(i1)+hseg1*t8%R(i1)
530 f1%R(i1)=t5%R(i1)/ht%R(i1)
531 f2%R(i1)=t7%R(i1)/ht%R(i1)
537 newremain=newremain+1
540 ELSEIF(fxmat(i).LT.-eps_flux)
THEN 542 IF(t4%R(i2).GT.1.d-20)
THEN 543 hseg2=-t4%R(i2)*fxmat(i)/t1%R(i2)
545 hfl2=-dt*unsv2d%R(i2)*fxmat(i)
546 IF(hfl2.GT.hseg2)
THEN 549 hseg1=-dt*unsv2d%R(i1)*fxmat(i)*tet
550 ht%R(i1)=ht%R(i1)+hseg1
551 t5%R(i1)=t5%R(i1)+hseg1*t6%R(i2)
552 t7%R(i1)=t7%R(i1)+hseg1*t8%R(i2)
554 f1%R(i1)=t5%R(i1)/ht%R(i1)
555 f2%R(i1)=t7%R(i1)/ht%R(i1)
556 fxmat(i)=fxmat(i)*(1.d0-tet)
558 newremain=newremain+1
561 hseg1=-dt*unsv2d%R(i1)*fxmat(i)
563 ht%R(i1)=ht%R(i1)+hseg1
564 t5%R(i1)=t5%R(i1)+hseg1*t6%R(i2)
565 t7%R(i1)=t7%R(i1)+hseg1*t8%R(i2)
566 f1%R(i1)=t5%R(i1)/ht%R(i1)
567 f2%R(i1)=t7%R(i1)/ht%R(i1)
568 IF(hseg2.GT.0.d0)
THEN 569 ht%R(i2)=ht%R(i2)+hseg2
570 t5%R(i2)=t5%R(i2)+hseg2*t6%R(i2)
571 t7%R(i2)=t7%R(i2)+hseg2*t8%R(i2)
573 f1%R(i2)=t5%R(i2)/ht%R(i2)
574 f2%R(i2)=t7%R(i2)/ht%R(i2)
580 newremain=newremain+1
593 i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
594 t1%R(i)=ht%R(i)*f1%R(i)
595 t3%R(i)=ht%R(i)*f2%R(i)
604 i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
605 IF(ht%R(i).GT.0.d0)
THEN 606 f1%R(i)=t1%R(i)/ht%R(i)
607 f2%R(i)=t3%R(i)/ht%R(i)
612 IF(ncsize.GT.1) c=
p_sum(c)
613 IF(testing)
WRITE(
lu,*)
'FLUX NON PRIS EN COMPTE=',c
614 IF(c.NE.cprev.AND.abs(c-cprev).GT.cinit*1.d-9
615 & .AND.c.NE.0.d0)
THEN 617 IF(niter.LT.nitmax)
GO TO 777
624 c=min(pluie%R(i),0.d0)
630 f1%R(i)=f1%R(i)-dt/max(ht%R(i),1.d-4)*c*f1%R(i)
632 f2%R(i)=f2%R(i)-dt/max(ht%R(i),1.d-4)*c*f2%R(i)
642 hfl1=dt*unsv2d%R(i)*max(t2%R(i),0.d0)
645 IF(hfl1.GT.ht%R(i)) tet=ht%R(i)/hfl1
647 ht%R(i)=max(ht%R(i)-hfl1*tet,0.d0)
652 IF(limtra1(iptfr).EQ.kdir)
THEN 653 f1%R(i)=f1%R(i)-hfl1*tet/max(ht%R(i),1.d-4)*
654 & (f1bor%R(iptfr)-f1%R(i))
655 flbortra1%R(iptfr)=flbor%R(iptfr)*f1bor%R(iptfr)
656 ELSEIF(limtra1(iptfr).EQ.kddl)
THEN 657 IF(t2%R(i).GT.0.d0)
THEN 658 flbortra1%R(iptfr)=flbor%R(iptfr)*f1%R(i)
661 flbortra1%R(iptfr)=0.d0
663 IF(limtra2(iptfr).EQ.kdir)
THEN 664 f2%R(i)=f2%R(i)-hfl1*tet/max(ht%R(i),1.d-4)*
665 & (f2bor%R(iptfr)-f2%R(i))
666 flbortra2%R(iptfr)=flbor%R(iptfr)*f2bor%R(iptfr)
667 ELSEIF(limtra2(iptfr).EQ.kddl)
THEN 668 IF(t2%R(i).GT.0.d0)
THEN 669 flbortra2%R(iptfr)=flbor%R(iptfr)*f2%R(i)
672 flbortra2%R(iptfr)=0.d0
679 c=c+(ht%R(i)-h%R(i))**2
682 IF(ncsize.GT.1) c=
p_sum(c)
683 WRITE(
lu,*)
'DIFFERENCE ENTRE H ET HT =',c
689 IF(ncsize.GT.1) c=
p_min(c)
690 WRITE(
lu,*)
'APRES TRAITEMENT TRACEUR 1 MIN=',c
695 IF(ncsize.GT.1) c=
p_max(c)
696 WRITE(
lu,*)
'APRES TRAITEMENT TRACEUR 1 MAX=',c
704 f1%R(i) = f1%R(i)+dt*sm1%R(i)
705 f2%R(i) = f2%R(i)+dt*sm2%R(i)
712 f1%R(i) = f1%R(i)/(1.d0-dt*smi1%R(i)/max(h%R(i),1.d-15))
713 f2%R(i) = f2%R(i)/(1.d0-dt*smi2%R(i)/max(h%R(i),1.d-15))
723 IF(niter.EQ.nitmax)
THEN 727 102
FORMAT(
' CVTRVF_NERD_2 (SCHEME 13 OR 14): ',1i3,
' ITERATIONS')
728 103
FORMAT(
' CVTRVF_NERD_2 (SCHEME NERD, 13 OR 14): ',1i3,
729 &
' ITERATIONS = MAXIMUM',
730 & /,
'INCREASE MAXIMUM NUMBER OF ITERATIONS FOR ADVECTION SCHEMES')
integer, dimension(:), allocatable indic_cpos2
subroutine mult_interface_seg(FSEG, NH_COM_SEG, DIM1NHCOM, NB_NEIGHB_SEG, NB_NEIGHB_PT_SEG, LIST_SEND, NSEG)
subroutine parcom2_seg(X1, X2, X3, NSEG, NPLAN, ICOM, IAN, MESH, OPT, IELM)
subroutine vector(VEC, OP, FORMUL, IELM1, XMUL, F, G, H, U, V, W, MESH, MSK, MASKEL, LEGO, ASSPAR)
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)
subroutine cvtrvf_nerd_2(F1, F1N, F1SCEXP, F2, F2N, F2SCEXP, H, HN, HPROP, UDEL, VDEL, DM1, ZCONV, SOLSYS, SM1, SM2, SMH, YASMH, SMI1, SMI2, YASMI, F1BOR, F2BOR, MASKTR, MESH, T1, T2, T3, T4, T5, T6, T7, T8, HT, DT, ENTET, MSK, MASKEL, OPTSOU, LIMTRA1, LIMTRA2, KDIR, KDDL, NPTFR, FLBOR, YAFLBOR, UNSV2D, IOPT, FLBORTRA1, FLBORTRA2, GLOSEG1, GLOSEG2, NBOR, RAIN, PLUIE, TRAIN1, TRAIN2, NITMAX)