5 &(f,fn,fscexp,h,hn,hprop,uconv,vconv,dm1,zconv,solsys,
6 & sm,smh,yasmh,smi,yasmi,fbor,masktr,mesh,
7 & aggloh,dt,entet,msk,maskel,s,massou,optsou,
8 & limtra,kdir,kddl,nptfr,flbor,yaflbor,volu2d,v2dpar,unsv2d,iopt,
9 & flbortra,maskpt,rain,pluie,train,optadv,tb,free,am2,tb2,
10 & nco_dist,nsp_dist,yaflulim,flulim,yaflulimebe,flulimebe,
181 INTEGER,
INTENT(IN) :: OPTSOU,KDIR,NPTFR,SOLSYS
182 INTEGER,
INTENT(IN) :: KDDL,IOPT,OPTADV,FREE
183 INTEGER,
INTENT(IN) :: NCO_DIST,NSP_DIST
184 INTEGER,
INTENT(INOUT) :: LIMTRA(nptfr)
185 DOUBLE PRECISION,
INTENT(IN) :: DT,AGGLOH,TRAIN
186 DOUBLE PRECISION,
INTENT(IN) :: FLULIM(*)
187 DOUBLE PRECISION,
INTENT(INOUT) :: MASSOU
188 LOGICAL,
INTENT(IN) :: YASMH,YAFLBOR
189 LOGICAL,
INTENT(IN) :: MSK,ENTET,YASMI,RAIN
190 LOGICAL,
INTENT(IN) :: YAFLULIM,YAFLULIMEBE
191 TYPE(bief_obj),
INTENT(IN) :: MASKEL,DM1,ZCONV,MASKPT
192 TYPE(bief_obj),
INTENT(IN),
TARGET :: H,HN
193 TYPE(bief_obj),
INTENT(IN) :: VOLU2D,V2DPAR,UNSV2D,HPROP
194 TYPE(bief_obj),
INTENT(INOUT) :: F,SM,AM2
195 TYPE(bief_obj),
INTENT(IN) :: UCONV,VCONV,FN,SMI,SMH
196 TYPE(bief_obj),
INTENT(INOUT) :: FBOR,TB,TB2
197 TYPE(bief_obj),
INTENT(INOUT) :: FLBORTRA
198 TYPE(bief_obj),
INTENT(IN) :: FSCEXP,S,MASKTR
199 TYPE(bief_obj),
INTENT(IN) :: PLUIE
200 TYPE(bief_mesh) :: MESH
201 DOUBLE PRECISION,
INTENT(IN) :: FLULIMEBE(*)
202 TYPE(bief_obj),
INTENT(IN) :: FLBOR
203 TYPE(slvcfg),
INTENT(IN) :: SLVTRA
207 INTEGER IELMF,I,IOPT1,IOPT2,N,IELEM,I1,I2,I3,ICOR,NIT,OPTCFL
211 DOUBLE PRECISION DT_REMAIN,DDT,TDT,SECU,TETAFCOR
212 DOUBLE PRECISION ADMASS,LOCALMIN,LOCALMAX,TWOTHIRDS
214 CHARACTER(LEN=16) FORMUL
216 DOUBLE PRECISION,
POINTER,
DIMENSION(:) :: FXMAT,FXMATPAR
218 DOUBLE PRECISION K,SURK,KM1,KM1SURK
219 LOGICAL MASS_BAL,PREDICOR,LIPS,WITHABS
226 INTEGER,
PARAMETER :: NITMAX = 200
230 TYPE(bief_obj),
POINTER :: T1,T2,FLBOUND,T4,T6,FXBORPAR,T8,HNT,HT
231 TYPE(bief_obj),
POINTER :: HNP1MT,TETAF_VAR,FMIN,FMAX
232 DOUBLE PRECISION,
POINTER,
DIMENSION(:) :: DFDT
244 twothirds=2.d0*km1/(2.d0*k-1.d0)
255 slvpsi%SLV =slvtra%SLV
256 slvpsi%NITMAX=slvtra%NITMAX
257 slvpsi%PRECON=slvtra%PRECON
258 slvpsi%KRYLOV=slvtra%KRYLOV
259 slvpsi%EPS =slvtra%EPS
260 slvpsi%ZERO =slvtra%ZERO
270 hnp1mt =>tb%ADR(free)%P
271 t1 =>tb%ADR(free+1)%P
272 t2 =>tb%ADR(free+2)%P
273 flbound =>tb%ADR(free+3)%P
274 t4 =>tb%ADR(free+4)%P
275 t6 =>tb%ADR(free+5)%P
276 fxborpar =>tb%ADR(free+6)%P
277 t8 =>tb%ADR(free+7)%P
278 hnt =>tb%ADR(free+8)%P
279 ht =>tb%ADR(free+9)%P
280 tetaf_var =>tb%ADR(free+10)%P
287 dfdt => tb%ADR(free+5)%P%R
293 fxmat=>mesh%MSEG%X%R(1:mesh%NSEG)
296 fxmatpar=>mesh%MSEG%X%R(mesh%NSEG+1:2*mesh%NSEG)
298 fxmatpar=>mesh%MSEG%X%R(1:mesh%NSEG)
305 IF(optadv.LT.1.OR.optadv.GT.4)
THEN 306 WRITE(
lu,*)
'CVTRVF: OPTION OF ADVECTION SCHEME' 307 WRITE(
lu,*)
' UNKNOWN: ',optadv
312 IF(am2%STO.NE.3.AND.optadv.EQ.4)
THEN 313 WRITE(
lu,*)
'CVTRVF: EDGE-BASED STORAGE REQUESTED WITH' 314 WRITE(
lu,*)
' IMPLICIT N OR PSI SCHEME' 324 IF(iopt1.LT.1.OR.iopt1.GT.3)
THEN 325 WRITE(
lu,*)
'CVTRVF : OPTION IOPT1=',iopt1,
' UNKNOWN' 330 IF(iopt2.LT.0.OR.iopt2.GT.1)
THEN 331 WRITE(
lu,*)
'CVTRVF : OPTION IOPT2=',iopt2,
' UNKNOWN' 338 IF((iopt1.EQ.2.OR.iopt1.EQ.3).AND.
339 & (optadv.EQ.2.OR.optadv.EQ.3))
THEN 347 IF((iopt1.EQ.2.OR.iopt1.EQ.3).AND.optadv.EQ.4)
THEN 357 ELSEIF((iopt1.EQ.2.OR.iopt1.EQ.3).AND.optadv.EQ.3)
THEN 374 IF(abs(1.d0-aggloh).GT.1.d-8)
THEN 375 CALL vector(ht ,
'=',
'MASVEC ',ielmf,
376 & 1.d0-aggloh,h ,s,s,s,s,s,mesh,msk,maskel)
377 CALL vector(hnt,
'=',
'MASVEC ',ielmf,
378 & 1.d0-aggloh,hn,s,s,s,s,s,mesh,msk,maskel)
383 CALL os(
'X=YZ ',x=ht ,y=ht ,z=unsv2d)
384 CALL os(
'X=YZ ',x=hnt,y=hnt,z=unsv2d)
385 CALL os(
'X=X+CY ',x=ht ,y=h ,c=aggloh)
386 CALL os(
'X=X+CY ',x=hnt,y=hn ,c=aggloh)
397 CALL os(
'X=Y ',x=flbound,y=flbor)
400 CALL vector(flbound,
'=',
'FLUBDF ',1,1.d0,
402 & uconv,vconv,vconv,mesh,.true.,masktr%ADR(5)%P)
417 CALL os(
'X=0 ',x=fxborpar)
420 fxborpar%R(n)=flbound%R(i)
422 IF(ncsize.GT.1)
CALL parcom(fxborpar,2,mesh)
425 IF(limtra(i).EQ.kdir.AND.fxborpar%R(n).GT.0.d0)
THEN 427 ELSEIF(limtra(i).EQ.kddl.AND.fxborpar%R(n).LT.0.d0)
THEN 437 IF(msk)
CALL os(
'X=XY ',x=fxborpar,y=maskpt)
451 IF(solsys.EQ.2) formul(8:8)=
'2' 452 CALL vector(t2,
'=',formul,ielmf,-1.d0,
453 & hprop,dm1,zconv,uconv,vconv,vconv,mesh,msk,maskel)
488 IF(nit.EQ.1.OR.(iopt1.EQ.3.AND..NOT.lips))
THEN 489 CALL flux_ef_vf(fxmat,mesh%W%R,mesh%NSEG,mesh%NELEM,
491 & mesh%ELTSEG%I,mesh%ORISEG%I,
493 & mesh%IKLE%I,.true.,2,
496 & yaflulim=yaflulim.AND.lips,flulim=flulim,
497 & yaflulimebe=yaflulimebe.AND.lips,
498 & flulimebe=flulimebe)
507 & mesh%GLOSEG%I,mesh%GLOSEG%DIM1,maskpt%R)
512 CALL ov(
'X=Y ', x=fxmatpar, y=fxmat, dim1=mesh%NSEG)
514 & mesh%NSEG,1,2,1,mesh,1,11)
526 IF(predicor.AND.nco_dist.GT.0)
THEN 544 CALL cflvf(ddt,hnp1mt%R,fxmat,fxmatpar,
546 & v2dpar%R,dt_remain,fxborpar%R ,smh%R,
547 & yasmh,t8,mesh%NSEG,mesh%NPOIN,mesh%NPTFR,
548 & mesh%GLOSEG%I,mesh%GLOSEG%DIM1,mesh,msk,maskpt,
549 & rain,pluie%R,t4%R,mesh%NELEM,mesh%IKLE%I,
550 & limtra,kdir,kddl,fbor%R,fscexp%R,train,mesh%NBOR%I,
551 & t2,t6,secu,optcfl,withabs)
559 IF(iopt1.EQ.3.AND..NOT.lips)
THEN 560 CALL flux_ef_vf(fxmat,mesh%W%R,mesh%NSEG,mesh%NELEM,
562 & mesh%ELTSEG%I,mesh%ORISEG%I,
563 & mesh%IKLE%I,.true.,iopt1,t4)
567 & mesh%GLOSEG%I,mesh%GLOSEG%DIM1,maskpt%R)
572 CALL ov(
'X=Y ', x=fxmatpar, y=fxmat, dim1=mesh%NSEG)
574 & mesh%NSEG,1,2,1,mesh,1,11)
579 IF(ncsize.GT.1) ddt=
p_min(ddt)
580 ddt=min(ddt,dt_remain)
589 tetaf_var%R(i)=max(0.d0,1.d0-nsp_dist*t2%R(i)/dt)
591 ddt=dt/nsp_dist/0.999999d0
594 ddt=min(ddt,dt_remain)
603 t2%R(i)=hnt%R(i)+tdt*(ht%R(i)-hnt%R(i))/dt
614 hnp1mt%R(i)=hnt%R(i)+
615 & (tdt-tetaf_var%R(i)*ddt)*(ht%R(i)-hnt%R(i))/dt
619 hnp1mt%R(i)=hnt%R(i)+tdt*(ht%R(i)-hnt%R(i))/dt
627 IF(maskpt%R(i).LT.0.5d0) hnp1mt%R(i)=ht%R(i)
637 CALL tracvf(f,fscexp,fxmat,fxmatpar,
639 & ddt,flbound,fbor,smh,yasmh,t1,t2,t4,hnp1mt,
641 & mesh,limtra,kdir,kddl,optsou,iopt2,flbortra,msk,
642 & dt,rain,pluie,train,admass,
644 & optadv.EQ.1.OR.nco_dist.EQ.0)
661 IF(limtra(i).EQ.kdir)
THEN 663 fmin%R(n)=min(fmin%R(n),fbor%R(i))
664 fmax%R(n)=max(fmax%R(n),fbor%R(i))
667 DO ielem=1,mesh%NELEM
668 i1=mesh%IKLE%I(ielem)
669 i2=mesh%IKLE%I(ielem+ mesh%NELMAX)
670 i3=mesh%IKLE%I(ielem+2*mesh%NELMAX)
671 localmin=min( f%R(i1), f%R(i2), f%R(i3),
672 & t4%R(i1),t4%R(i2),t4%R(i3))
673 localmax=max( f%R(i1), f%R(i2), f%R(i3),
674 & t4%R(i1),t4%R(i2),t4%R(i3))
675 fmin%R(i1)=min(fmin%R(i1),localmin)
676 fmax%R(i1)=max(fmax%R(i1),localmax)
677 fmin%R(i2)=min(fmin%R(i2),localmin)
678 fmax%R(i2)=max(fmax%R(i2),localmax)
679 fmin%R(i3)=min(fmin%R(i3),localmin)
680 fmax%R(i3)=max(fmax%R(i3),localmax)
687 f%R(i)=min(f%R(i),t4%R(i)+km1surk*(fmax%R(i)-t4%R(i)))
688 f%R(i)=max(f%R(i),t4%R(i)+km1surk*(fmin%R(i)-t4%R(i)))
705 dfdt(i)=hnp1mt%R(i)*(f%R(i)-t4%R(i))/ddt
714 & mesh%ELTSEG%I,mesh%ORISEG%I,
715 & fxmatpar,mesh%NSEG,
717 & mesh%IKLE%I,mesh%NPOIN,t4,
719 & t8%R,mesh%SURFAC%R,dfdt,tetaf_var%R,
721 & yaflulim,flulim,yaflulimebe,
726 & mesh%ELTSEG%I,mesh%ORISEG%I,
727 & fxmatpar,mesh%NSEG,
729 & mesh%IKLE%I,mesh%NPOIN,t4,
731 & t8%R,mesh%SURFAC%R,dfdt,tetaf_var%R,
733 & yaflulim,flulim,yaflulimebe,flulimebe)
742 & flbound%R,hnp1mt%R,
743 & fbor%R,smh%R,yasmh,fscexp%R,
744 & mesh%NSEG,mesh%NPOIN,mesh%NPTFR,
745 & mesh%GLOSEG%I,mesh%GLOSEG%DIM1,
746 & mesh%NBOR%I,limtra,kdir,kddl,
747 & optsou,iopt2,flbortra%R,ddt/dt,mesh,f,
748 & rain,pluie%R,train,tetaf_var%R,
750 & t6,t8%R,am2,tb2,slvpsi,
752 & icor.EQ.0,icor.NE.0,icor,nco_dist,admass)
762 IF(predicor.AND.nco_dist.GT.0)
THEN 768 IF(optadv.EQ.3.OR.icor.GT.1.OR.k.LT.2.d0)
THEN 775 IF(limtra(i).EQ.kdir)
THEN 777 fmin%R(n)=min(fmin%R(n),fbor%R(i))
778 fmax%R(n)=max(fmax%R(n),fbor%R(i))
783 DO ielem=1,mesh%NELEM
784 i1=mesh%IKLE%I(ielem)
785 i2=mesh%IKLE%I(ielem+ mesh%NELMAX)
786 i3=mesh%IKLE%I(ielem+2*mesh%NELMAX)
787 localmin=min(t4%R(i1),t4%R(i2),t4%R(i3))
788 localmax=max(t4%R(i1),t4%R(i2),t4%R(i3))
789 fmin%R(i1)=min(f%R(i1),fmin%R(i1),localmin)
790 fmax%R(i1)=max(f%R(i1),fmax%R(i1),localmax)
791 fmin%R(i2)=min(f%R(i2),fmin%R(i2),localmin)
792 fmax%R(i2)=max(f%R(i2),fmax%R(i2),localmax)
793 fmin%R(i3)=min(f%R(i3),fmin%R(i3),localmin)
794 fmax%R(i3)=max(f%R(i3),fmax%R(i3),localmax)
796 ELSEIF(optadv.EQ.3)
THEN 798 DO ielem=1,mesh%NELEM
799 i1=mesh%IKLE%I(ielem)
800 i2=mesh%IKLE%I(ielem+ mesh%NELMAX)
801 i3=mesh%IKLE%I(ielem+2*mesh%NELMAX)
802 localmin=min( f%R(i1), f%R(i2), f%R(i3),
803 & t4%R(i1),t4%R(i2),t4%R(i3))
804 localmax=max( f%R(i1), f%R(i2), f%R(i3),
805 & t4%R(i1),t4%R(i2),t4%R(i3))
806 fmin%R(i1)=min(fmin%R(i1),localmin)
807 fmax%R(i1)=max(fmax%R(i1),localmax)
808 fmin%R(i2)=min(fmin%R(i2),localmin)
809 fmax%R(i2)=max(fmax%R(i2),localmax)
810 fmin%R(i3)=min(fmin%R(i3),localmin)
811 fmax%R(i3)=max(fmax%R(i3),localmax)
824 f%R(i)=min(f%R(i),t4%R(i)+km1*(t4%R(i)-fmin%R(i)))
825 f%R(i)=max(f%R(i),t4%R(i)+km1*(t4%R(i)-fmax%R(i)))
827 IF(icor.GT.1.OR.k.LT.2.d0)
THEN 829 f%R(i)=min(f%R(i),t4%R(i)+twothirds*(fmax%R(i)-t4%R(i)))
830 f%R(i)=max(f%R(i),t4%R(i)+twothirds*(fmin%R(i)-t4%R(i)))
833 ELSEIF(optadv.EQ.2.AND.(icor.GT.1.OR.k.LT.2.d0))
THEN 835 f%R(i)=min(f%R(i),t4%R(i)+km1surk*(fmax%R(i)-t4%R(i)))
836 f%R(i)=max(f%R(i),t4%R(i)+km1surk*(fmin%R(i)-t4%R(i)))
841 dfdt(i)=(f%R(i)-t4%R(i))/ddt
846 & mesh%IKLE%I,iopt1,mesh%NPOIN,t4,
848 & t8%R,f%R ,t2%R,hnp1mt%R,mesh%SURFAC%R,
850 IF(ncsize.GT.1)
CALL parcom(t8,2,mesh)
852 IF(icor.EQ.nco_dist)
THEN 861 CALL tvf_2(f%R,t6%R,t4%R,volu2d%R,unsv2d%R,ddt,
862 & flbound%R,fxborpar%R,fbor%R,smh%R,yasmh,fscexp%R,
863 & mesh%NPOIN,mesh%NPTFR,mesh%NBOR%I,limtra,kdir,kddl,
864 & optsou,hnp1mt%R,iopt2,flbortra%R,ddt/dt,rain,
865 & pluie%R,train,t8%R,tetafcor,mass_bal,admass)
878 IF(.NOT.(lips.AND.nsp_dist.EQ.1))
THEN 892 dt_remain=dt_remain-ddt
894 IF(dt_remain.NE.0.d0.AND.nit.LT.nitmax)
GO TO 100
896 IF(nit.GE.nitmax.AND.optadv.NE.4)
THEN 898 901
FORMAT(1x,
'CVTRVF: ',1i6,
' SUB-ITERATIONS REQUIRED FOR THE' 899 & ,/,1x,
' DISTRIBUTIVE SCHEME. DECREASE THE TIME-STEP')
904 903
FORMAT(1x,
'CVTRVF (BIEF): ',1i6,
' SUB-ITERATIONS')
912 f%R(i) = f%R(i)+dt*sm%R(i)
919 f%R(i) = f%R(i)/(1.d0-dt*smi%R(i)/max(h%R(i),1.d-15))
928 massou=massou+
p_sum(admass)
subroutine ov(OP, X, Y, Z, C, DIM1)
subroutine flux_ef_vf_3(PHIEL, NELEM, NELMAX, ELTSEG, ORISEG, FXMATPAR, NSEG, IKLE, NPOIN, FN, FI_I, SU, HDFDT, TETA, YAFLULIM, FLULIM, YAFLULIMEBE, FLULIMEBE)
subroutine flux_mask(FXMAT, NSEG, GLOSEG, SIZGLO, MASKPT)
subroutine parcom2_seg(X1, X2, X3, NSEG, NPLAN, ICOM, IAN, MESH, OPT, IELM)
subroutine cvtrvf(F, FN, FSCEXP, H, HN, HPROP, UCONV, VCONV, DM1, ZCONV, SOLSYS, SM, SMH, YASMH, SMI, YASMI, FBOR, MASKTR, MESH, AGGLOH, DT, ENTET, MSK, MASKEL, S, MASSOU, OPTSOU, LIMTRA, KDIR, KDDL, NPTFR, FLBOR, YAFLBOR, VOLU2D, V2DPAR, UNSV2D, IOPT, FLBORTRA, MASKPT, RAIN, PLUIE, TRAIN, OPTADV, TB, FREE, AM2, TB2, NCO_DIST, NSP_DIST, YAFLULIM, FLULIM, YAFLULIMEBE, FLULIMEBE, SLVTRA)
subroutine tvf_imp(F, FC, FXMAT, FXMATPAR, DT, FXBOR, HNP1MT, FBOR, SMH, YASMH, FSCEXP, NSEG, NPOIN, NPTFR, GLOSEG, SIZGLO, NBOR, LIMTRA, KDIR, KDDL, OPTSOU, IOPT2, FLBORTRA, SURNIT, MESH, SF, RAIN, PLUIE, TRAIN, TETAF, INFOGT, VOLU2D, SM, PSIEXP, AM2, BB, SLVPSI, PREDICTOR, CORRECTOR, ICOR, NCOR, MASSOU)
subroutine tracvf(F, FSCEXP, FXMAT, FXMATPAR, VOLU2D, UNSV2D, DDT, FXBOR, FBOR, SMH, YASMH, T1, T2, T4, T5, T7, T8, MESH, LIMTRA, KDIR, KDDL, OPTSOU, IOPT2, FLBORTRA, MSK, DT, RAIN, PLUIE, TRAIN, MASSOU, MASS_BALANCE)
subroutine flux_ef_vf_2(PHIEL, NELEM, NELMAX, IKLE, IOPT, NPOIN, FN, FI_I, FSTAR, HN, H, SU, TETA, DFDT)
subroutine cflvf(DTMAX, HSTART, FXMAT, FXMATPAR, MAS, DT, FXBOR, SMH, YASMH, TAB1, NSEG, NPOIN, NPTFR, GLOSEG, SIZGLO, MESH, MSK, MASKPT, RAIN, PLUIE, FC, NELEM, IKLE, LIMTRA, KDIR, KDDL, FBOR, FSCEXP, TRAIN, NBOR, MINFC, MAXFC, SECU, OPT, WITHABS)
subroutine vector(VEC, OP, FORMUL, IELM1, XMUL, F, G, H, U, V, W, MESH, MSK, MASKEL, LEGO, ASSPAR)
subroutine tvf_2(F, FSTAR, FC, VOLU2D, UNSV2D, DT, FXBOR, FXBORPAR, FBOR, SMH, YASMH, FSCEXP, NPOIN, NPTFR, NBOR, LIMTRA, KDIR, KDDL, OPTSOU, HLIN, IOPT2, FLBORTRA, SURNIT, RAIN, PLUIE, TRAIN, PHI_I, TETAFCOR, MASS_BAL, MASSOU)
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)