5 &(f,fn,fscexp,h,hn,hprop,udel,vdel,dm1,zconv,solsys,
6 & sm,smh,yasmh,smi,yasmi,fbor,masktr,mesh,
7 & t1,t2,t3,t4,t5,t6,t7,ht,dt,entet,
8 & msk,maskel,optsou,limtra,kdir,kddl,nptfr,flbor,
9 & yaflbor,unsv2d,iopt,flbortra,gloseg1,gloseg2,nbor,
10 & flulim,yaflulim,rain,pluie,train,given_flux,flux_given,
110 INTEGER,
INTENT(IN) :: OPTSOU,KDIR,NPTFR,SOLSYS
111 INTEGER,
INTENT(IN) :: KDDL,IOPT,NITMAX
112 INTEGER,
INTENT(IN) :: GLOSEG1(*),GLOSEG2(*)
113 INTEGER,
INTENT(IN) :: NBOR(nptfr)
114 INTEGER,
INTENT(INOUT) :: LIMTRA(nptfr)
116 DOUBLE PRECISION,
INTENT(IN) :: DT,TRAIN,FLULIM(*)
117 LOGICAL,
INTENT(IN) :: YASMH,YAFLBOR,RAIN
118 LOGICAL,
INTENT(IN) :: MSK,ENTET,YASMI,YAFLULIM
119 LOGICAL,
INTENT(IN) :: FLUX_GIVEN
120 TYPE(bief_obj),
INTENT(IN) :: MASKEL,H,HN,DM1,ZCONV
121 TYPE(bief_obj),
INTENT(IN) :: UNSV2D,HPROP
122 TYPE(bief_obj),
INTENT(INOUT) :: F,SM,HT
123 TYPE(bief_obj),
INTENT(IN) :: UDEL,VDEL,FN,SMI,SMH
124 TYPE(bief_obj),
INTENT(INOUT) :: FLBORTRA,FBOR
125 TYPE(bief_obj),
INTENT(INOUT) :: T1,T2,T3,T4,T5,T6,T7
126 TYPE(bief_obj),
INTENT(IN) :: FSCEXP,MASKTR
127 TYPE(bief_obj),
INTENT(INOUT) :: FLBOR
128 TYPE(bief_obj),
INTENT(IN) :: PLUIE,GIVEN_FLUX
129 TYPE(bief_mesh) :: MESH
133 INTEGER I,IOPT1,IOPT2,NPOIN,IPTFR,I1,I2,NITER,NEWREMAIN
134 INTEGER IR,N,NELEM,NELMAX,REMAIN,NSEG
138 DOUBLE PRECISION C,CPREV,CINIT,HFL1,HFL2,TET,HSEG1,HSEG2
139 CHARACTER(LEN=16) FORMUL
140 DOUBLE PRECISION,
POINTER,
DIMENSION(:) :: FXMAT
141 DOUBLE PRECISION,
PARAMETER :: TIERS=1.d0/3.d0
142 LOGICAL,
PARAMETER :: TESTING = .false.
143 DOUBLE PRECISION,
PARAMETER :: EPS_FLUX = 1.d-15
163 fxmat=>mesh%MSEG%X%R(1:nseg)
171 IF(iopt1.LT.0.OR.iopt1.GT.3)
THEN 172 WRITE(
lu,*)
'CVTRVF_NERD: OPTION IOPT1 UNKNOWN: ',iopt1
176 IF(iopt2.NE.0.AND.iopt2.NE.1)
THEN 177 WRITE(
lu,*)
'CVTRVF_NERD: OPTION IOPT2 UNKNOWN: ',iopt2
191 cinit=min(cinit,hn%R(i))
197 WRITE(
lu,*)
'AVANT TRAITEMENT HAUTEURS NEGATIVES, H MIN=',c
198 WRITE(
lu,*)
'AVANT TRAITEMENT HAUTEURS NEGATIVES, HN MIN=',cinit
213 IF(ncsize.GT.1)
CALL os(
'X=0 ',x=t2)
217 IF(.NOT.yaflbor)
THEN 219 CALL vector(flbor,
'=',
'FLUBDF ',1,1.d0,
221 & udel , vdel, vdel,mesh,.true.,masktr%ADR(8)%P)
226 CALL osdb(
'X=Y ' ,t2,flbor,flbor,0.d0,mesh)
228 IF(ncsize.GT.1)
CALL parcom(t2,2,mesh)
233 IF(limtra(i).EQ.kdir.AND.t2%R(n).GT.0.d0)
THEN 236 ELSEIF(limtra(i).EQ.kddl.AND.t2%R(n).LT.0.d0)
THEN 250 IF(.NOT.flux_given)
THEN 252 IF(solsys.EQ.2) formul(8:8)=
'2' 254 CALL vector(t1,
'=',formul,h%ELM,-1.d0,
255 & hprop,dm1,zconv,udel,vdel,vdel,mesh,msk,maskel)
260 CALL flux_ef_vf(fxmat,mesh%W%R,mesh%NSEG,nelem,nelmax,
261 & mesh%ELTSEG%I,mesh%ORISEG%I,
262 & mesh%IKLE%I,.true.,iopt1)
266 fxmat(i)=fxmat(i)*flulim(i)
271 fxmat(i)=given_flux%R(i)
277 CALL parcom2_seg(fxmat,fxmat,fxmat,mesh%NSEG,1,2,1,mesh,
280 & mesh%NH_COM_SEG%DIM1,
281 & mesh%NB_NEIGHB_SEG,
282 & mesh%NB_NEIGHB_PT_SEG%I,
283 & mesh%LIST_SEND_SEG%I,mesh%NSEG)
288 CALL os(
'X=Y ',x=f,y=fn)
289 CALL os(
'X=Y ',x=ht,y=hn)
296 IF(smh%R(i).GT.0.d0)
THEN 297 ht%R(i)=ht%R(i)+dt*smh%R(i)
298 f%R(i)=f%R(i)+dt/max(ht%R(i),1.d-4)*smh%R(i)*fscexp%R(i)
301 ELSEIF(optsou.EQ.2)
THEN 303 IF(smh%R(i).GT.0.d0)
THEN 304 ht%R(i)=ht%R(i)+dt*smh%R(i)*unsv2d%R(i)
305 f%R(i)=f%R(i)+dt/max(ht%R(i),1.d-4)*
306 & unsv2d%R(i)*smh%R(i)*fscexp%R(i)
316 c=max(pluie%R(i),0.d0)
319 f%R(i)=f%R(i)+dt/max(ht%R(i),1.d-4)*c*(train-f%R(i))
325 ht%R(i)=ht%R(i)-dt*unsv2d%R(i)*min(t2%R(i),0.d0)
328 IF(limtra(iptfr).EQ.kdir)
THEN 329 f%R(i)=f%R(i)-dt/max(ht%R(i),1.d-4)*
330 & unsv2d%R(i)*t2%R(i)*(fbor%R(iptfr)-f%R(i))
350 cprev=cprev+abs(fxmat(i))
352 IF(ncsize.GT.1) cprev=
p_sum(cprev)
353 IF(testing)
WRITE(
lu,*)
'INITIAL SUM OF FLUXES=',cprev
365 t5%R(i)=ht%R(i)*f%R(i)
369 i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
372 ht%R(i)=ht%R(i)*mesh%IFAC%I(i)
373 t5%R(i)=ht%R(i)*f%R(i)
389 t5%R(i1)=ht%R(i1)*f%R(i1)
390 t5%R(i2)=ht%R(i2)*f%R(i2)
396 i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
403 ht%R(i)=ht%R(i)*mesh%IFAC%I(i)
404 t5%R(i)=ht%R(i)*f%R(i)
412 IF(fxmat(i).GT.eps_flux)
THEN 413 t1%R(i1)=t1%R(i1)+fxmat(i)
416 ELSEIF(fxmat(i).LT.-eps_flux)
THEN 417 t1%R(i2)=t1%R(i2)-fxmat(i)
423 IF(ncsize.GT.1)
CALL parcom(t1,2,mesh)
429 i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
430 IF(t1%R(i).GT.eps_flux)
THEN 444 IF(fxmat(i).GT.eps_flux)
THEN 449 IF(t4%R(i1).GT.1.d-20)
THEN 450 hseg1=t4%R(i1)*fxmat(i)/t1%R(i1)
452 hfl1= dt*unsv2d%R(i1)*fxmat(i)
453 IF(hfl1.GT.hseg1)
THEN 456 hseg2=dt*unsv2d%R(i2)*fxmat(i)*tet
457 ht%R(i2)=ht%R(i2)+hseg2
459 t5%R(i2)=t5%R(i2)+hseg2*t6%R(i1)
463 f%R(i2)=t5%R(i2)/ht%R(i2)
464 fxmat(i)=fxmat(i)*(1.d0-tet)
466 newremain=newremain+1
470 hseg2=dt*unsv2d%R(i2)*fxmat(i)
471 ht%R(i2)=ht%R(i2)+hseg2
472 t5%R(i2)=t5%R(i2)+hseg2*t6%R(i1)
474 f%R(i2)=t5%R(i2)/ht%R(i2)
475 IF(hseg1.GT.0.d0)
THEN 476 ht%R(i1)=ht%R(i1)+hseg1
477 t5%R(i1)=t5%R(i1)+hseg1*t6%R(i1)
479 f%R(i1)=t5%R(i1)/ht%R(i1)
485 newremain=newremain+1
488 ELSEIF(fxmat(i).LT.-eps_flux)
THEN 490 IF(t4%R(i2).GT.1.d-20)
THEN 493 hseg2=-t4%R(i2)*fxmat(i)/t1%R(i2)
495 hfl2=-dt*unsv2d%R(i2)*fxmat(i)
496 IF(hfl2.GT.hseg2)
THEN 499 hseg1=-dt*unsv2d%R(i1)*fxmat(i)*tet
500 ht%R(i1)=ht%R(i1)+hseg1
501 t5%R(i1)=t5%R(i1)+hseg1*t6%R(i2)
503 f%R(i1)=t5%R(i1)/ht%R(i1)
504 fxmat(i)=fxmat(i)*(1.d0-tet)
506 newremain=newremain+1
509 hseg1=-dt*unsv2d%R(i1)*fxmat(i)
511 ht%R(i1)=ht%R(i1)+hseg1
512 t5%R(i1)=t5%R(i1)+hseg1*t6%R(i2)
513 f%R(i1)=t5%R(i1)/ht%R(i1)
514 IF(hseg2.GT.0.d0)
THEN 515 ht%R(i2)=ht%R(i2)+hseg2
516 t5%R(i2)=t5%R(i2)+hseg2*t6%R(i2)
518 f%R(i2)=t5%R(i2)/ht%R(i2)
524 newremain=newremain+1
535 i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
536 t1%R(i)=ht%R(i)*f%R(i)
544 i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
545 IF(ht%R(i).GT.0.d0) f%R(i)=t1%R(i)/ht%R(i)
549 IF(ncsize.GT.1) c=
p_sum(c)
550 IF(testing)
WRITE(
lu,*)
'FLUX NON PRIS EN COMPTE=',c
554 IF(c.NE.cprev.AND.abs(c-cprev).GT.cinit*1.d-9
555 & .AND.c.NE.0.d0)
THEN 557 IF(niter.LT.nitmax)
GO TO 777
565 IF(smh%R(i).LT.0.d0)
THEN 566 ht%R(i)=ht%R(i)+dt*smh%R(i)
567 f%R(i)=f%R(i)+dt/max(ht%R(i),1.d-4)*smh%R(i)*fscexp%R(i)
570 ELSEIF(optsou.EQ.2)
THEN 572 IF(smh%R(i).LT.0.d0)
THEN 573 ht%R(i)=ht%R(i)+dt*smh%R(i)*unsv2d%R(i)
574 f%R(i)=f%R(i)+dt/max(ht%R(i),1.d-4)*
575 & unsv2d%R(i)*smh%R(i)*fscexp%R(i)
585 c=min(pluie%R(i),0.d0)
590 f%R(i)=f%R(i)+dt/max(ht%R(i),1.d-4)*c*(0.d0-f%R(i))
600 hfl1=dt*unsv2d%R(i)*max(t2%R(i),0.d0)
602 IF(hfl1.GT.ht%R(i)) tet=ht%R(i)/hfl1
604 ht%R(i)=max(ht%R(i)-hfl1*tet,0.d0)
608 IF(limtra(iptfr).EQ.kdir)
THEN 609 f%R(i)=f%R(i)-hfl1*tet/max(ht%R(i),1.d-4)*
610 & (fbor%R(iptfr)-f%R(i))
611 flbortra%R(iptfr)=flbor%R(iptfr)*fbor%R(iptfr)
612 ELSEIF(limtra(iptfr).EQ.kddl)
THEN 613 flbortra%R(iptfr)=flbor%R(iptfr)*f%R(i)
620 c=c+(ht%R(i)-h%R(i))**2
623 IF(ncsize.GT.1) c=
p_sum(c)
624 WRITE(
lu,*)
'DIFFERENCE ENTRE H ET HT =',c
630 IF(ncsize.GT.1) c=
p_min(c)
631 WRITE(
lu,*)
'APRES TRAITEMENT TRACEUR MIN=',c
636 IF(ncsize.GT.1) c=
p_max(c)
637 WRITE(
lu,*)
'APRES TRAITEMENT TRACEUR MAX=',c
651 f%R(i)=(f%R(i)+dt*sm%R(i))/
652 & (1.d0-dt*smi%R(i)/max(h%R(i),1.d-15))
656 ELSEIF(iopt2.EQ.1)
THEN 660 f%R(i)=(f%R(i)*ht%R(i)+dt*sm%R(i)*h%R(i))/
661 & (h%R(i)-dt*smi%R(i))
670 f%R(i) = f%R(i)+dt*sm%R(i)
681 IF(niter.EQ.nitmax)
THEN 685 202
FORMAT(
'CVTRVF_NERD (SCHEME NERD, 13 OR 14): ',1i3,
' ITERATIONS')
686 203
FORMAT(
' CVTRVF_NERD (SCHEME NERD, 13 OR 14): ',1i3,
' ITERATIONS',
688 & /,
'INCREASE MAXIMUM NUMBER OF ITERATIONS FOR ADVECTION SCHEMES')
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)
integer, dimension(:), allocatable indic_cpos
subroutine cvtrvf_nerd(F, FN, FSCEXP, H, HN, HPROP, UDEL, VDEL, DM1, ZCONV, SOLSYS, SM, SMH, YASMH, SMI, YASMI, FBOR, MASKTR, MESH, T1, T2, T3, T4, T5, T6, T7, HT, DT, ENTET, MSK, MASKEL, OPTSOU, LIMTRA, KDIR, KDDL, NPTFR, FLBOR, YAFLBOR, UNSV2D, IOPT, FLBORTRA, GLOSEG1, GLOSEG2, NBOR, FLULIM, YAFLULIM, RAIN, PLUIE, TRAIN, GIVEN_FLUX, FLUX_GIVEN, NITMAX)